[
  {
    "path": ".babelrc",
    "content": "{\n    \"presets\": [\"es2015\", \"react\", \"stage-0\"],\n    \"plugins\": [\"babel-plugin-add-module-exports\"]\n}\n"
  },
  {
    "path": ".bowerrc",
    "content": "{\n  \"directory\" : \"public/bower_components\"\n}\n"
  },
  {
    "path": ".editorconfig",
    "content": "root = true\n\n[*]\nindent_style = space\nindent_size = 2\nend_of_line = lf\ncharset = utf-8\ntrim_trailing_whitespace = true\ninsert_final_newline = true\n\n[*.md]\ntrim_trailing_whitespace = false\n"
  },
  {
    "path": ".eslintignore",
    "content": "public/**/*.js\n"
  },
  {
    "path": ".eslintrc",
    "content": "{\n  \"parserOption\": {\n    \"ecmaVersion\": 6,\n    \"ecmaFeatures\": {\n        \"jsx\": true\n    }\n  },\n  \"env\": {\n    \"browser\": true,\n    \"mocha\": true,\n    \"node\": true\n  },\n  \"parser\": \"babel-eslint\",\n  \"plugins\": [\n    \"react\"\n  ],\n  \"globals\": {\n    \"Promise\": true,\n    \"window\": true,\n    \"$\": true,\n    \"ga\": true,\n    \"jQuery\": true,\n    \"router\": true\n  },\n  \"rules\": {\n    \"comma-dangle\": 2,\n    \"no-cond-assign\": 2,\n    \"no-console\": 0,\n    \"no-constant-condition\": 2,\n    \"no-control-regex\": 2,\n    \"no-debugger\": 2,\n    \"no-dupe-keys\": 2,\n    \"no-empty\": 2,\n    \"no-empty-character-class\": 2,\n    \"no-ex-assign\": 2,\n    \"no-extra-boolean-cast\": 2,\n    \"no-extra-parens\": 0,\n    \"no-extra-semi\": 2,\n    \"no-func-assign\": 2,\n    \"no-inner-declarations\": 2,\n    \"no-invalid-regexp\": 2,\n    \"no-irregular-whitespace\": 2,\n    \"no-negated-in-lhs\": 2,\n    \"no-obj-calls\": 2,\n    \"no-regex-spaces\": 2,\n    \"no-reserved-keys\": 0,\n    \"no-sparse-arrays\": 2,\n    \"no-unreachable\": 2,\n    \"use-isnan\": 2,\n    \"valid-jsdoc\": 2,\n    \"valid-typeof\": 2,\n\n    \"block-scoped-var\": 0,\n    \"complexity\": 0,\n    \"curly\": 2,\n    \"default-case\": 1,\n    \"dot-notation\": 0,\n    \"eqeqeq\": 1,\n    \"guard-for-in\": 1,\n    \"no-alert\": 1,\n    \"no-caller\": 2,\n    \"no-div-regex\": 2,\n    \"no-else-return\": 0,\n    \"no-eq-null\": 1,\n    \"no-eval\": 2,\n    \"no-extend-native\": 2,\n    \"no-extra-bind\": 2,\n    \"no-fallthrough\": 2,\n    \"no-floating-decimal\": 2,\n    \"no-implied-eval\": 2,\n    \"no-iterator\": 2,\n    \"no-labels\": 2,\n    \"no-lone-blocks\": 2,\n    \"no-loop-func\": 1,\n    \"no-multi-spaces\": 1,\n    \"no-multi-str\": 2,\n    \"no-native-reassign\": 2,\n    \"no-new\": 2,\n    \"no-new-func\": 2,\n    \"no-new-wrappers\": 2,\n    \"no-octal\": 2,\n    \"no-octal-escape\": 2,\n    \"no-process-env\": 0,\n    \"no-proto\": 2,\n    \"no-redeclare\": 1,\n    \"no-return-assign\": 2,\n    \"no-script-url\": 2,\n    \"no-self-compare\": 2,\n    \"no-sequences\": 2,\n    \"no-unused-expressions\": 2,\n    \"no-void\": 1,\n    \"no-warning-comments\": [\n      1,\n      {\n        \"terms\": [\n          \"fixme\"\n        ],\n        \"location\": \"start\"\n      }\n    ],\n    \"no-with\": 2,\n    \"radix\": 2,\n    \"vars-on-top\": 0,\n    \"wrap-iife\": [2, \"any\"],\n    \"yoda\": 0,\n\n    \"strict\": 0,\n\n    \"no-catch-shadow\": 2,\n    \"no-delete-var\": 2,\n    \"no-label-var\": 2,\n    \"no-shadow\": 0,\n    \"no-shadow-restricted-names\": 2,\n    \"no-undef\": 2,\n    \"no-undef-init\": 2,\n    \"no-undefined\": 1,\n    \"no-unused-vars\": [2, { \"argsIgnorePattern\": \"^_\" }],\n    \"no-use-before-define\": 0,\n\n    \"handle-callback-err\": 2,\n    \"no-mixed-requires\": 0,\n    \"no-new-require\": 2,\n    \"no-path-concat\": 2,\n    \"no-process-exit\": 2,\n    \"no-restricted-modules\": 0,\n    \"no-sync\": 0,\n\n    \"brace-style\": [\n      2,\n      \"1tbs\",\n      { \"allowSingleLine\": true }\n    ],\n    \"camelcase\": 1,\n    \"comma-spacing\": [\n      2,\n      {\n        \"before\": false,\n        \"after\": true\n      }\n    ],\n    \"comma-style\": [\n      2, \"last\"\n    ],\n    \"consistent-this\": 0,\n    \"eol-last\": 2,\n    \"func-names\": 0,\n    \"func-style\": 0,\n    \"key-spacing\": [\n      2,\n      {\n        \"beforeColon\": false,\n        \"afterColon\": true\n      }\n    ],\n    \"max-nested-callbacks\": 0,\n    \"new-cap\": 0,\n    \"new-parens\": 2,\n    \"no-array-constructor\": 2,\n    \"no-inline-comments\": 1,\n    \"no-mixed-spaces-and-tabs\": 2,\n    \"no-multiple-empty-lines\": [\n      1,\n      { \"max\": 2 }\n    ],\n    \"no-nested-ternary\": 2,\n    \"no-new-object\": 2,\n    \"semi-spacing\": [2, { \"before\": false, \"after\": true }],\n    \"no-spaced-func\": 2,\n    \"no-ternary\": 0,\n    \"no-trailing-spaces\": 1,\n    \"no-underscore-dangle\": 0,\n    \"one-var\": 0,\n    \"operator-assignment\": 0,\n    \"padded-blocks\": 0,\n    \"quote-props\": 0,\n    \"quotes\": [\n      2,\n      \"single\",\n      \"avoid-escape\"\n    ],\n    \"semi\": [\n      2,\n      \"always\"\n    ],\n    \"sort-vars\": 0,\n    \"keyword-spacing\": [ 2 ],\n    \"space-before-function-paren\": [\n      2,\n      \"never\"\n    ],\n    \"space-before-blocks\": [\n      2,\n      \"always\"\n    ],\n    \"space-in-brackets\": 0,\n    \"space-in-parens\": 0,\n    \"space-infix-ops\": 2,\n    \"space-unary-ops\": [\n      1,\n      {\n        \"words\": true,\n        \"nonwords\": false\n      }\n    ],\n    \"spaced-comment\": [\n      2,\n      \"always\",\n      { \"exceptions\": [\"-\"] }\n    ],\n    \"wrap-regex\": 1,\n\n    \"max-depth\": 0,\n    \"max-len\": [\n      2,\n      120,\n      2\n    ],\n    \"max-params\": 0,\n    \"max-statements\": 0,\n    \"no-bitwise\": 1,\n    \"no-plusplus\": 0,\n\n    \"react/display-name\": 1,\n    \"react/jsx-boolean-value\": [1, \"always\"],\n    \"jsx-quotes\": [1, \"prefer-single\"],\n    \"react/jsx-no-undef\": 1,\n    \"react/jsx-sort-props\": [1, { \"ignoreCase\": true }],\n    \"react/jsx-uses-react\": 1,\n    \"react/jsx-uses-vars\": 1,\n    \"react/no-did-mount-set-state\": 2,\n    \"react/no-did-update-set-state\": 2,\n    \"react/no-multi-comp\": [2, { \"ignoreStateless\": true } ],\n    \"react/prop-types\": 2,\n    \"react/react-in-jsx-scope\": 1,\n    \"react/self-closing-comp\": 1,\n    \"react/wrap-multilines\": 1\n  }\n}\n"
  },
  {
    "path": ".gitattributes",
    "content": "public/js/lib/codemirror/* linguist-vendored\n*.jsx linguist-language=JavaScript\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE.md",
    "content": "## 注意：这里只处理 FreeCodeCamp.cn 的相关问题，不处理 w3cschool 的任何问题\n## 注意：请不要乱开无意义的 Issue，违者直接加黑名单\n## 注意：Issue 是用来处理代码库中的 bug，不是用来提问题的。完成挑战过程中遇到的代码问题请在[gitter 讨论组](https://gitter.im/FreeCodeCamp/chinese) 或者 QQ 群 526289580 中讨论 (QQ 群验证答案: ___**freeCodeCamp**___ 注意大小写)\n\n#### FreeCodeCamp.cn Issue 模板\n如何使用本模板:\n* 尽可能多填些相关信息，方便管理员参考\n* 对于无法给出的内容，请删除掉那一行\n\n# 以上内容请在提交 Issue 之前删除\n\n#### 浏览器信息\n* 浏览器名称，版本号\n* 操作系统\n\n#### 问题描述\n* 问题是在什么时候，什么情况下遇到的\n* 简要说明如何重现\n\n#### 你的代码\n\n```\n如果和代码相关，请在这里粘贴你的全部代码\n```\n\n#### 截图（如果有）\n"
  },
  {
    "path": ".github/PULL_REQUEST_TEMPLATE.md",
    "content": "## FreeCodeCamp Pull Request template\nPlease, go through these steps before you submit a PR.\n\n1. Make sure that your PR is not a duplicate.\n2. If not, then make sure that:\n\n  2.1. You have done your changes in a separate branch. Branches MUST have descriptive names that start with either the `fix/` or `feature/` prefixes. Good examples are: `fix/signin-issue` or `feature/issue-templates`.\n\n  2.2. You have a descriptive commit message with a short title (first line).\n\n  2.3. You have only one commit (if not, [squash](https://github.com/FreeCodeCamp/FreeCodeCamp/wiki/git-rebase#squashing-multiple-commits-into-one) them into one commit).\n\n  2.4. `npm test` doesn't throw any error. If it does, fix them first and amend your commit (`git commit --amend`).\n\n3. **After** these steps, you're ready to open a pull request.\n\n  3.1. Your pull request MUST NOT target the `master` branch on FreeCodeCamp's repository. You probably want to target `staging` instead.\n\n  3.2. Give a descriptive title to your PR.\n\n  3.3. Provide a description of your changes.\n\n  3.4. Put `closes #XXXX` in your comment to auto-close the issue that your PR fixes (if such).\n\nIMPORTANT: Please review the [CONTRIBUTING.md](../CONTRIBUTING.md) file for detailed contributing guidelines.\n\n**PLEASE REMOVE THIS TEMPLATE BEFORE SUBMITTING**\n"
  },
  {
    "path": ".gitignore",
    "content": "lib-cov\n*.seed\n*.log\n*.csv\n*.dat\n*.out\n*.pid\n*.gz\n*.swp\n.floo\n.flooignore\nbuiltAssets/\npm2.js\n*.env\npids\nlogs\nresults\ntmp\n\nnpm-debug.log\nnode_modules\n.idea\n*.iml\n.git\n.DS_Store\nThumbs.db\nbower_components\nbundle.js\ncoverage\n.remote-sync.json\n\nserver/*.bundle.js\npublic/js/bundle*\n\n*.map\n\n// revision manifest\nserver/rev-manifest.json\nserver/manifests/*\n!server/manifests/README.md\n\npublic/js/main*\n// public/js/commonFramework*\npublic/js/sandbox*\npublic/js/iFrameScripts*\npublic/js/plugin*\npublic/js/vendor*\npublic/js/faux*\n\n\nserver/rev-manifest.json\n"
  },
  {
    "path": ".jshintrc",
    "content": "{\n    \"node\": true, // Enable globals available when code is running inside of the NodeJS runtime environment.\n    \"browser\": true, // Standard browser globals e.g. `window`, `document`.\n    \"esnext\": true, // Allow ES.next specific features such as `const` and `let`.\n    \"bitwise\": false, // Prohibit bitwise operators (&, |, ^, etc.).\n    \"camelcase\": false, // Permit only camelcase for `var` and `object indexes`.\n    \"curly\": false, // Require {} for every new block or scope.\n    \"eqeqeq\": true, // Require triple equals i.e. `===`.\n    \"immed\": true, // Require immediate invocations to be wrapped in parens e.g. `( function(){}() );`\n    \"latedef\": true, // Prohibit variable use before definition.\n    \"newcap\": true, // Require capitalization of all constructor functions e.g. `new F()`.\n    \"noarg\": true, // Prohibit use of `arguments.caller` and `arguments.callee`.\n    \"regexp\": true, // Prohibit `.` and `[^...]` in regular expressions.\n    \"undef\": true, // Require all non-global variables be declared before they are used.\n    \"unused\": false, // Warn unused variables.\n    \"strict\": false, // Require `use strict` pragma in every file.\n    \"trailing\": true, // Prohibit trailing whitespaces.\n    \"smarttabs\": false, // Suppresses warnings about mixed tabs and spaces\n    \"esnext\": true, // Allow ES6 maybe :p\n    \"globals\": { // Globals variables.\n        \"jasmine\": true,\n        \"angular\": true,\n        \"ApplicationConfiguration\": true\n    },\n    \"predef\": [ // Extra globals.\n        \"define\",\n        \"require\",\n        \"exports\",\n        \"module\",\n        \"describe\",\n        \"before\",\n        \"beforeEach\",\n        \"after\",\n        \"afterEach\",\n        \"it\",\n        \"inject\",\n        \"expect\"\n    ],\n    \"devel\": true, // Allow development statements e.g. `console.log();`.\n    \"noempty\": true // Prohibit use of empty blocks.\n}\n"
  },
  {
    "path": ".node-inspectorrc",
    "content": "{\n    \"save-live-edit\": true\n}"
  },
  {
    "path": ".travis.yml",
    "content": "language: node_js\n\nnode_js:\n  - '4.2.1'\n\nsudo: false\n"
  },
  {
    "path": "CONTRIBUTING.md",
    "content": "# 贡献者指南\n\n## 我想成为代码贡献者！\nWe welcome pull requests from Free Code Camp campers (our students) and seasoned JavaScript developers alike! Follow these steps to contribute:\n\n我们欢迎每一位 FreeCodeCamp学员 和 有经验的JavaScript开发人员向我们提交PR！请参照下面这些步骤参与进来：\n\n\n1.  Find an issue that needs assistance by searching for the [Help Wanted](https://github.com/FreeCodeCampChina/freecodecamp.cn/labels/help%20wanted) tag.\n\n   通过搜索标记[Help Wanted](https://github.com/FreeCodeCampChina/freecodecamp.cn/labels/help%20wanted) 来找到需要帮助的问题。\n\n2.  Let us know you are working on it, by posting a comment on the issue.\n\n   在问题下面发送一个评论，便于让我们知道你正在着手解决这个问题。\n\n3.  Feel free to ask for help in our [Help Contributors](https://gitter.im/FreeCodeCamp/chinese) Gitter room.\n\n   你可以自由地在我们的[Help Contributors](https://gitter.im/FreeCodeCamp/chinese)聊天室提问来获得帮助。\n\nIf you've found a bug that is not on the board, [follow these steps](#found-a-bug).\n\n## Contribution Guidelines\n\n1.  Fork the project: [How To Fork And Maintain a Local Instance of Free Code Camp](https://github.com/FreeCodeCamp/FreeCodeCamp/wiki/How-To-Fork-And-Maintain-a-Local-Instance-of-Free-Code-Camp)\n2.  Create a branch specific to the issue or feature you are working on. Push your work to that branch. ([Need help with branching?](https://github.com/Kunena/Kunena-Forum/wiki/Create-a-new-branch-with-git-and-manage-branches))\n3.  Name the branch something like `fix/xxx` or `feature/xxx` where `xxx` is a short description of the changes or feature you are attempting to add. For example `fix/email-login` would be a branch where I fix something specific to email login.\n4. [Set up Linting](#linting-setup) to run as you make changes.\n5. When you are ready to share your code, run the test suite `npm test` and ensure all tests pass.  For Windows contributors, skip the jsonlint pretest run by using `npm run test-challenges`, as jsonlint will always fail on Windows, given the wildcard parameters.\n5.  Squash your Commits. Ref: [rebasing](https://github.com/FreeCodeCamp/FreeCodeCamp/wiki/git-rebase)\n6.  Submit a [pull request](https://github.com/FreeCodeCamp/FreeCodeCamp/wiki/Pull-Request-Contribute) from your branch to Free Code Camp's `staging` branch.  [Travis CI](https://travis-ci.org/FreeCodeCamp/FreeCodeCamp) will then take your code and run `npm test`.  Make sure this passes, then we'll do a quick code review and give you feedback, then iterate from there.\n\n\nPrerequisites\n-------------\n\n- [MongoDB](http://www.mongodb.org/downloads)\n- [Node.js](http://nodejs.org)\n\nGetting Started\n---------------\nNote: If this is your first time working with a node-gyp dependent module, please follow the [node-gyp installation guide](https://github.com/nodejs/node-gyp#installation) to ensure a working npm build.\n\nThe easiest way to get started is to clone the repository:\n\n```bash\n# Get the latest snapshot\ngit clone --depth=1 https://github.com/freecodecampchina/freecodecamp.cn.git freecodecamp\n\n# Change directory\ncd freecodecamp\n\n# Install NPM dependencies\nnpm install\n\n# Install Gulp globally\nnpm install -g gulp\n\n# Install Bower globally\nnpm install -g bower\n\n# Install Bower dependencies\nbower install\n```\n*Private Environment Variables (API Keys)*\n```bash\n# Create a copy of the \"sample.env\" and name it as \".env\".\n# Populate it with the necessary API keys and secrets:\ncp sample.env .env\n```\n\nEdit your `.env` file and modify the API keys only for services that you will use.\n\nNote : Not all keys are required, to run the app locally, however `MONGOHQ_URL` is the most important one.\n\nIf you only use email login, in addition to `MONGOHQ_URL`, `SESSION_SECRET`, add the  `MANDRILL_USER` and `MANDRILL_PASSWORD` API Keys. Not setting these keys will throw an exception when you sign up which you can ignore, you will still be able to login, however you may get these keys [here](https://www.mandrill.com/signup/). Sign up and create a new pair of keys.\n\nYou can leave the other keys as they are. Keep in mind if you want to use more services you'll have to get your own API keys for those services and edit those entries accordingly in the `.env` file.\n\n```bash\n# Start the mongo server in a separate terminal\nmongod\n\n# Initialize Free Code Camp\n# This will seed the database for the first time.\n# This command should only be run once.\nnpm run only-once\n\n# start the application\ngulp\n```\nNow navigate to your browser and open http://localhost:3001\nIf the app loads, congratulations - you're all set. Otherwise, let us know by opening a GitHub issue and with your error.\n\n## Linting Setup\nYou should have [ESLint running in your editor](http://eslint.org/docs/user-guide/integrations.html), and it will highlight anything doesn't conform to [Free Code Camp's JavaScript Style Guide](https://github.com/FreeCodeCamp/FreeCodeCamp/wiki/Free-Code-Camp-JavaScript-Style-Guide) (you can find a summary of those rules [here](https://github.com/FreeCodeCamp/FreeCodeCamp/blob/staging/.eslintrc). Please do not ignore any linting errors, as they are meant to **help** you and to ensure a clean and simple code base. Make sure none of your JavaScript is longer than 80 characters per line.  The reason we enforce this is because one of our dependent NPM modules, [jsonlint](https://github.com/zaach/jsonlint), does not fully support wildcard paths in Windows.\n\n## Found a bug?\nDo not file an issue until you have followed these steps:\n\n1. Read [Help I've Found a Bug](https://github.com/FreeCodeCamp/FreeCodeCamp/wiki/Help-I've-Found-a-Bug) wiki page and follow the instructions there.\n2. Asked for confirmation in the appropriate [Help Room](https://github.com/FreeCodeCamp/FreeCodeCamp/wiki/Help-Rooms)\n3. Please *do not* open an issue without a 3rd party confirmation of your problem.\n\n\n## Creating Pull Requests\n**What is a Pull Request?**\n\nA pull request (PR) is a method of submitting proposed changes to the Free Code Camp Repo (or any Repo, for that matter). You will make changes to copies of the files which make up Free Code Camp in a personal fork, then apply to have them accepted by Free Code Camp proper.\n\n**Need Help?**\n\nFree Code Camp Issue Mods and staff are on hand to assist with Pull Request related issues on our Help Contributors Chat Room\n\n**Methods**\n\nThere are two methods of creating a Pull for Free Code Camp:\n\n- Editing files via the GitHub Interface\n- Editing files on a local clone  \n\n**Important: ALWAYS EDIT ON A BRANCH**  \nTake away only one thing from this document, it should be this: Never, **EVER** make edits to the `staging` branch. ALWAYS make a new branch BEFORE you edit files. This is critical, because if your PR is not accepted, your copy of staging will be forever sullied and the only way to fix it is to delete your fork and re-fork.\n\n_**Method 1: Editing via your Local Fork (Recommended)**_  \nThis is the recommended method. Read about How to Setup and Maintain a Local Instance of Free Code Camp.\n\n1. Perform the maintenance step of rebasing `staging`.  \n2. Ensure you are on the `staging` branch using `git status`:\n\n```bash\n$ git status\nOn branch staging\nYour branch is up-to-date with 'origin/staging'.\n\nnothing to commit, working directory clean\n```\n\n3. If you are not on staging or your working directory is not clean, resolve any outstanding files/commits and checkout staging `git checkout staging`\n4. Create a branch off of `staging` with git: `git checkout -B branch/name-here`  \n**Note:** Branch naming is important. Use a name like `fix/short-fix-description` or `feature/short-feature-description`. Review the [Contribution Guidelines](#contribution-guidelines) for more detail.\n5. Edit your file(s) locally with the editor of your choice\n6. Check your `git status` to see unstaged files.\n7. Add your edited files: `git add path/to/filename.ext` You can also do: `git add .` to add all unstaged files. Take care, though, because you can accidentally add files you don't want added. Review your `git status` first.\n8. Commit your edits: `git commit -m \"Brief Description of Commit\"`\n9. Squash your commits, if there are more than one.\n10. Push your commits to your GitHub Fork: `git push -u origin branch/name-here`\n11. Go to [Common Steps](#common-steps)\n\n_**Method 2: Editing via the GitHub Interface**_  \n\nNote: Editing via the GitHub Interface is not recommended, since it is not possible to update your fork via GitHub's interface without deleting and recreating your fork.  \n\nRead the [Wiki article](https://github.com/FreeCodeCamp/FreeCodeCamp/wiki/How-To-Create-A-Pull-Request-for-Free-Code-Camp#editing-via-the-github-interface) for further information\n\n## Common Steps\n1. Once the edits have been committed, you will be prompted to create a pull request on your fork's Github Page.\n2. By default, all pull requests should be against the FCC main repo, `staging` branch.\n3. Submit a [pull request](https://github.com/FreeCodeCamp/FreeCodeCamp/wiki/Pull-Request-Contribute) from your branch to Free Code Camp's `staging` branch.\n3. The title (also called the subject) of your PR should be descriptive of your changes and succinctly indicates what is being fixed.  \n   - **Do not add the issue number in the PR title**.\n   - Examples: `Add Test Cases to Bonfire Drop It` `Correct typo in Waypoint Size Your Images`\n4. In the body of your PR include a more detailed summary of the changes you made and why.\n   - If the PR is meant to fix an existing bug/issue, then, at the end of your PR's commit message, append the keyword `closes` and #xxxx (where xxxx is the issue number). Example: `closes #1337`.  \n   This tells GitHub to close the existing issue, if the PR is merged.\n5. Indicate if you have tested on a local copy of the site or not.\n\n## Next Steps\n\n**If your PR is accepted**\n\nOnce your PR is accepted, you may delete the branch you created to submit it. This keeps your working fork clean.  \n\nYou can do this with a press of a button on the GitHub PR interface. You can delete the local copy of the branch with: `git branch -D branch/to-delete-name`\n\n**If your PR is rejected**\n\nDon't despair! You should receive solid feedback from the Issue Moderators as to why it was rejected and what changes are needed.\n\nMany Pull Requests, especially first Pull Requests, require correction or updating. If you have used the GitHub interface to create your PR, you will need to close your PR, create a new branch, and re-submit. This is because you cannot squash your commits via the GitHub interface.\n\nIf you have a local copy of the repo, you can make the requested changes and amend your commit with: `git commit --amend` This will update your existing commit. When you push it to your fork you will need to do a force push to overwrite your old commit: `git push --force`\n\nBe sure to post in the PR conversation that you have made the requested changes.\n\n##Other resources\n- [Searching for Your Issue on Github](https://github.com/FreeCodeCamp/FreeCodeCamp/wiki/Searching-for-Your-Issue-on-Github)\n- [Creating a New Github Issue](https://github.com/FreeCodeCamp/FreeCodeCamp/wiki/Creating-a-New-Github-Issue)\n- [Select Issues for Contributing Using Labels](https://github.com/FreeCodeCamp/FreeCodeCamp/wiki/Select-Issues-for-Contributing-Using-Labels)\n- [How to clone the FreeCodeCamp website on a Windows pc](https://github.com/FreeCodeCamp/FreeCodeCamp/wiki/How-to-clone-the-FreeCodeCamp-website-on-a-Windows-pc)\n- [How to log in to your local FCC site - using GitHub](https://github.com/FreeCodeCamp/FreeCodeCamp/wiki/How-To-Log-In-To-Your-Local-FCC-Site)\n- [Contributions Guide - With a demo on fixing a typo](https://github.com/FreeCodeCamp/FreeCodeCamp/wiki/Contributions-Guide---with-Typo-Demo)\n- [Writing great git commit message](https://github.com/FreeCodeCamp/FreeCodeCamp/wiki/Writing-great-git-commit-message)\n- [Contributor Chat Support - For the FCC Repositories, and running a local instance] (https://gitter.im/FreeCodeCamp/chinese)\n"
  },
  {
    "path": "LICENSE",
    "content": "BSD 3-Clause License\n\nCopyright (c) 2017, FreeCodeCamp 中国\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n* Redistributions of source code must retain the above copyright notice, this\n  list of conditions and the following disclaimer.\n\n* Redistributions in binary form must reproduce the above copyright notice,\n  this list of conditions and the following disclaimer in the documentation\n  and/or other materials provided with the distribution.\n\n* Neither the name of the copyright holder nor the names of its\n  contributors may be used to endorse or promote products derived from\n  this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\nFOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\nDAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\nSERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\nCAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\nOR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n"
  },
  {
    "path": "LICENSE-freeCodeCamp-Curriculum.md",
    "content": "Attribution-ShareAlike 4.0 International\n\n=======================================================================\n\nCreative Commons Corporation (\"Creative Commons\") is not a law firm and\ndoes not provide legal services or legal advice. Distribution of\nCreative Commons public licenses does not create a lawyer-client or\nother relationship. Creative Commons makes its licenses and related\ninformation available on an \"as-is\" basis. Creative Commons gives no\nwarranties regarding its licenses, any material licensed under their\nterms and conditions, or any related information. Creative Commons\ndisclaims all liability for damages resulting from their use to the\nfullest extent possible.\n\nUsing Creative Commons Public Licenses\n\nCreative Commons public licenses provide a standard set of terms and\nconditions that creators and other rights holders may use to share\noriginal works of authorship and other material subject to copyright\nand certain other rights specified in the public license below. The\nfollowing considerations are for informational purposes only, are not\nexhaustive, and do not form part of our licenses.\n\n     Considerations for licensors: Our public licenses are\n     intended for use by those authorized to give the public\n     permission to use material in ways otherwise restricted by\n     copyright and certain other rights. Our licenses are\n     irrevocable. Licensors should read and understand the terms\n     and conditions of the license they choose before applying it.\n     Licensors should also secure all rights necessary before\n     applying our licenses so that the public can reuse the\n     material as expected. Licensors should clearly mark any\n     material not subject to the license. This includes other CC-\n     licensed material, or material used under an exception or\n     limitation to copyright. More considerations for licensors:\n\twiki.creativecommons.org/Considerations_for_licensors\n\n     Considerations for the public: By using one of our public\n     licenses, a licensor grants the public permission to use the\n     licensed material under specified terms and conditions. If\n     the licensor's permission is not necessary for any reason--for\n     example, because of any applicable exception or limitation to\n     copyright--then that use is not regulated by the license. Our\n     licenses grant only permissions under copyright and certain\n     other rights that a licensor has authority to grant. Use of\n     the licensed material may still be restricted for other\n     reasons, including because others have copyright or other\n     rights in the material. A licensor may make special requests,\n     such as asking that all changes be marked or described.\n     Although not required by our licenses, you are encouraged to\n     respect those requests where reasonable. More_considerations\n     for the public:\n\twiki.creativecommons.org/Considerations_for_licensees\n\n=======================================================================\n\nCreative Commons Attribution-ShareAlike 4.0 International Public\nLicense\n\nBy exercising the Licensed Rights (defined below), You accept and agree\nto be bound by the terms and conditions of this Creative Commons\nAttribution-ShareAlike 4.0 International Public License (\"Public\nLicense\"). To the extent this Public License may be interpreted as a\ncontract, You are granted the Licensed Rights in consideration of Your\nacceptance of these terms and conditions, and the Licensor grants You\nsuch rights in consideration of benefits the Licensor receives from\nmaking the Licensed Material available under these terms and\nconditions.\n\n\nSection 1 -- Definitions.\n\n  a. Adapted Material means material subject to Copyright and Similar\n     Rights that is derived from or based upon the Licensed Material\n     and in which the Licensed Material is translated, altered,\n     arranged, transformed, or otherwise modified in a manner requiring\n     permission under the Copyright and Similar Rights held by the\n     Licensor. For purposes of this Public License, where the Licensed\n     Material is a musical work, performance, or sound recording,\n     Adapted Material is always produced where the Licensed Material is\n     synched in timed relation with a moving image.\n\n  b. Adapter's License means the license You apply to Your Copyright\n     and Similar Rights in Your contributions to Adapted Material in\n     accordance with the terms and conditions of this Public License.\n\n  c. BY-SA Compatible License means a license listed at\n     creativecommons.org/compatiblelicenses, approved by Creative\n     Commons as essentially the equivalent of this Public License.\n\n  d. Copyright and Similar Rights means copyright and/or similar rights\n     closely related to copyright including, without limitation,\n     performance, broadcast, sound recording, and Sui Generis Database\n     Rights, without regard to how the rights are labeled or\n     categorized. For purposes of this Public License, the rights\n     specified in Section 2(b)(1)-(2) are not Copyright and Similar\n     Rights.\n\n  e. Effective Technological Measures means those measures that, in the\n     absence of proper authority, may not be circumvented under laws\n     fulfilling obligations under Article 11 of the WIPO Copyright\n     Treaty adopted on December 20, 1996, and/or similar international\n     agreements.\n\n  f. Exceptions and Limitations means fair use, fair dealing, and/or\n     any other exception or limitation to Copyright and Similar Rights\n     that applies to Your use of the Licensed Material.\n\n  g. License Elements means the license attributes listed in the name\n     of a Creative Commons Public License. The License Elements of this\n     Public License are Attribution and ShareAlike.\n\n  h. Licensed Material means the artistic or literary work, database,\n     or other material to which the Licensor applied this Public\n     License.\n\n  i. Licensed Rights means the rights granted to You subject to the\n     terms and conditions of this Public License, which are limited to\n     all Copyright and Similar Rights that apply to Your use of the\n     Licensed Material and that the Licensor has authority to license.\n\n  j. Licensor means the individual(s) or entity(ies) granting rights\n     under this Public License.\n\n  k. Share means to provide material to the public by any means or\n     process that requires permission under the Licensed Rights, such\n     as reproduction, public display, public performance, distribution,\n     dissemination, communication, or importation, and to make material\n     available to the public including in ways that members of the\n     public may access the material from a place and at a time\n     individually chosen by them.\n\n  l. Sui Generis Database Rights means rights other than copyright\n     resulting from Directive 96/9/EC of the European Parliament and of\n     the Council of 11 March 1996 on the legal protection of databases,\n     as amended and/or succeeded, as well as other essentially\n     equivalent rights anywhere in the world.\n\n  m. You means the individual or entity exercising the Licensed Rights\n     under this Public License. Your has a corresponding meaning.\n\n\nSection 2 -- Scope.\n\n  a. License grant.\n\n       1. Subject to the terms and conditions of this Public License,\n          the Licensor hereby grants You a worldwide, royalty-free,\n          non-sublicensable, non-exclusive, irrevocable license to\n          exercise the Licensed Rights in the Licensed Material to:\n\n            a. reproduce and Share the Licensed Material, in whole or\n               in part; and\n\n            b. produce, reproduce, and Share Adapted Material.\n\n       2. Exceptions and Limitations. For the avoidance of doubt, where\n          Exceptions and Limitations apply to Your use, this Public\n          License does not apply, and You do not need to comply with\n          its terms and conditions.\n\n       3. Term. The term of this Public License is specified in Section\n          6(a).\n\n       4. Media and formats; technical modifications allowed. The\n          Licensor authorizes You to exercise the Licensed Rights in\n          all media and formats whether now known or hereafter created,\n          and to make technical modifications necessary to do so. The\n          Licensor waives and/or agrees not to assert any right or\n          authority to forbid You from making technical modifications\n          necessary to exercise the Licensed Rights, including\n          technical modifications necessary to circumvent Effective\n          Technological Measures. For purposes of this Public License,\n          simply making modifications authorized by this Section 2(a)\n          (4) never produces Adapted Material.\n\n       5. Downstream recipients.\n\n            a. Offer from the Licensor -- Licensed Material. Every\n               recipient of the Licensed Material automatically\n               receives an offer from the Licensor to exercise the\n               Licensed Rights under the terms and conditions of this\n               Public License.\n\n            b. Additional offer from the Licensor -- Adapted Material.\n               Every recipient of Adapted Material from You\n               automatically receives an offer from the Licensor to\n               exercise the Licensed Rights in the Adapted Material\n               under the conditions of the Adapter's License You apply.\n\n            c. No downstream restrictions. You may not offer or impose\n               any additional or different terms or conditions on, or\n               apply any Effective Technological Measures to, the\n               Licensed Material if doing so restricts exercise of the\n               Licensed Rights by any recipient of the Licensed\n               Material.\n\n       6. No endorsement. Nothing in this Public License constitutes or\n          may be construed as permission to assert or imply that You\n          are, or that Your use of the Licensed Material is, connected\n          with, or sponsored, endorsed, or granted official status by,\n          the Licensor or others designated to receive attribution as\n          provided in Section 3(a)(1)(A)(i).\n\n  b. Other rights.\n\n       1. Moral rights, such as the right of integrity, are not\n          licensed under this Public License, nor are publicity,\n          privacy, and/or other similar personality rights; however, to\n          the extent possible, the Licensor waives and/or agrees not to\n          assert any such rights held by the Licensor to the limited\n          extent necessary to allow You to exercise the Licensed\n          Rights, but not otherwise.\n\n       2. Patent and trademark rights are not licensed under this\n          Public License.\n\n       3. To the extent possible, the Licensor waives any right to\n          collect royalties from You for the exercise of the Licensed\n          Rights, whether directly or through a collecting society\n          under any voluntary or waivable statutory or compulsory\n          licensing scheme. In all other cases the Licensor expressly\n          reserves any right to collect such royalties.\n\n\nSection 3 -- License Conditions.\n\nYour exercise of the Licensed Rights is expressly made subject to the\nfollowing conditions.\n\n  a. Attribution.\n\n       1. If You Share the Licensed Material (including in modified\n          form), You must:\n\n            a. retain the following if it is supplied by the Licensor\n               with the Licensed Material:\n\n                 i. identification of the creator(s) of the Licensed\n                    Material and any others designated to receive\n                    attribution, in any reasonable manner requested by\n                    the Licensor (including by pseudonym if\n                    designated);\n\n                ii. a copyright notice;\n\n               iii. a notice that refers to this Public License;\n\n                iv. a notice that refers to the disclaimer of\n                    warranties;\n\n                 v. a URI or hyperlink to the Licensed Material to the\n                    extent reasonably practicable;\n\n            b. indicate if You modified the Licensed Material and\n               retain an indication of any previous modifications; and\n\n            c. indicate the Licensed Material is licensed under this\n               Public License, and include the text of, or the URI or\n               hyperlink to, this Public License.\n\n       2. You may satisfy the conditions in Section 3(a)(1) in any\n          reasonable manner based on the medium, means, and context in\n          which You Share the Licensed Material. For example, it may be\n          reasonable to satisfy the conditions by providing a URI or\n          hyperlink to a resource that includes the required\n          information.\n\n       3. If requested by the Licensor, You must remove any of the\n          information required by Section 3(a)(1)(A) to the extent\n          reasonably practicable.\n\n  b. ShareAlike.\n\n     In addition to the conditions in Section 3(a), if You Share\n     Adapted Material You produce, the following conditions also apply.\n\n       1. The Adapter's License You apply must be a Creative Commons\n          license with the same License Elements, this version or\n          later, or a BY-SA Compatible License.\n\n       2. You must include the text of, or the URI or hyperlink to, the\n          Adapter's License You apply. You may satisfy this condition\n          in any reasonable manner based on the medium, means, and\n          context in which You Share Adapted Material.\n\n       3. You may not offer or impose any additional or different terms\n          or conditions on, or apply any Effective Technological\n          Measures to, Adapted Material that restrict exercise of the\n          rights granted under the Adapter's License You apply.\n\n\nSection 4 -- Sui Generis Database Rights.\n\nWhere the Licensed Rights include Sui Generis Database Rights that\napply to Your use of the Licensed Material:\n\n  a. for the avoidance of doubt, Section 2(a)(1) grants You the right\n     to extract, reuse, reproduce, and Share all or a substantial\n     portion of the contents of the database;\n\n  b. if You include all or a substantial portion of the database\n     contents in a database in which You have Sui Generis Database\n     Rights, then the database in which You have Sui Generis Database\n     Rights (but not its individual contents) is Adapted Material,\n\n     including for purposes of Section 3(b); and\n  c. You must comply with the conditions in Section 3(a) if You Share\n     all or a substantial portion of the contents of the database.\n\nFor the avoidance of doubt, this Section 4 supplements and does not\nreplace Your obligations under this Public License where the Licensed\nRights include other Copyright and Similar Rights.\n\n\nSection 5 -- Disclaimer of Warranties and Limitation of Liability.\n\n  a. UNLESS OTHERWISE SEPARATELY UNDERTAKEN BY THE LICENSOR, TO THE\n     EXTENT POSSIBLE, THE LICENSOR OFFERS THE LICENSED MATERIAL AS-IS\n     AND AS-AVAILABLE, AND MAKES NO REPRESENTATIONS OR WARRANTIES OF\n     ANY KIND CONCERNING THE LICENSED MATERIAL, WHETHER EXPRESS,\n     IMPLIED, STATUTORY, OR OTHER. THIS INCLUDES, WITHOUT LIMITATION,\n     WARRANTIES OF TITLE, MERCHANTABILITY, FITNESS FOR A PARTICULAR\n     PURPOSE, NON-INFRINGEMENT, ABSENCE OF LATENT OR OTHER DEFECTS,\n     ACCURACY, OR THE PRESENCE OR ABSENCE OF ERRORS, WHETHER OR NOT\n     KNOWN OR DISCOVERABLE. WHERE DISCLAIMERS OF WARRANTIES ARE NOT\n     ALLOWED IN FULL OR IN PART, THIS DISCLAIMER MAY NOT APPLY TO YOU.\n\n  b. TO THE EXTENT POSSIBLE, IN NO EVENT WILL THE LICENSOR BE LIABLE\n     TO YOU ON ANY LEGAL THEORY (INCLUDING, WITHOUT LIMITATION,\n     NEGLIGENCE) OR OTHERWISE FOR ANY DIRECT, SPECIAL, INDIRECT,\n     INCIDENTAL, CONSEQUENTIAL, PUNITIVE, EXEMPLARY, OR OTHER LOSSES,\n     COSTS, EXPENSES, OR DAMAGES ARISING OUT OF THIS PUBLIC LICENSE OR\n     USE OF THE LICENSED MATERIAL, EVEN IF THE LICENSOR HAS BEEN\n     ADVISED OF THE POSSIBILITY OF SUCH LOSSES, COSTS, EXPENSES, OR\n     DAMAGES. WHERE A LIMITATION OF LIABILITY IS NOT ALLOWED IN FULL OR\n     IN PART, THIS LIMITATION MAY NOT APPLY TO YOU.\n\n  c. The disclaimer of warranties and limitation of liability provided\n     above shall be interpreted in a manner that, to the extent\n     possible, most closely approximates an absolute disclaimer and\n     waiver of all liability.\n\n\nSection 6 -- Term and Termination.\n\n  a. This Public License applies for the term of the Copyright and\n     Similar Rights licensed here. However, if You fail to comply with\n     this Public License, then Your rights under this Public License\n     terminate automatically.\n\n  b. Where Your right to use the Licensed Material has terminated under\n     Section 6(a), it reinstates:\n\n       1. automatically as of the date the violation is cured, provided\n          it is cured within 30 days of Your discovery of the\n          violation; or\n\n       2. upon express reinstatement by the Licensor.\n\n     For the avoidance of doubt, this Section 6(b) does not affect any\n     right the Licensor may have to seek remedies for Your violations\n     of this Public License.\n\n  c. For the avoidance of doubt, the Licensor may also offer the\n     Licensed Material under separate terms or conditions or stop\n     distributing the Licensed Material at any time; however, doing so\n     will not terminate this Public License.\n\n  d. Sections 1, 5, 6, 7, and 8 survive termination of this Public\n     License.\n\n\nSection 7 -- Other Terms and Conditions.\n\n  a. The Licensor shall not be bound by any additional or different\n     terms or conditions communicated by You unless expressly agreed.\n\n  b. Any arrangements, understandings, or agreements regarding the\n     Licensed Material not stated herein are separate from and\n     independent of the terms and conditions of this Public License.\n\n\nSection 8 -- Interpretation.\n\n  a. For the avoidance of doubt, this Public License does not, and\n     shall not be interpreted to, reduce, limit, restrict, or impose\n     conditions on any use of the Licensed Material that could lawfully\n     be made without permission under this Public License.\n\n  b. To the extent possible, if any provision of this Public License is\n     deemed unenforceable, it shall be automatically reformed to the\n     minimum extent necessary to make it enforceable. If the provision\n     cannot be reformed, it shall be severed from this Public License\n     without affecting the enforceability of the remaining terms and\n     conditions.\n\n  c. No term or condition of this Public License will be waived and no\n     failure to comply consented to unless expressly agreed to by the\n     Licensor.\n\n  d. Nothing in this Public License constitutes or may be interpreted\n     as a limitation upon, or waiver of, any privileges and immunities\n     that apply to the Licensor or You, including from the legal\n     processes of any jurisdiction or authority.\n\n\n=======================================================================\n\nCreative Commons is not a party to its public\nlicenses. Notwithstanding, Creative Commons may elect to apply one of\nits public licenses to material it publishes and in those instances\nwill be considered the “Licensor.” The text of the Creative Commons\npublic licenses is dedicated to the public domain under the CC0 Public\nDomain Dedication. Except for the limited purpose of indicating that\nmaterial is shared under a Creative Commons public license or as\notherwise permitted by the Creative Commons policies published at\ncreativecommons.org/policies, Creative Commons does not authorize the\nuse of the trademark \"Creative Commons\" or any other trademark or logo\nof Creative Commons without its prior written consent including,\nwithout limitation, in connection with any unauthorized modifications\nto any of its public licenses or any other arrangements,\nunderstandings, or agreements concerning use of licensed material. For\nthe avoidance of doubt, this paragraph does not form part of the\npublic licenses.\n\nCreative Commons may be contacted at creativecommons.org.\n"
  },
  {
    "path": "LICENSE-freeCodeCamp-Translation.md",
    "content": "## creative commons\n\n# Attribution-NonCommercial 4.0 International\n\nCreative Commons Corporation (“Creative Commons”) is not a law firm and does not provide legal services or legal advice. Distribution of Creative Commons public licenses does not create a lawyer-client or other relationship. Creative Commons makes its licenses and related information available on an “as-is” basis. Creative Commons gives no warranties regarding its licenses, any material licensed under their terms and conditions, or any related information. Creative Commons disclaims all liability for damages resulting from their use to the fullest extent possible.\n\n### Using Creative Commons Public Licenses\n\nCreative Commons public licenses provide a standard set of terms and conditions that creators and other rights holders may use to share original works of authorship and other material subject to copyright and certain other rights specified in the public license below. The following considerations are for informational purposes only, are not exhaustive, and do not form part of our licenses.\n\n* __Considerations for licensors:__ Our public licenses are intended for use by those authorized to give the public permission to use material in ways otherwise restricted by copyright and certain other rights. Our licenses are irrevocable. Licensors should read and understand the terms and conditions of the license they choose before applying it. Licensors should also secure all rights necessary before applying our licenses so that the public can reuse the material as expected. Licensors should clearly mark any material not subject to the license. This includes other CC-licensed material, or material used under an exception or limitation to copyright. [More considerations for licensors](http://wiki.creativecommons.org/Considerations_for_licensors_and_licensees#Considerations_for_licensors).\n\n* __Considerations for the public:__ By using one of our public licenses, a licensor grants the public permission to use the licensed material under specified terms and conditions. If the licensor’s permission is not necessary for any reason–for example, because of any applicable exception or limitation to copyright–then that use is not regulated by the license. Our licenses grant only permissions under copyright and certain other rights that a licensor has authority to grant. Use of the licensed material may still be restricted for other reasons, including because others have copyright or other rights in the material. A licensor may make special requests, such as asking that all changes be marked or described. Although not required by our licenses, you are encouraged to respect those requests where reasonable. [More considerations for the public](http://wiki.creativecommons.org/Considerations_for_licensors_and_licensees#Considerations_for_licensees).\n\n## Creative Commons Attribution-NonCommercial 4.0 International Public License\n\nBy exercising the Licensed Rights (defined below), You accept and agree to be bound by the terms and conditions of this Creative Commons Attribution-NonCommercial 4.0 International Public License (\"Public License\"). To the extent this Public License may be interpreted as a contract, You are granted the Licensed Rights in consideration of Your acceptance of these terms and conditions, and the Licensor grants You such rights in consideration of benefits the Licensor receives from making the Licensed Material available under these terms and conditions.\n\n### Section 1 – Definitions.\n\na. __Adapted Material__ means material subject to Copyright and Similar Rights that is derived from or based upon the Licensed Material and in which the Licensed Material is translated, altered, arranged, transformed, or otherwise modified in a manner requiring permission under the Copyright and Similar Rights held by the Licensor. For purposes of this Public License, where the Licensed Material is a musical work, performance, or sound recording, Adapted Material is always produced where the Licensed Material is synched in timed relation with a moving image.\n\nb. __Adapter's License__ means the license You apply to Your Copyright and Similar Rights in Your contributions to Adapted Material in accordance with the terms and conditions of this Public License.\n\nc. __Copyright and Similar Rights__ means copyright and/or similar rights closely related to copyright including, without limitation, performance, broadcast, sound recording, and Sui Generis Database Rights, without regard to how the rights are labeled or categorized. For purposes of this Public License, the rights specified in Section 2(b)(1)-(2) are not Copyright and Similar Rights.\n\nd. __Effective Technological Measures__ means those measures that, in the absence of proper authority, may not be circumvented under laws fulfilling obligations under Article 11 of the WIPO Copyright Treaty adopted on December 20, 1996, and/or similar international agreements.\n\ne. __Exceptions and Limitations__ means fair use, fair dealing, and/or any other exception or limitation to Copyright and Similar Rights that applies to Your use of the Licensed Material.\n\nf. __Licensed Material__ means the artistic or literary work, database, or other material to which the Licensor applied this Public License.\n\ng. __Licensed Rights__ means the rights granted to You subject to the terms and conditions of this Public License, which are limited to all Copyright and Similar Rights that apply to Your use of the Licensed Material and that the Licensor has authority to license.\n\nh. __Licensor__ means the individual(s) or entity(ies) granting rights under this Public License.\n\ni. __NonCommercial__ means not primarily intended for or directed towards commercial advantage or monetary compensation. For purposes of this Public License, the exchange of the Licensed Material for other material subject to Copyright and Similar Rights by digital file-sharing or similar means is NonCommercial provided there is no payment of monetary compensation in connection with the exchange.\n\nj. __Share__ means to provide material to the public by any means or process that requires permission under the Licensed Rights, such as reproduction, public display, public performance, distribution, dissemination, communication, or importation, and to make material available to the public including in ways that members of the public may access the material from a place and at a time individually chosen by them.\n\nk. __Sui Generis Database Rights__ means rights other than copyright resulting from Directive 96/9/EC of the European Parliament and of the Council of 11 March 1996 on the legal protection of databases, as amended and/or succeeded, as well as other essentially equivalent rights anywhere in the world.\n\nl. __You__ means the individual or entity exercising the Licensed Rights under this Public License. Your has a corresponding meaning.\n\n### Section 2 – Scope.\n\na. ___License grant.___\n\n   1. Subject to the terms and conditions of this Public License, the Licensor hereby grants You a worldwide, royalty-free, non-sublicensable, non-exclusive, irrevocable license to exercise the Licensed Rights in the Licensed Material to:\n\n       A. reproduce and Share the Licensed Material, in whole or in part, for NonCommercial purposes only; and\n\n       B. produce, reproduce, and Share Adapted Material for NonCommercial purposes only.\n\n   2. __Exceptions and Limitations.__ For the avoidance of doubt, where Exceptions and Limitations apply to Your use, this Public License does not apply, and You do not need to comply with its terms and conditions.\n\n   3. __Term.__ The term of this Public License is specified in Section 6(a).\n\n   4. __Media and formats; technical modifications allowed.__ The Licensor authorizes You to exercise the Licensed Rights in all media and formats whether now known or hereafter created, and to make technical modifications necessary to do so. The Licensor waives and/or agrees not to assert any right or authority to forbid You from making technical modifications necessary to exercise the Licensed Rights, including technical modifications necessary to circumvent Effective Technological Measures. For purposes of this Public License, simply making modifications authorized by this Section 2(a)(4) never produces Adapted Material.\n\n    5. __Downstream recipients.__\n\n        A. __Offer from the Licensor – Licensed Material.__ Every recipient of the Licensed Material automatically receives an offer from the Licensor to exercise the Licensed Rights under the terms and conditions of this Public License.\n\n        B. __No downstream restrictions.__ You may not offer or impose any additional or different terms or conditions on, or apply any Effective Technological Measures to, the Licensed Material if doing so restricts exercise of the Licensed Rights by any recipient of the Licensed Material.\n\n    6. __No endorsement.__ Nothing in this Public License constitutes or may be construed as permission to assert or imply that You are, or that Your use of the Licensed Material is, connected with, or sponsored, endorsed, or granted official status by, the Licensor or others designated to receive attribution as provided in Section 3(a)(1)(A)(i).\n\nb. ___Other rights.___\n\n   1. Moral rights, such as the right of integrity, are not licensed under this Public License, nor are publicity, privacy, and/or other similar personality rights; however, to the extent possible, the Licensor waives and/or agrees not to assert any such rights held by the Licensor to the limited extent necessary to allow You to exercise the Licensed Rights, but not otherwise.\n\n   2. Patent and trademark rights are not licensed under this Public License.\n\n   3. To the extent possible, the Licensor waives any right to collect royalties from You for the exercise of the Licensed Rights, whether directly or through a collecting society under any voluntary or waivable statutory or compulsory licensing scheme. In all other cases the Licensor expressly reserves any right to collect such royalties, including when the Licensed Material is used other than for NonCommercial purposes.\n\n### Section 3 – License Conditions.\n\nYour exercise of the Licensed Rights is expressly made subject to the following conditions.\n\na. ___Attribution.___\n\n   1. If You Share the Licensed Material (including in modified form), You must:\n\n       A. retain the following if it is supplied by the Licensor with the Licensed Material:\n\n         i. identification of the creator(s) of the Licensed Material and any others designated to receive attribution, in any reasonable manner requested by the Licensor (including by pseudonym if designated);\n\n         ii. a copyright notice;\n\n         iii. a notice that refers to this Public License;\n\n         iv. a notice that refers to the disclaimer of warranties;\n\n         v. a URI or hyperlink to the Licensed Material to the extent reasonably practicable;\n\n       B. indicate if You modified the Licensed Material and retain an indication of any previous modifications; and\n\n       C. indicate the Licensed Material is licensed under this Public License, and include the text of, or the URI or hyperlink to, this Public License.\n\n   2. You may satisfy the conditions in Section 3(a)(1) in any reasonable manner based on the medium, means, and context in which You Share the Licensed Material. For example, it may be reasonable to satisfy the conditions by providing a URI or hyperlink to a resource that includes the required information.\n\n   3. If requested by the Licensor, You must remove any of the information required by Section 3(a)(1)(A) to the extent reasonably practicable.\n\n   4. If You Share Adapted Material You produce, the Adapter's License You apply must not prevent recipients of the Adapted Material from complying with this Public License.\n\n### Section 4 – Sui Generis Database Rights.\n\nWhere the Licensed Rights include Sui Generis Database Rights that apply to Your use of the Licensed Material:\n\na. for the avoidance of doubt, Section 2(a)(1) grants You the right to extract, reuse, reproduce, and Share all or a substantial portion of the contents of the database for NonCommercial purposes only;\n\nb. if You include all or a substantial portion of the database contents in a database in which You have Sui Generis Database Rights, then the database in which You have Sui Generis Database Rights (but not its individual contents) is Adapted Material; and\n\nc. You must comply with the conditions in Section 3(a) if You Share all or a substantial portion of the contents of the database.\n\nFor the avoidance of doubt, this Section 4 supplements and does not replace Your obligations under this Public License where the Licensed Rights include other Copyright and Similar Rights.\n\n### Section 5 – Disclaimer of Warranties and Limitation of Liability.\n\na. __Unless otherwise separately undertaken by the Licensor, to the extent possible, the Licensor offers the Licensed Material as-is and as-available, and makes no representations or warranties of any kind concerning the Licensed Material, whether express, implied, statutory, or other. This includes, without limitation, warranties of title, merchantability, fitness for a particular purpose, non-infringement, absence of latent or other defects, accuracy, or the presence or absence of errors, whether or not known or discoverable. Where disclaimers of warranties are not allowed in full or in part, this disclaimer may not apply to You.__\n\nb. __To the extent possible, in no event will the Licensor be liable to You on any legal theory (including, without limitation, negligence) or otherwise for any direct, special, indirect, incidental, consequential, punitive, exemplary, or other losses, costs, expenses, or damages arising out of this Public License or use of the Licensed Material, even if the Licensor has been advised of the possibility of such losses, costs, expenses, or damages. Where a limitation of liability is not allowed in full or in part, this limitation may not apply to You.__\n\nc. The disclaimer of warranties and limitation of liability provided above shall be interpreted in a manner that, to the extent possible, most closely approximates an absolute disclaimer and waiver of all liability.\n\n### Section 6 – Term and Termination.\n\na. This Public License applies for the term of the Copyright and Similar Rights licensed here. However, if You fail to comply with this Public License, then Your rights under this Public License terminate automatically.\n\nb. Where Your right to use the Licensed Material has terminated under Section 6(a), it reinstates:\n\n   1. automatically as of the date the violation is cured, provided it is cured within 30 days of Your discovery of the violation; or\n\n   2. upon express reinstatement by the Licensor.\n\n   For the avoidance of doubt, this Section 6(b) does not affect any right the Licensor may have to seek remedies for Your violations of this Public License.\n\nc. For the avoidance of doubt, the Licensor may also offer the Licensed Material under separate terms or conditions or stop distributing the Licensed Material at any time; however, doing so will not terminate this Public License.\n\nd. Sections 1, 5, 6, 7, and 8 survive termination of this Public License.\n\n### Section 7 – Other Terms and Conditions.\n\na. The Licensor shall not be bound by any additional or different terms or conditions communicated by You unless expressly agreed.\n\nb. Any arrangements, understandings, or agreements regarding the Licensed Material not stated herein are separate from and independent of the terms and conditions of this Public License.\n\n### Section 8 – Interpretation.\n\na. For the avoidance of doubt, this Public License does not, and shall not be interpreted to, reduce, limit, restrict, or impose conditions on any use of the Licensed Material that could lawfully be made without permission under this Public License.\n\nb. To the extent possible, if any provision of this Public License is deemed unenforceable, it shall be automatically reformed to the minimum extent necessary to make it enforceable. If the provision cannot be reformed, it shall be severed from this Public License without affecting the enforceability of the remaining terms and conditions.\n\nc. No term or condition of this Public License will be waived and no failure to comply consented to unless expressly agreed to by the Licensor.\n\nd. Nothing in this Public License constitutes or may be interpreted as a limitation upon, or waiver of, any privileges and immunities that apply to the Licensor or You, including from the legal processes of any jurisdiction or authority.\n\n> Creative Commons is not a party to its public licenses. Notwithstanding, Creative Commons may elect to apply one of its public licenses to material it publishes and in those instances will be considered the “Licensor.” Except for the limited purpose of indicating that material is shared under a Creative Commons public license or as otherwise permitted by the Creative Commons policies published at [creativecommons.org/policies](http://creativecommons.org/policies), Creative Commons does not authorize the use of the trademark “Creative Commons” or any other trademark or logo of Creative Commons without its prior written consent including, without limitation, in connection with any unauthorized modifications to any of its public licenses or any other arrangements, understandings, or agreements concerning use of licensed material. For the avoidance of doubt, this paragraph does not form part of the public licenses.\n>\n> Creative Commons may be contacted at creativecommons.org\n"
  },
  {
    "path": "README.md",
    "content": "![](https://fcc.asia/images/fcc-code.png)\n扫码加入 FCC-China 社群\n\n\n### FreeCodeCampChina's open source codebase and curriculum\n\n\nfreeCodeCamp is a friendly open source community where you learn to code and help nonprofits.\n\n**We help our campers build job-worthy portfolios of real apps used by real people, while helping nonprofits.**\n\nYou start by working through our self-paced, browser-based full stack JavaScript curriculum.\n\n### By working through our curriculum, you can earn four certifications:\n##### 1. Front End Certification\nThe first section will teach you the basics of how webpages work and also introduce you to JavaScript programming.\n\nSkills you'll practice include `HTML`, `CSS`, `JavaScript`, `jQuery` and `Bootstrap`.\n\nTo earn this certification, you'll build **10 front-end projects** and implement many **JavaScript algorithms**.\n\n##### 2. Data Visualization Certification\nThe second section builds upon the first and introduces you to more advanced topics such as `Sass`, `React` and `D3`.\n\nTo earn this certification, you'll build **5 React-apps** and **5 Data visualization apps** using `D3.js`.\n\n##### 3. Back End Certification\nThe third section introduces you to back end development using `Node.js`, `Express,` and `MongoDB`. It also teaches you about the important concept of source control using `Git`.\n\nTo earn this certification, you'll build **5 APIs** and **5 full stack apps**.\n\nWe will accept solutions implemented in _any_ programming language, as long as both a live demo and the source code are publicly accessible.\n\n##### 4. Full Stack Certification\nThe fourth section is where you'll get **real-world experience** by working on projects for **nonprofits**.\nWe'll pair you with another camper, an agile project manager, and a stakeholder from a nonprofit organization. Together, you'll plan, build and maintain apps that help that nonprofit carry out its mission more effectively.\n\nFor this certification, you'll work on **two projects from scratch** and then **maintain/upgrade two existing projects**.\n\n---\n\nThis code is running live at [freeCodeCamp.cn](https://freecodecamp.cn). We also have [Gitter chat rooms](https://gitter.im/FreeCodeCamp/chinese), a [Medium publication](https://medium.freecodecamp.org), an [interactive forum](https://forum.freecodecamp.org), a [wiki knowledgebase](https://forum.freecodecamp.org/c/wiki), and even a [YouTube channel](https://youtube.com/freecodecamp).\n\n### [Join our community here](https://freecodecamp.cn/signin).\n\nFound a bug?\n------------\n\nDo not file an issue until you have followed these steps:\n\n1. Read the [Help I've Found a Bug](https://forum.freecodecamp.org/t/how-to-report-a-bug/19543) article and follow its instructions.\n2. Ask for confirmation in the appropriate [Help Room](https://forum.freecodecamp.org/t/free-code-camp-official-chat-rooms/19390/2).\n3. Please *do not* open an issue without a 3rd party confirmation of your problem.\n\nContributing\n------------\n\nWe welcome pull requests from freeCodeCamp campers (our students) and seasoned JavaScript developers alike! Please follow [these steps](CONTRIBUTING.md) to contribute.\n\nLicense\n-------\n\nCopyright (c) 2017 freeCodeCamp.\n\nThe content of this repository bound by the following LICENSE(S)\n- The computer software is licensed under the [BSD-3-Clause](./LICENSE.md).\n- The curricular content as in the `./seed/challenges` or subdirectories and our wiki are licensed under the [CC-BY-SA-4.0](./LICENSE-freeCodeCamp-Curriculum.md)\n- The translation of this website follows the license of [CC-BY-NC-4.0](./LICENSE-freeCodeCamp-Translation.md)，Do not use (it) for commercial/business purpose. <a rel=\"license\" href=\"https://creativecommons.org/licenses/by-nc/4.0/deed.zh\"><img alt=\"知识共享许可协议\" style=\"border-width:0\" src=\"https://i.creativecommons.org/l/by-nc/4.0/80x15.png\" /></a>\n\n"
  },
  {
    "path": "bower.json",
    "content": "{\n  \"name\": \"freecodecamp\",\n  \"version\": \"0.0.0\",\n  \"homepage\": \"http://freecodecamp.cn\",\n  \"private\": true,\n  \"ignore\": [\n    \"**/.*\",\n    \"node_modules\",\n    \"bower_components\",\n    \"public/bower_components\",\n    \"test\",\n    \"tests\"\n  ],\n  \"dependencies\": {\n    \"d3\": \"~3.5.5\",\n    \"jquery\": \"~2.1.4\",\n    \"cal-heatmap\": \"~3.5.2\",\n    \"bootstrap\": \"~3.3.4\",\n    \"font-awesome\": \"~4.5.0\",\n    \"moment\": \"~2.10.2\",\n    \"moment-timezone\": \"~0.5.0\",\n    \"jshint\": \"~2.9.0\",\n    \"lightbox2\": \"~2.8.1\",\n    \"rxjs\": \"~4.0.6\",\n    \"CodeMirror\": \"~5.8.0\",\n    \"chai\": \"~3.4.1\",\n    \"clipboard\": \"~1.5.5\",\n    \"mousetrap\": \"~1.5.3\"\n  }\n}\n"
  },
  {
    "path": "client/README.md",
    "content": "This is the entry point for the client code.\nCode that should run only on the client should be put here.\n\nNOTE(berks): For react specific stuff this should be the entry point\n"
  },
  {
    "path": "client/commonFramework/add-loop-protect.js",
    "content": "window.common = (function(global) {\n  const {\n    loopProtect,\n    common = { init: [] }\n  } = global;\n\n  loopProtect.hit = function hit(line) {\n     var err = 'Error: Exiting potential infinite loop at line ' +\n     line +\n     '. To disable loop protection, write: \\n\\\\/\\\\/ noprotect\\nas the first' +\n     'line. Beware that if you do have an infinite loop in your code' +\n     'this will crash your browser.';\n    console.error(err);\n  };\n\n  common.addLoopProtect = function addLoopProtect(code = '') {\n    return loopProtect(code);\n  };\n\n  return common;\n})(window);\n"
  },
  {
    "path": "client/commonFramework/bindings.js",
    "content": "window.common = (function(global) {\n  const {\n    $,\n    Rx: { Observable },\n    common = { init: [] }\n  } = global;\n\n  common.ctrlEnterClickHandler = function ctrlEnterClickHandler(e) {\n    // ctrl + enter or cmd + enter\n    if (\n      e.keyCode === 13 &&\n      (e.metaKey || e.ctrlKey)\n    ) {\n      $('#complete-courseware-dialog').off('keydown', ctrlEnterClickHandler);\n      if ($('#submit-challenge').length > 0) {\n        $('#submit-challenge').click();\n      } else {\n        window.location = '/challenges/next-challenge?id=' + common.challengeId;\n      }\n    }\n  };\n\n  common.init.push(function($) {\n\n    var $marginFix = $('.innerMarginFix');\n    $marginFix.css('min-height', $marginFix.height());\n\n    common.submitBtn$ = Observable.fromEvent($('#submitButton'), 'click');\n\n    common.resetBtn$ = Observable.fromEvent($('#reset-button'), 'click');\n\n    // init modal keybindings on open\n    $('#complete-courseware-dialog').on('shown.bs.modal', function() {\n      $('#complete-courseware-dialog').keydown(common.ctrlEnterClickHandler);\n    });\n\n    // remove modal keybinds on close\n    $('#complete-courseware-dialog').on('hidden.bs.modal', function() {\n      $('#complete-courseware-dialog').off(\n        'keydown',\n        common.ctrlEnterClickHandler\n      );\n    });\n\n    // video checklist binding\n    $('.challenge-list-checkbox').on('change', function() {\n      var checkboxId = $(this).parent().parent().attr('id');\n      if ($(this).is(':checked')) {\n        $(this).parent().siblings().children().addClass('faded');\n        if (!localStorage || !localStorage[checkboxId]) {\n          localStorage[checkboxId] = true;\n        }\n      }\n\n      if (!$(this).is(':checked')) {\n        $(this).parent().siblings().children().removeClass('faded');\n        if (localStorage[checkboxId]) {\n          localStorage.removeItem(checkboxId);\n        }\n      }\n    });\n\n    $('.checklist-element').each(function() {\n      var checklistElementId = $(this).attr('id');\n      if (localStorage[checklistElementId]) {\n        $(this).children().children('li').addClass('faded');\n        $(this).children().children('input').trigger('click');\n      }\n    });\n\n\n    // video challenge submit\n    $('#next-courseware-button').on('click', function() {\n      $('#next-courseware-button').unbind('click');\n      if ($('.signup-btn-nav').length < 1) {\n        var data;\n        var solution = $('#public-url').val() || null;\n        var githubLink = $('#github-url').val() || null;\n        switch (common.challengeType) {\n          case common.challengeTypes.VIDEO:\n            data = {\n              id: common.challengeId,\n              name: common.challengeName,\n              challengeType: +common.challengeType\n            };\n            $.ajax({\n              url: '/completed-challenge/',\n              type: 'POST',\n              data: JSON.stringify(data),\n              contentType: 'application/json',\n              dataType: 'json'\n            })\n              .success(function(res) {\n                if (!res) {\n                  return;\n                }\n                window.location.href = '/challenges/next-challenge?id=' +\n                  common.challengeId;\n              })\n              .fail(function() {\n                window.location.replace(window.location.href);\n              });\n\n            break;\n          case common.challengeTypes.BASEJUMP:\n          case common.challengeTypes.ZIPLINE:\n            data = {\n              id: common.challengeId,\n              name: common.challengeName,\n              challengeType: +common.challengeType,\n              solution,\n              githubLink\n            };\n\n            $.ajax({\n              url: '/completed-zipline-or-basejump/',\n              type: 'POST',\n              data: JSON.stringify(data),\n              contentType: 'application/json',\n              dataType: 'json'\n            })\n              .success(function() {\n                window.location.href = '/challenges/next-challenge?id=' +\n                  common.challengeId;\n              })\n              .fail(function() {\n                window.location.replace(window.location.href);\n              });\n            break;\n\n          case common.challengeTypes.BONFIRE:\n            window.location.href = '/challenges/next-challenge?id=' +\n              common.challengeId;\n            break;\n\n          default:\n            console.log('Happy Coding!');\n            break;\n          }\n      }\n    });\n\n    if (common.challengeName) {\n      window.ga('send', 'event', 'Challenge', 'load', common.gaName);\n    }\n\n    $('#complete-courseware-dialog').on('hidden.bs.modal', function() {\n      if (common.editor.focus) {\n        common.editor.focus();\n      }\n    });\n\n    $('#trigger-issue-modal').on('click', function() {\n      $('#issue-modal').modal('show');\n    });\n\n    $('#trigger-help-modal').on('click', function() {\n      $('#help-modal').modal('show');\n    });\n\n    $('#trigger-reset-modal').on('click', function() {\n      $('#reset-modal').modal('show');\n    });\n\n    $('#trigger-pair-modal').on('click', function() {\n      $('#pair-modal').modal('show');\n    });\n\n    $('#completed-courseware').on('click', function() {\n      $('#complete-courseware-dialog').modal('show');\n    });\n\n    $('#help-ive-found-a-bug-wiki-article').on('click', function() {\n      window.open(\n        'https://github.com/freecodecampchina/freecodecamp.cn/wiki/' +\n          \"Help-I've-Found-a-Bug\",\n        '_blank'\n      );\n    });\n\n    $('#search-issue').on('click', function() {\n      var queryIssue = window.location.href\n        .toString()\n        .split('?')[0]\n        .replace(/(#*)$/, '');\n      window.open(\n        'https://github.com/freecodecampchina/freecodecamp.cn/issues?q=' +\n        'is:issue is:all ' +\n        (common.challengeName) +\n        ' OR ' +\n        queryIssue\n          .substr(queryIssue.lastIndexOf('challenges/') + 11)\n          .replace('/', ''), '_blank');\n    });\n\n  });\n\n  return common;\n}(window));\n"
  },
  {
    "path": "client/commonFramework/code-storage.js",
    "content": "// depends on: codeUri\nwindow.common = (function(global) {\n  const {\n    localStorage,\n    common = { init: [] }\n  } = global;\n\n  var challengePrefix = [\n    'Bonfire: ',\n    'Waypoint: ',\n    'Zipline: ',\n    'Basejump: ',\n    'Checkpoint: '],\n  item;\n\n  var codeStorage = {\n    getStoredValue(key) {\n      if (\n        !localStorage ||\n        typeof localStorage.getItem !== 'function' ||\n        !key ||\n        typeof key !== 'string'\n      ) {\n        console.log('unable to read from storage');\n        return '';\n      }\n      if (localStorage.getItem(key + 'Val')) {\n        return '' + localStorage.getItem(key + 'Val');\n      } else {\n        for (var i = 0; i <= challengePrefix.length; i++) {\n          item = localStorage.getItem(challengePrefix[i] + key + 'Val');\n          if (item) {\n            return '' + item;\n          }\n        }\n      }\n      return null;\n    },\n\n    isAlive: function(key) {\n      var val = this.getStoredValue(key);\n      return val !== 'null' &&\n        val !== 'undefined' &&\n        (val && val.length > 0);\n    },\n\n    updateStorage(key, code) {\n      if (\n        !localStorage ||\n        typeof localStorage.setItem !== 'function' ||\n        !key ||\n        typeof key !== 'string'\n      ) {\n        console.log('unable to save to storage');\n        return code;\n      }\n      localStorage.setItem(key + 'Val', code);\n      return code;\n    }\n  };\n\n  common.codeStorage = codeStorage;\n\n  return common;\n}(window, window.common));\n"
  },
  {
    "path": "client/commonFramework/code-uri.js",
    "content": "// store code in the URL\nwindow.common = (function(global) {\n  const {\n    encodeURIComponent: encode,\n    decodeURIComponent: decode,\n    location,\n    history,\n    common = { init: [] }\n  } = global;\n\n  const {\n    replaceScriptTags,\n    replaceSafeTags,\n    replaceFormActionAttr,\n    replaceFccfaaAttr\n  } = common;\n\n  const queryRegex = /^(\\?|#\\?)/;\n  function encodeFcc(val) {\n    return replaceScriptTags(replaceFormActionAttr(val));\n  }\n\n  function decodeFcc(val) {\n    return replaceSafeTags(replaceFccfaaAttr(val));\n  }\n\n  var codeUri = {\n    encode: function(code) {\n      return encode(code);\n    },\n    decode: function(code) {\n      try {\n        return decode(code);\n      } catch (ignore) {\n        return null;\n      }\n    },\n    isInQuery: function(query) {\n      var decoded = codeUri.decode(query);\n      if (!decoded || typeof decoded.split !== 'function') {\n        return false;\n      }\n      return decoded\n        .replace(queryRegex, '')\n        .split('&')\n        .reduce(function(found, param) {\n          var key = param.split('=')[0];\n          if (key === 'solution') {\n            return true;\n          }\n          return found;\n        }, false);\n    },\n    isAlive: function() {\n      return codeUri.enabled &&\n        codeUri.isInQuery(location.search) ||\n        codeUri.isInQuery(location.hash);\n    },\n    getKeyInQuery(query, keyToFind = '') {\n      return query\n        .split('&')\n        .reduce(function(oldValue, param) {\n          var key = param.split('=')[0];\n          var value = param\n            .split('=')\n            .slice(1)\n            .join('=');\n\n          if (key === keyToFind) {\n            return value;\n          }\n          return oldValue;\n        }, null);\n    },\n    getSolutionFromQuery(query = '') {\n      return decodeFcc(\n        codeUri.decode(codeUri.getKeyInQuery(query, 'solution'))\n      );\n    },\n    parse: function() {\n      if (!codeUri.enabled) {\n        return null;\n      }\n      var query;\n      if (location.search && codeUri.isInQuery(location.search)) {\n        query = location.search.replace(/^\\?/, '');\n\n        if (history && typeof history.replaceState === 'function') {\n          history.replaceState(\n            history.state,\n            null,\n            location.href.split('?')[0]\n          );\n          location.hash = '#?' + encodeFcc(query);\n        }\n      } else {\n        query = location.hash.replace(/^\\#\\?/, '');\n      }\n\n      if (!query) {\n        return null;\n      }\n\n      return this.getSolutionFromQuery(query);\n    },\n    querify: function(solution) {\n      if (!codeUri.enabled) {\n        return null;\n      }\n      if (history && typeof history.replaceState === 'function') {\n        // grab the url up to the query\n        // destroy any hash symbols still clinging to life\n        const url = (location.href.split('?')[0]).replace(/(#*)$/, '');\n        history.replaceState(\n          history.state,\n          null,\n          url +\n            '#?' +\n            (codeUri.shouldRun() ? '' : 'run=disabled&') +\n            'solution=' +\n            codeUri.encode(encodeFcc(solution))\n        );\n      } else {\n        location.hash = '?solution=' +\n          codeUri.encode(encodeFcc(solution));\n      }\n\n      return solution;\n    },\n    enabled: true,\n    shouldRun() {\n      return !this.getKeyInQuery(\n        (location.search || location.hash).replace(queryRegex, ''),\n        'run'\n      );\n    }\n  };\n\n  common.init.push(function() {\n    codeUri.parse();\n  });\n\n  common.codeUri = codeUri;\n  common.shouldRun = () => codeUri.shouldRun();\n\n  return common;\n}(window));\n"
  },
  {
    "path": "client/commonFramework/create-editor.js",
    "content": "window.common = (function(global) {\n  const {\n    Rx: { Subject, Observable },\n    CodeMirror,\n    emmetCodeMirror,\n    common = { init: [] }\n  } = global;\n\n  const { challengeType = '0', challengeTypes } = common;\n\n  if (\n    !CodeMirror ||\n    challengeType === challengeTypes.BASEJUMP ||\n    challengeType === challengeTypes.ZIPLINE ||\n    challengeType === challengeTypes.VIDEO ||\n    challengeType === challengeTypes.STEP ||\n    challengeType === challengeTypes.HIKES\n  ) {\n    common.editor = {};\n    return common;\n  }\n\n  var editor = CodeMirror.fromTextArea(\n    document.getElementById('codeEditor'),\n    {\n      lint: true,\n      lineNumbers: true,\n      mode: 'javascript',\n      theme: 'monokai',\n      runnable: true,\n      matchBrackets: true,\n      autoCloseBrackets: true,\n      scrollbarStyle: 'null',\n      lineWrapping: true,\n      gutters: ['CodeMirror-lint-markers']\n    }\n  );\n\n  editor.setSize('100%', 'auto');\n\n  common.editorExecute$ = new Subject();\n  common.editorKeyUp$ = Observable.fromEventPattern(\n    (handler) => editor.on('keyup', handler),\n    (handler) => editor.off('keyup', handler)\n  );\n\n  editor.setOption('extraKeys', {\n    Tab: function(cm) {\n      if (cm.somethingSelected()) {\n        cm.indentSelection('add');\n      } else {\n        var spaces = Array(cm.getOption('indentUnit') + 1).join(' ');\n        cm.replaceSelection(spaces);\n      }\n    },\n    'Shift-Tab': function(cm) {\n      if (cm.somethingSelected()) {\n        cm.indentSelection('subtract');\n      } else {\n        var spaces = Array(cm.getOption('indentUnit') + 1).join(' ');\n        cm.replaceSelection(spaces);\n      }\n    },\n    'Ctrl-Enter': function() {\n      common.editorExecute$.onNext();\n      return false;\n    },\n    'Cmd-Enter': function() {\n      common.editorExecute$.onNext();\n      return false;\n    }\n  });\n\n\n  var info = editor.getScrollInfo();\n\n  var after = editor.charCoords({\n    line: editor.getCursor().line + 1,\n    ch: 0\n  }, 'local').top;\n\n  if (info.top + info.clientHeight < after) {\n    editor.scrollTo(null, after - info.clientHeight + 3);\n  }\n\n  if (emmetCodeMirror) {\n    emmetCodeMirror(\n      editor,\n      {\n        'Cmd-E': 'emmet.expand_abbreviation',\n        Tab: 'emmet.expand_abbreviation_with_tab',\n        Enter: 'emmet.insert_formatted_line_break_only'\n      }\n    );\n  }\n  common.init.push(function() {\n    let editorValue;\n    if (common.codeUri.isAlive()) {\n      editorValue = common.codeUri.parse();\n    } else {\n      editorValue = common.codeStorage.isAlive(common.challengeName) ?\n        common.codeStorage.getStoredValue(common.challengeName) :\n        common.seed;\n    }\n\n    editor.setValue(common.replaceSafeTags(editorValue));\n    editor.refresh();\n  });\n\n  common.editor = editor;\n\n  return common;\n}(window));\n"
  },
  {
    "path": "client/commonFramework/detect-unsafe-code-stream.js",
    "content": "window.common = (function(global) {\n  const {\n    Rx: { Observable },\n    common = { init: [] }\n  } = global;\n\n  const detectFunctionCall = /function\\s*?\\(|function\\s+\\w+\\s*?\\(/gi;\n  const detectUnsafeJQ = /\\$\\s*?\\(\\s*?\\$\\s*?\\)/gi;\n  const detectUnsafeConsoleCall = /if\\s\\(null\\)\\sconsole\\.log\\(1\\);/gi;\n\n  common.detectUnsafeCode$ = function detectUnsafeCode$(code) {\n    const openingComments = code.match(/\\/\\*/gi);\n    const closingComments = code.match(/\\*\\//gi);\n\n    // checks if the number of opening comments(/*) matches the number of\n    // closing comments(*/)\n    if (\n      openingComments &&\n      (\n        !closingComments ||\n        openingComments.length > closingComments.length\n      )\n    ) {\n\n      return Observable.throw(\n        new Error('SyntaxError: Unfinished multi-line comment')\n      );\n    }\n\n    if (code.match(detectUnsafeJQ)) {\n      return Observable.throw(\n        new Error('Unsafe $($)')\n      );\n    }\n\n    if (\n      code.match(/function/g) &&\n      !code.match(detectFunctionCall)\n    ) {\n      return Observable.throw(\n        new Error('SyntaxError: Unsafe or unfinished function declaration')\n      );\n    }\n\n    if (code.match(detectUnsafeConsoleCall)) {\n      return Observable.throw(\n        new Error('Invalid if (null) console.log(1); detected')\n      );\n    }\n\n    return Observable.just(code);\n  };\n\n  return common;\n}(window));\n"
  },
  {
    "path": "client/commonFramework/display-test-results.js",
    "content": "window.common = (function({ $, common = { init: [] }}) {\n\n  common.displayTestResults = function displayTestResults(data = []) {\n    $('#testSuite').children().remove();\n    data.forEach(({ err = false, text = '' }) => {\n      var iconClass = err ?\n        '\"ion-close-circled big-error-icon\"' :\n        '\"ion-checkmark-circled big-success-icon\"';\n\n      $('<div></div>').html(`\n        <div class='row'>\n          <div class='col-xs-2 text-center'>\n            <i class=${iconClass}></i>\n          </div>\n          <div class='col-xs-10 test-output'>\n            ${text.split('message: ').pop().replace(/\\'\\);/g, '')}\n          </div>\n          <div class='ten-pixel-break'/>\n        </div>\n      `)\n        .appendTo($('#testSuite'));\n    });\n\n    return data;\n  };\n\n  return common;\n}(window));\n"
  },
  {
    "path": "client/commonFramework/end.js",
    "content": "$(document).ready(function() {\n  const common = window.common;\n  const { Observable } = window.Rx;\n  const {\n    addLoopProtect,\n    challengeName,\n    challengeType,\n    challengeTypes\n  } = common;\n\n  common.init.forEach(function(init) {\n    init($);\n  });\n\n  // only run if editor present\n  if (common.editor.getValue) {\n    const code$ = common.editorKeyUp$\n      .debounce(750)\n      .map(() => common.editor.getValue())\n      .distinctUntilChanged()\n      .shareReplay();\n\n    // update storage\n    code$.subscribe(\n        code => {\n          common.codeStorage.updateStorage(common.challengeName, code);\n          common.codeUri.querify(code);\n        },\n        err => console.error(err)\n      );\n\n    code$\n      // only run for HTML\n      .filter(() => common.challengeType === challengeTypes.HTML)\n      .flatMap(code => {\n        return common.detectUnsafeCode$(code)\n          .map(() => {\n            const combinedCode = common.head + code + common.tail;\n\n            return addLoopProtect(combinedCode);\n          })\n          .flatMap(code => common.updatePreview$(code))\n          .flatMap(() => common.checkPreview$({ code }))\n          .catch(err => Observable.just({ err }));\n      })\n      .subscribe(\n        ({ err }) => {\n          if (err) {\n            console.error(err);\n            return common.updatePreview$(`\n              <h1>${err}</h1>\n            `).subscribe(() => {});\n          }\n          return null;\n        },\n        err => console.error(err)\n      );\n  }\n\n  common.resetBtn$\n    .doOnNext(() => {\n      common.editor.setValue(common.replaceSafeTags(common.seed));\n    })\n    .flatMap(() => {\n      return common.executeChallenge$()\n        .catch(err => Observable.just({ err }));\n    })\n    .subscribe(\n      ({ err, output, originalCode }) => {\n        if (err) {\n          console.error(err);\n          return common.updateOutputDisplay('' + err);\n        }\n        common.codeStorage.updateStorage(challengeName, originalCode);\n        common.codeUri.querify(originalCode);\n        common.updateOutputDisplay(output);\n        return null;\n      },\n      (err) => {\n        if (err) {\n          console.error(err);\n        }\n        common.updateOutputDisplay('' + err);\n      }\n    );\n\n  Observable.merge(\n    common.editorExecute$,\n    common.submitBtn$\n  )\n    .flatMap(() => {\n      common.appendToOutputDisplay('\\n// testing challenge...');\n      return common.executeChallenge$()\n        .map(({ tests, ...rest }) => {\n          const solved = tests.every(test => !test.err);\n          return { ...rest, tests, solved };\n        })\n        .catch(err => Observable.just({ err }));\n    })\n    .subscribe(\n      ({ err, solved, output, tests }) => {\n        if (err) {\n          console.error(err);\n          if (common.challengeType === common.challengeTypes.HTML) {\n            return common.updatePreview$(`\n              <h1>${err}</h1>\n            `).first().subscribe(() => {});\n          }\n          return common.updateOutputDisplay('' + err);\n        }\n        common.updateOutputDisplay(output);\n        common.displayTestResults(tests);\n        if (solved) {\n          common.showCompletion();\n        }\n        return null;\n      },\n      ({ err }) => {\n        console.error(err);\n        common.updateOutputDisplay('' + err);\n      }\n    );\n\n  // initial challenge run to populate tests\n  if (challengeType === challengeTypes.HTML) {\n    var $preview = $('#preview');\n    return Observable.fromCallback($preview.ready, $preview)()\n      .delay(500)\n      .flatMap(() => common.executeChallenge$())\n      .catch(err => Observable.just({ err }))\n      .subscribe(\n        ({ err, tests }) => {\n          if (err) {\n            console.error(err);\n            if (common.challengeType === common.challengeTypes.HTML) {\n              return common.updatePreview$(`\n                <h1>${err}</h1>\n              `).subscribe(() => {});\n            }\n            return common.updateOutputDisplay('' + err);\n          }\n          common.displayTestResults(tests);\n          return null;\n        },\n        ({ err }) => {\n          console.error(err);\n        }\n      );\n  }\n\n  if (\n    challengeType === challengeTypes.BONFIRE ||\n    challengeType === challengeTypes.JS\n  ) {\n    return Observable.just({})\n      .delay(500)\n      .flatMap(() => common.executeChallenge$())\n      .catch(err => Observable.just({ err }))\n      .subscribe(\n        ({ err, originalCode, tests }) => {\n          if (err) {\n            console.error(err);\n            return common.updateOutputDisplay('' + err);\n          }\n          common.codeStorage.updateStorage(challengeName, originalCode);\n          common.displayTestResults(tests);\n          return null;\n        },\n        (err) => {\n          console.error(err);\n          common.updateOutputDisplay('' + err);\n        }\n      );\n  }\n  return null;\n});\n"
  },
  {
    "path": "client/commonFramework/execute-challenge-stream.js",
    "content": "window.common = (function(global) {\n  const {\n    ga,\n    common = { init: [] }\n  } = global;\n\n  const {\n    addLoopProtect,\n    getJsFromHtml,\n    detectUnsafeCode$,\n    updatePreview$,\n    challengeType,\n    challengeTypes\n  } = common;\n\n  common.executeChallenge$ = function executeChallenge$() {\n    const code = common.editor.getValue();\n    const originalCode = code;\n    const head = common.arrayToNewLineString(common.head);\n    const tail = common.arrayToNewLineString(common.tail);\n    const combinedCode = head + code + tail;\n\n    ga('send', 'event', 'Challenge', 'ran-code', common.gaName);\n\n    // run checks for unsafe code\n    return detectUnsafeCode$(code)\n      // add head and tail and detect loops\n      .map(() => {\n        if (challengeType !== challengeTypes.HTML) {\n          return `<script>;${addLoopProtect(combinedCode)}/**/</script>`;\n        }\n\n        return addLoopProtect(combinedCode);\n      })\n      .flatMap(code => updatePreview$(code))\n      .flatMap(code => {\n        let output;\n\n        if (\n          challengeType === challengeTypes.HTML &&\n          common.hasJs(code)\n        ) {\n          output = common.getJsOutput(getJsFromHtml(code));\n        } else if (challengeType !== challengeTypes.HTML) {\n          output = common.getJsOutput(addLoopProtect(combinedCode));\n        }\n\n        return common.runPreviewTests$({\n          tests: common.tests.slice(),\n          originalCode,\n          output\n        });\n      });\n  };\n\n  return common;\n}(window));\n"
  },
  {
    "path": "client/commonFramework/get-iframe.js",
    "content": "window.common = (function(global) {\n  const {\n    common = { init: [] },\n    document: doc\n  } = global;\n\n  common.getIframe = function getIframe(id = 'preview') {\n    let previewFrame = doc.getElementById(id);\n\n    // create and append a hidden preview frame\n    if (!previewFrame) {\n      previewFrame = doc.createElement('iframe');\n      previewFrame.id = id;\n      previewFrame.setAttribute('style', 'display: none');\n      doc.body.appendChild(previewFrame);\n    }\n\n    return previewFrame.contentDocument ||\n      previewFrame.contentWindow.document;\n  };\n\n  return common;\n})(window);\n"
  },
  {
    "path": "client/commonFramework/init.js",
    "content": "window.common = (function(global) {\n  // common namespace\n  // all classes should be stored here\n  // called at the beginning of dom ready\n  const {\n    Rx: { Disposable, Observable, config },\n    common = { init: [] }\n  } = global;\n\n  config.longStackSupport = true;\n  common.head = common.head || [];\n  common.tail = common.tail || [];\n  common.salt = Math.random();\n\n  common.challengeTypes = {\n    HTML: '0',\n    JS: '1',\n    VIDEO: '2',\n    ZIPLINE: '3',\n    BASEJUMP: '4',\n    BONFIRE: '5',\n    HIKES: '6',\n    STEP: '7'\n  };\n\n\n  common.arrayToNewLineString = function arrayToNewLineString(seedData) {\n    seedData = Array.isArray(seedData) ? seedData : [seedData];\n    return seedData.reduce(function(seed, line) {\n      return '' + seed + line + '\\n';\n    }, '');\n  };\n\n  common.seed = common.arrayToNewLineString(common.challengeSeed);\n\n  common.replaceScriptTags = function replaceScriptTags(value) {\n    return value\n      .replace(/<script>/gi, 'fccss')\n      .replace(/<\\/script>/gi, 'fcces');\n  };\n\n  common.replaceSafeTags = function replaceSafeTags(value) {\n    return value\n      .replace(/fccss/gi, '<script>')\n      .replace(/fcces/gi, '</script>');\n  };\n\n  common.replaceFormActionAttr = function replaceFormAction(value) {\n    return value.replace(/<form[^>]*>/, function(val) {\n      return val.replace(/action(\\s*?)=/, 'fccfaa$1=');\n    });\n  };\n\n  common.replaceFccfaaAttr = function replaceFccfaaAttr(value) {\n    return value.replace(/<form[^>]*>/, function(val) {\n      return val.replace(/fccfaa(\\s*?)=/, 'action$1=');\n    });\n  };\n\n  common.scopejQuery = function scopejQuery(str) {\n    return str\n      .replace(/\\$/gi, 'j$')\n      .replace(/document/gi, 'jdocument')\n      .replace(/jQuery/gi, 'jjQuery');\n  };\n\n  common.unScopeJQuery = function unScopeJQuery(str) {\n    return str\n      .replace(/j\\$/gi, '$')\n      .replace(/jdocument/gi, 'document')\n      .replace(/jjQuery/gi, 'jQuery');\n  };\n\n  const commentRegex = /(\\/\\*[^(\\*\\/)]*\\*\\/)|([ \\n]\\/\\/[^\\n]*)/g;\n  common.removeComments = function removeComments(str) {\n    return str.replace(commentRegex, '');\n  };\n\n  const logRegex = /(console\\.[\\w]+\\s*\\(.*\\;)/g;\n  common.removeLogs = function removeLogs(str) {\n    return str.replace(logRegex, '');\n  };\n\n  common.reassembleTest = function reassembleTest(code = '', { line, text }) {\n    var regexp = new RegExp('//' + line + common.salt);\n    return code.replace(regexp, text);\n  };\n\n  common.getScriptContent$ = function getScriptContent$(script) {\n    return Observable.create(function(observer) {\n      const jqXHR = $.get(script, null, null, 'text')\n        .success(data => {\n          observer.onNext(data);\n          observer.onCompleted();\n        })\n        .fail(e => observer.onError(e))\n        .always(() => observer.onCompleted());\n\n      return new Disposable(() => {\n        jqXHR.abort();\n      });\n    });\n  };\n\n  const openScript = /\\<\\s?script\\s?\\>/gi;\n  const closingScript = /\\<\\s?\\/\\s?script\\s?\\>/gi;\n\n  // detects if there is JavaScript in the first script tag\n  common.hasJs = function hasJs(code) {\n    return !!common.getJsFromHtml(code);\n  };\n\n  // grabs the content from the first script tag in the code\n  common.getJsFromHtml = function getJsFromHtml(code) {\n    // grab user javaScript\n    return (code.split(openScript)[1] || '').split(closingScript)[0] || '';\n  };\n\n  return common;\n})(window);\n"
  },
  {
    "path": "client/commonFramework/output-display.js",
    "content": "window.common = (function(global) {\n  const {\n    CodeMirror,\n    document: doc,\n    common = { init: [] }\n  } = global;\n\n  const { challengeTypes, challengeType = '0' } = common;\n\n  if (\n    !CodeMirror ||\n    challengeType !== challengeTypes.JS &&\n    challengeType !== challengeTypes.BONFIRE\n  ) {\n    common.updateOutputDisplay = () => {};\n    common.appendToOutputDisplay = () => {};\n    return common;\n  }\n\n  var codeOutput = CodeMirror.fromTextArea(\n    doc.getElementById('codeOutput'),\n    {\n      lineNumbers: false,\n      mode: 'text',\n      theme: 'monokai',\n      readOnly: 'nocursor',\n      lineWrapping: true\n    }\n  );\n\n  codeOutput.setValue(`/**\n  * Your output will go here.\n  * Any console.log() -type\n  * statements will appear in\n  * your browser\\'s DevTools\n  * JavaScript console.\n  */`);\n\n  codeOutput.setSize('100%', '100%');\n\n  common.updateOutputDisplay = function updateOutputDisplay(str = '') {\n    if (typeof str !== 'string') {\n      str = JSON.stringify(str);\n    }\n    codeOutput.setValue(str);\n    return str;\n  };\n\n  common.appendToOutputDisplay = function appendToOutputDisplay(str = '') {\n    codeOutput.setValue(codeOutput.getValue() + str);\n    return str;\n  };\n\n  return common;\n}(window));\n"
  },
  {
    "path": "client/commonFramework/phone-scroll-lock.js",
    "content": "window.common = (function({ common = { init: [] }}) {\n\n  common.lockTop = function lockTop() {\n    var magiVal;\n\n    if ($(window).width() >= 990) {\n      if ($('.editorScrollDiv').html()) {\n\n        magiVal = $(window).height() - $('.navbar').height();\n\n        if (magiVal < 0) {\n          magiVal = 0;\n        }\n        $('.editorScrollDiv').css('height', magiVal - 50 + 'px');\n      }\n\n      magiVal = $(window).height() - $('.navbar').height();\n\n      if (magiVal < 0) {\n        magiVal = 0;\n      }\n\n      $('.scroll-locker')\n        .css('min-height', $('.editorScrollDiv').height())\n        .css('height', magiVal - 50);\n    } else {\n      $('.editorScrollDiv').css('max-height', 500 + 'px');\n\n      $('.scroll-locker')\n        .css('position', 'inherit')\n        .css('top', 'inherit')\n        .css('width', '100%')\n        .css('max-height', '100%');\n    }\n  };\n\n  common.init.push(function($) {\n    // fakeiphone positioning hotfix\n    if (\n      $('.iphone-position').html() ||\n      $('.iphone').html()\n    ) {\n      var startIphonePosition = parseInt(\n        $('.iphone-position')\n          .css('top')\n          .replace('px', ''),\n        10\n      );\n\n      var startIphone = parseInt(\n        $('.iphone')\n          .css('top')\n          .replace('px', ''),\n        10\n      );\n\n      $(window).on('scroll', function() {\n        var courseHeight = $('.courseware-height').height();\n        var courseTop = $('.courseware-height').offset().top;\n        var windowScrollTop = $(window).scrollTop();\n        var phoneHeight = $('.iphone-position').height();\n\n        if (courseHeight + courseTop - windowScrollTop - phoneHeight <= 0) {\n          $('.iphone-position').css(\n            'top',\n            startIphonePosition +\n              courseHeight +\n              courseTop -\n              windowScrollTop -\n              phoneHeight\n          );\n\n          $('.iphone').css(\n            'top',\n            startIphonePosition +\n              courseHeight +\n              courseTop -\n              windowScrollTop -\n              phoneHeight +\n              120\n          );\n        } else {\n          $('.iphone-position').css('top', startIphonePosition);\n          $('.iphone').css('top', startIphone);\n        }\n      });\n    }\n\n    if ($('.scroll-locker').html()) {\n\n      if ($('.scroll-locker').html()) {\n        common.lockTop();\n        $(window).on('resize', function() {\n          common.lockTop();\n        });\n        $(window).on('scroll', function() {\n          common.lockTop();\n        });\n      }\n\n      var execInProgress = false;\n\n      // why is this not $???\n      document\n        .getElementById('scroll-locker')\n        .addEventListener(\n          'previewUpdateSpy',\n          function(e) {\n            if (execInProgress) {\n              return null;\n            }\n            execInProgress = true;\n            return setTimeout(function() {\n              if (\n                $($('.scroll-locker').children()[0]).height() - 800 > e.detail\n              ) {\n                $('.scroll-locker').scrollTop(e.detail);\n              } else {\n                var scrollTop = $($('.scroll-locker').children()[0]).height();\n\n                $('.scroll-locker').animate({ scrollTop: scrollTop }, 175);\n              }\n              execInProgress = false;\n            }, 750);\n          },\n          false\n        );\n    }\n  });\n\n  return common;\n}(window));\n"
  },
  {
    "path": "client/commonFramework/report-issue.js",
    "content": "window.common = (function({ common = { init: [] } }) {\n  common.init.push(function($) {\n    $('#report-issue').on('click', function() {\n      var textMessage = [\n        'Challenge [',\n        (common.challengeName || window.location.pathname),\n        '](',\n        window.location.href,\n        ') has an issue.\\n',\n        'User Agent is: <code>',\n        navigator.userAgent,\n        '</code>.\\n',\n        'Please describe how to reproduce this issue, and include ',\n        'links to screenshots if possible.\\n\\n'\n      ].join('');\n\n      if (\n        common.editor &&\n        typeof common.editor.getValue === 'function' &&\n        common.editor.getValue().trim()\n      ) {\n        var type;\n        switch (common.challengeType) {\n          case common.challengeTypes.HTML:\n            type = 'html';\n            break;\n          case common.challengeTypes.JS:\n          case common.challengeTypes.BONFIRE:\n            type = 'javascript';\n            break;\n          default:\n            type = '';\n        }\n\n        textMessage += [\n          'My code:\\n```',\n          type,\n          '\\n',\n          common.editor.getValue(),\n          '\\n```\\n\\n'\n        ].join('');\n      }\n\n      textMessage = encodeURIComponent(textMessage);\n\n      $('#issue-modal').modal('hide');\n      window.open(\n        'https://github.com/freecodecampchina/freecodecamp.cn/issues/new?&body=' +\n          textMessage,\n        '_blank'\n      );\n    });\n  });\n\n  return common;\n}(window));\n"
  },
  {
    "path": "client/commonFramework/run-tests-stream.js",
    "content": "window.common = (function(global) {\n  const {\n    Rx: { Observable },\n    chai,\n    common = { init: [] }\n  } = global;\n\n  common.runTests$ = function runTests$({\n    code,\n    originalCode,\n    userTests,\n    ...rest\n  }) {\n\n    return Observable.from(userTests)\n      .map(function(test) {\n\n        /* eslint-disable no-unused-vars */\n        const assert = chai.assert;\n        const editor = { getValue() { return originalCode; }};\n        /* eslint-enable no-unused-vars */\n\n        try {\n          if (test) {\n            /* eslint-disable no-eval  */\n            eval(common.reassembleTest(code, test));\n            /* eslint-enable no-eval */\n          }\n        } catch (e) {\n          test.err = e.message;\n        }\n\n        return test;\n      })\n      .toArray()\n      .map(tests => ({ ...rest, tests }));\n  };\n\n  return common;\n}(window));\n"
  },
  {
    "path": "client/commonFramework/show-completion.js",
    "content": "window.common = (function(global) {\n  const {\n    $,\n    moment,\n    ga = (() => {}),\n    common = { init: [] }\n  } = global;\n\n  function submitChallengeHandler(e) {\n    e.preventDefault();\n\n    var solution = common.editor.getValue();\n\n    $('#submit-challenge')\n      .attr('disabled', 'true')\n      .removeClass('btn-primary')\n      .addClass('btn-warning disabled');\n\n    var $checkmarkContainer = $('#checkmark-container');\n    $checkmarkContainer.css({ height: $checkmarkContainer.innerHeight() });\n\n    $('#challenge-checkmark')\n      .addClass('zoomOutUp')\n      // .removeClass('zoomInDown')\n      .delay(1000)\n      .queue(function(next) {\n        $(this).replaceWith(\n          '<div id=\"challenge-spinner\" ' +\n          'class=\"animated zoomInUp inner-circles-loader\">' +\n          'submitting...</div>'\n        );\n        next();\n      });\n\n    let timezone = 'UTC';\n    try {\n      timezone = moment.tz.guess();\n    } catch (err) {\n      err.message = `\n          known bug, see: https://github.com/moment/moment-timezone/issues/294:\n          ${err.message}\n        `;\n      console.error(err);\n    }\n    const data = JSON.stringify({\n      id: common.challengeId,\n      name: common.challengeName,\n      challengeType: +common.challengeType,\n      solution,\n      timezone\n    });\n\n    $.ajax({\n        url: '/completed-challenge/',\n        type: 'POST',\n        data,\n        contentType: 'application/json',\n        dataType: 'json'\n      })\n      .success(function(res) {\n        if (res) {\n          window.location =\n            '/challenges/next-challenge?id=' + common.challengeId;\n        }\n      })\n      .fail(function() {\n        window.location.replace(window.location.href);\n      });\n  }\n\n  common.showCompletion = function showCompletion() {\n\n    ga(\n      'send',\n      'event',\n      'Challenge',\n      'solved',\n      common.gaName,\n      true\n    );\n\n    $('#complete-courseware-dialog').modal('show');\n    $('#complete-courseware-dialog .modal-header').click();\n\n    $('#submit-challenge').off('click');\n    $('#submit-challenge').on('click', submitChallengeHandler);\n  };\n\n  return common;\n}(window));\n"
  },
  {
    "path": "client/commonFramework/step-challenge.js",
    "content": "window.common = (function({ $, common = { init: [] }}) {\n  const stepClass = '.challenge-step';\n  const prevBtnClass = '.challenge-step-btn-prev';\n  const nextBtnClass = '.challenge-step-btn-next';\n  const actionBtnClass = '.challenge-step-btn-action';\n  const finishBtnClass = '.challenge-step-btn-finish';\n  const submitBtnId = '#challenge-step-btn-submit';\n  const submitModalId = '#challenge-step-modal';\n\n  function getPreviousStep($challengeSteps) {\n    var $prevStep = false;\n    var prevStepIndex = 0;\n    $challengeSteps.each(function(index) {\n      var $step = $(this);\n      if (!$step.hasClass('hidden')) {\n        prevStepIndex = index - 1;\n      }\n    });\n\n    $prevStep = $challengeSteps[prevStepIndex];\n\n    return $prevStep;\n  }\n\n  function getNextStep($challengeSteps) {\n    var length = $challengeSteps.length;\n    var $nextStep = false;\n    var nextStepIndex = 0;\n    $challengeSteps.each(function(index) {\n      var $step = $(this);\n      if (\n        !$step.hasClass('hidden') &&\n        index + 1 !== length\n      ) {\n        nextStepIndex = index + 1;\n      }\n    });\n\n    $nextStep = $challengeSteps[nextStepIndex];\n\n    return $nextStep;\n  }\n\n  function handlePrevStepClick(e) {\n    e.preventDefault();\n    var prevStep = getPreviousStep($(stepClass));\n    $(this)\n    .parent()\n    .parent()\n    .removeClass('slideInLeft slideInRight')\n    .addClass('animated fadeOutRight fast-animation')\n    .delay(250)\n    .queue(function(prev) {\n      $(this).addClass('hidden');\n      if (prevStep) {\n        $(prevStep)\n        .removeClass('hidden')\n        .removeClass('fadeOutLeft fadeOutRight')\n        .addClass('animated slideInLeft fast-animation')\n        .delay(500)\n        .queue(function(prev) {\n          prev();\n        });\n      }\n      prev();\n    });\n  }\n\n  function handleNextStepClick(e) {\n    e.preventDefault();\n    var nextStep = getNextStep($(stepClass));\n    $(this)\n    .parent()\n    .parent()\n    .removeClass('slideInRight slideInLeft')\n    .addClass('animated fadeOutLeft fast-animation')\n    .delay(250)\n    .queue(function(next) {\n      $(this).addClass('hidden');\n      if (nextStep) {\n        $(nextStep)\n        .removeClass('hidden')\n        .removeClass('fadeOutRight fadeOutLeft')\n        .addClass('animated slideInRight fast-animation')\n        .delay(500)\n        .queue(function(next) {\n          next();\n        });\n      }\n      next();\n    });\n  }\n\n  function handleActionClick(e) {\n    var props = common.challengeSeed[0] || { stepIndex: [] };\n\n    var $el = $(this);\n    var index = +$el.attr('id');\n    var propIndex = props.stepIndex.indexOf(index);\n\n    if (propIndex === -1) {\n      return $el.parent()\n        .find('.disabled')\n        .removeClass('disabled');\n    }\n\n    // an API action\n    // prevent link from opening\n    e.preventDefault();\n    var prop = props.properties[propIndex];\n    var api = props.apis[propIndex];\n    if (common[prop]) {\n      return $el.parent()\n        .find('.disabled')\n        .removeClass('disabled');\n    }\n    return $.post(api)\n      .done(function(data) {\n        // assume a boolean indicates passing\n        if (typeof data === 'boolean') {\n          return $el.parent()\n            .find('.disabled')\n            .removeClass('disabled');\n        }\n        // assume api returns string when fails\n        return $el.parent()\n          .find('.disabled')\n          .replaceWith('<p>' + data + '</p>');\n      })\n      .fail(function() {\n        console.log('failed');\n      });\n  }\n\n  function handleFinishClick(e) {\n    e.preventDefault();\n    $(submitModalId).modal('show');\n    $(submitModalId + '.modal-header').click();\n    $(submitBtnId).click(handleSubmitClick);\n  }\n\n  function handleSubmitClick(e) {\n    e.preventDefault();\n\n    $('#submit-challenge')\n      .attr('disabled', 'true')\n      .removeClass('btn-primary')\n      .addClass('btn-warning disabled');\n\n    var $checkmarkContainer = $('#checkmark-container');\n    $checkmarkContainer.css({ height: $checkmarkContainer.innerHeight() });\n\n    $('#challenge-checkmark')\n      .addClass('zoomOutUp')\n      .delay(1000)\n      .queue(function(next) {\n        $(this).replaceWith(\n          '<div id=\"challenge-spinner\" ' +\n            'class=\"animated zoomInUp inner-circles-loader\">' +\n            'submitting...</div>'\n        );\n        next();\n      });\n\n    $.ajax({\n      url: '/completed-challenge/',\n      type: 'POST',\n      data: JSON.stringify({\n        id: common.challengeId,\n        name: common.challengeName,\n        challengeType: +common.challengeType\n      }),\n      contentType: 'application/json',\n      dataType: 'json'\n    })\n      .success(function(res) {\n        if (res) {\n          window.location =\n            '/challenges/next-challenge?id=' + common.challengeId;\n        }\n      })\n      .fail(function() {\n        window.location.replace(window.location.href);\n      });\n  }\n\n  common.init.push(function($) {\n    if (common.challengeType !== '7') {\n      return null;\n    }\n\n    $(prevBtnClass).click(handlePrevStepClick);\n    $(nextBtnClass).click(handleNextStepClick);\n    $(actionBtnClass).click(handleActionClick);\n    $(finishBtnClass).click(handleFinishClick);\n    return null;\n  });\n\n  return common;\n}(window));\n"
  },
  {
    "path": "client/commonFramework/update-preview.js",
    "content": "window.common = (function(global) {\n  const {\n    Rx: { BehaviorSubject, Observable },\n    common = { init: [] }\n  } = global;\n\n  // the first script tag here is to proxy jQuery\n  // We use the same jQuery on the main window but we change the\n  // context to that of the iframe.\n  var libraryIncludes = `\n<script>\n  window.loopProtect = parent.loopProtect;\n  window.__err = null;\n  window.loopProtect.hit = function(line) {\n    window.__err = new Error(\n      'Potential infinite loop at line ' +\n      line +\n      '. To disable loop protection, write:' +\n      ' \\\\n\\\\/\\\\/ noprotect\\\\nas the first' +\n      ' line. Beware that if you do have an infinite loop in your code' +\n      ' this will crash your browser.'\n    );\n  };\n</script>\n<link\n  rel='stylesheet'\n  href='//cdn.bootcss.com/animate.css/3.2.0/animate.min.css'\n  />\n<link\n  rel='stylesheet'\n  href='//cdn.bootcss.com/bootstrap/3.3.1/css/bootstrap.min.css'\n  />\n\n<link\n  rel='stylesheet'\n  href='//cdn.bootcss.com/font-awesome/4.2.0/css/font-awesome.min.css'\n  />\n<style>\n  body { padding: 0px 3px 0px 3px; }\n</style>\n  `;\n  const codeDisabledError = `\n    <script>\n      window.__err = new Error('code has been disabled');\n    </script>\n  `;\n\n  const iFrameScript$ =\n    common.getScriptContent$('/js/iFrameScripts.js').shareReplay();\n  const jQueryScript$ = common.getScriptContent$(\n    '/bower_components/jquery/dist/jquery.js'\n  ).shareReplay();\n\n  // behavior subject allways remembers the last value\n  // we use this to determine if runPreviewTest$ is defined\n  // and prime it with false\n  common.previewReady$ = new BehaviorSubject(false);\n\n  // These should be set up in the preview window\n  // if this error is seen it is because the function tried to run\n  // before the iframe has completely loaded\n  common.runPreviewTests$ =\n    common.checkPreview$ =\n    () => Observable.throw(new Error('Preview not fully loaded'));\n\n\n  common.updatePreview$ = function updatePreview$(code = '') {\n    const preview = common.getIframe('preview');\n\n    return Observable.combineLatest(\n      iFrameScript$,\n      jQueryScript$,\n      (iframe, jQuery) => ({\n        iframeScript: `<script>${iframe}</script>`,\n        jQuery: `<script>${jQuery}</script>`\n      })\n    )\n      .first()\n      .flatMap(({ iframeScript, jQuery }) => {\n        // we make sure to override the last value in the\n        // subject to false here.\n        common.previewReady$.onNext(false);\n        preview.open();\n        preview.write(\n          libraryIncludes +\n          jQuery +\n          (common.shouldRun() ? code : codeDisabledError) +\n          '<!-- -->' +\n          iframeScript\n        );\n        preview.close();\n        // now we filter false values and wait for the first true\n        return common.previewReady$\n          .filter(ready => ready)\n          .first()\n          // the delay here is to give code within the iframe\n          // control to run\n          .delay(400);\n      })\n      .map(() => code);\n  };\n\n  return common;\n}(window));\n"
  },
  {
    "path": "client/es6-shims.js",
    "content": "require('object.assign').shim();\nrequire('es6-map/implement');\n"
  },
  {
    "path": "client/iFrameScripts.js",
    "content": "/* eslint-disable no-undef, no-unused-vars, no-native-reassign */\n// the $ on the iframe window object is the same\n// as the one used on the main site, but\n// uses the iframe document as the context\nwindow.$(document).ready(function() {\n  var _ = parent._;\n  var Rx = parent.Rx;\n  var chai = parent.chai;\n  var assert = chai.assert;\n  var tests = parent.tests;\n  var common = parent.common;\n\n  common.getJsOutput = function evalJs(code = '') {\n    if (window.__err || !common.shouldRun()) {\n      return window.__err || 'code disabled';\n    }\n    let output;\n    try {\n      /* eslint-disable no-eval */\n      output = eval(code);\n      /* eslint-enable no-eval */\n    } catch (e) {\n      window.__err = e;\n    }\n    return output;\n  };\n\n  common.runPreviewTests$ =\n    function runPreviewTests$({\n    tests = [],\n    originalCode,\n    ...rest\n  }) {\n      const code = originalCode;\n      const editor = { getValue() { return originalCode; } };\n      if (window.__err) {\n        return Rx.Observable.throw(window.__err);\n      }\n\n      // Iterate throught the test one at a time\n      // on new stacks\n      return Rx.Observable.from(tests, null, null, Rx.Scheduler.default)\n        // add delay here for firefox to catch up\n        .delay(100)\n        .map(test => {\n          const userTest = {};\n          try {\n            /* eslint-disable no-eval */\n            eval(test);\n            /* eslint-enable no-eval */\n          } catch (e) {\n            userTest.err = e.message.split(':').shift();\n          } finally {\n            if (!test.match(/message: /g)) {\n              // assumes test does not contain arrays\n              // This is a patch until all test fall into this pattern\n              userTest.text = test\n                .split(',')\n                .pop();\n              userTest.text = 'message: ' + userTest.text + '\\');';\n            } else {\n              userTest.text = test;\n            }\n          }\n          return userTest;\n        })\n        // gather tests back into an array\n        .toArray()\n        .map(tests => ({ ...rest, tests, originalCode }));\n    };\n\n  // used when updating preview without running tests\n  common.checkPreview$ = function checkPreview$(args) {\n    if (window.__err) {\n      return Rx.Observable.throw(window.__err);\n    }\n    return Rx.Observable.just(args);\n  };\n\n  // now that the runPreviewTest$ is defined\n  // we set the subject to true\n  // this will let the updatePreview\n  // script now that we are ready.\n  common.previewReady$.onNext(true);\n});\n"
  },
  {
    "path": "client/index.js",
    "content": "import './es6-shims';\nimport Rx from 'rx';\nimport React from 'react';\nimport debug from 'debug';\nimport { Router } from 'react-router';\nimport { routeReducer as routing, syncHistory } from 'react-router-redux';\nimport { createHistory } from 'history';\n\nimport app$ from '../common/app';\nimport provideStore from '../common/app/provide-store';\n\n// client specific sagas\nimport sagas from './sagas';\n\n// render to observable\nimport render from '../common/app/utils/render';\n\nconst log = debug('fcc:client');\nconst DOMContainer = document.getElementById('fcc');\nconst initialState = window.__fcc__.data;\n\nconst serviceOptions = { xhrPath: '/services' };\n\nRx.config.longStackSupport = !!debug.enabled;\nconst history = createHistory();\nconst appLocation = history.createLocation(\n  location.pathname + location.search\n);\nconst routingMiddleware = syncHistory(history);\n\nconst devTools = window.devToolsExtension ? window.devToolsExtension() : f => f;\nconst shouldRouterListenForReplays = !!window.devToolsExtension;\n\nconst clientSagaOptions = { doc: document };\n\n// returns an observable\napp$({\n  location: appLocation,\n  history,\n  serviceOptions,\n  initialState,\n  middlewares: [\n    routingMiddleware,\n    ...sagas.map(saga => saga(clientSagaOptions))\n  ],\n  reducers: { routing },\n  enhancers: [ devTools ]\n})\n  .flatMap(({ props, store }) => {\n\n    // because of weirdness in react-routers match function\n    // we replace the wrapped returned in props with the first one\n    // we passed in. This might be fixed in react-router 2.0\n    props.history = history;\n\n    if (shouldRouterListenForReplays && store) {\n      log('routing middleware listening for replays');\n      routingMiddleware.listenForReplays(store);\n    }\n\n    log('rendering');\n    return render(\n      provideStore(React.createElement(Router, props), store),\n      DOMContainer\n    );\n  })\n  .subscribe(\n    () => debug('react rendered'),\n    err => { throw err; },\n    () => debug('react closed subscription')\n  );\n"
  },
  {
    "path": "client/less/challenge.less",
    "content": ".challenge-step-description {\n  font-size: 1.5em;\n}\n.challenge-step-counter {\n  font-size: 20px;\n  line-height: 44px;\n}\n\n.challenge-instructions-title {\n  margin-top: 0;\n  i {\n    margin-left: 5px;\n    line-height: 20px;\n  }\n}\n\n.challenge-instructions {\n  margin-bottom: 5px;\n  h4 {\n    margin-bottom: 0;\n  }\n  blockquote {\n    font-size: 90%;\n    font-family: @font-family-monospace;\n    color: @code-color;\n    background-color: #fffbe5;\n    border-radius: @border-radius-base;\n    border: 1px solid @pre-border-color;\n    white-space: pre;\n    padding: 5px 10px;\n    margin-bottom: 10px;\n    margin-top: -10px;\n    overflow: auto;\n  }\n  dfn {\n    font-family: @font-family-monospace;\n    color: @code-color;\n    background-color: @code-bg;\n    border-radius: @border-radius-base;\n  }\n  & a, #MDN-links a {\n    color: #31708f;\n  }\n  & a::after, #MDN-links a::after {\n    font-size: 70%;\n    font-family: FontAwesome;\n    content: \" \\f08e\";\n  }\n  ol {\n    font-size: 16px;\n  }\n}\n\n#testSuite {\n  margin-top: 10px;\n  > div >.row {\n    margin: 0!important;\n  }\n}\n\n.test-output {\n  font-size: 15px;\n  font-family: \"Ubuntu Mono\";\n  margin-top: 8px;\n  line-height:20px;\n}\n\n.grayed-out-test-output {\n  color: @gray-light;\n}\n\n.big-error-icon {\n  font-size: 30px;\n  color: @brand-danger;\n  top:50%;\n}\n\n.big-success-icon {\n  font-size: 30px;\n  color: @brand-primary;\n}\n\niframe.iphone {\n  border: none;\n  @media(min-width: 992px) {\n    width: 280px;\n    height: 500px;\n    position: absolute;\n    top: 70px;\n    right: 35px;\n    overflow-y: scroll;\n  }\n  @media(max-width: 991px) {\n    width: 100%;\n    border-radius: 5px;\n    overflow-y: visible;\n    height: 500px;\n  }\n  @media (min-width: 1200px) and (max-width: 1250px){\n    right: 22px;      \n  }\n}\n\n// To adjust right margin, negative values bring the image closer to the edge of the screen\n.iphone-position {\n  position: absolute;\n  top: -50px;\n  z-index: -1;\n  right: -195px;\n  @media (min-width: 1200px) and (max-width: 1250px){\n    right: -207px;      \n  }\n}\n"
  },
  {
    "path": "client/less/chat.less",
    "content": ".chat-embed-main-title {\n  display: flex;\n  flex-grow: 1;\n  padding-left: 31px;\n  padding-top: 7px;\n}\n\n.gitter-chat-embed {\n  z-index: 100;\n  position: fixed;\n\n  top: 0;\n  left: 60%;\n  bottom: 0;\n  right: 0;\n\n  display: flex;\n  flex-direction: row;\n  transition: transform 0.3s cubic-bezier(0.16, 0.22, 0.22, 1.7);\n}\n\n.gitter-chat-embed.is-collapsed:not(.is-loading) {\n  transform: translateX(110%);\n}\n"
  },
  {
    "path": "client/less/jobs.less",
    "content": ".jobs-list-highlight {\n  background-color: #ffc\n}\n\na.jobs-list-highlight:hover {\n  background-color: #ffc\n}\n\n.jobs-list {\n  cursor: pointer;\n  cursor: hand;\n}\n\n.jobs-checkbox-spacer input[type=\"checkbox\"] {\n  margin-left: -23px\n}\n"
  },
  {
    "path": "client/less/lib/animate.min.less",
    "content": "@charset \"UTF-8\";/*!\nAnimate.css - http://daneden.me/animate\nLicensed under the MIT license - http://opensource.org/licenses/MIT\n\nCopyright (c) 2014 Daniel Eden\n*/.animated{-webkit-animation-duration:1s;animation-duration:1s;-webkit-animation-fill-mode:both;animation-fill-mode:both}.animated.infinite{-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite}.animated.hinge{-webkit-animation-duration:2s;animation-duration:2s}@-webkit-keyframes bounce{0%,100%,20%,53%,80%{-webkit-transition-timing-function:cubic-bezier(0.215,.61,.355,1);transition-timing-function:cubic-bezier(0.215,.61,.355,1);-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}40%,43%{-webkit-transition-timing-function:cubic-bezier(0.755,.050,.855,.060);transition-timing-function:cubic-bezier(0.755,.050,.855,.060);-webkit-transform:translate3d(0,-30px,0);transform:translate3d(0,-30px,0)}70%{-webkit-transition-timing-function:cubic-bezier(0.755,.050,.855,.060);transition-timing-function:cubic-bezier(0.755,.050,.855,.060);-webkit-transform:translate3d(0,-15px,0);transform:translate3d(0,-15px,0)}90%{-webkit-transform:translate3d(0,-4px,0);transform:translate3d(0,-4px,0)}}@keyframes bounce{0%,100%,20%,53%,80%{-webkit-transition-timing-function:cubic-bezier(0.215,.61,.355,1);transition-timing-function:cubic-bezier(0.215,.61,.355,1);-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}40%,43%{-webkit-transition-timing-function:cubic-bezier(0.755,.050,.855,.060);transition-timing-function:cubic-bezier(0.755,.050,.855,.060);-webkit-transform:translate3d(0,-30px,0);transform:translate3d(0,-30px,0)}70%{-webkit-transition-timing-function:cubic-bezier(0.755,.050,.855,.060);transition-timing-function:cubic-bezier(0.755,.050,.855,.060);-webkit-transform:translate3d(0,-15px,0);transform:translate3d(0,-15px,0)}90%{-webkit-transform:translate3d(0,-4px,0);transform:translate3d(0,-4px,0)}}.bounce{-webkit-animation-name:bounce;animation-name:bounce;-webkit-transform-origin:center bottom;-ms-transform-origin:center bottom;transform-origin:center bottom}@-webkit-keyframes flash{0%,100%,50%{opacity:1}25%,75%{opacity:0}}@keyframes flash{0%,100%,50%{opacity:1}25%,75%{opacity:0}}.flash{-webkit-animation-name:flash;animation-name:flash}@-webkit-keyframes pulse{0%{-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}50%{-webkit-transform:scale3d(1.05,1.05,1.05);transform:scale3d(1.05,1.05,1.05)}100%{-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}}@keyframes pulse{0%{-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}50%{-webkit-transform:scale3d(1.05,1.05,1.05);transform:scale3d(1.05,1.05,1.05)}100%{-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}}.pulse{-webkit-animation-name:pulse;animation-name:pulse}@-webkit-keyframes rubberBand{0%{-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}30%{-webkit-transform:scale3d(1.25,.75,1);transform:scale3d(1.25,.75,1)}40%{-webkit-transform:scale3d(0.75,1.25,1);transform:scale3d(0.75,1.25,1)}50%{-webkit-transform:scale3d(1.15,.85,1);transform:scale3d(1.15,.85,1)}65%{-webkit-transform:scale3d(.95,1.05,1);transform:scale3d(.95,1.05,1)}75%{-webkit-transform:scale3d(1.05,.95,1);transform:scale3d(1.05,.95,1)}100%{-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}}@keyframes rubberBand{0%{-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}30%{-webkit-transform:scale3d(1.25,.75,1);transform:scale3d(1.25,.75,1)}40%{-webkit-transform:scale3d(0.75,1.25,1);transform:scale3d(0.75,1.25,1)}50%{-webkit-transform:scale3d(1.15,.85,1);transform:scale3d(1.15,.85,1)}65%{-webkit-transform:scale3d(.95,1.05,1);transform:scale3d(.95,1.05,1)}75%{-webkit-transform:scale3d(1.05,.95,1);transform:scale3d(1.05,.95,1)}100%{-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}}.rubberBand{-webkit-animation-name:rubberBand;animation-name:rubberBand}@-webkit-keyframes shake{0%,100%{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}10%,30%,50%,70%,90%{-webkit-transform:translate3d(-10px,0,0);transform:translate3d(-10px,0,0)}20%,40%,60%,80%{-webkit-transform:translate3d(10px,0,0);transform:translate3d(10px,0,0)}}@keyframes shake{0%,100%{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}10%,30%,50%,70%,90%{-webkit-transform:translate3d(-10px,0,0);transform:translate3d(-10px,0,0)}20%,40%,60%,80%{-webkit-transform:translate3d(10px,0,0);transform:translate3d(10px,0,0)}}.shake{-webkit-animation-name:shake;animation-name:shake}@-webkit-keyframes swing{20%{-webkit-transform:rotate3d(0,0,1,15deg);transform:rotate3d(0,0,1,15deg)}40%{-webkit-transform:rotate3d(0,0,1,-10deg);transform:rotate3d(0,0,1,-10deg)}60%{-webkit-transform:rotate3d(0,0,1,5deg);transform:rotate3d(0,0,1,5deg)}80%{-webkit-transform:rotate3d(0,0,1,-5deg);transform:rotate3d(0,0,1,-5deg)}100%{-webkit-transform:rotate3d(0,0,1,0deg);transform:rotate3d(0,0,1,0deg)}}@keyframes swing{20%{-webkit-transform:rotate3d(0,0,1,15deg);transform:rotate3d(0,0,1,15deg)}40%{-webkit-transform:rotate3d(0,0,1,-10deg);transform:rotate3d(0,0,1,-10deg)}60%{-webkit-transform:rotate3d(0,0,1,5deg);transform:rotate3d(0,0,1,5deg)}80%{-webkit-transform:rotate3d(0,0,1,-5deg);transform:rotate3d(0,0,1,-5deg)}100%{-webkit-transform:rotate3d(0,0,1,0deg);transform:rotate3d(0,0,1,0deg)}}.swing{-webkit-transform-origin:top center;-ms-transform-origin:top center;transform-origin:top center;-webkit-animation-name:swing;animation-name:swing}@-webkit-keyframes tada{0%{-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}10%,20%{-webkit-transform:scale3d(.9,.9,.9) rotate3d(0,0,1,-3deg);transform:scale3d(.9,.9,.9) rotate3d(0,0,1,-3deg)}30%,50%,70%,90%{-webkit-transform:scale3d(1.1,1.1,1.1) rotate3d(0,0,1,3deg);transform:scale3d(1.1,1.1,1.1) rotate3d(0,0,1,3deg)}40%,60%,80%{-webkit-transform:scale3d(1.1,1.1,1.1) rotate3d(0,0,1,-3deg);transform:scale3d(1.1,1.1,1.1) rotate3d(0,0,1,-3deg)}100%{-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}}@keyframes tada{0%{-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}10%,20%{-webkit-transform:scale3d(.9,.9,.9) rotate3d(0,0,1,-3deg);transform:scale3d(.9,.9,.9) rotate3d(0,0,1,-3deg)}30%,50%,70%,90%{-webkit-transform:scale3d(1.1,1.1,1.1) rotate3d(0,0,1,3deg);transform:scale3d(1.1,1.1,1.1) rotate3d(0,0,1,3deg)}40%,60%,80%{-webkit-transform:scale3d(1.1,1.1,1.1) rotate3d(0,0,1,-3deg);transform:scale3d(1.1,1.1,1.1) rotate3d(0,0,1,-3deg)}100%{-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}}.tada{-webkit-animation-name:tada;animation-name:tada}@-webkit-keyframes wobble{0%{-webkit-transform:none;transform:none}15%{-webkit-transform:translate3d(-25%,0,0) rotate3d(0,0,1,-5deg);transform:translate3d(-25%,0,0) rotate3d(0,0,1,-5deg)}30%{-webkit-transform:translate3d(20%,0,0) rotate3d(0,0,1,3deg);transform:translate3d(20%,0,0) rotate3d(0,0,1,3deg)}45%{-webkit-transform:translate3d(-15%,0,0) rotate3d(0,0,1,-3deg);transform:translate3d(-15%,0,0) rotate3d(0,0,1,-3deg)}60%{-webkit-transform:translate3d(10%,0,0) rotate3d(0,0,1,2deg);transform:translate3d(10%,0,0) rotate3d(0,0,1,2deg)}75%{-webkit-transform:translate3d(-5%,0,0) rotate3d(0,0,1,-1deg);transform:translate3d(-5%,0,0) rotate3d(0,0,1,-1deg)}100%{-webkit-transform:none;transform:none}}@keyframes wobble{0%{-webkit-transform:none;transform:none}15%{-webkit-transform:translate3d(-25%,0,0) rotate3d(0,0,1,-5deg);transform:translate3d(-25%,0,0) rotate3d(0,0,1,-5deg)}30%{-webkit-transform:translate3d(20%,0,0) rotate3d(0,0,1,3deg);transform:translate3d(20%,0,0) rotate3d(0,0,1,3deg)}45%{-webkit-transform:translate3d(-15%,0,0) rotate3d(0,0,1,-3deg);transform:translate3d(-15%,0,0) rotate3d(0,0,1,-3deg)}60%{-webkit-transform:translate3d(10%,0,0) rotate3d(0,0,1,2deg);transform:translate3d(10%,0,0) rotate3d(0,0,1,2deg)}75%{-webkit-transform:translate3d(-5%,0,0) rotate3d(0,0,1,-1deg);transform:translate3d(-5%,0,0) rotate3d(0,0,1,-1deg)}100%{-webkit-transform:none;transform:none}}.wobble{-webkit-animation-name:wobble;animation-name:wobble}@-webkit-keyframes bounceIn{0%,100%,20%,40%,60%,80%{-webkit-transition-timing-function:cubic-bezier(0.215,.61,.355,1);transition-timing-function:cubic-bezier(0.215,.61,.355,1)}0%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}20%{-webkit-transform:scale3d(1.1,1.1,1.1);transform:scale3d(1.1,1.1,1.1)}40%{-webkit-transform:scale3d(.9,.9,.9);transform:scale3d(.9,.9,.9)}60%{opacity:1;-webkit-transform:scale3d(1.03,1.03,1.03);transform:scale3d(1.03,1.03,1.03)}80%{-webkit-transform:scale3d(.97,.97,.97);transform:scale3d(.97,.97,.97)}100%{opacity:1;-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}}@keyframes bounceIn{0%,100%,20%,40%,60%,80%{-webkit-transition-timing-function:cubic-bezier(0.215,.61,.355,1);transition-timing-function:cubic-bezier(0.215,.61,.355,1)}0%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}20%{-webkit-transform:scale3d(1.1,1.1,1.1);transform:scale3d(1.1,1.1,1.1)}40%{-webkit-transform:scale3d(.9,.9,.9);transform:scale3d(.9,.9,.9)}60%{opacity:1;-webkit-transform:scale3d(1.03,1.03,1.03);transform:scale3d(1.03,1.03,1.03)}80%{-webkit-transform:scale3d(.97,.97,.97);transform:scale3d(.97,.97,.97)}100%{opacity:1;-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}}.bounceIn{-webkit-animation-name:bounceIn;animation-name:bounceIn;-webkit-animation-duration:.75s;animation-duration:.75s}@-webkit-keyframes bounceInDown{0%,100%,60%,75%,90%{-webkit-transition-timing-function:cubic-bezier(0.215,.61,.355,1);transition-timing-function:cubic-bezier(0.215,.61,.355,1)}0%{opacity:0;-webkit-transform:translate3d(0,-3000px,0);transform:translate3d(0,-3000px,0)}60%{opacity:1;-webkit-transform:translate3d(0,25px,0);transform:translate3d(0,25px,0)}75%{-webkit-transform:translate3d(0,-10px,0);transform:translate3d(0,-10px,0)}90%{-webkit-transform:translate3d(0,5px,0);transform:translate3d(0,5px,0)}100%{-webkit-transform:none;transform:none}}@keyframes bounceInDown{0%,100%,60%,75%,90%{-webkit-transition-timing-function:cubic-bezier(0.215,.61,.355,1);transition-timing-function:cubic-bezier(0.215,.61,.355,1)}0%{opacity:0;-webkit-transform:translate3d(0,-3000px,0);transform:translate3d(0,-3000px,0)}60%{opacity:1;-webkit-transform:translate3d(0,25px,0);transform:translate3d(0,25px,0)}75%{-webkit-transform:translate3d(0,-10px,0);transform:translate3d(0,-10px,0)}90%{-webkit-transform:translate3d(0,5px,0);transform:translate3d(0,5px,0)}100%{-webkit-transform:none;transform:none}}.bounceInDown{-webkit-animation-name:bounceInDown;animation-name:bounceInDown}@-webkit-keyframes bounceInLeft{0%,100%,60%,75%,90%{-webkit-transition-timing-function:cubic-bezier(0.215,.61,.355,1);transition-timing-function:cubic-bezier(0.215,.61,.355,1)}0%{opacity:0;-webkit-transform:translate3d(-3000px,0,0);transform:translate3d(-3000px,0,0)}60%{opacity:1;-webkit-transform:translate3d(25px,0,0);transform:translate3d(25px,0,0)}75%{-webkit-transform:translate3d(-10px,0,0);transform:translate3d(-10px,0,0)}90%{-webkit-transform:translate3d(5px,0,0);transform:translate3d(5px,0,0)}100%{-webkit-transform:none;transform:none}}@keyframes bounceInLeft{0%,100%,60%,75%,90%{-webkit-transition-timing-function:cubic-bezier(0.215,.61,.355,1);transition-timing-function:cubic-bezier(0.215,.61,.355,1)}0%{opacity:0;-webkit-transform:translate3d(-3000px,0,0);transform:translate3d(-3000px,0,0)}60%{opacity:1;-webkit-transform:translate3d(25px,0,0);transform:translate3d(25px,0,0)}75%{-webkit-transform:translate3d(-10px,0,0);transform:translate3d(-10px,0,0)}90%{-webkit-transform:translate3d(5px,0,0);transform:translate3d(5px,0,0)}100%{-webkit-transform:none;transform:none}}.bounceInLeft{-webkit-animation-name:bounceInLeft;animation-name:bounceInLeft}@-webkit-keyframes bounceInRight{0%,100%,60%,75%,90%{-webkit-transition-timing-function:cubic-bezier(0.215,.61,.355,1);transition-timing-function:cubic-bezier(0.215,.61,.355,1)}0%{opacity:0;-webkit-transform:translate3d(3000px,0,0);transform:translate3d(3000px,0,0)}60%{opacity:1;-webkit-transform:translate3d(-25px,0,0);transform:translate3d(-25px,0,0)}75%{-webkit-transform:translate3d(10px,0,0);transform:translate3d(10px,0,0)}90%{-webkit-transform:translate3d(-5px,0,0);transform:translate3d(-5px,0,0)}100%{-webkit-transform:none;transform:none}}@keyframes bounceInRight{0%,100%,60%,75%,90%{-webkit-transition-timing-function:cubic-bezier(0.215,.61,.355,1);transition-timing-function:cubic-bezier(0.215,.61,.355,1)}0%{opacity:0;-webkit-transform:translate3d(3000px,0,0);transform:translate3d(3000px,0,0)}60%{opacity:1;-webkit-transform:translate3d(-25px,0,0);transform:translate3d(-25px,0,0)}75%{-webkit-transform:translate3d(10px,0,0);transform:translate3d(10px,0,0)}90%{-webkit-transform:translate3d(-5px,0,0);transform:translate3d(-5px,0,0)}100%{-webkit-transform:none;transform:none}}.bounceInRight{-webkit-animation-name:bounceInRight;animation-name:bounceInRight}@-webkit-keyframes bounceInUp{0%,100%,60%,75%,90%{-webkit-transition-timing-function:cubic-bezier(0.215,.61,.355,1);transition-timing-function:cubic-bezier(0.215,.61,.355,1)}0%{opacity:0;-webkit-transform:translate3d(0,3000px,0);transform:translate3d(0,3000px,0)}60%{opacity:1;-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0)}75%{-webkit-transform:translate3d(0,10px,0);transform:translate3d(0,10px,0)}90%{-webkit-transform:translate3d(0,-5px,0);transform:translate3d(0,-5px,0)}100%{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}@keyframes bounceInUp{0%,100%,60%,75%,90%{-webkit-transition-timing-function:cubic-bezier(0.215,.61,.355,1);transition-timing-function:cubic-bezier(0.215,.61,.355,1)}0%{opacity:0;-webkit-transform:translate3d(0,3000px,0);transform:translate3d(0,3000px,0)}60%{opacity:1;-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0)}75%{-webkit-transform:translate3d(0,10px,0);transform:translate3d(0,10px,0)}90%{-webkit-transform:translate3d(0,-5px,0);transform:translate3d(0,-5px,0)}100%{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}.bounceInUp{-webkit-animation-name:bounceInUp;animation-name:bounceInUp}@-webkit-keyframes bounceOut{20%{-webkit-transform:scale3d(.9,.9,.9);transform:scale3d(.9,.9,.9)}50%,55%{opacity:1;-webkit-transform:scale3d(1.1,1.1,1.1);transform:scale3d(1.1,1.1,1.1)}100%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}}@keyframes bounceOut{20%{-webkit-transform:scale3d(.9,.9,.9);transform:scale3d(.9,.9,.9)}50%,55%{opacity:1;-webkit-transform:scale3d(1.1,1.1,1.1);transform:scale3d(1.1,1.1,1.1)}100%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}}.bounceOut{-webkit-animation-name:bounceOut;animation-name:bounceOut;-webkit-animation-duration:.75s;animation-duration:.75s}@-webkit-keyframes bounceOutDown{20%{-webkit-transform:translate3d(0,10px,0);transform:translate3d(0,10px,0)}40%,45%{opacity:1;-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0)}100%{opacity:0;-webkit-transform:translate3d(0,2000px,0);transform:translate3d(0,2000px,0)}}@keyframes bounceOutDown{20%{-webkit-transform:translate3d(0,10px,0);transform:translate3d(0,10px,0)}40%,45%{opacity:1;-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0)}100%{opacity:0;-webkit-transform:translate3d(0,2000px,0);transform:translate3d(0,2000px,0)}}.bounceOutDown{-webkit-animation-name:bounceOutDown;animation-name:bounceOutDown}@-webkit-keyframes bounceOutLeft{20%{opacity:1;-webkit-transform:translate3d(20px,0,0);transform:translate3d(20px,0,0)}100%{opacity:0;-webkit-transform:translate3d(-2000px,0,0);transform:translate3d(-2000px,0,0)}}@keyframes bounceOutLeft{20%{opacity:1;-webkit-transform:translate3d(20px,0,0);transform:translate3d(20px,0,0)}100%{opacity:0;-webkit-transform:translate3d(-2000px,0,0);transform:translate3d(-2000px,0,0)}}.bounceOutLeft{-webkit-animation-name:bounceOutLeft;animation-name:bounceOutLeft}@-webkit-keyframes bounceOutRight{20%{opacity:1;-webkit-transform:translate3d(-20px,0,0);transform:translate3d(-20px,0,0)}100%{opacity:0;-webkit-transform:translate3d(2000px,0,0);transform:translate3d(2000px,0,0)}}@keyframes bounceOutRight{20%{opacity:1;-webkit-transform:translate3d(-20px,0,0);transform:translate3d(-20px,0,0)}100%{opacity:0;-webkit-transform:translate3d(2000px,0,0);transform:translate3d(2000px,0,0)}}.bounceOutRight{-webkit-animation-name:bounceOutRight;animation-name:bounceOutRight}@-webkit-keyframes bounceOutUp{20%{-webkit-transform:translate3d(0,-10px,0);transform:translate3d(0,-10px,0)}40%,45%{opacity:1;-webkit-transform:translate3d(0,20px,0);transform:translate3d(0,20px,0)}100%{opacity:0;-webkit-transform:translate3d(0,-2000px,0);transform:translate3d(0,-2000px,0)}}@keyframes bounceOutUp{20%{-webkit-transform:translate3d(0,-10px,0);transform:translate3d(0,-10px,0)}40%,45%{opacity:1;-webkit-transform:translate3d(0,20px,0);transform:translate3d(0,20px,0)}100%{opacity:0;-webkit-transform:translate3d(0,-2000px,0);transform:translate3d(0,-2000px,0)}}.bounceOutUp{-webkit-animation-name:bounceOutUp;animation-name:bounceOutUp}@-webkit-keyframes fadeIn{0%{opacity:0}100%{opacity:1}}@keyframes fadeIn{0%{opacity:0}100%{opacity:1}}.fadeIn{-webkit-animation-name:fadeIn;animation-name:fadeIn}@-webkit-keyframes fadeInDown{0%{opacity:0;-webkit-transform:translate3d(0,-100%,0);transform:translate3d(0,-100%,0)}100%{opacity:1;-webkit-transform:none;transform:none}}@keyframes fadeInDown{0%{opacity:0;-webkit-transform:translate3d(0,-100%,0);transform:translate3d(0,-100%,0)}100%{opacity:1;-webkit-transform:none;transform:none}}.fadeInDown{-webkit-animation-name:fadeInDown;animation-name:fadeInDown}@-webkit-keyframes fadeInDownBig{0%{opacity:0;-webkit-transform:translate3d(0,-2000px,0);transform:translate3d(0,-2000px,0)}100%{opacity:1;-webkit-transform:none;transform:none}}@keyframes fadeInDownBig{0%{opacity:0;-webkit-transform:translate3d(0,-2000px,0);transform:translate3d(0,-2000px,0)}100%{opacity:1;-webkit-transform:none;transform:none}}.fadeInDownBig{-webkit-animation-name:fadeInDownBig;animation-name:fadeInDownBig}@-webkit-keyframes fadeInLeft{0%{opacity:0;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}100%{opacity:1;-webkit-transform:none;transform:none}}@keyframes fadeInLeft{0%{opacity:0;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}100%{opacity:1;-webkit-transform:none;transform:none}}.fadeInLeft{-webkit-animation-name:fadeInLeft;animation-name:fadeInLeft}@-webkit-keyframes fadeInLeftBig{0%{opacity:0;-webkit-transform:translate3d(-2000px,0,0);transform:translate3d(-2000px,0,0)}100%{opacity:1;-webkit-transform:none;transform:none}}@keyframes fadeInLeftBig{0%{opacity:0;-webkit-transform:translate3d(-2000px,0,0);transform:translate3d(-2000px,0,0)}100%{opacity:1;-webkit-transform:none;transform:none}}.fadeInLeftBig{-webkit-animation-name:fadeInLeftBig;animation-name:fadeInLeftBig}@-webkit-keyframes fadeInRight{0%{opacity:0;-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}100%{opacity:1;-webkit-transform:none;transform:none}}@keyframes fadeInRight{0%{opacity:0;-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}100%{opacity:1;-webkit-transform:none;transform:none}}.fadeInRight{-webkit-animation-name:fadeInRight;animation-name:fadeInRight}@-webkit-keyframes fadeInRightBig{0%{opacity:0;-webkit-transform:translate3d(2000px,0,0);transform:translate3d(2000px,0,0)}100%{opacity:1;-webkit-transform:none;transform:none}}@keyframes fadeInRightBig{0%{opacity:0;-webkit-transform:translate3d(2000px,0,0);transform:translate3d(2000px,0,0)}100%{opacity:1;-webkit-transform:none;transform:none}}.fadeInRightBig{-webkit-animation-name:fadeInRightBig;animation-name:fadeInRightBig}@-webkit-keyframes fadeInUp{0%{opacity:0;-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0)}100%{opacity:1;-webkit-transform:none;transform:none}}@keyframes fadeInUp{0%{opacity:0;-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0)}100%{opacity:1;-webkit-transform:none;transform:none}}.fadeInUp{-webkit-animation-name:fadeInUp;animation-name:fadeInUp}@-webkit-keyframes fadeInUpBig{0%{opacity:0;-webkit-transform:translate3d(0,2000px,0);transform:translate3d(0,2000px,0)}100%{opacity:1;-webkit-transform:none;transform:none}}@keyframes fadeInUpBig{0%{opacity:0;-webkit-transform:translate3d(0,2000px,0);transform:translate3d(0,2000px,0)}100%{opacity:1;-webkit-transform:none;transform:none}}.fadeInUpBig{-webkit-animation-name:fadeInUpBig;animation-name:fadeInUpBig}@-webkit-keyframes fadeOut{0%{opacity:1}100%{opacity:0}}@keyframes fadeOut{0%{opacity:1}100%{opacity:0}}.fadeOut{-webkit-animation-name:fadeOut;animation-name:fadeOut}@-webkit-keyframes fadeOutDown{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0)}}@keyframes fadeOutDown{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0)}}.fadeOutDown{-webkit-animation-name:fadeOutDown;animation-name:fadeOutDown}@-webkit-keyframes fadeOutDownBig{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(0,2000px,0);transform:translate3d(0,2000px,0)}}@keyframes fadeOutDownBig{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(0,2000px,0);transform:translate3d(0,2000px,0)}}.fadeOutDownBig{-webkit-animation-name:fadeOutDownBig;animation-name:fadeOutDownBig}@-webkit-keyframes fadeOutLeft{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}}@keyframes fadeOutLeft{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}}.fadeOutLeft{-webkit-animation-name:fadeOutLeft;animation-name:fadeOutLeft}@-webkit-keyframes fadeOutLeftBig{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(-2000px,0,0);transform:translate3d(-2000px,0,0)}}@keyframes fadeOutLeftBig{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(-2000px,0,0);transform:translate3d(-2000px,0,0)}}.fadeOutLeftBig{-webkit-animation-name:fadeOutLeftBig;animation-name:fadeOutLeftBig}@-webkit-keyframes fadeOutRight{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}}@keyframes fadeOutRight{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}}.fadeOutRight{-webkit-animation-name:fadeOutRight;animation-name:fadeOutRight}@-webkit-keyframes fadeOutRightBig{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(2000px,0,0);transform:translate3d(2000px,0,0)}}@keyframes fadeOutRightBig{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(2000px,0,0);transform:translate3d(2000px,0,0)}}.fadeOutRightBig{-webkit-animation-name:fadeOutRightBig;animation-name:fadeOutRightBig}@-webkit-keyframes fadeOutUp{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(0,-100%,0);transform:translate3d(0,-100%,0)}}@keyframes fadeOutUp{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(0,-100%,0);transform:translate3d(0,-100%,0)}}.fadeOutUp{-webkit-animation-name:fadeOutUp;animation-name:fadeOutUp}@-webkit-keyframes fadeOutUpBig{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(0,-2000px,0);transform:translate3d(0,-2000px,0)}}@keyframes fadeOutUpBig{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(0,-2000px,0);transform:translate3d(0,-2000px,0)}}.fadeOutUpBig{-webkit-animation-name:fadeOutUpBig;animation-name:fadeOutUpBig}@-webkit-keyframes flip{0%{-webkit-transform:perspective(400px) rotate3d(0,1,0,-360deg);transform:perspective(400px) rotate3d(0,1,0,-360deg);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}40%{-webkit-transform:perspective(400px) translate3d(0,0,150px) rotate3d(0,1,0,-190deg);transform:perspective(400px) translate3d(0,0,150px) rotate3d(0,1,0,-190deg);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}50%{-webkit-transform:perspective(400px) translate3d(0,0,150px) rotate3d(0,1,0,-170deg);transform:perspective(400px) translate3d(0,0,150px) rotate3d(0,1,0,-170deg);-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in}80%{-webkit-transform:perspective(400px) scale3d(.95,.95,.95);transform:perspective(400px) scale3d(.95,.95,.95);-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in}100%{-webkit-transform:perspective(400px);transform:perspective(400px);-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in}}@keyframes flip{0%{-webkit-transform:perspective(400px) rotate3d(0,1,0,-360deg);transform:perspective(400px) rotate3d(0,1,0,-360deg);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}40%{-webkit-transform:perspective(400px) translate3d(0,0,150px) rotate3d(0,1,0,-190deg);transform:perspective(400px) translate3d(0,0,150px) rotate3d(0,1,0,-190deg);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}50%{-webkit-transform:perspective(400px) translate3d(0,0,150px) rotate3d(0,1,0,-170deg);transform:perspective(400px) translate3d(0,0,150px) rotate3d(0,1,0,-170deg);-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in}80%{-webkit-transform:perspective(400px) scale3d(.95,.95,.95);transform:perspective(400px) scale3d(.95,.95,.95);-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in}100%{-webkit-transform:perspective(400px);transform:perspective(400px);-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in}}.animated.flip{-webkit-backface-visibility:visible;backface-visibility:visible;-webkit-animation-name:flip;animation-name:flip}@-webkit-keyframes flipInX{0%{-webkit-transform:perspective(400px) rotate3d(1,0,0,90deg);transform:perspective(400px) rotate3d(1,0,0,90deg);-webkit-transition-timing-function:ease-in;transition-timing-function:ease-in;opacity:0}40%{-webkit-transform:perspective(400px) rotate3d(1,0,0,-20deg);transform:perspective(400px) rotate3d(1,0,0,-20deg);-webkit-transition-timing-function:ease-in;transition-timing-function:ease-in}60%{-webkit-transform:perspective(400px) rotate3d(1,0,0,10deg);transform:perspective(400px) rotate3d(1,0,0,10deg);opacity:1}80%{-webkit-transform:perspective(400px) rotate3d(1,0,0,-5deg);transform:perspective(400px) rotate3d(1,0,0,-5deg)}100%{-webkit-transform:perspective(400px);transform:perspective(400px)}}@keyframes flipInX{0%{-webkit-transform:perspective(400px) rotate3d(1,0,0,90deg);transform:perspective(400px) rotate3d(1,0,0,90deg);-webkit-transition-timing-function:ease-in;transition-timing-function:ease-in;opacity:0}40%{-webkit-transform:perspective(400px) rotate3d(1,0,0,-20deg);transform:perspective(400px) rotate3d(1,0,0,-20deg);-webkit-transition-timing-function:ease-in;transition-timing-function:ease-in}60%{-webkit-transform:perspective(400px) rotate3d(1,0,0,10deg);transform:perspective(400px) rotate3d(1,0,0,10deg);opacity:1}80%{-webkit-transform:perspective(400px) rotate3d(1,0,0,-5deg);transform:perspective(400px) rotate3d(1,0,0,-5deg)}100%{-webkit-transform:perspective(400px);transform:perspective(400px)}}.flipInX{-webkit-backface-visibility:visible!important;backface-visibility:visible!important;-webkit-animation-name:flipInX;animation-name:flipInX}@-webkit-keyframes flipInY{0%{-webkit-transform:perspective(400px) rotate3d(0,1,0,90deg);transform:perspective(400px) rotate3d(0,1,0,90deg);-webkit-transition-timing-function:ease-in;transition-timing-function:ease-in;opacity:0}40%{-webkit-transform:perspective(400px) rotate3d(0,1,0,-20deg);transform:perspective(400px) rotate3d(0,1,0,-20deg);-webkit-transition-timing-function:ease-in;transition-timing-function:ease-in}60%{-webkit-transform:perspective(400px) rotate3d(0,1,0,10deg);transform:perspective(400px) rotate3d(0,1,0,10deg);opacity:1}80%{-webkit-transform:perspective(400px) rotate3d(0,1,0,-5deg);transform:perspective(400px) rotate3d(0,1,0,-5deg)}100%{-webkit-transform:perspective(400px);transform:perspective(400px)}}@keyframes flipInY{0%{-webkit-transform:perspective(400px) rotate3d(0,1,0,90deg);transform:perspective(400px) rotate3d(0,1,0,90deg);-webkit-transition-timing-function:ease-in;transition-timing-function:ease-in;opacity:0}40%{-webkit-transform:perspective(400px) rotate3d(0,1,0,-20deg);transform:perspective(400px) rotate3d(0,1,0,-20deg);-webkit-transition-timing-function:ease-in;transition-timing-function:ease-in}60%{-webkit-transform:perspective(400px) rotate3d(0,1,0,10deg);transform:perspective(400px) rotate3d(0,1,0,10deg);opacity:1}80%{-webkit-transform:perspective(400px) rotate3d(0,1,0,-5deg);transform:perspective(400px) rotate3d(0,1,0,-5deg)}100%{-webkit-transform:perspective(400px);transform:perspective(400px)}}.flipInY{-webkit-backface-visibility:visible!important;backface-visibility:visible!important;-webkit-animation-name:flipInY;animation-name:flipInY}@-webkit-keyframes flipOutX{0%{-webkit-transform:perspective(400px);transform:perspective(400px)}30%{-webkit-transform:perspective(400px) rotate3d(1,0,0,-20deg);transform:perspective(400px) rotate3d(1,0,0,-20deg);opacity:1}100%{-webkit-transform:perspective(400px) rotate3d(1,0,0,90deg);transform:perspective(400px) rotate3d(1,0,0,90deg);opacity:0}}@keyframes flipOutX{0%{-webkit-transform:perspective(400px);transform:perspective(400px)}30%{-webkit-transform:perspective(400px) rotate3d(1,0,0,-20deg);transform:perspective(400px) rotate3d(1,0,0,-20deg);opacity:1}100%{-webkit-transform:perspective(400px) rotate3d(1,0,0,90deg);transform:perspective(400px) rotate3d(1,0,0,90deg);opacity:0}}.flipOutX{-webkit-animation-name:flipOutX;animation-name:flipOutX;-webkit-animation-duration:.75s;animation-duration:.75s;-webkit-backface-visibility:visible!important;backface-visibility:visible!important}@-webkit-keyframes flipOutY{0%{-webkit-transform:perspective(400px);transform:perspective(400px)}30%{-webkit-transform:perspective(400px) rotate3d(0,1,0,-15deg);transform:perspective(400px) rotate3d(0,1,0,-15deg);opacity:1}100%{-webkit-transform:perspective(400px) rotate3d(0,1,0,90deg);transform:perspective(400px) rotate3d(0,1,0,90deg);opacity:0}}@keyframes flipOutY{0%{-webkit-transform:perspective(400px);transform:perspective(400px)}30%{-webkit-transform:perspective(400px) rotate3d(0,1,0,-15deg);transform:perspective(400px) rotate3d(0,1,0,-15deg);opacity:1}100%{-webkit-transform:perspective(400px) rotate3d(0,1,0,90deg);transform:perspective(400px) rotate3d(0,1,0,90deg);opacity:0}}.flipOutY{-webkit-backface-visibility:visible!important;backface-visibility:visible!important;-webkit-animation-name:flipOutY;animation-name:flipOutY;-webkit-animation-duration:.75s;animation-duration:.75s}@-webkit-keyframes lightSpeedIn{0%{-webkit-transform:translate3d(100%,0,0) skewX(-30deg);transform:translate3d(100%,0,0) skewX(-30deg);opacity:0}60%{-webkit-transform:skewX(20deg);transform:skewX(20deg);opacity:1}80%{-webkit-transform:skewX(-5deg);transform:skewX(-5deg);opacity:1}100%{-webkit-transform:none;transform:none;opacity:1}}@keyframes lightSpeedIn{0%{-webkit-transform:translate3d(100%,0,0) skewX(-30deg);transform:translate3d(100%,0,0) skewX(-30deg);opacity:0}60%{-webkit-transform:skewX(20deg);transform:skewX(20deg);opacity:1}80%{-webkit-transform:skewX(-5deg);transform:skewX(-5deg);opacity:1}100%{-webkit-transform:none;transform:none;opacity:1}}.lightSpeedIn{-webkit-animation-name:lightSpeedIn;animation-name:lightSpeedIn;-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}@-webkit-keyframes lightSpeedOut{0%{opacity:1}100%{-webkit-transform:translate3d(100%,0,0) skewX(30deg);transform:translate3d(100%,0,0) skewX(30deg);opacity:0}}@keyframes lightSpeedOut{0%{opacity:1}100%{-webkit-transform:translate3d(100%,0,0) skewX(30deg);transform:translate3d(100%,0,0) skewX(30deg);opacity:0}}.lightSpeedOut{-webkit-animation-name:lightSpeedOut;animation-name:lightSpeedOut;-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in}@-webkit-keyframes rotateIn{0%{-webkit-transform-origin:center;transform-origin:center;-webkit-transform:rotate3d(0,0,1,-200deg);transform:rotate3d(0,0,1,-200deg);opacity:0}100%{-webkit-transform-origin:center;transform-origin:center;-webkit-transform:none;transform:none;opacity:1}}@keyframes rotateIn{0%{-webkit-transform-origin:center;transform-origin:center;-webkit-transform:rotate3d(0,0,1,-200deg);transform:rotate3d(0,0,1,-200deg);opacity:0}100%{-webkit-transform-origin:center;transform-origin:center;-webkit-transform:none;transform:none;opacity:1}}.rotateIn{-webkit-animation-name:rotateIn;animation-name:rotateIn}@-webkit-keyframes rotateInDownLeft{0%{-webkit-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:rotate3d(0,0,1,-45deg);transform:rotate3d(0,0,1,-45deg);opacity:0}100%{-webkit-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:none;transform:none;opacity:1}}@keyframes rotateInDownLeft{0%{-webkit-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:rotate3d(0,0,1,-45deg);transform:rotate3d(0,0,1,-45deg);opacity:0}100%{-webkit-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:none;transform:none;opacity:1}}.rotateInDownLeft{-webkit-animation-name:rotateInDownLeft;animation-name:rotateInDownLeft}@-webkit-keyframes rotateInDownRight{0%{-webkit-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:rotate3d(0,0,1,45deg);transform:rotate3d(0,0,1,45deg);opacity:0}100%{-webkit-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:none;transform:none;opacity:1}}@keyframes rotateInDownRight{0%{-webkit-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:rotate3d(0,0,1,45deg);transform:rotate3d(0,0,1,45deg);opacity:0}100%{-webkit-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:none;transform:none;opacity:1}}.rotateInDownRight{-webkit-animation-name:rotateInDownRight;animation-name:rotateInDownRight}@-webkit-keyframes rotateInUpLeft{0%{-webkit-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:rotate3d(0,0,1,45deg);transform:rotate3d(0,0,1,45deg);opacity:0}100%{-webkit-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:none;transform:none;opacity:1}}@keyframes rotateInUpLeft{0%{-webkit-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:rotate3d(0,0,1,45deg);transform:rotate3d(0,0,1,45deg);opacity:0}100%{-webkit-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:none;transform:none;opacity:1}}.rotateInUpLeft{-webkit-animation-name:rotateInUpLeft;animation-name:rotateInUpLeft}@-webkit-keyframes rotateInUpRight{0%{-webkit-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:rotate3d(0,0,1,-90deg);transform:rotate3d(0,0,1,-90deg);opacity:0}100%{-webkit-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:none;transform:none;opacity:1}}@keyframes rotateInUpRight{0%{-webkit-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:rotate3d(0,0,1,-90deg);transform:rotate3d(0,0,1,-90deg);opacity:0}100%{-webkit-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:none;transform:none;opacity:1}}.rotateInUpRight{-webkit-animation-name:rotateInUpRight;animation-name:rotateInUpRight}@-webkit-keyframes rotateOut{0%{-webkit-transform-origin:center;transform-origin:center;opacity:1}100%{-webkit-transform-origin:center;transform-origin:center;-webkit-transform:rotate3d(0,0,1,200deg);transform:rotate3d(0,0,1,200deg);opacity:0}}@keyframes rotateOut{0%{-webkit-transform-origin:center;transform-origin:center;opacity:1}100%{-webkit-transform-origin:center;transform-origin:center;-webkit-transform:rotate3d(0,0,1,200deg);transform:rotate3d(0,0,1,200deg);opacity:0}}.rotateOut{-webkit-animation-name:rotateOut;animation-name:rotateOut}@-webkit-keyframes rotateOutDownLeft{0%{-webkit-transform-origin:left bottom;transform-origin:left bottom;opacity:1}100%{-webkit-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:rotate3d(0,0,1,45deg);transform:rotate3d(0,0,1,45deg);opacity:0}}@keyframes rotateOutDownLeft{0%{-webkit-transform-origin:left bottom;transform-origin:left bottom;opacity:1}100%{-webkit-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:rotate3d(0,0,1,45deg);transform:rotate3d(0,0,1,45deg);opacity:0}}.rotateOutDownLeft{-webkit-animation-name:rotateOutDownLeft;animation-name:rotateOutDownLeft}@-webkit-keyframes rotateOutDownRight{0%{-webkit-transform-origin:right bottom;transform-origin:right bottom;opacity:1}100%{-webkit-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:rotate3d(0,0,1,-45deg);transform:rotate3d(0,0,1,-45deg);opacity:0}}@keyframes rotateOutDownRight{0%{-webkit-transform-origin:right bottom;transform-origin:right bottom;opacity:1}100%{-webkit-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:rotate3d(0,0,1,-45deg);transform:rotate3d(0,0,1,-45deg);opacity:0}}.rotateOutDownRight{-webkit-animation-name:rotateOutDownRight;animation-name:rotateOutDownRight}@-webkit-keyframes rotateOutUpLeft{0%{-webkit-transform-origin:left bottom;transform-origin:left bottom;opacity:1}100%{-webkit-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:rotate3d(0,0,1,-45deg);transform:rotate3d(0,0,1,-45deg);opacity:0}}@keyframes rotateOutUpLeft{0%{-webkit-transform-origin:left bottom;transform-origin:left bottom;opacity:1}100%{-webkit-transform-origin:left bottom;transform-origin:left bottom;-webkit-transform:rotate3d(0,0,1,-45deg);transform:rotate3d(0,0,1,-45deg);opacity:0}}.rotateOutUpLeft{-webkit-animation-name:rotateOutUpLeft;animation-name:rotateOutUpLeft}@-webkit-keyframes rotateOutUpRight{0%{-webkit-transform-origin:right bottom;transform-origin:right bottom;opacity:1}100%{-webkit-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:rotate3d(0,0,1,90deg);transform:rotate3d(0,0,1,90deg);opacity:0}}@keyframes rotateOutUpRight{0%{-webkit-transform-origin:right bottom;transform-origin:right bottom;opacity:1}100%{-webkit-transform-origin:right bottom;transform-origin:right bottom;-webkit-transform:rotate3d(0,0,1,90deg);transform:rotate3d(0,0,1,90deg);opacity:0}}.rotateOutUpRight{-webkit-animation-name:rotateOutUpRight;animation-name:rotateOutUpRight}@-webkit-keyframes hinge{0%{-webkit-transform-origin:top left;transform-origin:top left;-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}20%,60%{-webkit-transform:rotate3d(0,0,1,80deg);transform:rotate3d(0,0,1,80deg);-webkit-transform-origin:top left;transform-origin:top left;-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}40%,80%{-webkit-transform:rotate3d(0,0,1,60deg);transform:rotate3d(0,0,1,60deg);-webkit-transform-origin:top left;transform-origin:top left;-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out;opacity:1}100%{-webkit-transform:translate3d(0,700px,0);transform:translate3d(0,700px,0);opacity:0}}@keyframes hinge{0%{-webkit-transform-origin:top left;transform-origin:top left;-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}20%,60%{-webkit-transform:rotate3d(0,0,1,80deg);transform:rotate3d(0,0,1,80deg);-webkit-transform-origin:top left;transform-origin:top left;-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}40%,80%{-webkit-transform:rotate3d(0,0,1,60deg);transform:rotate3d(0,0,1,60deg);-webkit-transform-origin:top left;transform-origin:top left;-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out;opacity:1}100%{-webkit-transform:translate3d(0,700px,0);transform:translate3d(0,700px,0);opacity:0}}.hinge{-webkit-animation-name:hinge;animation-name:hinge}@-webkit-keyframes rollIn{0%{opacity:0;-webkit-transform:translate3d(-100%,0,0) rotate3d(0,0,1,-120deg);transform:translate3d(-100%,0,0) rotate3d(0,0,1,-120deg)}100%{opacity:1;-webkit-transform:none;transform:none}}@keyframes rollIn{0%{opacity:0;-webkit-transform:translate3d(-100%,0,0) rotate3d(0,0,1,-120deg);transform:translate3d(-100%,0,0) rotate3d(0,0,1,-120deg)}100%{opacity:1;-webkit-transform:none;transform:none}}.rollIn{-webkit-animation-name:rollIn;animation-name:rollIn}@-webkit-keyframes rollOut{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(100%,0,0) rotate3d(0,0,1,120deg);transform:translate3d(100%,0,0) rotate3d(0,0,1,120deg)}}@keyframes rollOut{0%{opacity:1}100%{opacity:0;-webkit-transform:translate3d(100%,0,0) rotate3d(0,0,1,120deg);transform:translate3d(100%,0,0) rotate3d(0,0,1,120deg)}}.rollOut{-webkit-animation-name:rollOut;animation-name:rollOut}@-webkit-keyframes zoomIn{0%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}50%{opacity:1}}@keyframes zoomIn{0%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}50%{opacity:1}}.zoomIn{-webkit-animation-name:zoomIn;animation-name:zoomIn}@-webkit-keyframes zoomInDown{0%{opacity:0;-webkit-transform:scale3d(.1,.1,.1) translate3d(0,-1000px,0);transform:scale3d(.1,.1,.1) translate3d(0,-1000px,0);-webkit-animation-timing-function:cubic-bezier(0.55,.055,.675,.19);animation-timing-function:cubic-bezier(0.55,.055,.675,.19)}60%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(0,60px,0);transform:scale3d(.475,.475,.475) translate3d(0,60px,0);-webkit-animation-timing-function:cubic-bezier(0.175,.885,.32,1);animation-timing-function:cubic-bezier(0.175,.885,.32,1)}}@keyframes zoomInDown{0%{opacity:0;-webkit-transform:scale3d(.1,.1,.1) translate3d(0,-1000px,0);transform:scale3d(.1,.1,.1) translate3d(0,-1000px,0);-webkit-animation-timing-function:cubic-bezier(0.55,.055,.675,.19);animation-timing-function:cubic-bezier(0.55,.055,.675,.19)}60%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(0,60px,0);transform:scale3d(.475,.475,.475) translate3d(0,60px,0);-webkit-animation-timing-function:cubic-bezier(0.175,.885,.32,1);animation-timing-function:cubic-bezier(0.175,.885,.32,1)}}.zoomInDown{-webkit-animation-name:zoomInDown;animation-name:zoomInDown}@-webkit-keyframes zoomInLeft{0%{opacity:0;-webkit-transform:scale3d(.1,.1,.1) translate3d(-1000px,0,0);transform:scale3d(.1,.1,.1) translate3d(-1000px,0,0);-webkit-animation-timing-function:cubic-bezier(0.55,.055,.675,.19);animation-timing-function:cubic-bezier(0.55,.055,.675,.19)}60%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(10px,0,0);transform:scale3d(.475,.475,.475) translate3d(10px,0,0);-webkit-animation-timing-function:cubic-bezier(0.175,.885,.32,1);animation-timing-function:cubic-bezier(0.175,.885,.32,1)}}@keyframes zoomInLeft{0%{opacity:0;-webkit-transform:scale3d(.1,.1,.1) translate3d(-1000px,0,0);transform:scale3d(.1,.1,.1) translate3d(-1000px,0,0);-webkit-animation-timing-function:cubic-bezier(0.55,.055,.675,.19);animation-timing-function:cubic-bezier(0.55,.055,.675,.19)}60%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(10px,0,0);transform:scale3d(.475,.475,.475) translate3d(10px,0,0);-webkit-animation-timing-function:cubic-bezier(0.175,.885,.32,1);animation-timing-function:cubic-bezier(0.175,.885,.32,1)}}.zoomInLeft{-webkit-animation-name:zoomInLeft;animation-name:zoomInLeft}@-webkit-keyframes zoomInRight{0%{opacity:0;-webkit-transform:scale3d(.1,.1,.1) translate3d(1000px,0,0);transform:scale3d(.1,.1,.1) translate3d(1000px,0,0);-webkit-animation-timing-function:cubic-bezier(0.55,.055,.675,.19);animation-timing-function:cubic-bezier(0.55,.055,.675,.19)}60%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(-10px,0,0);transform:scale3d(.475,.475,.475) translate3d(-10px,0,0);-webkit-animation-timing-function:cubic-bezier(0.175,.885,.32,1);animation-timing-function:cubic-bezier(0.175,.885,.32,1)}}@keyframes zoomInRight{0%{opacity:0;-webkit-transform:scale3d(.1,.1,.1) translate3d(1000px,0,0);transform:scale3d(.1,.1,.1) translate3d(1000px,0,0);-webkit-animation-timing-function:cubic-bezier(0.55,.055,.675,.19);animation-timing-function:cubic-bezier(0.55,.055,.675,.19)}60%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(-10px,0,0);transform:scale3d(.475,.475,.475) translate3d(-10px,0,0);-webkit-animation-timing-function:cubic-bezier(0.175,.885,.32,1);animation-timing-function:cubic-bezier(0.175,.885,.32,1)}}.zoomInRight{-webkit-animation-name:zoomInRight;animation-name:zoomInRight}@-webkit-keyframes zoomInUp{0%{opacity:0;-webkit-transform:scale3d(.1,.1,.1) translate3d(0,1000px,0);transform:scale3d(.1,.1,.1) translate3d(0,1000px,0);-webkit-animation-timing-function:cubic-bezier(0.55,.055,.675,.19);animation-timing-function:cubic-bezier(0.55,.055,.675,.19)}60%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(0,-60px,0);transform:scale3d(.475,.475,.475) translate3d(0,-60px,0);-webkit-animation-timing-function:cubic-bezier(0.175,.885,.32,1);animation-timing-function:cubic-bezier(0.175,.885,.32,1)}}@keyframes zoomInUp{0%{opacity:0;-webkit-transform:scale3d(.1,.1,.1) translate3d(0,1000px,0);transform:scale3d(.1,.1,.1) translate3d(0,1000px,0);-webkit-animation-timing-function:cubic-bezier(0.55,.055,.675,.19);animation-timing-function:cubic-bezier(0.55,.055,.675,.19)}60%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(0,-60px,0);transform:scale3d(.475,.475,.475) translate3d(0,-60px,0);-webkit-animation-timing-function:cubic-bezier(0.175,.885,.32,1);animation-timing-function:cubic-bezier(0.175,.885,.32,1)}}.zoomInUp{-webkit-animation-name:zoomInUp;animation-name:zoomInUp}@-webkit-keyframes zoomOut{0%{opacity:1}50%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}100%{opacity:0}}@keyframes zoomOut{0%{opacity:1}50%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}100%{opacity:0}}.zoomOut{-webkit-animation-name:zoomOut;animation-name:zoomOut}@-webkit-keyframes zoomOutDown{40%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(0,-60px,0);transform:scale3d(.475,.475,.475) translate3d(0,-60px,0);-webkit-animation-timing-function:cubic-bezier(0.55,.055,.675,.19);animation-timing-function:cubic-bezier(0.55,.055,.675,.19)}100%{opacity:0;-webkit-transform:scale3d(.1,.1,.1) translate3d(0,2000px,0);transform:scale3d(.1,.1,.1) translate3d(0,2000px,0);-webkit-transform-origin:center bottom;transform-origin:center bottom;-webkit-animation-timing-function:cubic-bezier(0.175,.885,.32,1);animation-timing-function:cubic-bezier(0.175,.885,.32,1)}}@keyframes zoomOutDown{40%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(0,-60px,0);transform:scale3d(.475,.475,.475) translate3d(0,-60px,0);-webkit-animation-timing-function:cubic-bezier(0.55,.055,.675,.19);animation-timing-function:cubic-bezier(0.55,.055,.675,.19)}100%{opacity:0;-webkit-transform:scale3d(.1,.1,.1) translate3d(0,2000px,0);transform:scale3d(.1,.1,.1) translate3d(0,2000px,0);-webkit-transform-origin:center bottom;transform-origin:center bottom;-webkit-animation-timing-function:cubic-bezier(0.175,.885,.32,1);animation-timing-function:cubic-bezier(0.175,.885,.32,1)}}.zoomOutDown{-webkit-animation-name:zoomOutDown;animation-name:zoomOutDown}@-webkit-keyframes zoomOutLeft{40%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(42px,0,0);transform:scale3d(.475,.475,.475) translate3d(42px,0,0)}100%{opacity:0;-webkit-transform:scale(.1) translate3d(-2000px,0,0);transform:scale(.1) translate3d(-2000px,0,0);-webkit-transform-origin:left center;transform-origin:left center}}@keyframes zoomOutLeft{40%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(42px,0,0);transform:scale3d(.475,.475,.475) translate3d(42px,0,0)}100%{opacity:0;-webkit-transform:scale(.1) translate3d(-2000px,0,0);transform:scale(.1) translate3d(-2000px,0,0);-webkit-transform-origin:left center;transform-origin:left center}}.zoomOutLeft{-webkit-animation-name:zoomOutLeft;animation-name:zoomOutLeft}@-webkit-keyframes zoomOutRight{40%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(-42px,0,0);transform:scale3d(.475,.475,.475) translate3d(-42px,0,0)}100%{opacity:0;-webkit-transform:scale(.1) translate3d(2000px,0,0);transform:scale(.1) translate3d(2000px,0,0);-webkit-transform-origin:right center;transform-origin:right center}}@keyframes zoomOutRight{40%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(-42px,0,0);transform:scale3d(.475,.475,.475) translate3d(-42px,0,0)}100%{opacity:0;-webkit-transform:scale(.1) translate3d(2000px,0,0);transform:scale(.1) translate3d(2000px,0,0);-webkit-transform-origin:right center;transform-origin:right center}}.zoomOutRight{-webkit-animation-name:zoomOutRight;animation-name:zoomOutRight}@-webkit-keyframes zoomOutUp{40%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(0,60px,0);transform:scale3d(.475,.475,.475) translate3d(0,60px,0);-webkit-animation-timing-function:cubic-bezier(0.55,.055,.675,.19);animation-timing-function:cubic-bezier(0.55,.055,.675,.19)}100%{opacity:0;-webkit-transform:scale3d(.1,.1,.1) translate3d(0,-2000px,0);transform:scale3d(.1,.1,.1) translate3d(0,-2000px,0);-webkit-transform-origin:center bottom;transform-origin:center bottom;-webkit-animation-timing-function:cubic-bezier(0.175,.885,.32,1);animation-timing-function:cubic-bezier(0.175,.885,.32,1)}}@keyframes zoomOutUp{40%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(0,60px,0);transform:scale3d(.475,.475,.475) translate3d(0,60px,0);-webkit-animation-timing-function:cubic-bezier(0.55,.055,.675,.19);animation-timing-function:cubic-bezier(0.55,.055,.675,.19)}100%{opacity:0;-webkit-transform:scale3d(.1,.1,.1) translate3d(0,-2000px,0);transform:scale3d(.1,.1,.1) translate3d(0,-2000px,0);-webkit-transform-origin:center bottom;transform-origin:center bottom;-webkit-animation-timing-function:cubic-bezier(0.175,.885,.32,1);animation-timing-function:cubic-bezier(0.175,.885,.32,1)}}.zoomOutUp{-webkit-animation-name:zoomOutUp;animation-name:zoomOutUp}@-webkit-keyframes slideInDown{0%{-webkit-transform:translateY(-100%);transform:translateY(-100%);visibility:visible}100%{-webkit-transform:translateY(0);transform:translateY(0)}}@keyframes slideInDown{0%{-webkit-transform:translateY(-100%);transform:translateY(-100%);visibility:visible}100%{-webkit-transform:translateY(0);transform:translateY(0)}}.slideInDown{-webkit-animation-name:slideInDown;animation-name:slideInDown}@-webkit-keyframes slideInLeft{0%{-webkit-transform:translateX(-100%);transform:translateX(-100%);visibility:visible}100%{-webkit-transform:translateX(0);transform:translateX(0)}}@keyframes slideInLeft{0%{-webkit-transform:translateX(-100%);transform:translateX(-100%);visibility:visible}100%{-webkit-transform:translateX(0);transform:translateX(0)}}.slideInLeft{-webkit-animation-name:slideInLeft;animation-name:slideInLeft}@-webkit-keyframes slideInRight{0%{-webkit-transform:translateX(100%);transform:translateX(100%);visibility:visible}100%{-webkit-transform:translateX(0);transform:translateX(0)}}@keyframes slideInRight{0%{-webkit-transform:translateX(100%);transform:translateX(100%);visibility:visible}100%{-webkit-transform:translateX(0);transform:translateX(0)}}.slideInRight{-webkit-animation-name:slideInRight;animation-name:slideInRight}@-webkit-keyframes slideInUp{0%{-webkit-transform:translateY(100%);transform:translateY(100%);visibility:visible}100%{-webkit-transform:translateY(0);transform:translateY(0)}}@keyframes slideInUp{0%{-webkit-transform:translateY(100%);transform:translateY(100%);visibility:visible}100%{-webkit-transform:translateY(0);transform:translateY(0)}}.slideInUp{-webkit-animation-name:slideInUp;animation-name:slideInUp}@-webkit-keyframes slideOutDown{0%{-webkit-transform:translateY(0);transform:translateY(0)}100%{visibility:hidden;-webkit-transform:translateY(100%);transform:translateY(100%)}}@keyframes slideOutDown{0%{-webkit-transform:translateY(0);transform:translateY(0)}100%{visibility:hidden;-webkit-transform:translateY(100%);transform:translateY(100%)}}.slideOutDown{-webkit-animation-name:slideOutDown;animation-name:slideOutDown}@-webkit-keyframes slideOutLeft{0%{-webkit-transform:translateX(0);transform:translateX(0)}100%{visibility:hidden;-webkit-transform:translateX(-100%);transform:translateX(-100%)}}@keyframes slideOutLeft{0%{-webkit-transform:translateX(0);transform:translateX(0)}100%{visibility:hidden;-webkit-transform:translateX(-100%);transform:translateX(-100%)}}.slideOutLeft{-webkit-animation-name:slideOutLeft;animation-name:slideOutLeft}@-webkit-keyframes slideOutRight{0%{-webkit-transform:translateX(0);transform:translateX(0)}100%{visibility:hidden;-webkit-transform:translateX(100%);transform:translateX(100%)}}@keyframes slideOutRight{0%{-webkit-transform:translateX(0);transform:translateX(0)}100%{visibility:hidden;-webkit-transform:translateX(100%);transform:translateX(100%)}}.slideOutRight{-webkit-animation-name:slideOutRight;animation-name:slideOutRight}@-webkit-keyframes slideOutUp{0%{-webkit-transform:translateY(0);transform:translateY(0)}100%{visibility:hidden;-webkit-transform:translateY(-100%);transform:translateY(-100%)}}@keyframes slideOutUp{0%{-webkit-transform:translateY(0);transform:translateY(0)}100%{visibility:hidden;-webkit-transform:translateY(-100%);transform:translateY(-100%)}}.slideOutUp{-webkit-animation-name:slideOutUp;animation-name:slideOutUp}"
  },
  {
    "path": "client/less/lib/bootstrap/alerts.less",
    "content": "//\n// Alerts\n// --------------------------------------------------\n\n\n// Base styles\n// -------------------------\n\n.alert {\n  padding: @alert-padding;\n  margin-bottom: @line-height-computed;\n  border: 1px solid transparent;\n  border-radius: @alert-border-radius;\n\n  // Headings for larger alerts\n  h4 {\n    margin-top: 0;\n    // Specified for the h4 to prevent conflicts of changing @headings-color\n    color: inherit;\n  }\n  // Provide class for links that match alerts\n  .alert-link {\n    font-weight: @alert-link-font-weight;\n  }\n\n  // Improve alignment and spacing of inner content\n  > p,\n  > ul {\n    margin-bottom: 0;\n  }\n  > p + p {\n    margin-top: 5px;\n  }\n}\n\n// Dismissible alerts\n//\n// Expand the right padding and account for the close button's positioning.\n\n.alert-dismissable, // The misspelled .alert-dismissable was deprecated in 3.2.0.\n.alert-dismissible {\n  padding-right: (@alert-padding + 20);\n\n  // Adjust close link position\n  .close {\n    position: relative;\n    top: -2px;\n    right: -21px;\n    color: inherit;\n  }\n}\n\n// Alternate styles\n//\n// Generate contextual modifier classes for colorizing the alert.\n\n.alert-success {\n  .alert-variant(@alert-success-bg; @alert-success-border; @alert-success-text);\n}\n.alert-info {\n  .alert-variant(@alert-info-bg; @alert-info-border; @alert-info-text);\n}\n.alert-warning {\n  .alert-variant(@alert-warning-bg; @alert-warning-border; @alert-warning-text);\n}\n.alert-danger {\n  .alert-variant(@alert-danger-bg; @alert-danger-border; @alert-danger-text);\n}\n"
  },
  {
    "path": "client/less/lib/bootstrap/badges.less",
    "content": "//\n// Badges\n// --------------------------------------------------\n\n\n// Base class\n.badge {\n  display: inline-block;\n  min-width: 10px;\n  padding: 3px 7px;\n  font-size: @font-size-small;\n  font-weight: @badge-font-weight;\n  color: @badge-color;\n  line-height: @badge-line-height;\n  vertical-align: baseline;\n  white-space: nowrap;\n  text-align: center;\n  background-color: @badge-bg;\n  border-radius: @badge-border-radius;\n\n  // Empty badges collapse automatically (not available in IE8)\n  &:empty {\n    display: none;\n  }\n\n  // Quick fix for badges in buttons\n  .btn & {\n    position: relative;\n    top: -1px;\n  }\n  .btn-xs & {\n    top: 0;\n    padding: 1px 5px;\n  }\n\n  // Hover state, but only for links\n  a& {\n    &:hover,\n    &:focus {\n      color: @badge-link-hover-color;\n      text-decoration: none;\n      cursor: pointer;\n    }\n  }\n\n  // Account for badges in navs\n  a.list-group-item.active > &,\n  .nav-pills > .active > a > & {\n    color: @badge-active-color;\n    background-color: @badge-active-bg;\n  }\n  .nav-pills > li > a > & {\n    margin-left: 3px;\n  }\n}\n"
  },
  {
    "path": "client/less/lib/bootstrap/bootstrap.less",
    "content": "// Core variables and mixins\n@import \"variables.less\";\n@import \"mixins.less\";\n\n// Reset and dependencies\n@import \"normalize.less\";\n@import \"print.less\";\n@import \"glyphicons.less\";\n\n// Core CSS\n@import \"scaffolding.less\";\n@import \"type.less\";\n@import \"code.less\";\n@import \"grid.less\";\n@import \"tables.less\";\n@import \"forms.less\";\n@import \"buttons.less\";\n\n// Components\n@import \"component-animations.less\";\n@import \"dropdowns.less\";\n@import \"button-groups.less\";\n@import \"input-groups.less\";\n@import \"navs.less\";\n@import \"navbar.less\";\n@import \"breadcrumbs.less\";\n@import \"pagination.less\";\n@import \"pager.less\";\n@import \"labels.less\";\n@import \"badges.less\";\n@import \"jumbotron.less\";\n@import \"thumbnails.less\";\n@import \"alerts.less\";\n@import \"progress-bars.less\";\n@import \"media.less\";\n@import \"list-group.less\";\n@import \"panels.less\";\n@import \"responsive-embed.less\";\n@import \"wells.less\";\n@import \"close.less\";\n\n// Components w/ JavaScript\n@import \"modals.less\";\n@import \"tooltip.less\";\n@import \"popovers.less\";\n@import \"carousel.less\";\n\n// Utility classes\n@import \"utilities.less\";\n@import \"responsive-utilities.less\";\n"
  },
  {
    "path": "client/less/lib/bootstrap/breadcrumbs.less",
    "content": "//\n// Breadcrumbs\n// --------------------------------------------------\n\n\n.breadcrumb {\n  padding: @breadcrumb-padding-vertical @breadcrumb-padding-horizontal;\n  margin-bottom: @line-height-computed;\n  list-style: none;\n  background-color: @breadcrumb-bg;\n  border-radius: @border-radius-base;\n\n  > li {\n    display: inline-block;\n\n    + li:before {\n      content: \"@{breadcrumb-separator}\\00a0\"; // Unicode space added since inline-block means non-collapsing white-space\n      padding: 0 5px;\n      color: @breadcrumb-color;\n    }\n  }\n\n  > .active {\n    color: @breadcrumb-active-color;\n  }\n}\n"
  },
  {
    "path": "client/less/lib/bootstrap/button-groups.less",
    "content": "//\n// Button groups\n// --------------------------------------------------\n\n// Make the div behave like a button\n.btn-group,\n.btn-group-vertical {\n  position: relative;\n  display: inline-block;\n  vertical-align: middle; // match .btn alignment given font-size hack above\n  > .btn {\n    position: relative;\n    float: left;\n    // Bring the \"active\" button to the front\n    &:hover,\n    &:focus,\n    &:active,\n    &.active {\n      z-index: 2;\n    }\n    &:focus {\n      // Remove focus outline when dropdown JS adds it after closing the menu\n      outline: 0;\n    }\n  }\n}\n\n// Prevent double borders when buttons are next to each other\n.btn-group {\n  .btn + .btn,\n  .btn + .btn-group,\n  .btn-group + .btn,\n  .btn-group + .btn-group {\n    margin-left: -1px;\n  }\n}\n\n// Optional: Group multiple button groups together for a toolbar\n.btn-toolbar {\n  margin-left: -5px; // Offset the first child's margin\n  &:extend(.clearfix all);\n\n  .btn-group,\n  .input-group {\n    float: left;\n  }\n  > .btn,\n  > .btn-group,\n  > .input-group {\n    margin-left: 5px;\n  }\n}\n\n.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) {\n  border-radius: 0;\n}\n\n// Set corners individual because sometimes a single button can be in a .btn-group and we need :first-child and :last-child to both match\n.btn-group > .btn:first-child {\n  margin-left: 0;\n  &:not(:last-child):not(.dropdown-toggle) {\n    .border-right-radius(0);\n  }\n}\n// Need .dropdown-toggle since :last-child doesn't apply given a .dropdown-menu immediately after it\n.btn-group > .btn:last-child:not(:first-child),\n.btn-group > .dropdown-toggle:not(:first-child) {\n  .border-left-radius(0);\n}\n\n// Custom edits for including btn-groups within btn-groups (useful for including dropdown buttons within a btn-group)\n.btn-group > .btn-group {\n  float: left;\n}\n.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn {\n  border-radius: 0;\n}\n.btn-group > .btn-group:first-child {\n  > .btn:last-child,\n  > .dropdown-toggle {\n    .border-right-radius(0);\n  }\n}\n.btn-group > .btn-group:last-child > .btn:first-child {\n  .border-left-radius(0);\n}\n\n// On active and open, don't show outline\n.btn-group .dropdown-toggle:active,\n.btn-group.open .dropdown-toggle {\n  outline: 0;\n}\n\n\n// Sizing\n//\n// Remix the default button sizing classes into new ones for easier manipulation.\n\n.btn-group-xs > .btn { &:extend(.btn-xs); }\n.btn-group-sm > .btn { &:extend(.btn-sm); }\n.btn-group-lg > .btn { &:extend(.btn-lg); }\n\n\n// Split button dropdowns\n// ----------------------\n\n// Give the line between buttons some depth\n.btn-group > .btn + .dropdown-toggle {\n  padding-left: 8px;\n  padding-right: 8px;\n}\n.btn-group > .btn-lg + .dropdown-toggle {\n  padding-left: 12px;\n  padding-right: 12px;\n}\n\n// The clickable button for toggling the menu\n// Remove the gradient and set the same inset shadow as the :active state\n.btn-group.open .dropdown-toggle {\n  .box-shadow(inset 0 3px 5px rgba(0,0,0,.125));\n\n  // Show no shadow for `.btn-link` since it has no other button styles.\n  &.btn-link {\n    .box-shadow(none);\n  }\n}\n\n\n// Reposition the caret\n.btn .caret {\n  margin-left: 0;\n}\n// Carets in other button sizes\n.btn-lg .caret {\n  border-width: @caret-width-large @caret-width-large 0;\n  border-bottom-width: 0;\n}\n// Upside down carets for .dropup\n.dropup .btn-lg .caret {\n  border-width: 0 @caret-width-large @caret-width-large;\n}\n\n\n// Vertical button groups\n// ----------------------\n\n.btn-group-vertical {\n  > .btn,\n  > .btn-group,\n  > .btn-group > .btn {\n    display: block;\n    float: none;\n    width: 100%;\n    max-width: 100%;\n  }\n\n  // Clear floats so dropdown menus can be properly placed\n  > .btn-group {\n    &:extend(.clearfix all);\n    > .btn {\n      float: none;\n    }\n  }\n\n  > .btn + .btn,\n  > .btn + .btn-group,\n  > .btn-group + .btn,\n  > .btn-group + .btn-group {\n    margin-top: -1px;\n    margin-left: 0;\n  }\n}\n\n.btn-group-vertical > .btn {\n  &:not(:first-child):not(:last-child) {\n    border-radius: 0;\n  }\n  &:first-child:not(:last-child) {\n    border-top-right-radius: @border-radius-base;\n    .border-bottom-radius(0);\n  }\n  &:last-child:not(:first-child) {\n    border-bottom-left-radius: @border-radius-base;\n    .border-top-radius(0);\n  }\n}\n.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn {\n  border-radius: 0;\n}\n.btn-group-vertical > .btn-group:first-child:not(:last-child) {\n  > .btn:last-child,\n  > .dropdown-toggle {\n    .border-bottom-radius(0);\n  }\n}\n.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child {\n  .border-top-radius(0);\n}\n\n\n// Justified button groups\n// ----------------------\n\n.btn-group-justified {\n  display: table;\n  width: 100%;\n  table-layout: fixed;\n  border-collapse: separate;\n  > .btn,\n  > .btn-group {\n    float: none;\n    display: table-cell;\n    width: 1%;\n  }\n  > .btn-group .btn {\n    width: 100%;\n  }\n\n  > .btn-group .dropdown-menu {\n    left: auto;\n  }\n}\n\n\n// Checkbox and radio options\n//\n// In order to support the browser's form validation feedback, powered by the\n// `required` attribute, we have to \"hide\" the inputs via `clip`. We cannot use\n// `display: none;` or `visibility: hidden;` as that also hides the popover.\n// Simply visually hiding the inputs via `opacity` would leave them clickable in\n// certain cases which is prevented by using `clip` and `pointer-events`.\n// This way, we ensure a DOM element is visible to position the popover from.\n//\n// See https://github.com/twbs/bootstrap/pull/12794 and\n// https://github.com/twbs/bootstrap/pull/14559 for more information.\n\n[data-toggle=\"buttons\"] {\n  > .btn,\n  > .btn-group > .btn {\n    input[type=\"radio\"],\n    input[type=\"checkbox\"] {\n      position: absolute;\n      clip: rect(0,0,0,0);\n      pointer-events: none;\n    }\n  }\n}\n"
  },
  {
    "path": "client/less/lib/bootstrap/buttons.less",
    "content": "//\n// Buttons\n// --------------------------------------------------\n\n\n// Base styles\n// --------------------------------------------------\n\n.btn {\n  display: inline-block;\n  margin-bottom: 0; // For input.btn\n  font-weight: @btn-font-weight;\n  text-align: center;\n  vertical-align: middle;\n  touch-action: manipulation;\n  cursor: pointer;\n  background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214\n  border: 1px solid transparent;\n  white-space: nowrap;\n  .button-size(@padding-base-vertical; @padding-base-horizontal; @font-size-base; @line-height-base; @border-radius-base);\n  .user-select(none);\n\n  &,\n  &:active,\n  &.active {\n    &:focus,\n    &.focus {\n      .tab-focus();\n    }\n  }\n\n  &:hover,\n  &:focus,\n  &.focus {\n    color: @gray-lighter;\n    text-decoration: none;\n  }\n\n  &:active,\n  &.active {\n    outline: 0;\n    background-image: none;\n    .box-shadow(inset 0 3px 5px rgba(0,0,0,.125));\n  }\n\n  &.disabled,\n  &[disabled],\n  fieldset[disabled] & {\n    cursor: @cursor-disabled;\n    pointer-events: none; // Future-proof disabling of clicks\n    .opacity(.65);\n    .box-shadow(none);\n  }\n}\n\n\n// Alternate buttons\n// --------------------------------------------------\n\n.btn-default {\n  .button-variant(@btn-default-color; @btn-default-bg; @btn-default-border);\n}\n.btn-primary {\n  .button-variant(@btn-primary-color; @btn-primary-bg; @btn-primary-border);\n}\n// Success appears as green\n.btn-success {\n  .button-variant(@btn-success-color; @btn-success-bg; @btn-success-border);\n}\n// Info appears as blue-green\n.btn-info {\n  .button-variant(@btn-info-color; @btn-info-bg; @btn-info-border);\n}\n// Warning appears as orange\n.btn-warning {\n  .button-variant(@btn-warning-color; @btn-warning-bg; @btn-warning-border);\n}\n// Danger and error appear as red\n.btn-danger {\n  .button-variant(@btn-danger-color; @btn-danger-bg; @btn-danger-border);\n}\n\n\n// Link buttons\n// -------------------------\n\n// Make a button look and behave like a link\n.btn-link {\n  color: @link-color;\n  font-weight: normal;\n  border-radius: 0;\n\n  &,\n  &:active,\n  &.active,\n  &[disabled],\n  fieldset[disabled] & {\n    background-color: transparent;\n    .box-shadow(none);\n  }\n  &,\n  &:hover,\n  &:focus,\n  &:active {\n    border-color: transparent;\n  }\n  &:hover,\n  &:focus {\n    color: @link-hover-color;\n    text-decoration: underline;\n    background-color: transparent;\n  }\n  &[disabled],\n  fieldset[disabled] & {\n    &:hover,\n    &:focus {\n      color: @btn-link-disabled-color;\n      text-decoration: none;\n    }\n  }\n}\n\n\n// Button Sizes\n// --------------------------------------------------\n\n.btn-lg {\n  // line-height: ensure even-numbered height of button next to large input\n  .button-size(@padding-large-vertical; @padding-large-horizontal; @font-size-large; @line-height-large; @border-radius-large);\n}\n.btn-sm {\n  // line-height: ensure proper height of button next to small input\n  .button-size(@padding-small-vertical; @padding-small-horizontal; @font-size-small; @line-height-small; @border-radius-small);\n}\n.btn-xs {\n  .button-size(@padding-xs-vertical; @padding-xs-horizontal; @font-size-small; @line-height-small; @border-radius-small);\n}\n\n\n// Block button\n// --------------------------------------------------\n\n.btn-block {\n  display: block;\n  width: 100%;\n}\n\n// Vertically space out multiple block buttons\n.btn-block + .btn-block {\n  margin-top: 5px;\n}\n\n// Specificity overrides\ninput[type=\"submit\"],\ninput[type=\"reset\"],\ninput[type=\"button\"] {\n  &.btn-block {\n    width: 100%;\n  }\n}\n"
  },
  {
    "path": "client/less/lib/bootstrap/carousel.less",
    "content": "//\n// Carousel\n// --------------------------------------------------\n\n\n// Wrapper for the slide container and indicators\n.carousel {\n  position: relative;\n}\n\n.carousel-inner {\n  position: relative;\n  overflow: hidden;\n  width: 100%;\n\n  > .item {\n    display: none;\n    position: relative;\n    .transition(.6s ease-in-out left);\n\n    // Account for jankitude on images\n    > img,\n    > a > img {\n      &:extend(.img-responsive);\n      line-height: 1;\n    }\n\n    // WebKit CSS3 transforms for supported devices\n    @media all and (transform-3d), (-webkit-transform-3d) {\n      transition: transform .6s ease-in-out;\n      backface-visibility: hidden;\n      perspective: 1000;\n\n      &.next,\n      &.active.right {\n        transform: translate3d(100%, 0, 0);\n        left: 0;\n      }\n      &.prev,\n      &.active.left {\n        transform: translate3d(-100%, 0, 0);\n        left: 0;\n      }\n      &.next.left,\n      &.prev.right,\n      &.active {\n        transform: translate3d(0, 0, 0);\n        left: 0;\n      }\n    }\n  }\n\n  > .active,\n  > .next,\n  > .prev {\n    display: block;\n  }\n\n  > .active {\n    left: 0;\n  }\n\n  > .next,\n  > .prev {\n    position: absolute;\n    top: 0;\n    width: 100%;\n  }\n\n  > .next {\n    left: 100%;\n  }\n  > .prev {\n    left: -100%;\n  }\n  > .next.left,\n  > .prev.right {\n    left: 0;\n  }\n\n  > .active.left {\n    left: -100%;\n  }\n  > .active.right {\n    left: 100%;\n  }\n\n}\n\n// Left/right controls for nav\n// ---------------------------\n\n.carousel-control {\n  position: absolute;\n  top: 0;\n  left: 0;\n  bottom: 0;\n  width: @carousel-control-width;\n  .opacity(@carousel-control-opacity);\n  font-size: @carousel-control-font-size;\n  color: @carousel-control-color;\n  text-align: center;\n  text-shadow: @carousel-text-shadow;\n  // We can't have this transition here because WebKit cancels the carousel\n  // animation if you trip this while in the middle of another animation.\n\n  // Set gradients for backgrounds\n  &.left {\n    #gradient > .horizontal(@start-color: rgba(0,0,0,.5); @end-color: rgba(0,0,0,.0001));\n  }\n  &.right {\n    left: auto;\n    right: 0;\n    #gradient > .horizontal(@start-color: rgba(0,0,0,.0001); @end-color: rgba(0,0,0,.5));\n  }\n\n  // Hover/focus state\n  &:hover,\n  &:focus {\n    outline: 0;\n    color: @carousel-control-color;\n    text-decoration: none;\n    .opacity(.9);\n  }\n\n  // Toggles\n  .icon-prev,\n  .icon-next,\n  .glyphicon-chevron-left,\n  .glyphicon-chevron-right {\n    position: absolute;\n    top: 50%;\n    z-index: 5;\n    display: inline-block;\n  }\n  .icon-prev,\n  .glyphicon-chevron-left {\n    left: 50%;\n    margin-left: -10px;\n  }\n  .icon-next,\n  .glyphicon-chevron-right {\n    right: 50%;\n    margin-right: -10px;\n  }\n  .icon-prev,\n  .icon-next {\n    width:  20px;\n    height: 20px;\n    margin-top: -10px;\n    font-family: serif;\n  }\n\n\n  .icon-prev {\n    &:before {\n      content: '\\2039';// SINGLE LEFT-POINTING ANGLE QUOTATION MARK (U+2039)\n    }\n  }\n  .icon-next {\n    &:before {\n      content: '\\203a';// SINGLE RIGHT-POINTING ANGLE QUOTATION MARK (U+203A)\n    }\n  }\n}\n\n// Optional indicator pips\n//\n// Add an unordered list with the following class and add a list item for each\n// slide your carousel holds.\n\n.carousel-indicators {\n  position: absolute;\n  bottom: 10px;\n  left: 50%;\n  z-index: 15;\n  width: 60%;\n  margin-left: -30%;\n  padding-left: 0;\n  list-style: none;\n  text-align: center;\n\n  li {\n    display: inline-block;\n    width:  10px;\n    height: 10px;\n    margin: 1px;\n    text-indent: -999px;\n    border: 1px solid @carousel-indicator-border-color;\n    border-radius: 10px;\n    cursor: pointer;\n\n    // IE8-9 hack for event handling\n    //\n    // Internet Explorer 8-9 does not support clicks on elements without a set\n    // `background-color`. We cannot use `filter` since that's not viewed as a\n    // background color by the browser. Thus, a hack is needed.\n    //\n    // For IE8, we set solid black as it doesn't support `rgba()`. For IE9, we\n    // set alpha transparency for the best results possible.\n    background-color: #000 \\9; // IE8\n    background-color: rgba(0,0,0,0); // IE9\n  }\n  .active {\n    margin: 0;\n    width:  12px;\n    height: 12px;\n    background-color: @carousel-indicator-active-bg;\n  }\n}\n\n// Optional captions\n// -----------------------------\n// Hidden by default for smaller viewports\n.carousel-caption {\n  position: absolute;\n  left: 15%;\n  right: 15%;\n  bottom: 20px;\n  z-index: 10;\n  padding-top: 20px;\n  padding-bottom: 20px;\n  color: @carousel-caption-color;\n  text-align: center;\n  text-shadow: @carousel-text-shadow;\n  & .btn {\n    text-shadow: none; // No shadow for button elements in carousel-caption\n  }\n}\n\n\n// Scale up controls for tablets and up\n@media screen and (min-width: @screen-sm-min) {\n\n  // Scale up the controls a smidge\n  .carousel-control {\n    .glyphicon-chevron-left,\n    .glyphicon-chevron-right,\n    .icon-prev,\n    .icon-next {\n      width: 30px;\n      height: 30px;\n      margin-top: -15px;\n      font-size: 30px;\n    }\n    .glyphicon-chevron-left,\n    .icon-prev {\n      margin-left: -15px;\n    }\n    .glyphicon-chevron-right,\n    .icon-next {\n      margin-right: -15px;\n    }\n  }\n\n  // Show and left align the captions\n  .carousel-caption {\n    left: 20%;\n    right: 20%;\n    padding-bottom: 30px;\n  }\n\n  // Move up the indicators\n  .carousel-indicators {\n    bottom: 20px;\n  }\n}\n"
  },
  {
    "path": "client/less/lib/bootstrap/close.less",
    "content": "//\n// Close icons\n// --------------------------------------------------\n\n\n.close {\n  float: right;\n  font-size: (@font-size-base * 1.5);\n  font-weight: @close-font-weight;\n  line-height: 1;\n  color: @close-color;\n  text-shadow: @close-text-shadow;\n  .opacity(.2);\n\n  &:hover,\n  &:focus {\n    color: @close-color;\n    text-decoration: none;\n    cursor: pointer;\n    .opacity(.5);\n  }\n\n  // Additional properties for button version\n  // iOS requires the button element instead of an anchor tag.\n  // If you want the anchor version, it requires `href=\"#\"`.\n  button& {\n    padding: 0;\n    cursor: pointer;\n    background: transparent;\n    border: 0;\n    -webkit-appearance: none;\n  }\n}\n"
  },
  {
    "path": "client/less/lib/bootstrap/code.less",
    "content": "//\n// Code (inline and block)\n// --------------------------------------------------\n\n\n// Inline and block code styles\ncode,\nkbd,\npre,\nsamp {\n  font-family: @font-family-monospace;\n}\n\n// Inline code\ncode {\n  padding: 2px 4px;\n  font-size: 90%;\n  color: @code-color;\n  background-color: @code-bg;\n  border-radius: @border-radius-base;\n}\n\n// User input typically entered via keyboard\nkbd {\n  padding: 2px 4px;\n  font-size: 90%;\n  color: @kbd-color;\n  background-color: @kbd-bg;\n  border-radius: @border-radius-small;\n  box-shadow: inset 0 -1px 0 rgba(0,0,0,.25);\n\n  kbd {\n    padding: 0;\n    font-size: 100%;\n    font-weight: bold;\n    box-shadow: none;\n  }\n}\n\n// Blocks of code\npre {\n  display: block;\n  padding: ((@line-height-computed - 1) / 2);\n  margin: 0 0 (@line-height-computed / 2);\n  font-size: (@font-size-base - 1); // 14px to 13px\n  line-height: @line-height-base;\n  word-break: break-all;\n  word-wrap: break-word;\n  color: @pre-color;\n  background-color: @pre-bg;\n  border: 1px solid @pre-border-color;\n  border-radius: @border-radius-base;\n\n  // Account for some code outputs that place code tags in pre tags\n  code {\n    padding: 0;\n    font-size: inherit;\n    color: inherit;\n    white-space: pre-wrap;\n    background-color: transparent;\n    border-radius: 0;\n  }\n}\n\n// Enable scrollable blocks of code\n.pre-scrollable {\n  max-height: @pre-scrollable-max-height;\n  overflow-y: scroll;\n}\n"
  },
  {
    "path": "client/less/lib/bootstrap/component-animations.less",
    "content": "//\n// Component animations\n// --------------------------------------------------\n\n// Heads up!\n//\n// We don't use the `.opacity()` mixin here since it causes a bug with text\n// fields in IE7-8. Source: https://github.com/twbs/bootstrap/pull/3552.\n\n.fade {\n  opacity: 0;\n  .transition(opacity .15s linear);\n  &.in {\n    opacity: 1;\n  }\n}\n\n.collapse {\n  display: none;\n  visibility: hidden;\n\n  &.in      { display: block; visibility: visible; }\n  tr&.in    { display: table-row; }\n  tbody&.in { display: table-row-group; }\n}\n\n.collapsing {\n  position: relative;\n  height: 0;\n  overflow: hidden;\n  .transition-property(~\"height, visibility\");\n  .transition-duration(.35s);\n  .transition-timing-function(ease);\n}\n"
  },
  {
    "path": "client/less/lib/bootstrap/dropdowns.less",
    "content": "//\n// Dropdown menus\n// --------------------------------------------------\n\n\n// Dropdown arrow/caret\n.caret {\n  display: inline-block;\n  width: 0;\n  height: 0;\n  margin-left: 2px;\n  vertical-align: middle;\n  border-top:   @caret-width-base solid;\n  border-right: @caret-width-base solid transparent;\n  border-left:  @caret-width-base solid transparent;\n}\n\n// The dropdown wrapper (div)\n.dropdown {\n  position: relative;\n}\n\n// Prevent the focus on the dropdown toggle when closing dropdowns\n.dropdown-toggle:focus {\n  outline: 0;\n}\n\n// The dropdown menu (ul)\n.dropdown-menu {\n  position: absolute;\n  top: 100%;\n  left: 0;\n  z-index: @zindex-dropdown;\n  display: none; // none by default, but block on \"open\" of the menu\n  float: left;\n  min-width: 160px;\n  padding: 5px 0;\n  margin: 2px 0 0; // override default ul\n  list-style: none;\n  font-size: @font-size-base;\n  text-align: left; // Ensures proper alignment if parent has it changed (e.g., modal footer)\n  background-color: @dropdown-bg;\n  border: 1px solid @dropdown-fallback-border; // IE8 fallback\n  border: 1px solid @dropdown-border;\n  border-radius: @border-radius-base;\n  .box-shadow(0 6px 12px rgba(0,0,0,.175));\n  background-clip: padding-box;\n\n  // Aligns the dropdown menu to right\n  //\n  // Deprecated as of 3.1.0 in favor of `.dropdown-menu-[dir]`\n  &.pull-right {\n    right: 0;\n    left: auto;\n  }\n\n  // Dividers (basically an hr) within the dropdown\n  .divider {\n    .nav-divider(@dropdown-divider-bg);\n  }\n\n  // Links within the dropdown menu\n  > li > a {\n    display: block;\n    padding: 3px 20px;\n    clear: both;\n    font-weight: normal;\n    line-height: @line-height-base;\n    color: @dropdown-link-color;\n    white-space: nowrap; // prevent links from randomly breaking onto new lines\n  }\n}\n\n// Hover/Focus state\n.dropdown-menu > li > a {\n  &:hover,\n  &:focus {\n    text-decoration: none;\n    color: @dropdown-link-hover-color;\n    background-color: @dropdown-link-hover-bg;\n  }\n}\n\n// Active state\n.dropdown-menu > .active > a {\n  &,\n  &:hover,\n  &:focus {\n    color: @dropdown-link-active-color;\n    text-decoration: none;\n    outline: 0;\n    background-color: @dropdown-link-active-bg;\n  }\n}\n\n// Disabled state\n//\n// Gray out text and ensure the hover/focus state remains gray\n\n.dropdown-menu > .disabled > a {\n  &,\n  &:hover,\n  &:focus {\n    color: @dropdown-link-disabled-color;\n  }\n\n  // Nuke hover/focus effects\n  &:hover,\n  &:focus {\n    text-decoration: none;\n    background-color: transparent;\n    background-image: none; // Remove CSS gradient\n    .reset-filter();\n    cursor: @cursor-disabled;\n  }\n}\n\n// Open state for the dropdown\n.open {\n  // Show the menu\n  > .dropdown-menu {\n    display: block;\n  }\n\n  // Remove the outline when :focus is triggered\n  > a {\n    outline: 0;\n  }\n}\n\n// Menu positioning\n//\n// Add extra class to `.dropdown-menu` to flip the alignment of the dropdown\n// menu with the parent.\n.dropdown-menu-right {\n  left: auto; // Reset the default from `.dropdown-menu`\n  right: 0;\n}\n// With v3, we enabled auto-flipping if you have a dropdown within a right\n// aligned nav component. To enable the undoing of that, we provide an override\n// to restore the default dropdown menu alignment.\n//\n// This is only for left-aligning a dropdown menu within a `.navbar-right` or\n// `.pull-right` nav component.\n.dropdown-menu-left {\n  left: 0;\n  right: auto;\n}\n\n// Dropdown section headers\n.dropdown-header {\n  display: block;\n  padding: 3px 20px;\n  font-size: @font-size-small;\n  line-height: @line-height-base;\n  color: @dropdown-header-color;\n  white-space: nowrap; // as with > li > a\n}\n\n// Backdrop to catch body clicks on mobile, etc.\n.dropdown-backdrop {\n  position: fixed;\n  left: 0;\n  right: 0;\n  bottom: 0;\n  top: 0;\n  z-index: (@zindex-dropdown - 10);\n}\n\n// Right aligned dropdowns\n.pull-right > .dropdown-menu {\n  right: 0;\n  left: auto;\n}\n\n// Allow for dropdowns to go bottom up (aka, dropup-menu)\n//\n// Just add .dropup after the standard .dropdown class and you're set, bro.\n// TODO: abstract this so that the navbar fixed styles are not placed here?\n\n.dropup,\n.navbar-fixed-bottom .dropdown {\n  // Reverse the caret\n  .caret {\n    border-top: 0;\n    border-bottom: @caret-width-base solid;\n    content: \"\";\n  }\n  // Different positioning for bottom up menu\n  .dropdown-menu {\n    top: auto;\n    bottom: 100%;\n    margin-bottom: 1px;\n  }\n}\n\n\n// Component alignment\n//\n// Reiterate per navbar.less and the modified component alignment there.\n\n@media (min-width: @grid-float-breakpoint) {\n  .navbar-right {\n    .dropdown-menu {\n      .dropdown-menu-right();\n    }\n    // Necessary for overrides of the default right aligned menu.\n    // Will remove come v4 in all likelihood.\n    .dropdown-menu-left {\n      .dropdown-menu-left();\n    }\n  }\n}\n"
  },
  {
    "path": "client/less/lib/bootstrap/forms.less",
    "content": "//\n// Forms\n// --------------------------------------------------\n\n\n// Normalize non-controls\n//\n// Restyle and baseline non-control form elements.\n\nfieldset {\n  padding: 0;\n  margin: 0;\n  border: 0;\n  // Chrome and Firefox set a `min-width: min-content;` on fieldsets,\n  // so we reset that to ensure it behaves more like a standard block element.\n  // See https://github.com/twbs/bootstrap/issues/12359.\n  min-width: 0;\n}\n\nlegend {\n  display: block;\n  width: 100%;\n  padding: 0;\n  margin-bottom: @line-height-computed;\n  font-size: (@font-size-base * 1.5);\n  line-height: inherit;\n  color: @legend-color;\n  border: 0;\n  border-bottom: 1px solid @legend-border-color;\n}\n\nlabel {\n  display: inline-block;\n  max-width: 100%; // Force IE8 to wrap long content (see https://github.com/twbs/bootstrap/issues/13141)\n  margin-bottom: 5px;\n  font-weight: bold;\n}\n\n\n// Normalize form controls\n//\n// While most of our form styles require extra classes, some basic normalization\n// is required to ensure optimum display with or without those classes to better\n// address browser inconsistencies.\n\n// Override content-box in Normalize (* isn't specific enough)\ninput[type=\"search\"] {\n  .box-sizing(border-box);\n}\n\n// Position radios and checkboxes better\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n  margin: 4px 0 0;\n  margin-top: 1px \\9; // IE8-9\n  line-height: normal;\n}\n\n// Set the height of file controls to match text inputs\ninput[type=\"file\"] {\n  display: block;\n}\n\n// Make range inputs behave like textual form controls\ninput[type=\"range\"] {\n  display: block;\n  width: 100%;\n}\n\n// Make multiple select elements height not fixed\nselect[multiple],\nselect[size] {\n  height: auto;\n}\n\n// Focus for file, radio, and checkbox\ninput[type=\"file\"]:focus,\ninput[type=\"radio\"]:focus,\ninput[type=\"checkbox\"]:focus {\n  .tab-focus();\n}\n\n// Adjust output element\noutput {\n  display: block;\n  padding-top: (@padding-base-vertical + 1);\n  font-size: @font-size-base;\n  line-height: @line-height-base;\n  color: @input-color;\n}\n\n\n// Common form controls\n//\n// Shared size and type resets for form controls. Apply `.form-control` to any\n// of the following form controls:\n//\n// select\n// textarea\n// input[type=\"text\"]\n// input[type=\"password\"]\n// input[type=\"datetime\"]\n// input[type=\"datetime-local\"]\n// input[type=\"date\"]\n// input[type=\"month\"]\n// input[type=\"time\"]\n// input[type=\"week\"]\n// input[type=\"number\"]\n// input[type=\"email\"]\n// input[type=\"url\"]\n// input[type=\"search\"]\n// input[type=\"tel\"]\n// input[type=\"color\"]\n\n.form-control {\n  display: block;\n  width: 100%;\n  height: @input-height-base; // Make inputs at least the height of their button counterpart (base line-height + padding + border)\n  padding: @padding-base-vertical @padding-base-horizontal;\n  font-size: @font-size-base;\n  line-height: @line-height-base;\n  color: @input-color;\n  background-color: @input-bg;\n  background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214\n  border: 1px solid @input-border;\n  border-radius: @input-border-radius;\n  .box-shadow(inset 0 1px 1px rgba(0,0,0,.075));\n  .transition(~\"border-color ease-in-out .15s, box-shadow ease-in-out .15s\");\n\n  // Customize the `:focus` state to imitate native WebKit styles.\n  .form-control-focus();\n\n  // Placeholder\n  .placeholder();\n\n  // Disabled and read-only inputs\n  //\n  // HTML5 says that controls under a fieldset > legend:first-child won't be\n  // disabled if the fieldset is disabled. Due to implementation difficulty, we\n  // don't honor that edge case; we style them as disabled anyway.\n  &[disabled],\n  &[readonly],\n  fieldset[disabled] & {\n    cursor: @cursor-disabled;\n    background-color: @input-bg-disabled;\n    opacity: 1; // iOS fix for unreadable disabled content\n  }\n\n  // Reset height for `textarea`s\n  textarea& {\n    height: auto;\n  }\n}\n\n\n// Search inputs in iOS\n//\n// This overrides the extra rounded corners on search inputs in iOS so that our\n// `.form-control` class can properly style them. Note that this cannot simply\n// be added to `.form-control` as it's not specific enough. For details, see\n// https://github.com/twbs/bootstrap/issues/11586.\n\ninput[type=\"search\"] {\n  -webkit-appearance: none;\n}\n\n\n// Special styles for iOS temporal inputs\n//\n// In Mobile Safari, setting `display: block` on temporal inputs causes the\n// text within the input to become vertically misaligned.\n// As a workaround, we set a pixel line-height that matches the\n// given height of the input. Since this fucks up everything else, we have to\n// appropriately reset it for Internet Explorer and the size variations.\n\ninput[type=\"date\"],\ninput[type=\"time\"],\ninput[type=\"datetime-local\"],\ninput[type=\"month\"] {\n  line-height: @input-height-base;\n  // IE8+ misaligns the text within date inputs, so we reset\n  line-height: @line-height-base ~\"\\0\";\n\n  &.input-sm {\n    line-height: @input-height-small;\n    line-height: @line-height-small ~\"\\0\";\n  }\n  &.input-lg {\n    line-height: @input-height-large;\n    line-height: @line-height-large ~\"\\0\";\n  }\n}\n\n// IE 11 hack to reverse the iOS temporal input hack.\n_:-ms-fullscreen, :root input[type=\"date\"],\n_:-ms-fullscreen, :root input[type=\"time\"],\n_:-ms-fullscreen, :root input[type=\"datetime-local\"],\n_:-ms-fullscreen, :root input[type=\"month\"] {\n  line-height: @line-height-base;\n\n  &.input-sm {\n    line-height: @line-height-small;\n  }\n  &.input-lg {\n    line-height: @line-height-large;\n  }\n}\n\n\n// Form groups\n//\n// Designed to help with the organization and spacing of vertical forms. For\n// horizontal forms, use the predefined grid classes.\n\n.form-group {\n  margin-bottom: 15px;\n}\n\n\n// Checkboxes and radios\n//\n// Indent the labels to position radios/checkboxes as hanging controls.\n\n.radio,\n.checkbox {\n  position: relative;\n  display: block;\n  margin-top: 10px;\n  margin-bottom: 10px;\n\n  label {\n    min-height: @line-height-computed; // Ensure the input doesn't jump when there is no text\n    padding-left: 20px;\n    margin-bottom: 0;\n    font-weight: normal;\n    cursor: pointer;\n  }\n}\n.radio input[type=\"radio\"],\n.radio-inline input[type=\"radio\"],\n.checkbox input[type=\"checkbox\"],\n.checkbox-inline input[type=\"checkbox\"] {\n  position: absolute;\n  margin-left: -20px;\n  margin-top: 4px \\9;\n}\n\n.radio + .radio,\n.checkbox + .checkbox {\n  margin-top: -5px; // Move up sibling radios or checkboxes for tighter spacing\n}\n\n// Radios and checkboxes on same line\n.radio-inline,\n.checkbox-inline {\n  display: inline-block;\n  padding-left: 20px;\n  margin-bottom: 0;\n  vertical-align: middle;\n  font-weight: normal;\n  cursor: pointer;\n}\n.radio-inline + .radio-inline,\n.checkbox-inline + .checkbox-inline {\n  margin-top: 0;\n  margin-left: 10px; // space out consecutive inline controls\n}\n\n// Apply same disabled cursor tweak as for inputs\n// Some special care is needed because <label>s don't inherit their parent's `cursor`.\n//\n// Note: Neither radios nor checkboxes can be readonly.\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n  &[disabled],\n  &.disabled,\n  fieldset[disabled] & {\n    cursor: @cursor-disabled;\n  }\n}\n// These classes are used directly on <label>s\n.radio-inline,\n.checkbox-inline {\n  &.disabled,\n  fieldset[disabled] & {\n    cursor: @cursor-disabled;\n  }\n}\n// These classes are used on elements with <label> descendants\n.radio,\n.checkbox {\n  &.disabled,\n  fieldset[disabled] & {\n    label {\n      cursor: @cursor-disabled;\n    }\n  }\n}\n\n\n// Static form control text\n//\n// Apply class to a `p` element to make any string of text align with labels in\n// a horizontal form layout.\n\n.form-control-static {\n  // Size it appropriately next to real form controls\n  padding-top: (@padding-base-vertical + 1);\n  padding-bottom: (@padding-base-vertical + 1);\n  // Remove default margin from `p`\n  margin-bottom: 0;\n\n  &.input-lg,\n  &.input-sm {\n    padding-left: 0;\n    padding-right: 0;\n  }\n}\n\n\n// Form control sizing\n//\n// Build on `.form-control` with modifier classes to decrease or increase the\n// height and font-size of form controls.\n\n.input-sm,\n.form-group-sm .form-control {\n  .input-size(@input-height-small; @padding-small-vertical; @padding-small-horizontal; @font-size-small; @line-height-small; @input-border-radius-small);\n}\n\n.input-lg,\n.form-group-lg .form-control {\n  .input-size(@input-height-large; @padding-large-vertical; @padding-large-horizontal; @font-size-large; @line-height-large; @input-border-radius-large);\n}\n\n\n// Form control feedback states\n//\n// Apply contextual and semantic states to individual form controls.\n\n.has-feedback {\n  // Enable absolute positioning\n  position: relative;\n\n  // Ensure icons don't overlap text\n  .form-control {\n    padding-right: (@input-height-base * 1.25);\n  }\n}\n// Feedback icon (requires .glyphicon classes)\n.form-control-feedback {\n  position: absolute;\n  top: 0;\n  right: 0;\n  z-index: 2; // Ensure icon is above input groups\n  display: block;\n  width: @input-height-base;\n  height: @input-height-base;\n  line-height: @input-height-base;\n  text-align: center;\n  pointer-events: none;\n}\n.input-lg + .form-control-feedback {\n  width: @input-height-large;\n  height: @input-height-large;\n  line-height: @input-height-large;\n}\n.input-sm + .form-control-feedback {\n  width: @input-height-small;\n  height: @input-height-small;\n  line-height: @input-height-small;\n}\n\n// Feedback states\n.has-success {\n  .form-control-validation(@state-success-text; @state-success-text; @state-success-bg);\n}\n.has-warning {\n  .form-control-validation(@state-warning-text; @state-warning-text; @state-warning-bg);\n}\n.has-error {\n  .form-control-validation(@state-danger-text; @state-danger-text; @state-danger-bg);\n}\n\n// Reposition feedback icon if input has visible label above\n.has-feedback label {\n\n  & ~ .form-control-feedback {\n     top: (@line-height-computed + 5); // Height of the `label` and its margin\n  }\n  &.sr-only ~ .form-control-feedback {\n     top: 0;\n  }\n}\n\n\n// Help text\n//\n// Apply to any element you wish to create light text for placement immediately\n// below a form control. Use for general help, formatting, or instructional text.\n\n.help-block {\n  display: block; // account for any element using help-block\n  margin-top: 5px;\n  margin-bottom: 10px;\n  color: lighten(@text-color, 25%); // lighten the text some for contrast\n}\n\n\n// Inline forms\n//\n// Make forms appear inline(-block) by adding the `.form-inline` class. Inline\n// forms begin stacked on extra small (mobile) devices and then go inline when\n// viewports reach <768px.\n//\n// Requires wrapping inputs and labels with `.form-group` for proper display of\n// default HTML form controls and our custom form controls (e.g., input groups).\n//\n// Heads up! This is mixin-ed into `.navbar-form` in navbars.less.\n\n.form-inline {\n\n  // Kick in the inline\n  @media (min-width: @screen-sm-min) {\n    // Inline-block all the things for \"inline\"\n    .form-group {\n      display: inline-block;\n      margin-bottom: 0;\n      vertical-align: middle;\n    }\n\n    // In navbar-form, allow folks to *not* use `.form-group`\n    .form-control {\n      display: inline-block;\n      width: auto; // Prevent labels from stacking above inputs in `.form-group`\n      vertical-align: middle;\n    }\n\n    // Make static controls behave like regular ones\n    .form-control-static {\n      display: inline-block;\n    }\n\n    .input-group {\n      display: inline-table;\n      vertical-align: middle;\n\n      .input-group-addon,\n      .input-group-btn,\n      .form-control {\n        width: auto;\n      }\n    }\n\n    // Input groups need that 100% width though\n    .input-group > .form-control {\n      width: 100%;\n    }\n\n    .control-label {\n      margin-bottom: 0;\n      vertical-align: middle;\n    }\n\n    // Remove default margin on radios/checkboxes that were used for stacking, and\n    // then undo the floating of radios and checkboxes to match (which also avoids\n    // a bug in WebKit: https://github.com/twbs/bootstrap/issues/1969).\n    .radio,\n    .checkbox {\n      display: inline-block;\n      margin-top: 0;\n      margin-bottom: 0;\n      vertical-align: middle;\n\n      label {\n        padding-left: 0;\n      }\n    }\n    .radio input[type=\"radio\"],\n    .checkbox input[type=\"checkbox\"] {\n      position: relative;\n      margin-left: 0;\n    }\n\n    // Re-override the feedback icon.\n    .has-feedback .form-control-feedback {\n      top: 0;\n    }\n  }\n}\n\n\n// Horizontal forms\n//\n// Horizontal forms are built on grid classes and allow you to create forms with\n// labels on the left and inputs on the right.\n\n.form-horizontal {\n\n  // Consistent vertical alignment of radios and checkboxes\n  //\n  // Labels also get some reset styles, but that is scoped to a media query below.\n  .radio,\n  .checkbox,\n  .radio-inline,\n  .checkbox-inline {\n    margin-top: 0;\n    margin-bottom: 0;\n    padding-top: (@padding-base-vertical + 1); // Default padding plus a border\n  }\n  // Account for padding we're adding to ensure the alignment and of help text\n  // and other content below items\n  .radio,\n  .checkbox {\n    min-height: (@line-height-computed + (@padding-base-vertical + 1));\n  }\n\n  // Make form groups behave like rows\n  .form-group {\n    .make-row();\n  }\n\n  // Reset spacing and right align labels, but scope to media queries so that\n  // labels on narrow viewports stack the same as a default form example.\n  @media (min-width: @screen-sm-min) {\n    .control-label {\n      text-align: right;\n      margin-bottom: 0;\n      padding-top: (@padding-base-vertical + 1); // Default padding plus a border\n    }\n  }\n\n  // Validation states\n  //\n  // Reposition the icon because it's now within a grid column and columns have\n  // `position: relative;` on them. Also accounts for the grid gutter padding.\n  .has-feedback .form-control-feedback {\n    right: (@grid-gutter-width / 2);\n  }\n\n  // Form group sizes\n  //\n  // Quick utility class for applying `.input-lg` and `.input-sm` styles to the\n  // inputs and labels within a `.form-group`.\n  .form-group-lg {\n    @media (min-width: @screen-sm-min) {\n      .control-label {\n        padding-top: ((@padding-large-vertical * @line-height-large) + 1);\n      }\n    }\n  }\n  .form-group-sm {\n    @media (min-width: @screen-sm-min) {\n      .control-label {\n        padding-top: (@padding-small-vertical + 1);\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "client/less/lib/bootstrap/glyphicons.less",
    "content": "//\n// Glyphicons for Bootstrap\n//\n// Since icons are fonts, they can be placed anywhere text is placed and are\n// thus automatically sized to match the surrounding child. To use, create an\n// inline element with the appropriate classes, like so:\n//\n// <a href=\"#\"><span class=\"glyphicon glyphicon-star\"></span> Star</a>\n\n// Import the fonts\n@font-face {\n  font-family: 'Glyphicons Halflings';\n  src: url('@{icon-font-path}@{icon-font-name}.eot');\n  src: url('@{icon-font-path}@{icon-font-name}.eot?#iefix') format('embedded-opentype'),\n       url('@{icon-font-path}@{icon-font-name}.woff') format('woff'),\n       url('@{icon-font-path}@{icon-font-name}.ttf') format('truetype'),\n       url('@{icon-font-path}@{icon-font-name}.svg#@{icon-font-svg-id}') format('svg');\n}\n\n// Catchall baseclass\n.glyphicon {\n  position: relative;\n  top: 1px;\n  display: inline-block;\n  font-family: 'Glyphicons Halflings';\n  font-style: normal;\n  font-weight: normal;\n  line-height: 1;\n  -webkit-font-smoothing: antialiased;\n  -moz-osx-font-smoothing: grayscale;\n}\n\n// Individual icons\n.glyphicon-asterisk               { &:before { content: \"\\2a\"; } }\n.glyphicon-plus                   { &:before { content: \"\\2b\"; } }\n.glyphicon-euro,\n.glyphicon-eur                    { &:before { content: \"\\20ac\"; } }\n.glyphicon-minus                  { &:before { content: \"\\2212\"; } }\n.glyphicon-cloud                  { &:before { content: \"\\2601\"; } }\n.glyphicon-envelope               { &:before { content: \"\\2709\"; } }\n.glyphicon-pencil                 { &:before { content: \"\\270f\"; } }\n.glyphicon-glass                  { &:before { content: \"\\e001\"; } }\n.glyphicon-music                  { &:before { content: \"\\e002\"; } }\n.glyphicon-search                 { &:before { content: \"\\e003\"; } }\n.glyphicon-heart                  { &:before { content: \"\\e005\"; } }\n.glyphicon-star                   { &:before { content: \"\\e006\"; } }\n.glyphicon-star-empty             { &:before { content: \"\\e007\"; } }\n.glyphicon-user                   { &:before { content: \"\\e008\"; } }\n.glyphicon-film                   { &:before { content: \"\\e009\"; } }\n.glyphicon-th-large               { &:before { content: \"\\e010\"; } }\n.glyphicon-th                     { &:before { content: \"\\e011\"; } }\n.glyphicon-th-list                { &:before { content: \"\\e012\"; } }\n.glyphicon-ok                     { &:before { content: \"\\e013\"; } }\n.glyphicon-remove                 { &:before { content: \"\\e014\"; } }\n.glyphicon-zoom-in                { &:before { content: \"\\e015\"; } }\n.glyphicon-zoom-out               { &:before { content: \"\\e016\"; } }\n.glyphicon-off                    { &:before { content: \"\\e017\"; } }\n.glyphicon-signal                 { &:before { content: \"\\e018\"; } }\n.glyphicon-cog                    { &:before { content: \"\\e019\"; } }\n.glyphicon-trash                  { &:before { content: \"\\e020\"; } }\n.glyphicon-home                   { &:before { content: \"\\e021\"; } }\n.glyphicon-file                   { &:before { content: \"\\e022\"; } }\n.glyphicon-time                   { &:before { content: \"\\e023\"; } }\n.glyphicon-road                   { &:before { content: \"\\e024\"; } }\n.glyphicon-download-alt           { &:before { content: \"\\e025\"; } }\n.glyphicon-download               { &:before { content: \"\\e026\"; } }\n.glyphicon-upload                 { &:before { content: \"\\e027\"; } }\n.glyphicon-inbox                  { &:before { content: \"\\e028\"; } }\n.glyphicon-play-circle            { &:before { content: \"\\e029\"; } }\n.glyphicon-repeat                 { &:before { content: \"\\e030\"; } }\n.glyphicon-refresh                { &:before { content: \"\\e031\"; } }\n.glyphicon-list-alt               { &:before { content: \"\\e032\"; } }\n.glyphicon-lock                   { &:before { content: \"\\e033\"; } }\n.glyphicon-flag                   { &:before { content: \"\\e034\"; } }\n.glyphicon-headphones             { &:before { content: \"\\e035\"; } }\n.glyphicon-volume-off             { &:before { content: \"\\e036\"; } }\n.glyphicon-volume-down            { &:before { content: \"\\e037\"; } }\n.glyphicon-volume-up              { &:before { content: \"\\e038\"; } }\n.glyphicon-qrcode                 { &:before { content: \"\\e039\"; } }\n.glyphicon-barcode                { &:before { content: \"\\e040\"; } }\n.glyphicon-tag                    { &:before { content: \"\\e041\"; } }\n.glyphicon-tags                   { &:before { content: \"\\e042\"; } }\n.glyphicon-book                   { &:before { content: \"\\e043\"; } }\n.glyphicon-bookmark               { &:before { content: \"\\e044\"; } }\n.glyphicon-print                  { &:before { content: \"\\e045\"; } }\n.glyphicon-camera                 { &:before { content: \"\\e046\"; } }\n.glyphicon-font                   { &:before { content: \"\\e047\"; } }\n.glyphicon-bold                   { &:before { content: \"\\e048\"; } }\n.glyphicon-italic                 { &:before { content: \"\\e049\"; } }\n.glyphicon-text-height            { &:before { content: \"\\e050\"; } }\n.glyphicon-text-width             { &:before { content: \"\\e051\"; } }\n.glyphicon-align-left             { &:before { content: \"\\e052\"; } }\n.glyphicon-align-center           { &:before { content: \"\\e053\"; } }\n.glyphicon-align-right            { &:before { content: \"\\e054\"; } }\n.glyphicon-align-justify          { &:before { content: \"\\e055\"; } }\n.glyphicon-list                   { &:before { content: \"\\e056\"; } }\n.glyphicon-indent-left            { &:before { content: \"\\e057\"; } }\n.glyphicon-indent-right           { &:before { content: \"\\e058\"; } }\n.glyphicon-facetime-video         { &:before { content: \"\\e059\"; } }\n.glyphicon-picture                { &:before { content: \"\\e060\"; } }\n.glyphicon-map-marker             { &:before { content: \"\\e062\"; } }\n.glyphicon-adjust                 { &:before { content: \"\\e063\"; } }\n.glyphicon-tint                   { &:before { content: \"\\e064\"; } }\n.glyphicon-edit                   { &:before { content: \"\\e065\"; } }\n.glyphicon-share                  { &:before { content: \"\\e066\"; } }\n.glyphicon-check                  { &:before { content: \"\\e067\"; } }\n.glyphicon-move                   { &:before { content: \"\\e068\"; } }\n.glyphicon-step-backward          { &:before { content: \"\\e069\"; } }\n.glyphicon-fast-backward          { &:before { content: \"\\e070\"; } }\n.glyphicon-backward               { &:before { content: \"\\e071\"; } }\n.glyphicon-play                   { &:before { content: \"\\e072\"; } }\n.glyphicon-pause                  { &:before { content: \"\\e073\"; } }\n.glyphicon-stop                   { &:before { content: \"\\e074\"; } }\n.glyphicon-forward                { &:before { content: \"\\e075\"; } }\n.glyphicon-fast-forward           { &:before { content: \"\\e076\"; } }\n.glyphicon-step-forward           { &:before { content: \"\\e077\"; } }\n.glyphicon-eject                  { &:before { content: \"\\e078\"; } }\n.glyphicon-chevron-left           { &:before { content: \"\\e079\"; } }\n.glyphicon-chevron-right          { &:before { content: \"\\e080\"; } }\n.glyphicon-plus-sign              { &:before { content: \"\\e081\"; } }\n.glyphicon-minus-sign             { &:before { content: \"\\e082\"; } }\n.glyphicon-remove-sign            { &:before { content: \"\\e083\"; } }\n.glyphicon-ok-sign                { &:before { content: \"\\e084\"; } }\n.glyphicon-question-sign          { &:before { content: \"\\e085\"; } }\n.glyphicon-info-sign              { &:before { content: \"\\e086\"; } }\n.glyphicon-screenshot             { &:before { content: \"\\e087\"; } }\n.glyphicon-remove-circle          { &:before { content: \"\\e088\"; } }\n.glyphicon-ok-circle              { &:before { content: \"\\e089\"; } }\n.glyphicon-ban-circle             { &:before { content: \"\\e090\"; } }\n.glyphicon-arrow-left             { &:before { content: \"\\e091\"; } }\n.glyphicon-arrow-right            { &:before { content: \"\\e092\"; } }\n.glyphicon-arrow-up               { &:before { content: \"\\e093\"; } }\n.glyphicon-arrow-down             { &:before { content: \"\\e094\"; } }\n.glyphicon-share-alt              { &:before { content: \"\\e095\"; } }\n.glyphicon-resize-full            { &:before { content: \"\\e096\"; } }\n.glyphicon-resize-small           { &:before { content: \"\\e097\"; } }\n.glyphicon-exclamation-sign       { &:before { content: \"\\e101\"; } }\n.glyphicon-gift                   { &:before { content: \"\\e102\"; } }\n.glyphicon-leaf                   { &:before { content: \"\\e103\"; } }\n.glyphicon-fire                   { &:before { content: \"\\e104\"; } }\n.glyphicon-eye-open               { &:before { content: \"\\e105\"; } }\n.glyphicon-eye-close              { &:before { content: \"\\e106\"; } }\n.glyphicon-warning-sign           { &:before { content: \"\\e107\"; } }\n.glyphicon-plane                  { &:before { content: \"\\e108\"; } }\n.glyphicon-calendar               { &:before { content: \"\\e109\"; } }\n.glyphicon-random                 { &:before { content: \"\\e110\"; } }\n.glyphicon-comment                { &:before { content: \"\\e111\"; } }\n.glyphicon-magnet                 { &:before { content: \"\\e112\"; } }\n.glyphicon-chevron-up             { &:before { content: \"\\e113\"; } }\n.glyphicon-chevron-down           { &:before { content: \"\\e114\"; } }\n.glyphicon-retweet                { &:before { content: \"\\e115\"; } }\n.glyphicon-shopping-cart          { &:before { content: \"\\e116\"; } }\n.glyphicon-folder-close           { &:before { content: \"\\e117\"; } }\n.glyphicon-folder-open            { &:before { content: \"\\e118\"; } }\n.glyphicon-resize-vertical        { &:before { content: \"\\e119\"; } }\n.glyphicon-resize-horizontal      { &:before { content: \"\\e120\"; } }\n.glyphicon-hdd                    { &:before { content: \"\\e121\"; } }\n.glyphicon-bullhorn               { &:before { content: \"\\e122\"; } }\n.glyphicon-bell                   { &:before { content: \"\\e123\"; } }\n.glyphicon-certificate            { &:before { content: \"\\e124\"; } }\n.glyphicon-thumbs-up              { &:before { content: \"\\e125\"; } }\n.glyphicon-thumbs-down            { &:before { content: \"\\e126\"; } }\n.glyphicon-hand-right             { &:before { content: \"\\e127\"; } }\n.glyphicon-hand-left              { &:before { content: \"\\e128\"; } }\n.glyphicon-hand-up                { &:before { content: \"\\e129\"; } }\n.glyphicon-hand-down              { &:before { content: \"\\e130\"; } }\n.glyphicon-circle-arrow-right     { &:before { content: \"\\e131\"; } }\n.glyphicon-circle-arrow-left      { &:before { content: \"\\e132\"; } }\n.glyphicon-circle-arrow-up        { &:before { content: \"\\e133\"; } }\n.glyphicon-circle-arrow-down      { &:before { content: \"\\e134\"; } }\n.glyphicon-globe                  { &:before { content: \"\\e135\"; } }\n.glyphicon-wrench                 { &:before { content: \"\\e136\"; } }\n.glyphicon-tasks                  { &:before { content: \"\\e137\"; } }\n.glyphicon-filter                 { &:before { content: \"\\e138\"; } }\n.glyphicon-briefcase              { &:before { content: \"\\e139\"; } }\n.glyphicon-fullscreen             { &:before { content: \"\\e140\"; } }\n.glyphicon-dashboard              { &:before { content: \"\\e141\"; } }\n.glyphicon-paperclip              { &:before { content: \"\\e142\"; } }\n.glyphicon-heart-empty            { &:before { content: \"\\e143\"; } }\n.glyphicon-link                   { &:before { content: \"\\e144\"; } }\n.glyphicon-phone                  { &:before { content: \"\\e145\"; } }\n.glyphicon-pushpin                { &:before { content: \"\\e146\"; } }\n.glyphicon-usd                    { &:before { content: \"\\e148\"; } }\n.glyphicon-gbp                    { &:before { content: \"\\e149\"; } }\n.glyphicon-sort                   { &:before { content: \"\\e150\"; } }\n.glyphicon-sort-by-alphabet       { &:before { content: \"\\e151\"; } }\n.glyphicon-sort-by-alphabet-alt   { &:before { content: \"\\e152\"; } }\n.glyphicon-sort-by-order          { &:before { content: \"\\e153\"; } }\n.glyphicon-sort-by-order-alt      { &:before { content: \"\\e154\"; } }\n.glyphicon-sort-by-attributes     { &:before { content: \"\\e155\"; } }\n.glyphicon-sort-by-attributes-alt { &:before { content: \"\\e156\"; } }\n.glyphicon-unchecked              { &:before { content: \"\\e157\"; } }\n.glyphicon-expand                 { &:before { content: \"\\e158\"; } }\n.glyphicon-collapse-down          { &:before { content: \"\\e159\"; } }\n.glyphicon-collapse-up            { &:before { content: \"\\e160\"; } }\n.glyphicon-log-in                 { &:before { content: \"\\e161\"; } }\n.glyphicon-flash                  { &:before { content: \"\\e162\"; } }\n.glyphicon-log-out                { &:before { content: \"\\e163\"; } }\n.glyphicon-new-window             { &:before { content: \"\\e164\"; } }\n.glyphicon-record                 { &:before { content: \"\\e165\"; } }\n.glyphicon-save                   { &:before { content: \"\\e166\"; } }\n.glyphicon-open                   { &:before { content: \"\\e167\"; } }\n.glyphicon-saved                  { &:before { content: \"\\e168\"; } }\n.glyphicon-import                 { &:before { content: \"\\e169\"; } }\n.glyphicon-export                 { &:before { content: \"\\e170\"; } }\n.glyphicon-send                   { &:before { content: \"\\e171\"; } }\n.glyphicon-floppy-disk            { &:before { content: \"\\e172\"; } }\n.glyphicon-floppy-saved           { &:before { content: \"\\e173\"; } }\n.glyphicon-floppy-remove          { &:before { content: \"\\e174\"; } }\n.glyphicon-floppy-save            { &:before { content: \"\\e175\"; } }\n.glyphicon-floppy-open            { &:before { content: \"\\e176\"; } }\n.glyphicon-credit-card            { &:before { content: \"\\e177\"; } }\n.glyphicon-transfer               { &:before { content: \"\\e178\"; } }\n.glyphicon-cutlery                { &:before { content: \"\\e179\"; } }\n.glyphicon-header                 { &:before { content: \"\\e180\"; } }\n.glyphicon-compressed             { &:before { content: \"\\e181\"; } }\n.glyphicon-earphone               { &:before { content: \"\\e182\"; } }\n.glyphicon-phone-alt              { &:before { content: \"\\e183\"; } }\n.glyphicon-tower                  { &:before { content: \"\\e184\"; } }\n.glyphicon-stats                  { &:before { content: \"\\e185\"; } }\n.glyphicon-sd-video               { &:before { content: \"\\e186\"; } }\n.glyphicon-hd-video               { &:before { content: \"\\e187\"; } }\n.glyphicon-subtitles              { &:before { content: \"\\e188\"; } }\n.glyphicon-sound-stereo           { &:before { content: \"\\e189\"; } }\n.glyphicon-sound-dolby            { &:before { content: \"\\e190\"; } }\n.glyphicon-sound-5-1              { &:before { content: \"\\e191\"; } }\n.glyphicon-sound-6-1              { &:before { content: \"\\e192\"; } }\n.glyphicon-sound-7-1              { &:before { content: \"\\e193\"; } }\n.glyphicon-copyright-mark         { &:before { content: \"\\e194\"; } }\n.glyphicon-registration-mark      { &:before { content: \"\\e195\"; } }\n.glyphicon-cloud-download         { &:before { content: \"\\e197\"; } }\n.glyphicon-cloud-upload           { &:before { content: \"\\e198\"; } }\n.glyphicon-tree-conifer           { &:before { content: \"\\e199\"; } }\n.glyphicon-tree-deciduous         { &:before { content: \"\\e200\"; } }\n"
  },
  {
    "path": "client/less/lib/bootstrap/grid.less",
    "content": "//\n// Grid system\n// --------------------------------------------------\n\n\n// Container widths\n//\n// Set the container width, and override it for fixed navbars in media queries.\n\n.container {\n  .container-fixed();\n\n  @media (min-width: @screen-sm-min) {\n    width: @container-sm;\n  }\n  @media (min-width: @screen-md-min) {\n    width: @container-md;\n  }\n  @media (min-width: @screen-lg-min) {\n    width: @container-lg;\n  }\n}\n\n\n// Fluid container\n//\n// Utilizes the mixin meant for fixed width containers, but without any defined\n// width for fluid, full width layouts.\n\n.container-fluid {\n  .container-fixed();\n}\n\n\n// Row\n//\n// Rows contain and clear the floats of your columns.\n\n.row {\n  .make-row();\n}\n\n\n// Columns\n//\n// Common styles for small and large grid columns\n\n.make-grid-columns();\n\n\n// Extra small grid\n//\n// Columns, offsets, pushes, and pulls for extra small devices like\n// smartphones.\n\n.make-grid(xs);\n\n\n// Small grid\n//\n// Columns, offsets, pushes, and pulls for the small device range, from phones\n// to tablets.\n\n@media (min-width: @screen-sm-min) {\n  .make-grid(sm);\n}\n\n\n// Medium grid\n//\n// Columns, offsets, pushes, and pulls for the desktop device range.\n\n@media (min-width: @screen-md-min) {\n  .make-grid(md);\n}\n\n\n// Large grid\n//\n// Columns, offsets, pushes, and pulls for the large desktop device range.\n\n@media (min-width: @screen-lg-min) {\n  .make-grid(lg);\n}\n"
  },
  {
    "path": "client/less/lib/bootstrap/input-groups.less",
    "content": "//\n// Input groups\n// --------------------------------------------------\n\n// Base styles\n// -------------------------\n.input-group {\n  position: relative; // For dropdowns\n  display: table;\n  border-collapse: separate; // prevent input groups from inheriting border styles from table cells when placed within a table\n\n  // Undo padding and float of grid classes\n  &[class*=\"col-\"] {\n    float: none;\n    padding-left: 0;\n    padding-right: 0;\n  }\n\n  .form-control {\n    // Ensure that the input is always above the *appended* addon button for\n    // proper border colors.\n    position: relative;\n    z-index: 2;\n\n    // IE9 fubars the placeholder attribute in text inputs and the arrows on\n    // select elements in input groups. To fix it, we float the input. Details:\n    // https://github.com/twbs/bootstrap/issues/11561#issuecomment-28936855\n    float: left;\n\n    width: 100%;\n    margin-bottom: 0;\n  }\n}\n\n// Sizing options\n//\n// Remix the default form control sizing classes into new ones for easier\n// manipulation.\n\n.input-group-lg > .form-control,\n.input-group-lg > .input-group-addon,\n.input-group-lg > .input-group-btn > .btn {\n  .input-lg();\n}\n.input-group-sm > .form-control,\n.input-group-sm > .input-group-addon,\n.input-group-sm > .input-group-btn > .btn {\n  .input-sm();\n}\n\n\n// Display as table-cell\n// -------------------------\n.input-group-addon,\n.input-group-btn,\n.input-group .form-control {\n  display: table-cell;\n\n  &:not(:first-child):not(:last-child) {\n    border-radius: 0;\n  }\n}\n// Addon and addon wrapper for buttons\n.input-group-addon,\n.input-group-btn {\n  width: 1%;\n  white-space: nowrap;\n  vertical-align: middle; // Match the inputs\n}\n\n// Text input groups\n// -------------------------\n.input-group-addon {\n  padding: @padding-base-vertical @padding-base-horizontal;\n  font-size: @font-size-base;\n  font-weight: normal;\n  line-height: 1;\n  color: @input-color;\n  text-align: center;\n  background-color: @input-group-addon-bg;\n  border: 1px solid @input-group-addon-border-color;\n  border-radius: @border-radius-base;\n\n  // Sizing\n  &.input-sm {\n    padding: @padding-small-vertical @padding-small-horizontal;\n    font-size: @font-size-small;\n    border-radius: @border-radius-small;\n  }\n  &.input-lg {\n    padding: @padding-large-vertical @padding-large-horizontal;\n    font-size: @font-size-large;\n    border-radius: @border-radius-large;\n  }\n\n  // Nuke default margins from checkboxes and radios to vertically center within.\n  input[type=\"radio\"],\n  input[type=\"checkbox\"] {\n    margin-top: 0;\n  }\n}\n\n// Reset rounded corners\n.input-group .form-control:first-child,\n.input-group-addon:first-child,\n.input-group-btn:first-child > .btn,\n.input-group-btn:first-child > .btn-group > .btn,\n.input-group-btn:first-child > .dropdown-toggle,\n.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle),\n.input-group-btn:last-child > .btn-group:not(:last-child) > .btn {\n  .border-right-radius(0);\n}\n.input-group-addon:first-child {\n  border-right: 0;\n}\n.input-group .form-control:last-child,\n.input-group-addon:last-child,\n.input-group-btn:last-child > .btn,\n.input-group-btn:last-child > .btn-group > .btn,\n.input-group-btn:last-child > .dropdown-toggle,\n.input-group-btn:first-child > .btn:not(:first-child),\n.input-group-btn:first-child > .btn-group:not(:first-child) > .btn {\n  .border-left-radius(0);\n}\n.input-group-addon:last-child {\n  border-left: 0;\n}\n\n// Button input groups\n// -------------------------\n.input-group-btn {\n  position: relative;\n  // Jankily prevent input button groups from wrapping with `white-space` and\n  // `font-size` in combination with `inline-block` on buttons.\n  font-size: 0;\n  white-space: nowrap;\n\n  // Negative margin for spacing, position for bringing hovered/focused/actived\n  // element above the siblings.\n  > .btn {\n    position: relative;\n    + .btn {\n      margin-left: -1px;\n    }\n    // Bring the \"active\" button to the front\n    &:hover,\n    &:focus,\n    &:active {\n      z-index: 2;\n    }\n  }\n\n  // Negative margin to only have a 1px border between the two\n  &:first-child {\n    > .btn,\n    > .btn-group {\n      margin-right: -1px;\n    }\n  }\n  &:last-child {\n    > .btn,\n    > .btn-group {\n      margin-left: -1px;\n    }\n  }\n}\n"
  },
  {
    "path": "client/less/lib/bootstrap/jumbotron.less",
    "content": "//\n// Jumbotron\n// --------------------------------------------------\n\n\n.jumbotron {\n  padding: @jumbotron-padding (@jumbotron-padding / 2);\n  margin-bottom: @jumbotron-padding;\n  color: @jumbotron-color;\n  background-color: @jumbotron-bg;\n\n  h1,\n  .h1 {\n    color: @jumbotron-heading-color;\n  }\n  p {\n    margin-bottom: (@jumbotron-padding / 2);\n    font-size: @jumbotron-font-size;\n    font-weight: 200;\n  }\n\n  > hr {\n    border-top-color: darken(@jumbotron-bg, 10%);\n  }\n\n  .container &,\n  .container-fluid & {\n    border-radius: @border-radius-large; // Only round corners at higher resolutions if contained in a container\n  }\n\n  .container {\n    max-width: 100%;\n  }\n\n  @media screen and (min-width: @screen-sm-min) {\n    padding: (@jumbotron-padding * 1.6) 0;\n\n    .container & {\n      padding-left:  (@jumbotron-padding * 2);\n      padding-right: (@jumbotron-padding * 2);\n    }\n\n    h1,\n    .h1 {\n      font-size: (@font-size-base * 4.5);\n    }\n  }\n}\n"
  },
  {
    "path": "client/less/lib/bootstrap/labels.less",
    "content": "//\n// Labels\n// --------------------------------------------------\n\n.label {\n  display: inline;\n  padding: .2em .6em .3em;\n  font-size: 75%;\n  font-weight: bold;\n  line-height: 1;\n  color: @label-color;\n  text-align: center;\n  white-space: nowrap;\n  vertical-align: baseline;\n  border-radius: .25em;\n\n  // Add hover effects, but only for links\n  a& {\n    &:hover,\n    &:focus {\n      color: @label-link-hover-color;\n      text-decoration: none;\n      cursor: pointer;\n    }\n  }\n\n  // Empty labels collapse automatically (not available in IE8)\n  &:empty {\n    display: none;\n  }\n\n  // Quick fix for labels in buttons\n  .btn & {\n    position: relative;\n    top: -1px;\n  }\n}\n\n// Colors\n// Contextual variations (linked labels get darker on :hover)\n\n.label-default {\n  .label-variant(@label-default-bg);\n}\n\n.label-primary {\n  .label-variant(@label-primary-bg);\n}\n\n.label-success {\n  .label-variant(@label-success-bg);\n}\n\n.label-info {\n  .label-variant(@label-info-bg);\n}\n\n.label-warning {\n  .label-variant(@label-warning-bg);\n}\n\n.label-danger {\n  .label-variant(@label-danger-bg);\n}\n"
  },
  {
    "path": "client/less/lib/bootstrap/list-group.less",
    "content": "//\n// List groups\n// --------------------------------------------------\n\n\n// Base class\n//\n// Easily usable on <ul>, <ol>, or <div>.\n\n.list-group {\n  // No need to set list-style: none; since .list-group-item is block level\n  margin-bottom: 20px;\n  padding-left: 0; // reset padding because ul and ol\n}\n\n\n// Individual list items\n//\n// Use on `li`s or `div`s within the `.list-group` parent.\n\n.list-group-item {\n  position: relative;\n  display: block;\n  padding: 10px 15px;\n  // Place the border on the list items and negative margin up for better styling\n  margin-bottom: -1px;\n  background-color: @list-group-bg;\n  border: 1px solid @list-group-border;\n\n  // Round the first and last items\n  &:first-child {\n    .border-top-radius(@list-group-border-radius);\n  }\n  &:last-child {\n    margin-bottom: 0;\n    .border-bottom-radius(@list-group-border-radius);\n  }\n\n  // Align badges within list items\n  > .badge {\n    float: right;\n  }\n  > .badge + .badge {\n    margin-right: 5px;\n  }\n}\n\n\n// Linked list items\n//\n// Use anchor elements instead of `li`s or `div`s to create linked list items.\n// Includes an extra `.active` modifier class for showing selected items.\n\na.list-group-item {\n  color: @list-group-link-color;\n\n  .list-group-item-heading {\n    color: @list-group-link-heading-color;\n  }\n\n  // Hover state\n  &:hover,\n  &:focus {\n    text-decoration: none;\n    color: @list-group-link-hover-color;\n    background-color: @list-group-hover-bg;\n  }\n}\n\n.list-group-item {\n  // Disabled state\n  &.disabled,\n  &.disabled:hover,\n  &.disabled:focus {\n    background-color: @list-group-disabled-bg;\n    color: @list-group-disabled-color;\n    cursor: @cursor-disabled;\n\n    // Force color to inherit for custom content\n    .list-group-item-heading {\n      color: inherit;\n    }\n    .list-group-item-text {\n      color: @list-group-disabled-text-color;\n    }\n  }\n\n  // Active class on item itself, not parent\n  &.active,\n  &.active:hover,\n  &.active:focus {\n    z-index: 2; // Place active items above their siblings for proper border styling\n    color: @list-group-active-color;\n    background-color: @list-group-active-bg;\n    border-color: @list-group-active-border;\n\n    // Force color to inherit for custom content\n    .list-group-item-heading,\n    .list-group-item-heading > small,\n    .list-group-item-heading > .small {\n      color: inherit;\n    }\n    .list-group-item-text {\n      color: @list-group-active-text-color;\n    }\n  }\n}\n\n\n// Contextual variants\n//\n// Add modifier classes to change text and background color on individual items.\n// Organizationally, this must come after the `:hover` states.\n\n.list-group-item-variant(success; @state-success-bg; @state-success-text);\n.list-group-item-variant(info; @state-info-bg; @state-info-text);\n.list-group-item-variant(warning; @state-warning-bg; @state-warning-text);\n.list-group-item-variant(danger; @state-danger-bg; @state-danger-text);\n\n\n// Custom content options\n//\n// Extra classes for creating well-formatted content within `.list-group-item`s.\n\n.list-group-item-heading {\n  margin-top: 0;\n  margin-bottom: 5px;\n}\n.list-group-item-text {\n  margin-bottom: 0;\n  line-height: 1.3;\n}\n"
  },
  {
    "path": "client/less/lib/bootstrap/media.less",
    "content": ".media {\n  // Proper spacing between instances of .media\n  margin-top: 15px;\n\n  &:first-child {\n    margin-top: 0;\n  }\n}\n\n.media-right,\n.media > .pull-right {\n  padding-left: 10px;\n}\n\n.media-left,\n.media > .pull-left {\n  padding-right: 10px;\n}\n\n.media-left,\n.media-right,\n.media-body {\n  display: table-cell;\n  vertical-align: top;\n}\n\n.media-middle {\n  vertical-align: middle;\n}\n\n.media-bottom {\n  vertical-align: bottom;\n}\n\n// Reset margins on headings for tighter default spacing\n.media-heading {\n  margin-top: 0;\n  margin-bottom: 5px;\n}\n\n// Media list variation\n//\n// Undo default ul/ol styles\n.media-list {\n  padding-left: 0;\n  list-style: none;\n}\n"
  },
  {
    "path": "client/less/lib/bootstrap/mixins/alerts.less",
    "content": "// Alerts\n\n.alert-variant(@background; @border; @text-color) {\n  background-color: @background;\n  border-color: @border;\n  color: @text-color;\n\n  hr {\n    border-top-color: darken(@border, 5%);\n  }\n  .alert-link {\n    color: darken(@text-color, 10%);\n  }\n}\n"
  },
  {
    "path": "client/less/lib/bootstrap/mixins/background-variant.less",
    "content": "// Contextual backgrounds\n\n.bg-variant(@color) {\n  background-color: @color;\n  a&:hover {\n    background-color: darken(@color, 10%);\n  }\n}\n"
  },
  {
    "path": "client/less/lib/bootstrap/mixins/border-radius.less",
    "content": "// Single side border-radius\n\n.border-top-radius(@radius) {\n  border-top-right-radius: @radius;\n   border-top-left-radius: @radius;\n}\n.border-right-radius(@radius) {\n  border-bottom-right-radius: @radius;\n     border-top-right-radius: @radius;\n}\n.border-bottom-radius(@radius) {\n  border-bottom-right-radius: @radius;\n   border-bottom-left-radius: @radius;\n}\n.border-left-radius(@radius) {\n  border-bottom-left-radius: @radius;\n     border-top-left-radius: @radius;\n}\n"
  },
  {
    "path": "client/less/lib/bootstrap/mixins/buttons.less",
    "content": "// Button variants\n//\n// Easily pump out default styles, as well as :hover, :focus, :active,\n// and disabled options for all buttons\n\n.button-variant(@color; @background; @border) {\n  color: @color;\n  background-color: @background;\n  border-color: @border;\n\n  &:hover,\n  &:focus,\n  &.focus,\n  &:active,\n  &.active,\n  .open > .dropdown-toggle& {\n    color: @gray-lighter;\n    background-color: @background;\n        border-color: darken(@border, 12%);\n  }\n  &:active,\n  &.active,\n  .open > .dropdown-toggle& {\n    background-image: none;\n  }\n  &.disabled,\n  &[disabled],\n  fieldset[disabled] & {\n    &,\n    &:hover,\n    &:focus,\n    &.focus,\n    &:active,\n    &.active {\n      background-color: @background;\n          border-color: @border;\n    }\n  }\n\n  .badge {\n    color: @background;\n    background-color: @color;\n  }\n}\n\n// Button sizes\n.button-size(@padding-vertical; @padding-horizontal; @font-size; @line-height; @border-radius) {\n  padding: @padding-vertical @padding-horizontal;\n  font-size: @font-size;\n  line-height: @line-height;\n  border-radius: @border-radius;\n}\n"
  },
  {
    "path": "client/less/lib/bootstrap/mixins/center-block.less",
    "content": "// Center-align a block level element\n\n.center-block() {\n  display: block;\n  margin-left: auto;\n  margin-right: auto;\n}\n"
  },
  {
    "path": "client/less/lib/bootstrap/mixins/clearfix.less",
    "content": "// Clearfix\n//\n// For modern browsers\n// 1. The space content is one way to avoid an Opera bug when the\n//    contenteditable attribute is included anywhere else in the document.\n//    Otherwise it causes space to appear at the top and bottom of elements\n//    that are clearfixed.\n// 2. The use of `table` rather than `block` is only necessary if using\n//    `:before` to contain the top-margins of child elements.\n//\n// Source: http://nicolasgallagher.com/micro-clearfix-hack/\n\n.clearfix() {\n  &:before,\n  &:after {\n    content: \" \"; // 1\n    display: table; // 2\n  }\n  &:after {\n    clear: both;\n  }\n}\n"
  },
  {
    "path": "client/less/lib/bootstrap/mixins/forms.less",
    "content": "// Form validation states\n//\n// Used in forms.less to generate the form validation CSS for warnings, errors,\n// and successes.\n\n.form-control-validation(@text-color: #555; @border-color: #ccc; @background-color: #f5f5f5) {\n  // Color the label and help text\n  .help-block,\n  .control-label,\n  .radio,\n  .checkbox,\n  .radio-inline,\n  .checkbox-inline,\n  &.radio label,\n  &.checkbox label,\n  &.radio-inline label,\n  &.checkbox-inline label  {\n    color: @text-color;\n  }\n  // Set the border and box shadow on specific inputs to match\n  .form-control {\n    border-color: @border-color;\n    .box-shadow(inset 0 1px 1px rgba(0,0,0,.075)); // Redeclare so transitions work\n    &:focus {\n      border-color: darken(@border-color, 10%);\n      @shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 6px lighten(@border-color, 20%);\n      .box-shadow(@shadow);\n    }\n  }\n  // Set validation states also for addons\n  .input-group-addon {\n    color: @text-color;\n    border-color: @border-color;\n    background-color: @background-color;\n  }\n  // Optional feedback icon\n  .form-control-feedback {\n    color: @text-color;\n  }\n}\n\n\n// Form control focus state\n//\n// Generate a customized focus state and for any input with the specified color,\n// which defaults to the `@input-border-focus` variable.\n//\n// We highly encourage you to not customize the default value, but instead use\n// this to tweak colors on an as-needed basis. This aesthetic change is based on\n// WebKit's default styles, but applicable to a wider range of browsers. Its\n// usability and accessibility should be taken into account with any change.\n//\n// Example usage: change the default blue border and shadow to white for better\n// contrast against a dark gray background.\n.form-control-focus(@color: @input-border-focus) {\n  @color-rgba: rgba(red(@color), green(@color), blue(@color), .6);\n  &:focus {\n    border-color: @color;\n    outline: 0;\n    .box-shadow(~\"inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px @{color-rgba}\");\n  }\n}\n\n// Form control sizing\n//\n// Relative text size, padding, and border-radii changes for form controls. For\n// horizontal sizing, wrap controls in the predefined grid classes. `<select>`\n// element gets special love because it's special, and that's a fact!\n.input-size(@input-height; @padding-vertical; @padding-horizontal; @font-size; @line-height; @border-radius) {\n  height: @input-height;\n  padding: @padding-vertical @padding-horizontal;\n  font-size: @font-size;\n  line-height: @line-height;\n  border-radius: @border-radius;\n\n  select& {\n    height: @input-height;\n    line-height: @input-height;\n  }\n\n  textarea&,\n  select[multiple]& {\n    height: auto;\n  }\n}\n"
  },
  {
    "path": "client/less/lib/bootstrap/mixins/gradients.less",
    "content": "// Gradients\n\n#gradient {\n\n  // Horizontal gradient, from left to right\n  //\n  // Creates two color stops, start and end, by specifying a color and position for each color stop.\n  // Color stops are not available in IE9 and below.\n  .horizontal(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {\n    background-image: -webkit-linear-gradient(left, @start-color @start-percent, @end-color @end-percent); // Safari 5.1-6, Chrome 10+\n    background-image: -o-linear-gradient(left, @start-color @start-percent, @end-color @end-percent); // Opera 12\n    background-image: linear-gradient(to right, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n    background-repeat: repeat-x;\n    filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)\",argb(@start-color),argb(@end-color))); // IE9 and down\n  }\n\n  // Vertical gradient, from top to bottom\n  //\n  // Creates two color stops, start and end, by specifying a color and position for each color stop.\n  // Color stops are not available in IE9 and below.\n  .vertical(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {\n    background-image: -webkit-linear-gradient(top, @start-color @start-percent, @end-color @end-percent);  // Safari 5.1-6, Chrome 10+\n    background-image: -o-linear-gradient(top, @start-color @start-percent, @end-color @end-percent);  // Opera 12\n    background-image: linear-gradient(to bottom, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n    background-repeat: repeat-x;\n    filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)\",argb(@start-color),argb(@end-color))); // IE9 and down\n  }\n\n  .directional(@start-color: #555; @end-color: #333; @deg: 45deg) {\n    background-repeat: repeat-x;\n    background-image: -webkit-linear-gradient(@deg, @start-color, @end-color); // Safari 5.1-6, Chrome 10+\n    background-image: -o-linear-gradient(@deg, @start-color, @end-color); // Opera 12\n    background-image: linear-gradient(@deg, @start-color, @end-color); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n  }\n  .horizontal-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {\n    background-image: -webkit-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color);\n    background-image: -o-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color);\n    background-image: linear-gradient(to right, @start-color, @mid-color @color-stop, @end-color);\n    background-repeat: no-repeat;\n    filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)\",argb(@start-color),argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback\n  }\n  .vertical-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {\n    background-image: -webkit-linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n    background-image: -o-linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n    background-image: linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n    background-repeat: no-repeat;\n    filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)\",argb(@start-color),argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback\n  }\n  .radial(@inner-color: #555; @outer-color: #333) {\n    background-image: -webkit-radial-gradient(circle, @inner-color, @outer-color);\n    background-image: radial-gradient(circle, @inner-color, @outer-color);\n    background-repeat: no-repeat;\n  }\n  .striped(@color: rgba(255,255,255,.15); @angle: 45deg) {\n    background-image: -webkit-linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n    background-image: -o-linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n    background-image: linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n  }\n}\n"
  },
  {
    "path": "client/less/lib/bootstrap/mixins/grid-framework.less",
    "content": "// Framework grid generation\n//\n// Used only by Bootstrap to generate the correct number of grid classes given\n// any value of `@grid-columns`.\n\n.make-grid-columns() {\n  // Common styles for all sizes of grid columns, widths 1-12\n  .col(@index) when (@index = 1) { // initial\n    @item: ~\".col-xs-@{index}, .col-sm-@{index}, .col-md-@{index}, .col-lg-@{index}\";\n    .col((@index + 1), @item);\n  }\n  .col(@index, @list) when (@index =< @grid-columns) { // general; \"=<\" isn't a typo\n    @item: ~\".col-xs-@{index}, .col-sm-@{index}, .col-md-@{index}, .col-lg-@{index}\";\n    .col((@index + 1), ~\"@{list}, @{item}\");\n  }\n  .col(@index, @list) when (@index > @grid-columns) { // terminal\n    @{list} {\n      position: relative;\n      // Prevent columns from collapsing when empty\n      min-height: 1px;\n      // Inner gutter via padding\n      padding-left:  (@grid-gutter-width / 2);\n      padding-right: (@grid-gutter-width / 2);\n    }\n  }\n  .col(1); // kickstart it\n}\n\n.float-grid-columns(@class) {\n  .col(@index) when (@index = 1) { // initial\n    @item: ~\".col-@{class}-@{index}\";\n    .col((@index + 1), @item);\n  }\n  .col(@index, @list) when (@index =< @grid-columns) { // general\n    @item: ~\".col-@{class}-@{index}\";\n    .col((@index + 1), ~\"@{list}, @{item}\");\n  }\n  .col(@index, @list) when (@index > @grid-columns) { // terminal\n    @{list} {\n      float: left;\n    }\n  }\n  .col(1); // kickstart it\n}\n\n.calc-grid-column(@index, @class, @type) when (@type = width) and (@index > 0) {\n  .col-@{class}-@{index} {\n    width: percentage((@index / @grid-columns));\n  }\n}\n.calc-grid-column(@index, @class, @type) when (@type = push) and (@index > 0) {\n  .col-@{class}-push-@{index} {\n    left: percentage((@index / @grid-columns));\n  }\n}\n.calc-grid-column(@index, @class, @type) when (@type = push) and (@index = 0) {\n  .col-@{class}-push-0 {\n    left: auto;\n  }\n}\n.calc-grid-column(@index, @class, @type) when (@type = pull) and (@index > 0) {\n  .col-@{class}-pull-@{index} {\n    right: percentage((@index / @grid-columns));\n  }\n}\n.calc-grid-column(@index, @class, @type) when (@type = pull) and (@index = 0) {\n  .col-@{class}-pull-0 {\n    right: auto;\n  }\n}\n.calc-grid-column(@index, @class, @type) when (@type = offset) {\n  .col-@{class}-offset-@{index} {\n    margin-left: percentage((@index / @grid-columns));\n  }\n}\n\n// Basic looping in LESS\n.loop-grid-columns(@index, @class, @type) when (@index >= 0) {\n  .calc-grid-column(@index, @class, @type);\n  // next iteration\n  .loop-grid-columns((@index - 1), @class, @type);\n}\n\n// Create grid for specific class\n.make-grid(@class) {\n  .float-grid-columns(@class);\n  .loop-grid-columns(@grid-columns, @class, width);\n  .loop-grid-columns(@grid-columns, @class, pull);\n  .loop-grid-columns(@grid-columns, @class, push);\n  .loop-grid-columns(@grid-columns, @class, offset);\n}\n"
  },
  {
    "path": "client/less/lib/bootstrap/mixins/grid.less",
    "content": "// Grid system\n//\n// Generate semantic grid columns with these mixins.\n\n// Centered container element\n.container-fixed(@gutter: @grid-gutter-width) {\n  margin-right: auto;\n  margin-left: auto;\n  padding-left:  (@gutter / 2);\n  padding-right: (@gutter / 2);\n  &:extend(.clearfix all);\n}\n\n// Creates a wrapper for a series of columns\n.make-row(@gutter: @grid-gutter-width) {\n  margin-left:  (@gutter / -2);\n  margin-right: (@gutter / -2);\n  &:extend(.clearfix all);\n}\n\n// Generate the extra small columns\n.make-xs-column(@columns; @gutter: @grid-gutter-width) {\n  position: relative;\n  float: left;\n  width: percentage((@columns / @grid-columns));\n  min-height: 1px;\n  padding-left:  (@gutter / 2);\n  padding-right: (@gutter / 2);\n}\n.make-xs-column-offset(@columns) {\n  margin-left: percentage((@columns / @grid-columns));\n}\n.make-xs-column-push(@columns) {\n  left: percentage((@columns / @grid-columns));\n}\n.make-xs-column-pull(@columns) {\n  right: percentage((@columns / @grid-columns));\n}\n\n// Generate the small columns\n.make-sm-column(@columns; @gutter: @grid-gutter-width) {\n  position: relative;\n  min-height: 1px;\n  padding-left:  (@gutter / 2);\n  padding-right: (@gutter / 2);\n\n  @media (min-width: @screen-sm-min) {\n    float: left;\n    width: percentage((@columns / @grid-columns));\n  }\n}\n.make-sm-column-offset(@columns) {\n  @media (min-width: @screen-sm-min) {\n    margin-left: percentage((@columns / @grid-columns));\n  }\n}\n.make-sm-column-push(@columns) {\n  @media (min-width: @screen-sm-min) {\n    left: percentage((@columns / @grid-columns));\n  }\n}\n.make-sm-column-pull(@columns) {\n  @media (min-width: @screen-sm-min) {\n    right: percentage((@columns / @grid-columns));\n  }\n}\n\n// Generate the medium columns\n.make-md-column(@columns; @gutter: @grid-gutter-width) {\n  position: relative;\n  min-height: 1px;\n  padding-left:  (@gutter / 2);\n  padding-right: (@gutter / 2);\n\n  @media (min-width: @screen-md-min) {\n    float: left;\n    width: percentage((@columns / @grid-columns));\n  }\n}\n.make-md-column-offset(@columns) {\n  @media (min-width: @screen-md-min) {\n    margin-left: percentage((@columns / @grid-columns));\n  }\n}\n.make-md-column-push(@columns) {\n  @media (min-width: @screen-md-min) {\n    left: percentage((@columns / @grid-columns));\n  }\n}\n.make-md-column-pull(@columns) {\n  @media (min-width: @screen-md-min) {\n    right: percentage((@columns / @grid-columns));\n  }\n}\n\n// Generate the large columns\n.make-lg-column(@columns; @gutter: @grid-gutter-width) {\n  position: relative;\n  min-height: 1px;\n  padding-left:  (@gutter / 2);\n  padding-right: (@gutter / 2);\n\n  @media (min-width: @screen-lg-min) {\n    float: left;\n    width: percentage((@columns / @grid-columns));\n  }\n}\n.make-lg-column-offset(@columns) {\n  @media (min-width: @screen-lg-min) {\n    margin-left: percentage((@columns / @grid-columns));\n  }\n}\n.make-lg-column-push(@columns) {\n  @media (min-width: @screen-lg-min) {\n    left: percentage((@columns / @grid-columns));\n  }\n}\n.make-lg-column-pull(@columns) {\n  @media (min-width: @screen-lg-min) {\n    right: percentage((@columns / @grid-columns));\n  }\n}\n"
  },
  {
    "path": "client/less/lib/bootstrap/mixins/hide-text.less",
    "content": "// CSS image replacement\n//\n// Heads up! v3 launched with with only `.hide-text()`, but per our pattern for\n// mixins being reused as classes with the same name, this doesn't hold up. As\n// of v3.0.1 we have added `.text-hide()` and deprecated `.hide-text()`.\n//\n// Source: https://github.com/h5bp/html5-boilerplate/commit/aa0396eae757\n\n// Deprecated as of v3.0.1 (will be removed in v4)\n.hide-text() {\n  font: ~\"0/0\" a;\n  color: transparent;\n  text-shadow: none;\n  background-color: transparent;\n  border: 0;\n}\n\n// New mixin to use as of v3.0.1\n.text-hide() {\n  .hide-text();\n}\n"
  },
  {
    "path": "client/less/lib/bootstrap/mixins/image.less",
    "content": "// Image Mixins\n// - Responsive image\n// - Retina image\n\n\n// Responsive image\n//\n// Keep images from scaling beyond the width of their parents.\n.img-responsive(@display: block) {\n  display: @display;\n  max-width: 100%; // Part 1: Set a maximum relative to the parent\n  height: auto; // Part 2: Scale the height according to the width, otherwise you get stretching\n}\n\n\n// Retina image\n//\n// Short retina mixin for setting background-image and -size. Note that the\n// spelling of `min--moz-device-pixel-ratio` is intentional.\n.img-retina(@file-1x; @file-2x; @width-1x; @height-1x) {\n  background-image: url(\"@{file-1x}\");\n\n  @media\n  only screen and (-webkit-min-device-pixel-ratio: 2),\n  only screen and (   min--moz-device-pixel-ratio: 2),\n  only screen and (     -o-min-device-pixel-ratio: 2/1),\n  only screen and (        min-device-pixel-ratio: 2),\n  only screen and (                min-resolution: 192dpi),\n  only screen and (                min-resolution: 2dppx) {\n    background-image: url(\"@{file-2x}\");\n    background-size: @width-1x @height-1x;\n  }\n}\n"
  },
  {
    "path": "client/less/lib/bootstrap/mixins/labels.less",
    "content": "// Labels\n\n.label-variant(@color) {\n  background-color: @color;\n\n  &[href] {\n    &:hover,\n    &:focus {\n      background-color: darken(@color, 10%);\n    }\n  }\n}\n"
  },
  {
    "path": "client/less/lib/bootstrap/mixins/list-group.less",
    "content": "// List Groups\n\n.list-group-item-variant(@state; @background; @color) {\n  .list-group-item-@{state} {\n    color: @color;\n    background-color: @background;\n\n    a& {\n      color: @color;\n\n      .list-group-item-heading {\n        color: inherit;\n      }\n\n      &:hover,\n      &:focus {\n        color: @color;\n        background-color: darken(@background, 5%);\n      }\n      &.active,\n      &.active:hover,\n      &.active:focus {\n        color: #fff;\n        background-color: @color;\n        border-color: @color;\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "client/less/lib/bootstrap/mixins/nav-divider.less",
    "content": "// Horizontal dividers\n//\n// Dividers (basically an hr) within dropdowns and nav lists\n\n.nav-divider(@color: #e5e5e5) {\n  height: 1px;\n  margin: ((@line-height-computed / 2) - 1) 0;\n  overflow: hidden;\n  background-color: @color;\n}\n"
  },
  {
    "path": "client/less/lib/bootstrap/mixins/nav-vertical-align.less",
    "content": "// Navbar vertical align\n//\n// Vertically center elements in the navbar.\n// Example: an element has a height of 30px, so write out `.navbar-vertical-align(30px);` to calculate the appropriate top margin.\n\n.navbar-vertical-align(@element-height) {\n  margin-top: ((@navbar-height - @element-height) / 2);\n  margin-bottom: ((@navbar-height - @element-height) / 2);\n}\n"
  },
  {
    "path": "client/less/lib/bootstrap/mixins/opacity.less",
    "content": "// Opacity\n\n.opacity(@opacity) {\n  opacity: @opacity;\n  // IE8 filter\n  @opacity-ie: (@opacity * 100);\n  filter: ~\"alpha(opacity=@{opacity-ie})\";\n}\n"
  },
  {
    "path": "client/less/lib/bootstrap/mixins/pagination.less",
    "content": "// Pagination\n\n.pagination-size(@padding-vertical; @padding-horizontal; @font-size; @border-radius) {\n  > li {\n    > a,\n    > span {\n      padding: @padding-vertical @padding-horizontal;\n      font-size: @font-size;\n    }\n    &:first-child {\n      > a,\n      > span {\n        .border-left-radius(@border-radius);\n      }\n    }\n    &:last-child {\n      > a,\n      > span {\n        .border-right-radius(@border-radius);\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "client/less/lib/bootstrap/mixins/panels.less",
    "content": "// Panels\n\n.panel-variant(@border; @heading-text-color; @heading-bg-color; @heading-border) {\n  border-color: @border;\n\n  & > .panel-heading {\n    color: @heading-text-color;\n    background-color: @heading-bg-color;\n    border-color: @heading-border;\n\n    + .panel-collapse > .panel-body {\n      border-top-color: @border;\n    }\n    .badge {\n      color: @heading-bg-color;\n      background-color: @heading-text-color;\n    }\n  }\n  & > .panel-footer {\n    + .panel-collapse > .panel-body {\n      border-bottom-color: @border;\n    }\n  }\n}\n"
  },
  {
    "path": "client/less/lib/bootstrap/mixins/progress-bar.less",
    "content": "// Progress bars\n\n.progress-bar-variant(@color) {\n  background-color: @color;\n\n  // Deprecated parent class requirement as of v3.2.0\n  .progress-striped & {\n    #gradient > .striped();\n  }\n}\n"
  },
  {
    "path": "client/less/lib/bootstrap/mixins/reset-filter.less",
    "content": "// Reset filters for IE\n//\n// When you need to remove a gradient background, do not forget to use this to reset\n// the IE filter for IE9 and below.\n\n.reset-filter() {\n  filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(enabled = false)\"));\n}\n"
  },
  {
    "path": "client/less/lib/bootstrap/mixins/resize.less",
    "content": "// Resize anything\n\n.resizable(@direction) {\n  resize: @direction; // Options: horizontal, vertical, both\n  overflow: auto; // Per CSS3 UI, `resize` only applies when `overflow` isn't `visible`\n}\n"
  },
  {
    "path": "client/less/lib/bootstrap/mixins/responsive-visibility.less",
    "content": "// Responsive utilities\n\n//\n// More easily include all the states for responsive-utilities.less.\n.responsive-visibility() {\n  display: block !important;\n  table&  { display: table; }\n  tr&     { display: table-row !important; }\n  th&,\n  td&     { display: table-cell !important; }\n}\n\n.responsive-invisibility() {\n  display: none !important;\n}\n"
  },
  {
    "path": "client/less/lib/bootstrap/mixins/size.less",
    "content": "// Sizing shortcuts\n\n.size(@width; @height) {\n  width: @width;\n  height: @height;\n}\n\n.square(@size) {\n  .size(@size; @size);\n}\n"
  },
  {
    "path": "client/less/lib/bootstrap/mixins/tab-focus.less",
    "content": "// WebKit-style focus\n\n.tab-focus() {\n  // Default\n  outline: thin dotted;\n  // WebKit\n  outline: 5px auto -webkit-focus-ring-color;\n  outline-offset: -2px;\n}\n"
  },
  {
    "path": "client/less/lib/bootstrap/mixins/table-row.less",
    "content": "// Tables\n\n.table-row-variant(@state; @background) {\n  // Exact selectors below required to override `.table-striped` and prevent\n  // inheritance to nested tables.\n  .table > thead > tr,\n  .table > tbody > tr,\n  .table > tfoot > tr {\n    > td.@{state},\n    > th.@{state},\n    &.@{state} > td,\n    &.@{state} > th {\n      background-color: @background;\n    }\n  }\n\n  // Hover states for `.table-hover`\n  // Note: this is not available for cells or rows within `thead` or `tfoot`.\n  .table-hover > tbody > tr {\n    > td.@{state}:hover,\n    > th.@{state}:hover,\n    &.@{state}:hover > td,\n    &:hover > .@{state},\n    &.@{state}:hover > th {\n      background-color: darken(@background, 5%);\n    }\n  }\n}\n"
  },
  {
    "path": "client/less/lib/bootstrap/mixins/text-emphasis.less",
    "content": "// Typography\n\n.text-emphasis-variant(@color) {\n  color: @color;\n  a&:hover {\n    color: darken(@color, 10%);\n  }\n}\n"
  },
  {
    "path": "client/less/lib/bootstrap/mixins/text-overflow.less",
    "content": "// Text overflow\n// Requires inline-block or block for proper styling\n\n.text-overflow() {\n  overflow: hidden;\n  text-overflow: ellipsis;\n  white-space: nowrap;\n}\n"
  },
  {
    "path": "client/less/lib/bootstrap/mixins/vendor-prefixes.less",
    "content": "// Vendor Prefixes\n//\n// All vendor mixins are deprecated as of v3.2.0 due to the introduction of\n// Autoprefixer in our Gruntfile. They will be removed in v4.\n\n// - Animations\n// - Backface visibility\n// - Box shadow\n// - Box sizing\n// - Content columns\n// - Hyphens\n// - Placeholder text\n// - Transformations\n// - Transitions\n// - User Select\n\n\n// Animations\n.animation(@animation) {\n  -webkit-animation: @animation;\n       -o-animation: @animation;\n          animation: @animation;\n}\n.animation-name(@name) {\n  -webkit-animation-name: @name;\n          animation-name: @name;\n}\n.animation-duration(@duration) {\n  -webkit-animation-duration: @duration;\n          animation-duration: @duration;\n}\n.animation-timing-function(@timing-function) {\n  -webkit-animation-timing-function: @timing-function;\n          animation-timing-function: @timing-function;\n}\n.animation-delay(@delay) {\n  -webkit-animation-delay: @delay;\n          animation-delay: @delay;\n}\n.animation-iteration-count(@iteration-count) {\n  -webkit-animation-iteration-count: @iteration-count;\n          animation-iteration-count: @iteration-count;\n}\n.animation-direction(@direction) {\n  -webkit-animation-direction: @direction;\n          animation-direction: @direction;\n}\n.animation-fill-mode(@fill-mode) {\n  -webkit-animation-fill-mode: @fill-mode;\n          animation-fill-mode: @fill-mode;\n}\n\n// Backface visibility\n// Prevent browsers from flickering when using CSS 3D transforms.\n// Default value is `visible`, but can be changed to `hidden`\n\n.backface-visibility(@visibility){\n  -webkit-backface-visibility: @visibility;\n     -moz-backface-visibility: @visibility;\n          backface-visibility: @visibility;\n}\n\n// Drop shadows\n//\n// Note: Deprecated `.box-shadow()` as of v3.1.0 since all of Bootstrap's\n// supported browsers that have box shadow capabilities now support it.\n\n.box-shadow(@shadow) {\n  -webkit-box-shadow: @shadow; // iOS <4.3 & Android <4.1\n          box-shadow: @shadow;\n}\n\n// Box sizing\n.box-sizing(@boxmodel) {\n  -webkit-box-sizing: @boxmodel;\n     -moz-box-sizing: @boxmodel;\n          box-sizing: @boxmodel;\n}\n\n// CSS3 Content Columns\n.content-columns(@column-count; @column-gap: @grid-gutter-width) {\n  -webkit-column-count: @column-count;\n     -moz-column-count: @column-count;\n          column-count: @column-count;\n  -webkit-column-gap: @column-gap;\n     -moz-column-gap: @column-gap;\n          column-gap: @column-gap;\n}\n\n// Optional hyphenation\n.hyphens(@mode: auto) {\n  word-wrap: break-word;\n  -webkit-hyphens: @mode;\n     -moz-hyphens: @mode;\n      -ms-hyphens: @mode; // IE10+\n       -o-hyphens: @mode;\n          hyphens: @mode;\n}\n\n// Placeholder text\n.placeholder(@color: @input-color-placeholder) {\n  // Firefox\n  &::-moz-placeholder {\n    color: @color;\n    opacity: 1; // See https://github.com/twbs/bootstrap/pull/11526\n  }\n  &:-ms-input-placeholder { color: @color; } // Internet Explorer 10+\n  &::-webkit-input-placeholder  { color: @color; } // Safari and Chrome\n}\n\n// Transformations\n.scale(@ratio) {\n  -webkit-transform: scale(@ratio);\n      -ms-transform: scale(@ratio); // IE9 only\n       -o-transform: scale(@ratio);\n          transform: scale(@ratio);\n}\n.scale(@ratioX; @ratioY) {\n  -webkit-transform: scale(@ratioX, @ratioY);\n      -ms-transform: scale(@ratioX, @ratioY); // IE9 only\n       -o-transform: scale(@ratioX, @ratioY);\n          transform: scale(@ratioX, @ratioY);\n}\n.scaleX(@ratio) {\n  -webkit-transform: scaleX(@ratio);\n      -ms-transform: scaleX(@ratio); // IE9 only\n       -o-transform: scaleX(@ratio);\n          transform: scaleX(@ratio);\n}\n.scaleY(@ratio) {\n  -webkit-transform: scaleY(@ratio);\n      -ms-transform: scaleY(@ratio); // IE9 only\n       -o-transform: scaleY(@ratio);\n          transform: scaleY(@ratio);\n}\n.skew(@x; @y) {\n  -webkit-transform: skewX(@x) skewY(@y);\n      -ms-transform: skewX(@x) skewY(@y); // See https://github.com/twbs/bootstrap/issues/4885; IE9+\n       -o-transform: skewX(@x) skewY(@y);\n          transform: skewX(@x) skewY(@y);\n}\n.translate(@x; @y) {\n  -webkit-transform: translate(@x, @y);\n      -ms-transform: translate(@x, @y); // IE9 only\n       -o-transform: translate(@x, @y);\n          transform: translate(@x, @y);\n}\n.translate3d(@x; @y; @z) {\n  -webkit-transform: translate3d(@x, @y, @z);\n          transform: translate3d(@x, @y, @z);\n}\n.rotate(@degrees) {\n  -webkit-transform: rotate(@degrees);\n      -ms-transform: rotate(@degrees); // IE9 only\n       -o-transform: rotate(@degrees);\n          transform: rotate(@degrees);\n}\n.rotateX(@degrees) {\n  -webkit-transform: rotateX(@degrees);\n      -ms-transform: rotateX(@degrees); // IE9 only\n       -o-transform: rotateX(@degrees);\n          transform: rotateX(@degrees);\n}\n.rotateY(@degrees) {\n  -webkit-transform: rotateY(@degrees);\n      -ms-transform: rotateY(@degrees); // IE9 only\n       -o-transform: rotateY(@degrees);\n          transform: rotateY(@degrees);\n}\n.perspective(@perspective) {\n  -webkit-perspective: @perspective;\n     -moz-perspective: @perspective;\n          perspective: @perspective;\n}\n.perspective-origin(@perspective) {\n  -webkit-perspective-origin: @perspective;\n     -moz-perspective-origin: @perspective;\n          perspective-origin: @perspective;\n}\n.transform-origin(@origin) {\n  -webkit-transform-origin: @origin;\n     -moz-transform-origin: @origin;\n      -ms-transform-origin: @origin; // IE9 only\n          transform-origin: @origin;\n}\n\n\n// Transitions\n\n.transition(@transition) {\n  -webkit-transition: @transition;\n       -o-transition: @transition;\n          transition: @transition;\n}\n.transition-property(@transition-property) {\n  -webkit-transition-property: @transition-property;\n          transition-property: @transition-property;\n}\n.transition-delay(@transition-delay) {\n  -webkit-transition-delay: @transition-delay;\n          transition-delay: @transition-delay;\n}\n.transition-duration(@transition-duration) {\n  -webkit-transition-duration: @transition-duration;\n          transition-duration: @transition-duration;\n}\n.transition-timing-function(@timing-function) {\n  -webkit-transition-timing-function: @timing-function;\n          transition-timing-function: @timing-function;\n}\n.transition-transform(@transition) {\n  -webkit-transition: -webkit-transform @transition;\n     -moz-transition: -moz-transform @transition;\n       -o-transition: -o-transform @transition;\n          transition: transform @transition;\n}\n\n\n// User select\n// For selecting text on the page\n\n.user-select(@select) {\n  -webkit-user-select: @select;\n     -moz-user-select: @select;\n      -ms-user-select: @select; // IE10+\n          user-select: @select;\n}\n"
  },
  {
    "path": "client/less/lib/bootstrap/mixins.less",
    "content": "// Mixins\n// --------------------------------------------------\n\n// Utilities\n@import \"mixins/hide-text.less\";\n@import \"mixins/opacity.less\";\n@import \"mixins/image.less\";\n@import \"mixins/labels.less\";\n@import \"mixins/reset-filter.less\";\n@import \"mixins/resize.less\";\n@import \"mixins/responsive-visibility.less\";\n@import \"mixins/size.less\";\n@import \"mixins/tab-focus.less\";\n@import \"mixins/text-emphasis.less\";\n@import \"mixins/text-overflow.less\";\n@import \"mixins/vendor-prefixes.less\";\n\n// Components\n@import \"mixins/alerts.less\";\n@import \"mixins/buttons.less\";\n@import \"mixins/panels.less\";\n@import \"mixins/pagination.less\";\n@import \"mixins/list-group.less\";\n@import \"mixins/nav-divider.less\";\n@import \"mixins/forms.less\";\n@import \"mixins/progress-bar.less\";\n@import \"mixins/table-row.less\";\n\n// Skins\n@import \"mixins/background-variant.less\";\n@import \"mixins/border-radius.less\";\n@import \"mixins/gradients.less\";\n\n// Layout\n@import \"mixins/clearfix.less\";\n@import \"mixins/center-block.less\";\n@import \"mixins/nav-vertical-align.less\";\n@import \"mixins/grid-framework.less\";\n@import \"mixins/grid.less\";\n"
  },
  {
    "path": "client/less/lib/bootstrap/modals.less",
    "content": "//\n// Modals\n// --------------------------------------------------\n\n// .modal-open      - body class for killing the scroll\n// .modal           - container to scroll within\n// .modal-dialog    - positioning shell for the actual modal\n// .modal-content   - actual modal w/ bg and corners and shit\n\n// Kill the scroll on the body\n.modal-open {\n  overflow: hidden;\n}\n\n// Container that the modal scrolls within\n.modal {\n  display: none;\n  overflow: hidden;\n  position: fixed;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  z-index: @zindex-modal;\n  -webkit-overflow-scrolling: touch;\n\n  // Prevent Chrome on Windows from adding a focus outline. For details, see\n  // https://github.com/twbs/bootstrap/pull/10951.\n  outline: 0;\n\n  // When fading in the modal, animate it to slide down\n  &.fade .modal-dialog {\n    .translate(0, -25%);\n    .transition-transform(~\"0.3s ease-out\");\n  }\n  &.in .modal-dialog { .translate(0, 0) }\n}\n.modal-open .modal {\n  overflow-x: hidden;\n  overflow-y: auto;\n}\n\n// Shell div to position the modal with bottom padding\n.modal-dialog {\n  position: relative;\n  width: auto;\n  margin: 10px;\n}\n\n// Actual modal\n.modal-content {\n  position: relative;\n  background-color: @modal-content-bg;\n  border: 1px solid @modal-content-fallback-border-color; //old browsers fallback (ie8 etc)\n  border: 1px solid @modal-content-border-color;\n  border-radius: @border-radius-large;\n  .box-shadow(0 3px 9px rgba(0,0,0,.5));\n  background-clip: padding-box;\n  // Remove focus outline from opened modal\n  outline: 0;\n}\n\n// Modal background\n.modal-backdrop {\n  position: fixed;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  background-color: @modal-backdrop-bg;\n  // Fade for backdrop\n  &.fade { .opacity(0); }\n  &.in { .opacity(@modal-backdrop-opacity); }\n}\n\n// Modal header\n// Top section of the modal w/ title and dismiss\n.modal-header {\n  padding: @modal-title-padding;\n  border-bottom: 1px solid @modal-header-border-color;\n  min-height: (@modal-title-padding + @modal-title-line-height);\n}\n// Close icon\n.modal-header .close {\n  margin-top: -2px;\n}\n\n// Title text within header\n.modal-title {\n  margin: 0;\n  line-height: @modal-title-line-height;\n}\n\n// Modal body\n// Where all modal content resides (sibling of .modal-header and .modal-footer)\n.modal-body {\n  position: relative;\n  padding: @modal-inner-padding;\n}\n\n// Footer (for actions)\n.modal-footer {\n  padding: @modal-inner-padding;\n  text-align: right; // right align buttons\n  border-top: 1px solid @modal-footer-border-color;\n  &:extend(.clearfix all); // clear it in case folks use .pull-* classes on buttons\n\n  // Properly space out buttons\n  .btn + .btn {\n    margin-left: 5px;\n    margin-bottom: 0; // account for input[type=\"submit\"] which gets the bottom margin like all other inputs\n  }\n  // but override that for button groups\n  .btn-group .btn + .btn {\n    margin-left: -1px;\n  }\n  // and override it for block buttons as well\n  .btn-block + .btn-block {\n    margin-left: 0;\n  }\n}\n\n// Measure scrollbar width for padding body during modal show/hide\n.modal-scrollbar-measure {\n  position: absolute;\n  top: -9999px;\n  width: 50px;\n  height: 50px;\n  overflow: scroll;\n}\n\n// Scale up the modal\n@media (min-width: @screen-sm-min) {\n  // Automatically set modal's width for larger viewports\n  .modal-dialog {\n    width: @modal-md;\n    margin: 30px auto;\n  }\n  .modal-content {\n    .box-shadow(0 5px 15px rgba(0,0,0,.5));\n  }\n\n  // Modal sizes\n  .modal-sm { width: @modal-sm; }\n}\n\n@media (min-width: @screen-md-min) {\n  .modal-lg { width: @modal-lg; }\n}\n"
  },
  {
    "path": "client/less/lib/bootstrap/navbar.less",
    "content": "//\n// Navbars\n// --------------------------------------------------\n\n\n// Wrapper and base class\n//\n// Provide a static navbar from which we expand to create full-width, fixed, and\n// other navbar variations.\n\n.navbar {\n  position: relative;\n  min-height: @navbar-height; // Ensure a navbar always shows (e.g., without a .navbar-brand in collapsed mode)\n  margin-bottom: @navbar-margin-bottom;\n  border: 1px solid transparent;\n\n  // Prevent floats from breaking the navbar\n  &:extend(.clearfix all);\n\n  @media (min-width: @grid-float-breakpoint) {\n    border-radius: @navbar-border-radius;\n  }\n}\n\n\n// Navbar heading\n//\n// Groups `.navbar-brand` and `.navbar-toggle` into a single component for easy\n// styling of responsive aspects.\n\n.navbar-header {\n  &:extend(.clearfix all);\n\n  @media (min-width: @grid-float-breakpoint) {\n    float: left;\n  }\n}\n\n\n// Navbar collapse (body)\n//\n// Group your navbar content into this for easy collapsing and expanding across\n// various device sizes. By default, this content is collapsed when <768px, but\n// will expand past that for a horizontal display.\n//\n// To start (on mobile devices) the navbar links, forms, and buttons are stacked\n// vertically and include a `max-height` to overflow in case you have too much\n// content for the user's viewport.\n\n.navbar-collapse {\n  overflow-x: visible;\n  padding-right: @navbar-padding-horizontal;\n  padding-left:  @navbar-padding-horizontal;\n  border-top: 1px solid transparent;\n  box-shadow: inset 0 1px 0 rgba(255,255,255,.1);\n  &:extend(.clearfix all);\n  -webkit-overflow-scrolling: touch;\n\n  &.in {\n    overflow-y: auto;\n  }\n\n  @media (min-width: @grid-float-breakpoint) {\n    width: auto;\n    border-top: 0;\n    box-shadow: none;\n\n    &.collapse {\n      display: block !important;\n      visibility: visible !important;\n      height: auto !important;\n      padding-bottom: 0; // Override default setting\n      overflow: visible !important;\n    }\n\n    &.in {\n      overflow-y: visible;\n    }\n\n    // Undo the collapse side padding for navbars with containers to ensure\n    // alignment of right-aligned contents.\n    .navbar-fixed-top &,\n    .navbar-static-top &,\n    .navbar-fixed-bottom & {\n      padding-left: 0;\n      padding-right: 0;\n    }\n  }\n}\n\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n  .navbar-collapse {\n    max-height: @navbar-collapse-max-height;\n\n    @media (max-device-width: @screen-xs-min) and (orientation: landscape) {\n      max-height: 200px;\n    }\n  }\n}\n\n\n// Both navbar header and collapse\n//\n// When a container is present, change the behavior of the header and collapse.\n\n.container,\n.container-fluid {\n  > .navbar-header,\n  > .navbar-collapse {\n    margin-right: -@navbar-padding-horizontal;\n    margin-left:  -@navbar-padding-horizontal;\n\n    @media (min-width: @grid-float-breakpoint) {\n      margin-right: 0;\n      margin-left:  0;\n    }\n  }\n}\n\n\n//\n// Navbar alignment options\n//\n// Display the navbar across the entirety of the page or fixed it to the top or\n// bottom of the page.\n\n// Static top (unfixed, but 100% wide) navbar\n.navbar-static-top {\n  z-index: @zindex-navbar;\n  border-width: 0 0 1px;\n\n  @media (min-width: @grid-float-breakpoint) {\n    border-radius: 0;\n  }\n}\n\n// Fix the top/bottom navbars when screen real estate supports it\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n  position: fixed;\n  right: 0;\n  left: 0;\n  z-index: @zindex-navbar-fixed;\n\n  // Undo the rounded corners\n  @media (min-width: @grid-float-breakpoint) {\n    border-radius: 0;\n  }\n}\n.navbar-fixed-top {\n  top: 0;\n  border-width: 0 0 1px;\n}\n.navbar-fixed-bottom {\n  bottom: 0;\n  margin-bottom: 0; // override .navbar defaults\n  border-width: 1px 0 0;\n}\n\n\n// Brand/project name\n\n.navbar-brand {\n  float: left;\n  padding: @navbar-padding-vertical @navbar-padding-horizontal;\n  font-size: @font-size-large;\n  line-height: @line-height-computed;\n  height: @navbar-height;\n\n  &:hover,\n  &:focus {\n    text-decoration: none;\n  }\n\n  > img {\n    display: block;\n  }\n\n  @media (min-width: @grid-float-breakpoint) {\n    .navbar > .container &,\n    .navbar > .container-fluid & {\n      margin-left: -@navbar-padding-horizontal;\n    }\n  }\n}\n\n\n// Navbar toggle\n//\n// Custom button for toggling the `.navbar-collapse`, powered by the collapse\n// JavaScript plugin.\n\n.navbar-toggle {\n  position: relative;\n  float: right;\n  margin-right: @navbar-padding-horizontal;\n  padding: 9px 10px;\n  .navbar-vertical-align(34px);\n  background-color: transparent;\n  background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214\n  border: 1px solid transparent;\n  border-radius: @border-radius-base;\n\n  // We remove the `outline` here, but later compensate by attaching `:hover`\n  // styles to `:focus`.\n  &:focus {\n    outline: 0;\n  }\n\n  // Bars\n  .icon-bar {\n    display: block;\n    width: 22px;\n    height: 2px;\n    border-radius: 1px;\n    background-color: #eeeeee !important;\n  }\n  .icon-bar + .icon-bar {\n    margin-top: 4px;\n  }\n\n  @media (min-width: @grid-float-breakpoint) {\n    display: none;\n  }\n}\n\n\n// Navbar nav links\n//\n// Builds on top of the `.nav` components with its own modifier class to make\n// the nav the full height of the horizontal nav (above 768px).\n\n.navbar-nav {\n  margin: (@navbar-padding-vertical / 2) -@navbar-padding-horizontal;\n\n  > li > a {\n    padding-top:    10px;\n    padding-bottom: 10px;\n    line-height: @line-height-computed;\n  }\n\n  @media (max-width: @grid-float-breakpoint-max) {\n    // Dropdowns get custom display when collapsed\n    .open .dropdown-menu {\n      position: static;\n      float: none;\n      width: auto;\n      margin-top: 0;\n      background-color: transparent;\n      border: 0;\n      box-shadow: none;\n      > li > a,\n      .dropdown-header {\n        padding: 5px 15px 5px 25px;\n      }\n      > li > a {\n        line-height: @line-height-computed;\n        &:hover,\n        &:focus {\n          background-image: none;\n        }\n      }\n    }\n  }\n\n  // Uncollapse the nav\n  @media (min-width: @grid-float-breakpoint) {\n    float: left;\n    margin: 0;\n\n    > li {\n      float: left;\n      > a {\n        padding-top:    @navbar-padding-vertical;\n        padding-bottom: @navbar-padding-vertical;\n      }\n    }\n  }\n}\n\n\n// Navbar form\n//\n// Extension of the `.form-inline` with some extra flavor for optimum display in\n// our navbars.\n\n.navbar-form {\n  margin-left: -@navbar-padding-horizontal;\n  margin-right: -@navbar-padding-horizontal;\n  padding: 10px @navbar-padding-horizontal;\n  border-top: 1px solid transparent;\n  border-bottom: 1px solid transparent;\n  @shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.1);\n  .box-shadow(@shadow);\n\n  // Mixin behavior for optimum display\n  .form-inline();\n\n  .form-group {\n    @media (max-width: @grid-float-breakpoint-max) {\n      margin-bottom: 5px;\n\n      &:last-child {\n        margin-bottom: 0;\n      }\n    }\n  }\n\n  // Vertically center in expanded, horizontal navbar\n  .navbar-vertical-align(@input-height-base);\n\n  // Undo 100% width for pull classes\n  @media (min-width: @grid-float-breakpoint) {\n    width: auto;\n    border: 0;\n    margin-left: 0;\n    margin-right: 0;\n    padding-top: 0;\n    padding-bottom: 0;\n    .box-shadow(none);\n  }\n}\n\n\n// Dropdown menus\n\n// Menu position and menu carets\n.navbar-nav > li > .dropdown-menu {\n  margin-top: 0;\n  .border-top-radius(0);\n}\n// Menu position and menu caret support for dropups via extra dropup class\n.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu {\n  .border-bottom-radius(0);\n}\n\n\n// Buttons in navbars\n//\n// Vertically center a button within a navbar (when *not* in a form).\n\n.navbar-btn {\n  .navbar-vertical-align(@input-height-base);\n\n  &.btn-sm {\n    .navbar-vertical-align(@input-height-small);\n  }\n  &.btn-xs {\n    .navbar-vertical-align(22);\n  }\n}\n\n\n// Text in navbars\n//\n// Add a class to make any element properly align itself vertically within the navbars.\n\n.navbar-text {\n  .navbar-vertical-align(@line-height-computed);\n\n  @media (min-width: @grid-float-breakpoint) {\n    float: left;\n    margin-left: @navbar-padding-horizontal;\n    margin-right: @navbar-padding-horizontal;\n  }\n}\n\n\n// Component alignment\n//\n// Repurpose the pull utilities as their own navbar utilities to avoid specificity\n// issues with parents and chaining. Only do this when the navbar is uncollapsed\n// though so that navbar contents properly stack and align in mobile.\n//\n// Declared after the navbar components to ensure more specificity on the margins.\n\n@media (min-width: @grid-float-breakpoint) {\n  .navbar-left  { .pull-left(); }\n  .navbar-right {\n    .pull-right();\n    margin-right: -@navbar-padding-horizontal;\n\n    ~ .navbar-right {\n      margin-right: 0;\n    }\n  }\n}\n\n\n// Alternate navbars\n// --------------------------------------------------\n\n// Default navbar\n.navbar-default {\n  background-color: @navbar-default-bg;\n  border-color: @navbar-default-border;\n\n  .navbar-brand {\n    color: @navbar-default-brand-color;\n    &:hover,\n    &:focus {\n      color: @navbar-default-brand-hover-color;\n      background-color: @navbar-default-brand-hover-bg;\n    }\n  }\n\n  .navbar-text {\n    color: @navbar-default-color;\n  }\n\n  .navbar-nav {\n    > li > a {\n      color: @navbar-default-link-color;\n\n      &:hover,\n      &:focus {\n        color: @navbar-default-link-hover-color;\n        background-color: @navbar-default-link-hover-bg;\n      }\n    }\n    > .active > a {\n      &,\n      &:hover,\n      &:focus {\n        color: @navbar-default-link-active-color;\n      }\n    }\n    > .disabled > a {\n      &,\n      &:hover,\n      &:focus {\n        color: @navbar-default-link-disabled-color;\n        background-color: @navbar-default-link-disabled-bg;\n      }\n    }\n  }\n\n  .navbar-toggle {\n    border-color: @navbar-default-toggle-border-color;\n    &:hover,\n    &:focus {\n      background-color: @navbar-default-toggle-hover-bg;\n    }\n    .icon-bar {\n      background-color: @navbar-default-toggle-icon-bar-bg;\n    }\n  }\n\n  .navbar-collapse,\n  .navbar-form {\n    border-color: @navbar-default-border;\n  }\n\n  // Dropdown menu items\n  .navbar-nav {\n    // Remove background color from open dropdown\n    > .open > a {\n      &,\n      &:hover,\n      &:focus {\n        background-color: @navbar-default-link-active-bg;\n        color: @navbar-default-link-active-color;\n      }\n    }\n\n    @media (max-width: @grid-float-breakpoint-max) {\n      // Dropdowns get custom display when collapsed\n      .open .dropdown-menu {\n        > li > a {\n          color: @navbar-default-link-color;\n          &:hover,\n          &:focus {\n            color: @navbar-default-link-hover-color;\n            background-color: @navbar-default-link-hover-bg;\n          }\n        }\n        > .active > a {\n          &,\n          &:hover,\n          &:focus {\n            color: @navbar-default-link-active-color;\n            background-color: @navbar-default-link-active-bg;\n          }\n        }\n        > .disabled > a {\n          &,\n          &:hover,\n          &:focus {\n            color: @navbar-default-link-disabled-color;\n            background-color: @navbar-default-link-disabled-bg;\n          }\n        }\n      }\n    }\n  }\n\n\n  // Links in navbars\n  //\n  // Add a class to ensure links outside the navbar nav are colored correctly.\n\n  .navbar-link {\n    color: @navbar-default-link-color;\n    &:hover {\n      color: @navbar-default-link-hover-color;\n    }\n  }\n\n  .btn-link {\n    color: @navbar-default-link-color;\n    &:hover,\n    &:focus {\n      color: @navbar-default-link-hover-color;\n    }\n    &[disabled],\n    fieldset[disabled] & {\n      &:hover,\n      &:focus {\n        color: @navbar-default-link-disabled-color;\n      }\n    }\n  }\n}\n\n// Inverse navbar\n\n.navbar-inverse {\n  background-color: @navbar-inverse-bg;\n  border-color: @navbar-inverse-border;\n\n  .navbar-brand {\n    color: @navbar-inverse-brand-color;\n    &:hover,\n    &:focus {\n      color: @navbar-inverse-brand-hover-color;\n      background-color: @navbar-inverse-brand-hover-bg;\n    }\n  }\n\n  .navbar-text {\n    color: @navbar-inverse-color;\n  }\n\n  .navbar-nav {\n    > li > a {\n      color: @navbar-inverse-link-color;\n\n      &:hover,\n      &:focus {\n        color: @navbar-inverse-link-hover-color;\n        background-color: @navbar-inverse-link-hover-bg;\n      }\n    }\n    > .active > a {\n      &,\n      &:hover,\n      &:focus {\n        color: @navbar-inverse-link-active-color;\n        background-color: @navbar-inverse-link-active-bg;\n      }\n    }\n    > .disabled > a {\n      &,\n      &:hover,\n      &:focus {\n        color: @navbar-inverse-link-disabled-color;\n        background-color: @navbar-inverse-link-disabled-bg;\n      }\n    }\n  }\n\n  // Darken the responsive nav toggle\n  .navbar-toggle {\n    border-color: @navbar-inverse-toggle-border-color;\n    &:hover,\n    &:focus {\n      background-color: @navbar-inverse-toggle-hover-bg;\n    }\n    .icon-bar {\n      background-color: @navbar-inverse-toggle-icon-bar-bg;\n    }\n  }\n\n  .navbar-collapse,\n  .navbar-form {\n    border-color: darken(@navbar-inverse-bg, 7%);\n  }\n\n  // Dropdowns\n  .navbar-nav {\n    > .open > a {\n      &,\n      &:hover,\n      &:focus {\n        background-color: @navbar-inverse-link-active-bg;\n        color: @navbar-inverse-link-active-color;\n      }\n    }\n\n    @media (max-width: @grid-float-breakpoint-max) {\n      // Dropdowns get custom display\n      .open .dropdown-menu {\n        > .dropdown-header {\n          border-color: @navbar-inverse-border;\n        }\n        .divider {\n          background-color: @navbar-inverse-border;\n        }\n        > li > a {\n          color: @navbar-inverse-link-color;\n          &:hover,\n          &:focus {\n            color: @navbar-inverse-link-hover-color;\n            background-color: @navbar-inverse-link-hover-bg;\n          }\n        }\n        > .active > a {\n          &,\n          &:hover,\n          &:focus {\n            color: @navbar-inverse-link-active-color;\n            background-color: @navbar-inverse-link-active-bg;\n          }\n        }\n        > .disabled > a {\n          &,\n          &:hover,\n          &:focus {\n            color: @navbar-inverse-link-disabled-color;\n            background-color: @navbar-inverse-link-disabled-bg;\n          }\n        }\n      }\n    }\n  }\n\n  .navbar-link {\n    color: @navbar-inverse-link-color;\n    &:hover {\n      color: @navbar-inverse-link-hover-color;\n    }\n  }\n\n  .btn-link {\n    color: @navbar-inverse-link-color;\n    &:hover,\n    &:focus {\n      color: @navbar-inverse-link-hover-color;\n    }\n    &[disabled],\n    fieldset[disabled] & {\n      &:hover,\n      &:focus {\n        color: @navbar-inverse-link-disabled-color;\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "client/less/lib/bootstrap/navs.less",
    "content": "//\n// Navs\n// --------------------------------------------------\n\n\n// Base class\n// --------------------------------------------------\n\n.nav {\n  margin-bottom: 0;\n  padding-left: 0; // Override default ul/ol\n  list-style: none;\n  &:extend(.clearfix all);\n\n  > li {\n    position: relative;\n    display: block;\n\n    > a {\n      position: relative;\n      display: block;\n      padding: @nav-link-padding;\n      &:hover,\n      &:focus {\n        text-decoration: none;\n        background-color: @nav-link-hover-bg;\n      }\n    }\n\n    // Disabled state sets text to gray and nukes hover/tab effects\n    &.disabled > a {\n      color: @nav-disabled-link-color;\n\n      &:hover,\n      &:focus {\n        color: @nav-disabled-link-hover-color;\n        text-decoration: none;\n        background-color: transparent;\n        cursor: @cursor-disabled;\n      }\n    }\n  }\n\n  // Open dropdowns\n  .open > a {\n    &,\n    &:hover,\n    &:focus {\n      background-color: @nav-link-hover-bg;\n      border-color: @link-color;\n    }\n  }\n\n  // Nav dividers (deprecated with v3.0.1)\n  //\n  // This should have been removed in v3 with the dropping of `.nav-list`, but\n  // we missed it. We don't currently support this anywhere, but in the interest\n  // of maintaining backward compatibility in case you use it, it's deprecated.\n  .nav-divider {\n    .nav-divider();\n  }\n\n  // Prevent IE8 from misplacing imgs\n  //\n  // See https://github.com/h5bp/html5-boilerplate/issues/984#issuecomment-3985989\n  > li > a > img {\n    max-width: none;\n  }\n}\n\n\n// Tabs\n// -------------------------\n\n// Give the tabs something to sit on\n.nav-tabs {\n  border-bottom: 1px solid @nav-tabs-border-color;\n  > li {\n    float: left;\n    // Make the list-items overlay the bottom border\n    margin-bottom: -1px;\n\n    // Actual tabs (as links)\n    > a {\n      margin-right: 2px;\n      line-height: @line-height-base;\n      border: 1px solid transparent;\n      border-radius: @border-radius-base @border-radius-base 0 0;\n      &:hover {\n        border-color: @nav-tabs-link-hover-border-color @nav-tabs-link-hover-border-color @nav-tabs-border-color;\n      }\n    }\n\n    // Active state, and its :hover to override normal :hover\n    &.active > a {\n      &,\n      &:hover,\n      &:focus {\n        color: @nav-tabs-active-link-hover-color;\n        background-color: @nav-tabs-active-link-hover-bg;\n        border: 1px solid @nav-tabs-active-link-hover-border-color;\n        border-bottom-color: transparent;\n        cursor: default;\n      }\n    }\n  }\n  // pulling this in mainly for less shorthand\n  &.nav-justified {\n    .nav-justified();\n    .nav-tabs-justified();\n  }\n}\n\n\n// Pills\n// -------------------------\n.nav-pills {\n  > li {\n    float: left;\n\n    // Links rendered as pills\n    > a {\n      border-radius: @nav-pills-border-radius;\n    }\n    + li {\n      margin-left: 2px;\n    }\n\n    // Active state\n    &.active > a {\n      &,\n      &:hover,\n      &:focus {\n        color: @nav-pills-active-link-hover-color;\n        background-color: @nav-pills-active-link-hover-bg;\n      }\n    }\n  }\n}\n\n\n// Stacked pills\n.nav-stacked {\n  > li {\n    float: none;\n    + li {\n      margin-top: 2px;\n      margin-left: 0; // no need for this gap between nav items\n    }\n  }\n}\n\n\n// Nav variations\n// --------------------------------------------------\n\n// Justified nav links\n// -------------------------\n\n.nav-justified {\n  width: 100%;\n\n  > li {\n    float: none;\n    > a {\n      text-align: center;\n      margin-bottom: 5px;\n    }\n  }\n\n  > .dropdown .dropdown-menu {\n    top: auto;\n    left: auto;\n  }\n\n  @media (min-width: @screen-sm-min) {\n    > li {\n      display: table-cell;\n      width: 1%;\n      > a {\n        margin-bottom: 0;\n      }\n    }\n  }\n}\n\n// Move borders to anchors instead of bottom of list\n//\n// Mixin for adding on top the shared `.nav-justified` styles for our tabs\n.nav-tabs-justified {\n  border-bottom: 0;\n\n  > li > a {\n    // Override margin from .nav-tabs\n    margin-right: 0;\n    border-radius: @border-radius-base;\n  }\n\n  > .active > a,\n  > .active > a:hover,\n  > .active > a:focus {\n    border: 1px solid @nav-tabs-justified-link-border-color;\n  }\n\n  @media (min-width: @screen-sm-min) {\n    > li > a {\n      border-bottom: 1px solid @nav-tabs-justified-link-border-color;\n      border-radius: @border-radius-base @border-radius-base 0 0;\n    }\n    > .active > a,\n    > .active > a:hover,\n    > .active > a:focus {\n      border-bottom-color: @nav-tabs-justified-active-link-border-color;\n    }\n  }\n}\n\n\n// Tabbable tabs\n// -------------------------\n\n// Hide tabbable panes to start, show them when `.active`\n.tab-content {\n  > .tab-pane {\n    display: none;\n    visibility: hidden;\n  }\n  > .active {\n    display: block;\n    visibility: visible;\n  }\n}\n\n\n// Dropdowns\n// -------------------------\n\n// Specific dropdowns\n.nav-tabs .dropdown-menu {\n  // make dropdown border overlap tab border\n  margin-top: -1px;\n  // Remove the top rounded corners here since there is a hard edge above the menu\n  .border-top-radius(0);\n}\n"
  },
  {
    "path": "client/less/lib/bootstrap/normalize.less",
    "content": "/*! normalize.css v3.0.2 | MIT License | git.io/normalize */\n\n//\n// 1. Set default font family to sans-serif.\n// 2. Prevent iOS text size adjust after orientation change, without disabling\n//    user zoom.\n//\n\nhtml {\n  font-family: sans-serif; // 1\n  -ms-text-size-adjust: 100%; // 2\n  -webkit-text-size-adjust: 100%; // 2\n}\n\n//\n// Remove default margin.\n//\n\nbody {\n  margin: 0;\n}\n\n// HTML5 display definitions\n// ==========================================================================\n\n//\n// Correct `block` display not defined for any HTML5 element in IE 8/9.\n// Correct `block` display not defined for `details` or `summary` in IE 10/11\n// and Firefox.\n// Correct `block` display not defined for `main` in IE 11.\n//\n\narticle,\naside,\ndetails,\nfigcaption,\nfigure,\nfooter,\nheader,\nhgroup,\nmain,\nmenu,\nnav,\nsection,\nsummary {\n  display: block;\n}\n\n//\n// 1. Correct `inline-block` display not defined in IE 8/9.\n// 2. Normalize vertical alignment of `progress` in Chrome, Firefox, and Opera.\n//\n\naudio,\ncanvas,\nprogress,\nvideo {\n  display: inline-block; // 1\n  vertical-align: baseline; // 2\n}\n\n//\n// Prevent modern browsers from displaying `audio` without controls.\n// Remove excess height in iOS 5 devices.\n//\n\naudio:not([controls]) {\n  display: none;\n  height: 0;\n}\n\n//\n// Address `[hidden]` styling not present in IE 8/9/10.\n// Hide the `template` element in IE 8/9/11, Safari, and Firefox < 22.\n//\n\n[hidden],\ntemplate {\n  display: none;\n}\n\n// Links\n// ==========================================================================\n\n//\n// Remove the gray background color from active links in IE 10.\n//\n\na {\n  background-color: transparent;\n}\n\n//\n// Improve readability when focused and also mouse hovered in all browsers.\n//\n\na:active,\na:hover {\n  outline: 0;\n}\n\n// Text-level semantics\n// ==========================================================================\n\n//\n// Address styling not present in IE 8/9/10/11, Safari, and Chrome.\n//\n\nabbr[title] {\n  border-bottom: 1px dotted;\n}\n\n//\n// Address style set to `bolder` in Firefox 4+, Safari, and Chrome.\n//\n\nb,\nstrong {\n  font-weight: bold;\n}\n\n//\n// Address styling not present in Safari and Chrome.\n//\n\ndfn {\n  font-style: italic;\n}\n\n//\n// Address variable `h1` font-size and margin within `section` and `article`\n// contexts in Firefox 4+, Safari, and Chrome.\n//\n\nh1 {\n  font-size: 2em;\n  margin: 0.67em 0;\n}\n\n//\n// Address styling not present in IE 8/9.\n//\n\nmark {\n  background: #ff0;\n  color: #000;\n}\n\n//\n// Address inconsistent and variable font size in all browsers.\n//\n\nsmall {\n  font-size: 80%;\n}\n\n//\n// Prevent `sub` and `sup` affecting `line-height` in all browsers.\n//\n\nsub,\nsup {\n  font-size: 75%;\n  line-height: 0;\n  position: relative;\n  vertical-align: baseline;\n}\n\nsup {\n  top: -0.5em;\n}\n\nsub {\n  bottom: -0.25em;\n}\n\n// Embedded content\n// ==========================================================================\n\n//\n// Remove border when inside `a` element in IE 8/9/10.\n//\n\nimg {\n  border: 0;\n}\n\n//\n// Correct overflow not hidden in IE 9/10/11.\n//\n\nsvg:not(:root) {\n  overflow: hidden;\n}\n\n// Grouping content\n// ==========================================================================\n\n//\n// Address margin not present in IE 8/9 and Safari.\n//\n\nfigure {\n  margin: 1em 40px;\n}\n\n//\n// Address differences between Firefox and other browsers.\n//\n\nhr {\n  -moz-box-sizing: content-box;\n  box-sizing: content-box;\n  height: 0;\n}\n\n//\n// Contain overflow in all browsers.\n//\n\npre {\n  overflow: auto;\n}\n\n//\n// Address odd `em`-unit font size rendering in all browsers.\n//\n\ncode,\nkbd,\npre,\nsamp {\n  font-family: monospace, monospace;\n  font-size: 1em;\n}\n\n// Forms\n// ==========================================================================\n\n//\n// Known limitation: by default, Chrome and Safari on OS X allow very limited\n// styling of `select`, unless a `border` property is set.\n//\n\n//\n// 1. Correct color not being inherited.\n//    Known issue: affects color of disabled elements.\n// 2. Correct font properties not being inherited.\n// 3. Address margins set differently in Firefox 4+, Safari, and Chrome.\n//\n\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n  color: inherit; // 1\n  font: inherit; // 2\n  margin: 0; // 3\n}\n\n//\n// Address `overflow` set to `hidden` in IE 8/9/10/11.\n//\n\nbutton {\n  overflow: visible;\n}\n\n//\n// Address inconsistent `text-transform` inheritance for `button` and `select`.\n// All other form control elements do not inherit `text-transform` values.\n// Correct `button` style inheritance in Firefox, IE 8/9/10/11, and Opera.\n// Correct `select` style inheritance in Firefox.\n//\n\nbutton,\nselect {\n  text-transform: none;\n}\n\n//\n// 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio`\n//    and `video` controls.\n// 2. Correct inability to style clickable `input` types in iOS.\n// 3. Improve usability and consistency of cursor style between image-type\n//    `input` and others.\n//\n\nbutton,\nhtml input[type=\"button\"], // 1\ninput[type=\"reset\"],\ninput[type=\"submit\"] {\n  -webkit-appearance: button; // 2\n  cursor: pointer; // 3\n}\n\n//\n// Re-set default cursor for disabled elements.\n//\n\nbutton[disabled],\nhtml input[disabled] {\n  cursor: default;\n}\n\n//\n// Remove inner padding and border in Firefox 4+.\n//\n\nbutton::-moz-focus-inner,\ninput::-moz-focus-inner {\n  border: 0;\n  padding: 0;\n}\n\n//\n// Address Firefox 4+ setting `line-height` on `input` using `!important` in\n// the UA stylesheet.\n//\n\ninput {\n  line-height: normal;\n}\n\n//\n// It's recommended that you don't attempt to style these elements.\n// Firefox's implementation doesn't respect box-sizing, padding, or width.\n//\n// 1. Address box sizing set to `content-box` in IE 8/9/10.\n// 2. Remove excess padding in IE 8/9/10.\n//\n\ninput[type=\"checkbox\"],\ninput[type=\"radio\"] {\n  box-sizing: border-box; // 1\n  padding: 0; // 2\n}\n\n//\n// Fix the cursor style for Chrome's increment/decrement buttons. For certain\n// `font-size` values of the `input`, it causes the cursor style of the\n// decrement button to change from `default` to `text`.\n//\n\ninput[type=\"number\"]::-webkit-inner-spin-button,\ninput[type=\"number\"]::-webkit-outer-spin-button {\n  height: auto;\n}\n\n//\n// 1. Address `appearance` set to `searchfield` in Safari and Chrome.\n// 2. Address `box-sizing` set to `border-box` in Safari and Chrome\n//    (include `-moz` to future-proof).\n//\n\ninput[type=\"search\"] {\n  -webkit-appearance: textfield; // 1\n  -moz-box-sizing: content-box;\n  -webkit-box-sizing: content-box; // 2\n  box-sizing: content-box;\n}\n\n//\n// Remove inner padding and search cancel button in Safari and Chrome on OS X.\n// Safari (but not Chrome) clips the cancel button when the search input has\n// padding (and `textfield` appearance).\n//\n\ninput[type=\"search\"]::-webkit-search-cancel-button,\ninput[type=\"search\"]::-webkit-search-decoration {\n  -webkit-appearance: none;\n}\n\n//\n// Define consistent border, margin, and padding.\n//\n\nfieldset {\n  border: 1px solid #c0c0c0;\n  margin: 0 2px;\n  padding: 0.35em 0.625em 0.75em;\n}\n\n//\n// 1. Correct `color` not being inherited in IE 8/9/10/11.\n// 2. Remove padding so people aren't caught out if they zero out fieldsets.\n//\n\nlegend {\n  border: 0; // 1\n  padding: 0; // 2\n}\n\n//\n// Remove default vertical scrollbar in IE 8/9/10/11.\n//\n\ntextarea {\n  overflow: auto;\n}\n\n//\n// Don't inherit the `font-weight` (applied by a rule above).\n// NOTE: the default cannot safely be changed in Chrome and Safari on OS X.\n//\n\noptgroup {\n  font-weight: bold;\n}\n\n// Tables\n// ==========================================================================\n\n//\n// Remove most spacing between table cells.\n//\n\ntable {\n  border-collapse: collapse;\n  border-spacing: 0;\n}\n\ntd,\nth {\n  padding: 0;\n}\n"
  },
  {
    "path": "client/less/lib/bootstrap/pager.less",
    "content": "//\n// Pager pagination\n// --------------------------------------------------\n\n\n.pager {\n  padding-left: 0;\n  margin: @line-height-computed 0;\n  list-style: none;\n  text-align: center;\n  &:extend(.clearfix all);\n  li {\n    display: inline;\n    > a,\n    > span {\n      display: inline-block;\n      padding: 5px 14px;\n      background-color: @pager-bg;\n      border: 1px solid @pager-border;\n      border-radius: @pager-border-radius;\n    }\n\n    > a:hover,\n    > a:focus {\n      text-decoration: none;\n      background-color: @pager-hover-bg;\n    }\n  }\n\n  .next {\n    > a,\n    > span {\n      float: right;\n    }\n  }\n\n  .previous {\n    > a,\n    > span {\n      float: left;\n    }\n  }\n\n  .disabled {\n    > a,\n    > a:hover,\n    > a:focus,\n    > span {\n      color: @pager-disabled-color;\n      background-color: @pager-bg;\n      cursor: @cursor-disabled;\n    }\n  }\n}\n"
  },
  {
    "path": "client/less/lib/bootstrap/pagination.less",
    "content": "//\n// Pagination (multiple pages)\n// --------------------------------------------------\n.pagination {\n  display: inline-block;\n  padding-left: 0;\n  margin: @line-height-computed 0;\n  border-radius: @border-radius-base;\n\n  > li {\n    display: inline; // Remove list-style and block-level defaults\n    > a,\n    > span {\n      position: relative;\n      float: left; // Collapse white-space\n      padding: @padding-base-vertical @padding-base-horizontal;\n      line-height: @line-height-base;\n      text-decoration: none;\n      color: @pagination-color;\n      background-color: @pagination-bg;\n      border: 1px solid @pagination-border;\n      margin-left: -1px;\n    }\n    &:first-child {\n      > a,\n      > span {\n        margin-left: 0;\n        .border-left-radius(@border-radius-base);\n      }\n    }\n    &:last-child {\n      > a,\n      > span {\n        .border-right-radius(@border-radius-base);\n      }\n    }\n  }\n\n  > li > a,\n  > li > span {\n    &:hover,\n    &:focus {\n      color: @pagination-hover-color;\n      background-color: @pagination-hover-bg;\n      border-color: @pagination-hover-border;\n    }\n  }\n\n  > .active > a,\n  > .active > span {\n    &,\n    &:hover,\n    &:focus {\n      z-index: 2;\n      color: @pagination-active-color;\n      background-color: @pagination-active-bg;\n      border-color: @pagination-active-border;\n      cursor: default;\n    }\n  }\n\n  > .disabled {\n    > span,\n    > span:hover,\n    > span:focus,\n    > a,\n    > a:hover,\n    > a:focus {\n      color: @pagination-disabled-color;\n      background-color: @pagination-disabled-bg;\n      border-color: @pagination-disabled-border;\n      cursor: @cursor-disabled;\n    }\n  }\n}\n\n// Sizing\n// --------------------------------------------------\n\n// Large\n.pagination-lg {\n  .pagination-size(@padding-large-vertical; @padding-large-horizontal; @font-size-large; @border-radius-large);\n}\n\n// Small\n.pagination-sm {\n  .pagination-size(@padding-small-vertical; @padding-small-horizontal; @font-size-small; @border-radius-small);\n}\n"
  },
  {
    "path": "client/less/lib/bootstrap/panels.less",
    "content": "//\n// Panels\n// --------------------------------------------------\n\n\n// Base class\n.panel {\n  margin-bottom: @line-height-computed;\n  background-color: @panel-bg;\n  border: 1px solid transparent;\n  border-radius: @panel-border-radius;\n  .box-shadow(0 1px 1px rgba(0,0,0,.05));\n}\n\n// Panel contents\n.panel-body {\n  padding: @panel-body-padding;\n  &:extend(.clearfix all);\n}\n\n// Optional heading\n.panel-heading {\n  padding: @panel-heading-padding;\n  border-bottom: 1px solid transparent;\n  .border-top-radius((@panel-border-radius - 1));\n\n  > .dropdown .dropdown-toggle {\n    color: inherit;\n  }\n}\n\n// Within heading, strip any `h*` tag of its default margins for spacing.\n.panel-title {\n  margin-top: 0;\n  margin-bottom: 0;\n  font-size: ceil((@font-size-base * 1.125));\n  color: inherit;\n\n  > a {\n    color: inherit;\n  }\n}\n\n// Optional footer (stays gray in every modifier class)\n.panel-footer {\n  padding: @panel-footer-padding;\n  background-color: @panel-footer-bg;\n  border-top: 1px solid @panel-inner-border;\n  .border-bottom-radius((@panel-border-radius - 1));\n}\n\n\n// List groups in panels\n//\n// By default, space out list group content from panel headings to account for\n// any kind of custom content between the two.\n\n.panel {\n  > .list-group,\n  > .panel-collapse > .list-group {\n    margin-bottom: 0;\n\n    .list-group-item {\n      border-width: 1px 0;\n      border-radius: 0;\n    }\n\n    // Add border top radius for first one\n    &:first-child {\n      .list-group-item:first-child {\n        border-top: 0;\n        .border-top-radius((@panel-border-radius - 1));\n      }\n    }\n    // Add border bottom radius for last one\n    &:last-child {\n      .list-group-item:last-child {\n        border-bottom: 0;\n        .border-bottom-radius((@panel-border-radius - 1));\n      }\n    }\n  }\n}\n// Collapse space between when there's no additional content.\n.panel-heading + .list-group {\n  .list-group-item:first-child {\n    border-top-width: 0;\n  }\n}\n.list-group + .panel-footer {\n  border-top-width: 0;\n}\n\n// Tables in panels\n//\n// Place a non-bordered `.table` within a panel (not within a `.panel-body`) and\n// watch it go full width.\n\n.panel {\n  > .table,\n  > .table-responsive > .table,\n  > .panel-collapse > .table {\n    margin-bottom: 0;\n\n    caption {\n      padding-left: @panel-body-padding;\n      padding-right: @panel-body-padding;\n    }\n  }\n  // Add border top radius for first one\n  > .table:first-child,\n  > .table-responsive:first-child > .table:first-child {\n    .border-top-radius((@panel-border-radius - 1));\n\n    > thead:first-child,\n    > tbody:first-child {\n      > tr:first-child {\n        border-top-left-radius: (@panel-border-radius - 1);\n        border-top-right-radius: (@panel-border-radius - 1);\n\n        td:first-child,\n        th:first-child {\n          border-top-left-radius: (@panel-border-radius - 1);\n        }\n        td:last-child,\n        th:last-child {\n          border-top-right-radius: (@panel-border-radius - 1);\n        }\n      }\n    }\n  }\n  // Add border bottom radius for last one\n  > .table:last-child,\n  > .table-responsive:last-child > .table:last-child {\n    .border-bottom-radius((@panel-border-radius - 1));\n\n    > tbody:last-child,\n    > tfoot:last-child {\n      > tr:last-child {\n        border-bottom-left-radius: (@panel-border-radius - 1);\n        border-bottom-right-radius: (@panel-border-radius - 1);\n\n        td:first-child,\n        th:first-child {\n          border-bottom-left-radius: (@panel-border-radius - 1);\n        }\n        td:last-child,\n        th:last-child {\n          border-bottom-right-radius: (@panel-border-radius - 1);\n        }\n      }\n    }\n  }\n  > .panel-body + .table,\n  > .panel-body + .table-responsive,\n  > .table + .panel-body,\n  > .table-responsive + .panel-body {\n    border-top: 1px solid @table-border-color;\n  }\n  > .table > tbody:first-child > tr:first-child th,\n  > .table > tbody:first-child > tr:first-child td {\n    border-top: 0;\n  }\n  > .table-bordered,\n  > .table-responsive > .table-bordered {\n    border: 0;\n    > thead,\n    > tbody,\n    > tfoot {\n      > tr {\n        > th:first-child,\n        > td:first-child {\n          border-left: 0;\n        }\n        > th:last-child,\n        > td:last-child {\n          border-right: 0;\n        }\n      }\n    }\n    > thead,\n    > tbody {\n      > tr:first-child {\n        > td,\n        > th {\n          border-bottom: 0;\n        }\n      }\n    }\n    > tbody,\n    > tfoot {\n      > tr:last-child {\n        > td,\n        > th {\n          border-bottom: 0;\n        }\n      }\n    }\n  }\n  > .table-responsive {\n    border: 0;\n    margin-bottom: 0;\n  }\n}\n\n\n// Collapsable panels (aka, accordion)\n//\n// Wrap a series of panels in `.panel-group` to turn them into an accordion with\n// the help of our collapse JavaScript plugin.\n\n.panel-group {\n  margin-bottom: @line-height-computed;\n\n  // Tighten up margin so it's only between panels\n  .panel {\n    margin-bottom: 0;\n    border-radius: @panel-border-radius;\n\n    + .panel {\n      margin-top: 5px;\n    }\n  }\n\n  .panel-heading {\n    border-bottom: 0;\n\n    + .panel-collapse > .panel-body,\n    + .panel-collapse > .list-group {\n      border-top: 1px solid @panel-inner-border;\n    }\n  }\n\n  .panel-footer {\n    border-top: 0;\n    + .panel-collapse .panel-body {\n      border-bottom: 1px solid @panel-inner-border;\n    }\n  }\n}\n\n\n// Contextual variations\n.panel-default {\n  .panel-variant(@panel-default-border; @panel-default-text; @panel-default-heading-bg; @panel-default-border);\n}\n.panel-primary {\n  .panel-variant(@panel-primary-border; @panel-primary-text; @panel-primary-heading-bg; @panel-primary-border);\n}\n.panel-success {\n  .panel-variant(@panel-success-border; @panel-success-text; @panel-success-heading-bg; @panel-success-border);\n}\n.panel-info {\n  .panel-variant(@panel-info-border; @panel-info-text; @panel-info-heading-bg; @panel-info-border);\n}\n.panel-warning {\n  .panel-variant(@panel-warning-border; @panel-warning-text; @panel-warning-heading-bg; @panel-warning-border);\n}\n.panel-danger {\n  .panel-variant(@panel-danger-border; @panel-danger-text; @panel-danger-heading-bg; @panel-danger-border);\n}\n"
  },
  {
    "path": "client/less/lib/bootstrap/popovers.less",
    "content": "//\n// Popovers\n// --------------------------------------------------\n\n\n.popover {\n  position: absolute;\n  top: 0;\n  left: 0;\n  z-index: @zindex-popover;\n  display: none;\n  max-width: @popover-max-width;\n  padding: 1px;\n  // Reset font and text propertes given new insertion method\n  font-size: @font-size-base;\n  font-weight: normal;\n  line-height: @line-height-base;\n  text-align: left;\n  background-color: @popover-bg;\n  background-clip: padding-box;\n  border: 1px solid @popover-fallback-border-color;\n  border: 1px solid @popover-border-color;\n  border-radius: @border-radius-large;\n  .box-shadow(0 5px 10px rgba(0,0,0,.2));\n\n  // Overrides for proper insertion\n  white-space: normal;\n\n  // Offset the popover to account for the popover arrow\n  &.top     { margin-top: -@popover-arrow-width; }\n  &.right   { margin-left: @popover-arrow-width; }\n  &.bottom  { margin-top: @popover-arrow-width; }\n  &.left    { margin-left: -@popover-arrow-width; }\n}\n\n.popover-title {\n  margin: 0; // reset heading margin\n  padding: 8px 14px;\n  font-size: @font-size-base;\n  background-color: @popover-title-bg;\n  border-bottom: 1px solid darken(@popover-title-bg, 5%);\n  border-radius: (@border-radius-large - 1) (@border-radius-large - 1) 0 0;\n}\n\n.popover-content {\n  padding: 9px 14px;\n}\n\n// Arrows\n//\n// .arrow is outer, .arrow:after is inner\n\n.popover > .arrow {\n  &,\n  &:after {\n    position: absolute;\n    display: block;\n    width: 0;\n    height: 0;\n    border-color: transparent;\n    border-style: solid;\n  }\n}\n.popover > .arrow {\n  border-width: @popover-arrow-outer-width;\n}\n.popover > .arrow:after {\n  border-width: @popover-arrow-width;\n  content: \"\";\n}\n\n.popover {\n  &.top > .arrow {\n    left: 50%;\n    margin-left: -@popover-arrow-outer-width;\n    border-bottom-width: 0;\n    border-top-color: @popover-arrow-outer-fallback-color; // IE8 fallback\n    border-top-color: @popover-arrow-outer-color;\n    bottom: -@popover-arrow-outer-width;\n    &:after {\n      content: \" \";\n      bottom: 1px;\n      margin-left: -@popover-arrow-width;\n      border-bottom-width: 0;\n      border-top-color: @popover-arrow-color;\n    }\n  }\n  &.right > .arrow {\n    top: 50%;\n    left: -@popover-arrow-outer-width;\n    margin-top: -@popover-arrow-outer-width;\n    border-left-width: 0;\n    border-right-color: @popover-arrow-outer-fallback-color; // IE8 fallback\n    border-right-color: @popover-arrow-outer-color;\n    &:after {\n      content: \" \";\n      left: 1px;\n      bottom: -@popover-arrow-width;\n      border-left-width: 0;\n      border-right-color: @popover-arrow-color;\n    }\n  }\n  &.bottom > .arrow {\n    left: 50%;\n    margin-left: -@popover-arrow-outer-width;\n    border-top-width: 0;\n    border-bottom-color: @popover-arrow-outer-fallback-color; // IE8 fallback\n    border-bottom-color: @popover-arrow-outer-color;\n    top: -@popover-arrow-outer-width;\n    &:after {\n      content: \" \";\n      top: 1px;\n      margin-left: -@popover-arrow-width;\n      border-top-width: 0;\n      border-bottom-color: @popover-arrow-color;\n    }\n  }\n\n  &.left > .arrow {\n    top: 50%;\n    right: -@popover-arrow-outer-width;\n    margin-top: -@popover-arrow-outer-width;\n    border-right-width: 0;\n    border-left-color: @popover-arrow-outer-fallback-color; // IE8 fallback\n    border-left-color: @popover-arrow-outer-color;\n    &:after {\n      content: \" \";\n      right: 1px;\n      border-right-width: 0;\n      border-left-color: @popover-arrow-color;\n      bottom: -@popover-arrow-width;\n    }\n  }\n}\n"
  },
  {
    "path": "client/less/lib/bootstrap/print.less",
    "content": "/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */\n\n// ==========================================================================\n// Print styles.\n// Inlined to avoid the additional HTTP request: h5bp.com/r\n// ==========================================================================\n\n@media print {\n    *,\n    *:before,\n    *:after {\n        background: transparent !important;\n        color: #000 !important; // Black prints faster: h5bp.com/s\n        box-shadow: none !important;\n        text-shadow: none !important;\n    }\n\n    a,\n    a:visited {\n        text-decoration: underline;\n    }\n\n    a[href]:after {\n        content: \" (\" attr(href) \")\";\n    }\n\n    abbr[title]:after {\n        content: \" (\" attr(title) \")\";\n    }\n\n    // Don't show links that are fragment identifiers,\n    // or use the `javascript:` pseudo protocol\n    a[href^=\"#\"]:after,\n    a[href^=\"javascript:\"]:after {\n        content: \"\";\n    }\n\n    pre,\n    blockquote {\n        border: 1px solid #999;\n        page-break-inside: avoid;\n    }\n\n    thead {\n        display: table-header-group; // h5bp.com/t\n    }\n\n    tr,\n    img {\n        page-break-inside: avoid;\n    }\n\n    img {\n        max-width: 100% !important;\n    }\n\n    p,\n    h2,\n    h3 {\n        orphans: 3;\n        widows: 3;\n    }\n\n    h2,\n    h3 {\n        page-break-after: avoid;\n    }\n\n    // Bootstrap specific changes start\n    //\n    // Chrome (OSX) fix for https://github.com/twbs/bootstrap/issues/11245\n    // Once fixed, we can just straight up remove this.\n    select {\n        background: #fff !important;\n    }\n\n    // Bootstrap components\n    .navbar {\n        display: none;\n    }\n    .btn,\n    .dropup > .btn {\n        > .caret {\n            border-top-color: #000 !important;\n        }\n    }\n    .label {\n        border: 1px solid #000;\n    }\n\n    .table {\n        border-collapse: collapse !important;\n\n        td,\n        th {\n            background-color: #fff !important;\n        }\n    }\n    .table-bordered {\n        th,\n        td {\n            border: 1px solid #ddd !important;\n        }\n    }\n\n    // Bootstrap specific changes end\n}\n"
  },
  {
    "path": "client/less/lib/bootstrap/progress-bars.less",
    "content": "//\n// Progress bars\n// --------------------------------------------------\n\n\n// Bar animations\n// -------------------------\n\n// WebKit\n@-webkit-keyframes progress-bar-stripes {\n  from  { background-position: 40px 0; }\n  to    { background-position: 0 0; }\n}\n\n// Spec and IE10+\n@keyframes progress-bar-stripes {\n  from  { background-position: 40px 0; }\n  to    { background-position: 0 0; }\n}\n\n\n// Bar itself\n// -------------------------\n\n// Outer container\n.progress {\n  overflow: hidden;\n  height: @line-height-computed;\n  margin-bottom: @line-height-computed;\n  background-color: @progress-bg;\n  border-radius: @progress-border-radius;\n  .box-shadow(inset 0 1px 2px rgba(0,0,0,.1));\n}\n\n// Bar of progress\n.progress-bar {\n  float: left;\n  width: 0%;\n  height: 100%;\n  font-size: @font-size-small;\n  line-height: @line-height-computed;\n  color: @progress-bar-color;\n  text-align: center;\n  background-color: @progress-bar-bg;\n  .box-shadow(inset 0 -1px 0 rgba(0,0,0,.15));\n  .transition(width .6s ease);\n}\n\n// Striped bars\n//\n// `.progress-striped .progress-bar` is deprecated as of v3.2.0 in favor of the\n// `.progress-bar-striped` class, which you just add to an existing\n// `.progress-bar`.\n.progress-striped .progress-bar,\n.progress-bar-striped {\n  #gradient > .striped();\n  background-size: 40px 40px;\n}\n\n// Call animation for the active one\n//\n// `.progress.active .progress-bar` is deprecated as of v3.2.0 in favor of the\n// `.progress-bar.active` approach.\n.progress.active .progress-bar,\n.progress-bar.active {\n  .animation(progress-bar-stripes 2s linear infinite);\n}\n\n\n// Variations\n// -------------------------\n\n.progress-bar-success {\n  .progress-bar-variant(@progress-bar-success-bg);\n}\n\n.progress-bar-info {\n  .progress-bar-variant(@progress-bar-info-bg);\n}\n\n.progress-bar-warning {\n  .progress-bar-variant(@progress-bar-warning-bg);\n}\n\n.progress-bar-danger {\n  .progress-bar-variant(@progress-bar-danger-bg);\n}\n"
  },
  {
    "path": "client/less/lib/bootstrap/responsive-embed.less",
    "content": "// Embeds responsive\n//\n// Credit: Nicolas Gallagher and SUIT CSS.\n\n.embed-responsive {\n  position: relative;\n  display: block;\n  height: 0;\n  padding: 0;\n  overflow: hidden;\n\n  .embed-responsive-item,\n  iframe,\n  embed,\n  object,\n  video {\n    position: absolute;\n    top: 0;\n    left: 0;\n    bottom: 0;\n    height: 100%;\n    width: 100%;\n    border: 0;\n  }\n\n  // Modifier class for 16:9 aspect ratio\n  &.embed-responsive-16by9 {\n    padding-bottom: 56.25%;\n  }\n\n  // Modifier class for 4:3 aspect ratio\n  &.embed-responsive-4by3 {\n    padding-bottom: 75%;\n  }\n}\n"
  },
  {
    "path": "client/less/lib/bootstrap/responsive-utilities.less",
    "content": "//\n// Responsive: Utility classes\n// --------------------------------------------------\n\n\n// IE10 in Windows (Phone) 8\n//\n// Support for responsive views via media queries is kind of borked in IE10, for\n// Surface/desktop in split view and for Windows Phone 8. This particular fix\n// must be accompanied by a snippet of JavaScript to sniff the user agent and\n// apply some conditional CSS to *only* the Surface/desktop Windows 8. Look at\n// our Getting Started page for more information on this bug.\n//\n// For more information, see the following:\n//\n// Issue: https://github.com/twbs/bootstrap/issues/10497\n// Docs: http://getbootstrap.com/getting-started/#support-ie10-width\n// Source: http://timkadlec.com/2013/01/windows-phone-8-and-device-width/\n// Source: http://timkadlec.com/2012/10/ie10-snap-mode-and-responsive-design/\n\n@-ms-viewport {\n  width: device-width;\n}\n\n\n// Visibility utilities\n// Note: Deprecated .visible-xs, .visible-sm, .visible-md, and .visible-lg as of v3.2.0\n.visible-xs,\n.visible-sm,\n.visible-md,\n.visible-lg {\n  .responsive-invisibility();\n}\n\n.visible-xs-block,\n.visible-xs-inline,\n.visible-xs-inline-block,\n.visible-sm-block,\n.visible-sm-inline,\n.visible-sm-inline-block,\n.visible-md-block,\n.visible-md-inline,\n.visible-md-inline-block,\n.visible-lg-block,\n.visible-lg-inline,\n.visible-lg-inline-block {\n  display: none !important;\n}\n\n.visible-xs {\n  @media (max-width: @screen-xs-max) {\n    .responsive-visibility();\n  }\n}\n.visible-xs-block {\n  @media (max-width: @screen-xs-max) {\n    display: block !important;\n  }\n}\n.visible-xs-inline {\n  @media (max-width: @screen-xs-max) {\n    display: inline !important;\n  }\n}\n.visible-xs-inline-block {\n  @media (max-width: @screen-xs-max) {\n    display: inline-block !important;\n  }\n}\n\n.visible-sm {\n  @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) {\n    .responsive-visibility();\n  }\n}\n.visible-sm-block {\n  @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) {\n    display: block !important;\n  }\n}\n.visible-sm-inline {\n  @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) {\n    display: inline !important;\n  }\n}\n.visible-sm-inline-block {\n  @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) {\n    display: inline-block !important;\n  }\n}\n\n.visible-md {\n  @media (min-width: @screen-md-min) and (max-width: @screen-md-max) {\n    .responsive-visibility();\n  }\n}\n.visible-md-block {\n  @media (min-width: @screen-md-min) and (max-width: @screen-md-max) {\n    display: block !important;\n  }\n}\n.visible-md-inline {\n  @media (min-width: @screen-md-min) and (max-width: @screen-md-max) {\n    display: inline !important;\n  }\n}\n.visible-md-inline-block {\n  @media (min-width: @screen-md-min) and (max-width: @screen-md-max) {\n    display: inline-block !important;\n  }\n}\n\n.visible-lg {\n  @media (min-width: @screen-lg-min) {\n    .responsive-visibility();\n  }\n}\n.visible-lg-block {\n  @media (min-width: @screen-lg-min) {\n    display: block !important;\n  }\n}\n.visible-lg-inline {\n  @media (min-width: @screen-lg-min) {\n    display: inline !important;\n  }\n}\n.visible-lg-inline-block {\n  @media (min-width: @screen-lg-min) {\n    display: inline-block !important;\n  }\n}\n\n.hidden-xs {\n  @media (max-width: @screen-xs-max) {\n    .responsive-invisibility();\n  }\n}\n.hidden-sm {\n  @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) {\n    .responsive-invisibility();\n  }\n}\n.hidden-md {\n  @media (min-width: @screen-md-min) and (max-width: @screen-md-max) {\n    .responsive-invisibility();\n  }\n}\n.hidden-lg {\n  @media (min-width: @screen-lg-min) {\n    .responsive-invisibility();\n  }\n}\n\n\n// Print utilities\n//\n// Media queries are placed on the inside to be mixin-friendly.\n\n// Note: Deprecated .visible-print as of v3.2.0\n.visible-print {\n  .responsive-invisibility();\n\n  @media print {\n    .responsive-visibility();\n  }\n}\n.visible-print-block {\n  display: none !important;\n\n  @media print {\n    display: block !important;\n  }\n}\n.visible-print-inline {\n  display: none !important;\n\n  @media print {\n    display: inline !important;\n  }\n}\n.visible-print-inline-block {\n  display: none !important;\n\n  @media print {\n    display: inline-block !important;\n  }\n}\n\n.hidden-print {\n  @media print {\n    .responsive-invisibility();\n  }\n}\n"
  },
  {
    "path": "client/less/lib/bootstrap/scaffolding.less",
    "content": "//\n// Scaffolding\n// --------------------------------------------------\n\n\n// Reset the box-sizing\n//\n// Heads up! This reset may cause conflicts with some third-party widgets.\n// For recommendations on resolving such conflicts, see\n// http://getbootstrap.com/getting-started/#third-box-sizing\n* {\n  .box-sizing(border-box);\n}\n*:before,\n*:after {\n  .box-sizing(border-box);\n}\n\n\n// Body reset\n\nhtml {\n  font-size: 10px;\n  -webkit-tap-highlight-color: rgba(0,0,0,0);\n}\n\nbody {\n  font-family: @font-family-base;\n  font-size: @font-size-base;\n  line-height: @line-height-base;\n  color: @text-color;\n  background-color: @body-bg;\n}\n\n// Reset fonts for relevant elements\ninput,\nbutton,\nselect,\ntextarea {\n  font-family: inherit;\n  font-size: inherit;\n  line-height: inherit;\n}\n\n\n// Links\n\na {\n  color: @link-color;\n  text-decoration: none;\n\n  &:hover,\n  &:focus {\n    color: @link-hover-color;\n    text-decoration: @link-hover-decoration;\n  }\n\n  &:focus {\n    .tab-focus();\n  }\n}\n\n\n// Figures\n//\n// We reset this here because previously Normalize had no `figure` margins. This\n// ensures we don't break anyone's use of the element.\n\nfigure {\n  margin: 0;\n}\n\n\n// Images\n\nimg {\n  vertical-align: middle;\n}\n\n// Responsive images (ensure images don't scale beyond their parents)\n.img-responsive {\n  .img-responsive();\n}\n\n// Rounded corners\n.img-rounded {\n  border-radius: @border-radius-large;\n}\n\n// Image thumbnails\n//\n// Heads up! This is mixin-ed into thumbnails.less for `.thumbnail`.\n.img-thumbnail {\n  padding: @thumbnail-padding;\n  line-height: @line-height-base;\n  background-color: @thumbnail-bg;\n  border: 1px solid @thumbnail-border;\n  border-radius: @thumbnail-border-radius;\n  .transition(all .2s ease-in-out);\n\n  // Keep them at most 100% wide\n  .img-responsive(inline-block);\n}\n\n// Perfect circle\n.img-circle {\n  border-radius: 50%; // set radius in percents\n}\n\n\n// Horizontal rules\n\nhr {\n  margin-top:    @line-height-computed;\n  margin-bottom: @line-height-computed;\n  border: 0;\n  border-top: 1px solid @hr-border;\n}\n\n\n// Only display content to screen readers\n//\n// See: http://a11yproject.com/posts/how-to-hide-content/\n\n.sr-only {\n  position: absolute;\n  width: 1px;\n  height: 1px;\n  margin: -1px;\n  padding: 0;\n  overflow: hidden;\n  clip: rect(0,0,0,0);\n  border: 0;\n}\n\n// Use in conjunction with .sr-only to only display content when it's focused.\n// Useful for \"Skip to main content\" links; see http://www.w3.org/TR/2013/NOTE-WCAG20-TECHS-20130905/G1\n// Credit: HTML5 Boilerplate\n\n.sr-only-focusable {\n  &:active,\n  &:focus {\n    position: static;\n    width: auto;\n    height: auto;\n    margin: 0;\n    overflow: visible;\n    clip: auto;\n  }\n}\n"
  },
  {
    "path": "client/less/lib/bootstrap/tables.less",
    "content": "//\n// Tables\n// --------------------------------------------------\n\n\ntable {\n  background-color: @table-bg;\n}\ncaption {\n  padding-top: @table-cell-padding;\n  padding-bottom: @table-cell-padding;\n  color: @text-muted;\n  text-align: left;\n}\nth {\n  text-align: left;\n}\n\n\n// Baseline styles\n\n.table {\n  width: 100%;\n  max-width: 100%;\n  margin-bottom: @line-height-computed;\n  // Cells\n  > thead,\n  > tbody,\n  > tfoot {\n    > tr {\n      > th,\n      > td {\n        padding: @table-cell-padding;\n        line-height: @line-height-base;\n        vertical-align: top;\n        border-top: 1px solid @table-border-color;\n      }\n    }\n  }\n  // Bottom align for column headings\n  > thead > tr > th {\n    vertical-align: bottom;\n    border-bottom: 2px solid @table-border-color;\n  }\n  // Remove top border from thead by default\n  > caption + thead,\n  > colgroup + thead,\n  > thead:first-child {\n    > tr:first-child {\n      > th,\n      > td {\n        border-top: 0;\n      }\n    }\n  }\n  // Account for multiple tbody instances\n  > tbody + tbody {\n    border-top: 2px solid @table-border-color;\n  }\n\n  // Nesting\n  .table {\n    background-color: @body-bg;\n  }\n}\n\n\n// Condensed table w/ half padding\n\n.table-condensed {\n  > thead,\n  > tbody,\n  > tfoot {\n    > tr {\n      > th,\n      > td {\n        padding: @table-condensed-cell-padding;\n      }\n    }\n  }\n}\n\n\n// Bordered version\n//\n// Add borders all around the table and between all the columns.\n\n.table-bordered {\n  border: 1px solid @table-border-color;\n  > thead,\n  > tbody,\n  > tfoot {\n    > tr {\n      > th,\n      > td {\n        border: 1px solid @table-border-color;\n      }\n    }\n  }\n  > thead > tr {\n    > th,\n    > td {\n      border-bottom-width: 2px;\n    }\n  }\n}\n\n\n// Zebra-striping\n//\n// Default zebra-stripe styles (alternating gray and transparent backgrounds)\n\n.table-striped {\n  > tbody > tr:nth-child(odd) {\n    background-color: @table-bg-accent;\n  }\n}\n\n\n// Hover effect\n//\n// Placed here since it has to come after the potential zebra striping\n\n.table-hover {\n  > tbody > tr:hover {\n    background-color: @table-bg-hover;\n  }\n}\n\n\n// Table cell sizing\n//\n// Reset default table behavior\n\ntable col[class*=\"col-\"] {\n  position: static; // Prevent border hiding in Firefox and IE9/10 (see https://github.com/twbs/bootstrap/issues/11623)\n  float: none;\n  display: table-column;\n}\ntable {\n  td,\n  th {\n    &[class*=\"col-\"] {\n      position: static; // Prevent border hiding in Firefox and IE9/10 (see https://github.com/twbs/bootstrap/issues/11623)\n      float: none;\n      display: table-cell;\n    }\n  }\n}\n\n\n// Table backgrounds\n//\n// Exact selectors below required to override `.table-striped` and prevent\n// inheritance to nested tables.\n\n// Generate the contextual variants\n.table-row-variant(active; @table-bg-active);\n.table-row-variant(success; @state-success-bg);\n.table-row-variant(info; @state-info-bg);\n.table-row-variant(warning; @state-warning-bg);\n.table-row-variant(danger; @state-danger-bg);\n\n\n// Responsive tables\n//\n// Wrap your tables in `.table-responsive` and we'll make them mobile friendly\n// by enabling horizontal scrolling. Only applies <768px. Everything above that\n// will display normally.\n\n.table-responsive {\n  overflow-x: auto;\n  min-height: 0.01%; // Workaround for IE9 bug (see https://github.com/twbs/bootstrap/issues/14837)\n\n  @media screen and (max-width: @screen-xs-max) {\n    width: 100%;\n    margin-bottom: (@line-height-computed * 0.75);\n    overflow-y: hidden;\n    -ms-overflow-style: -ms-autohiding-scrollbar;\n    border: 1px solid @table-border-color;\n\n    // Tighten up spacing\n    > .table {\n      margin-bottom: 0;\n\n      // Ensure the content doesn't wrap\n      > thead,\n      > tbody,\n      > tfoot {\n        > tr {\n          > th,\n          > td {\n            white-space: nowrap;\n          }\n        }\n      }\n    }\n\n    // Special overrides for the bordered tables\n    > .table-bordered {\n      border: 0;\n\n      // Nuke the appropriate borders so that the parent can handle them\n      > thead,\n      > tbody,\n      > tfoot {\n        > tr {\n          > th:first-child,\n          > td:first-child {\n            border-left: 0;\n          }\n          > th:last-child,\n          > td:last-child {\n            border-right: 0;\n          }\n        }\n      }\n\n      // Only nuke the last row's bottom-border in `tbody` and `tfoot` since\n      // chances are there will be only one `tr` in a `thead` and that would\n      // remove the border altogether.\n      > tbody,\n      > tfoot {\n        > tr:last-child {\n          > th,\n          > td {\n            border-bottom: 0;\n          }\n        }\n      }\n\n    }\n  }\n}\n"
  },
  {
    "path": "client/less/lib/bootstrap/theme.less",
    "content": "\n//\n// Load core variables and mixins\n// --------------------------------------------------\n\n@import \"variables.less\";\n@import \"mixins.less\";\n\n\n//\n// Buttons\n// --------------------------------------------------\n\n// Common styles\n.btn-default,\n.btn-primary,\n.btn-success,\n.btn-info,\n.btn-warning,\n.btn-danger {\n  text-shadow: 0 -1px 0 rgba(0,0,0,.2);\n  @shadow: inset 0 1px 0 rgba(255,255,255,.15), 0 1px 1px rgba(0,0,0,.075);\n  .box-shadow(@shadow);\n\n  // Reset the shadow\n  &:active,\n  &.active {\n    .box-shadow(inset 0 3px 5px rgba(0,0,0,.125));\n  }\n\n  .badge {\n    text-shadow: none;\n  }\n}\n\n// Mixin for generating new styles\n.btn-styles(@btn-color: #555) {\n  #gradient > .vertical(@start-color: @btn-color; @end-color: darken(@btn-color, 12%));\n  .reset-filter(); // Disable gradients for IE9 because filter bleeds through rounded corners\n  background-repeat: repeat-x;\n  border-color: darken(@btn-color, 14%);\n\n  &:hover,\n  &:focus  {\n    background-color: darken(@btn-color, 12%);\n    background-position: 0 -15px;\n  }\n\n  &:active,\n  &.active {\n    background-color: darken(@btn-color, 12%);\n    border-color: darken(@btn-color, 14%);\n  }\n\n  &:disabled,\n  &[disabled] {\n    background-color: darken(@btn-color, 12%);\n    background-image: none;\n  }\n}\n\n// Common styles\n.btn {\n  // Remove the gradient for the pressed/active state\n  &:active,\n  &.active {\n    background-image: none;\n  }\n}\n\n// Apply the mixin to the buttons\n.btn-default { .btn-styles(@btn-default-bg); text-shadow: 0 1px 0 #fff; border-color: #ccc; }\n.btn-primary { .btn-styles(@btn-primary-bg); }\n.btn-success { .btn-styles(@btn-success-bg); }\n.btn-info    { .btn-styles(@btn-info-bg); }\n.btn-warning { .btn-styles(@btn-warning-bg); }\n.btn-danger  { .btn-styles(@btn-danger-bg); }\n\n\n//\n// Images\n// --------------------------------------------------\n\n.thumbnail,\n.img-thumbnail {\n  .box-shadow(0 1px 2px rgba(0,0,0,.075));\n}\n\n\n//\n// Dropdowns\n// --------------------------------------------------\n\n.dropdown-menu > li > a:hover,\n.dropdown-menu > li > a:focus {\n  #gradient > .vertical(@start-color: @dropdown-link-hover-bg; @end-color: darken(@dropdown-link-hover-bg, 5%));\n  background-color: darken(@dropdown-link-hover-bg, 5%);\n}\n.dropdown-menu > .active > a,\n.dropdown-menu > .active > a:hover,\n.dropdown-menu > .active > a:focus {\n  #gradient > .vertical(@start-color: @dropdown-link-active-bg; @end-color: darken(@dropdown-link-active-bg, 5%));\n  background-color: darken(@dropdown-link-active-bg, 5%);\n}\n\n\n//\n// Navbar\n// --------------------------------------------------\n\n// Default navbar\n.navbar-default {\n  #gradient > .vertical(@start-color: lighten(@navbar-default-bg, 10%); @end-color: @navbar-default-bg);\n  .reset-filter(); // Remove gradient in IE<10 to fix bug where dropdowns don't get triggered\n  border-radius: @navbar-border-radius;\n  @shadow: inset 0 1px 0 rgba(255,255,255,.15), 0 1px 5px rgba(0,0,0,.075);\n  .box-shadow(@shadow);\n\n  .navbar-nav > .open > a,\n  .navbar-nav > .active > a {\n    #gradient > .vertical(@start-color: darken(@navbar-default-link-active-bg, 5%); @end-color: darken(@navbar-default-link-active-bg, 2%));\n    .box-shadow(inset 0 3px 9px rgba(0,0,0,.075));\n  }\n}\n.navbar-brand,\n.navbar-nav > li > a {\n  text-shadow: 0 1px 0 rgba(255,255,255,.25);\n}\n\n// Inverted navbar\n.navbar-inverse {\n  #gradient > .vertical(@start-color: lighten(@navbar-inverse-bg, 10%); @end-color: @navbar-inverse-bg);\n  .reset-filter(); // Remove gradient in IE<10 to fix bug where dropdowns don't get triggered\n\n  .navbar-nav > .open > a,\n  .navbar-nav > .active > a {\n    #gradient > .vertical(@start-color: @navbar-inverse-link-active-bg; @end-color: lighten(@navbar-inverse-link-active-bg, 2.5%));\n    .box-shadow(inset 0 3px 9px rgba(0,0,0,.25));\n  }\n\n  .navbar-brand,\n  .navbar-nav > li > a {\n    text-shadow: 0 -1px 0 rgba(0,0,0,.25);\n  }\n}\n\n// Undo rounded corners in static and fixed navbars\n.navbar-static-top,\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n  border-radius: 0;\n}\n\n\n//\n// Alerts\n// --------------------------------------------------\n\n// Common styles\n.alert {\n  text-shadow: 0 1px 0 rgba(255,255,255,.2);\n  @shadow: inset 0 1px 0 rgba(255,255,255,.25), 0 1px 2px rgba(0,0,0,.05);\n  .box-shadow(@shadow);\n}\n\n// Mixin for generating new styles\n.alert-styles(@color) {\n  #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 7.5%));\n  border-color: darken(@color, 15%);\n}\n\n// Apply the mixin to the alerts\n.alert-success    { .alert-styles(@alert-success-bg); }\n.alert-info       { .alert-styles(@alert-info-bg); }\n.alert-warning    { .alert-styles(@alert-warning-bg); }\n.alert-danger     { .alert-styles(@alert-danger-bg); }\n\n\n//\n// Progress bars\n// --------------------------------------------------\n\n// Give the progress background some depth\n.progress {\n  #gradient > .vertical(@start-color: darken(@progress-bg, 4%); @end-color: @progress-bg)\n}\n\n// Mixin for generating new styles\n.progress-bar-styles(@color) {\n  #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 10%));\n}\n\n// Apply the mixin to the progress bars\n.progress-bar            { .progress-bar-styles(@progress-bar-bg); }\n.progress-bar-success    { .progress-bar-styles(@progress-bar-success-bg); }\n.progress-bar-info       { .progress-bar-styles(@progress-bar-info-bg); }\n.progress-bar-warning    { .progress-bar-styles(@progress-bar-warning-bg); }\n.progress-bar-danger     { .progress-bar-styles(@progress-bar-danger-bg); }\n\n// Reset the striped class because our mixins don't do multiple gradients and\n// the above custom styles override the new `.progress-bar-striped` in v3.2.0.\n.progress-bar-striped {\n  #gradient > .striped();\n}\n\n\n//\n// List groups\n// --------------------------------------------------\n\n.list-group {\n  border-radius: @border-radius-base;\n  .box-shadow(0 1px 2px rgba(0,0,0,.075));\n}\n.list-group-item.active,\n.list-group-item.active:hover,\n.list-group-item.active:focus {\n  text-shadow: 0 -1px 0 darken(@list-group-active-bg, 10%);\n  #gradient > .vertical(@start-color: @list-group-active-bg; @end-color: darken(@list-group-active-bg, 7.5%));\n  border-color: darken(@list-group-active-border, 7.5%);\n\n  .badge {\n    text-shadow: none;\n  }\n}\n\n\n//\n// Panels\n// --------------------------------------------------\n\n// Common styles\n.panel {\n  .box-shadow(0 1px 2px rgba(0,0,0,.05));\n}\n\n// Mixin for generating new styles\n.panel-heading-styles(@color) {\n  #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 5%));\n}\n\n// Apply the mixin to the panel headings only\n.panel-default > .panel-heading   { .panel-heading-styles(@panel-default-heading-bg); }\n.panel-primary > .panel-heading   { .panel-heading-styles(@panel-primary-heading-bg); }\n.panel-success > .panel-heading   { .panel-heading-styles(@panel-success-heading-bg); }\n.panel-info > .panel-heading      { .panel-heading-styles(@panel-info-heading-bg); }\n.panel-warning > .panel-heading   { .panel-heading-styles(@panel-warning-heading-bg); }\n.panel-danger > .panel-heading    { .panel-heading-styles(@panel-danger-heading-bg); }\n\n\n//\n// Wells\n// --------------------------------------------------\n\n.well {\n  #gradient > .vertical(@start-color: darken(@well-bg, 5%); @end-color: @well-bg);\n  border-color: darken(@well-bg, 10%);\n  @shadow: inset 0 1px 3px rgba(0,0,0,.05), 0 1px 0 rgba(255,255,255,.1);\n  .box-shadow(@shadow);\n}\n"
  },
  {
    "path": "client/less/lib/bootstrap/thumbnails.less",
    "content": "//\n// Thumbnails\n// --------------------------------------------------\n\n\n// Mixin and adjust the regular image class\n.thumbnail {\n  display: block;\n  padding: @thumbnail-padding;\n  margin-bottom: @line-height-computed;\n  line-height: @line-height-base;\n  background-color: @thumbnail-bg;\n  border: 1px solid @thumbnail-border;\n  border-radius: @thumbnail-border-radius;\n  .transition(border .2s ease-in-out);\n\n  > img,\n  a > img {\n    &:extend(.img-responsive);\n    margin-left: auto;\n    margin-right: auto;\n  }\n\n  // Add a hover state for linked versions only\n  a&:hover,\n  a&:focus,\n  a&.active {\n    border-color: @link-color;\n  }\n\n  // Image captions\n  .caption {\n    padding: @thumbnail-caption-padding;\n    color: @thumbnail-caption-color;\n  }\n}\n"
  },
  {
    "path": "client/less/lib/bootstrap/tooltip.less",
    "content": "//\n// Tooltips\n// --------------------------------------------------\n\n\n// Base class\n.tooltip {\n  position: absolute;\n  z-index: @zindex-tooltip;\n  display: block;\n  visibility: visible;\n  font-size: @font-size-small;\n  line-height: 1.4;\n  .opacity(0);\n\n  &.in     { .opacity(@tooltip-opacity); }\n  &.top    { margin-top:  -3px; padding: @tooltip-arrow-width 0; }\n  &.right  { margin-left:  3px; padding: 0 @tooltip-arrow-width; }\n  &.bottom { margin-top:   3px; padding: @tooltip-arrow-width 0; }\n  &.left   { margin-left: -3px; padding: 0 @tooltip-arrow-width; }\n}\n\n// Wrapper for the tooltip content\n.tooltip-inner {\n  max-width: @tooltip-max-width;\n  padding: 3px 8px;\n  color: @tooltip-color;\n  text-align: center;\n  text-decoration: none;\n  background-color: @tooltip-bg;\n  border-radius: @border-radius-base;\n}\n\n// Arrows\n.tooltip-arrow {\n  position: absolute;\n  width: 0;\n  height: 0;\n  border-color: transparent;\n  border-style: solid;\n}\n.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: @tooltip-arrow-width;\n    border-width: @tooltip-arrow-width @tooltip-arrow-width 0;\n    border-top-color: @tooltip-arrow-color;\n  }\n  &.top-right .tooltip-arrow {\n    bottom: 0;\n    right: @tooltip-arrow-width;\n    border-width: @tooltip-arrow-width @tooltip-arrow-width 0;\n    border-top-color: @tooltip-arrow-color;\n  }\n  &.right .tooltip-arrow {\n    top: 50%;\n    left: 0;\n    margin-top: -@tooltip-arrow-width;\n    border-width: @tooltip-arrow-width @tooltip-arrow-width @tooltip-arrow-width 0;\n    border-right-color: @tooltip-arrow-color;\n  }\n  &.left .tooltip-arrow {\n    top: 50%;\n    right: 0;\n    margin-top: -@tooltip-arrow-width;\n    border-width: @tooltip-arrow-width 0 @tooltip-arrow-width @tooltip-arrow-width;\n    border-left-color: @tooltip-arrow-color;\n  }\n  &.bottom .tooltip-arrow {\n    top: 0;\n    left: 50%;\n    margin-left: -@tooltip-arrow-width;\n    border-width: 0 @tooltip-arrow-width @tooltip-arrow-width;\n    border-bottom-color: @tooltip-arrow-color;\n  }\n  &.bottom-left .tooltip-arrow {\n    top: 0;\n    left: @tooltip-arrow-width;\n    border-width: 0 @tooltip-arrow-width @tooltip-arrow-width;\n    border-bottom-color: @tooltip-arrow-color;\n  }\n  &.bottom-right .tooltip-arrow {\n    top: 0;\n    right: @tooltip-arrow-width;\n    border-width: 0 @tooltip-arrow-width @tooltip-arrow-width;\n    border-bottom-color: @tooltip-arrow-color;\n  }\n}\n"
  },
  {
    "path": "client/less/lib/bootstrap/type.less",
    "content": "//\n// Typography\n// --------------------------------------------------\n\n\n// Headings\n// -------------------------\n\nh1, h2, h3, h4, h5, h6,\n.h1, .h2, .h3, .h4, .h5, .h6 {\n  font-family: @headings-font-family;\n  font-weight: @headings-font-weight;\n  line-height: @headings-line-height;\n  color: @headings-color;\n\n  small,\n  .small {\n    font-weight: normal;\n    line-height: 1;\n    color: @headings-small-color;\n  }\n}\n\nh1, .h1,\nh2, .h2,\nh3, .h3 {\n  margin-top: @line-height-computed;\n  margin-bottom: (@line-height-computed / 2);\n\n  small,\n  .small {\n    font-size: 65%;\n  }\n}\nh4, .h4,\nh5, .h5,\nh6, .h6 {\n  margin-top: (@line-height-computed / 2);\n  margin-bottom: (@line-height-computed / 2);\n\n  small,\n  .small {\n    font-size: 75%;\n  }\n}\n\nh1, .h1 { font-size: @font-size-h1; }\nh2, .h2 { font-size: @font-size-h2; }\nh3, .h3 { font-size: @font-size-h3; }\nh4, .h4 { font-size: @font-size-h4; }\nh5, .h5 { font-size: @font-size-h5; }\nh6, .h6 { font-size: @font-size-h6; }\n\n\n// Body text\n// -------------------------\n\np {\n  margin: 0 0 (@line-height-computed / 2);\n}\n\n.lead {\n  margin-bottom: @line-height-computed;\n  font-size: floor((@font-size-base * 1.15));\n  font-weight: 300;\n  line-height: 1.4;\n\n  @media (min-width: @screen-sm-min) {\n    font-size: (@font-size-base * 1.5);\n  }\n}\n\n\n// Emphasis & misc\n// -------------------------\n\n// Ex: (12px small font / 14px base font) * 100% = about 85%\nsmall,\n.small {\n  font-size: floor((100% * @font-size-small / @font-size-base));\n}\n\nmark,\n.mark {\n  background-color: @state-warning-bg;\n  padding: .2em;\n}\n\n// Alignment\n.text-left           { text-align: left; }\n.text-right          { text-align: right; }\n.text-center         { text-align: center; }\n.text-justify        { text-align: justify; }\n.text-nowrap         { white-space: nowrap; }\n\n// Transformation\n.text-lowercase      { text-transform: lowercase; }\n.text-uppercase      { text-transform: uppercase; }\n.text-capitalize     { text-transform: capitalize; }\n\n// Contextual colors\n.text-muted {\n  color: @text-muted;\n}\n.text-primary {\n  .text-emphasis-variant(@brand-primary);\n}\n.text-success {\n  .text-emphasis-variant(@state-success-text);\n}\n.text-info {\n  .text-emphasis-variant(@state-info-text);\n}\n.text-warning {\n  .text-emphasis-variant(@state-warning-text);\n}\n.text-danger {\n  .text-emphasis-variant(@state-danger-text);\n}\n\n// Contextual backgrounds\n// For now we'll leave these alongside the text classes until v4 when we can\n// safely shift things around (per SemVer rules).\n.bg-primary {\n  // Given the contrast here, this is the only class to have its color inverted\n  // automatically.\n  color: #fff;\n  .bg-variant(@brand-primary);\n}\n.bg-success {\n  .bg-variant(@state-success-bg);\n}\n.bg-info {\n  .bg-variant(@state-info-bg);\n}\n.bg-warning {\n  .bg-variant(@state-warning-bg);\n}\n.bg-danger {\n  .bg-variant(@state-danger-bg);\n}\n\n\n// Page header\n// -------------------------\n\n.page-header {\n  padding-bottom: ((@line-height-computed / 2) - 1);\n  margin: (@line-height-computed * 2) 0 @line-height-computed;\n  border-bottom: 1px solid @page-header-border-color;\n}\n\n\n// Lists\n// -------------------------\n\n// Unordered and Ordered lists\nul,\nol {\n  margin-top: 0;\n  margin-bottom: (@line-height-computed / 2);\n  ul,\n  ol {\n    margin-bottom: 0;\n  }\n}\n\n// List options\n\n// Unstyled keeps list items block level, just removes default browser padding and list-style\n.list-unstyled {\n  padding-left: 0;\n  list-style: none;\n}\n\n// Inline turns list items into inline-block\n.list-inline {\n  .list-unstyled();\n  margin-left: -5px;\n\n  > li {\n    display: inline-block;\n    padding-left: 5px;\n    padding-right: 5px;\n  }\n}\n\n// Description Lists\ndl {\n  margin-top: 0; // Remove browser default\n  margin-bottom: @line-height-computed;\n}\ndt,\ndd {\n  line-height: @line-height-base;\n}\ndt {\n  font-weight: bold;\n}\ndd {\n  margin-left: 0; // Undo browser default\n}\n\n// Horizontal description lists\n//\n// Defaults to being stacked without any of the below styles applied, until the\n// grid breakpoint is reached (default of ~768px).\n\n.dl-horizontal {\n  dd {\n    &:extend(.clearfix all); // Clear the floated `dt` if an empty `dd` is present\n  }\n\n  @media (min-width: @grid-float-breakpoint) {\n    dt {\n      float: left;\n      width: (@dl-horizontal-offset - 20);\n      clear: left;\n      text-align: right;\n      .text-overflow();\n    }\n    dd {\n      margin-left: @dl-horizontal-offset;\n    }\n  }\n}\n\n\n// Misc\n// -------------------------\n\n// Abbreviations and acronyms\nabbr[title],\n// Add data-* attribute to help out our tooltip plugin, per https://github.com/twbs/bootstrap/issues/5257\nabbr[data-original-title] {\n  cursor: help;\n  border-bottom: 1px dotted @abbr-border-color;\n}\n.initialism {\n  font-size: 90%;\n  text-transform: uppercase;\n}\n\n// Blockquotes\nblockquote {\n  padding: (@line-height-computed / 2) @line-height-computed;\n  margin: 0 0 @line-height-computed;\n  font-size: @blockquote-font-size;\n  border-left: 5px solid @blockquote-border-color;\n\n  p,\n  ul,\n  ol {\n    &:last-child {\n      margin-bottom: 0;\n    }\n  }\n\n  // Note: Deprecated small and .small as of v3.1.0\n  // Context: https://github.com/twbs/bootstrap/issues/11660\n  footer,\n  small,\n  .small {\n    display: block;\n    font-size: 80%; // back to default font-size\n    line-height: @line-height-base;\n    color: @blockquote-small-color;\n\n    &:before {\n      content: '\\2014 \\00A0'; // em dash, nbsp\n    }\n  }\n}\n\n// Opposite alignment of blockquote\n//\n// Heads up: `blockquote.pull-right` has been deprecated as of v3.1.0.\n.blockquote-reverse,\nblockquote.pull-right {\n  padding-right: 15px;\n  padding-left: 0;\n  border-right: 5px solid @blockquote-border-color;\n  border-left: 0;\n  text-align: right;\n\n  // Account for citation\n  footer,\n  small,\n  .small {\n    &:before { content: ''; }\n    &:after {\n      content: '\\00A0 \\2014'; // nbsp, em dash\n    }\n  }\n}\n\n// Addresses\naddress {\n  margin-bottom: @line-height-computed;\n  font-style: normal;\n  line-height: @line-height-base;\n}\n"
  },
  {
    "path": "client/less/lib/bootstrap/utilities.less",
    "content": "//\n// Utility classes\n// --------------------------------------------------\n\n\n// Floats\n// -------------------------\n\n.clearfix {\n  .clearfix();\n}\n.center-block {\n  .center-block();\n}\n.pull-right {\n  float: right !important;\n}\n.pull-left {\n  float: left !important;\n}\n\n\n// Toggling content\n// -------------------------\n\n// Note: Deprecated .hide in favor of .hidden or .sr-only (as appropriate) in v3.0.1\n.hide {\n  display: none !important;\n}\n.show {\n  display: block !important;\n}\n.invisible {\n  visibility: hidden;\n}\n.text-hide {\n  .text-hide();\n}\n\n\n// Hide from screenreaders and browsers\n//\n// Credit: HTML5 Boilerplate\n\n.hidden {\n  display: none !important;\n  visibility: hidden !important;\n}\n\n\n// For Affix plugin\n// -------------------------\n\n.affix {\n  position: fixed;\n}\n"
  },
  {
    "path": "client/less/lib/bootstrap/variables.less",
    "content": "//\n// Variables\n// --------------------------------------------------\n\n\n//== Colors\n//\n//## Gray and brand colors for use across Bootstrap.\n\n@gray-base:              #000;\n@gray-darker:            lighten(@gray-base, 13.5%); // #222\n@gray-dark:              lighten(@gray-base, 20%);   // #333\n@gray:                   lighten(@gray-base, 33.5%); // #555\n@gray-light:             lighten(@gray-base, 46.7%); // #777\n@gray-lighter:           lighten(@gray-base, 93.5%); // #eee\n\n@brand-primary:         #4CAF50;\n@brand-success:         #457E86;\n@brand-info:            #4A2B0F;\n@brand-warning:         #f0ad4e;\n@brand-danger:          #d9534f;\n\n\n//== Scaffolding\n//\n//## Settings for some of the most global styles.\n\n//** Background color for `<body>`.\n@body-bg:               #ffffff;\n//** Global text color on `<body>`.\n@text-color:            @gray-dark;\n\n//** Global textual link color.\n@link-color:            @brand-primary;\n//** Link hover color set via `darken()` function.\n@link-hover-color:      darken(@link-color, 15%);\n//** Link hover decoration.\n@link-hover-decoration: underline;\n\n\n//== Typography\n//\n//## Font, line-height, and color for body text, headings, and more.\n\n@font-family-sans-serif:  \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n@font-family-serif:       Georgia, \"Times New Roman\", Times, serif;\n//** Default monospace fonts for `<code>`, `<kbd>`, and `<pre>`.\n@font-family-monospace:   Menlo, Monaco, Consolas, \"Courier New\", monospace;\n@font-family-base:        @font-family-sans-serif;\n\n@font-size-base:          14px;\n@font-size-large:         ceil((@font-size-base * 1.25)); // ~18px\n@font-size-small:         ceil((@font-size-base * 0.85)); // ~12px\n\n@font-size-h1:            floor((@font-size-base * 2.6)); // ~36px\n@font-size-h2:            floor((@font-size-base * 2.15)); // ~30px\n@font-size-h3:            ceil((@font-size-base * 1.7)); // ~24px\n@font-size-h4:            ceil((@font-size-base * 1.25)); // ~18px\n@font-size-h5:            @font-size-base;\n@font-size-h6:            ceil((@font-size-base * 0.85)); // ~12px\n\n//** Unit-less `line-height` for use in components like buttons.\n@line-height-base:        1.428571429; // 20/14\n//** Computed \"line-height\" (`font-size` * `line-height`) for use with `margin`, `padding`, etc.\n@line-height-computed:    floor((@font-size-base * @line-height-base)); // ~20px\n\n//** By default, this inherits from the `<body>`.\n@headings-font-family:    inherit;\n@headings-font-weight:    500;\n@headings-line-height:    1.1;\n@headings-color:          inherit;\n\n\n//== Iconography\n//\n//## Specify custom location and filename of the included Glyphicons icon font. Useful for those including Bootstrap via Bower.\n\n//** Load fonts from this directory.\n@icon-font-path:          \"../fonts/\";\n//** File name for all font files.\n@icon-font-name:          \"glyphicons-halflings-regular\";\n//** Element ID within SVG icon file.\n@icon-font-svg-id:        \"glyphicons_halflingsregular\";\n\n\n//== Components\n//\n//## Define common padding and border radius sizes and more. Values based on 14px text and 1.428 line-height (~20px to start).\n\n@padding-base-vertical:     6px;\n@padding-base-horizontal:   12px;\n\n@padding-large-vertical:    10px;\n@padding-large-horizontal:  16px;\n\n@padding-small-vertical:    5px;\n@padding-small-horizontal:  10px;\n\n@padding-xs-vertical:       1px;\n@padding-xs-horizontal:     5px;\n\n@line-height-large:         1.33;\n@line-height-small:         1.5;\n\n@border-radius-base:        4px;\n@border-radius-large:       6px;\n@border-radius-small:       3px;\n\n//** Global color for active items (e.g., navs or dropdowns).\n@component-active-color:    @gray-lighter;\n//** Global background color for active items (e.g., navs or dropdowns).\n@component-active-bg:       @brand-primary;\n\n//** Width of the `border` for generating carets that indicator dropdowns.\n@caret-width-base:          4px;\n//** Carets increase slightly in size for larger components.\n@caret-width-large:         5px;\n\n\n//== Tables\n//\n//## Customizes the `.table` component with basic values, each used across all table variations.\n\n//** Padding for `<th>`s and `<td>`s.\n@table-cell-padding:            8px;\n//** Padding for cells in `.table-condensed`.\n@table-condensed-cell-padding:  5px;\n\n//** Default background color used for all tables.\n@table-bg:                      transparent;\n//** Background color used for `.table-striped`.\n@table-bg-accent:               #f9f9f9;\n//** Background color used for `.table-hover`.\n@table-bg-hover:                #f5f5f5;\n@table-bg-active:               @table-bg-hover;\n\n//** Border color for table and cell borders.\n@table-border-color:            #ddd;\n\n\n//== Buttons\n//\n//## For each of Bootstrap's buttons, define text, background and border color.\n\n@btn-font-weight:                normal;\n\n@btn-default-color:              #000000;\n@btn-default-bg:                 @body-bg;\n@btn-default-border:             #000000;\n\n@btn-primary-color:              @brand-primary;\n@btn-primary-bg:                 @brand-primary;\n@btn-primary-border:             darken(@btn-primary-bg, 5%);\n\n@btn-success-color:              @brand-success;\n@btn-success-bg:                 @brand-success;\n@btn-success-border:             darken(@btn-success-bg, 5%);\n\n@btn-info-color:                 @brand-info;\n@btn-info-bg:                    @brand-info;\n@btn-info-border:                darken(@btn-info-bg, 5%);\n\n@btn-warning-color:              @brand-warning;\n@btn-warning-bg:                 @brand-warning;\n@btn-warning-border:             darken(@btn-warning-bg, 5%);\n\n@btn-danger-color:               @brand-danger;\n@btn-danger-bg:                  @brand-danger;\n@btn-danger-border:              darken(@btn-danger-bg, 5%);\n\n@btn-link-disabled-color:        @gray-light;\n\n\n//== Forms\n//\n//##\n\n//** `<input>` background color\n@input-bg:                       @gray-lighter;\n//** `<input disabled>` background color\n@input-bg-disabled:              @gray-lighter;\n\n//** Text color for `<input>`s\n@input-color:                    @gray;\n//** `<input>` border color\n@input-border:                   #ccc;\n\n// TODO: Rename `@input-border-radius` to `@input-border-radius-base` in v4\n//** Default `.form-control` border radius\n@input-border-radius:            @border-radius-base;\n//** Large `.form-control` border radius\n@input-border-radius-large:      @border-radius-large;\n//** Small `.form-control` border radius\n@input-border-radius-small:      @border-radius-small;\n\n//** Border color for inputs on focus\n@input-border-focus:             #66afe9;\n\n//** Placeholder text color\n@input-color-placeholder:        #999;\n\n//** Default `.form-control` height\n@input-height-base:              (@line-height-computed + (@padding-base-vertical * 2) + 2);\n//** Large `.form-control` height\n@input-height-large:             (ceil(@font-size-large * @line-height-large) + (@padding-large-vertical * 2) + 2);\n//** Small `.form-control` height\n@input-height-small:             (floor(@font-size-small * @line-height-small) + (@padding-small-vertical * 2) + 2);\n\n@legend-color:                   @gray-dark;\n@legend-border-color:            #e5e5e5;\n\n//** Background color for textual input addons\n@input-group-addon-bg:           @gray-lighter;\n//** Border color for textual input addons\n@input-group-addon-border-color: @input-border;\n\n//** Disabled cursor for form controls and buttons.\n@cursor-disabled:                not-allowed;\n\n\n//== Dropdowns\n//\n//## Dropdown menu container and contents.\n\n//** Background for the dropdown menu.\n@dropdown-bg:                    @gray-lighter;\n//** Dropdown menu `border-color`.\n@dropdown-border:                rgba(0,0,0,.15);\n//** Dropdown menu `border-color` **for IE8**.\n@dropdown-fallback-border:       #ccc;\n//** Divider color for between dropdown items.\n@dropdown-divider-bg:            #e5e5e5;\n\n//** Dropdown link text color.\n@dropdown-link-color:            @gray-dark;\n//** Hover color for dropdown links.\n@dropdown-link-hover-color:      darken(@gray-dark, 5%);\n//** Hover background for dropdown links.\n@dropdown-link-hover-bg:         #f5f5f5;\n\n//** Active dropdown menu item text color.\n@dropdown-link-active-color:     @component-active-color;\n//** Active dropdown menu item background color.\n@dropdown-link-active-bg:        @component-active-bg;\n\n//** Disabled dropdown menu item background color.\n@dropdown-link-disabled-color:   @gray-light;\n\n//** Text color for headers within dropdown menus.\n@dropdown-header-color:          @gray-light;\n\n//** Deprecated `@dropdown-caret-color` as of v3.1.0\n@dropdown-caret-color:           #000;\n\n\n//-- Z-index master list\n//\n// Warning: Avoid customizing these values. They're used for a bird's eye view\n// of components dependent on the z-axis and are designed to all work together.\n//\n// Note: These variables are not generated into the Customizer.\n\n@zindex-navbar:            1000;\n@zindex-dropdown:          1000;\n@zindex-popover:           1060;\n@zindex-tooltip:           1070;\n@zindex-navbar-fixed:      1030;\n@zindex-modal:             1040;\n\n\n//== Media queries breakpoints\n//\n//## Define the breakpoints at which your layout will change, adapting to different screen sizes.\n\n// Extra small screen / phone\n//** Deprecated `@screen-xs` as of v3.0.1\n@screen-xs:                  480px;\n//** Deprecated `@screen-xs-min` as of v3.2.0\n@screen-xs-min:              @screen-xs;\n//** Deprecated `@screen-phone` as of v3.0.1\n@screen-phone:               @screen-xs-min;\n\n// Small screen / tablet\n//** Deprecated `@screen-sm` as of v3.0.1\n@screen-sm:                  768px;\n@screen-sm-min:              @screen-sm;\n//** Deprecated `@screen-tablet` as of v3.0.1\n@screen-tablet:              @screen-sm-min;\n\n// Medium screen / desktop\n//** Deprecated `@screen-md` as of v3.0.1\n@screen-md:                  1031px;\n@screen-md-min:              @screen-md;\n//** Deprecated `@screen-desktop` as of v3.0.1\n@screen-desktop:             @screen-md-min;\n\n// Large screen / wide desktop\n//** Deprecated `@screen-lg` as of v3.0.1\n@screen-lg:                  1200px;\n@screen-lg-min:              @screen-lg;\n//** Deprecated `@screen-lg-desktop` as of v3.0.1\n@screen-lg-desktop:          @screen-lg-min;\n\n// So media queries don't overlap when required, provide a maximum\n@screen-xs-max:              (@screen-sm-min - 1);\n@screen-sm-max:              (@screen-md-min - 1);\n@screen-md-max:              (@screen-lg-min - 1);\n\n\n//== Grid system\n//\n//## Define your custom responsive grid.\n\n//** Number of columns in the grid.\n@grid-columns:              12;\n//** Padding between columns. Gets divided in half for the left and right.\n@grid-gutter-width:         30px;\n// Navbar collapse\n//** Point at which the navbar becomes uncollapsed.\n@grid-float-breakpoint:     @screen-sm-min;\n//** Point at which the navbar begins collapsing.\n@grid-float-breakpoint-max: (@grid-float-breakpoint - 1);\n\n\n//== Container sizes\n//\n//## Define the maximum width of `.container` for different screen sizes.\n\n// Small screen / tablet\n@container-tablet:             (720px + @grid-gutter-width);\n//** For `@screen-sm-min` and up.\n@container-sm:                 @container-tablet;\n\n// Medium screen / desktop\n@container-desktop:            (940px + @grid-gutter-width);\n//** For `@screen-md-min` and up.\n@container-md:                 @container-desktop;\n\n// Large screen / wide desktop\n@container-large-desktop:      (1140px + @grid-gutter-width);\n//** For `@screen-lg-min` and up.\n@container-lg:                 @container-large-desktop;\n\n\n//== Navbar\n//\n//##\n\n// Basics of a navbar\n@navbar-height:                    50px;\n@navbar-margin-bottom:             @line-height-computed+10px;\n@navbar-border-radius:             @border-radius-base;\n@navbar-padding-horizontal:        floor((@grid-gutter-width / 2));\n@navbar-padding-vertical:          ((@navbar-height - @line-height-computed) / 2);\n@navbar-collapse-max-height:       340px;\n\n@navbar-default-color:             #777;\n@navbar-default-bg:                #f8f8f8;\n@navbar-default-border:            darken(@navbar-default-bg, 6.5%);\n\n// Navbar links\n@navbar-default-link-color:                @gray-lighter;\n@navbar-default-link-hover-color:          #4CAF50;\n@navbar-default-link-hover-bg:             @gray-lighter;\n@navbar-default-link-active-color:         @gray-lighter;\n@navbar-default-link-active-bg:            darken(@navbar-default-bg, 6.5%);\n@navbar-default-link-disabled-color:       #ccc;\n@navbar-default-link-disabled-bg:          transparent;\n\n// Navbar brand label\n@navbar-default-brand-color:               @navbar-default-link-color;\n@navbar-default-brand-hover-color:         darken(@navbar-default-brand-color, 10%);\n@navbar-default-brand-hover-bg:            transparent;\n\n// Navbar toggle\n@navbar-default-toggle-hover-bg:           #ddd;\n@navbar-default-toggle-icon-bar-bg:        #888;\n@navbar-default-toggle-border-color:       #ddd;\n\n\n// Inverted navbar\n// Reset inverted navbar basics\n@navbar-inverse-color:                      lighten(@gray-light, 15%);\n@navbar-inverse-bg:                         #222;\n@navbar-inverse-border:                     darken(@navbar-inverse-bg, 10%);\n\n// Inverted navbar links\n@navbar-inverse-link-color:                 @gray-light;\n@navbar-inverse-link-hover-color:           @gray-lighter;\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:          @gray-lighter;\n@navbar-inverse-brand-hover-bg:             transparent;\n\n// Inverted navbar toggle\n@navbar-inverse-toggle-hover-bg:            #333;\n@navbar-inverse-toggle-icon-bar-bg:         @gray-lighter;\n@navbar-inverse-toggle-border-color:        #333;\n\n\n//== Navs\n//\n//##\n\n//=== Shared nav styles\n@nav-link-padding:                          10px 15px;\n@nav-link-hover-bg:                         @gray-lighter;\n\n@nav-disabled-link-color:                   @gray-light;\n@nav-disabled-link-hover-color:             @gray-light;\n\n@nav-open-link-hover-color:                 @gray-lighter;\n\n//== Tabs\n@nav-tabs-border-color:                     #ddd;\n\n@nav-tabs-link-hover-border-color:          @gray-lighter;\n\n@nav-tabs-active-link-hover-bg:             @body-bg;\n@nav-tabs-active-link-hover-color:          @gray;\n@nav-tabs-active-link-hover-border-color:   #ddd;\n\n@nav-tabs-justified-link-border-color:            #ddd;\n@nav-tabs-justified-active-link-border-color:     @body-bg;\n\n//== Pills\n@nav-pills-border-radius:                   @border-radius-base;\n@nav-pills-active-link-hover-bg:            @component-active-bg;\n@nav-pills-active-link-hover-color:         @component-active-color;\n\n\n//== Pagination\n//\n//##\n\n@pagination-color:                     @link-color;\n@pagination-bg:                        @gray-lighter;\n@pagination-border:                    #ddd;\n\n@pagination-hover-color:               @link-hover-color;\n@pagination-hover-bg:                  @gray-lighter;\n@pagination-hover-border:              #ddd;\n\n@pagination-active-color:              @gray-lighter;\n@pagination-active-bg:                 @brand-primary;\n@pagination-active-border:             @brand-primary;\n\n@pagination-disabled-color:            @gray-light;\n@pagination-disabled-bg:               @gray-lighter;\n@pagination-disabled-border:           #ddd;\n\n\n//== Pager\n//\n//##\n\n@pager-bg:                             @pagination-bg;\n@pager-border:                         @pagination-border;\n@pager-border-radius:                  15px;\n\n@pager-hover-bg:                       @pagination-hover-bg;\n\n@pager-active-bg:                      @pagination-active-bg;\n@pager-active-color:                   @pagination-active-color;\n\n@pager-disabled-color:                 @pagination-disabled-color;\n\n\n//== Jumbotron\n//\n//##\n\n@jumbotron-padding:              30px;\n@jumbotron-color:                inherit;\n@jumbotron-bg:                   @gray-lighter;\n@jumbotron-heading-color:        inherit;\n@jumbotron-font-size:            ceil((@font-size-base * 1.5));\n\n\n//== Form states and alerts\n//\n//## Define colors for form feedback states and, by default, alerts.\n\n@state-success-text:             #215f1e;\n@state-success-bg:               #dff0d8;\n@state-success-border:           darken(spin(@state-success-bg, -10), 5%);\n\n@state-info-text:                #31708f;\n@state-info-bg:                  #d9edf7;\n@state-info-border:              darken(spin(@state-info-bg, -10), 7%);\n\n@state-warning-text:             #8a6d3b;\n@state-warning-bg:               #fcf8e3;\n@state-warning-border:           darken(spin(@state-warning-bg, -10), 5%);\n\n@state-danger-text:              #a94442;\n@state-danger-bg:                #f2dede;\n@state-danger-border:            darken(spin(@state-danger-bg, -10), 5%);\n\n\n//== Tooltips\n//\n//##\n\n//** Tooltip max width\n@tooltip-max-width:           200px;\n//** Tooltip text color\n@tooltip-color:               @gray-lighter;\n//** Tooltip background color\n@tooltip-bg:                  #000;\n@tooltip-opacity:             .9;\n\n//** Tooltip arrow width\n@tooltip-arrow-width:         5px;\n//** Tooltip arrow color\n@tooltip-arrow-color:         @tooltip-bg;\n\n\n//== Popovers\n//\n//##\n\n//** Popover body background color\n@popover-bg:                          @gray-lighter;\n//** Popover maximum width\n@popover-max-width:                   276px;\n//** Popover border color\n@popover-border-color:                rgba(0,0,0,.2);\n//** Popover fallback border color\n@popover-fallback-border-color:       #ccc;\n\n//** Popover title background color\n@popover-title-bg:                    darken(@popover-bg, 3%);\n\n//** Popover arrow width\n@popover-arrow-width:                 10px;\n//** Popover arrow color\n@popover-arrow-color:                 @gray-lighter;\n@popover-arrow-color:                 @popover-bg;\n\n//** Popover outer arrow width\n@popover-arrow-outer-width:           (@popover-arrow-width + 1);\n//** Popover outer arrow color\n@popover-arrow-outer-color:           fadein(@popover-border-color, 5%);\n//** Popover outer arrow fallback color\n@popover-arrow-outer-fallback-color:  darken(@popover-fallback-border-color, 20%);\n\n\n//== Labels\n//\n//##\n\n//** Default label background color\n@label-default-bg:            @gray-light;\n//** Primary label background color\n@label-primary-bg:            @brand-primary;\n//** Success label background color\n@label-success-bg:            @brand-success;\n//** Info label background color\n@label-info-bg:               @brand-info;\n//** Warning label background color\n@label-warning-bg:            @brand-warning;\n//** Danger label background color\n@label-danger-bg:             @brand-danger;\n\n//** Default label text color\n@label-color:                 @gray-lighter;\n//** Default text color of a linked label\n@label-link-hover-color:      @gray-lighter;\n\n\n//== Modals\n//\n//##\n\n//** Padding applied to the modal body\n@modal-inner-padding:         15px;\n\n//** Padding applied to the modal title\n@modal-title-padding:         15px;\n//** Modal title line-height\n@modal-title-line-height:     @line-height-base;\n\n//** Background color of modal content area\n@modal-content-bg:                             @gray-lighter;\n//** Modal content border color\n@modal-content-border-color:                   rgba(0,0,0,.2);\n//** Modal content border color **for IE8**\n@modal-content-fallback-border-color:          #999;\n\n//** Modal backdrop background color\n@modal-backdrop-bg:           #000;\n//** Modal backdrop opacity\n@modal-backdrop-opacity:      .5;\n//** Modal header border color\n@modal-header-border-color:   #e5e5e5;\n//** Modal footer border color\n@modal-footer-border-color:   @modal-header-border-color;\n\n@modal-lg:                    900px;\n@modal-md:                    600px;\n@modal-sm:                    300px;\n\n\n//== Alerts\n//\n//## Define alert colors, border radius, and padding.\n\n@alert-padding:               15px;\n@alert-border-radius:         @border-radius-base;\n@alert-link-font-weight:      bold;\n\n@alert-success-bg:            @state-success-bg;\n@alert-success-text:          @state-success-text;\n@alert-success-border:        @state-success-border;\n\n@alert-info-bg:               @state-info-bg;\n@alert-info-text:             @state-info-text;\n@alert-info-border:           @state-info-border;\n\n@alert-warning-bg:            @state-warning-bg;\n@alert-warning-text:          @state-warning-text;\n@alert-warning-border:        @state-warning-border;\n\n@alert-danger-bg:             @state-danger-bg;\n@alert-danger-text:           @state-danger-text;\n@alert-danger-border:         @state-danger-border;\n\n\n//== Progress bars\n//\n//##\n\n//** Background color of the whole progress component\n@progress-bg:                 #f5f5f5;\n//** Progress bar text color\n@progress-bar-color:          @gray-lighter;\n\n//** Variable for setting rounded corners on progress bar.\n@progress-border-radius:      @border-radius-base;\n\n//** Default progress bar color\n@progress-bar-bg:             @brand-primary;\n//** Success progress bar color\n@progress-bar-success-bg:     @brand-success;\n//** Warning progress bar color\n@progress-bar-warning-bg:     @brand-warning;\n//** Danger progress bar color\n@progress-bar-danger-bg:      @brand-danger;\n//** Info progress bar color\n@progress-bar-info-bg:        @brand-info;\n\n\n//== List group\n//\n//##\n\n//** Background color on `.list-group-item`\n@list-group-bg:                 @body-bg;\n//** `.list-group-item` border color\n@list-group-border:             #ddd;\n//** List group border radius\n@list-group-border-radius:      @border-radius-base;\n\n//** Background color of single list items on hover\n@list-group-hover-bg:           #f5f5f5;\n//** Text color of active list items\n@list-group-active-color:       @component-active-color;\n//** Background color of active list items\n@list-group-active-bg:          @component-active-bg;\n//** Border color of active list elements\n@list-group-active-border:      @list-group-active-bg;\n//** Text color for content within active list items\n@list-group-active-text-color:  lighten(@list-group-active-bg, 40%);\n\n//** Text color of disabled list items\n@list-group-disabled-color:      @gray-light;\n//** Background color of disabled list items\n@list-group-disabled-bg:         @gray-lighter;\n//** Text color for content within disabled list items\n@list-group-disabled-text-color: @list-group-disabled-color;\n\n@list-group-link-color:         #555;\n@list-group-link-hover-color:   @list-group-link-color;\n@list-group-link-heading-color: #333;\n\n\n//== Panels\n//\n//##\n\n@panel-bg:                    @gray-lighter;\n@panel-body-padding:          15px;\n@panel-heading-padding:       10px 15px;\n@panel-footer-padding:        @panel-heading-padding;\n@panel-border-radius:         @border-radius-base;\n\n//** Border color for elements within panels\n@panel-inner-border:          #ccc;\n@panel-footer-bg:             #dedede;\n\n@panel-default-text:          @gray-dark;\n@panel-default-border:        #ddd;\n@panel-default-heading-bg:    #f5f5f5;\n\n@panel-primary-text:          @gray-lighter;\n@panel-primary-border:        @brand-primary;\n@panel-primary-heading-bg:    @brand-primary;\n\n@panel-success-text:          @state-success-text;\n@panel-success-border:        @state-success-border;\n@panel-success-heading-bg:    @state-success-bg;\n\n@panel-info-text:             @gray-lighter;\n@panel-info-border:           darken(@brand-primary, 5%);\n@panel-info-heading-bg:       @brand-primary;\n\n@panel-warning-text:          @state-warning-text;\n@panel-warning-border:        @state-warning-border;\n@panel-warning-heading-bg:    @state-warning-bg;\n\n@panel-danger-text:           @state-danger-text;\n@panel-danger-border:         @state-danger-border;\n@panel-danger-heading-bg:     @state-danger-bg;\n\n\n//== Thumbnails\n//\n//##\n\n//** Padding around the thumbnail image\n@thumbnail-padding:           4px;\n//** Thumbnail background color\n@thumbnail-bg:                @body-bg;\n//** Thumbnail border color\n@thumbnail-border:            #ddd;\n//** Thumbnail border radius\n@thumbnail-border-radius:     @border-radius-base;\n\n//** Custom text color for thumbnail captions\n@thumbnail-caption-color:     @text-color;\n//** Padding around the thumbnail caption\n@thumbnail-caption-padding:   9px;\n\n\n//== Wells\n//\n//##\n\n@well-bg:                     #f5f5f5;\n@well-border:                 darken(@well-bg, 7%);\n\n\n//== Badges\n//\n//##\n\n@badge-color:                 @gray-lighter;\n//** Linked badge text color on hover\n@badge-link-hover-color:      @gray-lighter;\n@badge-bg:                    @gray-light;\n\n//** Badge text color in active nav link\n@badge-active-color:          @link-color;\n//** Badge background color in active nav link\n@badge-active-bg:             @gray-lighter;\n\n@badge-font-weight:           bold;\n@badge-line-height:           1;\n@badge-border-radius:         10px;\n\n\n//== Breadcrumbs\n//\n//##\n\n@breadcrumb-padding-vertical:   8px;\n@breadcrumb-padding-horizontal: 15px;\n//** Breadcrumb background color\n@breadcrumb-bg:                 #f5f5f5;\n//** Breadcrumb text color\n@breadcrumb-color:              #ccc;\n//** Text color of current page in the breadcrumb\n@breadcrumb-active-color:       @gray-light;\n//** Textual separator for between breadcrumb elements\n@breadcrumb-separator:          \"/\";\n\n\n//== Carousel\n//\n//##\n\n@carousel-text-shadow:                        0 1px 2px rgba(0,0,0,.6);\n\n@carousel-control-color:                      @gray-lighter;\n@carousel-control-width:                      15%;\n@carousel-control-opacity:                    .5;\n@carousel-control-font-size:                  20px;\n\n@carousel-indicator-active-bg:                @gray-lighter;\n@carousel-indicator-border-color:             @gray-lighter;\n\n@carousel-caption-color:                      @gray-lighter;\n\n\n//== Close\n//\n//##\n\n@close-font-weight:           bold;\n@close-color:                 #000;\n@close-text-shadow:           0 1px 0 @gray-lighter;\n\n\n//== Code\n//\n//##\n\n@code-color:                  #c7254e;\n@code-bg:                     #f9f2f4;\n\n@kbd-color:                   @gray-lighter;\n@kbd-bg:                      #333;\n\n@pre-bg:                      #f5f5f5;\n@pre-color:                   @gray-dark;\n@pre-border-color:            #ccc;\n@pre-scrollable-max-height:   340px;\n\n\n//== Type\n//\n//##\n\n//** Horizontal offset for forms and lists.\n@component-offset-horizontal: 180px;\n//** Text muted color\n@text-muted:                  @gray-light;\n//** Abbreviations and acronyms border color\n@abbr-border-color:           @gray-light;\n//** Headings small color\n@headings-small-color:        @gray-light;\n//** Blockquote small color\n@blockquote-small-color:      @gray-light;\n//** Blockquote font size\n@blockquote-font-size:        (@font-size-base * 1.25);\n//** Blockquote border color\n@blockquote-border-color:     @gray-lighter;\n//** Page header border color\n@page-header-border-color:    @gray-lighter;\n//** Width of horizontal description list titles\n@dl-horizontal-offset:        @component-offset-horizontal;\n//** Horizontal line color.\n@hr-border:                   @gray-lighter;\n"
  },
  {
    "path": "client/less/lib/bootstrap/wells.less",
    "content": "//\n// Wells\n// --------------------------------------------------\n\n\n// Base class\n.well {\n  min-height: 20px;\n  padding: 19px;\n  margin-bottom: 20px;\n  background-color: @well-bg;\n  border: 1px solid @well-border;\n  border-radius: @border-radius-base;\n  .box-shadow(inset 0 1px 1px rgba(0,0,0,.05));\n  blockquote {\n    border-color: #ddd;\n    border-color: rgba(0,0,0,.15);\n  }\n}\n\n// Sizes\n.well-lg {\n  padding: 24px;\n  border-radius: @border-radius-large;\n}\n.well-sm {\n  padding: 9px;\n  border-radius: @border-radius-small;\n}\n"
  },
  {
    "path": "client/less/lib/bootstrap-social/bootstrap-social.less",
    "content": "/*\n * Social Buttons for Bootstrap\n *\n * Copyright 2013-2014 Panayiotis Lipiridis\n * Licensed under the MIT License\n *\n * https://github.com/lipis/bootstrap-social\n */\n\n@bs-height-base: (@line-height-computed + @padding-base-vertical * 2);\n@bs-height-lg:   (floor(@font-size-large * @line-height-base) + @padding-large-vertical * 2);\n@bs-height-sm:   (floor(@font-size-small * 1.5) + @padding-small-vertical * 2);\n@bs-height-xs:   (floor(@font-size-small * 1.2) + @padding-small-vertical + 1);\n\n.btn-social {\n  position: relative;\n  padding-left: (@bs-height-base + @padding-base-horizontal);\n  text-align: left;\n  white-space: nowrap;\n  overflow: hidden;\n  text-overflow: ellipsis;\n  > :first-child {\n    position: absolute;\n    left: 0;\n    top: 0;\n    bottom: 0;\n    width: @bs-height-base;\n    line-height: (@bs-height-base + 2);\n    font-size: 1.6em;\n    text-align: center;\n    border-right: 1px solid rgba(0, 0, 0, 0.2);\n  }\n  &.btn-lg {\n    padding-left: (@bs-height-lg + @padding-large-horizontal);\n    :first-child {\n      line-height: @bs-height-lg;\n      width: @bs-height-lg;\n      font-size: 1.8em;\n    }\n  }\n  &.btn-sm {\n    padding-left: (@bs-height-sm + @padding-small-horizontal);\n    :first-child {\n      line-height: @bs-height-sm;\n      width: @bs-height-sm;\n      font-size: 1.4em;\n    }\n  }\n  &.btn-xs {\n    padding-left: (@bs-height-xs + @padding-small-horizontal);\n    :first-child {\n      line-height: @bs-height-xs;\n      width: @bs-height-xs;\n      font-size: 1.2em;\n    }\n  }\n}\n\n.btn-social-icon {\n  .btn-social;\n  height: (@bs-height-base + 2);\n  width: (@bs-height-base + 2);\n  padding: 0;\n  :first-child {\n    border: none;\n    text-align: center;\n    width: 100%!important;\n  }\n  &.btn-lg {\n    height: @bs-height-lg;\n    width: @bs-height-lg;\n    padding-left: 0;\n    padding-right: 0;\n  }\n  &.btn-sm {\n    height: (@bs-height-sm + 2);\n    width: (@bs-height-sm + 2);\n    padding-left: 0;\n    padding-right: 0;\n  }\n  &.btn-xs {\n    height: (@bs-height-xs + 2);\n    width: (@bs-height-xs + 2);\n    padding-left: 0;\n    padding-right: 0;\n  }\n}\n\n.btn-social(@color-bg, @color: @color-bg) {\n  background-color: @color-bg;\n  .button-variant(@color, @color-bg, rgba(0,0,0,.2));\n}\n\n\n.btn-adn           { .btn-social(#d87a68); }\n.btn-bitbucket     { .btn-social(#205081); }\n.btn-dropbox       { .btn-social(#1087dd); }\n.btn-facebook      { .btn-social(#3b5998); }\n.btn-flickr        { .btn-social(#ff0084); }\n.btn-foursquare    { .btn-social(#f94877); }\n.btn-github        { .btn-social(#444444); }\n.btn-google-plus   { .btn-social(#dd4b39); }\n.btn-instagram     { .btn-social(#3f729b); }\n.btn-linkedin      { .btn-social(#007bb6); }\n.btn-microsoft     { .btn-social(#2672ec); }\n.btn-openid        { .btn-social(#f7931e); }\n.btn-pinterest     { .btn-social(#cb2027); }\n.btn-reddit        { .btn-social(#eff7ff, #000); }\n.btn-soundcloud    { .btn-social(#ff5500); }\n.btn-tumblr        { .btn-social(#2c4762); }\n.btn-twitter       { .btn-social(#55acee); }\n.btn-vimeo         { .btn-social(#1ab7ea); }\n.btn-vk            { .btn-social(#587ea3); }\n.btn-yahoo         { .btn-social(#720e9e); }\n"
  },
  {
    "path": "client/less/lib/font-awesome-4.3.0/css/font-awesome.css",
    "content": "/*!\n *  Font Awesome 4.3.0 by @davegandy - http://fontawesome.io - @fontawesome\n *  License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License)\n */\n/* FONT PATH\n * -------------------------- */\n@font-face {\n  font-family: 'FontAwesome';\n  src: url('../fonts/fontawesome-webfont.eot?v=4.3.0');\n  src: url('../fonts/fontawesome-webfont.eot?#iefix&v=4.3.0') format('embedded-opentype'), url('../fonts/fontawesome-webfont.woff2?v=4.3.0') format('woff2'), url('../fonts/fontawesome-webfont.woff?v=4.3.0') format('woff'), url('../fonts/fontawesome-webfont.ttf?v=4.3.0') format('truetype'), url('../fonts/fontawesome-webfont.svg?v=4.3.0#fontawesomeregular') format('svg');\n  font-weight: normal;\n  font-style: normal;\n}\n.fa {\n  display: inline-block;\n  font: normal normal normal 14px/1 FontAwesome;\n  font-size: inherit;\n  text-rendering: auto;\n  -webkit-font-smoothing: antialiased;\n  -moz-osx-font-smoothing: grayscale;\n  transform: translate(0, 0);\n}\n/* makes the font 33% larger relative to the icon container */\n.fa-lg {\n  font-size: 1.33333333em;\n  line-height: 0.75em;\n  vertical-align: -15%;\n}\n.fa-2x {\n  font-size: 2em;\n}\n.fa-3x {\n  font-size: 3em;\n}\n.fa-4x {\n  font-size: 4em;\n}\n.fa-5x {\n  font-size: 5em;\n}\n.fa-fw {\n  width: 1.28571429em;\n  text-align: center;\n}\n.fa-ul {\n  padding-left: 0;\n  margin-left: 2.14285714em;\n  list-style-type: none;\n}\n.fa-ul > li {\n  position: relative;\n}\n.fa-li {\n  position: absolute;\n  left: -2.14285714em;\n  width: 2.14285714em;\n  top: 0.14285714em;\n  text-align: center;\n}\n.fa-li.fa-lg {\n  left: -1.85714286em;\n}\n.fa-border {\n  padding: .2em .25em .15em;\n  border: solid 0.08em #eeeeee;\n  border-radius: .1em;\n}\n.pull-right {\n  float: right;\n}\n.pull-left {\n  float: left;\n}\n.fa.pull-left {\n  margin-right: .3em;\n}\n.fa.pull-right {\n  margin-left: .3em;\n}\n.fa-spin {\n  -webkit-animation: fa-spin 2s infinite linear;\n  animation: fa-spin 2s infinite linear;\n}\n.fa-pulse {\n  -webkit-animation: fa-spin 1s infinite steps(8);\n  animation: fa-spin 1s infinite steps(8);\n}\n@-webkit-keyframes fa-spin {\n  0% {\n    -webkit-transform: rotate(0deg);\n    transform: rotate(0deg);\n  }\n  100% {\n    -webkit-transform: rotate(359deg);\n    transform: rotate(359deg);\n  }\n}\n@keyframes fa-spin {\n  0% {\n    -webkit-transform: rotate(0deg);\n    transform: rotate(0deg);\n  }\n  100% {\n    -webkit-transform: rotate(359deg);\n    transform: rotate(359deg);\n  }\n}\n.fa-rotate-90 {\n  filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=1);\n  -webkit-transform: rotate(90deg);\n  -ms-transform: rotate(90deg);\n  transform: rotate(90deg);\n}\n.fa-rotate-180 {\n  filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=2);\n  -webkit-transform: rotate(180deg);\n  -ms-transform: rotate(180deg);\n  transform: rotate(180deg);\n}\n.fa-rotate-270 {\n  filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=3);\n  -webkit-transform: rotate(270deg);\n  -ms-transform: rotate(270deg);\n  transform: rotate(270deg);\n}\n.fa-flip-horizontal {\n  filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1);\n  -webkit-transform: scale(-1, 1);\n  -ms-transform: scale(-1, 1);\n  transform: scale(-1, 1);\n}\n.fa-flip-vertical {\n  filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1);\n  -webkit-transform: scale(1, -1);\n  -ms-transform: scale(1, -1);\n  transform: scale(1, -1);\n}\n:root .fa-rotate-90,\n:root .fa-rotate-180,\n:root .fa-rotate-270,\n:root .fa-flip-horizontal,\n:root .fa-flip-vertical {\n  filter: none;\n}\n.fa-stack {\n  position: relative;\n  display: inline-block;\n  width: 2em;\n  height: 2em;\n  line-height: 2em;\n  vertical-align: middle;\n}\n.fa-stack-1x,\n.fa-stack-2x {\n  position: absolute;\n  left: 0;\n  width: 100%;\n  text-align: center;\n}\n.fa-stack-1x {\n  line-height: inherit;\n}\n.fa-stack-2x {\n  font-size: 2em;\n}\n.fa-inverse {\n  color: #ffffff;\n}\n/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen\n   readers do not read off random characters that represent icons */\n.fa-glass:before {\n  content: \"\\f000\";\n}\n.fa-music:before {\n  content: \"\\f001\";\n}\n.fa-search:before {\n  content: \"\\f002\";\n}\n.fa-envelope-o:before {\n  content: \"\\f003\";\n}\n.fa-heart:before {\n  content: \"\\f004\";\n}\n.fa-star:before {\n  content: \"\\f005\";\n}\n.fa-star-o:before {\n  content: \"\\f006\";\n}\n.fa-user:before {\n  content: \"\\f007\";\n}\n.fa-film:before {\n  content: \"\\f008\";\n}\n.fa-th-large:before {\n  content: \"\\f009\";\n}\n.fa-th:before {\n  content: \"\\f00a\";\n}\n.fa-th-list:before {\n  content: \"\\f00b\";\n}\n.fa-check:before {\n  content: \"\\f00c\";\n}\n.fa-remove:before,\n.fa-close:before,\n.fa-times:before {\n  content: \"\\f00d\";\n}\n.fa-search-plus:before {\n  content: \"\\f00e\";\n}\n.fa-search-minus:before {\n  content: \"\\f010\";\n}\n.fa-power-off:before {\n  content: \"\\f011\";\n}\n.fa-signal:before {\n  content: \"\\f012\";\n}\n.fa-gear:before,\n.fa-cog:before {\n  content: \"\\f013\";\n}\n.fa-trash-o:before {\n  content: \"\\f014\";\n}\n.fa-home:before {\n  content: \"\\f015\";\n}\n.fa-file-o:before {\n  content: \"\\f016\";\n}\n.fa-clock-o:before {\n  content: \"\\f017\";\n}\n.fa-road:before {\n  content: \"\\f018\";\n}\n.fa-download:before {\n  content: \"\\f019\";\n}\n.fa-arrow-circle-o-down:before {\n  content: \"\\f01a\";\n}\n.fa-arrow-circle-o-up:before {\n  content: \"\\f01b\";\n}\n.fa-inbox:before {\n  content: \"\\f01c\";\n}\n.fa-play-circle-o:before {\n  content: \"\\f01d\";\n}\n.fa-rotate-right:before,\n.fa-repeat:before {\n  content: \"\\f01e\";\n}\n.fa-refresh:before {\n  content: \"\\f021\";\n}\n.fa-list-alt:before {\n  content: \"\\f022\";\n}\n.fa-lock:before {\n  content: \"\\f023\";\n}\n.fa-flag:before {\n  content: \"\\f024\";\n}\n.fa-headphones:before {\n  content: \"\\f025\";\n}\n.fa-volume-off:before {\n  content: \"\\f026\";\n}\n.fa-volume-down:before {\n  content: \"\\f027\";\n}\n.fa-volume-up:before {\n  content: \"\\f028\";\n}\n.fa-qrcode:before {\n  content: \"\\f029\";\n}\n.fa-barcode:before {\n  content: \"\\f02a\";\n}\n.fa-tag:before {\n  content: \"\\f02b\";\n}\n.fa-tags:before {\n  content: \"\\f02c\";\n}\n.fa-book:before {\n  content: \"\\f02d\";\n}\n.fa-bookmark:before {\n  content: \"\\f02e\";\n}\n.fa-print:before {\n  content: \"\\f02f\";\n}\n.fa-camera:before {\n  content: \"\\f030\";\n}\n.fa-font:before {\n  content: \"\\f031\";\n}\n.fa-bold:before {\n  content: \"\\f032\";\n}\n.fa-italic:before {\n  content: \"\\f033\";\n}\n.fa-text-height:before {\n  content: \"\\f034\";\n}\n.fa-text-width:before {\n  content: \"\\f035\";\n}\n.fa-align-left:before {\n  content: \"\\f036\";\n}\n.fa-align-center:before {\n  content: \"\\f037\";\n}\n.fa-align-right:before {\n  content: \"\\f038\";\n}\n.fa-align-justify:before {\n  content: \"\\f039\";\n}\n.fa-list:before {\n  content: \"\\f03a\";\n}\n.fa-dedent:before,\n.fa-outdent:before {\n  content: \"\\f03b\";\n}\n.fa-indent:before {\n  content: \"\\f03c\";\n}\n.fa-video-camera:before {\n  content: \"\\f03d\";\n}\n.fa-photo:before,\n.fa-image:before,\n.fa-picture-o:before {\n  content: \"\\f03e\";\n}\n.fa-pencil:before {\n  content: \"\\f040\";\n}\n.fa-map-marker:before {\n  content: \"\\f041\";\n}\n.fa-adjust:before {\n  content: \"\\f042\";\n}\n.fa-tint:before {\n  content: \"\\f043\";\n}\n.fa-edit:before,\n.fa-pencil-square-o:before {\n  content: \"\\f044\";\n}\n.fa-share-square-o:before {\n  content: \"\\f045\";\n}\n.fa-check-square-o:before {\n  content: \"\\f046\";\n}\n.fa-arrows:before {\n  content: \"\\f047\";\n}\n.fa-step-backward:before {\n  content: \"\\f048\";\n}\n.fa-fast-backward:before {\n  content: \"\\f049\";\n}\n.fa-backward:before {\n  content: \"\\f04a\";\n}\n.fa-play:before {\n  content: \"\\f04b\";\n}\n.fa-pause:before {\n  content: \"\\f04c\";\n}\n.fa-stop:before {\n  content: \"\\f04d\";\n}\n.fa-forward:before {\n  content: \"\\f04e\";\n}\n.fa-fast-forward:before {\n  content: \"\\f050\";\n}\n.fa-step-forward:before {\n  content: \"\\f051\";\n}\n.fa-eject:before {\n  content: \"\\f052\";\n}\n.fa-chevron-left:before {\n  content: \"\\f053\";\n}\n.fa-chevron-right:before {\n  content: \"\\f054\";\n}\n.fa-plus-circle:before {\n  content: \"\\f055\";\n}\n.fa-minus-circle:before {\n  content: \"\\f056\";\n}\n.fa-times-circle:before {\n  content: \"\\f057\";\n}\n.fa-check-circle:before {\n  content: \"\\f058\";\n}\n.fa-question-circle:before {\n  content: \"\\f059\";\n}\n.fa-info-circle:before {\n  content: \"\\f05a\";\n}\n.fa-crosshairs:before {\n  content: \"\\f05b\";\n}\n.fa-times-circle-o:before {\n  content: \"\\f05c\";\n}\n.fa-check-circle-o:before {\n  content: \"\\f05d\";\n}\n.fa-ban:before {\n  content: \"\\f05e\";\n}\n.fa-arrow-left:before {\n  content: \"\\f060\";\n}\n.fa-arrow-right:before {\n  content: \"\\f061\";\n}\n.fa-arrow-up:before {\n  content: \"\\f062\";\n}\n.fa-arrow-down:before {\n  content: \"\\f063\";\n}\n.fa-mail-forward:before,\n.fa-share:before {\n  content: \"\\f064\";\n}\n.fa-expand:before {\n  content: \"\\f065\";\n}\n.fa-compress:before {\n  content: \"\\f066\";\n}\n.fa-plus:before {\n  content: \"\\f067\";\n}\n.fa-minus:before {\n  content: \"\\f068\";\n}\n.fa-asterisk:before {\n  content: \"\\f069\";\n}\n.fa-exclamation-circle:before {\n  content: \"\\f06a\";\n}\n.fa-gift:before {\n  content: \"\\f06b\";\n}\n.fa-leaf:before {\n  content: \"\\f06c\";\n}\n.fa-fire:before {\n  content: \"\\f06d\";\n}\n.fa-eye:before {\n  content: \"\\f06e\";\n}\n.fa-eye-slash:before {\n  content: \"\\f070\";\n}\n.fa-warning:before,\n.fa-exclamation-triangle:before {\n  content: \"\\f071\";\n}\n.fa-plane:before {\n  content: \"\\f072\";\n}\n.fa-calendar:before {\n  content: \"\\f073\";\n}\n.fa-random:before {\n  content: \"\\f074\";\n}\n.fa-comment:before {\n  content: \"\\f075\";\n}\n.fa-magnet:before {\n  content: \"\\f076\";\n}\n.fa-chevron-up:before {\n  content: \"\\f077\";\n}\n.fa-chevron-down:before {\n  content: \"\\f078\";\n}\n.fa-retweet:before {\n  content: \"\\f079\";\n}\n.fa-shopping-cart:before {\n  content: \"\\f07a\";\n}\n.fa-folder:before {\n  content: \"\\f07b\";\n}\n.fa-folder-open:before {\n  content: \"\\f07c\";\n}\n.fa-arrows-v:before {\n  content: \"\\f07d\";\n}\n.fa-arrows-h:before {\n  content: \"\\f07e\";\n}\n.fa-bar-chart-o:before,\n.fa-bar-chart:before {\n  content: \"\\f080\";\n}\n.fa-twitter-square:before {\n  content: \"\\f081\";\n}\n.fa-facebook-square:before {\n  content: \"\\f082\";\n}\n.fa-camera-retro:before {\n  content: \"\\f083\";\n}\n.fa-key:before {\n  content: \"\\f084\";\n}\n.fa-gears:before,\n.fa-cogs:before {\n  content: \"\\f085\";\n}\n.fa-comments:before {\n  content: \"\\f086\";\n}\n.fa-thumbs-o-up:before {\n  content: \"\\f087\";\n}\n.fa-thumbs-o-down:before {\n  content: \"\\f088\";\n}\n.fa-star-half:before {\n  content: \"\\f089\";\n}\n.fa-heart-o:before {\n  content: \"\\f08a\";\n}\n.fa-sign-out:before {\n  content: \"\\f08b\";\n}\n.fa-linkedin-square:before {\n  content: \"\\f08c\";\n}\n.fa-thumb-tack:before {\n  content: \"\\f08d\";\n}\n.fa-external-link:before {\n  content: \"\\f08e\";\n}\n.fa-sign-in:before {\n  content: \"\\f090\";\n}\n.fa-trophy:before {\n  content: \"\\f091\";\n}\n.fa-github-square:before {\n  content: \"\\f092\";\n}\n.fa-upload:before {\n  content: \"\\f093\";\n}\n.fa-lemon-o:before {\n  content: \"\\f094\";\n}\n.fa-phone:before {\n  content: \"\\f095\";\n}\n.fa-square-o:before {\n  content: \"\\f096\";\n}\n.fa-bookmark-o:before {\n  content: \"\\f097\";\n}\n.fa-phone-square:before {\n  content: \"\\f098\";\n}\n.fa-twitter:before {\n  content: \"\\f099\";\n}\n.fa-facebook-f:before,\n.fa-facebook:before {\n  content: \"\\f09a\";\n}\n.fa-github:before {\n  content: \"\\f09b\";\n}\n.fa-unlock:before {\n  content: \"\\f09c\";\n}\n.fa-credit-card:before {\n  content: \"\\f09d\";\n}\n.fa-rss:before {\n  content: \"\\f09e\";\n}\n.fa-hdd-o:before {\n  content: \"\\f0a0\";\n}\n.fa-bullhorn:before {\n  content: \"\\f0a1\";\n}\n.fa-bell:before {\n  content: \"\\f0f3\";\n}\n.fa-certificate:before {\n  content: \"\\f0a3\";\n}\n.fa-hand-o-right:before {\n  content: \"\\f0a4\";\n}\n.fa-hand-o-left:before {\n  content: \"\\f0a5\";\n}\n.fa-hand-o-up:before {\n  content: \"\\f0a6\";\n}\n.fa-hand-o-down:before {\n  content: \"\\f0a7\";\n}\n.fa-arrow-circle-left:before {\n  content: \"\\f0a8\";\n}\n.fa-arrow-circle-right:before {\n  content: \"\\f0a9\";\n}\n.fa-arrow-circle-up:before {\n  content: \"\\f0aa\";\n}\n.fa-arrow-circle-down:before {\n  content: \"\\f0ab\";\n}\n.fa-globe:before {\n  content: \"\\f0ac\";\n}\n.fa-wrench:before {\n  content: \"\\f0ad\";\n}\n.fa-tasks:before {\n  content: \"\\f0ae\";\n}\n.fa-filter:before {\n  content: \"\\f0b0\";\n}\n.fa-briefcase:before {\n  content: \"\\f0b1\";\n}\n.fa-arrows-alt:before {\n  content: \"\\f0b2\";\n}\n.fa-group:before,\n.fa-users:before {\n  content: \"\\f0c0\";\n}\n.fa-chain:before,\n.fa-link:before {\n  content: \"\\f0c1\";\n}\n.fa-cloud:before {\n  content: \"\\f0c2\";\n}\n.fa-flask:before {\n  content: \"\\f0c3\";\n}\n.fa-cut:before,\n.fa-scissors:before {\n  content: \"\\f0c4\";\n}\n.fa-copy:before,\n.fa-files-o:before {\n  content: \"\\f0c5\";\n}\n.fa-paperclip:before {\n  content: \"\\f0c6\";\n}\n.fa-save:before,\n.fa-floppy-o:before {\n  content: \"\\f0c7\";\n}\n.fa-square:before {\n  content: \"\\f0c8\";\n}\n.fa-navicon:before,\n.fa-reorder:before,\n.fa-bars:before {\n  content: \"\\f0c9\";\n}\n.fa-list-ul:before {\n  content: \"\\f0ca\";\n}\n.fa-list-ol:before {\n  content: \"\\f0cb\";\n}\n.fa-strikethrough:before {\n  content: \"\\f0cc\";\n}\n.fa-underline:before {\n  content: \"\\f0cd\";\n}\n.fa-table:before {\n  content: \"\\f0ce\";\n}\n.fa-magic:before {\n  content: \"\\f0d0\";\n}\n.fa-truck:before {\n  content: \"\\f0d1\";\n}\n.fa-pinterest:before {\n  content: \"\\f0d2\";\n}\n.fa-pinterest-square:before {\n  content: \"\\f0d3\";\n}\n.fa-google-plus-square:before {\n  content: \"\\f0d4\";\n}\n.fa-google-plus:before {\n  content: \"\\f0d5\";\n}\n.fa-money:before {\n  content: \"\\f0d6\";\n}\n.fa-caret-down:before {\n  content: \"\\f0d7\";\n}\n.fa-caret-up:before {\n  content: \"\\f0d8\";\n}\n.fa-caret-left:before {\n  content: \"\\f0d9\";\n}\n.fa-caret-right:before {\n  content: \"\\f0da\";\n}\n.fa-columns:before {\n  content: \"\\f0db\";\n}\n.fa-unsorted:before,\n.fa-sort:before {\n  content: \"\\f0dc\";\n}\n.fa-sort-down:before,\n.fa-sort-desc:before {\n  content: \"\\f0dd\";\n}\n.fa-sort-up:before,\n.fa-sort-asc:before {\n  content: \"\\f0de\";\n}\n.fa-envelope:before {\n  content: \"\\f0e0\";\n}\n.fa-linkedin:before {\n  content: \"\\f0e1\";\n}\n.fa-rotate-left:before,\n.fa-undo:before {\n  content: \"\\f0e2\";\n}\n.fa-legal:before,\n.fa-gavel:before {\n  content: \"\\f0e3\";\n}\n.fa-dashboard:before,\n.fa-tachometer:before {\n  content: \"\\f0e4\";\n}\n.fa-comment-o:before {\n  content: \"\\f0e5\";\n}\n.fa-comments-o:before {\n  content: \"\\f0e6\";\n}\n.fa-flash:before,\n.fa-bolt:before {\n  content: \"\\f0e7\";\n}\n.fa-sitemap:before {\n  content: \"\\f0e8\";\n}\n.fa-umbrella:before {\n  content: \"\\f0e9\";\n}\n.fa-paste:before,\n.fa-clipboard:before {\n  content: \"\\f0ea\";\n}\n.fa-lightbulb-o:before {\n  content: \"\\f0eb\";\n}\n.fa-exchange:before {\n  content: \"\\f0ec\";\n}\n.fa-cloud-download:before {\n  content: \"\\f0ed\";\n}\n.fa-cloud-upload:before {\n  content: \"\\f0ee\";\n}\n.fa-user-md:before {\n  content: \"\\f0f0\";\n}\n.fa-stethoscope:before {\n  content: \"\\f0f1\";\n}\n.fa-suitcase:before {\n  content: \"\\f0f2\";\n}\n.fa-bell-o:before {\n  content: \"\\f0a2\";\n}\n.fa-coffee:before {\n  content: \"\\f0f4\";\n}\n.fa-cutlery:before {\n  content: \"\\f0f5\";\n}\n.fa-file-text-o:before {\n  content: \"\\f0f6\";\n}\n.fa-building-o:before {\n  content: \"\\f0f7\";\n}\n.fa-hospital-o:before {\n  content: \"\\f0f8\";\n}\n.fa-ambulance:before {\n  content: \"\\f0f9\";\n}\n.fa-medkit:before {\n  content: \"\\f0fa\";\n}\n.fa-fighter-jet:before {\n  content: \"\\f0fb\";\n}\n.fa-beer:before {\n  content: \"\\f0fc\";\n}\n.fa-h-square:before {\n  content: \"\\f0fd\";\n}\n.fa-plus-square:before {\n  content: \"\\f0fe\";\n}\n.fa-angle-double-left:before {\n  content: \"\\f100\";\n}\n.fa-angle-double-right:before {\n  content: \"\\f101\";\n}\n.fa-angle-double-up:before {\n  content: \"\\f102\";\n}\n.fa-angle-double-down:before {\n  content: \"\\f103\";\n}\n.fa-angle-left:before {\n  content: \"\\f104\";\n}\n.fa-angle-right:before {\n  content: \"\\f105\";\n}\n.fa-angle-up:before {\n  content: \"\\f106\";\n}\n.fa-angle-down:before {\n  content: \"\\f107\";\n}\n.fa-desktop:before {\n  content: \"\\f108\";\n}\n.fa-laptop:before {\n  content: \"\\f109\";\n}\n.fa-tablet:before {\n  content: \"\\f10a\";\n}\n.fa-mobile-phone:before,\n.fa-mobile:before {\n  content: \"\\f10b\";\n}\n.fa-circle-o:before {\n  content: \"\\f10c\";\n}\n.fa-quote-left:before {\n  content: \"\\f10d\";\n}\n.fa-quote-right:before {\n  content: \"\\f10e\";\n}\n.fa-spinner:before {\n  content: \"\\f110\";\n}\n.fa-circle:before {\n  content: \"\\f111\";\n}\n.fa-mail-reply:before,\n.fa-reply:before {\n  content: \"\\f112\";\n}\n.fa-github-alt:before {\n  content: \"\\f113\";\n}\n.fa-folder-o:before {\n  content: \"\\f114\";\n}\n.fa-folder-open-o:before {\n  content: \"\\f115\";\n}\n.fa-smile-o:before {\n  content: \"\\f118\";\n}\n.fa-frown-o:before {\n  content: \"\\f119\";\n}\n.fa-meh-o:before {\n  content: \"\\f11a\";\n}\n.fa-gamepad:before {\n  content: \"\\f11b\";\n}\n.fa-keyboard-o:before {\n  content: \"\\f11c\";\n}\n.fa-flag-o:before {\n  content: \"\\f11d\";\n}\n.fa-flag-checkered:before {\n  content: \"\\f11e\";\n}\n.fa-terminal:before {\n  content: \"\\f120\";\n}\n.fa-code:before {\n  content: \"\\f121\";\n}\n.fa-mail-reply-all:before,\n.fa-reply-all:before {\n  content: \"\\f122\";\n}\n.fa-star-half-empty:before,\n.fa-star-half-full:before,\n.fa-star-half-o:before {\n  content: \"\\f123\";\n}\n.fa-location-arrow:before {\n  content: \"\\f124\";\n}\n.fa-crop:before {\n  content: \"\\f125\";\n}\n.fa-code-fork:before {\n  content: \"\\f126\";\n}\n.fa-unlink:before,\n.fa-chain-broken:before {\n  content: \"\\f127\";\n}\n.fa-question:before {\n  content: \"\\f128\";\n}\n.fa-info:before {\n  content: \"\\f129\";\n}\n.fa-exclamation:before {\n  content: \"\\f12a\";\n}\n.fa-superscript:before {\n  content: \"\\f12b\";\n}\n.fa-subscript:before {\n  content: \"\\f12c\";\n}\n.fa-eraser:before {\n  content: \"\\f12d\";\n}\n.fa-puzzle-piece:before {\n  content: \"\\f12e\";\n}\n.fa-microphone:before {\n  content: \"\\f130\";\n}\n.fa-microphone-slash:before {\n  content: \"\\f131\";\n}\n.fa-shield:before {\n  content: \"\\f132\";\n}\n.fa-calendar-o:before {\n  content: \"\\f133\";\n}\n.fa-fire-extinguisher:before {\n  content: \"\\f134\";\n}\n.fa-rocket:before {\n  content: \"\\f135\";\n}\n.fa-maxcdn:before {\n  content: \"\\f136\";\n}\n.fa-chevron-circle-left:before {\n  content: \"\\f137\";\n}\n.fa-chevron-circle-right:before {\n  content: \"\\f138\";\n}\n.fa-chevron-circle-up:before {\n  content: \"\\f139\";\n}\n.fa-chevron-circle-down:before {\n  content: \"\\f13a\";\n}\n.fa-html5:before {\n  content: \"\\f13b\";\n}\n.fa-css3:before {\n  content: \"\\f13c\";\n}\n.fa-anchor:before {\n  content: \"\\f13d\";\n}\n.fa-unlock-alt:before {\n  content: \"\\f13e\";\n}\n.fa-bullseye:before {\n  content: \"\\f140\";\n}\n.fa-ellipsis-h:before {\n  content: \"\\f141\";\n}\n.fa-ellipsis-v:before {\n  content: \"\\f142\";\n}\n.fa-rss-square:before {\n  content: \"\\f143\";\n}\n.fa-play-circle:before {\n  content: \"\\f144\";\n}\n.fa-ticket:before {\n  content: \"\\f145\";\n}\n.fa-minus-square:before {\n  content: \"\\f146\";\n}\n.fa-minus-square-o:before {\n  content: \"\\f147\";\n}\n.fa-level-up:before {\n  content: \"\\f148\";\n}\n.fa-level-down:before {\n  content: \"\\f149\";\n}\n.fa-check-square:before {\n  content: \"\\f14a\";\n}\n.fa-pencil-square:before {\n  content: \"\\f14b\";\n}\n.fa-external-link-square:before {\n  content: \"\\f14c\";\n}\n.fa-share-square:before {\n  content: \"\\f14d\";\n}\n.fa-compass:before {\n  content: \"\\f14e\";\n}\n.fa-toggle-down:before,\n.fa-caret-square-o-down:before {\n  content: \"\\f150\";\n}\n.fa-toggle-up:before,\n.fa-caret-square-o-up:before {\n  content: \"\\f151\";\n}\n.fa-toggle-right:before,\n.fa-caret-square-o-right:before {\n  content: \"\\f152\";\n}\n.fa-euro:before,\n.fa-eur:before {\n  content: \"\\f153\";\n}\n.fa-gbp:before {\n  content: \"\\f154\";\n}\n.fa-dollar:before,\n.fa-usd:before {\n  content: \"\\f155\";\n}\n.fa-rupee:before,\n.fa-inr:before {\n  content: \"\\f156\";\n}\n.fa-cny:before,\n.fa-rmb:before,\n.fa-yen:before,\n.fa-jpy:before {\n  content: \"\\f157\";\n}\n.fa-ruble:before,\n.fa-rouble:before,\n.fa-rub:before {\n  content: \"\\f158\";\n}\n.fa-won:before,\n.fa-krw:before {\n  content: \"\\f159\";\n}\n.fa-bitcoin:before,\n.fa-btc:before {\n  content: \"\\f15a\";\n}\n.fa-file:before {\n  content: \"\\f15b\";\n}\n.fa-file-text:before {\n  content: \"\\f15c\";\n}\n.fa-sort-alpha-asc:before {\n  content: \"\\f15d\";\n}\n.fa-sort-alpha-desc:before {\n  content: \"\\f15e\";\n}\n.fa-sort-amount-asc:before {\n  content: \"\\f160\";\n}\n.fa-sort-amount-desc:before {\n  content: \"\\f161\";\n}\n.fa-sort-numeric-asc:before {\n  content: \"\\f162\";\n}\n.fa-sort-numeric-desc:before {\n  content: \"\\f163\";\n}\n.fa-thumbs-up:before {\n  content: \"\\f164\";\n}\n.fa-thumbs-down:before {\n  content: \"\\f165\";\n}\n.fa-youtube-square:before {\n  content: \"\\f166\";\n}\n.fa-youtube:before {\n  content: \"\\f167\";\n}\n.fa-xing:before {\n  content: \"\\f168\";\n}\n.fa-xing-square:before {\n  content: \"\\f169\";\n}\n.fa-youtube-play:before {\n  content: \"\\f16a\";\n}\n.fa-dropbox:before {\n  content: \"\\f16b\";\n}\n.fa-stack-overflow:before {\n  content: \"\\f16c\";\n}\n.fa-instagram:before {\n  content: \"\\f16d\";\n}\n.fa-flickr:before {\n  content: \"\\f16e\";\n}\n.fa-adn:before {\n  content: \"\\f170\";\n}\n.fa-bitbucket:before {\n  content: \"\\f171\";\n}\n.fa-bitbucket-square:before {\n  content: \"\\f172\";\n}\n.fa-tumblr:before {\n  content: \"\\f173\";\n}\n.fa-tumblr-square:before {\n  content: \"\\f174\";\n}\n.fa-long-arrow-down:before {\n  content: \"\\f175\";\n}\n.fa-long-arrow-up:before {\n  content: \"\\f176\";\n}\n.fa-long-arrow-left:before {\n  content: \"\\f177\";\n}\n.fa-long-arrow-right:before {\n  content: \"\\f178\";\n}\n.fa-apple:before {\n  content: \"\\f179\";\n}\n.fa-windows:before {\n  content: \"\\f17a\";\n}\n.fa-android:before {\n  content: \"\\f17b\";\n}\n.fa-linux:before {\n  content: \"\\f17c\";\n}\n.fa-dribbble:before {\n  content: \"\\f17d\";\n}\n.fa-skype:before {\n  content: \"\\f17e\";\n}\n.fa-foursquare:before {\n  content: \"\\f180\";\n}\n.fa-trello:before {\n  content: \"\\f181\";\n}\n.fa-female:before {\n  content: \"\\f182\";\n}\n.fa-male:before {\n  content: \"\\f183\";\n}\n.fa-gittip:before,\n.fa-gratipay:before {\n  content: \"\\f184\";\n}\n.fa-sun-o:before {\n  content: \"\\f185\";\n}\n.fa-moon-o:before {\n  content: \"\\f186\";\n}\n.fa-archive:before {\n  content: \"\\f187\";\n}\n.fa-bug:before {\n  content: \"\\f188\";\n}\n.fa-vk:before {\n  content: \"\\f189\";\n}\n.fa-weibo:before {\n  content: \"\\f18a\";\n}\n.fa-renren:before {\n  content: \"\\f18b\";\n}\n.fa-pagelines:before {\n  content: \"\\f18c\";\n}\n.fa-stack-exchange:before {\n  content: \"\\f18d\";\n}\n.fa-arrow-circle-o-right:before {\n  content: \"\\f18e\";\n}\n.fa-arrow-circle-o-left:before {\n  content: \"\\f190\";\n}\n.fa-toggle-left:before,\n.fa-caret-square-o-left:before {\n  content: \"\\f191\";\n}\n.fa-dot-circle-o:before {\n  content: \"\\f192\";\n}\n.fa-wheelchair:before {\n  content: \"\\f193\";\n}\n.fa-vimeo-square:before {\n  content: \"\\f194\";\n}\n.fa-turkish-lira:before,\n.fa-try:before {\n  content: \"\\f195\";\n}\n.fa-plus-square-o:before {\n  content: \"\\f196\";\n}\n.fa-space-shuttle:before {\n  content: \"\\f197\";\n}\n.fa-slack:before {\n  content: \"\\f198\";\n}\n.fa-envelope-square:before {\n  content: \"\\f199\";\n}\n.fa-wordpress:before {\n  content: \"\\f19a\";\n}\n.fa-openid:before {\n  content: \"\\f19b\";\n}\n.fa-institution:before,\n.fa-bank:before,\n.fa-university:before {\n  content: \"\\f19c\";\n}\n.fa-mortar-board:before,\n.fa-graduation-cap:before {\n  content: \"\\f19d\";\n}\n.fa-yahoo:before {\n  content: \"\\f19e\";\n}\n.fa-google:before {\n  content: \"\\f1a0\";\n}\n.fa-reddit:before {\n  content: \"\\f1a1\";\n}\n.fa-reddit-square:before {\n  content: \"\\f1a2\";\n}\n.fa-stumbleupon-circle:before {\n  content: \"\\f1a3\";\n}\n.fa-stumbleupon:before {\n  content: \"\\f1a4\";\n}\n.fa-delicious:before {\n  content: \"\\f1a5\";\n}\n.fa-digg:before {\n  content: \"\\f1a6\";\n}\n.fa-pied-piper:before {\n  content: \"\\f1a7\";\n}\n.fa-pied-piper-alt:before {\n  content: \"\\f1a8\";\n}\n.fa-drupal:before {\n  content: \"\\f1a9\";\n}\n.fa-joomla:before {\n  content: \"\\f1aa\";\n}\n.fa-language:before {\n  content: \"\\f1ab\";\n}\n.fa-fax:before {\n  content: \"\\f1ac\";\n}\n.fa-building:before {\n  content: \"\\f1ad\";\n}\n.fa-child:before {\n  content: \"\\f1ae\";\n}\n.fa-paw:before {\n  content: \"\\f1b0\";\n}\n.fa-spoon:before {\n  content: \"\\f1b1\";\n}\n.fa-cube:before {\n  content: \"\\f1b2\";\n}\n.fa-cubes:before {\n  content: \"\\f1b3\";\n}\n.fa-behance:before {\n  content: \"\\f1b4\";\n}\n.fa-behance-square:before {\n  content: \"\\f1b5\";\n}\n.fa-steam:before {\n  content: \"\\f1b6\";\n}\n.fa-steam-square:before {\n  content: \"\\f1b7\";\n}\n.fa-recycle:before {\n  content: \"\\f1b8\";\n}\n.fa-automobile:before,\n.fa-car:before {\n  content: \"\\f1b9\";\n}\n.fa-cab:before,\n.fa-taxi:before {\n  content: \"\\f1ba\";\n}\n.fa-tree:before {\n  content: \"\\f1bb\";\n}\n.fa-spotify:before {\n  content: \"\\f1bc\";\n}\n.fa-deviantart:before {\n  content: \"\\f1bd\";\n}\n.fa-soundcloud:before {\n  content: \"\\f1be\";\n}\n.fa-database:before {\n  content: \"\\f1c0\";\n}\n.fa-file-pdf-o:before {\n  content: \"\\f1c1\";\n}\n.fa-file-word-o:before {\n  content: \"\\f1c2\";\n}\n.fa-file-excel-o:before {\n  content: \"\\f1c3\";\n}\n.fa-file-powerpoint-o:before {\n  content: \"\\f1c4\";\n}\n.fa-file-photo-o:before,\n.fa-file-picture-o:before,\n.fa-file-image-o:before {\n  content: \"\\f1c5\";\n}\n.fa-file-zip-o:before,\n.fa-file-archive-o:before {\n  content: \"\\f1c6\";\n}\n.fa-file-sound-o:before,\n.fa-file-audio-o:before {\n  content: \"\\f1c7\";\n}\n.fa-file-movie-o:before,\n.fa-file-video-o:before {\n  content: \"\\f1c8\";\n}\n.fa-file-code-o:before {\n  content: \"\\f1c9\";\n}\n.fa-vine:before {\n  content: \"\\f1ca\";\n}\n.fa-codepen:before {\n  content: \"\\f1cb\";\n}\n.fa-jsfiddle:before {\n  content: \"\\f1cc\";\n}\n.fa-life-bouy:before,\n.fa-life-buoy:before,\n.fa-life-saver:before,\n.fa-support:before,\n.fa-life-ring:before {\n  content: \"\\f1cd\";\n}\n.fa-circle-o-notch:before {\n  content: \"\\f1ce\";\n}\n.fa-ra:before,\n.fa-rebel:before {\n  content: \"\\f1d0\";\n}\n.fa-ge:before,\n.fa-empire:before {\n  content: \"\\f1d1\";\n}\n.fa-git-square:before {\n  content: \"\\f1d2\";\n}\n.fa-git:before {\n  content: \"\\f1d3\";\n}\n.fa-hacker-news:before {\n  content: \"\\f1d4\";\n}\n.fa-tencent-weibo:before {\n  content: \"\\f1d5\";\n}\n.fa-qq:before {\n  content: \"\\f1d6\";\n}\n.fa-wechat:before,\n.fa-weixin:before {\n  content: \"\\f1d7\";\n}\n.fa-send:before,\n.fa-paper-plane:before {\n  content: \"\\f1d8\";\n}\n.fa-send-o:before,\n.fa-paper-plane-o:before {\n  content: \"\\f1d9\";\n}\n.fa-history:before {\n  content: \"\\f1da\";\n}\n.fa-genderless:before,\n.fa-circle-thin:before {\n  content: \"\\f1db\";\n}\n.fa-header:before {\n  content: \"\\f1dc\";\n}\n.fa-paragraph:before {\n  content: \"\\f1dd\";\n}\n.fa-sliders:before {\n  content: \"\\f1de\";\n}\n.fa-share-alt:before {\n  content: \"\\f1e0\";\n}\n.fa-share-alt-square:before {\n  content: \"\\f1e1\";\n}\n.fa-bomb:before {\n  content: \"\\f1e2\";\n}\n.fa-soccer-ball-o:before,\n.fa-futbol-o:before {\n  content: \"\\f1e3\";\n}\n.fa-tty:before {\n  content: \"\\f1e4\";\n}\n.fa-binoculars:before {\n  content: \"\\f1e5\";\n}\n.fa-plug:before {\n  content: \"\\f1e6\";\n}\n.fa-slideshare:before {\n  content: \"\\f1e7\";\n}\n.fa-twitch:before {\n  content: \"\\f1e8\";\n}\n.fa-yelp:before {\n  content: \"\\f1e9\";\n}\n.fa-newspaper-o:before {\n  content: \"\\f1ea\";\n}\n.fa-wifi:before {\n  content: \"\\f1eb\";\n}\n.fa-calculator:before {\n  content: \"\\f1ec\";\n}\n.fa-paypal:before {\n  content: \"\\f1ed\";\n}\n.fa-google-wallet:before {\n  content: \"\\f1ee\";\n}\n.fa-cc-visa:before {\n  content: \"\\f1f0\";\n}\n.fa-cc-mastercard:before {\n  content: \"\\f1f1\";\n}\n.fa-cc-discover:before {\n  content: \"\\f1f2\";\n}\n.fa-cc-amex:before {\n  content: \"\\f1f3\";\n}\n.fa-cc-paypal:before {\n  content: \"\\f1f4\";\n}\n.fa-cc-stripe:before {\n  content: \"\\f1f5\";\n}\n.fa-bell-slash:before {\n  content: \"\\f1f6\";\n}\n.fa-bell-slash-o:before {\n  content: \"\\f1f7\";\n}\n.fa-trash:before {\n  content: \"\\f1f8\";\n}\n.fa-copyright:before {\n  content: \"\\f1f9\";\n}\n.fa-at:before {\n  content: \"\\f1fa\";\n}\n.fa-eyedropper:before {\n  content: \"\\f1fb\";\n}\n.fa-paint-brush:before {\n  content: \"\\f1fc\";\n}\n.fa-birthday-cake:before {\n  content: \"\\f1fd\";\n}\n.fa-area-chart:before {\n  content: \"\\f1fe\";\n}\n.fa-pie-chart:before {\n  content: \"\\f200\";\n}\n.fa-line-chart:before {\n  content: \"\\f201\";\n}\n.fa-lastfm:before {\n  content: \"\\f202\";\n}\n.fa-lastfm-square:before {\n  content: \"\\f203\";\n}\n.fa-toggle-off:before {\n  content: \"\\f204\";\n}\n.fa-toggle-on:before {\n  content: \"\\f205\";\n}\n.fa-bicycle:before {\n  content: \"\\f206\";\n}\n.fa-bus:before {\n  content: \"\\f207\";\n}\n.fa-ioxhost:before {\n  content: \"\\f208\";\n}\n.fa-angellist:before {\n  content: \"\\f209\";\n}\n.fa-cc:before {\n  content: \"\\f20a\";\n}\n.fa-shekel:before,\n.fa-sheqel:before,\n.fa-ils:before {\n  content: \"\\f20b\";\n}\n.fa-meanpath:before {\n  content: \"\\f20c\";\n}\n.fa-buysellads:before {\n  content: \"\\f20d\";\n}\n.fa-connectdevelop:before {\n  content: \"\\f20e\";\n}\n.fa-dashcube:before {\n  content: \"\\f210\";\n}\n.fa-forumbee:before {\n  content: \"\\f211\";\n}\n.fa-leanpub:before {\n  content: \"\\f212\";\n}\n.fa-sellsy:before {\n  content: \"\\f213\";\n}\n.fa-shirtsinbulk:before {\n  content: \"\\f214\";\n}\n.fa-simplybuilt:before {\n  content: \"\\f215\";\n}\n.fa-skyatlas:before {\n  content: \"\\f216\";\n}\n.fa-cart-plus:before {\n  content: \"\\f217\";\n}\n.fa-cart-arrow-down:before {\n  content: \"\\f218\";\n}\n.fa-diamond:before {\n  content: \"\\f219\";\n}\n.fa-ship:before {\n  content: \"\\f21a\";\n}\n.fa-user-secret:before {\n  content: \"\\f21b\";\n}\n.fa-motorcycle:before {\n  content: \"\\f21c\";\n}\n.fa-street-view:before {\n  content: \"\\f21d\";\n}\n.fa-heartbeat:before {\n  content: \"\\f21e\";\n}\n.fa-venus:before {\n  content: \"\\f221\";\n}\n.fa-mars:before {\n  content: \"\\f222\";\n}\n.fa-mercury:before {\n  content: \"\\f223\";\n}\n.fa-transgender:before {\n  content: \"\\f224\";\n}\n.fa-transgender-alt:before {\n  content: \"\\f225\";\n}\n.fa-venus-double:before {\n  content: \"\\f226\";\n}\n.fa-mars-double:before {\n  content: \"\\f227\";\n}\n.fa-venus-mars:before {\n  content: \"\\f228\";\n}\n.fa-mars-stroke:before {\n  content: \"\\f229\";\n}\n.fa-mars-stroke-v:before {\n  content: \"\\f22a\";\n}\n.fa-mars-stroke-h:before {\n  content: \"\\f22b\";\n}\n.fa-neuter:before {\n  content: \"\\f22c\";\n}\n.fa-facebook-official:before {\n  content: \"\\f230\";\n}\n.fa-pinterest-p:before {\n  content: \"\\f231\";\n}\n.fa-whatsapp:before {\n  content: \"\\f232\";\n}\n.fa-server:before {\n  content: \"\\f233\";\n}\n.fa-user-plus:before {\n  content: \"\\f234\";\n}\n.fa-user-times:before {\n  content: \"\\f235\";\n}\n.fa-hotel:before,\n.fa-bed:before {\n  content: \"\\f236\";\n}\n.fa-viacoin:before {\n  content: \"\\f237\";\n}\n.fa-train:before {\n  content: \"\\f238\";\n}\n.fa-subway:before {\n  content: \"\\f239\";\n}\n.fa-medium:before {\n  content: \"\\f23a\";\n}\n"
  },
  {
    "path": "client/less/lib/font-awesome-4.3.0/less/animated.less",
    "content": "// Animated Icons\n// --------------------------\n\n.@{fa-css-prefix}-spin {\n  -webkit-animation: fa-spin 2s infinite linear;\n          animation: fa-spin 2s infinite linear;\n}\n\n.@{fa-css-prefix}-pulse {\n  -webkit-animation: fa-spin 1s infinite steps(8);\n          animation: fa-spin 1s infinite steps(8);\n}\n\n@-webkit-keyframes fa-spin {\n  0% {\n    -webkit-transform: rotate(0deg);\n            transform: rotate(0deg);\n  }\n  100% {\n    -webkit-transform: rotate(359deg);\n            transform: rotate(359deg);\n  }\n}\n\n@keyframes fa-spin {\n  0% {\n    -webkit-transform: rotate(0deg);\n            transform: rotate(0deg);\n  }\n  100% {\n    -webkit-transform: rotate(359deg);\n            transform: rotate(359deg);\n  }\n}\n"
  },
  {
    "path": "client/less/lib/font-awesome-4.3.0/less/bordered-pulled.less",
    "content": "// Bordered & Pulled\n// -------------------------\n\n.@{fa-css-prefix}-border {\n  padding: .2em .25em .15em;\n  border: solid .08em @fa-border-color;\n  border-radius: .1em;\n}\n\n.pull-right { float: right; }\n.pull-left { float: left; }\n\n.@{fa-css-prefix} {\n  &.pull-left { margin-right: .3em; }\n  &.pull-right { margin-left: .3em; }\n}\n"
  },
  {
    "path": "client/less/lib/font-awesome-4.3.0/less/core.less",
    "content": "// Base Class Definition\n// -------------------------\n\n.@{fa-css-prefix} {\n  display: inline-block;\n  font: normal normal normal @fa-font-size-base/1 FontAwesome; // shortening font declaration\n  font-size: inherit; // can't have font-size inherit on line above, so need to override\n  text-rendering: auto; // optimizelegibility throws things off #1094\n  -webkit-font-smoothing: antialiased;\n  -moz-osx-font-smoothing: grayscale;\n  transform: translate(0, 0); // ensures no half-pixel rendering in firefox\n\n}\n"
  },
  {
    "path": "client/less/lib/font-awesome-4.3.0/less/fixed-width.less",
    "content": "// Fixed Width Icons\n// -------------------------\n.@{fa-css-prefix}-fw {\n  width: (18em / 14);\n  text-align: center;\n}\n"
  },
  {
    "path": "client/less/lib/font-awesome-4.3.0/less/font-awesome.less",
    "content": "/*!\n *  Font Awesome 4.3.0 by @davegandy - http://fontawesome.io - @fontawesome\n *  License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License)\n */\n\n@import \"variables.less\";\n@import \"mixins.less\";\n@import \"path.less\";\n@import \"core.less\";\n@import \"larger.less\";\n@import \"fixed-width.less\";\n@import \"list.less\";\n@import \"bordered-pulled.less\";\n@import \"animated.less\";\n@import \"rotated-flipped.less\";\n@import \"stacked.less\";\n@import \"icons.less\";\n"
  },
  {
    "path": "client/less/lib/font-awesome-4.3.0/less/icons.less",
    "content": "/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen\n   readers do not read off random characters that represent icons */\n\n.@{fa-css-prefix}-glass:before { content: @fa-var-glass; }\n.@{fa-css-prefix}-music:before { content: @fa-var-music; }\n.@{fa-css-prefix}-search:before { content: @fa-var-search; }\n.@{fa-css-prefix}-envelope-o:before { content: @fa-var-envelope-o; }\n.@{fa-css-prefix}-heart:before { content: @fa-var-heart; }\n.@{fa-css-prefix}-star:before { content: @fa-var-star; }\n.@{fa-css-prefix}-star-o:before { content: @fa-var-star-o; }\n.@{fa-css-prefix}-user:before { content: @fa-var-user; }\n.@{fa-css-prefix}-film:before { content: @fa-var-film; }\n.@{fa-css-prefix}-th-large:before { content: @fa-var-th-large; }\n.@{fa-css-prefix}-th:before { content: @fa-var-th; }\n.@{fa-css-prefix}-th-list:before { content: @fa-var-th-list; }\n.@{fa-css-prefix}-check:before { content: @fa-var-check; }\n.@{fa-css-prefix}-remove:before,\n.@{fa-css-prefix}-close:before,\n.@{fa-css-prefix}-times:before { content: @fa-var-times; }\n.@{fa-css-prefix}-search-plus:before { content: @fa-var-search-plus; }\n.@{fa-css-prefix}-search-minus:before { content: @fa-var-search-minus; }\n.@{fa-css-prefix}-power-off:before { content: @fa-var-power-off; }\n.@{fa-css-prefix}-signal:before { content: @fa-var-signal; }\n.@{fa-css-prefix}-gear:before,\n.@{fa-css-prefix}-cog:before { content: @fa-var-cog; }\n.@{fa-css-prefix}-trash-o:before { content: @fa-var-trash-o; }\n.@{fa-css-prefix}-home:before { content: @fa-var-home; }\n.@{fa-css-prefix}-file-o:before { content: @fa-var-file-o; }\n.@{fa-css-prefix}-clock-o:before { content: @fa-var-clock-o; }\n.@{fa-css-prefix}-road:before { content: @fa-var-road; }\n.@{fa-css-prefix}-download:before { content: @fa-var-download; }\n.@{fa-css-prefix}-arrow-circle-o-down:before { content: @fa-var-arrow-circle-o-down; }\n.@{fa-css-prefix}-arrow-circle-o-up:before { content: @fa-var-arrow-circle-o-up; }\n.@{fa-css-prefix}-inbox:before { content: @fa-var-inbox; }\n.@{fa-css-prefix}-play-circle-o:before { content: @fa-var-play-circle-o; }\n.@{fa-css-prefix}-rotate-right:before,\n.@{fa-css-prefix}-repeat:before { content: @fa-var-repeat; }\n.@{fa-css-prefix}-refresh:before { content: @fa-var-refresh; }\n.@{fa-css-prefix}-list-alt:before { content: @fa-var-list-alt; }\n.@{fa-css-prefix}-lock:before { content: @fa-var-lock; }\n.@{fa-css-prefix}-flag:before { content: @fa-var-flag; }\n.@{fa-css-prefix}-headphones:before { content: @fa-var-headphones; }\n.@{fa-css-prefix}-volume-off:before { content: @fa-var-volume-off; }\n.@{fa-css-prefix}-volume-down:before { content: @fa-var-volume-down; }\n.@{fa-css-prefix}-volume-up:before { content: @fa-var-volume-up; }\n.@{fa-css-prefix}-qrcode:before { content: @fa-var-qrcode; }\n.@{fa-css-prefix}-barcode:before { content: @fa-var-barcode; }\n.@{fa-css-prefix}-tag:before { content: @fa-var-tag; }\n.@{fa-css-prefix}-tags:before { content: @fa-var-tags; }\n.@{fa-css-prefix}-book:before { content: @fa-var-book; }\n.@{fa-css-prefix}-bookmark:before { content: @fa-var-bookmark; }\n.@{fa-css-prefix}-print:before { content: @fa-var-print; }\n.@{fa-css-prefix}-camera:before { content: @fa-var-camera; }\n.@{fa-css-prefix}-font:before { content: @fa-var-font; }\n.@{fa-css-prefix}-bold:before { content: @fa-var-bold; }\n.@{fa-css-prefix}-italic:before { content: @fa-var-italic; }\n.@{fa-css-prefix}-text-height:before { content: @fa-var-text-height; }\n.@{fa-css-prefix}-text-width:before { content: @fa-var-text-width; }\n.@{fa-css-prefix}-align-left:before { content: @fa-var-align-left; }\n.@{fa-css-prefix}-align-center:before { content: @fa-var-align-center; }\n.@{fa-css-prefix}-align-right:before { content: @fa-var-align-right; }\n.@{fa-css-prefix}-align-justify:before { content: @fa-var-align-justify; }\n.@{fa-css-prefix}-list:before { content: @fa-var-list; }\n.@{fa-css-prefix}-dedent:before,\n.@{fa-css-prefix}-outdent:before { content: @fa-var-outdent; }\n.@{fa-css-prefix}-indent:before { content: @fa-var-indent; }\n.@{fa-css-prefix}-video-camera:before { content: @fa-var-video-camera; }\n.@{fa-css-prefix}-photo:before,\n.@{fa-css-prefix}-image:before,\n.@{fa-css-prefix}-picture-o:before { content: @fa-var-picture-o; }\n.@{fa-css-prefix}-pencil:before { content: @fa-var-pencil; }\n.@{fa-css-prefix}-map-marker:before { content: @fa-var-map-marker; }\n.@{fa-css-prefix}-adjust:before { content: @fa-var-adjust; }\n.@{fa-css-prefix}-tint:before { content: @fa-var-tint; }\n.@{fa-css-prefix}-edit:before,\n.@{fa-css-prefix}-pencil-square-o:before { content: @fa-var-pencil-square-o; }\n.@{fa-css-prefix}-share-square-o:before { content: @fa-var-share-square-o; }\n.@{fa-css-prefix}-check-square-o:before { content: @fa-var-check-square-o; }\n.@{fa-css-prefix}-arrows:before { content: @fa-var-arrows; }\n.@{fa-css-prefix}-step-backward:before { content: @fa-var-step-backward; }\n.@{fa-css-prefix}-fast-backward:before { content: @fa-var-fast-backward; }\n.@{fa-css-prefix}-backward:before { content: @fa-var-backward; }\n.@{fa-css-prefix}-play:before { content: @fa-var-play; }\n.@{fa-css-prefix}-pause:before { content: @fa-var-pause; }\n.@{fa-css-prefix}-stop:before { content: @fa-var-stop; }\n.@{fa-css-prefix}-forward:before { content: @fa-var-forward; }\n.@{fa-css-prefix}-fast-forward:before { content: @fa-var-fast-forward; }\n.@{fa-css-prefix}-step-forward:before { content: @fa-var-step-forward; }\n.@{fa-css-prefix}-eject:before { content: @fa-var-eject; }\n.@{fa-css-prefix}-chevron-left:before { content: @fa-var-chevron-left; }\n.@{fa-css-prefix}-chevron-right:before { content: @fa-var-chevron-right; }\n.@{fa-css-prefix}-plus-circle:before { content: @fa-var-plus-circle; }\n.@{fa-css-prefix}-minus-circle:before { content: @fa-var-minus-circle; }\n.@{fa-css-prefix}-times-circle:before { content: @fa-var-times-circle; }\n.@{fa-css-prefix}-check-circle:before { content: @fa-var-check-circle; }\n.@{fa-css-prefix}-question-circle:before { content: @fa-var-question-circle; }\n.@{fa-css-prefix}-info-circle:before { content: @fa-var-info-circle; }\n.@{fa-css-prefix}-crosshairs:before { content: @fa-var-crosshairs; }\n.@{fa-css-prefix}-times-circle-o:before { content: @fa-var-times-circle-o; }\n.@{fa-css-prefix}-check-circle-o:before { content: @fa-var-check-circle-o; }\n.@{fa-css-prefix}-ban:before { content: @fa-var-ban; }\n.@{fa-css-prefix}-arrow-left:before { content: @fa-var-arrow-left; }\n.@{fa-css-prefix}-arrow-right:before { content: @fa-var-arrow-right; }\n.@{fa-css-prefix}-arrow-up:before { content: @fa-var-arrow-up; }\n.@{fa-css-prefix}-arrow-down:before { content: @fa-var-arrow-down; }\n.@{fa-css-prefix}-mail-forward:before,\n.@{fa-css-prefix}-share:before { content: @fa-var-share; }\n.@{fa-css-prefix}-expand:before { content: @fa-var-expand; }\n.@{fa-css-prefix}-compress:before { content: @fa-var-compress; }\n.@{fa-css-prefix}-plus:before { content: @fa-var-plus; }\n.@{fa-css-prefix}-minus:before { content: @fa-var-minus; }\n.@{fa-css-prefix}-asterisk:before { content: @fa-var-asterisk; }\n.@{fa-css-prefix}-exclamation-circle:before { content: @fa-var-exclamation-circle; }\n.@{fa-css-prefix}-gift:before { content: @fa-var-gift; }\n.@{fa-css-prefix}-leaf:before { content: @fa-var-leaf; }\n.@{fa-css-prefix}-fire:before { content: @fa-var-fire; }\n.@{fa-css-prefix}-eye:before { content: @fa-var-eye; }\n.@{fa-css-prefix}-eye-slash:before { content: @fa-var-eye-slash; }\n.@{fa-css-prefix}-warning:before,\n.@{fa-css-prefix}-exclamation-triangle:before { content: @fa-var-exclamation-triangle; }\n.@{fa-css-prefix}-plane:before { content: @fa-var-plane; }\n.@{fa-css-prefix}-calendar:before { content: @fa-var-calendar; }\n.@{fa-css-prefix}-random:before { content: @fa-var-random; }\n.@{fa-css-prefix}-comment:before { content: @fa-var-comment; }\n.@{fa-css-prefix}-magnet:before { content: @fa-var-magnet; }\n.@{fa-css-prefix}-chevron-up:before { content: @fa-var-chevron-up; }\n.@{fa-css-prefix}-chevron-down:before { content: @fa-var-chevron-down; }\n.@{fa-css-prefix}-retweet:before { content: @fa-var-retweet; }\n.@{fa-css-prefix}-shopping-cart:before { content: @fa-var-shopping-cart; }\n.@{fa-css-prefix}-folder:before { content: @fa-var-folder; }\n.@{fa-css-prefix}-folder-open:before { content: @fa-var-folder-open; }\n.@{fa-css-prefix}-arrows-v:before { content: @fa-var-arrows-v; }\n.@{fa-css-prefix}-arrows-h:before { content: @fa-var-arrows-h; }\n.@{fa-css-prefix}-bar-chart-o:before,\n.@{fa-css-prefix}-bar-chart:before { content: @fa-var-bar-chart; }\n.@{fa-css-prefix}-twitter-square:before { content: @fa-var-twitter-square; }\n.@{fa-css-prefix}-facebook-square:before { content: @fa-var-facebook-square; }\n.@{fa-css-prefix}-camera-retro:before { content: @fa-var-camera-retro; }\n.@{fa-css-prefix}-key:before { content: @fa-var-key; }\n.@{fa-css-prefix}-gears:before,\n.@{fa-css-prefix}-cogs:before { content: @fa-var-cogs; }\n.@{fa-css-prefix}-comments:before { content: @fa-var-comments; }\n.@{fa-css-prefix}-thumbs-o-up:before { content: @fa-var-thumbs-o-up; }\n.@{fa-css-prefix}-thumbs-o-down:before { content: @fa-var-thumbs-o-down; }\n.@{fa-css-prefix}-star-half:before { content: @fa-var-star-half; }\n.@{fa-css-prefix}-heart-o:before { content: @fa-var-heart-o; }\n.@{fa-css-prefix}-sign-out:before { content: @fa-var-sign-out; }\n.@{fa-css-prefix}-linkedin-square:before { content: @fa-var-linkedin-square; }\n.@{fa-css-prefix}-thumb-tack:before { content: @fa-var-thumb-tack; }\n.@{fa-css-prefix}-external-link:before { content: @fa-var-external-link; }\n.@{fa-css-prefix}-sign-in:before { content: @fa-var-sign-in; }\n.@{fa-css-prefix}-trophy:before { content: @fa-var-trophy; }\n.@{fa-css-prefix}-github-square:before { content: @fa-var-github-square; }\n.@{fa-css-prefix}-upload:before { content: @fa-var-upload; }\n.@{fa-css-prefix}-lemon-o:before { content: @fa-var-lemon-o; }\n.@{fa-css-prefix}-phone:before { content: @fa-var-phone; }\n.@{fa-css-prefix}-square-o:before { content: @fa-var-square-o; }\n.@{fa-css-prefix}-bookmark-o:before { content: @fa-var-bookmark-o; }\n.@{fa-css-prefix}-phone-square:before { content: @fa-var-phone-square; }\n.@{fa-css-prefix}-twitter:before { content: @fa-var-twitter; }\n.@{fa-css-prefix}-facebook-f:before,\n.@{fa-css-prefix}-facebook:before { content: @fa-var-facebook; }\n.@{fa-css-prefix}-github:before { content: @fa-var-github; }\n.@{fa-css-prefix}-unlock:before { content: @fa-var-unlock; }\n.@{fa-css-prefix}-credit-card:before { content: @fa-var-credit-card; }\n.@{fa-css-prefix}-rss:before { content: @fa-var-rss; }\n.@{fa-css-prefix}-hdd-o:before { content: @fa-var-hdd-o; }\n.@{fa-css-prefix}-bullhorn:before { content: @fa-var-bullhorn; }\n.@{fa-css-prefix}-bell:before { content: @fa-var-bell; }\n.@{fa-css-prefix}-certificate:before { content: @fa-var-certificate; }\n.@{fa-css-prefix}-hand-o-right:before { content: @fa-var-hand-o-right; }\n.@{fa-css-prefix}-hand-o-left:before { content: @fa-var-hand-o-left; }\n.@{fa-css-prefix}-hand-o-up:before { content: @fa-var-hand-o-up; }\n.@{fa-css-prefix}-hand-o-down:before { content: @fa-var-hand-o-down; }\n.@{fa-css-prefix}-arrow-circle-left:before { content: @fa-var-arrow-circle-left; }\n.@{fa-css-prefix}-arrow-circle-right:before { content: @fa-var-arrow-circle-right; }\n.@{fa-css-prefix}-arrow-circle-up:before { content: @fa-var-arrow-circle-up; }\n.@{fa-css-prefix}-arrow-circle-down:before { content: @fa-var-arrow-circle-down; }\n.@{fa-css-prefix}-globe:before { content: @fa-var-globe; }\n.@{fa-css-prefix}-wrench:before { content: @fa-var-wrench; }\n.@{fa-css-prefix}-tasks:before { content: @fa-var-tasks; }\n.@{fa-css-prefix}-filter:before { content: @fa-var-filter; }\n.@{fa-css-prefix}-briefcase:before { content: @fa-var-briefcase; }\n.@{fa-css-prefix}-arrows-alt:before { content: @fa-var-arrows-alt; }\n.@{fa-css-prefix}-group:before,\n.@{fa-css-prefix}-users:before { content: @fa-var-users; }\n.@{fa-css-prefix}-chain:before,\n.@{fa-css-prefix}-link:before { content: @fa-var-link; }\n.@{fa-css-prefix}-cloud:before { content: @fa-var-cloud; }\n.@{fa-css-prefix}-flask:before { content: @fa-var-flask; }\n.@{fa-css-prefix}-cut:before,\n.@{fa-css-prefix}-scissors:before { content: @fa-var-scissors; }\n.@{fa-css-prefix}-copy:before,\n.@{fa-css-prefix}-files-o:before { content: @fa-var-files-o; }\n.@{fa-css-prefix}-paperclip:before { content: @fa-var-paperclip; }\n.@{fa-css-prefix}-save:before,\n.@{fa-css-prefix}-floppy-o:before { content: @fa-var-floppy-o; }\n.@{fa-css-prefix}-square:before { content: @fa-var-square; }\n.@{fa-css-prefix}-navicon:before,\n.@{fa-css-prefix}-reorder:before,\n.@{fa-css-prefix}-bars:before { content: @fa-var-bars; }\n.@{fa-css-prefix}-list-ul:before { content: @fa-var-list-ul; }\n.@{fa-css-prefix}-list-ol:before { content: @fa-var-list-ol; }\n.@{fa-css-prefix}-strikethrough:before { content: @fa-var-strikethrough; }\n.@{fa-css-prefix}-underline:before { content: @fa-var-underline; }\n.@{fa-css-prefix}-table:before { content: @fa-var-table; }\n.@{fa-css-prefix}-magic:before { content: @fa-var-magic; }\n.@{fa-css-prefix}-truck:before { content: @fa-var-truck; }\n.@{fa-css-prefix}-pinterest:before { content: @fa-var-pinterest; }\n.@{fa-css-prefix}-pinterest-square:before { content: @fa-var-pinterest-square; }\n.@{fa-css-prefix}-google-plus-square:before { content: @fa-var-google-plus-square; }\n.@{fa-css-prefix}-google-plus:before { content: @fa-var-google-plus; }\n.@{fa-css-prefix}-money:before { content: @fa-var-money; }\n.@{fa-css-prefix}-caret-down:before { content: @fa-var-caret-down; }\n.@{fa-css-prefix}-caret-up:before { content: @fa-var-caret-up; }\n.@{fa-css-prefix}-caret-left:before { content: @fa-var-caret-left; }\n.@{fa-css-prefix}-caret-right:before { content: @fa-var-caret-right; }\n.@{fa-css-prefix}-columns:before { content: @fa-var-columns; }\n.@{fa-css-prefix}-unsorted:before,\n.@{fa-css-prefix}-sort:before { content: @fa-var-sort; }\n.@{fa-css-prefix}-sort-down:before,\n.@{fa-css-prefix}-sort-desc:before { content: @fa-var-sort-desc; }\n.@{fa-css-prefix}-sort-up:before,\n.@{fa-css-prefix}-sort-asc:before { content: @fa-var-sort-asc; }\n.@{fa-css-prefix}-envelope:before { content: @fa-var-envelope; }\n.@{fa-css-prefix}-linkedin:before { content: @fa-var-linkedin; }\n.@{fa-css-prefix}-rotate-left:before,\n.@{fa-css-prefix}-undo:before { content: @fa-var-undo; }\n.@{fa-css-prefix}-legal:before,\n.@{fa-css-prefix}-gavel:before { content: @fa-var-gavel; }\n.@{fa-css-prefix}-dashboard:before,\n.@{fa-css-prefix}-tachometer:before { content: @fa-var-tachometer; }\n.@{fa-css-prefix}-comment-o:before { content: @fa-var-comment-o; }\n.@{fa-css-prefix}-comments-o:before { content: @fa-var-comments-o; }\n.@{fa-css-prefix}-flash:before,\n.@{fa-css-prefix}-bolt:before { content: @fa-var-bolt; }\n.@{fa-css-prefix}-sitemap:before { content: @fa-var-sitemap; }\n.@{fa-css-prefix}-umbrella:before { content: @fa-var-umbrella; }\n.@{fa-css-prefix}-paste:before,\n.@{fa-css-prefix}-clipboard:before { content: @fa-var-clipboard; }\n.@{fa-css-prefix}-lightbulb-o:before { content: @fa-var-lightbulb-o; }\n.@{fa-css-prefix}-exchange:before { content: @fa-var-exchange; }\n.@{fa-css-prefix}-cloud-download:before { content: @fa-var-cloud-download; }\n.@{fa-css-prefix}-cloud-upload:before { content: @fa-var-cloud-upload; }\n.@{fa-css-prefix}-user-md:before { content: @fa-var-user-md; }\n.@{fa-css-prefix}-stethoscope:before { content: @fa-var-stethoscope; }\n.@{fa-css-prefix}-suitcase:before { content: @fa-var-suitcase; }\n.@{fa-css-prefix}-bell-o:before { content: @fa-var-bell-o; }\n.@{fa-css-prefix}-coffee:before { content: @fa-var-coffee; }\n.@{fa-css-prefix}-cutlery:before { content: @fa-var-cutlery; }\n.@{fa-css-prefix}-file-text-o:before { content: @fa-var-file-text-o; }\n.@{fa-css-prefix}-building-o:before { content: @fa-var-building-o; }\n.@{fa-css-prefix}-hospital-o:before { content: @fa-var-hospital-o; }\n.@{fa-css-prefix}-ambulance:before { content: @fa-var-ambulance; }\n.@{fa-css-prefix}-medkit:before { content: @fa-var-medkit; }\n.@{fa-css-prefix}-fighter-jet:before { content: @fa-var-fighter-jet; }\n.@{fa-css-prefix}-beer:before { content: @fa-var-beer; }\n.@{fa-css-prefix}-h-square:before { content: @fa-var-h-square; }\n.@{fa-css-prefix}-plus-square:before { content: @fa-var-plus-square; }\n.@{fa-css-prefix}-angle-double-left:before { content: @fa-var-angle-double-left; }\n.@{fa-css-prefix}-angle-double-right:before { content: @fa-var-angle-double-right; }\n.@{fa-css-prefix}-angle-double-up:before { content: @fa-var-angle-double-up; }\n.@{fa-css-prefix}-angle-double-down:before { content: @fa-var-angle-double-down; }\n.@{fa-css-prefix}-angle-left:before { content: @fa-var-angle-left; }\n.@{fa-css-prefix}-angle-right:before { content: @fa-var-angle-right; }\n.@{fa-css-prefix}-angle-up:before { content: @fa-var-angle-up; }\n.@{fa-css-prefix}-angle-down:before { content: @fa-var-angle-down; }\n.@{fa-css-prefix}-desktop:before { content: @fa-var-desktop; }\n.@{fa-css-prefix}-laptop:before { content: @fa-var-laptop; }\n.@{fa-css-prefix}-tablet:before { content: @fa-var-tablet; }\n.@{fa-css-prefix}-mobile-phone:before,\n.@{fa-css-prefix}-mobile:before { content: @fa-var-mobile; }\n.@{fa-css-prefix}-circle-o:before { content: @fa-var-circle-o; }\n.@{fa-css-prefix}-quote-left:before { content: @fa-var-quote-left; }\n.@{fa-css-prefix}-quote-right:before { content: @fa-var-quote-right; }\n.@{fa-css-prefix}-spinner:before { content: @fa-var-spinner; }\n.@{fa-css-prefix}-circle:before { content: @fa-var-circle; }\n.@{fa-css-prefix}-mail-reply:before,\n.@{fa-css-prefix}-reply:before { content: @fa-var-reply; }\n.@{fa-css-prefix}-github-alt:before { content: @fa-var-github-alt; }\n.@{fa-css-prefix}-folder-o:before { content: @fa-var-folder-o; }\n.@{fa-css-prefix}-folder-open-o:before { content: @fa-var-folder-open-o; }\n.@{fa-css-prefix}-smile-o:before { content: @fa-var-smile-o; }\n.@{fa-css-prefix}-frown-o:before { content: @fa-var-frown-o; }\n.@{fa-css-prefix}-meh-o:before { content: @fa-var-meh-o; }\n.@{fa-css-prefix}-gamepad:before { content: @fa-var-gamepad; }\n.@{fa-css-prefix}-keyboard-o:before { content: @fa-var-keyboard-o; }\n.@{fa-css-prefix}-flag-o:before { content: @fa-var-flag-o; }\n.@{fa-css-prefix}-flag-checkered:before { content: @fa-var-flag-checkered; }\n.@{fa-css-prefix}-terminal:before { content: @fa-var-terminal; }\n.@{fa-css-prefix}-code:before { content: @fa-var-code; }\n.@{fa-css-prefix}-mail-reply-all:before,\n.@{fa-css-prefix}-reply-all:before { content: @fa-var-reply-all; }\n.@{fa-css-prefix}-star-half-empty:before,\n.@{fa-css-prefix}-star-half-full:before,\n.@{fa-css-prefix}-star-half-o:before { content: @fa-var-star-half-o; }\n.@{fa-css-prefix}-location-arrow:before { content: @fa-var-location-arrow; }\n.@{fa-css-prefix}-crop:before { content: @fa-var-crop; }\n.@{fa-css-prefix}-code-fork:before { content: @fa-var-code-fork; }\n.@{fa-css-prefix}-unlink:before,\n.@{fa-css-prefix}-chain-broken:before { content: @fa-var-chain-broken; }\n.@{fa-css-prefix}-question:before { content: @fa-var-question; }\n.@{fa-css-prefix}-info:before { content: @fa-var-info; }\n.@{fa-css-prefix}-exclamation:before { content: @fa-var-exclamation; }\n.@{fa-css-prefix}-superscript:before { content: @fa-var-superscript; }\n.@{fa-css-prefix}-subscript:before { content: @fa-var-subscript; }\n.@{fa-css-prefix}-eraser:before { content: @fa-var-eraser; }\n.@{fa-css-prefix}-puzzle-piece:before { content: @fa-var-puzzle-piece; }\n.@{fa-css-prefix}-microphone:before { content: @fa-var-microphone; }\n.@{fa-css-prefix}-microphone-slash:before { content: @fa-var-microphone-slash; }\n.@{fa-css-prefix}-shield:before { content: @fa-var-shield; }\n.@{fa-css-prefix}-calendar-o:before { content: @fa-var-calendar-o; }\n.@{fa-css-prefix}-fire-extinguisher:before { content: @fa-var-fire-extinguisher; }\n.@{fa-css-prefix}-rocket:before { content: @fa-var-rocket; }\n.@{fa-css-prefix}-maxcdn:before { content: @fa-var-maxcdn; }\n.@{fa-css-prefix}-chevron-circle-left:before { content: @fa-var-chevron-circle-left; }\n.@{fa-css-prefix}-chevron-circle-right:before { content: @fa-var-chevron-circle-right; }\n.@{fa-css-prefix}-chevron-circle-up:before { content: @fa-var-chevron-circle-up; }\n.@{fa-css-prefix}-chevron-circle-down:before { content: @fa-var-chevron-circle-down; }\n.@{fa-css-prefix}-html5:before { content: @fa-var-html5; }\n.@{fa-css-prefix}-css3:before { content: @fa-var-css3; }\n.@{fa-css-prefix}-anchor:before { content: @fa-var-anchor; }\n.@{fa-css-prefix}-unlock-alt:before { content: @fa-var-unlock-alt; }\n.@{fa-css-prefix}-bullseye:before { content: @fa-var-bullseye; }\n.@{fa-css-prefix}-ellipsis-h:before { content: @fa-var-ellipsis-h; }\n.@{fa-css-prefix}-ellipsis-v:before { content: @fa-var-ellipsis-v; }\n.@{fa-css-prefix}-rss-square:before { content: @fa-var-rss-square; }\n.@{fa-css-prefix}-play-circle:before { content: @fa-var-play-circle; }\n.@{fa-css-prefix}-ticket:before { content: @fa-var-ticket; }\n.@{fa-css-prefix}-minus-square:before { content: @fa-var-minus-square; }\n.@{fa-css-prefix}-minus-square-o:before { content: @fa-var-minus-square-o; }\n.@{fa-css-prefix}-level-up:before { content: @fa-var-level-up; }\n.@{fa-css-prefix}-level-down:before { content: @fa-var-level-down; }\n.@{fa-css-prefix}-check-square:before { content: @fa-var-check-square; }\n.@{fa-css-prefix}-pencil-square:before { content: @fa-var-pencil-square; }\n.@{fa-css-prefix}-external-link-square:before { content: @fa-var-external-link-square; }\n.@{fa-css-prefix}-share-square:before { content: @fa-var-share-square; }\n.@{fa-css-prefix}-compass:before { content: @fa-var-compass; }\n.@{fa-css-prefix}-toggle-down:before,\n.@{fa-css-prefix}-caret-square-o-down:before { content: @fa-var-caret-square-o-down; }\n.@{fa-css-prefix}-toggle-up:before,\n.@{fa-css-prefix}-caret-square-o-up:before { content: @fa-var-caret-square-o-up; }\n.@{fa-css-prefix}-toggle-right:before,\n.@{fa-css-prefix}-caret-square-o-right:before { content: @fa-var-caret-square-o-right; }\n.@{fa-css-prefix}-euro:before,\n.@{fa-css-prefix}-eur:before { content: @fa-var-eur; }\n.@{fa-css-prefix}-gbp:before { content: @fa-var-gbp; }\n.@{fa-css-prefix}-dollar:before,\n.@{fa-css-prefix}-usd:before { content: @fa-var-usd; }\n.@{fa-css-prefix}-rupee:before,\n.@{fa-css-prefix}-inr:before { content: @fa-var-inr; }\n.@{fa-css-prefix}-cny:before,\n.@{fa-css-prefix}-rmb:before,\n.@{fa-css-prefix}-yen:before,\n.@{fa-css-prefix}-jpy:before { content: @fa-var-jpy; }\n.@{fa-css-prefix}-ruble:before,\n.@{fa-css-prefix}-rouble:before,\n.@{fa-css-prefix}-rub:before { content: @fa-var-rub; }\n.@{fa-css-prefix}-won:before,\n.@{fa-css-prefix}-krw:before { content: @fa-var-krw; }\n.@{fa-css-prefix}-bitcoin:before,\n.@{fa-css-prefix}-btc:before { content: @fa-var-btc; }\n.@{fa-css-prefix}-file:before { content: @fa-var-file; }\n.@{fa-css-prefix}-file-text:before { content: @fa-var-file-text; }\n.@{fa-css-prefix}-sort-alpha-asc:before { content: @fa-var-sort-alpha-asc; }\n.@{fa-css-prefix}-sort-alpha-desc:before { content: @fa-var-sort-alpha-desc; }\n.@{fa-css-prefix}-sort-amount-asc:before { content: @fa-var-sort-amount-asc; }\n.@{fa-css-prefix}-sort-amount-desc:before { content: @fa-var-sort-amount-desc; }\n.@{fa-css-prefix}-sort-numeric-asc:before { content: @fa-var-sort-numeric-asc; }\n.@{fa-css-prefix}-sort-numeric-desc:before { content: @fa-var-sort-numeric-desc; }\n.@{fa-css-prefix}-thumbs-up:before { content: @fa-var-thumbs-up; }\n.@{fa-css-prefix}-thumbs-down:before { content: @fa-var-thumbs-down; }\n.@{fa-css-prefix}-youtube-square:before { content: @fa-var-youtube-square; }\n.@{fa-css-prefix}-youtube:before { content: @fa-var-youtube; }\n.@{fa-css-prefix}-xing:before { content: @fa-var-xing; }\n.@{fa-css-prefix}-xing-square:before { content: @fa-var-xing-square; }\n.@{fa-css-prefix}-youtube-play:before { content: @fa-var-youtube-play; }\n.@{fa-css-prefix}-dropbox:before { content: @fa-var-dropbox; }\n.@{fa-css-prefix}-stack-overflow:before { content: @fa-var-stack-overflow; }\n.@{fa-css-prefix}-instagram:before { content: @fa-var-instagram; }\n.@{fa-css-prefix}-flickr:before { content: @fa-var-flickr; }\n.@{fa-css-prefix}-adn:before { content: @fa-var-adn; }\n.@{fa-css-prefix}-bitbucket:before { content: @fa-var-bitbucket; }\n.@{fa-css-prefix}-bitbucket-square:before { content: @fa-var-bitbucket-square; }\n.@{fa-css-prefix}-tumblr:before { content: @fa-var-tumblr; }\n.@{fa-css-prefix}-tumblr-square:before { content: @fa-var-tumblr-square; }\n.@{fa-css-prefix}-long-arrow-down:before { content: @fa-var-long-arrow-down; }\n.@{fa-css-prefix}-long-arrow-up:before { content: @fa-var-long-arrow-up; }\n.@{fa-css-prefix}-long-arrow-left:before { content: @fa-var-long-arrow-left; }\n.@{fa-css-prefix}-long-arrow-right:before { content: @fa-var-long-arrow-right; }\n.@{fa-css-prefix}-apple:before { content: @fa-var-apple; }\n.@{fa-css-prefix}-windows:before { content: @fa-var-windows; }\n.@{fa-css-prefix}-android:before { content: @fa-var-android; }\n.@{fa-css-prefix}-linux:before { content: @fa-var-linux; }\n.@{fa-css-prefix}-dribbble:before { content: @fa-var-dribbble; }\n.@{fa-css-prefix}-skype:before { content: @fa-var-skype; }\n.@{fa-css-prefix}-foursquare:before { content: @fa-var-foursquare; }\n.@{fa-css-prefix}-trello:before { content: @fa-var-trello; }\n.@{fa-css-prefix}-female:before { content: @fa-var-female; }\n.@{fa-css-prefix}-male:before { content: @fa-var-male; }\n.@{fa-css-prefix}-gittip:before,\n.@{fa-css-prefix}-gratipay:before { content: @fa-var-gratipay; }\n.@{fa-css-prefix}-sun-o:before { content: @fa-var-sun-o; }\n.@{fa-css-prefix}-moon-o:before { content: @fa-var-moon-o; }\n.@{fa-css-prefix}-archive:before { content: @fa-var-archive; }\n.@{fa-css-prefix}-bug:before { content: @fa-var-bug; }\n.@{fa-css-prefix}-vk:before { content: @fa-var-vk; }\n.@{fa-css-prefix}-weibo:before { content: @fa-var-weibo; }\n.@{fa-css-prefix}-renren:before { content: @fa-var-renren; }\n.@{fa-css-prefix}-pagelines:before { content: @fa-var-pagelines; }\n.@{fa-css-prefix}-stack-exchange:before { content: @fa-var-stack-exchange; }\n.@{fa-css-prefix}-arrow-circle-o-right:before { content: @fa-var-arrow-circle-o-right; }\n.@{fa-css-prefix}-arrow-circle-o-left:before { content: @fa-var-arrow-circle-o-left; }\n.@{fa-css-prefix}-toggle-left:before,\n.@{fa-css-prefix}-caret-square-o-left:before { content: @fa-var-caret-square-o-left; }\n.@{fa-css-prefix}-dot-circle-o:before { content: @fa-var-dot-circle-o; }\n.@{fa-css-prefix}-wheelchair:before { content: @fa-var-wheelchair; }\n.@{fa-css-prefix}-vimeo-square:before { content: @fa-var-vimeo-square; }\n.@{fa-css-prefix}-turkish-lira:before,\n.@{fa-css-prefix}-try:before { content: @fa-var-try; }\n.@{fa-css-prefix}-plus-square-o:before { content: @fa-var-plus-square-o; }\n.@{fa-css-prefix}-space-shuttle:before { content: @fa-var-space-shuttle; }\n.@{fa-css-prefix}-slack:before { content: @fa-var-slack; }\n.@{fa-css-prefix}-envelope-square:before { content: @fa-var-envelope-square; }\n.@{fa-css-prefix}-wordpress:before { content: @fa-var-wordpress; }\n.@{fa-css-prefix}-openid:before { content: @fa-var-openid; }\n.@{fa-css-prefix}-institution:before,\n.@{fa-css-prefix}-bank:before,\n.@{fa-css-prefix}-university:before { content: @fa-var-university; }\n.@{fa-css-prefix}-mortar-board:before,\n.@{fa-css-prefix}-graduation-cap:before { content: @fa-var-graduation-cap; }\n.@{fa-css-prefix}-yahoo:before { content: @fa-var-yahoo; }\n.@{fa-css-prefix}-google:before { content: @fa-var-google; }\n.@{fa-css-prefix}-reddit:before { content: @fa-var-reddit; }\n.@{fa-css-prefix}-reddit-square:before { content: @fa-var-reddit-square; }\n.@{fa-css-prefix}-stumbleupon-circle:before { content: @fa-var-stumbleupon-circle; }\n.@{fa-css-prefix}-stumbleupon:before { content: @fa-var-stumbleupon; }\n.@{fa-css-prefix}-delicious:before { content: @fa-var-delicious; }\n.@{fa-css-prefix}-digg:before { content: @fa-var-digg; }\n.@{fa-css-prefix}-pied-piper:before { content: @fa-var-pied-piper; }\n.@{fa-css-prefix}-pied-piper-alt:before { content: @fa-var-pied-piper-alt; }\n.@{fa-css-prefix}-drupal:before { content: @fa-var-drupal; }\n.@{fa-css-prefix}-joomla:before { content: @fa-var-joomla; }\n.@{fa-css-prefix}-language:before { content: @fa-var-language; }\n.@{fa-css-prefix}-fax:before { content: @fa-var-fax; }\n.@{fa-css-prefix}-building:before { content: @fa-var-building; }\n.@{fa-css-prefix}-child:before { content: @fa-var-child; }\n.@{fa-css-prefix}-paw:before { content: @fa-var-paw; }\n.@{fa-css-prefix}-spoon:before { content: @fa-var-spoon; }\n.@{fa-css-prefix}-cube:before { content: @fa-var-cube; }\n.@{fa-css-prefix}-cubes:before { content: @fa-var-cubes; }\n.@{fa-css-prefix}-behance:before { content: @fa-var-behance; }\n.@{fa-css-prefix}-behance-square:before { content: @fa-var-behance-square; }\n.@{fa-css-prefix}-steam:before { content: @fa-var-steam; }\n.@{fa-css-prefix}-steam-square:before { content: @fa-var-steam-square; }\n.@{fa-css-prefix}-recycle:before { content: @fa-var-recycle; }\n.@{fa-css-prefix}-automobile:before,\n.@{fa-css-prefix}-car:before { content: @fa-var-car; }\n.@{fa-css-prefix}-cab:before,\n.@{fa-css-prefix}-taxi:before { content: @fa-var-taxi; }\n.@{fa-css-prefix}-tree:before { content: @fa-var-tree; }\n.@{fa-css-prefix}-spotify:before { content: @fa-var-spotify; }\n.@{fa-css-prefix}-deviantart:before { content: @fa-var-deviantart; }\n.@{fa-css-prefix}-soundcloud:before { content: @fa-var-soundcloud; }\n.@{fa-css-prefix}-database:before { content: @fa-var-database; }\n.@{fa-css-prefix}-file-pdf-o:before { content: @fa-var-file-pdf-o; }\n.@{fa-css-prefix}-file-word-o:before { content: @fa-var-file-word-o; }\n.@{fa-css-prefix}-file-excel-o:before { content: @fa-var-file-excel-o; }\n.@{fa-css-prefix}-file-powerpoint-o:before { content: @fa-var-file-powerpoint-o; }\n.@{fa-css-prefix}-file-photo-o:before,\n.@{fa-css-prefix}-file-picture-o:before,\n.@{fa-css-prefix}-file-image-o:before { content: @fa-var-file-image-o; }\n.@{fa-css-prefix}-file-zip-o:before,\n.@{fa-css-prefix}-file-archive-o:before { content: @fa-var-file-archive-o; }\n.@{fa-css-prefix}-file-sound-o:before,\n.@{fa-css-prefix}-file-audio-o:before { content: @fa-var-file-audio-o; }\n.@{fa-css-prefix}-file-movie-o:before,\n.@{fa-css-prefix}-file-video-o:before { content: @fa-var-file-video-o; }\n.@{fa-css-prefix}-file-code-o:before { content: @fa-var-file-code-o; }\n.@{fa-css-prefix}-vine:before { content: @fa-var-vine; }\n.@{fa-css-prefix}-codepen:before { content: @fa-var-codepen; }\n.@{fa-css-prefix}-jsfiddle:before { content: @fa-var-jsfiddle; }\n.@{fa-css-prefix}-life-bouy:before,\n.@{fa-css-prefix}-life-buoy:before,\n.@{fa-css-prefix}-life-saver:before,\n.@{fa-css-prefix}-support:before,\n.@{fa-css-prefix}-life-ring:before { content: @fa-var-life-ring; }\n.@{fa-css-prefix}-circle-o-notch:before { content: @fa-var-circle-o-notch; }\n.@{fa-css-prefix}-ra:before,\n.@{fa-css-prefix}-rebel:before { content: @fa-var-rebel; }\n.@{fa-css-prefix}-ge:before,\n.@{fa-css-prefix}-empire:before { content: @fa-var-empire; }\n.@{fa-css-prefix}-git-square:before { content: @fa-var-git-square; }\n.@{fa-css-prefix}-git:before { content: @fa-var-git; }\n.@{fa-css-prefix}-hacker-news:before { content: @fa-var-hacker-news; }\n.@{fa-css-prefix}-tencent-weibo:before { content: @fa-var-tencent-weibo; }\n.@{fa-css-prefix}-qq:before { content: @fa-var-qq; }\n.@{fa-css-prefix}-wechat:before,\n.@{fa-css-prefix}-weixin:before { content: @fa-var-weixin; }\n.@{fa-css-prefix}-send:before,\n.@{fa-css-prefix}-paper-plane:before { content: @fa-var-paper-plane; }\n.@{fa-css-prefix}-send-o:before,\n.@{fa-css-prefix}-paper-plane-o:before { content: @fa-var-paper-plane-o; }\n.@{fa-css-prefix}-history:before { content: @fa-var-history; }\n.@{fa-css-prefix}-genderless:before,\n.@{fa-css-prefix}-circle-thin:before { content: @fa-var-circle-thin; }\n.@{fa-css-prefix}-header:before { content: @fa-var-header; }\n.@{fa-css-prefix}-paragraph:before { content: @fa-var-paragraph; }\n.@{fa-css-prefix}-sliders:before { content: @fa-var-sliders; }\n.@{fa-css-prefix}-share-alt:before { content: @fa-var-share-alt; }\n.@{fa-css-prefix}-share-alt-square:before { content: @fa-var-share-alt-square; }\n.@{fa-css-prefix}-bomb:before { content: @fa-var-bomb; }\n.@{fa-css-prefix}-soccer-ball-o:before,\n.@{fa-css-prefix}-futbol-o:before { content: @fa-var-futbol-o; }\n.@{fa-css-prefix}-tty:before { content: @fa-var-tty; }\n.@{fa-css-prefix}-binoculars:before { content: @fa-var-binoculars; }\n.@{fa-css-prefix}-plug:before { content: @fa-var-plug; }\n.@{fa-css-prefix}-slideshare:before { content: @fa-var-slideshare; }\n.@{fa-css-prefix}-twitch:before { content: @fa-var-twitch; }\n.@{fa-css-prefix}-yelp:before { content: @fa-var-yelp; }\n.@{fa-css-prefix}-newspaper-o:before { content: @fa-var-newspaper-o; }\n.@{fa-css-prefix}-wifi:before { content: @fa-var-wifi; }\n.@{fa-css-prefix}-calculator:before { content: @fa-var-calculator; }\n.@{fa-css-prefix}-paypal:before { content: @fa-var-paypal; }\n.@{fa-css-prefix}-google-wallet:before { content: @fa-var-google-wallet; }\n.@{fa-css-prefix}-cc-visa:before { content: @fa-var-cc-visa; }\n.@{fa-css-prefix}-cc-mastercard:before { content: @fa-var-cc-mastercard; }\n.@{fa-css-prefix}-cc-discover:before { content: @fa-var-cc-discover; }\n.@{fa-css-prefix}-cc-amex:before { content: @fa-var-cc-amex; }\n.@{fa-css-prefix}-cc-paypal:before { content: @fa-var-cc-paypal; }\n.@{fa-css-prefix}-cc-stripe:before { content: @fa-var-cc-stripe; }\n.@{fa-css-prefix}-bell-slash:before { content: @fa-var-bell-slash; }\n.@{fa-css-prefix}-bell-slash-o:before { content: @fa-var-bell-slash-o; }\n.@{fa-css-prefix}-trash:before { content: @fa-var-trash; }\n.@{fa-css-prefix}-copyright:before { content: @fa-var-copyright; }\n.@{fa-css-prefix}-at:before { content: @fa-var-at; }\n.@{fa-css-prefix}-eyedropper:before { content: @fa-var-eyedropper; }\n.@{fa-css-prefix}-paint-brush:before { content: @fa-var-paint-brush; }\n.@{fa-css-prefix}-birthday-cake:before { content: @fa-var-birthday-cake; }\n.@{fa-css-prefix}-area-chart:before { content: @fa-var-area-chart; }\n.@{fa-css-prefix}-pie-chart:before { content: @fa-var-pie-chart; }\n.@{fa-css-prefix}-line-chart:before { content: @fa-var-line-chart; }\n.@{fa-css-prefix}-lastfm:before { content: @fa-var-lastfm; }\n.@{fa-css-prefix}-lastfm-square:before { content: @fa-var-lastfm-square; }\n.@{fa-css-prefix}-toggle-off:before { content: @fa-var-toggle-off; }\n.@{fa-css-prefix}-toggle-on:before { content: @fa-var-toggle-on; }\n.@{fa-css-prefix}-bicycle:before { content: @fa-var-bicycle; }\n.@{fa-css-prefix}-bus:before { content: @fa-var-bus; }\n.@{fa-css-prefix}-ioxhost:before { content: @fa-var-ioxhost; }\n.@{fa-css-prefix}-angellist:before { content: @fa-var-angellist; }\n.@{fa-css-prefix}-cc:before { content: @fa-var-cc; }\n.@{fa-css-prefix}-shekel:before,\n.@{fa-css-prefix}-sheqel:before,\n.@{fa-css-prefix}-ils:before { content: @fa-var-ils; }\n.@{fa-css-prefix}-meanpath:before { content: @fa-var-meanpath; }\n.@{fa-css-prefix}-buysellads:before { content: @fa-var-buysellads; }\n.@{fa-css-prefix}-connectdevelop:before { content: @fa-var-connectdevelop; }\n.@{fa-css-prefix}-dashcube:before { content: @fa-var-dashcube; }\n.@{fa-css-prefix}-forumbee:before { content: @fa-var-forumbee; }\n.@{fa-css-prefix}-leanpub:before { content: @fa-var-leanpub; }\n.@{fa-css-prefix}-sellsy:before { content: @fa-var-sellsy; }\n.@{fa-css-prefix}-shirtsinbulk:before { content: @fa-var-shirtsinbulk; }\n.@{fa-css-prefix}-simplybuilt:before { content: @fa-var-simplybuilt; }\n.@{fa-css-prefix}-skyatlas:before { content: @fa-var-skyatlas; }\n.@{fa-css-prefix}-cart-plus:before { content: @fa-var-cart-plus; }\n.@{fa-css-prefix}-cart-arrow-down:before { content: @fa-var-cart-arrow-down; }\n.@{fa-css-prefix}-diamond:before { content: @fa-var-diamond; }\n.@{fa-css-prefix}-ship:before { content: @fa-var-ship; }\n.@{fa-css-prefix}-user-secret:before { content: @fa-var-user-secret; }\n.@{fa-css-prefix}-motorcycle:before { content: @fa-var-motorcycle; }\n.@{fa-css-prefix}-street-view:before { content: @fa-var-street-view; }\n.@{fa-css-prefix}-heartbeat:before { content: @fa-var-heartbeat; }\n.@{fa-css-prefix}-venus:before { content: @fa-var-venus; }\n.@{fa-css-prefix}-mars:before { content: @fa-var-mars; }\n.@{fa-css-prefix}-mercury:before { content: @fa-var-mercury; }\n.@{fa-css-prefix}-transgender:before { content: @fa-var-transgender; }\n.@{fa-css-prefix}-transgender-alt:before { content: @fa-var-transgender-alt; }\n.@{fa-css-prefix}-venus-double:before { content: @fa-var-venus-double; }\n.@{fa-css-prefix}-mars-double:before { content: @fa-var-mars-double; }\n.@{fa-css-prefix}-venus-mars:before { content: @fa-var-venus-mars; }\n.@{fa-css-prefix}-mars-stroke:before { content: @fa-var-mars-stroke; }\n.@{fa-css-prefix}-mars-stroke-v:before { content: @fa-var-mars-stroke-v; }\n.@{fa-css-prefix}-mars-stroke-h:before { content: @fa-var-mars-stroke-h; }\n.@{fa-css-prefix}-neuter:before { content: @fa-var-neuter; }\n.@{fa-css-prefix}-facebook-official:before { content: @fa-var-facebook-official; }\n.@{fa-css-prefix}-pinterest-p:before { content: @fa-var-pinterest-p; }\n.@{fa-css-prefix}-whatsapp:before { content: @fa-var-whatsapp; }\n.@{fa-css-prefix}-server:before { content: @fa-var-server; }\n.@{fa-css-prefix}-user-plus:before { content: @fa-var-user-plus; }\n.@{fa-css-prefix}-user-times:before { content: @fa-var-user-times; }\n.@{fa-css-prefix}-hotel:before,\n.@{fa-css-prefix}-bed:before { content: @fa-var-bed; }\n.@{fa-css-prefix}-viacoin:before { content: @fa-var-viacoin; }\n.@{fa-css-prefix}-train:before { content: @fa-var-train; }\n.@{fa-css-prefix}-subway:before { content: @fa-var-subway; }\n.@{fa-css-prefix}-medium:before { content: @fa-var-medium; }\n"
  },
  {
    "path": "client/less/lib/font-awesome-4.3.0/less/larger.less",
    "content": "// Icon Sizes\n// -------------------------\n\n/* makes the font 33% larger relative to the icon container */\n.@{fa-css-prefix}-lg {\n  font-size: (4em / 3);\n  line-height: (3em / 4);\n  vertical-align: -15%;\n}\n.@{fa-css-prefix}-2x { font-size: 2em; }\n.@{fa-css-prefix}-3x { font-size: 3em; }\n.@{fa-css-prefix}-4x { font-size: 4em; }\n.@{fa-css-prefix}-5x { font-size: 5em; }\n"
  },
  {
    "path": "client/less/lib/font-awesome-4.3.0/less/list.less",
    "content": "// List Icons\n// -------------------------\n\n.@{fa-css-prefix}-ul {\n  padding-left: 0;\n  margin-left: @fa-li-width;\n  list-style-type: none;\n  > li { position: relative; }\n}\n.@{fa-css-prefix}-li {\n  position: absolute;\n  left: -@fa-li-width;\n  width: @fa-li-width;\n  top: (2em / 14);\n  text-align: center;\n  &.@{fa-css-prefix}-lg {\n    left: (-@fa-li-width + (4em / 14));\n  }\n}\n"
  },
  {
    "path": "client/less/lib/font-awesome-4.3.0/less/mixins.less",
    "content": "// Mixins\n// --------------------------\n\n.fa-icon() {\n  display: inline-block;\n  font: normal normal normal @fa-font-size-base/1 FontAwesome; // shortening font declaration\n  font-size: inherit; // can't have font-size inherit on line above, so need to override\n  text-rendering: auto; // optimizelegibility throws things off #1094\n  -webkit-font-smoothing: antialiased;\n  -moz-osx-font-smoothing: grayscale;\n  transform: translate(0, 0); // ensures no half-pixel rendering in firefox\n\n}\n\n.fa-icon-rotate(@degrees, @rotation) {\n  filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=@rotation);\n  -webkit-transform: rotate(@degrees);\n      -ms-transform: rotate(@degrees);\n          transform: rotate(@degrees);\n}\n\n.fa-icon-flip(@horiz, @vert, @rotation) {\n  filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=@rotation, mirror=1);\n  -webkit-transform: scale(@horiz, @vert);\n      -ms-transform: scale(@horiz, @vert);\n          transform: scale(@horiz, @vert);\n}\n"
  },
  {
    "path": "client/less/lib/font-awesome-4.3.0/less/path.less",
    "content": "/* FONT PATH\n * -------------------------- */\n\n@font-face {\n  font-family: 'FontAwesome';\n  src: url('@{fa-font-path}/fontawesome-webfont.eot?v=@{fa-version}');\n  src: url('@{fa-font-path}/fontawesome-webfont.eot?#iefix&v=@{fa-version}') format('embedded-opentype'),\n    url('@{fa-font-path}/fontawesome-webfont.woff2?v=@{fa-version}') format('woff2'),\n    url('@{fa-font-path}/fontawesome-webfont.woff?v=@{fa-version}') format('woff'),\n    url('@{fa-font-path}/fontawesome-webfont.ttf?v=@{fa-version}') format('truetype'),\n    url('@{fa-font-path}/fontawesome-webfont.svg?v=@{fa-version}#fontawesomeregular') format('svg');\n//  src: url('@{fa-font-path}/FontAwesome.otf') format('opentype'); // used when developing fonts\n  font-weight: normal;\n  font-style: normal;\n}\n"
  },
  {
    "path": "client/less/lib/font-awesome-4.3.0/less/rotated-flipped.less",
    "content": "// Rotated & Flipped Icons\n// -------------------------\n\n.@{fa-css-prefix}-rotate-90  { .fa-icon-rotate(90deg, 1);  }\n.@{fa-css-prefix}-rotate-180 { .fa-icon-rotate(180deg, 2); }\n.@{fa-css-prefix}-rotate-270 { .fa-icon-rotate(270deg, 3); }\n\n.@{fa-css-prefix}-flip-horizontal { .fa-icon-flip(-1, 1, 0); }\n.@{fa-css-prefix}-flip-vertical   { .fa-icon-flip(1, -1, 2); }\n\n// Hook for IE8-9\n// -------------------------\n\n:root .@{fa-css-prefix}-rotate-90,\n:root .@{fa-css-prefix}-rotate-180,\n:root .@{fa-css-prefix}-rotate-270,\n:root .@{fa-css-prefix}-flip-horizontal,\n:root .@{fa-css-prefix}-flip-vertical {\n  filter: none;\n}\n"
  },
  {
    "path": "client/less/lib/font-awesome-4.3.0/less/stacked.less",
    "content": "// Stacked Icons\n// -------------------------\n\n.@{fa-css-prefix}-stack {\n  position: relative;\n  display: inline-block;\n  width: 2em;\n  height: 2em;\n  line-height: 2em;\n  vertical-align: middle;\n}\n.@{fa-css-prefix}-stack-1x, .@{fa-css-prefix}-stack-2x {\n  position: absolute;\n  left: 0;\n  width: 100%;\n  text-align: center;\n}\n.@{fa-css-prefix}-stack-1x { line-height: inherit; }\n.@{fa-css-prefix}-stack-2x { font-size: 2em; }\n.@{fa-css-prefix}-inverse { color: @fa-inverse; }\n"
  },
  {
    "path": "client/less/lib/font-awesome-4.3.0/less/variables.less",
    "content": "// Variables\n// --------------------------\n\n@fa-font-path:        \"../fonts\";\n@fa-font-size-base:   14px;\n//@fa-font-path:        \"//netdna.bootstrapcdn.com/font-awesome/4.3.0/fonts\"; // for referencing Bootstrap CDN font files directly\n@fa-css-prefix:       fa;\n@fa-version:          \"4.3.0\";\n@fa-border-color:     #eee;\n@fa-inverse:          #fff;\n@fa-li-width:         (30em / 14);\n\n@fa-var-adjust: \"\\f042\";\n@fa-var-adn: \"\\f170\";\n@fa-var-align-center: \"\\f037\";\n@fa-var-align-justify: \"\\f039\";\n@fa-var-align-left: \"\\f036\";\n@fa-var-align-right: \"\\f038\";\n@fa-var-ambulance: \"\\f0f9\";\n@fa-var-anchor: \"\\f13d\";\n@fa-var-android: \"\\f17b\";\n@fa-var-angellist: \"\\f209\";\n@fa-var-angle-double-down: \"\\f103\";\n@fa-var-angle-double-left: \"\\f100\";\n@fa-var-angle-double-right: \"\\f101\";\n@fa-var-angle-double-up: \"\\f102\";\n@fa-var-angle-down: \"\\f107\";\n@fa-var-angle-left: \"\\f104\";\n@fa-var-angle-right: \"\\f105\";\n@fa-var-angle-up: \"\\f106\";\n@fa-var-apple: \"\\f179\";\n@fa-var-archive: \"\\f187\";\n@fa-var-area-chart: \"\\f1fe\";\n@fa-var-arrow-circle-down: \"\\f0ab\";\n@fa-var-arrow-circle-left: \"\\f0a8\";\n@fa-var-arrow-circle-o-down: \"\\f01a\";\n@fa-var-arrow-circle-o-left: \"\\f190\";\n@fa-var-arrow-circle-o-right: \"\\f18e\";\n@fa-var-arrow-circle-o-up: \"\\f01b\";\n@fa-var-arrow-circle-right: \"\\f0a9\";\n@fa-var-arrow-circle-up: \"\\f0aa\";\n@fa-var-arrow-down: \"\\f063\";\n@fa-var-arrow-left: \"\\f060\";\n@fa-var-arrow-right: \"\\f061\";\n@fa-var-arrow-up: \"\\f062\";\n@fa-var-arrows: \"\\f047\";\n@fa-var-arrows-alt: \"\\f0b2\";\n@fa-var-arrows-h: \"\\f07e\";\n@fa-var-arrows-v: \"\\f07d\";\n@fa-var-asterisk: \"\\f069\";\n@fa-var-at: \"\\f1fa\";\n@fa-var-automobile: \"\\f1b9\";\n@fa-var-backward: \"\\f04a\";\n@fa-var-ban: \"\\f05e\";\n@fa-var-bank: \"\\f19c\";\n@fa-var-bar-chart: \"\\f080\";\n@fa-var-bar-chart-o: \"\\f080\";\n@fa-var-barcode: \"\\f02a\";\n@fa-var-bars: \"\\f0c9\";\n@fa-var-bed: \"\\f236\";\n@fa-var-beer: \"\\f0fc\";\n@fa-var-behance: \"\\f1b4\";\n@fa-var-behance-square: \"\\f1b5\";\n@fa-var-bell: \"\\f0f3\";\n@fa-var-bell-o: \"\\f0a2\";\n@fa-var-bell-slash: \"\\f1f6\";\n@fa-var-bell-slash-o: \"\\f1f7\";\n@fa-var-bicycle: \"\\f206\";\n@fa-var-binoculars: \"\\f1e5\";\n@fa-var-birthday-cake: \"\\f1fd\";\n@fa-var-bitbucket: \"\\f171\";\n@fa-var-bitbucket-square: \"\\f172\";\n@fa-var-bitcoin: \"\\f15a\";\n@fa-var-bold: \"\\f032\";\n@fa-var-bolt: \"\\f0e7\";\n@fa-var-bomb: \"\\f1e2\";\n@fa-var-book: \"\\f02d\";\n@fa-var-bookmark: \"\\f02e\";\n@fa-var-bookmark-o: \"\\f097\";\n@fa-var-briefcase: \"\\f0b1\";\n@fa-var-btc: \"\\f15a\";\n@fa-var-bug: \"\\f188\";\n@fa-var-building: \"\\f1ad\";\n@fa-var-building-o: \"\\f0f7\";\n@fa-var-bullhorn: \"\\f0a1\";\n@fa-var-bullseye: \"\\f140\";\n@fa-var-bus: \"\\f207\";\n@fa-var-buysellads: \"\\f20d\";\n@fa-var-cab: \"\\f1ba\";\n@fa-var-calculator: \"\\f1ec\";\n@fa-var-calendar: \"\\f073\";\n@fa-var-calendar-o: \"\\f133\";\n@fa-var-camera: \"\\f030\";\n@fa-var-camera-retro: \"\\f083\";\n@fa-var-car: \"\\f1b9\";\n@fa-var-caret-down: \"\\f0d7\";\n@fa-var-caret-left: \"\\f0d9\";\n@fa-var-caret-right: \"\\f0da\";\n@fa-var-caret-square-o-down: \"\\f150\";\n@fa-var-caret-square-o-left: \"\\f191\";\n@fa-var-caret-square-o-right: \"\\f152\";\n@fa-var-caret-square-o-up: \"\\f151\";\n@fa-var-caret-up: \"\\f0d8\";\n@fa-var-cart-arrow-down: \"\\f218\";\n@fa-var-cart-plus: \"\\f217\";\n@fa-var-cc: \"\\f20a\";\n@fa-var-cc-amex: \"\\f1f3\";\n@fa-var-cc-discover: \"\\f1f2\";\n@fa-var-cc-mastercard: \"\\f1f1\";\n@fa-var-cc-paypal: \"\\f1f4\";\n@fa-var-cc-stripe: \"\\f1f5\";\n@fa-var-cc-visa: \"\\f1f0\";\n@fa-var-certificate: \"\\f0a3\";\n@fa-var-chain: \"\\f0c1\";\n@fa-var-chain-broken: \"\\f127\";\n@fa-var-check: \"\\f00c\";\n@fa-var-check-circle: \"\\f058\";\n@fa-var-check-circle-o: \"\\f05d\";\n@fa-var-check-square: \"\\f14a\";\n@fa-var-check-square-o: \"\\f046\";\n@fa-var-chevron-circle-down: \"\\f13a\";\n@fa-var-chevron-circle-left: \"\\f137\";\n@fa-var-chevron-circle-right: \"\\f138\";\n@fa-var-chevron-circle-up: \"\\f139\";\n@fa-var-chevron-down: \"\\f078\";\n@fa-var-chevron-left: \"\\f053\";\n@fa-var-chevron-right: \"\\f054\";\n@fa-var-chevron-up: \"\\f077\";\n@fa-var-child: \"\\f1ae\";\n@fa-var-circle: \"\\f111\";\n@fa-var-circle-o: \"\\f10c\";\n@fa-var-circle-o-notch: \"\\f1ce\";\n@fa-var-circle-thin: \"\\f1db\";\n@fa-var-clipboard: \"\\f0ea\";\n@fa-var-clock-o: \"\\f017\";\n@fa-var-close: \"\\f00d\";\n@fa-var-cloud: \"\\f0c2\";\n@fa-var-cloud-download: \"\\f0ed\";\n@fa-var-cloud-upload: \"\\f0ee\";\n@fa-var-cny: \"\\f157\";\n@fa-var-code: \"\\f121\";\n@fa-var-code-fork: \"\\f126\";\n@fa-var-codepen: \"\\f1cb\";\n@fa-var-coffee: \"\\f0f4\";\n@fa-var-cog: \"\\f013\";\n@fa-var-cogs: \"\\f085\";\n@fa-var-columns: \"\\f0db\";\n@fa-var-comment: \"\\f075\";\n@fa-var-comment-o: \"\\f0e5\";\n@fa-var-comments: \"\\f086\";\n@fa-var-comments-o: \"\\f0e6\";\n@fa-var-compass: \"\\f14e\";\n@fa-var-compress: \"\\f066\";\n@fa-var-connectdevelop: \"\\f20e\";\n@fa-var-copy: \"\\f0c5\";\n@fa-var-copyright: \"\\f1f9\";\n@fa-var-credit-card: \"\\f09d\";\n@fa-var-crop: \"\\f125\";\n@fa-var-crosshairs: \"\\f05b\";\n@fa-var-css3: \"\\f13c\";\n@fa-var-cube: \"\\f1b2\";\n@fa-var-cubes: \"\\f1b3\";\n@fa-var-cut: \"\\f0c4\";\n@fa-var-cutlery: \"\\f0f5\";\n@fa-var-dashboard: \"\\f0e4\";\n@fa-var-dashcube: \"\\f210\";\n@fa-var-database: \"\\f1c0\";\n@fa-var-dedent: \"\\f03b\";\n@fa-var-delicious: \"\\f1a5\";\n@fa-var-desktop: \"\\f108\";\n@fa-var-deviantart: \"\\f1bd\";\n@fa-var-diamond: \"\\f219\";\n@fa-var-digg: \"\\f1a6\";\n@fa-var-dollar: \"\\f155\";\n@fa-var-dot-circle-o: \"\\f192\";\n@fa-var-download: \"\\f019\";\n@fa-var-dribbble: \"\\f17d\";\n@fa-var-dropbox: \"\\f16b\";\n@fa-var-drupal: \"\\f1a9\";\n@fa-var-edit: \"\\f044\";\n@fa-var-eject: \"\\f052\";\n@fa-var-ellipsis-h: \"\\f141\";\n@fa-var-ellipsis-v: \"\\f142\";\n@fa-var-empire: \"\\f1d1\";\n@fa-var-envelope: \"\\f0e0\";\n@fa-var-envelope-o: \"\\f003\";\n@fa-var-envelope-square: \"\\f199\";\n@fa-var-eraser: \"\\f12d\";\n@fa-var-eur: \"\\f153\";\n@fa-var-euro: \"\\f153\";\n@fa-var-exchange: \"\\f0ec\";\n@fa-var-exclamation: \"\\f12a\";\n@fa-var-exclamation-circle: \"\\f06a\";\n@fa-var-exclamation-triangle: \"\\f071\";\n@fa-var-expand: \"\\f065\";\n@fa-var-external-link: \"\\f08e\";\n@fa-var-external-link-square: \"\\f14c\";\n@fa-var-eye: \"\\f06e\";\n@fa-var-eye-slash: \"\\f070\";\n@fa-var-eyedropper: \"\\f1fb\";\n@fa-var-facebook: \"\\f09a\";\n@fa-var-facebook-f: \"\\f09a\";\n@fa-var-facebook-official: \"\\f230\";\n@fa-var-facebook-square: \"\\f082\";\n@fa-var-fast-backward: \"\\f049\";\n@fa-var-fast-forward: \"\\f050\";\n@fa-var-fax: \"\\f1ac\";\n@fa-var-female: \"\\f182\";\n@fa-var-fighter-jet: \"\\f0fb\";\n@fa-var-file: \"\\f15b\";\n@fa-var-file-archive-o: \"\\f1c6\";\n@fa-var-file-audio-o: \"\\f1c7\";\n@fa-var-file-code-o: \"\\f1c9\";\n@fa-var-file-excel-o: \"\\f1c3\";\n@fa-var-file-image-o: \"\\f1c5\";\n@fa-var-file-movie-o: \"\\f1c8\";\n@fa-var-file-o: \"\\f016\";\n@fa-var-file-pdf-o: \"\\f1c1\";\n@fa-var-file-photo-o: \"\\f1c5\";\n@fa-var-file-picture-o: \"\\f1c5\";\n@fa-var-file-powerpoint-o: \"\\f1c4\";\n@fa-var-file-sound-o: \"\\f1c7\";\n@fa-var-file-text: \"\\f15c\";\n@fa-var-file-text-o: \"\\f0f6\";\n@fa-var-file-video-o: \"\\f1c8\";\n@fa-var-file-word-o: \"\\f1c2\";\n@fa-var-file-zip-o: \"\\f1c6\";\n@fa-var-files-o: \"\\f0c5\";\n@fa-var-film: \"\\f008\";\n@fa-var-filter: \"\\f0b0\";\n@fa-var-fire: \"\\f06d\";\n@fa-var-fire-extinguisher: \"\\f134\";\n@fa-var-flag: \"\\f024\";\n@fa-var-flag-checkered: \"\\f11e\";\n@fa-var-flag-o: \"\\f11d\";\n@fa-var-flash: \"\\f0e7\";\n@fa-var-flask: \"\\f0c3\";\n@fa-var-flickr: \"\\f16e\";\n@fa-var-floppy-o: \"\\f0c7\";\n@fa-var-folder: \"\\f07b\";\n@fa-var-folder-o: \"\\f114\";\n@fa-var-folder-open: \"\\f07c\";\n@fa-var-folder-open-o: \"\\f115\";\n@fa-var-font: \"\\f031\";\n@fa-var-forumbee: \"\\f211\";\n@fa-var-forward: \"\\f04e\";\n@fa-var-foursquare: \"\\f180\";\n@fa-var-frown-o: \"\\f119\";\n@fa-var-futbol-o: \"\\f1e3\";\n@fa-var-gamepad: \"\\f11b\";\n@fa-var-gavel: \"\\f0e3\";\n@fa-var-gbp: \"\\f154\";\n@fa-var-ge: \"\\f1d1\";\n@fa-var-gear: \"\\f013\";\n@fa-var-gears: \"\\f085\";\n@fa-var-genderless: \"\\f1db\";\n@fa-var-gift: \"\\f06b\";\n@fa-var-git: \"\\f1d3\";\n@fa-var-git-square: \"\\f1d2\";\n@fa-var-github: \"\\f09b\";\n@fa-var-github-alt: \"\\f113\";\n@fa-var-github-square: \"\\f092\";\n@fa-var-gittip: \"\\f184\";\n@fa-var-glass: \"\\f000\";\n@fa-var-globe: \"\\f0ac\";\n@fa-var-google: \"\\f1a0\";\n@fa-var-google-plus: \"\\f0d5\";\n@fa-var-google-plus-square: \"\\f0d4\";\n@fa-var-google-wallet: \"\\f1ee\";\n@fa-var-graduation-cap: \"\\f19d\";\n@fa-var-gratipay: \"\\f184\";\n@fa-var-group: \"\\f0c0\";\n@fa-var-h-square: \"\\f0fd\";\n@fa-var-hacker-news: \"\\f1d4\";\n@fa-var-hand-o-down: \"\\f0a7\";\n@fa-var-hand-o-left: \"\\f0a5\";\n@fa-var-hand-o-right: \"\\f0a4\";\n@fa-var-hand-o-up: \"\\f0a6\";\n@fa-var-hdd-o: \"\\f0a0\";\n@fa-var-header: \"\\f1dc\";\n@fa-var-headphones: \"\\f025\";\n@fa-var-heart: \"\\f004\";\n@fa-var-heart-o: \"\\f08a\";\n@fa-var-heartbeat: \"\\f21e\";\n@fa-var-history: \"\\f1da\";\n@fa-var-home: \"\\f015\";\n@fa-var-hospital-o: \"\\f0f8\";\n@fa-var-hotel: \"\\f236\";\n@fa-var-html5: \"\\f13b\";\n@fa-var-ils: \"\\f20b\";\n@fa-var-image: \"\\f03e\";\n@fa-var-inbox: \"\\f01c\";\n@fa-var-indent: \"\\f03c\";\n@fa-var-info: \"\\f129\";\n@fa-var-info-circle: \"\\f05a\";\n@fa-var-inr: \"\\f156\";\n@fa-var-instagram: \"\\f16d\";\n@fa-var-institution: \"\\f19c\";\n@fa-var-ioxhost: \"\\f208\";\n@fa-var-italic: \"\\f033\";\n@fa-var-joomla: \"\\f1aa\";\n@fa-var-jpy: \"\\f157\";\n@fa-var-jsfiddle: \"\\f1cc\";\n@fa-var-key: \"\\f084\";\n@fa-var-keyboard-o: \"\\f11c\";\n@fa-var-krw: \"\\f159\";\n@fa-var-language: \"\\f1ab\";\n@fa-var-laptop: \"\\f109\";\n@fa-var-lastfm: \"\\f202\";\n@fa-var-lastfm-square: \"\\f203\";\n@fa-var-leaf: \"\\f06c\";\n@fa-var-leanpub: \"\\f212\";\n@fa-var-legal: \"\\f0e3\";\n@fa-var-lemon-o: \"\\f094\";\n@fa-var-level-down: \"\\f149\";\n@fa-var-level-up: \"\\f148\";\n@fa-var-life-bouy: \"\\f1cd\";\n@fa-var-life-buoy: \"\\f1cd\";\n@fa-var-life-ring: \"\\f1cd\";\n@fa-var-life-saver: \"\\f1cd\";\n@fa-var-lightbulb-o: \"\\f0eb\";\n@fa-var-line-chart: \"\\f201\";\n@fa-var-link: \"\\f0c1\";\n@fa-var-linkedin: \"\\f0e1\";\n@fa-var-linkedin-square: \"\\f08c\";\n@fa-var-linux: \"\\f17c\";\n@fa-var-list: \"\\f03a\";\n@fa-var-list-alt: \"\\f022\";\n@fa-var-list-ol: \"\\f0cb\";\n@fa-var-list-ul: \"\\f0ca\";\n@fa-var-location-arrow: \"\\f124\";\n@fa-var-lock: \"\\f023\";\n@fa-var-long-arrow-down: \"\\f175\";\n@fa-var-long-arrow-left: \"\\f177\";\n@fa-var-long-arrow-right: \"\\f178\";\n@fa-var-long-arrow-up: \"\\f176\";\n@fa-var-magic: \"\\f0d0\";\n@fa-var-magnet: \"\\f076\";\n@fa-var-mail-forward: \"\\f064\";\n@fa-var-mail-reply: \"\\f112\";\n@fa-var-mail-reply-all: \"\\f122\";\n@fa-var-male: \"\\f183\";\n@fa-var-map-marker: \"\\f041\";\n@fa-var-mars: \"\\f222\";\n@fa-var-mars-double: \"\\f227\";\n@fa-var-mars-stroke: \"\\f229\";\n@fa-var-mars-stroke-h: \"\\f22b\";\n@fa-var-mars-stroke-v: \"\\f22a\";\n@fa-var-maxcdn: \"\\f136\";\n@fa-var-meanpath: \"\\f20c\";\n@fa-var-medium: \"\\f23a\";\n@fa-var-medkit: \"\\f0fa\";\n@fa-var-meh-o: \"\\f11a\";\n@fa-var-mercury: \"\\f223\";\n@fa-var-microphone: \"\\f130\";\n@fa-var-microphone-slash: \"\\f131\";\n@fa-var-minus: \"\\f068\";\n@fa-var-minus-circle: \"\\f056\";\n@fa-var-minus-square: \"\\f146\";\n@fa-var-minus-square-o: \"\\f147\";\n@fa-var-mobile: \"\\f10b\";\n@fa-var-mobile-phone: \"\\f10b\";\n@fa-var-money: \"\\f0d6\";\n@fa-var-moon-o: \"\\f186\";\n@fa-var-mortar-board: \"\\f19d\";\n@fa-var-motorcycle: \"\\f21c\";\n@fa-var-music: \"\\f001\";\n@fa-var-navicon: \"\\f0c9\";\n@fa-var-neuter: \"\\f22c\";\n@fa-var-newspaper-o: \"\\f1ea\";\n@fa-var-openid: \"\\f19b\";\n@fa-var-outdent: \"\\f03b\";\n@fa-var-pagelines: \"\\f18c\";\n@fa-var-paint-brush: \"\\f1fc\";\n@fa-var-paper-plane: \"\\f1d8\";\n@fa-var-paper-plane-o: \"\\f1d9\";\n@fa-var-paperclip: \"\\f0c6\";\n@fa-var-paragraph: \"\\f1dd\";\n@fa-var-paste: \"\\f0ea\";\n@fa-var-pause: \"\\f04c\";\n@fa-var-paw: \"\\f1b0\";\n@fa-var-paypal: \"\\f1ed\";\n@fa-var-pencil: \"\\f040\";\n@fa-var-pencil-square: \"\\f14b\";\n@fa-var-pencil-square-o: \"\\f044\";\n@fa-var-phone: \"\\f095\";\n@fa-var-phone-square: \"\\f098\";\n@fa-var-photo: \"\\f03e\";\n@fa-var-picture-o: \"\\f03e\";\n@fa-var-pie-chart: \"\\f200\";\n@fa-var-pied-piper: \"\\f1a7\";\n@fa-var-pied-piper-alt: \"\\f1a8\";\n@fa-var-pinterest: \"\\f0d2\";\n@fa-var-pinterest-p: \"\\f231\";\n@fa-var-pinterest-square: \"\\f0d3\";\n@fa-var-plane: \"\\f072\";\n@fa-var-play: \"\\f04b\";\n@fa-var-play-circle: \"\\f144\";\n@fa-var-play-circle-o: \"\\f01d\";\n@fa-var-plug: \"\\f1e6\";\n@fa-var-plus: \"\\f067\";\n@fa-var-plus-circle: \"\\f055\";\n@fa-var-plus-square: \"\\f0fe\";\n@fa-var-plus-square-o: \"\\f196\";\n@fa-var-power-off: \"\\f011\";\n@fa-var-print: \"\\f02f\";\n@fa-var-puzzle-piece: \"\\f12e\";\n@fa-var-qq: \"\\f1d6\";\n@fa-var-qrcode: \"\\f029\";\n@fa-var-question: \"\\f128\";\n@fa-var-question-circle: \"\\f059\";\n@fa-var-quote-left: \"\\f10d\";\n@fa-var-quote-right: \"\\f10e\";\n@fa-var-ra: \"\\f1d0\";\n@fa-var-random: \"\\f074\";\n@fa-var-rebel: \"\\f1d0\";\n@fa-var-recycle: \"\\f1b8\";\n@fa-var-reddit: \"\\f1a1\";\n@fa-var-reddit-square: \"\\f1a2\";\n@fa-var-refresh: \"\\f021\";\n@fa-var-remove: \"\\f00d\";\n@fa-var-renren: \"\\f18b\";\n@fa-var-reorder: \"\\f0c9\";\n@fa-var-repeat: \"\\f01e\";\n@fa-var-reply: \"\\f112\";\n@fa-var-reply-all: \"\\f122\";\n@fa-var-retweet: \"\\f079\";\n@fa-var-rmb: \"\\f157\";\n@fa-var-road: \"\\f018\";\n@fa-var-rocket: \"\\f135\";\n@fa-var-rotate-left: \"\\f0e2\";\n@fa-var-rotate-right: \"\\f01e\";\n@fa-var-rouble: \"\\f158\";\n@fa-var-rss: \"\\f09e\";\n@fa-var-rss-square: \"\\f143\";\n@fa-var-rub: \"\\f158\";\n@fa-var-ruble: \"\\f158\";\n@fa-var-rupee: \"\\f156\";\n@fa-var-save: \"\\f0c7\";\n@fa-var-scissors: \"\\f0c4\";\n@fa-var-search: \"\\f002\";\n@fa-var-search-minus: \"\\f010\";\n@fa-var-search-plus: \"\\f00e\";\n@fa-var-sellsy: \"\\f213\";\n@fa-var-send: \"\\f1d8\";\n@fa-var-send-o: \"\\f1d9\";\n@fa-var-server: \"\\f233\";\n@fa-var-share: \"\\f064\";\n@fa-var-share-alt: \"\\f1e0\";\n@fa-var-share-alt-square: \"\\f1e1\";\n@fa-var-share-square: \"\\f14d\";\n@fa-var-share-square-o: \"\\f045\";\n@fa-var-shekel: \"\\f20b\";\n@fa-var-sheqel: \"\\f20b\";\n@fa-var-shield: \"\\f132\";\n@fa-var-ship: \"\\f21a\";\n@fa-var-shirtsinbulk: \"\\f214\";\n@fa-var-shopping-cart: \"\\f07a\";\n@fa-var-sign-in: \"\\f090\";\n@fa-var-sign-out: \"\\f08b\";\n@fa-var-signal: \"\\f012\";\n@fa-var-simplybuilt: \"\\f215\";\n@fa-var-sitemap: \"\\f0e8\";\n@fa-var-skyatlas: \"\\f216\";\n@fa-var-skype: \"\\f17e\";\n@fa-var-slack: \"\\f198\";\n@fa-var-sliders: \"\\f1de\";\n@fa-var-slideshare: \"\\f1e7\";\n@fa-var-smile-o: \"\\f118\";\n@fa-var-soccer-ball-o: \"\\f1e3\";\n@fa-var-sort: \"\\f0dc\";\n@fa-var-sort-alpha-asc: \"\\f15d\";\n@fa-var-sort-alpha-desc: \"\\f15e\";\n@fa-var-sort-amount-asc: \"\\f160\";\n@fa-var-sort-amount-desc: \"\\f161\";\n@fa-var-sort-asc: \"\\f0de\";\n@fa-var-sort-desc: \"\\f0dd\";\n@fa-var-sort-down: \"\\f0dd\";\n@fa-var-sort-numeric-asc: \"\\f162\";\n@fa-var-sort-numeric-desc: \"\\f163\";\n@fa-var-sort-up: \"\\f0de\";\n@fa-var-soundcloud: \"\\f1be\";\n@fa-var-space-shuttle: \"\\f197\";\n@fa-var-spinner: \"\\f110\";\n@fa-var-spoon: \"\\f1b1\";\n@fa-var-spotify: \"\\f1bc\";\n@fa-var-square: \"\\f0c8\";\n@fa-var-square-o: \"\\f096\";\n@fa-var-stack-exchange: \"\\f18d\";\n@fa-var-stack-overflow: \"\\f16c\";\n@fa-var-star: \"\\f005\";\n@fa-var-star-half: \"\\f089\";\n@fa-var-star-half-empty: \"\\f123\";\n@fa-var-star-half-full: \"\\f123\";\n@fa-var-star-half-o: \"\\f123\";\n@fa-var-star-o: \"\\f006\";\n@fa-var-steam: \"\\f1b6\";\n@fa-var-steam-square: \"\\f1b7\";\n@fa-var-step-backward: \"\\f048\";\n@fa-var-step-forward: \"\\f051\";\n@fa-var-stethoscope: \"\\f0f1\";\n@fa-var-stop: \"\\f04d\";\n@fa-var-street-view: \"\\f21d\";\n@fa-var-strikethrough: \"\\f0cc\";\n@fa-var-stumbleupon: \"\\f1a4\";\n@fa-var-stumbleupon-circle: \"\\f1a3\";\n@fa-var-subscript: \"\\f12c\";\n@fa-var-subway: \"\\f239\";\n@fa-var-suitcase: \"\\f0f2\";\n@fa-var-sun-o: \"\\f185\";\n@fa-var-superscript: \"\\f12b\";\n@fa-var-support: \"\\f1cd\";\n@fa-var-table: \"\\f0ce\";\n@fa-var-tablet: \"\\f10a\";\n@fa-var-tachometer: \"\\f0e4\";\n@fa-var-tag: \"\\f02b\";\n@fa-var-tags: \"\\f02c\";\n@fa-var-tasks: \"\\f0ae\";\n@fa-var-taxi: \"\\f1ba\";\n@fa-var-tencent-weibo: \"\\f1d5\";\n@fa-var-terminal: \"\\f120\";\n@fa-var-text-height: \"\\f034\";\n@fa-var-text-width: \"\\f035\";\n@fa-var-th: \"\\f00a\";\n@fa-var-th-large: \"\\f009\";\n@fa-var-th-list: \"\\f00b\";\n@fa-var-thumb-tack: \"\\f08d\";\n@fa-var-thumbs-down: \"\\f165\";\n@fa-var-thumbs-o-down: \"\\f088\";\n@fa-var-thumbs-o-up: \"\\f087\";\n@fa-var-thumbs-up: \"\\f164\";\n@fa-var-ticket: \"\\f145\";\n@fa-var-times: \"\\f00d\";\n@fa-var-times-circle: \"\\f057\";\n@fa-var-times-circle-o: \"\\f05c\";\n@fa-var-tint: \"\\f043\";\n@fa-var-toggle-down: \"\\f150\";\n@fa-var-toggle-left: \"\\f191\";\n@fa-var-toggle-off: \"\\f204\";\n@fa-var-toggle-on: \"\\f205\";\n@fa-var-toggle-right: \"\\f152\";\n@fa-var-toggle-up: \"\\f151\";\n@fa-var-train: \"\\f238\";\n@fa-var-transgender: \"\\f224\";\n@fa-var-transgender-alt: \"\\f225\";\n@fa-var-trash: \"\\f1f8\";\n@fa-var-trash-o: \"\\f014\";\n@fa-var-tree: \"\\f1bb\";\n@fa-var-trello: \"\\f181\";\n@fa-var-trophy: \"\\f091\";\n@fa-var-truck: \"\\f0d1\";\n@fa-var-try: \"\\f195\";\n@fa-var-tty: \"\\f1e4\";\n@fa-var-tumblr: \"\\f173\";\n@fa-var-tumblr-square: \"\\f174\";\n@fa-var-turkish-lira: \"\\f195\";\n@fa-var-twitch: \"\\f1e8\";\n@fa-var-twitter: \"\\f099\";\n@fa-var-twitter-square: \"\\f081\";\n@fa-var-umbrella: \"\\f0e9\";\n@fa-var-underline: \"\\f0cd\";\n@fa-var-undo: \"\\f0e2\";\n@fa-var-university: \"\\f19c\";\n@fa-var-unlink: \"\\f127\";\n@fa-var-unlock: \"\\f09c\";\n@fa-var-unlock-alt: \"\\f13e\";\n@fa-var-unsorted: \"\\f0dc\";\n@fa-var-upload: \"\\f093\";\n@fa-var-usd: \"\\f155\";\n@fa-var-user: \"\\f007\";\n@fa-var-user-md: \"\\f0f0\";\n@fa-var-user-plus: \"\\f234\";\n@fa-var-user-secret: \"\\f21b\";\n@fa-var-user-times: \"\\f235\";\n@fa-var-users: \"\\f0c0\";\n@fa-var-venus: \"\\f221\";\n@fa-var-venus-double: \"\\f226\";\n@fa-var-venus-mars: \"\\f228\";\n@fa-var-viacoin: \"\\f237\";\n@fa-var-video-camera: \"\\f03d\";\n@fa-var-vimeo-square: \"\\f194\";\n@fa-var-vine: \"\\f1ca\";\n@fa-var-vk: \"\\f189\";\n@fa-var-volume-down: \"\\f027\";\n@fa-var-volume-off: \"\\f026\";\n@fa-var-volume-up: \"\\f028\";\n@fa-var-warning: \"\\f071\";\n@fa-var-wechat: \"\\f1d7\";\n@fa-var-weibo: \"\\f18a\";\n@fa-var-weixin: \"\\f1d7\";\n@fa-var-whatsapp: \"\\f232\";\n@fa-var-wheelchair: \"\\f193\";\n@fa-var-wifi: \"\\f1eb\";\n@fa-var-windows: \"\\f17a\";\n@fa-var-won: \"\\f159\";\n@fa-var-wordpress: \"\\f19a\";\n@fa-var-wrench: \"\\f0ad\";\n@fa-var-xing: \"\\f168\";\n@fa-var-xing-square: \"\\f169\";\n@fa-var-yahoo: \"\\f19e\";\n@fa-var-yelp: \"\\f1e9\";\n@fa-var-yen: \"\\f157\";\n@fa-var-youtube: \"\\f167\";\n@fa-var-youtube-play: \"\\f16a\";\n@fa-var-youtube-square: \"\\f166\";\n\n"
  },
  {
    "path": "client/less/lib/font-awesome-4.3.0/scss/_animated.scss",
    "content": "// Spinning Icons\n// --------------------------\n\n.#{$fa-css-prefix}-spin {\n  -webkit-animation: fa-spin 2s infinite linear;\n          animation: fa-spin 2s infinite linear;\n}\n\n.#{$fa-css-prefix}-pulse {\n  -webkit-animation: fa-spin 1s infinite steps(8);\n          animation: fa-spin 1s infinite steps(8);\n}\n\n@-webkit-keyframes fa-spin {\n  0% {\n    -webkit-transform: rotate(0deg);\n            transform: rotate(0deg);\n  }\n  100% {\n    -webkit-transform: rotate(359deg);\n            transform: rotate(359deg);\n  }\n}\n\n@keyframes fa-spin {\n  0% {\n    -webkit-transform: rotate(0deg);\n            transform: rotate(0deg);\n  }\n  100% {\n    -webkit-transform: rotate(359deg);\n            transform: rotate(359deg);\n  }\n}\n"
  },
  {
    "path": "client/less/lib/font-awesome-4.3.0/scss/_bordered-pulled.scss",
    "content": "// Bordered & Pulled\n// -------------------------\n\n.#{$fa-css-prefix}-border {\n  padding: .2em .25em .15em;\n  border: solid .08em $fa-border-color;\n  border-radius: .1em;\n}\n\n.pull-right { float: right; }\n.pull-left { float: left; }\n\n.#{$fa-css-prefix} {\n  &.pull-left { margin-right: .3em; }\n  &.pull-right { margin-left: .3em; }\n}\n"
  },
  {
    "path": "client/less/lib/font-awesome-4.3.0/scss/_core.scss",
    "content": "// Base Class Definition\n// -------------------------\n\n.#{$fa-css-prefix} {\n  display: inline-block;\n  font: normal normal normal #{$fa-font-size-base}/1 FontAwesome; // shortening font declaration\n  font-size: inherit; // can't have font-size inherit on line above, so need to override\n  text-rendering: auto; // optimizelegibility throws things off #1094\n  -webkit-font-smoothing: antialiased;\n  -moz-osx-font-smoothing: grayscale;\n  transform: translate(0, 0); // ensures no half-pixel rendering in firefox\n\n}\n"
  },
  {
    "path": "client/less/lib/font-awesome-4.3.0/scss/_fixed-width.scss",
    "content": "// Fixed Width Icons\n// -------------------------\n.#{$fa-css-prefix}-fw {\n  width: (18em / 14);\n  text-align: center;\n}\n"
  },
  {
    "path": "client/less/lib/font-awesome-4.3.0/scss/_icons.scss",
    "content": "/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen\n   readers do not read off random characters that represent icons */\n\n.#{$fa-css-prefix}-glass:before { content: $fa-var-glass; }\n.#{$fa-css-prefix}-music:before { content: $fa-var-music; }\n.#{$fa-css-prefix}-search:before { content: $fa-var-search; }\n.#{$fa-css-prefix}-envelope-o:before { content: $fa-var-envelope-o; }\n.#{$fa-css-prefix}-heart:before { content: $fa-var-heart; }\n.#{$fa-css-prefix}-star:before { content: $fa-var-star; }\n.#{$fa-css-prefix}-star-o:before { content: $fa-var-star-o; }\n.#{$fa-css-prefix}-user:before { content: $fa-var-user; }\n.#{$fa-css-prefix}-film:before { content: $fa-var-film; }\n.#{$fa-css-prefix}-th-large:before { content: $fa-var-th-large; }\n.#{$fa-css-prefix}-th:before { content: $fa-var-th; }\n.#{$fa-css-prefix}-th-list:before { content: $fa-var-th-list; }\n.#{$fa-css-prefix}-check:before { content: $fa-var-check; }\n.#{$fa-css-prefix}-remove:before,\n.#{$fa-css-prefix}-close:before,\n.#{$fa-css-prefix}-times:before { content: $fa-var-times; }\n.#{$fa-css-prefix}-search-plus:before { content: $fa-var-search-plus; }\n.#{$fa-css-prefix}-search-minus:before { content: $fa-var-search-minus; }\n.#{$fa-css-prefix}-power-off:before { content: $fa-var-power-off; }\n.#{$fa-css-prefix}-signal:before { content: $fa-var-signal; }\n.#{$fa-css-prefix}-gear:before,\n.#{$fa-css-prefix}-cog:before { content: $fa-var-cog; }\n.#{$fa-css-prefix}-trash-o:before { content: $fa-var-trash-o; }\n.#{$fa-css-prefix}-home:before { content: $fa-var-home; }\n.#{$fa-css-prefix}-file-o:before { content: $fa-var-file-o; }\n.#{$fa-css-prefix}-clock-o:before { content: $fa-var-clock-o; }\n.#{$fa-css-prefix}-road:before { content: $fa-var-road; }\n.#{$fa-css-prefix}-download:before { content: $fa-var-download; }\n.#{$fa-css-prefix}-arrow-circle-o-down:before { content: $fa-var-arrow-circle-o-down; }\n.#{$fa-css-prefix}-arrow-circle-o-up:before { content: $fa-var-arrow-circle-o-up; }\n.#{$fa-css-prefix}-inbox:before { content: $fa-var-inbox; }\n.#{$fa-css-prefix}-play-circle-o:before { content: $fa-var-play-circle-o; }\n.#{$fa-css-prefix}-rotate-right:before,\n.#{$fa-css-prefix}-repeat:before { content: $fa-var-repeat; }\n.#{$fa-css-prefix}-refresh:before { content: $fa-var-refresh; }\n.#{$fa-css-prefix}-list-alt:before { content: $fa-var-list-alt; }\n.#{$fa-css-prefix}-lock:before { content: $fa-var-lock; }\n.#{$fa-css-prefix}-flag:before { content: $fa-var-flag; }\n.#{$fa-css-prefix}-headphones:before { content: $fa-var-headphones; }\n.#{$fa-css-prefix}-volume-off:before { content: $fa-var-volume-off; }\n.#{$fa-css-prefix}-volume-down:before { content: $fa-var-volume-down; }\n.#{$fa-css-prefix}-volume-up:before { content: $fa-var-volume-up; }\n.#{$fa-css-prefix}-qrcode:before { content: $fa-var-qrcode; }\n.#{$fa-css-prefix}-barcode:before { content: $fa-var-barcode; }\n.#{$fa-css-prefix}-tag:before { content: $fa-var-tag; }\n.#{$fa-css-prefix}-tags:before { content: $fa-var-tags; }\n.#{$fa-css-prefix}-book:before { content: $fa-var-book; }\n.#{$fa-css-prefix}-bookmark:before { content: $fa-var-bookmark; }\n.#{$fa-css-prefix}-print:before { content: $fa-var-print; }\n.#{$fa-css-prefix}-camera:before { content: $fa-var-camera; }\n.#{$fa-css-prefix}-font:before { content: $fa-var-font; }\n.#{$fa-css-prefix}-bold:before { content: $fa-var-bold; }\n.#{$fa-css-prefix}-italic:before { content: $fa-var-italic; }\n.#{$fa-css-prefix}-text-height:before { content: $fa-var-text-height; }\n.#{$fa-css-prefix}-text-width:before { content: $fa-var-text-width; }\n.#{$fa-css-prefix}-align-left:before { content: $fa-var-align-left; }\n.#{$fa-css-prefix}-align-center:before { content: $fa-var-align-center; }\n.#{$fa-css-prefix}-align-right:before { content: $fa-var-align-right; }\n.#{$fa-css-prefix}-align-justify:before { content: $fa-var-align-justify; }\n.#{$fa-css-prefix}-list:before { content: $fa-var-list; }\n.#{$fa-css-prefix}-dedent:before,\n.#{$fa-css-prefix}-outdent:before { content: $fa-var-outdent; }\n.#{$fa-css-prefix}-indent:before { content: $fa-var-indent; }\n.#{$fa-css-prefix}-video-camera:before { content: $fa-var-video-camera; }\n.#{$fa-css-prefix}-photo:before,\n.#{$fa-css-prefix}-image:before,\n.#{$fa-css-prefix}-picture-o:before { content: $fa-var-picture-o; }\n.#{$fa-css-prefix}-pencil:before { content: $fa-var-pencil; }\n.#{$fa-css-prefix}-map-marker:before { content: $fa-var-map-marker; }\n.#{$fa-css-prefix}-adjust:before { content: $fa-var-adjust; }\n.#{$fa-css-prefix}-tint:before { content: $fa-var-tint; }\n.#{$fa-css-prefix}-edit:before,\n.#{$fa-css-prefix}-pencil-square-o:before { content: $fa-var-pencil-square-o; }\n.#{$fa-css-prefix}-share-square-o:before { content: $fa-var-share-square-o; }\n.#{$fa-css-prefix}-check-square-o:before { content: $fa-var-check-square-o; }\n.#{$fa-css-prefix}-arrows:before { content: $fa-var-arrows; }\n.#{$fa-css-prefix}-step-backward:before { content: $fa-var-step-backward; }\n.#{$fa-css-prefix}-fast-backward:before { content: $fa-var-fast-backward; }\n.#{$fa-css-prefix}-backward:before { content: $fa-var-backward; }\n.#{$fa-css-prefix}-play:before { content: $fa-var-play; }\n.#{$fa-css-prefix}-pause:before { content: $fa-var-pause; }\n.#{$fa-css-prefix}-stop:before { content: $fa-var-stop; }\n.#{$fa-css-prefix}-forward:before { content: $fa-var-forward; }\n.#{$fa-css-prefix}-fast-forward:before { content: $fa-var-fast-forward; }\n.#{$fa-css-prefix}-step-forward:before { content: $fa-var-step-forward; }\n.#{$fa-css-prefix}-eject:before { content: $fa-var-eject; }\n.#{$fa-css-prefix}-chevron-left:before { content: $fa-var-chevron-left; }\n.#{$fa-css-prefix}-chevron-right:before { content: $fa-var-chevron-right; }\n.#{$fa-css-prefix}-plus-circle:before { content: $fa-var-plus-circle; }\n.#{$fa-css-prefix}-minus-circle:before { content: $fa-var-minus-circle; }\n.#{$fa-css-prefix}-times-circle:before { content: $fa-var-times-circle; }\n.#{$fa-css-prefix}-check-circle:before { content: $fa-var-check-circle; }\n.#{$fa-css-prefix}-question-circle:before { content: $fa-var-question-circle; }\n.#{$fa-css-prefix}-info-circle:before { content: $fa-var-info-circle; }\n.#{$fa-css-prefix}-crosshairs:before { content: $fa-var-crosshairs; }\n.#{$fa-css-prefix}-times-circle-o:before { content: $fa-var-times-circle-o; }\n.#{$fa-css-prefix}-check-circle-o:before { content: $fa-var-check-circle-o; }\n.#{$fa-css-prefix}-ban:before { content: $fa-var-ban; }\n.#{$fa-css-prefix}-arrow-left:before { content: $fa-var-arrow-left; }\n.#{$fa-css-prefix}-arrow-right:before { content: $fa-var-arrow-right; }\n.#{$fa-css-prefix}-arrow-up:before { content: $fa-var-arrow-up; }\n.#{$fa-css-prefix}-arrow-down:before { content: $fa-var-arrow-down; }\n.#{$fa-css-prefix}-mail-forward:before,\n.#{$fa-css-prefix}-share:before { content: $fa-var-share; }\n.#{$fa-css-prefix}-expand:before { content: $fa-var-expand; }\n.#{$fa-css-prefix}-compress:before { content: $fa-var-compress; }\n.#{$fa-css-prefix}-plus:before { content: $fa-var-plus; }\n.#{$fa-css-prefix}-minus:before { content: $fa-var-minus; }\n.#{$fa-css-prefix}-asterisk:before { content: $fa-var-asterisk; }\n.#{$fa-css-prefix}-exclamation-circle:before { content: $fa-var-exclamation-circle; }\n.#{$fa-css-prefix}-gift:before { content: $fa-var-gift; }\n.#{$fa-css-prefix}-leaf:before { content: $fa-var-leaf; }\n.#{$fa-css-prefix}-fire:before { content: $fa-var-fire; }\n.#{$fa-css-prefix}-eye:before { content: $fa-var-eye; }\n.#{$fa-css-prefix}-eye-slash:before { content: $fa-var-eye-slash; }\n.#{$fa-css-prefix}-warning:before,\n.#{$fa-css-prefix}-exclamation-triangle:before { content: $fa-var-exclamation-triangle; }\n.#{$fa-css-prefix}-plane:before { content: $fa-var-plane; }\n.#{$fa-css-prefix}-calendar:before { content: $fa-var-calendar; }\n.#{$fa-css-prefix}-random:before { content: $fa-var-random; }\n.#{$fa-css-prefix}-comment:before { content: $fa-var-comment; }\n.#{$fa-css-prefix}-magnet:before { content: $fa-var-magnet; }\n.#{$fa-css-prefix}-chevron-up:before { content: $fa-var-chevron-up; }\n.#{$fa-css-prefix}-chevron-down:before { content: $fa-var-chevron-down; }\n.#{$fa-css-prefix}-retweet:before { content: $fa-var-retweet; }\n.#{$fa-css-prefix}-shopping-cart:before { content: $fa-var-shopping-cart; }\n.#{$fa-css-prefix}-folder:before { content: $fa-var-folder; }\n.#{$fa-css-prefix}-folder-open:before { content: $fa-var-folder-open; }\n.#{$fa-css-prefix}-arrows-v:before { content: $fa-var-arrows-v; }\n.#{$fa-css-prefix}-arrows-h:before { content: $fa-var-arrows-h; }\n.#{$fa-css-prefix}-bar-chart-o:before,\n.#{$fa-css-prefix}-bar-chart:before { content: $fa-var-bar-chart; }\n.#{$fa-css-prefix}-twitter-square:before { content: $fa-var-twitter-square; }\n.#{$fa-css-prefix}-facebook-square:before { content: $fa-var-facebook-square; }\n.#{$fa-css-prefix}-camera-retro:before { content: $fa-var-camera-retro; }\n.#{$fa-css-prefix}-key:before { content: $fa-var-key; }\n.#{$fa-css-prefix}-gears:before,\n.#{$fa-css-prefix}-cogs:before { content: $fa-var-cogs; }\n.#{$fa-css-prefix}-comments:before { content: $fa-var-comments; }\n.#{$fa-css-prefix}-thumbs-o-up:before { content: $fa-var-thumbs-o-up; }\n.#{$fa-css-prefix}-thumbs-o-down:before { content: $fa-var-thumbs-o-down; }\n.#{$fa-css-prefix}-star-half:before { content: $fa-var-star-half; }\n.#{$fa-css-prefix}-heart-o:before { content: $fa-var-heart-o; }\n.#{$fa-css-prefix}-sign-out:before { content: $fa-var-sign-out; }\n.#{$fa-css-prefix}-linkedin-square:before { content: $fa-var-linkedin-square; }\n.#{$fa-css-prefix}-thumb-tack:before { content: $fa-var-thumb-tack; }\n.#{$fa-css-prefix}-external-link:before { content: $fa-var-external-link; }\n.#{$fa-css-prefix}-sign-in:before { content: $fa-var-sign-in; }\n.#{$fa-css-prefix}-trophy:before { content: $fa-var-trophy; }\n.#{$fa-css-prefix}-github-square:before { content: $fa-var-github-square; }\n.#{$fa-css-prefix}-upload:before { content: $fa-var-upload; }\n.#{$fa-css-prefix}-lemon-o:before { content: $fa-var-lemon-o; }\n.#{$fa-css-prefix}-phone:before { content: $fa-var-phone; }\n.#{$fa-css-prefix}-square-o:before { content: $fa-var-square-o; }\n.#{$fa-css-prefix}-bookmark-o:before { content: $fa-var-bookmark-o; }\n.#{$fa-css-prefix}-phone-square:before { content: $fa-var-phone-square; }\n.#{$fa-css-prefix}-twitter:before { content: $fa-var-twitter; }\n.#{$fa-css-prefix}-facebook-f:before,\n.#{$fa-css-prefix}-facebook:before { content: $fa-var-facebook; }\n.#{$fa-css-prefix}-github:before { content: $fa-var-github; }\n.#{$fa-css-prefix}-unlock:before { content: $fa-var-unlock; }\n.#{$fa-css-prefix}-credit-card:before { content: $fa-var-credit-card; }\n.#{$fa-css-prefix}-rss:before { content: $fa-var-rss; }\n.#{$fa-css-prefix}-hdd-o:before { content: $fa-var-hdd-o; }\n.#{$fa-css-prefix}-bullhorn:before { content: $fa-var-bullhorn; }\n.#{$fa-css-prefix}-bell:before { content: $fa-var-bell; }\n.#{$fa-css-prefix}-certificate:before { content: $fa-var-certificate; }\n.#{$fa-css-prefix}-hand-o-right:before { content: $fa-var-hand-o-right; }\n.#{$fa-css-prefix}-hand-o-left:before { content: $fa-var-hand-o-left; }\n.#{$fa-css-prefix}-hand-o-up:before { content: $fa-var-hand-o-up; }\n.#{$fa-css-prefix}-hand-o-down:before { content: $fa-var-hand-o-down; }\n.#{$fa-css-prefix}-arrow-circle-left:before { content: $fa-var-arrow-circle-left; }\n.#{$fa-css-prefix}-arrow-circle-right:before { content: $fa-var-arrow-circle-right; }\n.#{$fa-css-prefix}-arrow-circle-up:before { content: $fa-var-arrow-circle-up; }\n.#{$fa-css-prefix}-arrow-circle-down:before { content: $fa-var-arrow-circle-down; }\n.#{$fa-css-prefix}-globe:before { content: $fa-var-globe; }\n.#{$fa-css-prefix}-wrench:before { content: $fa-var-wrench; }\n.#{$fa-css-prefix}-tasks:before { content: $fa-var-tasks; }\n.#{$fa-css-prefix}-filter:before { content: $fa-var-filter; }\n.#{$fa-css-prefix}-briefcase:before { content: $fa-var-briefcase; }\n.#{$fa-css-prefix}-arrows-alt:before { content: $fa-var-arrows-alt; }\n.#{$fa-css-prefix}-group:before,\n.#{$fa-css-prefix}-users:before { content: $fa-var-users; }\n.#{$fa-css-prefix}-chain:before,\n.#{$fa-css-prefix}-link:before { content: $fa-var-link; }\n.#{$fa-css-prefix}-cloud:before { content: $fa-var-cloud; }\n.#{$fa-css-prefix}-flask:before { content: $fa-var-flask; }\n.#{$fa-css-prefix}-cut:before,\n.#{$fa-css-prefix}-scissors:before { content: $fa-var-scissors; }\n.#{$fa-css-prefix}-copy:before,\n.#{$fa-css-prefix}-files-o:before { content: $fa-var-files-o; }\n.#{$fa-css-prefix}-paperclip:before { content: $fa-var-paperclip; }\n.#{$fa-css-prefix}-save:before,\n.#{$fa-css-prefix}-floppy-o:before { content: $fa-var-floppy-o; }\n.#{$fa-css-prefix}-square:before { content: $fa-var-square; }\n.#{$fa-css-prefix}-navicon:before,\n.#{$fa-css-prefix}-reorder:before,\n.#{$fa-css-prefix}-bars:before { content: $fa-var-bars; }\n.#{$fa-css-prefix}-list-ul:before { content: $fa-var-list-ul; }\n.#{$fa-css-prefix}-list-ol:before { content: $fa-var-list-ol; }\n.#{$fa-css-prefix}-strikethrough:before { content: $fa-var-strikethrough; }\n.#{$fa-css-prefix}-underline:before { content: $fa-var-underline; }\n.#{$fa-css-prefix}-table:before { content: $fa-var-table; }\n.#{$fa-css-prefix}-magic:before { content: $fa-var-magic; }\n.#{$fa-css-prefix}-truck:before { content: $fa-var-truck; }\n.#{$fa-css-prefix}-pinterest:before { content: $fa-var-pinterest; }\n.#{$fa-css-prefix}-pinterest-square:before { content: $fa-var-pinterest-square; }\n.#{$fa-css-prefix}-google-plus-square:before { content: $fa-var-google-plus-square; }\n.#{$fa-css-prefix}-google-plus:before { content: $fa-var-google-plus; }\n.#{$fa-css-prefix}-money:before { content: $fa-var-money; }\n.#{$fa-css-prefix}-caret-down:before { content: $fa-var-caret-down; }\n.#{$fa-css-prefix}-caret-up:before { content: $fa-var-caret-up; }\n.#{$fa-css-prefix}-caret-left:before { content: $fa-var-caret-left; }\n.#{$fa-css-prefix}-caret-right:before { content: $fa-var-caret-right; }\n.#{$fa-css-prefix}-columns:before { content: $fa-var-columns; }\n.#{$fa-css-prefix}-unsorted:before,\n.#{$fa-css-prefix}-sort:before { content: $fa-var-sort; }\n.#{$fa-css-prefix}-sort-down:before,\n.#{$fa-css-prefix}-sort-desc:before { content: $fa-var-sort-desc; }\n.#{$fa-css-prefix}-sort-up:before,\n.#{$fa-css-prefix}-sort-asc:before { content: $fa-var-sort-asc; }\n.#{$fa-css-prefix}-envelope:before { content: $fa-var-envelope; }\n.#{$fa-css-prefix}-linkedin:before { content: $fa-var-linkedin; }\n.#{$fa-css-prefix}-rotate-left:before,\n.#{$fa-css-prefix}-undo:before { content: $fa-var-undo; }\n.#{$fa-css-prefix}-legal:before,\n.#{$fa-css-prefix}-gavel:before { content: $fa-var-gavel; }\n.#{$fa-css-prefix}-dashboard:before,\n.#{$fa-css-prefix}-tachometer:before { content: $fa-var-tachometer; }\n.#{$fa-css-prefix}-comment-o:before { content: $fa-var-comment-o; }\n.#{$fa-css-prefix}-comments-o:before { content: $fa-var-comments-o; }\n.#{$fa-css-prefix}-flash:before,\n.#{$fa-css-prefix}-bolt:before { content: $fa-var-bolt; }\n.#{$fa-css-prefix}-sitemap:before { content: $fa-var-sitemap; }\n.#{$fa-css-prefix}-umbrella:before { content: $fa-var-umbrella; }\n.#{$fa-css-prefix}-paste:before,\n.#{$fa-css-prefix}-clipboard:before { content: $fa-var-clipboard; }\n.#{$fa-css-prefix}-lightbulb-o:before { content: $fa-var-lightbulb-o; }\n.#{$fa-css-prefix}-exchange:before { content: $fa-var-exchange; }\n.#{$fa-css-prefix}-cloud-download:before { content: $fa-var-cloud-download; }\n.#{$fa-css-prefix}-cloud-upload:before { content: $fa-var-cloud-upload; }\n.#{$fa-css-prefix}-user-md:before { content: $fa-var-user-md; }\n.#{$fa-css-prefix}-stethoscope:before { content: $fa-var-stethoscope; }\n.#{$fa-css-prefix}-suitcase:before { content: $fa-var-suitcase; }\n.#{$fa-css-prefix}-bell-o:before { content: $fa-var-bell-o; }\n.#{$fa-css-prefix}-coffee:before { content: $fa-var-coffee; }\n.#{$fa-css-prefix}-cutlery:before { content: $fa-var-cutlery; }\n.#{$fa-css-prefix}-file-text-o:before { content: $fa-var-file-text-o; }\n.#{$fa-css-prefix}-building-o:before { content: $fa-var-building-o; }\n.#{$fa-css-prefix}-hospital-o:before { content: $fa-var-hospital-o; }\n.#{$fa-css-prefix}-ambulance:before { content: $fa-var-ambulance; }\n.#{$fa-css-prefix}-medkit:before { content: $fa-var-medkit; }\n.#{$fa-css-prefix}-fighter-jet:before { content: $fa-var-fighter-jet; }\n.#{$fa-css-prefix}-beer:before { content: $fa-var-beer; }\n.#{$fa-css-prefix}-h-square:before { content: $fa-var-h-square; }\n.#{$fa-css-prefix}-plus-square:before { content: $fa-var-plus-square; }\n.#{$fa-css-prefix}-angle-double-left:before { content: $fa-var-angle-double-left; }\n.#{$fa-css-prefix}-angle-double-right:before { content: $fa-var-angle-double-right; }\n.#{$fa-css-prefix}-angle-double-up:before { content: $fa-var-angle-double-up; }\n.#{$fa-css-prefix}-angle-double-down:before { content: $fa-var-angle-double-down; }\n.#{$fa-css-prefix}-angle-left:before { content: $fa-var-angle-left; }\n.#{$fa-css-prefix}-angle-right:before { content: $fa-var-angle-right; }\n.#{$fa-css-prefix}-angle-up:before { content: $fa-var-angle-up; }\n.#{$fa-css-prefix}-angle-down:before { content: $fa-var-angle-down; }\n.#{$fa-css-prefix}-desktop:before { content: $fa-var-desktop; }\n.#{$fa-css-prefix}-laptop:before { content: $fa-var-laptop; }\n.#{$fa-css-prefix}-tablet:before { content: $fa-var-tablet; }\n.#{$fa-css-prefix}-mobile-phone:before,\n.#{$fa-css-prefix}-mobile:before { content: $fa-var-mobile; }\n.#{$fa-css-prefix}-circle-o:before { content: $fa-var-circle-o; }\n.#{$fa-css-prefix}-quote-left:before { content: $fa-var-quote-left; }\n.#{$fa-css-prefix}-quote-right:before { content: $fa-var-quote-right; }\n.#{$fa-css-prefix}-spinner:before { content: $fa-var-spinner; }\n.#{$fa-css-prefix}-circle:before { content: $fa-var-circle; }\n.#{$fa-css-prefix}-mail-reply:before,\n.#{$fa-css-prefix}-reply:before { content: $fa-var-reply; }\n.#{$fa-css-prefix}-github-alt:before { content: $fa-var-github-alt; }\n.#{$fa-css-prefix}-folder-o:before { content: $fa-var-folder-o; }\n.#{$fa-css-prefix}-folder-open-o:before { content: $fa-var-folder-open-o; }\n.#{$fa-css-prefix}-smile-o:before { content: $fa-var-smile-o; }\n.#{$fa-css-prefix}-frown-o:before { content: $fa-var-frown-o; }\n.#{$fa-css-prefix}-meh-o:before { content: $fa-var-meh-o; }\n.#{$fa-css-prefix}-gamepad:before { content: $fa-var-gamepad; }\n.#{$fa-css-prefix}-keyboard-o:before { content: $fa-var-keyboard-o; }\n.#{$fa-css-prefix}-flag-o:before { content: $fa-var-flag-o; }\n.#{$fa-css-prefix}-flag-checkered:before { content: $fa-var-flag-checkered; }\n.#{$fa-css-prefix}-terminal:before { content: $fa-var-terminal; }\n.#{$fa-css-prefix}-code:before { content: $fa-var-code; }\n.#{$fa-css-prefix}-mail-reply-all:before,\n.#{$fa-css-prefix}-reply-all:before { content: $fa-var-reply-all; }\n.#{$fa-css-prefix}-star-half-empty:before,\n.#{$fa-css-prefix}-star-half-full:before,\n.#{$fa-css-prefix}-star-half-o:before { content: $fa-var-star-half-o; }\n.#{$fa-css-prefix}-location-arrow:before { content: $fa-var-location-arrow; }\n.#{$fa-css-prefix}-crop:before { content: $fa-var-crop; }\n.#{$fa-css-prefix}-code-fork:before { content: $fa-var-code-fork; }\n.#{$fa-css-prefix}-unlink:before,\n.#{$fa-css-prefix}-chain-broken:before { content: $fa-var-chain-broken; }\n.#{$fa-css-prefix}-question:before { content: $fa-var-question; }\n.#{$fa-css-prefix}-info:before { content: $fa-var-info; }\n.#{$fa-css-prefix}-exclamation:before { content: $fa-var-exclamation; }\n.#{$fa-css-prefix}-superscript:before { content: $fa-var-superscript; }\n.#{$fa-css-prefix}-subscript:before { content: $fa-var-subscript; }\n.#{$fa-css-prefix}-eraser:before { content: $fa-var-eraser; }\n.#{$fa-css-prefix}-puzzle-piece:before { content: $fa-var-puzzle-piece; }\n.#{$fa-css-prefix}-microphone:before { content: $fa-var-microphone; }\n.#{$fa-css-prefix}-microphone-slash:before { content: $fa-var-microphone-slash; }\n.#{$fa-css-prefix}-shield:before { content: $fa-var-shield; }\n.#{$fa-css-prefix}-calendar-o:before { content: $fa-var-calendar-o; }\n.#{$fa-css-prefix}-fire-extinguisher:before { content: $fa-var-fire-extinguisher; }\n.#{$fa-css-prefix}-rocket:before { content: $fa-var-rocket; }\n.#{$fa-css-prefix}-maxcdn:before { content: $fa-var-maxcdn; }\n.#{$fa-css-prefix}-chevron-circle-left:before { content: $fa-var-chevron-circle-left; }\n.#{$fa-css-prefix}-chevron-circle-right:before { content: $fa-var-chevron-circle-right; }\n.#{$fa-css-prefix}-chevron-circle-up:before { content: $fa-var-chevron-circle-up; }\n.#{$fa-css-prefix}-chevron-circle-down:before { content: $fa-var-chevron-circle-down; }\n.#{$fa-css-prefix}-html5:before { content: $fa-var-html5; }\n.#{$fa-css-prefix}-css3:before { content: $fa-var-css3; }\n.#{$fa-css-prefix}-anchor:before { content: $fa-var-anchor; }\n.#{$fa-css-prefix}-unlock-alt:before { content: $fa-var-unlock-alt; }\n.#{$fa-css-prefix}-bullseye:before { content: $fa-var-bullseye; }\n.#{$fa-css-prefix}-ellipsis-h:before { content: $fa-var-ellipsis-h; }\n.#{$fa-css-prefix}-ellipsis-v:before { content: $fa-var-ellipsis-v; }\n.#{$fa-css-prefix}-rss-square:before { content: $fa-var-rss-square; }\n.#{$fa-css-prefix}-play-circle:before { content: $fa-var-play-circle; }\n.#{$fa-css-prefix}-ticket:before { content: $fa-var-ticket; }\n.#{$fa-css-prefix}-minus-square:before { content: $fa-var-minus-square; }\n.#{$fa-css-prefix}-minus-square-o:before { content: $fa-var-minus-square-o; }\n.#{$fa-css-prefix}-level-up:before { content: $fa-var-level-up; }\n.#{$fa-css-prefix}-level-down:before { content: $fa-var-level-down; }\n.#{$fa-css-prefix}-check-square:before { content: $fa-var-check-square; }\n.#{$fa-css-prefix}-pencil-square:before { content: $fa-var-pencil-square; }\n.#{$fa-css-prefix}-external-link-square:before { content: $fa-var-external-link-square; }\n.#{$fa-css-prefix}-share-square:before { content: $fa-var-share-square; }\n.#{$fa-css-prefix}-compass:before { content: $fa-var-compass; }\n.#{$fa-css-prefix}-toggle-down:before,\n.#{$fa-css-prefix}-caret-square-o-down:before { content: $fa-var-caret-square-o-down; }\n.#{$fa-css-prefix}-toggle-up:before,\n.#{$fa-css-prefix}-caret-square-o-up:before { content: $fa-var-caret-square-o-up; }\n.#{$fa-css-prefix}-toggle-right:before,\n.#{$fa-css-prefix}-caret-square-o-right:before { content: $fa-var-caret-square-o-right; }\n.#{$fa-css-prefix}-euro:before,\n.#{$fa-css-prefix}-eur:before { content: $fa-var-eur; }\n.#{$fa-css-prefix}-gbp:before { content: $fa-var-gbp; }\n.#{$fa-css-prefix}-dollar:before,\n.#{$fa-css-prefix}-usd:before { content: $fa-var-usd; }\n.#{$fa-css-prefix}-rupee:before,\n.#{$fa-css-prefix}-inr:before { content: $fa-var-inr; }\n.#{$fa-css-prefix}-cny:before,\n.#{$fa-css-prefix}-rmb:before,\n.#{$fa-css-prefix}-yen:before,\n.#{$fa-css-prefix}-jpy:before { content: $fa-var-jpy; }\n.#{$fa-css-prefix}-ruble:before,\n.#{$fa-css-prefix}-rouble:before,\n.#{$fa-css-prefix}-rub:before { content: $fa-var-rub; }\n.#{$fa-css-prefix}-won:before,\n.#{$fa-css-prefix}-krw:before { content: $fa-var-krw; }\n.#{$fa-css-prefix}-bitcoin:before,\n.#{$fa-css-prefix}-btc:before { content: $fa-var-btc; }\n.#{$fa-css-prefix}-file:before { content: $fa-var-file; }\n.#{$fa-css-prefix}-file-text:before { content: $fa-var-file-text; }\n.#{$fa-css-prefix}-sort-alpha-asc:before { content: $fa-var-sort-alpha-asc; }\n.#{$fa-css-prefix}-sort-alpha-desc:before { content: $fa-var-sort-alpha-desc; }\n.#{$fa-css-prefix}-sort-amount-asc:before { content: $fa-var-sort-amount-asc; }\n.#{$fa-css-prefix}-sort-amount-desc:before { content: $fa-var-sort-amount-desc; }\n.#{$fa-css-prefix}-sort-numeric-asc:before { content: $fa-var-sort-numeric-asc; }\n.#{$fa-css-prefix}-sort-numeric-desc:before { content: $fa-var-sort-numeric-desc; }\n.#{$fa-css-prefix}-thumbs-up:before { content: $fa-var-thumbs-up; }\n.#{$fa-css-prefix}-thumbs-down:before { content: $fa-var-thumbs-down; }\n.#{$fa-css-prefix}-youtube-square:before { content: $fa-var-youtube-square; }\n.#{$fa-css-prefix}-youtube:before { content: $fa-var-youtube; }\n.#{$fa-css-prefix}-xing:before { content: $fa-var-xing; }\n.#{$fa-css-prefix}-xing-square:before { content: $fa-var-xing-square; }\n.#{$fa-css-prefix}-youtube-play:before { content: $fa-var-youtube-play; }\n.#{$fa-css-prefix}-dropbox:before { content: $fa-var-dropbox; }\n.#{$fa-css-prefix}-stack-overflow:before { content: $fa-var-stack-overflow; }\n.#{$fa-css-prefix}-instagram:before { content: $fa-var-instagram; }\n.#{$fa-css-prefix}-flickr:before { content: $fa-var-flickr; }\n.#{$fa-css-prefix}-adn:before { content: $fa-var-adn; }\n.#{$fa-css-prefix}-bitbucket:before { content: $fa-var-bitbucket; }\n.#{$fa-css-prefix}-bitbucket-square:before { content: $fa-var-bitbucket-square; }\n.#{$fa-css-prefix}-tumblr:before { content: $fa-var-tumblr; }\n.#{$fa-css-prefix}-tumblr-square:before { content: $fa-var-tumblr-square; }\n.#{$fa-css-prefix}-long-arrow-down:before { content: $fa-var-long-arrow-down; }\n.#{$fa-css-prefix}-long-arrow-up:before { content: $fa-var-long-arrow-up; }\n.#{$fa-css-prefix}-long-arrow-left:before { content: $fa-var-long-arrow-left; }\n.#{$fa-css-prefix}-long-arrow-right:before { content: $fa-var-long-arrow-right; }\n.#{$fa-css-prefix}-apple:before { content: $fa-var-apple; }\n.#{$fa-css-prefix}-windows:before { content: $fa-var-windows; }\n.#{$fa-css-prefix}-android:before { content: $fa-var-android; }\n.#{$fa-css-prefix}-linux:before { content: $fa-var-linux; }\n.#{$fa-css-prefix}-dribbble:before { content: $fa-var-dribbble; }\n.#{$fa-css-prefix}-skype:before { content: $fa-var-skype; }\n.#{$fa-css-prefix}-foursquare:before { content: $fa-var-foursquare; }\n.#{$fa-css-prefix}-trello:before { content: $fa-var-trello; }\n.#{$fa-css-prefix}-female:before { content: $fa-var-female; }\n.#{$fa-css-prefix}-male:before { content: $fa-var-male; }\n.#{$fa-css-prefix}-gittip:before,\n.#{$fa-css-prefix}-gratipay:before { content: $fa-var-gratipay; }\n.#{$fa-css-prefix}-sun-o:before { content: $fa-var-sun-o; }\n.#{$fa-css-prefix}-moon-o:before { content: $fa-var-moon-o; }\n.#{$fa-css-prefix}-archive:before { content: $fa-var-archive; }\n.#{$fa-css-prefix}-bug:before { content: $fa-var-bug; }\n.#{$fa-css-prefix}-vk:before { content: $fa-var-vk; }\n.#{$fa-css-prefix}-weibo:before { content: $fa-var-weibo; }\n.#{$fa-css-prefix}-renren:before { content: $fa-var-renren; }\n.#{$fa-css-prefix}-pagelines:before { content: $fa-var-pagelines; }\n.#{$fa-css-prefix}-stack-exchange:before { content: $fa-var-stack-exchange; }\n.#{$fa-css-prefix}-arrow-circle-o-right:before { content: $fa-var-arrow-circle-o-right; }\n.#{$fa-css-prefix}-arrow-circle-o-left:before { content: $fa-var-arrow-circle-o-left; }\n.#{$fa-css-prefix}-toggle-left:before,\n.#{$fa-css-prefix}-caret-square-o-left:before { content: $fa-var-caret-square-o-left; }\n.#{$fa-css-prefix}-dot-circle-o:before { content: $fa-var-dot-circle-o; }\n.#{$fa-css-prefix}-wheelchair:before { content: $fa-var-wheelchair; }\n.#{$fa-css-prefix}-vimeo-square:before { content: $fa-var-vimeo-square; }\n.#{$fa-css-prefix}-turkish-lira:before,\n.#{$fa-css-prefix}-try:before { content: $fa-var-try; }\n.#{$fa-css-prefix}-plus-square-o:before { content: $fa-var-plus-square-o; }\n.#{$fa-css-prefix}-space-shuttle:before { content: $fa-var-space-shuttle; }\n.#{$fa-css-prefix}-slack:before { content: $fa-var-slack; }\n.#{$fa-css-prefix}-envelope-square:before { content: $fa-var-envelope-square; }\n.#{$fa-css-prefix}-wordpress:before { content: $fa-var-wordpress; }\n.#{$fa-css-prefix}-openid:before { content: $fa-var-openid; }\n.#{$fa-css-prefix}-institution:before,\n.#{$fa-css-prefix}-bank:before,\n.#{$fa-css-prefix}-university:before { content: $fa-var-university; }\n.#{$fa-css-prefix}-mortar-board:before,\n.#{$fa-css-prefix}-graduation-cap:before { content: $fa-var-graduation-cap; }\n.#{$fa-css-prefix}-yahoo:before { content: $fa-var-yahoo; }\n.#{$fa-css-prefix}-google:before { content: $fa-var-google; }\n.#{$fa-css-prefix}-reddit:before { content: $fa-var-reddit; }\n.#{$fa-css-prefix}-reddit-square:before { content: $fa-var-reddit-square; }\n.#{$fa-css-prefix}-stumbleupon-circle:before { content: $fa-var-stumbleupon-circle; }\n.#{$fa-css-prefix}-stumbleupon:before { content: $fa-var-stumbleupon; }\n.#{$fa-css-prefix}-delicious:before { content: $fa-var-delicious; }\n.#{$fa-css-prefix}-digg:before { content: $fa-var-digg; }\n.#{$fa-css-prefix}-pied-piper:before { content: $fa-var-pied-piper; }\n.#{$fa-css-prefix}-pied-piper-alt:before { content: $fa-var-pied-piper-alt; }\n.#{$fa-css-prefix}-drupal:before { content: $fa-var-drupal; }\n.#{$fa-css-prefix}-joomla:before { content: $fa-var-joomla; }\n.#{$fa-css-prefix}-language:before { content: $fa-var-language; }\n.#{$fa-css-prefix}-fax:before { content: $fa-var-fax; }\n.#{$fa-css-prefix}-building:before { content: $fa-var-building; }\n.#{$fa-css-prefix}-child:before { content: $fa-var-child; }\n.#{$fa-css-prefix}-paw:before { content: $fa-var-paw; }\n.#{$fa-css-prefix}-spoon:before { content: $fa-var-spoon; }\n.#{$fa-css-prefix}-cube:before { content: $fa-var-cube; }\n.#{$fa-css-prefix}-cubes:before { content: $fa-var-cubes; }\n.#{$fa-css-prefix}-behance:before { content: $fa-var-behance; }\n.#{$fa-css-prefix}-behance-square:before { content: $fa-var-behance-square; }\n.#{$fa-css-prefix}-steam:before { content: $fa-var-steam; }\n.#{$fa-css-prefix}-steam-square:before { content: $fa-var-steam-square; }\n.#{$fa-css-prefix}-recycle:before { content: $fa-var-recycle; }\n.#{$fa-css-prefix}-automobile:before,\n.#{$fa-css-prefix}-car:before { content: $fa-var-car; }\n.#{$fa-css-prefix}-cab:before,\n.#{$fa-css-prefix}-taxi:before { content: $fa-var-taxi; }\n.#{$fa-css-prefix}-tree:before { content: $fa-var-tree; }\n.#{$fa-css-prefix}-spotify:before { content: $fa-var-spotify; }\n.#{$fa-css-prefix}-deviantart:before { content: $fa-var-deviantart; }\n.#{$fa-css-prefix}-soundcloud:before { content: $fa-var-soundcloud; }\n.#{$fa-css-prefix}-database:before { content: $fa-var-database; }\n.#{$fa-css-prefix}-file-pdf-o:before { content: $fa-var-file-pdf-o; }\n.#{$fa-css-prefix}-file-word-o:before { content: $fa-var-file-word-o; }\n.#{$fa-css-prefix}-file-excel-o:before { content: $fa-var-file-excel-o; }\n.#{$fa-css-prefix}-file-powerpoint-o:before { content: $fa-var-file-powerpoint-o; }\n.#{$fa-css-prefix}-file-photo-o:before,\n.#{$fa-css-prefix}-file-picture-o:before,\n.#{$fa-css-prefix}-file-image-o:before { content: $fa-var-file-image-o; }\n.#{$fa-css-prefix}-file-zip-o:before,\n.#{$fa-css-prefix}-file-archive-o:before { content: $fa-var-file-archive-o; }\n.#{$fa-css-prefix}-file-sound-o:before,\n.#{$fa-css-prefix}-file-audio-o:before { content: $fa-var-file-audio-o; }\n.#{$fa-css-prefix}-file-movie-o:before,\n.#{$fa-css-prefix}-file-video-o:before { content: $fa-var-file-video-o; }\n.#{$fa-css-prefix}-file-code-o:before { content: $fa-var-file-code-o; }\n.#{$fa-css-prefix}-vine:before { content: $fa-var-vine; }\n.#{$fa-css-prefix}-codepen:before { content: $fa-var-codepen; }\n.#{$fa-css-prefix}-jsfiddle:before { content: $fa-var-jsfiddle; }\n.#{$fa-css-prefix}-life-bouy:before,\n.#{$fa-css-prefix}-life-buoy:before,\n.#{$fa-css-prefix}-life-saver:before,\n.#{$fa-css-prefix}-support:before,\n.#{$fa-css-prefix}-life-ring:before { content: $fa-var-life-ring; }\n.#{$fa-css-prefix}-circle-o-notch:before { content: $fa-var-circle-o-notch; }\n.#{$fa-css-prefix}-ra:before,\n.#{$fa-css-prefix}-rebel:before { content: $fa-var-rebel; }\n.#{$fa-css-prefix}-ge:before,\n.#{$fa-css-prefix}-empire:before { content: $fa-var-empire; }\n.#{$fa-css-prefix}-git-square:before { content: $fa-var-git-square; }\n.#{$fa-css-prefix}-git:before { content: $fa-var-git; }\n.#{$fa-css-prefix}-hacker-news:before { content: $fa-var-hacker-news; }\n.#{$fa-css-prefix}-tencent-weibo:before { content: $fa-var-tencent-weibo; }\n.#{$fa-css-prefix}-qq:before { content: $fa-var-qq; }\n.#{$fa-css-prefix}-wechat:before,\n.#{$fa-css-prefix}-weixin:before { content: $fa-var-weixin; }\n.#{$fa-css-prefix}-send:before,\n.#{$fa-css-prefix}-paper-plane:before { content: $fa-var-paper-plane; }\n.#{$fa-css-prefix}-send-o:before,\n.#{$fa-css-prefix}-paper-plane-o:before { content: $fa-var-paper-plane-o; }\n.#{$fa-css-prefix}-history:before { content: $fa-var-history; }\n.#{$fa-css-prefix}-genderless:before,\n.#{$fa-css-prefix}-circle-thin:before { content: $fa-var-circle-thin; }\n.#{$fa-css-prefix}-header:before { content: $fa-var-header; }\n.#{$fa-css-prefix}-paragraph:before { content: $fa-var-paragraph; }\n.#{$fa-css-prefix}-sliders:before { content: $fa-var-sliders; }\n.#{$fa-css-prefix}-share-alt:before { content: $fa-var-share-alt; }\n.#{$fa-css-prefix}-share-alt-square:before { content: $fa-var-share-alt-square; }\n.#{$fa-css-prefix}-bomb:before { content: $fa-var-bomb; }\n.#{$fa-css-prefix}-soccer-ball-o:before,\n.#{$fa-css-prefix}-futbol-o:before { content: $fa-var-futbol-o; }\n.#{$fa-css-prefix}-tty:before { content: $fa-var-tty; }\n.#{$fa-css-prefix}-binoculars:before { content: $fa-var-binoculars; }\n.#{$fa-css-prefix}-plug:before { content: $fa-var-plug; }\n.#{$fa-css-prefix}-slideshare:before { content: $fa-var-slideshare; }\n.#{$fa-css-prefix}-twitch:before { content: $fa-var-twitch; }\n.#{$fa-css-prefix}-yelp:before { content: $fa-var-yelp; }\n.#{$fa-css-prefix}-newspaper-o:before { content: $fa-var-newspaper-o; }\n.#{$fa-css-prefix}-wifi:before { content: $fa-var-wifi; }\n.#{$fa-css-prefix}-calculator:before { content: $fa-var-calculator; }\n.#{$fa-css-prefix}-paypal:before { content: $fa-var-paypal; }\n.#{$fa-css-prefix}-google-wallet:before { content: $fa-var-google-wallet; }\n.#{$fa-css-prefix}-cc-visa:before { content: $fa-var-cc-visa; }\n.#{$fa-css-prefix}-cc-mastercard:before { content: $fa-var-cc-mastercard; }\n.#{$fa-css-prefix}-cc-discover:before { content: $fa-var-cc-discover; }\n.#{$fa-css-prefix}-cc-amex:before { content: $fa-var-cc-amex; }\n.#{$fa-css-prefix}-cc-paypal:before { content: $fa-var-cc-paypal; }\n.#{$fa-css-prefix}-cc-stripe:before { content: $fa-var-cc-stripe; }\n.#{$fa-css-prefix}-bell-slash:before { content: $fa-var-bell-slash; }\n.#{$fa-css-prefix}-bell-slash-o:before { content: $fa-var-bell-slash-o; }\n.#{$fa-css-prefix}-trash:before { content: $fa-var-trash; }\n.#{$fa-css-prefix}-copyright:before { content: $fa-var-copyright; }\n.#{$fa-css-prefix}-at:before { content: $fa-var-at; }\n.#{$fa-css-prefix}-eyedropper:before { content: $fa-var-eyedropper; }\n.#{$fa-css-prefix}-paint-brush:before { content: $fa-var-paint-brush; }\n.#{$fa-css-prefix}-birthday-cake:before { content: $fa-var-birthday-cake; }\n.#{$fa-css-prefix}-area-chart:before { content: $fa-var-area-chart; }\n.#{$fa-css-prefix}-pie-chart:before { content: $fa-var-pie-chart; }\n.#{$fa-css-prefix}-line-chart:before { content: $fa-var-line-chart; }\n.#{$fa-css-prefix}-lastfm:before { content: $fa-var-lastfm; }\n.#{$fa-css-prefix}-lastfm-square:before { content: $fa-var-lastfm-square; }\n.#{$fa-css-prefix}-toggle-off:before { content: $fa-var-toggle-off; }\n.#{$fa-css-prefix}-toggle-on:before { content: $fa-var-toggle-on; }\n.#{$fa-css-prefix}-bicycle:before { content: $fa-var-bicycle; }\n.#{$fa-css-prefix}-bus:before { content: $fa-var-bus; }\n.#{$fa-css-prefix}-ioxhost:before { content: $fa-var-ioxhost; }\n.#{$fa-css-prefix}-angellist:before { content: $fa-var-angellist; }\n.#{$fa-css-prefix}-cc:before { content: $fa-var-cc; }\n.#{$fa-css-prefix}-shekel:before,\n.#{$fa-css-prefix}-sheqel:before,\n.#{$fa-css-prefix}-ils:before { content: $fa-var-ils; }\n.#{$fa-css-prefix}-meanpath:before { content: $fa-var-meanpath; }\n.#{$fa-css-prefix}-buysellads:before { content: $fa-var-buysellads; }\n.#{$fa-css-prefix}-connectdevelop:before { content: $fa-var-connectdevelop; }\n.#{$fa-css-prefix}-dashcube:before { content: $fa-var-dashcube; }\n.#{$fa-css-prefix}-forumbee:before { content: $fa-var-forumbee; }\n.#{$fa-css-prefix}-leanpub:before { content: $fa-var-leanpub; }\n.#{$fa-css-prefix}-sellsy:before { content: $fa-var-sellsy; }\n.#{$fa-css-prefix}-shirtsinbulk:before { content: $fa-var-shirtsinbulk; }\n.#{$fa-css-prefix}-simplybuilt:before { content: $fa-var-simplybuilt; }\n.#{$fa-css-prefix}-skyatlas:before { content: $fa-var-skyatlas; }\n.#{$fa-css-prefix}-cart-plus:before { content: $fa-var-cart-plus; }\n.#{$fa-css-prefix}-cart-arrow-down:before { content: $fa-var-cart-arrow-down; }\n.#{$fa-css-prefix}-diamond:before { content: $fa-var-diamond; }\n.#{$fa-css-prefix}-ship:before { content: $fa-var-ship; }\n.#{$fa-css-prefix}-user-secret:before { content: $fa-var-user-secret; }\n.#{$fa-css-prefix}-motorcycle:before { content: $fa-var-motorcycle; }\n.#{$fa-css-prefix}-street-view:before { content: $fa-var-street-view; }\n.#{$fa-css-prefix}-heartbeat:before { content: $fa-var-heartbeat; }\n.#{$fa-css-prefix}-venus:before { content: $fa-var-venus; }\n.#{$fa-css-prefix}-mars:before { content: $fa-var-mars; }\n.#{$fa-css-prefix}-mercury:before { content: $fa-var-mercury; }\n.#{$fa-css-prefix}-transgender:before { content: $fa-var-transgender; }\n.#{$fa-css-prefix}-transgender-alt:before { content: $fa-var-transgender-alt; }\n.#{$fa-css-prefix}-venus-double:before { content: $fa-var-venus-double; }\n.#{$fa-css-prefix}-mars-double:before { content: $fa-var-mars-double; }\n.#{$fa-css-prefix}-venus-mars:before { content: $fa-var-venus-mars; }\n.#{$fa-css-prefix}-mars-stroke:before { content: $fa-var-mars-stroke; }\n.#{$fa-css-prefix}-mars-stroke-v:before { content: $fa-var-mars-stroke-v; }\n.#{$fa-css-prefix}-mars-stroke-h:before { content: $fa-var-mars-stroke-h; }\n.#{$fa-css-prefix}-neuter:before { content: $fa-var-neuter; }\n.#{$fa-css-prefix}-facebook-official:before { content: $fa-var-facebook-official; }\n.#{$fa-css-prefix}-pinterest-p:before { content: $fa-var-pinterest-p; }\n.#{$fa-css-prefix}-whatsapp:before { content: $fa-var-whatsapp; }\n.#{$fa-css-prefix}-server:before { content: $fa-var-server; }\n.#{$fa-css-prefix}-user-plus:before { content: $fa-var-user-plus; }\n.#{$fa-css-prefix}-user-times:before { content: $fa-var-user-times; }\n.#{$fa-css-prefix}-hotel:before,\n.#{$fa-css-prefix}-bed:before { content: $fa-var-bed; }\n.#{$fa-css-prefix}-viacoin:before { content: $fa-var-viacoin; }\n.#{$fa-css-prefix}-train:before { content: $fa-var-train; }\n.#{$fa-css-prefix}-subway:before { content: $fa-var-subway; }\n.#{$fa-css-prefix}-medium:before { content: $fa-var-medium; }\n"
  },
  {
    "path": "client/less/lib/font-awesome-4.3.0/scss/_larger.scss",
    "content": "// Icon Sizes\n// -------------------------\n\n/* makes the font 33% larger relative to the icon container */\n.#{$fa-css-prefix}-lg {\n  font-size: (4em / 3);\n  line-height: (3em / 4);\n  vertical-align: -15%;\n}\n.#{$fa-css-prefix}-2x { font-size: 2em; }\n.#{$fa-css-prefix}-3x { font-size: 3em; }\n.#{$fa-css-prefix}-4x { font-size: 4em; }\n.#{$fa-css-prefix}-5x { font-size: 5em; }\n"
  },
  {
    "path": "client/less/lib/font-awesome-4.3.0/scss/_list.scss",
    "content": "// List Icons\n// -------------------------\n\n.#{$fa-css-prefix}-ul {\n  padding-left: 0;\n  margin-left: $fa-li-width;\n  list-style-type: none;\n  > li { position: relative; }\n}\n.#{$fa-css-prefix}-li {\n  position: absolute;\n  left: -$fa-li-width;\n  width: $fa-li-width;\n  top: (2em / 14);\n  text-align: center;\n  &.#{$fa-css-prefix}-lg {\n    left: -$fa-li-width + (4em / 14);\n  }\n}\n"
  },
  {
    "path": "client/less/lib/font-awesome-4.3.0/scss/_mixins.scss",
    "content": "// Mixins\n// --------------------------\n\n@mixin fa-icon() {\n  display: inline-block;\n  font: normal normal normal #{$fa-font-size-base}/1 FontAwesome; // shortening font declaration\n  font-size: inherit; // can't have font-size inherit on line above, so need to override\n  text-rendering: auto; // optimizelegibility throws things off #1094\n  -webkit-font-smoothing: antialiased;\n  -moz-osx-font-smoothing: grayscale;\n  transform: translate(0, 0); // ensures no half-pixel rendering in firefox\n\n}\n\n@mixin fa-icon-rotate($degrees, $rotation) {\n  filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=#{$rotation});\n  -webkit-transform: rotate($degrees);\n      -ms-transform: rotate($degrees);\n          transform: rotate($degrees);\n}\n\n@mixin fa-icon-flip($horiz, $vert, $rotation) {\n  filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=#{$rotation});\n  -webkit-transform: scale($horiz, $vert);\n      -ms-transform: scale($horiz, $vert);\n          transform: scale($horiz, $vert);\n}\n"
  },
  {
    "path": "client/less/lib/font-awesome-4.3.0/scss/_path.scss",
    "content": "/* FONT PATH\n * -------------------------- */\n\n@font-face {\n  font-family: 'FontAwesome';\n  src: url('#{$fa-font-path}/fontawesome-webfont.eot?v=#{$fa-version}');\n  src: url('#{$fa-font-path}/fontawesome-webfont.eot?#iefix&v=#{$fa-version}') format('embedded-opentype'),\n    url('#{$fa-font-path}/fontawesome-webfont.woff2?v=#{$fa-version}') format('woff2'),\n    url('#{$fa-font-path}/fontawesome-webfont.woff?v=#{$fa-version}') format('woff'),\n    url('#{$fa-font-path}/fontawesome-webfont.ttf?v=#{$fa-version}') format('truetype'),\n    url('#{$fa-font-path}/fontawesome-webfont.svg?v=#{$fa-version}#fontawesomeregular') format('svg');\n//  src: url('#{$fa-font-path}/FontAwesome.otf') format('opentype'); // used when developing fonts\n  font-weight: normal;\n  font-style: normal;\n}\n"
  },
  {
    "path": "client/less/lib/font-awesome-4.3.0/scss/_rotated-flipped.scss",
    "content": "// Rotated & Flipped Icons\n// -------------------------\n\n.#{$fa-css-prefix}-rotate-90  { @include fa-icon-rotate(90deg, 1);  }\n.#{$fa-css-prefix}-rotate-180 { @include fa-icon-rotate(180deg, 2); }\n.#{$fa-css-prefix}-rotate-270 { @include fa-icon-rotate(270deg, 3); }\n\n.#{$fa-css-prefix}-flip-horizontal { @include fa-icon-flip(-1, 1, 0); }\n.#{$fa-css-prefix}-flip-vertical   { @include fa-icon-flip(1, -1, 2); }\n\n// Hook for IE8-9\n// -------------------------\n\n:root .#{$fa-css-prefix}-rotate-90,\n:root .#{$fa-css-prefix}-rotate-180,\n:root .#{$fa-css-prefix}-rotate-270,\n:root .#{$fa-css-prefix}-flip-horizontal,\n:root .#{$fa-css-prefix}-flip-vertical {\n  filter: none;\n}\n"
  },
  {
    "path": "client/less/lib/font-awesome-4.3.0/scss/_stacked.scss",
    "content": "// Stacked Icons\n// -------------------------\n\n.#{$fa-css-prefix}-stack {\n  position: relative;\n  display: inline-block;\n  width: 2em;\n  height: 2em;\n  line-height: 2em;\n  vertical-align: middle;\n}\n.#{$fa-css-prefix}-stack-1x, .#{$fa-css-prefix}-stack-2x {\n  position: absolute;\n  left: 0;\n  width: 100%;\n  text-align: center;\n}\n.#{$fa-css-prefix}-stack-1x { line-height: inherit; }\n.#{$fa-css-prefix}-stack-2x { font-size: 2em; }\n.#{$fa-css-prefix}-inverse { color: $fa-inverse; }\n"
  },
  {
    "path": "client/less/lib/font-awesome-4.3.0/scss/_variables.scss",
    "content": "// Variables\n// --------------------------\n\n$fa-font-path:        \"../fonts\" !default;\n$fa-font-size-base:   14px !default;\n//$fa-font-path:        \"//netdna.bootstrapcdn.com/font-awesome/4.3.0/fonts\" !default; // for referencing Bootstrap CDN font files directly\n$fa-css-prefix:       fa !default;\n$fa-version:          \"4.3.0\" !default;\n$fa-border-color:     #eee !default;\n$fa-inverse:          #fff !default;\n$fa-li-width:         (30em / 14) !default;\n\n$fa-var-adjust: \"\\f042\";\n$fa-var-adn: \"\\f170\";\n$fa-var-align-center: \"\\f037\";\n$fa-var-align-justify: \"\\f039\";\n$fa-var-align-left: \"\\f036\";\n$fa-var-align-right: \"\\f038\";\n$fa-var-ambulance: \"\\f0f9\";\n$fa-var-anchor: \"\\f13d\";\n$fa-var-android: \"\\f17b\";\n$fa-var-angellist: \"\\f209\";\n$fa-var-angle-double-down: \"\\f103\";\n$fa-var-angle-double-left: \"\\f100\";\n$fa-var-angle-double-right: \"\\f101\";\n$fa-var-angle-double-up: \"\\f102\";\n$fa-var-angle-down: \"\\f107\";\n$fa-var-angle-left: \"\\f104\";\n$fa-var-angle-right: \"\\f105\";\n$fa-var-angle-up: \"\\f106\";\n$fa-var-apple: \"\\f179\";\n$fa-var-archive: \"\\f187\";\n$fa-var-area-chart: \"\\f1fe\";\n$fa-var-arrow-circle-down: \"\\f0ab\";\n$fa-var-arrow-circle-left: \"\\f0a8\";\n$fa-var-arrow-circle-o-down: \"\\f01a\";\n$fa-var-arrow-circle-o-left: \"\\f190\";\n$fa-var-arrow-circle-o-right: \"\\f18e\";\n$fa-var-arrow-circle-o-up: \"\\f01b\";\n$fa-var-arrow-circle-right: \"\\f0a9\";\n$fa-var-arrow-circle-up: \"\\f0aa\";\n$fa-var-arrow-down: \"\\f063\";\n$fa-var-arrow-left: \"\\f060\";\n$fa-var-arrow-right: \"\\f061\";\n$fa-var-arrow-up: \"\\f062\";\n$fa-var-arrows: \"\\f047\";\n$fa-var-arrows-alt: \"\\f0b2\";\n$fa-var-arrows-h: \"\\f07e\";\n$fa-var-arrows-v: \"\\f07d\";\n$fa-var-asterisk: \"\\f069\";\n$fa-var-at: \"\\f1fa\";\n$fa-var-automobile: \"\\f1b9\";\n$fa-var-backward: \"\\f04a\";\n$fa-var-ban: \"\\f05e\";\n$fa-var-bank: \"\\f19c\";\n$fa-var-bar-chart: \"\\f080\";\n$fa-var-bar-chart-o: \"\\f080\";\n$fa-var-barcode: \"\\f02a\";\n$fa-var-bars: \"\\f0c9\";\n$fa-var-bed: \"\\f236\";\n$fa-var-beer: \"\\f0fc\";\n$fa-var-behance: \"\\f1b4\";\n$fa-var-behance-square: \"\\f1b5\";\n$fa-var-bell: \"\\f0f3\";\n$fa-var-bell-o: \"\\f0a2\";\n$fa-var-bell-slash: \"\\f1f6\";\n$fa-var-bell-slash-o: \"\\f1f7\";\n$fa-var-bicycle: \"\\f206\";\n$fa-var-binoculars: \"\\f1e5\";\n$fa-var-birthday-cake: \"\\f1fd\";\n$fa-var-bitbucket: \"\\f171\";\n$fa-var-bitbucket-square: \"\\f172\";\n$fa-var-bitcoin: \"\\f15a\";\n$fa-var-bold: \"\\f032\";\n$fa-var-bolt: \"\\f0e7\";\n$fa-var-bomb: \"\\f1e2\";\n$fa-var-book: \"\\f02d\";\n$fa-var-bookmark: \"\\f02e\";\n$fa-var-bookmark-o: \"\\f097\";\n$fa-var-briefcase: \"\\f0b1\";\n$fa-var-btc: \"\\f15a\";\n$fa-var-bug: \"\\f188\";\n$fa-var-building: \"\\f1ad\";\n$fa-var-building-o: \"\\f0f7\";\n$fa-var-bullhorn: \"\\f0a1\";\n$fa-var-bullseye: \"\\f140\";\n$fa-var-bus: \"\\f207\";\n$fa-var-buysellads: \"\\f20d\";\n$fa-var-cab: \"\\f1ba\";\n$fa-var-calculator: \"\\f1ec\";\n$fa-var-calendar: \"\\f073\";\n$fa-var-calendar-o: \"\\f133\";\n$fa-var-camera: \"\\f030\";\n$fa-var-camera-retro: \"\\f083\";\n$fa-var-car: \"\\f1b9\";\n$fa-var-caret-down: \"\\f0d7\";\n$fa-var-caret-left: \"\\f0d9\";\n$fa-var-caret-right: \"\\f0da\";\n$fa-var-caret-square-o-down: \"\\f150\";\n$fa-var-caret-square-o-left: \"\\f191\";\n$fa-var-caret-square-o-right: \"\\f152\";\n$fa-var-caret-square-o-up: \"\\f151\";\n$fa-var-caret-up: \"\\f0d8\";\n$fa-var-cart-arrow-down: \"\\f218\";\n$fa-var-cart-plus: \"\\f217\";\n$fa-var-cc: \"\\f20a\";\n$fa-var-cc-amex: \"\\f1f3\";\n$fa-var-cc-discover: \"\\f1f2\";\n$fa-var-cc-mastercard: \"\\f1f1\";\n$fa-var-cc-paypal: \"\\f1f4\";\n$fa-var-cc-stripe: \"\\f1f5\";\n$fa-var-cc-visa: \"\\f1f0\";\n$fa-var-certificate: \"\\f0a3\";\n$fa-var-chain: \"\\f0c1\";\n$fa-var-chain-broken: \"\\f127\";\n$fa-var-check: \"\\f00c\";\n$fa-var-check-circle: \"\\f058\";\n$fa-var-check-circle-o: \"\\f05d\";\n$fa-var-check-square: \"\\f14a\";\n$fa-var-check-square-o: \"\\f046\";\n$fa-var-chevron-circle-down: \"\\f13a\";\n$fa-var-chevron-circle-left: \"\\f137\";\n$fa-var-chevron-circle-right: \"\\f138\";\n$fa-var-chevron-circle-up: \"\\f139\";\n$fa-var-chevron-down: \"\\f078\";\n$fa-var-chevron-left: \"\\f053\";\n$fa-var-chevron-right: \"\\f054\";\n$fa-var-chevron-up: \"\\f077\";\n$fa-var-child: \"\\f1ae\";\n$fa-var-circle: \"\\f111\";\n$fa-var-circle-o: \"\\f10c\";\n$fa-var-circle-o-notch: \"\\f1ce\";\n$fa-var-circle-thin: \"\\f1db\";\n$fa-var-clipboard: \"\\f0ea\";\n$fa-var-clock-o: \"\\f017\";\n$fa-var-close: \"\\f00d\";\n$fa-var-cloud: \"\\f0c2\";\n$fa-var-cloud-download: \"\\f0ed\";\n$fa-var-cloud-upload: \"\\f0ee\";\n$fa-var-cny: \"\\f157\";\n$fa-var-code: \"\\f121\";\n$fa-var-code-fork: \"\\f126\";\n$fa-var-codepen: \"\\f1cb\";\n$fa-var-coffee: \"\\f0f4\";\n$fa-var-cog: \"\\f013\";\n$fa-var-cogs: \"\\f085\";\n$fa-var-columns: \"\\f0db\";\n$fa-var-comment: \"\\f075\";\n$fa-var-comment-o: \"\\f0e5\";\n$fa-var-comments: \"\\f086\";\n$fa-var-comments-o: \"\\f0e6\";\n$fa-var-compass: \"\\f14e\";\n$fa-var-compress: \"\\f066\";\n$fa-var-connectdevelop: \"\\f20e\";\n$fa-var-copy: \"\\f0c5\";\n$fa-var-copyright: \"\\f1f9\";\n$fa-var-credit-card: \"\\f09d\";\n$fa-var-crop: \"\\f125\";\n$fa-var-crosshairs: \"\\f05b\";\n$fa-var-css3: \"\\f13c\";\n$fa-var-cube: \"\\f1b2\";\n$fa-var-cubes: \"\\f1b3\";\n$fa-var-cut: \"\\f0c4\";\n$fa-var-cutlery: \"\\f0f5\";\n$fa-var-dashboard: \"\\f0e4\";\n$fa-var-dashcube: \"\\f210\";\n$fa-var-database: \"\\f1c0\";\n$fa-var-dedent: \"\\f03b\";\n$fa-var-delicious: \"\\f1a5\";\n$fa-var-desktop: \"\\f108\";\n$fa-var-deviantart: \"\\f1bd\";\n$fa-var-diamond: \"\\f219\";\n$fa-var-digg: \"\\f1a6\";\n$fa-var-dollar: \"\\f155\";\n$fa-var-dot-circle-o: \"\\f192\";\n$fa-var-download: \"\\f019\";\n$fa-var-dribbble: \"\\f17d\";\n$fa-var-dropbox: \"\\f16b\";\n$fa-var-drupal: \"\\f1a9\";\n$fa-var-edit: \"\\f044\";\n$fa-var-eject: \"\\f052\";\n$fa-var-ellipsis-h: \"\\f141\";\n$fa-var-ellipsis-v: \"\\f142\";\n$fa-var-empire: \"\\f1d1\";\n$fa-var-envelope: \"\\f0e0\";\n$fa-var-envelope-o: \"\\f003\";\n$fa-var-envelope-square: \"\\f199\";\n$fa-var-eraser: \"\\f12d\";\n$fa-var-eur: \"\\f153\";\n$fa-var-euro: \"\\f153\";\n$fa-var-exchange: \"\\f0ec\";\n$fa-var-exclamation: \"\\f12a\";\n$fa-var-exclamation-circle: \"\\f06a\";\n$fa-var-exclamation-triangle: \"\\f071\";\n$fa-var-expand: \"\\f065\";\n$fa-var-external-link: \"\\f08e\";\n$fa-var-external-link-square: \"\\f14c\";\n$fa-var-eye: \"\\f06e\";\n$fa-var-eye-slash: \"\\f070\";\n$fa-var-eyedropper: \"\\f1fb\";\n$fa-var-facebook: \"\\f09a\";\n$fa-var-facebook-f: \"\\f09a\";\n$fa-var-facebook-official: \"\\f230\";\n$fa-var-facebook-square: \"\\f082\";\n$fa-var-fast-backward: \"\\f049\";\n$fa-var-fast-forward: \"\\f050\";\n$fa-var-fax: \"\\f1ac\";\n$fa-var-female: \"\\f182\";\n$fa-var-fighter-jet: \"\\f0fb\";\n$fa-var-file: \"\\f15b\";\n$fa-var-file-archive-o: \"\\f1c6\";\n$fa-var-file-audio-o: \"\\f1c7\";\n$fa-var-file-code-o: \"\\f1c9\";\n$fa-var-file-excel-o: \"\\f1c3\";\n$fa-var-file-image-o: \"\\f1c5\";\n$fa-var-file-movie-o: \"\\f1c8\";\n$fa-var-file-o: \"\\f016\";\n$fa-var-file-pdf-o: \"\\f1c1\";\n$fa-var-file-photo-o: \"\\f1c5\";\n$fa-var-file-picture-o: \"\\f1c5\";\n$fa-var-file-powerpoint-o: \"\\f1c4\";\n$fa-var-file-sound-o: \"\\f1c7\";\n$fa-var-file-text: \"\\f15c\";\n$fa-var-file-text-o: \"\\f0f6\";\n$fa-var-file-video-o: \"\\f1c8\";\n$fa-var-file-word-o: \"\\f1c2\";\n$fa-var-file-zip-o: \"\\f1c6\";\n$fa-var-files-o: \"\\f0c5\";\n$fa-var-film: \"\\f008\";\n$fa-var-filter: \"\\f0b0\";\n$fa-var-fire: \"\\f06d\";\n$fa-var-fire-extinguisher: \"\\f134\";\n$fa-var-flag: \"\\f024\";\n$fa-var-flag-checkered: \"\\f11e\";\n$fa-var-flag-o: \"\\f11d\";\n$fa-var-flash: \"\\f0e7\";\n$fa-var-flask: \"\\f0c3\";\n$fa-var-flickr: \"\\f16e\";\n$fa-var-floppy-o: \"\\f0c7\";\n$fa-var-folder: \"\\f07b\";\n$fa-var-folder-o: \"\\f114\";\n$fa-var-folder-open: \"\\f07c\";\n$fa-var-folder-open-o: \"\\f115\";\n$fa-var-font: \"\\f031\";\n$fa-var-forumbee: \"\\f211\";\n$fa-var-forward: \"\\f04e\";\n$fa-var-foursquare: \"\\f180\";\n$fa-var-frown-o: \"\\f119\";\n$fa-var-futbol-o: \"\\f1e3\";\n$fa-var-gamepad: \"\\f11b\";\n$fa-var-gavel: \"\\f0e3\";\n$fa-var-gbp: \"\\f154\";\n$fa-var-ge: \"\\f1d1\";\n$fa-var-gear: \"\\f013\";\n$fa-var-gears: \"\\f085\";\n$fa-var-genderless: \"\\f1db\";\n$fa-var-gift: \"\\f06b\";\n$fa-var-git: \"\\f1d3\";\n$fa-var-git-square: \"\\f1d2\";\n$fa-var-github: \"\\f09b\";\n$fa-var-github-alt: \"\\f113\";\n$fa-var-github-square: \"\\f092\";\n$fa-var-gittip: \"\\f184\";\n$fa-var-glass: \"\\f000\";\n$fa-var-globe: \"\\f0ac\";\n$fa-var-google: \"\\f1a0\";\n$fa-var-google-plus: \"\\f0d5\";\n$fa-var-google-plus-square: \"\\f0d4\";\n$fa-var-google-wallet: \"\\f1ee\";\n$fa-var-graduation-cap: \"\\f19d\";\n$fa-var-gratipay: \"\\f184\";\n$fa-var-group: \"\\f0c0\";\n$fa-var-h-square: \"\\f0fd\";\n$fa-var-hacker-news: \"\\f1d4\";\n$fa-var-hand-o-down: \"\\f0a7\";\n$fa-var-hand-o-left: \"\\f0a5\";\n$fa-var-hand-o-right: \"\\f0a4\";\n$fa-var-hand-o-up: \"\\f0a6\";\n$fa-var-hdd-o: \"\\f0a0\";\n$fa-var-header: \"\\f1dc\";\n$fa-var-headphones: \"\\f025\";\n$fa-var-heart: \"\\f004\";\n$fa-var-heart-o: \"\\f08a\";\n$fa-var-heartbeat: \"\\f21e\";\n$fa-var-history: \"\\f1da\";\n$fa-var-home: \"\\f015\";\n$fa-var-hospital-o: \"\\f0f8\";\n$fa-var-hotel: \"\\f236\";\n$fa-var-html5: \"\\f13b\";\n$fa-var-ils: \"\\f20b\";\n$fa-var-image: \"\\f03e\";\n$fa-var-inbox: \"\\f01c\";\n$fa-var-indent: \"\\f03c\";\n$fa-var-info: \"\\f129\";\n$fa-var-info-circle: \"\\f05a\";\n$fa-var-inr: \"\\f156\";\n$fa-var-instagram: \"\\f16d\";\n$fa-var-institution: \"\\f19c\";\n$fa-var-ioxhost: \"\\f208\";\n$fa-var-italic: \"\\f033\";\n$fa-var-joomla: \"\\f1aa\";\n$fa-var-jpy: \"\\f157\";\n$fa-var-jsfiddle: \"\\f1cc\";\n$fa-var-key: \"\\f084\";\n$fa-var-keyboard-o: \"\\f11c\";\n$fa-var-krw: \"\\f159\";\n$fa-var-language: \"\\f1ab\";\n$fa-var-laptop: \"\\f109\";\n$fa-var-lastfm: \"\\f202\";\n$fa-var-lastfm-square: \"\\f203\";\n$fa-var-leaf: \"\\f06c\";\n$fa-var-leanpub: \"\\f212\";\n$fa-var-legal: \"\\f0e3\";\n$fa-var-lemon-o: \"\\f094\";\n$fa-var-level-down: \"\\f149\";\n$fa-var-level-up: \"\\f148\";\n$fa-var-life-bouy: \"\\f1cd\";\n$fa-var-life-buoy: \"\\f1cd\";\n$fa-var-life-ring: \"\\f1cd\";\n$fa-var-life-saver: \"\\f1cd\";\n$fa-var-lightbulb-o: \"\\f0eb\";\n$fa-var-line-chart: \"\\f201\";\n$fa-var-link: \"\\f0c1\";\n$fa-var-linkedin: \"\\f0e1\";\n$fa-var-linkedin-square: \"\\f08c\";\n$fa-var-linux: \"\\f17c\";\n$fa-var-list: \"\\f03a\";\n$fa-var-list-alt: \"\\f022\";\n$fa-var-list-ol: \"\\f0cb\";\n$fa-var-list-ul: \"\\f0ca\";\n$fa-var-location-arrow: \"\\f124\";\n$fa-var-lock: \"\\f023\";\n$fa-var-long-arrow-down: \"\\f175\";\n$fa-var-long-arrow-left: \"\\f177\";\n$fa-var-long-arrow-right: \"\\f178\";\n$fa-var-long-arrow-up: \"\\f176\";\n$fa-var-magic: \"\\f0d0\";\n$fa-var-magnet: \"\\f076\";\n$fa-var-mail-forward: \"\\f064\";\n$fa-var-mail-reply: \"\\f112\";\n$fa-var-mail-reply-all: \"\\f122\";\n$fa-var-male: \"\\f183\";\n$fa-var-map-marker: \"\\f041\";\n$fa-var-mars: \"\\f222\";\n$fa-var-mars-double: \"\\f227\";\n$fa-var-mars-stroke: \"\\f229\";\n$fa-var-mars-stroke-h: \"\\f22b\";\n$fa-var-mars-stroke-v: \"\\f22a\";\n$fa-var-maxcdn: \"\\f136\";\n$fa-var-meanpath: \"\\f20c\";\n$fa-var-medium: \"\\f23a\";\n$fa-var-medkit: \"\\f0fa\";\n$fa-var-meh-o: \"\\f11a\";\n$fa-var-mercury: \"\\f223\";\n$fa-var-microphone: \"\\f130\";\n$fa-var-microphone-slash: \"\\f131\";\n$fa-var-minus: \"\\f068\";\n$fa-var-minus-circle: \"\\f056\";\n$fa-var-minus-square: \"\\f146\";\n$fa-var-minus-square-o: \"\\f147\";\n$fa-var-mobile: \"\\f10b\";\n$fa-var-mobile-phone: \"\\f10b\";\n$fa-var-money: \"\\f0d6\";\n$fa-var-moon-o: \"\\f186\";\n$fa-var-mortar-board: \"\\f19d\";\n$fa-var-motorcycle: \"\\f21c\";\n$fa-var-music: \"\\f001\";\n$fa-var-navicon: \"\\f0c9\";\n$fa-var-neuter: \"\\f22c\";\n$fa-var-newspaper-o: \"\\f1ea\";\n$fa-var-openid: \"\\f19b\";\n$fa-var-outdent: \"\\f03b\";\n$fa-var-pagelines: \"\\f18c\";\n$fa-var-paint-brush: \"\\f1fc\";\n$fa-var-paper-plane: \"\\f1d8\";\n$fa-var-paper-plane-o: \"\\f1d9\";\n$fa-var-paperclip: \"\\f0c6\";\n$fa-var-paragraph: \"\\f1dd\";\n$fa-var-paste: \"\\f0ea\";\n$fa-var-pause: \"\\f04c\";\n$fa-var-paw: \"\\f1b0\";\n$fa-var-paypal: \"\\f1ed\";\n$fa-var-pencil: \"\\f040\";\n$fa-var-pencil-square: \"\\f14b\";\n$fa-var-pencil-square-o: \"\\f044\";\n$fa-var-phone: \"\\f095\";\n$fa-var-phone-square: \"\\f098\";\n$fa-var-photo: \"\\f03e\";\n$fa-var-picture-o: \"\\f03e\";\n$fa-var-pie-chart: \"\\f200\";\n$fa-var-pied-piper: \"\\f1a7\";\n$fa-var-pied-piper-alt: \"\\f1a8\";\n$fa-var-pinterest: \"\\f0d2\";\n$fa-var-pinterest-p: \"\\f231\";\n$fa-var-pinterest-square: \"\\f0d3\";\n$fa-var-plane: \"\\f072\";\n$fa-var-play: \"\\f04b\";\n$fa-var-play-circle: \"\\f144\";\n$fa-var-play-circle-o: \"\\f01d\";\n$fa-var-plug: \"\\f1e6\";\n$fa-var-plus: \"\\f067\";\n$fa-var-plus-circle: \"\\f055\";\n$fa-var-plus-square: \"\\f0fe\";\n$fa-var-plus-square-o: \"\\f196\";\n$fa-var-power-off: \"\\f011\";\n$fa-var-print: \"\\f02f\";\n$fa-var-puzzle-piece: \"\\f12e\";\n$fa-var-qq: \"\\f1d6\";\n$fa-var-qrcode: \"\\f029\";\n$fa-var-question: \"\\f128\";\n$fa-var-question-circle: \"\\f059\";\n$fa-var-quote-left: \"\\f10d\";\n$fa-var-quote-right: \"\\f10e\";\n$fa-var-ra: \"\\f1d0\";\n$fa-var-random: \"\\f074\";\n$fa-var-rebel: \"\\f1d0\";\n$fa-var-recycle: \"\\f1b8\";\n$fa-var-reddit: \"\\f1a1\";\n$fa-var-reddit-square: \"\\f1a2\";\n$fa-var-refresh: \"\\f021\";\n$fa-var-remove: \"\\f00d\";\n$fa-var-renren: \"\\f18b\";\n$fa-var-reorder: \"\\f0c9\";\n$fa-var-repeat: \"\\f01e\";\n$fa-var-reply: \"\\f112\";\n$fa-var-reply-all: \"\\f122\";\n$fa-var-retweet: \"\\f079\";\n$fa-var-rmb: \"\\f157\";\n$fa-var-road: \"\\f018\";\n$fa-var-rocket: \"\\f135\";\n$fa-var-rotate-left: \"\\f0e2\";\n$fa-var-rotate-right: \"\\f01e\";\n$fa-var-rouble: \"\\f158\";\n$fa-var-rss: \"\\f09e\";\n$fa-var-rss-square: \"\\f143\";\n$fa-var-rub: \"\\f158\";\n$fa-var-ruble: \"\\f158\";\n$fa-var-rupee: \"\\f156\";\n$fa-var-save: \"\\f0c7\";\n$fa-var-scissors: \"\\f0c4\";\n$fa-var-search: \"\\f002\";\n$fa-var-search-minus: \"\\f010\";\n$fa-var-search-plus: \"\\f00e\";\n$fa-var-sellsy: \"\\f213\";\n$fa-var-send: \"\\f1d8\";\n$fa-var-send-o: \"\\f1d9\";\n$fa-var-server: \"\\f233\";\n$fa-var-share: \"\\f064\";\n$fa-var-share-alt: \"\\f1e0\";\n$fa-var-share-alt-square: \"\\f1e1\";\n$fa-var-share-square: \"\\f14d\";\n$fa-var-share-square-o: \"\\f045\";\n$fa-var-shekel: \"\\f20b\";\n$fa-var-sheqel: \"\\f20b\";\n$fa-var-shield: \"\\f132\";\n$fa-var-ship: \"\\f21a\";\n$fa-var-shirtsinbulk: \"\\f214\";\n$fa-var-shopping-cart: \"\\f07a\";\n$fa-var-sign-in: \"\\f090\";\n$fa-var-sign-out: \"\\f08b\";\n$fa-var-signal: \"\\f012\";\n$fa-var-simplybuilt: \"\\f215\";\n$fa-var-sitemap: \"\\f0e8\";\n$fa-var-skyatlas: \"\\f216\";\n$fa-var-skype: \"\\f17e\";\n$fa-var-slack: \"\\f198\";\n$fa-var-sliders: \"\\f1de\";\n$fa-var-slideshare: \"\\f1e7\";\n$fa-var-smile-o: \"\\f118\";\n$fa-var-soccer-ball-o: \"\\f1e3\";\n$fa-var-sort: \"\\f0dc\";\n$fa-var-sort-alpha-asc: \"\\f15d\";\n$fa-var-sort-alpha-desc: \"\\f15e\";\n$fa-var-sort-amount-asc: \"\\f160\";\n$fa-var-sort-amount-desc: \"\\f161\";\n$fa-var-sort-asc: \"\\f0de\";\n$fa-var-sort-desc: \"\\f0dd\";\n$fa-var-sort-down: \"\\f0dd\";\n$fa-var-sort-numeric-asc: \"\\f162\";\n$fa-var-sort-numeric-desc: \"\\f163\";\n$fa-var-sort-up: \"\\f0de\";\n$fa-var-soundcloud: \"\\f1be\";\n$fa-var-space-shuttle: \"\\f197\";\n$fa-var-spinner: \"\\f110\";\n$fa-var-spoon: \"\\f1b1\";\n$fa-var-spotify: \"\\f1bc\";\n$fa-var-square: \"\\f0c8\";\n$fa-var-square-o: \"\\f096\";\n$fa-var-stack-exchange: \"\\f18d\";\n$fa-var-stack-overflow: \"\\f16c\";\n$fa-var-star: \"\\f005\";\n$fa-var-star-half: \"\\f089\";\n$fa-var-star-half-empty: \"\\f123\";\n$fa-var-star-half-full: \"\\f123\";\n$fa-var-star-half-o: \"\\f123\";\n$fa-var-star-o: \"\\f006\";\n$fa-var-steam: \"\\f1b6\";\n$fa-var-steam-square: \"\\f1b7\";\n$fa-var-step-backward: \"\\f048\";\n$fa-var-step-forward: \"\\f051\";\n$fa-var-stethoscope: \"\\f0f1\";\n$fa-var-stop: \"\\f04d\";\n$fa-var-street-view: \"\\f21d\";\n$fa-var-strikethrough: \"\\f0cc\";\n$fa-var-stumbleupon: \"\\f1a4\";\n$fa-var-stumbleupon-circle: \"\\f1a3\";\n$fa-var-subscript: \"\\f12c\";\n$fa-var-subway: \"\\f239\";\n$fa-var-suitcase: \"\\f0f2\";\n$fa-var-sun-o: \"\\f185\";\n$fa-var-superscript: \"\\f12b\";\n$fa-var-support: \"\\f1cd\";\n$fa-var-table: \"\\f0ce\";\n$fa-var-tablet: \"\\f10a\";\n$fa-var-tachometer: \"\\f0e4\";\n$fa-var-tag: \"\\f02b\";\n$fa-var-tags: \"\\f02c\";\n$fa-var-tasks: \"\\f0ae\";\n$fa-var-taxi: \"\\f1ba\";\n$fa-var-tencent-weibo: \"\\f1d5\";\n$fa-var-terminal: \"\\f120\";\n$fa-var-text-height: \"\\f034\";\n$fa-var-text-width: \"\\f035\";\n$fa-var-th: \"\\f00a\";\n$fa-var-th-large: \"\\f009\";\n$fa-var-th-list: \"\\f00b\";\n$fa-var-thumb-tack: \"\\f08d\";\n$fa-var-thumbs-down: \"\\f165\";\n$fa-var-thumbs-o-down: \"\\f088\";\n$fa-var-thumbs-o-up: \"\\f087\";\n$fa-var-thumbs-up: \"\\f164\";\n$fa-var-ticket: \"\\f145\";\n$fa-var-times: \"\\f00d\";\n$fa-var-times-circle: \"\\f057\";\n$fa-var-times-circle-o: \"\\f05c\";\n$fa-var-tint: \"\\f043\";\n$fa-var-toggle-down: \"\\f150\";\n$fa-var-toggle-left: \"\\f191\";\n$fa-var-toggle-off: \"\\f204\";\n$fa-var-toggle-on: \"\\f205\";\n$fa-var-toggle-right: \"\\f152\";\n$fa-var-toggle-up: \"\\f151\";\n$fa-var-train: \"\\f238\";\n$fa-var-transgender: \"\\f224\";\n$fa-var-transgender-alt: \"\\f225\";\n$fa-var-trash: \"\\f1f8\";\n$fa-var-trash-o: \"\\f014\";\n$fa-var-tree: \"\\f1bb\";\n$fa-var-trello: \"\\f181\";\n$fa-var-trophy: \"\\f091\";\n$fa-var-truck: \"\\f0d1\";\n$fa-var-try: \"\\f195\";\n$fa-var-tty: \"\\f1e4\";\n$fa-var-tumblr: \"\\f173\";\n$fa-var-tumblr-square: \"\\f174\";\n$fa-var-turkish-lira: \"\\f195\";\n$fa-var-twitch: \"\\f1e8\";\n$fa-var-twitter: \"\\f099\";\n$fa-var-twitter-square: \"\\f081\";\n$fa-var-umbrella: \"\\f0e9\";\n$fa-var-underline: \"\\f0cd\";\n$fa-var-undo: \"\\f0e2\";\n$fa-var-university: \"\\f19c\";\n$fa-var-unlink: \"\\f127\";\n$fa-var-unlock: \"\\f09c\";\n$fa-var-unlock-alt: \"\\f13e\";\n$fa-var-unsorted: \"\\f0dc\";\n$fa-var-upload: \"\\f093\";\n$fa-var-usd: \"\\f155\";\n$fa-var-user: \"\\f007\";\n$fa-var-user-md: \"\\f0f0\";\n$fa-var-user-plus: \"\\f234\";\n$fa-var-user-secret: \"\\f21b\";\n$fa-var-user-times: \"\\f235\";\n$fa-var-users: \"\\f0c0\";\n$fa-var-venus: \"\\f221\";\n$fa-var-venus-double: \"\\f226\";\n$fa-var-venus-mars: \"\\f228\";\n$fa-var-viacoin: \"\\f237\";\n$fa-var-video-camera: \"\\f03d\";\n$fa-var-vimeo-square: \"\\f194\";\n$fa-var-vine: \"\\f1ca\";\n$fa-var-vk: \"\\f189\";\n$fa-var-volume-down: \"\\f027\";\n$fa-var-volume-off: \"\\f026\";\n$fa-var-volume-up: \"\\f028\";\n$fa-var-warning: \"\\f071\";\n$fa-var-wechat: \"\\f1d7\";\n$fa-var-weibo: \"\\f18a\";\n$fa-var-weixin: \"\\f1d7\";\n$fa-var-whatsapp: \"\\f232\";\n$fa-var-wheelchair: \"\\f193\";\n$fa-var-wifi: \"\\f1eb\";\n$fa-var-windows: \"\\f17a\";\n$fa-var-won: \"\\f159\";\n$fa-var-wordpress: \"\\f19a\";\n$fa-var-wrench: \"\\f0ad\";\n$fa-var-xing: \"\\f168\";\n$fa-var-xing-square: \"\\f169\";\n$fa-var-yahoo: \"\\f19e\";\n$fa-var-yelp: \"\\f1e9\";\n$fa-var-yen: \"\\f157\";\n$fa-var-youtube: \"\\f167\";\n$fa-var-youtube-play: \"\\f16a\";\n$fa-var-youtube-square: \"\\f166\";\n\n"
  },
  {
    "path": "client/less/lib/font-awesome-4.3.0/scss/font-awesome.scss",
    "content": "/*!\n *  Font Awesome 4.3.0 by @davegandy - http://fontawesome.io - @fontawesome\n *  License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License)\n */\n\n@import \"variables\";\n@import \"mixins\";\n@import \"path\";\n@import \"core\";\n@import \"larger\";\n@import \"fixed-width\";\n@import \"list\";\n@import \"bordered-pulled\";\n@import \"animated\";\n@import \"rotated-flipped\";\n@import \"stacked\";\n@import \"icons\";\n"
  },
  {
    "path": "client/less/lib/ionicons/_ionicons-animation.less",
    "content": "// Animation Icons\n// --------------------------\n\n.spin() {\n  -webkit-animation: spin 1s infinite linear;\n  -moz-animation: spin 1s infinite linear;\n  -o-animation: spin 1s infinite linear;\n  animation: spin 1s infinite linear;\n}\n\n.@{ionicons-prefix}loading-a,\n.@{ionicons-prefix}loading-b,\n.@{ionicons-prefix}loading-c,\n.@{ionicons-prefix}loading-d,\n.@{ionicons-prefix}looping,\n.@{ionicons-prefix}refreshing,\n.@{ionicons-prefix}ios7-reloading {\n  &:extend(.ion);\n}\n\n.@{ionicons-prefix}spin,\n.@{ionicons-prefix}loading-a,\n.@{ionicons-prefix}loading-b,\n.@{ionicons-prefix}loading-c,\n.@{ionicons-prefix}loading-d,\n.@{ionicons-prefix}looping,\n.@{ionicons-prefix}refreshing,\n.@{ionicons-prefix}ios7-reloading {\n  .spin()\n}\n\n@-moz-keyframes spin {\n  0% { -moz-transform: rotate(0deg); }\n  100% { -moz-transform: rotate(359deg); }\n}\n@-webkit-keyframes spin {\n  0% { -webkit-transform: rotate(0deg); }\n  100% { -webkit-transform: rotate(359deg); }\n}\n@-o-keyframes spin {\n  0% { -o-transform: rotate(0deg); }\n  100% { -o-transform: rotate(359deg); }\n}\n@-ms-keyframes spin {\n  0% { -ms-transform: rotate(0deg); }\n  100% { -ms-transform: rotate(359deg); }\n}\n@keyframes spin {\n  0% { transform: rotate(0deg); }\n  100% { transform: rotate(359deg); }\n}\n\n.@{ionicons-prefix}loading-a {\n  -webkit-animation-timing-function: steps(8, start);\n  -moz-animation-timing-function: steps(8, start);\n  animation-timing-function: steps(8, start);\n}\n\n.@{ionicons-prefix}loading-a:before { \n  &:extend(.@{ionicons-prefix}load-a:before);\n}\n\n.@{ionicons-prefix}loading-b:before { \n  &:extend(.@{ionicons-prefix}load-b:before);\n}\n\n.@{ionicons-prefix}loading-c:before { \n  &:extend(.@{ionicons-prefix}load-c:before);\n}\n\n.@{ionicons-prefix}loading-d:before { \n  &:extend(.@{ionicons-prefix}load-d:before);\n}\n\n.@{ionicons-prefix}looping:before { \n  &:extend(.@{ionicons-prefix}loop:before);\n}\n\n.@{ionicons-prefix}refreshing:before { \n  &:extend(.@{ionicons-prefix}refresh:before);\n}\n\n.@{ionicons-prefix}ios7-reloading:before { \n  &:extend(.@{ionicons-prefix}ios7-reload:before);\n}\n"
  },
  {
    "path": "client/less/lib/ionicons/_ionicons-font.less",
    "content": "// Ionicons Font Path\n// --------------------------\n\n@font-face {\n  font-family: @ionicons-font-family;\n  src:url(\"@{ionicons-font-path}/ionicons.eot?v=@{ionicons-version}\");\n  src:url(\"@{ionicons-font-path}/ionicons.eot?v=@{ionicons-version}#iefix\") format(\"embedded-opentype\"),\n  url(\"@{ionicons-font-path}/ionicons.ttf?v=@{ionicons-version}\") format(\"truetype\"),\n  url(\"@{ionicons-font-path}/ionicons.woff?v=@{ionicons-version}\") format(\"woff\"),\n  url(\"@{ionicons-font-path}/ionicons.svg?v=@{ionicons-version}#Ionicons\") format(\"svg\");\n  font-weight: normal;\n  font-style: normal;\n}\n\n.ion {\n  display: inline-block;\n  font-family: @ionicons-font-family;\n  speak: none;\n  font-style: normal;\n  font-weight: normal;\n  font-variant: normal;\n  text-transform: none;\n  text-rendering: auto;\n  line-height: 1;\n  -webkit-font-smoothing: antialiased;\n  -moz-osx-font-smoothing: grayscale;\n}"
  },
  {
    "path": "client/less/lib/ionicons/_ionicons-icons.less",
    "content": "// Ionicons Icons\n// --------------------------\n\n.ionicons,\n.@{ionicons-prefix}alert:before,\n.@{ionicons-prefix}alert-circled:before,\n.@{ionicons-prefix}android-add:before,\n.@{ionicons-prefix}android-add-circle:before,\n.@{ionicons-prefix}android-alarm-clock:before,\n.@{ionicons-prefix}android-alert:before,\n.@{ionicons-prefix}android-apps:before,\n.@{ionicons-prefix}android-archive:before,\n.@{ionicons-prefix}android-arrow-back:before,\n.@{ionicons-prefix}android-arrow-down:before,\n.@{ionicons-prefix}android-arrow-dropdown:before,\n.@{ionicons-prefix}android-arrow-dropdown-circle:before,\n.@{ionicons-prefix}android-arrow-dropleft:before,\n.@{ionicons-prefix}android-arrow-dropleft-circle:before,\n.@{ionicons-prefix}android-arrow-dropright:before,\n.@{ionicons-prefix}android-arrow-dropright-circle:before,\n.@{ionicons-prefix}android-arrow-dropup:before,\n.@{ionicons-prefix}android-arrow-dropup-circle:before,\n.@{ionicons-prefix}android-arrow-forward:before,\n.@{ionicons-prefix}android-arrow-up:before,\n.@{ionicons-prefix}android-attach:before,\n.@{ionicons-prefix}android-bar:before,\n.@{ionicons-prefix}android-bicycle:before,\n.@{ionicons-prefix}android-boat:before,\n.@{ionicons-prefix}android-bookmark:before,\n.@{ionicons-prefix}android-bulb:before,\n.@{ionicons-prefix}android-bus:before,\n.@{ionicons-prefix}android-calendar:before,\n.@{ionicons-prefix}android-call:before,\n.@{ionicons-prefix}android-camera:before,\n.@{ionicons-prefix}android-cancel:before,\n.@{ionicons-prefix}android-car:before,\n.@{ionicons-prefix}android-cart:before,\n.@{ionicons-prefix}android-chat:before,\n.@{ionicons-prefix}android-checkbox:before,\n.@{ionicons-prefix}android-checkbox-blank:before,\n.@{ionicons-prefix}android-checkbox-outline:before,\n.@{ionicons-prefix}android-checkbox-outline-blank:before,\n.@{ionicons-prefix}android-checkmark-circle:before,\n.@{ionicons-prefix}android-clipboard:before,\n.@{ionicons-prefix}android-close:before,\n.@{ionicons-prefix}android-cloud:before,\n.@{ionicons-prefix}android-cloud-circle:before,\n.@{ionicons-prefix}android-cloud-done:before,\n.@{ionicons-prefix}android-cloud-outline:before,\n.@{ionicons-prefix}android-color-palette:before,\n.@{ionicons-prefix}android-compass:before,\n.@{ionicons-prefix}android-contact:before,\n.@{ionicons-prefix}android-contacts:before,\n.@{ionicons-prefix}android-contract:before,\n.@{ionicons-prefix}android-create:before,\n.@{ionicons-prefix}android-delete:before,\n.@{ionicons-prefix}android-desktop:before,\n.@{ionicons-prefix}android-document:before,\n.@{ionicons-prefix}android-done:before,\n.@{ionicons-prefix}android-done-all:before,\n.@{ionicons-prefix}android-download:before,\n.@{ionicons-prefix}android-drafts:before,\n.@{ionicons-prefix}android-exit:before,\n.@{ionicons-prefix}android-expand:before,\n.@{ionicons-prefix}android-favorite:before,\n.@{ionicons-prefix}android-favorite-outline:before,\n.@{ionicons-prefix}android-film:before,\n.@{ionicons-prefix}android-folder:before,\n.@{ionicons-prefix}android-folder-open:before,\n.@{ionicons-prefix}android-funnel:before,\n.@{ionicons-prefix}android-globe:before,\n.@{ionicons-prefix}android-hand:before,\n.@{ionicons-prefix}android-hangout:before,\n.@{ionicons-prefix}android-happy:before,\n.@{ionicons-prefix}android-home:before,\n.@{ionicons-prefix}android-image:before,\n.@{ionicons-prefix}android-laptop:before,\n.@{ionicons-prefix}android-list:before,\n.@{ionicons-prefix}android-locate:before,\n.@{ionicons-prefix}android-lock:before,\n.@{ionicons-prefix}android-mail:before,\n.@{ionicons-prefix}android-map:before,\n.@{ionicons-prefix}android-menu:before,\n.@{ionicons-prefix}android-microphone:before,\n.@{ionicons-prefix}android-microphone-off:before,\n.@{ionicons-prefix}android-more-horizontal:before,\n.@{ionicons-prefix}android-more-vertical:before,\n.@{ionicons-prefix}android-navigate:before,\n.@{ionicons-prefix}android-notifications:before,\n.@{ionicons-prefix}android-notifications-none:before,\n.@{ionicons-prefix}android-notifications-off:before,\n.@{ionicons-prefix}android-open:before,\n.@{ionicons-prefix}android-options:before,\n.@{ionicons-prefix}android-people:before,\n.@{ionicons-prefix}android-person:before,\n.@{ionicons-prefix}android-person-add:before,\n.@{ionicons-prefix}android-phone-landscape:before,\n.@{ionicons-prefix}android-phone-portrait:before,\n.@{ionicons-prefix}android-pin:before,\n.@{ionicons-prefix}android-plane:before,\n.@{ionicons-prefix}android-playstore:before,\n.@{ionicons-prefix}android-print:before,\n.@{ionicons-prefix}android-radio-button-off:before,\n.@{ionicons-prefix}android-radio-button-on:before,\n.@{ionicons-prefix}android-refresh:before,\n.@{ionicons-prefix}android-remove:before,\n.@{ionicons-prefix}android-remove-circle:before,\n.@{ionicons-prefix}android-restaurant:before,\n.@{ionicons-prefix}android-sad:before,\n.@{ionicons-prefix}android-search:before,\n.@{ionicons-prefix}android-send:before,\n.@{ionicons-prefix}android-settings:before,\n.@{ionicons-prefix}android-share:before,\n.@{ionicons-prefix}android-share-alt:before,\n.@{ionicons-prefix}android-star:before,\n.@{ionicons-prefix}android-star-half:before,\n.@{ionicons-prefix}android-star-outline:before,\n.@{ionicons-prefix}android-stopwatch:before,\n.@{ionicons-prefix}android-subway:before,\n.@{ionicons-prefix}android-sunny:before,\n.@{ionicons-prefix}android-sync:before,\n.@{ionicons-prefix}android-textsms:before,\n.@{ionicons-prefix}android-time:before,\n.@{ionicons-prefix}android-train:before,\n.@{ionicons-prefix}android-unlock:before,\n.@{ionicons-prefix}android-upload:before,\n.@{ionicons-prefix}android-volume-down:before,\n.@{ionicons-prefix}android-volume-mute:before,\n.@{ionicons-prefix}android-volume-off:before,\n.@{ionicons-prefix}android-volume-up:before,\n.@{ionicons-prefix}android-walk:before,\n.@{ionicons-prefix}android-warning:before,\n.@{ionicons-prefix}android-watch:before,\n.@{ionicons-prefix}android-wifi:before,\n.@{ionicons-prefix}aperture:before,\n.@{ionicons-prefix}archive:before,\n.@{ionicons-prefix}arrow-down-a:before,\n.@{ionicons-prefix}arrow-down-b:before,\n.@{ionicons-prefix}arrow-down-c:before,\n.@{ionicons-prefix}arrow-expand:before,\n.@{ionicons-prefix}arrow-graph-down-left:before,\n.@{ionicons-prefix}arrow-graph-down-right:before,\n.@{ionicons-prefix}arrow-graph-up-left:before,\n.@{ionicons-prefix}arrow-graph-up-right:before,\n.@{ionicons-prefix}arrow-left-a:before,\n.@{ionicons-prefix}arrow-left-b:before,\n.@{ionicons-prefix}arrow-left-c:before,\n.@{ionicons-prefix}arrow-move:before,\n.@{ionicons-prefix}arrow-resize:before,\n.@{ionicons-prefix}arrow-return-left:before,\n.@{ionicons-prefix}arrow-return-right:before,\n.@{ionicons-prefix}arrow-right-a:before,\n.@{ionicons-prefix}arrow-right-b:before,\n.@{ionicons-prefix}arrow-right-c:before,\n.@{ionicons-prefix}arrow-shrink:before,\n.@{ionicons-prefix}arrow-swap:before,\n.@{ionicons-prefix}arrow-up-a:before,\n.@{ionicons-prefix}arrow-up-b:before,\n.@{ionicons-prefix}arrow-up-c:before,\n.@{ionicons-prefix}asterisk:before,\n.@{ionicons-prefix}at:before,\n.@{ionicons-prefix}backspace:before,\n.@{ionicons-prefix}backspace-outline:before,\n.@{ionicons-prefix}bag:before,\n.@{ionicons-prefix}battery-charging:before,\n.@{ionicons-prefix}battery-empty:before,\n.@{ionicons-prefix}battery-full:before,\n.@{ionicons-prefix}battery-half:before,\n.@{ionicons-prefix}battery-low:before,\n.@{ionicons-prefix}beaker:before,\n.@{ionicons-prefix}beer:before,\n.@{ionicons-prefix}bluetooth:before,\n.@{ionicons-prefix}bonfire:before,\n.@{ionicons-prefix}bookmark:before,\n.@{ionicons-prefix}bowtie:before,\n.@{ionicons-prefix}briefcase:before,\n.@{ionicons-prefix}bug:before,\n.@{ionicons-prefix}calculator:before,\n.@{ionicons-prefix}calendar:before,\n.@{ionicons-prefix}camera:before,\n.@{ionicons-prefix}card:before,\n.@{ionicons-prefix}cash:before,\n.@{ionicons-prefix}chatbox:before,\n.@{ionicons-prefix}chatbox-working:before,\n.@{ionicons-prefix}chatboxes:before,\n.@{ionicons-prefix}chatbubble:before,\n.@{ionicons-prefix}chatbubble-working:before,\n.@{ionicons-prefix}chatbubbles:before,\n.@{ionicons-prefix}checkmark:before,\n.@{ionicons-prefix}checkmark-circled:before,\n.@{ionicons-prefix}checkmark-round:before,\n.@{ionicons-prefix}chevron-down:before,\n.@{ionicons-prefix}chevron-left:before,\n.@{ionicons-prefix}chevron-right:before,\n.@{ionicons-prefix}chevron-up:before,\n.@{ionicons-prefix}clipboard:before,\n.@{ionicons-prefix}clock:before,\n.@{ionicons-prefix}close:before,\n.@{ionicons-prefix}close-circled:before,\n.@{ionicons-prefix}close-round:before,\n.@{ionicons-prefix}closed-captioning:before,\n.@{ionicons-prefix}cloud:before,\n.@{ionicons-prefix}code:before,\n.@{ionicons-prefix}code-download:before,\n.@{ionicons-prefix}code-working:before,\n.@{ionicons-prefix}coffee:before,\n.@{ionicons-prefix}compass:before,\n.@{ionicons-prefix}compose:before,\n.@{ionicons-prefix}connection-bars:before,\n.@{ionicons-prefix}contrast:before,\n.@{ionicons-prefix}crop:before,\n.@{ionicons-prefix}cube:before,\n.@{ionicons-prefix}disc:before,\n.@{ionicons-prefix}document:before,\n.@{ionicons-prefix}document-text:before,\n.@{ionicons-prefix}drag:before,\n.@{ionicons-prefix}earth:before,\n.@{ionicons-prefix}easel:before,\n.@{ionicons-prefix}edit:before,\n.@{ionicons-prefix}egg:before,\n.@{ionicons-prefix}eject:before,\n.@{ionicons-prefix}email:before,\n.@{ionicons-prefix}email-unread:before,\n.@{ionicons-prefix}erlenmeyer-flask:before,\n.@{ionicons-prefix}erlenmeyer-flask-bubbles:before,\n.@{ionicons-prefix}eye:before,\n.@{ionicons-prefix}eye-disabled:before,\n.@{ionicons-prefix}female:before,\n.@{ionicons-prefix}filing:before,\n.@{ionicons-prefix}film-marker:before,\n.@{ionicons-prefix}fireball:before,\n.@{ionicons-prefix}flag:before,\n.@{ionicons-prefix}flame:before,\n.@{ionicons-prefix}flash:before,\n.@{ionicons-prefix}flash-off:before,\n.@{ionicons-prefix}folder:before,\n.@{ionicons-prefix}fork:before,\n.@{ionicons-prefix}fork-repo:before,\n.@{ionicons-prefix}forward:before,\n.@{ionicons-prefix}funnel:before,\n.@{ionicons-prefix}gear-a:before,\n.@{ionicons-prefix}gear-b:before,\n.@{ionicons-prefix}grid:before,\n.@{ionicons-prefix}hammer:before,\n.@{ionicons-prefix}happy:before,\n.@{ionicons-prefix}happy-outline:before,\n.@{ionicons-prefix}headphone:before,\n.@{ionicons-prefix}heart:before,\n.@{ionicons-prefix}heart-broken:before,\n.@{ionicons-prefix}help:before,\n.@{ionicons-prefix}help-buoy:before,\n.@{ionicons-prefix}help-circled:before,\n.@{ionicons-prefix}home:before,\n.@{ionicons-prefix}icecream:before,\n.@{ionicons-prefix}image:before,\n.@{ionicons-prefix}images:before,\n.@{ionicons-prefix}information:before,\n.@{ionicons-prefix}information-circled:before,\n.@{ionicons-prefix}ionic:before,\n.@{ionicons-prefix}ios-alarm:before,\n.@{ionicons-prefix}ios-alarm-outline:before,\n.@{ionicons-prefix}ios-albums:before,\n.@{ionicons-prefix}ios-albums-outline:before,\n.@{ionicons-prefix}ios-americanfootball:before,\n.@{ionicons-prefix}ios-americanfootball-outline:before,\n.@{ionicons-prefix}ios-analytics:before,\n.@{ionicons-prefix}ios-analytics-outline:before,\n.@{ionicons-prefix}ios-arrow-back:before,\n.@{ionicons-prefix}ios-arrow-down:before,\n.@{ionicons-prefix}ios-arrow-forward:before,\n.@{ionicons-prefix}ios-arrow-left:before,\n.@{ionicons-prefix}ios-arrow-right:before,\n.@{ionicons-prefix}ios-arrow-thin-down:before,\n.@{ionicons-prefix}ios-arrow-thin-left:before,\n.@{ionicons-prefix}ios-arrow-thin-right:before,\n.@{ionicons-prefix}ios-arrow-thin-up:before,\n.@{ionicons-prefix}ios-arrow-up:before,\n.@{ionicons-prefix}ios-at:before,\n.@{ionicons-prefix}ios-at-outline:before,\n.@{ionicons-prefix}ios-barcode:before,\n.@{ionicons-prefix}ios-barcode-outline:before,\n.@{ionicons-prefix}ios-baseball:before,\n.@{ionicons-prefix}ios-baseball-outline:before,\n.@{ionicons-prefix}ios-basketball:before,\n.@{ionicons-prefix}ios-basketball-outline:before,\n.@{ionicons-prefix}ios-bell:before,\n.@{ionicons-prefix}ios-bell-outline:before,\n.@{ionicons-prefix}ios-body:before,\n.@{ionicons-prefix}ios-body-outline:before,\n.@{ionicons-prefix}ios-bolt:before,\n.@{ionicons-prefix}ios-bolt-outline:before,\n.@{ionicons-prefix}ios-book:before,\n.@{ionicons-prefix}ios-book-outline:before,\n.@{ionicons-prefix}ios-bookmarks:before,\n.@{ionicons-prefix}ios-bookmarks-outline:before,\n.@{ionicons-prefix}ios-box:before,\n.@{ionicons-prefix}ios-box-outline:before,\n.@{ionicons-prefix}ios-briefcase:before,\n.@{ionicons-prefix}ios-briefcase-outline:before,\n.@{ionicons-prefix}ios-browsers:before,\n.@{ionicons-prefix}ios-browsers-outline:before,\n.@{ionicons-prefix}ios-calculator:before,\n.@{ionicons-prefix}ios-calculator-outline:before,\n.@{ionicons-prefix}ios-calendar:before,\n.@{ionicons-prefix}ios-calendar-outline:before,\n.@{ionicons-prefix}ios-camera:before,\n.@{ionicons-prefix}ios-camera-outline:before,\n.@{ionicons-prefix}ios-cart:before,\n.@{ionicons-prefix}ios-cart-outline:before,\n.@{ionicons-prefix}ios-chatboxes:before,\n.@{ionicons-prefix}ios-chatboxes-outline:before,\n.@{ionicons-prefix}ios-chatbubble:before,\n.@{ionicons-prefix}ios-chatbubble-outline:before,\n.@{ionicons-prefix}ios-checkmark:before,\n.@{ionicons-prefix}ios-checkmark-empty:before,\n.@{ionicons-prefix}ios-checkmark-outline:before,\n.@{ionicons-prefix}ios-circle-filled:before,\n.@{ionicons-prefix}ios-circle-outline:before,\n.@{ionicons-prefix}ios-clock:before,\n.@{ionicons-prefix}ios-clock-outline:before,\n.@{ionicons-prefix}ios-close:before,\n.@{ionicons-prefix}ios-close-empty:before,\n.@{ionicons-prefix}ios-close-outline:before,\n.@{ionicons-prefix}ios-cloud:before,\n.@{ionicons-prefix}ios-cloud-download:before,\n.@{ionicons-prefix}ios-cloud-download-outline:before,\n.@{ionicons-prefix}ios-cloud-outline:before,\n.@{ionicons-prefix}ios-cloud-upload:before,\n.@{ionicons-prefix}ios-cloud-upload-outline:before,\n.@{ionicons-prefix}ios-cloudy:before,\n.@{ionicons-prefix}ios-cloudy-night:before,\n.@{ionicons-prefix}ios-cloudy-night-outline:before,\n.@{ionicons-prefix}ios-cloudy-outline:before,\n.@{ionicons-prefix}ios-cog:before,\n.@{ionicons-prefix}ios-cog-outline:before,\n.@{ionicons-prefix}ios-color-filter:before,\n.@{ionicons-prefix}ios-color-filter-outline:before,\n.@{ionicons-prefix}ios-color-wand:before,\n.@{ionicons-prefix}ios-color-wand-outline:before,\n.@{ionicons-prefix}ios-compose:before,\n.@{ionicons-prefix}ios-compose-outline:before,\n.@{ionicons-prefix}ios-contact:before,\n.@{ionicons-prefix}ios-contact-outline:before,\n.@{ionicons-prefix}ios-copy:before,\n.@{ionicons-prefix}ios-copy-outline:before,\n.@{ionicons-prefix}ios-crop:before,\n.@{ionicons-prefix}ios-crop-strong:before,\n.@{ionicons-prefix}ios-download:before,\n.@{ionicons-prefix}ios-download-outline:before,\n.@{ionicons-prefix}ios-drag:before,\n.@{ionicons-prefix}ios-email:before,\n.@{ionicons-prefix}ios-email-outline:before,\n.@{ionicons-prefix}ios-eye:before,\n.@{ionicons-prefix}ios-eye-outline:before,\n.@{ionicons-prefix}ios-fastforward:before,\n.@{ionicons-prefix}ios-fastforward-outline:before,\n.@{ionicons-prefix}ios-filing:before,\n.@{ionicons-prefix}ios-filing-outline:before,\n.@{ionicons-prefix}ios-film:before,\n.@{ionicons-prefix}ios-film-outline:before,\n.@{ionicons-prefix}ios-flag:before,\n.@{ionicons-prefix}ios-flag-outline:before,\n.@{ionicons-prefix}ios-flame:before,\n.@{ionicons-prefix}ios-flame-outline:before,\n.@{ionicons-prefix}ios-flask:before,\n.@{ionicons-prefix}ios-flask-outline:before,\n.@{ionicons-prefix}ios-flower:before,\n.@{ionicons-prefix}ios-flower-outline:before,\n.@{ionicons-prefix}ios-folder:before,\n.@{ionicons-prefix}ios-folder-outline:before,\n.@{ionicons-prefix}ios-football:before,\n.@{ionicons-prefix}ios-football-outline:before,\n.@{ionicons-prefix}ios-game-controller-a:before,\n.@{ionicons-prefix}ios-game-controller-a-outline:before,\n.@{ionicons-prefix}ios-game-controller-b:before,\n.@{ionicons-prefix}ios-game-controller-b-outline:before,\n.@{ionicons-prefix}ios-gear:before,\n.@{ionicons-prefix}ios-gear-outline:before,\n.@{ionicons-prefix}ios-glasses:before,\n.@{ionicons-prefix}ios-glasses-outline:before,\n.@{ionicons-prefix}ios-grid-view:before,\n.@{ionicons-prefix}ios-grid-view-outline:before,\n.@{ionicons-prefix}ios-heart:before,\n.@{ionicons-prefix}ios-heart-outline:before,\n.@{ionicons-prefix}ios-help:before,\n.@{ionicons-prefix}ios-help-empty:before,\n.@{ionicons-prefix}ios-help-outline:before,\n.@{ionicons-prefix}ios-home:before,\n.@{ionicons-prefix}ios-home-outline:before,\n.@{ionicons-prefix}ios-infinite:before,\n.@{ionicons-prefix}ios-infinite-outline:before,\n.@{ionicons-prefix}ios-information:before,\n.@{ionicons-prefix}ios-information-empty:before,\n.@{ionicons-prefix}ios-information-outline:before,\n.@{ionicons-prefix}ios-ionic-outline:before,\n.@{ionicons-prefix}ios-keypad:before,\n.@{ionicons-prefix}ios-keypad-outline:before,\n.@{ionicons-prefix}ios-lightbulb:before,\n.@{ionicons-prefix}ios-lightbulb-outline:before,\n.@{ionicons-prefix}ios-list:before,\n.@{ionicons-prefix}ios-list-outline:before,\n.@{ionicons-prefix}ios-location:before,\n.@{ionicons-prefix}ios-location-outline:before,\n.@{ionicons-prefix}ios-locked:before,\n.@{ionicons-prefix}ios-locked-outline:before,\n.@{ionicons-prefix}ios-loop:before,\n.@{ionicons-prefix}ios-loop-strong:before,\n.@{ionicons-prefix}ios-medical:before,\n.@{ionicons-prefix}ios-medical-outline:before,\n.@{ionicons-prefix}ios-medkit:before,\n.@{ionicons-prefix}ios-medkit-outline:before,\n.@{ionicons-prefix}ios-mic:before,\n.@{ionicons-prefix}ios-mic-off:before,\n.@{ionicons-prefix}ios-mic-outline:before,\n.@{ionicons-prefix}ios-minus:before,\n.@{ionicons-prefix}ios-minus-empty:before,\n.@{ionicons-prefix}ios-minus-outline:before,\n.@{ionicons-prefix}ios-monitor:before,\n.@{ionicons-prefix}ios-monitor-outline:before,\n.@{ionicons-prefix}ios-moon:before,\n.@{ionicons-prefix}ios-moon-outline:before,\n.@{ionicons-prefix}ios-more:before,\n.@{ionicons-prefix}ios-more-outline:before,\n.@{ionicons-prefix}ios-musical-note:before,\n.@{ionicons-prefix}ios-musical-notes:before,\n.@{ionicons-prefix}ios-navigate:before,\n.@{ionicons-prefix}ios-navigate-outline:before,\n.@{ionicons-prefix}ios-nutrition:before,\n.@{ionicons-prefix}ios-nutrition-outline:before,\n.@{ionicons-prefix}ios-paper:before,\n.@{ionicons-prefix}ios-paper-outline:before,\n.@{ionicons-prefix}ios-paperplane:before,\n.@{ionicons-prefix}ios-paperplane-outline:before,\n.@{ionicons-prefix}ios-partlysunny:before,\n.@{ionicons-prefix}ios-partlysunny-outline:before,\n.@{ionicons-prefix}ios-pause:before,\n.@{ionicons-prefix}ios-pause-outline:before,\n.@{ionicons-prefix}ios-paw:before,\n.@{ionicons-prefix}ios-paw-outline:before,\n.@{ionicons-prefix}ios-people:before,\n.@{ionicons-prefix}ios-people-outline:before,\n.@{ionicons-prefix}ios-person:before,\n.@{ionicons-prefix}ios-person-outline:before,\n.@{ionicons-prefix}ios-personadd:before,\n.@{ionicons-prefix}ios-personadd-outline:before,\n.@{ionicons-prefix}ios-photos:before,\n.@{ionicons-prefix}ios-photos-outline:before,\n.@{ionicons-prefix}ios-pie:before,\n.@{ionicons-prefix}ios-pie-outline:before,\n.@{ionicons-prefix}ios-pint:before,\n.@{ionicons-prefix}ios-pint-outline:before,\n.@{ionicons-prefix}ios-play:before,\n.@{ionicons-prefix}ios-play-outline:before,\n.@{ionicons-prefix}ios-plus:before,\n.@{ionicons-prefix}ios-plus-empty:before,\n.@{ionicons-prefix}ios-plus-outline:before,\n.@{ionicons-prefix}ios-pricetag:before,\n.@{ionicons-prefix}ios-pricetag-outline:before,\n.@{ionicons-prefix}ios-pricetags:before,\n.@{ionicons-prefix}ios-pricetags-outline:before,\n.@{ionicons-prefix}ios-printer:before,\n.@{ionicons-prefix}ios-printer-outline:before,\n.@{ionicons-prefix}ios-pulse:before,\n.@{ionicons-prefix}ios-pulse-strong:before,\n.@{ionicons-prefix}ios-rainy:before,\n.@{ionicons-prefix}ios-rainy-outline:before,\n.@{ionicons-prefix}ios-recording:before,\n.@{ionicons-prefix}ios-recording-outline:before,\n.@{ionicons-prefix}ios-redo:before,\n.@{ionicons-prefix}ios-redo-outline:before,\n.@{ionicons-prefix}ios-refresh:before,\n.@{ionicons-prefix}ios-refresh-empty:before,\n.@{ionicons-prefix}ios-refresh-outline:before,\n.@{ionicons-prefix}ios-reload:before,\n.@{ionicons-prefix}ios-reverse-camera:before,\n.@{ionicons-prefix}ios-reverse-camera-outline:before,\n.@{ionicons-prefix}ios-rewind:before,\n.@{ionicons-prefix}ios-rewind-outline:before,\n.@{ionicons-prefix}ios-rose:before,\n.@{ionicons-prefix}ios-rose-outline:before,\n.@{ionicons-prefix}ios-search:before,\n.@{ionicons-prefix}ios-search-strong:before,\n.@{ionicons-prefix}ios-settings:before,\n.@{ionicons-prefix}ios-settings-strong:before,\n.@{ionicons-prefix}ios-shuffle:before,\n.@{ionicons-prefix}ios-shuffle-strong:before,\n.@{ionicons-prefix}ios-skipbackward:before,\n.@{ionicons-prefix}ios-skipbackward-outline:before,\n.@{ionicons-prefix}ios-skipforward:before,\n.@{ionicons-prefix}ios-skipforward-outline:before,\n.@{ionicons-prefix}ios-snowy:before,\n.@{ionicons-prefix}ios-speedometer:before,\n.@{ionicons-prefix}ios-speedometer-outline:before,\n.@{ionicons-prefix}ios-star:before,\n.@{ionicons-prefix}ios-star-half:before,\n.@{ionicons-prefix}ios-star-outline:before,\n.@{ionicons-prefix}ios-stopwatch:before,\n.@{ionicons-prefix}ios-stopwatch-outline:before,\n.@{ionicons-prefix}ios-sunny:before,\n.@{ionicons-prefix}ios-sunny-outline:before,\n.@{ionicons-prefix}ios-telephone:before,\n.@{ionicons-prefix}ios-telephone-outline:before,\n.@{ionicons-prefix}ios-tennisball:before,\n.@{ionicons-prefix}ios-tennisball-outline:before,\n.@{ionicons-prefix}ios-thunderstorm:before,\n.@{ionicons-prefix}ios-thunderstorm-outline:before,\n.@{ionicons-prefix}ios-time:before,\n.@{ionicons-prefix}ios-time-outline:before,\n.@{ionicons-prefix}ios-timer:before,\n.@{ionicons-prefix}ios-timer-outline:before,\n.@{ionicons-prefix}ios-toggle:before,\n.@{ionicons-prefix}ios-toggle-outline:before,\n.@{ionicons-prefix}ios-trash:before,\n.@{ionicons-prefix}ios-trash-outline:before,\n.@{ionicons-prefix}ios-undo:before,\n.@{ionicons-prefix}ios-undo-outline:before,\n.@{ionicons-prefix}ios-unlocked:before,\n.@{ionicons-prefix}ios-unlocked-outline:before,\n.@{ionicons-prefix}ios-upload:before,\n.@{ionicons-prefix}ios-upload-outline:before,\n.@{ionicons-prefix}ios-videocam:before,\n.@{ionicons-prefix}ios-videocam-outline:before,\n.@{ionicons-prefix}ios-volume-high:before,\n.@{ionicons-prefix}ios-volume-low:before,\n.@{ionicons-prefix}ios-wineglass:before,\n.@{ionicons-prefix}ios-wineglass-outline:before,\n.@{ionicons-prefix}ios-world:before,\n.@{ionicons-prefix}ios-world-outline:before,\n.@{ionicons-prefix}ipad:before,\n.@{ionicons-prefix}iphone:before,\n.@{ionicons-prefix}ipod:before,\n.@{ionicons-prefix}jet:before,\n.@{ionicons-prefix}key:before,\n.@{ionicons-prefix}knife:before,\n.@{ionicons-prefix}laptop:before,\n.@{ionicons-prefix}leaf:before,\n.@{ionicons-prefix}levels:before,\n.@{ionicons-prefix}lightbulb:before,\n.@{ionicons-prefix}link:before,\n.@{ionicons-prefix}load-a:before,\n.@{ionicons-prefix}load-b:before,\n.@{ionicons-prefix}load-c:before,\n.@{ionicons-prefix}load-d:before,\n.@{ionicons-prefix}location:before,\n.@{ionicons-prefix}lock-combination:before,\n.@{ionicons-prefix}locked:before,\n.@{ionicons-prefix}log-in:before,\n.@{ionicons-prefix}log-out:before,\n.@{ionicons-prefix}loop:before,\n.@{ionicons-prefix}magnet:before,\n.@{ionicons-prefix}male:before,\n.@{ionicons-prefix}man:before,\n.@{ionicons-prefix}map:before,\n.@{ionicons-prefix}medkit:before,\n.@{ionicons-prefix}merge:before,\n.@{ionicons-prefix}mic-a:before,\n.@{ionicons-prefix}mic-b:before,\n.@{ionicons-prefix}mic-c:before,\n.@{ionicons-prefix}minus:before,\n.@{ionicons-prefix}minus-circled:before,\n.@{ionicons-prefix}minus-round:before,\n.@{ionicons-prefix}model-s:before,\n.@{ionicons-prefix}monitor:before,\n.@{ionicons-prefix}more:before,\n.@{ionicons-prefix}mouse:before,\n.@{ionicons-prefix}music-note:before,\n.@{ionicons-prefix}navicon:before,\n.@{ionicons-prefix}navicon-round:before,\n.@{ionicons-prefix}navigate:before,\n.@{ionicons-prefix}network:before,\n.@{ionicons-prefix}no-smoking:before,\n.@{ionicons-prefix}nuclear:before,\n.@{ionicons-prefix}outlet:before,\n.@{ionicons-prefix}paintbrush:before,\n.@{ionicons-prefix}paintbucket:before,\n.@{ionicons-prefix}paper-airplane:before,\n.@{ionicons-prefix}paperclip:before,\n.@{ionicons-prefix}pause:before,\n.@{ionicons-prefix}person:before,\n.@{ionicons-prefix}person-add:before,\n.@{ionicons-prefix}person-stalker:before,\n.@{ionicons-prefix}pie-graph:before,\n.@{ionicons-prefix}pin:before,\n.@{ionicons-prefix}pinpoint:before,\n.@{ionicons-prefix}pizza:before,\n.@{ionicons-prefix}plane:before,\n.@{ionicons-prefix}planet:before,\n.@{ionicons-prefix}play:before,\n.@{ionicons-prefix}playstation:before,\n.@{ionicons-prefix}plus:before,\n.@{ionicons-prefix}plus-circled:before,\n.@{ionicons-prefix}plus-round:before,\n.@{ionicons-prefix}podium:before,\n.@{ionicons-prefix}pound:before,\n.@{ionicons-prefix}power:before,\n.@{ionicons-prefix}pricetag:before,\n.@{ionicons-prefix}pricetags:before,\n.@{ionicons-prefix}printer:before,\n.@{ionicons-prefix}pull-request:before,\n.@{ionicons-prefix}qr-scanner:before,\n.@{ionicons-prefix}quote:before,\n.@{ionicons-prefix}radio-waves:before,\n.@{ionicons-prefix}record:before,\n.@{ionicons-prefix}refresh:before,\n.@{ionicons-prefix}reply:before,\n.@{ionicons-prefix}reply-all:before,\n.@{ionicons-prefix}ribbon-a:before,\n.@{ionicons-prefix}ribbon-b:before,\n.@{ionicons-prefix}sad:before,\n.@{ionicons-prefix}sad-outline:before,\n.@{ionicons-prefix}scissors:before,\n.@{ionicons-prefix}search:before,\n.@{ionicons-prefix}settings:before,\n.@{ionicons-prefix}share:before,\n.@{ionicons-prefix}shuffle:before,\n.@{ionicons-prefix}skip-backward:before,\n.@{ionicons-prefix}skip-forward:before,\n.@{ionicons-prefix}social-android:before,\n.@{ionicons-prefix}social-android-outline:before,\n.@{ionicons-prefix}social-angular:before,\n.@{ionicons-prefix}social-angular-outline:before,\n.@{ionicons-prefix}social-apple:before,\n.@{ionicons-prefix}social-apple-outline:before,\n.@{ionicons-prefix}social-bitcoin:before,\n.@{ionicons-prefix}social-bitcoin-outline:before,\n.@{ionicons-prefix}social-buffer:before,\n.@{ionicons-prefix}social-buffer-outline:before,\n.@{ionicons-prefix}social-chrome:before,\n.@{ionicons-prefix}social-chrome-outline:before,\n.@{ionicons-prefix}social-codepen:before,\n.@{ionicons-prefix}social-codepen-outline:before,\n.@{ionicons-prefix}social-css3:before,\n.@{ionicons-prefix}social-css3-outline:before,\n.@{ionicons-prefix}social-designernews:before,\n.@{ionicons-prefix}social-designernews-outline:before,\n.@{ionicons-prefix}social-dribbble:before,\n.@{ionicons-prefix}social-dribbble-outline:before,\n.@{ionicons-prefix}social-dropbox:before,\n.@{ionicons-prefix}social-dropbox-outline:before,\n.@{ionicons-prefix}social-euro:before,\n.@{ionicons-prefix}social-euro-outline:before,\n.@{ionicons-prefix}social-facebook:before,\n.@{ionicons-prefix}social-facebook-outline:before,\n.@{ionicons-prefix}social-foursquare:before,\n.@{ionicons-prefix}social-foursquare-outline:before,\n.@{ionicons-prefix}social-freebsd-devil:before,\n.@{ionicons-prefix}social-github:before,\n.@{ionicons-prefix}social-github-outline:before,\n.@{ionicons-prefix}social-google:before,\n.@{ionicons-prefix}social-google-outline:before,\n.@{ionicons-prefix}social-googleplus:before,\n.@{ionicons-prefix}social-googleplus-outline:before,\n.@{ionicons-prefix}social-hackernews:before,\n.@{ionicons-prefix}social-hackernews-outline:before,\n.@{ionicons-prefix}social-html5:before,\n.@{ionicons-prefix}social-html5-outline:before,\n.@{ionicons-prefix}social-instagram:before,\n.@{ionicons-prefix}social-instagram-outline:before,\n.@{ionicons-prefix}social-javascript:before,\n.@{ionicons-prefix}social-javascript-outline:before,\n.@{ionicons-prefix}social-linkedin:before,\n.@{ionicons-prefix}social-linkedin-outline:before,\n.@{ionicons-prefix}social-markdown:before,\n.@{ionicons-prefix}social-nodejs:before,\n.@{ionicons-prefix}social-octocat:before,\n.@{ionicons-prefix}social-pinterest:before,\n.@{ionicons-prefix}social-pinterest-outline:before,\n.@{ionicons-prefix}social-python:before,\n.@{ionicons-prefix}social-reddit:before,\n.@{ionicons-prefix}social-reddit-outline:before,\n.@{ionicons-prefix}social-rss:before,\n.@{ionicons-prefix}social-rss-outline:before,\n.@{ionicons-prefix}social-sass:before,\n.@{ionicons-prefix}social-skype:before,\n.@{ionicons-prefix}social-skype-outline:before,\n.@{ionicons-prefix}social-snapchat:before,\n.@{ionicons-prefix}social-snapchat-outline:before,\n.@{ionicons-prefix}social-tumblr:before,\n.@{ionicons-prefix}social-tumblr-outline:before,\n.@{ionicons-prefix}social-tux:before,\n.@{ionicons-prefix}social-twitch:before,\n.@{ionicons-prefix}social-twitch-outline:before,\n.@{ionicons-prefix}social-twitter:before,\n.@{ionicons-prefix}social-twitter-outline:before,\n.@{ionicons-prefix}social-usd:before,\n.@{ionicons-prefix}social-usd-outline:before,\n.@{ionicons-prefix}social-vimeo:before,\n.@{ionicons-prefix}social-vimeo-outline:before,\n.@{ionicons-prefix}social-whatsapp:before,\n.@{ionicons-prefix}social-whatsapp-outline:before,\n.@{ionicons-prefix}social-windows:before,\n.@{ionicons-prefix}social-windows-outline:before,\n.@{ionicons-prefix}social-wordpress:before,\n.@{ionicons-prefix}social-wordpress-outline:before,\n.@{ionicons-prefix}social-yahoo:before,\n.@{ionicons-prefix}social-yahoo-outline:before,\n.@{ionicons-prefix}social-yen:before,\n.@{ionicons-prefix}social-yen-outline:before,\n.@{ionicons-prefix}social-youtube:before,\n.@{ionicons-prefix}social-youtube-outline:before,\n.@{ionicons-prefix}soup-can:before,\n.@{ionicons-prefix}soup-can-outline:before,\n.@{ionicons-prefix}speakerphone:before,\n.@{ionicons-prefix}speedometer:before,\n.@{ionicons-prefix}spoon:before,\n.@{ionicons-prefix}star:before,\n.@{ionicons-prefix}stats-bars:before,\n.@{ionicons-prefix}steam:before,\n.@{ionicons-prefix}stop:before,\n.@{ionicons-prefix}thermometer:before,\n.@{ionicons-prefix}thumbsdown:before,\n.@{ionicons-prefix}thumbsup:before,\n.@{ionicons-prefix}toggle:before,\n.@{ionicons-prefix}toggle-filled:before,\n.@{ionicons-prefix}transgender:before,\n.@{ionicons-prefix}trash-a:before,\n.@{ionicons-prefix}trash-b:before,\n.@{ionicons-prefix}trophy:before,\n.@{ionicons-prefix}tshirt:before,\n.@{ionicons-prefix}tshirt-outline:before,\n.@{ionicons-prefix}umbrella:before,\n.@{ionicons-prefix}university:before,\n.@{ionicons-prefix}unlocked:before,\n.@{ionicons-prefix}upload:before,\n.@{ionicons-prefix}usb:before,\n.@{ionicons-prefix}videocamera:before,\n.@{ionicons-prefix}volume-high:before,\n.@{ionicons-prefix}volume-low:before,\n.@{ionicons-prefix}volume-medium:before,\n.@{ionicons-prefix}volume-mute:before,\n.@{ionicons-prefix}wand:before,\n.@{ionicons-prefix}waterdrop:before,\n.@{ionicons-prefix}wifi:before,\n.@{ionicons-prefix}wineglass:before,\n.@{ionicons-prefix}woman:before,\n.@{ionicons-prefix}wrench:before,\n.@{ionicons-prefix}xbox:before\n{\n  &:extend(.ion);\n}\n.@{ionicons-prefix}alert:before { content: @ionicon-var-alert; }\n.@{ionicons-prefix}alert-circled:before { content: @ionicon-var-alert-circled; }\n.@{ionicons-prefix}android-add:before { content: @ionicon-var-android-add; }\n.@{ionicons-prefix}android-add-circle:before { content: @ionicon-var-android-add-circle; }\n.@{ionicons-prefix}android-alarm-clock:before { content: @ionicon-var-android-alarm-clock; }\n.@{ionicons-prefix}android-alert:before { content: @ionicon-var-android-alert; }\n.@{ionicons-prefix}android-apps:before { content: @ionicon-var-android-apps; }\n.@{ionicons-prefix}android-archive:before { content: @ionicon-var-android-archive; }\n.@{ionicons-prefix}android-arrow-back:before { content: @ionicon-var-android-arrow-back; }\n.@{ionicons-prefix}android-arrow-down:before { content: @ionicon-var-android-arrow-down; }\n.@{ionicons-prefix}android-arrow-dropdown:before { content: @ionicon-var-android-arrow-dropdown; }\n.@{ionicons-prefix}android-arrow-dropdown-circle:before { content: @ionicon-var-android-arrow-dropdown-circle; }\n.@{ionicons-prefix}android-arrow-dropleft:before { content: @ionicon-var-android-arrow-dropleft; }\n.@{ionicons-prefix}android-arrow-dropleft-circle:before { content: @ionicon-var-android-arrow-dropleft-circle; }\n.@{ionicons-prefix}android-arrow-dropright:before { content: @ionicon-var-android-arrow-dropright; }\n.@{ionicons-prefix}android-arrow-dropright-circle:before { content: @ionicon-var-android-arrow-dropright-circle; }\n.@{ionicons-prefix}android-arrow-dropup:before { content: @ionicon-var-android-arrow-dropup; }\n.@{ionicons-prefix}android-arrow-dropup-circle:before { content: @ionicon-var-android-arrow-dropup-circle; }\n.@{ionicons-prefix}android-arrow-forward:before { content: @ionicon-var-android-arrow-forward; }\n.@{ionicons-prefix}android-arrow-up:before { content: @ionicon-var-android-arrow-up; }\n.@{ionicons-prefix}android-attach:before { content: @ionicon-var-android-attach; }\n.@{ionicons-prefix}android-bar:before { content: @ionicon-var-android-bar; }\n.@{ionicons-prefix}android-bicycle:before { content: @ionicon-var-android-bicycle; }\n.@{ionicons-prefix}android-boat:before { content: @ionicon-var-android-boat; }\n.@{ionicons-prefix}android-bookmark:before { content: @ionicon-var-android-bookmark; }\n.@{ionicons-prefix}android-bulb:before { content: @ionicon-var-android-bulb; }\n.@{ionicons-prefix}android-bus:before { content: @ionicon-var-android-bus; }\n.@{ionicons-prefix}android-calendar:before { content: @ionicon-var-android-calendar; }\n.@{ionicons-prefix}android-call:before { content: @ionicon-var-android-call; }\n.@{ionicons-prefix}android-camera:before { content: @ionicon-var-android-camera; }\n.@{ionicons-prefix}android-cancel:before { content: @ionicon-var-android-cancel; }\n.@{ionicons-prefix}android-car:before { content: @ionicon-var-android-car; }\n.@{ionicons-prefix}android-cart:before { content: @ionicon-var-android-cart; }\n.@{ionicons-prefix}android-chat:before { content: @ionicon-var-android-chat; }\n.@{ionicons-prefix}android-checkbox:before { content: @ionicon-var-android-checkbox; }\n.@{ionicons-prefix}android-checkbox-blank:before { content: @ionicon-var-android-checkbox-blank; }\n.@{ionicons-prefix}android-checkbox-outline:before { content: @ionicon-var-android-checkbox-outline; }\n.@{ionicons-prefix}android-checkbox-outline-blank:before { content: @ionicon-var-android-checkbox-outline-blank; }\n.@{ionicons-prefix}android-checkmark-circle:before { content: @ionicon-var-android-checkmark-circle; }\n.@{ionicons-prefix}android-clipboard:before { content: @ionicon-var-android-clipboard; }\n.@{ionicons-prefix}android-close:before { content: @ionicon-var-android-close; }\n.@{ionicons-prefix}android-cloud:before { content: @ionicon-var-android-cloud; }\n.@{ionicons-prefix}android-cloud-circle:before { content: @ionicon-var-android-cloud-circle; }\n.@{ionicons-prefix}android-cloud-done:before { content: @ionicon-var-android-cloud-done; }\n.@{ionicons-prefix}android-cloud-outline:before { content: @ionicon-var-android-cloud-outline; }\n.@{ionicons-prefix}android-color-palette:before { content: @ionicon-var-android-color-palette; }\n.@{ionicons-prefix}android-compass:before { content: @ionicon-var-android-compass; }\n.@{ionicons-prefix}android-contact:before { content: @ionicon-var-android-contact; }\n.@{ionicons-prefix}android-contacts:before { content: @ionicon-var-android-contacts; }\n.@{ionicons-prefix}android-contract:before { content: @ionicon-var-android-contract; }\n.@{ionicons-prefix}android-create:before { content: @ionicon-var-android-create; }\n.@{ionicons-prefix}android-delete:before { content: @ionicon-var-android-delete; }\n.@{ionicons-prefix}android-desktop:before { content: @ionicon-var-android-desktop; }\n.@{ionicons-prefix}android-document:before { content: @ionicon-var-android-document; }\n.@{ionicons-prefix}android-done:before { content: @ionicon-var-android-done; }\n.@{ionicons-prefix}android-done-all:before { content: @ionicon-var-android-done-all; }\n.@{ionicons-prefix}android-download:before { content: @ionicon-var-android-download; }\n.@{ionicons-prefix}android-drafts:before { content: @ionicon-var-android-drafts; }\n.@{ionicons-prefix}android-exit:before { content: @ionicon-var-android-exit; }\n.@{ionicons-prefix}android-expand:before { content: @ionicon-var-android-expand; }\n.@{ionicons-prefix}android-favorite:before { content: @ionicon-var-android-favorite; }\n.@{ionicons-prefix}android-favorite-outline:before { content: @ionicon-var-android-favorite-outline; }\n.@{ionicons-prefix}android-film:before { content: @ionicon-var-android-film; }\n.@{ionicons-prefix}android-folder:before { content: @ionicon-var-android-folder; }\n.@{ionicons-prefix}android-folder-open:before { content: @ionicon-var-android-folder-open; }\n.@{ionicons-prefix}android-funnel:before { content: @ionicon-var-android-funnel; }\n.@{ionicons-prefix}android-globe:before { content: @ionicon-var-android-globe; }\n.@{ionicons-prefix}android-hand:before { content: @ionicon-var-android-hand; }\n.@{ionicons-prefix}android-hangout:before { content: @ionicon-var-android-hangout; }\n.@{ionicons-prefix}android-happy:before { content: @ionicon-var-android-happy; }\n.@{ionicons-prefix}android-home:before { content: @ionicon-var-android-home; }\n.@{ionicons-prefix}android-image:before { content: @ionicon-var-android-image; }\n.@{ionicons-prefix}android-laptop:before { content: @ionicon-var-android-laptop; }\n.@{ionicons-prefix}android-list:before { content: @ionicon-var-android-list; }\n.@{ionicons-prefix}android-locate:before { content: @ionicon-var-android-locate; }\n.@{ionicons-prefix}android-lock:before { content: @ionicon-var-android-lock; }\n.@{ionicons-prefix}android-mail:before { content: @ionicon-var-android-mail; }\n.@{ionicons-prefix}android-map:before { content: @ionicon-var-android-map; }\n.@{ionicons-prefix}android-menu:before { content: @ionicon-var-android-menu; }\n.@{ionicons-prefix}android-microphone:before { content: @ionicon-var-android-microphone; }\n.@{ionicons-prefix}android-microphone-off:before { content: @ionicon-var-android-microphone-off; }\n.@{ionicons-prefix}android-more-horizontal:before { content: @ionicon-var-android-more-horizontal; }\n.@{ionicons-prefix}android-more-vertical:before { content: @ionicon-var-android-more-vertical; }\n.@{ionicons-prefix}android-navigate:before { content: @ionicon-var-android-navigate; }\n.@{ionicons-prefix}android-notifications:before { content: @ionicon-var-android-notifications; }\n.@{ionicons-prefix}android-notifications-none:before { content: @ionicon-var-android-notifications-none; }\n.@{ionicons-prefix}android-notifications-off:before { content: @ionicon-var-android-notifications-off; }\n.@{ionicons-prefix}android-open:before { content: @ionicon-var-android-open; }\n.@{ionicons-prefix}android-options:before { content: @ionicon-var-android-options; }\n.@{ionicons-prefix}android-people:before { content: @ionicon-var-android-people; }\n.@{ionicons-prefix}android-person:before { content: @ionicon-var-android-person; }\n.@{ionicons-prefix}android-person-add:before { content: @ionicon-var-android-person-add; }\n.@{ionicons-prefix}android-phone-landscape:before { content: @ionicon-var-android-phone-landscape; }\n.@{ionicons-prefix}android-phone-portrait:before { content: @ionicon-var-android-phone-portrait; }\n.@{ionicons-prefix}android-pin:before { content: @ionicon-var-android-pin; }\n.@{ionicons-prefix}android-plane:before { content: @ionicon-var-android-plane; }\n.@{ionicons-prefix}android-playstore:before { content: @ionicon-var-android-playstore; }\n.@{ionicons-prefix}android-print:before { content: @ionicon-var-android-print; }\n.@{ionicons-prefix}android-radio-button-off:before { content: @ionicon-var-android-radio-button-off; }\n.@{ionicons-prefix}android-radio-button-on:before { content: @ionicon-var-android-radio-button-on; }\n.@{ionicons-prefix}android-refresh:before { content: @ionicon-var-android-refresh; }\n.@{ionicons-prefix}android-remove:before { content: @ionicon-var-android-remove; }\n.@{ionicons-prefix}android-remove-circle:before { content: @ionicon-var-android-remove-circle; }\n.@{ionicons-prefix}android-restaurant:before { content: @ionicon-var-android-restaurant; }\n.@{ionicons-prefix}android-sad:before { content: @ionicon-var-android-sad; }\n.@{ionicons-prefix}android-search:before { content: @ionicon-var-android-search; }\n.@{ionicons-prefix}android-send:before { content: @ionicon-var-android-send; }\n.@{ionicons-prefix}android-settings:before { content: @ionicon-var-android-settings; }\n.@{ionicons-prefix}android-share:before { content: @ionicon-var-android-share; }\n.@{ionicons-prefix}android-share-alt:before { content: @ionicon-var-android-share-alt; }\n.@{ionicons-prefix}android-star:before { content: @ionicon-var-android-star; }\n.@{ionicons-prefix}android-star-half:before { content: @ionicon-var-android-star-half; }\n.@{ionicons-prefix}android-star-outline:before { content: @ionicon-var-android-star-outline; }\n.@{ionicons-prefix}android-stopwatch:before { content: @ionicon-var-android-stopwatch; }\n.@{ionicons-prefix}android-subway:before { content: @ionicon-var-android-subway; }\n.@{ionicons-prefix}android-sunny:before { content: @ionicon-var-android-sunny; }\n.@{ionicons-prefix}android-sync:before { content: @ionicon-var-android-sync; }\n.@{ionicons-prefix}android-textsms:before { content: @ionicon-var-android-textsms; }\n.@{ionicons-prefix}android-time:before { content: @ionicon-var-android-time; }\n.@{ionicons-prefix}android-train:before { content: @ionicon-var-android-train; }\n.@{ionicons-prefix}android-unlock:before { content: @ionicon-var-android-unlock; }\n.@{ionicons-prefix}android-upload:before { content: @ionicon-var-android-upload; }\n.@{ionicons-prefix}android-volume-down:before { content: @ionicon-var-android-volume-down; }\n.@{ionicons-prefix}android-volume-mute:before { content: @ionicon-var-android-volume-mute; }\n.@{ionicons-prefix}android-volume-off:before { content: @ionicon-var-android-volume-off; }\n.@{ionicons-prefix}android-volume-up:before { content: @ionicon-var-android-volume-up; }\n.@{ionicons-prefix}android-walk:before { content: @ionicon-var-android-walk; }\n.@{ionicons-prefix}android-warning:before { content: @ionicon-var-android-warning; }\n.@{ionicons-prefix}android-watch:before { content: @ionicon-var-android-watch; }\n.@{ionicons-prefix}android-wifi:before { content: @ionicon-var-android-wifi; }\n.@{ionicons-prefix}aperture:before { content: @ionicon-var-aperture; }\n.@{ionicons-prefix}archive:before { content: @ionicon-var-archive; }\n.@{ionicons-prefix}arrow-down-a:before { content: @ionicon-var-arrow-down-a; }\n.@{ionicons-prefix}arrow-down-b:before { content: @ionicon-var-arrow-down-b; }\n.@{ionicons-prefix}arrow-down-c:before { content: @ionicon-var-arrow-down-c; }\n.@{ionicons-prefix}arrow-expand:before { content: @ionicon-var-arrow-expand; }\n.@{ionicons-prefix}arrow-graph-down-left:before { content: @ionicon-var-arrow-graph-down-left; }\n.@{ionicons-prefix}arrow-graph-down-right:before { content: @ionicon-var-arrow-graph-down-right; }\n.@{ionicons-prefix}arrow-graph-up-left:before { content: @ionicon-var-arrow-graph-up-left; }\n.@{ionicons-prefix}arrow-graph-up-right:before { content: @ionicon-var-arrow-graph-up-right; }\n.@{ionicons-prefix}arrow-left-a:before { content: @ionicon-var-arrow-left-a; }\n.@{ionicons-prefix}arrow-left-b:before { content: @ionicon-var-arrow-left-b; }\n.@{ionicons-prefix}arrow-left-c:before { content: @ionicon-var-arrow-left-c; }\n.@{ionicons-prefix}arrow-move:before { content: @ionicon-var-arrow-move; }\n.@{ionicons-prefix}arrow-resize:before { content: @ionicon-var-arrow-resize; }\n.@{ionicons-prefix}arrow-return-left:before { content: @ionicon-var-arrow-return-left; }\n.@{ionicons-prefix}arrow-return-right:before { content: @ionicon-var-arrow-return-right; }\n.@{ionicons-prefix}arrow-right-a:before { content: @ionicon-var-arrow-right-a; }\n.@{ionicons-prefix}arrow-right-b:before { content: @ionicon-var-arrow-right-b; }\n.@{ionicons-prefix}arrow-right-c:before { content: @ionicon-var-arrow-right-c; }\n.@{ionicons-prefix}arrow-shrink:before { content: @ionicon-var-arrow-shrink; }\n.@{ionicons-prefix}arrow-swap:before { content: @ionicon-var-arrow-swap; }\n.@{ionicons-prefix}arrow-up-a:before { content: @ionicon-var-arrow-up-a; }\n.@{ionicons-prefix}arrow-up-b:before { content: @ionicon-var-arrow-up-b; }\n.@{ionicons-prefix}arrow-up-c:before { content: @ionicon-var-arrow-up-c; }\n.@{ionicons-prefix}asterisk:before { content: @ionicon-var-asterisk; }\n.@{ionicons-prefix}at:before { content: @ionicon-var-at; }\n.@{ionicons-prefix}backspace:before { content: @ionicon-var-backspace; }\n.@{ionicons-prefix}backspace-outline:before { content: @ionicon-var-backspace-outline; }\n.@{ionicons-prefix}bag:before { content: @ionicon-var-bag; }\n.@{ionicons-prefix}battery-charging:before { content: @ionicon-var-battery-charging; }\n.@{ionicons-prefix}battery-empty:before { content: @ionicon-var-battery-empty; }\n.@{ionicons-prefix}battery-full:before { content: @ionicon-var-battery-full; }\n.@{ionicons-prefix}battery-half:before { content: @ionicon-var-battery-half; }\n.@{ionicons-prefix}battery-low:before { content: @ionicon-var-battery-low; }\n.@{ionicons-prefix}beaker:before { content: @ionicon-var-beaker; }\n.@{ionicons-prefix}beer:before { content: @ionicon-var-beer; }\n.@{ionicons-prefix}bluetooth:before { content: @ionicon-var-bluetooth; }\n.@{ionicons-prefix}bonfire:before { content: @ionicon-var-bonfire; }\n.@{ionicons-prefix}bookmark:before { content: @ionicon-var-bookmark; }\n.@{ionicons-prefix}bowtie:before { content: @ionicon-var-bowtie; }\n.@{ionicons-prefix}briefcase:before { content: @ionicon-var-briefcase; }\n.@{ionicons-prefix}bug:before { content: @ionicon-var-bug; }\n.@{ionicons-prefix}calculator:before { content: @ionicon-var-calculator; }\n.@{ionicons-prefix}calendar:before { content: @ionicon-var-calendar; }\n.@{ionicons-prefix}camera:before { content: @ionicon-var-camera; }\n.@{ionicons-prefix}card:before { content: @ionicon-var-card; }\n.@{ionicons-prefix}cash:before { content: @ionicon-var-cash; }\n.@{ionicons-prefix}chatbox:before { content: @ionicon-var-chatbox; }\n.@{ionicons-prefix}chatbox-working:before { content: @ionicon-var-chatbox-working; }\n.@{ionicons-prefix}chatboxes:before { content: @ionicon-var-chatboxes; }\n.@{ionicons-prefix}chatbubble:before { content: @ionicon-var-chatbubble; }\n.@{ionicons-prefix}chatbubble-working:before { content: @ionicon-var-chatbubble-working; }\n.@{ionicons-prefix}chatbubbles:before { content: @ionicon-var-chatbubbles; }\n.@{ionicons-prefix}checkmark:before { content: @ionicon-var-checkmark; }\n.@{ionicons-prefix}checkmark-circled:before { content: @ionicon-var-checkmark-circled; }\n.@{ionicons-prefix}checkmark-round:before { content: @ionicon-var-checkmark-round; }\n.@{ionicons-prefix}chevron-down:before { content: @ionicon-var-chevron-down; }\n.@{ionicons-prefix}chevron-left:before { content: @ionicon-var-chevron-left; }\n.@{ionicons-prefix}chevron-right:before { content: @ionicon-var-chevron-right; }\n.@{ionicons-prefix}chevron-up:before { content: @ionicon-var-chevron-up; }\n.@{ionicons-prefix}clipboard:before { content: @ionicon-var-clipboard; }\n.@{ionicons-prefix}clock:before { content: @ionicon-var-clock; }\n.@{ionicons-prefix}close:before { content: @ionicon-var-close; }\n.@{ionicons-prefix}close-circled:before { content: @ionicon-var-close-circled; }\n.@{ionicons-prefix}close-round:before { content: @ionicon-var-close-round; }\n.@{ionicons-prefix}closed-captioning:before { content: @ionicon-var-closed-captioning; }\n.@{ionicons-prefix}cloud:before { content: @ionicon-var-cloud; }\n.@{ionicons-prefix}code:before { content: @ionicon-var-code; }\n.@{ionicons-prefix}code-download:before { content: @ionicon-var-code-download; }\n.@{ionicons-prefix}code-working:before { content: @ionicon-var-code-working; }\n.@{ionicons-prefix}coffee:before { content: @ionicon-var-coffee; }\n.@{ionicons-prefix}compass:before { content: @ionicon-var-compass; }\n.@{ionicons-prefix}compose:before { content: @ionicon-var-compose; }\n.@{ionicons-prefix}connection-bars:before { content: @ionicon-var-connection-bars; }\n.@{ionicons-prefix}contrast:before { content: @ionicon-var-contrast; }\n.@{ionicons-prefix}crop:before { content: @ionicon-var-crop; }\n.@{ionicons-prefix}cube:before { content: @ionicon-var-cube; }\n.@{ionicons-prefix}disc:before { content: @ionicon-var-disc; }\n.@{ionicons-prefix}document:before { content: @ionicon-var-document; }\n.@{ionicons-prefix}document-text:before { content: @ionicon-var-document-text; }\n.@{ionicons-prefix}drag:before { content: @ionicon-var-drag; }\n.@{ionicons-prefix}earth:before { content: @ionicon-var-earth; }\n.@{ionicons-prefix}easel:before { content: @ionicon-var-easel; }\n.@{ionicons-prefix}edit:before { content: @ionicon-var-edit; }\n.@{ionicons-prefix}egg:before { content: @ionicon-var-egg; }\n.@{ionicons-prefix}eject:before { content: @ionicon-var-eject; }\n.@{ionicons-prefix}email:before { content: @ionicon-var-email; }\n.@{ionicons-prefix}email-unread:before { content: @ionicon-var-email-unread; }\n.@{ionicons-prefix}erlenmeyer-flask:before { content: @ionicon-var-erlenmeyer-flask; }\n.@{ionicons-prefix}erlenmeyer-flask-bubbles:before { content: @ionicon-var-erlenmeyer-flask-bubbles; }\n.@{ionicons-prefix}eye:before { content: @ionicon-var-eye; }\n.@{ionicons-prefix}eye-disabled:before { content: @ionicon-var-eye-disabled; }\n.@{ionicons-prefix}female:before { content: @ionicon-var-female; }\n.@{ionicons-prefix}filing:before { content: @ionicon-var-filing; }\n.@{ionicons-prefix}film-marker:before { content: @ionicon-var-film-marker; }\n.@{ionicons-prefix}fireball:before { content: @ionicon-var-fireball; }\n.@{ionicons-prefix}flag:before { content: @ionicon-var-flag; }\n.@{ionicons-prefix}flame:before { content: @ionicon-var-flame; }\n.@{ionicons-prefix}flash:before { content: @ionicon-var-flash; }\n.@{ionicons-prefix}flash-off:before { content: @ionicon-var-flash-off; }\n.@{ionicons-prefix}folder:before { content: @ionicon-var-folder; }\n.@{ionicons-prefix}fork:before { content: @ionicon-var-fork; }\n.@{ionicons-prefix}fork-repo:before { content: @ionicon-var-fork-repo; }\n.@{ionicons-prefix}forward:before { content: @ionicon-var-forward; }\n.@{ionicons-prefix}funnel:before { content: @ionicon-var-funnel; }\n.@{ionicons-prefix}gear-a:before { content: @ionicon-var-gear-a; }\n.@{ionicons-prefix}gear-b:before { content: @ionicon-var-gear-b; }\n.@{ionicons-prefix}grid:before { content: @ionicon-var-grid; }\n.@{ionicons-prefix}hammer:before { content: @ionicon-var-hammer; }\n.@{ionicons-prefix}happy:before { content: @ionicon-var-happy; }\n.@{ionicons-prefix}happy-outline:before { content: @ionicon-var-happy-outline; }\n.@{ionicons-prefix}headphone:before { content: @ionicon-var-headphone; }\n.@{ionicons-prefix}heart:before { content: @ionicon-var-heart; }\n.@{ionicons-prefix}heart-broken:before { content: @ionicon-var-heart-broken; }\n.@{ionicons-prefix}help:before { content: @ionicon-var-help; }\n.@{ionicons-prefix}help-buoy:before { content: @ionicon-var-help-buoy; }\n.@{ionicons-prefix}help-circled:before { content: @ionicon-var-help-circled; }\n.@{ionicons-prefix}home:before { content: @ionicon-var-home; }\n.@{ionicons-prefix}icecream:before { content: @ionicon-var-icecream; }\n.@{ionicons-prefix}image:before { content: @ionicon-var-image; }\n.@{ionicons-prefix}images:before { content: @ionicon-var-images; }\n.@{ionicons-prefix}information:before { content: @ionicon-var-information; }\n.@{ionicons-prefix}information-circled:before { content: @ionicon-var-information-circled; }\n.@{ionicons-prefix}ionic:before { content: @ionicon-var-ionic; }\n.@{ionicons-prefix}ios-alarm:before { content: @ionicon-var-ios-alarm; }\n.@{ionicons-prefix}ios-alarm-outline:before { content: @ionicon-var-ios-alarm-outline; }\n.@{ionicons-prefix}ios-albums:before { content: @ionicon-var-ios-albums; }\n.@{ionicons-prefix}ios-albums-outline:before { content: @ionicon-var-ios-albums-outline; }\n.@{ionicons-prefix}ios-americanfootball:before { content: @ionicon-var-ios-americanfootball; }\n.@{ionicons-prefix}ios-americanfootball-outline:before { content: @ionicon-var-ios-americanfootball-outline; }\n.@{ionicons-prefix}ios-analytics:before { content: @ionicon-var-ios-analytics; }\n.@{ionicons-prefix}ios-analytics-outline:before { content: @ionicon-var-ios-analytics-outline; }\n.@{ionicons-prefix}ios-arrow-back:before { content: @ionicon-var-ios-arrow-back; }\n.@{ionicons-prefix}ios-arrow-down:before { content: @ionicon-var-ios-arrow-down; }\n.@{ionicons-prefix}ios-arrow-forward:before { content: @ionicon-var-ios-arrow-forward; }\n.@{ionicons-prefix}ios-arrow-left:before { content: @ionicon-var-ios-arrow-left; }\n.@{ionicons-prefix}ios-arrow-right:before { content: @ionicon-var-ios-arrow-right; }\n.@{ionicons-prefix}ios-arrow-thin-down:before { content: @ionicon-var-ios-arrow-thin-down; }\n.@{ionicons-prefix}ios-arrow-thin-left:before { content: @ionicon-var-ios-arrow-thin-left; }\n.@{ionicons-prefix}ios-arrow-thin-right:before { content: @ionicon-var-ios-arrow-thin-right; }\n.@{ionicons-prefix}ios-arrow-thin-up:before { content: @ionicon-var-ios-arrow-thin-up; }\n.@{ionicons-prefix}ios-arrow-up:before { content: @ionicon-var-ios-arrow-up; }\n.@{ionicons-prefix}ios-at:before { content: @ionicon-var-ios-at; }\n.@{ionicons-prefix}ios-at-outline:before { content: @ionicon-var-ios-at-outline; }\n.@{ionicons-prefix}ios-barcode:before { content: @ionicon-var-ios-barcode; }\n.@{ionicons-prefix}ios-barcode-outline:before { content: @ionicon-var-ios-barcode-outline; }\n.@{ionicons-prefix}ios-baseball:before { content: @ionicon-var-ios-baseball; }\n.@{ionicons-prefix}ios-baseball-outline:before { content: @ionicon-var-ios-baseball-outline; }\n.@{ionicons-prefix}ios-basketball:before { content: @ionicon-var-ios-basketball; }\n.@{ionicons-prefix}ios-basketball-outline:before { content: @ionicon-var-ios-basketball-outline; }\n.@{ionicons-prefix}ios-bell:before { content: @ionicon-var-ios-bell; }\n.@{ionicons-prefix}ios-bell-outline:before { content: @ionicon-var-ios-bell-outline; }\n.@{ionicons-prefix}ios-body:before { content: @ionicon-var-ios-body; }\n.@{ionicons-prefix}ios-body-outline:before { content: @ionicon-var-ios-body-outline; }\n.@{ionicons-prefix}ios-bolt:before { content: @ionicon-var-ios-bolt; }\n.@{ionicons-prefix}ios-bolt-outline:before { content: @ionicon-var-ios-bolt-outline; }\n.@{ionicons-prefix}ios-book:before { content: @ionicon-var-ios-book; }\n.@{ionicons-prefix}ios-book-outline:before { content: @ionicon-var-ios-book-outline; }\n.@{ionicons-prefix}ios-bookmarks:before { content: @ionicon-var-ios-bookmarks; }\n.@{ionicons-prefix}ios-bookmarks-outline:before { content: @ionicon-var-ios-bookmarks-outline; }\n.@{ionicons-prefix}ios-box:before { content: @ionicon-var-ios-box; }\n.@{ionicons-prefix}ios-box-outline:before { content: @ionicon-var-ios-box-outline; }\n.@{ionicons-prefix}ios-briefcase:before { content: @ionicon-var-ios-briefcase; }\n.@{ionicons-prefix}ios-briefcase-outline:before { content: @ionicon-var-ios-briefcase-outline; }\n.@{ionicons-prefix}ios-browsers:before { content: @ionicon-var-ios-browsers; }\n.@{ionicons-prefix}ios-browsers-outline:before { content: @ionicon-var-ios-browsers-outline; }\n.@{ionicons-prefix}ios-calculator:before { content: @ionicon-var-ios-calculator; }\n.@{ionicons-prefix}ios-calculator-outline:before { content: @ionicon-var-ios-calculator-outline; }\n.@{ionicons-prefix}ios-calendar:before { content: @ionicon-var-ios-calendar; }\n.@{ionicons-prefix}ios-calendar-outline:before { content: @ionicon-var-ios-calendar-outline; }\n.@{ionicons-prefix}ios-camera:before { content: @ionicon-var-ios-camera; }\n.@{ionicons-prefix}ios-camera-outline:before { content: @ionicon-var-ios-camera-outline; }\n.@{ionicons-prefix}ios-cart:before { content: @ionicon-var-ios-cart; }\n.@{ionicons-prefix}ios-cart-outline:before { content: @ionicon-var-ios-cart-outline; }\n.@{ionicons-prefix}ios-chatboxes:before { content: @ionicon-var-ios-chatboxes; }\n.@{ionicons-prefix}ios-chatboxes-outline:before { content: @ionicon-var-ios-chatboxes-outline; }\n.@{ionicons-prefix}ios-chatbubble:before { content: @ionicon-var-ios-chatbubble; }\n.@{ionicons-prefix}ios-chatbubble-outline:before { content: @ionicon-var-ios-chatbubble-outline; }\n.@{ionicons-prefix}ios-checkmark:before { content: @ionicon-var-ios-checkmark; }\n.@{ionicons-prefix}ios-checkmark-empty:before { content: @ionicon-var-ios-checkmark-empty; }\n.@{ionicons-prefix}ios-checkmark-outline:before { content: @ionicon-var-ios-checkmark-outline; }\n.@{ionicons-prefix}ios-circle-filled:before { content: @ionicon-var-ios-circle-filled; }\n.@{ionicons-prefix}ios-circle-outline:before { content: @ionicon-var-ios-circle-outline; }\n.@{ionicons-prefix}ios-clock:before { content: @ionicon-var-ios-clock; }\n.@{ionicons-prefix}ios-clock-outline:before { content: @ionicon-var-ios-clock-outline; }\n.@{ionicons-prefix}ios-close:before { content: @ionicon-var-ios-close; }\n.@{ionicons-prefix}ios-close-empty:before { content: @ionicon-var-ios-close-empty; }\n.@{ionicons-prefix}ios-close-outline:before { content: @ionicon-var-ios-close-outline; }\n.@{ionicons-prefix}ios-cloud:before { content: @ionicon-var-ios-cloud; }\n.@{ionicons-prefix}ios-cloud-download:before { content: @ionicon-var-ios-cloud-download; }\n.@{ionicons-prefix}ios-cloud-download-outline:before { content: @ionicon-var-ios-cloud-download-outline; }\n.@{ionicons-prefix}ios-cloud-outline:before { content: @ionicon-var-ios-cloud-outline; }\n.@{ionicons-prefix}ios-cloud-upload:before { content: @ionicon-var-ios-cloud-upload; }\n.@{ionicons-prefix}ios-cloud-upload-outline:before { content: @ionicon-var-ios-cloud-upload-outline; }\n.@{ionicons-prefix}ios-cloudy:before { content: @ionicon-var-ios-cloudy; }\n.@{ionicons-prefix}ios-cloudy-night:before { content: @ionicon-var-ios-cloudy-night; }\n.@{ionicons-prefix}ios-cloudy-night-outline:before { content: @ionicon-var-ios-cloudy-night-outline; }\n.@{ionicons-prefix}ios-cloudy-outline:before { content: @ionicon-var-ios-cloudy-outline; }\n.@{ionicons-prefix}ios-cog:before { content: @ionicon-var-ios-cog; }\n.@{ionicons-prefix}ios-cog-outline:before { content: @ionicon-var-ios-cog-outline; }\n.@{ionicons-prefix}ios-color-filter:before { content: @ionicon-var-ios-color-filter; }\n.@{ionicons-prefix}ios-color-filter-outline:before { content: @ionicon-var-ios-color-filter-outline; }\n.@{ionicons-prefix}ios-color-wand:before { content: @ionicon-var-ios-color-wand; }\n.@{ionicons-prefix}ios-color-wand-outline:before { content: @ionicon-var-ios-color-wand-outline; }\n.@{ionicons-prefix}ios-compose:before { content: @ionicon-var-ios-compose; }\n.@{ionicons-prefix}ios-compose-outline:before { content: @ionicon-var-ios-compose-outline; }\n.@{ionicons-prefix}ios-contact:before { content: @ionicon-var-ios-contact; }\n.@{ionicons-prefix}ios-contact-outline:before { content: @ionicon-var-ios-contact-outline; }\n.@{ionicons-prefix}ios-copy:before { content: @ionicon-var-ios-copy; }\n.@{ionicons-prefix}ios-copy-outline:before { content: @ionicon-var-ios-copy-outline; }\n.@{ionicons-prefix}ios-crop:before { content: @ionicon-var-ios-crop; }\n.@{ionicons-prefix}ios-crop-strong:before { content: @ionicon-var-ios-crop-strong; }\n.@{ionicons-prefix}ios-download:before { content: @ionicon-var-ios-download; }\n.@{ionicons-prefix}ios-download-outline:before { content: @ionicon-var-ios-download-outline; }\n.@{ionicons-prefix}ios-drag:before { content: @ionicon-var-ios-drag; }\n.@{ionicons-prefix}ios-email:before { content: @ionicon-var-ios-email; }\n.@{ionicons-prefix}ios-email-outline:before { content: @ionicon-var-ios-email-outline; }\n.@{ionicons-prefix}ios-eye:before { content: @ionicon-var-ios-eye; }\n.@{ionicons-prefix}ios-eye-outline:before { content: @ionicon-var-ios-eye-outline; }\n.@{ionicons-prefix}ios-fastforward:before { content: @ionicon-var-ios-fastforward; }\n.@{ionicons-prefix}ios-fastforward-outline:before { content: @ionicon-var-ios-fastforward-outline; }\n.@{ionicons-prefix}ios-filing:before { content: @ionicon-var-ios-filing; }\n.@{ionicons-prefix}ios-filing-outline:before { content: @ionicon-var-ios-filing-outline; }\n.@{ionicons-prefix}ios-film:before { content: @ionicon-var-ios-film; }\n.@{ionicons-prefix}ios-film-outline:before { content: @ionicon-var-ios-film-outline; }\n.@{ionicons-prefix}ios-flag:before { content: @ionicon-var-ios-flag; }\n.@{ionicons-prefix}ios-flag-outline:before { content: @ionicon-var-ios-flag-outline; }\n.@{ionicons-prefix}ios-flame:before { content: @ionicon-var-ios-flame; }\n.@{ionicons-prefix}ios-flame-outline:before { content: @ionicon-var-ios-flame-outline; }\n.@{ionicons-prefix}ios-flask:before { content: @ionicon-var-ios-flask; }\n.@{ionicons-prefix}ios-flask-outline:before { content: @ionicon-var-ios-flask-outline; }\n.@{ionicons-prefix}ios-flower:before { content: @ionicon-var-ios-flower; }\n.@{ionicons-prefix}ios-flower-outline:before { content: @ionicon-var-ios-flower-outline; }\n.@{ionicons-prefix}ios-folder:before { content: @ionicon-var-ios-folder; }\n.@{ionicons-prefix}ios-folder-outline:before { content: @ionicon-var-ios-folder-outline; }\n.@{ionicons-prefix}ios-football:before { content: @ionicon-var-ios-football; }\n.@{ionicons-prefix}ios-football-outline:before { content: @ionicon-var-ios-football-outline; }\n.@{ionicons-prefix}ios-game-controller-a:before { content: @ionicon-var-ios-game-controller-a; }\n.@{ionicons-prefix}ios-game-controller-a-outline:before { content: @ionicon-var-ios-game-controller-a-outline; }\n.@{ionicons-prefix}ios-game-controller-b:before { content: @ionicon-var-ios-game-controller-b; }\n.@{ionicons-prefix}ios-game-controller-b-outline:before { content: @ionicon-var-ios-game-controller-b-outline; }\n.@{ionicons-prefix}ios-gear:before { content: @ionicon-var-ios-gear; }\n.@{ionicons-prefix}ios-gear-outline:before { content: @ionicon-var-ios-gear-outline; }\n.@{ionicons-prefix}ios-glasses:before { content: @ionicon-var-ios-glasses; }\n.@{ionicons-prefix}ios-glasses-outline:before { content: @ionicon-var-ios-glasses-outline; }\n.@{ionicons-prefix}ios-grid-view:before { content: @ionicon-var-ios-grid-view; }\n.@{ionicons-prefix}ios-grid-view-outline:before { content: @ionicon-var-ios-grid-view-outline; }\n.@{ionicons-prefix}ios-heart:before { content: @ionicon-var-ios-heart; }\n.@{ionicons-prefix}ios-heart-outline:before { content: @ionicon-var-ios-heart-outline; }\n.@{ionicons-prefix}ios-help:before { content: @ionicon-var-ios-help; }\n.@{ionicons-prefix}ios-help-empty:before { content: @ionicon-var-ios-help-empty; }\n.@{ionicons-prefix}ios-help-outline:before { content: @ionicon-var-ios-help-outline; }\n.@{ionicons-prefix}ios-home:before { content: @ionicon-var-ios-home; }\n.@{ionicons-prefix}ios-home-outline:before { content: @ionicon-var-ios-home-outline; }\n.@{ionicons-prefix}ios-infinite:before { content: @ionicon-var-ios-infinite; }\n.@{ionicons-prefix}ios-infinite-outline:before { content: @ionicon-var-ios-infinite-outline; }\n.@{ionicons-prefix}ios-information:before { content: @ionicon-var-ios-information; }\n.@{ionicons-prefix}ios-information-empty:before { content: @ionicon-var-ios-information-empty; }\n.@{ionicons-prefix}ios-information-outline:before { content: @ionicon-var-ios-information-outline; }\n.@{ionicons-prefix}ios-ionic-outline:before { content: @ionicon-var-ios-ionic-outline; }\n.@{ionicons-prefix}ios-keypad:before { content: @ionicon-var-ios-keypad; }\n.@{ionicons-prefix}ios-keypad-outline:before { content: @ionicon-var-ios-keypad-outline; }\n.@{ionicons-prefix}ios-lightbulb:before { content: @ionicon-var-ios-lightbulb; }\n.@{ionicons-prefix}ios-lightbulb-outline:before { content: @ionicon-var-ios-lightbulb-outline; }\n.@{ionicons-prefix}ios-list:before { content: @ionicon-var-ios-list; }\n.@{ionicons-prefix}ios-list-outline:before { content: @ionicon-var-ios-list-outline; }\n.@{ionicons-prefix}ios-location:before { content: @ionicon-var-ios-location; }\n.@{ionicons-prefix}ios-location-outline:before { content: @ionicon-var-ios-location-outline; }\n.@{ionicons-prefix}ios-locked:before { content: @ionicon-var-ios-locked; }\n.@{ionicons-prefix}ios-locked-outline:before { content: @ionicon-var-ios-locked-outline; }\n.@{ionicons-prefix}ios-loop:before { content: @ionicon-var-ios-loop; }\n.@{ionicons-prefix}ios-loop-strong:before { content: @ionicon-var-ios-loop-strong; }\n.@{ionicons-prefix}ios-medical:before { content: @ionicon-var-ios-medical; }\n.@{ionicons-prefix}ios-medical-outline:before { content: @ionicon-var-ios-medical-outline; }\n.@{ionicons-prefix}ios-medkit:before { content: @ionicon-var-ios-medkit; }\n.@{ionicons-prefix}ios-medkit-outline:before { content: @ionicon-var-ios-medkit-outline; }\n.@{ionicons-prefix}ios-mic:before { content: @ionicon-var-ios-mic; }\n.@{ionicons-prefix}ios-mic-off:before { content: @ionicon-var-ios-mic-off; }\n.@{ionicons-prefix}ios-mic-outline:before { content: @ionicon-var-ios-mic-outline; }\n.@{ionicons-prefix}ios-minus:before { content: @ionicon-var-ios-minus; }\n.@{ionicons-prefix}ios-minus-empty:before { content: @ionicon-var-ios-minus-empty; }\n.@{ionicons-prefix}ios-minus-outline:before { content: @ionicon-var-ios-minus-outline; }\n.@{ionicons-prefix}ios-monitor:before { content: @ionicon-var-ios-monitor; }\n.@{ionicons-prefix}ios-monitor-outline:before { content: @ionicon-var-ios-monitor-outline; }\n.@{ionicons-prefix}ios-moon:before { content: @ionicon-var-ios-moon; }\n.@{ionicons-prefix}ios-moon-outline:before { content: @ionicon-var-ios-moon-outline; }\n.@{ionicons-prefix}ios-more:before { content: @ionicon-var-ios-more; }\n.@{ionicons-prefix}ios-more-outline:before { content: @ionicon-var-ios-more-outline; }\n.@{ionicons-prefix}ios-musical-note:before { content: @ionicon-var-ios-musical-note; }\n.@{ionicons-prefix}ios-musical-notes:before { content: @ionicon-var-ios-musical-notes; }\n.@{ionicons-prefix}ios-navigate:before { content: @ionicon-var-ios-navigate; }\n.@{ionicons-prefix}ios-navigate-outline:before { content: @ionicon-var-ios-navigate-outline; }\n.@{ionicons-prefix}ios-nutrition:before { content: @ionicon-var-ios-nutrition; }\n.@{ionicons-prefix}ios-nutrition-outline:before { content: @ionicon-var-ios-nutrition-outline; }\n.@{ionicons-prefix}ios-paper:before { content: @ionicon-var-ios-paper; }\n.@{ionicons-prefix}ios-paper-outline:before { content: @ionicon-var-ios-paper-outline; }\n.@{ionicons-prefix}ios-paperplane:before { content: @ionicon-var-ios-paperplane; }\n.@{ionicons-prefix}ios-paperplane-outline:before { content: @ionicon-var-ios-paperplane-outline; }\n.@{ionicons-prefix}ios-partlysunny:before { content: @ionicon-var-ios-partlysunny; }\n.@{ionicons-prefix}ios-partlysunny-outline:before { content: @ionicon-var-ios-partlysunny-outline; }\n.@{ionicons-prefix}ios-pause:before { content: @ionicon-var-ios-pause; }\n.@{ionicons-prefix}ios-pause-outline:before { content: @ionicon-var-ios-pause-outline; }\n.@{ionicons-prefix}ios-paw:before { content: @ionicon-var-ios-paw; }\n.@{ionicons-prefix}ios-paw-outline:before { content: @ionicon-var-ios-paw-outline; }\n.@{ionicons-prefix}ios-people:before { content: @ionicon-var-ios-people; }\n.@{ionicons-prefix}ios-people-outline:before { content: @ionicon-var-ios-people-outline; }\n.@{ionicons-prefix}ios-person:before { content: @ionicon-var-ios-person; }\n.@{ionicons-prefix}ios-person-outline:before { content: @ionicon-var-ios-person-outline; }\n.@{ionicons-prefix}ios-personadd:before { content: @ionicon-var-ios-personadd; }\n.@{ionicons-prefix}ios-personadd-outline:before { content: @ionicon-var-ios-personadd-outline; }\n.@{ionicons-prefix}ios-photos:before { content: @ionicon-var-ios-photos; }\n.@{ionicons-prefix}ios-photos-outline:before { content: @ionicon-var-ios-photos-outline; }\n.@{ionicons-prefix}ios-pie:before { content: @ionicon-var-ios-pie; }\n.@{ionicons-prefix}ios-pie-outline:before { content: @ionicon-var-ios-pie-outline; }\n.@{ionicons-prefix}ios-pint:before { content: @ionicon-var-ios-pint; }\n.@{ionicons-prefix}ios-pint-outline:before { content: @ionicon-var-ios-pint-outline; }\n.@{ionicons-prefix}ios-play:before { content: @ionicon-var-ios-play; }\n.@{ionicons-prefix}ios-play-outline:before { content: @ionicon-var-ios-play-outline; }\n.@{ionicons-prefix}ios-plus:before { content: @ionicon-var-ios-plus; }\n.@{ionicons-prefix}ios-plus-empty:before { content: @ionicon-var-ios-plus-empty; }\n.@{ionicons-prefix}ios-plus-outline:before { content: @ionicon-var-ios-plus-outline; }\n.@{ionicons-prefix}ios-pricetag:before { content: @ionicon-var-ios-pricetag; }\n.@{ionicons-prefix}ios-pricetag-outline:before { content: @ionicon-var-ios-pricetag-outline; }\n.@{ionicons-prefix}ios-pricetags:before { content: @ionicon-var-ios-pricetags; }\n.@{ionicons-prefix}ios-pricetags-outline:before { content: @ionicon-var-ios-pricetags-outline; }\n.@{ionicons-prefix}ios-printer:before { content: @ionicon-var-ios-printer; }\n.@{ionicons-prefix}ios-printer-outline:before { content: @ionicon-var-ios-printer-outline; }\n.@{ionicons-prefix}ios-pulse:before { content: @ionicon-var-ios-pulse; }\n.@{ionicons-prefix}ios-pulse-strong:before { content: @ionicon-var-ios-pulse-strong; }\n.@{ionicons-prefix}ios-rainy:before { content: @ionicon-var-ios-rainy; }\n.@{ionicons-prefix}ios-rainy-outline:before { content: @ionicon-var-ios-rainy-outline; }\n.@{ionicons-prefix}ios-recording:before { content: @ionicon-var-ios-recording; }\n.@{ionicons-prefix}ios-recording-outline:before { content: @ionicon-var-ios-recording-outline; }\n.@{ionicons-prefix}ios-redo:before { content: @ionicon-var-ios-redo; }\n.@{ionicons-prefix}ios-redo-outline:before { content: @ionicon-var-ios-redo-outline; }\n.@{ionicons-prefix}ios-refresh:before { content: @ionicon-var-ios-refresh; }\n.@{ionicons-prefix}ios-refresh-empty:before { content: @ionicon-var-ios-refresh-empty; }\n.@{ionicons-prefix}ios-refresh-outline:before { content: @ionicon-var-ios-refresh-outline; }\n.@{ionicons-prefix}ios-reload:before { content: @ionicon-var-ios-reload; }\n.@{ionicons-prefix}ios-reverse-camera:before { content: @ionicon-var-ios-reverse-camera; }\n.@{ionicons-prefix}ios-reverse-camera-outline:before { content: @ionicon-var-ios-reverse-camera-outline; }\n.@{ionicons-prefix}ios-rewind:before { content: @ionicon-var-ios-rewind; }\n.@{ionicons-prefix}ios-rewind-outline:before { content: @ionicon-var-ios-rewind-outline; }\n.@{ionicons-prefix}ios-rose:before { content: @ionicon-var-ios-rose; }\n.@{ionicons-prefix}ios-rose-outline:before { content: @ionicon-var-ios-rose-outline; }\n.@{ionicons-prefix}ios-search:before { content: @ionicon-var-ios-search; }\n.@{ionicons-prefix}ios-search-strong:before { content: @ionicon-var-ios-search-strong; }\n.@{ionicons-prefix}ios-settings:before { content: @ionicon-var-ios-settings; }\n.@{ionicons-prefix}ios-settings-strong:before { content: @ionicon-var-ios-settings-strong; }\n.@{ionicons-prefix}ios-shuffle:before { content: @ionicon-var-ios-shuffle; }\n.@{ionicons-prefix}ios-shuffle-strong:before { content: @ionicon-var-ios-shuffle-strong; }\n.@{ionicons-prefix}ios-skipbackward:before { content: @ionicon-var-ios-skipbackward; }\n.@{ionicons-prefix}ios-skipbackward-outline:before { content: @ionicon-var-ios-skipbackward-outline; }\n.@{ionicons-prefix}ios-skipforward:before { content: @ionicon-var-ios-skipforward; }\n.@{ionicons-prefix}ios-skipforward-outline:before { content: @ionicon-var-ios-skipforward-outline; }\n.@{ionicons-prefix}ios-snowy:before { content: @ionicon-var-ios-snowy; }\n.@{ionicons-prefix}ios-speedometer:before { content: @ionicon-var-ios-speedometer; }\n.@{ionicons-prefix}ios-speedometer-outline:before { content: @ionicon-var-ios-speedometer-outline; }\n.@{ionicons-prefix}ios-star:before { content: @ionicon-var-ios-star; }\n.@{ionicons-prefix}ios-star-half:before { content: @ionicon-var-ios-star-half; }\n.@{ionicons-prefix}ios-star-outline:before { content: @ionicon-var-ios-star-outline; }\n.@{ionicons-prefix}ios-stopwatch:before { content: @ionicon-var-ios-stopwatch; }\n.@{ionicons-prefix}ios-stopwatch-outline:before { content: @ionicon-var-ios-stopwatch-outline; }\n.@{ionicons-prefix}ios-sunny:before { content: @ionicon-var-ios-sunny; }\n.@{ionicons-prefix}ios-sunny-outline:before { content: @ionicon-var-ios-sunny-outline; }\n.@{ionicons-prefix}ios-telephone:before { content: @ionicon-var-ios-telephone; }\n.@{ionicons-prefix}ios-telephone-outline:before { content: @ionicon-var-ios-telephone-outline; }\n.@{ionicons-prefix}ios-tennisball:before { content: @ionicon-var-ios-tennisball; }\n.@{ionicons-prefix}ios-tennisball-outline:before { content: @ionicon-var-ios-tennisball-outline; }\n.@{ionicons-prefix}ios-thunderstorm:before { content: @ionicon-var-ios-thunderstorm; }\n.@{ionicons-prefix}ios-thunderstorm-outline:before { content: @ionicon-var-ios-thunderstorm-outline; }\n.@{ionicons-prefix}ios-time:before { content: @ionicon-var-ios-time; }\n.@{ionicons-prefix}ios-time-outline:before { content: @ionicon-var-ios-time-outline; }\n.@{ionicons-prefix}ios-timer:before { content: @ionicon-var-ios-timer; }\n.@{ionicons-prefix}ios-timer-outline:before { content: @ionicon-var-ios-timer-outline; }\n.@{ionicons-prefix}ios-toggle:before { content: @ionicon-var-ios-toggle; }\n.@{ionicons-prefix}ios-toggle-outline:before { content: @ionicon-var-ios-toggle-outline; }\n.@{ionicons-prefix}ios-trash:before { content: @ionicon-var-ios-trash; }\n.@{ionicons-prefix}ios-trash-outline:before { content: @ionicon-var-ios-trash-outline; }\n.@{ionicons-prefix}ios-undo:before { content: @ionicon-var-ios-undo; }\n.@{ionicons-prefix}ios-undo-outline:before { content: @ionicon-var-ios-undo-outline; }\n.@{ionicons-prefix}ios-unlocked:before { content: @ionicon-var-ios-unlocked; }\n.@{ionicons-prefix}ios-unlocked-outline:before { content: @ionicon-var-ios-unlocked-outline; }\n.@{ionicons-prefix}ios-upload:before { content: @ionicon-var-ios-upload; }\n.@{ionicons-prefix}ios-upload-outline:before { content: @ionicon-var-ios-upload-outline; }\n.@{ionicons-prefix}ios-videocam:before { content: @ionicon-var-ios-videocam; }\n.@{ionicons-prefix}ios-videocam-outline:before { content: @ionicon-var-ios-videocam-outline; }\n.@{ionicons-prefix}ios-volume-high:before { content: @ionicon-var-ios-volume-high; }\n.@{ionicons-prefix}ios-volume-low:before { content: @ionicon-var-ios-volume-low; }\n.@{ionicons-prefix}ios-wineglass:before { content: @ionicon-var-ios-wineglass; }\n.@{ionicons-prefix}ios-wineglass-outline:before { content: @ionicon-var-ios-wineglass-outline; }\n.@{ionicons-prefix}ios-world:before { content: @ionicon-var-ios-world; }\n.@{ionicons-prefix}ios-world-outline:before { content: @ionicon-var-ios-world-outline; }\n.@{ionicons-prefix}ipad:before { content: @ionicon-var-ipad; }\n.@{ionicons-prefix}iphone:before { content: @ionicon-var-iphone; }\n.@{ionicons-prefix}ipod:before { content: @ionicon-var-ipod; }\n.@{ionicons-prefix}jet:before { content: @ionicon-var-jet; }\n.@{ionicons-prefix}key:before { content: @ionicon-var-key; }\n.@{ionicons-prefix}knife:before { content: @ionicon-var-knife; }\n.@{ionicons-prefix}laptop:before { content: @ionicon-var-laptop; }\n.@{ionicons-prefix}leaf:before { content: @ionicon-var-leaf; }\n.@{ionicons-prefix}levels:before { content: @ionicon-var-levels; }\n.@{ionicons-prefix}lightbulb:before { content: @ionicon-var-lightbulb; }\n.@{ionicons-prefix}link:before { content: @ionicon-var-link; }\n.@{ionicons-prefix}load-a:before { content: @ionicon-var-load-a; }\n.@{ionicons-prefix}load-b:before { content: @ionicon-var-load-b; }\n.@{ionicons-prefix}load-c:before { content: @ionicon-var-load-c; }\n.@{ionicons-prefix}load-d:before { content: @ionicon-var-load-d; }\n.@{ionicons-prefix}location:before { content: @ionicon-var-location; }\n.@{ionicons-prefix}lock-combination:before { content: @ionicon-var-lock-combination; }\n.@{ionicons-prefix}locked:before { content: @ionicon-var-locked; }\n.@{ionicons-prefix}log-in:before { content: @ionicon-var-log-in; }\n.@{ionicons-prefix}log-out:before { content: @ionicon-var-log-out; }\n.@{ionicons-prefix}loop:before { content: @ionicon-var-loop; }\n.@{ionicons-prefix}magnet:before { content: @ionicon-var-magnet; }\n.@{ionicons-prefix}male:before { content: @ionicon-var-male; }\n.@{ionicons-prefix}man:before { content: @ionicon-var-man; }\n.@{ionicons-prefix}map:before { content: @ionicon-var-map; }\n.@{ionicons-prefix}medkit:before { content: @ionicon-var-medkit; }\n.@{ionicons-prefix}merge:before { content: @ionicon-var-merge; }\n.@{ionicons-prefix}mic-a:before { content: @ionicon-var-mic-a; }\n.@{ionicons-prefix}mic-b:before { content: @ionicon-var-mic-b; }\n.@{ionicons-prefix}mic-c:before { content: @ionicon-var-mic-c; }\n.@{ionicons-prefix}minus:before { content: @ionicon-var-minus; }\n.@{ionicons-prefix}minus-circled:before { content: @ionicon-var-minus-circled; }\n.@{ionicons-prefix}minus-round:before { content: @ionicon-var-minus-round; }\n.@{ionicons-prefix}model-s:before { content: @ionicon-var-model-s; }\n.@{ionicons-prefix}monitor:before { content: @ionicon-var-monitor; }\n.@{ionicons-prefix}more:before { content: @ionicon-var-more; }\n.@{ionicons-prefix}mouse:before { content: @ionicon-var-mouse; }\n.@{ionicons-prefix}music-note:before { content: @ionicon-var-music-note; }\n.@{ionicons-prefix}navicon:before { content: @ionicon-var-navicon; }\n.@{ionicons-prefix}navicon-round:before { content: @ionicon-var-navicon-round; }\n.@{ionicons-prefix}navigate:before { content: @ionicon-var-navigate; }\n.@{ionicons-prefix}network:before { content: @ionicon-var-network; }\n.@{ionicons-prefix}no-smoking:before { content: @ionicon-var-no-smoking; }\n.@{ionicons-prefix}nuclear:before { content: @ionicon-var-nuclear; }\n.@{ionicons-prefix}outlet:before { content: @ionicon-var-outlet; }\n.@{ionicons-prefix}paintbrush:before { content: @ionicon-var-paintbrush; }\n.@{ionicons-prefix}paintbucket:before { content: @ionicon-var-paintbucket; }\n.@{ionicons-prefix}paper-airplane:before { content: @ionicon-var-paper-airplane; }\n.@{ionicons-prefix}paperclip:before { content: @ionicon-var-paperclip; }\n.@{ionicons-prefix}pause:before { content: @ionicon-var-pause; }\n.@{ionicons-prefix}person:before { content: @ionicon-var-person; }\n.@{ionicons-prefix}person-add:before { content: @ionicon-var-person-add; }\n.@{ionicons-prefix}person-stalker:before { content: @ionicon-var-person-stalker; }\n.@{ionicons-prefix}pie-graph:before { content: @ionicon-var-pie-graph; }\n.@{ionicons-prefix}pin:before { content: @ionicon-var-pin; }\n.@{ionicons-prefix}pinpoint:before { content: @ionicon-var-pinpoint; }\n.@{ionicons-prefix}pizza:before { content: @ionicon-var-pizza; }\n.@{ionicons-prefix}plane:before { content: @ionicon-var-plane; }\n.@{ionicons-prefix}planet:before { content: @ionicon-var-planet; }\n.@{ionicons-prefix}play:before { content: @ionicon-var-play; }\n.@{ionicons-prefix}playstation:before { content: @ionicon-var-playstation; }\n.@{ionicons-prefix}plus:before { content: @ionicon-var-plus; }\n.@{ionicons-prefix}plus-circled:before { content: @ionicon-var-plus-circled; }\n.@{ionicons-prefix}plus-round:before { content: @ionicon-var-plus-round; }\n.@{ionicons-prefix}podium:before { content: @ionicon-var-podium; }\n.@{ionicons-prefix}pound:before { content: @ionicon-var-pound; }\n.@{ionicons-prefix}power:before { content: @ionicon-var-power; }\n.@{ionicons-prefix}pricetag:before { content: @ionicon-var-pricetag; }\n.@{ionicons-prefix}pricetags:before { content: @ionicon-var-pricetags; }\n.@{ionicons-prefix}printer:before { content: @ionicon-var-printer; }\n.@{ionicons-prefix}pull-request:before { content: @ionicon-var-pull-request; }\n.@{ionicons-prefix}qr-scanner:before { content: @ionicon-var-qr-scanner; }\n.@{ionicons-prefix}quote:before { content: @ionicon-var-quote; }\n.@{ionicons-prefix}radio-waves:before { content: @ionicon-var-radio-waves; }\n.@{ionicons-prefix}record:before { content: @ionicon-var-record; }\n.@{ionicons-prefix}refresh:before { content: @ionicon-var-refresh; }\n.@{ionicons-prefix}reply:before { content: @ionicon-var-reply; }\n.@{ionicons-prefix}reply-all:before { content: @ionicon-var-reply-all; }\n.@{ionicons-prefix}ribbon-a:before { content: @ionicon-var-ribbon-a; }\n.@{ionicons-prefix}ribbon-b:before { content: @ionicon-var-ribbon-b; }\n.@{ionicons-prefix}sad:before { content: @ionicon-var-sad; }\n.@{ionicons-prefix}sad-outline:before { content: @ionicon-var-sad-outline; }\n.@{ionicons-prefix}scissors:before { content: @ionicon-var-scissors; }\n.@{ionicons-prefix}search:before { content: @ionicon-var-search; }\n.@{ionicons-prefix}settings:before { content: @ionicon-var-settings; }\n.@{ionicons-prefix}share:before { content: @ionicon-var-share; }\n.@{ionicons-prefix}shuffle:before { content: @ionicon-var-shuffle; }\n.@{ionicons-prefix}skip-backward:before { content: @ionicon-var-skip-backward; }\n.@{ionicons-prefix}skip-forward:before { content: @ionicon-var-skip-forward; }\n.@{ionicons-prefix}social-android:before { content: @ionicon-var-social-android; }\n.@{ionicons-prefix}social-android-outline:before { content: @ionicon-var-social-android-outline; }\n.@{ionicons-prefix}social-angular:before { content: @ionicon-var-social-angular; }\n.@{ionicons-prefix}social-angular-outline:before { content: @ionicon-var-social-angular-outline; }\n.@{ionicons-prefix}social-apple:before { content: @ionicon-var-social-apple; }\n.@{ionicons-prefix}social-apple-outline:before { content: @ionicon-var-social-apple-outline; }\n.@{ionicons-prefix}social-bitcoin:before { content: @ionicon-var-social-bitcoin; }\n.@{ionicons-prefix}social-bitcoin-outline:before { content: @ionicon-var-social-bitcoin-outline; }\n.@{ionicons-prefix}social-buffer:before { content: @ionicon-var-social-buffer; }\n.@{ionicons-prefix}social-buffer-outline:before { content: @ionicon-var-social-buffer-outline; }\n.@{ionicons-prefix}social-chrome:before { content: @ionicon-var-social-chrome; }\n.@{ionicons-prefix}social-chrome-outline:before { content: @ionicon-var-social-chrome-outline; }\n.@{ionicons-prefix}social-codepen:before { content: @ionicon-var-social-codepen; }\n.@{ionicons-prefix}social-codepen-outline:before { content: @ionicon-var-social-codepen-outline; }\n.@{ionicons-prefix}social-css3:before { content: @ionicon-var-social-css3; }\n.@{ionicons-prefix}social-css3-outline:before { content: @ionicon-var-social-css3-outline; }\n.@{ionicons-prefix}social-designernews:before { content: @ionicon-var-social-designernews; }\n.@{ionicons-prefix}social-designernews-outline:before { content: @ionicon-var-social-designernews-outline; }\n.@{ionicons-prefix}social-dribbble:before { content: @ionicon-var-social-dribbble; }\n.@{ionicons-prefix}social-dribbble-outline:before { content: @ionicon-var-social-dribbble-outline; }\n.@{ionicons-prefix}social-dropbox:before { content: @ionicon-var-social-dropbox; }\n.@{ionicons-prefix}social-dropbox-outline:before { content: @ionicon-var-social-dropbox-outline; }\n.@{ionicons-prefix}social-euro:before { content: @ionicon-var-social-euro; }\n.@{ionicons-prefix}social-euro-outline:before { content: @ionicon-var-social-euro-outline; }\n.@{ionicons-prefix}social-facebook:before { content: @ionicon-var-social-facebook; }\n.@{ionicons-prefix}social-facebook-outline:before { content: @ionicon-var-social-facebook-outline; }\n.@{ionicons-prefix}social-foursquare:before { content: @ionicon-var-social-foursquare; }\n.@{ionicons-prefix}social-foursquare-outline:before { content: @ionicon-var-social-foursquare-outline; }\n.@{ionicons-prefix}social-freebsd-devil:before { content: @ionicon-var-social-freebsd-devil; }\n.@{ionicons-prefix}social-github:before { content: @ionicon-var-social-github; }\n.@{ionicons-prefix}social-github-outline:before { content: @ionicon-var-social-github-outline; }\n.@{ionicons-prefix}social-google:before { content: @ionicon-var-social-google; }\n.@{ionicons-prefix}social-google-outline:before { content: @ionicon-var-social-google-outline; }\n.@{ionicons-prefix}social-googleplus:before { content: @ionicon-var-social-googleplus; }\n.@{ionicons-prefix}social-googleplus-outline:before { content: @ionicon-var-social-googleplus-outline; }\n.@{ionicons-prefix}social-hackernews:before { content: @ionicon-var-social-hackernews; }\n.@{ionicons-prefix}social-hackernews-outline:before { content: @ionicon-var-social-hackernews-outline; }\n.@{ionicons-prefix}social-html5:before { content: @ionicon-var-social-html5; }\n.@{ionicons-prefix}social-html5-outline:before { content: @ionicon-var-social-html5-outline; }\n.@{ionicons-prefix}social-instagram:before { content: @ionicon-var-social-instagram; }\n.@{ionicons-prefix}social-instagram-outline:before { content: @ionicon-var-social-instagram-outline; }\n.@{ionicons-prefix}social-javascript:before { content: @ionicon-var-social-javascript; }\n.@{ionicons-prefix}social-javascript-outline:before { content: @ionicon-var-social-javascript-outline; }\n.@{ionicons-prefix}social-linkedin:before { content: @ionicon-var-social-linkedin; }\n.@{ionicons-prefix}social-linkedin-outline:before { content: @ionicon-var-social-linkedin-outline; }\n.@{ionicons-prefix}social-markdown:before { content: @ionicon-var-social-markdown; }\n.@{ionicons-prefix}social-nodejs:before { content: @ionicon-var-social-nodejs; }\n.@{ionicons-prefix}social-octocat:before { content: @ionicon-var-social-octocat; }\n.@{ionicons-prefix}social-pinterest:before { content: @ionicon-var-social-pinterest; }\n.@{ionicons-prefix}social-pinterest-outline:before { content: @ionicon-var-social-pinterest-outline; }\n.@{ionicons-prefix}social-python:before { content: @ionicon-var-social-python; }\n.@{ionicons-prefix}social-reddit:before { content: @ionicon-var-social-reddit; }\n.@{ionicons-prefix}social-reddit-outline:before { content: @ionicon-var-social-reddit-outline; }\n.@{ionicons-prefix}social-rss:before { content: @ionicon-var-social-rss; }\n.@{ionicons-prefix}social-rss-outline:before { content: @ionicon-var-social-rss-outline; }\n.@{ionicons-prefix}social-sass:before { content: @ionicon-var-social-sass; }\n.@{ionicons-prefix}social-skype:before { content: @ionicon-var-social-skype; }\n.@{ionicons-prefix}social-skype-outline:before { content: @ionicon-var-social-skype-outline; }\n.@{ionicons-prefix}social-snapchat:before { content: @ionicon-var-social-snapchat; }\n.@{ionicons-prefix}social-snapchat-outline:before { content: @ionicon-var-social-snapchat-outline; }\n.@{ionicons-prefix}social-tumblr:before { content: @ionicon-var-social-tumblr; }\n.@{ionicons-prefix}social-tumblr-outline:before { content: @ionicon-var-social-tumblr-outline; }\n.@{ionicons-prefix}social-tux:before { content: @ionicon-var-social-tux; }\n.@{ionicons-prefix}social-twitch:before { content: @ionicon-var-social-twitch; }\n.@{ionicons-prefix}social-twitch-outline:before { content: @ionicon-var-social-twitch-outline; }\n.@{ionicons-prefix}social-twitter:before { content: @ionicon-var-social-twitter; }\n.@{ionicons-prefix}social-twitter-outline:before { content: @ionicon-var-social-twitter-outline; }\n.@{ionicons-prefix}social-usd:before { content: @ionicon-var-social-usd; }\n.@{ionicons-prefix}social-usd-outline:before { content: @ionicon-var-social-usd-outline; }\n.@{ionicons-prefix}social-vimeo:before { content: @ionicon-var-social-vimeo; }\n.@{ionicons-prefix}social-vimeo-outline:before { content: @ionicon-var-social-vimeo-outline; }\n.@{ionicons-prefix}social-whatsapp:before { content: @ionicon-var-social-whatsapp; }\n.@{ionicons-prefix}social-whatsapp-outline:before { content: @ionicon-var-social-whatsapp-outline; }\n.@{ionicons-prefix}social-windows:before { content: @ionicon-var-social-windows; }\n.@{ionicons-prefix}social-windows-outline:before { content: @ionicon-var-social-windows-outline; }\n.@{ionicons-prefix}social-wordpress:before { content: @ionicon-var-social-wordpress; }\n.@{ionicons-prefix}social-wordpress-outline:before { content: @ionicon-var-social-wordpress-outline; }\n.@{ionicons-prefix}social-yahoo:before { content: @ionicon-var-social-yahoo; }\n.@{ionicons-prefix}social-yahoo-outline:before { content: @ionicon-var-social-yahoo-outline; }\n.@{ionicons-prefix}social-yen:before { content: @ionicon-var-social-yen; }\n.@{ionicons-prefix}social-yen-outline:before { content: @ionicon-var-social-yen-outline; }\n.@{ionicons-prefix}social-youtube:before { content: @ionicon-var-social-youtube; }\n.@{ionicons-prefix}social-youtube-outline:before { content: @ionicon-var-social-youtube-outline; }\n.@{ionicons-prefix}soup-can:before { content: @ionicon-var-soup-can; }\n.@{ionicons-prefix}soup-can-outline:before { content: @ionicon-var-soup-can-outline; }\n.@{ionicons-prefix}speakerphone:before { content: @ionicon-var-speakerphone; }\n.@{ionicons-prefix}speedometer:before { content: @ionicon-var-speedometer; }\n.@{ionicons-prefix}spoon:before { content: @ionicon-var-spoon; }\n.@{ionicons-prefix}star:before { content: @ionicon-var-star; }\n.@{ionicons-prefix}stats-bars:before { content: @ionicon-var-stats-bars; }\n.@{ionicons-prefix}steam:before { content: @ionicon-var-steam; }\n.@{ionicons-prefix}stop:before { content: @ionicon-var-stop; }\n.@{ionicons-prefix}thermometer:before { content: @ionicon-var-thermometer; }\n.@{ionicons-prefix}thumbsdown:before { content: @ionicon-var-thumbsdown; }\n.@{ionicons-prefix}thumbsup:before { content: @ionicon-var-thumbsup; }\n.@{ionicons-prefix}toggle:before { content: @ionicon-var-toggle; }\n.@{ionicons-prefix}toggle-filled:before { content: @ionicon-var-toggle-filled; }\n.@{ionicons-prefix}transgender:before { content: @ionicon-var-transgender; }\n.@{ionicons-prefix}trash-a:before { content: @ionicon-var-trash-a; }\n.@{ionicons-prefix}trash-b:before { content: @ionicon-var-trash-b; }\n.@{ionicons-prefix}trophy:before { content: @ionicon-var-trophy; }\n.@{ionicons-prefix}tshirt:before { content: @ionicon-var-tshirt; }\n.@{ionicons-prefix}tshirt-outline:before { content: @ionicon-var-tshirt-outline; }\n.@{ionicons-prefix}umbrella:before { content: @ionicon-var-umbrella; }\n.@{ionicons-prefix}university:before { content: @ionicon-var-university; }\n.@{ionicons-prefix}unlocked:before { content: @ionicon-var-unlocked; }\n.@{ionicons-prefix}upload:before { content: @ionicon-var-upload; }\n.@{ionicons-prefix}usb:before { content: @ionicon-var-usb; }\n.@{ionicons-prefix}videocamera:before { content: @ionicon-var-videocamera; }\n.@{ionicons-prefix}volume-high:before { content: @ionicon-var-volume-high; }\n.@{ionicons-prefix}volume-low:before { content: @ionicon-var-volume-low; }\n.@{ionicons-prefix}volume-medium:before { content: @ionicon-var-volume-medium; }\n.@{ionicons-prefix}volume-mute:before { content: @ionicon-var-volume-mute; }\n.@{ionicons-prefix}wand:before { content: @ionicon-var-wand; }\n.@{ionicons-prefix}waterdrop:before { content: @ionicon-var-waterdrop; }\n.@{ionicons-prefix}wifi:before { content: @ionicon-var-wifi; }\n.@{ionicons-prefix}wineglass:before { content: @ionicon-var-wineglass; }\n.@{ionicons-prefix}woman:before { content: @ionicon-var-woman; }\n.@{ionicons-prefix}wrench:before { content: @ionicon-var-wrench; }\n.@{ionicons-prefix}xbox:before { content: @ionicon-var-xbox; }"
  },
  {
    "path": "client/less/lib/ionicons/_ionicons-variables.less",
    "content": "/*!\nIonicons, v2.0.0\nCreated by Ben Sperry for the Ionic Framework, http://ionicons.com/\nhttps://twitter.com/benjsperry  https://twitter.com/ionicframework\nMIT License: https://github.com/driftyco/ionicons\n*/\n// Ionicons Variables\n// --------------------------\n\n@ionicons-font-path: \"../fonts\";\n@ionicons-font-family: \"Ionicons\";\n@ionicons-version: \"2.0.0\";\n@ionicons-prefix: ion-;\n\n@ionicon-var-alert: \"\\f101\";\n@ionicon-var-alert-circled: \"\\f100\";\n@ionicon-var-android-add: \"\\f2c7\";\n@ionicon-var-android-add-circle: \"\\f359\";\n@ionicon-var-android-alarm-clock: \"\\f35a\";\n@ionicon-var-android-alert: \"\\f35b\";\n@ionicon-var-android-apps: \"\\f35c\";\n@ionicon-var-android-archive: \"\\f2c9\";\n@ionicon-var-android-arrow-back: \"\\f2ca\";\n@ionicon-var-android-arrow-down: \"\\f35d\";\n@ionicon-var-android-arrow-dropdown: \"\\f35f\";\n@ionicon-var-android-arrow-dropdown-circle: \"\\f35e\";\n@ionicon-var-android-arrow-dropleft: \"\\f361\";\n@ionicon-var-android-arrow-dropleft-circle: \"\\f360\";\n@ionicon-var-android-arrow-dropright: \"\\f363\";\n@ionicon-var-android-arrow-dropright-circle: \"\\f362\";\n@ionicon-var-android-arrow-dropup: \"\\f365\";\n@ionicon-var-android-arrow-dropup-circle: \"\\f364\";\n@ionicon-var-android-arrow-forward: \"\\f30f\";\n@ionicon-var-android-arrow-up: \"\\f366\";\n@ionicon-var-android-attach: \"\\f367\";\n@ionicon-var-android-bar: \"\\f368\";\n@ionicon-var-android-bicycle: \"\\f369\";\n@ionicon-var-android-boat: \"\\f36a\";\n@ionicon-var-android-bookmark: \"\\f36b\";\n@ionicon-var-android-bulb: \"\\f36c\";\n@ionicon-var-android-bus: \"\\f36d\";\n@ionicon-var-android-calendar: \"\\f2d1\";\n@ionicon-var-android-call: \"\\f2d2\";\n@ionicon-var-android-camera: \"\\f2d3\";\n@ionicon-var-android-cancel: \"\\f36e\";\n@ionicon-var-android-car: \"\\f36f\";\n@ionicon-var-android-cart: \"\\f370\";\n@ionicon-var-android-chat: \"\\f2d4\";\n@ionicon-var-android-checkbox: \"\\f374\";\n@ionicon-var-android-checkbox-blank: \"\\f371\";\n@ionicon-var-android-checkbox-outline: \"\\f373\";\n@ionicon-var-android-checkbox-outline-blank: \"\\f372\";\n@ionicon-var-android-checkmark-circle: \"\\f375\";\n@ionicon-var-android-clipboard: \"\\f376\";\n@ionicon-var-android-close: \"\\f2d7\";\n@ionicon-var-android-cloud: \"\\f37a\";\n@ionicon-var-android-cloud-circle: \"\\f377\";\n@ionicon-var-android-cloud-done: \"\\f378\";\n@ionicon-var-android-cloud-outline: \"\\f379\";\n@ionicon-var-android-color-palette: \"\\f37b\";\n@ionicon-var-android-compass: \"\\f37c\";\n@ionicon-var-android-contact: \"\\f2d8\";\n@ionicon-var-android-contacts: \"\\f2d9\";\n@ionicon-var-android-contract: \"\\f37d\";\n@ionicon-var-android-create: \"\\f37e\";\n@ionicon-var-android-delete: \"\\f37f\";\n@ionicon-var-android-desktop: \"\\f380\";\n@ionicon-var-android-document: \"\\f381\";\n@ionicon-var-android-done: \"\\f383\";\n@ionicon-var-android-done-all: \"\\f382\";\n@ionicon-var-android-download: \"\\f2dd\";\n@ionicon-var-android-drafts: \"\\f384\";\n@ionicon-var-android-exit: \"\\f385\";\n@ionicon-var-android-expand: \"\\f386\";\n@ionicon-var-android-favorite: \"\\f388\";\n@ionicon-var-android-favorite-outline: \"\\f387\";\n@ionicon-var-android-film: \"\\f389\";\n@ionicon-var-android-folder: \"\\f2e0\";\n@ionicon-var-android-folder-open: \"\\f38a\";\n@ionicon-var-android-funnel: \"\\f38b\";\n@ionicon-var-android-globe: \"\\f38c\";\n@ionicon-var-android-hand: \"\\f2e3\";\n@ionicon-var-android-hangout: \"\\f38d\";\n@ionicon-var-android-happy: \"\\f38e\";\n@ionicon-var-android-home: \"\\f38f\";\n@ionicon-var-android-image: \"\\f2e4\";\n@ionicon-var-android-laptop: \"\\f390\";\n@ionicon-var-android-list: \"\\f391\";\n@ionicon-var-android-locate: \"\\f2e9\";\n@ionicon-var-android-lock: \"\\f392\";\n@ionicon-var-android-mail: \"\\f2eb\";\n@ionicon-var-android-map: \"\\f393\";\n@ionicon-var-android-menu: \"\\f394\";\n@ionicon-var-android-microphone: \"\\f2ec\";\n@ionicon-var-android-microphone-off: \"\\f395\";\n@ionicon-var-android-more-horizontal: \"\\f396\";\n@ionicon-var-android-more-vertical: \"\\f397\";\n@ionicon-var-android-navigate: \"\\f398\";\n@ionicon-var-android-notifications: \"\\f39b\";\n@ionicon-var-android-notifications-none: \"\\f399\";\n@ionicon-var-android-notifications-off: \"\\f39a\";\n@ionicon-var-android-open: \"\\f39c\";\n@ionicon-var-android-options: \"\\f39d\";\n@ionicon-var-android-people: \"\\f39e\";\n@ionicon-var-android-person: \"\\f3a0\";\n@ionicon-var-android-person-add: \"\\f39f\";\n@ionicon-var-android-phone-landscape: \"\\f3a1\";\n@ionicon-var-android-phone-portrait: \"\\f3a2\";\n@ionicon-var-android-pin: \"\\f3a3\";\n@ionicon-var-android-plane: \"\\f3a4\";\n@ionicon-var-android-playstore: \"\\f2f0\";\n@ionicon-var-android-print: \"\\f3a5\";\n@ionicon-var-android-radio-button-off: \"\\f3a6\";\n@ionicon-var-android-radio-button-on: \"\\f3a7\";\n@ionicon-var-android-refresh: \"\\f3a8\";\n@ionicon-var-android-remove: \"\\f2f4\";\n@ionicon-var-android-remove-circle: \"\\f3a9\";\n@ionicon-var-android-restaurant: \"\\f3aa\";\n@ionicon-var-android-sad: \"\\f3ab\";\n@ionicon-var-android-search: \"\\f2f5\";\n@ionicon-var-android-send: \"\\f2f6\";\n@ionicon-var-android-settings: \"\\f2f7\";\n@ionicon-var-android-share: \"\\f2f8\";\n@ionicon-var-android-share-alt: \"\\f3ac\";\n@ionicon-var-android-star: \"\\f2fc\";\n@ionicon-var-android-star-half: \"\\f3ad\";\n@ionicon-var-android-star-outline: \"\\f3ae\";\n@ionicon-var-android-stopwatch: \"\\f2fd\";\n@ionicon-var-android-subway: \"\\f3af\";\n@ionicon-var-android-sunny: \"\\f3b0\";\n@ionicon-var-android-sync: \"\\f3b1\";\n@ionicon-var-android-textsms: \"\\f3b2\";\n@ionicon-var-android-time: \"\\f3b3\";\n@ionicon-var-android-train: \"\\f3b4\";\n@ionicon-var-android-unlock: \"\\f3b5\";\n@ionicon-var-android-upload: \"\\f3b6\";\n@ionicon-var-android-volume-down: \"\\f3b7\";\n@ionicon-var-android-volume-mute: \"\\f3b8\";\n@ionicon-var-android-volume-off: \"\\f3b9\";\n@ionicon-var-android-volume-up: \"\\f3ba\";\n@ionicon-var-android-walk: \"\\f3bb\";\n@ionicon-var-android-warning: \"\\f3bc\";\n@ionicon-var-android-watch: \"\\f3bd\";\n@ionicon-var-android-wifi: \"\\f305\";\n@ionicon-var-aperture: \"\\f313\";\n@ionicon-var-archive: \"\\f102\";\n@ionicon-var-arrow-down-a: \"\\f103\";\n@ionicon-var-arrow-down-b: \"\\f104\";\n@ionicon-var-arrow-down-c: \"\\f105\";\n@ionicon-var-arrow-expand: \"\\f25e\";\n@ionicon-var-arrow-graph-down-left: \"\\f25f\";\n@ionicon-var-arrow-graph-down-right: \"\\f260\";\n@ionicon-var-arrow-graph-up-left: \"\\f261\";\n@ionicon-var-arrow-graph-up-right: \"\\f262\";\n@ionicon-var-arrow-left-a: \"\\f106\";\n@ionicon-var-arrow-left-b: \"\\f107\";\n@ionicon-var-arrow-left-c: \"\\f108\";\n@ionicon-var-arrow-move: \"\\f263\";\n@ionicon-var-arrow-resize: \"\\f264\";\n@ionicon-var-arrow-return-left: \"\\f265\";\n@ionicon-var-arrow-return-right: \"\\f266\";\n@ionicon-var-arrow-right-a: \"\\f109\";\n@ionicon-var-arrow-right-b: \"\\f10a\";\n@ionicon-var-arrow-right-c: \"\\f10b\";\n@ionicon-var-arrow-shrink: \"\\f267\";\n@ionicon-var-arrow-swap: \"\\f268\";\n@ionicon-var-arrow-up-a: \"\\f10c\";\n@ionicon-var-arrow-up-b: \"\\f10d\";\n@ionicon-var-arrow-up-c: \"\\f10e\";\n@ionicon-var-asterisk: \"\\f314\";\n@ionicon-var-at: \"\\f10f\";\n@ionicon-var-backspace: \"\\f3bf\";\n@ionicon-var-backspace-outline: \"\\f3be\";\n@ionicon-var-bag: \"\\f110\";\n@ionicon-var-battery-charging: \"\\f111\";\n@ionicon-var-battery-empty: \"\\f112\";\n@ionicon-var-battery-full: \"\\f113\";\n@ionicon-var-battery-half: \"\\f114\";\n@ionicon-var-battery-low: \"\\f115\";\n@ionicon-var-beaker: \"\\f269\";\n@ionicon-var-beer: \"\\f26a\";\n@ionicon-var-bluetooth: \"\\f116\";\n@ionicon-var-bonfire: \"\\f315\";\n@ionicon-var-bookmark: \"\\f26b\";\n@ionicon-var-bowtie: \"\\f3c0\";\n@ionicon-var-briefcase: \"\\f26c\";\n@ionicon-var-bug: \"\\f2be\";\n@ionicon-var-calculator: \"\\f26d\";\n@ionicon-var-calendar: \"\\f117\";\n@ionicon-var-camera: \"\\f118\";\n@ionicon-var-card: \"\\f119\";\n@ionicon-var-cash: \"\\f316\";\n@ionicon-var-chatbox: \"\\f11b\";\n@ionicon-var-chatbox-working: \"\\f11a\";\n@ionicon-var-chatboxes: \"\\f11c\";\n@ionicon-var-chatbubble: \"\\f11e\";\n@ionicon-var-chatbubble-working: \"\\f11d\";\n@ionicon-var-chatbubbles: \"\\f11f\";\n@ionicon-var-checkmark: \"\\f122\";\n@ionicon-var-checkmark-circled: \"\\f120\";\n@ionicon-var-checkmark-round: \"\\f121\";\n@ionicon-var-chevron-down: \"\\f123\";\n@ionicon-var-chevron-left: \"\\f124\";\n@ionicon-var-chevron-right: \"\\f125\";\n@ionicon-var-chevron-up: \"\\f126\";\n@ionicon-var-clipboard: \"\\f127\";\n@ionicon-var-clock: \"\\f26e\";\n@ionicon-var-close: \"\\f12a\";\n@ionicon-var-close-circled: \"\\f128\";\n@ionicon-var-close-round: \"\\f129\";\n@ionicon-var-closed-captioning: \"\\f317\";\n@ionicon-var-cloud: \"\\f12b\";\n@ionicon-var-code: \"\\f271\";\n@ionicon-var-code-download: \"\\f26f\";\n@ionicon-var-code-working: \"\\f270\";\n@ionicon-var-coffee: \"\\f272\";\n@ionicon-var-compass: \"\\f273\";\n@ionicon-var-compose: \"\\f12c\";\n@ionicon-var-connection-bars: \"\\f274\";\n@ionicon-var-contrast: \"\\f275\";\n@ionicon-var-crop: \"\\f3c1\";\n@ionicon-var-cube: \"\\f318\";\n@ionicon-var-disc: \"\\f12d\";\n@ionicon-var-document: \"\\f12f\";\n@ionicon-var-document-text: \"\\f12e\";\n@ionicon-var-drag: \"\\f130\";\n@ionicon-var-earth: \"\\f276\";\n@ionicon-var-easel: \"\\f3c2\";\n@ionicon-var-edit: \"\\f2bf\";\n@ionicon-var-egg: \"\\f277\";\n@ionicon-var-eject: \"\\f131\";\n@ionicon-var-email: \"\\f132\";\n@ionicon-var-email-unread: \"\\f3c3\";\n@ionicon-var-erlenmeyer-flask: \"\\f3c5\";\n@ionicon-var-erlenmeyer-flask-bubbles: \"\\f3c4\";\n@ionicon-var-eye: \"\\f133\";\n@ionicon-var-eye-disabled: \"\\f306\";\n@ionicon-var-female: \"\\f278\";\n@ionicon-var-filing: \"\\f134\";\n@ionicon-var-film-marker: \"\\f135\";\n@ionicon-var-fireball: \"\\f319\";\n@ionicon-var-flag: \"\\f279\";\n@ionicon-var-flame: \"\\f31a\";\n@ionicon-var-flash: \"\\f137\";\n@ionicon-var-flash-off: \"\\f136\";\n@ionicon-var-folder: \"\\f139\";\n@ionicon-var-fork: \"\\f27a\";\n@ionicon-var-fork-repo: \"\\f2c0\";\n@ionicon-var-forward: \"\\f13a\";\n@ionicon-var-funnel: \"\\f31b\";\n@ionicon-var-gear-a: \"\\f13d\";\n@ionicon-var-gear-b: \"\\f13e\";\n@ionicon-var-grid: \"\\f13f\";\n@ionicon-var-hammer: \"\\f27b\";\n@ionicon-var-happy: \"\\f31c\";\n@ionicon-var-happy-outline: \"\\f3c6\";\n@ionicon-var-headphone: \"\\f140\";\n@ionicon-var-heart: \"\\f141\";\n@ionicon-var-heart-broken: \"\\f31d\";\n@ionicon-var-help: \"\\f143\";\n@ionicon-var-help-buoy: \"\\f27c\";\n@ionicon-var-help-circled: \"\\f142\";\n@ionicon-var-home: \"\\f144\";\n@ionicon-var-icecream: \"\\f27d\";\n@ionicon-var-image: \"\\f147\";\n@ionicon-var-images: \"\\f148\";\n@ionicon-var-information: \"\\f14a\";\n@ionicon-var-information-circled: \"\\f149\";\n@ionicon-var-ionic: \"\\f14b\";\n@ionicon-var-ios-alarm: \"\\f3c8\";\n@ionicon-var-ios-alarm-outline: \"\\f3c7\";\n@ionicon-var-ios-albums: \"\\f3ca\";\n@ionicon-var-ios-albums-outline: \"\\f3c9\";\n@ionicon-var-ios-americanfootball: \"\\f3cc\";\n@ionicon-var-ios-americanfootball-outline: \"\\f3cb\";\n@ionicon-var-ios-analytics: \"\\f3ce\";\n@ionicon-var-ios-analytics-outline: \"\\f3cd\";\n@ionicon-var-ios-arrow-back: \"\\f3cf\";\n@ionicon-var-ios-arrow-down: \"\\f3d0\";\n@ionicon-var-ios-arrow-forward: \"\\f3d1\";\n@ionicon-var-ios-arrow-left: \"\\f3d2\";\n@ionicon-var-ios-arrow-right: \"\\f3d3\";\n@ionicon-var-ios-arrow-thin-down: \"\\f3d4\";\n@ionicon-var-ios-arrow-thin-left: \"\\f3d5\";\n@ionicon-var-ios-arrow-thin-right: \"\\f3d6\";\n@ionicon-var-ios-arrow-thin-up: \"\\f3d7\";\n@ionicon-var-ios-arrow-up: \"\\f3d8\";\n@ionicon-var-ios-at: \"\\f3da\";\n@ionicon-var-ios-at-outline: \"\\f3d9\";\n@ionicon-var-ios-barcode: \"\\f3dc\";\n@ionicon-var-ios-barcode-outline: \"\\f3db\";\n@ionicon-var-ios-baseball: \"\\f3de\";\n@ionicon-var-ios-baseball-outline: \"\\f3dd\";\n@ionicon-var-ios-basketball: \"\\f3e0\";\n@ionicon-var-ios-basketball-outline: \"\\f3df\";\n@ionicon-var-ios-bell: \"\\f3e2\";\n@ionicon-var-ios-bell-outline: \"\\f3e1\";\n@ionicon-var-ios-body: \"\\f3e4\";\n@ionicon-var-ios-body-outline: \"\\f3e3\";\n@ionicon-var-ios-bolt: \"\\f3e6\";\n@ionicon-var-ios-bolt-outline: \"\\f3e5\";\n@ionicon-var-ios-book: \"\\f3e8\";\n@ionicon-var-ios-book-outline: \"\\f3e7\";\n@ionicon-var-ios-bookmarks: \"\\f3ea\";\n@ionicon-var-ios-bookmarks-outline: \"\\f3e9\";\n@ionicon-var-ios-box: \"\\f3ec\";\n@ionicon-var-ios-box-outline: \"\\f3eb\";\n@ionicon-var-ios-briefcase: \"\\f3ee\";\n@ionicon-var-ios-briefcase-outline: \"\\f3ed\";\n@ionicon-var-ios-browsers: \"\\f3f0\";\n@ionicon-var-ios-browsers-outline: \"\\f3ef\";\n@ionicon-var-ios-calculator: \"\\f3f2\";\n@ionicon-var-ios-calculator-outline: \"\\f3f1\";\n@ionicon-var-ios-calendar: \"\\f3f4\";\n@ionicon-var-ios-calendar-outline: \"\\f3f3\";\n@ionicon-var-ios-camera: \"\\f3f6\";\n@ionicon-var-ios-camera-outline: \"\\f3f5\";\n@ionicon-var-ios-cart: \"\\f3f8\";\n@ionicon-var-ios-cart-outline: \"\\f3f7\";\n@ionicon-var-ios-chatboxes: \"\\f3fa\";\n@ionicon-var-ios-chatboxes-outline: \"\\f3f9\";\n@ionicon-var-ios-chatbubble: \"\\f3fc\";\n@ionicon-var-ios-chatbubble-outline: \"\\f3fb\";\n@ionicon-var-ios-checkmark: \"\\f3ff\";\n@ionicon-var-ios-checkmark-empty: \"\\f3fd\";\n@ionicon-var-ios-checkmark-outline: \"\\f3fe\";\n@ionicon-var-ios-circle-filled: \"\\f400\";\n@ionicon-var-ios-circle-outline: \"\\f401\";\n@ionicon-var-ios-clock: \"\\f403\";\n@ionicon-var-ios-clock-outline: \"\\f402\";\n@ionicon-var-ios-close: \"\\f406\";\n@ionicon-var-ios-close-empty: \"\\f404\";\n@ionicon-var-ios-close-outline: \"\\f405\";\n@ionicon-var-ios-cloud: \"\\f40c\";\n@ionicon-var-ios-cloud-download: \"\\f408\";\n@ionicon-var-ios-cloud-download-outline: \"\\f407\";\n@ionicon-var-ios-cloud-outline: \"\\f409\";\n@ionicon-var-ios-cloud-upload: \"\\f40b\";\n@ionicon-var-ios-cloud-upload-outline: \"\\f40a\";\n@ionicon-var-ios-cloudy: \"\\f410\";\n@ionicon-var-ios-cloudy-night: \"\\f40e\";\n@ionicon-var-ios-cloudy-night-outline: \"\\f40d\";\n@ionicon-var-ios-cloudy-outline: \"\\f40f\";\n@ionicon-var-ios-cog: \"\\f412\";\n@ionicon-var-ios-cog-outline: \"\\f411\";\n@ionicon-var-ios-color-filter: \"\\f414\";\n@ionicon-var-ios-color-filter-outline: \"\\f413\";\n@ionicon-var-ios-color-wand: \"\\f416\";\n@ionicon-var-ios-color-wand-outline: \"\\f415\";\n@ionicon-var-ios-compose: \"\\f418\";\n@ionicon-var-ios-compose-outline: \"\\f417\";\n@ionicon-var-ios-contact: \"\\f41a\";\n@ionicon-var-ios-contact-outline: \"\\f419\";\n@ionicon-var-ios-copy: \"\\f41c\";\n@ionicon-var-ios-copy-outline: \"\\f41b\";\n@ionicon-var-ios-crop: \"\\f41e\";\n@ionicon-var-ios-crop-strong: \"\\f41d\";\n@ionicon-var-ios-download: \"\\f420\";\n@ionicon-var-ios-download-outline: \"\\f41f\";\n@ionicon-var-ios-drag: \"\\f421\";\n@ionicon-var-ios-email: \"\\f423\";\n@ionicon-var-ios-email-outline: \"\\f422\";\n@ionicon-var-ios-eye: \"\\f425\";\n@ionicon-var-ios-eye-outline: \"\\f424\";\n@ionicon-var-ios-fastforward: \"\\f427\";\n@ionicon-var-ios-fastforward-outline: \"\\f426\";\n@ionicon-var-ios-filing: \"\\f429\";\n@ionicon-var-ios-filing-outline: \"\\f428\";\n@ionicon-var-ios-film: \"\\f42b\";\n@ionicon-var-ios-film-outline: \"\\f42a\";\n@ionicon-var-ios-flag: \"\\f42d\";\n@ionicon-var-ios-flag-outline: \"\\f42c\";\n@ionicon-var-ios-flame: \"\\f42f\";\n@ionicon-var-ios-flame-outline: \"\\f42e\";\n@ionicon-var-ios-flask: \"\\f431\";\n@ionicon-var-ios-flask-outline: \"\\f430\";\n@ionicon-var-ios-flower: \"\\f433\";\n@ionicon-var-ios-flower-outline: \"\\f432\";\n@ionicon-var-ios-folder: \"\\f435\";\n@ionicon-var-ios-folder-outline: \"\\f434\";\n@ionicon-var-ios-football: \"\\f437\";\n@ionicon-var-ios-football-outline: \"\\f436\";\n@ionicon-var-ios-game-controller-a: \"\\f439\";\n@ionicon-var-ios-game-controller-a-outline: \"\\f438\";\n@ionicon-var-ios-game-controller-b: \"\\f43b\";\n@ionicon-var-ios-game-controller-b-outline: \"\\f43a\";\n@ionicon-var-ios-gear: \"\\f43d\";\n@ionicon-var-ios-gear-outline: \"\\f43c\";\n@ionicon-var-ios-glasses: \"\\f43f\";\n@ionicon-var-ios-glasses-outline: \"\\f43e\";\n@ionicon-var-ios-grid-view: \"\\f441\";\n@ionicon-var-ios-grid-view-outline: \"\\f440\";\n@ionicon-var-ios-heart: \"\\f443\";\n@ionicon-var-ios-heart-outline: \"\\f442\";\n@ionicon-var-ios-help: \"\\f446\";\n@ionicon-var-ios-help-empty: \"\\f444\";\n@ionicon-var-ios-help-outline: \"\\f445\";\n@ionicon-var-ios-home: \"\\f448\";\n@ionicon-var-ios-home-outline: \"\\f447\";\n@ionicon-var-ios-infinite: \"\\f44a\";\n@ionicon-var-ios-infinite-outline: \"\\f449\";\n@ionicon-var-ios-information: \"\\f44d\";\n@ionicon-var-ios-information-empty: \"\\f44b\";\n@ionicon-var-ios-information-outline: \"\\f44c\";\n@ionicon-var-ios-ionic-outline: \"\\f44e\";\n@ionicon-var-ios-keypad: \"\\f450\";\n@ionicon-var-ios-keypad-outline: \"\\f44f\";\n@ionicon-var-ios-lightbulb: \"\\f452\";\n@ionicon-var-ios-lightbulb-outline: \"\\f451\";\n@ionicon-var-ios-list: \"\\f454\";\n@ionicon-var-ios-list-outline: \"\\f453\";\n@ionicon-var-ios-location: \"\\f456\";\n@ionicon-var-ios-location-outline: \"\\f455\";\n@ionicon-var-ios-locked: \"\\f458\";\n@ionicon-var-ios-locked-outline: \"\\f457\";\n@ionicon-var-ios-loop: \"\\f45a\";\n@ionicon-var-ios-loop-strong: \"\\f459\";\n@ionicon-var-ios-medical: \"\\f45c\";\n@ionicon-var-ios-medical-outline: \"\\f45b\";\n@ionicon-var-ios-medkit: \"\\f45e\";\n@ionicon-var-ios-medkit-outline: \"\\f45d\";\n@ionicon-var-ios-mic: \"\\f461\";\n@ionicon-var-ios-mic-off: \"\\f45f\";\n@ionicon-var-ios-mic-outline: \"\\f460\";\n@ionicon-var-ios-minus: \"\\f464\";\n@ionicon-var-ios-minus-empty: \"\\f462\";\n@ionicon-var-ios-minus-outline: \"\\f463\";\n@ionicon-var-ios-monitor: \"\\f466\";\n@ionicon-var-ios-monitor-outline: \"\\f465\";\n@ionicon-var-ios-moon: \"\\f468\";\n@ionicon-var-ios-moon-outline: \"\\f467\";\n@ionicon-var-ios-more: \"\\f46a\";\n@ionicon-var-ios-more-outline: \"\\f469\";\n@ionicon-var-ios-musical-note: \"\\f46b\";\n@ionicon-var-ios-musical-notes: \"\\f46c\";\n@ionicon-var-ios-navigate: \"\\f46e\";\n@ionicon-var-ios-navigate-outline: \"\\f46d\";\n@ionicon-var-ios-nutrition: \"\\f470\";\n@ionicon-var-ios-nutrition-outline: \"\\f46f\";\n@ionicon-var-ios-paper: \"\\f472\";\n@ionicon-var-ios-paper-outline: \"\\f471\";\n@ionicon-var-ios-paperplane: \"\\f474\";\n@ionicon-var-ios-paperplane-outline: \"\\f473\";\n@ionicon-var-ios-partlysunny: \"\\f476\";\n@ionicon-var-ios-partlysunny-outline: \"\\f475\";\n@ionicon-var-ios-pause: \"\\f478\";\n@ionicon-var-ios-pause-outline: \"\\f477\";\n@ionicon-var-ios-paw: \"\\f47a\";\n@ionicon-var-ios-paw-outline: \"\\f479\";\n@ionicon-var-ios-people: \"\\f47c\";\n@ionicon-var-ios-people-outline: \"\\f47b\";\n@ionicon-var-ios-person: \"\\f47e\";\n@ionicon-var-ios-person-outline: \"\\f47d\";\n@ionicon-var-ios-personadd: \"\\f480\";\n@ionicon-var-ios-personadd-outline: \"\\f47f\";\n@ionicon-var-ios-photos: \"\\f482\";\n@ionicon-var-ios-photos-outline: \"\\f481\";\n@ionicon-var-ios-pie: \"\\f484\";\n@ionicon-var-ios-pie-outline: \"\\f483\";\n@ionicon-var-ios-pint: \"\\f486\";\n@ionicon-var-ios-pint-outline: \"\\f485\";\n@ionicon-var-ios-play: \"\\f488\";\n@ionicon-var-ios-play-outline: \"\\f487\";\n@ionicon-var-ios-plus: \"\\f48b\";\n@ionicon-var-ios-plus-empty: \"\\f489\";\n@ionicon-var-ios-plus-outline: \"\\f48a\";\n@ionicon-var-ios-pricetag: \"\\f48d\";\n@ionicon-var-ios-pricetag-outline: \"\\f48c\";\n@ionicon-var-ios-pricetags: \"\\f48f\";\n@ionicon-var-ios-pricetags-outline: \"\\f48e\";\n@ionicon-var-ios-printer: \"\\f491\";\n@ionicon-var-ios-printer-outline: \"\\f490\";\n@ionicon-var-ios-pulse: \"\\f493\";\n@ionicon-var-ios-pulse-strong: \"\\f492\";\n@ionicon-var-ios-rainy: \"\\f495\";\n@ionicon-var-ios-rainy-outline: \"\\f494\";\n@ionicon-var-ios-recording: \"\\f497\";\n@ionicon-var-ios-recording-outline: \"\\f496\";\n@ionicon-var-ios-redo: \"\\f499\";\n@ionicon-var-ios-redo-outline: \"\\f498\";\n@ionicon-var-ios-refresh: \"\\f49c\";\n@ionicon-var-ios-refresh-empty: \"\\f49a\";\n@ionicon-var-ios-refresh-outline: \"\\f49b\";\n@ionicon-var-ios-reload: \"\\f49d\";\n@ionicon-var-ios-reverse-camera: \"\\f49f\";\n@ionicon-var-ios-reverse-camera-outline: \"\\f49e\";\n@ionicon-var-ios-rewind: \"\\f4a1\";\n@ionicon-var-ios-rewind-outline: \"\\f4a0\";\n@ionicon-var-ios-rose: \"\\f4a3\";\n@ionicon-var-ios-rose-outline: \"\\f4a2\";\n@ionicon-var-ios-search: \"\\f4a5\";\n@ionicon-var-ios-search-strong: \"\\f4a4\";\n@ionicon-var-ios-settings: \"\\f4a7\";\n@ionicon-var-ios-settings-strong: \"\\f4a6\";\n@ionicon-var-ios-shuffle: \"\\f4a9\";\n@ionicon-var-ios-shuffle-strong: \"\\f4a8\";\n@ionicon-var-ios-skipbackward: \"\\f4ab\";\n@ionicon-var-ios-skipbackward-outline: \"\\f4aa\";\n@ionicon-var-ios-skipforward: \"\\f4ad\";\n@ionicon-var-ios-skipforward-outline: \"\\f4ac\";\n@ionicon-var-ios-snowy: \"\\f4ae\";\n@ionicon-var-ios-speedometer: \"\\f4b0\";\n@ionicon-var-ios-speedometer-outline: \"\\f4af\";\n@ionicon-var-ios-star: \"\\f4b3\";\n@ionicon-var-ios-star-half: \"\\f4b1\";\n@ionicon-var-ios-star-outline: \"\\f4b2\";\n@ionicon-var-ios-stopwatch: \"\\f4b5\";\n@ionicon-var-ios-stopwatch-outline: \"\\f4b4\";\n@ionicon-var-ios-sunny: \"\\f4b7\";\n@ionicon-var-ios-sunny-outline: \"\\f4b6\";\n@ionicon-var-ios-telephone: \"\\f4b9\";\n@ionicon-var-ios-telephone-outline: \"\\f4b8\";\n@ionicon-var-ios-tennisball: \"\\f4bb\";\n@ionicon-var-ios-tennisball-outline: \"\\f4ba\";\n@ionicon-var-ios-thunderstorm: \"\\f4bd\";\n@ionicon-var-ios-thunderstorm-outline: \"\\f4bc\";\n@ionicon-var-ios-time: \"\\f4bf\";\n@ionicon-var-ios-time-outline: \"\\f4be\";\n@ionicon-var-ios-timer: \"\\f4c1\";\n@ionicon-var-ios-timer-outline: \"\\f4c0\";\n@ionicon-var-ios-toggle: \"\\f4c3\";\n@ionicon-var-ios-toggle-outline: \"\\f4c2\";\n@ionicon-var-ios-trash: \"\\f4c5\";\n@ionicon-var-ios-trash-outline: \"\\f4c4\";\n@ionicon-var-ios-undo: \"\\f4c7\";\n@ionicon-var-ios-undo-outline: \"\\f4c6\";\n@ionicon-var-ios-unlocked: \"\\f4c9\";\n@ionicon-var-ios-unlocked-outline: \"\\f4c8\";\n@ionicon-var-ios-upload: \"\\f4cb\";\n@ionicon-var-ios-upload-outline: \"\\f4ca\";\n@ionicon-var-ios-videocam: \"\\f4cd\";\n@ionicon-var-ios-videocam-outline: \"\\f4cc\";\n@ionicon-var-ios-volume-high: \"\\f4ce\";\n@ionicon-var-ios-volume-low: \"\\f4cf\";\n@ionicon-var-ios-wineglass: \"\\f4d1\";\n@ionicon-var-ios-wineglass-outline: \"\\f4d0\";\n@ionicon-var-ios-world: \"\\f4d3\";\n@ionicon-var-ios-world-outline: \"\\f4d2\";\n@ionicon-var-ipad: \"\\f1f9\";\n@ionicon-var-iphone: \"\\f1fa\";\n@ionicon-var-ipod: \"\\f1fb\";\n@ionicon-var-jet: \"\\f295\";\n@ionicon-var-key: \"\\f296\";\n@ionicon-var-knife: \"\\f297\";\n@ionicon-var-laptop: \"\\f1fc\";\n@ionicon-var-leaf: \"\\f1fd\";\n@ionicon-var-levels: \"\\f298\";\n@ionicon-var-lightbulb: \"\\f299\";\n@ionicon-var-link: \"\\f1fe\";\n@ionicon-var-load-a: \"\\f29a\";\n@ionicon-var-load-b: \"\\f29b\";\n@ionicon-var-load-c: \"\\f29c\";\n@ionicon-var-load-d: \"\\f29d\";\n@ionicon-var-location: \"\\f1ff\";\n@ionicon-var-lock-combination: \"\\f4d4\";\n@ionicon-var-locked: \"\\f200\";\n@ionicon-var-log-in: \"\\f29e\";\n@ionicon-var-log-out: \"\\f29f\";\n@ionicon-var-loop: \"\\f201\";\n@ionicon-var-magnet: \"\\f2a0\";\n@ionicon-var-male: \"\\f2a1\";\n@ionicon-var-man: \"\\f202\";\n@ionicon-var-map: \"\\f203\";\n@ionicon-var-medkit: \"\\f2a2\";\n@ionicon-var-merge: \"\\f33f\";\n@ionicon-var-mic-a: \"\\f204\";\n@ionicon-var-mic-b: \"\\f205\";\n@ionicon-var-mic-c: \"\\f206\";\n@ionicon-var-minus: \"\\f209\";\n@ionicon-var-minus-circled: \"\\f207\";\n@ionicon-var-minus-round: \"\\f208\";\n@ionicon-var-model-s: \"\\f2c1\";\n@ionicon-var-monitor: \"\\f20a\";\n@ionicon-var-more: \"\\f20b\";\n@ionicon-var-mouse: \"\\f340\";\n@ionicon-var-music-note: \"\\f20c\";\n@ionicon-var-navicon: \"\\f20e\";\n@ionicon-var-navicon-round: \"\\f20d\";\n@ionicon-var-navigate: \"\\f2a3\";\n@ionicon-var-network: \"\\f341\";\n@ionicon-var-no-smoking: \"\\f2c2\";\n@ionicon-var-nuclear: \"\\f2a4\";\n@ionicon-var-outlet: \"\\f342\";\n@ionicon-var-paintbrush: \"\\f4d5\";\n@ionicon-var-paintbucket: \"\\f4d6\";\n@ionicon-var-paper-airplane: \"\\f2c3\";\n@ionicon-var-paperclip: \"\\f20f\";\n@ionicon-var-pause: \"\\f210\";\n@ionicon-var-person: \"\\f213\";\n@ionicon-var-person-add: \"\\f211\";\n@ionicon-var-person-stalker: \"\\f212\";\n@ionicon-var-pie-graph: \"\\f2a5\";\n@ionicon-var-pin: \"\\f2a6\";\n@ionicon-var-pinpoint: \"\\f2a7\";\n@ionicon-var-pizza: \"\\f2a8\";\n@ionicon-var-plane: \"\\f214\";\n@ionicon-var-planet: \"\\f343\";\n@ionicon-var-play: \"\\f215\";\n@ionicon-var-playstation: \"\\f30a\";\n@ionicon-var-plus: \"\\f218\";\n@ionicon-var-plus-circled: \"\\f216\";\n@ionicon-var-plus-round: \"\\f217\";\n@ionicon-var-podium: \"\\f344\";\n@ionicon-var-pound: \"\\f219\";\n@ionicon-var-power: \"\\f2a9\";\n@ionicon-var-pricetag: \"\\f2aa\";\n@ionicon-var-pricetags: \"\\f2ab\";\n@ionicon-var-printer: \"\\f21a\";\n@ionicon-var-pull-request: \"\\f345\";\n@ionicon-var-qr-scanner: \"\\f346\";\n@ionicon-var-quote: \"\\f347\";\n@ionicon-var-radio-waves: \"\\f2ac\";\n@ionicon-var-record: \"\\f21b\";\n@ionicon-var-refresh: \"\\f21c\";\n@ionicon-var-reply: \"\\f21e\";\n@ionicon-var-reply-all: \"\\f21d\";\n@ionicon-var-ribbon-a: \"\\f348\";\n@ionicon-var-ribbon-b: \"\\f349\";\n@ionicon-var-sad: \"\\f34a\";\n@ionicon-var-sad-outline: \"\\f4d7\";\n@ionicon-var-scissors: \"\\f34b\";\n@ionicon-var-search: \"\\f21f\";\n@ionicon-var-settings: \"\\f2ad\";\n@ionicon-var-share: \"\\f220\";\n@ionicon-var-shuffle: \"\\f221\";\n@ionicon-var-skip-backward: \"\\f222\";\n@ionicon-var-skip-forward: \"\\f223\";\n@ionicon-var-social-android: \"\\f225\";\n@ionicon-var-social-android-outline: \"\\f224\";\n@ionicon-var-social-angular: \"\\f4d9\";\n@ionicon-var-social-angular-outline: \"\\f4d8\";\n@ionicon-var-social-apple: \"\\f227\";\n@ionicon-var-social-apple-outline: \"\\f226\";\n@ionicon-var-social-bitcoin: \"\\f2af\";\n@ionicon-var-social-bitcoin-outline: \"\\f2ae\";\n@ionicon-var-social-buffer: \"\\f229\";\n@ionicon-var-social-buffer-outline: \"\\f228\";\n@ionicon-var-social-chrome: \"\\f4db\";\n@ionicon-var-social-chrome-outline: \"\\f4da\";\n@ionicon-var-social-codepen: \"\\f4dd\";\n@ionicon-var-social-codepen-outline: \"\\f4dc\";\n@ionicon-var-social-css3: \"\\f4df\";\n@ionicon-var-social-css3-outline: \"\\f4de\";\n@ionicon-var-social-designernews: \"\\f22b\";\n@ionicon-var-social-designernews-outline: \"\\f22a\";\n@ionicon-var-social-dribbble: \"\\f22d\";\n@ionicon-var-social-dribbble-outline: \"\\f22c\";\n@ionicon-var-social-dropbox: \"\\f22f\";\n@ionicon-var-social-dropbox-outline: \"\\f22e\";\n@ionicon-var-social-euro: \"\\f4e1\";\n@ionicon-var-social-euro-outline: \"\\f4e0\";\n@ionicon-var-social-facebook: \"\\f231\";\n@ionicon-var-social-facebook-outline: \"\\f230\";\n@ionicon-var-social-foursquare: \"\\f34d\";\n@ionicon-var-social-foursquare-outline: \"\\f34c\";\n@ionicon-var-social-freebsd-devil: \"\\f2c4\";\n@ionicon-var-social-github: \"\\f233\";\n@ionicon-var-social-github-outline: \"\\f232\";\n@ionicon-var-social-google: \"\\f34f\";\n@ionicon-var-social-google-outline: \"\\f34e\";\n@ionicon-var-social-googleplus: \"\\f235\";\n@ionicon-var-social-googleplus-outline: \"\\f234\";\n@ionicon-var-social-hackernews: \"\\f237\";\n@ionicon-var-social-hackernews-outline: \"\\f236\";\n@ionicon-var-social-html5: \"\\f4e3\";\n@ionicon-var-social-html5-outline: \"\\f4e2\";\n@ionicon-var-social-instagram: \"\\f351\";\n@ionicon-var-social-instagram-outline: \"\\f350\";\n@ionicon-var-social-javascript: \"\\f4e5\";\n@ionicon-var-social-javascript-outline: \"\\f4e4\";\n@ionicon-var-social-linkedin: \"\\f239\";\n@ionicon-var-social-linkedin-outline: \"\\f238\";\n@ionicon-var-social-markdown: \"\\f4e6\";\n@ionicon-var-social-nodejs: \"\\f4e7\";\n@ionicon-var-social-octocat: \"\\f4e8\";\n@ionicon-var-social-pinterest: \"\\f2b1\";\n@ionicon-var-social-pinterest-outline: \"\\f2b0\";\n@ionicon-var-social-python: \"\\f4e9\";\n@ionicon-var-social-reddit: \"\\f23b\";\n@ionicon-var-social-reddit-outline: \"\\f23a\";\n@ionicon-var-social-rss: \"\\f23d\";\n@ionicon-var-social-rss-outline: \"\\f23c\";\n@ionicon-var-social-sass: \"\\f4ea\";\n@ionicon-var-social-skype: \"\\f23f\";\n@ionicon-var-social-skype-outline: \"\\f23e\";\n@ionicon-var-social-snapchat: \"\\f4ec\";\n@ionicon-var-social-snapchat-outline: \"\\f4eb\";\n@ionicon-var-social-tumblr: \"\\f241\";\n@ionicon-var-social-tumblr-outline: \"\\f240\";\n@ionicon-var-social-tux: \"\\f2c5\";\n@ionicon-var-social-twitch: \"\\f4ee\";\n@ionicon-var-social-twitch-outline: \"\\f4ed\";\n@ionicon-var-social-twitter: \"\\f243\";\n@ionicon-var-social-twitter-outline: \"\\f242\";\n@ionicon-var-social-usd: \"\\f353\";\n@ionicon-var-social-usd-outline: \"\\f352\";\n@ionicon-var-social-vimeo: \"\\f245\";\n@ionicon-var-social-vimeo-outline: \"\\f244\";\n@ionicon-var-social-whatsapp: \"\\f4f0\";\n@ionicon-var-social-whatsapp-outline: \"\\f4ef\";\n@ionicon-var-social-windows: \"\\f247\";\n@ionicon-var-social-windows-outline: \"\\f246\";\n@ionicon-var-social-wordpress: \"\\f249\";\n@ionicon-var-social-wordpress-outline: \"\\f248\";\n@ionicon-var-social-yahoo: \"\\f24b\";\n@ionicon-var-social-yahoo-outline: \"\\f24a\";\n@ionicon-var-social-yen: \"\\f4f2\";\n@ionicon-var-social-yen-outline: \"\\f4f1\";\n@ionicon-var-social-youtube: \"\\f24d\";\n@ionicon-var-social-youtube-outline: \"\\f24c\";\n@ionicon-var-soup-can: \"\\f4f4\";\n@ionicon-var-soup-can-outline: \"\\f4f3\";\n@ionicon-var-speakerphone: \"\\f2b2\";\n@ionicon-var-speedometer: \"\\f2b3\";\n@ionicon-var-spoon: \"\\f2b4\";\n@ionicon-var-star: \"\\f24e\";\n@ionicon-var-stats-bars: \"\\f2b5\";\n@ionicon-var-steam: \"\\f30b\";\n@ionicon-var-stop: \"\\f24f\";\n@ionicon-var-thermometer: \"\\f2b6\";\n@ionicon-var-thumbsdown: \"\\f250\";\n@ionicon-var-thumbsup: \"\\f251\";\n@ionicon-var-toggle: \"\\f355\";\n@ionicon-var-toggle-filled: \"\\f354\";\n@ionicon-var-transgender: \"\\f4f5\";\n@ionicon-var-trash-a: \"\\f252\";\n@ionicon-var-trash-b: \"\\f253\";\n@ionicon-var-trophy: \"\\f356\";\n@ionicon-var-tshirt: \"\\f4f7\";\n@ionicon-var-tshirt-outline: \"\\f4f6\";\n@ionicon-var-umbrella: \"\\f2b7\";\n@ionicon-var-university: \"\\f357\";\n@ionicon-var-unlocked: \"\\f254\";\n@ionicon-var-upload: \"\\f255\";\n@ionicon-var-usb: \"\\f2b8\";\n@ionicon-var-videocamera: \"\\f256\";\n@ionicon-var-volume-high: \"\\f257\";\n@ionicon-var-volume-low: \"\\f258\";\n@ionicon-var-volume-medium: \"\\f259\";\n@ionicon-var-volume-mute: \"\\f25a\";\n@ionicon-var-wand: \"\\f358\";\n@ionicon-var-waterdrop: \"\\f25b\";\n@ionicon-var-wifi: \"\\f25c\";\n@ionicon-var-wineglass: \"\\f2b9\";\n@ionicon-var-woman: \"\\f25d\";\n@ionicon-var-wrench: \"\\f2ba\";\n@ionicon-var-xbox: \"\\f30c\";"
  },
  {
    "path": "client/less/lib/ionicons/ionicons.less",
    "content": "@import \"_ionicons-variables\";\n@import \"_ionicons-font\";\n@import \"_ionicons-animation\";\n@import \"_ionicons-icons\";"
  },
  {
    "path": "client/less/main.less",
    "content": "@import \"lib/bootstrap/bootstrap\";\n@import \"lib/bootstrap-social/bootstrap-social\";\n@import \"lib/ionicons/ionicons\";\n@import \"lib/animate.min.less\";\n@import \"lib/bootstrap/variables\";\n\nhtml,body,div,span,a,li,td,th {\n  font-family: '微软雅黑','Lato', sans-serif;\n}\n\nbold {\n  font-family: 'Lato-Bold', sans-serif;\n  font-weight: Bold;\n}\n\nli, .wrappable {\n  white-space: pre;           /* CSS 2.0 */\n  white-space: pre-wrap;      /* CSS 2.1 */\n  white-space: pre-line;      /* CSS 3.0 */\n  white-space: -pre-wrap;     /* Opera 4-6 */\n  white-space: -o-pre-wrap;   /* Opera 7 */\n  white-space: -moz-pre-wrap; /* Mozilla */\n  white-space: -hp-pre-wrap;  /* HP Printers */\n  word-wrap: break-word;      /* IE 5+ */\n}\n\npre.wrappable {\n  white-space: pre;           /* CSS 2.0 */\n  white-space: pre-wrap;      /* CSS 2.1 */\n  white-space: -pre-wrap;     /* Opera 4-6 */\n  white-space: -o-pre-wrap;   /* Opera 7 */\n  white-space: -moz-pre-wrap; /* Mozilla */\n  white-space: -hp-pre-wrap;  /* HP Printers */\n  word-wrap: break-word;      /* IE 5+ */\n}\n\nhtml {\n  position: relative;\n  min-height: 100%;\n  // hack to prevent horizontal overflow problem on showHTML view\n  overflow-x: hidden;\n}\n\n//input[type=checkbox] {\n//  /* Double-sized Checkboxes */\n//  -ms-transform: scale(2); /* IE */\n//  -moz-transform: scale(2); /* FF */\n//  -webkit-transform: scale(2); /* Safari and Chrome */\n//  -o-transform: scale(2); /* Opera */\n//  padding: 10px;\n//}\n\n.btn-group {\n  border-color: @brand-primary;\n}\n\nbody.full-screen-body-background {\n  background-color: @body-bg;\n}\n\n\nbody.top-and-bottom-margins {\n  padding-top: 80px;\n  margin-bottom: 60px;\n}\n\nbody.no-top-and-bottom-margins {\n  margin: 75px 10px 0px 20px;\n}\n\nh1, h2 {\n  font-weight: 400;\n}\n\n\nh1, h2, h3, h4, h5, h6, p, li {\n  padding-top: 5px;\n  padding-bottom: 5px;\n}\n\n// Alerts\n// -------------------------\n\n.alert {\n  margin-top: 20px;\n}\n\n// Thumbnails\n// -------------------------\n\n.thumbnail {\n  background-color: #EEEEEE;\n//  box-shadow: 0 0 5px #ccc, inset 0 0 0 #000;\n}\n\n// Font Icons\n// -------------------------\n\n.fa,\n[class^='ion-'] {\n  margin-right: 5px;\n}\n\n.fa:hover {\n  text-decoration: none;\n}\n\n.no-link-underline {\n  text-decoration: none;\n}\n\n.img-center {\n  margin: 0 auto;\n}\n\n.btn-cta {\n  font-size: 40px;\n}\n\n.shadow {\n  white-space: normal;\n  -webkit-box-shadow: 2px 4px 1px rgba(0, 0, 0, 0.3);\n  -moz-box-shadow:    2px 4px 1px rgba(0, 0, 0, 0.3);\n  box-shadow:         2px 4px 1px rgba(0, 0, 0, 0.3);\n}\n\n.btn-nav {\n  margin-top: 10px;\n}\n\nul {\n  list-style: none;\n}\n\n.panel-heading {\n  font-size: 25px;\n}\n\n.panel-heading > h1 {\n  font-size: 25px;\n  padding: 2px;\n  margin: 2px;\n}\n\n.navbar-brand {\n  font-size: 26px;\n}\n\n.navbar > .container {\n  width: auto;\n  padding-left: 0px;\n  padding-right: 0px;\n}\n\n.nav-height {\n  height: 50px;\n  border: none;\n}\n\n.landing-icon {\n  height: 200px;\n  width: 200px;\n}\n\n.completion-icon {\n  font-size: 150px;\n}\n\n.positive-15 {\n  margin-top: 15px;\n}\n\n.positive-20 {\n  margin-top: 20px;\n}\n\n.positive-15-bottom {\n  margin-bottom: 15px;\n}\n\n.positive-10 {\n  margin-top: 10px;\n}\n\n.positive-5 {\n  margin-top: 5px;\n}\n\n.negative-5 {\n  margin-top: -5px;\n}\n\n.negative-10 {\n  margin-top: -10px;\n}\n\n.negative-15 {\n  margin-top: -15px;\n}\n\n.negative-20 {\n  margin-top: -20px;\n}\n\n.negative-28 {\n  margin-top: -28px;\n}\n\n.negative-30 {\n  margin-top: -30px;\n}\n\n.negative-30-bottom {\n  margin-bottom: -30px;\n}\n\n.negative-35 {\n  margin-top: -35px;\n}\n\n.negative-55 {\n  margin-top: -55px;\n  margin-bottom: -55px;\n}\n\n.large-p {\n  font-size: 24px;\n}\n\n.small-p {\n  font-size: 14px;\n}\n\n.map-p {\n  font-size: 20px;\n}\n\n.map-row-numbers {\n  text-align: right;\n  padding-right: 5px;\n  padding-left: 5px;\n}\n\n.link-table td{\n  font-size: 16px;\n  border-top: none !important;\n  @media (min-width: 767px) {\n    font-size: 24px;\n  }\n}\n\n.capitalize {\n  text-transform: capitalize;\n}\n\n.text-success {\n  color: @brand-primary;\n}\n\n.fast-animation {\n  -webkit-animation-duration: 0.5s;\n  animation-duration: 0.5s;\n}\n\n.disabled {\n  pointer-events: none;\n  cursor: default;\n  color: graytext !important;\n}\n\n.hidden-element {\n  display: none;\n}\n\n.nav-logo {\n  height: 40px;\n  margin-top: -10px;\n\n  @media (max-width: 397px) {\n    height: 30px;\n    margin-top: -5px;\n  }\n  @media (max-width: 335px) {\n    height: 25px;\n    margin-top: -2px;\n  }\n}\n\n.navbar-right {\n  @media (min-width: 767px) {\n    margin-right:0;\n  }\n  @media (max-width: 991px) and (min-width: 767px) {\n    position: absolute;\n    left: 0;\n    right: 0;\n    margin-right: 0px;\n    white-space: nowrap;\n  }\n  background-color: @brand-primary;\n  text-align: center;\n}\n.navbar {\n  white-space: nowrap;\n  border: none;\n  line-height: 1;\n  @media (min-width: 767px) {\n    padding-left: 15px;\n    padding-right: 30px;\n  }\n}\n\nli.avatar, li.avatar > a { padding:0; margin:0 }\n\n.thin-progress-bar {\n  height: 8px;\n  margin-top: 3px;\n  margin-bottom: 0px;\n  width: 60%;\n  margin-right: auto;\n  margin-left: auto;\n}\n\n.panel-body {\n  margin-bottom: -6px;\n}\n\n.lb-container {\n  padding: 0px;\n}\n\n.btn-social {\n  width: 250px;\n  margin: auto;\n}\n\n.btn-link-social {\n  max-width: 400px;\n  margin: auto;\n  margin-bottom: 10px;\n}\n\n.navbar {\n  background-color: @brand-primary;\n}\n\na {\n  font-weight: bold;\n}\n\np {\n  font-size: 14px;\n}\n\n.map-aside-body p {\n  line-height: 1.8;\n}\n\n.navbar-nav > li > a {\n  color: @body-bg;\n  &:hover {\n    color: @brand-primary;\n  }\n}\n\n.hug-top {\n  margin-top: -35px;\n  margin-bottom: -10px;\n}\n\n.nonprofit-landing {\n  font-size: 50px;\n}\n\n.big-text {\n  font-size: 63px;\n}\n\n.signup-btn.btn {\n  background-color: #ffac33;\n  background-image: linear-gradient(#ffcc4d, #ffac33);\n  -ms-filter: \"progid:DXImageTransform.Microsoft.gradient(startColorstr=#ffcc4d,  endColorstr=#ffac33,  GradientType=0)\";\n  border-color: #f1a02a;\n  color: #292f33 !important;\n  text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5);\n}\n.signup-btn:hover, .signup-btn:focus {\n  background-color: #e99110;\n  background-image: linear-gradient(#ffcc4d, #e99110);\n  -ms-filter: \"progid:DXImageTransform.Microsoft.gradient(startColorstr=#ffcc4d,  endColorstr=#e99110,  GradientType=0)\";\n  border-color: #ec8b11;\n  color: #292f33 !important;\n}\n.signup-btn:active {\n  background-color: #f2a330;\n  background-image: none;\n  box-shadow: inset 0 1px 4px rgba(0, 0, 0, 0.3);\n}\n\n*, *:before, *:after {\n    box-sizing: border-box !important;\n}\n\n.btn-big {\n  font-size: 20px;\n  border-radius: 6px;\n}\n\n.btn-bigger {\n  font-size: 30px;\n}\n\n.big-text-field {\n  font-size: 30px;\n  height: 57px;\n  background-color: @body-bg !important;\n}\n\nh4 {\n  font-size: 22px;\n}\n\n.no-transition {\n  -webkit-transition: height 0.001s;\n  -moz-transition: height 0.001s;\n  -ms-transition: height 0.001s;\n  -o-transition: height 0.001s;\n  transition: height 0.001s;\n}\n\n.margin-left-10 {\n  margin-left: 10px;\n}\n\n.btn-responsive {\n  @media (max-width: 768px) {\n    font-size: 15px;\n    height: 26.5px;\n    padding-top: 1px;\n  }\n}\n\n.field-responsive {\n  @media (max-width: 768px) {\n    font-size: 15px;\n    height: 26.5px;\n  }\n}\n\nthead {\n  font-size: 150%;\n}\n\n.nowrap {\n  white-space: nowrap;\n}\n\n.big-break {\n  margin-top: 50px;\n  margin-bottom: 50px;\n}\n\n.profile-picture {\n  height: 50px;\n  width: 50px;\n}\n\n.brownie-points-nav {\n  @media (min-width: 991px) and (max-width: 999px) {\n    margin-right: -10px;\n  }\n}\n\n.navbar-nav a {\n  color: @body-bg;\n  font-size: 20px;\n  margin-top: -5px;\n  margin-bottom: -5px;\n}\n\n.navbar-toggle {\n  color: @body-bg;\n\n  &:hover,\n  &:focus {\n    color: #4a2b0f;\n  }\n}\n\n\n.signup-btn-nav {\n  margin-top: -2px !important;\n  padding-top: 10px !important;\n  padding-bottom: 10px !important;\n  margin-right: -12px;\n  @media (min-width: 991px) and (max-width: 1010px) {\n    margin-left: -10px;\n    margin-right: -5px;\n  }\n}\n\n.public-profile-img {\n  height: 200px;\n  width: 200px;\n  border-radius: 5px;\n}\n\n.ng-invalid.ng-dirty {\n  border-color: #FA787E;\n}\n.ng-valid.ng-dirty {\n  border-color: #78FA89;\n}\n\n.flat-top {\n  margin-top: -5px;\n}\n\n.negative-bottom {\n  margin-bottom: -20px;\n}\n\n.min-height-1000 {\n  min-height: 1000px;\n}\n\n.points-on-top {\n  color: @body-bg;\n  font-size: 35px;\n  z-index: 2;\n  width: 60%;\n  margin: 0 auto;\n  position: relative;\n  top: 50%;\n  -webkit-transform: translateY(-50%);\n  transform: translateY(-50%);\n}\n\n.landing-skill-icon {\n  color: @brand-primary;\n  font-size: 150px;\n}\n\n.custom-landing-skill-icon {\n  margin-top: -15px;\n  padding-bottom: 15px;\n}\n\n.black-text {\n  color: #333;\n  font-weight: 400;\n  font-size: 40px;\n}\n\n.font-awesome-padding {\n  margin-top: 45px;\n  margin-bottom: 20px;\n}\n\n.background-svg {\n  width: 220px;\n  height: 220px;\n  background-image: url(\"/images/certificate-icon.svg\");\n  background-size: 120%;\n  background-repeat: no-repeat;\n  background-position: center;\n}\n\n.testimonial-image {\n  border-radius: 5px;\n  height: 200px;\n  width: 200px;\n  color: #009900\n}\n\n.testimonial-image-jobs {\n  border-radius: 5px;\n  color: #009900\n}\n\n\n.default-border-radius {\n  border-radius: 5px;\n}\n\n.height-500 {\n  height: 500px;\n}\n\n.height-400 {\n  height: 400px;\n}\n\n.testimonial-copy {\n  text-align: justify;\n  font-size: 18px !important;\n  margin-left: 20px;\n  margin-right: 20px;\n  @media (min-width: 991px) and (max-width: 1199px) {\n    height: 150px;\n  }\n  @media (min-width: 1200px) {\n    height: 100px;\n  }\n}\n\n.nonprofit-testimonial-copy {\n  text-align: justify;\n  font-size: 18px !important;\n  margin-left: 20px;\n  margin-right: 20px;\n  @media (min-width: 991px) and (max-width: 1199px) {\n    height: 300px !important;\n  }\n  @media (min-width: 1200px) {\n    height: 200px !important;\n  }\n}\n\n.navbar-collapse {\n  border-top: 0;\n}\n\n.challenge-list-header {\n  background-color: @brand-primary;\n  color: @gray-lighter;\n  font-size: 36px;\n  text-align: center;\n  margin-bottom: -30px;\n  border-radius: 5px 5px 0px 0px;\n  padding-left: 50px;\n}\n\n.closing-x {\n  color: @gray-lighter;\n  font-size: 50px;\n  text-align: right;\n}\n\n.fcc-footer {\n  width: 100%;\n  height: 50px;\n  text-align: center;\n  background-color: @brand-primary;\n  padding: 12px;\n  bottom: 0;\n  left: 0;\n  position: absolute;\n  a {\n    font-size: 20px;\n    color: @gray-lighter;\n    margin-left: 0px;\n    margin-right: 0px;\n    padding-left: 10px;\n    padding-right: 10px;\n    padding-top: 14px;\n    padding-bottom: 12px;\n    &:hover {\n      color: @brand-primary;\n      background-color: @gray-lighter;\n      text-decoration: none;\n    }\n  }\n}\n\n.embed-responsive-twitch-chat {\n  padding-bottom: 117%;\n}\n\n#directions {\n  text-align: left;\n  font-size: 15px;\n}\n\n.graph-rect {\n  fill: #ddd !important\n}\n\n\n/**\n * Bonfire styling\n */\n\nform.code span {\n  font-size: 18px;\n  font-family: \"Ubuntu Mono\";\n  padding-bottom: 0px;\n  margin-bottom: 0px;\n  height: 100%;\n}\n\n.CodeMirror {\n  line-height: 1 !important;\n}\n\n.CodeMirror-linenumber {\n  font-size: 18px;\n  font-family: \"Ubuntu Mono\";\n}\n\n#mainEditorPanel {\n  height: 100%;\n  width: 99%;\n}\n\n.scroll-locker {\n  overflow-x: hidden;\n  overflow-y: auto;\n}\n\n#mainEditorPanel .panel-body {\n  padding-bottom: 0px;\n}\n\ndiv.CodeMirror-scroll {\n  padding-bottom: 30px;\n}\n\n.test-vertical-center {\n  margin-top: 8px;\n}\n\n.cm-s-monokai.CodeMirror {\n  border-radius: 5px;\n}\n.courseware-height {\n  min-height: 650px;\n}\n\n.btn {\n  font-weight: 400;\n  white-space: normal;\n  background: transparent;\n\n  -webkit-transition: background .2s ease-in-out, border .2s ease-in-out;\n  -moz-transition: background .2s ease-in-out, border .2s ease-in-out;\n  -ms-transition: background .2s ease-in-out, border .2s ease-in-out;\n  -o-transition: background .2s ease-in-out, border .2s ease-in-out;\n  transition: background .2s ease-in-out, border .2s ease-in-out;\n}\n\n.population-table {\n  font-size:30px;\n  width:460px;\n  margin:0 auto;\n  padding:0;\n  h2 {\n    margin:0;\n    text-align: left;\n  }\n  .tag {\n      width:165px;\n      display:inline-block;\n  }\n  .text-primary {\n      margin-right:5px;\n  }\n  @media (max-width: 767px) {\n    font-size: 16px;\n    width: 260px;\n    .tag {\n      width:95px;\n    }\n  }\n}\n\n@media (max-width: 991px) {\n  .navbar-header {\n    float: none;\n  }\n\n  .navbar-toggle {\n    display: block;\n  }\n\n  .navbar-collapse.collapse {\n    display: none !important;\n  }\n\n  .navbar-nav {\n    margin-top: 0;\n  }\n\n  .navbar-nav > li {\n    float: none;\n  }\n\n  .navbar-nav > li > a {\n    padding-top: 10px;\n    padding-bottom: 10px;\n  }\n\n  .navbar-text {\n    float: none;\n    margin: 15px 0;\n  }\n\n  /* since 3.1.0 */\n  .navbar-collapse.collapse.in {\n    display: block !important;\n  }\n\n  .collapsing {\n    overflow: hidden !important;\n    position: absolute;\n    left: 0;\n    right: 0;\n  }\n}\n\n.navbar-toggle {\n  width: 80px;\n  padding-left: 0;\n  padding-right: 8px;\n  margin: 7px 2px 7px 0;\n  text-align: left;\n  font-size: 10px;\n}\n\n.hamburger-text {\n  line-height: 0.75em;\n  margin-top: 10px;\n  font-size: 18px;\n}\n\n.story-list {\n  padding-bottom: 30px;\n  margin-bottom: 30px;\n}\n\n.button-spacer {\n  padding: 5px 0;\n}\n\n.spacer {\n  padding: 15px 0 15px 0;\n}\n\n.img-news {\n  width: 50px;\n  height: 50px;\n}\n\n.url-preview {\n  max-width: 250px;\n  max-height: 250px;\n}\n\n//.media ~ .media .media-body-wrapper:nth-child(odd) {\n//  background-color: #e5e5e5;\n//}\n\n.news-box {\n  @media (min-width: 768px) {\n    margin-top: -40px;\n  }\n  @media (max-width: 767px) {\n    padding: 5px;\n    border-color: @brand-info;\n    border-width: 1px;\n    border-style: solid;\n    border-radius: 5px;\n    width: 100%;\n    float: left;\n  }\n}\n\n.news-box-search {\n  @media (min-width: 768px) {\n    margin-top: -30px;\n    padding-bottom: 20px;\n  }\n  @media (max-width: 767px) {\n    padding: 5px;\n    border-color: @brand-info;\n    border-width: 1px;\n    border-style: solid;\n    border-radius: 5px;\n    width: 100%;\n    float: left;\n  }\n}\n\n.story-headline {\n  font-size: 20px;\n  margin-left: 14px;\n  margin-top: -5px;\n}\n\n.landing-heading {\n  font-size: 50px !important;\n  font-family: Georgia;\n}\n\n.mobile-story-headline {\n  font-size: 20px;\n}\n\n.story-byline {\n  margin-top: 5px;\n  font-size: 14px;\n}\n\n.media-stories {\n  margin-left: 20px;\n}\n\nhr {\n  border: 0;\n  height: 1px;\n  background-image: linear-gradient(to right, rgba(0, 0, 0, 0), rgba(0, 0, 0, 0.75), rgba(0, 0, 0, 0));\n}\n\n.big-spacer {\n  padding: 30px 0 30px 0;\n}\n\n#reply-to-main-post, #upvote {\n  cursor: pointer;\n}\n\n.btn-no-shadow {\n  -webkit-box-shadow: 0px 0px 0px rgba(0, 0, 0, 0);\n  -moz-box-shadow:    0px 0px 0px rgba(0, 0, 0, 0);\n  box-shadow:         0px 0px 0px rgba(0, 0, 0, 0);\n}\n\n.dotted-underline {\n  border-bottom: dashed 1px @brand-success;\n}\n\n.d3-centered {\n  width: 771px;\n  margin: 0 auto;\n}\n\n.cal-heatmap-container {\n  background-color: @body-bg;\n}\n\n.interested-camper-image {\n  height: 50px;\n  width: 50px;\n  padding: 5px;\n}\n\n.mobile-story-image {\n  border-radius: 5px;\n  width: 100%;\n  @media (max-width: 768px) {\n    margin-right: 5px;\n  }\n}\n\n.alert a {\n  text-decoration: underline;\n}\n\n.step-text {\n  line-height: 120%;\n  padding-bottom: 10px;\n}\n\n.faded {\n  opacity: 0.5;\n}\n\n.slightly-faded {\n  opacity: 0.75;\n}\n\n.padded-ionic-icon {\n  padding-top: 5px;\n}\n\n.checklist-element {\n    margin-left: -60px;\n    margin-right: -20px;\n}\n\n.profile-social-icons {\n  margin-left: 8px;\n}\n\n.border-radius-5 {\n  border-radius: 5px;\n}\n\ncode {\n  padding: 0;\n}\n\n@media only screen and (min-width: 993px) {\n  .iframe-scroll {\n    z-index: 1;\n  }\n}\n@media only screen and (max-width: 992px) {\n  .iframe-scroll {\n    height: auto;\n    overflow: auto;\n  }\n}\n\n// Calculator styles\n\n.chart rect {\n  fill: steelblue;\n}\n\n.chart text {\n  font-size: 14px;\n  text-anchor: end;\n}\n\n.axis path,\n.axis line {\n  fill: none;\n  stroke: #121401;\n  stroke-width: 2px;\n  shape-rendering: crispEdges;\n}\n\n.gitter-chat-embed {\n z-index: 20000 !important;\n}\n\n\n//uncomment this to see the dimensions of all elements outlined in red\n//* {\n//  border-color: red;\n//  border-width: 1px;\n//  border-style: solid;\n//}\n\n// source: https://github.com/jlong/css-spinners/blob/master/css/spinner/inner-circles.css\n// license MIT\n/* :not(:required) hides this rule from IE9 and below */\n.inner-circles-loader:not(:required) {\n  -moz-transform: translate3d(0, 0, 0);\n  -ms-transform: translate3d(0, 0, 0);\n  -webkit-transform: translate3d(0, 0, 0);\n  transform: translate3d(0, 0, 0);\n  position: relative;\n  display: inline-block;\n  width: 125px;\n  height: 125px;\n  background: rgba(25, 165, 152, 0.5);\n  border-radius: 50%;\n  overflow: hidden;\n  text-indent: -9999px;\n  margin-top: 10%;\n  /* Hides inner circles outside base circle at safari */\n  -webkit-mask-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAIAAACQd1PeAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAA5JREFUeNpiYGBgAAgwAAAEAAGbA+oJAAAAAElFTkSuQmCC);\n}\n.inner-circles-loader:not(:required):before, .inner-circles-loader:not(:required):after {\n  content: '';\n  position: absolute;\n  top: 0;\n  display: inline-block;\n  width: 125px;\n  height: 125px;\n  border-radius: 50%;\n}\n.inner-circles-loader:not(:required):before {\n  -moz-animation: inner-circles-loader 3s infinite;\n  -webkit-animation: inner-circles-loader 3s infinite;\n  animation: inner-circles-loader 3s infinite;\n  -moz-transform-origin: 0 50%;\n  -ms-transform-origin: 0 50%;\n  -webkit-transform-origin: 0 50%;\n  transform-origin: 0 50%;\n  left: 0;\n  background: #c7efcf;\n}\n.inner-circles-loader:not(:required):after {\n  -moz-animation: inner-circles-loader 3s 0.2s reverse infinite;\n  -webkit-animation: inner-circles-loader 3s 0.2s reverse infinite;\n  animation: inner-circles-loader 3s 0.2s reverse infinite;\n  -moz-transform-origin: 100% 50%;\n  -ms-transform-origin: 100% 50%;\n  -webkit-transform-origin: 100% 50%;\n  transform-origin: 100% 50%;\n  right: 0;\n  background: #eef5db;\n}\n\n@-moz-keyframes inner-circles-loader {\n  0% {\n    -moz-transform: rotate(0deg);\n    transform: rotate(0deg);\n  }\n  50% {\n    -moz-transform: rotate(360deg);\n    transform: rotate(360deg);\n  }\n  100% {\n    -moz-transform: rotate(0deg);\n    transform: rotate(0deg);\n  }\n}\n@-webkit-keyframes inner-circles-loader {\n  0% {\n    -webkit-transform: rotate(0deg);\n    transform: rotate(0deg);\n  }\n  50% {\n    -webkit-transform: rotate(360deg);\n    transform: rotate(360deg);\n  }\n  100% {\n    -webkit-transform: rotate(0deg);\n    transform: rotate(0deg);\n  }\n}\n@keyframes inner-circles-loader {\n  0% {\n    -moz-transform: rotate(0deg);\n    -ms-transform: rotate(0deg);\n    -webkit-transform: rotate(0deg);\n    transform: rotate(0deg);\n  }\n  50% {\n    -moz-transform: rotate(360deg);\n    -ms-transform: rotate(360deg);\n    -webkit-transform: rotate(360deg);\n    transform: rotate(360deg);\n  }\n  100% {\n    -moz-transform: rotate(0deg);\n    -ms-transform: rotate(0deg);\n    -webkit-transform: rotate(0deg);\n    transform: rotate(0deg);\n  }\n}\n\n@import \"chat.less\";\n@import \"jobs.less\";\n@import \"challenge.less\";\n@import \"toastr.less\";\n@import \"map.less\";\n@import \"wiki.less\";\n@import \"signin.less\";\n"
  },
  {
    "path": "client/less/map.less",
    "content": "/*\n * based off of https://github.com/gitterHQ/sidecar\n * license: MIT\n */\n.map-aside {\n    width:500px;\n\n    z-index: 20000;\n    position: fixed;\n    top: 0;\n    bottom: 0;\n    right: 0;\n\n    display: -webkit-flex;\n    display: flex;\n    -webkit-flex-direction: row;\n    flex-direction: row;\n    background-color: @body-bg;\n    border-left: 1px solid #ddd;\n    box-shadow: -12px 0 18px 0 rgba(50, 50, 50, 0.1);\n\n    transition: transform 0.3s cubic-bezier(0.16, 0.22, 0.22, 1.7);\n\n    &.is-collapsed:not(.is-loading) {\n      -webkit-transform: translateX(110%);\n      transform: translateX(110%);\n    }\n\n    /* Add some \"extension\" so that there isn't a gap\n     * when we translate(via animation) more than 100% */\n    &:after {\n      content: '';\n\n      z-index: -1;\n      position: absolute;\n      top: 0;\n      left: 100%;\n      bottom: 0;\n      right: -100%;\n\n      background-color: @body-bg;\n    }\n    iframe {\n      width: 100%;\n      height: 100%;\n    }\n}\n\n.map-aside-action-bar {\n    position: absolute;\n    top: 0;\n    right: 0;\n\n    display: -webkit-flex;\n    display: flex;\n    justify-content: flex-end;\n\n    padding-bottom: 5px;\n    padding-right:10px;\n    padding-top:5px;\n    z-index: 100;\n}\n\n.map-fixed-header {\n  position: fixed;\n  background: white;\n  padding-top: 5px;\n  width: 100%;\n  z-index: 1;\n  left: 0;\n  top: 0;\n  @media (max-width: 720px) {\n    padding-top:30px;\n  }\n  p {\n  margin: 5px 0 20px;\n    @media (max-width: 720px) {\n      margin-bottom:10px;\n    }\n  }\n  hr {\n    margin:30px 0;\n    @media (max-width: 720px) {\n      margin:25px 0;\n    }\n  }\n  .flashMessage {\n    position:fixed;\n    margin: 0 auto;\n    z-index: 2;\n    top: 160px;\n    width: 100%;\n  }\n }\n\n.map-buttons {\n  margin-top: -10px;\n  & button,\n  & .input-group{\n    width:300px;\n  }\n  .input-group{\n    margin-top: 15px;\n    margin-left: auto;\n    margin-right: auto;\n  }\n}\n\n#map-filter {\n    background:#fff;\n    border-color: darkgreen;\n}\n.input-group-addon {\n  width:40px;\n  color: darkgreen;\n  background: #fff;\n  border-color: darkgreen;\n  &.filled{\n    background: darkgreen;\n    border-color: #000d00;\n    color: #fff;\n    cursor: pointer;\n  }\n  .fa {\n    position:absolute;\n    top:50%;\n    -webkit-transform: translateY(-50%);\n    transform: translateY(-50%);\n    right:10px;\n  }\n}\n\n.mapWrapper {\n  position:absolute;\n  display: block;\n  height: 100%;\n  width: 100%; \n}\n\n.map-accordion {\n  width:700px; \n  margin:155px auto 0; \n  position:relative;\n  #nested {\n    margin:0 10px;\n    @media (max-width: 400px) {\n    margin:0;\n    }\n  }\n  a:focus {\n      text-decoration: none;\n      color:darkgreen;\n  }\n  a:focus:hover {\n      text-decoration: underline;\n      color:#001800;\n  }\n  h2 > a {\n      width:100%;\n      display:block;\n      background:#efefef;\n      padding:10px 0;\n      padding-left:50px;\n      padding-right:20px;\n    }\n\n  h3 {\n    margin:15px 0;\n    padding:0;\n    &:first-child {\n      margin-top:25px\n    }\n    > a {\n      padding-left: 40px;\n      padding-bottom: 10px;\n      display:block;\n      max-width: 535px;\n    }\n  }\n\n  div.chapterBlock {\n    :before {\n      margin-right: 15px;\n    }\n    p {\n      text-indent: -15px;\n      margin-left: 60px;\n      padding-right: 20px;\n      @media (max-width: 400px) {\n          margin-left:30px;\n      }\n    }\n  }\n\n  .challengeBlockDescription {\n      margin:0;\n      margin-top:-10px;\n      padding:0 15px 23px 30px;\n    }\n\n  span.no-link-underline {\n    position:absolute;\n    margin-left:-30px;\n    color: #666;\n  }\n\n  div > div:last-child {\n    margin-bottom:30px\n  }\n}\n.challengeBlockTime {\n  font-size: 18px;\n  color: #BBBBBB;\n  display:block;\n  margin-left: 40px;\n  margin-bottom: 20px;\n  @media (min-width: 721px) {\n    margin-right: 20px;\n    margin-top:-30px;\n    float:right;\n  }\n}\n\n@media (max-width: 720px) {\n  .map-accordion {\n    left:0;\n    right:0;\n    width:100%;\n    top:195px;\n    bottom:0;\n    margin:0;\n    position:absolute;\n    overflow-x: hidden;\n    overflow-y: auto;\n    -webkit-overflow-scrolling: touch;\n    h2 {\n      margin:15px 0;\n      padding:0;\n      &:first-of-type {\n        margin-top:0;\n      }\n      > a {\n        padding:10px 0;\n        padding-left:50px;\n        padding-right:20px;\n        font-size:20px;\n      }\n    }\n    h3 {\n      margin:10px 0;\n      padding:0;\n      > a {\n        clear:both;\n        font-size:20px;\n      }\n    }\n  }\n}\n    \n.map-aside-action-item {\n    display: -webkit-flex;\n    display: flex;\n    /* main axis */\n    justify-content: center;\n    /* cross axis */\n    align-items: center;\n\n    width: 40px;\n    height: 40px;\n\n    padding-left: 0;\n    padding-right: 0;\n\n    opacity: 0.65;\n    background: none;\n    background-position: center center;\n    background-repeat: no-repeat;\n    background-size: 22px 22px;\n    border: 0;\n    outline: none;\n\n    cursor: pointer;\n    cursor: hand;\n\n    transition: all 0.2s ease;\n\n    &:hover,\n    &:focus {\n      opacity: 1;\n    }\n\n    &:active {\n      filter: hue-rotate(80deg) saturate(150);\n    }\n}\n\n#noneFound {\n    display:none;\n    margin:60px 30px 0;\n    font-size:30px;\n    text-align: center;\n    color:darkgreen;\n    .fa {\n      display:block;\n      font-size:300px;\n    }\n}\n\n.map-aside-action-pop-out {\n    margin-right: -4px;\n    background-image: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMDAgMTcxLjQyOSIgZmlsbD0iIzNhMzEzMyI+PHBhdGggZD0iTTE1Ny4xNDMsMTAzLjU3MXYzNS43MTRjMCw4Ljg1NC0zLjE0NCwxNi40MjYtOS40MzEsMjIuNzEzcy0xMy44NTgsOS40MzEtMjIuNzEyLDkuNDMxSDMyLjE0MyBjLTguODU0LDAtMTYuNDI1LTMuMTQ0LTIyLjcxMi05LjQzMVMwLDE0OC4xNCwwLDEzOS4yODVWNDYuNDI5YzAtOC44NTQsMy4xNDQtMTYuNDI1LDkuNDMxLTIyLjcxMiBjNi4yODctNi4yODcsMTMuODU4LTkuNDMxLDIyLjcxMi05LjQzMWg3OC41NzJjMS4wNDEsMCwxLjg5NiwwLjMzNSwyLjU2NiwxLjAwNGMwLjY3LDAuNjcsMS4wMDQsMS41MjUsMS4wMDQsMi41NjdWMjUgYzAsMS4wNDItMC4zMzQsMS44OTctMS4wMDQsMi41NjdjLTAuNjcsMC42Ny0xLjUyNSwxLjAwNC0yLjU2NiwxLjAwNEgzMi4xNDNjLTQuOTExLDAtOS4xMTUsMS43NDktMTIuNjEyLDUuMjQ2IHMtNS4yNDYsNy43MDEtNS4yNDYsMTIuNjEydjkyLjg1NmMwLDQuOTExLDEuNzQ5LDkuMTE1LDUuMjQ2LDEyLjYxMnM3LjcwMSw1LjI0NSwxMi42MTIsNS4yNDVIMTI1YzQuOTEsMCw5LjExNS0xLjc0OCwxMi42MTEtNS4yNDUgYzMuNDk3LTMuNDk3LDUuMjQ2LTcuNzAxLDUuMjQ2LTEyLjYxMnYtMzUuNzE0YzAtMS4wNDIsMC4zMzQtMS44OTcsMS4wMDQtMi41NjdjMC42Ny0wLjY2OSwxLjUyNS0xLjAwNCwyLjU2Ny0xLjAwNGg3LjE0MyBjMS4wNDIsMCwxLjg5NywwLjMzNSwyLjU2NywxLjAwNEMxNTYuODA5LDEwMS42NzQsMTU3LjE0MywxMDIuNTI5LDE1Ny4xNDMsMTAzLjU3MXogTTIwMCw3LjE0M3Y1Ny4xNDMgYzAsMS45MzUtMC43MDcsMy42MDktMi4xMjEsNS4wMjJjLTEuNDEzLDEuNDE0LTMuMDg4LDIuMTIxLTUuMDIxLDIuMTIxYy0xLjkzNSwwLTMuNjA5LTAuNzA3LTUuMDIyLTIuMTIxbC0xOS42NDQtMTkuNjQzIGwtNzIuNzY3LDcyLjc2OWMtMC43NDQsMC43NDQtMS42LDEuMTE1LTIuNTY3LDEuMTE1cy0xLjgyMy0wLjM3MS0yLjU2Ny0xLjExNUw3Ny41NjcsMTA5LjcxYy0wLjc0NC0wLjc0NC0xLjExNi0xLjYtMS4xMTYtMi41NjcgYzAtMC45NjcsMC4zNzItMS44MjIsMS4xMTYtMi41NjZsNzIuNzY4LTcyLjc2OGwtMTkuNjQ0LTE5LjY0M2MtMS40MTMtMS40MTQtMi4xMi0zLjA4OC0yLjEyLTUuMDIyYzAtMS45MzUsMC43MDctMy42MDksMi4xMi01LjAyMiBDMTMyLjEwNSwwLjcwNywxMzMuNzc5LDAsMTM1LjcxNSwwaDU3LjE0M2MxLjkzNCwwLDMuNjA4LDAuNzA3LDUuMDIxLDIuMTIxQzE5OS4yOTMsMy41MzQsMjAwLDUuMjA4LDIwMCw3LjE0M3oiLz48L3N2Zz4=)\n}\n\n.map-aside-action-collapse {\n    background-image: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAxNzEuNDI5IDE3MS40MjkiIGZpbGw9IiMzYTMxMzMiPjxwYXRoIGQ9Ik0xMjIuNDMzLDEwNi4xMzhsLTE2LjI5NSwxNi4yOTVjLTAuNzQ0LDAuNzQ0LTEuNiwxLjExNi0yLjU2NiwxLjExNmMtMC45NjgsMC0xLjgyMy0wLjM3Mi0yLjU2Ny0xLjExNmwtMTUuMjktMTUuMjkgbC0xNS4yOSwxNS4yOWMtMC43NDQsMC43NDQtMS42LDEuMTE2LTIuNTY3LDEuMTE2cy0xLjgyMy0wLjM3Mi0yLjU2Ny0xLjExNmwtMTYuMjk0LTE2LjI5NWMtMC43NDQtMC43NDQtMS4xMTYtMS42LTEuMTE2LTIuNTY2IGMwLTAuOTY4LDAuMzcyLTEuODIzLDEuMTE2LTIuNTY3bDE1LjI5LTE1LjI5bC0xNS4yOS0xNS4yOWMtMC43NDQtMC43NDQtMS4xMTYtMS42LTEuMTE2LTIuNTY3czAuMzcyLTEuODIzLDEuMTE2LTIuNTY3IEw2NS4yOSw0OC45OTZjMC43NDQtMC43NDQsMS42LTEuMTE2LDIuNTY3LTEuMTE2czEuODIzLDAuMzcyLDIuNTY3LDEuMTE2bDE1LjI5LDE1LjI5bDE1LjI5LTE1LjI5IGMwLjc0NC0wLjc0NCwxLjYtMS4xMTYsMi41NjctMS4xMTZjMC45NjcsMCwxLjgyMiwwLjM3MiwyLjU2NiwxLjExNmwxNi4yOTUsMTYuMjk0YzAuNzQ0LDAuNzQ0LDEuMTE2LDEuNiwxLjExNiwyLjU2NyBzLTAuMzcyLDEuODIzLTEuMTE2LDIuNTY3bC0xNS4yOSwxNS4yOWwxNS4yOSwxNS4yOWMwLjc0NCwwLjc0NCwxLjExNiwxLjYsMS4xMTYsMi41NjcgQzEyMy41NDksMTA0LjUzOSwxMjMuMTc3LDEwNS4zOTQsMTIyLjQzMywxMDYuMTM4eiBNMTQ2LjQyOSw4NS43MTRjMC0xMS4wMTItMi43MTctMjEuMTY4LTguMTQ4LTMwLjQ2OSBzLTEyLjc5Ny0xNi42NjctMjIuMDk4LTIyLjA5OFM5Ni43MjYsMjUsODUuNzE0LDI1cy0yMS4xNjgsMi43MTYtMzAuNDY5LDguMTQ3UzM4LjU3OSw0NS45NDUsMzMuMTQ3LDU1LjI0NlMyNSw3NC43MDMsMjUsODUuNzE0IHMyLjcxNiwyMS4xNjgsOC4xNDcsMzAuNDY5czEyLjc5NywxNi42NjYsMjIuMDk4LDIyLjA5OHMxOS40NTcsOC4xNDgsMzAuNDY5LDguMTQ4czIxLjE2OC0yLjcxNywzMC40NjktOC4xNDggczE2LjY2Ni0xMi43OTcsMjIuMDk4LTIyLjA5OFMxNDYuNDI5LDk2LjcyNiwxNDYuNDI5LDg1LjcxNHogTTE3MS40MjksODUuNzE0YzAsMTUuNTUxLTMuODMyLDI5Ljg5My0xMS40OTYsNDMuMDI0IGMtNy42NjQsMTMuMTMzLTE4LjA2MiwyMy41My0zMS4xOTQsMzEuMTk0Yy0xMy4xMzIsNy42NjQtMjcuNDc0LDExLjQ5Ni00My4wMjQsMTEuNDk2cy0yOS44OTItMy44MzItNDMuMDI0LTExLjQ5NiBjLTEzLjEzMy03LjY2NC0yMy41MzEtMTguMDYyLTMxLjE5NC0zMS4xOTRDMy44MzIsMTE1LjYwNywwLDEwMS4yNjUsMCw4NS43MTRTMy44MzIsNTUuODIyLDExLjQ5Niw0Mi42OSBjNy42NjQtMTMuMTMzLDE4LjA2Mi0yMy41MzEsMzEuMTk0LTMxLjE5NEM1NS44MjIsMy44MzIsNzAuMTY0LDAsODUuNzE0LDBzMjkuODkzLDMuODMyLDQzLjAyNCwxMS40OTYgYzEzLjEzMyw3LjY2NCwyMy41MywxOC4wNjIsMzEuMTk0LDMxLjE5NEMxNjcuNTk3LDU1LjgyMiwxNzEuNDI5LDcwLjE2NCwxNzEuNDI5LDg1LjcxNHoiLz48L3N2Zz4=)\n}\n"
  },
  {
    "path": "client/less/signin.less",
    "content": ".github-login {\n\tposition: relative;\n\twidth: 300px;\n\tmargin-left: auto;\n\tmargin-right: auto;\n\t.first {\n\tposition: relative;\n\theight:0;\n\ttop:-30px;\n\tright:-180px;\n\tcolor:red\n\t}\n}"
  },
  {
    "path": "client/less/toastr.less",
    "content": "// sourced from https://github.com/CodeSeven/toastr\n// MIT license\n// Mix-ins\n.borderRadius(@radius) {\n    -moz-border-radius: @radius;\n    -webkit-border-radius: @radius;\n    border-radius: @radius;\n}\n\n.boxShadow(@boxShadow) {\n    -moz-box-shadow: @boxShadow;\n    -webkit-box-shadow: @boxShadow;\n    box-shadow: @boxShadow;\n}\n\n.opacity(@opacity) {\n    @opacityPercent: @opacity * 100;\n    opacity: @opacity;\n    -ms-filter: ~\"progid:DXImageTransform.Microsoft.Alpha(Opacity=@{opacityPercent})\";\n    filter: ~\"alpha(opacity=@{opacityPercent})\";\n}\n\n.wordWrap(@wordWrap: break-word) {\n    -ms-word-wrap: @wordWrap;\n    word-wrap: @wordWrap;\n}\n\n// Variables\n@black: #000000;\n@grey: #999999;\n@light-grey: #CCCCCC;\n@white: #FFFFFF;\n@near-black: #030303;\n@green: #51A351;\n@red: #BD362F;\n@blue: #2F96B4;\n@orange: #F89406;\n@default-container-opacity: .8;\n\n// Styles\n.toast-title {\n    font-weight: bold;\n}\n\n.toast-message {\n    .wordWrap();\n\n    a,\n    label {\n        color: @white;\n    }\n\n        a:hover {\n            color: @light-grey;\n            text-decoration: none;\n        }\n}\n\n.toast-close-button {\n    position: relative;\n    right: -0.3em;\n    top: -0.3em;\n    float: right;\n    font-size: 20px;\n    font-weight: bold;\n    color: @white;\n    -webkit-text-shadow: 0 1px 0 rgba(255,255,255,1);\n    text-shadow: 0 1px 0 rgba(255,255,255,1);\n    .opacity(0.8);\n\n    &:hover,\n    &:focus {\n        color: @black;\n        text-decoration: none;\n        cursor: pointer;\n        .opacity(0.4);\n    }\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=\"#\"`.*/\nbutton.toast-close-button {\n    padding: 0;\n    cursor: pointer;\n    background: transparent;\n    border: 0;\n    -webkit-appearance: none;\n}\n\n//#endregion\n\n.toast-top-center {\n    top: 0;\n    right: 0;\n    width: 100%;\n}\n\n.toast-bottom-center {\n    bottom: 0;\n    right: 0;\n    width: 100%;\n}\n\n.toast-top-full-width {\n    top: 0;\n    right: 0;\n    width: 100%;\n}\n\n.toast-bottom-full-width {\n    bottom: 0;\n    right: 0;\n    width: 100%;\n}\n\n.toast-top-left {\n    top: 12px;\n    left: 12px;\n}\n\n.toast-top-right {\n    top: 12px;\n    right: 12px;\n}\n\n.toast-bottom-right {\n    right: 12px;\n    bottom: 12px;\n}\n\n.toast-bottom-left {\n    bottom: 12px;\n    left: 12px;\n}\n\n#toast-container {\n    position: fixed;\n    z-index: 999999;\n    // The container should not be clickable.\n    pointer-events: none;\n    * {\n        -moz-box-sizing: border-box;\n        -webkit-box-sizing: border-box;\n        box-sizing: border-box;\n    }\n\n    > div {\n        position: relative;\n        // The toast itself should be clickable.\n        pointer-events: auto;\n        overflow: hidden;\n        margin: 0 0 6px;\n        padding: 15px 15px 15px 50px;\n        width: 300px;\n        .borderRadius(3px 3px 3px 3px);\n        background-position: 15px center;\n        background-repeat: no-repeat;\n        .boxShadow(0 0 12px @grey);\n        color: @white;\n        .opacity(@default-container-opacity);\n    }\n\n    > :hover {\n        .boxShadow(0 0 12px @black);\n        .opacity(1);\n        cursor: pointer;\n    }\n\n    > .toast-info {\n        background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAGwSURBVEhLtZa9SgNBEMc9sUxxRcoUKSzSWIhXpFMhhYWFhaBg4yPYiWCXZxBLERsLRS3EQkEfwCKdjWJAwSKCgoKCcudv4O5YLrt7EzgXhiU3/4+b2ckmwVjJSpKkQ6wAi4gwhT+z3wRBcEz0yjSseUTrcRyfsHsXmD0AmbHOC9Ii8VImnuXBPglHpQ5wwSVM7sNnTG7Za4JwDdCjxyAiH3nyA2mtaTJufiDZ5dCaqlItILh1NHatfN5skvjx9Z38m69CgzuXmZgVrPIGE763Jx9qKsRozWYw6xOHdER+nn2KkO+Bb+UV5CBN6WC6QtBgbRVozrahAbmm6HtUsgtPC19tFdxXZYBOfkbmFJ1VaHA1VAHjd0pp70oTZzvR+EVrx2Ygfdsq6eu55BHYR8hlcki+n+kERUFG8BrA0BwjeAv2M8WLQBtcy+SD6fNsmnB3AlBLrgTtVW1c2QN4bVWLATaIS60J2Du5y1TiJgjSBvFVZgTmwCU+dAZFoPxGEEs8nyHC9Bwe2GvEJv2WXZb0vjdyFT4Cxk3e/kIqlOGoVLwwPevpYHT+00T+hWwXDf4AJAOUqWcDhbwAAAAASUVORK5CYII=\") !important;\n    }\n\n    > .toast-error {\n        background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAHOSURBVEhLrZa/SgNBEMZzh0WKCClSCKaIYOED+AAKeQQLG8HWztLCImBrYadgIdY+gIKNYkBFSwu7CAoqCgkkoGBI/E28PdbLZmeDLgzZzcx83/zZ2SSXC1j9fr+I1Hq93g2yxH4iwM1vkoBWAdxCmpzTxfkN2RcyZNaHFIkSo10+8kgxkXIURV5HGxTmFuc75B2RfQkpxHG8aAgaAFa0tAHqYFfQ7Iwe2yhODk8+J4C7yAoRTWI3w/4klGRgR4lO7Rpn9+gvMyWp+uxFh8+H+ARlgN1nJuJuQAYvNkEnwGFck18Er4q3egEc/oO+mhLdKgRyhdNFiacC0rlOCbhNVz4H9FnAYgDBvU3QIioZlJFLJtsoHYRDfiZoUyIxqCtRpVlANq0EU4dApjrtgezPFad5S19Wgjkc0hNVnuF4HjVA6C7QrSIbylB+oZe3aHgBsqlNqKYH48jXyJKMuAbiyVJ8KzaB3eRc0pg9VwQ4niFryI68qiOi3AbjwdsfnAtk0bCjTLJKr6mrD9g8iq/S/B81hguOMlQTnVyG40wAcjnmgsCNESDrjme7wfftP4P7SP4N3CJZdvzoNyGq2c/HWOXJGsvVg+RA/k2MC/wN6I2YA2Pt8GkAAAAASUVORK5CYII=\") !important;\n    }\n\n    > .toast-success {\n        background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAADsSURBVEhLY2AYBfQMgf///3P8+/evAIgvA/FsIF+BavYDDWMBGroaSMMBiE8VC7AZDrIFaMFnii3AZTjUgsUUWUDA8OdAH6iQbQEhw4HyGsPEcKBXBIC4ARhex4G4BsjmweU1soIFaGg/WtoFZRIZdEvIMhxkCCjXIVsATV6gFGACs4Rsw0EGgIIH3QJYJgHSARQZDrWAB+jawzgs+Q2UO49D7jnRSRGoEFRILcdmEMWGI0cm0JJ2QpYA1RDvcmzJEWhABhD/pqrL0S0CWuABKgnRki9lLseS7g2AlqwHWQSKH4oKLrILpRGhEQCw2LiRUIa4lwAAAABJRU5ErkJggg==\") !important;\n    }\n\n    > .toast-warning {\n        background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAGYSURBVEhL5ZSvTsNQFMbXZGICMYGYmJhAQIJAICYQPAACiSDB8AiICQQJT4CqQEwgJvYASAQCiZiYmJhAIBATCARJy+9rTsldd8sKu1M0+dLb057v6/lbq/2rK0mS/TRNj9cWNAKPYIJII7gIxCcQ51cvqID+GIEX8ASG4B1bK5gIZFeQfoJdEXOfgX4QAQg7kH2A65yQ87lyxb27sggkAzAuFhbbg1K2kgCkB1bVwyIR9m2L7PRPIhDUIXgGtyKw575yz3lTNs6X4JXnjV+LKM/m3MydnTbtOKIjtz6VhCBq4vSm3ncdrD2lk0VgUXSVKjVDJXJzijW1RQdsU7F77He8u68koNZTz8Oz5yGa6J3H3lZ0xYgXBK2QymlWWA+RWnYhskLBv2vmE+hBMCtbA7KX5drWyRT/2JsqZ2IvfB9Y4bWDNMFbJRFmC9E74SoS0CqulwjkC0+5bpcV1CZ8NMej4pjy0U+doDQsGyo1hzVJttIjhQ7GnBtRFN1UarUlH8F3xict+HY07rEzoUGPlWcjRFRr4/gChZgc3ZL2d8oAAAAASUVORK5CYII=\") !important;\n    }\n\n    /*overrides*/\n    &.toast-top-center > div,\n    &.toast-bottom-center > div {\n        width: 300px;\n        margin-left: auto;\n        margin-right: auto;\n    }\n\n    &.toast-top-full-width > div,\n    &.toast-bottom-full-width > div {\n        width: 96%;\n        margin-left: auto;\n        margin-right: auto;\n    }\n}\n\n.toast {\n    background-color: @near-black;\n}\n\n.toast-success {\n    background-color: @green;\n}\n\n.toast-error {\n    background-color: @red;\n}\n\n.toast-info {\n    background-color: @blue;\n}\n\n.toast-warning {\n    background-color: @orange;\n}\n\n.toast-progress {\n    position: absolute;\n    left: 0;\n    bottom: 0;\n    height: 4px;\n    background-color: @black;\n    .opacity(0.4);\n}\n\n/*Responsive Design*/\n\n@media all and (max-width: 240px) {\n    #toast-container {\n\n        > div {\n            padding: 8px 8px 8px 50px;\n            width: 11em;\n        }\n\n        & .toast-close-button {\n            right: -0.2em;\n            top: -0.2em;\n        }\n    }\n}\n\n@media all and (min-width: 241px) and (max-width: 480px) {\n    #toast-container {\n        > div {\n            padding: 8px 8px 8px 50px;\n            width: 18em;\n        }\n\n        & .toast-close-button {\n            right: -0.2em;\n            top: -0.2em;\n        }\n    }\n}\n\n@media all and (min-width: 481px) and (max-width: 768px) {\n    #toast-container {\n        > div {\n            padding: 15px 15px 15px 50px;\n            width: 25em;\n        }\n    }\n}\n"
  },
  {
    "path": "client/less/wiki.less",
    "content": "/*\n * based off of https://github.com/gitterHQ/sidecar\n * license: MIT\n */\n\n#wikiFrame {\n    width: 100%;\n    height: 100%;\n    top:0;\n    bottom: 0;\n    position: absolute;\n    overflow: hidden;\n}\n\n.wiki-aside {\n    width:500px;\n\n    z-index: 20000;\n    position: fixed;\n    top: 0;\n    bottom: 0;\n    right: 0;\n\n    display: -webkit-flex;\n    display: flex;\n    -webkit-flex-direction: row;\n    flex-direction: row;\n\n    background-color: @body-bg;\n    border-left: 1px solid #ddd;\n    box-shadow: -12px 0 18px 0 rgba(50, 50, 50, 0.1);\n\n    transition: transform 0.3s cubic-bezier(0.16, 0.22, 0.22, 1.7);\n\n    &.is-collapsed:not(.is-loading) {\n      -webkit-transform: translateX(110%);\n      transform: translateX(110%);\n    }\n\n    /* Add some \"extension\" so that there isn't a gap\n     * when we translate(via animation) more than 100% */\n    &:after {\n      content: '';\n\n      z-index: -1;\n      position: absolute;\n      top: 0;\n      left: 100%;\n      bottom: 0;\n      right: -100%;\n\n      background-color: @body-bg;\n    }\n\n    iframe {\n      width: 100%;\n      height: 100%;\n      top:0;\n      bottom:0;\n      position:absolute;\n      overflow: hidden;\n    }\n}\n\n.wiki-aside .wiki-header {\n  display: none;\n}\n\n.wiki-aside .wiki-container {\n  padding-top: 10px;\n}\n\n.wiki-aside .wikiSelector {\n  top: 50px;\n}\n\n.wiki-aside-action-bar {\n    position: absolute;\n    top: 0;\n    right: 15px;\n\n    display: -webkit-flex;\n    display: flex;\n    justify-content: flex-end;\n\n    padding-bottom: 5px;\n    padding-right:0px;\n    padding-top:5px;\n    z-index: 100;\n}\n\n.wiki-fixed-header {\n  position: fixed;\n  background: white;\n  padding-top: 5px;\n  width: 100%;\n  z-index: 1;\n  left: 0;\n  top: 0;\n  @media (max-width: 720px) {\n    padding-top:30px;\n  }\n  p {\n  margin: 5px 0 20px;\n    @media (max-width: 720px) {\n      margin-bottom:10px;\n    }\n  }\n  hr {\n    margin:30px 0;\n    @media (max-width: 720px) {\n      margin:25px 0;\n    }\n  }\n }\n\n.wiki-buttons {\n  margin-top: -10px;\n  & button,\n  & .input-group{\n    width:300px;\n  }\n  .input-group{\n    margin-top: 15px;\n    margin-left: auto;\n    margin-right: auto;\n  }\n}\n\n#wiki-filter {\n    background:#fff;\n    border-color: darkgreen;\n}\n\n.wiki-aside-action-item {\n    display: -webkit-flex;\n    display: flex;\n    /* main axis */\n    justify-content: center;\n    /* cross axis */\n    align-items: center;\n\n    width: 40px;\n    height: 40px;\n\n    padding-left: 0;\n    padding-right: 0;\n\n    opacity: 0.65;\n    background: none;\n    background-position: center center;\n    background-repeat: no-repeat;\n    background-size: 22px 22px;\n    border: 0;\n    outline: none;\n\n    cursor: pointer;\n    cursor: hand;\n\n    transition: all 0.2s ease;\n\n    &:hover,\n    &:focus {\n      opacity: 1;\n    }\n\n    &:active {\n      filter: hue-rotate(80deg) saturate(150);\n    }\n}\n\n.wiki-aside-action-pop-out {\n    margin-right: -4px;\n    background-image: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMDAgMTcxLjQyOSIgZmlsbD0iIzNhMzEzMyI+PHBhdGggZD0iTTE1Ny4xNDMsMTAzLjU3MXYzNS43MTRjMCw4Ljg1NC0zLjE0NCwxNi40MjYtOS40MzEsMjIuNzEzcy0xMy44NTgsOS40MzEtMjIuNzEyLDkuNDMxSDMyLjE0MyBjLTguODU0LDAtMTYuNDI1LTMuMTQ0LTIyLjcxMi05LjQzMVMwLDE0OC4xNCwwLDEzOS4yODVWNDYuNDI5YzAtOC44NTQsMy4xNDQtMTYuNDI1LDkuNDMxLTIyLjcxMiBjNi4yODctNi4yODcsMTMuODU4LTkuNDMxLDIyLjcxMi05LjQzMWg3OC41NzJjMS4wNDEsMCwxLjg5NiwwLjMzNSwyLjU2NiwxLjAwNGMwLjY3LDAuNjcsMS4wMDQsMS41MjUsMS4wMDQsMi41NjdWMjUgYzAsMS4wNDItMC4zMzQsMS44OTctMS4wMDQsMi41NjdjLTAuNjcsMC42Ny0xLjUyNSwxLjAwNC0yLjU2NiwxLjAwNEgzMi4xNDNjLTQuOTExLDAtOS4xMTUsMS43NDktMTIuNjEyLDUuMjQ2IHMtNS4yNDYsNy43MDEtNS4yNDYsMTIuNjEydjkyLjg1NmMwLDQuOTExLDEuNzQ5LDkuMTE1LDUuMjQ2LDEyLjYxMnM3LjcwMSw1LjI0NSwxMi42MTIsNS4yNDVIMTI1YzQuOTEsMCw5LjExNS0xLjc0OCwxMi42MTEtNS4yNDUgYzMuNDk3LTMuNDk3LDUuMjQ2LTcuNzAxLDUuMjQ2LTEyLjYxMnYtMzUuNzE0YzAtMS4wNDIsMC4zMzQtMS44OTcsMS4wMDQtMi41NjdjMC42Ny0wLjY2OSwxLjUyNS0xLjAwNCwyLjU2Ny0xLjAwNGg3LjE0MyBjMS4wNDIsMCwxLjg5NywwLjMzNSwyLjU2NywxLjAwNEMxNTYuODA5LDEwMS42NzQsMTU3LjE0MywxMDIuNTI5LDE1Ny4xNDMsMTAzLjU3MXogTTIwMCw3LjE0M3Y1Ny4xNDMgYzAsMS45MzUtMC43MDcsMy42MDktMi4xMjEsNS4wMjJjLTEuNDEzLDEuNDE0LTMuMDg4LDIuMTIxLTUuMDIxLDIuMTIxYy0xLjkzNSwwLTMuNjA5LTAuNzA3LTUuMDIyLTIuMTIxbC0xOS42NDQtMTkuNjQzIGwtNzIuNzY3LDcyLjc2OWMtMC43NDQsMC43NDQtMS42LDEuMTE1LTIuNTY3LDEuMTE1cy0xLjgyMy0wLjM3MS0yLjU2Ny0xLjExNUw3Ny41NjcsMTA5LjcxYy0wLjc0NC0wLjc0NC0xLjExNi0xLjYtMS4xMTYtMi41NjcgYzAtMC45NjcsMC4zNzItMS44MjIsMS4xMTYtMi41NjZsNzIuNzY4LTcyLjc2OGwtMTkuNjQ0LTE5LjY0M2MtMS40MTMtMS40MTQtMi4xMi0zLjA4OC0yLjEyLTUuMDIyYzAtMS45MzUsMC43MDctMy42MDksMi4xMi01LjAyMiBDMTMyLjEwNSwwLjcwNywxMzMuNzc5LDAsMTM1LjcxNSwwaDU3LjE0M2MxLjkzNCwwLDMuNjA4LDAuNzA3LDUuMDIxLDIuMTIxQzE5OS4yOTMsMy41MzQsMjAwLDUuMjA4LDIwMCw3LjE0M3oiLz48L3N2Zz4=)\n}\n\n.wiki-aside-action-collapse {\n    background-image: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAxNzEuNDI5IDE3MS40MjkiIGZpbGw9IiMzYTMxMzMiPjxwYXRoIGQ9Ik0xMjIuNDMzLDEwNi4xMzhsLTE2LjI5NSwxNi4yOTVjLTAuNzQ0LDAuNzQ0LTEuNiwxLjExNi0yLjU2NiwxLjExNmMtMC45NjgsMC0xLjgyMy0wLjM3Mi0yLjU2Ny0xLjExNmwtMTUuMjktMTUuMjkgbC0xNS4yOSwxNS4yOWMtMC43NDQsMC43NDQtMS42LDEuMTE2LTIuNTY3LDEuMTE2cy0xLjgyMy0wLjM3Mi0yLjU2Ny0xLjExNmwtMTYuMjk0LTE2LjI5NWMtMC43NDQtMC43NDQtMS4xMTYtMS42LTEuMTE2LTIuNTY2IGMwLTAuOTY4LDAuMzcyLTEuODIzLDEuMTE2LTIuNTY3bDE1LjI5LTE1LjI5bC0xNS4yOS0xNS4yOWMtMC43NDQtMC43NDQtMS4xMTYtMS42LTEuMTE2LTIuNTY3czAuMzcyLTEuODIzLDEuMTE2LTIuNTY3IEw2NS4yOSw0OC45OTZjMC43NDQtMC43NDQsMS42LTEuMTE2LDIuNTY3LTEuMTE2czEuODIzLDAuMzcyLDIuNTY3LDEuMTE2bDE1LjI5LDE1LjI5bDE1LjI5LTE1LjI5IGMwLjc0NC0wLjc0NCwxLjYtMS4xMTYsMi41NjctMS4xMTZjMC45NjcsMCwxLjgyMiwwLjM3MiwyLjU2NiwxLjExNmwxNi4yOTUsMTYuMjk0YzAuNzQ0LDAuNzQ0LDEuMTE2LDEuNiwxLjExNiwyLjU2NyBzLTAuMzcyLDEuODIzLTEuMTE2LDIuNTY3bC0xNS4yOSwxNS4yOWwxNS4yOSwxNS4yOWMwLjc0NCwwLjc0NCwxLjExNiwxLjYsMS4xMTYsMi41NjcgQzEyMy41NDksMTA0LjUzOSwxMjMuMTc3LDEwNS4zOTQsMTIyLjQzMywxMDYuMTM4eiBNMTQ2LjQyOSw4NS43MTRjMC0xMS4wMTItMi43MTctMjEuMTY4LTguMTQ4LTMwLjQ2OSBzLTEyLjc5Ny0xNi42NjctMjIuMDk4LTIyLjA5OFM5Ni43MjYsMjUsODUuNzE0LDI1cy0yMS4xNjgsMi43MTYtMzAuNDY5LDguMTQ3UzM4LjU3OSw0NS45NDUsMzMuMTQ3LDU1LjI0NlMyNSw3NC43MDMsMjUsODUuNzE0IHMyLjcxNiwyMS4xNjgsOC4xNDcsMzAuNDY5czEyLjc5NywxNi42NjYsMjIuMDk4LDIyLjA5OHMxOS40NTcsOC4xNDgsMzAuNDY5LDguMTQ4czIxLjE2OC0yLjcxNywzMC40NjktOC4xNDggczE2LjY2Ni0xMi43OTcsMjIuMDk4LTIyLjA5OFMxNDYuNDI5LDk2LjcyNiwxNDYuNDI5LDg1LjcxNHogTTE3MS40MjksODUuNzE0YzAsMTUuNTUxLTMuODMyLDI5Ljg5My0xMS40OTYsNDMuMDI0IGMtNy42NjQsMTMuMTMzLTE4LjA2MiwyMy41My0zMS4xOTQsMzEuMTk0Yy0xMy4xMzIsNy42NjQtMjcuNDc0LDExLjQ5Ni00My4wMjQsMTEuNDk2cy0yOS44OTItMy44MzItNDMuMDI0LTExLjQ5NiBjLTEzLjEzMy03LjY2NC0yMy41MzEtMTguMDYyLTMxLjE5NC0zMS4xOTRDMy44MzIsMTE1LjYwNywwLDEwMS4yNjUsMCw4NS43MTRTMy44MzIsNTUuODIyLDExLjQ5Niw0Mi42OSBjNy42NjQtMTMuMTMzLDE4LjA2Mi0yMy41MzEsMzEuMTk0LTMxLjE5NEM1NS44MjIsMy44MzIsNzAuMTY0LDAsODUuNzE0LDBzMjkuODkzLDMuODMyLDQzLjAyNCwxMS40OTYgYzEzLjEzMyw3LjY2NCwyMy41MywxOC4wNjIsMzEuMTk0LDMxLjE5NEMxNjcuNTk3LDU1LjgyMiwxNzEuNDI5LDcwLjE2NCwxNzEuNDI5LDg1LjcxNHoiLz48L3N2Zz4=)\n}\n"
  },
  {
    "path": "client/main.js",
    "content": "var main = window.main || {};\n\nmain.mapShareKey = 'map-shares';\n\nmain.ga = window.ga || function() {};\n\nmain = (function(main, global) {\n  const { Mousetrap } = global;\n\n  // should be set before gitter script loads\n  ((window.gitter = {}).chat = {}).options = {\n    disableDefaultChat: true\n  };\n  // wait for sidecar to load\n\n  main.chat = {};\n  main.chat.isOpen = false;\n  main.chat.createHelpChat = function createHelpChat() {\n    throw new Error('Sidecar chat has not initialized');\n  };\n\n  document.addEventListener('gitter-sidecar-ready', function(e) {\n    main.chat.GitterChat = e.detail.Chat;\n\n    main.chat.createHelpChat = function(room, helpChatBtnClass, roomTitle) {\n      // room is always in PascalCase\n      roomTitle = room\n        .replace(/([A-Z])/g, ' $1')\n        .replace('Java Script', 'JavaScript');\n\n      $('body').append(\n        '<aside id=\"chat-embed-help\" class=\"gitter-chat-embed is-collapsed\" />'\n      );\n\n      main.chat.helpChat = new main.chat.GitterChat({\n        room: 'freecodecamp/chinese',\n        activationElement: false,\n        targetElement: $('#chat-embed-help')\n      });\n\n      $(helpChatBtnClass).on('click', function() {\n        // is button already pressed?\n        // no? open chat\n        // yes? close chat\n        var shouldChatBeOpen = !$(this).hasClass('active');\n        main.chat.helpChat.toggleChat(shouldChatBeOpen);\n        if (shouldChatBeOpen) {\n          $(helpChatBtnClass).addClass('active');\n        }\n      });\n\n      var helpTitleAdd = false;\n      $('#chat-embed-help').on('gitter-chat-toggle', function(e) {\n        var shouldButtonBePressed = !!e.originalEvent.detail.state;\n\n        if (!helpTitleAdd) {\n          helpTitleAdd = true;\n          $('#chat-embed-help > .gitter-chat-embed-action-bar').prepend(\n            '<div class=\"chat-embed-main-title\">' +\n              '<span>' +\n                roomTitle +\n              '</span>' +\n            '</div>'\n          );\n        }\n\n        if (shouldButtonBePressed) {\n          return $(helpChatBtnClass).addClass('active');\n        }\n        return $(helpChatBtnClass).removeClass('active');\n      });\n    };\n\n    $('body').append(\n      '<aside id=\"chat-embed-main\" class=\"gitter-chat-embed is-collapsed\" />'\n    );\n\n    main.chat.mainChat = new main.chat.GitterChat({\n      room: 'freecodecamp/chinese',\n      activationElement: false,\n      targetElement: $('#chat-embed-main')\n    });\n\n    var mainChatTitleAdded = false;\n    $('#chat-embed-main').on('gitter-chat-toggle', function() {\n      if (mainChatTitleAdded) {\n        return null;\n      }\n      mainChatTitleAdded = true;\n\n      $('#chat-embed-main > .gitter-chat-embed-action-bar').prepend(\n        '<div class=\"chat-embed-main-title\">' +\n          '<span>Free Code Camp\\'s Main Chat</span>' +\n        '</div>'\n      );\n      return null;\n    });\n\n\n    $('#nav-chat-btn').on('click', toggleMainChat);\n\n    function showMainChat() {\n      if (!main.chat.isOpen) {\n        main.chat.mainChat.toggleChat(true);\n      }\n    }\n\n    function collapseMainChat() {\n      $('#chat-embed-main').addClass('is-collapsed');\n      document.activeElement.blur();\n    }\n\n    function toggleMainChat() {\n      var isCollapsed = $('#chat-embed-main').hasClass('is-collapsed');\n\n      if (isCollapsed) {\n        showMainChat();\n      } else {\n        collapseMainChat();\n      }\n    }\n\n    // keyboard shortcuts: open main chat\n    Mousetrap.bind('g c', toggleMainChat);\n  });\n\n  return main;\n}(main, window));\n\nvar lastCompleted = typeof lastCompleted !== 'undefined' ?\n  lastCompleted :\n  '';\n\nmain.getMapShares = function getMapShares() {\n  var alreadyShared = JSON.parse(\n    localStorage.getItem(main.mapShareKey) ||\n    '[]'\n  );\n\n  if (!alreadyShared || !Array.isArray(alreadyShared)) {\n    localStorage.setItem(main.mapShareKey, JSON.stringify([]));\n    alreadyShared = [];\n  }\n  return alreadyShared;\n};\n\nmain.setMapShare = function setMapShare(id) {\n  var alreadyShared = main.getMapShares();\n  var found = false;\n  alreadyShared.forEach(function(_id) {\n    if (_id === id) {\n      found = true;\n    }\n  });\n  if (!found) {\n    alreadyShared.push(id);\n  }\n  localStorage.setItem(main.mapShareKey, JSON.stringify(alreadyShared));\n  return alreadyShared;\n};\n\n$(document).ready(function() {\n\n  var CSRF_HEADER = 'X-CSRF-Token';\n\n  var setCSRFToken = function(securityToken) {\n    jQuery.ajaxPrefilter(function(options, _, xhr) {\n      if (!xhr.crossDomain) {\n        xhr.setRequestHeader(CSRF_HEADER, securityToken);\n      }\n    });\n  };\n\n  setCSRFToken($('meta[name=\"csrf-token\"]').attr('content'));\n\n  $('img').error(function() {\n    $(this)\n      .unbind('error')\n      .attr(\n        'src',\n        '/images/camper-image-placeholder.png'\n      );\n  });\n\n  function upvoteHandler(e) {\n    e.preventDefault();\n    var upvoteBtn = this;\n    var id = upvoteBtn.id;\n    var upVotes = $(upvoteBtn).data().upVotes;\n    var username = typeof username !== 'undefined' ? username : '';\n    var alreadyUpvoted = false;\n    for (var i = 0; i < upVotes.length; i++) {\n      if (upVotes[i].upVotedBy === username) {\n        alreadyUpvoted = true;\n        break;\n      }\n    }\n    if (!alreadyUpvoted) {\n      $.post('/stories/upvote', { id: id })\n        .fail(function() {\n          $(upvoteBtn).bind('click', upvoteHandler);\n        })\n        .done(function(data) {\n          $(upvoteBtn)\n            .text('Upvoted!')\n            .addClass('disabled');\n\n          $('#storyRank').text(data.rank + ' points');\n        });\n    }\n  }\n\n  $('#story-list').on('click', 'button.btn-upvote', upvoteHandler);\n\n  var storySubmitButtonHandler = function storySubmitButtonHandler() {\n\n    if (!$('#story-submission-form')[0].checkValidity()) {\n      return null;\n    }\n\n    var link = $('#story-url').val();\n    var headline = $('#story-title').val();\n    var description = $('#description-box').val();\n    var data = {\n      data: {\n        link: link,\n        headline: headline,\n        timePosted: Date.now(),\n        description: description,\n        storyMetaDescription: main.storyMetaDescription,\n        rank: 1,\n        image: main.storyImage\n      }\n    };\n\n    $('#story-submit').unbind('click');\n    return $.post('/stories/', data)\n      .fail(function() {\n        $('#story-submit').bind('click', storySubmitButtonHandler);\n      })\n      .done(function({ storyLink, isBanned }) {\n        if (isBanned) {\n          window.location = '/news';\n          return null;\n        }\n        window.location = '/stories/' + storyLink;\n        return null;\n      });\n  };\n\n  $('#story-submit').on('click', storySubmitButtonHandler);\n\n\n  // map sharing\n  var alreadyShared = main.getMapShares();\n\n  if (lastCompleted && alreadyShared.indexOf(lastCompleted) === -1) {\n    $('div[id=\"' + lastCompleted + '\"]')\n      .parent()\n      .parent()\n      .removeClass('hidden');\n  }\n\n  // on map view\n  $('.map-challenge-block-share').on('click', function(e) {\n    e.preventDefault();\n    var challengeBlockName = $(this).children().attr('id');\n    var challengeBlockEscapedName = challengeBlockName.replace(/\\s/, '%20');\n    var username = typeof window.username !== 'undefined' ?\n      window.username :\n      '';\n\n    var link = 'https://www.facebook.com/dialog/feed?' +\n      'app_id=1644598365767721' +\n      '&display=page&' +\n      'caption=I%20just%20completed%20the%20' +\n      challengeBlockEscapedName +\n      '%20section%20on%20Free%20Code%20Camp%2E' +\n      '&link=http%3A%2F%2Ffreecodecamp%2Ecom%2F' +\n      username +\n      '&redirect_uri=http%3A%2F%2Ffreecodecamp%2Ecom%2Fmap';\n\n    main.setMapShare(challengeBlockName);\n    window.ga('send', 'event', 'FB_LINK', 'SHARE', 'Facebook map share');\n    window.location.href = link;\n  });\n\n  function expandCaret(item) {\n    $(item)\n      .prev().find('.fa-caret-right')\n      .removeClass('fa-caret-right').addClass('fa-caret-down');\n  }\n\n  function collapseCaret(item) {\n    $(item)\n      .prev().find('.fa-caret-down')\n      .removeClass('fa-caret-down').addClass('fa-caret-right');\n  }\n\n  function expandBlock(item) {\n    $(item).addClass('in').css('height', 'auto');\n    expandCaret(item);\n  }\n\n  function collapseBlock(item) {\n    $(item).removeClass('in').css('height', 'auto');\n    collapseCaret(item);\n  }\n\n  $.each($('.sr-only'), function(i, span) {\n    if ($(span).text() === ' Complete') {\n      $(span).parents('p').addClass('manip-hidden');\n    }\n  });\n\n  $.each($('.map-collapse'), function(i, div) {\n    if ($(div).find('.manip-hidden').length ===\n        $(div).find('p').length) {\n      collapseBlock(div);\n      $(div).prev('h3').addClass('faded');\n      $(div).prev('h2').addClass('faded');\n    }\n  });\n\n  var scrollTo, dashedName = localStorage.getItem('currentDashedName'),\n    elemsToSearch = $('p.padded-ionic-icon a'), currOrLastChallenge;\n  if (!dashedName && $('.sr-only').length) {\n    elemsToSearch = $('.sr-only');\n  }\n\n  currOrLastChallenge = elemsToSearch.filter(function() {\n    if (dashedName) {\n      return $(this).attr('href').match(dashedName);\n    }\n    return $(this).text() === ' Complete';\n  });\n\n  if (currOrLastChallenge.length) {\n    currOrLastChallenge = currOrLastChallenge[currOrLastChallenge.length - 1];\n    scrollTo = $(currOrLastChallenge).offset().top - 380;\n    $('html, body, .map-accordion').scrollTop(scrollTo);\n  }\n\n  if (String(window.location).match(/\\/map$/ig)) {\n    $('body>.flashMessage').find('.alert').css('display', 'none');\n    $('.map-fixed-header').css('top', '50px');\n  }\n\n  // map global selectors\n  var mapFilter = $('#map-filter');\n  var mapShowAll = $('#showAll');\n\n  $('#nav-map-btn').on('click', toggleMap);\n\n  $('.map-aside-action-collapse').on('click', collapseMap);\n\n  function showMap() {\n    if (!main.isMapAsideLoad) {\n      var mapAside = $('<iframe>');\n      mapAside.attr({\n        src: '/map-aside',\n        frameBorder: '0'\n      });\n      $('.map-aside').append(mapAside);\n      main.isMapAsideLoad = true;\n    }\n    $('.map-aside').removeClass('is-collapsed');\n  }\n\n  function collapseMap() {\n    $('.map-aside').addClass('is-collapsed');\n    document.activeElement.blur();\n  }\n\n  function toggleMap() {\n    var isCollapsed = $('.map-aside').hasClass('is-collapsed');\n    if (isCollapsed) {\n      showMap();\n    } else {\n      collapseMap();\n    }\n  }\n\n  $('#nav-wiki-btn').on('click', toggleWiki);\n\n  $('.wiki-aside-action-collapse').on('click', collapseWiki);\n\n  function showWiki() {\n    if (!main.isWikiAsideLoad) {\n      var lang = window.location.toString().match(/\\/\\w{2}\\//);\n      lang = (lang) ? lang[0] : '/en/';\n      var wikiURL = '//freecodecamp.github.io/wiki' + lang;\n      var wikiAside = $('<iframe>');\n      wikiAside.attr({\n        src: wikiURL,\n        frameBorder: '0'\n      });\n      $('.wiki-aside').append(wikiAside);\n      main.isWikiAsideLoad = true;\n    }\n    $('.wiki-aside').removeClass('is-collapsed');\n  }\n\n  function collapseWiki() {\n    $('.wiki-aside').addClass('is-collapsed');\n    document.activeElement.blur();\n  }\n\n  function toggleWiki() {\n    var isCollapsed = $('.wiki-aside').hasClass('is-collapsed');\n    if (isCollapsed) {\n      showWiki();\n    } else {\n      collapseWiki();\n    }\n  }\n\n  $('#accordion').on('show.bs.collapse', function(e) {\n    expandCaret(e.target);\n    if ($('a[data-toggle=collapse]').length === $('.fa-caret-down').length) {\n      mapShowAll.text('折叠所有课程内容');\n      mapShowAll.addClass('active');\n    }\n  }).on('hide.bs.collapse', function(e) {\n    collapseCaret(e.target);\n    if ($('a[data-toggle=collapse]').length === $('.fa-caret-right').length) {\n      mapShowAll.text('展开所有课程内容');\n      mapShowAll.removeClass('active');\n    }\n  });\n\n  mapShowAll.on('click', () => {\n    var mapExpanded = mapShowAll.hasClass('active');\n    if (!mapExpanded) {\n      $.each($('.map-collapse:not(\".in\")'),\n      function(i, div) {\n        expandBlock(div);\n      });\n      mapShowAll.text('折叠所有课程内容');\n      return mapShowAll.addClass('active');\n    } else {\n      $.each($('.map-collapse.in'), function(i, div) {\n        collapseBlock(div);\n      });\n      mapShowAll.text('展开所有课程内容');\n      return mapShowAll.removeClass('active');\n    }\n  });\n\n  // Map live filter\n  mapFilter.on('keyup', () => {\n    if (mapFilter.val().length > 0) {\n      var regex = new RegExp(mapFilter.val().replace(/ /g, '.'), 'i');\n\n      // Hide/unhide challenges that match the regex\n      $('.challenge-title').each((index, title) => {\n        if (regex.test($(title).attr('name'))) {\n          expandBlock($(title).closest('.chapterBlock'));\n          expandBlock($(title).closest('.certBlock'));\n          $(title).removeClass('hidden');\n        } else {\n          $(title).addClass('hidden');\n        }\n      });\n\n      // Hide/unhide blocks with no matches\n      $.each($('.chapterBlock'), function(i, div) {\n        if ($(div).find('.hidden').length ===\n          $(div).find('p').length) {\n          $(div).addClass('hidden');\n          $(div).prev('h3').addClass('hidden');\n        } else {\n          $(div).removeClass('hidden');\n          $(div).prev('h3').removeClass('hidden');\n        }\n      });\n\n      // Hide/unhide superblocks with no matches\n      $.each($('.certBlock'), function(i, div) {\n        if ($(div).children('#nested').children('h3.hidden').length ===\n          $(div).children('#nested').children('h3').length) {\n          $(div).prev('h2').addClass('hidden');\n        } else {\n          $(div).prev('h2').removeClass('hidden');\n        }\n      });\n\n      // Display \"Clear Filter\" element\n      if (mapFilter.next().children().hasClass('fa-search')) {\n        mapFilter.next()\n          .children()\n          .removeClass('fa-search')\n          .addClass('fa-times');\n        mapFilter.next().addClass('filled');\n        // Scroll to the top of the page\n        $('html, body, .map-accordion').scrollTop(0);\n      }\n    } else {\n      clearMapFilter();\n    }\n\n    // Display not found if everything is hidden\n    if ($.find('.certBlock').length ===\n        $('.map-accordion').children('.hidden').length) {\n      $('#noneFound').show();\n    } else {\n      $('#noneFound').hide();\n    }\n  });\n\n  // Give focus to the search box by default\n  mapFilter.focus();\n\n  // Clicking the search button or x clears the map\n  $('.map-buttons .input-group-addon').on('click', clearMapFilter);\n\n  function clearMapFilter() {\n    mapFilter.val('');\n    mapFilter.next().children().removeClass('fa-times').addClass('fa-search');\n    mapFilter.next().removeClass('filled');\n    $('.map-accordion').find('.hidden').removeClass('hidden');\n    $('#noneFound').hide();\n  }\n\n  // Clear the search on escape key\n  mapFilter.on('keydown', (e) => {\n    if (e.keyCode === 27) {\n      e.preventDefault();\n      clearMapFilter();\n    }\n  });\n\n  window.Mousetrap.bind('esc', clearMapFilter);\n\n  // keyboard shortcuts: open map\n  window.Mousetrap.bind('g m', toggleMap);\n});\n"
  },
  {
    "path": "client/plugin.js",
    "content": "/* eslint-disable no-eval */\n/* global importScripts, application */\n// executes the given code and handles the result\n\nfunction importScript(url, error) {\n  try {\n    importScripts(url);\n  } catch (e) {\n    error = e;\n  }\n  return error;\n}\n\nfunction run(code, cb) {\n  var err = null;\n  var result = {};\n\n  try {\n    var codeExec = runHidden(code);\n    result.type = typeof codeExec;\n    result.output = stringify(codeExec);\n  } catch (e) {\n    err = e.message;\n  }\n\n  if (err) {\n    cb(err, null);\n  } else {\n    cb(null, result);\n  }\n\n  self.close();\n}\n\n\n// protects even the worker scope from being accessed\nfunction runHidden(code) {\n\n  /* eslint-disable no-unused-vars */\n  var indexedDB = null;\n  var location = null;\n  var navigator = null;\n  var onerror = null;\n  var onmessage = null;\n  var performance = null;\n  var self = null;\n  var webkitIndexedDB = null;\n  var postMessage = null;\n  var close = null;\n  var openDatabase = null;\n  var openDatabaseSync = null;\n  var webkitRequestFileSystem = null;\n  var webkitRequestFileSystemSync = null;\n  var webkitResolveLocalFileSystemSyncURL = null;\n  var webkitResolveLocalFileSystemURL = null;\n  var addEventListener = null;\n  var dispatchEvent = null;\n  var removeEventListener = null;\n  var dump = null;\n  var onoffline = null;\n  var ononline = null;\n  /* eslint-enable no-unused-vars */\n\n  var error = null;\n  error = importScript(\n    'https://cdnjs.cloudflare.com/ajax/libs/chai/2.2.0/chai.min.js'\n  );\n\n\n  /* eslint-disable*/\n  var assert = chai.assert;\n  /* eslint-enable */\n\n  if (error) {\n    return error;\n  }\n\n  return eval(code);\n}\n\n\n// converts the output into a string\nfunction stringify(output) {\n  var result;\n\n  if (typeof output === 'undefined') {\n    result = 'undefined';\n  } else if (output === null) {\n    result = 'null';\n  } else {\n    result = JSON.stringify(output) || output.toString();\n  }\n\n  return result;\n}\n\napplication.setInterface({ run: run });\n"
  },
  {
    "path": "client/sagas/README.md",
    "content": ""
  },
  {
    "path": "client/sagas/err-saga.js",
    "content": "//   () =>\n//     (store: Store) =>\n//     (next: (action: Action) => Object) =>\n//     errSaga(action: Action) => Object|Void\nexport default () => ({ dispatch }) => next => {\n  return function errorSaga(action) {\n    const result = next(action);\n    if (!action.error) { return result; }\n\n    console.error(action.error);\n    return dispatch({\n      type: 'app.makeToast',\n      payload: {\n        type: 'error',\n        title: 'Oops, something went wrong',\n        message: 'Something went wrong, please try again later'\n      }\n    });\n  };\n};\n"
  },
  {
    "path": "client/sagas/hard-go-to-saga.js",
    "content": "import { hardGoTo } from '../../common/app/redux/types';\n\nconst loc = typeof window !== 'undefined' ?\n  window.location :\n  {};\n\nexport default () => ({ dispatch }) => next => {\n  return function hardGoToSaga(action) {\n    const result = next(action);\n    if (action.type !== hardGoTo) {\n      return result;\n    }\n\n    if (!loc.pathname) {\n      dispatch({\n        type: 'app.error',\n        error: new Error('no location object found')\n      });\n    }\n\n    loc.pathname = action.payload || '/map';\n    return null;\n  };\n};\n"
  },
  {
    "path": "client/sagas/index.js",
    "content": "import errSaga from './err-saga';\nimport titleSaga from './title-saga';\nimport localStorageSaga from './local-storage-saga';\nimport hardGoToSaga from './hard-go-to-saga';\n\nexport default [ errSaga, titleSaga, localStorageSaga, hardGoToSaga ];\n"
  },
  {
    "path": "client/sagas/local-storage-saga.js",
    "content": "import {\n  saveForm,\n  clearForm,\n  loadSavedForm\n} from '../../common/app/routes/Jobs/redux/types';\n\nimport {\n  saveCompleted,\n  loadSavedFormCompleted\n} from '../../common/app/routes/Jobs/redux/actions';\n\nconst formKey = 'newJob';\nlet enabled = false;\nlet store = typeof window !== 'undefined' ?\n  window.localStorage :\n  false;\n\ntry {\n  const testKey = '__testKey__';\n  store.setItem(testKey, testKey);\n  enabled = store.getItem(testKey) === testKey;\n  store.removeItem(testKey);\n} catch (e) {\n  enabled = !e;\n}\n\nif (!enabled) {\n  console.error(new Error('No localStorage found'));\n}\n\nexport default () => ({ dispatch }) => next => {\n  return function localStorageSaga(action) {\n    if (!enabled) { return next(action); }\n\n    if (action.type === saveForm) {\n      const form = action.payload;\n      try {\n        store.setItem(formKey, JSON.stringify(form));\n        next(action);\n        return dispatch(saveCompleted(form));\n      } catch (error) {\n        return dispatch({\n          type: 'app.handleError',\n          error\n        });\n      }\n    }\n\n    if (action.type === clearForm) {\n      store.removeItem(formKey);\n      return null;\n    }\n\n    if (action.type === loadSavedForm) {\n      const formString = store.getItem(formKey);\n      try {\n        const form = JSON.parse(formString);\n        return dispatch(loadSavedFormCompleted(form));\n      } catch (error) {\n        return dispatch({\n          type: 'app.handleError',\n          error\n        });\n      }\n    }\n\n    return next(action);\n  };\n};\n"
  },
  {
    "path": "client/sagas/title-saga.js",
    "content": "//   (doc: Object) =>\n//     () =>\n//     (next: (action: Action) => Object) =>\n//     titleSage(action: Action) => Object|Void\nexport default ({ doc }) => ({ getState }) => next => {\n  return function titleSage(action) {\n    // get next state\n    const result = next(action);\n    if (action.type !== 'app.updateTitle') {\n      return result;\n    }\n    const state = getState();\n    const newTitle = state.app.title;\n    doc.title = newTitle;\n    return result;\n  };\n};\n"
  },
  {
    "path": "common/app/App.jsx",
    "content": "import React, { PropTypes } from 'react';\nimport { Row } from 'react-bootstrap';\nimport { ToastMessage, ToastContainer } from 'react-toastr';\nimport { compose } from 'redux';\nimport { connect } from 'react-redux';\nimport { createSelector } from 'reselect';\n\nimport { fetchUser } from './redux/actions';\nimport contain from './utils/professor-x';\n\nimport Nav from './components/Nav';\n\nconst toastMessageFactory = React.createFactory(ToastMessage.animation);\n\nconst mapStateToProps = createSelector(\n  state => state.app,\n  ({\n    username,\n    points,\n    picture,\n    toast\n  }) => ({\n    username,\n    points,\n    picture,\n    toast\n  })\n);\n\nconst fetchContainerOptions = {\n  fetchAction: 'fetchUser',\n  isPrimed({ username }) {\n    return !!username;\n  }\n};\n\n// export plain class for testing\nexport class FreeCodeCamp extends React.Component {\n  static displayName = 'FreeCodeCamp';\n\n  static propTypes = {\n    children: PropTypes.node,\n    username: PropTypes.string,\n    points: PropTypes.number,\n    picture: PropTypes.string,\n    toast: PropTypes.object\n  };\n\n  componentWillReceiveProps({ toast: nextToast = {} }) {\n    const { toast = {} } = this.props;\n    if (toast.id !== nextToast.id) {\n      this.refs.toaster[nextToast.type || 'success'](\n        nextToast.message,\n        nextToast.title,\n        {\n          closeButton: true,\n          timeOut: 10000\n        }\n      );\n    }\n  }\n\n  render() {\n    const { username, points, picture } = this.props;\n    const navProps = { username, points, picture };\n\n    return (\n      <div>\n        <Nav { ...navProps }/>\n        <Row>\n          { this.props.children }\n        </Row>\n        <ToastContainer\n          className='toast-bottom-right'\n          ref='toaster'\n          toastMessageFactory={ toastMessageFactory } />\n      </div>\n    );\n  }\n}\n\nconst wrapComponent = compose(\n  // connect Component to Redux Store\n  connect(mapStateToProps, { fetchUser }),\n  // handles prefetching data\n  contain(fetchContainerOptions)\n);\n\nexport default wrapComponent(FreeCodeCamp);\n"
  },
  {
    "path": "common/app/components/Flash/Queue.jsx",
    "content": "import React, { PropTypes } from 'react';\nimport { Alert } from 'react-bootstrap';\n\nexport default React.createClass({\n  displayName: 'FlashQueue',\n\n  propTypes: {\n    messages: PropTypes.array\n  },\n\n  renderMessages(messages) {\n    return messages.map(() => {\n      return (\n        <Alert />\n      );\n    });\n  },\n\n  render() {\n    const { messages = [] } = this.props;\n    return (\n      <div>\n        { this.renderMessages(messages) }\n      </div>\n    );\n  }\n});\n"
  },
  {
    "path": "common/app/components/Flash/index.jsx",
    "content": ""
  },
  {
    "path": "common/app/components/Footer/Footer.jsx",
    "content": "import React from 'react';\nimport { Col, Row, Grid } from 'react-bootstrap';\n\nimport links from './links.json';\n\nexport default class extends React.Component {\n  static displayName = 'Footer';\n  renderLinks(mobile) {\n    return links.map(link => {\n      return (\n        <a\n          className={ link.className}\n          href={ link.href }\n          key={ link.content }\n          target={ link.target }>\n          { this.renderContent(mobile, link.content) }\n        </a>\n      );\n    });\n  }\n\n  renderContent(mobile, content) {\n    if (mobile) {\n      return (\n        <span className='sr-only'>\n          content;\n        </span>\n      );\n    }\n    return content;\n  }\n\n  render() {\n    return (\n      <Grid className='fcc-footer'>\n        <Row>\n          <Col\n            className='hidden-xs hidden-sm'\n            xs={ 12 }>\n            { this.renderLinks() }\n          </Col>\n          <Col\n            className='visible-xs visible-sm'\n            xs={ 12 }>\n            { this.renderLinks(true) }\n          </Col>\n        </Row>\n      </Grid>\n    );\n  }\n}\n"
  },
  {
    "path": "common/app/components/Footer/README.md",
    "content": "Currently not used\n"
  },
  {
    "path": "common/app/components/Footer/index.js",
    "content": "export default from './Footer.jsx';\n"
  },
  {
    "path": "common/app/components/Footer/links.json",
    "content": "[\n  {\n    \"className\": \"ion-speakerphone\",\n    \"content\": \" Blog  \",\n    \"href\": \"http://medium.freecodecamp.com\",\n    \"target\": \"_blank\"\n  },\n  {\n    \"className\": \"ion-social-twitch-outline\",\n    \"content\": \" Twitch  \",\n    \"href\": \"http://www.twitch.tv/freecodecamp\",\n    \"target\": \"_blank\"\n  },\n  {\n    \"className\": \"ion-social-github\",\n    \"content\": \" Github  \",\n    \"href\": \"http://github.com/freecodecamp\",\n    \"target\": \"_blank\"\n  },\n  {\n    \"className\": \"ion-social-twitter\",\n    \"content\": \" Twitter  \",\n    \"href\": \"http://twitter.com/freecodecamp\",\n    \"target\": \"_blank\"\n  },\n  {\n    \"className\": \"ion-social-facebook\",\n    \"content\": \" Facebook  \",\n    \"href\": \"http://facebook.com/freecodecamp\",\n    \"target\": \"_blank\"\n  },\n  {\n    \"className\": \"ion-information-circled\",\n    \"content\": \" About  \",\n    \"href\": \"/learn-to-code\",\n    \"target\": \"_self\"\n  },\n  {\n    \"className\": \"ion-locked\",\n    \"content\": \" Privacy  \",\n    \"href\": \"/privacy'\",\n    \"target\": \"_self\"\n  }\n]\n"
  },
  {
    "path": "common/app/components/Nav/Nav.jsx",
    "content": "import React, { PropTypes } from 'react';\nimport { LinkContainer } from 'react-router-bootstrap';\nimport {\n  Col,\n  Nav,\n  NavbarBrand,\n  Navbar,\n  NavItem\n} from 'react-bootstrap';\n\nimport navLinks from './links.json';\nimport FCCNavItem from './NavItem.jsx';\n\nconst fCClogo = '/images/freecodecamp_logo.svg';\n\nconst logoElement = (\n  <a href='/'>\n    <img\n      alt='learn to code javascript at Free Code Camp logo'\n      className='img-responsive nav-logo'\n      src={ fCClogo } />\n  </a>\n);\n\nconst toggleButtonChild = (\n  <Col xs={ 12 }>\n    <span className='hamburger-text'>Menu</span>\n  </Col>\n);\n\nexport default class extends React.Component {\n  static displayName = 'Nav';\n\n  static propTypes = {\n    points: PropTypes.number,\n    picture: PropTypes.string,\n    signedIn: PropTypes.bool,\n    username: PropTypes.string\n  };\n\n  renderLinks() {\n    return navLinks.map(({ content, link, react, target }, index) => {\n      if (react) {\n        return (\n          <LinkContainer\n            eventKey={ index + 1 }\n            key={ content }\n            to={ link }>\n            <NavItem\n              target={ target || null }>\n              { content }\n            </NavItem>\n          </LinkContainer>\n        );\n      }\n      return (\n        <NavItem\n          eventKey={ index + 1 }\n          href={ link }\n          key={ content }\n          target={ target || null }>\n          { content }\n        </NavItem>\n      );\n    });\n  }\n\n  renderPoints(username, points) {\n    if (!username) {\n      return null;\n    }\n    return (\n      <FCCNavItem\n        className='brownie-points-nav'\n        href={ '/' + username }>\n        [ { points } ]\n      </FCCNavItem>\n    );\n  }\n\n  renderSignin(username, picture) {\n    if (username) {\n      return (\n        <li\n          className='hidden-xs hidden-sm avatar'\n          eventKey={ 2 }>\n          <a href={ '/' + username }>\n            <img\n              className='profile-picture float-right'\n              src={ picture } />\n          </a>\n        </li>\n      );\n    } else {\n      return (\n        <NavItem\n          eventKey={ 2 }\n          href='/login'>\n          Sign In\n        </NavItem>\n      );\n    }\n  }\n\n  render() {\n    const { username, points, picture } = this.props;\n\n    return (\n      <Navbar\n        className='nav-height'\n        fixedTop={ true }>\n        <NavbarBrand>{ logoElement }</NavbarBrand>\n        <Navbar.Toggle children={ toggleButtonChild } />\n        <Navbar.Collapse eventKey={ 0 }>\n          <Nav\n            className='hamburger-dropdown'\n            navbar={ true }\n            pullRight={ true }>\n            { this.renderLinks() }\n            { this.renderPoints(username, points) }\n            { this.renderSignin(username, picture) }\n          </Nav>\n        </Navbar.Collapse>\n      </Navbar>\n    );\n  }\n}\n"
  },
  {
    "path": "common/app/components/Nav/NavItem.jsx",
    "content": "import React from 'react';\nimport classNames from 'classnames';\n\nexport default React.createClass({\n  displayName: 'FCCNavItem',\n\n  propTypes: {\n    active: React.PropTypes.bool,\n    'aria-controls': React.PropTypes.string,\n    children: React.PropTypes.node,\n    className: React.PropTypes.string,\n    disabled: React.PropTypes.bool,\n    eventKey: React.PropTypes.any,\n    href: React.PropTypes.string,\n    linkId: React.PropTypes.string,\n    onSelect: React.PropTypes.func,\n    role: React.PropTypes.string,\n    target: React.PropTypes.string,\n    title: React.PropTypes.node\n  },\n\n  getDefaultProps() {\n    return {\n      href: '#'\n    };\n  },\n\n  handleClick(e) {\n    if (this.props.onSelect) {\n      e.preventDefault();\n\n      if (!this.props.disabled) {\n        this.props.onSelect(\n          this.props.eventKey,\n          this.props.href,\n          this.props.target\n        );\n      }\n    }\n  },\n\n  render() {\n    let {\n      role,\n      linkId,\n      disabled,\n      active,\n      href,\n      title,\n      target,\n      children,\n      'aria-controls': ariaControls,  // eslint-disable-line react/prop-types\n      className,\n      ...props\n    } = this.props;\n\n    const linkClassName = classNames(className, {\n      // 'active': active, we don't actually use the active class\n      // but it is used for a11y below\n      'disabled': disabled\n    });\n\n    let linkProps = {\n      role,\n      href,\n      title,\n      target,\n      id: linkId,\n      onClick: this.handleClick,\n      ref: 'anchor'\n    };\n\n    if (!role && href === '#') {\n      linkProps.role = 'button';\n    }\n\n    return (\n      <li\n        {...props}\n        role='presentation'>\n        <a\n          { ...linkProps }\n          aria-controls={ ariaControls }\n          aria-selected={ active }\n          className={ linkClassName }>\n          { children }\n        </a>\n      </li>\n    );\n  }\n});\n"
  },
  {
    "path": "common/app/components/Nav/index.js",
    "content": "export default from './Nav.jsx';\n"
  },
  {
    "path": "common/app/components/Nav/links.json",
    "content": "[{\n  \"content\": \"Map\",\n  \"link\": \"/map\"\n}, {\n  \"content\": \"Chat\",\n  \"link\": \"//gitter.im/FreeCodeCamp/chinese\",\n  \"target\": \"_blank\"\n},{\n  \"content\": \"Wiki\",\n  \"link\": \"/wiki\",\n  \"target\": \"_blank\"\n},{\n  \"content\": \"About\",\n  \"link\": \"/about\"\n},{\n  \"content\": \"Shop\",\n  \"link\": \"/shop\",\n  \"target\": \"_blank\"\n}]\n"
  },
  {
    "path": "common/app/components/NotFound/index.jsx",
    "content": "import React, { PropTypes } from 'react';\n\nconst win = typeof window !== 'undefined' ? window : {};\n\nfunction goToServer(path) {\n  win.location = '/' + path;\n}\n\nexport default class extends React.Component {\n  static displayName = 'NotFound';\n\n  static propTypes = {\n    params: PropTypes.object\n  };\n\n  componentWillMount() {\n    goToServer(this.props.params.splat);\n  }\n\n  componentDidMount() {\n  }\n\n  render() {\n    return <span></span>;\n  }\n}\n"
  },
  {
    "path": "common/app/components/README.md",
    "content": "things like NavBar and Footer go here\n"
  },
  {
    "path": "common/app/create-app.jsx",
    "content": "import { Observable } from 'rx';\nimport { match } from 'react-router';\nimport { compose, createStore, applyMiddleware } from 'redux';\n\n// main app\nimport App from './App.jsx';\n// app routes\nimport childRoutes from './routes';\n\n// redux\nimport createReducer from './create-reducer';\nimport middlewares from './middlewares';\nimport sagas from './sagas';\n\n// general utils\nimport servicesCreator from '../utils/services-creator';\n\nconst createRouteProps = Observable.fromNodeCallback(match);\n\nconst routes = { components: App, ...childRoutes };\n\n//\n// createApp(settings: {\n//   location?: Location|String,\n//   history?: History,\n//   initialState?: Object|Void,\n//   serviceOptions?: Object,\n//   middlewares?: Function[],\n//   sideReducers?: Object\n//   enhancers?: Function[],\n//   sagas?: Function[],\n// }) => Observable\n//\n// Either location or history must be defined\nexport default function createApp({\n  location,\n  history,\n  initialState,\n  serviceOptions = {},\n  middlewares: sideMiddlewares = [],\n  enhancers: sideEnhancers = [],\n  reducers: sideReducers = {},\n  sagas: sideSagas = []\n}) {\n  const sagaOptions = {\n    services: servicesCreator(null, serviceOptions)\n  };\n\n  const enhancers = [\n    applyMiddleware(\n      ...middlewares,\n      ...sideMiddlewares,\n      ...[ ...sagas, ...sideSagas].map(saga => saga(sagaOptions)),\n    ),\n    // enhancers must come after middlewares\n    // on client side these are things like Redux DevTools\n    ...sideEnhancers\n  ];\n  const reducer = createReducer(sideReducers);\n\n  // create composed store enhancer\n  // use store enhancer function to enhance `createStore` function\n  // call enhanced createStore function with reducer and initialState\n  // to create store\n  const store = compose(...enhancers)(createStore)(reducer, initialState);\n\n  // createRouteProps({\n  //   redirect: LocationDescriptor,\n  //   history: History,\n  //   routes: Object\n  // }) => Observable\n  return createRouteProps({ routes, location, history })\n    .map(([ redirect, props ]) => ({\n      redirect,\n      props,\n      reducer,\n      store\n    }));\n}\n"
  },
  {
    "path": "common/app/create-reducer.js",
    "content": "import { combineReducers } from 'redux';\nimport { reducer as formReducer } from 'redux-form';\n\nimport { reducer as app } from './redux';\nimport { reducer as hikesApp } from './routes/Hikes/redux';\nimport {\n  reducer as jobsApp,\n  formNormalizer as jobsNormalizer\n} from './routes/Jobs/redux';\n\nexport default function createReducer(sideReducers = {}) {\n  return combineReducers({\n    ...sideReducers,\n    app,\n    hikesApp,\n    jobsApp,\n    form: formReducer.normalize(jobsNormalizer)\n  });\n}\n"
  },
  {
    "path": "common/app/index.js",
    "content": "export default from './create-app.jsx';\n"
  },
  {
    "path": "common/app/middlewares.js",
    "content": ""
  },
  {
    "path": "common/app/provide-store.js",
    "content": "/* eslint-disable react/display-name */\nimport React from 'react';\nimport { Provider } from 'react-redux';\n\nexport default function provideStore(element, store) {\n  return React.createElement(\n    Provider,\n    { store },\n    element\n  );\n}\n"
  },
  {
    "path": "common/app/redux/actions.js",
    "content": "import { createAction } from 'redux-actions';\nimport types from './types';\n\n// updateTitle(title: String) => Action\nexport const updateTitle = createAction(types.updateTitle);\n\nlet id = 0;\n// makeToast({ type?: String, message: String, title: String }) => Action\nexport const makeToast = createAction(\n  types.makeToast,\n  toast => {\n    id += 1;\n    return {\n      ...toast,\n      id,\n      type: toast.type || 'info'\n    };\n  }\n);\n\n// fetchUser() => Action\n// used in combination with fetch-user-saga\nexport const fetchUser = createAction(types.fetchUser);\n\n// setUser(userInfo: Object) => Action\nexport const setUser = createAction(types.setUser);\n\n// updatePoints(points: Number) => Action\nexport const updatePoints = createAction(types.updatePoints);\n\n// hardGoTo(path: String) => Action\nexport const hardGoTo = createAction(types.hardGoTo);\n"
  },
  {
    "path": "common/app/redux/fetch-user-saga.js",
    "content": "import { Observable } from 'rx';\nimport { handleError, setUser, fetchUser } from './types';\n\nexport default ({ services }) => ({ dispatch }) => next => {\n  return function getUserSaga(action) {\n    if (action.type !== fetchUser) {\n      return next(action);\n    }\n\n    return services.readService$({ service: 'user' })\n      .map(({\n        username,\n        picture,\n        progressTimestamps = [],\n        isFrontEndCert,\n        isBackEndCert,\n        isFullStackCert\n      }) => {\n        return {\n          type: setUser,\n          payload: {\n            username,\n            picture,\n            points: progressTimestamps.length,\n            isFrontEndCert,\n            isBackEndCert,\n            isFullStackCert,\n            isSignedIn: true\n          }\n        };\n      })\n      .catch(error => Observable.just({\n        type: handleError,\n        error\n      }))\n      .doOnNext(dispatch);\n  };\n};\n\n"
  },
  {
    "path": "common/app/redux/index.js",
    "content": "export { default as reducer } from './reducer';\nexport { default as actions } from './actions';\nexport { default as types } from './types';\n\nimport fetchUserSaga from './fetch-user-saga';\nexport const sagas = [ fetchUserSaga ];\n"
  },
  {
    "path": "common/app/redux/oldActions.js",
    "content": "import { Actions } from 'thundercats';\nimport { Observable } from 'rx';\n\n\nexport default Actions({\n  shouldBindMethods: true,\n  refs: { displayName: 'AppActions' },\n\n  setTitle(title = 'Learn To Code') {\n    return { title: title + ' | Free Code Camp' };\n  },\n\n  getUser() {\n    return this.readService$('user', null, null)\n      .map(({\n        username,\n        picture,\n        progressTimestamps = [],\n        isFrontEndCert,\n        isBackEndCert,\n        isFullStackCert\n      }) => {\n        return {\n          username,\n          picture,\n          points: progressTimestamps.length,\n          isFrontEndCert,\n          isBackEndCert,\n          isFullStackCert\n        };\n      })\n      .catch(err => Observable.just({ err }));\n  },\n\n  // routing\n  // goTo(path: String) => path\n  goTo: null,\n\n  // goBack(arg?) => arg?\n  goBack: null,\n\n  // toast(args: { type?: String, message: String, title: String }) => args\n  toast(args) {\n    return {\n      transform(state) {\n        return {\n          ...state,\n          toast: {\n            ...args,\n            id: state.toast && state.toast.id ? state.toast.id : 1\n          }\n        };\n      }\n    };\n  },\n\n  // updateLocation(location: { pathname: String }) => location\n  updateLocation(location) {\n    return {\n      transform(state) {\n        return { ...state, location };\n      }\n    };\n  }\n});\n"
  },
  {
    "path": "common/app/redux/reducer.js",
    "content": "import { handleActions } from 'redux-actions';\nimport types from './types';\n\nexport default handleActions(\n  {\n    [types.updateTitle]: (state, { payload = 'Learn To Code' }) => ({\n      ...state,\n      title: payload + ' | Free Code Camp'\n    }),\n\n    [types.makeToast]: (state, { payload: toast }) => ({\n      ...state,\n      toast\n    }),\n\n    [types.setUser]: (state, { payload: user }) => ({ ...state, ...user }),\n\n    [types.challengeSaved]: (state, { payload: { points = 0 } }) => ({\n      ...state,\n      points\n    }),\n\n    [types.updatePoints]: (state, { payload: points }) => ({\n      ...state,\n      points\n    })\n  },\n  {\n    title: 'Learn To Code | Free Code Camp',\n    username: null,\n    picture: null,\n    points: 0,\n    isSignedIn: false\n  }\n);\n"
  },
  {
    "path": "common/app/redux/types.js",
    "content": "import createTypes from '../utils/create-types';\n\nexport default createTypes([\n  'updateTitle',\n\n  'fetchUser',\n  'setUser',\n\n  'makeToast',\n  'updatePoints',\n  'handleError',\n  // used to hit the server\n  'hardGoTo'\n], 'app');\n"
  },
  {
    "path": "common/app/routes/Admin/README.md",
    "content": "in case we ever want an admin panel\n"
  },
  {
    "path": "common/app/routes/Bonfires/README.md",
    "content": "This folder contains things relative to the bonfires' screens\n"
  },
  {
    "path": "common/app/routes/Hikes/components/Hike.jsx",
    "content": "import React, { PropTypes } from 'react';\nimport { connect } from 'react-redux';\nimport { Col, Row } from 'react-bootstrap';\nimport { createSelector } from 'reselect';\n\nimport Lecture from './Lecture.jsx';\nimport Questions from './Questions.jsx';\nimport { resetHike } from '../redux/actions';\nimport { getCurrentHike } from '../redux/selectors';\n\nconst mapStateToProps = createSelector(\n  getCurrentHike,\n  state => state.hikesApp.shouldShowQuestions,\n  (currentHike, shouldShowQuestions) => ({\n    title: currentHike ? currentHike.title : '',\n    shouldShowQuestions\n  })\n);\n\n// export plain component for testing\nexport class Hike extends React.Component {\n  static displayName = 'Hike';\n\n  static propTypes = {\n    // actions\n    resetHike: PropTypes.func,\n    // ui\n    title: PropTypes.string,\n    params: PropTypes.object,\n    shouldShowQuestions: PropTypes.bool\n  };\n\n  componentWillUnmount() {\n    this.props.resetHike();\n  }\n\n  componentWillReceiveProps({ params: { dashedName } }) {\n    if (this.props.params.dashedName !== dashedName) {\n      this.props.resetHike();\n    }\n  }\n\n  renderBody(showQuestions) {\n    if (showQuestions) {\n      return <Questions />;\n    }\n    return <Lecture />;\n  }\n\n  render() {\n    const {\n      title,\n      shouldShowQuestions\n    } = this.props;\n\n    return (\n      <Col xs={ 12 }>\n        <Row>\n          <header className='text-center'>\n            <h4>{ title }</h4>\n          </header>\n          <hr />\n          <div className='spacer' />\n          <section\n            className={ 'text-center' }\n            title={ title }>\n            { this.renderBody(shouldShowQuestions) }\n          </section>\n        </Row>\n      </Col>\n    );\n  }\n}\n\n// export redux aware component\nexport default connect(mapStateToProps, { resetHike })(Hike);\n"
  },
  {
    "path": "common/app/routes/Hikes/components/Hikes.jsx",
    "content": "import React, { PropTypes } from 'react';\nimport { compose } from 'redux';\nimport { connect } from 'react-redux';\nimport { Row } from 'react-bootstrap';\nimport PureComponent from 'react-pure-render/component';\nimport { createSelector } from 'reselect';\n// import debug from 'debug';\n\nimport HikesMap from './Map.jsx';\nimport { updateTitle } from '../../../redux/actions';\nimport { fetchHikes } from '../redux/actions';\n\nimport contain from '../../../utils/professor-x';\n\n// const log = debug('fcc:hikes');\n\nconst mapStateToProps = createSelector(\n  state => state.hikesApp.hikes.entities,\n  state => state.hikesApp.hikes.results,\n  (hikesMap, hikesByDashedName)=> {\n    if (!hikesMap || !hikesByDashedName) {\n      return { hikes: [] };\n    }\n    return {\n      hikes: hikesByDashedName.map(dashedName => hikesMap[dashedName])\n    };\n  }\n);\n\nconst fetchOptions = {\n  fetchAction: 'fetchHikes',\n  isPrimed: ({ hikes }) => hikes && !!hikes.length,\n  getActionArgs: ({ params: { dashedName } }) => [ dashedName ],\n  shouldContainerFetch(props, nextProps) {\n    return props.params.dashedName !== nextProps.params.dashedName;\n  }\n};\n\nexport class Hikes extends PureComponent {\n  static displayName = 'Hikes';\n\n  static propTypes = {\n    children: PropTypes.element,\n    hikes: PropTypes.array,\n    params: PropTypes.object,\n    updateTitle: PropTypes.func\n  };\n\n  componentWillMount() {\n    const { updateTitle } = this.props;\n    updateTitle('Hikes');\n  }\n\n  renderMap(hikes) {\n    return (\n      <HikesMap hikes={ hikes }/>\n    );\n  }\n\n  render() {\n    const { hikes } = this.props;\n    const preventOverflow = { overflow: 'hidden' };\n    return (\n      <div>\n        <Row style={ preventOverflow }>\n          {\n            // render sub-route\n            this.props.children ||\n            // if no sub-route render hikes map\n            this.renderMap(hikes)\n          }\n        </Row>\n      </div>\n    );\n  }\n}\n\n// export redux and fetch aware component\nexport default compose(\n  connect(mapStateToProps, { fetchHikes, updateTitle }),\n  contain(fetchOptions)\n)(Hikes);\n"
  },
  {
    "path": "common/app/routes/Hikes/components/Lecture.jsx",
    "content": "import React, { PropTypes } from 'react';\nimport { connect } from 'react-redux';\nimport { Button, Col, Row } from 'react-bootstrap';\nimport Vimeo from 'react-vimeo';\nimport { createSelector } from 'reselect';\nimport debug from 'debug';\n\nimport { hardGoTo } from '../../../redux/actions';\nimport { toggleQuestionView } from '../redux/actions';\nimport { getCurrentHike } from '../redux/selectors';\n\nconst log = debug('fcc:hikes');\n\nconst mapStateToProps = createSelector(\n  getCurrentHike,\n  (currentHike) => {\n    const {\n      dashedName,\n      description,\n      challengeSeed: [id] = [0]\n    } = currentHike;\n    return {\n      id,\n      dashedName,\n      description\n    };\n  }\n);\n\nexport class Lecture extends React.Component {\n  static displayName = 'Lecture';\n\n  static propTypes = {\n    // actions\n    toggleQuestionView: PropTypes.func,\n    // ui\n    id: PropTypes.number,\n    description: PropTypes.array,\n    dashedName: PropTypes.string,\n    hardGoTo: PropTypes.func\n  };\n\n  componentWillMount() {\n    if (!this.props.id) {\n      this.props.hardGoTo('/map');\n    }\n  }\n\n  shouldComponentUpdate(nextProps) {\n    const { props } = this;\n    return nextProps.id !== props.id;\n  }\n\n  handleError: log;\n\n  renderTranscript(transcript, dashedName) {\n    return transcript.map((line, index) => (\n      <p\n        className='lead text-left'\n        dangerouslySetInnerHTML={{__html: line}}\n        key={ dashedName + index } />\n    ));\n  }\n\n  render() {\n    const {\n      id = '1',\n      description = [],\n      toggleQuestionView\n    } = this.props;\n\n    const dashedName = 'foo';\n\n    return (\n      <Col xs={ 12 }>\n        <Row>\n          <Vimeo\n            onError={ this.handleError }\n            onFinish= { toggleQuestionView }\n            videoId={ '' + id } />\n        </Row>\n        <Row>\n          <article>\n            { this.renderTranscript(description, dashedName) }\n          </article>\n          <Button\n            block={ true }\n            bsSize='large'\n            bsStyle='primary'\n            onClick={ toggleQuestionView }>\n            Take me to the Questions\n          </Button>\n        </Row>\n      </Col>\n    );\n  }\n}\n\nexport default connect(\n  mapStateToProps,\n  { hardGoTo, toggleQuestionView }\n)(Lecture);\n"
  },
  {
    "path": "common/app/routes/Hikes/components/Map.jsx",
    "content": "import React, { PropTypes } from 'react';\nimport { Link } from 'react-router';\nimport { ListGroup, ListGroupItem } from 'react-bootstrap';\n\nexport default React.createClass({\n  displayName: 'HikesMap',\n\n  propTypes: {\n    hikes: PropTypes.array\n  },\n\n  render() {\n    const {\n      hikes = [{}]\n    } = this.props;\n\n    const vidElements = hikes.map(({ title, dashedName }) => {\n      return (\n        <ListGroupItem key={ dashedName }>\n          <Link to={ `/videos/${dashedName}` }>\n            <h3>{ title }</h3>\n          </Link>\n        </ListGroupItem>\n      );\n    });\n\n    return (\n      <div>\n        <div className='text-center'>\n          <h2>Welcome To Hikes!</h2>\n        </div>\n        <hr />\n        <ListGroup>\n          { vidElements }\n        </ListGroup>\n      </div>\n    );\n  }\n});\n"
  },
  {
    "path": "common/app/routes/Hikes/components/Questions.jsx",
    "content": "import React, { PropTypes } from 'react';\nimport { spring, Motion } from 'react-motion';\nimport { connect } from 'react-redux';\nimport { Button, Col, Row } from 'react-bootstrap';\nimport { CompositeDisposable } from 'rx';\nimport { createSelector } from 'reselect';\n\nimport {\n  answerQuestion,\n  moveQuestion,\n  releaseQuestion,\n  grabQuestion\n} from '../redux/actions';\nimport { getCurrentHike } from '../redux/selectors';\n\nconst answerThreshold = 100;\nconst springProperties = { stiffness: 120, damping: 10 };\nconst actionsToBind = {\n  answerQuestion,\n  moveQuestion,\n  releaseQuestion,\n  grabQuestion\n};\n\nconst mapStateToProps = createSelector(\n  getCurrentHike,\n  state => state.hikesApp,\n  state => state.app.isSignedIn,\n  (currentHike, ui, isSignedIn) => {\n    const {\n      currentQuestion = 1,\n      mouse = [ 0, 0 ],\n      delta = [ 0, 0 ],\n      isCorrect = false,\n      isPressed = false,\n      shouldShakeQuestion = false\n    } = ui;\n\n    const {\n      tests = []\n    } = currentHike;\n\n    return {\n      tests,\n      currentQuestion,\n      isCorrect,\n      mouse,\n      delta,\n      isPressed,\n      shouldShakeQuestion,\n      isSignedIn\n    };\n  }\n);\n\nclass Question extends React.Component {\n  constructor(...args) {\n    super(...args);\n    this._subscriptions = new CompositeDisposable();\n  }\n\n  static displayName = 'Questions';\n\n  static propTypes = {\n    // actions\n    answerQuestion: PropTypes.func,\n    releaseQuestion: PropTypes.func,\n    moveQuestion: PropTypes.func,\n    grabQuestion: PropTypes.func,\n    // ui state\n    tests: PropTypes.array,\n    mouse: PropTypes.array,\n    delta: PropTypes.array,\n    isCorrect: PropTypes.bool,\n    isPressed: PropTypes.bool,\n    isSignedIn: PropTypes.bool,\n    currentQuestion: PropTypes.number,\n    shouldShakeQuestion: PropTypes.bool\n  };\n\n  componentWillUnmount() {\n    this._subscriptions.dispose();\n  }\n\n  handleMouseUp(e, answer, info) {\n    e.stopPropagation();\n    if (!this.props.isPressed) {\n      return null;\n    }\n\n    const {\n      releaseQuestion,\n      answerQuestion\n    } = this.props;\n\n    releaseQuestion();\n    const subscription = answerQuestion({\n      e,\n      answer,\n      info,\n      threshold: answerThreshold\n    })\n      .subscribe();\n\n    this._subscriptions.add(subscription);\n    return null;\n  }\n\n  handleMouseMove(isPressed, { delta, moveQuestion }) {\n    if (!isPressed) {\n      return null;\n    }\n    return e => moveQuestion({ e, delta });\n  }\n\n  onAnswer(answer, userAnswer, info) {\n    const { isSignedIn, answerQuestion } = this.props;\n    const subscriptions = this._subscriptions;\n    return e => {\n      if (e && e.preventDefault) {\n        e.preventDefault();\n      }\n\n      const subscription = answerQuestion({\n        answer,\n        userAnswer,\n        info,\n        isSignedIn\n      })\n        .subscribe();\n\n      subscriptions.add(subscription);\n    };\n  }\n\n  renderQuestion(number, question, answer, shouldShakeQuestion, info) {\n    const { grabQuestion, isPressed } = this.props;\n    const mouseUp = e => this.handleMouseUp(e, answer, info);\n    return ({ x }) => {\n      const style = {\n        WebkitTransform: `translate3d(${ x }px, 0, 0)`,\n        transform: `translate3d(${ x }px, 0, 0)`\n      };\n      return (\n        <article\n          className={ shouldShakeQuestion ? 'animated swing shake' : '' }\n          onMouseDown={ grabQuestion }\n          onMouseLeave={ mouseUp }\n          onMouseMove={ this.handleMouseMove(isPressed, this.props) }\n          onMouseUp={ mouseUp }\n          onTouchEnd={ mouseUp }\n          onTouchMove={ this.handleMouseMove(isPressed, this.props) }\n          onTouchStart={ grabQuestion }\n          style={ style }>\n          <h4>Question { number }</h4>\n          <p>{ question }</p>\n        </article>\n      );\n    };\n  }\n\n  render() {\n    const {\n      tests = [],\n      mouse: [xPosition],\n      currentQuestion,\n      shouldShakeQuestion\n    } = this.props;\n\n    const [ question, answer, info ] = tests[currentQuestion - 1] || [];\n    const questionElement = this.renderQuestion(\n      currentQuestion,\n      question,\n      answer,\n      shouldShakeQuestion,\n      info\n    );\n\n    return (\n      <Col\n        onMouseUp={ e => this.handleMouseUp(e, answer, info) }\n        xs={ 8 }\n        xsOffset={ 2 }>\n        <Row>\n          <Motion style={{ x: spring(xPosition, springProperties) }}>\n            { questionElement }\n          </Motion>\n          <div className='spacer' />\n          <hr />\n          <div>\n            <Button\n              bsSize='large'\n              bsStyle='primary'\n              className='pull-left'\n              onClick={ this.onAnswer(answer, false, info) }>\n              false\n            </Button>\n            <Button\n              bsSize='large'\n              bsStyle='primary'\n              className='pull-right'\n              onClick={ this.onAnswer(answer, true, info) }>\n              true\n            </Button>\n          </div>\n        </Row>\n      </Col>\n    );\n  }\n}\n\nexport default connect(mapStateToProps, actionsToBind)(Question);\n"
  },
  {
    "path": "common/app/routes/Hikes/index.js",
    "content": "import Hikes from './components/Hikes.jsx';\nimport Hike from './components/Hike.jsx';\n\nexport default {\n  path: 'videos',\n  component: Hikes,\n  childRoutes: [{\n    path: ':dashedName',\n    component: Hike\n  }]\n};\n"
  },
  {
    "path": "common/app/routes/Hikes/redux/actions.js",
    "content": "import { createAction } from 'redux-actions';\n\nimport types from './types';\nimport { getMouse } from './utils';\n\n\n// fetchHikes(dashedName?: String) => Action\n// used with fetchHikesSaga\nexport const fetchHikes = createAction(types.fetchHikes);\n\n// fetchHikesCompleted(hikes: Object) => Action\n// hikes is a normalized response from server\n// called within fetchHikesSaga\nexport const fetchHikesCompleted = createAction(\n  types.fetchHikesCompleted,\n  (hikes, currentHike) => ({ hikes, currentHike })\n);\n\nexport const resetHike = createAction(types.resetHike);\n\nexport const toggleQuestionView = createAction(types.toggleQuestionView);\n\nexport const grabQuestion = createAction(types.grabQuestion, e => {\n  let { pageX, pageY, touches } = e;\n  if (touches) {\n    e.preventDefault();\n    // these re-assigns the values of pageX, pageY from touches\n    ({ pageX, pageY } = touches[0]);\n  }\n  const delta = [pageX, pageY];\n  const mouse = [0, 0];\n\n  return { delta, mouse };\n});\n\nexport const releaseQuestion = createAction(types.releaseQuestion);\nexport const moveQuestion = createAction(\n  types.moveQuestion,\n  ({ e, delta }) => getMouse(e, delta)\n);\n\n// answer({\n//   e: Event,\n//   answer: Boolean,\n//   userAnswer: Boolean,\n//   info: String,\n//   threshold: Number\n// }) => Action\nexport const answerQuestion = createAction(types.answerQuestion);\n\nexport const startShake = createAction(types.startShake);\nexport const endShake = createAction(types.primeNextQuestion);\n\nexport const goToNextQuestion = createAction(types.goToNextQuestion);\n\nexport const hikeCompleted = createAction(types.hikeCompleted);\nexport const goToNextHike = createAction(types.goToNextHike);\n"
  },
  {
    "path": "common/app/routes/Hikes/redux/answer-saga.js",
    "content": "import { Observable } from 'rx';\nimport { push } from 'react-router-redux';\n\nimport types from './types';\nimport { getMouse } from './utils';\n\nimport { makeToast, updatePoints } from '../../../redux/actions';\nimport { hikeCompleted, goToNextHike } from './actions';\nimport { postJSON$ } from '../../../../utils/ajax-stream';\nimport { getCurrentHike } from './selectors';\n\nfunction handleAnswer(getState, dispatch, next, action) {\n  const {\n    e,\n    answer,\n    userAnswer,\n    info,\n    threshold\n  } = action.payload;\n\n  const state = getState();\n  const { id, name, challengeType, tests } = getCurrentHike(state);\n  const {\n    app: { isSignedIn },\n    hikesApp: {\n      currentQuestion,\n      delta = [ 0, 0 ]\n    }\n  } = state;\n\n  let finalAnswer;\n  // drag answer, compute response\n  if (typeof userAnswer === 'undefined') {\n    const [positionX] = getMouse(e, delta);\n\n    // question released under threshold\n    if (Math.abs(positionX) < threshold) {\n      return next(action);\n    }\n\n    if (positionX >= threshold) {\n      finalAnswer = true;\n    }\n\n    if (positionX <= -threshold) {\n      finalAnswer = false;\n    }\n  } else {\n    finalAnswer = userAnswer;\n  }\n\n  // incorrect question\n  if (answer !== finalAnswer) {\n    if (info) {\n      dispatch(makeToast({\n        title: 'Hint',\n        message: info,\n        type: 'info'\n      }));\n    }\n\n    return Observable\n      .just({ type: types.endShake })\n      .delay(500)\n      .startWith({ type: types.startShake })\n      .doOnNext(dispatch);\n  }\n\n  if (tests[currentQuestion]) {\n    return Observable\n      .just({ type: types.goToNextQuestion })\n      .delay(300)\n      .startWith({ type: types.primeNextQuestion })\n      .doOnNext(dispatch);\n  }\n\n  let updateUser$;\n  if (isSignedIn) {\n    const body = { id, name, challengeType: +challengeType };\n    updateUser$ = postJSON$('/completed-challenge', body)\n      // if post fails, will retry once\n      .retry(3)\n      .flatMap(({ alreadyCompleted, points }) => {\n        return Observable.of(\n          makeToast({\n              message:\n                'Challenge saved.' +\n                (alreadyCompleted ? '' : ' First time Completed!'),\n              title: 'Saved',\n              type: 'info'\n          }),\n          updatePoints(points),\n        );\n      })\n      .catch(error => {\n        return Observable.just({\n          type: 'app.error',\n          error\n        });\n      });\n  } else {\n    updateUser$ = Observable.empty();\n  }\n\n  const challengeCompleted$ = Observable.of(\n    goToNextHike(),\n    makeToast({\n      title: 'Congratulations!',\n      message: 'Hike completed.' + (isSignedIn ? ' Saving...' : ''),\n      type: 'success'\n    })\n  );\n\n  return Observable.merge(challengeCompleted$, updateUser$)\n    .delay(300)\n    .startWith(hikeCompleted(finalAnswer))\n    .catch(error => Observable.just({\n      type: 'error',\n      error\n    }))\n    // end with action so we know it is ok to transition\n    .doOnCompleted(() => dispatch({ type: types.transitionHike }))\n    .doOnNext(dispatch);\n}\n\nexport default () => ({ getState, dispatch }) => next => {\n  return function answerSaga(action) {\n    if (action.type === types.answerQuestion) {\n      return handleAnswer(getState, dispatch, next, action);\n    }\n\n    // let goToNextQuestion hit reducers first\n    const result = next(action);\n    if (action.type === types.transitionHike) {\n      const { hikesApp: { currentHike } } = getState();\n      // if no next hike currentHike will equal '' which is falsy\n      if (currentHike) {\n        dispatch(push(`/videos/${currentHike}`));\n      } else {\n        dispatch(push('/map'));\n      }\n    }\n\n    return result;\n  };\n};\n"
  },
  {
    "path": "common/app/routes/Hikes/redux/fetch-hikes-saga.js",
    "content": "import { Observable } from 'rx';\nimport { normalize, Schema, arrayOf } from 'normalizr';\n// import debug from 'debug';\n\nimport types from './types';\nimport { fetchHikesCompleted } from './actions';\nimport { handleError } from '../../../redux/types';\n\nimport { findCurrentHike } from './utils';\n\n// const log = debug('fcc:fetch-hikes-saga');\nconst hike = new Schema('hike', { idAttribute: 'dashedName' });\n\nexport default ({ services }) => ({ dispatch }) => next => {\n  return function fetchHikesSaga(action) {\n    if (action.type !== types.fetchHikes) {\n      return next(action);\n    }\n\n    const dashedName = action.payload;\n    return services.readService$({ service: 'hikes' })\n      .map(hikes => {\n        const { entities, result } = normalize(\n          { hikes },\n          { hikes: arrayOf(hike) }\n        );\n\n        hikes = {\n          entities: entities.hike,\n          results: result.hikes\n        };\n\n        const currentHike = findCurrentHike(hikes, dashedName);\n\n        return fetchHikesCompleted(hikes, currentHike);\n      })\n      .catch(error => {\n        return Observable.just({\n          type: handleError,\n          error\n        });\n      })\n      .doOnNext(dispatch);\n  };\n};\n"
  },
  {
    "path": "common/app/routes/Hikes/redux/index.js",
    "content": "export actions from './actions';\nexport reducer from './reducer';\nexport types from './types';\n\nimport answerSaga from './answer-saga';\nimport fetchHikesSaga from './fetch-hikes-saga';\n\nexport const sagas = [ answerSaga, fetchHikesSaga ];\n"
  },
  {
    "path": "common/app/routes/Hikes/redux/oldActions.js",
    "content": "import _ from 'lodash';\nimport { Observable } from 'rx';\nimport { Actions } from 'thundercats';\nimport debugFactory from 'debug';\n\nconst debug = debugFactory('fcc:hikes:actions');\nconst noOp = { transform: () => {} };\n\nfunction getCurrentHike(hikes = [{}], dashedName, currentHike) {\n  if (!dashedName) {\n    debug('no dashedName');\n    return hikes[0];\n  }\n\n  const filterRegex = new RegExp(dashedName, 'i');\n  if (currentHike && filterRegex.test(currentHike.dashedName)) {\n    return currentHike;\n  }\n\n  debug('setting new hike');\n  return hikes\n    .filter(({ dashedName }) => {\n      return filterRegex.test(dashedName);\n    })\n    .reduce((throwAway, hike) => {\n      return hike;\n    }, currentHike || {});\n}\n\nfunction findNextHike(hikes, id) {\n  if (!id) {\n    debug('find next hike no id provided');\n    return hikes[0];\n  }\n  const currentIndex = _.findIndex(hikes, ({ id: _id }) => _id === id);\n  return hikes[currentIndex + 1] || hikes[0];\n}\n\n\nfunction getMouse(e, [dx, dy]) {\n  let { pageX, pageY, touches, changedTouches } = e;\n\n  // touches can be empty on touchend\n  if (touches || changedTouches) {\n    e.preventDefault();\n    // these re-assigns the values of pageX, pageY from touches\n    ({ pageX, pageY } = touches[0] || changedTouches[0]);\n  }\n\n  return [pageX - dx, pageY - dy];\n}\n\nexport default Actions({\n  refs: { displayName: 'HikesActions' },\n  shouldBindMethods: true,\n  fetchHikes({ isPrimed, dashedName }) {\n    if (isPrimed) {\n      return {\n        transform: (state) => {\n\n          const { hikesApp: oldState } = state;\n          const currentHike = getCurrentHike(\n            oldState.hikes,\n            dashedName,\n            oldState.currentHike\n          );\n\n          const hikesApp = { ...oldState, currentHike };\n          return Object.assign({}, state, { hikesApp });\n        }\n      };\n    }\n\n    return this.readService$('hikes', null, null)\n      .map(hikes => {\n        const currentHike = getCurrentHike(hikes, dashedName);\n        return {\n          transform(state) {\n            const hikesApp = { ...state.hikesApp, currentHike, hikes };\n            return { ...state, hikesApp };\n          }\n        };\n      })\n      .catch(err => Observable.just({\n        transform(state) { return { ...state, err }; }\n      }));\n  },\n\n  toggleQuestions() {\n    return {\n      transform(state) {\n        const hikesApp = {\n          ...state.hikesApp,\n          showQuestions: !state.hikesApp.showQuestions,\n          currentQuestion: 1\n        };\n        return { ...state, hikesApp };\n      }\n    };\n  },\n\n  grabQuestion(e) {\n    let { pageX, pageY, touches } = e;\n    if (touches) {\n      e.preventDefault();\n      // these re-assigns the values of pageX, pageY from touches\n      ({ pageX, pageY } = touches[0]);\n    }\n    const delta = [pageX, pageY];\n    const mouse = [0, 0];\n\n    return {\n      transform(state) {\n        return {\n          ...state,\n          hikesApp: {\n            ...state.hikesApp,\n            isPressed: true,\n            delta,\n            mouse\n          }\n        };\n      }\n    };\n  },\n\n  releaseQuestion() {\n    return {\n      transform(state) {\n        return {\n          ...state,\n          hikesApp: {\n            ...state.hikesApp,\n            isPressed: false,\n            mouse: [0, 0]\n          }\n        };\n      }\n    };\n  },\n\n  moveQuestion({ e, delta }) {\n    const mouse = getMouse(e, delta);\n\n    return {\n      transform(state) {\n        return {\n          ...state,\n          hikesApp: {\n            ...state.hikesApp,\n            mouse\n          }\n        };\n      }\n    };\n  },\n\n  answer({\n    e,\n    answer,\n    userAnswer,\n    hike: { id, name, tests, challengeType },\n    currentQuestion,\n    isSignedIn,\n    delta,\n    info,\n    threshold\n  }) {\n    if (typeof userAnswer === 'undefined') {\n      const [positionX] = getMouse(e, delta);\n\n      // question released under threshold\n      if (Math.abs(positionX) < threshold) {\n        return noOp;\n      }\n\n      if (positionX >= threshold) {\n        userAnswer = true;\n      }\n\n      if (positionX <= -threshold) {\n        userAnswer = false;\n      }\n    }\n\n    // incorrect question\n    if (answer !== userAnswer) {\n      const startShake = {\n        transform(state) {\n          const toast = !info ?\n            state.toast :\n            {\n              id: state.toast && state.toast.id ? state.toast.id + 1 : 1,\n              title: 'Hint',\n              message: info,\n              type: 'info'\n            };\n\n          return {\n            ...state,\n            toast,\n            hikesApp: {\n              ...state.hikesApp,\n              shake: true\n            }\n          };\n        }\n      };\n\n      const removeShake = {\n        transform(state) {\n          return {\n            ...state,\n            hikesApp: {\n              ...state.hikesApp,\n              shake: false\n            }\n          };\n        }\n      };\n\n      return Observable\n        .just(removeShake)\n        .delay(500)\n        .startWith(startShake);\n    }\n\n    // move to next question\n    // index 0\n    if (tests[currentQuestion]) {\n\n      return Observable.just({\n        transform(state) {\n          const hikesApp = {\n            ...state.hikesApp,\n            mouse: [0, 0]\n          };\n          return { ...state, hikesApp };\n        }\n      })\n        .delay(300)\n        .startWith({\n          transform(state) {\n\n            const hikesApp = {\n              ...state.hikesApp,\n              currentQuestion: currentQuestion + 1,\n              mouse: [ userAnswer ? 1000 : -1000, 0],\n              isPressed: false\n            };\n\n            return { ...state, hikesApp };\n          }\n        });\n    }\n\n    // challenge completed\n    let update$;\n    if (isSignedIn) {\n      const body = { id, name, challengeType: +challengeType };\n      update$ = this.postJSON$('/completed-challenge', body)\n        // if post fails, will retry once\n        .retry(3)\n        .map(({ alreadyCompleted, points }) => ({\n          transform(state) {\n            return {\n              ...state,\n              points,\n              toast: {\n                message:\n                  'Challenge saved.' +\n                  (alreadyCompleted ? '' : ' First time Completed!'),\n                title: 'Saved',\n                type: 'info',\n                id: state.toast && state.toast.id ? state.toast.id + 1 : 1\n              }\n            };\n          }\n        }))\n        .catch((errObj => {\n          const err = new Error(errObj.message);\n          err.stack = errObj.stack;\n          return {\n            transform(state) { return { ...state, err }; }\n          };\n        }));\n    } else {\n      update$ = Observable.just({ transform: (() => {}) });\n    }\n\n    const challengeCompleted$ = Observable.just({\n      transform(state) {\n        const { hikes, currentHike: { id } } = state.hikesApp;\n        const currentHike = findNextHike(hikes, id);\n\n        return {\n          ...state,\n          points: isSignedIn ? state.points + 1 : state.points,\n          hikesApp: {\n            ...state.hikesApp,\n            currentHike,\n            showQuestions: false,\n            currentQuestion: 1,\n            mouse: [0, 0]\n          },\n          toast: {\n            title: 'Congratulations!',\n            message: 'Challenge completed.' + (isSignedIn ? ' Saving...' : ''),\n            id: state.toast && state.toast.id ?\n              state.toast.id + 1 :\n              1,\n            type: 'success'\n          },\n          location: {\n            action: 'PUSH',\n            pathname: currentHike && currentHike.dashedName ?\n              `/videos/${ currentHike.dashedName }` :\n              '/videos'\n          }\n        };\n      }\n    });\n\n    const correctAnswer = {\n      transform(state) {\n        return {\n          ...state,\n          hikesApp: {\n            ...state.hikesApp,\n            isCorrect: true,\n            isPressed: false,\n            delta: [0, 0],\n            mouse: [ userAnswer ? 1000 : -1000, 0]\n          }\n        };\n      }\n    };\n\n    return Observable.merge(challengeCompleted$, update$)\n      .delay(300)\n      .startWith(correctAnswer)\n      .catch(err => Observable.just({\n        transform(state) { return { ...state, err }; }\n      }));\n  },\n  resetHike() {\n    return {\n      transform(state) {\n        return { ...state,\n          hikesApp: {\n            ...state.hikesApp,\n            currentQuestion: 1,\n            showQuestions: false,\n            mouse: [0, 0],\n            delta: [0, 0]\n          }\n        };\n      }\n    };\n  }\n});\n"
  },
  {
    "path": "common/app/routes/Hikes/redux/reducer.js",
    "content": "import { handleActions } from 'redux-actions';\nimport types from './types';\nimport { findNextHikeName } from './utils';\n\nconst initialState = {\n  hikes: {\n    results: [],\n    entities: {}\n  },\n  // ui\n  // hike dashedName\n  currentHike: '',\n  // 1 indexed\n  currentQuestion: 1,\n  // [ xPosition, yPosition ]\n  mouse: [ 0, 0 ],\n  // change in mouse position since pressed\n  // [ xDelta, yDelta ]\n  delta: [ 0, 0 ],\n  isPressed: false,\n  isCorrect: false,\n  shouldShakeQuestion: false,\n  shouldShowQuestions: false\n};\n\nexport default handleActions(\n  {\n    [types.toggleQuestionView]: state => ({\n      ...state,\n      shouldShowQuestions: !state.shouldShowQuestions,\n      currentQuestion: 1\n    }),\n\n    [types.grabQuestion]: (state, { payload: { delta, mouse } }) => ({\n      ...state,\n      isPressed: true,\n      delta,\n      mouse\n    }),\n\n    [types.releaseQuestion]: state => ({\n      ...state,\n      isPressed: false,\n      mouse: [ 0, 0 ]\n    }),\n\n    [types.moveQuestion]: (state, { payload: mouse }) => ({ ...state, mouse }),\n\n    [types.resetHike]: state => ({\n      ...state,\n      currentQuestion: 1,\n      shouldShowQuestions: false,\n      mouse: [0, 0],\n      delta: [0, 0]\n    }),\n\n    [types.startShake]: state => ({ ...state, shouldShakeQuestion: true }),\n    [types.endShake]: state => ({ ...state, shouldShakeQuestion: false }),\n\n    [types.primeNextQuestion]: (state, { payload: userAnswer }) => ({\n      ...state,\n      currentQuestion: state.currentQuestion + 1,\n      mouse: [ userAnswer ? 1000 : -1000, 0],\n      isPressed: false\n    }),\n\n    [types.goToNextQuestion]: state => ({\n      ...state,\n      mouse: [ 0, 0 ]\n    }),\n\n    [types.hikeCompleted]: (state, { payload: userAnswer } ) => ({\n      ...state,\n      isCorrect: true,\n      isPressed: false,\n      delta: [ 0, 0 ],\n      mouse: [ userAnswer ? 1000 : -1000, 0]\n    }),\n\n    [types.goToNextHike]: state => ({\n      ...state,\n      currentHike: findNextHikeName(state.hikes, state.currentHike),\n      shouldShowQuestions: false,\n      currentQuestion: 1,\n      mouse: [ 0, 0 ]\n    }),\n\n    [types.fetchHikesCompleted]: (state, { payload }) => {\n      const { hikes, currentHike } = payload;\n\n      return {\n        ...state,\n        hikes,\n        currentHike\n      };\n    }\n  },\n  initialState\n);\n"
  },
  {
    "path": "common/app/routes/Hikes/redux/selectors.js",
    "content": "// use this file for common selectors\nimport { createSelector } from 'reselect';\n\nexport const getCurrentHike = createSelector(\n  state => state.hikesApp.hikes.entities,\n  state => state.hikesApp.currentHike,\n  (hikesMap, currentHikeDashedName) => (hikesMap[currentHikeDashedName] || {})\n);\n"
  },
  {
    "path": "common/app/routes/Hikes/redux/types.js",
    "content": "import createTypes from '../../../utils/create-types';\n\nexport default createTypes([\n  'fetchHikes',\n  'fetchHikesCompleted',\n  'resetHike',\n\n  'toggleQuestionView',\n  'grabQuestion',\n  'releaseQuestion',\n  'moveQuestion',\n\n  'answerQuestion',\n\n  'startShake',\n  'endShake',\n\n  'primeNextQuestion',\n  'goToNextQuestion',\n  'transitionHike',\n\n  'hikeCompleted',\n  'goToNextHike'\n], 'videos');\n"
  },
  {
    "path": "common/app/routes/Hikes/redux/utils.js",
    "content": "import debug from 'debug';\nimport _ from 'lodash';\n\nconst log = debug('fcc:hikes:utils');\n\nfunction getFirstHike(hikes) {\n  return hikes.results[0];\n}\n\n// interface Hikes {\n//   results: String[],\n//   entities: {\n//     hikeId: Challenge\n//   }\n// }\n//\n// findCurrentHike({\n//   hikes: Hikes,\n//   dashedName: String\n// }) => String\nexport function findCurrentHike(hikes, dashedName) {\n  if (!dashedName) {\n    return getFirstHike(hikes) || {};\n  }\n\n  const filterRegex = new RegExp(dashedName, 'i');\n\n  return hikes\n    .results\n    .filter(dashedName => {\n      return filterRegex.test(dashedName);\n    })\n    .reduce((throwAway, hike) => {\n      return hike;\n    }, '');\n}\n\nexport function getCurrentHike(hikes = {}, dashedName) {\n  if (!dashedName) {\n    return getFirstHike(hikes) || {};\n  }\n  return hikes.entities[dashedName];\n}\n\n// findNextHikeName(\n//   hikes: { results: String[] },\n//   dashedName: String\n// ) => String\nexport function findNextHikeName({ results }, dashedName) {\n  if (!dashedName) {\n    log('find next hike no id provided');\n    return results[0];\n  }\n  const currentIndex = _.findIndex(\n    results,\n    _dashedName => _dashedName === dashedName\n  );\n\n  if (currentIndex >= results.length) {\n    return '';\n  }\n  return results[currentIndex + 1];\n}\n\n\nexport function getMouse(e, [dx, dy]) {\n  let { pageX, pageY, touches, changedTouches } = e;\n\n  // touches can be empty on touchend\n  if (touches || changedTouches) {\n    e.preventDefault();\n    // these re-assigns the values of pageX, pageY from touches\n    ({ pageX, pageY } = touches[0] || changedTouches[0]);\n  }\n\n  return [pageX - dx, pageY - dy];\n}\n"
  },
  {
    "path": "common/app/routes/Jobs/README.md",
    "content": "This folder contains everything relative to Jobs board\n"
  },
  {
    "path": "common/app/routes/Jobs/components/JobNotFound.jsx",
    "content": "import React from 'react';\nimport { LinkContainer } from 'react-router-bootstrap';\nimport { Button, Row, Col } from 'react-bootstrap';\n\nexport default class extends React.Component {\n  static displayName = 'NoJobFound';\n\n  shouldComponentUpdate() {\n    return false;\n  }\n\n  render() {\n    return (\n      <div>\n        <Row>\n          <Col\n            md={ 6 }\n            mdOffset={ 3 }>\n            <div>\n              No job found...\n              <LinkContainer to='/jobs'>\n                <Button\n                  block={ true }\n                  bsSize='large'\n                  bsStyle='primary'>\n                  Go to the job board\n                </Button>\n              </LinkContainer>\n            </div>\n          </Col>\n        </Row>\n      </div>\n    );\n  }\n}\n"
  },
  {
    "path": "common/app/routes/Jobs/components/JobTotal.jsx",
    "content": "import { CompositeDisposable } from 'rx';\nimport React, { PropTypes } from 'react';\nimport { Button, Input, Col, Row, Well } from 'react-bootstrap';\nimport { connect } from 'react-redux';\nimport { push } from 'react-router-redux';\nimport PureComponent from 'react-pure-render/component';\nimport { createSelector } from 'reselect';\n\nimport {\n  applyPromo,\n  clearPromo,\n  updatePromo\n} from '../redux/actions';\n\n// real paypal buttons\n// will take your money\nconst paypalIds = {\n  regular: 'Q8Z82ZLAX3Q8N',\n  highlighted: 'VC8QPSKCYMZLN'\n};\n\nconst bindableActions = {\n  applyPromo,\n  clearPromo,\n  push,\n  updatePromo\n};\n\nconst mapStateToProps = createSelector(\n  state => state.jobsApp.newJob,\n  state => state.jobsApp,\n  (\n    { id, isHighlighted } = {},\n    {\n      buttonId,\n      price = 1000,\n      discountAmount = 0,\n      promoCode = '',\n      promoApplied = false,\n      promoName = ''\n    }\n  ) => {\n    if (!buttonId) {\n      buttonId = isHighlighted ?\n        paypalIds.highlighted :\n        paypalIds.regular;\n    }\n    return {\n      id,\n      isHighlighted,\n      price,\n      discountAmount,\n      promoName,\n      promoCode,\n      promoApplied\n    };\n  }\n);\n\nexport class JobTotal extends PureComponent {\n  constructor(...args) {\n    super(...args);\n    this._subscriptions = new CompositeDisposable();\n  }\n\n  static displayName = 'JobTotal';\n\n  static propTypes = {\n    id: PropTypes.string,\n    isHighlighted: PropTypes.bool,\n    buttonId: PropTypes.string,\n    price: PropTypes.number,\n    discountAmount: PropTypes.number,\n    promoName: PropTypes.string,\n    promoCode: PropTypes.string,\n    promoApplied: PropTypes.bool\n  };\n\n  componentWillMount() {\n    if (!this.props.id) {\n      this.props.push('/jobs');\n    }\n\n    this.props.clearPromo();\n  }\n\n  componentWillUnmount() {\n    this._subscriptions.dispose();\n  }\n\n  renderDiscount(discountAmount) {\n    if (!discountAmount) {\n      return null;\n    }\n    return (\n      <Row>\n        <Col\n          md={ 3 }\n          mdOffset={ 3 }>\n          <h4>Promo Discount</h4>\n        </Col>\n        <Col\n          md={ 3 }>\n          <h4>-{ discountAmount }</h4>\n        </Col>\n      </Row>\n    );\n  }\n\n  renderHighlightPrice(isHighlighted) {\n    if (!isHighlighted) {\n      return null;\n    }\n    return (\n      <Row>\n        <Col\n          md={ 3 }\n          mdOffset={ 3 }>\n          <h4>Highlighting</h4>\n        </Col>\n        <Col\n          md={ 3 }>\n          <h4>+ 250</h4>\n        </Col>\n      </Row>\n    );\n  }\n\n  renderPromo() {\n    const {\n      id,\n      promoApplied,\n      promoCode,\n      promoName,\n      isHighlighted,\n      applyPromo,\n      updatePromo\n    } = this.props;\n\n    if (promoApplied) {\n      return (\n        <div>\n          <div className='spacer' />\n          <Row>\n            <Col\n              md={ 3 }\n              mdOffset={ 3 }>\n              { promoName } applied\n            </Col>\n          </Row>\n        </div>\n      );\n    }\n\n    return (\n      <div>\n        <div className='spacer' />\n        <Row>\n          <Col\n            md={ 3 }\n            mdOffset={ 3 }>\n            Have a promo code?\n          </Col>\n        </Row>\n        <Row>\n          <Col\n            md={ 3 }\n            mdOffset={ 3 }>\n            <Input\n              onChange={ updatePromo }\n              type='text'\n              value={ promoCode } />\n          </Col>\n          <Col\n            md={ 3 }>\n            <Button\n              block={ true }\n              onClick={ () => {\n                const subscription = applyPromo({\n                  id,\n                  code: promoCode,\n                  type: isHighlighted ? 'isHighlighted' : null\n                }).subscribe();\n                this._subscriptions.add(subscription);\n              }}>\n              Apply Promo Code\n            </Button>\n          </Col>\n        </Row>\n      </div>\n    );\n  }\n\n  render() {\n    const {\n      id,\n      isHighlighted,\n      buttonId,\n      price,\n      discountAmount,\n      push\n    } = this.props;\n\n    return (\n      <div>\n        <Row>\n          <Col\n            md={ 10 }\n            mdOffset={ 1 }\n            sm={ 8 }\n            smOffset={ 2 }\n            xs={ 12 }>\n            <div>\n              <Row>\n                <Col\n                  md={ 6 }\n                  mdOffset={ 3 }>\n                  <h2 className='text-center'>\n                    One more step\n                  </h2>\n                  <div className='spacer' />\n                  You're Awesome! just one more step to go.\n                  Clicking on the link below will redirect to paypal.\n                </Col>\n              </Row>\n              <div className='spacer' />\n              <Well>\n                <Row>\n                  <Col\n                    md={ 3 }\n                    mdOffset={ 3 }>\n                    <h4>Job Posting</h4>\n                  </Col>\n                  <Col\n                    md={ 6 }>\n                    <h4>+ { price }</h4>\n                  </Col>\n                </Row>\n                { this.renderHighlightPrice(isHighlighted) }\n                { this.renderDiscount(discountAmount) }\n                <Row>\n                  <Col\n                    md={ 3 }\n                    mdOffset={ 3 }>\n                    <h4>Total</h4>\n                  </Col>\n                  <Col\n                    md={ 6 }>\n                    <h4>${\n                      price - discountAmount + (isHighlighted ? 250 : 0)\n                    }</h4>\n                  </Col>\n                </Row>\n              </Well>\n              { this.renderPromo() }\n              <div className='spacer' />\n              <Row>\n                <Col\n                  md={ 6 }\n                  mdOffset={ 3 }>\n                  <form\n                    action='https://www.paypal.com/cgi-bin/webscr'\n                    method='post'\n                    onClick={ () => setTimeout(push, 0, '/jobs') }\n                    target='_blank'>\n                    <input\n                      name='cmd'\n                      type='hidden'\n                      value='_s-xclick' />\n                    <input\n                      name='hosted_button_id'\n                      type='hidden'\n                      value={ buttonId } />\n                    <input\n                      name='custom'\n                      type='hidden'\n                      value={ '' + id } />\n                    <Button\n                      block={ true }\n                      bsSize='large'\n                      className='signup-btn'\n                      type='submit'>\n                      <i className='fa fa-paypal' />\n                      Continue to PayPal\n                    </Button>\n                    <div className='spacer' />\n                    <img\n                      alt='An array of credit cards'\n                      border='0'\n                      src='//i.imgur.com/Q2SdSZG.png'\n                      style={{\n                        width: '100%'\n                      }} />\n                  </form>\n                </Col>\n              </Row>\n              <div className='spacer' />\n            </div>\n          </Col>\n        </Row>\n      </div>\n    );\n  }\n}\n\nexport default connect(mapStateToProps, bindableActions)(JobTotal);\n"
  },
  {
    "path": "common/app/routes/Jobs/components/Jobs.jsx",
    "content": "import React, { cloneElement, PropTypes } from 'react';\nimport { compose } from 'redux';\nimport { connect } from 'react-redux';\nimport { createSelector } from 'reselect';\nimport { LinkContainer } from 'react-router-bootstrap';\n\nimport PureComponent from 'react-pure-render/component';\nimport { Button, Row, Col } from 'react-bootstrap';\n\nimport contain from '../../../utils/professor-x';\nimport ListJobs from './List.jsx';\n\nimport {\n  findJob,\n  fetchJobs\n} from '../redux/actions';\n\nconst mapStateToProps = createSelector(\n  state => state.jobsApp.jobs.entities,\n  state => state.jobsApp.jobs.results,\n  state => state.jobsApp,\n  (jobsMap, jobsById) => {\n    return { jobs: jobsById.map(id => jobsMap[id]) };\n  }\n);\n\nconst bindableActions = {\n  findJob,\n  fetchJobs\n};\n\nconst fetchOptions = {\n  fetchAction: 'fetchJobs',\n  isPrimed({ jobs }) {\n    return jobs.length > 1;\n  }\n};\n\nexport class Jobs extends PureComponent {\n  static displayName = 'Jobs';\n\n  static propTypes = {\n    push: PropTypes.func,\n    findJob: PropTypes.func,\n    fetchJobs: PropTypes.func,\n    children: PropTypes.element,\n    jobs: PropTypes.array,\n    showModal: PropTypes.bool\n  };\n\n  createJobClickHandler() {\n    const { findJob } = this.props;\n\n    return (id) => {\n      findJob(id);\n    };\n  }\n\n  renderList(handleJobClick, jobs) {\n    return (\n      <ListJobs\n        handleClick={ handleJobClick }\n        jobs={ jobs }/>\n    );\n  }\n\n  renderChild(child, jobs) {\n    if (!child) {\n      return null;\n    }\n    return cloneElement(\n      child,\n      { jobs }\n    );\n  }\n\n  render() {\n    const {\n      children,\n      jobs\n    } = this.props;\n\n    return (\n      <Row>\n        <Col\n          md={ 10 }\n          mdOffset= { 1 }\n          xs={ 12 }>\n          <h1 className='text-center'>\n            Hire a JavaScript engineer who's experienced in HTML5,\n            Node.js, MongoDB, and Agile Development.\n          </h1>\n          <div className='spacer' />\n          <Row className='text-center'>\n            <Col\n              sm={ 8 }\n              smOffset={ 2 }\n              xs={ 12 }>\n              <LinkContainer to='/jobs/new' >\n                <Button className='signup-btn btn-block btn-cta'>\n                  Post a job: $1,000\n                </Button>\n              </LinkContainer>\n              <div className='spacer' />\n            </Col>\n          </Row>\n          <div className='spacer' />\n          <Row>\n            <Col\n              md={ 2 }\n              xs={ 4 }>\n              <img\n                alt={`\n                  a photo of Michael Gai, who recently hired a software\n                  engineer through Free Code Camp\n                  `}\n                  className='img-responsive testimonial-image-jobs img-center'\n                  src='//i.imgur.com/tGcAA8H.jpg' />\n              </Col>\n              <Col\n                md={ 10 }\n                xs={ 8 }>\n                <blockquote>\n                  <p>\n                    We hired our last developer out of Free Code Camp\n                    and couldn't be happier.  Free Code Camp is now\n                    our go-to way to bring on pre-screened candidates\n                    who are enthusiastic about learning quickly and\n                    becoming immediately productive in their new career.\n                  </p>\n                  <footer>\n                    Michael Gai, <cite>CEO at CoNarrative</cite>\n                  </footer>\n                </blockquote>\n              </Col>\n            </Row>\n            <Row>\n              { this.renderChild(children, jobs) ||\n                this.renderList(this.createJobClickHandler(), jobs) }\n              </Row>\n            </Col>\n          </Row>\n    );\n  }\n}\n\nexport default compose(\n  connect(mapStateToProps, bindableActions),\n  contain(fetchOptions)\n)(Jobs);\n"
  },
  {
    "path": "common/app/routes/Jobs/components/List.jsx",
    "content": "import React, { PropTypes } from 'react';\nimport classnames from 'classnames';\nimport { LinkContainer } from 'react-router-bootstrap';\nimport { ListGroup, ListGroupItem } from 'react-bootstrap';\nimport PureComponent from 'react-pure-render/component';\n\nexport default class ListJobs extends PureComponent {\n  static displayName = 'ListJobs';\n\n  static propTypes = {\n    handleClick: PropTypes.func,\n    jobs: PropTypes.array\n  };\n\n  addLocation(locale) {\n    if (!locale) {\n      return null;\n    }\n    return (\n      <span className='hidden-xs hidden-sm'>\n        { locale }\n      </span>\n    );\n  }\n\n  renderJobs(handleClick, jobs = []) {\n    return jobs\n    .filter(({ isPaid, isApproved, isFilled }) => {\n      return isPaid && isApproved && !isFilled;\n    })\n    .map(({\n      id,\n      company,\n      position,\n      isHighlighted,\n      locale\n    }) => {\n\n      const className = classnames({\n        'jobs-list': true,\n        'col-xs-12': true,\n        'jobs-list-highlight': isHighlighted\n      });\n\n      const to = `/jobs/${id}`;\n\n      return (\n        <LinkContainer\n          key={ id }\n          to={ to }>\n          <ListGroupItem\n            className={ className }\n            onClick={ () => handleClick(id) }>\n            <div>\n              <h4 className='pull-left' style={{ display: 'inline-block' }}>\n                <bold>{ company }</bold>\n                {' '}\n                <span className='hidden-xs hidden-sm'>\n                  - { position }\n                </span>\n              </h4>\n              <h4\n                className='pull-right'\n                style={{ display: 'inline-block' }}>\n                { this.addLocation(locale) }\n              </h4>\n            </div>\n          </ListGroupItem>\n        </LinkContainer>\n      );\n    });\n  }\n\n  render() {\n    const {\n      handleClick,\n      jobs\n    } = this.props;\n\n    return (\n      <ListGroup>\n        { this.renderJobs(handleClick, jobs) }\n      </ListGroup>\n    );\n  }\n}\n"
  },
  {
    "path": "common/app/routes/Jobs/components/NewJob.jsx",
    "content": "import { helpers } from 'rx';\nimport React, { PropTypes } from 'react';\nimport { push } from 'react-router-redux';\nimport { reduxForm } from 'redux-form';\n// import debug from 'debug';\nimport dedent from 'dedent';\n\nimport {\n  isAscii,\n  isEmail,\n  isURL\n} from 'validator';\n\nimport {\n  Button,\n  Col,\n  Input,\n  Row\n} from 'react-bootstrap';\n\nimport { saveForm, loadSavedForm } from '../redux/actions';\n\n// const log = debug('fcc:jobs:newForm');\n\nconst hightlightCopy = `\nHighlight my post to make it stand out. (+$250)\n`;\n\nconst isRemoteCopy = `\nThis job can be performed remotely.\n`;\n\nconst howToApplyCopy = dedent`\n  Examples: click here to apply yourcompany.com/jobs/33\n  Or email jobs@yourcompany.com\n`;\n\nconst checkboxClass = dedent`\n  text-left\n  jobs-checkbox-spacer\n  col-sm-offset-2\n  col-sm-6 col-md-offset-3\n`;\n\nconst certTypes = {\n  isFrontEndCert: 'isFrontEndCert',\n  isBackEndCert: 'isBackEndCert'\n};\n\nfunction isValidURL(data) {\n  return isURL(data, { 'require_protocol': true });\n}\n\nconst fields = [\n  'position',\n  'locale',\n  'description',\n  'email',\n  'url',\n  'logo',\n  'company',\n  'isHighlighted',\n  'isRemoteOk',\n  'isFrontEndCert',\n  'isBackEndCert',\n  'howToApply'\n];\n\nconst fieldValidators = {\n  position: makeRequired(isAscii),\n  locale: makeRequired(isAscii),\n  description: makeRequired(helpers.identity),\n  email: makeRequired(isEmail),\n  url: makeRequired(isValidURL),\n  logo: makeOptional(isValidURL),\n  company: makeRequired(isAscii),\n  howToApply: makeRequired(isAscii)\n};\n\nfunction makeOptional(validator) {\n  return val => val ? validator(val) : true;\n}\nfunction makeRequired(validator) {\n  return (val) => val ? validator(val) : false;\n}\n\nfunction validateForm(values) {\n  return Object.keys(fieldValidators)\n    .map(field => {\n      if (fieldValidators[field](values[field])) {\n        return null;\n      }\n      return { [field]: !fieldValidators[field](values[field]) };\n    })\n    .filter(Boolean)\n    .reduce((errors, error) => ({ ...errors, ...error }), {});\n}\n\nfunction getBsStyle(field) {\n  if (field.pristine) {\n    return null;\n  }\n\n  return field.error ?\n    'error' :\n    'success';\n}\n\nexport class NewJob extends React.Component {\n  static displayName = 'NewJob';\n\n  static propTypes = {\n    fields: PropTypes.object,\n    handleSubmit: PropTypes.func,\n    loadSavedForm: PropTypes.func,\n    push: PropTypes.func,\n    saveForm: PropTypes.func\n  };\n\n  componentDidMount() {\n    this.props.loadSavedForm();\n  }\n\n  handleSubmit(job) {\n    this.props.saveForm(job);\n    this.props.push('/jobs/new/preview');\n  }\n\n  handleCertClick(name) {\n    const { fields } = this.props;\n    Object.keys(certTypes).forEach(certType => {\n      if (certType === name) {\n        return fields[certType].onChange(true);\n      }\n      return fields[certType].onChange(false);\n    });\n  }\n\n  render() {\n    const {\n      fields: {\n        position,\n        locale,\n        description,\n        email,\n        url,\n        logo,\n        company,\n        isHighlighted,\n        isRemoteOk,\n        howToApply,\n        isFrontEndCert,\n        isBackEndCert\n      },\n      handleSubmit\n    } = this.props;\n\n    const { handleChange } = this;\n    const labelClass = 'col-sm-offset-1 col-sm-2';\n    const inputClass = 'col-sm-6';\n\n    return (\n      <div>\n        <Row>\n          <Col\n            md={ 10 }\n            mdOffset={ 1 }>\n            <div className='text-center'>\n              <form\n                className='form-horizontal'\n                onSubmit={ handleSubmit(data => this.handleSubmit(data)) }>\n\n                <div className='spacer'>\n                  <h2>First, select your ideal applicant: </h2>\n                </div>\n\n                <Row>\n                  <Col\n                    xs={ 6 }\n                    xsOffset={ 3 }>\n                    <Row>\n                      <Button\n                        bsStyle='primary'\n                        className={ isFrontEndCert.value ? 'active' : '' }\n                        onClick={ () => {\n                          if (!isFrontEndCert.value) {\n                            this.handleCertClick(certTypes.isFrontEndCert);\n                          }\n                        }}>\n                        <h4>Front End Development Certified</h4>\n                        You can expect each applicant\n                        to have a code portfolio using the\n                        following technologies:\n                        HTML5, CSS, jQuery, API integrations\n                        <br />\n                        <br />\n                      </Button>\n                    </Row>\n                    <div className='button-spacer' />\n                    <Row>\n                      <Button\n                        bsStyle='primary'\n                        className={ isBackEndCert.value ? 'active' : ''}\n                        onClick={ () => {\n                          if (!isBackEndCert.value) {\n                            this.handleCertClick(certTypes.isBackEndCert);\n                          }\n                        }}>\n                        <h4>Back End Development Certified</h4>\n                        You can expect each applicant to have a code\n                        portfolio using the following technologies:\n                        HTML5, CSS, jQuery, API integrations, MVC Framework,\n                        JavaScript, Node.js, MongoDB, Express.js\n                        <br />\n                        <br />\n                      </Button>\n                    </Row>\n                  </Col>\n                </Row>\n                <div className='spacer'>\n                  <h2>Tell us about the position</h2>\n                </div>\n                <hr />\n                <Input\n                  bsStyle={ getBsStyle(position) }\n                  label='Job Title'\n                  labelClassName={ labelClass }\n                  placeholder={\n                    'e.g. Full Stack Developer, Front End Developer, etc.'\n                  }\n                  required={ true }\n                  type='text'\n                  wrapperClassName={ inputClass }\n                  { ...position }\n                />\n                <Input\n                  bsStyle={ getBsStyle(locale) }\n                  label='Location'\n                  labelClassName={ labelClass }\n                  placeholder='e.g. San Francisco, Remote, etc.'\n                  required={ true }\n                  type='text'\n                  wrapperClassName={ inputClass }\n                  { ...locale }\n                />\n                <Input\n                  bsStyle={ getBsStyle(description) }\n                  label='Description'\n                  labelClassName={ labelClass }\n                  required={ true }\n                  rows='10'\n                  type='textarea'\n                  wrapperClassName={ inputClass }\n                  { ...description }\n                />\n                <Input\n                  label={ isRemoteCopy }\n                  type='checkbox'\n                  wrapperClassName={ checkboxClass }\n                  { ...isRemoteOk }\n                />\n                <div className='spacer' />\n\n                <hr />\n                <Row>\n                  <div>\n                    <h2>How should they apply?</h2>\n                  </div>\n                  <Input\n                    bsStyle={ getBsStyle(howToApply) }\n                    label='   '\n                    labelClassName={ labelClass }\n                    placeholder={ howToApplyCopy }\n                    required={ true }\n                    rows='2'\n                    type='textarea'\n                    wrapperClassName={ inputClass }\n                    { ...howToApply }\n                  />\n                </Row>\n\n                <div className='spacer' />\n                <hr />\n                <div>\n                  <h2>Tell us about your organization</h2>\n                </div>\n                <Input\n                  bsStyle={ getBsStyle(company) }\n                  label='Company Name'\n                  labelClassName={ labelClass }\n                  onChange={ (e) => handleChange('company', e) }\n                  type='text'\n                  wrapperClassName={ inputClass }\n                  { ...company }\n                />\n                <Input\n                  bsStyle={ getBsStyle(email) }\n                  label='Email'\n                  labelClassName={ labelClass }\n                  placeholder='This is how we will contact you'\n                  required={ true }\n                  type='email'\n                  wrapperClassName={ inputClass }\n                  { ...email }\n                />\n                <Input\n                  bsStyle={ getBsStyle(url) }\n                  label='URL'\n                  labelClassName={ labelClass }\n                  placeholder='http://yourcompany.com'\n                  type='url'\n                  wrapperClassName={ inputClass }\n                  { ...url }\n                />\n                <Input\n                  bsStyle={ getBsStyle(logo) }\n                  label='Logo'\n                  labelClassName={ labelClass }\n                  placeholder='http://yourcompany.com/logo.png'\n                  type='url'\n                  wrapperClassName={ inputClass }\n                  { ...logo }\n                />\n\n                <div className='spacer' />\n                <hr />\n                <div>\n                  <div>\n                    <h2>Make it stand out</h2>\n                  </div>\n                  <div className='spacer' />\n                  <Row>\n                    <Col\n                      md={ 6 }\n                      mdOffset={ 3 }>\n                      Highlight this ad to give it extra attention.\n                      <br />\n                    Featured listings receive more clicks and more applications.\n                    </Col>\n                  </Row>\n                  <div className='spacer' />\n                  <Row>\n                    <Input\n                      bsSize='large'\n                      bsStyle='success'\n                      label={ hightlightCopy }\n                      type='checkbox'\n                      wrapperClassName={\n                        checkboxClass.replace('text-left', '')\n                      }\n                      { ...isHighlighted }\n                    />\n                  </Row>\n                </div>\n\n                <Row>\n                  <Col\n                    className='text-left'\n                    lg={ 6 }\n                    lgOffset={ 3 }>\n                    <Button\n                      block={ true }\n                      bsSize='large'\n                      bsStyle='primary'\n                      type='submit'>\n                      Preview My Ad\n                    </Button>\n                  </Col>\n                </Row>\n              </form>\n            </div>\n          </Col>\n        </Row>\n      </div>\n    );\n  }\n}\n\nexport default reduxForm(\n  {\n    form: 'NewJob',\n    fields,\n    validate: validateForm\n  },\n  state => ({ initialValues: state.jobsApp.initialValues }),\n  {\n    loadSavedForm,\n    push,\n    saveForm\n  }\n)(NewJob);\n"
  },
  {
    "path": "common/app/routes/Jobs/components/NewJobCompleted.jsx",
    "content": "import React from 'react';\nimport { LinkContainer } from 'react-router-bootstrap';\nimport { Button, Col, Row } from 'react-bootstrap';\n\nexport default class extends React.createClass {\n  static displayName = 'NewJobCompleted';\n\n  render() {\n    return (\n      <div className='text-center'>\n        <div>\n          <Row>\n            <h1>\n              Your Position has Been Submitted\n            </h1>\n          </Row>\n          <Row>\n            <Col\n              md={ 6 }\n              mdOffset={ 3 }>\n              We’ll review your listing and email you when it’s live.\n              <br />\n              Thank you for listing this job with Free Code Camp.\n            </Col>\n          </Row>\n          <div className='spacer' />\n          <LinkContainer to={ '/jobs' }>\n            <Button\n              block={ true }\n              bsSize='large'\n              bsStyle='primary'>\n              Go to the job board\n            </Button>\n          </LinkContainer>\n        </div>\n      </div>\n    );\n  }\n}\n"
  },
  {
    "path": "common/app/routes/Jobs/components/Preview.jsx",
    "content": "import { CompositeDisposable } from 'rx';\nimport React, { PropTypes } from 'react';\nimport { Button, Row, Col } from 'react-bootstrap';\nimport { connect } from 'react-redux';\nimport PureComponent from 'react-pure-render/component';\nimport { goBack, push } from 'react-router-redux';\n\nimport ShowJob from './ShowJob.jsx';\nimport JobNotFound from './JobNotFound.jsx';\n\nimport { clearForm, saveJob } from '../redux/actions';\n\nconst mapStateToProps = state => ({ job: state.jobsApp.newJob });\n\nconst bindableActions = {\n  goBack,\n  push,\n  clearForm,\n  saveJob\n};\n\nexport class JobPreview extends PureComponent {\n  constructor(...args) {\n    super(...args);\n    this._subscriptions = new CompositeDisposable();\n  }\n\n  static displayName = 'Preview';\n\n  static propTypes = {\n    job: PropTypes.object,\n    saveJob: PropTypes.func,\n    clearForm: PropTypes.func,\n    push: PropTypes.func\n  };\n\n  componentWillMount() {\n    const { push, job } = this.props;\n    // redirect user in client\n    if (!job || !job.position || !job.description) {\n      push('/jobs/new');\n    }\n  }\n\n  componentWillUnmount() {\n    this._subscriptions.dispose();\n  }\n\n  handleJobSubmit() {\n    const { clearForm, saveJob, job } = this.props;\n    clearForm();\n    const subscription = saveJob(job).subscribe();\n    this._subscriptions.add(subscription);\n  }\n\n  render() {\n    const { job, goBack } = this.props;\n\n    if (!job || !job.position || !job.description) {\n      return <JobNotFound />;\n    }\n\n    return (\n      <div>\n        <ShowJob job={ job } />\n        <div className='spacer'></div>\n        <hr />\n        <Row>\n          <Col\n            md={ 10 }\n            mdOffset={ 1 }\n            xs={ 12 }>\n            <div>\n              <Button\n                block={ true }\n                className='signup-btn'\n                onClick={ () => this.handleJobSubmit() }>\n\n                Looks great! Let's Check Out\n              </Button>\n              <Button\n                block={ true }\n                onClick={ goBack } >\n                Head back and make edits\n              </Button>\n            </div>\n          </Col>\n        </Row>\n      </div>\n    );\n  }\n}\n\nexport default connect(mapStateToProps, bindableActions)(JobPreview);\n"
  },
  {
    "path": "common/app/routes/Jobs/components/Show.jsx",
    "content": "import React, { PropTypes } from 'react';\nimport { compose } from 'redux';\nimport { connect } from 'react-redux';\nimport { push } from 'react-router-redux';\nimport PureComponent from 'react-pure-render/component';\nimport { createSelector } from 'reselect';\n\nimport contain from '../../../utils/professor-x';\nimport { fetchJobs } from '../redux/actions';\n\nimport ShowJob from './ShowJob.jsx';\nimport JobNotFound from './JobNotFound.jsx';\nimport { isJobValid } from '../utils';\n\nfunction shouldShowApply(\n  {\n    isFrontEndCert: isFrontEndCertReq = false,\n    isBackEndCert: isBackEndCertReq = false\n  }, {\n    isFrontEndCert = false,\n    isBackEndCert = false\n  }\n) {\n  return (!isFrontEndCertReq && !isBackEndCertReq) ||\n    (isBackEndCertReq && isBackEndCert) ||\n    (isFrontEndCertReq && isFrontEndCert);\n}\n\nfunction generateMessage(\n  {\n    isFrontEndCert: isFrontEndCertReq = false,\n    isBackEndCert: isBackEndCertReq = false\n  },\n  {\n    isFrontEndCert = false,\n    isBackEndCert = false,\n    isSignedIn = false\n  }\n) {\n\n  if (!isSignedIn) {\n    return 'Must be signed in to apply';\n  }\n  if (isFrontEndCertReq && !isFrontEndCert) {\n    return 'This employer requires Free Code Camp’s Front ' +\n      'End Development Certification in order to apply';\n  }\n  if (isBackEndCertReq && !isBackEndCert) {\n    return 'This employer requires Free Code Camp’s Back ' +\n      'End Development Certification in order to apply';\n  }\n  if (isFrontEndCertReq && isFrontEndCertReq) {\n    return 'This employer requires the Front End Development Certification. ' +\n      \"You've earned it, so feel free to apply.\";\n  }\n  return 'This employer requires the Back End Development Certification. ' +\n    \"You've earned it, so feel free to apply.\";\n}\n\nconst mapStateToProps = createSelector(\n  state => state.app,\n  state => state.jobsApp.currentJob,\n  state => state.jobsApp.jobs.entities,\n  ({ username, isFrontEndCert, isBackEndCert }, currentJob, jobs) => ({\n    username,\n    isFrontEndCert,\n    isBackEndCert,\n    job: jobs[currentJob] || {}\n  })\n);\n\nconst bindableActions = {\n  push,\n  fetchJobs\n};\n\nconst fetchOptions = {\n  fetchAction: 'fetchJobs',\n  getActionArgs({ params: { id } }) {\n    return [ id ];\n  },\n  isPrimed({ params: { id } = {}, job = {} }) {\n    return job.id === id;\n  },\n  // using es6 destructuring\n  shouldRefetch({ job }, { params: { id } }) {\n    return job.id !== id;\n  }\n};\n\nexport class Show extends PureComponent {\n  static displayName = 'Show';\n\n  static propTypes = {\n    job: PropTypes.object,\n    isBackEndCert: PropTypes.bool,\n    isFrontEndCert: PropTypes.bool,\n    username: PropTypes.string\n  };\n\n  componentDidMount() {\n    const { job, push } = this.props;\n    // redirect user in client\n    if (!isJobValid(job)) {\n      push('/jobs');\n    }\n  }\n\n  render() {\n    const {\n      isBackEndCert,\n      isFrontEndCert,\n      job,\n      username\n    } = this.props;\n\n    if (!isJobValid(job)) {\n      return <JobNotFound />;\n    }\n\n    const isSignedIn = !!username;\n\n    const showApply = shouldShowApply(\n      job,\n      { isFrontEndCert, isBackEndCert }\n    );\n\n    const message = generateMessage(\n      job,\n      { isFrontEndCert, isBackEndCert, isSignedIn }\n    );\n\n    return (\n      <ShowJob\n        message={ message }\n        preview={ false }\n        showApply={ showApply }\n        { ...this.props }/>\n    );\n  }\n}\n\nexport default compose(\n  connect(mapStateToProps, bindableActions),\n  contain(fetchOptions)\n)(Show);\n"
  },
  {
    "path": "common/app/routes/Jobs/components/ShowJob.jsx",
    "content": "import React, { PropTypes } from 'react';\nimport { Row, Col, Thumbnail } from 'react-bootstrap';\nimport urlRegexFactory from 'url-regex';\n\nconst urlRegex = urlRegexFactory();\nconst defaultImage =\n  '/images/camper-image-placeholder.png';\n\nconst thumbnailStyle = {\n  backgroundColor: 'white',\n  maxHeight: '100px',\n  maxWidth: '100px'\n};\n\nfunction addATags(text) {\n  return text.replace(urlRegex, function(match) {\n    return `<a href=${match} target='_blank'>${match}</a>`;\n  });\n}\n\nexport default React.createClass({\n  displayName: 'ShowJob',\n  propTypes: {\n    job: PropTypes.object,\n    params: PropTypes.object,\n    showApply: PropTypes.bool,\n    preview: PropTypes.bool,\n    message: PropTypes.string\n  },\n\n  renderHeader({ company, position }) {\n    return (\n      <div>\n        <h4 style={{ display: 'inline-block' }}>{ company }</h4>\n        <h5\n          className='pull-right hidden-xs hidden-md'\n          style={{ display: 'inline-block' }}>\n          { position }\n        </h5>\n      </div>\n    );\n  },\n\n  renderHowToApply(showApply, preview, message, howToApply) {\n    if (!showApply) {\n      return (\n        <Row>\n            <Col\n              md={ 6 }\n              mdOffset={ 3 }>\n                <h4 className='bg-info text-center'>{ message }</h4>\n            </Col>\n        </Row>\n      );\n    }\n\n    return (\n        <Row>\n          <hr />\n          <Col\n            md={ 6 }\n            mdOffset={ 3 }>\n            <div>\n              <bold>{ preview ? 'How do I apply?' : message }</bold>\n              <br />\n              <br />\n              <span dangerouslySetInnerHTML={{\n                __html: addATags(howToApply)\n              }} />\n            </div>\n          </Col>\n        </Row>\n    );\n  },\n\n  render() {\n    const {\n      showApply = true,\n      message,\n      preview = true,\n      job = {}\n    } = this.props;\n\n    const {\n      logo,\n      position,\n      city,\n      company,\n      state,\n      locale,\n      description,\n      howToApply\n    } = job;\n\n    return (\n      <div>\n        <Row>\n          <Col\n            md={ 10 }\n            mdOffset={ 1 }\n            xs={ 12 }>\n            <div>\n              <Row>\n                <h2 className='text-center'>\n                  { company }\n                </h2>\n              </Row>\n              <div className='spacer' />\n              <Row>\n                <Col\n                  md={ 2 }\n                  mdOffset={ 3 }>\n                  <Thumbnail\n                    alt={ logo ? company + 'company logo' : 'stock image' }\n                    src={ logo || defaultImage }\n                    style={ thumbnailStyle } />\n                </Col>\n                <Col\n                  md={ 4 }>\n\n                  <bold>Position: </bold> { position || 'N/A' }\n                  <br />\n                  <bold>Location: </bold>\n                  { locale ? locale : `${city}, ${state}` }\n                </Col>\n              </Row>\n              <hr />\n              <div className='spacer' />\n              <Row>\n                <Col\n                  md={ 6 }\n                  mdOffset={ 3 }\n                  style={{ whiteSpace: 'pre-line' }}\n                  xs={ 12 }>\n                  <p>{ description }</p>\n                </Col>\n              </Row>\n              { this.renderHowToApply(showApply, preview, message, howToApply) }\n            </div>\n          </Col>\n        </Row>\n      </div>\n    );\n  }\n});\n"
  },
  {
    "path": "common/app/routes/Jobs/index.js",
    "content": "import Jobs from './components/Jobs.jsx';\nimport NewJob from './components/NewJob.jsx';\nimport Show from './components/Show.jsx';\nimport Preview from './components/Preview.jsx';\nimport JobTotal from './components/JobTotal.jsx';\nimport NewJobCompleted from './components/NewJobCompleted.jsx';\n\n/*\n *  index: /jobs list jobs\n *  show: /jobs/:id show one job\n *  create /jobs/new create a new job\n */\n\nexport default {\n  childRoutes: [{\n    path: '/jobs',\n    component: Jobs\n  }, {\n    path: 'jobs/new',\n    component: NewJob\n  }, {\n    path: 'jobs/new/preview',\n    component: Preview\n  }, {\n    path: 'jobs/new/check-out',\n    component: JobTotal\n  }, {\n    path: 'jobs/new/completed',\n    component: NewJobCompleted\n  }, {\n    path: 'jobs/:id',\n    component: Show\n  }]\n};\n"
  },
  {
    "path": "common/app/routes/Jobs/redux/actions.js",
    "content": "import { createAction } from 'redux-actions';\n\nimport types from './types';\n\nexport const fetchJobs = createAction(types.fetchJobs);\nexport const fetchJobsCompleted = createAction(\n  types.fetchJobsCompleted,\n  (currentJob, jobs) => ({ currentJob, jobs })\n);\n\nexport const findJob = createAction(types.findJob);\n\n// saves to database\nexport const saveJob = createAction(types.saveJob);\n// saves to localStorage\nexport const saveForm = createAction(types.saveForm);\n\nexport const saveCompleted = createAction(types.saveCompleted);\n\nexport const clearForm = createAction(types.clearForm);\n\nexport const loadSavedForm = createAction(types.loadSavedForm);\nexport const loadSavedFormCompleted = createAction(\n  types.loadSavedFormCompleted\n);\n\nexport const clearPromo = createAction(types.clearPromo);\nexport const updatePromo = createAction(\n  types.updatePromo,\n  ({ target: { value = '' } = {} } = {}) => value\n);\n\nexport const applyPromo = createAction(types.applyPromo);\nexport const applyPromoCompleted = createAction(types.applyPromoCompleted);\n"
  },
  {
    "path": "common/app/routes/Jobs/redux/apply-promo-saga.js",
    "content": "import { Observable } from 'rx';\n\nimport { applyPromo } from './types';\nimport { applyPromoCompleted } from './actions';\nimport { postJSON$ } from '../../../../utils/ajax-stream';\n\nexport default () => ({ dispatch }) => next => {\n  return function applyPromoSaga(action) {\n    if (action.type !== applyPromo) {\n      return next(action);\n    }\n\n    const { id, code = '', type = null } = action.payload;\n\n    const body = {\n      id,\n      code: code.replace(/[^\\d\\w\\s]/, '')\n    };\n\n    if (type) {\n      body.type = type;\n    }\n\n    return postJSON$('/api/promos/getButton', body)\n      .retry(3)\n      .map(({ promo }) => {\n        if (!promo || !promo.buttonId) {\n          throw new Error('No promo returned by server');\n        }\n\n        return applyPromoCompleted(promo);\n      })\n      .catch(error => Observable.just({\n        type: 'app.handleError',\n        error\n      }))\n      .doOnNext(dispatch);\n  };\n};\n"
  },
  {
    "path": "common/app/routes/Jobs/redux/fetch-jobs-saga.js",
    "content": "import { Observable } from 'rx';\nimport { normalize, Schema, arrayOf } from 'normalizr';\n\nimport { fetchJobsCompleted } from './actions';\nimport { fetchJobs } from './types';\nimport { handleError } from '../../../redux/types';\n\nconst job = new Schema('job', { idAttribute: 'id' });\n\nexport default ({ services }) => ({ dispatch }) => next => {\n  return function fetchJobsSaga(action) {\n    if (action.type !== fetchJobs) {\n      return next(action);\n    }\n\n    const { payload: id } = action;\n    const data = { service: 'jobs' };\n    if (id) {\n      data.params = { id };\n    }\n\n    return services.readService$(data)\n      .map(jobs => {\n        if (!Array.isArray(jobs)) {\n          jobs = [jobs];\n        }\n\n        const { entities, result } = normalize(\n          { jobs },\n          { jobs: arrayOf(job) }\n        );\n\n\n        return fetchJobsCompleted(\n          result.jobs[0],\n          {\n            entities: entities.job,\n            results: result.jobs\n          }\n        );\n      })\n      .catch(error => {\n        return Observable.just({\n          type: handleError,\n          error\n        });\n      })\n      .doOnNext(dispatch);\n  };\n};\n"
  },
  {
    "path": "common/app/routes/Jobs/redux/index.js",
    "content": "export actions from './actions';\nexport reducer from './reducer';\nexport types from './types';\n\nimport fetchJobsSaga from './fetch-jobs-saga';\nimport saveJobSaga from './save-job-saga';\nimport applyPromoSaga from './apply-promo-saga';\n\nexport formNormalizer from './jobs-form-normalizer';\n\nexport const sagas = [ fetchJobsSaga, saveJobSaga, applyPromoSaga ];\n"
  },
  {
    "path": "common/app/routes/Jobs/redux/jobs-form-normalizer.js",
    "content": "import normalizeUrl from 'normalize-url';\nimport {\n  inHTMLData,\n  uriInSingleQuotedAttr\n} from 'xss-filters';\n\nconst normalizeOptions = {\n  stripWWW: false\n};\n\nfunction ifDefinedNormalize(normalizer) {\n  return value => value ? normalizer(value) : value;\n}\n\nfunction formatUrl(url) {\n  if (\n    typeof url === 'string' &&\n    url.length > 4 &&\n    url.indexOf('.') !== -1\n  ) {\n    // prevent trailing / from being stripped during typing\n    let lastChar = '';\n    if (url.substring(url.length - 1) === '/') {\n      lastChar = '/';\n    }\n    return normalizeUrl(url, normalizeOptions) + lastChar;\n  }\n  return url;\n}\n\nexport default {\n  NewJob: {\n    position: ifDefinedNormalize(inHTMLData),\n    locale: ifDefinedNormalize(inHTMLData),\n    description: ifDefinedNormalize(inHTMLData),\n    email: ifDefinedNormalize(inHTMLData),\n    url: ifDefinedNormalize(value => formatUrl(uriInSingleQuotedAttr(value))),\n    logo: ifDefinedNormalize(value => formatUrl(uriInSingleQuotedAttr(value))),\n    company: ifDefinedNormalize(inHTMLData),\n    howToApply: ifDefinedNormalize(inHTMLData)\n  }\n};\n"
  },
  {
    "path": "common/app/routes/Jobs/redux/oldActions.js",
    "content": "import { Actions } from 'thundercats';\nimport store from 'store';\nimport { Observable } from 'rx';\n\nimport { nameSpacedTransformer } from '../../../../utils';\n\nconst assign = Object.assign;\nconst jobsTranformer = nameSpacedTransformer('jobsApp');\nconst noOper = { transform: () => {} };\n\nexport default Actions({\n  refs: { displayName: 'JobActions' },\n  shouldBindMethods: true,\n  // findJob assumes that the job is already in the list of jobs\n  findJob(id) {\n    return {\n      transform: jobsTranformer(oldState => {\n        const { currentJob = {}, jobs = [] } = oldState;\n        // currentJob already set\n        // do nothing\n        if (currentJob.id === id) {\n          return null;\n        }\n        const foundJob = jobs.reduce((newJob, job) => {\n          if (job.id === id) {\n            return job;\n          }\n          return newJob;\n        }, null);\n\n        // if no job found this will be null which is a op noop\n        return foundJob ?\n          assign({}, oldState, { currentJob: foundJob }) :\n          null;\n      })\n    };\n  },\n  saveJobToDb({ goTo, job }) {\n    return this.createService$('jobs', { job })\n      .map(job => ({\n        transform(state) {\n          state.location = {\n            action: 'PUSH',\n            pathname: goTo\n          };\n          return {\n            ...state,\n            jobsApp: {\n              ...state.jobs,\n              currentJob: job\n            }\n          };\n        }\n      }))\n      .catch(err => Observable.just({\n        transform(state) {\n          return { ...state, err };\n        }\n      }));\n  },\n  getJob(id) {\n    return this.readService$('jobs', { id })\n      .map(job => ({\n        transform: jobsTranformer(state => {\n          return { ...state, currentJob: job };\n        })\n      }))\n      .catch(err => Observable.just({\n        transform(state) {\n          return { ...state, err };\n        }\n      }));\n  },\n  getJobs() {\n    return this.readService$('jobs')\n      .map(jobs => ({\n        transform: jobsTranformer(state => {\n          return { ...state, jobs };\n        })\n      }))\n      .catch(err => Observable.just({\n        transform(state) {\n          return { ...state, err };\n        }\n      }));\n  },\n  openModal() {\n    return {\n      transform: jobsTranformer(state => ({ ...state, showModal: true }))\n    };\n  },\n  closeModal() {\n    return {\n      transform: jobsTranformer(state => ({ ...state, showModal: false }))\n    };\n  },\n  handleForm(value) {\n    return {\n      transform: jobsTranformer(oldState => {\n        const { form } = oldState;\n        const newState = assign({}, oldState);\n        newState.form = assign(\n          {},\n          form,\n          value\n        );\n        return newState;\n      })\n    };\n  },\n  saveForm: null,\n  clearSavedForm: null,\n  getSavedForm() {\n    const form = store.get('newJob');\n    if (form && !Array.isArray(form) && typeof form === 'object') {\n      return {\n        transform: jobsTranformer(state => {\n          return { ...state, form };\n        })\n      };\n    }\n    return noOper;\n  },\n  setPromoCode({ target: { value = '' }} = {}) {\n    return {\n      transform: jobsTranformer(state => ({\n        ...state,\n        promoCode: value.replace(/[^\\d\\w\\s]/, '')\n      }))\n    };\n  },\n  applyCode({ id, code = '', type = null}) {\n    const body = {\n      id,\n      code: code.replace(/[^\\d\\w\\s]/, '')\n    };\n    if (type) {\n      body.type = type;\n    }\n    return this.postJSON$('/api/promos/getButton', body)\n      .map(({ promo }) => {\n        if (!promo || !promo.buttonId) {\n          return noOper;\n        }\n        const {\n          fullPrice: price,\n          buttonId,\n          discountAmount,\n          code: promoCode,\n          name: promoName\n        } = promo;\n\n        return {\n          transform: jobsTranformer(state => ({\n            ...state,\n            price,\n            buttonId,\n            discountAmount,\n            promoCode,\n            promoApplied: true,\n            promoName\n          }))\n        };\n      })\n      .catch(err => Observable.just({\n        transform(state) {\n          return { ...state, err };\n        }\n      }));\n  },\n  clearPromo() {\n    return {\n      /* eslint-disable no-undefined */\n      transform: jobsTranformer(state => ({\n        ...state,\n        price: undefined,\n        buttonId: undefined,\n        discountAmount: undefined,\n        promoCode: undefined,\n        promoApplied: false,\n        promoName: undefined\n      }))\n      /* eslint-enable no-undefined */\n    };\n  },\n  init({ instance: jobActions }) {\n    jobActions.saveForm.subscribe((form) => {\n      store.set('newJob', form);\n    });\n\n    jobActions.clearSavedForm.subscribe(() => {\n      store.remove('newJob');\n    });\n\n    return jobActions;\n  }\n});\n"
  },
  {
    "path": "common/app/routes/Jobs/redux/reducer.js",
    "content": "import { handleActions } from 'redux-actions';\n\nimport types from './types';\n\nconst replaceMethod = ''.replace;\nfunction replace(str) {\n  if (!str) { return ''; }\n  return replaceMethod.call(str, /[^\\d\\w\\s]/, '');\n}\n\nconst initialState = {\n  // used by NewJob form\n  initialValues: {},\n  currentJob: '',\n  newJob: {},\n  jobs: {\n    entities: {},\n    results: []\n  }\n};\n\nexport default handleActions(\n  {\n    [types.findJob]: (state, { payload: id }) => {\n      const currentJob = state.jobs.entities[id];\n      return {\n        ...state,\n        currentJob: currentJob && currentJob.id ?\n          currentJob.id :\n          state.currentJob\n      };\n    },\n    [types.fetchJobsCompleted]: (state, { payload: { jobs, currentJob } }) => ({\n      ...state,\n      currentJob,\n      jobs\n    }),\n    [types.updatePromo]: (state, { payload }) => ({\n      ...state,\n      promoCode: replace(payload)\n    }),\n    [types.saveCompleted]: (state, { payload: newJob }) => {\n      return {\n        ...state,\n        newJob\n      };\n    },\n    [types.loadSavedFormCompleted]: (state, { payload: initialValues }) => ({\n      ...state,\n      initialValues\n    }),\n    [types.applyPromoCompleted]: (state, { payload: promo }) => {\n\n      const {\n        fullPrice: price,\n        buttonId,\n        discountAmount,\n        code: promoCode,\n        name: promoName\n      } = promo;\n\n      return {\n        ...state,\n        price,\n        buttonId,\n        discountAmount,\n        promoCode,\n        promoApplied: true,\n        promoName\n      };\n    },\n    [types.clearPromo]: state => ({\n      /* eslint-disable no-undefined */\n      ...state,\n      price: undefined,\n      buttonId: undefined,\n      discountAmount: undefined,\n      promoCode: undefined,\n      promoApplied: false,\n      promoName: undefined\n      /* eslint-enable no-undefined */\n    })\n  },\n  initialState\n);\n"
  },
  {
    "path": "common/app/routes/Jobs/redux/save-job-saga.js",
    "content": "import { push } from 'react-router-redux';\nimport { Observable } from 'rx';\n\nimport { saveCompleted } from './actions';\nimport { saveJob } from './types';\n\nimport { handleError } from '../../../redux/types';\n\nexport default ({ services }) => ({ dispatch }) => next => {\n  return function saveJobSaga(action) {\n    const result = next(action);\n    if (action.type !== saveJob) {\n      return result;\n    }\n    const { payload: job } = action;\n\n    return services.createService$({\n      service: 'jobs',\n      params: { job }\n    })\n    .retry(3)\n    .flatMap(job => Observable.of(\n      saveCompleted(job),\n      push('/jobs/new/check-out')\n    ))\n    .catch(error => Observable.just({\n      type: handleError,\n      error\n    }))\n    .doOnNext(dispatch);\n  };\n};\n"
  },
  {
    "path": "common/app/routes/Jobs/redux/types.js",
    "content": "import createTypes from '../../../utils/create-types';\n\nexport default createTypes([\n  'fetchJobs',\n  'fetchJobsCompleted',\n\n  'findJob',\n  'saveJob',\n  'saveForm',\n\n  'saveCompleted',\n\n  'clearForm',\n\n  'loadSavedForm',\n  'loadSavedFormCompleted',\n\n  'clearPromo',\n  'updatePromo',\n  'applyPromo',\n  'applyPromoCompleted'\n], 'jobs');\n"
  },
  {
    "path": "common/app/routes/Jobs/utils.js",
    "content": "const defaults = {\n  'string': {\n    value: '',\n    valid: false,\n    pristine: true,\n    type: 'string'\n  },\n  bool: {\n    value: false,\n    type: 'boolean'\n  }\n};\n\nexport function getDefaults(type, value) {\n  if (!type) {\n    return defaults['string'];\n  }\n  if (value) {\n    return Object.assign({}, defaults[type], { value });\n  }\n  return Object.assign({}, defaults[type]);\n}\n\nexport function isJobValid(job) {\n  return job &&\n    !job.isFilled &&\n    job.isApproved &&\n    job.isPaid;\n}\n"
  },
  {
    "path": "common/app/routes/index.js",
    "content": "import Jobs from './Jobs';\nimport Hikes from './Hikes';\nimport NotFound from '../components/NotFound/index.jsx';\n\nexport default {\n  path: '/',\n  childRoutes: [\n    Jobs,\n    Hikes,\n    {\n      path: '*',\n      component: NotFound\n    }\n  ]\n};\n"
  },
  {
    "path": "common/app/sagas.js",
    "content": "import { sagas as appSagas } from './redux';\nimport { sagas as hikesSagas} from './routes/Hikes/redux';\nimport { sagas as jobsSagas } from './routes/Jobs/redux';\n\nexport default [\n  ...appSagas,\n  ...hikesSagas,\n  ...jobsSagas\n];\n"
  },
  {
    "path": "common/app/shared/README.md",
    "content": "Here is where all components that are shared between multiple views\n"
  },
  {
    "path": "common/app/utils/Professor-Context.js",
    "content": "import React, { Children, PropTypes } from 'react';\n\nclass ProfessorContext extends React.Component {\n  constructor(props) {\n    super(props);\n    this.professor = props.professor;\n  }\n  static displayName = 'ProfessorContext';\n\n  static propTypes = {\n    professor: PropTypes.object,\n    children: PropTypes.element.isRequired\n  };\n\n  static childContextTypes = {\n    professor: PropTypes.object\n  };\n\n  getChildContext() {\n    return { professor: this.professor };\n  }\n\n  render() {\n    return Children.only(this.props.children);\n  }\n}\n\n/* eslint-disable react/display-name,  react/prop-types */\nProfessorContext.wrap = function wrap(Component, professor) {\n  const props = {};\n  if (professor) {\n    props.professor = professor;\n  }\n\n  return React.createElement(\n    ProfessorContext,\n    props,\n    Component\n  );\n};\n\nexport default ProfessorContext;\n"
  },
  {
    "path": "common/app/utils/create-types.js",
    "content": "// createTypes(types: String[], prefix: String) => Object\nexport default function createTypes(types = [], prefix = '') {\n  if (!Array.isArray(types) || typeof prefix !== 'string') {\n    return {};\n  }\n  return types.reduce((types, type) => {\n    types[type] = prefix + '.' + type;\n    return types;\n  }, {});\n}\n"
  },
  {
    "path": "common/app/utils/professor-x.js",
    "content": "import React, { PropTypes, createElement } from 'react';\nimport { Observable, CompositeDisposable } from 'rx';\nimport shouldComponentUpdate from 'react-pure-render/function';\nimport debug from 'debug';\n\n// interface contain {\n//   (options?: Object, Component: ReactComponent) => ReactComponent\n//   (options?: Object) => (Component: ReactComponent) => ReactComponent\n// }\n//\n// Action: { type: String, payload: Any, ...meta }\n//\n// ActionCreator(...args) => Observable\n//\n// interface options {\n//   fetchAction?: ActionCreator,\n//   getActionArgs?(props: Object, context: Object) => [],\n//   isPrimed?(props: Object, context: Object) => Boolean,\n//   handleError?(err) => Void\n//   shouldRefetch?(\n//     props: Object,\n//     nextProps: Object,\n//     context: Object,\n//     nextContext: Object\n//   ) => Boolean,\n// }\n\n\nconst log = debug('fcc:professerx');\n\nfunction getChildContext(childContextTypes, currentContext) {\n\n  const compContext = { ...currentContext };\n  // istanbul ignore else\n  if (!childContextTypes || !childContextTypes.professor) {\n    delete compContext.professor;\n  }\n  return compContext;\n}\n\nconst __DEV__ = process.env.NODE_ENV !== 'production';\n\nexport default function contain(options = {}, Component) {\n  /* istanbul ignore else */\n  if (!Component) {\n    return contain.bind(null, options);\n  }\n\n  let action;\n  let isActionable = false;\n  let hasRefetcher = typeof options.shouldRefetch === 'function';\n\n  const getActionArgs = typeof options.getActionArgs === 'function' ?\n    options.getActionArgs :\n    (() => []);\n\n  const isPrimed = typeof options.isPrimed === 'function' ?\n    options.isPrimed :\n    (() => false);\n\n\n  return class Container extends React.Component {\n    constructor(props, context) {\n      super(props, context);\n      this.__subscriptions = new CompositeDisposable();\n    }\n\n    static displayName = `Container(${Component.displayName})`;\n    static contextTypes = {\n      ...Component.contextTypes,\n      professor: PropTypes.object\n    };\n\n    componentWillMount() {\n      const { professor } = this.context;\n      const { props } = this;\n      if (!options.fetchAction) {\n        log(`${Component.displayName} has no fetch action defined`);\n        return null;\n      }\n\n      action = props[options.fetchAction];\n      isActionable = typeof action === 'function';\n\n      if (__DEV__ && typeof action !== 'function') {\n        throw new Error(\n          `${options.fetchAction} should return a function but got ${action}.\n          Check the fetch options for ${Component.displayName}.`\n        );\n      }\n\n      if (\n        !professor ||\n        !professor.fetchContext\n      ) {\n        log(\n          `${Component.displayName} did not have professor defined on context`\n        );\n        return null;\n      }\n\n\n      const actionArgs = getActionArgs(\n        props,\n        getChildContext(Component.contextTypes, this.context)\n      );\n\n      return professor.fetchContext.push({\n        name: options.fetchAction,\n        action,\n        actionArgs,\n        component: Component.displayName || 'Anon'\n      });\n    }\n\n    componentDidMount() {\n      if (isPrimed(this.props, this.context)) {\n        log('container is primed');\n        return null;\n      }\n      if (!isActionable) {\n        log(`${Component.displayName} container is not actionable`);\n        return null;\n      }\n      const actionArgs = getActionArgs(this.props, this.context);\n      const fetch$ = action.apply(null, actionArgs);\n      if (__DEV__ && !Observable.isObservable(fetch$)) {\n        console.log(fetch$);\n        throw new Error(\n          `Action creator should return an Observable but got ${fetch$}.\n          Check the action creator for fetch action ${options.fetchAction}`\n        );\n      }\n\n      const subscription = fetch$.subscribe(\n        () => {},\n        options.handleError\n      );\n      return this.__subscriptions.add(subscription);\n    }\n\n    componentWillReceiveProps(nextProps, nextContext) {\n      if (\n        !isActionable ||\n        !hasRefetcher ||\n        !options.shouldRefetch(\n          this.props,\n          nextProps,\n          getChildContext(Component.contextTypes, this.context),\n          getChildContext(Component.contextTypes, nextContext)\n        )\n      ) {\n        return;\n      }\n      const actionArgs = getActionArgs(\n        this.props,\n        getChildContext(Component.contextTypes, this.context)\n      );\n\n      const fetch$ = action.apply(null, actionArgs);\n      if (__DEV__ && !Observable.isObservable(fetch$)) {\n        throw new Error(\n          'fetch action should return observable'\n        );\n      }\n\n      const subscription = fetch$.subscribe(\n        () => {},\n        options.errorHandler\n      );\n\n      this.__subscriptions.add(subscription);\n    }\n\n    componentWillUnmount() {\n      if (this.__subscriptions) {\n        this.__subscriptions.dispose();\n      }\n    }\n\n    shouldComponentUpdate = shouldComponentUpdate;\n\n    render() {\n      const { props } = this;\n\n      return createElement(\n        Component,\n        props\n      );\n    }\n  };\n}\n"
  },
  {
    "path": "common/app/utils/render-to-string.js",
    "content": "import { Observable, Scheduler } from 'rx';\nimport ReactDOM from 'react-dom/server';\nimport debug from 'debug';\n\nimport ProfessorContext from './Professor-Context';\n\nconst log = debug('fcc:professor');\n\nexport function fetch({ fetchContext = [] }) {\n  if (fetchContext.length === 0) {\n    log('empty fetch context found');\n    return Observable.just(fetchContext);\n  }\n  return Observable.from(fetchContext, null, null, Scheduler.default)\n    .doOnNext(({ name }) => log(`calling ${name} action creator`))\n    .map(({ action, actionArgs }) => action.apply(null, actionArgs))\n    .doOnNext(fetch$ => {\n      if (!Observable.isObservable(fetch$)) {\n        throw new Error(\n          'action creator should return an observable'\n        );\n      }\n    })\n    .map(fetch$ => fetch$.doOnNext(action => log('action', action.type)))\n    .mergeAll()\n    .doOnCompleted(() => log('all fetch observables completed'));\n}\n\n\nexport default function renderToString(Component) {\n  const fetchContext = [];\n  const professor = { fetchContext };\n  let ContextedComponent;\n  try {\n    ContextedComponent = ProfessorContext.wrap(Component, professor);\n    log('initiating fetcher registration');\n    ReactDOM.renderToStaticMarkup(ContextedComponent);\n    log('fetcher registration completed');\n  } catch (e) {\n    return Observable.throw(e);\n  }\n  return fetch(professor)\n    .last()\n    .delay(0)\n    .map(() => {\n      const markup = ReactDOM.renderToString(Component);\n      return {\n        markup,\n        fetchContext\n      };\n    });\n}\n"
  },
  {
    "path": "common/app/utils/render.js",
    "content": "import ReactDOM from 'react-dom';\nimport { Disposable, Observable } from 'rx';\nimport ProfessorContext from './Professor-Context';\n\nexport default function render(Component, DOMContainer) {\n  let ContextedComponent;\n  try {\n    ContextedComponent = ProfessorContext.wrap(Component);\n  } catch (e) {\n    return Observable.throw(e);\n  }\n\n  return Observable.create(observer => {\n    try {\n      ReactDOM.render(ContextedComponent, DOMContainer, function() {\n        observer.onNext(this);\n      });\n    } catch (e) {\n      return observer.onError(e);\n    }\n\n    return Disposable.create(() => {\n      return ReactDOM.unmountComponentAtNode(DOMContainer);\n    });\n  });\n}\n"
  },
  {
    "path": "common/app/utils/shallow-equals.js",
    "content": "// original sourc\n// https://github.com/rackt/react-redux/blob/master/src/utils/shallowEqual.js\n// MIT license\nexport default function shallowEqual(objA, objB) {\n  if (objA === objB) {\n    return true;\n  }\n\n  if (\n    typeof objA !== 'object' ||\n    objA === null ||\n    typeof objB !== 'object' ||\n    objB === null\n  ) {\n    return false;\n  }\n\n  var keysA = Object.keys(objA);\n  var keysB = Object.keys(objB);\n\n  if (keysA.length !== keysB.length) {\n    return false;\n  }\n\n  // Test for A's keys different from B.\n  var bHasOwnProperty = Object.prototype.hasOwnProperty.bind(objB);\n  for (var i = 0; i < keysA.length; i++) {\n    if (\n      !bHasOwnProperty(keysA[i]) ||\n      objA[keysA[i]] !== objB[keysA[i]]\n    ) {\n      return false;\n    }\n  }\n\n  return true;\n}\n"
  },
  {
    "path": "common/config.global.js",
    "content": "// The path where to mount the REST API app\nexports.restApiRoot = '/api';\n//\n// The URL where the browser client can access the REST API is available\n// Replace with a full url (including hostname) if your client is being\n// served from a different server than your REST API.\nexports.restApiUrl = exports.restApiRoot;\n"
  },
  {
    "path": "common/models/User-Credential.json",
    "content": "{\n  \"name\": \"userCredential\",\n  \"plural\": \"userCredentials\",\n  \"base\": \"UserCredential\",\n  \"properties\": {},\n  \"validations\": [],\n  \"relations\": {\n    \"user\": {\n      \"type\": \"belongsTo\",\n      \"model\": \"user\",\n      \"foreignKey\": \"userId\"\n    }\n  },\n  \"acls\": [],\n  \"methods\": []\n}\n"
  },
  {
    "path": "common/models/User-Identity.js",
    "content": "import loopback from 'loopback';\nimport debugFactory from 'debug';\n\nimport {\n  setProfileFromGithub,\n  getFirstImageFromProfile,\n  getUsernameFromProvider,\n  getSocialProvider\n} from '../../server/utils/auth';\n\nconst { defaultProfileImage } = require('../utils/constantStrings.json');\nconst githubRegex = (/github/i);\nconst debug = debugFactory('fcc:models:userIdent');\n\nfunction createAccessToken(user, ttl, cb) {\n  if (arguments.length === 2 && typeof ttl === 'function') {\n    cb = ttl;\n    ttl = 0;\n  }\n  user.accessTokens.create({\n    created: new Date(),\n    ttl: Math.min(ttl || user.constructor.settings.ttl,\n      user.constructor.settings.maxTTL)\n  }, cb);\n}\n\nexport default function(UserIdent) {\n  // original source\n  // github.com/strongloop/loopback-component-passport\n  UserIdent.login = function(\n    provider,\n    authScheme,\n    profile,\n    credentials,\n    options,\n    cb\n  ) {\n    options = options || {};\n    if (typeof options === 'function' && !cb) {\n      cb = options;\n      options = {};\n    }\n    var autoLogin = options.autoLogin || !options.autoLogin;\n    var userIdentityModel = UserIdent;\n    profile.id = profile.id || profile.openid;\n    userIdentityModel.findOne({\n      where: {\n        provider: getSocialProvider(provider),\n        externalId: profile.id\n      }\n    }, function(err, identity) {\n      if (err) {\n        return cb(err);\n      }\n      if (identity) {\n        identity.credentials = credentials;\n        return identity.updateAttributes({\n          profile: profile,\n          credentials: credentials,\n          modified: new Date()\n        }, function(err) {\n          if (err) {\n            return cb(err);\n          }\n          // Find the user for the given identity\n          return identity.user(function(err, user) {\n            // Create access token if the autoLogin flag is set to true\n            if (!err && user && autoLogin) {\n              return (options.createAccessToken || createAccessToken)(\n                user,\n                function(err, token) {\n                  cb(err, user, identity, token);\n                }\n              );\n            }\n            return cb(err, user, identity);\n          });\n        });\n      }\n      // Find the user model\n      var userModel = userIdentityModel.relations.user &&\n        userIdentityModel.relations.user.modelTo ||\n        loopback.getModelByType(loopback.User);\n\n      var userObj = options.profileToUser(provider, profile, options);\n\n      if (!userObj.email && !options.emailOptional) {\n        process.nextTick(function() {\n          return cb('email is missing from the user profile');\n        });\n      }\n\n      var query;\n      if (userObj.email) {\n        query = { or: [\n          { username: userObj.username },\n          { email: userObj.email }\n        ]};\n      } else {\n        query = { username: userObj.username };\n      }\n      return userModel.findOrCreate({ where: query }, userObj, (err, user) => {\n        if (err) {\n          return cb(err);\n        }\n        var date = new Date();\n        return userIdentityModel.create({\n          provider: getSocialProvider(provider),\n          externalId: profile.id,\n          authScheme: authScheme,\n          profile: profile,\n          credentials: credentials,\n          userId: user.id,\n          created: date,\n          modified: date\n        }, function(err, identity) {\n          if (!err && user && autoLogin) {\n            return (options.createAccessToken || createAccessToken)(\n              user,\n              function(err, token) {\n                cb(err, user, identity, token);\n              }\n            );\n          }\n          return cb(err, user, identity);\n        });\n      });\n    });\n  };\n\n  UserIdent.observe('before save', function(ctx, next) {\n    var userIdent = ctx.currentInstance || ctx.instance;\n    if (!userIdent) {\n      debug('no user identity instance found');\n      return next();\n    }\n    return userIdent.user(function(err, user) {\n      let userChanged = false;\n      if (err) { return next(err); }\n      if (!user) {\n        debug('no user attached to identity!');\n        return next();\n      }\n\n      const { profile, provider } = userIdent;\n      const picture = getFirstImageFromProfile(profile);\n\n      debug('picture', picture, user.picture);\n      // check if picture was found\n      // check if user has no picture\n      // check if user has default picture\n      // set user.picture from oauth provider\n      if (\n        picture &&\n        (!user.picture || user.picture === defaultProfileImage)\n      ) {\n        debug('setting user picture');\n        user.picture = picture;\n        userChanged = true;\n      }\n\n      if (!githubRegex.test(provider) && profile) {\n        user[provider] = getUsernameFromProvider(provider, profile);\n        userChanged = true;\n      }\n\n      // if user signed in with github refresh their info\n      if (githubRegex.test(provider) && profile && profile._json) {\n        debug(\"user isn't github cool or username from github is different\");\n        setProfileFromGithub(user, profile, profile._json);\n        userChanged = true;\n      }\n\n\n      if (userChanged) {\n        return user.save(function(err) {\n          if (err) { return next(err); }\n          return next();\n        });\n      }\n      debug('exiting after user identity before save');\n      return next();\n  });\n });\n}\n"
  },
  {
    "path": "common/models/User-Identity.json",
    "content": "{\n  \"name\": \"userIdentity\",\n  \"plural\": \"userIdentities\",\n  \"base\": \"UserIdentity\",\n  \"properties\": {},\n  \"validations\": [],\n  \"relations\": {\n    \"user\": {\n      \"type\": \"belongsTo\",\n      \"model\": \"user\",\n      \"foreignKey\": \"userId\"\n    }\n  },\n  \"acls\": [\n    {\n      \"accessType\": \"*\",\n      \"principalType\": \"ROLE\",\n      \"principalId\": \"$everyone\",\n      \"permission\": \"DENY\"\n    }\n  ],\n  \"methods\": []\n}\n"
  },
  {
    "path": "common/models/challenge.json",
    "content": "{\n  \"name\": \"challenge\",\n  \"base\": \"PersistedModel\",\n  \"idInjection\": true,\n  \"trackChanges\": false,\n  \"properties\": {\n    \"id\": {\n      \"type\": \"string\",\n      \"id\": true\n    },\n    \"name\": {\n      \"type\": \"string\",\n      \"index\": {\n        \"mongodb\": {\n          \"unique\": true,\n          \"background\": true\n        }\n      }\n    },\n    \"title\": {\n      \"type\": \"string\"\n    },\n    \"type\": {\n      \"type\": \"string\"\n    },\n    \"order\": {\n      \"type\": \"number\"\n    },\n    \"suborder\": {\n      \"type\": \"number\"\n    },\n    \"checksum\": {\n      \"type\": \"number\"\n    },\n    \"isBeta\": {\n      \"type\": \"boolean\",\n      \"description\": \"Show only during dev or on beta site. Completely omitted otherwise\"\n    },\n    \"isComingSoon\": {\n      \"type\": \"boolean\",\n      \"description\": \"Challenge shows in production, but is unreachable and disabled. Is reachable in beta/dev only if isBeta flag is set\"\n    },\n    \"dashedName\": {\n      \"type\": \"string\"\n    },\n    \"superBlock\": {\n      \"type\": \"string\",\n      \"description\": \"Used for ordering challenge blocks in map\"\n    },\n    \"superOrder\": {\n      \"type\": \"number\",\n      \"description\": \"Used to determine super block order, set by prepending two digit number to super block folder name\"\n    },\n    \"block\": {\n      \"type\": \"string\"\n    },\n    \"difficulty\": {\n      \"type\": \"string\"\n    },\n    \"description\": {\n      \"type\": \"array\"\n    },\n    \"tests\": {\n      \"type\": \"array\"\n    },\n    \"head\": {\n      \"type\": \"array\",\n      \"default\": [],\n      \"description\": \"appended to user code\"\n    },\n    \"tail\": {\n      \"type\": \"array\",\n      \"default\": [],\n      \"description\": \"prepended to user code\"\n    },\n    \"helpRoom\": {\n      \"type\": \"string\",\n      \"default\": \"chinese\",\n      \"description\": \"Gitter help chatroom this challenge belongs too. Must be PascalCase\"\n    },\n    \"fileName\": {\n      \"type\": \"string\",\n      \"description\": \"filename challenge comes from. Used in dev mode\"\n    },\n    \"challengeSeed\": {\n      \"type\": \"array\"\n    },\n    \"challengeType\": {\n      \"type\": \"string\"\n    },\n    \"MDNlinks\": {\n      \"type\": \"array\"\n    },\n    \"nameCn\": {\n      \"type\": \"string\"\n    },\n    \"descriptionCn\": {\n      \"type\": \"array\"\n    },\n    \"nameFr\": {\n      \"type\": \"string\"\n    },\n    \"descriptionFr\": {\n      \"type\": \"array\"\n    },\n    \"nameRu\": {\n      \"type\": \"string\"\n    },\n    \"descriptionRu\": {\n      \"type\": \"array\"\n    },\n    \"nameEs\": {\n      \"type\": \"string\"\n    },\n    \"descriptionEs\": {\n      \"type\": \"array\"\n    },\n    \"namePt\": {\n      \"type\": \"string\"\n    },\n    \"descriptionPt\": {\n      \"type\": \"array\"\n    },\n    \"solutions\": {\n      \"type\": \"array\",\n      \"default\": []\n    },\n    \"releasedOn\": {\n      \"type\": \"string\"\n    }\n  },\n  \"validations\": [],\n  \"relations\": {},\n  \"acls\": [\n    {\n      \"accessType\": \"*\",\n      \"principalType\": \"ROLE\",\n      \"principalId\": \"$everyone\",\n      \"permission\": \"DENY\"\n    },\n    {\n      \"accessType\": \"READ\",\n      \"principalType\": \"ROLE\",\n      \"principalId\": \"$everyone\",\n      \"permission\": \"ALLOW\"\n    }\n  ],\n  \"methods\": []\n}\n"
  },
  {
    "path": "common/models/job.json",
    "content": "{\n  \"name\": \"job\",\n  \"base\": \"PersistedModel\",\n  \"strict\": true,\n  \"idInjection\": true,\n  \"trackChanges\": false,\n  \"properties\": {\n    \"id\": {\n      \"type\": \"string\",\n      \"id\": true\n    },\n    \"position\": {\n      \"type\": \"string\"\n    },\n    \"company\": {\n      \"type\": \"string\"\n    },\n    \"logo\": {\n      \"type\": \"string\"\n    },\n    \"city\": {\n      \"type\": \"string\"\n    },\n    \"email\": {\n      \"type\": \"string\",\n      \"required\": true\n    },\n    \"phone\": {\n      \"type\": \"string\"\n    },\n    \"state\": {\n      \"type\": \"string\"\n    },\n    \"url\": {\n      \"type\": \"string\"\n    },\n    \"country\": {\n      \"type\": \"string\"\n    },\n    \"locale\": {\n      \"type\": \"string\",\n      \"required\": true,\n      \"description\": \"format: city, state\"\n    },\n    \"location\": {\n      \"type\": \"geopoint\",\n      \"description\": \"location in lat, long\"\n    },\n    \"description\": {\n      \"type\": \"string\"\n    },\n    \"isApproved\": {\n      \"type\": \"boolean\",\n      \"default\": false\n    },\n    \"isHighlighted\": {\n      \"type\": \"boolean\",\n      \"default\": false\n    },\n    \"isPaid\": {\n      \"type\": \"boolean\",\n      \"default\": false\n    },\n    \"isFilled\": {\n      \"type\": \"boolean\",\n      \"default\": false\n    },\n    \"postedOn\": {\n      \"type\": \"date\",\n      \"defaultFn\": \"now\"\n    },\n    \"isFrontEndCert\": {\n      \"type\": \"boolean\",\n      \"defaut\": false,\n      \"description\": \"Camper must be front end certified to apply\"\n    },\n    \"isBackEndCert\": {\n      \"type\": \"boolean\",\n      \"default\": false,\n      \"description\": \"Camper must be back end certified to apply\"\n    },\n    \"isFullStackCert\": {\n      \"type\": \"boolean\",\n      \"default\": false,\n      \"description\": \"Camper must be full stack certified to apply\"\n    },\n    \"isRemoteOk\": {\n      \"type\": \"boolean\",\n      \"default\": false,\n      \"description\": \"Camper may work remotely\"\n    },\n    \"howToApply\": {\n      \"type\": \"string\",\n      \"required\": true,\n      \"description\": \"How do campers apply to job\"\n    },\n    \"promoCodeUsed\": {\n      \"type\": \"string\",\n      \"description\": \"the promocode, if any, that the job uses\"\n    }\n  },\n  \"validations\": [],\n  \"relations\": {},\n  \"acls\": [\n    {\n      \"accessType\": \"*\",\n      \"principalType\": \"ROLE\",\n      \"principalId\": \"$everyone\",\n      \"permission\": \"DENY\"\n    },\n    {\n      \"accessType\": \"READ\",\n      \"principalType\": \"ROLE\",\n      \"principalId\": \"$everyone\",\n      \"permission\": \"ALLOW\"\n    }\n  ],\n  \"methods\": []\n}\n"
  },
  {
    "path": "common/models/nonprofit.json",
    "content": "{\n  \"name\": \"nonprofit\",\n  \"base\": \"PersistedModel\",\n  \"idInjection\": true,\n  \"trackChanges\": false,\n  \"properties\": {\n    \"id\": {\n      \"type\": \"string\",\n      \"id\": true\n    },\n    \"name\": {\n      \"type\": \"string\",\n      \"index\": {\n        \"mongodb\": {\n          \"unique\": true,\n          \"background\": true\n        }\n      }\n    },\n    \"whatDoesNonprofitDo\": {\n      \"type\": \"string\"\n    },\n    \"websiteLink\": {\n      \"type\": \"string\"\n    },\n    \"endUser\": {\n      \"type\": \"string\"\n    },\n    \"approvedDeliverables\": {\n      \"type\": \"array\"\n    },\n    \"projectDescription\": {\n      \"type\": \"string\"\n    },\n    \"logoUrl\": {\n      \"type\": \"string\"\n    },\n    \"imageUrl\": {\n      \"type\": \"string\"\n    },\n    \"estimatedHours\": {\n      \"type\": \"number\"\n    },\n    \"moneySaved\": {\n      \"type\": \"number\"\n    },\n    \"currentStatus\": {\n      \"type\": \"string\"\n    }\n  },\n  \"validations\": [],\n  \"relations\": {},\n  \"acls\": [\n    {\n      \"accessType\": \"*\",\n      \"principalType\": \"ROLE\",\n      \"principalId\": \"$everyone\",\n      \"permission\": \"DENY\"\n    },\n    {\n      \"accessType\": \"READ\",\n      \"principalType\": \"ROLE\",\n      \"principalId\": \"$everyone\",\n      \"permission\": \"ALLOW\"\n    }\n  ],\n  \"methods\": []\n}\n"
  },
  {
    "path": "common/models/pledge.json",
    "content": "{\n  \"name\": \"pledge\",\n  \"base\": \"PersistedModel\",\n  \"idInjection\": true,\n  \"trackChanges\": false,\n  \"properties\": {\n    \"nonprofit\": {\n      \"type\": \"string\",\n      \"index\": true\n    },\n    \"amount\": {\n      \"type\": \"number\"\n    },\n    \"dateStarted\": {\n      \"type\": \"date\",\n      \"defaultFn\": \"now\"\n    },\n    \"dateEnded\": {\n      \"type\": \"date\"\n    },\n    \"formerUserId\": {\n      \"type\": \"string\"\n    },\n    \"isOrphaned\": {\n      \"type\": \"boolean\"\n    },\n    \"isCompleted\": {\n      \"type\": \"boolean\",\n      \"default\": \"false\"\n    }\n  },\n  \"validations\": [],\n  \"relations\": {\n    \"user\": {\n      \"type\": \"hasMany\",\n      \"model\": \"user\",\n      \"foreignKey\": \"userId\"\n    }\n  },\n  \"acls\": [\n    {\n      \"accessType\": \"*\",\n      \"principalType\": \"ROLE\",\n      \"principalId\": \"$everyone\",\n      \"permission\": \"DENY\"\n    },\n    {\n      \"accessType\": \"READ\",\n      \"principalType\": \"ROLE\",\n      \"principalId\": \"$everyone\",\n      \"permission\": \"ALLOW\"\n    }\n  ],\n  \"methods\": []\n}\n"
  },
  {
    "path": "common/models/promo.js",
    "content": "import { isAlphanumeric, isMongoId } from 'validator';\nimport debug from 'debug';\n\nconst log = debug('fcc:models:promo');\n\nexport default function promo(Promo) {\n  Promo.getButton = function getButton(id, code, type = 'isNot') {\n    const Job = Promo.app.models.Job;\n    if (!id || !isMongoId('' + id)) {\n      return Promise.reject(new Error(\n        'Must include job id'\n      ));\n    }\n\n    if (\n      !isAlphanumeric('' + code) &&\n      type &&\n      !isAlphanumeric('' + type)\n    ) {\n      return Promise.reject(new Error(\n        'Code or Type should be an alphanumeric'\n      ));\n    }\n\n    const query = {\n      where: {\n        and: [{\n          code: type === 'isNot' ? type : 'isHighlighted'\n        },\n        {\n          type: type.replace(/^\\$/g, '')\n        }]\n      }\n    };\n\n    return Promo.findOne(query)\n      .then(function(promo) {\n        // turn promo model to plain js object;\n        promo = promo.toJSON();\n        return Job.updateAll({ id: id }, { promoCodeUsed: code })\n          .then(function({ count = 0 } = {}) {\n            log('job', count);\n            if (count) {\n              return Object.assign({}, promo, { name: `${code} Discount` });\n            }\n            return Promise.reject(new Error(\n              `Job ${id} not found`\n            ));\n          });\n      });\n  };\n\n  Promo.remoteMethod(\n    'getButton',\n    {\n      description: 'Get button id for promocode',\n      accepts: [\n        {\n          arg: 'id',\n          type: 'string',\n          required: true\n        },\n        {\n          arg: 'code',\n          type: 'string',\n          required: true\n        },\n        {\n          arg: 'type',\n          type: 'string'\n        }\n      ],\n      returns: [\n        {\n          arg: 'promo',\n          type: 'object'\n        }\n      ]\n    }\n  );\n}\n"
  },
  {
    "path": "common/models/promo.json",
    "content": "{\n  \"name\": \"promo\",\n  \"base\": \"PersistedModel\",\n  \"strict\": true,\n  \"idInjection\": true,\n  \"trackChanges\": false,\n  \"properties\": {\n    \"code\": {\n      \"type\": \"string\",\n      \"required\": true,\n      \"description\": \"The code to unlock the promotional discount\"\n    },\n    \"name\": {\n      \"type\": \"string\",\n      \"required\": true,\n      \"description\": \"The name of the discount\"\n    },\n    \"buttonId\": {\n      \"type\": \"string\",\n      \"required\": true,\n      \"description\": \"The id of paypal button\"\n    },\n    \"type\": {\n      \"type\": \"string\",\n      \"description\": \"A selector of different types of buttons for the same discount\"\n    },\n    \"fullPrice\": {\n      \"type\": \"number\",\n      \"required\": true,\n      \"description\": \"The original amount\"\n    },\n    \"discountAmount\": {\n      \"type\": \"number\",\n      \"description\": \"The amount of the discount if applicable\"\n    },\n    \"discountPercent\": {\n      \"type\": \"number\",\n      \"description\": \"The amount of discount as a percentage if applicable\"\n    }\n  },\n  \"validations\": [],\n  \"relations\": {},\n  \"acls\": [\n    {\n      \"accessType\": \"*\",\n      \"principalType\": \"ROLE\",\n      \"principalId\": \"$everyone\",\n      \"permission\": \"DENY\"\n    },\n    {\n      \"accessType\": \"EXECUTE\",\n      \"principalType\": \"ROLE\",\n      \"principalId\": \"$everyone\",\n      \"permission\": \"ALLOW\",\n      \"property\": \"getButton\"\n    }\n  ],\n  \"methods\": []\n}\n"
  },
  {
    "path": "common/models/story.json",
    "content": "{\n  \"name\": \"story\",\n  \"base\": \"PersistedModel\",\n  \"idInjection\": true,\n  \"trackChanges\": false,\n  \"properties\": {\n    \"id\": {\n      \"type\": \"string\",\n      \"id\": true\n    },\n    \"name\": {\n      \"type\": \"string\",\n      \"index\": {\n        \"mongodb\": {\n          \"unique\": true,\n          \"background\": true\n        }\n      }\n    },\n    \"headline\": {\n      \"type\": \"string\"\n    },\n    \"timePosted\": {\n      \"type\": \"number\",\n      \"default\": 0\n    },\n    \"link\": {\n      \"type\": \"string\"\n    },\n    \"metaDescription\": {\n      \"type\": \"string\",\n      \"default\": \"\"\n    },\n    \"description\": {\n      \"type\": \"string\"\n    },\n    \"rank\": {\n      \"type\": \"number\",\n      \"default\": 0\n    },\n    \"upVotes\": {\n      \"type\": \"array\",\n      \"default\": []\n    },\n    \"author\": {\n      \"type\": {}\n    },\n    \"image\": {\n      \"type\": \"string\",\n      \"default\": \"\"\n    },\n    \"storyLink\": {\n      \"type\": \"string\",\n      \"default\": \"\"\n    }\n  },\n  \"validations\": [],\n  \"relations\": {},\n  \"acls\": [\n    {\n      \"accessType\": \"*\",\n      \"principalType\": \"ROLE\",\n      \"principalId\": \"$everyone\",\n      \"permission\": \"DENY\"\n    },\n    {\n      \"accessType\": \"READ\",\n      \"principalType\": \"ROLE\",\n      \"principalId\": \"$everyone\",\n      \"permission\": \"ALLOW\"\n    },\n    {\n      \"accessType\": \"EXECUTE\",\n      \"principalType\": \"ROLE\",\n      \"principalId\": \"$authenticated\",\n      \"permission\": \"ALLOW\",\n      \"property\": \"create\"\n    }\n  ],\n  \"methods\": []\n}\n"
  },
  {
    "path": "common/models/user.js",
    "content": "import { Observable } from 'rx';\n// import uuid from 'node-uuid';\nimport moment from 'moment';\nimport dedent from 'dedent';\nimport debugFactory from 'debug';\n\nimport { saveUser, observeMethod } from '../../server/utils/rx';\nimport { blacklistedUsernames } from '../../server/utils/constants';\n\nconst debug = debugFactory('fcc:user:remote');\nconst BROWNIEPOINTS_TIMEOUT = [1, 'hour'];\n\nfunction getAboutProfile({\n  username,\n  githubProfile: github,\n  progressTimestamps = [],\n  bio\n}) {\n  return {\n    username,\n    github,\n    browniePoints: progressTimestamps.length,\n    bio\n  };\n}\n\nfunction nextTick(fn) {\n  return process.nextTick(fn);\n}\n\nmodule.exports = function(User) {\n  // NOTE(berks): user email validation currently not needed but build in. This\n  // work around should let us sneak by\n  // see:\n  // https://github.com/strongloop/loopback/issues/1137#issuecomment-109200135\n  delete User.validations.email;\n  // set salt factor for passwords\n  User.settings.saltWorkFactor = 5;\n  // set user.rand to random number\n  User.definition.rawProperties.rand.default =\n    User.definition.properties.rand.default = function() {\n      return Math.random();\n    };\n\n  // username should not be in blacklist\n  User.validatesExclusionOf('username', {\n    'in': blacklistedUsernames,\n    message: 'is taken'\n  });\n\n  // username should be unique\n  User.validatesUniquenessOf('username');\n  User.settings.emailVerificationRequired = false;\n\n  User.on('dataSourceAttached', () => {\n    User.find$ = Observable.fromNodeCallback(User.find, User);\n    User.findOne$ = Observable.fromNodeCallback(User.findOne, User);\n    User.update$ = Observable.fromNodeCallback(User.updateAll, User);\n    User.count$ = Observable.fromNodeCallback(User.count, User);\n  });\n\n  User.observe('before save', function({ instance: user }, next) {\n    if (user) {\n      user.username = user.username.trim().toLowerCase();\n      user.email = typeof user.email === 'string' ?\n        user.email.trim().toLowerCase() :\n        user.email;\n\n      if (!user.progressTimestamps) {\n        user.progressTimestamps = [];\n      }\n\n      if (user.progressTimestamps.length === 0) {\n        user.progressTimestamps.push({ timestamp: Date.now() });\n      }\n    }\n    next();\n  });\n\n  debug('setting up user hooks');\n  User.afterRemote('confirm', function(ctx) {\n    ctx.req.flash('success', {\n      msg: [\n        '您的邮箱已经确认！'\n      ]\n    });\n    ctx.res.redirect('/email-signin');\n  });\n\n  User.beforeRemote('create', function({ _, res }) {\n    // Redirect to email-signin\n    return res.redirect('/email-signin');\n    /*\n    req.body.username = 'fcc' + uuid.v4().slice(0, 8);\n    if (!req.body.email) {\n      return next();\n    }\n    return User.doesExist(null, req.body.email)\n      .then(exists => {\n        if (!exists) {\n          return next();\n        }\n\n        req.flash('error', {\n          msg: dedent`\n            这个邮箱地址：${req.body.email}已经与某个用户关联，请尝试直接登录。\n          `\n        });\n\n        return res.redirect('/email-signin');\n      })\n      .catch(err => {\n        console.error(err);\n        req.flash('error', {\n          msg: '嗯，服务器有点小问题，请稍后再试。'\n        });\n        return res.redirect('/email-signup');\n      });\n    */\n  });\n\n  User.on('resetPasswordRequest', function(info) {\n    let url;\n    const host = User.app.get('host');\n    const { id: token } = info.accessToken;\n    if (process.env.NODE_ENV === 'development') {\n      const port = User.app.get('port');\n      url = `http://${host}:${port}/reset-password?access_token=${token}`;\n    } else {\n      url =\n        `http://freecodecamp.cn/reset-password?access_token=${token}`;\n    }\n\n    // the email of the requested user\n    debug(info.email);\n    // the temp access token to allow password reset\n    debug(info.accessToken.id);\n    // requires AccessToken.belongsTo(User)\n    var mailOptions = {\n      to: info.email,\n      from: 'jin@freecodecamp.cn',\n      subject: '密码重置请求',\n      text: `\n        您好,\\n\\n\n        这封邮件是用来确认是否是您本人请求重置FreeCodeCamp账户密码的。\n        这是您的邮箱：${ info.email }。\n        打开${ url }即可重置您的密码。\n        \\n\n        Happy Coding!\n        \\n\n      `\n    };\n    console.log('1' + User.app.models.Email.send);\n    User.app.models.Email.send(mailOptions, function(err) {\n      if (err) { console.error(err); }\n      debug('email reset sent');\n    });\n  });\n\n  User.beforeRemote('login', function(ctx, notUsed, next) {\n    const { body } = ctx.req;\n    if (body && typeof body.email === 'string') {\n      body.email = body.email.toLowerCase();\n    }\n    next();\n  });\n\n  User.afterRemote('login', function(ctx, accessToken, next) {\n    var res = ctx.res;\n    var req = ctx.req;\n    // var args = ctx.args;\n\n    var config = {\n      signed: !!req.signedCookies,\n      maxAge: accessToken.ttl\n    };\n\n    if (accessToken && accessToken.id) {\n      debug('setting cookies');\n      res.cookie('access_token', accessToken.id, config);\n      res.cookie('userId', accessToken.userId, config);\n    }\n\n    return req.logIn({ id: accessToken.userId.toString() }, function(err) {\n      if (err) { return next(err); }\n\n      debug('user logged in');\n\n      if (req.session && req.session.returnTo) {\n        var redirectTo = req.session.returnTo;\n        if (redirectTo === '/map-aside') {\n          redirectTo = '/map';\n        }\n        return res.redirect(redirectTo);\n      }\n\n      req.flash('success', { msg: '您已经成功登录!' });\n      return res.redirect('/');\n    });\n  });\n\n  User.afterRemoteError('login', function(ctx) {\n    var res = ctx.res;\n    var req = ctx.req;\n\n    req.flash('errors', {\n      msg: '无效的用户名或密码'\n    });\n    return res.redirect('/email-signin');\n  });\n\n  User.afterRemote('logout', function(ctx, result, next) {\n    var res = ctx.res;\n    res.clearCookie('access_token');\n    res.clearCookie('userId');\n    next();\n  });\n\n  User.doesExist = function doesExist(username, email) {\n    if (!username && !email) {\n      return Promise.resolve(false);\n    }\n    debug('checking existence');\n\n    // check to see if username is on blacklist\n    if (username && blacklistedUsernames.indexOf(username) !== -1) {\n      return Promise.resolve(true);\n    }\n\n    var where = {};\n    if (username) {\n      where.username = username.toLowerCase();\n    } else {\n      where.email = email ? email.toLowerCase() : email;\n    }\n    debug('where', where);\n    return User.count(where)\n    .then(count => count > 0);\n  };\n\n  User.remoteMethod(\n    'doesExist',\n    {\n      description: '检查邮箱或者用户名是否已经与某个用户关联',\n      accepts: [\n        {\n          arg: 'username',\n          type: 'string'\n        },\n        {\n          arg: 'email',\n          type: 'string'\n        }\n      ],\n      returns: [\n        {\n          arg: 'exists',\n          type: 'boolean'\n        }\n      ],\n      http: {\n        path: '/exists',\n        verb: 'get'\n      }\n    }\n  );\n\n  User.about = function about(username, cb) {\n    if (!username) {\n      // Zalgo!!\n      return nextTick(() => {\n        cb(new TypeError(\n            `username should be a string but got ${ username }`\n        ));\n      });\n    }\n    return User.findOne({ where: { username } }, (err, user) => {\n      if (err) {\n        return cb(err);\n      }\n      if (!user || user.username !== username) {\n        return cb(new Error(`no user found for ${ username }`));\n      }\n      const aboutUser = getAboutProfile(user);\n      return cb(null, aboutUser);\n    });\n  };\n\n  User.remoteMethod(\n    'about',\n    {\n      description: '获取用户公开信息',\n      accepts: [\n        {\n          arg: 'username',\n          type: 'string'\n        }\n      ],\n      returns: [\n        {\n          arg: 'about',\n          type: 'object'\n        }\n      ],\n      http: {\n        path: '/about',\n        verb: 'get'\n      }\n    }\n  );\n\n  User.giveBrowniePoints =\n    function giveBrowniePoints(receiver, giver, data = {}, dev = false, cb) {\n      const findUser = observeMethod(User, 'findOne');\n      if (!receiver) {\n        return nextTick(() => {\n          cb(\n            new TypeError(`receiver should be a string but got ${ receiver }`)\n          );\n        });\n      }\n      if (!giver) {\n        return nextTick(() => {\n          cb(new TypeError(`giver should be a string but got ${ giver }`));\n        });\n      }\n      let temp = moment();\n      const browniePoints = temp\n        .subtract.apply(temp, BROWNIEPOINTS_TIMEOUT)\n        .valueOf();\n      const user$ = findUser({ where: { username: receiver }});\n\n      return user$\n        .tapOnNext((user) => {\n          if (!user) {\n            throw new Error(`could not find receiver for ${ receiver }`);\n          }\n        })\n        .flatMap(({ progressTimestamps = [] }) => {\n          return Observable.from(progressTimestamps);\n        })\n        // filter out non objects\n        .filter((timestamp) => !!timestamp || typeof timestamp === 'object')\n        // filterout timestamps older then an hour\n        .filter(({ timestamp = 0 }) => {\n          return timestamp >= browniePoints;\n        })\n        // filter out brownie points given by giver\n        .filter((browniePoint) => {\n          return browniePoint.giver === giver;\n        })\n        // no results means this is the first brownie point given by giver\n        // so return -1 to indicate receiver should receive point\n        .first({ defaultValue: -1 })\n        .flatMap((browniePointsFromGiver) => {\n          if (browniePointsFromGiver === -1) {\n\n            return user$.flatMap((user) => {\n              user.progressTimestamps.push({\n                giver,\n                timestamp: Date.now(),\n                ...data\n              });\n              return saveUser(user);\n            });\n          }\n          return Observable.throw(\n            new Error(`${ giver } already gave ${ receiver } points`)\n          );\n        })\n        .subscribe(\n          (user) => {\n            return cb(\n              null,\n              getAboutProfile(user),\n              dev ?\n                { giver, receiver, data } :\n                null\n            );\n          },\n          (e) => cb(e, null, dev ? { giver, receiver, data } : null),\n          () => {\n            debug('brownie points assigned completed');\n          }\n        );\n    };\n\n  User.remoteMethod(\n    'giveBrowniePoints',\n    {\n      description: '给与这个用户积分奖励',\n      accepts: [\n        {\n          arg: 'receiver',\n          type: 'string',\n          required: true\n        },\n        {\n          arg: 'giver',\n          type: 'string',\n          required: true\n        },\n        {\n          arg: 'data',\n          type: 'object'\n        },\n        {\n          arg: 'debug',\n          type: 'boolean'\n        }\n      ],\n      returns: [\n        {\n          arg: 'about',\n          type: 'object'\n        },\n        {\n          arg: 'debug',\n          type: 'object'\n        }\n      ],\n      http: {\n        path: '/give-brownie-points',\n        verb: 'POST'\n      }\n    }\n  );\n\n  // user.updateTo$(updateData: Object) => Observable[Number]\n  User.prototype.update$ = function update$(updateData) {\n    const id = this.getId();\n    const updateOptions = { allowExtendedOperators: true };\n    if (\n        !updateData ||\n        typeof updateData !== 'object' ||\n        !Object.keys(updateData).length\n    ) {\n      return Observable.throw(new Error(\n        dedent`\n          updateData must be an object with at least one key,\n          but got ${updateData} with ${Object.keys(updateData).length}\n        `.split('\\n').join(' ')\n      ));\n    }\n    return this.constructor.update$({ id }, updateData, updateOptions);\n  };\n};\n"
  },
  {
    "path": "common/models/user.json",
    "content": "{\n  \"name\": \"user\",\n  \"base\": \"User\",\n  \"strict\": true,\n  \"emailVerificationRequired\": false,\n  \"idInjection\": true,\n  \"trackChanges\": false,\n  \"properties\": {\n    \"email\": {\n      \"type\": \"string\",\n      \"index\": {\n        \"mongodb\": {\n          \"unique\": true,\n          \"background\": true,\n          \"sparse\": true\n        }\n      }\n    },\n    \"password\": {\n      \"type\": \"string\"\n    },\n    \"progressTimestamps\": {\n      \"type\": \"array\",\n      \"default\": []\n    },\n    \"isBanned\": {\n      \"type\": \"boolean\",\n      \"default\": false,\n      \"description\": \"User is banned from posting to camper news\"\n    },\n    \"isCheater\": {\n      \"type\": \"boolean\",\n      \"default\": false,\n      \"description\": \"Users who are confirmed to break academic honesty policy are marked as cheaters\"\n    },\n    \"isGithubCool\": {\n      \"type\": \"boolean\",\n      \"default\": false\n    },\n    \"githubId\": {\n      \"type\": \"string\"\n    },\n    \"githubURL\": {\n      \"type\": \"string\"\n    },\n    \"githubEmail\": {\n      \"type\": \"string\"\n    },\n    \"joinedGithubOn\": {\n      \"type\": \"date\"\n    },\n    \"isMigrationGrandfathered\": {\n      \"type\": \"boolean\",\n      \"default\": false\n    },\n    \"username\": {\n      \"type\": \"string\",\n      \"require\": true,\n      \"index\": {\n        \"mongodb\": {\n          \"unique\": true,\n          \"background\": true\n        }\n      }\n    },\n    \"bio\": {\n      \"type\": \"string\",\n      \"default\": \"\"\n    },\n    \"name\": {\n      \"type\": \"string\",\n      \"default\": \"\"\n    },\n    \"gender\": {\n      \"type\": \"string\",\n      \"default\": \"\"\n    },\n    \"location\": {\n      \"type\": \"string\",\n      \"default\": \"\"\n    },\n    \"picture\": {\n      \"type\": \"string\",\n      \"default\": \"/images/camper-image-placeholder.png\"\n    },\n    \"linkedin\": {\n      \"type\": \"string\"\n    },\n    \"codepen\": {\n      \"type\": \"string\"\n    },\n    \"twitter\": {\n      \"type\": \"string\"\n    },\n    \"facebook\": {\n      \"type\": \"string\"\n    },\n    \"google\": {\n      \"type\": \"string\"\n    },\n    \"currentStreak\": {\n      \"type\": \"number\",\n      \"default\": 0\n    },\n    \"longestStreak\": {\n      \"type\": \"number\",\n      \"default\": 0\n    },\n    \"telphone\": {\n      \"type\": \"number\"\n    },\n    \"wechat\": {\n      \"type\": \"string\"\n    },\n    \"fullname\": {\n      \"type\": \"string\"\n    },\n    \"background\": {\n      \"type\": \"string\"\n    },\n    \"group\": {\n      \"type\": \"boolean\"\n    },\n    \"category\": {\n      \"type\": \"string\"\n    },\n    \"sendMonthlyEmail\": {\n      \"type\": \"boolean\",\n      \"default\": true\n    },\n    \"sendNotificationEmail\": {\n      \"type\": \"boolean\",\n      \"default\": true\n    },\n    \"sendQuincyEmail\": {\n      \"type\": \"boolean\",\n      \"default\": true\n    },\n    \"isLocked\": {\n      \"type\": \"boolean\",\n      \"default\": false,\n      \"description\": \"Campers profile does not show challenges/certificates to the public\"\n    },\n    \"currentChallenge\": {\n      \"type\": {}\n    },\n    \"isUniqMigrated\": {\n      \"type\": \"boolean\",\n      \"default\": false,\n      \"description\": \"Campers completedChallenges array is free of duplicates\"\n    },\n    \"isHonest\": {\n      \"type\": \"boolean\",\n      \"default\": false,\n      \"description\": \"Camper has signed academic honesty policy\"\n    },\n    \"isFrontEndCert\": {\n      \"type\": \"boolean\",\n      \"defaut\": false,\n      \"description\": \"Camper is front end certified\"\n    },\n    \"isDataVisCert\": {\n      \"type\": \"boolean\",\n      \"defaut\": false,\n      \"description\": \"Camper is data visualization certified\"\n    },\n    \"isBackEndCert\": {\n      \"type\": \"boolean\",\n      \"default\": false,\n      \"description\": \"Campers is back end certified\"\n    },\n    \"isFullStackCert\": {\n      \"type\": \"boolean\",\n      \"default\": false,\n      \"description\": \"Campers is full stack certified\"\n    },\n    \"isChallengeMapMigrated\": {\n      \"type\": \"boolean\",\n      \"default\": false,\n      \"description\": \"Migrate completedChallenges array to challenge map\"\n    },\n    \"challengeMap\": {\n      \"type\": \"object\",\n      \"default\": {},\n      \"description\": \"A map by id of all the user completed challenges\"\n    },\n    \"completedChallenges\": {\n      \"type\": [\n        {\n          \"completedDate\": \"number\",\n          \"lastUpdated\": \"number\",\n          \"id\": \"string\",\n          \"name\": \"string\",\n          \"completedWith\": \"string\",\n          \"solution\": \"string\",\n          \"githubLink\": \"string\",\n          \"verified\": \"boolean\",\n          \"challengeType\": {\n            \"type\": \"number\",\n            \"default\": 0\n          }\n        }\n      ],\n      \"default\": []\n    },\n    \"rand\": {\n      \"type\": \"number\",\n      \"index\": true\n    },\n    \"tshirtVote\": {\n      \"type\": \"number\"\n    },\n    \"timezone\": {\n      \"type\": \"string\"\n    }\n  },\n  \"validations\": [],\n  \"relations\": {\n    \"credentials\": {\n      \"type\": \"hasMany\",\n      \"model\": \"userCredential\",\n      \"foreignKey\": \"\"\n    },\n    \"identities\": {\n      \"type\": \"hasMany\",\n      \"model\": \"userIdentity\",\n      \"foreignKey\": \"\"\n    },\n    \"pledge\": {\n      \"type\": \"hasOne\",\n      \"model\": \"pledge\",\n      \"foreignKey\": \"\"\n    }\n  },\n  \"acls\": [\n    {\n      \"accessType\": \"*\",\n      \"principalType\": \"ROLE\",\n      \"principalId\": \"$everyone\",\n      \"permission\": \"DENY\"\n    },\n    {\n      \"accessType\": \"EXECUTE\",\n      \"principalType\": \"ROLE\",\n      \"principalId\": \"$everyone\",\n      \"permission\": \"ALLOW\",\n      \"property\": \"doesExist\"\n    },\n    {\n      \"accessType\": \"EXECUTE\",\n      \"principalType\": \"ROLE\",\n      \"principalId\": \"$everyone\",\n      \"permission\": \"ALLOW\",\n      \"property\": \"about\"\n    },\n    {\n      \"accessType\": \"EXECUTE\",\n      \"principalType\": \"ROLE\",\n      \"principalId\": \"$everyone\",\n      \"permission\": \"ALLOW\",\n      \"property\": \"giveBrowniePoints\"\n    }\n  ],\n  \"methods\": []\n}\n"
  },
  {
    "path": "common/utils/ajax-stream.js",
    "content": "/*\n * Copyright (c) Microsoft Open Technologies, Inc.  All rights reserved.\n * Microsoft Open Technologies would like to thank its contributors, a list\n * of whom are at http://rx.codeplex.com/wikipage?title=Contributors.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you\n * may not use this file except in compliance with the License. You may\n * 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\n * implied. See the License for the specific language governing permissions\n * and limitations under the License.\n */\n\nimport debugFactory from 'debug';\nimport { Observable, AnonymousObservable, helpers } from 'rx';\n\nconst debug = debugFactory('fcc:ajax$');\nconst root = typeof window !== 'undefined' ? window : {};\n\n// Gets the proper XMLHttpRequest for support for older IE\nfunction getXMLHttpRequest() {\n  if (root.XMLHttpRequest) {\n    return new root.XMLHttpRequest();\n  } else {\n    var progId;\n    try {\n      var progIds = [\n        'Msxml2.XMLHTTP',\n        'Microsoft.XMLHTTP',\n        'Msxml2.XMLHTTP.4.0'\n      ];\n      for (var i = 0; i < 3; i++) {\n        try {\n          progId = progIds[i];\n          if (new root.ActiveXObject(progId)) {\n            break;\n          }\n        } catch (e) {\n          // purposely do nothing\n          helpers.noop(e);\n        }\n      }\n      return new root.ActiveXObject(progId);\n    } catch (e) {\n      throw new Error('XMLHttpRequest is not supported by your browser');\n    }\n  }\n}\n\n// Get CORS support even for older IE\nfunction getCORSRequest() {\n  var xhr = new root.XMLHttpRequest();\n  if ('withCredentials' in xhr) {\n    return xhr;\n  } else if (root.XDomainRequest) {\n    return new XDomainRequest();\n  } else {\n    throw new Error('CORS is not supported by your browser');\n  }\n}\n\nfunction normalizeAjaxSuccessEvent(e, xhr, settings) {\n  var response = ('response' in xhr) ? xhr.response : xhr.responseText;\n  response = settings.responseType === 'json' ? JSON.parse(response) : response;\n  return {\n    response: response,\n    status: xhr.status,\n    responseType: xhr.responseType,\n    xhr: xhr,\n    originalEvent: e\n  };\n}\n\nfunction normalizeAjaxErrorEvent(e, xhr, type) {\n  return {\n    type: type,\n    status: xhr.status,\n    xhr: xhr,\n    originalEvent: e\n  };\n}\n\n/*\n *\n * Creates an observable for an Ajax request with either a settings object\n * with url, headers, etc or a string for a URL.\n *\n * @example\n *   source = Rx.DOM.ajax('/products');\n *   source = Rx.DOM.ajax( url: 'products', method: 'GET' });\n *\n * @param {Object} settings Can be one of the following:\n *\n *  A string of the URL to make the Ajax call.\n *  An object with the following properties\n *   - url: URL of the request\n *   - body: The body of the request\n *   - method: Method of the request, such as GET, POST, PUT, PATCH, DELETE\n *   - async: Whether the request is async\n *   - headers: Optional headers\n *   - crossDomain: true if a cross domain request, else false\n *\n * @returns {Observable} An observable sequence containing the XMLHttpRequest.\n*/\n\nexport function ajax$(options) {\n  var settings = {\n    method: 'GET',\n    crossDomain: false,\n    async: true,\n    headers: {},\n    responseType: 'text',\n    createXHR: function() {\n      return this.crossDomain ? getCORSRequest() : getXMLHttpRequest();\n    },\n    normalizeError: normalizeAjaxErrorEvent,\n    normalizeSuccess: normalizeAjaxSuccessEvent\n  };\n\n  if (typeof options === 'string') {\n    settings.url = options;\n  } else {\n    for (var prop in options) {\n      if (hasOwnProperty.call(options, prop)) {\n        settings[prop] = options[prop];\n      }\n    }\n  }\n\n  var normalizeError = settings.normalizeError;\n  var normalizeSuccess = settings.normalizeSuccess;\n\n  if (!settings.crossDomain && !settings.headers['X-Requested-With']) {\n    settings.headers['X-Requested-With'] = 'XMLHttpRequest';\n  }\n  settings.hasContent = typeof settings.body !== 'undefined';\n\n  return new AnonymousObservable(function(observer) {\n    var isDone = false;\n    var xhr;\n\n    var processResponse = function(xhr, e) {\n      var status = xhr.status === 1223 ? 204 : xhr.status;\n      if ((status >= 200 && status <= 300) || status === 0 || status === '') {\n        try {\n          observer.onNext(normalizeSuccess(e, xhr, settings));\n          observer.onCompleted();\n        } catch (err) {\n          observer.onError(err);\n        }\n      } else {\n        observer.onError(normalizeError(e, xhr, 'error'));\n      }\n      isDone = true;\n    };\n\n    try {\n      xhr = settings.createXHR();\n    } catch (err) {\n      observer.onError(err);\n    }\n\n    try {\n      if (settings.user) {\n        xhr.open(\n          settings.method,\n          settings.url,\n          settings.async,\n          settings.user,\n          settings.password\n        );\n      } else {\n        xhr.open(settings.method, settings.url, settings.async);\n      }\n\n      var headers = settings.headers;\n      for (var header in headers) {\n        if (hasOwnProperty.call(headers, header)) {\n          xhr.setRequestHeader(header, headers[header]);\n        }\n      }\n\n      if (\n        !xhr.upload ||\n        (!('withCredentials' in xhr) && root.XDomainRequest)\n      ) {\n        xhr.onload = function(e) {\n          if (settings.progressObserver) {\n            settings.progressObserver.onNext(e);\n            settings.progressObserver.onCompleted();\n          }\n          processResponse(xhr, e);\n        };\n\n        if (settings.progressObserver) {\n          xhr.onprogress = function(e) {\n            settings.progressObserver.onNext(e);\n          };\n        }\n\n        xhr.onerror = function(e) {\n          if (settings.progressObserver) {\n            settings.progressObserver.onError(e);\n          }\n          observer.onError(normalizeError(e, xhr, 'error'));\n          isDone = true;\n        };\n\n        xhr.onabort = function(e) {\n          if (settings.progressObserver) {\n            settings.progressObserver.onError(e);\n          }\n          observer.onError(normalizeError(e, xhr, 'abort'));\n          isDone = true;\n        };\n      } else {\n\n        xhr.onreadystatechange = function(e) {\n          if (xhr.readyState === 4) {\n            processResponse(xhr, e);\n          }\n        };\n      }\n\n      debug(\n        'ajax$ sending content',\n        settings.hasContent && settings.body\n      );\n      xhr.send(settings.hasContent && settings.body || null);\n    } catch (err) {\n      observer.onError(err);\n    }\n\n    return function() {\n      if (!isDone && xhr.readyState !== 4) { xhr.abort(); }\n    };\n  });\n}\n\n/**\n  * Creates an observable sequence from an Ajax POST Request with the body.\n  *\n  * @param {String} url The URL to POST\n  * @param {Object} body The body to POST\n  * @returns {Observable} The observable sequence which contains the response\n  * from the Ajax POST.\n  */\nexport function post$(url, body) {\n  try {\n    body = JSON.stringify(body);\n  } catch (e) {\n    return Observable.throw(e);\n  }\n\n  return ajax$({ url, body, method: 'POST' });\n}\n\nexport function postJSON$(url, body) {\n  try {\n    body = JSON.stringify(body);\n  } catch (e) {\n    return Observable.throw(e);\n  }\n\n  return ajax$({\n    url,\n    body,\n    method: 'POST',\n    responseType: 'json',\n    headers: {\n      'Content-Type': 'application/json',\n      'Accept': 'application/json'\n    }\n  })\n    .map(({ response }) => response);\n}\n\n/**\n  * Creates an observable sequence from an Ajax GET Request with the body.\n  *\n  * @param {String} url The URL to GET\n  * @returns {Observable} The observable sequence which\n  * contains the response from the Ajax GET.\n  */\nexport function get$(url) {\n  return ajax$({ url: url });\n}\n\n/**\n  * Creates an observable sequence from JSON from an Ajax request\n  *\n  * @param {String} url The URL to GET\n  * @returns {Observable} The observable sequence which contains the parsed JSON\n  */\nexport function getJSON$(url) {\n  return ajax$({\n    url: url,\n    responseType: 'json',\n    headers: {\n      'Content-Type': 'application/json',\n      'Accept': 'application/json'\n    }\n  }).map(({ response }) => response);\n}\n"
  },
  {
    "path": "common/utils/constantStrings.json",
    "content": "{\n  \"defaultProfileImage\": \"https://freecodecamp.cn/images/camper-image-placeholder.png\"\n}\n"
  },
  {
    "path": "common/utils/index.js",
    "content": "export function nameSpacedTransformer(ns, transformer) {\n  if (!transformer) {\n    return nameSpacedTransformer.bind(null, ns);\n  }\n  return (state) => {\n    const newState = transformer(state[ns]);\n\n    // nothing has changed\n    // noop\n    if (!newState || newState === state[ns]) {\n      return null;\n    }\n\n    return { ...state, [ns]: newState };\n  };\n}\n"
  },
  {
    "path": "common/utils/jsonp$.js",
    "content": "import { AnonymousObservable, Disposable } from 'rx';\n\nconst root = typeof window !== 'undefined' ? window : {};\nconst trash = 'document' in root && root.document.createElement('div');\n\nfunction destroy(element) {\n  trash.appendChild(element);\n  trash.innerHTML = '';\n}\n\nexport function jsonp$(options) {\n  let id = 0;\n  if (typeof options === 'string') {\n    options = { url: options };\n  }\n\n  return new AnonymousObservable(function(o) {\n    const settings = Object.assign(\n      {},\n      {\n        jsonp: 'JSONPCallback',\n        async: true,\n        jsonpCallback: 'rxjsjsonpCallbackscallback_' + (id++).toString(36)\n      },\n      options\n    );\n\n    let script = root.document.createElement('script');\n    script.type = 'text/javascript';\n    script.async = settings.async;\n    script.src = settings.url.replace(settings.jsonp, settings.jsonpCallback);\n\n    root[settings.jsonpCallback] = function(data) {\n      root[settings.jsonpCallback].called = true;\n      root[settings.jsonpCallback].data = data;\n    };\n\n    const handler = function(e) {\n      if (e.type === 'load' && !root[settings.jsonpCallback].called) {\n        e = { type: 'error' };\n      }\n      const status = e.type === 'error' ? 400 : 200;\n      const data = root[settings.jsonpCallback].data;\n\n      if (status === 200) {\n        o.onNext({\n          status: status,\n          responseType: 'jsonp',\n          response: data,\n          originalEvent: e\n        });\n\n        o.onCompleted();\n      } else {\n        o.onError({\n          type: 'error',\n          status: status,\n          originalEvent: e\n        });\n      }\n    };\n\n    script.onload = script.onreadystatechanged = script.onerror = handler;\n\n    const head = root.document.getElementsByTagName('head')[0] ||\n      root.document.documentElement;\n\n    head.insertBefore(script, head.firstChild);\n\n    return Disposable.create(() => {\n      script.onload = script.onreadystatechanged = script.onerror = null;\n\n      destroy(script);\n      script = null;\n    });\n  });\n}\n"
  },
  {
    "path": "common/utils/services-creator.js",
    "content": "import { Observable, Disposable } from 'rx';\nimport Fetchr from 'fetchr';\nimport stampit from 'stampit';\n\nfunction callbackObserver(observer) {\n  return (err, res) => {\n    if (err) {\n      return observer.onError(err);\n    }\n\n    observer.onNext(res);\n    return observer.onCompleted();\n  };\n}\n\n\nexport default stampit({\n  init({ args: [ options ] }) {\n    this.services = new Fetchr(options);\n  },\n  methods: {\n    readService$({ service: resource, params, config }) {\n      return Observable.create(observer => {\n        this.services.read(\n          resource,\n          params,\n          config,\n          callbackObserver(observer)\n        );\n\n        return Disposable.create(() => observer.dispose());\n      });\n    },\n    createService$({ service: resource, params, body, config }) {\n      return Observable.create(observer => {\n        this.services.create(\n          resource,\n          params,\n          body,\n          config,\n          callbackObserver(observer)\n        );\n\n        return Disposable.create(() => observer.dispose());\n      });\n    }\n  }\n});\n"
  },
  {
    "path": "config/secrets.js",
    "content": "module.exports = {\n\n  db: process.env.MONGODB || process.env.MONGOHQ_URL,\n\n  sessionSecret: process.env.SESSION_SECRET,\n\n  trello: {\n    key: process.env.TRELLO_KEY,\n    secret: process.env.TRELLO_SECRET\n  },\n\n  blogger: {\n    key: process.env.BLOGGER_KEY\n  },\n\n  mandrill: {\n    user: process.env.MANDRILL_USER,\n    password: process.env.MANDRILL_PASSWORD\n  },\n\n  facebook: {\n    clientID: process.env.FACEBOOK_ID,\n    clientSecret: process.env.FACEBOOK_SECRET,\n    callbackURL: '/auth/facebook/callback',\n    passReqToCallback: true\n  },\n\n  github: {\n    clientID: process.env.GITHUB_ID,\n    clientSecret: process.env.GITHUB_SECRET,\n    callbackURL: '/auth/github/callback',\n    passReqToCallback: true\n  },\n\n  twitter: {\n    consumerKey: process.env.TWITTER_KEY,\n    consumerSecret: process.env.TWITTER_SECRET,\n    token: process.env.TWITTER_TOKEN,\n    tokenSecret: process.env.TWITTER_TOKEN_SECRET,\n    callbackURL: '/auth/twitter/callback',\n    passReqToCallback: true\n  },\n\n  google: {\n    clientID: process.env.GOOGLE_ID,\n    clientSecret: process.env.GOOGLE_SECRET,\n    callbackURL: '/auth/google/callback',\n    passReqToCallback: true\n  },\n\n  linkedin: {\n    clientID: process.env.LINKEDIN_ID,\n    clientSecret: process.env.LINKEDIN_SECRET,\n    callbackURL: '/auth/linkedin/callback',\n    scope: ['r_basicprofile', 'r_emailaddress'],\n    passReqToCallback: true\n  },\n  slackHook: process.env.SLACK_WEBHOOK,\n\n  cookieSecret: process.env.COOKIE_SECRET\n};\n"
  },
  {
    "path": "dataAsync.js",
    "content": "var matchArray = [\n      {\n          \"id\" : \"560add10cb82ac38a17513be\",\n          \"name\" : \"Learn how Free Code Camp Works\",\n          \"challengeType\" : \"7\"\n      },\n      {\n          \"id\" : \"560add37cb82ac38a17513bf\",\n          \"name\" : \"Create a GitHub Account and Join our Chat Rooms\",\n          \"challengeType\" : \"7\"\n      },\n      {\n          \"id\" : \"560add56cb82ac38a17513c0\",\n          \"name\" : \"Configure your Code Portfolio\",\n          \"challengeType\" : \"7\"\n      },\n      {\n          \"id\" : \"560add71cb82ac38a17513c2\",\n          \"name\" : \"Join a Campsite in Your City\",\n          \"challengeType\" : \"7\"\n      },\n      {\n          \"id\" : \"560add8ccb82ac38a17513c4\",\n          \"name\" : \"Learn What to Do If You Get Stuck\",\n          \"challengeType\" : \"7\"\n      },\n      {\n          \"id\" : \"aff0395860f5d3034dc0bfc9\",\n          \"name\" : \"Validate US Telephone Numbers\",\n          \"challengeType\" : \"5\"\n      },\n      {\n          \"id\" : \"56533eb9ac21ba0edf2244cf\",\n          \"name\" : \"Record Collection\",\n          \"challengeType\" : \"5\"\n      },\n      {\n          \"id\" : \"a3f503de51cf954ede28891d\",\n          \"name\" : \"Symmetric Difference\",\n          \"challengeType\" : \"5\"\n      },\n      {\n          \"id\" : \"aa2e6f85cab2ab736c9a9b24\",\n          \"name\" : \"Exact Change\",\n          \"challengeType\" : \"5\"\n      },\n      {\n          \"id\" : \"a56138aff60341a09ed6c480\",\n          \"name\" : \"Inventory Update\",\n          \"challengeType\" : \"5\"\n      },\n      {\n          \"id\" : \"a7bf700cd123b9a54eef01d5\",\n          \"name\" : \"No repeats please\",\n          \"challengeType\" : \"5\"\n      },\n      {\n          \"id\" : \"a19f0fbe1872186acd434d5a\",\n          \"name\" : \"Friendly Date Ranges\",\n          \"challengeType\" : \"5\"\n      },\n      {\n          \"id\" : \"a2f1d72d9b908d0bd72bb9f6\",\n          \"name\" : \"Make a Person\",\n          \"challengeType\" : \"5\"\n      },\n      {\n          \"id\" : \"af4afb223120f7348cdfc9fd\",\n          \"name\" : \"Map the Debris\",\n          \"challengeType\" : \"5\"\n      },\n      {\n          \"id\" : \"a3f503de51cfab748ff001aa\",\n          \"name\" : \"Pairwise\",\n          \"challengeType\" : \"5\"\n      },\n      {\n          \"id\" : \"bd7158d8c442eddfaeb5bd17\",\n          \"name\" : \"Build a JavaScript Calculator\",\n          \"challengeType\" : \"3\"\n      },\n      {\n          \"id\" : \"bd7158d8c442eddfaeb5bd0f\",\n          \"name\" : \"Build a Pomodoro Clock\",\n          \"challengeType\" : \"3\"\n      },\n      {\n          \"id\" : \"bd7158d8c442eedfaeb5bd1c\",\n          \"name\" : \"Build a Tic Tac Toe Game\",\n          \"challengeType\" : \"3\"\n      },\n      {\n          \"id\" : \"bd7158d8c442eddfaeb5bd1c\",\n          \"name\" : \"Build a Simon Game\",\n          \"challengeType\" : \"3\"\n      },\n      {\n          \"id\" : \"bd7158d2c442eddfbeb5bd1f\",\n          \"name\" : \"Get Set for our Algorithm Challenges\",\n          \"challengeType\" : \"7\"\n      },\n      {\n          \"id\" : \"a202eed8fc186c8434cb6d61\",\n          \"name\" : \"Reverse a String\",\n          \"challengeType\" : \"5\"\n      },\n      {\n          \"id\" : \"a302f7aae1aa3152a5b413bc\",\n          \"name\" : \"Factorialize a Number\",\n          \"challengeType\" : \"5\"\n      },\n      {\n          \"id\" : \"aaa48de84e1ecc7c742e1124\",\n          \"name\" : \"Check for Palindromes\",\n          \"challengeType\" : \"5\"\n      },\n      {\n          \"id\" : \"a26cbbe9ad8655a977e1ceb5\",\n          \"name\" : \"Find the Longest Word in a String\",\n          \"challengeType\" : \"5\"\n      },\n      {\n          \"id\" : \"ab6137d4e35944e21037b769\",\n          \"name\" : \"Title Case a Sentence\",\n          \"challengeType\" : \"5\"\n      },\n      {\n          \"id\" : \"a789b3483989747d63b0e427\",\n          \"name\" : \"Return Largest Numbers in Arrays\",\n          \"challengeType\" : \"5\"\n      },\n      {\n          \"id\" : \"acda2fb1324d9b0fa741e6b5\",\n          \"name\" : \"Confirm the Ending\",\n          \"challengeType\" : \"5\"\n      },\n      {\n          \"id\" : \"afcc8d540bea9ea2669306b6\",\n          \"name\" : \"Repeat a string repeat a string\",\n          \"challengeType\" : \"5\"\n      },\n      {\n          \"id\" : \"ac6993d51946422351508a41\",\n          \"name\" : \"Truncate a string\",\n          \"challengeType\" : \"5\"\n      },\n      {\n          \"id\" : \"a9bd25c716030ec90084d8a1\",\n          \"name\" : \"Chunky Monkey\",\n          \"challengeType\" : \"5\"\n      },\n      {\n          \"id\" : \"ab31c21b530c0dafa9e241ee\",\n          \"name\" : \"Slasher Flick\",\n          \"challengeType\" : \"5\"\n      },\n      {\n          \"id\" : \"af2170cad53daa0770fabdea\",\n          \"name\" : \"Mutations\",\n          \"challengeType\" : \"5\"\n      },\n      {\n          \"id\" : \"adf08ec01beb4f99fc7a68f2\",\n          \"name\" : \"Falsy Bouncer\",\n          \"challengeType\" : \"5\"\n      },\n      {\n          \"id\" : \"a39963a4c10bc8b4d4f06d7e\",\n          \"name\" : \"Seek and Destroy\",\n          \"challengeType\" : \"5\"\n      },\n      {\n          \"id\" : \"a24c1a4622e3c05097f71d67\",\n          \"name\" : \"Where do I belong\",\n          \"challengeType\" : \"5\"\n      },\n      {\n          \"id\" : \"56533eb9ac21ba0edf2244e2\",\n          \"name\" : \"Caesars Cipher\",\n          \"challengeType\" : \"5\"\n      },\n      {\n          \"id\" : \"bd7123c9c441eddfaeb4bdef\",\n          \"name\" : \"Comment your JavaScript Code\",\n          \"challengeType\" : \"1\"\n      },\n      {\n          \"id\" : \"bd7123c9c443eddfaeb5bdef\",\n          \"name\" : \"Declare JavaScript Variables\",\n          \"challengeType\" : \"1\"\n      },\n      {\n          \"id\" : \"56533eb9ac21ba0edf2244a8\",\n          \"name\" : \"Storing Values with the Equal Operator\",\n          \"challengeType\" : \"1\"\n      },\n      {\n          \"id\" : \"56533eb9ac21ba0edf2244a9\",\n          \"name\" : \"Initializing Variables with the Equal Operator\",\n          \"challengeType\" : \"1\"\n      },\n      {\n          \"id\" : \"56533eb9ac21ba0edf2244aa\",\n          \"name\" : \"Understanding Uninitialized Variables\",\n          \"challengeType\" : \"1\"\n      },\n      {\n          \"id\" : \"56533eb9ac21ba0edf2244ab\",\n          \"name\" : \"Understanding Case Sensitivity in Variables\",\n          \"challengeType\" : \"1\"\n      },\n      {\n          \"id\" : \"cf1111c1c11feddfaeb3bdef\",\n          \"name\" : \"Add Two Numbers with JavaScript\",\n          \"challengeType\" : \"1\"\n      },\n      {\n          \"id\" : \"cf1111c1c11feddfaeb4bdef\",\n          \"name\" : \"Subtract One Number from Another with JavaScript\",\n          \"challengeType\" : \"1\"\n      },\n      {\n          \"id\" : \"cf1231c1c11feddfaeb5bdef\",\n          \"name\" : \"Multiply Two Numbers with JavaScript\",\n          \"challengeType\" : \"1\"\n      },\n      {\n          \"id\" : \"cf1111c1c11feddfaeb6bdef\",\n          \"name\" : \"Divide One Number by Another with JavaScript\",\n          \"challengeType\" : \"1\"\n      },\n      {\n          \"id\" : \"56533eb9ac21ba0edf2244ac\",\n          \"name\" : \"Increment a Number with JavaScript\",\n          \"challengeType\" : \"1\"\n      },\n      {\n          \"id\" : \"56533eb9ac21ba0edf2244ad\",\n          \"name\" : \"Decrement a Number with JavaScript\",\n          \"challengeType\" : \"1\"\n      },\n      {\n          \"id\" : \"cf1391c1c11feddfaeb4bdef\",\n          \"name\" : \"Create Decimal Numbers with JavaScript\",\n          \"challengeType\" : \"1\"\n      },\n      {\n          \"id\" : \"bd7993c9c69feddfaeb7bdef\",\n          \"name\" : \"Multiply Two Decimals with JavaScript\",\n          \"challengeType\" : \"1\"\n      },\n      {\n          \"id\" : \"bd7993c9ca9feddfaeb7bdef\",\n          \"name\" : \"Divide one Decimal by Another with JavaScript\",\n          \"challengeType\" : \"1\"\n      },\n      {\n          \"id\" : \"56533eb9ac21ba0edf2244ae\",\n          \"name\" : \"Finding a Remainder in JavaScript\",\n          \"challengeType\" : \"1\"\n      },\n      {\n          \"id\" : \"56533eb9ac21ba0edf2244af\",\n          \"name\" : \"Assignment with Plus Equals\",\n          \"challengeType\" : \"1\"\n      },\n      {\n          \"id\" : \"56533eb9ac21ba0edf2244b0\",\n          \"name\" : \"Assignment with Minus Equals\",\n          \"challengeType\" : \"1\"\n      },\n      {\n          \"id\" : \"56533eb9ac21ba0edf2244b1\",\n          \"name\" : \"Assignment with Times Equals\",\n          \"challengeType\" : \"1\"\n      },\n      {\n          \"id\" : \"56533eb9ac21ba0edf2244b2\",\n          \"name\" : \"Assignment with Divided by Equals\",\n          \"challengeType\" : \"1\"\n      },\n      {\n          \"id\" : \"56533eb9ac21ba0edf2244b3\",\n          \"name\" : \"Convert Celsius to Fahrenheit\",\n          \"challengeType\" : \"1\"\n      },\n      {\n          \"id\" : \"bd7123c9c444eddfaeb5bdef\",\n          \"name\" : \"Declare String Variables\",\n          \"challengeType\" : \"1\"\n      },\n      {\n          \"id\" : \"56533eb9ac21ba0edf2244b5\",\n          \"name\" : \"Escaping Literal Quotes in Strings\",\n          \"challengeType\" : \"1\"\n      },\n      {\n          \"id\" : \"56533eb9ac21ba0edf2244b4\",\n          \"name\" : \"Quoting Strings with Single Quotes\",\n          \"challengeType\" : \"1\"\n      },\n      {\n          \"id\" : \"56533eb9ac21ba0edf2244b6\",\n          \"name\" : \"Escape Sequences in Strings\",\n          \"challengeType\" : \"1\"\n      },\n      {\n          \"id\" : \"56533eb9ac21ba0edf2244b7\",\n          \"name\" : \"Concatenating Strings with Plus Operator\",\n          \"challengeType\" : \"1\"\n      },\n      {\n          \"id\" : \"56533eb9ac21ba0edf2244b8\",\n          \"name\" : \"Concatenating Strings with the Plus Equals Operator\",\n          \"challengeType\" : \"1\"\n      },\n      {\n          \"id\" : \"56533eb9ac21ba0edf2244b9\",\n          \"name\" : \"Constructing Strings with Variables\",\n          \"challengeType\" : \"1\"\n      },\n      {\n          \"id\" : \"56533eb9ac21ba0edf2244ed\",\n          \"name\" : \"Appending Variables to Strings\",\n          \"challengeType\" : \"1\"\n      },\n      {\n          \"id\" : \"bd7123c9c448eddfaeb5bdef\",\n          \"name\" : \"Find the Length of a String\",\n          \"challengeType\" : \"1\"\n      },\n      {\n          \"id\" : \"bd7123c9c549eddfaeb5bdef\",\n          \"name\" : \"Use Bracket Notation to Find the First Character in a String\",\n          \"challengeType\" : \"1\"\n      },\n      {\n          \"id\" : \"56533eb9ac21ba0edf2244ba\",\n          \"name\" : \"Understand String Immutability\",\n          \"challengeType\" : \"1\"\n      },\n      {\n          \"id\" : \"bd7123c9c450eddfaeb5bdef\",\n          \"name\" : \"Use Bracket Notation to Find the Nth Character in a String\",\n          \"challengeType\" : \"1\"\n      },\n      {\n          \"id\" : \"bd7123c9c451eddfaeb5bdef\",\n          \"name\" : \"Use Bracket Notation to Find the Last Character in a String\",\n          \"challengeType\" : \"1\"\n      },\n      {\n          \"id\" : \"bd7123c9c452eddfaeb5bdef\",\n          \"name\" : \"Use Bracket Notation to Find the NthtoLast Character in a String\",\n          \"challengeType\" : \"1\"\n      },\n      {\n          \"id\" : \"56533eb9ac21ba0edf2244bb\",\n          \"name\" : \"Word Blanks\",\n          \"challengeType\" : \"1\"\n      },\n      {\n          \"id\" : \"bd7993c9c69feddfaeb8bdef\",\n          \"name\" : \"Store Multiple Values in one Variable using JavaScript Arrays\",\n          \"challengeType\" : \"1\"\n      },\n      {\n          \"id\" : \"cf1111c1c11feddfaeb7bdef\",\n          \"name\" : \"Nest one Array within Another Array\",\n          \"challengeType\" : \"1\"\n      },\n      {\n          \"id\" : \"56bbb991ad1ed5201cd392ca\",\n          \"name\" : \"Access Array Data with Indexes\",\n          \"challengeType\" : \"1\"\n      },\n      {\n          \"id\" : \"cf1111c1c11feddfaeb8bdef\",\n          \"name\" : \"Modify Array Data With Indexes\",\n          \"challengeType\" : \"1\"\n      },\n      {\n          \"id\" : \"56592a60ddddeae28f7aa8e1\",\n          \"name\" : \"Access MultiDimensional Arrays With Indexes\",\n          \"challengeType\" : \"1\"\n      },\n      {\n          \"id\" : \"56bbb991ad1ed5201cd392cb\",\n          \"name\" : \"Manipulate Arrays With push\",\n          \"challengeType\" : \"1\"\n      },\n      {\n          \"id\" : \"56bbb991ad1ed5201cd392cc\",\n          \"name\" : \"Manipulate Arrays With pop\",\n          \"challengeType\" : \"1\"\n      },\n      {\n          \"id\" : \"56bbb991ad1ed5201cd392cd\",\n          \"name\" : \"Manipulate Arrays With shift\",\n          \"challengeType\" : \"1\"\n      },\n      {\n          \"id\" : \"56bbb991ad1ed5201cd392ce\",\n          \"name\" : \"Manipulate Arrays With unshift\",\n          \"challengeType\" : \"1\"\n      },\n      {\n          \"id\" : \"56533eb9ac21ba0edf2244bc\",\n          \"name\" : \"Shopping List\",\n          \"challengeType\" : \"1\"\n      },\n      {\n          \"id\" : \"56bbb991ad1ed5201cd392cf\",\n          \"name\" : \"Write Reusable JavaScript with Functions\",\n          \"challengeType\" : \"1\"\n      },\n      {\n          \"id\" : \"56533eb9ac21ba0edf2244bd\",\n          \"name\" : \"Passing Values to Functions with Arguments\",\n          \"challengeType\" : \"1\"\n      },\n      {\n          \"id\" : \"56533eb9ac21ba0edf2244be\",\n          \"name\" : \"Global Scope and Functions\",\n          \"challengeType\" : \"1\"\n      },\n      {\n          \"id\" : \"56533eb9ac21ba0edf2244bf\",\n          \"name\" : \"Local Scope and Functions\",\n          \"challengeType\" : \"1\"\n      },\n      {\n          \"id\" : \"56533eb9ac21ba0edf2244c0\",\n          \"name\" : \"Global vs Local Scope in Functions\",\n          \"challengeType\" : \"1\"\n      },\n      {\n          \"id\" : \"56533eb9ac21ba0edf2244c2\",\n          \"name\" : \"Return a Value from a Function with Return\",\n          \"challengeType\" : \"1\"\n      },\n      {\n          \"id\" : \"56533eb9ac21ba0edf2244c3\",\n          \"name\" : \"Assignment with a Returned Value\",\n          \"challengeType\" : \"1\"\n      },\n      {\n          \"id\" : \"56533eb9ac21ba0edf2244c6\",\n          \"name\" : \"Stand in Line\",\n          \"challengeType\" : \"1\"\n      },\n      {\n          \"id\" : \"bd7123c9c441eddfaeb5bdef\",\n          \"name\" : \"Understanding Boolean Values\",\n          \"challengeType\" : \"1\"\n      },\n      {\n          \"id\" : \"cf1111c1c12feddfaeb3bdef\",\n          \"name\" : \"Use Conditional Logic with If Statements\",\n          \"challengeType\" : \"1\"\n      },\n      {\n          \"id\" : \"56533eb9ac21ba0edf2244d0\",\n          \"name\" : \"Comparison with the Equality Operator\",\n          \"challengeType\" : \"1\"\n      },\n      {\n          \"id\" : \"56533eb9ac21ba0edf2244d1\",\n          \"name\" : \"Comparison with the Strict Equality Operator\",\n          \"challengeType\" : \"1\"\n      },\n      {\n          \"id\" : \"56533eb9ac21ba0edf2244d2\",\n          \"name\" : \"Comparison with the Inequality Operator\",\n          \"challengeType\" : \"1\"\n      },\n      {\n          \"id\" : \"56533eb9ac21ba0edf2244d3\",\n          \"name\" : \"Comparison with the Strict Inequality Operator\",\n          \"challengeType\" : \"1\"\n      },\n      {\n          \"id\" : \"56533eb9ac21ba0edf2244d4\",\n          \"name\" : \"Comparison with the Greater Than Operator\",\n          \"challengeType\" : \"1\"\n      },\n      {\n          \"id\" : \"56533eb9ac21ba0edf2244d5\",\n          \"name\" : \"Comparison with the Greater Than Or Equal To Operator\",\n          \"challengeType\" : \"1\"\n      },\n      {\n          \"id\" : \"56533eb9ac21ba0edf2244d6\",\n          \"name\" : \"Comparison with the Less Than Operator\",\n          \"challengeType\" : \"1\"\n      },\n      {\n          \"id\" : \"56533eb9ac21ba0edf2244d7\",\n          \"name\" : \"Comparison with the Less Than Or Equal To Operator\",\n          \"challengeType\" : \"1\"\n      },\n      {\n          \"id\" : \"56533eb9ac21ba0edf2244d8\",\n          \"name\" : \"Comparisons with the Logical And Operator\",\n          \"challengeType\" : \"1\"\n      },\n      {\n          \"id\" : \"56533eb9ac21ba0edf2244d9\",\n          \"name\" : \"Comparisons with the Logical Or Operator\",\n          \"challengeType\" : \"1\"\n      },\n      {\n          \"id\" : \"56533eb9ac21ba0edf2244da\",\n          \"name\" : \"Introducing Else Statements\",\n          \"challengeType\" : \"1\"\n      },\n      {\n          \"id\" : \"56533eb9ac21ba0edf2244db\",\n          \"name\" : \"Introducing Else If Statements\",\n          \"challengeType\" : \"1\"\n      },\n      {\n          \"id\" : \"5690307fddb111c6084545d7\",\n          \"name\" : \"Logical Order in If Else Statements\",\n          \"challengeType\" : \"1\"\n      },\n      {\n          \"id\" : \"56533eb9ac21ba0edf2244dc\",\n          \"name\" : \"Chaining If Else Statements\",\n          \"challengeType\" : \"1\"\n      },\n      {\n          \"id\" : \"5664820f61c48e80c9fa476c\",\n          \"name\" : \"Golf Code\",\n          \"challengeType\" : \"1\"\n      },\n      {\n          \"id\" : \"56533eb9ac21ba0edf2244dd\",\n          \"name\" : \"Selecting from many options with Switch Statements\",\n          \"challengeType\" : \"1\"\n      },\n      {\n          \"id\" : \"56533eb9ac21ba0edf2244de\",\n          \"name\" : \"Adding a default option in Switch statements\",\n          \"challengeType\" : \"1\"\n      },\n      {\n          \"id\" : \"56533eb9ac21ba0edf2244df\",\n          \"name\" : \"Multiple Identical Options in Switch Statements\",\n          \"challengeType\" : \"1\"\n      },\n      {\n          \"id\" : \"56533eb9ac21ba0edf2244e0\",\n          \"name\" : \"Replacing If Else Chains with Switch\",\n          \"challengeType\" : \"1\"\n      },\n      {\n          \"id\" : \"5679ceb97cbaa8c51670a16b\",\n          \"name\" : \"Returning Boolean Values from Functions\",\n          \"challengeType\" : \"1\"\n      },\n      {\n          \"id\" : \"56533eb9ac21ba0edf2244c4\",\n          \"name\" : \"Return Early Pattern for Functions\",\n          \"challengeType\" : \"1\"\n      },\n      {\n          \"id\" : \"565bbe00e9cc8ac0725390f4\",\n          \"name\" : \"Counting Cards\",\n          \"challengeType\" : \"1\"\n      },\n      {\n          \"id\" : \"56bbb991ad1ed5201cd392d0\",\n          \"name\" : \"Build JavaScript Objects\",\n          \"challengeType\" : \"1\"\n      },\n      {\n          \"id\" : \"56533eb9ac21ba0edf2244c7\",\n          \"name\" : \"Accessing Objects Properties with the Dot Operator\",\n          \"challengeType\" : \"1\"\n      },\n      {\n          \"id\" : \"56533eb9ac21ba0edf2244c8\",\n          \"name\" : \"Accessing Objects Properties with Bracket Notation\",\n          \"challengeType\" : \"1\"\n      },\n      {\n          \"id\" : \"56533eb9ac21ba0edf2244c9\",\n          \"name\" : \"Accessing Objects Properties with Variables\",\n          \"challengeType\" : \"1\"\n      },\n      {\n          \"id\" : \"56bbb991ad1ed5201cd392d1\",\n          \"name\" : \"Updating Object Properties\",\n          \"challengeType\" : \"1\"\n      },\n      {\n          \"id\" : \"56bbb991ad1ed5201cd392d2\",\n          \"name\" : \"Add New Properties to a JavaScript Object\",\n          \"challengeType\" : \"1\"\n      },\n      {\n          \"id\" : \"56bbb991ad1ed5201cd392d3\",\n          \"name\" : \"Delete Properties from a JavaScript Object\",\n          \"challengeType\" : \"1\"\n      },\n      {\n          \"id\" : \"56533eb9ac21ba0edf2244ca\",\n          \"name\" : \"Using Objects for Lookups\",\n          \"challengeType\" : \"1\"\n      },\n      {\n          \"id\" : \"567af2437cbaa8c51670a16c\",\n          \"name\" : \"Testing Objects for Properties\",\n          \"challengeType\" : \"1\"\n      },\n      {\n          \"id\" : \"56533eb9ac21ba0edf2244cb\",\n          \"name\" : \"Introducing JavaScript Object Notation JSON\",\n          \"challengeType\" : \"1\"\n      },\n      {\n          \"id\" : \"56533eb9ac21ba0edf2244cc\",\n          \"name\" : \"Accessing Nested Objects in JSON\",\n          \"challengeType\" : \"1\"\n      },\n      {\n          \"id\" : \"56533eb9ac21ba0edf2244cd\",\n          \"name\" : \"Accessing Nested Arrays in JSON\",\n          \"challengeType\" : \"1\"\n      },\n      {\n          \"id\" : \"cf1111c1c11feddfaeb5bdef\",\n          \"name\" : \"Iterate with JavaScript For Loops\",\n          \"challengeType\" : \"1\"\n      },\n      {\n          \"id\" : \"56104e9e514f539506016a5c\",\n          \"name\" : \"Iterate Odd Numbers With a For Loop\",\n          \"challengeType\" : \"1\"\n      },\n      {\n          \"id\" : \"56105e7b514f539506016a5e\",\n          \"name\" : \"Count Backwards With a For Loop\",\n          \"challengeType\" : \"1\"\n      },\n      {\n          \"id\" : \"5675e877dbd60be8ad28edc6\",\n          \"name\" : \"Iterate Through an Array with a For Loop\",\n          \"challengeType\" : \"1\"\n      },\n      {\n          \"id\" : \"56533eb9ac21ba0edf2244e1\",\n          \"name\" : \"Nesting For Loops\",\n          \"challengeType\" : \"1\"\n      },\n      {\n          \"id\" : \"cf1111c1c11feddfaeb1bdef\",\n          \"name\" : \"Iterate with JavaScript While Loops\",\n          \"challengeType\" : \"1\"\n      },\n      {\n          \"id\" : \"5688e62ea601b2482ff8422b\",\n          \"name\" : \"Profile Lookup\",\n          \"challengeType\" : \"1\"\n      },\n      {\n          \"id\" : \"cf1111c1c11feddfaeb9bdef\",\n          \"name\" : \"Generate Random Fractions with JavaScript\",\n          \"challengeType\" : \"1\"\n      },\n      {\n          \"id\" : \"cf1111c1c12feddfaeb1bdef\",\n          \"name\" : \"Generate Random Whole Numbers with JavaScript\",\n          \"challengeType\" : \"1\"\n      },\n      {\n          \"id\" : \"cf1111c1c12feddfaeb2bdef\",\n          \"name\" : \"Generate Random Whole Numbers within a Range\",\n          \"challengeType\" : \"1\"\n      },\n      {\n          \"id\" : \"cf1111c1c12feddfaeb6bdef\",\n          \"name\" : \"Sift through Text with Regular Expressions\",\n          \"challengeType\" : \"1\"\n      },\n      {\n          \"id\" : \"cf1111c1c12feddfaeb7bdef\",\n          \"name\" : \"Find Numbers with Regular Expressions\",\n          \"challengeType\" : \"1\"\n      },\n      {\n          \"id\" : \"cf1111c1c12feddfaeb8bdef\",\n          \"name\" : \"Find Whitespace with Regular Expressions\",\n          \"challengeType\" : \"1\"\n      },\n      {\n          \"id\" : \"cf1111c1c13feddfaeb3bdef\",\n          \"name\" : \"Invert Regular Expression Matches with JavaScript\",\n          \"challengeType\" : \"1\"\n      },\n      {\n          \"id\" : \"cf1111c1c12feddfaeb9bdef\",\n          \"name\" : \"Create a JavaScript Slot Machine\",\n          \"challengeType\" : \"0\"\n      },\n      {\n          \"id\" : \"cf1111c1c13feddfaeb1bdef\",\n          \"name\" : \"Add your JavaScript Slot Machine Slots\",\n          \"challengeType\" : \"0\"\n      },\n      {\n          \"id\" : \"cf1111c1c13feddfaeb2bdef\",\n          \"name\" : \"Bring your JavaScript Slot Machine to Life\",\n          \"challengeType\" : \"0\"\n      },\n      {\n          \"id\" : \"cf1111c1c11feddfaeb1bdff\",\n          \"name\" : \"Give your JavaScript Slot Machine some Stylish Images\",\n          \"challengeType\" : \"0\"\n      },\n      {\n          \"id\" : \"bd7158d8c442eddfbeb5bd1f\",\n          \"name\" : \"Get Set for our Front End Development Projects\",\n          \"challengeType\" : \"7\"\n      },\n      {\n          \"id\" : \"bd7158d8c442eddfaeb5bd18\",\n          \"name\" : \"Build a Tribute Page\",\n          \"challengeType\" : \"3\"\n      },\n      {\n          \"id\" : \"bd7158d8c242eddfaeb5bd13\",\n          \"name\" : \"Build a Personal Portfolio Webpage\",\n          \"challengeType\" : \"3\"\n      },\n      {\n          \"id\" : \"bad87fee1348bd9acde08712\",\n          \"name\" : \"Use Responsive Design with Bootstrap Fluid Containers\",\n          \"challengeType\" : \"0\"\n      },\n      {\n          \"id\" : \"bad87fee1348bd9acde08812\",\n          \"name\" : \"Make Images Mobile Responsive\",\n          \"challengeType\" : \"0\"\n      },\n      {\n          \"id\" : \"bad87fee1348bd8acde08812\",\n          \"name\" : \"Center Text with Bootstrap\",\n          \"challengeType\" : \"0\"\n      },\n      {\n          \"id\" : \"bad87fee1348cd8acdf08812\",\n          \"name\" : \"Create a Bootstrap Button\",\n          \"challengeType\" : \"0\"\n      },\n      {\n          \"id\" : \"bad87fee1348cd8acef08812\",\n          \"name\" : \"Create a Block Element Bootstrap Button\",\n          \"challengeType\" : \"0\"\n      },\n      {\n          \"id\" : \"bad87fee1348cd8acef08811\",\n          \"name\" : \"Taste the Bootstrap Button Color Rainbow\",\n          \"challengeType\" : \"0\"\n      },\n      {\n          \"id\" : \"bad87fee1348cd8acef08813\",\n          \"name\" : \"Call out Optional Actions with Button Info\",\n          \"challengeType\" : \"0\"\n      },\n      {\n          \"id\" : \"bad87fee1348ce8acef08814\",\n          \"name\" : \"Warn your Users of a Dangerous Action\",\n          \"challengeType\" : \"0\"\n      },\n      {\n          \"id\" : \"bad88fee1348ce8acef08815\",\n          \"name\" : \"Use the Bootstrap Grid to Put Elements Side By Side\",\n          \"challengeType\" : \"0\"\n      },\n      {\n          \"id\" : \"bad87fee1347bd9aedf08845\",\n          \"name\" : \"Ditch Custom CSS for Bootstrap\",\n          \"challengeType\" : \"0\"\n      },\n      {\n          \"id\" : \"bad87fee1348bd9aedf08845\",\n          \"name\" : \"Use Spans for Inline Elements\",\n          \"challengeType\" : \"0\"\n      },\n      {\n          \"id\" : \"bad87fee1348bd9aede08845\",\n          \"name\" : \"Create a Custom Heading\",\n          \"challengeType\" : \"0\"\n      },\n      {\n          \"id\" : \"bad87fee1348bd9aedd08845\",\n          \"name\" : \"Add Font Awesome Icons to our Buttons\",\n          \"challengeType\" : \"0\"\n      },\n      {\n          \"id\" : \"bad87fee1348bd9aedc08845\",\n          \"name\" : \"Add Font Awesome Icons to all of our Buttons\",\n          \"challengeType\" : \"0\"\n      },\n      {\n          \"id\" : \"bad87fee1348bd9aedb08845\",\n          \"name\" : \"Responsively Style Radio Buttons\",\n          \"challengeType\" : \"0\"\n      },\n      {\n          \"id\" : \"bad87fee1348bd9aeda08845\",\n          \"name\" : \"Responsively Style Checkboxes\",\n          \"challengeType\" : \"0\"\n      },\n      {\n          \"id\" : \"bad87fee1348bd9aed908845\",\n          \"name\" : \"Style Text Inputs as Form Controls\",\n          \"challengeType\" : \"0\"\n      },\n      {\n          \"id\" : \"bad87fee1348bd9aec908845\",\n          \"name\" : \"Line up Form Elements Responsively with Bootstrap\",\n          \"challengeType\" : \"0\"\n      },\n      {\n          \"id\" : \"bad87fee1348bd9aec908846\",\n          \"name\" : \"Create a Bootstrap Headline\",\n          \"challengeType\" : \"0\"\n      },\n      {\n          \"id\" : \"bad87fee1348bd9aec908746\",\n          \"name\" : \"House our page within a Bootstrap Container Fluid Div\",\n          \"challengeType\" : \"0\"\n      },\n      {\n          \"id\" : \"bad87fee1348bd9bec908846\",\n          \"name\" : \"Create a Bootstrap Row\",\n          \"challengeType\" : \"0\"\n      },\n      {\n          \"id\" : \"bad87fee1348bd9aec908847\",\n          \"name\" : \"Split your Bootstrap Row\",\n          \"challengeType\" : \"0\"\n      },\n      {\n          \"id\" : \"bad87fee1348bd9aec908848\",\n          \"name\" : \"Create Bootstrap Wells\",\n          \"challengeType\" : \"0\"\n      },\n      {\n          \"id\" : \"bad87fee1348bd9aec908849\",\n          \"name\" : \"Add Elements within your Bootstrap Wells\",\n          \"challengeType\" : \"0\"\n      },\n      {\n          \"id\" : \"bad87fee1348bd9aec908850\",\n          \"name\" : \"Apply the Default Bootstrap Button Style\",\n          \"challengeType\" : \"0\"\n      },\n      {\n          \"id\" : \"bad87fee1348bd9aec908852\",\n          \"name\" : \"Create a Class to Target with jQuery Selectors\",\n          \"challengeType\" : \"0\"\n      },\n      {\n          \"id\" : \"bad87fee1348bd9aec908853\",\n          \"name\" : \"Add ID Attributes to Bootstrap Elements\",\n          \"challengeType\" : \"0\"\n      },\n      {\n          \"id\" : \"bad87fee1348bd9aec908854\",\n          \"name\" : \"Label Bootstrap Wells\",\n          \"challengeType\" : \"0\"\n      },\n      {\n          \"id\" : \"bad87fee1348bd9aec908855\",\n          \"name\" : \"Give Each Element a Unique ID\",\n          \"challengeType\" : \"0\"\n      },\n      {\n          \"id\" : \"bad87fee1348bd9aec908856\",\n          \"name\" : \"Label Bootstrap Buttons\",\n          \"challengeType\" : \"0\"\n      },\n      {\n          \"id\" : \"bad87fee1348bd9aec908857\",\n          \"name\" : \"Use Comments to Clarify Code\",\n          \"challengeType\" : \"0\"\n      },\n      {\n          \"id\" : \"561add10cb82ac38a17513be\",\n          \"name\" : \"Claim Your Front End Development Certificate\",\n          \"challengeType\" : \"7\"\n      },\n      {\n          \"id\" : \"570add8ccb82ac38a17513c3\",\n          \"name\" : \"Join our LinkedIn Alumni Network\",\n          \"challengeType\" : \"7\"\n      },\n      {\n          \"id\" : \"560adc65cb82ac38a17513c2\",\n          \"name\" : \"Join our Subreddit\",\n          \"challengeType\" : \"7\"\n      },\n      {\n          \"id\" : \"560adf65cb82ac38a17513c2\",\n          \"name\" : \"Read Coding News on our Medium Publication\",\n          \"challengeType\" : \"7\"\n      },\n      {\n          \"id\" : \"560ade65cb82ac38a17513c2\",\n          \"name\" : \"Watch us Code Live on Twitchtv\",\n          \"challengeType\" : \"7\"\n      },\n      {\n          \"id\" : \"560add8ccb81ac38a17513c4\",\n          \"name\" : \"Commit to a Goal and a Nonprofit\",\n          \"challengeType\" : \"7\"\n      },\n      {\n          \"id\" : \"bd7123c8c441eddfaeb5bdef\",\n          \"name\" : \"Say Hello to HTML Element\",\n          \"challengeType\" : \"0\"\n      },\n      {\n          \"id\" : \"bad87fee1348bd9aedf0887a\",\n          \"name\" : \"Headline with the h2 Element\",\n          \"challengeType\" : \"0\"\n      },\n      {\n          \"id\" : \"bad87fee1348bd9aedf08801\",\n          \"name\" : \"Inform with the Paragraph Element\",\n          \"challengeType\" : \"0\"\n      },\n      {\n          \"id\" : \"bad87fee1348bd9aedf08804\",\n          \"name\" : \"Comment out HTML\",\n          \"challengeType\" : \"0\"\n      },\n      {\n          \"id\" : \"bad87fed1348bd9aedf08833\",\n          \"name\" : \"Delete HTML Elements\",\n          \"challengeType\" : \"0\"\n      },\n      {\n          \"id\" : \"bad87fee1348bd9aedf08803\",\n          \"name\" : \"Change the Color of Text\",\n          \"challengeType\" : \"0\"\n      },\n      {\n          \"id\" : \"bad87fee1348bd9aedf08802\",\n          \"name\" : \"Uncomment HTML\",\n          \"challengeType\" : \"0\"\n      },\n      {\n          \"id\" : \"bad87fee1348bd9aedf08833\",\n          \"name\" : \"Fill in the Blank with Placeholder Text\",\n          \"challengeType\" : \"0\"\n      },\n      {\n          \"id\" : \"bad87fee1348bd9aedf08805\",\n          \"name\" : \"Use CSS Selectors to Style Elements\",\n          \"challengeType\" : \"0\"\n      },\n      {\n          \"id\" : \"bad87fee1348bd9aecf08806\",\n          \"name\" : \"Use a CSS Class to Style an Element\",\n          \"challengeType\" : \"0\"\n      },\n      {\n          \"id\" : \"bad87fee1348bd9aefe08806\",\n          \"name\" : \"Style Multiple Elements with a CSS Class\",\n          \"challengeType\" : \"0\"\n      },\n      {\n          \"id\" : \"bad87fee1348bd9aedf08806\",\n          \"name\" : \"Change the Font Size of an Element\",\n          \"challengeType\" : \"0\"\n      },\n      {\n          \"id\" : \"bad87fee1348bd9aede08807\",\n          \"name\" : \"Set the Font Family of an Element\",\n          \"challengeType\" : \"0\"\n      },\n      {\n          \"id\" : \"bad87fee1348bd9aedf08807\",\n          \"name\" : \"Import a Google Font\",\n          \"challengeType\" : \"0\"\n      },\n      {\n          \"id\" : \"bad87fee1348bd9aedf08808\",\n          \"name\" : \"Specify How Fonts Should Degrade\",\n          \"challengeType\" : \"0\"\n      },\n      {\n          \"id\" : \"bad87fee1348bd9aedf08812\",\n          \"name\" : \"Add Images to your Website\",\n          \"challengeType\" : \"0\"\n      },\n      {\n          \"id\" : \"bad87fee1348bd9acdf08812\",\n          \"name\" : \"Size your Images\",\n          \"challengeType\" : \"0\"\n      },\n      {\n          \"id\" : \"bad87fee1348bd9bedf08813\",\n          \"name\" : \"Add Borders Around your Elements\",\n          \"challengeType\" : \"0\"\n      },\n      {\n          \"id\" : \"bad87fee1348bd9aedf08814\",\n          \"name\" : \"Add Rounded Corners with a Border Radius\",\n          \"challengeType\" : \"0\"\n      },\n      {\n          \"id\" : \"bad87fee1348bd9aedf08815\",\n          \"name\" : \"Make Circular Images with a Border Radius\",\n          \"challengeType\" : \"0\"\n      },\n      {\n          \"id\" : \"bad87fee1348bd9aedf08816\",\n          \"name\" : \"Link to External Pages with Anchor Elements\",\n          \"challengeType\" : \"0\"\n      },\n      {\n          \"id\" : \"bad87fee1348bd9aede08817\",\n          \"name\" : \"Nest an Anchor Element within a Paragraph\",\n          \"challengeType\" : \"0\"\n      },\n      {\n          \"id\" : \"bad87fee1348bd9aedf08817\",\n          \"name\" : \"Make Dead Links using the Hash Symbol\",\n          \"challengeType\" : \"0\"\n      },\n      {\n          \"id\" : \"bad87fee1348bd9aedf08820\",\n          \"name\" : \"Turn an Image into a Link\",\n          \"challengeType\" : \"0\"\n      },\n      {\n          \"id\" : \"bad87fee1348bd9aedf08818\",\n          \"name\" : \"Add Alt Text to an Image for Accessibility\",\n          \"challengeType\" : \"0\"\n      },\n      {\n          \"id\" : \"bad87fee1348bd9aedf08827\",\n          \"name\" : \"Create a Bulleted Unordered List\",\n          \"challengeType\" : \"0\"\n      },\n      {\n          \"id\" : \"bad87fee1348bd9aedf08828\",\n          \"name\" : \"Create an Ordered List\",\n          \"challengeType\" : \"0\"\n      },\n      {\n          \"id\" : \"bad87fee1348bd9aedf08829\",\n          \"name\" : \"Create a Text Field\",\n          \"challengeType\" : \"0\"\n      },\n      {\n          \"id\" : \"bad87fee1348bd9aedf08830\",\n          \"name\" : \"Add Placeholder Text to a Text Field\",\n          \"challengeType\" : \"0\"\n      },\n      {\n          \"id\" : \"bad87fee1348bd9aede08830\",\n          \"name\" : \"Create a Form Element\",\n          \"challengeType\" : \"0\"\n      },\n      {\n          \"id\" : \"bad87fee1348bd9aedd08830\",\n          \"name\" : \"Add a Submit Button to a Form\",\n          \"challengeType\" : \"0\"\n      },\n      {\n          \"id\" : \"bad87fee1348bd9aedc08830\",\n          \"name\" : \"Use HTML5 to Require a Field\",\n          \"challengeType\" : \"0\"\n      },\n      {\n          \"id\" : \"bad87fee1348bd9aedf08834\",\n          \"name\" : \"Create a Set of Radio Buttons\",\n          \"challengeType\" : \"0\"\n      },\n      {\n          \"id\" : \"bad87fee1348bd9aedf08835\",\n          \"name\" : \"Create a Set of Checkboxes\",\n          \"challengeType\" : \"0\"\n      },\n      {\n          \"id\" : \"bad87fee1348bd9aedd08835\",\n          \"name\" : \"Check Radio Buttons and Checkboxes by Default\",\n          \"challengeType\" : \"0\"\n      },\n      {\n          \"id\" : \"bad87fee1348bd9aede08835\",\n          \"name\" : \"Nest Many Elements within a Single Div Element\",\n          \"challengeType\" : \"0\"\n      },\n      {\n          \"id\" : \"bad87fed1348bd9aede07836\",\n          \"name\" : \"Give a Background Color to a Div Element\",\n          \"challengeType\" : \"0\"\n      },\n      {\n          \"id\" : \"bad87eee1348bd9aede07836\",\n          \"name\" : \"Set the ID of an Element\",\n          \"challengeType\" : \"0\"\n      },\n      {\n          \"id\" : \"bad87dee1348bd9aede07836\",\n          \"name\" : \"Use an ID Attribute to Style an Element\",\n          \"challengeType\" : \"0\"\n      },\n      {\n          \"id\" : \"bad88fee1348bd9aedf08825\",\n          \"name\" : \"Adjusting the Padding of an Element\",\n          \"challengeType\" : \"0\"\n      },\n      {\n          \"id\" : \"bad87fee1348bd9aedf08822\",\n          \"name\" : \"Adjust the Margin of an Element\",\n          \"challengeType\" : \"0\"\n      },\n      {\n          \"id\" : \"bad87fee1348bd9aedf08823\",\n          \"name\" : \"Add a Negative Margin to an Element\",\n          \"challengeType\" : \"0\"\n      },\n      {\n          \"id\" : \"bad87fee1348bd9aedf08824\",\n          \"name\" : \"Add Different Padding to Each Side of an Element\",\n          \"challengeType\" : \"0\"\n      },\n      {\n          \"id\" : \"bad87fee1248bd9aedf08824\",\n          \"name\" : \"Add Different Margins to Each Side of an Element\",\n          \"challengeType\" : \"0\"\n      },\n      {\n          \"id\" : \"bad87fee1348bd9aedf08826\",\n          \"name\" : \"Use Clockwise Notation to Specify the Padding of an Element\",\n          \"challengeType\" : \"0\"\n      },\n      {\n          \"id\" : \"bad87fee1348bd9afdf08726\",\n          \"name\" : \"Use Clockwise Notation to Specify the Margin of an Element\",\n          \"challengeType\" : \"0\"\n      },\n      {\n          \"id\" : \"bad87fee1348bd9aedf08736\",\n          \"name\" : \"Style the HTML Body Element\",\n          \"challengeType\" : \"0\"\n      },\n      {\n          \"id\" : \"bad87fee1348bd9aedf08746\",\n          \"name\" : \"Inherit Styles from the Body Element\",\n          \"challengeType\" : \"0\"\n      },\n      {\n          \"id\" : \"bad87fee1348bd9aedf08756\",\n          \"name\" : \"Prioritize One Style Over Another\",\n          \"challengeType\" : \"0\"\n      },\n      {\n          \"id\" : \"bad87fee1348bd9aedf04756\",\n          \"name\" : \"Override Styles in Subsequent CSS\",\n          \"challengeType\" : \"0\"\n      },\n      {\n          \"id\" : \"bad87fee1348bd8aedf06756\",\n          \"name\" : \"Override Class Declarations by Styling ID Attributes\",\n          \"challengeType\" : \"0\"\n      },\n      {\n          \"id\" : \"bad87fee1348bd9aedf06756\",\n          \"name\" : \"Override Class Declarations with Inline Styles\",\n          \"challengeType\" : \"0\"\n      },\n      {\n          \"id\" : \"bad87fee1348bd9aedf07756\",\n          \"name\" : \"Override All Other Styles by using Important\",\n          \"challengeType\" : \"0\"\n      },\n      {\n          \"id\" : \"bad87fee1348bd9aedf08726\",\n          \"name\" : \"Use Hex Code for Specific Colors\",\n          \"challengeType\" : \"0\"\n      },\n      {\n          \"id\" : \"bad87fee1348bd9aedf08725\",\n          \"name\" : \"Use Hex Code to Color Elements White\",\n          \"challengeType\" : \"0\"\n      },\n      {\n          \"id\" : \"bad87fee1348bd9aedf08724\",\n          \"name\" : \"Use Hex Code to Color Elements Red\",\n          \"challengeType\" : \"0\"\n      },\n      {\n          \"id\" : \"bad87fee1348bd9aedf08723\",\n          \"name\" : \"Use Hex Code to Color Elements Green\",\n          \"challengeType\" : \"0\"\n      },\n      {\n          \"id\" : \"bad87fee1348bd9aedf08722\",\n          \"name\" : \"Use Hex Code to Color Elements Blue\",\n          \"challengeType\" : \"0\"\n      },\n      {\n          \"id\" : \"bad87fee1348bd9aedf08721\",\n          \"name\" : \"Use Hex Code to Mix Colors\",\n          \"challengeType\" : \"0\"\n      },\n      {\n          \"id\" : \"bad87fee1348bd9aede08720\",\n          \"name\" : \"Use Hex Code to Color Elements Gray\",\n          \"challengeType\" : \"0\"\n      },\n      {\n          \"id\" : \"bad87fee1348bd9aedf08720\",\n          \"name\" : \"Use Hex Code for Specific Shades of Gray\",\n          \"challengeType\" : \"0\"\n      },\n      {\n          \"id\" : \"bad87fee1348bd9aedf08719\",\n          \"name\" : \"Use Abbreviated Hex Code\",\n          \"challengeType\" : \"0\"\n      },\n      {\n          \"id\" : \"bad87fee1348bd9aede08718\",\n          \"name\" : \"Use RGB values to Color Elements\",\n          \"challengeType\" : \"0\"\n      },\n      {\n          \"id\" : \"bad88fee1348bd9aedf08726\",\n          \"name\" : \"Use RGB to Color Elements White\",\n          \"challengeType\" : \"0\"\n      },\n      {\n          \"id\" : \"bad89fee1348bd9aedf08724\",\n          \"name\" : \"Use RGB to Color Elements Red\",\n          \"challengeType\" : \"0\"\n      },\n      {\n          \"id\" : \"bad80fee1348bd9aedf08723\",\n          \"name\" : \"Use RGB to Color Elements Green\",\n          \"challengeType\" : \"0\"\n      },\n      {\n          \"id\" : \"bad81fee1348bd9aedf08722\",\n          \"name\" : \"Use RGB to Color Elements Blue\",\n          \"challengeType\" : \"0\"\n      },\n      {\n          \"id\" : \"bad82fee1348bd9aedf08721\",\n          \"name\" : \"Use RGB to Mix Colors\",\n          \"challengeType\" : \"0\"\n      },\n      {\n          \"id\" : \"a3566b1109230028080c9345\",\n          \"name\" : \"Sum All Numbers in a Range\",\n          \"challengeType\" : \"5\"\n      },\n      {\n          \"id\" : \"a5de63ebea8dbee56860f4f2\",\n          \"name\" : \"Diff Two Arrays\",\n          \"challengeType\" : \"5\"\n      },\n      {\n          \"id\" : \"a7f4d8f2483413a6ce226cac\",\n          \"name\" : \"Roman Numeral Converter\",\n          \"challengeType\" : \"5\"\n      },\n      {\n          \"id\" : \"a8e512fbe388ac2f9198f0fa\",\n          \"name\" : \"Wherefore art thou\",\n          \"challengeType\" : \"5\"\n      },\n      {\n          \"id\" : \"a0b5010f579e69b815e7c5d6\",\n          \"name\" : \"Search and Replace\",\n          \"challengeType\" : \"5\"\n      },\n      {\n          \"id\" : \"aa7697ea2477d1316795783b\",\n          \"name\" : \"Pig Latin\",\n          \"challengeType\" : \"5\"\n      },\n      {\n          \"id\" : \"afd15382cdfb22c9efe8b7de\",\n          \"name\" : \"DNA Pairing\",\n          \"challengeType\" : \"5\"\n      },\n      {\n          \"id\" : \"af7588ade1100bde429baf20\",\n          \"name\" : \"Missing letters\",\n          \"challengeType\" : \"5\"\n      },\n      {\n          \"id\" : \"a77dbc43c33f39daa4429b4f\",\n          \"name\" : \"Boo who\",\n          \"challengeType\" : \"5\"\n      },\n      {\n          \"id\" : \"a105e963526e7de52b219be9\",\n          \"name\" : \"Sorted Union\",\n          \"challengeType\" : \"5\"\n      },\n      {\n          \"id\" : \"a6b0bb188d873cb2c8729495\",\n          \"name\" : \"Convert HTML Entities\",\n          \"challengeType\" : \"5\"\n      },\n      {\n          \"id\" : \"a103376db3ba46b2d50db289\",\n          \"name\" : \"Spinal Tap Case\",\n          \"challengeType\" : \"5\"\n      },\n      {\n          \"id\" : \"a5229172f011153519423690\",\n          \"name\" : \"Sum All Odd Fibonacci Numbers\",\n          \"challengeType\" : \"5\"\n      },\n      {\n          \"id\" : \"a3bfc1673c0526e06d3ac698\",\n          \"name\" : \"Sum All Primes\",\n          \"challengeType\" : \"5\"\n      },\n      {\n          \"id\" : \"ae9defd7acaf69703ab432ea\",\n          \"name\" : \"Smallest Common Multiple\",\n          \"challengeType\" : \"5\"\n      },\n      {\n          \"id\" : \"a6e40f1041b06c996f7b2406\",\n          \"name\" : \"Finders Keepers\",\n          \"challengeType\" : \"5\"\n      },\n      {\n          \"id\" : \"a5deed1811a43193f9f1c841\",\n          \"name\" : \"Drop it\",\n          \"challengeType\" : \"5\"\n      },\n      {\n          \"id\" : \"ab306dbdcc907c7ddfc30830\",\n          \"name\" : \"Steamroller\",\n          \"challengeType\" : \"5\"\n      },\n      {\n          \"id\" : \"a8d97bd4c764e91f9d2bda01\",\n          \"name\" : \"Binary Agents\",\n          \"challengeType\" : \"5\"\n      },\n      {\n          \"id\" : \"a10d2431ad0c6a099a4b8b52\",\n          \"name\" : \"Everything Be True\",\n          \"challengeType\" : \"5\"\n      },\n      {\n          \"id\" : \"a97fd23d9b809dac9921074f\",\n          \"name\" : \"Arguments Optional\",\n          \"challengeType\" : \"5\"\n      },\n      {\n          \"id\" : \"bd7158d8c442eddfaeb5bd13\",\n          \"name\" : \"Build a Random Quote Machine\",\n          \"challengeType\" : \"3\"\n      },\n      {\n          \"id\" : \"bd7158d8c442eddfaeb5bd10\",\n          \"name\" : \"Show the Local Weather\",\n          \"challengeType\" : \"3\"\n      },\n      {\n          \"id\" : \"bd7158d8c442eddfaeb5bd19\",\n          \"name\" : \"Build a Wikipedia Viewer\",\n          \"challengeType\" : \"3\"\n      },\n      {\n          \"id\" : \"bd7158d8c442eddfaeb5bd1f\",\n          \"name\" : \"Use the Twitchtv JSON API\",\n          \"challengeType\" : \"3\"\n      },\n      {\n          \"id\" : \"bad87fee1348bd9acdd08826\",\n          \"name\" : \"Learn how Script Tags and Document Ready Work\",\n          \"challengeType\" : \"0\"\n      },\n      {\n          \"id\" : \"bad87fee1348bd9bedc08826\",\n          \"name\" : \"Target HTML Elements with Selectors Using jQuery\",\n          \"challengeType\" : \"0\"\n      },\n      {\n          \"id\" : \"bad87fee1348bd9aedc08826\",\n          \"name\" : \"Target Elements by Class Using jQuery\",\n          \"challengeType\" : \"0\"\n      },\n      {\n          \"id\" : \"bad87fee1348bd9aeda08826\",\n          \"name\" : \"Target Elements by ID Using jQuery\",\n          \"challengeType\" : \"0\"\n      },\n      {\n          \"id\" : \"bad87fee1348bd9aeda08726\",\n          \"name\" : \"Delete your jQuery Functions\",\n          \"challengeType\" : \"0\"\n      },\n      {\n          \"id\" : \"bad87fee1348bd9aed908626\",\n          \"name\" : \"Target the same element with multiple jQuery Selectors\",\n          \"challengeType\" : \"0\"\n      },\n      {\n          \"id\" : \"bad87fee1348bd9aed918626\",\n          \"name\" : \"Remove Classes from an element with jQuery\",\n          \"challengeType\" : \"0\"\n      },\n      {\n          \"id\" : \"bad87fee1348bd9aed908826\",\n          \"name\" : \"Change the CSS of an Element Using jQuery\",\n          \"challengeType\" : \"0\"\n      },\n      {\n          \"id\" : \"bad87fee1348bd9aed808826\",\n          \"name\" : \"Disable an Element Using jQuery\",\n          \"challengeType\" : \"0\"\n      },\n      {\n          \"id\" : \"564944c91be2204b269d51e3\",\n          \"name\" : \"Change Text Inside an Element Using jQuery\",\n          \"challengeType\" : \"0\"\n      },\n      {\n          \"id\" : \"bad87fee1348bd9aed708826\",\n          \"name\" : \"Remove an Element Using jQuery\",\n          \"challengeType\" : \"0\"\n      },\n      {\n          \"id\" : \"bad87fee1348bd9aed608826\",\n          \"name\" : \"Use appendTo to Move Elements with jQuery\",\n          \"challengeType\" : \"0\"\n      },\n      {\n          \"id\" : \"bad87fee1348bd9aed508826\",\n          \"name\" : \"Clone an Element Using jQuery\",\n          \"challengeType\" : \"0\"\n      },\n      {\n          \"id\" : \"bad87fee1348bd9aed308826\",\n          \"name\" : \"Target the Parent of an Element Using jQuery\",\n          \"challengeType\" : \"0\"\n      },\n      {\n          \"id\" : \"bad87fee1348bd9aed208826\",\n          \"name\" : \"Target the Children of an Element Using jQuery\",\n          \"challengeType\" : \"0\"\n      },\n      {\n          \"id\" : \"bad87fee1348bd9aed108826\",\n          \"name\" : \"Target a Specific Child of an Element Using jQuery\",\n          \"challengeType\" : \"0\"\n      },\n      {\n          \"id\" : \"bad87fee1348bd9aed008826\",\n          \"name\" : \"Target Even Numbered Elements Using jQuery\",\n          \"challengeType\" : \"0\"\n      },\n      {\n          \"id\" : \"bad87fee1348bd9aecb08826\",\n          \"name\" : \"Use jQuery to Modify the Entire Page\",\n          \"challengeType\" : \"0\"\n      },\n      {\n          \"id\" : \"56bbb991ad1ed5201cd392d4\",\n          \"name\" : \"Trigger Click Events with jQuery\",\n          \"challengeType\" : \"0\"\n      },\n      {\n          \"id\" : \"56bbb991ad1ed5201cd392d5\",\n          \"name\" : \"Change Text with Click Events\",\n          \"challengeType\" : \"0\"\n      },\n      {\n          \"id\" : \"56bbb991ad1ed5201cd392d6\",\n          \"name\" : \"Get JSON with the jQuery getJSON Method\",\n          \"challengeType\" : \"0\"\n      },\n      {\n          \"id\" : \"56bbb991ad1ed5201cd392d7\",\n          \"name\" : \"Convert JSON Data to HTML\",\n          \"challengeType\" : \"0\"\n      },\n      {\n          \"id\" : \"56bbb991ad1ed5201cd392d8\",\n          \"name\" : \"Render Images from Data Sources\",\n          \"challengeType\" : \"0\"\n      },\n      {\n          \"id\" : \"56bbb991ad1ed5201cd392d9\",\n          \"name\" : \"Prefilter JSON\",\n          \"challengeType\" : \"0\"\n      },\n      {\n          \"id\" : \"56bbb991ad1ed5201cd392da\",\n          \"name\" : \"Get Geolocation Data\",\n          \"challengeType\" : \"0\"\n      },\n      {\n          \"id\" : \"cf1111c1c15feddfaeb1bdef\",\n          \"name\" : \"Declare JavaScript Objects as Variables\",\n          \"challengeType\" : \"1\"\n      },\n      {\n          \"id\" : \"cf1111c1c15feddfaeb2bdef\",\n          \"name\" : \"Construct JavaScript Objects with Functions\",\n          \"challengeType\" : \"1\"\n      },\n      {\n          \"id\" : \"cf1111c1c15feddfaeb4bdef\",\n          \"name\" : \"Make Instances of Objects with a Constructor Function\",\n          \"challengeType\" : \"1\"\n      },\n      {\n          \"id\" : \"563cfb55594311ffcb333c70\",\n          \"name\" : \"Make Unique Objects by Passing Parameters to our Constructor\",\n          \"challengeType\" : \"1\"\n      },\n      {\n          \"id\" : \"cf1111c1c15feddfaeb3bdef\",\n          \"name\" : \"Make Object Properties Private\",\n          \"challengeType\" : \"1\"\n      },\n      {\n          \"id\" : \"cf1111c1c15feddfaeb7bdef\",\n          \"name\" : \"Iterate over Arrays with map\",\n          \"challengeType\" : \"1\"\n      },\n      {\n          \"id\" : \"cf1111c1c15feddfaeb8bdef\",\n          \"name\" : \"Condense arrays with reduce\",\n          \"challengeType\" : \"1\"\n      },\n      {\n          \"id\" : \"cf1111c1c15feddfaeb9bdef\",\n          \"name\" : \"Filter Arrays with filter\",\n          \"challengeType\" : \"1\"\n      },\n      {\n          \"id\" : \"cf1111c1c16feddfaeb1bdef\",\n          \"name\" : \"Sort Arrays with sort\",\n          \"challengeType\" : \"1\"\n      },\n      {\n          \"id\" : \"cf1111c1c16feddfaeb2bdef\",\n          \"name\" : \"Reverse Arrays with reverse\",\n          \"challengeType\" : \"1\"\n      },\n      {\n          \"id\" : \"cf1111c1c16feddfaeb3bdef\",\n          \"name\" : \"Concatenate Arrays with concat\",\n          \"challengeType\" : \"1\"\n      },\n      {\n          \"id\" : \"cf1111c1c16feddfaeb4bdef\",\n          \"name\" : \"Split Strings with split\",\n          \"challengeType\" : \"1\"\n      },\n      {\n          \"id\" : \"cf1111c1c16feddfaeb5bdef\",\n          \"name\" : \"Join Strings with join\",\n          \"challengeType\" : \"1\"\n      },\n      {\n          \"id\" : \"bd7158d8c423ede2aab5bdee\",\n          \"name\" : \"Learn D3 Challenges\",\n          \"challengeType\" : \"3\"\n      },\n      {\n          \"id\" : \"561add10cb82ac38a17513b3\",\n          \"name\" : \"Claim Your Data Visualization Certificate\",\n          \"challengeType\" : \"7\"\n      },\n      {\n          \"id\" : \"bd7168d8c242eddfaeb5bd13\",\n          \"name\" : \"Visualize Data with a Bar Chart\",\n          \"challengeType\" : \"3\"\n      },\n      {\n          \"id\" : \"bd7178d8c242eddfaeb5bd13\",\n          \"name\" : \"Visualize Data with a Scatterplot Graph\",\n          \"challengeType\" : \"3\"\n      },\n      {\n          \"id\" : \"bd7188d8c242eddfaeb5bd13\",\n          \"name\" : \"Visualize Data with a Heat Map\",\n          \"challengeType\" : \"3\"\n      },\n      {\n          \"id\" : \"bd7198d8c242eddfaeb5bd13\",\n          \"name\" : \"Show Relationships with a Force Directed Graph\",\n          \"challengeType\" : \"3\"\n      },\n      {\n          \"id\" : \"bd7108d8c242eddfaeb5bd13\",\n          \"name\" : \"Map Data Across the Globe\",\n          \"challengeType\" : \"3\"\n      },\n      {\n          \"id\" : \"bd7157d8c242eddfaeb5bd13\",\n          \"name\" : \"Build a Markdown Previewer\",\n          \"challengeType\" : \"3\"\n      },\n      {\n          \"id\" : \"bd7156d8c242eddfaeb5bd13\",\n          \"name\" : \"Build a Camper Leaderboard\",\n          \"challengeType\" : \"3\"\n      },\n      {\n          \"id\" : \"bd7155d8c242eddfaeb5bd13\",\n          \"name\" : \"Build a Recipe Box\",\n          \"challengeType\" : \"3\"\n      },\n      {\n          \"id\" : \"bd7154d8c242eddfaeb5bd13\",\n          \"name\" : \"Build the Game of Life\",\n          \"challengeType\" : \"3\"\n      },\n      {\n          \"id\" : \"bd7153d8c242eddfaeb5bd13\",\n          \"name\" : \"Build a Roguelike Dungeon Crawler Game\",\n          \"challengeType\" : \"3\"\n      },\n      {\n          \"id\" : \"bd7158d8c423ede3aeb5bdee\",\n          \"name\" : \"Learn React Challenges\",\n          \"challengeType\" : \"3\"\n      },\n      {\n          \"id\" : \"bd7158d8c423ede2aeb5bdee\",\n          \"name\" : \"Learn Sass Challenges\",\n          \"challengeType\" : \"3\"\n      },\n      {\n          \"id\" : \"bd7158d8c443eddfaeb5bcef\",\n          \"name\" : \"Get Set for our Back End Development Projects\",\n          \"challengeType\" : \"7\"\n      },\n      {\n          \"id\" : \"bd7158d8c443edefaeb5bdef\",\n          \"name\" : \"Timestamp Microservice\",\n          \"challengeType\" : \"4\"\n      },\n      {\n          \"id\" : \"bd7158d8c443edefaeb5bdff\",\n          \"name\" : \"Request Header Parser Microservice\",\n          \"challengeType\" : \"4\"\n      },\n      {\n          \"id\" : \"bd7158d8c443edefaeb5bd0e\",\n          \"name\" : \"URL Shortener Microservice\",\n          \"challengeType\" : \"4\"\n      },\n      {\n          \"id\" : \"bd7158d8c443edefaeb5bdee\",\n          \"name\" : \"Image Search Abstraction Layer\",\n          \"challengeType\" : \"4\"\n      },\n      {\n          \"id\" : \"bd7158d8c443edefaeb5bd0f\",\n          \"name\" : \"File Metadata Microservice\",\n          \"challengeType\" : \"4\"\n      },\n      {\n          \"id\" : \"cf1111c1c16feddfaeb6bdef\",\n          \"name\" : \"Use the JavaScript Console\",\n          \"challengeType\" : \"1\"\n      },\n      {\n          \"id\" : \"cf1111c1c16feddfaeb7bdef\",\n          \"name\" : \"Using typeof\",\n          \"challengeType\" : \"1\"\n      },\n      {\n          \"id\" : \"660add10cb82ac38a17513be\",\n          \"name\" : \"Claim Your Back End Development Certificate\",\n          \"challengeType\" : \"7\"\n      },\n      {\n          \"id\" : \"bd7158d8c443eddfaeb5bdef\",\n          \"name\" : \"Build a Voting App\",\n          \"challengeType\" : \"4\"\n      },\n      {\n          \"id\" : \"bd7158d8c443eddfaeb5bdff\",\n          \"name\" : \"Build a Nightlife Coordination App\",\n          \"challengeType\" : \"4\"\n      },\n      {\n          \"id\" : \"bd7158d8c443eddfaeb5bd0e\",\n          \"name\" : \"Chart the Stock Market\",\n          \"challengeType\" : \"4\"\n      },\n      {\n          \"id\" : \"bd7158d8c443eddfaeb5bd0f\",\n          \"name\" : \"Manage a Book Trading Club\",\n          \"challengeType\" : \"4\"\n      },\n      {\n          \"id\" : \"bd7158d8c443eddfaeb5bdee\",\n          \"name\" : \"Build a Pinterest Clone\",\n          \"challengeType\" : \"4\"\n      },\n      {\n          \"id\" : \"bd7353d8c341eddeaeb5bd0f\",\n          \"name\" : \"Save your Code Revisions Forever with Git\",\n          \"challengeType\" : \"2\"\n      },\n      {\n          \"id\" : \"bd7243d8c341eddeaeb5bd0f\",\n          \"name\" : \"Store Data in MongoDB\",\n          \"challengeType\" : \"2\"\n      },\n      {\n          \"id\" : \"bd7153d8c441eddfaeb5bd0f\",\n          \"name\" : \"Manage Packages with NPM\",\n          \"challengeType\" : \"2\"\n      },\n      {\n          \"id\" : \"bd7153d8c441eddfaeb5bdff\",\n          \"name\" : \"Start a Nodejs Server\",\n          \"challengeType\" : \"2\"\n      },\n      {\n          \"id\" : \"bd7153d8c441eddfaeb5bdfe\",\n          \"name\" : \"Continue working with Nodejs Servers\",\n          \"challengeType\" : \"2\"\n      },\n      {\n          \"id\" : \"bd7153d8c441eddfaeb5bdfd\",\n          \"name\" : \"Finish working with Nodejs Servers\",\n          \"challengeType\" : \"2\"\n      },\n      {\n          \"id\" : \"bd7153d8c441eddfaeb5bd1f\",\n          \"name\" : \"Build Web Apps with Expressjs\",\n          \"challengeType\" : \"2\"\n      },\n      {\n          \"id\" : \"56b15f15632298c12f31517b\",\n          \"name\" : \"Big O Notation What It Is and Why You Should Care\",\n          \"challengeType\" : \"6\"\n      },\n      {\n          \"id\" : \"56b15f15632298c12f31517a\",\n          \"name\" : \"Big O Notation A Few Examples\",\n          \"challengeType\" : \"6\"\n      },\n      {\n          \"id\" : \"56b15f15632298c12f315184\",\n          \"name\" : \"Chrome Dev Tools Elements\",\n          \"challengeType\" : \"6\"\n      },\n      {\n          \"id\" : \"56b15f15632298c12f315183\",\n          \"name\" : \"Chrome Dev Tools Network\",\n          \"challengeType\" : \"6\"\n      },\n      {\n          \"id\" : \"56b15f15632298c12f315182\",\n          \"name\" : \"Chrome Dev Tools Sources\",\n          \"challengeType\" : \"6\"\n      },\n      {\n          \"id\" : \"56b15f15632298c12f315181\",\n          \"name\" : \"Chrome Dev Tools Timeline\",\n          \"challengeType\" : \"6\"\n      },\n      {\n          \"id\" : \"56b15f15632298c12f315180\",\n          \"name\" : \"Chrome Dev Tools Profiles\",\n          \"challengeType\" : \"6\"\n      },\n      {\n          \"id\" : \"56b15f15632298c12f31517f\",\n          \"name\" : \"Chrome Dev Tools Resources\",\n          \"challengeType\" : \"6\"\n      },\n      {\n          \"id\" : \"56b15f15632298c12f31517e\",\n          \"name\" : \"Chrome Dev Tools Audits\",\n          \"challengeType\" : \"6\"\n      },\n      {\n          \"id\" : \"56b15f15632298c12f31517d\",\n          \"name\" : \"Chrome Dev Tools Console\",\n          \"challengeType\" : \"6\"\n      },\n      {\n          \"id\" : \"56b15f15632298c12f31517c\",\n          \"name\" : \"Chrome Dev Tools Summary\",\n          \"challengeType\" : \"6\"\n      },\n      {\n          \"id\" : \"bd7128d8c441eddfbeb5bddf\",\n          \"name\" : \"Computer Basics The 4 Basic Parts of a Computer\",\n          \"challengeType\" : \"6\"\n      },\n      {\n          \"id\" : \"bd7127d8c441eddfbeb5bddf\",\n          \"name\" : \"Computer Basics More Computer Hardware\",\n          \"challengeType\" : \"6\"\n      },\n      {\n          \"id\" : \"bd7129d8a441eddfbeb5bddf\",\n          \"name\" : \"Computer Basics Chips and Moores Law\",\n          \"challengeType\" : \"6\"\n      },\n      {\n          \"id\" : \"bd7126d8c441eddfbeb5bddf\",\n          \"name\" : \"Computer Basics Intro to Binary Code\",\n          \"challengeType\" : \"6\"\n      },\n      {\n          \"id\" : \"bd7125d8c441eddfbeb5bddf\",\n          \"name\" : \"Computer Basics Decoding a Binary Number\",\n          \"challengeType\" : \"6\"\n      },\n      {\n          \"id\" : \"bd7124d8c441eddfbeb5bddf\",\n          \"name\" : \"Computer Basics How To Measure Data Size\",\n          \"challengeType\" : \"6\"\n      },\n      {\n          \"id\" : \"bd7123d8c441eddfbeb5bddf\",\n          \"name\" : \"Computer Basics Measuring Data Speed\",\n          \"challengeType\" : \"6\"\n      },\n      {\n          \"id\" : \"bd7122d8c441eddfbeb5bddf\",\n          \"name\" : \"Computer Basics Binary Bytes\",\n          \"challengeType\" : \"6\"\n      },\n      {\n          \"id\" : \"bd7121d8c441eddfbeb5bddf\",\n          \"name\" : \"Computer Basics Types of Computers\",\n          \"challengeType\" : \"6\"\n      },\n      {\n          \"id\" : \"bd7120d8c441eddfbeb5bddf\",\n          \"name\" : \"Computer Basics More on the Motherboard\",\n          \"challengeType\" : \"6\"\n      },\n      {\n          \"id\" : \"bd712fd8c441eddfbeb5bddf\",\n          \"name\" : \"Computer Basics Data Networks\",\n          \"challengeType\" : \"6\"\n      },\n      {\n          \"id\" : \"bd712ed8c441eddfbeb5bddf\",\n          \"name\" : \"Computer Basics IP Addresses\",\n          \"challengeType\" : \"6\"\n      },\n      {\n          \"id\" : \"bd712dd8c441eddfbeb5bddf\",\n          \"name\" : \"Computer Basics How the Internet Works\",\n          \"challengeType\" : \"6\"\n      },\n      {\n          \"id\" : \"bd712cd8c441eddfbeb5bddf\",\n          \"name\" : \"Computer Basics Software\",\n          \"challengeType\" : \"6\"\n      },\n      {\n          \"id\" : \"56b15f15632298c12f31510f\",\n          \"name\" : \"Computer Basics Content Delivery Networks\",\n          \"challengeType\" : \"6\"\n      },\n      {\n          \"id\" : \"bd7129d80441eddfbeb5bddf\",\n          \"name\" : \"Analog vs Digital and File Compression\",\n          \"challengeType\" : \"6\"\n      },\n      {\n          \"id\" : \"bd7129d8b441eddfbeb5bddf\",\n          \"name\" : \"Routers and Packets\",\n          \"challengeType\" : \"6\"\n      },\n      {\n          \"id\" : \"bd7029d8c441eddfbeb5bddf\",\n          \"name\" : \"Source Code\",\n          \"challengeType\" : \"6\"\n      },\n      {\n          \"id\" : \"bd7119d8c441eddfbeb5bddf\",\n          \"name\" : \"Variables In Code\",\n          \"challengeType\" : \"6\"\n      },\n      {\n          \"id\" : \"bd712bd8c441eddfbeb5bddf\",\n          \"name\" : \"What Do Programmers Do\",\n          \"challengeType\" : \"6\"\n      },\n      {\n          \"id\" : \"bd712ad8c441eddfbeb5bddf\",\n          \"name\" : \"Console and Logging\",\n          \"challengeType\" : \"6\"\n      },\n      {\n          \"id\" : \"bd7129d89441eddfbeb5bddf\",\n          \"name\" : \"Computer Security\",\n          \"challengeType\" : \"6\"\n      },\n      {\n          \"id\" : \"56b15f15632298c12f31518f\",\n          \"name\" : \"The DOM Whats the Document Object Model\",\n          \"challengeType\" : \"6\"\n      },\n      {\n          \"id\" : \"56b15f15632298c12f31518e\",\n          \"name\" : \"The DOM Style in the Header Script in the Footer\",\n          \"challengeType\" : \"6\"\n      },\n      {\n          \"id\" : \"56b15f15632298c12f31518c\",\n          \"name\" : \"JavaScript Lingo MDN and Documentation\",\n          \"challengeType\" : \"6\"\n      },\n      {\n          \"id\" : \"56b15f15632298c12f31518d\",\n          \"name\" : \"JavaScript Lingo Value Types\",\n          \"challengeType\" : \"6\"\n      },\n      {\n          \"id\" : \"56b15f15632298c12f31518b\",\n          \"name\" : \"JavaScript Lingo Variables  camelCase\",\n          \"challengeType\" : \"6\"\n      },\n      {\n          \"id\" : \"56b15f15632298c12f31518a\",\n          \"name\" : \"JavaScript Lingo Arrays  Objects\",\n          \"challengeType\" : \"6\"\n      },\n      {\n          \"id\" : \"56b15f15632298c12f315189\",\n          \"name\" : \"JavaScript Lingo Finding and Indexing Data in Arrays\",\n          \"challengeType\" : \"6\"\n      },\n      {\n          \"id\" : \"56b15f15632298c12f315188\",\n          \"name\" : \"JavaScript Lingo Manipulating Data\",\n          \"challengeType\" : \"6\"\n      },\n      {\n          \"id\" : \"56b15f15632298c12f315187\",\n          \"name\" : \"JavaScript Lingo Math\",\n          \"challengeType\" : \"6\"\n      },\n      {\n          \"id\" : \"56b15f15632298c12f315186\",\n          \"name\" : \"JavaScript Lingo Loops\",\n          \"challengeType\" : \"6\"\n      },\n      {\n          \"id\" : \"56b15f15632298c12f315185\",\n          \"name\" : \"JavaScript Lingo Regular Expressions\",\n          \"challengeType\" : \"6\"\n      },\n      {\n          \"id\" : \"bd7158d8c242eddfaeb5be13\",\n          \"name\": \"Design a danmu app\",\n          \"challengeType\" : \"3\"\n      }\n  ];\nvar challengeMap = {};\nfunction lookUp(value, prop){\n  for(var i=0;i<matchArray.length;i++){\n    if(matchArray[i].name== value){\n      return matchArray[i][prop] || \"fasle\";\n    }\n  }\n  return \"false\";\n}\n\nvar challengeMap ={};\nvar tbody = document.getElementsByTagName(\"tbody\");\nfor(var k =0;k<tbody.length;k++){\n  var tr = tbody[k].getElementsByTagName(\"tr\");\n  for(var i =0;i<tr.length;i++){\n    var td = tr[i].getElementsByTagName(\"td\");\n    for(var j=0;j<td.length-1;j++){\n      if(j==0 && td[j].innerText){\n        var name = td[j].innerText;\n        console.log(name);\n        var id = lookUp(name,\"id\");\n        var challengeType =  lookUp(name,\"challengeType\");\n        challengeMap[id] = {};\n        challengeMap[id].id = id;\n        challengeMap[id].name = name;\n        challengeMap[id].challengeType = challengeType;\n      }\n      if(j==1 && td[j].innerText){\n        var completedDate = Date.parse(td[j].innerText);\n        challengeMap[id].completedDate = completedDate;\n      }\n      if(j==2 && td[j].innerText){\n        var lastUpdated  = Date.parse(td[j].innerText);\n        challengeMap[id].lastUpdated = lastUpdated;\n      }\n      if(j==3 && td[j].innerText){\n        var solution = td[j].getElementsByTagName(\"a\")[0].href;\n        var existed = solution.indexOf(\"solution\");\n        if(existed != -1){\n          solution = solution.slice(existed + 9);\n          var decodeString  = decodeURIComponent(solution.replace(/fccss/,'<script>').replace(/fcces/,'</script>'))\n          challengeMap[id].solution = decodeString;\n        }else if(solution.indexOf(\"challenges\") != -1){\n\n        }else{\n          challengeMap[id].solution = solution;\n        }\n      }\n    }\n  }\n}\nconsole.log(Object.keys(challengeMap).length);\nconsole.log(JSON.stringify(challengeMap,null,2));\n// var progressTimestamps = [];\n// for(var l in challengeMap){\n//   var emptyObject = {};\n//   emptyObject.timestamp = challengeMap[l].completedDate;\n//   emptyObject.completedChallenge = challengeMap[l].id;\n//   progressTimestamps.push(emptyObject);\n// }\n// progressTimestamps = JSON.stringify(progressTimestamps,null,2);\n// console.log(JSON.stringify(progressTimestamps));\n// db.getCollection('user').update({username:\"somebody\"},{$set:{\"progressTimestamps\":progressTimestamps,\"challengeMap\":challengeMap}},false,true)\n"
  },
  {
    "path": "full-test-data.js",
    "content": "var obj = {\n      \"progressTimestamps\" : [\n          {\n              \"timestamp\" : 1460051412338\n          },\n          {\n              \"timestamp\" : 1461850905694,\n              \"completedChallenge\" : \"bd7158d8c442eddfbeb5bd1f\"\n          },\n          {\n              \"timestamp\" : 1461854043990,\n              \"completedChallenge\" : \"bd7158d2c442eddfbeb5bd1f\"\n          },\n          {\n              \"timestamp\" : 1461854044008,\n              \"completedChallenge\" : \"bd7158d2c442eddfbeb5bd1f\"\n          },\n          {\n              \"timestamp\" : 1461899275997,\n              \"completedChallenge\" : \"a302f7aae1aa3152a5b413bc\"\n          },\n          {\n              \"timestamp\" : 1462101383356,\n              \"completedChallenge\" : \"ab31c21b530c0dafa9e241ee\"\n          },\n          {\n              \"timestamp\" : 1462109037999,\n              \"completedChallenge\" : \"a24c1a4622e3c05097f71d67\"\n          },\n          {\n              \"timestamp\" : 1462241078035,\n              \"completedChallenge\" : \"560add10cb82ac38a17513be\"\n          },\n          {\n              \"timestamp\" : 1462242032956,\n              \"completedChallenge\" : \"560add37cb82ac38a17513bf\"\n          },\n          {\n              \"timestamp\" : 1462242257257,\n              \"completedChallenge\" : \"560add56cb82ac38a17513c0\"\n          },\n          {\n              \"timestamp\" : 1462242295554,\n              \"completedChallenge\" : \"560add71cb82ac38a17513c2\"\n          },\n          {\n              \"timestamp\" : 1462242514658,\n              \"completedChallenge\" : \"560add8ccb82ac38a17513c4\"\n          },\n          {\n              \"timestamp\" : 1462244368154,\n              \"completedChallenge\" : \"bd7123c8c441eddfaeb5bdef\"\n          },\n          {\n              \"timestamp\" : 1462244984451,\n              \"completedChallenge\" : \"bad87fee1348bd9aedf0887a\"\n          },\n          {\n              \"timestamp\" : 1462244994182,\n              \"completedChallenge\" : \"bad87fee1348bd9aedf08801\"\n          },\n          {\n              \"timestamp\" : 1462245177972,\n              \"completedChallenge\" : \"bad87fee1348bd9aedf08802\"\n          },\n          {\n              \"timestamp\" : 1462245377880,\n              \"completedChallenge\" : \"bad87fee1348bd9aedf08804\"\n          },\n          {\n              \"timestamp\" : 1462251352803,\n              \"completedChallenge\" : \"bad87fee1348bd9aedf08833\"\n          },\n          {\n              \"timestamp\" : 1462251406737,\n              \"completedChallenge\" : \"bad87fed1348bd9aedf08833\"\n          },\n          {\n              \"timestamp\" : 1462251577194,\n              \"completedChallenge\" : \"bad87fee1348bd9aedf08803\"\n          },\n          {\n              \"timestamp\" : 1462252013280,\n              \"completedChallenge\" : \"bad87fee1348bd9aedf08805\"\n          },\n          {\n              \"timestamp\" : 1462355644231,\n              \"completedChallenge\" : \"bad87fee1348bd9aecf08806\"\n          },\n          {\n              \"timestamp\" : 1462355683651,\n              \"completedChallenge\" : \"bad87fee1348bd9aefe08806\"\n          },\n          {\n              \"timestamp\" : 1462355744710,\n              \"completedChallenge\" : \"bad87fee1348bd9aedf08806\"\n          },\n          {\n              \"timestamp\" : 1462355762618,\n              \"completedChallenge\" : \"bad87fee1348bd9aede08807\"\n          },\n          {\n              \"timestamp\" : 1462356332290,\n              \"completedChallenge\" : \"bad87fee1348bd9aedf08807\"\n          },\n          {\n              \"timestamp\" : 1462356358287,\n              \"completedChallenge\" : \"bad87fee1348bd9aedf08808\"\n          },\n          {\n              \"timestamp\" : 1462356369465,\n              \"completedChallenge\" : \"bad87fee1348bd9aedf08812\"\n          },\n          {\n              \"timestamp\" : 1462356639113,\n              \"completedChallenge\" : \"bad87fee1348bd9acdf08812\"\n          },\n          {\n              \"timestamp\" : 1462356710012,\n              \"completedChallenge\" : \"bad87fee1348bd9bedf08813\"\n          },\n          {\n              \"timestamp\" : 1462425068659,\n              \"completedChallenge\" : \"bad87fee1348bd9aedf08814\"\n          },\n          {\n              \"timestamp\" : 1462425096436,\n              \"completedChallenge\" : \"bad87fee1348bd9aedf08815\"\n          },\n          {\n              \"timestamp\" : 1462425214182,\n              \"completedChallenge\" : \"bad87fee1348bd9aedf08816\"\n          },\n          {\n              \"timestamp\" : 1462426196990,\n              \"completedChallenge\" : \"bad87fee1348bd9aede08817\"\n          },\n          {\n              \"timestamp\" : 1462426422817,\n              \"completedChallenge\" : \"bad87fee1348bd9aedf08817\"\n          },\n          {\n              \"timestamp\" : 1462426609369,\n              \"completedChallenge\" : \"bad87fee1348bd9aedf08820\"\n          },\n          {\n              \"timestamp\" : 1462426736505,\n              \"completedChallenge\" : \"bad87fee1348bd9aedf08818\"\n          },\n          {\n              \"timestamp\" : 1462752373324,\n              \"completedChallenge\" : \"bad87fee1348bd9aedf08827\"\n          },\n          {\n              \"timestamp\" : 1462752702512,\n              \"completedChallenge\" : \"bad87fee1348bd9aedf08828\"\n          },\n          {\n              \"timestamp\" : 1462752725358,\n              \"completedChallenge\" : \"bad87fee1348bd9aedf08829\"\n          },\n          {\n              \"timestamp\" : 1462752993102,\n              \"completedChallenge\" : \"bad87fee1348bd9aedf08830\"\n          },\n          {\n              \"timestamp\" : 1462753185378,\n              \"completedChallenge\" : \"bad87fee1348bd9aede08830\"\n          },\n          {\n              \"timestamp\" : 1462753266395,\n              \"completedChallenge\" : \"bad87fee1348bd9aedd08830\"\n          },\n          {\n              \"timestamp\" : 1462753415353,\n              \"completedChallenge\" : \"bad87fee1348bd9aedc08830\"\n          },\n          {\n              \"timestamp\" : 1462762368918,\n              \"completedChallenge\" : \"bad87fee1348bd9aedf08834\"\n          },\n          {\n              \"timestamp\" : 1462762865107,\n              \"completedChallenge\" : \"bad87fee1348bd9aedf08835\"\n          },\n          {\n              \"timestamp\" : 1462762979934,\n              \"completedChallenge\" : \"bad87fee1348bd9aedd08835\"\n          },\n          {\n              \"timestamp\" : 1462763564186,\n              \"completedChallenge\" : \"bad87fee1348bd9aede08835\"\n          },\n          {\n              \"timestamp\" : 1462763669084,\n              \"completedChallenge\" : \"bad87fed1348bd9aede07836\"\n          },\n          {\n              \"timestamp\" : 1462763745535,\n              \"completedChallenge\" : \"bad87eee1348bd9aede07836\"\n          },\n          {\n              \"timestamp\" : 1462763864820,\n              \"completedChallenge\" : \"bad87dee1348bd9aede07836\"\n          },\n          {\n              \"timestamp\" : 1462764223569,\n              \"completedChallenge\" : \"bad88fee1348bd9aedf08825\"\n          },\n          {\n              \"timestamp\" : 1462764436439,\n              \"completedChallenge\" : \"bad87fee1348bd9aedf08822\"\n          },\n          {\n              \"timestamp\" : 1462764624914,\n              \"completedChallenge\" : \"bad87fee1348bd9aedf08823\"\n          },\n          {\n              \"timestamp\" : 1462764765571,\n              \"completedChallenge\" : \"bad87fee1348bd9aedf08824\"\n          },\n          {\n              \"timestamp\" : 1462764856966,\n              \"completedChallenge\" : \"bad87fee1248bd9aedf08824\"\n          },\n          {\n              \"timestamp\" : 1462765288150,\n              \"completedChallenge\" : \"bad87fee1348bd9aedf08826\"\n          },\n          {\n              \"timestamp\" : 1462767630231,\n              \"completedChallenge\" : \"bad87fee1348bd9afdf08726\"\n          },\n          {\n              \"timestamp\" : 1462767693017,\n              \"completedChallenge\" : \"bad87fee1348bd9aedf08736\"\n          },\n          {\n              \"timestamp\" : 1462767894317,\n              \"completedChallenge\" : \"bad87fee1348bd9aedf08746\"\n          },\n          {\n              \"timestamp\" : 1462768117074,\n              \"completedChallenge\" : \"bad87fee1348bd9aedf08756\"\n          },\n          {\n              \"timestamp\" : 1462768252161,\n              \"completedChallenge\" : \"bad87fee1348bd9aedf04756\"\n          },\n          {\n              \"timestamp\" : 1462768347521,\n              \"completedChallenge\" : \"bad87fee1348bd8aedf06756\"\n          },\n          {\n              \"timestamp\" : 1462768440548,\n              \"completedChallenge\" : \"bad87fee1348bd9aedf06756\"\n          },\n          {\n              \"timestamp\" : 1462769426912,\n              \"completedChallenge\" : \"bad87fee1348bd9aedf07756\"\n          },\n          {\n              \"timestamp\" : 1462769721501,\n              \"completedChallenge\" : \"bad87fee1348bd9aedf08726\"\n          },\n          {\n              \"timestamp\" : 1462772138056,\n              \"completedChallenge\" : \"bad87fee1348bd9aedf08725\"\n          },\n          {\n              \"timestamp\" : 1462772465843,\n              \"completedChallenge\" : \"bad87fee1348bd9aedf08724\"\n          },\n          {\n              \"timestamp\" : 1462772491093,\n              \"completedChallenge\" : \"bad87fee1348bd9aedf08723\"\n          },\n          {\n              \"timestamp\" : 1462772504899,\n              \"completedChallenge\" : \"bad87fee1348bd9aedf08722\"\n          },\n          {\n              \"timestamp\" : 1462772554616,\n              \"completedChallenge\" : \"bad87fee1348bd9aedf08721\"\n          },\n          {\n              \"timestamp\" : 1462772625381,\n              \"completedChallenge\" : \"bad87fee1348bd9aede08720\"\n          },\n          {\n              \"timestamp\" : 1462772864956,\n              \"completedChallenge\" : \"bad87fee1348bd9aedf08720\"\n          },\n          {\n              \"timestamp\" : 1462772911466,\n              \"completedChallenge\" : \"bad87fee1348bd9aedf08719\"\n          },\n          {\n              \"timestamp\" : 1462773269006,\n              \"completedChallenge\" : \"bad87fee1348bd9aede08718\"\n          },\n          {\n              \"timestamp\" : 1462773383535,\n              \"completedChallenge\" : \"bad88fee1348bd9aedf08726\"\n          },\n          {\n              \"timestamp\" : 1462773484346,\n              \"completedChallenge\" : \"bad89fee1348bd9aedf08724\"\n          },\n          {\n              \"timestamp\" : 1462773516372,\n              \"completedChallenge\" : \"bad80fee1348bd9aedf08723\"\n          },\n          {\n              \"timestamp\" : 1462773527876,\n              \"completedChallenge\" : \"bad81fee1348bd9aedf08722\"\n          },\n          {\n              \"timestamp\" : 1462773547316,\n              \"completedChallenge\" : \"bad82fee1348bd9aedf08721\"\n          },\n          {\n              \"timestamp\" : 1462773716276,\n              \"completedChallenge\" : \"bad87fee1348bd9acde08712\"\n          },\n          {\n              \"timestamp\" : 1462774105128,\n              \"completedChallenge\" : \"bad87fee1348bd9acde08812\"\n          },\n          {\n              \"timestamp\" : 1462774178199,\n              \"completedChallenge\" : \"bad87fee1348bd8acde08812\"\n          },\n          {\n              \"timestamp\" : 1462774278702,\n              \"completedChallenge\" : \"bad87fee1348cd8acdf08812\"\n          },\n          {\n              \"timestamp\" : 1462774406822,\n              \"completedChallenge\" : \"bad87fee1348cd8acef08812\"\n          },\n          {\n              \"timestamp\" : 1462774487826,\n              \"completedChallenge\" : \"bad87fee1348cd8acef08811\"\n          },\n          {\n              \"timestamp\" : 1462774887926,\n              \"completedChallenge\" : \"bad87fee1348cd8acef08813\"\n          },\n          {\n              \"timestamp\" : 1462775031922,\n              \"completedChallenge\" : \"bad87fee1348ce8acef08814\"\n          },\n          {\n              \"timestamp\" : 1462775273853,\n              \"completedChallenge\" : \"bad88fee1348ce8acef08815\"\n          },\n          {\n              \"timestamp\" : 1462775605809,\n              \"completedChallenge\" : \"bad87fee1347bd9aedf08845\"\n          },\n          {\n              \"timestamp\" : 1462775845583,\n              \"completedChallenge\" : \"bad87fee1348bd9aedf08845\"\n          },\n          {\n              \"timestamp\" : 1462776106106,\n              \"completedChallenge\" : \"bad87fee1348bd9aede08845\"\n          },\n          {\n              \"timestamp\" : 1462776378972,\n              \"completedChallenge\" : \"bad87fee1348bd9aedd08845\"\n          },\n          {\n              \"timestamp\" : 1462776670489,\n              \"completedChallenge\" : \"bad87fee1348bd9aedc08845\"\n          },\n          {\n              \"timestamp\" : 1462776986584,\n              \"completedChallenge\" : \"bad87fee1348bd9aedb08845\"\n          },\n          {\n              \"timestamp\" : 1462777132932,\n              \"completedChallenge\" : \"bad87fee1348bd9aeda08845\"\n          },\n          {\n              \"timestamp\" : 1462777503182,\n              \"completedChallenge\" : \"bad87fee1348bd9aed908845\"\n          },\n          {\n              \"timestamp\" : 1462777639526,\n              \"completedChallenge\" : \"bad87fee1348bd9aec908845\"\n          },\n          {\n              \"timestamp\" : 1462777690621,\n              \"completedChallenge\" : \"bad87fee1348bd9aec908846\"\n          },\n          {\n              \"timestamp\" : 1462777817279,\n              \"completedChallenge\" : \"bad87fee1348bd9aec908746\"\n          },\n          {\n              \"timestamp\" : 1462777831972,\n              \"completedChallenge\" : \"bad87fee1348bd9bec908846\"\n          },\n          {\n              \"timestamp\" : 1462777854058,\n              \"completedChallenge\" : \"bad87fee1348bd9aec908847\"\n          },\n          {\n              \"timestamp\" : 1462791212142,\n              \"completedChallenge\" : \"bad87fee1348bd9aec908848\"\n          },\n          {\n              \"timestamp\" : 1462791286814,\n              \"completedChallenge\" : \"bad87fee1348bd9aec908849\"\n          },\n          {\n              \"timestamp\" : 1462791337013,\n              \"completedChallenge\" : \"bad87fee1348bd9aec908850\"\n          },\n          {\n              \"timestamp\" : 1462791402310,\n              \"completedChallenge\" : \"bad87fee1348bd9aec908852\"\n          },\n          {\n              \"timestamp\" : 1462791473488,\n              \"completedChallenge\" : \"bad87fee1348bd9aec908853\"\n          },\n          {\n              \"timestamp\" : 1462791612164,\n              \"completedChallenge\" : \"bad87fee1348bd9aec908854\"\n          },\n          {\n              \"timestamp\" : 1462791710424,\n              \"completedChallenge\" : \"bad87fee1348bd9aec908855\"\n          },\n          {\n              \"timestamp\" : 1462791876536,\n              \"completedChallenge\" : \"bad87fee1348bd9aec908856\"\n          },\n          {\n              \"timestamp\" : 1462792017602,\n              \"completedChallenge\" : \"bad87fee1348bd9aec908857\"\n          },\n          {\n              \"timestamp\" : 1462792116630,\n              \"completedChallenge\" : \"570add8ccb82ac38a17513c3\"\n          },\n          {\n              \"timestamp\" : 1462792215233,\n              \"completedChallenge\" : \"560adc65cb82ac38a17513c2\"\n          },\n          {\n              \"timestamp\" : 1462792215243,\n              \"completedChallenge\" : \"560adc65cb82ac38a17513c2\"\n          },\n          {\n              \"timestamp\" : 1462792236571,\n              \"completedChallenge\" : \"560adf65cb82ac38a17513c2\"\n          },\n          {\n              \"timestamp\" : 1462792281918,\n              \"completedChallenge\" : \"560ade65cb82ac38a17513c2\"\n          },\n          {\n              \"timestamp\" : 1462793087511,\n              \"completedChallenge\" : \"560add8ccb81ac38a17513c4\"\n          },\n          {\n              \"timestamp\" : 1462795221368,\n              \"completedChallenge\" : \"bad87fee1348bd9acdd08826\"\n          },\n          {\n              \"timestamp\" : 1462795761942,\n              \"completedChallenge\" : \"bad87fee1348bd9bedc08826\"\n          },\n          {\n              \"timestamp\" : 1462796323986,\n              \"completedChallenge\" : \"bad87fee1348bd9aedc08826\"\n          },\n          {\n              \"timestamp\" : 1462796679841,\n              \"completedChallenge\" : \"bad87fee1348bd9aeda08826\"\n          },\n          {\n              \"timestamp\" : 1462796760829,\n              \"completedChallenge\" : \"bad87fee1348bd9aeda08726\"\n          },\n          {\n              \"timestamp\" : 1462797962296,\n              \"completedChallenge\" : \"bad87fee1348bd9aed908626\"\n          },\n          {\n              \"timestamp\" : 1462798344325,\n              \"completedChallenge\" : \"bad87fee1348bd9aed918626\"\n          },\n          {\n              \"timestamp\" : 1462798458782,\n              \"completedChallenge\" : \"bad87fee1348bd9aed908826\"\n          },\n          {\n              \"timestamp\" : 1462798690027,\n              \"completedChallenge\" : \"bad87fee1348bd9aed808826\"\n          },\n          {\n              \"timestamp\" : 1462844063834,\n              \"completedChallenge\" : \"564944c91be2204b269d51e3\"\n          },\n          {\n              \"timestamp\" : 1462844095735,\n              \"completedChallenge\" : \"bad87fee1348bd9aed708826\"\n          },\n          {\n              \"timestamp\" : 1462844311041,\n              \"completedChallenge\" : \"bad87fee1348bd9aed608826\"\n          },\n          {\n              \"timestamp\" : 1462844804422,\n              \"completedChallenge\" : \"bad87fee1348bd9aed508826\"\n          },\n          {\n              \"timestamp\" : 1462846056266,\n              \"completedChallenge\" : \"bad87fee1348bd9aed308826\"\n          },\n          {\n              \"timestamp\" : 1462846619204,\n              \"completedChallenge\" : \"bad87fee1348bd9aed208826\"\n          },\n          {\n              \"timestamp\" : 1462847783225,\n              \"completedChallenge\" : \"bad87fee1348bd9aed108826\"\n          },\n          {\n              \"timestamp\" : 1462848985198,\n              \"completedChallenge\" : \"bad87fee1348bd9aed008826\"\n          },\n          {\n              \"timestamp\" : 1462849236872,\n              \"completedChallenge\" : \"bad87fee1348bd9aecb08826\"\n          },\n          {\n              \"timestamp\" : 1462849992851,\n              \"completedChallenge\" : \"bd7158d8c442eddfaeb5bd18\"\n          },\n          {\n              \"timestamp\" : 1462876333267,\n              \"completedChallenge\" : \"bd7123c9c441eddfaeb4bdef\"\n          },\n          {\n              \"timestamp\" : 1462877580140,\n              \"completedChallenge\" : \"bd7123c9c443eddfaeb5bdef\"\n          },\n          {\n              \"timestamp\" : 1462878027816,\n              \"completedChallenge\" : \"56533eb9ac21ba0edf2244a8\"\n          },\n          {\n              \"timestamp\" : 1462878147267,\n              \"completedChallenge\" : \"56533eb9ac21ba0edf2244a9\"\n          },\n          {\n              \"timestamp\" : 1462878480430,\n              \"completedChallenge\" : \"56533eb9ac21ba0edf2244aa\"\n          },\n          {\n              \"timestamp\" : 1462879350315,\n              \"completedChallenge\" : \"56533eb9ac21ba0edf2244ab\"\n          },\n          {\n              \"timestamp\" : 1462881232885,\n              \"completedChallenge\" : \"cf1111c1c11feddfaeb3bdef\"\n          },\n          {\n              \"timestamp\" : 1462881248603,\n              \"completedChallenge\" : \"cf1111c1c11feddfaeb4bdef\"\n          },\n          {\n              \"timestamp\" : 1462881260926,\n              \"completedChallenge\" : \"cf1231c1c11feddfaeb5bdef\"\n          },\n          {\n              \"timestamp\" : 1462881403573,\n              \"completedChallenge\" : \"cf1111c1c11feddfaeb6bdef\"\n          },\n          {\n              \"timestamp\" : 1462881603671,\n              \"completedChallenge\" : \"56533eb9ac21ba0edf2244ac\"\n          },\n          {\n              \"timestamp\" : 1462881705246,\n              \"completedChallenge\" : \"56533eb9ac21ba0edf2244ad\"\n          },\n          {\n              \"timestamp\" : 1462881944248,\n              \"completedChallenge\" : \"cf1391c1c11feddfaeb4bdef\"\n          },\n          {\n              \"timestamp\" : 1462882061971,\n              \"completedChallenge\" : \"bd7993c9c69feddfaeb7bdef\"\n          },\n          {\n              \"timestamp\" : 1462882083863,\n              \"completedChallenge\" : \"bd7993c9ca9feddfaeb7bdef\"\n          },\n          {\n              \"timestamp\" : 1462882866679,\n              \"completedChallenge\" : \"56533eb9ac21ba0edf2244ae\"\n          },\n          {\n              \"timestamp\" : 1462883294849,\n              \"completedChallenge\" : \"56533eb9ac21ba0edf2244af\"\n          },\n          {\n              \"timestamp\" : 1462883485430,\n              \"completedChallenge\" : \"56533eb9ac21ba0edf2244b0\"\n          },\n          {\n              \"timestamp\" : 1462883605850,\n              \"completedChallenge\" : \"56533eb9ac21ba0edf2244b1\"\n          },\n          {\n              \"timestamp\" : 1462883680665,\n              \"completedChallenge\" : \"56533eb9ac21ba0edf2244b2\"\n          },\n          {\n              \"timestamp\" : 1462884364080,\n              \"completedChallenge\" : \"56533eb9ac21ba0edf2244b3\"\n          },\n          {\n              \"timestamp\" : 1462884476294,\n              \"completedChallenge\" : \"bd7123c9c444eddfaeb5bdef\"\n          },\n          {\n              \"timestamp\" : 1462884836703,\n              \"completedChallenge\" : \"56533eb9ac21ba0edf2244b5\"\n          },\n          {\n              \"timestamp\" : 1462885203638,\n              \"completedChallenge\" : \"56533eb9ac21ba0edf2244b4\"\n          },\n          {\n              \"timestamp\" : 1462885424595,\n              \"completedChallenge\" : \"56533eb9ac21ba0edf2244b6\"\n          },\n          {\n              \"timestamp\" : 1462928504015,\n              \"completedChallenge\" : \"56533eb9ac21ba0edf2244b7\"\n          },\n          {\n              \"timestamp\" : 1462928786479,\n              \"completedChallenge\" : \"56533eb9ac21ba0edf2244b8\"\n          },\n          {\n              \"timestamp\" : 1462929160649,\n              \"completedChallenge\" : \"56533eb9ac21ba0edf2244b9\"\n          },\n          {\n              \"timestamp\" : 1462929332489,\n              \"completedChallenge\" : \"56533eb9ac21ba0edf2244ed\"\n          },\n          {\n              \"timestamp\" : 1462929600133,\n              \"completedChallenge\" : \"bd7123c9c448eddfaeb5bdef\"\n          },\n          {\n              \"timestamp\" : 1462930382328,\n              \"completedChallenge\" : \"bd7123c9c549eddfaeb5bdef\"\n          },\n          {\n              \"timestamp\" : 1462931131701,\n              \"completedChallenge\" : \"56533eb9ac21ba0edf2244ba\"\n          },\n          {\n              \"timestamp\" : 1462931979558,\n              \"completedChallenge\" : \"bd7123c9c450eddfaeb5bdef\"\n          },\n          {\n              \"timestamp\" : 1462932119783,\n              \"completedChallenge\" : \"bd7123c9c451eddfaeb5bdef\"\n          },\n          {\n              \"timestamp\" : 1462932438256,\n              \"completedChallenge\" : \"bd7123c9c452eddfaeb5bdef\"\n          },\n          {\n              \"timestamp\" : 1462933080563,\n              \"completedChallenge\" : \"56533eb9ac21ba0edf2244bb\"\n          },\n          {\n              \"timestamp\" : 1462934128127,\n              \"completedChallenge\" : \"bd7993c9c69feddfaeb8bdef\"\n          },\n          {\n              \"timestamp\" : 1462934237148,\n              \"completedChallenge\" : \"cf1111c1c11feddfaeb7bdef\"\n          },\n          {\n              \"timestamp\" : 1462934388602,\n              \"completedChallenge\" : \"56bbb991ad1ed5201cd392ca\"\n          },\n          {\n              \"timestamp\" : 1462935267711,\n              \"completedChallenge\" : \"cf1111c1c11feddfaeb8bdef\"\n          },\n          {\n              \"timestamp\" : 1462935674245,\n              \"completedChallenge\" : \"56592a60ddddeae28f7aa8e1\"\n          },\n          {\n              \"timestamp\" : 1462935777417,\n              \"completedChallenge\" : \"56bbb991ad1ed5201cd392cb\"\n          },\n          {\n              \"timestamp\" : 1462935971612,\n              \"completedChallenge\" : \"56bbb991ad1ed5201cd392cc\"\n          },\n          {\n              \"timestamp\" : 1462935995505,\n              \"completedChallenge\" : \"56bbb991ad1ed5201cd392cd\"\n          },\n          {\n              \"timestamp\" : 1462936228491,\n              \"completedChallenge\" : \"56bbb991ad1ed5201cd392ce\"\n          },\n          {\n              \"timestamp\" : 1462936586564,\n              \"completedChallenge\" : \"56533eb9ac21ba0edf2244bc\"\n          },\n          {\n              \"timestamp\" : 1462936980281,\n              \"completedChallenge\" : \"56bbb991ad1ed5201cd392cf\"\n          },\n          {\n              \"timestamp\" : 1462937636195,\n              \"completedChallenge\" : \"56533eb9ac21ba0edf2244bd\"\n          },\n          {\n              \"timestamp\" : 1462938267271,\n              \"completedChallenge\" : \"56533eb9ac21ba0edf2244be\"\n          },\n          {\n              \"timestamp\" : 1462945970622,\n              \"completedChallenge\" : \"56533eb9ac21ba0edf2244bf\"\n          },\n          {\n              \"timestamp\" : 1462946283912,\n              \"completedChallenge\" : \"56533eb9ac21ba0edf2244c0\"\n          },\n          {\n              \"timestamp\" : 1462946402831,\n              \"completedChallenge\" : \"56533eb9ac21ba0edf2244c2\"\n          },\n          {\n              \"timestamp\" : 1462946638280,\n              \"completedChallenge\" : \"56533eb9ac21ba0edf2244c3\"\n          },\n          {\n              \"timestamp\" : 1462947515435,\n              \"completedChallenge\" : \"56533eb9ac21ba0edf2244c6\"\n          },\n          {\n              \"timestamp\" : 1462947695382,\n              \"completedChallenge\" : \"bd7123c9c441eddfaeb5bdef\"\n          },\n          {\n              \"timestamp\" : 1462947959846,\n              \"completedChallenge\" : \"cf1111c1c12feddfaeb3bdef\"\n          },\n          {\n              \"timestamp\" : 1462948169192,\n              \"completedChallenge\" : \"56533eb9ac21ba0edf2244d0\"\n          },\n          {\n              \"timestamp\" : 1462948373286,\n              \"completedChallenge\" : \"56533eb9ac21ba0edf2244d1\"\n          },\n          {\n              \"timestamp\" : 1462948435565,\n              \"completedChallenge\" : \"56533eb9ac21ba0edf2244d2\"\n          },\n          {\n              \"timestamp\" : 1462948496967,\n              \"completedChallenge\" : \"56533eb9ac21ba0edf2244d3\"\n          },\n          {\n              \"timestamp\" : 1462948583533,\n              \"completedChallenge\" : \"56533eb9ac21ba0edf2244d4\"\n          },\n          {\n              \"timestamp\" : 1462948741805,\n              \"completedChallenge\" : \"56533eb9ac21ba0edf2244d5\"\n          },\n          {\n              \"timestamp\" : 1462948764506,\n              \"completedChallenge\" : \"56533eb9ac21ba0edf2244d6\"\n          },\n          {\n              \"timestamp\" : 1462948786474,\n              \"completedChallenge\" : \"56533eb9ac21ba0edf2244d7\"\n          },\n          {\n              \"timestamp\" : 1462949450043,\n              \"completedChallenge\" : \"56533eb9ac21ba0edf2244d8\"\n          },\n          {\n              \"timestamp\" : 1462950380613,\n              \"completedChallenge\" : \"56533eb9ac21ba0edf2244d9\"\n          },\n          {\n              \"timestamp\" : 1462950810171,\n              \"completedChallenge\" : \"56533eb9ac21ba0edf2244da\"\n          },\n          {\n              \"timestamp\" : 1462951052946,\n              \"completedChallenge\" : \"56533eb9ac21ba0edf2244db\"\n          },\n          {\n              \"timestamp\" : 1462952233276,\n              \"completedChallenge\" : \"5690307fddb111c6084545d7\"\n          },\n          {\n              \"timestamp\" : 1462952920080,\n              \"completedChallenge\" : \"56533eb9ac21ba0edf2244dc\"\n          },\n          {\n              \"timestamp\" : 1462955735383,\n              \"completedChallenge\" : \"5664820f61c48e80c9fa476c\"\n          },\n          {\n              \"timestamp\" : 1462957184771,\n              \"completedChallenge\" : \"56533eb9ac21ba0edf2244dd\"\n          },\n          {\n              \"timestamp\" : 1462957970167,\n              \"completedChallenge\" : \"56533eb9ac21ba0edf2244de\"\n          },\n          {\n              \"timestamp\" : 1462963834193,\n              \"completedChallenge\" : \"56533eb9ac21ba0edf2244df\"\n          },\n          {\n              \"timestamp\" : 1462964351154,\n              \"completedChallenge\" : \"56533eb9ac21ba0edf2244e0\"\n          }\n      ],\n      \"challengeMap\" : {\n          \"bd7158d8c442eddfbeb5bd1f\" : {\n              \"id\" : \"bd7158d8c442eddfbeb5bd1f\",\n              \"challengeType\" : 7,\n              \"name\" : \"Get Set for our Front End Development Projects\",\n              \"completedDate\" : 1461850905694,\n              \"lastUpdated\" : 1462849251440\n          },\n          \"bd7158d2c442eddfbeb5bd1f\" : {\n              \"id\" : \"bd7158d2c442eddfbeb5bd1f\",\n              \"challengeType\" : 7,\n              \"name\" : \"Get Set for our Algorithm Challenges\",\n              \"completedDate\" : 1461854044008\n          },\n          \"a302f7aae1aa3152a5b413bc\" : {\n              \"id\" : \"a302f7aae1aa3152a5b413bc\",\n              \"challengeType\" : 5,\n              \"solution\" : \"function factorialize(num) {\\n  var result =1;\\n  for(var i=1;i<=num;i++){\\n    result = result*i;\\n  }\\n  return result;\\n}\\n\\nfactorialize(5);\\n\",\n              \"name\" : \"Factorialize a Number\",\n              \"completedDate\" : 1461899275997\n          },\n          \"ab31c21b530c0dafa9e241ee\" : {\n              \"id\" : \"ab31c21b530c0dafa9e241ee\",\n              \"challengeType\" : 5,\n              \"solution\" : \"function slasher(arr, howMany) {\\n  // it doesn't always pay to be first\\n  arr.splice(arr,howMany);\\n  return arr;\\n}\\n\\nslasher([1, 2, 3], 2);\\n\",\n              \"name\" : \"Slasher Flick\",\n              \"completedDate\" : 1462101383356\n          },\n          \"a24c1a4622e3c05097f71d67\" : {\n              \"id\" : \"a24c1a4622e3c05097f71d67\",\n              \"challengeType\" : 5,\n              \"solution\" : \"function where(arr, num) {\\n  // Find my place in this sorted array.\\n  arr.push(num);\\n  arr.sort(function(a,b){\\n    return a-b;\\n  });\\n  return arr.indexOf(num);\\n}\\n\\nwhere([40, 60], 50);\\n\",\n              \"name\" : \"Where do I belong\",\n              \"completedDate\" : 1462109037998)\n          },\n          \"560add10cb82ac38a17513be\" : {\n              \"id\" : \"560add10cb82ac38a17513be\",\n              \"challengeType\" : 7,\n              \"name\" : \"Learn how Free Code Camp Works\",\n              \"completedDate\" : 1462241078035)\n          },\n          \"560add37cb82ac38a17513bf\" : {\n              \"id\" : \"560add37cb82ac38a17513bf\",\n              \"challengeType\" : 7,\n              \"name\" : \"Create a GitHub Account and Join our Chat Rooms\",\n              \"completedDate\" : 1462242032955)\n          },\n          \"560add56cb82ac38a17513c0\" : {\n              \"id\" : \"560add56cb82ac38a17513c0\",\n              \"challengeType\" : 7,\n              \"name\" : \"Configure your Code Portfolio\",\n              \"completedDate\" : 1462242257256)\n          },\n          \"560add71cb82ac38a17513c2\" : {\n              \"id\" : \"560add71cb82ac38a17513c2\",\n              \"challengeType\" : 7,\n              \"name\" : \"Join a Campsite in Your City\",\n              \"completedDate\" : 1462242295554)\n          },\n          \"560add8ccb82ac38a17513c4\" : {\n              \"id\" : \"560add8ccb82ac38a17513c4\",\n              \"challengeType\" : 7,\n              \"name\" : \"Learn What to Do If You Get Stuck\",\n              \"completedDate\" : 1462242514658)\n          },\n          \"bd7123c8c441eddfaeb5bdef\" : {\n              \"id\" : \"bd7123c8c441eddfaeb5bdef\",\n              \"challengeType\" : 0,\n              \"solution\" : \"<h1>Hello world</h1>\\n\",\n              \"name\" : \"Say Hello to HTML Element\",\n              \"completedDate\" : 1462244368153),\n              \"lastUpdated\" : 1462244636559)\n          },\n          \"bad87fee1348bd9aedf0887a\" : {\n              \"id\" : \"bad87fee1348bd9aedf0887a\",\n              \"challengeType\" : 0,\n              \"solution\" : \"<h1>Hello World</h1>\\n\\n<h2>CatPhotoApp</h2>\",\n              \"name\" : \"Headline with the h2 Element\",\n              \"completedDate\" : 1462244984451)\n          },\n          \"bad87fee1348bd9aedf08801\" : {\n              \"id\" : \"bad87fee1348bd9aedf08801\",\n              \"challengeType\" : 0,\n              \"solution\" : \"<h1>Hello World</h1>\\n<h2>CatPhotoApp</h2>\\n<p>Hello Paragraph</p>\",\n              \"name\" : \"Inform with the Paragraph Element\",\n              \"completedDate\" : 1462244994182)\n          },\n          \"bad87fee1348bd9aedf08802\" : {\n              \"id\" : \"bad87fee1348bd9aedf08802\",\n              \"challengeType\" : 0,\n              \"solution\" : \"\\n<h1>Hello World</h1>\\n\\n<h2>CatPhotoApp</h2>\\n\\n<p>Hello Paragraph</p>\\n\\n\",\n              \"name\" : \"Uncomment HTML\",\n              \"completedDate\" : 1462245177972),\n              \"lastUpdated\" : 1462245744993)\n          },\n          \"bad87fee1348bd9aedf08804\" : {\n              \"id\" : \"bad87fee1348bd9aedf08804\",\n              \"challengeType\" : 0,\n              \"solution\" : \"<!--\\n<h1>Hello World</h1>\\n-->\\n<h2>CatPhotoApp</h2>\\n<!--\\n<p>Hello Paragraph</p>\\n-->\\n\",\n              \"name\" : \"Comment out HTML\",\n              \"completedDate\" : 1462245377880),\n              \"lastUpdated\" : 1462245751912)\n          },\n          \"bad87fee1348bd9aedf08833\" : {\n              \"id\" : \"bad87fee1348bd9aedf08833\",\n              \"challengeType\" : 0,\n              \"solution\" : \"<h1>西游记</h1>\\n\\n<h2>齐天大圣</h2>\\n\\n<h2>孙悟空</h2>\\n\\n<p>Monkey code 猴哥猴哥，你真了不得，金箍棒在手，问世间谁是英雄。</p>\\n\",\n              \"name\" : \"Fill in the Blank with Placeholder Text\",\n              \"completedDate\" : 1462251352803),\n              \"lastUpdated\" : 1462353308258)\n          },\n          \"bad87fed1348bd9aedf08833\" : {\n              \"id\" : \"bad87fed1348bd9aedf08833\",\n              \"challengeType\" : 0,\n              \"solution\" : \"\\n\\n<h2>我家的猫咪</h2>\\n\\n<p>在大家心目中，猫是慵懒的可爱的化身，它可以睡饱了再起来吃饭，可以逗趣小耗子，可以卖得了萌，使得了坏，这样百变的小怪兽就集结在一只宠物上，可猫可狗。</p>\\n\",\n              \"name\" : \"Delete HTML Elements\",\n              \"completedDate\" : 1462251406737),\n              \"lastUpdated\" : 1462353599633)\n          },\n          \"bad87fee1348bd9aedf08803\" : {\n              \"id\" : \"bad87fee1348bd9aedf08803\",\n              \"challengeType\" : 0,\n              \"solution\" : \"<style>\\n  h2{color:red;}\\n</style>\\n<h2>我家的猫咪</h2>\\n\\n<p>在大家心目中，猫是慵懒的可爱的化身，它可以睡饱了再起来吃饭，可以逗趣小耗子，可以卖得了萌，使得了坏，这样百变的小怪兽就集结在一只宠物上，可猫可狗。</p>\\n\",\n              \"name\" : \"Change the Color of Text\",\n              \"completedDate\" : 1462251577194),\n              \"lastUpdated\" : 1462355574112)\n          },\n          \"bad87fee1348bd9aedf08805\" : {\n              \"id\" : \"bad87fee1348bd9aedf08805\",\n              \"challengeType\" : 0,\n              \"solution\" : \"<style>\\n  h2{color:blue;}\\n</style>\\n<h2>CatPhotoApp</h2>\\n\\n<p>Kitty ipsum dolor sit amet, shed everywhere shed everywhere stretching attack your ankles chase the red dot, hairball run catnip eat the grass sniff.</p>\\n\",\n              \"name\" : \"Use CSS Selectors to Style Elements\",\n              \"completedDate\" : 1462252013280),\n              \"lastUpdated\" : 1462355584415)\n          },\n          \"bad87fee1348bd9aecf08806\" : {\n              \"id\" : \"bad87fee1348bd9aecf08806\",\n              \"challengeType\" : 0,\n              \"solution\" : \"<style>\\n  .red-text {\\n    color: red;\\n  }\\n</style>\\n\\n<h2 class=\\\"red-text\\\">CatPhotoApp</h2>\\n\\n<p>Kitty ipsum dolor sit amet, shed everywhere shed everywhere stretching attack your ankles chase the red dot, hairball run catnip eat the grass sniff.</p>\\n\",\n              \"name\" : \"Use a CSS Class to Style an Element\",\n              \"completedDate\" : 1462355644231)\n          },\n          \"bad87fee1348bd9aefe08806\" : {\n              \"id\" : \"bad87fee1348bd9aefe08806\",\n              \"challengeType\" : 0,\n              \"solution\" : \"<style>\\n  .red-text {\\n    color: red;\\n  }\\n</style>\\n\\n<h2 class=\\\"red-text\\\">CatPhotoApp</h2>\\n\\n<p class=\\\"red-text\\\">在大家心目中，猫是慵懒的可爱的化身，它可以睡饱了再起来吃饭，可以逗趣小耗子，可以卖得了萌，使得了坏，这样百变的小怪兽就集结在一只宠物上，可猫可狗。</p>\\n\",\n              \"name\" : \"Style Multiple Elements with a CSS Class\",\n              \"completedDate\" : 1462355683651)\n          },\n          \"bad87fee1348bd9aedf08806\" : {\n              \"id\" : \"bad87fee1348bd9aedf08806\",\n              \"challengeType\" : 0,\n              \"solution\" : \"<style>\\n  .red-text {\\n    color: red;\\n  }\\n  p{font-size:16px;}\\n</style>\\n\\n<h2 class=\\\"red-text\\\">CatPhotoApp</h2>\\n\\n<p class=\\\"red-text\\\">在大家心目中，猫是慵懒的可爱的化身，它可以睡饱了再起来吃饭，可以逗趣小耗子，可以卖得了萌，使得了坏，这样百变的小怪兽就集结在一只宠物上，可猫可狗。</p>\\n\\n<p>Purr jump eat the grass rip the couch scratched sunbathe, shed everywhere rip the couch sleep in the sink fluffy fur catnip scratched.</p>\",\n              \"name\" : \"Change the Font Size of an Element\",\n              \"completedDate\" : 1462355744710)\n          },\n          \"bad87fee1348bd9aede08807\" : {\n              \"id\" : \"bad87fee1348bd9aede08807\",\n              \"challengeType\" : 0,\n              \"solution\" : \"<style>\\n  .red-text {\\n    color: red;\\n  }\\n\\n  p {\\n    font-size: 16px;\\n    font-family: Monospace;\\n  }\\n</style>\\n\\n<h2 class=\\\"red-text\\\">CatPhotoApp</h2>\\n\\n<p class=\\\"red-text\\\">在大家心目中，猫是慵懒的可爱的化身，它可以睡饱了再起来吃饭，可以逗趣小耗子，可以卖得了萌，使得了坏，这样百变的小怪兽就集结在一只宠物上，可猫可狗。</p>\\n<p>Purr jump eat the grass rip the couch scratched sunbathe, shed everywhere rip the couch sleep in the sink fluffy fur catnip scratched.</p>\\n\",\n              \"name\" : \"Set the Font Family of an Element\",\n              \"completedDate\" : 1462355762618)\n          },\n          \"bad87fee1348bd9aedf08807\" : {\n              \"id\" : \"bad87fee1348bd9aedf08807\",\n              \"challengeType\" : 0,\n              \"solution\" : \"<link href=\\\"https://fonts.gdgdocs.org/css?family=Lobster\\\" rel=\\\"stylesheet\\\" type=\\\"text/css\\\">\\n<style>\\n  .red-text {\\n    color: red;\\n  }\\n  h2 {font-family:Lobster;}\\n  p {\\n    font-size: 16px;\\n    font-family: Monospace;\\n  }\\n</style>\\n\\n<h2 class=\\\"red-text\\\">CatPhotoApp</h2>\\n\\n<p class=\\\"red-text\\\">在大家心目中，猫是慵懒的可爱的化身，它可以睡饱了再起来吃饭，可以逗趣小耗子，可以卖得了萌，使得了坏，这样百变的小怪兽就集结在一只宠物上，可猫可狗。</p>\\n<p class=\\\"red-text\\\">Purr jump eat the grass rip the couch scratched sunbathe, shed everywhere rip the couch sleep in the sink fluffy fur catnip scratched.</p>\\n\",\n              \"name\" : \"Import a Google Font\",\n              \"completedDate\" : 1462356332290)\n          },\n          \"bad87fee1348bd9aedf08808\" : {\n              \"id\" : \"bad87fee1348bd9aedf08808\",\n              \"challengeType\" : 0,\n              \"solution\" : \"<!--<link href=\\\"https://fonts.gdgdocs.org/css?family=Lobster\\\" rel=\\\"stylesheet\\\" type=\\\"text/css\\\">-->\\n<style>\\n  .red-text {\\n    color: red;\\n  }\\n\\n  h2 {\\n    font-family: Lobster, Monospace;\\n  }\\n\\n  p {\\n    font-size: 16px;\\n    font-family: Monospace;\\n  }\\n</style>\\n\\n<h2 class=\\\"red-text\\\">CatPhotoApp</h2>\\n\\n<p class=\\\"red-text\\\">在大家心目中，猫是慵懒的可爱的化身，它可以睡饱了再起来吃饭，可以逗趣小耗子，可以卖得了萌，使得了坏，这样百变的小怪兽就集结在一只宠物上，可猫可狗。</p>\\n<p class=\\\"red-text\\\">Purr jump eat the grass rip the couch scratched sunbathe, shed everywhere rip the couch sleep in the sink fluffy fur catnip scratched.</p>\\n\",\n              \"name\" : \"Specify How Fonts Should Degrade\",\n              \"completedDate\" : 1462356358287)\n          },\n          \"bad87fee1348bd9aedf08812\" : {\n              \"id\" : \"bad87fee1348bd9aedf08812\",\n              \"challengeType\" : 0,\n              \"solution\" : \"<link href=\\\"https://fonts.gdgdocs.org/css?family=Lobster\\\" rel=\\\"stylesheet\\\" type=\\\"text/css\\\">\\n<style>\\n  .red-text {\\n    color: red;\\n  }\\n\\n  h2 {\\n    font-family: Lobster, Monospace;\\n  }\\n\\n  p {\\n    font-size: 16px;\\n    font-family: Monospace;\\n  }\\n</style>\\n\\n<h2 class=\\\"red-text\\\">我家的猫咪</h2>\\n<img src=\\\"/images/relaxing-cat.jpg\\\" alt=\\\"\\\">\\n<p class=\\\"red-text\\\">猫咪猫咪我就喜欢你</p>\\n<p class=\\\"red-text\\\">深深地爱上你</p>\\n<p class=\\\"red-text\\\">没有理由没有原因</p>\\n<p class=\\\"red-text\\\">从见到你的那一天起</p>\\n<p class=\\\"red-text\\\">你知道我在等你吗?</p>\\n<p class=\\\"red-text\\\">你如果真的在乎我</p>\\n<p class=\\\"red-text\\\">又怎会让无尽的夜陪我度过</p>\\n<p class=\\\"red-text\\\">猫咪猫咪我就喜欢你</p>\\n<p class=\\\"red-text\\\">深深地爱上你</p>\\n<p class=\\\"red-text\\\">在黑夜里倾听你的声音</p>\\n\",\n              \"name\" : \"Add Images to your Website\",\n              \"completedDate\" : 1462356369465,\n              \"lastUpdated\" : 1462424785609\n          },\n          \"bad87fee1348bd9acdf08812\" : {\n              \"id\" : \"bad87fee1348bd9acdf08812\",\n              \"challengeType\" : 0,\n              \"solution\" : \"<link href=\\\"https://fonts.gdgdocs.org/css?family=Lobster\\\" rel=\\\"stylesheet\\\" type=\\\"text/css\\\">\\n<style>\\n  .red-text {\\n    color: red;\\n  }\\n\\n  h2 {\\n    font-family: Lobster, Monospace;\\n  }\\n\\n  p {\\n    font-size: 16px;\\n    font-family: Monospace;\\n  }\\n  \\n  .smaller-image {\\n    width:100px;\\n  }\\n</style>\\n\\n<h2 class=\\\"red-text\\\">CatPhotoApp</h2>\\n\\n<img src=\\\"https://bit.ly/fcc-relaxing-cat\\\" class=\\\"smaller-image\\\">\\n\\n<p class=\\\"red-text\\\">在大家心目中，猫是慵懒的可爱的化身，它可以睡饱了再起来吃饭，可以逗趣小耗子，可以卖得了萌，使得了坏，这样百变的小怪兽就集结在一只宠物上，可猫可狗。</p>\\n<p class=\\\"red-text\\\">Purr jump eat the grass rip the couch scratched sunbathe, shed everywhere rip the couch sleep in the sink fluffy fur catnip scratched.</p>\\n\",\n              \"name\" : \"Size your Images\",\n              \"completedDate\" : 1462356639113,\n              \"lastUpdated\" : 1462424795870\n          },\n          \"bad87fee1348bd9bedf08813\" : {\n              \"id\" : \"bad87fee1348bd9bedf08813\",\n              \"challengeType\" : 0,\n              \"solution\" : \"<link href=\\\"https://fonts.gdgdocs.org/css?family=Lobster\\\" rel=\\\"stylesheet\\\" type=\\\"text/css\\\">\\n<style>\\n  .red-text {\\n    color: red;\\n  }\\n\\n  h2 {\\n    font-family: Lobster, Monospace;\\n  }\\n\\n  p {\\n    font-size: 16px;\\n    font-family: Monospace;\\n  }\\n\\n  .smaller-image {\\n    width: 100px;\\n  }\\n  \\n  .thick-green-border{\\n    border-width:10px;\\n    border-style:solid;\\n    border-color:green;\\n  }\\n</style>\\n\\n<h2 class=\\\"red-text\\\">CatPhotoApp</h2>\\n\\n<img class=\\\"smaller-image thick-green-border\\\" src=\\\"/images/relaxing-cat.jpg\\\">\\n\\n<p class=\\\"red-text\\\">在大家心目中，猫是慵懒的可爱的化身，它可以睡饱了再起来吃饭，可以逗趣小耗子，可以卖得了萌，使得了坏，这样百变的小怪兽就集结在一只宠物上，可猫可狗。</p>\\n<p class=\\\"red-text\\\">Purr jump eat the grass rip the couch scratched sunbathe, shed everywhere rip the couch sleep in the sink fluffy fur catnip scratched.</p>\\n\",\n              \"name\" : \"Add Borders Around your Elements\",\n              \"completedDate\" : 1462356710012,\n              \"lastUpdated\" : 1462424962674\n          },\n          \"bad87fee1348bd9aedf08814\" : {\n              \"id\" : \"bad87fee1348bd9aedf08814\",\n              \"challengeType\" : 0,\n              \"solution\" : \"<link href=\\\"https://fonts.gdgdocs.org/css?family=Lobster\\\" rel=\\\"stylesheet\\\" type=\\\"text/css\\\">\\n<style>\\n  .red-text {\\n    color: red;\\n  }\\n\\n  h2 {\\n    font-family: Lobster, Monospace;\\n  }\\n\\n  p {\\n    font-size: 16px;\\n    font-family: Monospace;\\n  }\\n\\n  .thick-green-border {\\n    border-color: green;\\n    border-width: 10px;\\n    border-style: solid;\\n    border-radius: 10px;\\n  }\\n\\n  .smaller-image {\\n    width: 100px;\\n  }\\n</style>\\n\\n<h2 class=\\\"red-text\\\">CatPhotoApp</h2>\\n\\n<img class=\\\"smaller-image thick-green-border\\\" src=\\\"/images/relaxing-cat.jpg\\\">\\n\\n<p class=\\\"red-text\\\">Kitty ipsum dolor sit amet, shed everywhere shed everywhere stretching attack your ankles chase the red dot, hairball run catnip eat the grass sniff.</p>\\n<p class=\\\"red-text\\\">Purr jump eat the grass rip the couch scratched sunbathe, shed everywhere rip the couch sleep in the sink fluffy fur catnip scratched.</p>\\n\",\n              \"name\" : \"Add Rounded Corners with a Border Radius\",\n              \"completedDate\" : 1462425068659\n          },\n          \"bad87fee1348bd9aedf08815\" : {\n              \"id\" : \"bad87fee1348bd9aedf08815\",\n              \"challengeType\" : 0,\n              \"solution\" : \"<link href=\\\"https://fonts.gdgdocs.org/css?family=Lobster\\\" rel=\\\"stylesheet\\\" type=\\\"text/css\\\">\\n<style>\\n  .red-text {\\n    color: red;\\n  }\\n\\n  h2 {\\n    font-family: Lobster, Monospace;\\n  }\\n\\n  p {\\n    font-size: 16px;\\n    font-family: Monospace;\\n  }\\n\\n  .thick-green-border {\\n    border-color: green;\\n    border-width: 10px;\\n    border-style: solid;\\n    border-radius: 50%;\\n  }\\n\\n  .smaller-image {\\n    width: 100px;\\n  }\\n</style>\\n\\n<h2 class=\\\"red-text\\\">CatPhotoApp</h2>\\n\\n<img class=\\\"smaller-image thick-green-border\\\" src=\\\"/images/relaxing-cat.jpg\\\">\\n\\n<p class=\\\"red-text\\\">Kitty ipsum dolor sit amet, shed everywhere shed everywhere stretching attack your ankles chase the red dot, hairball run catnip eat the grass sniff.</p>\\n<p class=\\\"red-text\\\">Purr jump eat the grass rip the couch scratched sunbathe, shed everywhere rip the couch sleep in the sink fluffy fur catnip scratched.</p>\\n\",\n              \"name\" : \"Make Circular Images with a Border Radius\",\n              \"completedDate\" : 1462425096436\n          },\n          \"bad87fee1348bd9aedf08816\" : {\n              \"id\" : \"bad87fee1348bd9aedf08816\",\n              \"challengeType\" : 0,\n              \"solution\" : \"<link href=\\\"https://fonts.gdgdocs.org/css?family=Lobster\\\" rel=\\\"stylesheet\\\" type=\\\"text/css\\\">\\n<style>\\n  .red-text {\\n    color: red;\\n  }\\n\\n  h2 {\\n    font-family: Lobster, Monospace;\\n  }\\n\\n  p {\\n    font-size: 16px;\\n    font-family: Monospace;\\n  }\\n\\n  .thick-green-border {\\n    border-color: green;\\n    border-width: 10px;\\n    border-style: solid;\\n    border-radius: 50%;\\n  }\\n\\n  .smaller-image {\\n    width: 100px;\\n  }\\n</style>\\n\\n<h2 class=\\\"red-text\\\">CatPhotoApp</h2>\\n\\n<img class=\\\"smaller-image thick-green-border\\\" src=\\\"/images/relaxing-cat.jpg\\\">\\n\\n<a href=\\\"http://freecatphotoapp.com\\\">cat photos</a>\\n\\n<p class=\\\"red-text\\\">在大家心目中，猫是慵懒的可爱的化身，它可以睡饱了再起来吃饭，可以逗趣小耗子，可以卖得了萌，使得了坏，这样百变的小怪兽就集结在一只宠物上，可猫可狗。</p>\\n<p class=\\\"red-text\\\">Purr jump eat the grass rip the couch scratched sunbathe, shed everywhere rip the couch sleep in the sink fluffy fur catnip scratched.</p>\\n\",\n              \"name\" : \"Link to External Pages with Anchor Elements\",\n              \"completedDate\" : 1462425214181\n          },\n          \"bad87fee1348bd9aede08817\" : {\n              \"id\" : \"bad87fee1348bd9aede08817\",\n              \"challengeType\" : 0,\n              \"solution\" : \"<link href=\\\"https://fonts.gdgdocs.org/css?family=Lobster\\\" rel=\\\"stylesheet\\\" type=\\\"text/css\\\">\\n<style>\\n  .red-text {\\n    color: red;\\n  }\\n\\n  h2 {\\n    font-family: Lobster, Monospace;\\n  }\\n\\n  p {\\n    font-size: 16px;\\n    font-family: Monospace;\\n  }\\n\\n  .thick-green-border {\\n    border-color: green;\\n    border-width: 10px;\\n    border-style: solid;\\n    border-radius: 50%;\\n  }\\n\\n  .smaller-image {\\n    width: 100px;\\n  }\\n</style>\\n\\n<h2 class=\\\"red-text\\\">CatPhotoApp</h2>\\n\\n<p>View more \\n  <a href=\\\"http://www.freecatphotoapp.com\\\">cat photos</a>\\n  \\n</p>\\n\\n<img class=\\\"smaller-image thick-green-border\\\" src=\\\"/images/relaxing-cat.jpg\\\">\\n\\n<p class=\\\"red-text\\\">在大家心目中，猫是慵懒的可爱的化身，它可以睡饱了再起来吃饭，可以逗趣小耗子，可以卖得了萌，使得了坏，这样百变的小怪兽就集结在一只宠物上，可猫可狗。</p>\\n<p class=\\\"red-text\\\">Purr jump eat the grass rip the couch scratched sunbathe, shed everywhere rip the couch sleep in the sink fluffy fur catnip scratched.</p>\\n\",\n              \"name\" : \"Nest an Anchor Element within a Paragraph\",\n              \"completedDate\" : 1462426196990\n          },\n          \"bad87fee1348bd9aedf08817\" : {\n              \"id\" : \"bad87fee1348bd9aedf08817\",\n              \"challengeType\" : 0,\n              \"solution\" : \"<link href=\\\"https://fonts.gdgdocs.org/css?family=Lobster\\\" rel=\\\"stylesheet\\\" type=\\\"text/css\\\">\\n<style>\\n  .red-text {\\n    color: red;\\n  }\\n\\n  h2 {\\n    font-family: Lobster, Monospace;\\n  }\\n\\n  p {\\n    font-size: 16px;\\n    font-family: Monospace;\\n  }\\n\\n  .thick-green-border {\\n    border-color: green;\\n    border-width: 10px;\\n    border-style: solid;\\n    border-radius: 50%;\\n  }\\n\\n  .smaller-image {\\n    width: 100px;\\n  }\\n</style>\\n\\n<h2 class=\\\"red-text\\\">CatPhotoApp</h2>\\n\\n<p>Click here for <a href=\\\"#\\\">cat photos</a>.</p>\\n\\n<img class=\\\"smaller-image thick-green-border\\\" src=\\\"/images/relaxing-cat.jpg\\\">\\n\\n<p class=\\\"red-text\\\">在大家心目中，猫是慵懒的可爱的化身，它可以睡饱了再起来吃饭，可以逗趣小耗子，可以卖得了萌，使得了坏，这样百变的小怪兽就集结在一只宠物上，可猫可狗。</p>\\n<p class=\\\"red-text\\\">Purr jump eat the grass rip the couch scratched sunbathe, shed everywhere rip the couch sleep in the sink fluffy fur catnip scratched.</p>\\n\",\n              \"name\" : \"Make Dead Links using the Hash Symbol\",\n              \"completedDate\" : 1462426422817\n          },\n          \"bad87fee1348bd9aedf08820\" : {\n              \"id\" : \"bad87fee1348bd9aedf08820\",\n              \"challengeType\" : 0,\n              \"solution\" : \"<link href=\\\"https://fonts.gdgdocs.org/css?family=Lobster\\\" rel=\\\"stylesheet\\\" type=\\\"text/css\\\">\\n<style>\\n  .red-text {\\n    color: red;\\n  }\\n\\n  h2 {\\n    font-family: Lobster, Monospace;\\n  }\\n\\n  p {\\n    font-size: 16px;\\n    font-family: Monospace;\\n  }\\n\\n  .thick-green-border {\\n    border-color: green;\\n    border-width: 10px;\\n    border-style: solid;\\n    border-radius: 50%;\\n  }\\n\\n  .smaller-image {\\n    width: 100px;\\n  }\\n</style>\\n\\n<h2 class=\\\"red-text\\\">CatPhotoApp</h2>\\n\\n<p>Click here for <a href=\\\"#\\\">cat photos</a>.</p>\\n\\n<a href=\\\"#\\\"><img class=\\\"smaller-image thick-green-border\\\" src=\\\"/images/relaxing-cat.jpg\\\"></a>\\n\\n<p class=\\\"red-text\\\">在大家心目中，猫是慵懒的可爱的化身，它可以睡饱了再起来吃饭，可以逗趣小耗子，可以卖得了萌，使得了坏，这样百变的小怪兽就集结在一只宠物上，可猫可狗。</p>\\n<p class=\\\"red-text\\\">Purr jump eat the grass rip the couch scratched sunbathe, shed everywhere rip the couch sleep in the sink fluffy fur catnip scratched.</p>\\n\",\n              \"name\" : \"Turn an Image into a Link\",\n              \"completedDate\" : 1462426609369\n          },\n          \"bad87fee1348bd9aedf08818\" : {\n              \"id\" : \"bad87fee1348bd9aedf08818\",\n              \"challengeType\" : 0,\n              \"solution\" : \"<link href=\\\"https://fonts.gdgdocs.org/css?family=Lobster\\\" rel=\\\"stylesheet\\\" type=\\\"text/css\\\">\\n<style>\\n  .red-text {\\n    color: red;\\n  }\\n\\n  h2 {\\n    font-family: Lobster, Monospace;\\n  }\\n\\n  p {\\n    font-size: 16px;\\n    font-family: Monospace;\\n  }\\n\\n  .thick-green-border {\\n    border-color: green;\\n    border-width: 10px;\\n    border-style: solid;\\n    border-radius: 50%;\\n  }\\n\\n  .smaller-image {\\n    width: 100px;\\n  }\\n</style>\\n\\n<h2 class=\\\"red-text\\\">CatPhotoApp</h2>\\n\\n<p>Click here for <a href=\\\"#\\\">cat photos</a>.</p>\\n\\n<a href=\\\"#\\\"><img class=\\\"smaller-image thick-green-border\\\" src=\\\"/images/relaxing-cat.jpg\\\" alt=\\\"A cute orange cat lying on its back\\\"></a>\\n\\n<p class=\\\"red-text\\\">在大家心目中，猫是慵懒的可爱的化身，它可以睡饱了再起来吃饭，可以逗趣小耗子，可以卖得了萌，使得了坏，这样百变的小怪兽就集结在一只宠物上，可猫可狗。</p>\\n<p class=\\\"red-text\\\">Purr jump eat the grass rip the couch scratched sunbathe, shed everywhere rip the couch sleep in the sink fluffy fur catnip scratched.</p>\\n\",\n              \"name\" : \"Add Alt Text to an Image for Accessibility\",\n              \"completedDate\" : 1462426736505\n          },\n          \"bad87fee1348bd9aedf08827\" : {\n              \"id\" : \"bad87fee1348bd9aedf08827\",\n              \"challengeType\" : 0,\n              \"solution\" : \"<link href=\\\"https://fonts.gdgdocs.org/css?family=Lobster\\\" rel=\\\"stylesheet\\\" type=\\\"text/css\\\">\\n<style>\\n  .red-text {\\n    color: red;\\n  }\\n\\n  h2 {\\n    font-family: Lobster, Monospace;\\n  }\\n\\n  p {\\n    font-size: 16px;\\n    font-family: Monospace;\\n  }\\n\\n  .thick-green-border {\\n    border-color: green;\\n    border-width: 10px;\\n    border-style: solid;\\n    border-radius: 50%;\\n  }\\n\\n  .smaller-image {\\n    width: 100px;\\n  }\\n</style>\\n\\n<h2 class=\\\"red-text\\\">CatPhotoApp</h2>\\n\\n<p>Click here for <a href=\\\"#\\\">cat photos</a>.</p>\\n\\n<a href=\\\"#\\\"><img class=\\\"smaller-image thick-green-border\\\" alt=\\\"A cute orange cat lying on its back\\\" src=\\\"/images/relaxing-cat.jpg\\\"></a>\\n\\n<ul>\\n  <li>fish</li>\\n  <li>rabbit</li>\\n  <li>sleep</li>\\n</ul>\\n\",\n              \"name\" : \"Create a Bulleted Unordered List\",\n              \"completedDate\" : 1462752373324\n          },\n          \"bad87fee1348bd9aedf08828\" : {\n              \"id\" : \"bad87fee1348bd9aedf08828\",\n              \"challengeType\" : 0,\n              \"solution\" : \"<link href=\\\"https://fonts.gdgdocs.org/css?family=Lobster\\\" rel=\\\"stylesheet\\\" type=\\\"text/css\\\">\\n<style>\\n  .red-text {\\n    color: red;\\n  }\\n\\n  h2 {\\n    font-family: Lobster, Monospace;\\n  }\\n\\n  p {\\n    font-size: 16px;\\n    font-family: Monospace;\\n  }\\n\\n  .thick-green-border {\\n    border-color: green;\\n    border-width: 10px;\\n    border-style: solid;\\n    border-radius: 50%;\\n  }\\n\\n  .smaller-image {\\n    width: 100px;\\n  }\\n</style>\\n\\n<h2 class=\\\"red-text\\\">CatPhotoApp</h2>\\n\\n<p>Click here for <a href=\\\"#\\\">cat photos</a>.</p>\\n\\n<a href=\\\"#\\\"><img class=\\\"smaller-image thick-green-border\\\" alt=\\\"A cute orange cat lying on its back\\\" src=\\\"/images/relaxing-cat.jpg\\\"></a>\\n\\n<p>Things cats love:</p>\\n<ul>\\n  <li>cat nip</li>\\n  <li>laser pointers</li>\\n  <li>lasagna</li>\\n</ul>\\n<p>Top 3 things cats hate:</p>\\n<ol>\\n  <li>dog</li>\\n  <li>wolf</li>\\n  <li>water</li>\\n</ol>\\n\",\n              \"name\" : \"Create an Ordered List\",\n              \"completedDate\" : 1462752702511\n          },\n          \"bad87fee1348bd9aedf08829\" : {\n              \"id\" : \"bad87fee1348bd9aedf08829\",\n              \"challengeType\" : 0,\n              \"solution\" : \"<link href=\\\"https://fonts.gdgdocs.org/css?family=Lobster\\\" rel=\\\"stylesheet\\\" type=\\\"text/css\\\">\\n<style>\\n  .red-text {\\n    color: red;\\n  }\\n\\n  h2 {\\n    font-family: Lobster, Monospace;\\n  }\\n\\n  p {\\n    font-size: 16px;\\n    font-family: Monospace;\\n  }\\n\\n  .thick-green-border {\\n    border-color: green;\\n    border-width: 10px;\\n    border-style: solid;\\n    border-radius: 50%;\\n  }\\n\\n  .smaller-image {\\n    width: 100px;\\n  }\\n</style>\\n\\n<h2 class=\\\"red-text\\\">CatPhotoApp</h2>\\n\\n<p>Click here for <a href=\\\"#\\\">cat photos</a>.</p>\\n\\n<a href=\\\"#\\\"><img class=\\\"smaller-image thick-green-border\\\" alt=\\\"A cute orange cat lying on its back\\\" src=\\\"/images/relaxing-cat.jpg\\\"></a>\\n\\n<p>Things cats love:</p>\\n<ul>\\n  <li>cat nip</li>\\n  <li>laser pointers</li>\\n  <li>lasagna</li>\\n</ul>\\n<p>Top 3 things cats hate:</p>\\n<ol>\\n  <li>flea treatment</li>\\n  <li>thunder</li>\\n  <li>other cats</li>\\n</ol>\\n<input type=\\\"text\\\">\\n\",\n              \"name\" : \"Create a Text Field\",\n              \"completedDate\" : 1462752725358\n          },\n          \"bad87fee1348bd9aedf08830\" : {\n              \"id\" : \"bad87fee1348bd9aedf08830\",\n              \"challengeType\" : 0,\n              \"solution\" : \"<link href=\\\"https://fonts.gdgdocs.org/css?family=Lobster\\\" rel=\\\"stylesheet\\\" type=\\\"text/css\\\">\\n<style>\\n  .red-text {\\n    color: red;\\n  }\\n\\n  h2 {\\n    font-family: Lobster, Monospace;\\n  }\\n\\n  p {\\n    font-size: 16px;\\n    font-family: Monospace;\\n  }\\n\\n  .thick-green-border {\\n    border-color: green;\\n    border-width: 10px;\\n    border-style: solid;\\n    border-radius: 50%;\\n  }\\n\\n  .smaller-image {\\n    width: 100px;\\n  }\\n</style>\\n\\n<h2 class=\\\"red-text\\\">CatPhotoApp</h2>\\n\\n<p>Click here for <a href=\\\"#\\\">cat photos</a>.</p>\\n\\n<a href=\\\"#\\\"><img class=\\\"smaller-image thick-green-border\\\" alt=\\\"A cute orange cat lying on its back\\\" src=\\\"/images/relaxing-cat.jpg\\\"></a>\\n\\n<p>Things cats love:</p>\\n<ul>\\n  <li>cat nip</li>\\n  <li>laser pointers</li>\\n  <li>lasagna</li>\\n</ul>\\n<p>Top 3 things cats hate:</p>\\n<ol>\\n  <li>flea treatment</li>\\n  <li>thunder</li>\\n  <li>other cats</li>\\n</ol>\\n<input type=\\\"text\\\" placeholder=\\\"cat photo URL\\\" >\\n\",\n              \"name\" : \"Add Placeholder Text to a Text Field\",\n              \"completedDate\" : 1462752993102\n          },\n          \"bad87fee1348bd9aede08830\" : {\n              \"id\" : \"bad87fee1348bd9aede08830\",\n              \"challengeType\" : 0,\n              \"solution\" : \"<link href=\\\"https://fonts.gdgdocs.org/css?family=Lobster\\\" rel=\\\"stylesheet\\\" type=\\\"text/css\\\">\\n<style>\\n  .red-text {\\n    color: red;\\n  }\\n\\n  h2 {\\n    font-family: Lobster, Monospace;\\n  }\\n\\n  p {\\n    font-size: 16px;\\n    font-family: Monospace;\\n  }\\n\\n  .thick-green-border {\\n    border-color: green;\\n    border-width: 10px;\\n    border-style: solid;\\n    border-radius: 50%;\\n  }\\n\\n  .smaller-image {\\n    width: 100px;\\n  }\\n</style>\\n\\n<h2 class=\\\"red-text\\\">CatPhotoApp</h2>\\n\\n<p>Click here for <a href=\\\"#\\\">cat photos</a>.</p>\\n\\n<a href=\\\"#\\\"><img class=\\\"smaller-image thick-green-border\\\" alt=\\\"A cute orange cat lying on its back\\\" src=\\\"/images/relaxing-cat.jpg\\\"></a>\\n\\n<p>Things cats love:</p>\\n<ul>\\n  <li>cat nip</li>\\n  <li>laser pointers</li>\\n  <li>lasagna</li>\\n</ul>\\n<p>Top 3 things cats hate:</p>\\n<ol>\\n  <li>flea treatment</li>\\n  <li>thunder</li>\\n  <li>other cats</li>\\n</ol>\\n<form action=\\\"/submit-cat-photo\\\">\\n  <input type=\\\"text\\\" placeholder=\\\"cat photo URL\\\">\\n</form>\\n\\n\",\n              \"name\" : \"Create a Form Element\",\n              \"completedDate\" : 1462753185378\n          },\n          \"bad87fee1348bd9aedd08830\" : {\n              \"id\" : \"bad87fee1348bd9aedd08830\",\n              \"challengeType\" : 0,\n              \"solution\" : \"<link href=\\\"https://fonts.gdgdocs.org/css?family=Lobster\\\" rel=\\\"stylesheet\\\" type=\\\"text/css\\\">\\n<style>\\n  .red-text {\\n    color: red;\\n  }\\n\\n  h2 {\\n    font-family: Lobster, Monospace;\\n  }\\n\\n  p {\\n    font-size: 16px;\\n    font-family: Monospace;\\n  }\\n\\n  .thick-green-border {\\n    border-color: green;\\n    border-width: 10px;\\n    border-style: solid;\\n    border-radius: 50%;\\n  }\\n\\n  .smaller-image {\\n    width: 100px;\\n  }\\n</style>\\n\\n<h2 class=\\\"red-text\\\">CatPhotoApp</h2>\\n\\n<p>Click here for <a href=\\\"#\\\">cat photos</a>.</p>\\n\\n<a href=\\\"#\\\"><img class=\\\"smaller-image thick-green-border\\\" alt=\\\"A cute orange cat lying on its back\\\" src=\\\"/images/relaxing-cat.jpg\\\"></a>\\n\\n<p>Things cats love:</p>\\n<ul>\\n  <li>cat nip</li>\\n  <li>laser pointers</li>\\n  <li>lasagna</li>\\n</ul>\\n<p>Top 3 things cats hate:</p>\\n<ol>\\n  <li>flea treatment</li>\\n  <li>thunder</li>\\n  <li>other cats</li>\\n</ol>\\n<form action=\\\"/submit-cat-photo\\\">\\n  <input type=\\\"text\\\" placeholder=\\\"cat photo URL\\\">\\n  <button type=\\\"submit\\\">Submit</button>\\n</form>\\n\",\n              \"name\" : \"Add a Submit Button to a Form\",\n              \"completedDate\" : 1462753266395\n          },\n          \"bad87fee1348bd9aedc08830\" : {\n              \"id\" : \"bad87fee1348bd9aedc08830\",\n              \"challengeType\" : 0,\n              \"solution\" : \"<link href=\\\"https://fonts.gdgdocs.org/css?family=Lobster\\\" rel=\\\"stylesheet\\\" type=\\\"text/css\\\">\\n<style>\\n  .red-text {\\n    color: red;\\n  }\\n\\n  h2 {\\n    font-family: Lobster, Monospace;\\n  }\\n\\n  p {\\n    font-size: 16px;\\n    font-family: Monospace;\\n  }\\n\\n  .thick-green-border {\\n    border-color: green;\\n    border-width: 10px;\\n    border-style: solid;\\n    border-radius: 50%;\\n  }\\n\\n  .smaller-image {\\n    width: 100px;\\n  }\\n</style>\\n\\n<h2 class=\\\"red-text\\\">CatPhotoApp</h2>\\n\\n<p>Click here for <a href=\\\"#\\\">cat photos</a>.</p>\\n\\n<a href=\\\"#\\\"><img class=\\\"smaller-image thick-green-border\\\" alt=\\\"A cute orange cat lying on its back\\\" src=\\\"/images/relaxing-cat.jpg\\\"></a>\\n\\n<p>Things cats love:</p>\\n<ul>\\n  <li>cat nip</li>\\n  <li>laser pointers</li>\\n  <li>lasagna</li>\\n</ul>\\n<p>Top 3 things cats hate:</p>\\n<ol>\\n  <li>flea treatment</li>\\n  <li>thunder</li>\\n  <li>other cats</li>\\n</ol>\\n<form action=\\\"/submit-cat-photo\\\">\\n  <input type=\\\"text\\\" placeholder=\\\"cat photo URL\\\" required>\\n  <button type=\\\"submit\\\">Submit</button>\\n</form>\\n\",\n              \"name\" : \"Use HTML5 to Require a Field\",\n              \"completedDate\" : 1462753415353\n          },\n          \"bad87fee1348bd9aedf08834\" : {\n              \"id\" : \"bad87fee1348bd9aedf08834\",\n              \"challengeType\" : 0,\n              \"solution\" : \"<link href=\\\"https://fonts.gdgdocs.org/css?family=Lobster\\\" rel=\\\"stylesheet\\\" type=\\\"text/css\\\">\\n<style>\\n  .red-text {\\n    color: red;\\n  }\\n\\n  h2 {\\n    font-family: Lobster, Monospace;\\n  }\\n\\n  p {\\n    font-size: 16px;\\n    font-family: Monospace;\\n  }\\n\\n  .thick-green-border {\\n    border-color: green;\\n    border-width: 10px;\\n    border-style: solid;\\n    border-radius: 50%;\\n  }\\n\\n  .smaller-image {\\n    width: 100px;\\n  }\\n</style>\\n\\n<h2 class=\\\"red-text\\\">CatPhotoApp</h2>\\n\\n<p>Click here for <a href=\\\"#\\\">cat photos</a>.</p>\\n\\n<a href=\\\"#\\\"><img class=\\\"smaller-image thick-green-border\\\" alt=\\\"A cute orange cat lying on its back\\\" src=\\\"/images/relaxing-cat.jpg\\\"></a>\\n\\n<p>Things cats love:</p>\\n<ul>\\n  <li>cat nip</li>\\n  <li>laser pointers</li>\\n  <li>lasagna</li>\\n</ul>\\n<p>Top 3 things cats hate:</p>\\n<ol>\\n  <li>flea treatment</li>\\n  <li>thunder</li>\\n  <li>other cats</li>\\n</ol>\\n<form action=\\\"/submit-cat-photo\\\">\\n  <input type=\\\"text\\\" placeholder=\\\"cat photo URL\\\" required>\\n  <button type=\\\"submit\\\">Submit</button>\\n  <label for=\\\"indoor-outdoor\\\"><input type=\\\"radio\\\" name=\\\"indoor-outdoor\\\">indoor</label>\\n  <label for=\\\"indoor-outdoor\\\"><input type=\\\"radio\\\" name=\\\"indoor-outdoor\\\">outdoor</label>\\n</form>\\n\",\n              \"name\" : \"Create a Set of Radio Buttons\",\n              \"completedDate\" : 1462762368918\n          },\n          \"bad87fee1348bd9aedf08835\" : {\n              \"id\" : \"bad87fee1348bd9aedf08835\",\n              \"challengeType\" : 0,\n              \"solution\" : \"<link href=\\\"https://fonts.gdgdocs.org/css?family=Lobster\\\" rel=\\\"stylesheet\\\" type=\\\"text/css\\\">\\n<style>\\n  .red-text {\\n    color: red;\\n  }\\n\\n  h2 {\\n    font-family: Lobster, Monospace;\\n  }\\n\\n  p {\\n    font-size: 16px;\\n    font-family: Monospace;\\n  }\\n\\n  .thick-green-border {\\n    border-color: green;\\n    border-width: 10px;\\n    border-style: solid;\\n    border-radius: 50%;\\n  }\\n\\n  .smaller-image {\\n    width: 100px;\\n  }\\n</style>\\n\\n<h2 class=\\\"red-text\\\">CatPhotoApp</h2>\\n\\n<p>Click here for <a href=\\\"#\\\">cat photos</a>.</p>\\n\\n<a href=\\\"#\\\"><img class=\\\"smaller-image thick-green-border\\\" alt=\\\"A cute orange cat lying on its back\\\" src=\\\"/images/relaxing-cat.jpg\\\"></a>\\n\\n<p>Things cats love:</p>\\n<ul>\\n  <li>cat nip</li>\\n  <li>laser pointers</li>\\n  <li>lasagna</li>\\n</ul>\\n<p>Top 3 things cats hate:</p>\\n<ol>\\n  <li>flea treatment</li>\\n  <li>thunder</li>\\n  <li>other cats</li>\\n</ol>\\n<form action=\\\"/submit-cat-photo\\\">\\n  <label><input type=\\\"radio\\\" name=\\\"indoor-outdoor\\\"> Indoor</label>\\n  <label><input type=\\\"radio\\\" name=\\\"indoor-outdoor\\\"> Outdoor</label>\\n  <input type=\\\"text\\\" placeholder=\\\"cat photo URL\\\" required>\\n  <button type=\\\"submit\\\">Submit</button><br>\\n  <label><input type=\\\"checkbox\\\" name=\\\"personality\\\">loving</label>\\n  <label><input type=\\\"checkbox\\\" name=\\\"personality\\\">hobby</label>\\n  <label><input type=\\\"checkbox\\\" name=\\\"personality\\\">hate</label>\\n</form>\\n\",\n              \"name\" : \"Create a Set of Checkboxes\",\n              \"completedDate\" : 1462762865107\n          },\n          \"bad87fee1348bd9aedd08835\" : {\n              \"id\" : \"bad87fee1348bd9aedd08835\",\n              \"challengeType\" : 0,\n              \"solution\" : \"<link href=\\\"https://fonts.gdgdocs.org/css?family=Lobster\\\" rel=\\\"stylesheet\\\" type=\\\"text/css\\\">\\n<style>\\n  .red-text {\\n    color: red;\\n  }\\n\\n  h2 {\\n    font-family: Lobster, Monospace;\\n  }\\n\\n  p {\\n    font-size: 16px;\\n    font-family: Monospace;\\n  }\\n\\n  .thick-green-border {\\n    border-color: green;\\n    border-width: 10px;\\n    border-style: solid;\\n    border-radius: 50%;\\n  }\\n\\n  .smaller-image {\\n    width: 100px;\\n  }\\n</style>\\n\\n<h2 class=\\\"red-text\\\">CatPhotoApp</h2>\\n\\n<p>Click here for <a href=\\\"#\\\">cat photos</a>.</p>\\n\\n<a href=\\\"#\\\"><img class=\\\"smaller-image thick-green-border\\\" alt=\\\"A cute orange cat lying on its back\\\" src=\\\"/images/relaxing-cat.jpg\\\"></a>\\n\\n<p>Things cats love:</p>\\n<ul>\\n  <li>cat nip</li>\\n  <li>laser pointers</li>\\n  <li>lasagna</li>\\n</ul>\\n<p>Top 3 things cats hate:</p>\\n<ol>\\n  <li>flea treatment</li>\\n  <li>thunder</li>\\n  <li>other cats</li>\\n</ol>\\n<form action=\\\"/submit-cat-photo\\\">\\n  <label><input type=\\\"radio\\\" name=\\\"indoor-outdoor\\\" checked> Indoor</label>\\n  <label><input type=\\\"radio\\\" name=\\\"indoor-outdoor\\\"> Outdoor</label><br>\\n  <label><input type=\\\"checkbox\\\" name=\\\"personality\\\" checked> Loving</label>\\n  <label><input type=\\\"checkbox\\\" name=\\\"personality\\\"> Lazy</label>\\n  <label><input type=\\\"checkbox\\\" name=\\\"personality\\\"> Energetic</label>\\n  <input type=\\\"text\\\" placeholder=\\\"cat photo URL\\\" required>\\n  <button type=\\\"submit\\\">Submit</button>\\n</form>\\n\",\n              \"name\" : \"Check Radio Buttons and Checkboxes by Default\",\n              \"completedDate\" : 1462762979934\n          },\n          \"bad87fee1348bd9aede08835\" : {\n              \"id\" : \"bad87fee1348bd9aede08835\",\n              \"challengeType\" : 0,\n              \"solution\" : \"<link href=\\\"https://fonts.gdgdocs.org/css?family=Lobster\\\" rel=\\\"stylesheet\\\" type=\\\"text/css\\\">\\n<style>\\n  .red-text {\\n    color: red;\\n  }\\n\\n  h2 {\\n    font-family: Lobster, Monospace;\\n  }\\n\\n  p {\\n    font-size: 16px;\\n    font-family: Monospace;\\n  }\\n\\n  .thick-green-border {\\n    border-color: green;\\n    border-width: 10px;\\n    border-style: solid;\\n    border-radius: 50%;\\n  }\\n\\n  .smaller-image {\\n    width: 100px;\\n  }\\n</style>\\n\\n<h2 class=\\\"red-text\\\">CatPhotoApp</h2>\\n\\n<p>Click here for <a href=\\\"#\\\">cat photos</a>.</p>\\n\\n<a href=\\\"#\\\"><img class=\\\"smaller-image thick-green-border\\\" alt=\\\"A cute orange cat lying on its back\\\" src=\\\"/images/relaxing-cat.jpg\\\"></a>\\n\\n<div>\\n  <p>Things cats love:</p>\\n  <ul>\\n    <li>cat nip</li>\\n    <li>laser pointers</li>\\n    <li>lasagna</li>\\n  </ul>\\n  <p>Top 3 things cats hate:</p>\\n  <ol>\\n    <li>flea treatment</li>\\n    <li>thunder</li>\\n    <li>other cats</li>\\n  </ol>  \\n</div>\\n\\n\\n<form action=\\\"/submit-cat-photo\\\">\\n  <label><input type=\\\"radio\\\" name=\\\"indoor-outdoor\\\" checked> Indoor</label>\\n  <label><input type=\\\"radio\\\" name=\\\"indoor-outdoor\\\"> Outdoor</label>\\n  <label><input type=\\\"checkbox\\\" name=\\\"personality\\\" checked> Loving</label>\\n  <label><input type=\\\"checkbox\\\" name=\\\"personality\\\"> Lazy</label>\\n  <label><input type=\\\"checkbox\\\" name=\\\"personality\\\"> Energetic</label>\\n  <input type=\\\"text\\\" placeholder=\\\"cat photo URL\\\" required>\\n  <button type=\\\"submit\\\">Submit</button>\\n</form>\\n\",\n              \"name\" : \"Nest Many Elements within a Single Div Element\",\n              \"completedDate\" : 1462763564186\n          },\n          \"bad87fed1348bd9aede07836\" : {\n              \"id\" : \"bad87fed1348bd9aede07836\",\n              \"challengeType\" : 0,\n              \"solution\" : \"<link href=\\\"https://fonts.gdgdocs.org/css?family=Lobster\\\" rel=\\\"stylesheet\\\" type=\\\"text/css\\\">\\n<style>\\n  .red-text {\\n    color: red;\\n  }\\n\\n  .gray-background {\\n    background-color:gray; \\n  }\\n  h2 {\\n    font-family: Lobster, Monospace;\\n  }\\n\\n  p {\\n    font-size: 16px;\\n    font-family: Monospace;\\n  }\\n\\n  .thick-green-border {\\n    border-color: green;\\n    border-width: 10px;\\n    border-style: solid;\\n    border-radius: 50%;\\n  }\\n\\n  .smaller-image {\\n    width: 100px;\\n  }\\n</style>\\n\\n<h2 class=\\\"red-text\\\">CatPhotoApp</h2>\\n\\n<p>Click here for <a href=\\\"#\\\">cat photos</a>.</p>\\n\\n<a href=\\\"#\\\"><img class=\\\"smaller-image thick-green-border\\\" alt=\\\"A cute orange cat lying on its back\\\" src=\\\"/images/relaxing-cat.jpg\\\"></a>\\n\\n<div class=\\\"gray-background\\\">\\n  <p>Things cats love:</p>\\n  <ul>\\n    <li>cat nip</li>\\n    <li>laser pointers</li>\\n    <li>lasagna</li>\\n  </ul>\\n  <p>Top 3 things cats hate:</p>\\n  <ol>\\n    <li>flea treatment</li>\\n    <li>thunder</li>\\n    <li>other cats</li>\\n  </ol>\\n</div>\\n\\n<form action=\\\"/submit-cat-photo\\\">\\n  <label><input type=\\\"radio\\\" name=\\\"indoor-outdoor\\\" checked> Indoor</label>\\n  <label><input type=\\\"radio\\\" name=\\\"indoor-outdoor\\\"> Outdoor</label>\\n  <label><input type=\\\"checkbox\\\" name=\\\"personality\\\" checked> Loving</label>\\n  <label><input type=\\\"checkbox\\\" name=\\\"personality\\\"> Lazy</label>\\n  <label><input type=\\\"checkbox\\\" name=\\\"personality\\\"> Energetic</label>\\n  <input type=\\\"text\\\" placeholder=\\\"cat photo URL\\\" required>\\n  <button type=\\\"submit\\\">Submit</button>\\n</form>\\n\",\n              \"name\" : \"Give a Background Color to a Div Element\",\n              \"completedDate\" : 1462763669084\n          },\n          \"bad87eee1348bd9aede07836\" : {\n              \"id\" : \"bad87eee1348bd9aede07836\",\n              \"challengeType\" : 0,\n              \"solution\" : \"<link href=\\\"https://fonts.gdgdocs.org/css?family=Lobster\\\" rel=\\\"stylesheet\\\" type=\\\"text/css\\\">\\n<style>\\n  .red-text {\\n    color: red;\\n  }\\n\\n  h2 {\\n    font-family: Lobster, Monospace;\\n  }\\n\\n  p {\\n    font-size: 16px;\\n    font-family: Monospace;\\n  }\\n\\n  .thick-green-border {\\n    border-color: green;\\n    border-width: 10px;\\n    border-style: solid;\\n    border-radius: 50%;\\n  }\\n\\n  .smaller-image {\\n    width: 100px;\\n  }\\n  .gray-background {\\n    background-color: gray;\\n  }\\n</style>\\n\\n<h2 class=\\\"red-text\\\">CatPhotoApp</h2>\\n\\n<p>Click here for <a href=\\\"#\\\">cat photos</a>.</p>\\n\\n<a href=\\\"#\\\"><img class=\\\"smaller-image thick-green-border\\\" alt=\\\"A cute orange cat lying on its back\\\" src=\\\"/images/relaxing-cat.jpg\\\"></a>\\n\\n<div class=\\\"gray-background\\\">\\n  <p>Things cats love:</p>\\n  <ul>\\n    <li>cat nip</li>\\n    <li>laser pointers</li>\\n    <li>lasagna</li>\\n  </ul>\\n  <p>Top 3 things cats hate:</p>\\n  <ol>\\n    <li>flea treatment</li>\\n    <li>thunder</li>\\n    <li>other cats</li>\\n  </ol>\\n</div>\\n\\n<form action=\\\"/submit-cat-photo\\\" id=\\\"cat-photo-form\\\">\\n  <label><input type=\\\"radio\\\" name=\\\"indoor-outdoor\\\" checked> Indoor</label>\\n  <label><input type=\\\"radio\\\" name=\\\"indoor-outdoor\\\"> Outdoor</label>\\n  <label><input type=\\\"checkbox\\\" name=\\\"personality\\\" checked> Loving</label>\\n  <label><input type=\\\"checkbox\\\" name=\\\"personality\\\"> Lazy</label>\\n  <label><input type=\\\"checkbox\\\" name=\\\"personality\\\"> Energetic</label>\\n  <input type=\\\"text\\\" placeholder=\\\"cat photo URL\\\" required>\\n  <button type=\\\"submit\\\">Submit</button>\\n</form>\\n\",\n              \"name\" : \"Set the ID of an Element\",\n              \"completedDate\" : 1462763745535\n          },\n          \"bad87dee1348bd9aede07836\" : {\n              \"id\" : \"bad87dee1348bd9aede07836\",\n              \"challengeType\" : 0,\n              \"solution\" : \"<link href=\\\"https://fonts.gdgdocs.org/css?family=Lobster\\\" rel=\\\"stylesheet\\\" type=\\\"text/css\\\">\\n<style>\\n  .red-text {\\n    color: red;\\n  }\\n\\n  h2 {\\n    font-family: Lobster, Monospace;\\n  }\\n\\n  p {\\n    font-size: 16px;\\n    font-family: Monospace;\\n  }\\n\\n  .thick-green-border {\\n    border-color: green;\\n    border-width: 10px;\\n    border-style: solid;\\n    border-radius: 50%;\\n  }\\n\\n  .smaller-image {\\n    width: 100px;\\n  }\\n\\n  .gray-background {\\n    background-color: gray;\\n  }\\n  #cat-photo-form {\\n    background-color: green;\\n  }\\n</style>\\n\\n<h2 class=\\\"red-text\\\">CatPhotoApp</h2>\\n\\n<p>Click here for <a href=\\\"#\\\">cat photos</a>.</p>\\n\\n<a href=\\\"#\\\"><img class=\\\"smaller-image thick-green-border\\\" alt=\\\"A cute orange cat lying on its back\\\" src=\\\"/images/relaxing-cat.jpg\\\"></a>\\n\\n<div class=\\\"gray-background\\\">\\n  <p>Things cats love:</p>\\n  <ul>\\n    <li>cat nip</li>\\n    <li>laser pointers</li>\\n    <li>lasagna</li>\\n  </ul>\\n  <p>Top 3 things cats hate:</p>\\n  <ol>\\n    <li>flea treatment</li>\\n    <li>thunder</li>\\n    <li>other cats</li>\\n  </ol>\\n</div>\\n\\n<form action=\\\"/submit-cat-photo\\\" id=\\\"cat-photo-form\\\">\\n  <label><input type=\\\"radio\\\" name=\\\"indoor-outdoor\\\" checked> Indoor</label>\\n  <label><input type=\\\"radio\\\" name=\\\"indoor-outdoor\\\"> Outdoor</label>\\n  <label><input type=\\\"checkbox\\\" name=\\\"personality\\\" checked> Loving</label>\\n  <label><input type=\\\"checkbox\\\" name=\\\"personality\\\"> Lazy</label>\\n  <label><input type=\\\"checkbox\\\" name=\\\"personality\\\"> Energetic</label>\\n  <input type=\\\"text\\\" placeholder=\\\"cat photo URL\\\" required>\\n  <button type=\\\"submit\\\">Submit</button>\\n</form>\\n\",\n              \"name\" : \"Use an ID Attribute to Style an Element\",\n              \"completedDate\" : 1462763864820\n          },\n          \"bad88fee1348bd9aedf08825\" : {\n              \"id\" : \"bad88fee1348bd9aedf08825\",\n              \"challengeType\" : 0,\n              \"solution\" : \"<style>\\n  .injected-text {\\n    margin-bottom: -25px;\\n    text-align: center;\\n  }\\n\\n  .box {\\n    border-style: solid;\\n    border-color: black;\\n    border-width: 5px;\\n    text-align: center;\\n  }\\n\\n  .yellow-box {\\n    background-color: yellow;\\n    padding: 10px;\\n  }\\n  \\n  .red-box {\\n    background-color: red;\\n    padding: 20px;\\n  }\\n\\n  .green-box {\\n    background-color: green;\\n    padding: 20px;\\n  }\\n</style>\\n<h5 class=\\\"injected-text\\\">margin</h5>\\n\\n<div class=\\\"box yellow-box\\\">\\n  <h5 class=\\\"box red-box\\\">padding</h5>\\n  <h5 class=\\\"box green-box\\\">padding</h5>\\n</div>\\n\",\n              \"name\" : \"Adjusting the Padding of an Element\",\n              \"completedDate\" : 1462764223569\n          },\n          \"bad87fee1348bd9aedf08822\" : {\n              \"id\" : \"bad87fee1348bd9aedf08822\",\n              \"challengeType\" : 0,\n              \"solution\" : \"<style>\\n  .injected-text {\\n    margin-bottom: -25px;\\n    text-align: center;\\n  }\\n\\n  .box {\\n    border-style: solid;\\n    border-color: black;\\n    border-width: 5px;\\n    text-align: center;\\n  }\\n\\n  .yellow-box {\\n    background-color: yellow;\\n    padding: 10px;\\n  }\\n  \\n  .red-box {\\n    background-color: red;\\n    padding: 20px;\\n    margin: 20px;\\n  }\\n\\n  .green-box {\\n    background-color: green;\\n    padding: 20px;\\n    margin: 20px;\\n  }\\n</style>\\n<h5 class=\\\"injected-text\\\">margin</h5>\\n\\n<div class=\\\"box yellow-box\\\">\\n  <h5 class=\\\"box red-box\\\">padding</h5>\\n  <h5 class=\\\"box green-box\\\">padding</h5>\\n</div>\\n\",\n              \"name\" : \"Adjust the Margin of an Element\",\n              \"completedDate\" : 1462764436438\n          },\n          \"bad87fee1348bd9aedf08823\" : {\n              \"id\" : \"bad87fee1348bd9aedf08823\",\n              \"challengeType\" : 0,\n              \"solution\" : \"<style>\\n  .injected-text {\\n    margin-bottom: -25px;\\n    text-align: center;\\n  }\\n\\n  .box {\\n    border-style: solid;\\n    border-color: black;\\n    border-width: 5px;\\n    text-align: center;\\n  }\\n\\n  .yellow-box {\\n    background-color: yellow;\\n    padding: 10px;\\n  }\\n  \\n  .red-box {\\n    background-color: red;\\n    padding: 20px;\\n    margin: -15px;\\n  }\\n\\n  .green-box {\\n    background-color: green;\\n    padding: 20px;\\n    margin: -15px;\\n  }\\n</style>\\n\\n<div class=\\\"box yellow-box\\\">\\n  <h5 class=\\\"box red-box\\\">padding</h5>\\n  <h5 class=\\\"box green-box\\\">padding</h5>\\n</div>\\n\",\n              \"name\" : \"Add a Negative Margin to an Element\",\n              \"completedDate\" : 1462764624914\n          },\n          \"bad87fee1348bd9aedf08824\" : {\n              \"id\" : \"bad87fee1348bd9aedf08824\",\n              \"challengeType\" : 0,\n              \"solution\" : \"<style>\\n  .injected-text {\\n    margin-bottom: -25px;\\n    text-align: center;\\n  }\\n\\n  .box {\\n    border-style: solid;\\n    border-color: black;\\n    border-width: 5px;\\n    text-align: center;\\n  }\\n\\n  .yellow-box {\\n    background-color: yellow;\\n    padding: 10px;\\n  }\\n  \\n  .red-box {\\n    background-color: red;\\n    padding-top: 40px;\\n    padding-right: 20px;\\n    padding-bottom: 20px;\\n    padding-left: 40px;\\n  }\\n\\n  .green-box {\\n    background-color: green;\\n    padding-top:40px;\\n    padding-left:40px;\\n    padding-right:20px;\\n    padding-bottom:20px;\\n  }\\n</style>\\n<h5 class=\\\"injected-text\\\">margin</h5>\\n\\n<div class=\\\"box yellow-box\\\">\\n  <h5 class=\\\"box red-box\\\">padding</h5>\\n  <h5 class=\\\"box green-box\\\">padding</h5>\\n</div>\\n\",\n              \"name\" : \"Add Different Padding to Each Side of an Element\",\n              \"completedDate\" : 1462764765571\n          },\n          \"bad87fee1248bd9aedf08824\" : {\n              \"id\" : \"bad87fee1248bd9aedf08824\",\n              \"challengeType\" : 0,\n              \"solution\" : \"<style>\\n  .injected-text {\\n    margin-bottom: -25px;\\n    text-align: center;\\n  }\\n\\n  .box {\\n    border-style: solid;\\n    border-color: black;\\n    border-width: 5px;\\n    text-align: center;\\n  }\\n\\n  .yellow-box {\\n    background-color: yellow;\\n    padding: 10px;\\n  }\\n  \\n  .red-box {\\n    background-color: red;\\n    margin-top: 40px;\\n    margin-right: 20px;\\n    margin-bottom: 20px;\\n    margin-left: 40px;\\n  }\\n\\n  .green-box {\\n    background-color: green;\\n    margin-top:40px;\\n    margin-left:40px;\\n    margin-right:20px;\\n    margin-bottom:20px;\\n  }\\n</style>\\n<h5 class=\\\"injected-text\\\">margin</h5>\\n\\n<div class=\\\"box yellow-box\\\">\\n  <h5 class=\\\"box red-box\\\">padding</h5>\\n  <h5 class=\\\"box green-box\\\">padding</h5>\\n</div>\\n\",\n              \"name\" : \"Add Different Margins to Each Side of an Element\",\n              \"completedDate\" : 1462764856966\n          },\n          \"bad87fee1348bd9aedf08826\" : {\n              \"id\" : \"bad87fee1348bd9aedf08826\",\n              \"challengeType\" : 0,\n              \"solution\" : \"<style>\\n  .injected-text {\\n    margin-bottom: -25px;\\n    text-align: center;\\n  }\\n\\n  .box {\\n    border-style: solid;\\n    border-color: black;\\n    border-width: 5px;\\n    text-align: center;\\n  }\\n\\n  .yellow-box {\\n    background-color: yellow;\\n    padding: 20px 40px 20px 40px;\\n  }\\n  \\n  .red-box {\\n    background-color: red;\\n    padding: 20px 40px 20px 40px;\\n  }\\n\\n  .green-box {\\n    background-color: green;\\n    padding: 40px 20px 20px 40px;\\n  }\\n</style>\\n<h5 class=\\\"injected-text\\\">margin</h5>\\n\\n<div class=\\\"box yellow-box\\\">\\n  <h5 class=\\\"box red-box\\\">padding</h5>\\n  <h5 class=\\\"box green-box\\\">padding</h5>\\n</div>\\n\",\n              \"name\" : \"Use Clockwise Notation to Specify the Padding of an Element\",\n              \"completedDate\" : 1462765288150\n          },\n          \"bad87fee1348bd9afdf08726\" : {\n              \"id\" : \"bad87fee1348bd9afdf08726\",\n              \"challengeType\" : 0,\n              \"solution\" : \"<style>\\n  .injected-text {\\n    margin-bottom: -25px;\\n    text-align: center;\\n  }\\n\\n  .box {\\n    border-style: solid;\\n    border-color: black;\\n    border-width: 5px;\\n    text-align: center;\\n  }\\n\\n  .yellow-box {\\n    background-color: yellow;\\n    padding: 20px 40px 20px 40px;\\n  }\\n  \\n  .red-box {\\n    background-color: red;\\n    margin: 20px 40px 20px 40px;\\n  }\\n\\n  .green-box {\\n    background-color: green;\\n    margin: 40px 20px 20px 40px;\\n  }\\n</style>\\n<h5 class=\\\"injected-text\\\">margin</h5>\\n\\n<div class=\\\"box yellow-box\\\">\\n  <h5 class=\\\"box red-box\\\">padding</h5>\\n  <h5 class=\\\"box green-box\\\">padding</h5>\\n</div>\\n\",\n              \"name\" : \"Use Clockwise Notation to Specify the Margin of an Element\",\n              \"completedDate\" : 1462767630231\n          },\n          \"bad87fee1348bd9aedf08736\" : {\n              \"id\" : \"bad87fee1348bd9aedf08736\",\n              \"challengeType\" : 0,\n              \"solution\" : \"<style>\\n  body{\\n    background-color:black;\\n  }\\n</style>\\n\",\n              \"name\" : \"Style the HTML Body Element\",\n              \"completedDate\" : 1462767693017\n          },\n          \"bad87fee1348bd9aedf08746\" : {\n              \"id\" : \"bad87fee1348bd9aedf08746\",\n              \"challengeType\" : 0,\n              \"solution\" : \"<style>\\n  body {\\n    background-color: black;\\n    color:green;\\n    font-family:Monospace;\\n  }\\n\\n</style>\\n\\n<h1>Hello World</h1>\\n\",\n              \"name\" : \"Inherit Styles from the Body Element\",\n              \"completedDate\" : 1462767894317\n          },\n          \"bad87fee1348bd9aedf08756\" : {\n              \"id\" : \"bad87fee1348bd9aedf08756\",\n              \"challengeType\" : 0,\n              \"solution\" : \"<style>\\n  body {\\n    background-color: black;\\n    font-family: Monospace;\\n    color: green;\\n  }\\n  .pink-text{\\n    color: pink;\\n  }\\n\\n</style>\\n<h1 class=\\\"pink-text\\\">Hello World!</h1>\\n\",\n              \"name\" : \"Prioritize One Style Over Another\",\n              \"completedDate\" : 1462768117074\n          },\n          \"bad87fee1348bd9aedf04756\" : {\n              \"id\" : \"bad87fee1348bd9aedf04756\",\n              \"challengeType\" : 0,\n              \"solution\" : \"<style>\\n  body {\\n    background-color: black;\\n    font-family: Monospace;\\n    color: green;\\n  }\\n  .pink-text {\\n    color: pink;\\n  }\\n  .blue-text {\\n    color: blue;\\n  }\\n</style>\\n<h1 class=\\\"pink-text blue-text\\\">Hello World!</h1>\\n\",\n              \"name\" : \"Override Styles in Subsequent CSS\",\n              \"completedDate\" : 1462768252161\n          },\n          \"bad87fee1348bd8aedf06756\" : {\n              \"id\" : \"bad87fee1348bd8aedf06756\",\n              \"challengeType\" : 0,\n              \"solution\" : \"<style>\\n  body {\\n    background-color: black;\\n    font-family: Monospace;\\n    color: green;\\n  }\\n  .pink-text {\\n    color: pink;\\n  }\\n  .blue-text {\\n    color: blue;\\n  }\\n  #orange-text {\\n    color: orange;\\n  }\\n</style>\\n<h1 id=\\\"orange-text\\\" class=\\\"pink-text blue-text\\\">Hello World!</h1>\\n\",\n              \"name\" : \"Override Class Declarations by Styling ID Attributes\",\n              \"completedDate\" : 1462768347521\n          },\n          \"bad87fee1348bd9aedf06756\" : {\n              \"id\" : \"bad87fee1348bd9aedf06756\",\n              \"challengeType\" : 0,\n              \"solution\" : \"<style>\\n  body {\\n    background-color: black;\\n    font-family: Monospace;\\n    color: green;\\n  }\\n  #orange-text {\\n    color: orange;\\n  }\\n  .pink-text {\\n    color: pink;\\n  }\\n  .blue-text {\\n    color: blue;\\n  }\\n</style>\\n<h1 style=\\\"color:white;\\\" id=\\\"orange-text\\\" class=\\\"pink-text blue-text\\\">Hello World!</h1>\\n\",\n              \"name\" : \"Override Class Declarations with Inline Styles\",\n              \"completedDate\" : 1462768440548\n          },\n          \"bad87fee1348bd9aedf07756\" : {\n              \"id\" : \"bad87fee1348bd9aedf07756\",\n              \"challengeType\" : 0,\n              \"solution\" : \"<style>\\n  body {\\n    background-color: black;\\n    font-family: Monospace;\\n    color: green;\\n  }\\n  #orange-text {\\n    color: orange;\\n  }\\n  .pink-text {\\n    color: pink !important;\\n  }\\n  .blue-text {\\n    color: blue;\\n  }\\n</style>\\n<h1 id=\\\"orange-text\\\" class=\\\"pink-text blue-text\\\" style=\\\"color: white\\\">Hello World!</h1>\\n\",\n              \"name\" : \"Override All Other Styles by using Important\",\n              \"completedDate\" : 1462769426912\n          },\n          \"bad87fee1348bd9aedf08726\" : {\n              \"id\" : \"bad87fee1348bd9aedf08726\",\n              \"challengeType\" : 0,\n              \"solution\" : \"<style>\\n  body {\\n    background-color: #000000;\\n  }\\n</style>\\n\",\n              \"name\" : \"Use Hex Code for Specific Colors\",\n              \"completedDate\" : 1462769721501\n          },\n          \"bad87fee1348bd9aedf08725\" : {\n              \"id\" : \"bad87fee1348bd9aedf08725\",\n              \"challengeType\" : 0,\n              \"solution\" : \"<style>\\n  body {\\n    background-color: #ffffff;\\n  }\\n</style>\\n\",\n              \"name\" : \"Use Hex Code to Color Elements White\",\n              \"completedDate\" : 1462772138056\n          },\n          \"bad87fee1348bd9aedf08724\" : {\n              \"id\" : \"bad87fee1348bd9aedf08724\",\n              \"challengeType\" : 0,\n              \"solution\" : \"<style>\\n  body {\\n    background-color: #FF0000;\\n  }\\n</style>\\n\",\n              \"name\" : \"Use Hex Code to Color Elements Red\",\n              \"completedDate\" : 1462772465843\n          },\n          \"bad87fee1348bd9aedf08723\" : {\n              \"id\" : \"bad87fee1348bd9aedf08723\",\n              \"challengeType\" : 0,\n              \"solution\" : \"<style>\\n  body {\\n    background-color: #00ff00;\\n  }\\n</style>\\n\",\n              \"name\" : \"Use Hex Code to Color Elements Green\",\n              \"completedDate\" : 1462772491093\n          },\n          \"bad87fee1348bd9aedf08722\" : {\n              \"id\" : \"bad87fee1348bd9aedf08722\",\n              \"challengeType\" : 0,\n              \"solution\" : \"<style>\\n  body {\\n    background-color: #0000ff;\\n  }\\n</style>\\n\",\n              \"name\" : \"Use Hex Code to Color Elements Blue\",\n              \"completedDate\" : 1462772504899\n          },\n          \"bad87fee1348bd9aedf08721\" : {\n              \"id\" : \"bad87fee1348bd9aedf08721\",\n              \"challengeType\" : 0,\n              \"solution\" : \"<style>\\n  body {\\n    background-color: #ffa500;\\n  }\\n</style>\\n\",\n              \"name\" : \"Use Hex Code to Mix Colors\",\n              \"completedDate\" : 1462772554616\n          },\n          \"bad87fee1348bd9aede08720\" : {\n              \"id\" : \"bad87fee1348bd9aede08720\",\n              \"challengeType\" : 0,\n              \"solution\" : \"<style>\\n  body {\\n    background-color: #808080;\\n  }\\n</style>\\n\",\n              \"name\" : \"Use Hex Code to Color Elements Gray\",\n              \"completedDate\" : 1462772625381\n          },\n          \"bad87fee1348bd9aedf08720\" : {\n              \"id\" : \"bad87fee1348bd9aedf08720\",\n              \"challengeType\" : 0,\n              \"solution\" : \"<style>\\n  body {\\n    background-color: #111111;\\n  }\\n</style>\\n\",\n              \"name\" : \"Use Hex Code for Specific Shades of Gray\",\n              \"completedDate\" : 1462772864956\n          },\n          \"bad87fee1348bd9aedf08719\" : {\n              \"id\" : \"bad87fee1348bd9aedf08719\",\n              \"challengeType\" : 0,\n              \"solution\" : \"<style>\\n  body {\\n    background-color: #f00;\\n  }\\n</style>\\n\",\n              \"name\" : \"Use Abbreviated Hex Code\",\n              \"completedDate\" : 1462772911466\n          },\n          \"bad87fee1348bd9aede08718\" : {\n              \"id\" : \"bad87fee1348bd9aede08718\",\n              \"challengeType\" : 0,\n              \"solution\" : \"<style>\\n  body {\\n    background-color: rgb(0,0,0);\\n  }\\n</style>\\n\",\n              \"name\" : \"Use RGB values to Color Elements\",\n              \"completedDate\" : 1462773269006\n          },\n          \"bad88fee1348bd9aedf08726\" : {\n              \"id\" : \"bad88fee1348bd9aedf08726\",\n              \"challengeType\" : 0,\n              \"solution\" : \"<style>\\n  body {\\n    background-color: rgb(255, 255, 255);\\n  }\\n</style>\\n\",\n              \"name\" : \"Use RGB to Color Elements White\",\n              \"completedDate\" : 1462773383535\n          },\n          \"bad89fee1348bd9aedf08724\" : {\n              \"id\" : \"bad89fee1348bd9aedf08724\",\n              \"challengeType\" : 0,\n              \"solution\" : \"<style>\\n  body {\\n    background-color: rgb(255, 0, 0);\\n  }\\n</style>\\n\",\n              \"name\" : \"Use RGB to Color Elements Red\",\n              \"completedDate\" : 1462773484346\n          },\n          \"bad80fee1348bd9aedf08723\" : {\n              \"id\" : \"bad80fee1348bd9aedf08723\",\n              \"challengeType\" : 0,\n              \"solution\" : \"<style>\\n  body {\\n    background-color: rgb(0, 255, 0);\\n  }\\n</style>\\n\",\n              \"name\" : \"Use RGB to Color Elements Green\",\n              \"completedDate\" : 1462773516372\n          },\n          \"bad81fee1348bd9aedf08722\" : {\n              \"id\" : \"bad81fee1348bd9aedf08722\",\n              \"challengeType\" : 0,\n              \"solution\" : \"<style>\\n  body {\\n    background-color: rgb(0, 0, 255);\\n  }\\n</style>\\n\",\n              \"name\" : \"Use RGB to Color Elements Blue\",\n              \"completedDate\" : 1462773527876\n          },\n          \"bad82fee1348bd9aedf08721\" : {\n              \"id\" : \"bad82fee1348bd9aedf08721\",\n              \"challengeType\" : 0,\n              \"solution\" : \"<style>\\n  body {\\n    background-color: rgb(255, 165, 0);\\n  }\\n</style>\\n\",\n              \"name\" : \"Use RGB to Mix Colors\",\n              \"completedDate\" : 1462773547316\n          },\n          \"bad87fee1348bd9acde08712\" : {\n              \"id\" : \"bad87fee1348bd9acde08712\",\n              \"challengeType\" : 0,\n              \"solution\" : \"<link href=\\\"//fonts.gdgdocs.org/css?family=Lobster\\\" rel=\\\"stylesheet\\\" type=\\\"text/css\\\">\\n<style>\\n  .red-text {\\n    color: red;\\n  }\\n\\n  h2 {\\n    font-family: Lobster, Monospace;\\n  }\\n\\n  p {\\n    font-size: 16px;\\n    font-family: Monospace;\\n  }\\n\\n  .thick-green-border {\\n    border-color: green;\\n    border-width: 10px;\\n    border-style: solid;\\n    border-radius: 50%;\\n  }\\n\\n  .smaller-image {\\n    width: 100px;\\n  }\\n</style>\\n\\n<div class=\\\"container-fluid\\\">\\n<h2 class=\\\"red-text\\\">CatPhotoApp</h2>\\n\\n<p>Click here for <a href=\\\"#\\\">cat photos</a>.</p>\\n\\n<a href=\\\"#\\\"><img class=\\\"smaller-image thick-green-border\\\" src=\\\"/images/relaxing-cat.jpg\\\"></a>\\n\\n<p>Things cats love:</p>\\n<ul>\\n  <li>cat nip</li>\\n  <li>laser pointers</li>\\n  <li>lasagna</li>\\n</ul>\\n<p>Top 3 things cats hate:</p>\\n<ol>\\n  <li>flea treatment</li>\\n  <li>thunder</li>\\n  <li>other cats</li>\\n</ol>\\n<form action=\\\"/submit-cat-photo\\\">\\n  <label><input type=\\\"radio\\\" name=\\\"indoor-outdoor\\\"> Indoor</label>\\n  <label><input type=\\\"radio\\\" name=\\\"indoor-outdoor\\\"> Outdoor</label>\\n  <label><input type=\\\"checkbox\\\" name=\\\"personality\\\"> Loving</label>\\n  <label><input type=\\\"checkbox\\\" name=\\\"personality\\\"> Lazy</label>\\n  <label><input type=\\\"checkbox\\\" name=\\\"personality\\\"> Crazy</label>\\n  <input type=\\\"text\\\" placeholder=\\\"cat photo URL\\\" required>\\n  <button type=\\\"submit\\\">Submit</button>\\n</form>  \\n</div>\\n\\n\",\n              \"name\" : \"Use Responsive Design with Bootstrap Fluid Containers\",\n              \"completedDate\" : 1462773716276\n          },\n          \"bad87fee1348bd9acde08812\" : {\n              \"id\" : \"bad87fee1348bd9acde08812\",\n              \"challengeType\" : 0,\n              \"solution\" : \"<link href=\\\"//fonts.gdgdocs.org/css?family=Lobster\\\" rel=\\\"stylesheet\\\" type=\\\"text/css\\\">\\n<style>\\n  .red-text {\\n    color: red;\\n  }\\n\\n  h2 {\\n    font-family: Lobster, Monospace;\\n  }\\n\\n  p {\\n    font-size: 16px;\\n    font-family: Monospace;\\n  }\\n\\n  .thick-green-border {\\n    border-color: green;\\n    border-width: 10px;\\n    border-style: solid;\\n    border-radius: 50%;\\n  }\\n\\n  .smaller-image {\\n    width: 100px;\\n  }\\n</style>\\n\\n<div class=\\\"container-fluid\\\">\\n  <h2 class=\\\"red-text\\\">CatPhotoApp</h2>\\n\\n  <p>Click here for <a href=\\\"#\\\">cat photos</a>.</p>\\n\\n  <a href=\\\"#\\\"><img class=\\\"smaller-image thick-green-border\\\" src=\\\"/images/relaxing-cat.jpg\\\"></a>\\n  <img src=\\\"/images/running-cat.jpg\\\" class=\\\"img-responsive\\\"/>\\n\\n  <p>Things cats love:</p>\\n  <ul>\\n    <li>cat nip</li>\\n    <li>laser pointers</li>\\n    <li>lasagna</li>\\n  </ul>\\n  <p>Top 3 things cats hate:</p>\\n  <ol>\\n    <li>flea treatment</li>\\n    <li>thunder</li>\\n    <li>other cats</li>\\n  </ol>\\n  <form action=\\\"/submit-cat-photo\\\">\\n    <label><input type=\\\"radio\\\" name=\\\"indoor-outdoor\\\"> Indoor</label>\\n    <label><input type=\\\"radio\\\" name=\\\"indoor-outdoor\\\"> Outdoor</label>\\n    <label><input type=\\\"checkbox\\\" name=\\\"personality\\\"> Loving</label>\\n    <label><input type=\\\"checkbox\\\" name=\\\"personality\\\"> Lazy</label>\\n    <label><input type=\\\"checkbox\\\" name=\\\"personality\\\"> Crazy</label>\\n    <input type=\\\"text\\\" placeholder=\\\"cat photo URL\\\" required>\\n    <button type=\\\"submit\\\">Submit</button>\\n  </form>\\n</div>\\n\",\n              \"name\" : \"Make Images Mobile Responsive\",\n              \"completedDate\" : 1462774105128,\n              \"lastUpdated\" : 1462880130410\n          },\n          \"bad87fee1348bd8acde08812\" : {\n              \"id\" : \"bad87fee1348bd8acde08812\",\n              \"challengeType\" : 0,\n              \"solution\" : \"<link href=\\\"//fonts.gdgdocs.org/css?family=Lobster\\\" rel=\\\"stylesheet\\\" type=\\\"text/css\\\">\\n<style>\\n  .red-text {\\n    color: red;\\n  }\\n\\n  h2 {\\n    font-family: Lobster, Monospace;\\n  }\\n\\n  p {\\n    font-size: 16px;\\n    font-family: Monospace;\\n  }\\n\\n  .thick-green-border {\\n    border-color: green;\\n    border-width: 10px;\\n    border-style: solid;\\n    border-radius: 50%;\\n  }\\n\\n  .smaller-image {\\n    width: 100px;\\n  }\\n</style>\\n\\n<div class=\\\"container-fluid\\\">\\n  <h2 class=\\\"red-text text-center\\\">CatPhotoApp</h2>\\n\\n  <p>Click here for <a href=\\\"#\\\">cat photos</a>.</p>\\n\\n  <a href=\\\"#\\\"><img class=\\\"smaller-image thick-green-border\\\" src=\\\"/images/relaxing-cat.jpg\\\"></a>\\n\\n  <img src=\\\"/images/running-cat.jpg\\\" class=\\\"img-responsive\\\">\\n  <p>Things cats love:</p>\\n  <ul>\\n    <li>cat nip</li>\\n    <li>laser pointers</li>\\n    <li>lasagna</li>\\n  </ul>\\n  <p>Top 3 things cats hate:</p>\\n  <ol>\\n    <li>flea treatment</li>\\n    <li>thunder</li>\\n    <li>other cats</li>\\n  </ol>\\n  <form action=\\\"/submit-cat-photo\\\">\\n    <label><input type=\\\"radio\\\" name=\\\"indoor-outdoor\\\"> Indoor</label>\\n    <label><input type=\\\"radio\\\" name=\\\"indoor-outdoor\\\"> Outdoor</label>\\n    <label><input type=\\\"checkbox\\\" name=\\\"personality\\\"> Loving</label>\\n    <label><input type=\\\"checkbox\\\" name=\\\"personality\\\"> Lazy</label>\\n    <label><input type=\\\"checkbox\\\" name=\\\"personality\\\"> Crazy</label>\\n    <input type=\\\"text\\\" placeholder=\\\"cat photo URL\\\" required>\\n    <button type=\\\"submit\\\">Submit</button>\\n  </form>\\n</div>\\n\",\n              \"name\" : \"Center Text with Bootstrap\",\n              \"completedDate\" : 1462774178199\n          },\n          \"bad87fee1348cd8acdf08812\" : {\n              \"id\" : \"bad87fee1348cd8acdf08812\",\n              \"challengeType\" : 0,\n              \"solution\" : \"<link href=\\\"//fonts.gdgdocs.org/css?family=Lobster\\\" rel=\\\"stylesheet\\\" type=\\\"text/css\\\">\\n<style>\\n  .red-text {\\n    color: red;\\n  }\\n\\n  h2 {\\n    font-family: Lobster, Monospace;\\n  }\\n\\n  p {\\n    font-size: 16px;\\n    font-family: Monospace;\\n  }\\n\\n  .thick-green-border {\\n    border-color: green;\\n    border-width: 10px;\\n    border-style: solid;\\n    border-radius: 50%;\\n  }\\n\\n  .smaller-image {\\n    width: 100px;\\n  }\\n</style>\\n\\n<div class=\\\"container-fluid\\\">\\n  <h2 class=\\\"red-text text-center\\\">CatPhotoApp</h2>\\n\\n  <p>Click here for <a href=\\\"#\\\">cat photos</a>.</p>\\n\\n  <a href=\\\"#\\\"><img class=\\\"smaller-image thick-green-border\\\" src=\\\"/images/relaxing-cat.jpg\\\"></a>\\n\\n  <img src=\\\"/images/running-cat.jpg\\\" class=\\\"img-responsive\\\">\\n  \\n  <button class=\\\"btn\\\">Like</button>\\n  <p>Things cats love:</p>\\n  <ul>\\n    <li>cat nip</li>\\n    <li>laser pointers</li>\\n    <li>lasagna</li>\\n  </ul>\\n  <p>Top 3 things cats hate:</p>\\n  <ol>\\n    <li>flea treatment</li>\\n    <li>thunder</li>\\n    <li>other cats</li>\\n  </ol>\\n  <form action=\\\"/submit-cat-photo\\\">\\n    <label><input type=\\\"radio\\\" name=\\\"indoor-outdoor\\\"> Indoor</label>\\n    <label><input type=\\\"radio\\\" name=\\\"indoor-outdoor\\\"> Outdoor</label>\\n    <label><input type=\\\"checkbox\\\" name=\\\"personality\\\"> Loving</label>\\n    <label><input type=\\\"checkbox\\\" name=\\\"personality\\\"> Lazy</label>\\n    <label><input type=\\\"checkbox\\\" name=\\\"personality\\\"> Crazy</label>\\n    <input type=\\\"text\\\" placeholder=\\\"cat photo URL\\\" required>\\n    <button type=\\\"submit\\\">Submit</button>\\n  </form>\\n</div>\\n\",\n              \"name\" : \"Create a Bootstrap Button\",\n              \"completedDate\" : 1462774278702\n          },\n          \"bad87fee1348cd8acef08812\" : {\n              \"id\" : \"bad87fee1348cd8acef08812\",\n              \"challengeType\" : 0,\n              \"solution\" : \"<link href=\\\"//fonts.gdgdocs.org/css?family=Lobster\\\" rel=\\\"stylesheet\\\" type=\\\"text/css\\\">\\n<style>\\n  .red-text {\\n    color: red;\\n  }\\n\\n  h2 {\\n    font-family: Lobster, Monospace;\\n  }\\n\\n  p {\\n    font-size: 16px;\\n    font-family: Monospace;\\n  }\\n\\n  .thick-green-border {\\n    border-color: green;\\n    border-width: 10px;\\n    border-style: solid;\\n    border-radius: 50%;\\n  }\\n\\n  .smaller-image {\\n    width: 100px;\\n  }\\n</style>\\n\\n<div class=\\\"container-fluid\\\">\\n  <h2 class=\\\"red-text text-center\\\">CatPhotoApp</h2>\\n\\n  <p>Click here for <a href=\\\"#\\\">cat photos</a>.</p>\\n\\n  <a href=\\\"#\\\"><img class=\\\"smaller-image thick-green-border\\\" src=\\\"/images/relaxing-cat.jpg\\\"></a>\\n\\n  <img src=\\\"/images/running-cat.jpg\\\" class=\\\"img-responsive\\\">\\n  <button class=\\\"btn btn-block\\\">Like</button>\\n  <p>Things cats love:</p>\\n  <ul>\\n    <li>cat nip</li>\\n    <li>laser pointers</li>\\n    <li>lasagna</li>\\n  </ul>\\n  <p>Top 3 things cats hate:</p>\\n  <ol>\\n    <li>flea treatment</li>\\n    <li>thunder</li>\\n    <li>other cats</li>\\n  </ol>\\n  <form action=\\\"/submit-cat-photo\\\">\\n    <label><input type=\\\"radio\\\" name=\\\"indoor-outdoor\\\"> Indoor</label>\\n    <label><input type=\\\"radio\\\" name=\\\"indoor-outdoor\\\"> Outdoor</label>\\n    <label><input type=\\\"checkbox\\\" name=\\\"personality\\\"> Loving</label>\\n    <label><input type=\\\"checkbox\\\" name=\\\"personality\\\"> Lazy</label>\\n    <label><input type=\\\"checkbox\\\" name=\\\"personality\\\"> Crazy</label>\\n    <input type=\\\"text\\\" placeholder=\\\"cat photo URL\\\" required>\\n    <button type=\\\"submit\\\">Submit</button>\\n  </form>\\n</div>\\n\",\n              \"name\" : \"Create a Block Element Bootstrap Button\",\n              \"completedDate\" : 1462774406822\n          },\n          \"bad87fee1348cd8acef08811\" : {\n              \"id\" : \"bad87fee1348cd8acef08811\",\n              \"challengeType\" : 0,\n              \"solution\" : \"<link href=\\\"//fonts.gdgdocs.org/css?family=Lobster\\\" rel=\\\"stylesheet\\\" type=\\\"text/css\\\">\\n<style>\\n  .red-text {\\n    color: red;\\n  }\\n\\n  h2 {\\n    font-family: Lobster, Monospace;\\n  }\\n\\n  p {\\n    font-size: 16px;\\n    font-family: Monospace;\\n  }\\n\\n  .thick-green-border {\\n    border-color: green;\\n    border-width: 10px;\\n    border-style: solid;\\n    border-radius: 50%;\\n  }\\n\\n  .smaller-image {\\n    width: 100px;\\n  }\\n</style>\\n\\n<div class=\\\"container-fluid\\\">\\n  <h2 class=\\\"red-text text-center\\\">CatPhotoApp</h2>\\n\\n  <p>Click here for <a href=\\\"#\\\">cat photos</a>.</p>\\n\\n  <a href=\\\"#\\\"><img class=\\\"smaller-image thick-green-border\\\" src=\\\"/images/relaxing-cat.jpg\\\"></a>\\n\\n  <img src=\\\"/images/running-cat.jpg\\\" class=\\\"img-responsive\\\">\\n  <button class=\\\"btn btn-block btn-primary\\\">Like</button>\\n  <p>Things cats love:</p>\\n  <ul>\\n    <li>cat nip</li>\\n    <li>laser pointers</li>\\n    <li>lasagna</li>\\n  </ul>\\n  <p>Top 3 things cats hate:</p>\\n  <ol>\\n    <li>flea treatment</li>\\n    <li>thunder</li>\\n    <li>other cats</li>\\n  </ol>\\n  <form action=\\\"/submit-cat-photo\\\">\\n    <label><input type=\\\"radio\\\" name=\\\"indoor-outdoor\\\"> Indoor</label>\\n    <label><input type=\\\"radio\\\" name=\\\"indoor-outdoor\\\"> Outdoor</label>\\n    <label><input type=\\\"checkbox\\\" name=\\\"personality\\\"> Loving</label>\\n    <label><input type=\\\"checkbox\\\" name=\\\"personality\\\"> Lazy</label>\\n    <label><input type=\\\"checkbox\\\" name=\\\"personality\\\"> Crazy</label>\\n    <input type=\\\"text\\\" placeholder=\\\"cat photo URL\\\" required>\\n    <button type=\\\"submit\\\">Submit</button>\\n  </form>\\n</div>\\n\",\n              \"name\" : \"Taste the Bootstrap Button Color Rainbow\",\n              \"completedDate\" : 1462774487826\n          },\n          \"bad87fee1348cd8acef08813\" : {\n              \"id\" : \"bad87fee1348cd8acef08813\",\n              \"challengeType\" : 0,\n              \"solution\" : \"<link href=\\\"//fonts.gdgdocs.org/css?family=Lobster\\\" rel=\\\"stylesheet\\\" type=\\\"text/css\\\">\\n<style>\\n  .red-text {\\n    color: red;\\n  }\\n\\n  h2 {\\n    font-family: Lobster, Monospace;\\n  }\\n\\n  p {\\n    font-size: 16px;\\n    font-family: Monospace;\\n  }\\n\\n  .thick-green-border {\\n    border-color: green;\\n    border-width: 10px;\\n    border-style: solid;\\n    border-radius: 50%;\\n  }\\n\\n  .smaller-image {\\n    width: 100px;\\n  }\\n</style>\\n\\n<div class=\\\"container-fluid\\\">\\n  <h2 class=\\\"red-text text-center\\\">CatPhotoApp</h2>\\n\\n  <p>Click here for <a href=\\\"#\\\">cat photos</a>.</p>\\n\\n  <a href=\\\"#\\\"><img class=\\\"smaller-image thick-green-border\\\" src=\\\"/images/relaxing-cat.jpg\\\"></a>\\n\\n  <img src=\\\"/images/running-cat.jpg\\\" class=\\\"img-responsive\\\">\\n  <button class=\\\"btn btn-block btn-primary\\\">Like</button>\\n  <button class=\\\"btn btn-block btn-info\\\">Info</button>\\n  <p>Things cats love:</p>\\n  <ul>\\n    <li>cat nip</li>\\n    <li>laser pointers</li>\\n    <li>lasagna</li>\\n  </ul>\\n  <p>Top 3 things cats hate:</p>\\n  <ol>\\n    <li>flea treatment</li>\\n    <li>thunder</li>\\n    <li>other cats</li>\\n  </ol>\\n  <form action=\\\"/submit-cat-photo\\\">\\n    <label><input type=\\\"radio\\\" name=\\\"indoor-outdoor\\\"> Indoor</label>\\n    <label><input type=\\\"radio\\\" name=\\\"indoor-outdoor\\\"> Outdoor</label>\\n    <label><input type=\\\"checkbox\\\" name=\\\"personality\\\"> Loving</label>\\n    <label><input type=\\\"checkbox\\\" name=\\\"personality\\\"> Lazy</label>\\n    <label><input type=\\\"checkbox\\\" name=\\\"personality\\\"> Crazy</label>\\n    <input type=\\\"text\\\" placeholder=\\\"cat photo URL\\\" required>\\n    <button type=\\\"submit\\\">Submit</button>\\n  </form>\\n</div>\\n\",\n              \"name\" : \"Call out Optional Actions with Button Info\",\n              \"completedDate\" : 1462774887926\n          },\n          \"bad87fee1348ce8acef08814\" : {\n              \"id\" : \"bad87fee1348ce8acef08814\",\n              \"challengeType\" : 0,\n              \"solution\" : \"<link href=\\\"//fonts.gdgdocs.org/css?family=Lobster\\\" rel=\\\"stylesheet\\\" type=\\\"text/css\\\">\\n<style>\\n  .red-text {\\n    color: red;\\n  }\\n\\n  h2 {\\n    font-family: Lobster, Monospace;\\n  }\\n\\n  p {\\n    font-size: 16px;\\n    font-family: Monospace;\\n  }\\n\\n  .thick-green-border {\\n    border-color: green;\\n    border-width: 10px;\\n    border-style: solid;\\n    border-radius: 50%;\\n  }\\n\\n  .smaller-image {\\n    width: 100px;\\n  }\\n</style>\\n\\n<div class=\\\"container-fluid\\\">\\n  <h2 class=\\\"red-text text-center\\\">CatPhotoApp</h2>\\n\\n  <p>Click here for <a href=\\\"#\\\">cat photos</a>.</p>\\n\\n  <a href=\\\"#\\\"><img class=\\\"smaller-image thick-green-border\\\" src=\\\"/images/relaxing-cat.jpg\\\"></a>\\n\\n  <img src=\\\"/images/running-cat.jpg\\\" class=\\\"img-responsive\\\">\\n  <button class=\\\"btn btn-block btn-primary\\\">Like</button>\\n  <button class=\\\"btn btn-block btn-info\\\">Info</button>\\n  <button class=\\\"btn btn-block btn-danger\\\">Delete</button>\\n  <p>Things cats love:</p>\\n  <ul>\\n    <li>cat nip</li>\\n    <li>laser pointers</li>\\n    <li>lasagna</li>\\n  </ul>\\n  <p>Top 3 things cats hate:</p>\\n  <ol>\\n    <li>flea treatment</li>\\n    <li>thunder</li>\\n    <li>other cats</li>\\n  </ol>\\n  <form action=\\\"/submit-cat-photo\\\">\\n    <label><input type=\\\"radio\\\" name=\\\"indoor-outdoor\\\"> Indoor</label>\\n    <label><input type=\\\"radio\\\" name=\\\"indoor-outdoor\\\"> Outdoor</label>\\n    <label><input type=\\\"checkbox\\\" name=\\\"personality\\\"> Loving</label>\\n    <label><input type=\\\"checkbox\\\" name=\\\"personality\\\"> Lazy</label>\\n    <label><input type=\\\"checkbox\\\" name=\\\"personality\\\"> Crazy</label>\\n    <input type=\\\"text\\\" placeholder=\\\"cat photo URL\\\" required>\\n    <button type=\\\"submit\\\">Submit</button>\\n  </form>\\n</div>\\n\",\n              \"name\" : \"Warn your Users of a Dangerous Action\",\n              \"completedDate\" : 1462775031922\n          },\n          \"bad88fee1348ce8acef08815\" : {\n              \"id\" : \"bad88fee1348ce8acef08815\",\n              \"challengeType\" : 0,\n              \"solution\" : \"<link href=\\\"//fonts.gdgdocs.org/css?family=Lobster\\\" rel=\\\"stylesheet\\\" type=\\\"text/css\\\">\\n<style>\\n  .red-text {\\n    color: red;\\n  }\\n\\n  h2 {\\n    font-family: Lobster, Monospace;\\n  }\\n\\n  p {\\n    font-size: 16px;\\n    font-family: Monospace;\\n  }\\n\\n  .thick-green-border {\\n    border-color: green;\\n    border-width: 10px;\\n    border-style: solid;\\n    border-radius: 50%;\\n  }\\n\\n  .smaller-image {\\n    width: 100px;\\n  }\\n</style>\\n\\n<div class=\\\"container-fluid\\\">\\n  <h2 class=\\\"red-text text-center\\\">CatPhotoApp</h2>\\n\\n  <p>Click here for <a href=\\\"#\\\">cat photos</a>.</p>\\n\\n  <a href=\\\"#\\\"><img class=\\\"smaller-image thick-green-border\\\" src=\\\"/images/relaxing-cat.jpg\\\"></a>\\n\\n  <img src=\\\"/images/running-cat.jpg\\\" class=\\\"img-responsive\\\">\\n  <div class=\\\"row\\\">\\n    <div class=\\\"col-xs-4\\\">\\n       <button class=\\\"btn btn-block btn-primary\\\">Like</button>\\n    </div>\\n    <div class=\\\"col-xs-4\\\">\\n       <button class=\\\"btn btn-block btn-primary\\\">Like</button>\\n    </div>\\n    <div class=\\\"col-xs-4\\\">\\n       <button class=\\\"btn btn-block btn-primary\\\">Like</button>\\n    </div>\\n  </div>\\n  <p>Things cats love:</p>\\n  <ul>\\n    <li>cat nip</li>\\n    <li>laser pointers</li>\\n    <li>lasagna</li>\\n  </ul>\\n  <p>Top 3 things cats hate:</p>\\n  <ol>\\n    <li>flea treatment</li>\\n    <li>thunder</li>\\n    <li>other cats</li>\\n  </ol>\\n  <form action=\\\"/submit-cat-photo\\\">\\n    <label><input type=\\\"radio\\\" name=\\\"indoor-outdoor\\\"> Indoor</label>\\n    <label><input type=\\\"radio\\\" name=\\\"indoor-outdoor\\\"> Outdoor</label>\\n    <label><input type=\\\"checkbox\\\" name=\\\"personality\\\"> Loving</label>\\n    <label><input type=\\\"checkbox\\\" name=\\\"personality\\\"> Lazy</label>\\n    <label><input type=\\\"checkbox\\\" name=\\\"personality\\\"> Crazy</label>\\n    <input type=\\\"text\\\" placeholder=\\\"cat photo URL\\\" required>\\n    <button type=\\\"submit\\\">Submit</button>\\n  </form>\\n</div>\\n\",\n              \"name\" : \"Use the Bootstrap Grid to Put Elements Side By Side\",\n              \"completedDate\" : 1462775273853\n          },\n          \"bad87fee1347bd9aedf08845\" : {\n              \"id\" : \"bad87fee1347bd9aedf08845\",\n              \"challengeType\" : 0,\n              \"solution\" : \"<link href=\\\"//fonts.gdgdocs.org/css?family=Lobster\\\" rel=\\\"stylesheet\\\" type=\\\"text/css\\\">\\n<style>\\n  h2 {\\n    font-family: Lobster, Monospace;\\n  }\\n\\n  .thick-green-border {\\n    border-color: green;\\n    border-width: 10px;\\n    border-style: solid;\\n    border-radius: 50%;\\n  }\\n</style>\\n\\n<div class=\\\"container-fluid\\\">\\n  <h2 class=\\\"text-primary text-center\\\">CatPhotoApp</h2>\\n\\n  <a href=\\\"#\\\"><img class=\\\"img-responsive thick-green-border\\\" src=\\\"/images/relaxing-cat.jpg\\\"></a>\\n\\n  <img src=\\\"/images/running-cat.jpg\\\" class=\\\"img-responsive\\\">\\n  <div class=\\\"row\\\">\\n    <div class=\\\"col-xs-4\\\">\\n      <button class=\\\"btn btn-block btn-primary\\\">Like</button>\\n    </div>\\n    <div class=\\\"col-xs-4\\\">\\n      <button class=\\\"btn btn-block btn-info\\\">Info</button>\\n    </div>\\n    <div class=\\\"col-xs-4\\\">\\n      <button class=\\\"btn btn-block btn-danger\\\">Delete</button>\\n    </div>\\n  </div>\\n  <p>Things cats love:</p>\\n  <ul>\\n    <li>cat nip</li>\\n    <li>laser pointers</li>\\n    <li>lasagna</li>\\n  </ul>\\n  <p>Top 3 things cats hate:</p>\\n  <ol>\\n    <li>flea treatment</li>\\n    <li>thunder</li>\\n    <li>other cats</li>\\n  </ol>\\n  <form action=\\\"/submit-cat-photo\\\">\\n    <label><input type=\\\"radio\\\" name=\\\"indoor-outdoor\\\"> Indoor</label>\\n    <label><input type=\\\"radio\\\" name=\\\"indoor-outdoor\\\"> Outdoor</label>\\n    <label><input type=\\\"checkbox\\\" name=\\\"personality\\\"> Loving</label>\\n    <label><input type=\\\"checkbox\\\" name=\\\"personality\\\"> Lazy</label>\\n    <label><input type=\\\"checkbox\\\" name=\\\"personality\\\"> Crazy</label>\\n    <input type=\\\"text\\\" placeholder=\\\"cat photo URL\\\" required>\\n    <button type=\\\"submit\\\">Submit</button>\\n  </form>\\n</div>\\n\",\n              \"name\" : \"Ditch Custom CSS for Bootstrap\",\n              \"completedDate\" : 1462775605809\n          },\n          \"bad87fee1348bd9aedf08845\" : {\n              \"id\" : \"bad87fee1348bd9aedf08845\",\n              \"challengeType\" : 0,\n              \"solution\" : \"<link href=\\\"//fonts.gdgdocs.org/css?family=Lobster\\\" rel=\\\"stylesheet\\\" type=\\\"text/css\\\">\\n<style>\\n\\n  h2 {\\n    font-family: Lobster, Monospace;\\n  }\\n\\n  .thick-green-border {\\n    border-color: green;\\n    border-width: 10px;\\n    border-style: solid;\\n    border-radius: 50%;\\n  }\\n\\n</style>\\n\\n<div class=\\\"container-fluid\\\">\\n  <h2 class=\\\"text-primary text-center\\\">CatPhotoApp</h2>\\n\\n  <a href=\\\"#\\\"><img class=\\\"img-responsive thick-green-border\\\" src=\\\"/images/relaxing-cat.jpg\\\"></a>\\n\\n  <img src=\\\"/images/running-cat.jpg\\\" class=\\\"img-responsive\\\">\\n  <div class=\\\"row\\\">\\n    <div class=\\\"col-xs-4\\\">\\n      <button class=\\\"btn btn-block btn-primary\\\">Like</button>\\n    </div>\\n    <div class=\\\"col-xs-4\\\">\\n      <button class=\\\"btn btn-block btn-info\\\">Info</button>\\n    </div>\\n    <div class=\\\"col-xs-4\\\">\\n      <button class=\\\"btn btn-block btn-danger\\\">Delete</button>\\n    </div>\\n  </div>\\n  <p>Things cats <span class=\\\"text-danger\\\">love:</span></p>\\n  <ul>\\n    <li>cat nip</li>\\n    <li>laser pointers</li>\\n    <li>lasagna</li>\\n  </ul>\\n  <p>Top 3 things cats hate:</p>\\n  <ol>\\n    <li>flea treatment</li>\\n    <li>thunder</li>\\n    <li>other cats</li>\\n  </ol>\\n  <form action=\\\"/submit-cat-photo\\\">\\n    <label><input type=\\\"radio\\\" name=\\\"indoor-outdoor\\\"> Indoor</label>\\n    <label><input type=\\\"radio\\\" name=\\\"indoor-outdoor\\\"> Outdoor</label>\\n    <label><input type=\\\"checkbox\\\" name=\\\"personality\\\"> Loving</label>\\n    <label><input type=\\\"checkbox\\\" name=\\\"personality\\\"> Lazy</label>\\n    <label><input type=\\\"checkbox\\\" name=\\\"personality\\\"> Crazy</label>\\n    <input type=\\\"text\\\" placeholder=\\\"cat photo URL\\\" required>\\n    <button type=\\\"submit\\\">Submit</button>\\n  </form>\\n</div>\\n\",\n              \"name\" : \"Use Spans for Inline Elements\",\n              \"completedDate\" : 1462775845582\n          },\n          \"bad87fee1348bd9aede08845\" : {\n              \"id\" : \"bad87fee1348bd9aede08845\",\n              \"challengeType\" : 0,\n              \"solution\" : \"<link href=\\\"//fonts.gdgdocs.org/css?family=Lobster\\\" rel=\\\"stylesheet\\\" type=\\\"text/css\\\">\\n\\n<style>\\n  h2 {\\n    font-family: Lobster, Monospace;\\n  }\\n\\n  .thick-green-border {\\n    border-color: green;\\n    border-width: 10px;\\n    border-style: solid;\\n    border-radius: 50%;\\n  }\\n</style>\\n\\n<div class=\\\"container-fluid\\\">\\n  <div class=\\\"row\\\">\\n    <div class=\\\"col-xs-8\\\">\\n      <h2 class=\\\"text-primary text-center\\\">CatPhotoApp</h2>\\n    </div>\\n    <div class=\\\"col-xs-4\\\">\\n      <a href=\\\"#\\\"><img class=\\\"img-responsive thick-green-border\\\" src=\\\"/images/relaxing-cat.jpg\\\"></a>\\n    </div>   \\n  </div>\\n\\n  <img src=\\\"/images/running-cat.jpg\\\" class=\\\"img-responsive\\\">\\n  <div class=\\\"row\\\">\\n    <div class=\\\"col-xs-4\\\">\\n      <button class=\\\"btn btn-block btn-primary\\\">Like</button>\\n    </div>\\n    <div class=\\\"col-xs-4\\\">\\n      <button class=\\\"btn btn-block btn-info\\\">Info</button>\\n    </div>\\n    <div class=\\\"col-xs-4\\\">\\n      <button class=\\\"btn btn-block btn-danger\\\">Delete</button>\\n    </div>\\n  </div>\\n  <p>Things cats <span class=\\\"text-danger\\\">love:</span></p>\\n  <ul>\\n    <li>cat nip</li>\\n    <li>laser pointers</li>\\n    <li>lasagna</li>\\n  </ul>\\n  <p>Top 3 things cats hate:</p>\\n  <ol>\\n    <li>flea treatment</li>\\n    <li>thunder</li>\\n    <li>other cats</li>\\n  </ol>\\n  <form action=\\\"/submit-cat-photo\\\">\\n    <label><input type=\\\"radio\\\" name=\\\"indoor-outdoor\\\"> Indoor</label>\\n    <label><input type=\\\"radio\\\" name=\\\"indoor-outdoor\\\"> Outdoor</label>\\n    <label><input type=\\\"checkbox\\\" name=\\\"personality\\\"> Loving</label>\\n    <label><input type=\\\"checkbox\\\" name=\\\"personality\\\"> Lazy</label>\\n    <label><input type=\\\"checkbox\\\" name=\\\"personality\\\"> Crazy</label>\\n    <input type=\\\"text\\\" placeholder=\\\"cat photo URL\\\" required>\\n    <button type=\\\"submit\\\">Submit</button>\\n  </form>\\n</div>\\n\",\n              \"name\" : \"Create a Custom Heading\",\n              \"completedDate\" : 1462776106106\n          },\n          \"bad87fee1348bd9aedd08845\" : {\n              \"id\" : \"bad87fee1348bd9aedd08845\",\n              \"challengeType\" : 0,\n              \"solution\" : \"<link href=\\\"//fonts.gdgdocs.org/css?family=Lobster\\\" rel=\\\"stylesheet\\\" type=\\\"text/css\\\">\\n<style>\\n  h2 {\\n    font-family: Lobster, Monospace;\\n  }\\n\\n  .thick-green-border {\\n    border-color: green;\\n    border-width: 10px;\\n    border-style: solid;\\n    border-radius: 50%;\\n  }\\n</style>\\n\\n<div class=\\\"container-fluid\\\">\\n  <div class=\\\"row\\\">\\n    <div class=\\\"col-xs-8\\\">\\n      <h2 class=\\\"text-primary text-center\\\">CatPhotoApp</h2>\\n    </div>\\n    <div class=\\\"col-xs-4\\\">\\n      <a href=\\\"#\\\"><img class=\\\"img-responsive thick-green-border\\\" src=\\\"/images/relaxing-cat.jpg\\\"></a>\\n    </div>\\n  </div>\\n  <img src=\\\"/images/running-cat.jpg\\\" class=\\\"img-responsive\\\">\\n  <div class=\\\"row\\\">\\n    <div class=\\\"col-xs-4\\\">\\n      <button class=\\\"btn btn-block btn-primary\\\">\\n        <i class=\\\"fa fa-thumbs-up\\\"></i>Like\\n      </button>\\n    </div>\\n    <div class=\\\"col-xs-4\\\">\\n      <button class=\\\"btn btn-block btn-info\\\">Info</button>\\n    </div>\\n    <div class=\\\"col-xs-4\\\">\\n      <button class=\\\"btn btn-block btn-danger\\\">Delete</button>\\n    </div>\\n  </div>\\n  <p>Things cats <span class=\\\"text-danger\\\">love:</span></p>\\n  <ul>\\n    <li>cat nip</li>\\n    <li>laser pointers</li>\\n    <li>lasagna</li>\\n  </ul>\\n  <p>Top 3 things cats hate:</p>\\n  <ol>\\n    <li>flea treatment</li>\\n    <li>thunder</li>\\n    <li>other cats</li>\\n  </ol>\\n  <form action=\\\"/submit-cat-photo\\\">\\n    <label><input type=\\\"radio\\\" name=\\\"indoor-outdoor\\\"> Indoor</label>\\n    <label><input type=\\\"radio\\\" name=\\\"indoor-outdoor\\\"> Outdoor</label>\\n    <label><input type=\\\"checkbox\\\" name=\\\"personality\\\"> Loving</label>\\n    <label><input type=\\\"checkbox\\\" name=\\\"personality\\\"> Lazy</label>\\n    <label><input type=\\\"checkbox\\\" name=\\\"personality\\\"> Crazy</label>\\n    <input type=\\\"text\\\" placeholder=\\\"cat photo URL\\\" required>\\n    <button type=\\\"submit\\\">Submit</button>\\n  </form>\\n</div>\\n\",\n              \"name\" : \"Add Font Awesome Icons to our Buttons\",\n              \"completedDate\" : 1462776378972\n          },\n          \"bad87fee1348bd9aedc08845\" : {\n              \"id\" : \"bad87fee1348bd9aedc08845\",\n              \"challengeType\" : 0,\n              \"solution\" : \"<link href=\\\"//fonts.gdgdocs.org/css?family=Lobster\\\" rel=\\\"stylesheet\\\" type=\\\"text/css\\\">\\n<style>\\n  h2 {\\n    font-family: Lobster, Monospace;\\n  }\\n\\n  .thick-green-border {\\n    border-color: green;\\n    border-width: 10px;\\n    border-style: solid;\\n    border-radius: 50%;\\n  }\\n</style>\\n\\n<div class=\\\"container-fluid\\\">\\n  <div class=\\\"row\\\">\\n    <div class=\\\"col-xs-8\\\">\\n      <h2 class=\\\"text-primary text-center\\\">CatPhotoApp</h2>\\n    </div>\\n    <div class=\\\"col-xs-4\\\">\\n      <a href=\\\"#\\\"><img class=\\\"img-responsive thick-green-border\\\" src=\\\"/images/relaxing-cat.jpg\\\"></a>\\n    </div>\\n  </div>\\n  <img src=\\\"/images/running-cat.jpg\\\" class=\\\"img-responsive\\\">\\n  <div class=\\\"row\\\">\\n    <div class=\\\"col-xs-4\\\">\\n      <button class=\\\"btn btn-block btn-primary\\\">\\n        <i class=\\\"fa fa-thumbs-up\\\"></i> Like\\n      </button>\\n    </div>\\n    <div class=\\\"col-xs-4\\\">\\n      <button class=\\\"btn btn-block btn-info\\\">\\n        <i class=\\\"fa fa-info-circle\\\"></i> Info\\n      </button>\\n    </div>\\n    <div class=\\\"col-xs-4\\\">\\n      <button class=\\\"btn btn-block btn-danger\\\">\\n        <i class=\\\"fa fa-trash\\\"></i>Delete\\n      </button>\\n    </div>\\n  </div>\\n  <p>Things cats <span class=\\\"text-danger\\\">love:</span></p>\\n  <ul>\\n    <li>cat nip</li>\\n    <li>laser pointers</li>\\n    <li>lasagna</li>\\n  </ul>\\n  <p>Top 3 things cats hate:</p>\\n  <ol>\\n    <li>flea treatment</li>\\n    <li>thunder</li>\\n    <li>other cats</li>\\n  </ol>\\n  <form action=\\\"/submit-cat-photo\\\">\\n    <label><input type=\\\"radio\\\" name=\\\"indoor-outdoor\\\"> Indoor</label>\\n    <label><input type=\\\"radio\\\" name=\\\"indoor-outdoor\\\"> Outdoor</label>\\n    <label><input type=\\\"checkbox\\\" name=\\\"personality\\\"> Loving</label>\\n    <label><input type=\\\"checkbox\\\" name=\\\"personality\\\"> Lazy</label>\\n    <label><input type=\\\"checkbox\\\" name=\\\"personality\\\"> Crazy</label>\\n    <input type=\\\"text\\\" placeholder=\\\"cat photo URL\\\" required>\\n    <button type=\\\"submit\\\">Submit</button>\\n  </form>\\n</div>\\n\",\n              \"name\" : \"Add Font Awesome Icons to all of our Buttons\",\n              \"completedDate\" : 1462776670489\n          },\n          \"bad87fee1348bd9aedb08845\" : {\n              \"id\" : \"bad87fee1348bd9aedb08845\",\n              \"challengeType\" : 0,\n              \"solution\" : \"<link href=\\\"//fonts.gdgdocs.org/css?family=Lobster\\\" rel=\\\"stylesheet\\\" type=\\\"text/css\\\">\\n<style>\\n  h2 {\\n    font-family: Lobster, Monospace;\\n  }\\n\\n  .thick-green-border {\\n    border-color: green;\\n    border-width: 10px;\\n    border-style: solid;\\n    border-radius: 50%;\\n  }\\n</style>\\n\\n<div class=\\\"container-fluid\\\">\\n  <div class=\\\"row\\\">\\n    <div class=\\\"col-xs-8\\\">\\n      <h2 class=\\\"text-primary text-center\\\">CatPhotoApp</h2>\\n    </div>\\n    <div class=\\\"col-xs-4\\\">\\n      <a href=\\\"#\\\"><img class=\\\"img-responsive thick-green-border\\\" src=\\\"/images/relaxing-cat.jpg\\\"></a>\\n    </div>\\n  </div>\\n  <img src=\\\"/images/running-cat.jpg\\\" class=\\\"img-responsive\\\">\\n  <div class=\\\"row\\\">\\n    <div class=\\\"col-xs-4\\\">\\n      <button class=\\\"btn btn-block btn-primary\\\"><i class=\\\"fa fa-thumbs-up\\\"></i>Like</button>\\n    </div>\\n    <div class=\\\"col-xs-4\\\">\\n      <button class=\\\"btn btn-block btn-info\\\"><i class=\\\"fa fa-info-circle\\\"></i>Info</button>\\n    </div>\\n    <div class=\\\"col-xs-4\\\">\\n      <button class=\\\"btn btn-block btn-danger\\\"><i class=\\\"fa fa-trash\\\"></i>Delete</button>\\n    </div>\\n  </div>\\n  <p>Things cats <span class=\\\"text-danger\\\">love:</span></p>\\n  <ul>\\n    <li>cat nip</li>\\n    <li>laser pointers</li>\\n    <li>lasagna</li>\\n  </ul>\\n  <p>Top 3 things cats hate:</p>\\n  <ol>\\n    <li>flea treatment</li>\\n    <li>thunder</li>\\n    <li>other cats</li>\\n  </ol>\\n  <form action=\\\"/submit-cat-photo\\\">\\n    <div class=\\\"row\\\">\\n      <div class=\\\"col-xs-6\\\">\\n        <label><input type=\\\"radio\\\" name=\\\"indoor-outdoor\\\"> Indoor</label>\\n      </div>\\n      <div class=\\\"col-xs-6\\\">\\n        <label><input type=\\\"radio\\\" name=\\\"indoor-outdoor\\\"> Outdoor</label>\\n      </div>\\n    </div>\\n    <label><input type=\\\"checkbox\\\" name=\\\"personality\\\"> Loving</label>\\n    <label><input type=\\\"checkbox\\\" name=\\\"personality\\\"> Lazy</label>\\n    <label><input type=\\\"checkbox\\\" name=\\\"personality\\\"> Crazy</label>\\n    <input type=\\\"text\\\" placeholder=\\\"cat photo URL\\\" required>\\n    <button type=\\\"submit\\\">Submit</button>\\n  </form>\\n</div>\\n\",\n              \"name\" : \"Responsively Style Radio Buttons\",\n              \"completedDate\" : 1462776986584\n          },\n          \"bad87fee1348bd9aeda08845\" : {\n              \"id\" : \"bad87fee1348bd9aeda08845\",\n              \"challengeType\" : 0,\n              \"solution\" : \"<link href=\\\"//fonts.gdgdocs.org/css?family=Lobster\\\" rel=\\\"stylesheet\\\" type=\\\"text/css\\\">\\n<style>\\n  h2 {\\n    font-family: Lobster, Monospace;\\n  }\\n\\n  .thick-green-border {\\n    border-color: green;\\n    border-width: 10px;\\n    border-style: solid;\\n    border-radius: 50%;\\n  }\\n\\n</style>\\n\\n<div class=\\\"container-fluid\\\">\\n  <div class=\\\"row\\\">\\n    <div class=\\\"col-xs-8\\\">\\n      <h2 class=\\\"text-primary text-center\\\">CatPhotoApp</h2>\\n    </div>\\n    <div class=\\\"col-xs-4\\\">\\n      <a href=\\\"#\\\"><img class=\\\"img-responsive thick-green-border\\\" src=\\\"/images/relaxing-cat.jpg\\\"></a>\\n    </div>\\n  </div>\\n  <img src=\\\"/images/running-cat.jpg\\\" class=\\\"img-responsive\\\">\\n  <div class=\\\"row\\\">\\n    <div class=\\\"col-xs-4\\\">\\n      <button class=\\\"btn btn-block btn-primary\\\"><i class=\\\"fa fa-thumbs-up\\\"></i> Like</button>\\n    </div>\\n    <div class=\\\"col-xs-4\\\">\\n      <button class=\\\"btn btn-block btn-info\\\"><i class=\\\"fa fa-info-circle\\\"></i> Info</button>\\n    </div>\\n    <div class=\\\"col-xs-4\\\">\\n      <button class=\\\"btn btn-block btn-danger\\\"><i class=\\\"fa fa-trash\\\"></i> Delete</button>\\n    </div>\\n  </div>\\n  <p>Things cats <span class=\\\"text-danger\\\">love:</span></p>\\n  <ul>\\n    <li>cat nip</li>\\n    <li>laser pointers</li>\\n    <li>lasagna</li>\\n  </ul>\\n  <p>Top 3 things cats hate:</p>\\n  <ol>\\n    <li>flea treatment</li>\\n    <li>thunder</li>\\n    <li>other cats</li>\\n  </ol>\\n  <form action=\\\"/submit-cat-photo\\\">\\n    <div class=\\\"row\\\">\\n      <div class=\\\"col-xs-6\\\">\\n        <label><input type=\\\"radio\\\" name=\\\"indoor-outdoor\\\"> Indoor</label>\\n      </div>\\n      <div class=\\\"col-xs-6\\\">\\n        <label><input type=\\\"radio\\\" name=\\\"indoor-outdoor\\\"> Outdoor</label>\\n      </div>\\n    </div>\\n    <div class=\\\"row\\\">\\n      <div class=\\\"col-xs-4\\\">\\n        <label><input type=\\\"checkbox\\\" name=\\\"personality\\\"> Loving</label>\\n      </div>\\n      <div class=\\\"col-xs-4\\\">\\n        <label><input type=\\\"checkbox\\\" name=\\\"personality\\\"> Lazy</label>\\n      </div>\\n      <div class=\\\"col-xs-4\\\">\\n        <label><input type=\\\"checkbox\\\" name=\\\"personality\\\"> Crazy</label>\\n      </div>\\n    </div>\\n    <input type=\\\"text\\\" placeholder=\\\"cat photo URL\\\" required>\\n    <button type=\\\"submit\\\">Submit</button>\\n  </form>\\n</div>\\n\",\n              \"name\" : \"Responsively Style Checkboxes\",\n              \"completedDate\" : 1462777132932\n          },\n          \"bad87fee1348bd9aed908845\" : {\n              \"id\" : \"bad87fee1348bd9aed908845\",\n              \"challengeType\" : 0,\n              \"solution\" : \"<link href=\\\"//fonts.gdgdocs.org/css?family=Lobster\\\" rel=\\\"stylesheet\\\" type=\\\"text/css\\\">\\n<style>\\n  h2 {\\n    font-family: Lobster, Monospace;\\n  }\\n\\n  .thick-green-border {\\n    border-color: green;\\n    border-width: 10px;\\n    border-style: solid;\\n    border-radius: 50%;\\n  }\\n\\n</style>\\n\\n<div class=\\\"container-fluid\\\">\\n  <div class=\\\"row\\\">\\n    <div class=\\\"col-xs-8\\\">\\n      <h2 class=\\\"text-primary text-center\\\">CatPhotoApp</h2>\\n    </div>\\n    <div class=\\\"col-xs-4\\\">\\n      <a href=\\\"#\\\"><img class=\\\"img-responsive thick-green-border\\\" src=\\\"/images/relaxing-cat.jpg\\\"></a>\\n    </div>\\n  </div>\\n  <img src=\\\"/images/running-cat.jpg\\\" class=\\\"img-responsive\\\">\\n  <div class=\\\"row\\\">\\n    <div class=\\\"col-xs-4\\\">\\n      <button class=\\\"btn btn-block btn-primary\\\"><i class=\\\"fa fa-thumbs-up\\\"></i> Like</button>\\n    </div>\\n    <div class=\\\"col-xs-4\\\">\\n      <button class=\\\"btn btn-block btn-info\\\"><i class=\\\"fa fa-info-circle\\\"></i> Info</button>\\n    </div>\\n    <div class=\\\"col-xs-4\\\">\\n      <button class=\\\"btn btn-block btn-danger\\\"><i class=\\\"fa fa-trash\\\"></i> Delete</button>\\n    </div>\\n  </div>\\n  <p>Things cats <span class=\\\"text-danger\\\">love:</span></p>\\n  <ul>\\n    <li>cat nip</li>\\n    <li>laser pointers</li>\\n    <li>lasagna</li>\\n  </ul>\\n  <p>Top 3 things cats hate:</p>\\n  <ol>\\n    <li>flea treatment</li>\\n    <li>thunder</li>\\n    <li>other cats</li>\\n  </ol>\\n  <form action=\\\"/submit-cat-photo\\\">\\n    <div class=\\\"row\\\">\\n      <div class=\\\"col-xs-6\\\">\\n        <label><input type=\\\"radio\\\" name=\\\"indoor-outdoor\\\"> Indoor</label>\\n      </div>\\n      <div class=\\\"col-xs-6\\\">\\n        <label><input type=\\\"radio\\\" name=\\\"indoor-outdoor\\\"> Outdoor</label>\\n      </div>\\n    </div>\\n    <div class=\\\"row\\\">\\n      <div class=\\\"col-xs-4\\\">\\n        <label><input type=\\\"checkbox\\\" name=\\\"personality\\\"> Loving</label>\\n      </div>\\n      <div class=\\\"col-xs-4\\\">\\n        <label><input type=\\\"checkbox\\\" name=\\\"personality\\\"> Lazy</label>\\n      </div>\\n      <div class=\\\"col-xs-4\\\">\\n        <label><input type=\\\"checkbox\\\" name=\\\"personality\\\"> Crazy</label>\\n      </div>\\n    </div>\\n    <input type=\\\"text\\\" class=\\\"form-control\\\" placeholder=\\\"cat photo URL\\\" required>\\n    <button type=\\\"submit\\\" class=\\\"btn btn-primary\\\"><i class=\\\"fa fa-paper-plane\\\"></i> Submit</button>\\n  </form>\\n</div>\\n\",\n              \"name\" : \"Style Text Inputs as Form Controls\",\n              \"completedDate\" : 1462777503182\n          },\n          \"bad87fee1348bd9aec908845\" : {\n              \"id\" : \"bad87fee1348bd9aec908845\",\n              \"challengeType\" : 0,\n              \"solution\" : \"<link href=\\\"//fonts.gdgdocs.org/css?family=Lobster\\\" rel=\\\"stylesheet\\\" type=\\\"text/css\\\">\\n<style>\\n  h2 {\\n    font-family: Lobster, Monospace;\\n  }\\n\\n  .thick-green-border {\\n    border-color: green;\\n    border-width: 10px;\\n    border-style: solid;\\n    border-radius: 50%;\\n  }\\n\\n</style>\\n\\n<div class=\\\"container-fluid\\\">\\n  <div class=\\\"row\\\">\\n    <div class=\\\"col-xs-8\\\">\\n      <h2 class=\\\"text-primary text-center\\\">CatPhotoApp</h2>\\n    </div>\\n    <div class=\\\"col-xs-4\\\">\\n      <a href=\\\"#\\\"><img class=\\\"img-responsive thick-green-border\\\" src=\\\"/images/relaxing-cat.jpg\\\"></a>\\n    </div>\\n  </div>\\n  <img src=\\\"/images/running-cat.jpg\\\" class=\\\"img-responsive\\\">\\n  <div class=\\\"row\\\">\\n    <div class=\\\"col-xs-4\\\">\\n      <button class=\\\"btn btn-block btn-primary\\\"><i class=\\\"fa fa-thumbs-up\\\"></i> Like</button>\\n    </div>\\n    <div class=\\\"col-xs-4\\\">\\n      <button class=\\\"btn btn-block btn-info\\\"><i class=\\\"fa fa-info-circle\\\"></i> Info</button>\\n    </div>\\n    <div class=\\\"col-xs-4\\\">\\n      <button class=\\\"btn btn-block btn-danger\\\"><i class=\\\"fa fa-trash\\\"></i> Delete</button>\\n    </div>\\n  </div>\\n  <p>Things cats <span class=\\\"text-danger\\\">love:</span></p>\\n  <ul>\\n    <li>cat nip</li>\\n    <li>laser pointers</li>\\n    <li>lasagna</li>\\n  </ul>\\n  <p>Top 3 things cats hate:</p>\\n  <ol>\\n    <li>flea treatment</li>\\n    <li>thunder</li>\\n    <li>other cats</li>\\n  </ol>\\n  <form action=\\\"/submit-cat-photo\\\">\\n    <div class=\\\"row\\\">\\n      <div class=\\\"col-xs-6\\\">\\n        <label><input type=\\\"radio\\\" name=\\\"indoor-outdoor\\\"> Indoor</label>\\n      </div>\\n      <div class=\\\"col-xs-6\\\">\\n        <label><input type=\\\"radio\\\" name=\\\"indoor-outdoor\\\"> Outdoor</label>\\n      </div>\\n    </div>\\n    <div class=\\\"row\\\">\\n      <div class=\\\"col-xs-4\\\">\\n        <label><input type=\\\"checkbox\\\" name=\\\"personality\\\"> Loving</label>\\n      </div>\\n      <div class=\\\"col-xs-4\\\">\\n        <label><input type=\\\"checkbox\\\" name=\\\"personality\\\"> Lazy</label>\\n      </div>\\n      <div class=\\\"col-xs-4\\\">\\n        <label><input type=\\\"checkbox\\\" name=\\\"personality\\\"> Crazy</label>\\n      </div>\\n    </div>\\n    <div class=\\\"row\\\">\\n      <div class=\\\"col-xs-7\\\">\\n        <input type=\\\"text\\\" class=\\\"form-control\\\" placeholder=\\\"cat photo URL\\\" required>\\n      </div>\\n      <div class=\\\"col-xs-5\\\">\\n        <button type=\\\"submit\\\" class=\\\"btn btn-primary\\\"><i class=\\\"fa fa-paper-plane\\\"></i> Submit</button>\\n      </div>\\n    </div>\\n  </form>\\n</div>\\n\",\n              \"name\" : \"Line up Form Elements Responsively with Bootstrap\",\n              \"completedDate\" : 1462777639526\n          },\n          \"bad87fee1348bd9aec908846\" : {\n              \"id\" : \"bad87fee1348bd9aec908846\",\n              \"challengeType\" : 0,\n              \"solution\" : \"<h3 class=\\\"text-primary text-center\\\">jQuery Playground</h3>\\n\\n\\n\",\n              \"name\" : \"Create a Bootstrap Headline\",\n              \"completedDate\" : 1462777690621\n          },\n          \"bad87fee1348bd9aec908746\" : {\n              \"id\" : \"bad87fee1348bd9aec908746\",\n              \"challengeType\" : 0,\n              \"solution\" : \"<div class=\\\"container-fluid\\\">\\n  <h3 class=\\\"text-primary text-center\\\">jQuery Playground</h3>  \\n</div>\\n\\n\\n\\n\",\n              \"name\" : \"House our page within a Bootstrap Container Fluid Div\",\n              \"completedDate\" : 1462777817279\n          },\n          \"bad87fee1348bd9bec908846\" : {\n              \"id\" : \"bad87fee1348bd9bec908846\",\n              \"challengeType\" : 0,\n              \"solution\" : \"<div class=\\\"container-fluid\\\">\\n  <h3 class=\\\"text-primary text-center\\\">jQuery Playground</h3>\\n  <div class=\\\"row\\\"></div>\\n</div>\\n\\n\",\n              \"name\" : \"Create a Bootstrap Row\",\n              \"completedDate\" : 1462777831972\n          },\n          \"bad87fee1348bd9aec908847\" : {\n              \"id\" : \"bad87fee1348bd9aec908847\",\n              \"challengeType\" : 0,\n              \"solution\" : \"<div class=\\\"container-fluid\\\">\\n  <h3 class=\\\"text-primary text-center\\\">jQuery Playground</h3>\\n  <div class=\\\"row\\\">\\n    <div class=\\\"col-xs-6\\\"></div>\\n    <div class=\\\"col-xs-6\\\"></div>\\n\\n  </div>\\n</div>\\n\",\n              \"name\" : \"Split your Bootstrap Row\",\n              \"completedDate\" : 1462777854058\n          },\n          \"bad87fee1348bd9aec908848\" : {\n              \"id\" : \"bad87fee1348bd9aec908848\",\n              \"challengeType\" : 0,\n              \"solution\" : \"<div class=\\\"container-fluid\\\">\\n  <h3 class=\\\"text-primary text-center\\\">jQuery Playground</h3>\\n  <div class=\\\"row\\\">\\n    <div class=\\\"col-xs-6\\\">\\n      <div class=\\\"well\\\"></div>\\n    </div>\\n    <div class=\\\"col-xs-6\\\">\\n      <div class=\\\"well\\\"></div>\\n    </div>\\n  </div>\\n</div>\\n\",\n              \"name\" : \"Create Bootstrap Wells\",\n              \"completedDate\" : 1462791212142\n          },\n          \"bad87fee1348bd9aec908849\" : {\n              \"id\" : \"bad87fee1348bd9aec908849\",\n              \"challengeType\" : 0,\n              \"solution\" : \"<div class=\\\"container-fluid\\\">\\n  <h3 class=\\\"text-primary text-center\\\">jQuery Playground</h3>\\n  <div class=\\\"row\\\">\\n    <div class=\\\"col-xs-6\\\">\\n      <div class=\\\"well\\\">\\n        <button></button>\\n        <button></button>\\n        <button></button>\\n\\n\\n      </div>\\n    </div>\\n    <div class=\\\"col-xs-6\\\">\\n      <div class=\\\"well\\\">\\n        <button></button>\\n        <button></button>\\n        <button></button>\\n\\n\\n      </div>\\n    </div>\\n  </div>\\n</div>\\n\",\n              \"name\" : \"Add Elements within your Bootstrap Wells\",\n              \"completedDate\" : 1462791286814\n          },\n          \"bad87fee1348bd9aec908850\" : {\n              \"id\" : \"bad87fee1348bd9aec908850\",\n              \"challengeType\" : 0,\n              \"solution\" : \"<div class=\\\"container-fluid\\\">\\n  <h3 class=\\\"text-primary text-center\\\">jQuery Playground</h3>\\n  <div class=\\\"row\\\">\\n    <div class=\\\"col-xs-6\\\">\\n      <div class=\\\"well\\\">\\n        <button class=\\\"btn btn-default\\\"></button>\\n        <button class=\\\"btn btn-default\\\"></button>\\n        <button class=\\\"btn btn-default\\\"></button>\\n      </div>\\n    </div>\\n    <div class=\\\"col-xs-6\\\">\\n      <div class=\\\"well\\\">\\n        <button class=\\\"btn btn-default\\\"></button>\\n        <button class=\\\"btn btn-default\\\"></button>\\n        <button class=\\\"btn btn-default\\\"></button>\\n      </div>\\n    </div>\\n  </div>\\n</div>\\n\",\n              \"name\" : \"Apply the Default Bootstrap Button Style\",\n              \"completedDate\" : 1462791337013\n          },\n          \"bad87fee1348bd9aec908852\" : {\n              \"id\" : \"bad87fee1348bd9aec908852\",\n              \"challengeType\" : 0,\n              \"solution\" : \"<div class=\\\"container-fluid\\\">\\n  <h3 class=\\\"text-primary text-center\\\">jQuery Playground</h3>\\n  <div class=\\\"row\\\">\\n    <div class=\\\"col-xs-6\\\">\\n      <div class=\\\"well\\\">\\n        <button class=\\\"btn btn-default target\\\"></button>\\n        <button class=\\\"btn btn-default target\\\"></button>\\n        <button class=\\\"btn btn-default target\\\"></button>\\n      </div>\\n    </div>\\n    <div class=\\\"col-xs-6\\\">\\n      <div class=\\\"well\\\">\\n        <button class=\\\"btn btn-default target\\\"></button>\\n        <button class=\\\"btn btn-default target\\\"></button>\\n        <button class=\\\"btn btn-default target\\\"></button>\\n      </div>\\n    </div>\\n  </div>\\n</div>\\n\",\n              \"name\" : \"Create a Class to Target with jQuery Selectors\",\n              \"completedDate\" : 1462791402310\n          },\n          \"bad87fee1348bd9aec908853\" : {\n              \"id\" : \"bad87fee1348bd9aec908853\",\n              \"challengeType\" : 0,\n              \"solution\" : \"<div class=\\\"container-fluid\\\">\\n  <h3 class=\\\"text-primary text-center\\\">jQuery Playground</h3>\\n  <div class=\\\"row\\\">\\n    <div class=\\\"col-xs-6\\\">\\n      <div id=\\\"left-well\\\" class=\\\"well\\\">\\n        <button class=\\\"btn btn-default target\\\"></button>\\n        <button class=\\\"btn btn-default target\\\"></button>\\n        <button class=\\\"btn btn-default target\\\"></button>\\n      </div>\\n    </div>\\n    <div class=\\\"col-xs-6\\\">\\n      <div id=\\\"right-well\\\" class=\\\"well\\\">\\n        <button class=\\\"btn btn-default target\\\"></button>\\n        <button class=\\\"btn btn-default target\\\"></button>\\n        <button class=\\\"btn btn-default target\\\"></button>\\n      </div>\\n    </div>\\n  </div>\\n</div>\\n\",\n              \"name\" : \"Add ID Attributes to Bootstrap Elements\",\n              \"completedDate\" : 1462791473488\n          },\n          \"bad87fee1348bd9aec908854\" : {\n              \"id\" : \"bad87fee1348bd9aec908854\",\n              \"challengeType\" : 0,\n              \"solution\" : \"<div class=\\\"container-fluid\\\">\\n  <h3 class=\\\"text-primary text-center\\\">jQuery Playground</h3>\\n  <div class=\\\"row\\\">\\n    <div class=\\\"col-xs-6\\\">\\n      <h4>#left-well</h4>\\n      <div class=\\\"well\\\" id=\\\"left-well\\\">\\n        <button class=\\\"btn btn-default target\\\">         \\n        </button>\\n        <button class=\\\"btn btn-default target\\\"></button>\\n        <button class=\\\"btn btn-default target\\\"></button>\\n      </div>\\n    </div>\\n    <div class=\\\"col-xs-6\\\">\\n      <h4>#right-well</h4>\\n      <div class=\\\"well\\\" id=\\\"right-well\\\">\\n        <button class=\\\"btn btn-default target\\\"></button>\\n        <button class=\\\"btn btn-default target\\\"></button>\\n        <button class=\\\"btn btn-default target\\\"></button>\\n      </div>\\n    </div>\\n  </div>\\n</div>\\n\",\n              \"name\" : \"Label Bootstrap Wells\",\n              \"completedDate\" : 1462791612164\n          },\n          \"bad87fee1348bd9aec908855\" : {\n              \"id\" : \"bad87fee1348bd9aec908855\",\n              \"challengeType\" : 0,\n              \"solution\" : \"<div class=\\\"container-fluid\\\">\\n  <h3 class=\\\"text-primary text-center\\\">jQuery Playground</h3>\\n  <div class=\\\"row\\\">\\n    <div class=\\\"col-xs-6\\\">\\n      <h4>#left-well</h4>\\n      <div class=\\\"well\\\" id=\\\"left-well\\\">\\n        <button id=\\\"target1\\\" class=\\\"btn btn-default target\\\"></button>\\n        <button id=\\\"target2\\\" class=\\\"btn btn-default target\\\"></button>\\n        <button id=\\\"target3\\\" class=\\\"btn btn-default target\\\"></button>\\n      </div>\\n    </div>\\n    <div class=\\\"col-xs-6\\\">\\n      <h4>#right-well</h4>\\n      <div class=\\\"well\\\" id=\\\"right-well\\\">\\n        <button id=\\\"target4\\\" class=\\\"btn btn-default target\\\"></button>\\n        <button id=\\\"target5\\\" class=\\\"btn btn-default target\\\"></button>\\n        <button id=\\\"target6\\\" class=\\\"btn btn-default target\\\"></button>\\n      </div>\\n    </div>\\n  </div>\\n</div>\\n\",\n              \"name\" : \"Give Each Element a Unique ID\",\n              \"completedDate\" : 1462791710424\n          },\n          \"bad87fee1348bd9aec908856\" : {\n              \"id\" : \"bad87fee1348bd9aec908856\",\n              \"challengeType\" : 0,\n              \"solution\" : \"<div class=\\\"container-fluid\\\">\\n  <h3 class=\\\"text-primary text-center\\\">jQuery Playground</h3>\\n  <div class=\\\"row\\\">\\n    <div class=\\\"col-xs-6\\\">\\n      <h4>#left-well</h4>\\n      <div class=\\\"well\\\" id=\\\"left-well\\\">\\n        <button class=\\\"btn btn-default target\\\" id=\\\"target1\\\">#target1</button>\\n        <button class=\\\"btn btn-default target\\\" id=\\\"target2\\\">#target2</button>\\n        <button class=\\\"btn btn-default target\\\" id=\\\"target3\\\">#target3</button>\\n      </div>\\n    </div>\\n    <div class=\\\"col-xs-6\\\">\\n      <h4>#right-well</h4>\\n      <div class=\\\"well\\\" id=\\\"right-well\\\">\\n        <button class=\\\"btn btn-default target\\\" id=\\\"target4\\\">#target4</button>\\n        <button class=\\\"btn btn-default target\\\" id=\\\"target5\\\">#target5</button>\\n        <button class=\\\"btn btn-default target\\\" id=\\\"target6\\\">#target6</button>\\n      </div>\\n    </div>\\n  </div>\\n</div>\\n\",\n              \"name\" : \"Label Bootstrap Buttons\",\n              \"completedDate\" : 1462791876536\n          },\n          \"bad87fee1348bd9aec908857\" : {\n              \"id\" : \"bad87fee1348bd9aec908857\",\n              \"challengeType\" : 0,\n              \"solution\" : \"<!-- Only change code above this line.-->\\n<div class=\\\"container-fluid\\\">\\n  <h3 class=\\\"text-primary text-center\\\">jQuery Playground</h3>\\n  <div class=\\\"row\\\">\\n    <div class=\\\"col-xs-6\\\">\\n      <h4>#left-well</h4>\\n      <div class=\\\"well\\\" id=\\\"left-well\\\">\\n        <button class=\\\"btn btn-default target\\\" id=\\\"target1\\\">#target1</button>\\n        <button class=\\\"btn btn-default target\\\" id=\\\"target2\\\">#target2</button>\\n        <button class=\\\"btn btn-default target\\\" id=\\\"target3\\\">#target3</button>\\n      </div>\\n    </div>\\n    <div class=\\\"col-xs-6\\\">\\n      <h4>#right-well</h4>\\n      <div class=\\\"well\\\" id=\\\"right-well\\\">\\n        <button class=\\\"btn btn-default target\\\" id=\\\"target4\\\">#target4</button>\\n        <button class=\\\"btn btn-default target\\\" id=\\\"target5\\\">#target5</button>\\n        <button class=\\\"btn btn-default target\\\" id=\\\"target6\\\">#target6</button>\\n      </div>\\n    </div>\\n  </div>\\n</div>\\n\",\n              \"name\" : \"Use Comments to Clarify Code\",\n              \"completedDate\" : 1462792017602\n          },\n          \"570add8ccb82ac38a17513c3\" : {\n              \"id\" : \"570add8ccb82ac38a17513c3\",\n              \"challengeType\" : 7,\n              \"name\" : \"Join our LinkedIn Alumni Network\",\n              \"completedDate\" : 1462792116630\n          },\n          \"560adc65cb82ac38a17513c2\" : {\n              \"id\" : \"560adc65cb82ac38a17513c2\",\n              \"challengeType\" : 7,\n              \"name\" : \"Join our Subreddit\",\n              \"completedDate\" : 1462792215243\n          },\n          \"560adf65cb82ac38a17513c2\" : {\n              \"id\" : \"560adf65cb82ac38a17513c2\",\n              \"challengeType\" : 7,\n              \"name\" : \"Read Coding News on our Medium Publication\",\n              \"completedDate\" : 1462792236571\n          },\n          \"560ade65cb82ac38a17513c2\" : {\n              \"id\" : \"560ade65cb82ac38a17513c2\",\n              \"challengeType\" : 7,\n              \"name\" : \"Watch us Code Live on Twitchtv\",\n              \"completedDate\" : 1462792281918\n          },\n          \"560add8ccb81ac38a17513c4\" : {\n              \"id\" : \"560add8ccb81ac38a17513c4\",\n              \"challengeType\" : 7,\n              \"name\" : \"Commit to a Goal and a Nonprofit\",\n              \"completedDate\" : 1462793087511\n          },\n          \"bad87fee1348bd9acdd08826\" : {\n              \"id\" : \"bad87fee1348bd9acdd08826\",\n              \"challengeType\" : 0,\n              \"solution\" : \"<script>\\n$(document).ready(function(){\\n  \\n});\\n  \\n</script>\\n<!-- Only change code above this line. -->\\n\\n<div class=\\\"container-fluid\\\">\\n  <h3 class=\\\"text-primary text-center\\\">jQuery Playground</h3>\\n  <div class=\\\"row\\\">\\n    <div class=\\\"col-xs-6\\\">\\n      <h4>#left-well</h4>\\n      <div class=\\\"well\\\" id=\\\"left-well\\\">\\n        <button class=\\\"btn btn-default target\\\" id=\\\"target1\\\">#target1</button>\\n        <button class=\\\"btn btn-default target\\\" id=\\\"target2\\\">#target2</button>\\n        <button class=\\\"btn btn-default target\\\" id=\\\"target3\\\">#target3</button>\\n      </div>\\n    </div>\\n    <div class=\\\"col-xs-6\\\">\\n      <h4>#right-well</h4>\\n      <div class=\\\"well\\\" id=\\\"right-well\\\">\\n        <button class=\\\"btn btn-default target\\\" id=\\\"target4\\\">#target4</button>\\n        <button class=\\\"btn btn-default target\\\" id=\\\"target5\\\">#target5</button>\\n        <button class=\\\"btn btn-default target\\\" id=\\\"target6\\\">#target6</button>\\n      </div>\\n    </div>\\n  </div>\\n</div>\\n\",\n              \"name\" : \"Learn how Script Tags and Document Ready Work\",\n              \"completedDate\" : 1462795221368\n          },\n          \"bad87fee1348bd9bedc08826\" : {\n              \"id\" : \"bad87fee1348bd9bedc08826\",\n              \"challengeType\" : 0,\n              \"solution\" : \"<script>\\n  $(document).ready(function() {\\n    $(\\\"button\\\").addClass('animated bounce')\\n  });\\n</script>\\n\\n<!-- Only change code above this line. -->\\n\\n<div class=\\\"container-fluid\\\">\\n  <h3 class=\\\"text-primary text-center\\\">jQuery Playground</h3>\\n  <div class=\\\"row\\\">\\n    <div class=\\\"col-xs-6\\\">\\n      <h4>#left-well</h4>\\n      <div class=\\\"well\\\" id=\\\"left-well\\\">\\n        <button class=\\\"btn btn-default target\\\" id=\\\"target1\\\">#target1</button>\\n        <button class=\\\"btn btn-default target\\\" id=\\\"target2\\\">#target2</button>\\n        <button class=\\\"btn btn-default target\\\" id=\\\"target3\\\">#target3</button>\\n      </div>\\n    </div>\\n    <div class=\\\"col-xs-6\\\">\\n      <h4>#right-well</h4>\\n      <div class=\\\"well\\\" id=\\\"right-well\\\">\\n        <button class=\\\"btn btn-default target\\\" id=\\\"target4\\\">#target4</button>\\n        <button class=\\\"btn btn-default target\\\" id=\\\"target5\\\">#target5</button>\\n        <button class=\\\"btn btn-default target\\\" id=\\\"target6\\\">#target6</button>\\n      </div>\\n    </div>\\n  </div>\\n</div>\\n\",\n              \"name\" : \"Target HTML Elements with Selectors Using jQuery\",\n              \"completedDate\" : 1462795761941\n          },\n          \"bad87fee1348bd9aedc08826\" : {\n              \"id\" : \"bad87fee1348bd9aedc08826\",\n              \"challengeType\" : 0,\n              \"solution\" : \"<script>\\n  $(document).ready(function() {\\n    $(\\\"button\\\").addClass(\\\"animated bounce\\\");\\n    $(\\\".well\\\").addClass(\\\"animated shake\\\");\\n  });\\n</script>\\n\\n<!-- Only change code above this line. -->\\n\\n<div class=\\\"container-fluid\\\">\\n  <h3 class=\\\"text-primary text-center\\\">jQuery Playground</h3>\\n  <div class=\\\"row\\\">\\n    <div class=\\\"col-xs-6\\\">\\n      <h4>#left-well</h4>\\n      <div class=\\\"well\\\" id=\\\"left-well\\\">\\n        <button class=\\\"btn btn-default target\\\" id=\\\"target1\\\">#target1</button>\\n        <button class=\\\"btn btn-default target\\\" id=\\\"target2\\\">#target2</button>\\n        <button class=\\\"btn btn-default target\\\" id=\\\"target3\\\">#target3</button>\\n      </div>\\n    </div>\\n    <div class=\\\"col-xs-6\\\">\\n      <h4>#right-well</h4>\\n      <div class=\\\"well\\\" id=\\\"right-well\\\">\\n        <button class=\\\"btn btn-default target\\\" id=\\\"target4\\\">#target4</button>\\n        <button class=\\\"btn btn-default target\\\" id=\\\"target5\\\">#target5</button>\\n        <button class=\\\"btn btn-default target\\\" id=\\\"target6\\\">#target6</button>\\n      </div>\\n    </div>\\n  </div>\\n</div>\\n\",\n              \"name\" : \"Target Elements by Class Using jQuery\",\n              \"completedDate\" : 1462796323986\n          },\n          \"bad87fee1348bd9aeda08826\" : {\n              \"id\" : \"bad87fee1348bd9aeda08826\",\n              \"challengeType\" : 0,\n              \"solution\" : \"<script>\\n  $(document).ready(function() {\\n    $(\\\"button\\\").addClass(\\\"animated bounce\\\");\\n    $(\\\".well\\\").addClass(\\\"animated shake\\\");\\n    $(\\\"#target3\\\").addClass(\\\"animated fadeout\\\");\\n  });\\n</script>\\n\\n<!-- Only change code above this line. -->\\n\\n<div class=\\\"container-fluid\\\">\\n  <h3 class=\\\"text-primary text-center\\\">jQuery Playground</h3>\\n  <div class=\\\"row\\\">\\n    <div class=\\\"col-xs-6\\\">\\n      <h4>#left-well</h4>\\n      <div class=\\\"well\\\" id=\\\"left-well\\\">\\n        <button class=\\\"btn btn-default target\\\" id=\\\"target1\\\">#target1</button>\\n        <button class=\\\"btn btn-default target\\\" id=\\\"target2\\\">#target2</button>\\n        <button class=\\\"btn btn-default target\\\" id=\\\"target3\\\">#target3</button>\\n      </div>\\n    </div>\\n    <div class=\\\"col-xs-6\\\">\\n      <h4>#right-well</h4>\\n      <div class=\\\"well\\\" id=\\\"right-well\\\">\\n        <button class=\\\"btn btn-default target\\\" id=\\\"target4\\\">#target4</button>\\n        <button class=\\\"btn btn-default target\\\" id=\\\"target5\\\">#target5</button>\\n        <button class=\\\"btn btn-default target\\\" id=\\\"target6\\\">#target6</button>\\n      </div>\\n    </div>\\n  </div>\\n</div>\\n\",\n              \"name\" : \"Target Elements by ID Using jQuery\",\n              \"completedDate\" : 1462796679841\n          },\n          \"bad87fee1348bd9aeda08726\" : {\n              \"id\" : \"bad87fee1348bd9aeda08726\",\n              \"challengeType\" : 0,\n              \"solution\" : \"<script>\\n  $(document).ready(function() {\\n\\n  });\\n</script>\\n\\n<!-- Only change code above this line. -->\\n\\n<div class=\\\"container-fluid\\\">\\n  <h3 class=\\\"text-primary text-center\\\">jQuery Playground</h3>\\n  <div class=\\\"row\\\">\\n    <div class=\\\"col-xs-6\\\">\\n      <h4>#left-well</h4>\\n      <div class=\\\"well\\\" id=\\\"left-well\\\">\\n        <button class=\\\"btn btn-default target\\\" id=\\\"target1\\\">#target1</button>\\n        <button class=\\\"btn btn-default target\\\" id=\\\"target2\\\">#target2</button>\\n        <button class=\\\"btn btn-default target\\\" id=\\\"target3\\\">#target3</button>\\n      </div>\\n    </div>\\n    <div class=\\\"col-xs-6\\\">\\n      <h4>#right-well</h4>\\n      <div class=\\\"well\\\" id=\\\"right-well\\\">\\n        <button class=\\\"btn btn-default target\\\" id=\\\"target4\\\">#target4</button>\\n        <button class=\\\"btn btn-default target\\\" id=\\\"target5\\\">#target5</button>\\n        <button class=\\\"btn btn-default target\\\" id=\\\"target6\\\">#target6</button>\\n      </div>\\n    </div>\\n  </div>\\n</div>\\n\",\n              \"name\" : \"Delete your jQuery Functions\",\n              \"completedDate\" : 1462796760829\n          },\n          \"bad87fee1348bd9aed908626\" : {\n              \"id\" : \"bad87fee1348bd9aed908626\",\n              \"challengeType\" : 0,\n              \"solution\" : \"<script>\\n  $(document).ready(function() {\\n    $(\\\"button\\\").addClass('animated');\\n    $('.btn').addClass('shake');\\n    $('#target1').addClass('btn-primary')\\n  });\\n\\n</script>\\n\\n<!-- Only change code above this line. -->\\n\\n<div class=\\\"container-fluid\\\">\\n  <h3 class=\\\"text-primary text-center\\\">jQuery Playground</h3>\\n  <div class=\\\"row\\\">\\n    <div class=\\\"col-xs-6\\\">\\n      <h4>#left-well</h4>\\n      <div class=\\\"well\\\" id=\\\"left-well\\\">\\n        <button class=\\\"btn btn-default target\\\" id=\\\"target1\\\">#target1</button>\\n        <button class=\\\"btn btn-default target\\\" id=\\\"target2\\\">#target2</button>\\n        <button class=\\\"btn btn-default target\\\" id=\\\"target3\\\">#target3</button>\\n      </div>\\n    </div>\\n    <div class=\\\"col-xs-6\\\">\\n      <h4>#right-well</h4>\\n      <div class=\\\"well\\\" id=\\\"right-well\\\">\\n        <button class=\\\"btn btn-default target\\\" id=\\\"target4\\\">#target4</button>\\n        <button class=\\\"btn btn-default target\\\" id=\\\"target5\\\">#target5</button>\\n        <button class=\\\"btn btn-default target\\\" id=\\\"target6\\\">#target6</button>\\n      </div>\\n    </div>\\n  </div>\\n</div>\\n\",\n              \"name\" : \"Target the same element with multiple jQuery Selectors\",\n              \"completedDate\" : 1462797962296,\n              \"lastUpdated\" : 1462798049971\n          },\n          \"bad87fee1348bd9aed918626\" : {\n              \"id\" : \"bad87fee1348bd9aed918626\",\n              \"challengeType\" : 0,\n              \"solution\" : \"<script>\\n  $(document).ready(function() {\\n    $(\\\"button\\\").addClass(\\\"animated bounce\\\");\\n    $(\\\".well\\\").addClass(\\\"animated shake\\\");\\n    $(\\\"#target3\\\").addClass(\\\"animated fadeOut\\\");\\n    $(\\\"button\\\").removeClass(\\\"btn-default\\\")\\n  });\\n</script>\\n\\n<!-- Only change code above this line. -->\\n\\n<div class=\\\"container-fluid\\\">\\n  <h3 class=\\\"text-primary text-center\\\">jQuery Playground</h3>\\n  <div class=\\\"row\\\">\\n    <div class=\\\"col-xs-6\\\">\\n      <h4>#left-well</h4>\\n      <div class=\\\"well\\\" id=\\\"left-well\\\">\\n        <button class=\\\"btn btn-default target\\\" id=\\\"target1\\\">#target1</button>\\n        <button class=\\\"btn btn-default target\\\" id=\\\"target2\\\">#target2</button>\\n        <button class=\\\"btn btn-default target\\\" id=\\\"target3\\\">#target3</button>\\n      </div>\\n    </div>\\n    <div class=\\\"col-xs-6\\\">\\n      <h4>#right-well</h4>\\n      <div class=\\\"well\\\" id=\\\"right-well\\\">\\n        <button class=\\\"btn btn-default target\\\" id=\\\"target4\\\">#target4</button>\\n        <button class=\\\"btn btn-default target\\\" id=\\\"target5\\\">#target5</button>\\n        <button class=\\\"btn btn-default target\\\" id=\\\"target6\\\">#target6</button>\\n      </div>\\n    </div>\\n  </div>\\n</div>\\n\",\n              \"name\" : \"Remove classes from an element with jQuery\",\n              \"completedDate\" : 1462798344325\n          },\n          \"bad87fee1348bd9aed908826\" : {\n              \"id\" : \"bad87fee1348bd9aed908826\",\n              \"challengeType\" : 0,\n              \"solution\" : \"<script>\\n  $(document).ready(function() {\\n    $(\\\"#target1\\\").css(\\\"color\\\",\\\"red\\\")\\n  });\\n</script>\\n\\n<!-- Only change code above this line. -->\\n\\n<div class=\\\"container-fluid\\\">\\n  <h3 class=\\\"text-primary text-center\\\">jQuery Playground</h3>\\n  <div class=\\\"row\\\">\\n    <div class=\\\"col-xs-6\\\">\\n      <h4>#left-well</h4>\\n      <div class=\\\"well\\\" id=\\\"left-well\\\">\\n        <button class=\\\"btn btn-default target\\\" id=\\\"target1\\\">#target1</button>\\n        <button class=\\\"btn btn-default target\\\" id=\\\"target2\\\">#target2</button>\\n        <button class=\\\"btn btn-default target\\\" id=\\\"target3\\\">#target3</button>\\n      </div>\\n    </div>\\n    <div class=\\\"col-xs-6\\\">\\n      <h4>#right-well</h4>\\n      <div class=\\\"well\\\" id=\\\"right-well\\\">\\n        <button class=\\\"btn btn-default target\\\" id=\\\"target4\\\">#target4</button>\\n        <button class=\\\"btn btn-default target\\\" id=\\\"target5\\\">#target5</button>\\n        <button class=\\\"btn btn-default target\\\" id=\\\"target6\\\">#target6</button>\\n      </div>\\n    </div>\\n  </div>\\n</div>\\n\",\n              \"name\" : \"Change the CSS of an Element Using jQuery\",\n              \"completedDate\" : 1462798458782,\n              \"lastUpdated\" : 1462842360745\n          },\n          \"bad87fee1348bd9aed808826\" : {\n              \"id\" : \"bad87fee1348bd9aed808826\",\n              \"challengeType\" : 0,\n              \"solution\" : \"<script>\\n  $(document).ready(function() {\\n    $(\\\"#target1\\\").css(\\\"color\\\", \\\"red\\\");\\n    $(\\\"#target1\\\").prop(\\\"disabled\\\", true);\\n  });\\n</script>\\n\\n<!-- Only change code above this line. -->\\n\\n<div class=\\\"container-fluid\\\">\\n  <h3 class=\\\"text-primary text-center\\\">jQuery Playground</h3>\\n  <div class=\\\"row\\\">\\n    <div class=\\\"col-xs-6\\\">\\n      <h4>#left-well</h4>\\n      <div class=\\\"well\\\" id=\\\"left-well\\\">\\n        <button class=\\\"btn btn-default target\\\" id=\\\"target1\\\">#target1</button>\\n        <button class=\\\"btn btn-default target\\\" id=\\\"target2\\\">#target2</button>\\n        <button class=\\\"btn btn-default target\\\" id=\\\"target3\\\">#target3</button>\\n      </div>\\n    </div>\\n    <div class=\\\"col-xs-6\\\">\\n      <h4>#right-well</h4>\\n      <div class=\\\"well\\\" id=\\\"right-well\\\">\\n        <button class=\\\"btn btn-default target\\\" id=\\\"target4\\\">#target4</button>\\n        <button class=\\\"btn btn-default target\\\" id=\\\"target5\\\">#target5</button>\\n        <button class=\\\"btn btn-default target\\\" id=\\\"target6\\\">#target6</button>\\n      </div>\\n    </div>\\n  </div>\\n</div>\\n\",\n              \"name\" : \"Disable an Element Using jQuery\",\n              \"completedDate\" : 1462798690027,\n              \"lastUpdated\" : 1462842792265\n          },\n          \"564944c91be2204b269d51e3\" : {\n              \"id\" : \"564944c91be2204b269d51e3\",\n              \"challengeType\" : 0,\n              \"solution\" : \"<script>\\n  $(document).ready(function() {\\n    $(\\\"#target1\\\").css(\\\"color\\\", \\\"red\\\");\\n    $(\\\"h3\\\").html(\\\"<i>jQuery Playground</i>\\\");\\n    $(\\\"#target4\\\").html(\\\"<em>#target4</em>\\\");\\n  });\\n</script>\\n\\n<!-- Only change code above this line. -->\\n\\n<div class=\\\"container-fluid\\\">\\n  <h3 class=\\\"text-primary text-center\\\">jQuery Playground</h3>\\n  <div class=\\\"row\\\">\\n    <div class=\\\"col-xs-6\\\">\\n      <h4>#left-well</h4>\\n      <div class=\\\"well\\\" id=\\\"left-well\\\">\\n        <button class=\\\"btn btn-default target\\\" id=\\\"target1\\\">#target1</button>\\n        <button class=\\\"btn btn-default target\\\" id=\\\"target2\\\">#target2</button>\\n        <button class=\\\"btn btn-default target\\\" id=\\\"target3\\\">#target3</button>\\n      </div>\\n    </div>\\n    <div class=\\\"col-xs-6\\\">\\n      <h4>#right-well</h4>\\n      <div class=\\\"well\\\" id=\\\"right-well\\\">\\n        <button class=\\\"btn btn-default target\\\" id=\\\"target4\\\">#target4</button>\\n        <button class=\\\"btn btn-default target\\\" id=\\\"target5\\\">#target5</button>\\n        <button class=\\\"btn btn-default target\\\" id=\\\"target6\\\">#target6</button>\\n      </div>\\n    </div>\\n  </div>\\n</div>\\n\",\n              \"name\" : \"Change Text Inside an Element Using jQuery\",\n              \"completedDate\" : 1462844063834\n          },\n          \"bad87fee1348bd9aed708826\" : {\n              \"id\" : \"bad87fee1348bd9aed708826\",\n              \"challengeType\" : 0,\n              \"solution\" : \"<script>\\n  $(document).ready(function() {\\n    $(\\\"#target1\\\").css(\\\"color\\\", \\\"red\\\");\\n    $(\\\"#target1\\\").prop(\\\"disabled\\\", true);\\n    $(\\\"#target4\\\").remove();\\n  });\\n</script>\\n\\n<!-- Only change code above this line. -->\\n\\n<div class=\\\"container-fluid\\\">\\n  <h3 class=\\\"text-primary text-center\\\">jQuery Playground</h3>\\n  <div class=\\\"row\\\">\\n    <div class=\\\"col-xs-6\\\">\\n      <h4>#left-well</h4>\\n      <div class=\\\"well\\\" id=\\\"left-well\\\">\\n        <button class=\\\"btn btn-default target\\\" id=\\\"target1\\\">#target1</button>\\n        <button class=\\\"btn btn-default target\\\" id=\\\"target2\\\">#target2</button>\\n        <button class=\\\"btn btn-default target\\\" id=\\\"target3\\\">#target3</button>\\n      </div>\\n    </div>\\n    <div class=\\\"col-xs-6\\\">\\n      <h4>#right-well</h4>\\n      <div class=\\\"well\\\" id=\\\"right-well\\\">\\n        <button class=\\\"btn btn-default target\\\" id=\\\"target4\\\">#target4</button>\\n        <button class=\\\"btn btn-default target\\\" id=\\\"target5\\\">#target5</button>\\n        <button class=\\\"btn btn-default target\\\" id=\\\"target6\\\">#target6</button>\\n      </div>\\n    </div>\\n  </div>\\n</div>\\n\",\n              \"name\" : \"Remove an Element Using jQuery\",\n              \"completedDate\" : 1462844095735\n          },\n          \"bad87fee1348bd9aed608826\" : {\n              \"id\" : \"bad87fee1348bd9aed608826\",\n              \"challengeType\" : 0,\n              \"solution\" : \"<script>\\n  $(document).ready(function() {\\n    $(\\\"#target1\\\").css(\\\"color\\\", \\\"red\\\");\\n    $(\\\"#target1\\\").prop(\\\"disabled\\\", true);\\n    $(\\\"#target4\\\").remove();\\n    $(\\\"#target2\\\").appendTo(\\\"#right-well\\\");\\n  });\\n</script>\\n\\n<!-- Only change code above this line. -->\\n\\n<div class=\\\"container-fluid\\\">\\n  <h3 class=\\\"text-primary text-center\\\">jQuery Playground</h3>\\n  <div class=\\\"row\\\">\\n    <div class=\\\"col-xs-6\\\">\\n      <h4>#left-well</h4>\\n      <div class=\\\"well\\\" id=\\\"left-well\\\">\\n        <button class=\\\"btn btn-default target\\\" id=\\\"target1\\\">#target1</button>\\n        <button class=\\\"btn btn-default target\\\" id=\\\"target2\\\">#target2</button>\\n        <button class=\\\"btn btn-default target\\\" id=\\\"target3\\\">#target3</button>\\n      </div>\\n    </div>\\n    <div class=\\\"col-xs-6\\\">\\n      <h4>#right-well</h4>\\n      <div class=\\\"well\\\" id=\\\"right-well\\\">\\n        <button class=\\\"btn btn-default target\\\" id=\\\"target4\\\">#target4</button>\\n        <button class=\\\"btn btn-default target\\\" id=\\\"target5\\\">#target5</button>\\n        <button class=\\\"btn btn-default target\\\" id=\\\"target6\\\">#target6</button>\\n      </div>\\n    </div>\\n  </div>\\n</div>\\n\",\n              \"name\" : \"Use appendTo to Move Elements with jQuery\",\n              \"completedDate\" : 1462844311041\n          },\n          \"bad87fee1348bd9aed508826\" : {\n              \"id\" : \"bad87fee1348bd9aed508826\",\n              \"challengeType\" : 0,\n              \"solution\" : \"<script>\\n  $(document).ready(function() {\\n    $(\\\"#target1\\\").css(\\\"color\\\", \\\"red\\\");\\n    $(\\\"#target1\\\").prop(\\\"disabled\\\", true);\\n    $(\\\"#target4\\\").remove();\\n    $(\\\"#target2\\\").appendTo(\\\"#right-well\\\");\\n    $(\\\"#target5\\\").clone().appendTo(\\\"#left-well\\\")\\n  });\\n</script>\\n\\n<!-- Only change code above this line. -->\\n\\n<div class=\\\"container-fluid\\\">\\n  <h3 class=\\\"text-primary text-center\\\">jQuery Playground</h3>\\n  <div class=\\\"row\\\">\\n    <div class=\\\"col-xs-6\\\">\\n      <h4>#left-well</h4>\\n      <div class=\\\"well\\\" id=\\\"left-well\\\">\\n        <button class=\\\"btn btn-default target\\\" id=\\\"target1\\\">#target1</button>\\n        <button class=\\\"btn btn-default target\\\" id=\\\"target2\\\">#target2</button>\\n        <button class=\\\"btn btn-default target\\\" id=\\\"target3\\\">#target3</button>\\n      </div>\\n    </div>\\n    <div class=\\\"col-xs-6\\\">\\n      <h4>#right-well</h4>\\n      <div class=\\\"well\\\" id=\\\"right-well\\\">\\n        <button class=\\\"btn btn-default target\\\" id=\\\"target4\\\">#target4</button>\\n        <button class=\\\"btn btn-default target\\\" id=\\\"target5\\\">#target5</button>\\n        <button class=\\\"btn btn-default target\\\" id=\\\"target6\\\">#target6</button>\\n      </div>\\n    </div>\\n  </div>\\n</div>\\n\",\n              \"name\" : \"Clone an Element Using jQuery\",\n              \"completedDate\" : 1462844804422\n          },\n          \"bad87fee1348bd9aed308826\" : {\n              \"id\" : \"bad87fee1348bd9aed308826\",\n              \"challengeType\" : 0,\n              \"solution\" : \"<script>\\n  $(document).ready(function() {\\n    $(\\\"#target1\\\").css(\\\"color\\\", \\\"red\\\");\\n    $(\\\"#target1\\\").prop(\\\"disabled\\\", true);\\n    $(\\\"#target4\\\").remove();\\n    $(\\\"#target2\\\").appendTo(\\\"#right-well\\\");\\n    $(\\\"#target5\\\").clone().appendTo(\\\"#left-well\\\");\\n    $(\\\"#target1\\\").parent().css(\\\"background-color\\\",'red')\\n  });\\n</script>\\n\\n<!-- Only change code above this line. -->\\n\\n<body>\\n  <div class=\\\"container-fluid\\\">\\n    <h3 class=\\\"text-primary text-center\\\">jQuery Playground</h3>\\n    <div class=\\\"row\\\">\\n      <div class=\\\"col-xs-6\\\">\\n        <h4>#left-well</h4>\\n        <div class=\\\"well\\\" id=\\\"left-well\\\">\\n          <button class=\\\"btn btn-default target\\\" id=\\\"target1\\\">#target1</button>\\n          <button class=\\\"btn btn-default target\\\" id=\\\"target2\\\">#target2</button>\\n          <button class=\\\"btn btn-default target\\\" id=\\\"target3\\\">#target3</button>\\n        </div>\\n      </div>\\n      <div class=\\\"col-xs-6\\\">\\n        <h4>#right-well</h4>\\n        <div class=\\\"well\\\" id=\\\"right-well\\\">\\n          <button class=\\\"btn btn-default target\\\" id=\\\"target4\\\">#target4</button>\\n          <button class=\\\"btn btn-default target\\\" id=\\\"target5\\\">#target5</button>\\n          <button class=\\\"btn btn-default target\\\" id=\\\"target6\\\">#target6</button>\\n        </div>\\n      </div>\\n    </div>\\n  </div>\\n</body>\\n\",\n              \"name\" : \"Target the Parent of an Element Using jQuery\",\n              \"completedDate\" : 1462846056266\n          },\n          \"bad87fee1348bd9aed208826\" : {\n              \"id\" : \"bad87fee1348bd9aed208826\",\n              \"challengeType\" : 0,\n              \"solution\" : \"<script>\\n  $(document).ready(function() {\\n    $(\\\"#target1\\\").css(\\\"color\\\", \\\"red\\\");\\n    $(\\\"#target1\\\").prop(\\\"disabled\\\", true);\\n    $(\\\"#target4\\\").remove();\\n    $(\\\"#target2\\\").appendTo(\\\"#right-well\\\");\\n    $(\\\"#target5\\\").clone().appendTo(\\\"#left-well\\\");\\n    $(\\\"#target1\\\").parent().css(\\\"background-color\\\", \\\"red\\\");\\n    $(\\\"#right-well\\\").children().css(\\\"color\\\",\\\"orange\\\")\\n  });\\n</script>\\n\\n<!-- Only change code above this line. -->\\n\\n<div class=\\\"container-fluid\\\">\\n  <h3 class=\\\"text-primary text-center\\\">jQuery Playground</h3>\\n  <div class=\\\"row\\\">\\n    <div class=\\\"col-xs-6\\\">\\n      <h4>#left-well</h4>\\n      <div class=\\\"well\\\" id=\\\"left-well\\\">\\n        <button class=\\\"btn btn-default target\\\" id=\\\"target1\\\">#target1</button>\\n        <button class=\\\"btn btn-default target\\\" id=\\\"target2\\\">#target2</button>\\n        <button class=\\\"btn btn-default target\\\" id=\\\"target3\\\">#target3</button>\\n      </div>\\n    </div>\\n    <div class=\\\"col-xs-6\\\">\\n      <h4>#right-well</h4>\\n      <div class=\\\"well\\\" id=\\\"right-well\\\">\\n        <button class=\\\"btn btn-default target\\\" id=\\\"target4\\\">#target4</button>\\n        <button class=\\\"btn btn-default target\\\" id=\\\"target5\\\">#target5</button>\\n        <button class=\\\"btn btn-default target\\\" id=\\\"target6\\\">#target6</button>\\n      </div>\\n    </div>\\n  </div>\\n</div>\\n\",\n              \"name\" : \"Target the Children of an Element Using jQuery\",\n              \"completedDate\" : 1462846619204\n          },\n          \"bad87fee1348bd9aed108826\" : {\n              \"id\" : \"bad87fee1348bd9aed108826\",\n              \"challengeType\" : 0,\n              \"solution\" : \"<script>\\n  $(document).ready(function() {\\n    $(\\\"#target1\\\").css(\\\"color\\\", \\\"red\\\");\\n    $(\\\"#target1\\\").prop(\\\"disabled\\\", true);\\n    $(\\\"#target4\\\").remove();\\n    $(\\\"#target2\\\").appendTo(\\\"#right-well\\\");\\n    $(\\\"#target5\\\").clone().appendTo(\\\"#left-well\\\");\\n    $(\\\"#target1\\\").parent().css(\\\"background-color\\\", \\\"red\\\");\\n    $(\\\"#right-well\\\").children().css(\\\"color\\\", \\\"orange\\\");\\n    $(\\\".target:nth-child(2)\\\").addClass(\\\"animated bounce\\\")\\n  });\\n</script>\\n\\n<!-- Only change code above this line. -->\\n\\n<div class=\\\"container-fluid\\\">\\n  <h3 class=\\\"text-primary text-center\\\">jQuery Playground</h3>\\n  <div class=\\\"row\\\">\\n    <div class=\\\"col-xs-6\\\">\\n      <h4>#left-well</h4>\\n      <div class=\\\"well\\\" id=\\\"left-well\\\">\\n        <button class=\\\"btn btn-default target\\\" id=\\\"target1\\\">#target1</button>\\n        <button class=\\\"btn btn-default target\\\" id=\\\"target2\\\">#target2</button>\\n        <button class=\\\"btn btn-default target\\\" id=\\\"target3\\\">#target3</button>\\n      </div>\\n    </div>\\n    <div class=\\\"col-xs-6\\\">\\n      <h4>#right-well</h4>\\n      <div class=\\\"well\\\" id=\\\"right-well\\\">\\n        <button class=\\\"btn btn-default target\\\" id=\\\"target4\\\">#target4</button>\\n        <button class=\\\"btn btn-default target\\\" id=\\\"target5\\\">#target5</button>\\n        <button class=\\\"btn btn-default target\\\" id=\\\"target6\\\">#target6</button>\\n      </div>\\n    </div>\\n  </div>\\n</div>\\n\",\n              \"name\" : \"Target a Specific Child of an Element Using jQuery\",\n              \"completedDate\" : 1462847783225\n          },\n          \"bad87fee1348bd9aed008826\" : {\n              \"id\" : \"bad87fee1348bd9aed008826\",\n              \"challengeType\" : 0,\n              \"solution\" : \"<script>\\n  $(document).ready(function() {\\n    $(\\\"#target1\\\").css(\\\"color\\\", \\\"red\\\");\\n    $(\\\"#target1\\\").prop(\\\"disabled\\\", true);\\n    $(\\\"#target4\\\").remove();\\n    $(\\\"#target2\\\").appendTo(\\\"#right-well\\\");\\n    $(\\\"#target5\\\").clone().appendTo(\\\"#left-well\\\");\\n    $(\\\"#target1\\\").parent().css(\\\"background-color\\\", \\\"red\\\");\\n    $(\\\"#right-well\\\").children().css(\\\"color\\\", \\\"orange\\\");\\n    $(\\\"#left-well\\\").children().css(\\\"color\\\", \\\"green\\\");\\n    $(\\\".target:nth-child(2)\\\").addClass(\\\"animated bounce\\\");\\n    $(\\\".target:even\\\").addClass(\\\"animated shake\\\");\\n  });\\n</script>\\n\\n<!-- Only change code above this line. -->\\n\\n<div class=\\\"container-fluid\\\">\\n  <h3 class=\\\"text-primary text-center\\\">jQuery Playground</h3>\\n  <div class=\\\"row\\\">\\n    <div class=\\\"col-xs-6\\\">\\n      <h4>#left-well</h4>\\n      <div class=\\\"well\\\" id=\\\"left-well\\\">\\n        <button class=\\\"btn btn-default target\\\" id=\\\"target1\\\">#target1</button>\\n        <button class=\\\"btn btn-default target\\\" id=\\\"target2\\\">#target2</button>\\n        <button class=\\\"btn btn-default target\\\" id=\\\"target3\\\">#target3</button>\\n      </div>\\n    </div>\\n    <div class=\\\"col-xs-6\\\">\\n      <h4>#right-well</h4>\\n      <div class=\\\"well\\\" id=\\\"right-well\\\">\\n        <button class=\\\"btn btn-default target\\\" id=\\\"target4\\\">#target4</button>\\n        <button class=\\\"btn btn-default target\\\" id=\\\"target5\\\">#target5</button>\\n        <button class=\\\"btn btn-default target\\\" id=\\\"target6\\\">#target6</button>\\n      </div>\\n    </div>\\n  </div>\\n</div>\\n\",\n              \"name\" : \"Target Even Numbered Elements Using jQuery\",\n              \"completedDate\" : 1462848985198\n          },\n          \"bad87fee1348bd9aecb08826\" : {\n              \"id\" : \"bad87fee1348bd9aecb08826\",\n              \"challengeType\" : 0,\n              \"solution\" : \"<script>\\n  $(document).ready(function() {\\n    $(\\\"#target1\\\").css(\\\"color\\\", \\\"red\\\");\\n    $(\\\"#target1\\\").prop(\\\"disabled\\\", true);\\n    $(\\\"#target4\\\").remove();\\n    $(\\\"#target2\\\").appendTo(\\\"#right-well\\\");\\n    $(\\\"#target5\\\").clone().appendTo(\\\"#left-well\\\");\\n    $(\\\"#target1\\\").parent().css(\\\"background-color\\\", \\\"red\\\");\\n    $(\\\"#right-well\\\").children().css(\\\"color\\\", \\\"orange\\\");\\n    $(\\\"#left-well\\\").children().css(\\\"color\\\", \\\"green\\\");\\n    $(\\\".target:nth-child(2)\\\").addClass(\\\"animated bounce\\\");\\n    $(\\\".target:even\\\").addClass(\\\"animated shake\\\");\\n    $(\\\"body\\\").addClass(\\\"animated hinge\\\");\\n  });\\n</script>\\n\\n<!-- Only change code above this line. -->\\n\\n<div class=\\\"container-fluid\\\">\\n  <h3 class=\\\"text-primary text-center\\\">jQuery Playground</h3>\\n  <div class=\\\"row\\\">\\n    <div class=\\\"col-xs-6\\\">\\n      <h4>#left-well</h4>\\n      <div class=\\\"well\\\" id=\\\"left-well\\\">\\n        <button class=\\\"btn btn-default target\\\" id=\\\"target1\\\">#target1</button>\\n        <button class=\\\"btn btn-default target\\\" id=\\\"target2\\\">#target2</button>\\n        <button class=\\\"btn btn-default target\\\" id=\\\"target3\\\">#target3</button>\\n      </div>\\n    </div>\\n    <div class=\\\"col-xs-6\\\">\\n      <h4>#right-well</h4>\\n      <div class=\\\"well\\\" id=\\\"right-well\\\">\\n        <button class=\\\"btn btn-default target\\\" id=\\\"target4\\\">#target4</button>\\n        <button class=\\\"btn btn-default target\\\" id=\\\"target5\\\">#target5</button>\\n        <button class=\\\"btn btn-default target\\\" id=\\\"target6\\\">#target6</button>\\n      </div>\\n    </div>\\n  </div>\\n</div>\\n\",\n              \"name\" : \"Use jQuery to Modify the Entire Page\",\n              \"completedDate\" : 1462849236872\n          },\n          \"bd7158d8c442eddfaeb5bd18\" : {\n              \"id\" : \"bd7158d8c442eddfaeb5bd18\",\n              \"name\" : \"Build a Tribute Page\",\n              \"solution\" : \"http://codepen.io/huluoyang/full/JXWbZr/\",\n              \"githubLink\" : null,\n              \"challengeType\" : 3,\n              \"completedDate\" : 1462849992851\n          },\n          \"bd7123c9c441eddfaeb4bdef\" : {\n              \"id\" : \"bd7123c9c441eddfaeb4bdef\",\n              \"challengeType\" : 1,\n              \"solution\" : \"// this is an in-line comment.\\n/*\\n  this is a \\n  multi-line comment.\\n*/\\n\",\n              \"name\" : \"Comment your JavaScript Code\",\n              \"completedDate\" : 1462876333267\n          },\n          \"bd7123c9c443eddfaeb5bdef\" : {\n              \"id\" : \"bd7123c9c443eddfaeb5bdef\",\n              \"challengeType\" : 1,\n              \"solution\" : \"// Example\\nvar myName;\\n\\n// Define myName below this line\\n\\n\",\n              \"name\" : \"Declare JavaScript Variables\",\n              \"completedDate\" : 1462877580140\n          },\n          \"56533eb9ac21ba0edf2244a8\" : {\n              \"id\" : \"56533eb9ac21ba0edf2244a8\",\n              \"challengeType\" : 1,\n              \"solution\" : \"// Setup\\nvar a;\\nvar b = 2;\\n\\n// Only change code below this line\\na=7;\\nb=a;\\n\",\n              \"name\" : \"Storing Values with the Equal Operator\",\n              \"completedDate\" : 1462878027815\n          },\n          \"56533eb9ac21ba0edf2244a9\" : {\n              \"id\" : \"56533eb9ac21ba0edf2244a9\",\n              \"challengeType\" : 1,\n              \"solution\" : \"// Example\\nvar ourVar = 19;\\n\\n// Only change code below this line\\nvar a = 9;\\n\",\n              \"name\" : \"Initializing Variables with the Equal Operator\",\n              \"completedDate\" : 1462878147267\n          },\n          \"56533eb9ac21ba0edf2244aa\" : {\n              \"id\" : \"56533eb9ac21ba0edf2244aa\",\n              \"challengeType\" : 1,\n              \"solution\" : \"// Initialize these three variables\\nvar a;\\nvar b;\\nvar c;\\n\\n// Do not change code below this line\\nvar a = 5;\\nvar b =10;\\nvar c = \\\"I am a\\\";\\na = a + 1;\\nb = b + 5;\\nc = c + \\\" String!\\\";\\n\\n\",\n              \"name\" : \"Understanding Uninitialized Variables\",\n              \"completedDate\" : 1462878480430\n          },\n          \"56533eb9ac21ba0edf2244ab\" : {\n              \"id\" : \"56533eb9ac21ba0edf2244ab\",\n              \"challengeType\" : 1,\n              \"solution\" : \"// Declarations\\nvar studlyCapVar;\\nvar properCamelCase;\\nvar titleCaseOver;\\n\\n// Assignments\\nstudlyCapVar = 10;\\nproperCamelCase = \\\"A String\\\";\\ntitleCaseOver = 9000;\\n\",\n              \"name\" : \"Understanding Case Sensitivity in Variables\",\n              \"completedDate\" : 1462879350315,\n              \"lastUpdated\" : 1462881071620\n          },\n          \"cf1111c1c11feddfaeb3bdef\" : {\n              \"id\" : \"cf1111c1c11feddfaeb3bdef\",\n              \"challengeType\" : 1,\n              \"solution\" : \"var sum = 10 + 10;\\n\\n\",\n              \"name\" : \"Add Two Numbers with JavaScript\",\n              \"completedDate\" : 1462881232884\n          },\n          \"cf1111c1c11feddfaeb4bdef\" : {\n              \"id\" : \"cf1111c1c11feddfaeb4bdef\",\n              \"challengeType\" : 1,\n              \"solution\" : \"var difference = 45 - 33;\\n\\n\\n\",\n              \"name\" : \"Subtract One Number from Another with JavaScript\",\n              \"completedDate\" : 1462881248603\n          },\n          \"cf1231c1c11feddfaeb5bdef\" : {\n              \"id\" : \"cf1231c1c11feddfaeb5bdef\",\n              \"challengeType\" : 1,\n              \"solution\" : \"var product = 8 * 10;\\n\\n\\n\",\n              \"name\" : \"Multiply Two Numbers with JavaScript\",\n              \"completedDate\" : 1462881260926\n          },\n          \"cf1111c1c11feddfaeb6bdef\" : {\n              \"id\" : \"cf1111c1c11feddfaeb6bdef\",\n              \"challengeType\" : 1,\n              \"solution\" : \"var quotient = 66 / 33;\\n\\n\\n\",\n              \"name\" : \"Divide One Number by Another with JavaScript\",\n              \"completedDate\" : 1462881403573\n          },\n          \"56533eb9ac21ba0edf2244ac\" : {\n              \"id\" : \"56533eb9ac21ba0edf2244ac\",\n              \"challengeType\" : 1,\n              \"solution\" : \"var myVar = 87;\\n\\n// Only change code below this line\\nmyVar++;\\n\\n\",\n              \"name\" : \"Increment a Number with JavaScript\",\n              \"completedDate\" : 1462881603671\n          },\n          \"56533eb9ac21ba0edf2244ad\" : {\n              \"id\" : \"56533eb9ac21ba0edf2244ad\",\n              \"challengeType\" : 1,\n              \"solution\" : \"var myVar = 11;\\n\\n// Only change code below this line\\nmyVar--;\\n\\n\",\n              \"name\" : \"Decrement a Number with JavaScript\",\n              \"completedDate\" : 1462881705246\n          },\n          \"cf1391c1c11feddfaeb4bdef\" : {\n              \"id\" : \"cf1391c1c11feddfaeb4bdef\",\n              \"challengeType\" : 1,\n              \"solution\" : \"var ourDecimal = 5.7;\\n\\n// Only change code below this line\\n\\nvar myDecimal = 5.7;\\n\",\n              \"name\" : \"Create Decimal Numbers with JavaScript\",\n              \"completedDate\" : 1462881944248\n          },\n          \"bd7993c9c69feddfaeb7bdef\" : {\n              \"id\" : \"bd7993c9c69feddfaeb7bdef\",\n              \"challengeType\" : 1,\n              \"solution\" : \"var product = 2.0 * 2.5;\\n\\n\\n\",\n              \"name\" : \"Multiply Two Decimals with JavaScript\",\n              \"completedDate\" : 1462882061971\n          },\n          \"bd7993c9ca9feddfaeb7bdef\" : {\n              \"id\" : \"bd7993c9ca9feddfaeb7bdef\",\n              \"challengeType\" : 1,\n              \"solution\" : \"var quotient = 4.4 / 2.0;\\n\\n\\n\",\n              \"name\" : \"Divide one Decimal by Another with JavaScript\",\n              \"completedDate\" : 1462882083863\n          },\n          \"56533eb9ac21ba0edf2244ae\" : {\n              \"id\" : \"56533eb9ac21ba0edf2244ae\",\n              \"challengeType\" : 1,\n              \"solution\" : \"// Only change code below this line\\n\\nvar remainder;\\n\\nremainder = 11 % 3;\",\n              \"name\" : \"Finding a Remainder in JavaScript\",\n              \"completedDate\" : 1462882866679\n          },\n          \"56533eb9ac21ba0edf2244af\" : {\n              \"id\" : \"56533eb9ac21ba0edf2244af\",\n              \"challengeType\" : 1,\n              \"solution\" : \"var a = 3;\\nvar b = 17;\\nvar c = 12;\\n\\n// Only modify code below this line\\n\\na += 12;\\nb += 9;\\nc += 7;\\n\\n\",\n              \"name\" : \"Assignment with Plus Equals\",\n              \"completedDate\" : 1462883294849\n          },\n          \"56533eb9ac21ba0edf2244b0\" : {\n              \"id\" : \"56533eb9ac21ba0edf2244b0\",\n              \"challengeType\" : 1,\n              \"solution\" : \"var a = 11;\\nvar b = 9;\\nvar c = 3;\\n\\n// Only modify code below this line\\n\\na -= 6;\\nb -= 15;\\nc -= 1;\\n\\n\\n\",\n              \"name\" : \"Assignment with Minus Equals\",\n              \"completedDate\" : 1462883485430\n          },\n          \"56533eb9ac21ba0edf2244b1\" : {\n              \"id\" : \"56533eb9ac21ba0edf2244b1\",\n              \"challengeType\" : 1,\n              \"solution\" : \"var a = 5;\\nvar b = 12;\\nvar c = 4.6;\\n\\n// Only modify code below this line\\n\\na *= 5;\\nb *= 3;\\nc *= 10;\\n\\n\\n\",\n              \"name\" : \"Assignment with Times Equals\",\n              \"completedDate\" : 1462883605850\n          },\n          \"56533eb9ac21ba0edf2244b2\" : {\n              \"id\" : \"56533eb9ac21ba0edf2244b2\",\n              \"challengeType\" : 1,\n              \"solution\" : \"var a = 48;\\nvar b = 108;\\nvar c = 33;\\n\\n// Only modify code below this line\\n\\na /= 12;\\nb /= 4;\\nc /= 11;\\n\\n\",\n              \"name\" : \"Assignment with Divided by Equals\",\n              \"completedDate\" : 1462883680665\n          },\n          \"56533eb9ac21ba0edf2244b3\" : {\n              \"id\" : \"56533eb9ac21ba0edf2244b3\",\n              \"challengeType\" : 1,\n              \"solution\" : \"function convert(celsius) {\\n  // Only change code below this line\\n  \\n  var fahrenheit = celsius*9/5+32;\\n  // Only change code above this line\\n    return fahrenheit;\\n}\\n\\n// Change the inputs below to test your code\\nconvert(30);\\n\",\n              \"name\" : \"Convert Celsius to Fahrenheit\",\n              \"completedDate\" : 1462884364080\n          },\n          \"bd7123c9c444eddfaeb5bdef\" : {\n              \"id\" : \"bd7123c9c444eddfaeb5bdef\",\n              \"challengeType\" : 1,\n              \"solution\" : \"// Example\\nvar firstName = \\\"Alan\\\";\\nvar lastName = \\\"Turing\\\";\\n\\n// Only change code below this line\\nvar myFirstName = \\\"hu\\\";\\nvar myLastName = \\\"luoyang\\\"\\n\\n\\n\",\n              \"name\" : \"Declare String Variables\",\n              \"completedDate\" : 1462884476294\n          },\n          \"56533eb9ac21ba0edf2244b5\" : {\n              \"id\" : \"56533eb9ac21ba0edf2244b5\",\n              \"challengeType\" : 1,\n              \"solution\" : \"var myStr; // Change this line\\n\\nmyStr = \\\"I am a \\\\\\\"double quoted\\\\\\\" string inside \\\\\\\"double quotes\\\\\\\"\\\";\\n\",\n              \"name\" : \"Escaping Literal Quotes in Strings\",\n              \"completedDate\" : 1462884836703\n          },\n          \"56533eb9ac21ba0edf2244b4\" : {\n              \"id\" : \"56533eb9ac21ba0edf2244b4\",\n              \"challengeType\" : 1,\n              \"solution\" : \"  var myStr = '<a href=\\\"http://www.example.com\\\" target=\\\"_blank\\\">Link</a>';\\n\\n\\n\",\n              \"name\" : \"Quoting Strings with Single Quotes\",\n              \"completedDate\" : 1462885203638\n          },\n          \"56533eb9ac21ba0edf2244b6\" : {\n              \"id\" : \"56533eb9ac21ba0edf2244b6\",\n              \"challengeType\" : 1,\n              \"solution\" : \"var myStr; // Change this line\\nmyStr = \\\"\\\\\\\\ \\\\t \\\\t \\\\r \\\\n\\\";\\n\\n\",\n              \"name\" : \"Escape Sequences in Strings\",\n              \"completedDate\" : 1462885424595\n          },\n          \"56533eb9ac21ba0edf2244b7\" : {\n              \"id\" : \"56533eb9ac21ba0edf2244b7\",\n              \"challengeType\" : 1,\n              \"solution\" : \"// Example\\nvar ourStr = \\\"I come first. \\\" + \\\"I come second.\\\";\\n\\n// Only change code below this line\\n\\nvar myStr;\\nmyStr = \\\"This is the start.\\\" + \\\" This is the end.\\\";\\n\\n\",\n              \"name\" : \"Concatenating Strings with Plus Operator\",\n              \"completedDate\" : 1462928504015\n          },\n          \"56533eb9ac21ba0edf2244b8\" : {\n              \"id\" : \"56533eb9ac21ba0edf2244b8\",\n              \"challengeType\" : 1,\n              \"solution\" : \"// Example\\nvar ourStr = \\\"I come first. \\\";\\nourStr += \\\"I come second.\\\";\\n\\n// Only change code below this line\\n\\nvar myStr = \\\"This is the first sentence. \\\";\\nmyStr += \\\"This is the second sentence.\\\";\\n\\n\\n\",\n              \"name\" : \"Concatenating Strings with the Plus Equals Operator\",\n              \"completedDate\" : 1462928786479\n          },\n          \"56533eb9ac21ba0edf2244b9\" : {\n              \"id\" : \"56533eb9ac21ba0edf2244b9\",\n              \"challengeType\" : 1,\n              \"solution\" : \"// Example\\nvar ourName = \\\"Free Code Camp\\\";\\nvar ourStr = \\\"Hello, our name is \\\" + ourName + \\\", how are you?\\\";\\n\\n// Only change code below this line\\nvar myName = \\\"huluoyang\\\";\\nvar myStr = \\\"My name is \\\" + myName + \\\"and I am swell!\\\";\\n\\n\\n\",\n              \"name\" : \"Constructing Strings with Variables\",\n              \"completedDate\" : 1462929160649\n          },\n          \"56533eb9ac21ba0edf2244ed\" : {\n              \"id\" : \"56533eb9ac21ba0edf2244ed\",\n              \"challengeType\" : 1,\n              \"solution\" : \"// Example\\nvar anAdjective = \\\"awesome!\\\";\\nvar ourStr = \\\"Free Code Camp is \\\";\\nourStr += anAdjective;\\n\\n// Only change code below this line\\n\\nvar someAdjective = \\\" so happy\\\";\\nvar myStr = \\\"Learning to code is \\\";\\nmyStr+=someAdjective;\\n\",\n              \"name\" : \"Appending Variables to Strings\",\n              \"completedDate\" : 1462929332489\n          },\n          \"bd7123c9c448eddfaeb5bdef\" : {\n              \"id\" : \"bd7123c9c448eddfaeb5bdef\",\n              \"challengeType\" : 1,\n              \"solution\" : \"// Example\\nvar firstNameLength = 0;\\nvar firstName = \\\"Ada\\\";\\n\\nfirstNameLength = firstName.length;\\n\\n// Setup\\nvar lastNameLength = 0;\\nvar lastName = \\\"Lovelace\\\";\\n\\n// Only change code below this line.\\n\\nlastNameLength = lastName.length;\\n\\n\\n\",\n              \"name\" : \"Find the Length of a String\",\n              \"completedDate\" : 1462929600133\n          },\n          \"bd7123c9c549eddfaeb5bdef\" : {\n              \"id\" : \"bd7123c9c549eddfaeb5bdef\",\n              \"challengeType\" : 1,\n              \"solution\" : \"// Example\\nvar firstLetterOfFirstName = \\\"\\\";\\nvar firstName = \\\"Ada\\\";\\n\\nfirstLetterOfFirstName = firstName[0];\\n\\n// Setup\\nvar firstLetterOfLastName = \\\"\\\";\\nvar lastName = \\\"Lovelace\\\";\\n\\n// Only change code below this line\\nfirstLetterOfLastName = lastName[0];\\n\\n\",\n              \"name\" : \"Use Bracket Notation to Find the First Character in a String\",\n              \"completedDate\" : 1462930382328\n          },\n          \"56533eb9ac21ba0edf2244ba\" : {\n              \"id\" : \"56533eb9ac21ba0edf2244ba\",\n              \"challengeType\" : 1,\n              \"solution\" : \"// Setup\\nvar myStr = \\\"Jello World\\\";\\n\\n// Only change code below this line\\n\\nmyStr = \\\"Hello World\\\"; // Fix Me\\n\\n\\n\",\n              \"name\" : \"Understand String Immutability\",\n              \"completedDate\" : 1462931131701\n          },\n          \"bd7123c9c450eddfaeb5bdef\" : {\n              \"id\" : \"bd7123c9c450eddfaeb5bdef\",\n              \"challengeType\" : 1,\n              \"solution\" : \"// Example\\nvar firstName = \\\"Ada\\\";\\nvar secondLetterOfFirstName = firstName[1];\\n\\n// Setup\\nvar lastName = \\\"Lovelace\\\";\\n\\n// Only change code below this line.\\nvar thirdLetterOfLastName = lastName[2];\\n\\n\\n\",\n              \"name\" : \"Use Bracket Notation to Find the Nth Character in a String\",\n              \"completedDate\" : 1462931979558\n          },\n          \"bd7123c9c451eddfaeb5bdef\" : {\n              \"id\" : \"bd7123c9c451eddfaeb5bdef\",\n              \"challengeType\" : 1,\n              \"solution\" : \"// Example\\nvar firstName = \\\"Ada\\\";\\nvar lastLetterOfFirstName = firstName[firstName.length - 1];\\n\\n// Setup\\nvar lastName = \\\"Lovelace\\\";\\n\\n// Only change code below this line.\\nvar lastLetterOfLastName = lastName[lastName.length-1];\\n\\n\\n\",\n              \"name\" : \"Use Bracket Notation to Find the Last Character in a String\",\n              \"completedDate\" : 1462932119783\n          },\n          \"bd7123c9c452eddfaeb5bdef\" : {\n              \"id\" : \"bd7123c9c452eddfaeb5bdef\",\n              \"challengeType\" : 1,\n              \"solution\" : \"// Example\\nvar firstName = \\\"Ada\\\";\\nvar thirdToLastLetterOfFirstName = firstName[firstName.length - 3];\\n\\n// Setup\\nvar lastName = \\\"Lovelace\\\";\\n\\n// Only change code below this line\\nvar secondToLastLetterOfLastName = lastName[lastName.length - 2];\\n\\n\\n\",\n              \"name\" : \"Use Bracket Notation to Find the NthtoLast Character in a String\",\n              \"completedDate\" : 1462932438256\n          },\n          \"56533eb9ac21ba0edf2244bb\" : {\n              \"id\" : \"56533eb9ac21ba0edf2244bb\",\n              \"challengeType\" : 1,\n              \"solution\" : \"function wordBlanks(myNoun, myAdjective, myVerb, myAdverb) {\\n  var result = \\\"\\\";\\n  // Your code below this line\\n  \\n  \\n  // Your code above this line\\n  return result = myNoun + ' is ' + myAdjective + ' and ' + myVerb + ' '+ myAdverb;\\n}\\n\\n// Change the words here to test your function\\nwordBlanks(\\\"dog\\\", \\\"big\\\", \\\"ran\\\", \\\"quickly\\\");\\n\",\n              \"name\" : \"Word Blanks\",\n              \"completedDate\" : 1462933080563\n          },\n          \"bd7993c9c69feddfaeb8bdef\" : {\n              \"id\" : \"bd7993c9c69feddfaeb8bdef\",\n              \"challengeType\" : 1,\n              \"solution\" : \"// Example\\nvar array = [\\\"John\\\", 23];\\n\\n// Only change code below this line.\\nvar myArray = [\\\"huluoyang\\\",123];\\n\\n\",\n              \"name\" : \"Store Multiple Values in one Variable using JavaScript Arrays\",\n              \"completedDate\" : 1462934128127\n          },\n          \"cf1111c1c11feddfaeb7bdef\" : {\n              \"id\" : \"cf1111c1c11feddfaeb7bdef\",\n              \"challengeType\" : 1,\n              \"solution\" : \"// Example\\nvar ourArray = [[\\\"the universe\\\", 42], [\\\"everything\\\", 101010]];\\n\\n// Only change code below this line.\\nvar myArray = [[\\\"google\\\",'awesome'], [\\\"baidu\\\"],'uglify'];\\n\\n\",\n              \"name\" : \"Nest one Array within Another Array\",\n              \"completedDate\" : 1462934237148\n          },\n          \"56bbb991ad1ed5201cd392ca\" : {\n              \"id\" : \"56bbb991ad1ed5201cd392ca\",\n              \"challengeType\" : 1,\n              \"solution\" : \"// Example\\nvar ourArray = [1,2,3];\\nvar ourData = ourArray[0]; // equals 1\\n\\n// Setup\\nvar myArray = [1,2,3];\\n\\n// Only change code below this line.\\nvar myData = myArray[0];\\n\",\n              \"name\" : \"Access Array Data with Indexes\",\n              \"completedDate\" : 1462934388602\n          },\n          \"cf1111c1c11feddfaeb8bdef\" : {\n              \"id\" : \"cf1111c1c11feddfaeb8bdef\",\n              \"challengeType\" : 1,\n              \"solution\" : \"// Example\\nvar ourArray = [1,2,3];\\nourArray[1] = 3; // ourArray now equals [1,3,3].\\n\\n// Setup\\nvar myArray = [1,2,3];\\n\\n// Only change code below this line.\\nmyArray[0]=3;\\n\\n\",\n              \"name\" : \"Modify Array Data With Indexes\",\n              \"completedDate\" : 1462935267711\n          },\n          \"56592a60ddddeae28f7aa8e1\" : {\n              \"id\" : \"56592a60ddddeae28f7aa8e1\",\n              \"challengeType\" : 1,\n              \"solution\" : \"// Setup\\nvar myArray = [[1,2,3], [4,5,6], [7,8,9], [[10,11,12], 13, 14]];\\n\\n// Only change code below this line.\\nvar myData = myArray[2][1];\\n\\n\",\n              \"name\" : \"Access MultiDimensional Arrays With Indexes\",\n              \"completedDate\" : 1462935674245\n          },\n          \"56bbb991ad1ed5201cd392cb\" : {\n              \"id\" : \"56bbb991ad1ed5201cd392cb\",\n              \"challengeType\" : 1,\n              \"solution\" : \"// Example\\nvar ourArray = [\\\"Stimpson\\\", \\\"J\\\", \\\"cat\\\"];\\nourArray.push([\\\"happy\\\", \\\"joy\\\"]); \\n// ourArray now equals [\\\"Stimpson\\\", \\\"J\\\", \\\"cat\\\", [\\\"happy\\\", \\\"joy\\\"]]\\n\\n// Setup\\nvar myArray = [[\\\"John\\\", 23], [\\\"cat\\\", 2]];\\n\\n// Only change code below this line.\\n\\nmyArray.push([\\\"dog\\\",3]);\\n\",\n              \"name\" : \"Manipulate Arrays With push\",\n              \"completedDate\" : 1462935777417\n          },\n          \"56bbb991ad1ed5201cd392cc\" : {\n              \"id\" : \"56bbb991ad1ed5201cd392cc\",\n              \"challengeType\" : 1,\n              \"solution\" : \"// Example\\nvar ourArray = [1,2,3];\\nvar removedFromOurArray = ourArray.pop(); \\n// removedFromOurArray now equals 3, and ourArray now equals [1,2]\\n\\n// Setup\\nvar myArray = [[\\\"John\\\", 23], [\\\"cat\\\", 2]];\\n\\n// Only change code below this line.\\nvar removedFromMyArray = myArray.pop();\\n\\n\\n\",\n              \"name\" : \"Manipulate Arrays With pop\",\n              \"completedDate\" : 1462935971612\n          },\n          \"56bbb991ad1ed5201cd392cd\" : {\n              \"id\" : \"56bbb991ad1ed5201cd392cd\",\n              \"challengeType\" : 1,\n              \"solution\" : \"// Example\\nvar ourArray = [\\\"Stimpson\\\", \\\"J\\\", [\\\"cat\\\"]];\\nremovedFromOurArray = ourArray.shift();\\n// removedFromOurArray now equals \\\"Stimpson\\\" and ourArray now equals [\\\"J\\\", [\\\"cat\\\"]].\\n\\n// Setup\\nvar myArray = [[\\\"John\\\", 23], [\\\"dog\\\", 3]];\\n\\n// Only change code below this line.\\nvar removedFromMyArray = myArray.shift();\\n\\n\\n\",\n              \"name\" : \"Manipulate Arrays With shift\",\n              \"completedDate\" : 1462935995504\n          },\n          \"56bbb991ad1ed5201cd392ce\" : {\n              \"id\" : \"56bbb991ad1ed5201cd392ce\",\n              \"challengeType\" : 1,\n              \"solution\" : \"// Example\\nvar ourArray = [\\\"Stimpson\\\", \\\"J\\\", \\\"cat\\\"];\\nourArray.shift(); // ourArray now equals [\\\"J\\\", \\\"cat\\\"]\\nourArray.unshift(\\\"Happy\\\"); \\n// ourArray now equals [\\\"Happy\\\", \\\"J\\\", \\\"cat\\\"]\\n\\n// Setup\\nvar myArray = [[\\\"John\\\", 23], [\\\"dog\\\", 3]];\\nmyArray.shift();\\n\\n// Only change code below this line.\\n\\nmyArray.unshift([\\\"Paul\\\",35]);\\n\",\n              \"name\" : \"Manipulate Arrays With unshift\",\n              \"completedDate\" : 1462936228491\n          },\n          \"56533eb9ac21ba0edf2244bc\" : {\n              \"id\" : \"56533eb9ac21ba0edf2244bc\",\n              \"challengeType\" : 1,\n              \"solution\" : \"var myList = [[\\\"Chocolate Bar\\\", 15],[\\\"Chocolate Bar\\\", 15],[\\\"Chocolate Bar\\\", 15],[\\\"Chocolate Bar\\\", 15],[\\\"Chocolate Bar\\\", 15]];\\n\\n\\n\",\n              \"name\" : \"Shopping List\",\n              \"completedDate\" : 1462936586564\n          },\n          \"56bbb991ad1ed5201cd392cf\" : {\n              \"id\" : \"56bbb991ad1ed5201cd392cf\",\n              \"challengeType\" : 1,\n              \"solution\" : \"// Example\\nfunction ourFunction() {\\n  console.log(\\\"Heyya, World\\\");\\n}\\n\\nourFunction();\\n\\n// Only change code below this line\\nfunction myFunction(){\\n  console.log(\\\"Hi World\\\");\\n}\\nmyFunction();\\n\",\n              \"name\" : \"Write Reusable JavaScript with Functions\",\n              \"completedDate\" : 1462936980281\n          },\n          \"56533eb9ac21ba0edf2244bd\" : {\n              \"id\" : \"56533eb9ac21ba0edf2244bd\",\n              \"challengeType\" : 1,\n              \"solution\" : \"// Example\\nfunction ourFunction(a, b) {\\n  console.log(a - b);\\n}\\nourFunction(10, 5); // Outputs 5\\n\\n// Only change code below this line.\\nfunction myFunction(a,b){\\n  console.log(a+b);\\n}\\nmyFunction(1,2);\\n\",\n              \"name\" : \"Passing Values to Functions with Arguments\",\n              \"completedDate\" : 1462937636194\n          },\n          \"56533eb9ac21ba0edf2244be\" : {\n              \"id\" : \"56533eb9ac21ba0edf2244be\",\n              \"challengeType\" : 1,\n              \"solution\" : \"// Declare your variable here\\nvar myGlobal = 10;\\n\\nfunction fun1() {\\n  // Assign 5 to oopsGlobal Here\\n  oopsGlobal = 5;\\n}\\n\\n// Only change code above this line\\nfunction fun2() {\\n  var output = \\\"\\\";\\n  if (typeof myGlobal != \\\"undefined\\\") {\\n    output += \\\"myGlobal: \\\" + myGlobal;\\n  }\\n  if (typeof oopsGlobal != \\\"undefined\\\") {\\n    output += \\\" oopsGlobal: \\\" + oopsGlobal;\\n  }\\n  console.log(output);\\n}\\n\",\n              \"name\" : \"Global Scope and Functions\",\n              \"completedDate\" : 1462938267271\n          },\n          \"56533eb9ac21ba0edf2244bf\" : {\n              \"id\" : \"56533eb9ac21ba0edf2244bf\",\n              \"challengeType\" : 1,\n              \"solution\" : \"function myFunction() {\\n  'use strict';\\n  \\n  var myVar;\\n  console.log(myVar);\\n}\\nmyFunction();\\n\\n// run and check the console \\n// myVar is not defined outside of myFunction\\n// console.log(myVar);\\n\\n// now remove the console log line to pass the test\\n\\n\",\n              \"name\" : \"Local Scope and Functions\",\n              \"completedDate\" : 1462945970621\n          },\n          \"56533eb9ac21ba0edf2244c0\" : {\n              \"id\" : \"56533eb9ac21ba0edf2244c0\",\n              \"challengeType\" : 1,\n              \"solution\" : \"// Setup\\nvar outerWear = \\\"T-Shirt\\\";\\n\\nfunction myFunction() {\\n  // Only change code below this line\\n  var outerWear = \\\"sweater\\\";\\n  \\n  \\n  // Only change code above this line\\n  return outerWear;\\n}\\n\\nmyFunction();\\nconsole.log(outerWear);\\n\",\n              \"name\" : \"Global vs Local Scope in Functions\",\n              \"completedDate\" : 1462946283912\n          },\n          \"56533eb9ac21ba0edf2244c2\" : {\n              \"id\" : \"56533eb9ac21ba0edf2244c2\",\n              \"challengeType\" : 1,\n              \"solution\" : \"// Example\\nfunction minusSeven(num) {\\n  return num - 7;\\n}\\n\\n// Only change code below this line\\n\\nfunction timesFive(num) {\\n  return num * 5;\\n}\\n\",\n              \"name\" : \"Return a Value from a Function with Return\",\n              \"completedDate\" : 1462946402831\n          },\n          \"56533eb9ac21ba0edf2244c3\" : {\n              \"id\" : \"56533eb9ac21ba0edf2244c3\",\n              \"challengeType\" : 1,\n              \"solution\" : \"// Example\\nvar changed = 0;\\n\\nfunction change(num) {\\n  return (num + 5) / 3;\\n}\\n\\nchanged = change(10);\\n\\n// Setup\\nvar processed = 0;\\n\\nfunction process(num) {\\n  return (num + 3) / 5;\\n}\\n\\n// Only change code below this line\\nvar processed = process(7);\\n\\n\",\n              \"name\" : \"Assignment with a Returned Value\",\n              \"completedDate\" : 1462946638280\n          },\n          \"56533eb9ac21ba0edf2244c6\" : {\n              \"id\" : \"56533eb9ac21ba0edf2244c6\",\n              \"challengeType\" : 1,\n              \"solution\" : \"function queue(arr, item) {\\n  // Your code here\\n  arr.push(item);\\n  return arr.shift();  // Change this line\\n}\\n\\n// Test Setup\\nvar testArr = [1,2,3,4,5];\\n\\n// Display Code\\nconsole.log(\\\"Before: \\\" + JSON.stringify(testArr));\\nconsole.log(queue(testArr, 6)); // Modify this line to test\\nconsole.log(\\\"After: \\\" + JSON.stringify(testArr));\\n\",\n              \"name\" : \"Stand in Line\",\n              \"completedDate\" : 1462947515435\n          },\n          \"bd7123c9c441eddfaeb5bdef\" : {\n              \"id\" : \"bd7123c9c441eddfaeb5bdef\",\n              \"challengeType\" : 1,\n              \"solution\" : \"function welcomeToBooleans() {\\n\\n// Only change code below this line.\\n\\nreturn true; // Change this line\\n\\n// Only change code above this line.\\n}\\n\",\n              \"name\" : \"Understanding Boolean Values\",\n              \"completedDate\" : 1462947695382\n          },\n          \"cf1111c1c12feddfaeb3bdef\" : {\n              \"id\" : \"cf1111c1c12feddfaeb3bdef\",\n              \"challengeType\" : 1,\n              \"solution\" : \"// Example\\nfunction ourFunction(isItTrue) {\\n  if (isItTrue) { \\n    return \\\"Yes, it's true\\\";\\n  }\\n  return \\\"No, it's false\\\";\\n}\\n\\n// Setup\\nfunction myFunction(wasThatTrue) {\\n\\n  // Only change code below this line.\\n  if(wasThatTrue){\\n    return \\\"That was true\\\";\\n  }\\n  return \\\"That was false\\\";\\n  \\n  \\n  // Only change code above this line.\\n\\n}\\n\\n// Change this value to test\\nmyFunction(true);\\n\",\n              \"name\" : \"Use Conditional Logic with If Statements\",\n              \"completedDate\" : 1462947959846\n          },\n          \"56533eb9ac21ba0edf2244d0\" : {\n              \"id\" : \"56533eb9ac21ba0edf2244d0\",\n              \"challengeType\" : 1,\n              \"solution\" : \"// Setup\\nfunction myTest(val) {\\n  if (val == 12) { // Change this line\\n    return \\\"Equal\\\";\\n  }\\n  return \\\"Not Equal\\\";\\n}\\n\\n// Change this value to test\\nmyTest(10);\\n\",\n              \"name\" : \"Comparison with the Equality Operator\",\n              \"completedDate\" : 1462948169192\n          },\n          \"56533eb9ac21ba0edf2244d1\" : {\n              \"id\" : \"56533eb9ac21ba0edf2244d1\",\n              \"challengeType\" : 1,\n              \"solution\" : \"// Setup\\nfunction myTest(val) {\\n  if (val === 7) { // Change this line\\n    return \\\"Equal\\\";\\n  }\\n  return \\\"Not Equal\\\";\\n}\\n\\n// Change this value to test\\nmyTest(10);\\n\",\n              \"name\" : \"Comparison with the Strict Equality Operator\",\n              \"completedDate\" : 1462948373286\n          },\n          \"56533eb9ac21ba0edf2244d2\" : {\n              \"id\" : \"56533eb9ac21ba0edf2244d2\",\n              \"challengeType\" : 1,\n              \"solution\" : \"// Setup\\nfunction myTest(val) {\\n  if (val != 99) { // Change this line\\n    return \\\"Not Equal\\\";\\n  }\\n  return \\\"Equal\\\";\\n}\\n\\n// Change this value to test\\nmyTest(10);\\n\",\n              \"name\" : \"Comparison with the Inequality Operator\",\n              \"completedDate\" : 1462948435565\n          },\n          \"56533eb9ac21ba0edf2244d3\" : {\n              \"id\" : \"56533eb9ac21ba0edf2244d3\",\n              \"challengeType\" : 1,\n              \"solution\" : \"// Setup\\nfunction myTest(val) {\\n  // Only Change Code Below this Line\\n  \\n  if (val !== 17) {\\n\\n  // Only Change Code Above this Line\\n\\n    return \\\"Not Equal\\\";\\n  }\\n  return \\\"Equal\\\";\\n}\\n\\n// Change this value to test\\nmyTest(10);\\n\",\n              \"name\" : \"Comparison with the Strict Inequality Operator\",\n              \"completedDate\" : 1462948496967\n          },\n          \"56533eb9ac21ba0edf2244d4\" : {\n              \"id\" : \"56533eb9ac21ba0edf2244d4\",\n              \"challengeType\" : 1,\n              \"solution\" : \"function myTest(val) {\\n  if (val > 100) {  // Change this line\\n    return \\\"Over 100\\\";\\n  }\\n  \\n  if (val > 10) {  // Change this line\\n    return \\\"Over 10\\\";\\n  }\\n\\n  return \\\"10 or Under\\\";\\n}\\n\\n// Change this value to test\\nmyTest(10);\\n\",\n              \"name\" : \"Comparison with the Greater Than Operator\",\n              \"completedDate\" : 1462948583533\n          },\n          \"56533eb9ac21ba0edf2244d5\" : {\n              \"id\" : \"56533eb9ac21ba0edf2244d5\",\n              \"challengeType\" : 1,\n              \"solution\" : \"function myTest(val) {\\n  if (val >= 20) {  // Change this line\\n    return \\\"20 or Over\\\";\\n  }\\n  \\n  if (val >= 10) {  // Change this line\\n    return \\\"10 or Over\\\";\\n  }\\n\\n  return \\\"9 or Under\\\";\\n}\\n\\n// Change this value to test\\nmyTest(10);\\n\",\n              \"name\" : \"Comparison with the Greater Than Or Equal To Operator\",\n              \"completedDate\" : 1462948741805\n          },\n          \"56533eb9ac21ba0edf2244d6\" : {\n              \"id\" : \"56533eb9ac21ba0edf2244d6\",\n              \"challengeType\" : 1,\n              \"solution\" : \"function myTest(val) {\\n  if (val < 25) {  // Change this line\\n    return \\\"Under 25\\\";\\n  }\\n  \\n  if (val < 55) {  // Change this line\\n    return \\\"Under 55\\\";\\n  }\\n\\n  return \\\"55 or Over\\\";\\n}\\n\\n// Change this value to test\\nmyTest(10);\\n\",\n              \"name\" : \"Comparison with the Less Than Operator\",\n              \"completedDate\" : 1462948764506\n          },\n          \"56533eb9ac21ba0edf2244d7\" : {\n              \"id\" : \"56533eb9ac21ba0edf2244d7\",\n              \"challengeType\" : 1,\n              \"solution\" : \"function myTest(val) {\\n  if (val <= 12) {  // Change this line\\n    return \\\"Smaller Than or Equal to 12\\\";\\n  }\\n  \\n  if (val <= 24) {  // Change this line\\n    return \\\"Smaller Than or Equal to 24\\\";\\n  }\\n\\n  return \\\"25 or More\\\";\\n}\\n\\n// Change this value to test\\nmyTest(10);\\n\\n\",\n              \"name\" : \"Comparison with the Less Than Or Equal To Operator\",\n              \"completedDate\" : 1462948786474\n          },\n          \"56533eb9ac21ba0edf2244d8\" : {\n              \"id\" : \"56533eb9ac21ba0edf2244d8\",\n              \"challengeType\" : 1,\n              \"solution\" : \"function myTest(val) {\\n  // Only change code below this line\\n\\n  if (val <= 50 && val >= 25) {\\n      return \\\"Yes\\\";\\n  }\\n\\n  // Only change code above this line\\n  return \\\"No\\\";\\n}\\n\\n// Change this value to test\\nmyTest(10);\\n\",\n              \"name\" : \"Comparisons with the Logical And Operator\",\n              \"completedDate\" : 1462949450043\n          },\n          \"56533eb9ac21ba0edf2244d9\" : {\n              \"id\" : \"56533eb9ac21ba0edf2244d9\",\n              \"challengeType\" : 1,\n              \"solution\" : \"function myTest(val) {\\n  // Only change code below this line\\n\\n  if (val<10 || val>20 ) {\\n    return \\\"Outside\\\";\\n  }\\n\\n  // Only change code above this line\\n  return \\\"Inside\\\";\\n}\\n\\n// Change this value to test\\nmyTest(15);\\n\",\n              \"name\" : \"Comparisons with the Logical Or Operator\",\n              \"completedDate\" : 1462950380613\n          },\n          \"56533eb9ac21ba0edf2244da\" : {\n              \"id\" : \"56533eb9ac21ba0edf2244da\",\n              \"challengeType\" : 1,\n              \"solution\" : \"function myTest(val) {\\n  var result = \\\"\\\";\\n  // Only change code below this line\\n  \\n  if (val > 5) {\\n    result = \\\"Bigger than 5\\\";\\n  } else{\\n    result = \\\"5 or Smaller\\\";\\n  }\\n  \\n  \\n  // Only change code above this line\\n  return result;\\n}\\n\\n// Change this value to test\\nmyTest(4);\\n\\n\",\n              \"name\" : \"Introducing Else Statements\",\n              \"completedDate\" : 1462950810171\n          },\n          \"56533eb9ac21ba0edf2244db\" : {\n              \"id\" : \"56533eb9ac21ba0edf2244db\",\n              \"challengeType\" : 1,\n              \"solution\" : \"function myTest(val) {\\n  if (val > 10) {\\n    return \\\"Greater than 10\\\";\\n  } else if (val < 5) {\\n    return \\\"Smaller than 5\\\";\\n  } else {\\n    return \\\"Between 5 and 10\\\";\\n  }\\n  \\n}\\n\\n// Change this value to test\\nmyTest(7);\\n\\n\",\n              \"name\" : \"Introducing Else If Statements\",\n              \"completedDate\" : 1462951052946\n          },\n          \"5690307fddb111c6084545d7\" : {\n              \"id\" : \"5690307fddb111c6084545d7\",\n              \"challengeType\" : 1,\n              \"solution\" : \"function myTest(val) {\\n  if (val < 5) {\\n    return \\\"Less than 5\\\";\\n  } else if (val < 10) {\\n    return \\\"Less than 10\\\";\\n  } else {\\n    return \\\"Greater than or equal to 10\\\";\\n  }\\n}\\n\\n// Change this value to test\\nmyTest(7);\\n\",\n              \"name\" : \"Logical Order in If Else Statements\",\n              \"completedDate\" : 1462952233276\n          },\n          \"56533eb9ac21ba0edf2244dc\" : {\n              \"id\" : \"56533eb9ac21ba0edf2244dc\",\n              \"challengeType\" : 1,\n              \"solution\" : \"function myTest(num) {\\n  // Only change code below this line\\n  if(num<5){\\n    return \\\"Tiny\\\";\\n  }else if(num<10){\\n    return \\\"Small\\\";\\n  }else if(num<15){\\n    return \\\"Medium\\\";\\n  }else if(num<20){\\n    return \\\"Large\\\";\\n  }else{\\n    return \\\"Huge\\\";\\n  }\\n  \\n  return \\\"Change Me\\\";\\n  // Only change code above this line\\n}\\n\\n// Change this value to test\\nmyTest(7);\\n\",\n              \"name\" : \"Chaining If Else Statements\",\n              \"completedDate\" : 1462952920080\n          },\n          \"5664820f61c48e80c9fa476c\" : {\n              \"id\" : \"5664820f61c48e80c9fa476c\",\n              \"challengeType\" : 1,\n              \"solution\" : \"function golfScore(par, strokes) {\\n  // Only change code below this line\\n  if(strokes == 1){\\n    return \\\"Hole-in-one!\\\";\\n  }else if(strokes <= par-2){\\n    return \\\"Eagle\\\";\\n  }else if(strokes == par-1){\\n    return \\\"Birdie\\\";\\n  }else if(strokes == par){\\n    return \\\"Par\\\";\\n  }else if(strokes == par+1){\\n    return \\\"Bogey\\\";\\n  }else if(strokes == par+2){\\n    return \\\"Double Bogey\\\";\\n  }else{\\n    return \\\"Go Home!\\\";\\n  }\\n  \\n  // Only change code above this line\\n}\\n\\n// Change these values to test\\ngolfScore(5, 2);\\n\",\n              \"name\" : \"Golf Code\",\n              \"completedDate\" : 1462955735383\n          },\n          \"56533eb9ac21ba0edf2244dd\" : {\n              \"id\" : \"56533eb9ac21ba0edf2244dd\",\n              \"challengeType\" : 1,\n              \"solution\" : \"function myTest(val) {\\n  var answer = \\\"\\\";\\n  // Only change code below this line\\n  switch (val){\\n    case 1:\\n      answer = \\\"alpha\\\";\\n      break;\\n    case 2:\\n      answer = \\\"beta\\\";\\n      break;\\n    case 3:\\n      answer = \\\"gamma\\\";\\n      break;\\n    case 4:\\n      answer = \\\"delta\\\";\\n      break;      \\n  }\\n \\n  \\n  // Only change code above this line  \\n  return answer;  \\n}\\n\\n// Change this value to test\\nmyTest(1);\\n\\n\",\n              \"name\" : \"Selecting from many options with Switch Statements\",\n              \"completedDate\" : 1462957184771\n          },\n          \"56533eb9ac21ba0edf2244de\" : {\n              \"id\" : \"56533eb9ac21ba0edf2244de\",\n              \"challengeType\" : 1,\n              \"solution\" : \"function myTest(val) {\\n  var answer = \\\"\\\";\\n  // Only change code below this line\\n  switch (val) {\\n    case \\\"a\\\":\\n      answer = \\\"apple\\\";\\n      break;\\n    case \\\"b\\\":\\n      answer = \\\"bird\\\";\\n      break;\\n    case \\\"c\\\":\\n      answer = \\\"cat\\\";\\n      break;\\n    default:\\n      answer = \\\"stuff\\\";\\n  }\\n  \\n  \\n  // Only change code above this line  \\n  return answer;  \\n}\\n\\n// Change this value to test\\nmyTest(1);\\n\\n\",\n              \"name\" : \"Adding a default option in Switch statements\",\n              \"completedDate\" : 1462957970167\n          },\n          \"56533eb9ac21ba0edf2244df\" : {\n              \"id\" : \"56533eb9ac21ba0edf2244df\",\n              \"challengeType\" : 1,\n              \"solution\" : \"function myTest(val) {\\n  var answer = \\\"\\\";\\n  // Only change code below this line\\n  switch(val) {\\n    case 1:\\n    case 2:\\n    case 3:\\n      answer = \\\"Low\\\";\\n      break;\\n    case 4:\\n    case 5:\\n    case 6:\\n      answer = \\\"Mid\\\";\\n      break;\\n    case 7:\\n    case 8:\\n    case 9:\\n      answer = \\\"High\\\";\\n  }\\n  \\n  \\n  // Only change code above this line  \\n  return answer;  \\n}\\n\\n// Change this value to test\\nmyTest(1);\\n\\n\",\n              \"name\" : \"Multiple Identical Options in Switch Statements\",\n              \"completedDate\" : 1462963834193\n          },\n          \"56533eb9ac21ba0edf2244e0\" : {\n              \"id\" : \"56533eb9ac21ba0edf2244e0\",\n              \"challengeType\" : 1,\n              \"solution\" : \"function myTest(val) {\\n  var answer = \\\"\\\";\\n  // Only change code below this line\\n  switch (val) {\\n    case \\\"bob\\\":\\n      answer = \\\"Marley\\\";\\n      break;\\n    case 42:\\n      answer = \\\"The Answer\\\";\\n      break;\\n    case 1:\\n      answer = \\\"There is no #1\\\";\\n      break;\\n    case 99:\\n      answer = \\\"Missed me by this much!\\\";\\n      break;\\n    case 7:\\n      answer = \\\"Ate Nine\\\";\\n      break;\\n    default:\\n      answer = \\\"\\\";\\n  }\\n  // Only change code above this line  \\n  return answer;  \\n}\\n\\n// Change this value to test\\nmyTest(7);\\n\\n\",\n              \"name\" : \"Replacing If Else Chains with Switch\",\n              \"completedDate\" : 1462964351154\n          }\n      }\n  }\nvar progressTimestamps = obj.progressTimestamps;\nconsole.log(progressTimestamps.length);\nvar challengeMap = obj.challengeMap;\nconsole.log(challengeMap.length);\ndb.getCollection('user').update({username:\"huluoyang\"},{$set:{\"progressTimestamps\":progressTimestamps,\"challengeMap\":challengeMap}},false,true)\n"
  },
  {
    "path": "gulpfile.js",
    "content": "// enable debug for gulp\nprocess.env.DEBUG = process.env.DEBUG || 'fcc:*';\n\nrequire('babel-core/register');\nvar Rx = require('rx'),\n  gulp = require('gulp'),\n  path = require('path'),\n\n  // utils\n  plumber = require('gulp-plumber'),\n  notify = require('gulp-notify'),\n  gutil = require('gulp-util'),\n  reduce = require('gulp-reduce-file'),\n  sortKeys = require('sort-keys'),\n  debug = require('debug')('fcc:gulp'),\n  yargs = require('yargs'),\n  concat = require('gulp-concat'),\n  uglify = require('gulp-uglify'),\n  merge = require('merge-stream'),\n  babel = require('gulp-babel'),\n  sourcemaps = require('gulp-sourcemaps'),\n\n  // react app\n  webpack = require('webpack-stream'),\n  webpackConfig = require('./webpack.config.js'),\n  webpackConfigNode = require('./webpack.config.node.js'),\n\n  // server process\n  nodemon = require('gulp-nodemon'),\n  sync = require('browser-sync'),\n\n  // css\n  less = require('gulp-less'),\n\n  // rev\n  rev = require('gulp-rev'),\n  revReplace = require('gulp-rev-replace'),\n  revDel = require('rev-del'),\n\n  // lint\n  jsonlint = require('gulp-jsonlint'),\n  eslint = require('gulp-eslint'),\n\n  // unit-tests\n  tape = require('gulp-tape'),\n  tapSpec = require('tap-spec');\n\nRx.config.longStackSupport = true;\n\nvar __DEV__ = !yargs.argv.p;\n//var __DEV__ = false;\nconsole.log(__DEV__);\nvar reloadDelay = 1000;\nvar reload = sync.reload;\nvar paths = {\n  server: './server/server.js',\n  serverIgnore: [\n    'gulpfile.js',\n    'public/',\n    '!public/js/bundle*',\n    'node_modules/',\n    'client/',\n    'seed',\n    'server/manifests/*.json',\n    'server/rev-manifest.json'\n  ],\n\n  publicJs: './public/js',\n  css: 'public/css',\n\n  loopback: {\n    client: './client/loopbackClient',\n    root: path.join(__dirname, 'client/'),\n    clientName: 'lbApp'\n  },\n\n  client: {\n    src: './client',\n    dest: 'public/js'\n  },\n\n  vendorChallenges: [\n    'public/bower_components/jshint/dist/jshint.js',\n    'public/bower_components/chai/chai.js',\n    'public/bower_components/CodeMirror/lib/codemirror.js',\n    'public/bower_components/CodeMirror/addon/edit/closebrackets.js',\n    'public/bower_components/CodeMirror/addon/edit/matchbrackets.js',\n    'public/bower_components/CodeMirror/addon/lint/lint.js',\n    'public/bower_components/CodeMirror/addon/lint/javascript-lint.js',\n    'public/bower_components/CodeMirror/mode/javascript/javascript.js',\n    'public/bower_components/CodeMirror/mode/xml/xml.js',\n    'public/bower_components/CodeMirror/mode/css/css.js',\n    'public/bower_components/CodeMirror/mode/htmlmixed/htmlmixed.js',\n    'node_modules/emmet-codemirror/dist/emmet.js',\n    'public/js/lib/loop-protect/loop-protect.js'\n  ],\n\n  vendorMain: [\n    'public/bower_components/jquery/dist/jquery.min.js',\n    'public/bower_components/bootstrap/dist/js/bootstrap.min.js',\n    'public/bower_components/d3/d3.min.js',\n    'public/bower_components/moment/min/moment.min.js',\n\n    'public/bower_components/' +\n      'moment-timezone/builds/moment-timezone-with-data.min.js',\n\n    'public/bower_components/mousetrap/mousetrap.min.js',\n    'public/bower_components/lightbox2/dist/js/lightbox.min.js',\n    'public/bower_components/rxjs/dist/rx.all.min.js'\n  ],\n\n  js: [\n    'client/main.js',\n    'client/iFrameScripts.js',\n    'client/plugin.js'\n  ],\n\n  commonFramework: [\n    'init',\n    'bindings',\n    'add-test-to-string',\n    'code-storage',\n    'code-uri',\n    'add-loop-protect',\n    'get-iframe',\n    'update-preview',\n    'create-editor',\n    'detect-unsafe-code-stream',\n    'display-test-results',\n    'execute-challenge-stream',\n    'output-display',\n    'phone-scroll-lock',\n    'report-issue',\n    'run-tests-stream',\n    'show-completion',\n    'step-challenge',\n    'end'\n  ],\n\n  less: './client/less/main.less',\n  lessFiles: './client/less/**/*.less',\n\n  manifest: 'server/manifests/',\n\n  node: {\n    src: './client',\n    dest: 'common/app'\n  },\n\n  syncWatch: [\n    'public/**/*.*'\n  ],\n\n  challenges: [\n    'seed/challenges/*/*.json'\n  ]\n};\n\nvar webpackOptions = {\n  devtool: 'inline-source-map'\n};\n\nfunction formatCommonFrameworkPaths() {\n  return this.map(function(script) {\n    return 'client/commonFramework/' + script + '.js';\n  });\n}\n\nfunction errorHandler() {\n  var args = Array.prototype.slice.call(arguments);\n\n  // Send error to notification center with gulp-notify\n  notify.onError({\n    title: 'Compile Error',\n    message: '<%= error %>'\n  }).apply(this, args);\n\n  // Keep gulp from hanging on this task\n  this.emit('end');\n}\n\nfunction delRev(dest, manifestName) {\n  // in production do not delete old revisions\n  if (!__DEV__) {\n    return gutil.noop();\n  }\n  return revDel({\n    oldManifest: path.join(paths.manifest, manifestName),\n    dest: dest\n  });\n}\n\ngulp.task('serve', ['build-manifest'], function(cb) {\n  var called = false;\n  nodemon({\n    script: paths.server,\n    ext: '.jsx .js .json',\n    ignore: paths.serverIgnore,\n    exec: path.join(__dirname, 'node_modules/.bin/babel-node'),\n    env: {\n      'NODE_ENV': process.env.NODE_ENV || 'development',\n      'DEBUG': process.env.DEBUG || 'fcc:*'\n    }\n  })\n    .on('start', function() {\n      if (!called) {\n        called = true;\n        setTimeout(function() {\n          cb();\n        }, reloadDelay);\n      }\n    })\n    .on('restart', function(files) {\n      if (files) {\n        debug('Files that changes: ', files);\n      }\n      setTimeout(function() {\n        debug('Restarting browsers');\n        reload();\n      }, reloadDelay);\n    });\n});\n\nvar syncDepenedents = [\n  'serve',\n  'js',\n  'less',\n  'dependents',\n  'pack-watch',\n  'build-manifest'\n];\n\ngulp.task('sync', syncDepenedents, function() {\n  sync.init(null, {\n    proxy: 'http://localhost:3000',\n    logLeval: 'debug',\n    files: paths.syncWatch,\n    port: 3001,\n    open: false,\n    reloadDelay: reloadDelay\n  });\n});\n\ngulp.task('lint-js', function() {\n  return gulp.src([\n    'common/**/*.js',\n    'common/**/*.jsx',\n    'client/**/*.js',\n    'client/**/*.jsx',\n    'server/**/*.js',\n    'config/**/*.js'\n  ])\n    .pipe(eslint())\n    .pipe(eslint.format());\n});\n\ngulp.task('lint-json', function() {\n  return gulp.src(paths.challenges)\n    .pipe(jsonlint())\n    .pipe(jsonlint.reporter());\n});\n\ngulp.task('test-challenges', ['lint-json']);\n\ngulp.task('pack-client', function() {\n  if (!__DEV__) { console.log('\\n\\nbundling production\\n\\n'); }\n\n  var manifestName = 'react-manifest.json';\n  var dest = webpackConfig.output.path;\n\n  return gulp.src(webpackConfig.entry)\n    .pipe(plumber({ errorHandler: errorHandler }))\n    .pipe(webpack(Object.assign(\n      {},\n      webpackConfig,\n      webpackOptions\n    )))\n    .pipe(__DEV__ ? gutil.noop() : uglify())\n    .pipe(gulp.dest(dest))\n    .pipe(rev())\n    // copy files to public\n    .pipe(gulp.dest(dest))\n    // create manifest\n    .pipe(rev.manifest(manifestName))\n    // delete old rev\n    .pipe(delRev(\n      dest,\n      manifestName\n    ))\n    .pipe(gulp.dest(paths.manifest));\n});\n\nvar defaultStatsOptions = {\n  colors: gutil.colors.supportsColor,\n  hash: false,\n  timings: false,\n  chunks: false,\n  chunkModules: false,\n  modules: false,\n  children: true,\n  version: true,\n  cached: false,\n  cachedAssets: false,\n  reasons: false,\n  source: false,\n  errorDetails: false\n};\n\nvar webpackCalled = false;\ngulp.task('pack-watch', function(cb) {\n  if (webpackCalled) {\n    console.log('webpack watching already runnning');\n    return cb();\n  }\n  gulp.src(webpackConfig.entry)\n    .pipe(plumber({ errorHandler: errorHandler }))\n    .pipe(webpack(Object.assign(\n      {},\n      webpackConfig,\n      webpackOptions,\n      { watch: true }\n    ), null, function(notUsed, stats) {\n      if (stats) {\n        gutil.log(stats.toString(defaultStatsOptions));\n      }\n\n      if (!webpackCalled) {\n        debug('webpack init completed');\n        webpackCalled = true;\n        cb();\n      }\n\n    }))\n    .pipe(gulp.dest(webpackConfig.output.path));\n});\n\ngulp.task('pack-watch-manifest', ['pack-watch'], function() {\n  var manifestName = 'react-manifest.json';\n  var dest = webpackConfig.output.path;\n  return gulp.src(dest + '/bundle.js')\n    .pipe(rev())\n    // copy files to public\n    .pipe(gulp.dest(dest))\n    // create manifest\n    .pipe(rev.manifest(manifestName))\n    .pipe(delRev(\n      dest,\n      manifestName\n    ))\n    .pipe(gulp.dest(paths.manifest));\n});\n\ngulp.task('pack-node', function() {\n  return gulp.src(webpackConfigNode.entry)\n    .pipe(plumber({ errorHandler: errorHandler }))\n    .pipe(webpack(webpackConfigNode))\n    .pipe(gulp.dest(webpackConfigNode.output.path));\n});\n\ngulp.task('pack', ['pack-client', 'pack-node']);\n\ngulp.task('less', function() {\n  var manifestName = 'css-manifest.json';\n  var dest = paths.css;\n  return gulp.src(paths.less)\n    .pipe(plumber({ errorHandler: errorHandler }))\n    .pipe(__DEV__ ? sourcemaps.init() : gutil.noop())\n    // compile\n    .pipe(less({\n      paths: [ path.join(__dirname, 'less', 'includes') ]\n    }))\n    .pipe(__DEV__ ?\n      sourcemaps.write({ sourceRoot: '/less' }) :\n      gutil.noop()\n    )\n    .pipe(gulp.dest(dest))\n    // add revision\n    .pipe(rev())\n    // copy files to public\n    .pipe(gulp.dest(dest))\n    // create and merge manifest\n    .pipe(rev.manifest(manifestName))\n    .pipe(delRev(\n      dest,\n      manifestName\n    ))\n    .pipe(gulp.dest(paths.manifest));\n});\n\nfunction getFilesGlob(files) {\n  if (!__DEV__) {\n    return files;\n  }\n  return files.map(function(file) {\n    return file\n      .replace('.min.', '.')\n      // moment breaks the pattern\n      .replace('/min/', '/');\n  });\n}\n\ngulp.task('js', function() {\n  var manifestName = 'js-manifest.json';\n  var dest = paths.publicJs;\n\n  var jsFiles = merge(\n\n    gulp.src(getFilesGlob(paths.vendorMain))\n      .pipe(__DEV__ ? sourcemaps.init() : gutil.noop())\n      .pipe(concat('vendor-main.js'))\n      .pipe(\n        __DEV__ ?\n          sourcemaps.write({ sourceRoot: '/vendor' }) :\n          gutil.noop()\n      ),\n\n    gulp.src(paths.vendorChallenges)\n      .pipe(__DEV__ ? sourcemaps.init() : gutil.noop())\n      .pipe(__DEV__ ? gutil.noop() : uglify())\n      .pipe(concat('vendor-challenges.js'))\n      .pipe(\n        __DEV__ ?\n          sourcemaps.write({ sourceRoot: '/vendor' }) :\n          gutil.noop()\n      ),\n\n    gulp.src(paths.js)\n      .pipe(plumber({ errorHandler: errorHandler }))\n      .pipe(babel())\n      .pipe(__DEV__ ? gutil.noop() : uglify())\n  );\n\n  return jsFiles\n    .pipe(gulp.dest(dest))\n    // create registry file\n    .pipe(rev())\n    // copy revisioned assets to dest\n    .pipe(gulp.dest(dest))\n    // create manifest file\n    .pipe(rev.manifest(manifestName))\n    .pipe(delRev(\n      dest,\n      manifestName\n    ))\n    // copy manifest file to dest\n    .pipe(gulp.dest(paths.manifest));\n});\n\n// commonFramework depend on iFrameScripts\n// and faux.js\ngulp.task('dependents', ['js'], function() {\n  var manifestName = 'dependents-manifest.json';\n  var dest = paths.publicJs;\n\n  var manifest = gulp.src(\n    path.join(__dirname, paths.manifest, 'js-manifest.json')\n  );\n\n  return gulp.src(formatCommonFrameworkPaths.call(paths.commonFramework))\n    .pipe(plumber({ errorHandler: errorHandler }))\n    .pipe(babel())\n    .pipe(__DEV__ ? sourcemaps.init() : gutil.noop())\n    .pipe(concat('commonFramework.js'))\n    .pipe(\n      __DEV__ ?\n        sourcemaps.write({ sourceRoot: '/commonFramework' }) :\n        gutil.noop()\n    )\n    .pipe(__DEV__ ? gutil.noop() : uglify())\n    .pipe(revReplace({ manifest: manifest }))\n    .pipe(gulp.dest(dest))\n    .pipe(rev())\n    .pipe(gulp.dest(dest))\n    .pipe(rev.manifest(manifestName))\n    .pipe(delRev(\n      dest,\n      manifestName\n    ))\n    .pipe(gulp.dest(paths.manifest));\n});\n\nfunction collector(file, memo) {\n  return Object.assign({}, JSON.parse(file.contents), memo);\n}\n\nfunction done(manifest) {\n  return sortKeys(manifest);\n}\n\nfunction buildManifest() {\n  return gulp.src(paths.manifest + '*.json')\n    .pipe(reduce('rev-manifest.json', collector, done, {}))\n    .pipe(gulp.dest('server/'));\n}\n\nvar buildDependents = ['less', 'js', 'dependents'];\n\nif (__DEV__) {\n  buildDependents.push('pack-watch-manifest');\n}\n\ngulp.task('build-manifest', buildDependents, function() {\n  return buildManifest();\n});\n\ngulp.task('build-manifest-watch', function() {\n  return buildManifest();\n});\n\ngulp.task('build', [\n  'less',\n  'js',\n  'dependents',\n  'pack-client',\n  'build-manifest'\n]);\n\nvar watchDependents = [\n  'less',\n  'js',\n  'dependents',\n  'serve',\n  'sync',\n  'pack-watch',\n  'pack-watch-manifest',\n  'build-manifest'\n];\n\ngulp.task('reload', function() {\n  notify({ message: 'test changed' });\n  reload();\n});\n\ngulp.task('watch', watchDependents, function() {\n  gulp.watch(paths.lessFiles, ['less']);\n  gulp.watch(paths.js.concat(paths.vendorChallenges), ['js']);\n  gulp.watch(paths.challenges, ['test-challenges', 'reload']);\n  gulp.watch(paths.js, ['js', 'dependents']);\n  gulp.watch(\n    formatCommonFrameworkPaths.call(paths.commonFramework),\n    ['dependents']\n  );\n  gulp.watch(paths.manifest + '/*.json', ['build-manifest-watch']);\n  gulp.watch(webpackConfig.output.path + '/bundle.js', ['pack-watch-manifest']);\n});\n\ngulp.task('default', [\n  'less',\n  'serve',\n  'pack-watch',\n  'pack-watch-manifest',\n  'build-manifest-watch',\n  'watch',\n  'sync'\n]);\n\ngulp.task('test', function() {\n  return gulp.src('test/**/*.js')\n    .pipe(tape({\n      reporter: tapSpec()\n    }));\n});\n"
  },
  {
    "path": "leanTest.js",
    "content": "//Setup\nvar contacts = [\n    {\n        \"firstName\": \"Akira\",\n        \"lastName\": \"Laine\",\n        \"number\": \"0543236543\",\n        \"likes\": [\"Pizza\", \"Coding\", \"Brownie Points\"]\n    },\n    {\n        \"firstName\": \"Harry\",\n        \"lastName\": \"Potter\",\n        \"number\": \"0994372684\",\n        \"likes\": [\"Hogwarts\", \"Magic\", \"Hagrid\"]\n    },\n    {\n        \"firstName\": \"Sherlock\",\n        \"lastName\": \"Holmes\",\n        \"number\": \"0487345643\",\n        \"likes\": [\"Intriguing Cases\", \"Violin\"]\n    },\n    {\n        \"firstName\": \"Kristian\",\n        \"lastName\": \"Vos\",\n        \"number\": \"unknown\",\n        \"likes\": [\"Javascript\", \"Gaming\", \"Foxes\"]\n    }\n];\n\n\nfunction lookUp(firstName, prop){\n// Only change code below this line\n  for(var i in contacts){\n    if(contacts[i].firstName == firstName){\n      if(contacts[i].hasOwnProperty(prop)){\n        return contacts[i][prop];\n      }else{\n        return \"No such property\";\n      }\n    }else{\n      return \"No such contact\";\n    }\n  }\n// Only change code above this line\n}\n\n// Change these values to test your function\nlookUp(\"Akira\", \"likes\");\n"
  },
  {
    "path": "package.json",
    "content": "{\n  \"name\": \"freecodecamp.cn\",\n  \"version\": \"0.1.0\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/freecodecampchina/freecodecamp.cn.git\"\n  },\n  \"scripts\": {\n    \"only-once\": \"npm run create-rev && echo '\\n\\nseeding database\\n\\n' && node seed && echo '\\n\\nSeeding Completed\\n\\n'\",\n    \"create-rev\": \"node -e \\\"console.log('\\\\n\\\\ncreating manifest\\\\n\\\\n'); require('fs').writeFileSync('server/rev-manifest.json', '{}');\\\"\",\n    \"build\": \"NODE_ENV=production gulp build -p\",\n    \"start\": \"babel-node server/server.js\",\n    \"prestart-production\": \"bower cache clean && bower install && gulp build -p\",\n    \"start-production\": \"node pm2Start\",\n    \"lint\": \"npm run lint-js && npm run lint-json\",\n    \"lint-challenges\": \"jsonlint -q seed/challenges/**/*.json\",\n    \"lint-server\": \"jsonlint -q server/*.json\",\n    \"lint-resources\": \"jsonlint -q server/resources/*.json\",\n    \"lint-utils\": \"jsonlint -q server/utils/*.json\",\n    \"lint-js\": \"eslint --ext=.js,.jsx server/ common/ config/ client/\",\n    \"lint-json\": \"npm run lint-server && npm run lint-challenges && npm run lint-resources && npm run lint-utils\",\n    \"test-challenges\": \"babel-node seed/test-challenges.js | tap-spec\",\n    \"pretest\": \"npm run lint\",\n    \"test\": \"npm run test-challenges\"\n  },\n  \"license\": \"(BSD-3-Clause AND CC-BY-SA-4.0)\",\n  \"dependencies\": {\n    \"accepts\": \"^1.3.0\",\n    \"adler32\": \"~0.1.7\",\n    \"async\": \"^1.5.0\",\n    \"babel-cli\": \"^6.3.17\",\n    \"babel-core\": \"^6.3.26\",\n    \"babel-eslint\": \"^5.0.0\",\n    \"babel-loader\": \"^6.2.1\",\n    \"babel-plugin-add-module-exports\": \"^0.1.2\",\n    \"babel-preset-es2015\": \"^6.3.13\",\n    \"babel-preset-react\": \"^6.3.13\",\n    \"babel-preset-stage-0\": \"^6.3.13\",\n    \"babel-register\": \"^6.3.0\",\n    \"body-parser\": \"^1.13.2\",\n    \"cheerio\": \"~0.20.0\",\n    \"classnames\": \"^2.1.2\",\n    \"compression\": \"^1.6.0\",\n    \"connect-mongo\": \"~1.1.0\",\n    \"cookie-parser\": \"^1.4.0\",\n    \"debug\": \"^2.2.0\",\n    \"dedent\": \"~0.6.0\",\n    \"dotenv\": \"^2.0.0\",\n    \"emmet-codemirror\": \"^1.2.5\",\n    \"errorhandler\": \"^1.4.2\",\n    \"es6-map\": \"~0.1.1\",\n    \"eslint\": \"~2.2.0\",\n    \"eslint-plugin-react\": \"^4.1.0\",\n    \"express\": \"^4.13.3\",\n    \"express-flash\": \"~0.0.2\",\n    \"express-session\": \"^1.12.1\",\n    \"express-state\": \"^1.2.0\",\n    \"express-validator\": \"^2.18.0\",\n    \"fetchr\": \"~0.5.12\",\n    \"frameguard\": \"~0.2.2\",\n    \"gulp\": \"^3.9.0\",\n    \"gulp-babel\": \"^6.1.1\",\n    \"gulp-concat\": \"^2.6.0\",\n    \"gulp-eslint\": \"^2.0.0\",\n    \"gulp-jsonlint\": \"^1.1.0\",\n    \"gulp-less\": \"^3.0.3\",\n    \"gulp-nodemon\": \"^2.0.3\",\n    \"gulp-notify\": \"^2.2.0\",\n    \"gulp-plumber\": \"^1.0.1\",\n    \"gulp-reduce-file\": \"0.0.1\",\n    \"gulp-rev\": \"^7.0.0\",\n    \"gulp-rev-replace\": \"~0.4.2\",\n    \"gulp-uglify\": \"^1.5.1\",\n    \"gulp-util\": \"^3.0.6\",\n    \"helmet\": \"^1.1.0\",\n    \"helmet-csp\": \"^1.0.3\",\n    \"history\": \"^2.0.0\",\n    \"jade\": \"^1.11.0\",\n    \"json-loader\": \"~0.5.2\",\n    \"less\": \"^2.5.1\",\n    \"lodash\": \"^4.1.0\",\n    \"loopback\": \"^2.22.0\",\n    \"loopback-boot\": \"^2.13.0\",\n    \"loopback-component-passport\": \"^2.0.0\",\n    \"loopback-connector-mongodb\": \"1.13.0\",\n    \"merge-stream\": \"^1.0.0\",\n    \"method-override\": \"^2.3.0\",\n    \"moment\": \"^2.10.2\",\n    \"moment-timezone\": \"^0.5.0\",\n    \"mongodb\": \"^2.0.33\",\n    \"morgan\": \"^1.6.1\",\n    \"node-uuid\": \"^1.4.3\",\n    \"nodemailer\": \"^2.1.0\",\n    \"normalize-url\": \"^1.3.1\",\n    \"normalizr\": \"^2.0.0\",\n    \"object.assign\": \"^4.0.3\",\n    \"passport-facebook\": \"^2.0.0\",\n    \"passport-github\": \"^1.0.0\",\n    \"passport-google-oauth2\": \"~0.1.6\",\n    \"passport-linkedin-oauth2\": \"^1.2.1\",\n    \"passport-local\": \"^1.0.0\",\n    \"passport-oauth\": \"^1.0.0\",\n    \"passport-twitter\": \"^1.0.3\",\n    \"pmx\": \"~0.5.5\",\n    \"react\": \"~0.14.3\",\n    \"react-bootstrap\": \"~0.28.1\",\n    \"react-dom\": \"~0.14.3\",\n    \"react-motion\": \"~0.4.2\",\n    \"react-pure-render\": \"^1.0.2\",\n    \"react-redux\": \"^4.0.6\",\n    \"react-router\": \"^2.0.0\",\n    \"react-router-bootstrap\": \"~0.20.1\",\n    \"react-toastr\": \"^2.4.0\",\n    \"react-router-redux\": \"^2.1.0\",\n    \"react-vimeo\": \"~0.1.0\",\n    \"redux\": \"^3.0.5\",\n    \"redux-actions\": \"^0.9.1\",\n    \"redux-form\": \"^4.1.4\",\n    \"request\": \"^2.65.0\",\n    \"reselect\": \"^2.0.2\",\n    \"rev-del\": \"^1.0.5\",\n    \"rx\": \"^4.0.0\",\n    \"sanitize-html\": \"^1.11.1\",\n    \"sort-keys\": \"^1.1.1\",\n    \"stampit\": \"^2.1.1\",\n    \"store\": \"https://github.com/berkeleytrue/store.js.git#feature/noop-server\",\n    \"thundercats\": \"^3.1.0\",\n    \"thundercats-react\": \"~0.5.1\",\n    \"url-regex\": \"^3.0.0\",\n    \"validator\": \"^5.0.0\",\n    \"webpack\": \"^1.9.12\",\n    \"webpack-stream\": \"^3.1.0\",\n    \"xss-filters\": \"^1.2.6\",\n    \"yargs\": \"^4.1.0\"\n  },\n  \"devDependencies\": {\n    \"browser-sync\": \"^2.9.12\",\n    \"gulp-sourcemaps\": \"^1.6.0\",\n    \"gulp-tape\": \"0.0.7\",\n    \"jsonlint\": \"^1.6.2\",\n    \"loopback-component-explorer\": \"^2.1.1\",\n    \"loopback-testing\": \"^1.1.0\",\n    \"sinon\": \"^1.17.3\",\n    \"tap-spec\": \"^4.1.1\",\n    \"tape\": \"^4.2.2\"\n  }\n}\n"
  },
  {
    "path": "pm2Start.js",
    "content": "require('dotenv').load();\nvar pm2 = require('pm2');\nvar nodemailer = require('nodemailer');\nvar moment = require('moment-timezone');\nvar _ = require('lodash');\n\nvar instances = process.env.INSTANCES || 1;\nvar serverName = process.env.SERVER_NAME || 'server';\nvar maxMemory = process.env.MAX_MEMORY || '590M';\n\n\nvar mailReceiver = process.env.MAIL_RECEIVER || false;\n\npm2.connect(function() {\n  pm2.start({\n    name: serverName,\n    script: 'server/production-start.js',\n    'exec_mode': 'cluster',\n    instances: instances,\n    'max_memory_restart': maxMemory,\n    'NODE_ENV': 'production'\n  }, function() {\n    console.log(\n      'pm2 started %s with %s instances at %s max memory',\n      serverName,\n      instances,\n      maxMemory\n    );\n    pm2.disconnect();\n  });\n});\n"
  },
  {
    "path": "public/browserconfig.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<browserconfig>\r\n  <msapplication>\r\n    <tile>\r\n      <square70x70logo src=\"/mstile-70x70.png\"/>\r\n      <square150x150logo src=\"/mstile-150x150.png\"/>\r\n      <square310x310logo src=\"/mstile-310x310.png\"/>\r\n      <wide310x150logo src=\"/mstile-310x150.png\"/>\r\n      <TileColor>#492c14</TileColor>\r\n    </tile>\r\n  </msapplication>\r\n</browserconfig>\r\n"
  },
  {
    "path": "public/code.html",
    "content": "<!DOCTYPE html>\n<html ng-app=\"app\">\n<head>\n  <meta charset=\"UTF-8\">\n  <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">\n  <meta name=\"viewport\" content=\"width=device-width,initial-scale=1.0,maximum-scale=1.0,minimum-scale=1.0,user-scalable=no\">\n  <title>苏州全民编程挑战赛</title>\n  <!-- 新 Bootstrap 核心 CSS 文件 -->\n  <link rel=\"stylesheet\" href=\"//cdn.bootcss.com/bootstrap/3.3.5/css/bootstrap.min.css\">\n  <style>\n    body{margin:0;font-size:16px;}\n    header{background: #4CAF50;height:450px;color:white;position:relative;}\n    .canvas-text{position:absolute;top:0;left:0;width:100%;}\n    #logo{display:block;margin:0 auto;padding-top:3%;width:100px;}\n    .qrcode{position: fixed;top: 450px;border-radius: 2px;-moz-border-radius: 2px;-webkit-border-radius: 2px;\n      text-align: center;color: #717375;font-size: 12px;}\n    .right{right: 0px;}\n    .left{left: 0px;}\n    dd{margin: 0 auto;margin-top: 5px;}\n    .btn-orange{background:orange;display:block;margin:0 auto;border:none;margin-top: 20px;font-size:30px;}\n    .carousel-indicators {bottom: -30px;}\n    .carousel-indicators li {border: 1px solid #8BC34A;border-radius: 50%;margin:0;}\n    .carousel-indicators .active {background:#8BC34A;width:10px;height:10px;}\n    .button-spacer{height:10px;}\n    .spacer{height:10px;}\n    .row{margin-top:40px;}\n    .modal{font-size:24px;}\n    .modal-footer{text-align:center;}\n    #commit{color: #fff;background: orange;border: none;}\n    .pt20{padding-top: 20px;}\n  </style>\n</head>\n<body>\n  <div style=\"display: none;\">\n    <img src=\"/images/camper-image-placeholder.png\" >\n  </div>\n  <dl class=\"qrcode right hidden-xs\">\n      <dt><img src=\"images/qrcode_for_nearest.jpg\" width=\"120px\"></dt>\n      <dd>搜索freecodecamp</dd>\n      <span>回复“比赛”二字</span><br>\n      <span>加入学习群</span>\n  </dl>\n  <div class=\"qrcode left hidden-xs\">\n      <img src=\"http://dev.juhe.cn/Public/front/images/enroll.png\" width=\"150px\" id=\"iwantjoin\">\n  </div>\n  <header id=\"banner\">\n    <canvas id=\"animate-net\" class=\"banner-back\"></canvas>\n    <div class=\"canvas-text\">\n      <img src=\"images/wilddog.png\" id=\"logo\">\n      <h1 class=\"text-center\">野狗杯</h1>\n      <h1 class=\"text-center\">苏州全民在线编程挑战赛</h1>\n      <h2 class=\"text-center\">06.05 -- 07.02</h2>\n      <!-- Button trigger modal -->\n      <button type=\"button\" class=\"btn btn-orange btn-lg\" data-toggle=\"modal\" data-target=\"#myModal\">\n        立即报名\n      </button>\n    </div>\n\n  </header>\n  <!-- Modal -->\n  <div class=\"modal fade\" id=\"myModal\" tabindex=\"-1\" role=\"dialog\" aria-labelledby=\"myModalLabel\">\n    <div class=\"modal-dialog\" role=\"document\">\n      <div class=\"modal-content\" ng-controller=\"modal\">\n        <div class=\"modal-header\">\n          <h4 class=\"modal-title\" class=\"text-center\" id=\"myModalLabel\">FreeCodeCamp 比赛报名入口</h4>\n        </div>\n        <div class=\"modal-body\">\n          <form class=\"form-horizontal\">\n            <div class=\"form-group\">\n              <label for=\"username\" class=\"col-xs-12 col-sm-3 control-label\">用户名</label>\n              <div class=\"col-xs-12 col-sm-9\" style=\"margin-top: 10px;\">\n                <input type=\"text\" class=\"form-control\" id=\"username\" ng-model=\"username\" name=\"username\"  placeholder=\"FCC的用户名都是小写哦\" required>\n                <span style=\"font-size:12px;\">如果你没有FCC用户名，</span><a href=\"/login\" style=\"font-size:12px;\">请先注册FCC</a>\n              </div>\n            </div>\n            <div class=\"form-group\">\n              <label for=\"telphone\" class=\"col-xs-12 col-sm-3 control-label\">手机号</label>\n              <div class=\"col-xs-12 col-sm-9\" style=\"margin-top: 10px;\">\n                <input type=\"tel\" class=\"form-control\" id=\"telphone\" ng-model=\"telphone\" name=\"telphone\"  placeholder=\"便于我们通知你领奖品哦\" required>\n              </div>\n            </div>\n            <div class=\"form-group\">\n              <label for=\"category\" class=\"col-xs-12 col-sm-3 control-label\">选择组别</label>\n              <div class=\"col-xs-12 col-sm-9\" style=\"margin-top: 10px;\">\n                <select style=\"border: 1px solid #ccc;width:100%;\">\n                   <option value=\"\" >一旦选定不能修改哦 ^_^</option>\n                   <option value=\"master\">专业组(面向计算机高手)</option>\n                   <option value=\"newer\" >业余组(面向计算机小白)</option>\n                   <option value=\"women\" >新秀组(只面向女性，男性选择改组无法获奖）</option>\n                 </select>\n              </div>\n            </div>\n          </form>\n        </div>\n        <div class=\"modal-footer text-center\">\n            <button type=\"button\" class=\"btn btn-primary\" data-dismiss=\"modal\">关闭此窗口</button>\n            <button id=\"commit\" class=\"btn btn-default\" ng-click=\"commit();\">确定无误，提交</button>\n        </div>\n      </div>\n    </div>\n  </div>\n  <div class=\"container\">\n    <h3 class=\"text-center\">人人皆可编程</h3>\n    <p class=\"text-center pt20\">本次挑战赛由苏州工业园区科信局指导、苏州开发者联盟主办、猿生态开发者社区承办。</p>\n    <p class=\"text-center\">全民编程时代已经来临，编程将会成为互联网时代的通用技能。</p>\n    <p class=\"text-center\">本次挑战赛旨在提升苏州开发者技能，营造“人人皆可编程”的氛围。</p>\n  </div>\n\n  <hr>\n  <div class=\"container\">\n    <h3 class=\"text-center\">比赛平台：FreeCodeCamp中文社区</h3>\n    <div class=\"row text-center\">\n      <div class=\"col-xs-12 col-sm-12 col-md-3\">\n        <img src=\"/images/landingIcons_connect.svg\" class=\"img-responsive center-block\" style=\"width:150px;\">\n        <div class=\"button-spacer\"></div>\n        <span>全球30W+用户</span>\n        <br><span>GitHub上排名第一</span>\n        <div class=\"spacer\"></div>\n      </div>\n      <div class=\"col-xs-12 col-sm-12 col-md-3\">\n        <img src=\"/images/landingIcons_learn.svg\" class=\"img-responsive center-block\"  style=\"width:150px;\">\n        <div class=\"button-spacer\"></div>\n        <span>游戏化编程</span><br>\n        <span>无尽的挑战任务</span>\n        <div class=\"spacer\"></div>\n      </div>\n      <div class=\"col-xs-12 col-sm-12 col-md-3\">\n        <img src=\"/images/landingIcons_nonprofits.svg\" class=\"img-responsive center-block\"  style=\"width:150px;\">\n        <div class=\"button-spacer\"></div>\n        <span>8万+人在线交流</span><br>\n        <span>有问必答</span>\n        <div class=\"spacer\"></div>\n      </div>\n      <div class=\"col-xs-12 col-sm-12 col-md-3\">\n        <img src=\"/images/landingIcons_portfolio.svg\" class=\"img-responsive center-block\"  style=\"width:150px;\">\n        <div class=\"button-spacer\"></div>\n        <span>帮助非盈利组织</span><br>\n        <span>开发公益项目</span>\n        <div class=\"spacer\"></div>\n      </div>\n    </div>\n  </div>\n  <hr>\n  <div class=\"container\">\n    <h3 class=\"text-center\">赛程</h3>\n    <embed src=\"images/timeline.svg\" type=\"image/svg+xml\" />\n  </div>\n  <hr>\n  <div class=\"container\">\n    <h3 class=\"text-center\">分组</h3>\n    <embed src=\"images/groups.svg\" type=\"image/svg+xml\" codebase=\"http://www.adobe.com/svg/viewer/install/\" style=\"margin-left:20px;\"/>\n  </div>\n  <hr>\n  <div class=\"container\">\n    <h3 class=\"text-center\">评分（标星的必做）</h3>\n    <embed src=\"images/challenges.svg\" type=\"image/svg+xml\" codebase=\"http://www.adobe.com/svg/viewer/install/\" />\n  </div>\n  <hr>\n  <div class=\"container\" style=\"width:100%;\">\n    <h3 class=\"text-center\">奖品</h3>\n    <div id=\"carousel-example-generic\" class=\"carousel slide\" data-ride=\"carousel\">\n      <!-- Wrapper for slides -->\n      <div class=\"carousel-inner\" role=\"listbox\">\n        <div class=\"item active\">\n          <img src=\"/images/1.png\" alt=\"...\">\n        </div>\n        <div class=\"item\">\n          <img src=\"/images/2.png\" alt=\"...\">\n        </div>\n        <div class=\"item\">\n          <img src=\"/images/3.png\" alt=\"...\">\n        </div>\n      </div>\n      <!-- Indicators -->\n      <ol class=\"carousel-indicators\">\n        <li data-target=\"#carousel-example-generic\" data-slide-to=\"0\" class=\"active\"></li>\n        <li data-target=\"#carousel-example-generic\" data-slide-to=\"1\"></li>\n        <li data-target=\"#carousel-example-generic\" data-slide-to=\"2\"></li>\n      </ol>\n    </div>\n  </div>\n  <hr>\n  <div>\n    <img src=\"images/startup.png\" class=\"img-responsive center-block\">\n    <a href=\"https://wilddog.com\"><img src=\"images/zuanshi.png\" class=\"img-responsive center-block\"></a>\n    <img src=\"images/media.png\" class=\"img-responsive center-block\">\n  </div>\n\n<!-- jQuery文件。务必在bootstrap.min.js 之前引入 -->\n<script src=\"//cdn.bootcss.com/jquery/1.11.3/jquery.min.js\"></script>\n\n<!-- 最新的 Bootstrap 核心 JavaScript 文件 -->\n<script src=\"//cdn.bootcss.com/bootstrap/3.3.5/js/bootstrap.min.js\"></script>\n<script src=\"/js/angular.min.js\"></script>\n<script src=\"/js/greensock.js\"></script>\n<script>\n  $('#iwantjoin').click(function(){\n    $(\".btn-lg\").click();\n  })\n  $('.carousel').carousel({\n    interval: 5000\n  });\n  var username = document.getElementById(\"username\");\n  var telphoneRegex = /^0?(13[0-9]|15[0-9]|17[0-9]|18[0-9]|14[0-9])[0-9]{8}$/;\n  var emailRegex = /^(\\w)+(\\.\\w+)*@(\\w)+((\\.\\w+)+)$/;\n  var telphone = document.getElementById(\"telphone\");\n  var email = document.getElementById(\"email\");\n  var commit= document.getElementById(\"commit\");\n  var app = angular.module('app',[]);\n  app.controller('modal',['$scope','$http', function($scope,$http){\n    $scope.commit=function(){\n      if(validator()){\n        $http.post('/has-username',{username:$scope.username}).then(function(res){\n          var out = res.data;\n          if(out.status == 404){\n            alert(\"用户名不存在，请先注册FCC！\")\n          }else{\n            $http.post('/has-join',{username:$scope.username,telphone:$scope.telphone}).then(function(res){\n              var out = res.data;\n              if(out.status == 200){\n                alert(\"你已报名成功，请勿重复报名！\");\n                $(\".close\").click();\n                $('.btn-lg').text('报名成功').attr('disabled',true);\n                window.open(\"https://freecodecamp.cn\");\n              }else{\n                $http.post('/add-telphone',{username:$scope.username,telphone:$scope.telphone,category:$(\"select\").val()}).then(function(res){\n                  var out = res.data;\n                  if(out.status == 200){\n                    alert(\"恭喜你，报名成功！\");\n                    $(\".close\").click();\n                    $('.btn-lg').text('报名成功').attr('disabled',true);\n                    window.open(\"https://freecodecamp.cn\");\n                  }else{\n                    alert(\"提交数据有误，请重新输入！\")\n                  }\n                },function(err){\n                  console.log(err);\n                })\n              }\n            },function(err){\n              console.log(err);\n            })\n          }\n        },function(err){\n          console.log(err);\n        })\n      }\n    }\n  }])\n  function validator(){\n    if(!$(\"#username\").val().replace(/(^s*)|(s*$)/g,'')){\n      alert(\"用户名为空，请重新输入！\")\n      return false;\n    }else if(!$(\"#telphone\").val().replace(/(^s*)|(s*$)/g,'')){\n      alert(\"手机号为空，请重新输入！\")\n      return false;\n    }else if(!telphoneRegex.test($(\"#telphone\").val())){\n      alert(\"手机号错误，请重新输入！\")\n      return false;\n    }else if(!$(\"select\").val()){\n      alert(\"请先选组，再提交！\");\n      return false;\n    }else{\n      return true;\n    }\n  }\n</script>\n<script>\nvar _vds = _vds || [];\nwindow._vds = _vds;\n(function(){\n  _vds.push(['setAccountId', 'b350d488f8e3e5f1']);\n  (function() {\n    var vds = document.createElement('script');\n    vds.type='text/javascript';\n    vds.async = true;\n    vds.src = ('https:' == document.location.protocol ? 'https://' : 'http://') + 'dn-growing.qbox.me/vds.js';\n    var s = document.getElementsByTagName('script')[0];\n    s.parentNode.insertBefore(vds, s);\n  })();\n})();\n</script>\n</body>\n</html>\n"
  },
  {
    "path": "public/css/Vimeo.css",
    "content": ".vimeo-image,\n.vimeo-image:after,\n.vimeo-embed {\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: 100%;\n  height: 100%;\n}\n.vimeo {\n  position: relative;\n  padding-bottom: 56.25%;\n  background: #e2e2e2;\n}\n.vimeo iframe {\n  border: 0;\n}\n.vimeo-image {\n  background-position: center center;\n  background-size: 100% auto;\n}\n.vimeo-image:after {\n  z-index: 1;\n  display: block;\n  content: '';\n  background: rgba(0,0,0,0.3);\n}\n.vimeo-play-button,\n.vimeo-loading {\n  top: 50%;\n  left: 50%;\n  transform: translateX(-50%) translateY(-50%);\n}\n.vimeo-play-button {\n  z-index: 2;\n  position: absolute;\n  padding: 0;\n  width: 70px;\n  border: 0;\n  background: none;\n}\n.vimeo-play-button:focus {\n  outline: none;\n}\n.vimeo-play-button svg {\n  fill: #fff;\n  -webkit-filter: drop-shadow(0 1px 1px rgba(0,0,0,0.8));\n  filter: drop-shadow(0 1px 1px rgba(0,0,0,0.8));\n}\n.vimeo-loading {\n  z-index: 4;\n  position: absolute;\n  width: 32px;\n  height: 32px;\n}\n.vimeo-loading svg {\n  fill: #000;\n  transform-origin: 50% 50%;\n  -webkit-animation: spinner 0.8s infinite linear;\n  animation: spinner 0.8s infinite linear;\n}\n.vimeo-embed iframe {\n  width: 100%;\n  height: 100%;\n}\n@-moz-keyframes spinner {\n  from {\n    transform: rotate(0deg);\n  }\n  to {\n    transform: rotate(360deg);\n  }\n}\n@-webkit-keyframes spinner {\n  from {\n    transform: rotate(0deg);\n  }\n  to {\n    transform: rotate(360deg);\n  }\n}\n@-o-keyframes spinner {\n  from {\n    transform: rotate(0deg);\n  }\n  to {\n    transform: rotate(360deg);\n  }\n}\n@keyframes spinner {\n  from {\n    transform: rotate(0deg);\n  }\n  to {\n    transform: rotate(360deg);\n  }\n}\n"
  },
  {
    "path": "public/css/lato.css",
    "content": "@font-face {\n  font-family: \"Lato\";\n  src: url(/fonts/Lato-Regular.ttf) format(\"truetype\");\n}\n\n@font-face {\n  font-family: \"Lato Light\";\n  src: url(/fonts/Lato-Light.ttf) format(\"truetype\");\n}\n\n@font-face {\n  font-family: \"Lato Bold\";\n  src: url(/fonts/Lato-Bold.ttf) format(\"truetype\");\n}\n.qr_code_pc {\n  position: fixed;\n  top: 100px;\n  right: 100px;\n}\n"
  },
  {
    "path": "public/css/main-69858c7174.css",
    "content": "@charset \"UTF-8\";\n/*! normalize.css v3.0.2 | MIT License | git.io/normalize */\nhtml {\n  font-family: sans-serif;\n  -ms-text-size-adjust: 100%;\n  -webkit-text-size-adjust: 100%;\n}\nbody {\n  margin: 0;\n}\narticle,\naside,\ndetails,\nfigcaption,\nfigure,\nfooter,\nheader,\nhgroup,\nmain,\nmenu,\nnav,\nsection,\nsummary {\n  display: block;\n}\naudio,\ncanvas,\nprogress,\nvideo {\n  display: inline-block;\n  vertical-align: baseline;\n}\naudio:not([controls]) {\n  display: none;\n  height: 0;\n}\n[hidden],\ntemplate {\n  display: none;\n}\na {\n  background-color: transparent;\n}\na:active,\na:hover {\n  outline: 0;\n}\nabbr[title] {\n  border-bottom: 1px dotted;\n}\nb,\nstrong {\n  font-weight: bold;\n}\ndfn {\n  font-style: italic;\n}\nh1 {\n  font-size: 2em;\n  margin: 0.67em 0;\n}\nmark {\n  background: #ff0;\n  color: #000;\n}\nsmall {\n  font-size: 80%;\n}\nsub,\nsup {\n  font-size: 75%;\n  line-height: 0;\n  position: relative;\n  vertical-align: baseline;\n}\nsup {\n  top: -0.5em;\n}\nsub {\n  bottom: -0.25em;\n}\nimg {\n  border: 0;\n}\nsvg:not(:root) {\n  overflow: hidden;\n}\nfigure {\n  margin: 1em 40px;\n}\nhr {\n  -moz-box-sizing: content-box;\n  box-sizing: content-box;\n  height: 0;\n}\npre {\n  overflow: auto;\n}\ncode,\nkbd,\npre,\nsamp {\n  font-family: monospace, monospace;\n  font-size: 1em;\n}\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n  color: inherit;\n  font: inherit;\n  margin: 0;\n}\nbutton {\n  overflow: visible;\n}\nbutton,\nselect {\n  text-transform: none;\n}\nbutton,\nhtml input[type=\"button\"],\ninput[type=\"reset\"],\ninput[type=\"submit\"] {\n  -webkit-appearance: button;\n  cursor: pointer;\n}\nbutton[disabled],\nhtml input[disabled] {\n  cursor: default;\n}\nbutton::-moz-focus-inner,\ninput::-moz-focus-inner {\n  border: 0;\n  padding: 0;\n}\ninput {\n  line-height: normal;\n}\ninput[type=\"checkbox\"],\ninput[type=\"radio\"] {\n  box-sizing: border-box;\n  padding: 0;\n}\ninput[type=\"number\"]::-webkit-inner-spin-button,\ninput[type=\"number\"]::-webkit-outer-spin-button {\n  height: auto;\n}\ninput[type=\"search\"] {\n  -webkit-appearance: textfield;\n  -moz-box-sizing: content-box;\n  -webkit-box-sizing: content-box;\n  box-sizing: content-box;\n}\ninput[type=\"search\"]::-webkit-search-cancel-button,\ninput[type=\"search\"]::-webkit-search-decoration {\n  -webkit-appearance: none;\n}\nfieldset {\n  border: 1px solid #c0c0c0;\n  margin: 0 2px;\n  padding: 0.35em 0.625em 0.75em;\n}\nlegend {\n  border: 0;\n  padding: 0;\n}\ntextarea {\n  overflow: auto;\n}\noptgroup {\n  font-weight: bold;\n}\ntable {\n  border-collapse: collapse;\n  border-spacing: 0;\n}\ntd,\nth {\n  padding: 0;\n}\n/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */\n@media print {\n  *,\n  *:before,\n  *:after {\n    background: transparent !important;\n    color: #000 !important;\n    box-shadow: none !important;\n    text-shadow: none !important;\n  }\n  a,\n  a:visited {\n    text-decoration: underline;\n  }\n  a[href]:after {\n    content: \" (\" attr(href) \")\";\n  }\n  abbr[title]:after {\n    content: \" (\" attr(title) \")\";\n  }\n  a[href^=\"#\"]:after,\n  a[href^=\"javascript:\"]:after {\n    content: \"\";\n  }\n  pre,\n  blockquote {\n    border: 1px solid #999;\n    page-break-inside: avoid;\n  }\n  thead {\n    display: table-header-group;\n  }\n  tr,\n  img {\n    page-break-inside: avoid;\n  }\n  img {\n    max-width: 100% !important;\n  }\n  p,\n  h2,\n  h3 {\n    orphans: 3;\n    widows: 3;\n  }\n  h2,\n  h3 {\n    page-break-after: avoid;\n  }\n  select {\n    background: #fff !important;\n  }\n  .navbar {\n    display: none;\n  }\n  .btn > .caret,\n  .dropup > .btn > .caret {\n    border-top-color: #000 !important;\n  }\n  .label {\n    border: 1px solid #000;\n  }\n  .table {\n    border-collapse: collapse !important;\n  }\n  .table td,\n  .table th {\n    background-color: #fff !important;\n  }\n  .table-bordered th,\n  .table-bordered td {\n    border: 1px solid #ddd !important;\n  }\n}\n@font-face {\n  font-family: 'Glyphicons Halflings';\n  src: url('../fonts/glyphicons-halflings-regular.eot');\n  src: url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'), url('../fonts/glyphicons-halflings-regular.woff') format('woff'), url('../fonts/glyphicons-halflings-regular.ttf') format('truetype'), url('../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular') format('svg');\n}\n.glyphicon {\n  position: relative;\n  top: 1px;\n  display: inline-block;\n  font-family: 'Glyphicons Halflings';\n  font-style: normal;\n  font-weight: normal;\n  line-height: 1;\n  -webkit-font-smoothing: antialiased;\n  -moz-osx-font-smoothing: grayscale;\n}\n.glyphicon-asterisk:before {\n  content: \"\\2a\";\n}\n.glyphicon-plus:before {\n  content: \"\\2b\";\n}\n.glyphicon-euro:before,\n.glyphicon-eur:before {\n  content: \"\\20ac\";\n}\n.glyphicon-minus:before {\n  content: \"\\2212\";\n}\n.glyphicon-cloud:before {\n  content: \"\\2601\";\n}\n.glyphicon-envelope:before {\n  content: \"\\2709\";\n}\n.glyphicon-pencil:before {\n  content: \"\\270f\";\n}\n.glyphicon-glass:before {\n  content: \"\\e001\";\n}\n.glyphicon-music:before {\n  content: \"\\e002\";\n}\n.glyphicon-search:before {\n  content: \"\\e003\";\n}\n.glyphicon-heart:before {\n  content: \"\\e005\";\n}\n.glyphicon-star:before {\n  content: \"\\e006\";\n}\n.glyphicon-star-empty:before {\n  content: \"\\e007\";\n}\n.glyphicon-user:before {\n  content: \"\\e008\";\n}\n.glyphicon-film:before {\n  content: \"\\e009\";\n}\n.glyphicon-th-large:before {\n  content: \"\\e010\";\n}\n.glyphicon-th:before {\n  content: \"\\e011\";\n}\n.glyphicon-th-list:before {\n  content: \"\\e012\";\n}\n.glyphicon-ok:before {\n  content: \"\\e013\";\n}\n.glyphicon-remove:before {\n  content: \"\\e014\";\n}\n.glyphicon-zoom-in:before {\n  content: \"\\e015\";\n}\n.glyphicon-zoom-out:before {\n  content: \"\\e016\";\n}\n.glyphicon-off:before {\n  content: \"\\e017\";\n}\n.glyphicon-signal:before {\n  content: \"\\e018\";\n}\n.glyphicon-cog:before {\n  content: \"\\e019\";\n}\n.glyphicon-trash:before {\n  content: \"\\e020\";\n}\n.glyphicon-home:before {\n  content: \"\\e021\";\n}\n.glyphicon-file:before {\n  content: \"\\e022\";\n}\n.glyphicon-time:before {\n  content: \"\\e023\";\n}\n.glyphicon-road:before {\n  content: \"\\e024\";\n}\n.glyphicon-download-alt:before {\n  content: \"\\e025\";\n}\n.glyphicon-download:before {\n  content: \"\\e026\";\n}\n.glyphicon-upload:before {\n  content: \"\\e027\";\n}\n.glyphicon-inbox:before {\n  content: \"\\e028\";\n}\n.glyphicon-play-circle:before {\n  content: \"\\e029\";\n}\n.glyphicon-repeat:before {\n  content: \"\\e030\";\n}\n.glyphicon-refresh:before {\n  content: \"\\e031\";\n}\n.glyphicon-list-alt:before {\n  content: \"\\e032\";\n}\n.glyphicon-lock:before {\n  content: \"\\e033\";\n}\n.glyphicon-flag:before {\n  content: \"\\e034\";\n}\n.glyphicon-headphones:before {\n  content: \"\\e035\";\n}\n.glyphicon-volume-off:before {\n  content: \"\\e036\";\n}\n.glyphicon-volume-down:before {\n  content: \"\\e037\";\n}\n.glyphicon-volume-up:before {\n  content: \"\\e038\";\n}\n.glyphicon-qrcode:before {\n  content: \"\\e039\";\n}\n.glyphicon-barcode:before {\n  content: \"\\e040\";\n}\n.glyphicon-tag:before {\n  content: \"\\e041\";\n}\n.glyphicon-tags:before {\n  content: \"\\e042\";\n}\n.glyphicon-book:before {\n  content: \"\\e043\";\n}\n.glyphicon-bookmark:before {\n  content: \"\\e044\";\n}\n.glyphicon-print:before {\n  content: \"\\e045\";\n}\n.glyphicon-camera:before {\n  content: \"\\e046\";\n}\n.glyphicon-font:before {\n  content: \"\\e047\";\n}\n.glyphicon-bold:before {\n  content: \"\\e048\";\n}\n.glyphicon-italic:before {\n  content: \"\\e049\";\n}\n.glyphicon-text-height:before {\n  content: \"\\e050\";\n}\n.glyphicon-text-width:before {\n  content: \"\\e051\";\n}\n.glyphicon-align-left:before {\n  content: \"\\e052\";\n}\n.glyphicon-align-center:before {\n  content: \"\\e053\";\n}\n.glyphicon-align-right:before {\n  content: \"\\e054\";\n}\n.glyphicon-align-justify:before {\n  content: \"\\e055\";\n}\n.glyphicon-list:before {\n  content: \"\\e056\";\n}\n.glyphicon-indent-left:before {\n  content: \"\\e057\";\n}\n.glyphicon-indent-right:before {\n  content: \"\\e058\";\n}\n.glyphicon-facetime-video:before {\n  content: \"\\e059\";\n}\n.glyphicon-picture:before {\n  content: \"\\e060\";\n}\n.glyphicon-map-marker:before {\n  content: \"\\e062\";\n}\n.glyphicon-adjust:before {\n  content: \"\\e063\";\n}\n.glyphicon-tint:before {\n  content: \"\\e064\";\n}\n.glyphicon-edit:before {\n  content: \"\\e065\";\n}\n.glyphicon-share:before {\n  content: \"\\e066\";\n}\n.glyphicon-check:before {\n  content: \"\\e067\";\n}\n.glyphicon-move:before {\n  content: \"\\e068\";\n}\n.glyphicon-step-backward:before {\n  content: \"\\e069\";\n}\n.glyphicon-fast-backward:before {\n  content: \"\\e070\";\n}\n.glyphicon-backward:before {\n  content: \"\\e071\";\n}\n.glyphicon-play:before {\n  content: \"\\e072\";\n}\n.glyphicon-pause:before {\n  content: \"\\e073\";\n}\n.glyphicon-stop:before {\n  content: \"\\e074\";\n}\n.glyphicon-forward:before {\n  content: \"\\e075\";\n}\n.glyphicon-fast-forward:before {\n  content: \"\\e076\";\n}\n.glyphicon-step-forward:before {\n  content: \"\\e077\";\n}\n.glyphicon-eject:before {\n  content: \"\\e078\";\n}\n.glyphicon-chevron-left:before {\n  content: \"\\e079\";\n}\n.glyphicon-chevron-right:before {\n  content: \"\\e080\";\n}\n.glyphicon-plus-sign:before {\n  content: \"\\e081\";\n}\n.glyphicon-minus-sign:before {\n  content: \"\\e082\";\n}\n.glyphicon-remove-sign:before {\n  content: \"\\e083\";\n}\n.glyphicon-ok-sign:before {\n  content: \"\\e084\";\n}\n.glyphicon-question-sign:before {\n  content: \"\\e085\";\n}\n.glyphicon-info-sign:before {\n  content: \"\\e086\";\n}\n.glyphicon-screenshot:before {\n  content: \"\\e087\";\n}\n.glyphicon-remove-circle:before {\n  content: \"\\e088\";\n}\n.glyphicon-ok-circle:before {\n  content: \"\\e089\";\n}\n.glyphicon-ban-circle:before {\n  content: \"\\e090\";\n}\n.glyphicon-arrow-left:before {\n  content: \"\\e091\";\n}\n.glyphicon-arrow-right:before {\n  content: \"\\e092\";\n}\n.glyphicon-arrow-up:before {\n  content: \"\\e093\";\n}\n.glyphicon-arrow-down:before {\n  content: \"\\e094\";\n}\n.glyphicon-share-alt:before {\n  content: \"\\e095\";\n}\n.glyphicon-resize-full:before {\n  content: \"\\e096\";\n}\n.glyphicon-resize-small:before {\n  content: \"\\e097\";\n}\n.glyphicon-exclamation-sign:before {\n  content: \"\\e101\";\n}\n.glyphicon-gift:before {\n  content: \"\\e102\";\n}\n.glyphicon-leaf:before {\n  content: \"\\e103\";\n}\n.glyphicon-fire:before {\n  content: \"\\e104\";\n}\n.glyphicon-eye-open:before {\n  content: \"\\e105\";\n}\n.glyphicon-eye-close:before {\n  content: \"\\e106\";\n}\n.glyphicon-warning-sign:before {\n  content: \"\\e107\";\n}\n.glyphicon-plane:before {\n  content: \"\\e108\";\n}\n.glyphicon-calendar:before {\n  content: \"\\e109\";\n}\n.glyphicon-random:before {\n  content: \"\\e110\";\n}\n.glyphicon-comment:before {\n  content: \"\\e111\";\n}\n.glyphicon-magnet:before {\n  content: \"\\e112\";\n}\n.glyphicon-chevron-up:before {\n  content: \"\\e113\";\n}\n.glyphicon-chevron-down:before {\n  content: \"\\e114\";\n}\n.glyphicon-retweet:before {\n  content: \"\\e115\";\n}\n.glyphicon-shopping-cart:before {\n  content: \"\\e116\";\n}\n.glyphicon-folder-close:before {\n  content: \"\\e117\";\n}\n.glyphicon-folder-open:before {\n  content: \"\\e118\";\n}\n.glyphicon-resize-vertical:before {\n  content: \"\\e119\";\n}\n.glyphicon-resize-horizontal:before {\n  content: \"\\e120\";\n}\n.glyphicon-hdd:before {\n  content: \"\\e121\";\n}\n.glyphicon-bullhorn:before {\n  content: \"\\e122\";\n}\n.glyphicon-bell:before {\n  content: \"\\e123\";\n}\n.glyphicon-certificate:before {\n  content: \"\\e124\";\n}\n.glyphicon-thumbs-up:before {\n  content: \"\\e125\";\n}\n.glyphicon-thumbs-down:before {\n  content: \"\\e126\";\n}\n.glyphicon-hand-right:before {\n  content: \"\\e127\";\n}\n.glyphicon-hand-left:before {\n  content: \"\\e128\";\n}\n.glyphicon-hand-up:before {\n  content: \"\\e129\";\n}\n.glyphicon-hand-down:before {\n  content: \"\\e130\";\n}\n.glyphicon-circle-arrow-right:before {\n  content: \"\\e131\";\n}\n.glyphicon-circle-arrow-left:before {\n  content: \"\\e132\";\n}\n.glyphicon-circle-arrow-up:before {\n  content: \"\\e133\";\n}\n.glyphicon-circle-arrow-down:before {\n  content: \"\\e134\";\n}\n.glyphicon-globe:before {\n  content: \"\\e135\";\n}\n.glyphicon-wrench:before {\n  content: \"\\e136\";\n}\n.glyphicon-tasks:before {\n  content: \"\\e137\";\n}\n.glyphicon-filter:before {\n  content: \"\\e138\";\n}\n.glyphicon-briefcase:before {\n  content: \"\\e139\";\n}\n.glyphicon-fullscreen:before {\n  content: \"\\e140\";\n}\n.glyphicon-dashboard:before {\n  content: \"\\e141\";\n}\n.glyphicon-paperclip:before {\n  content: \"\\e142\";\n}\n.glyphicon-heart-empty:before {\n  content: \"\\e143\";\n}\n.glyphicon-link:before {\n  content: \"\\e144\";\n}\n.glyphicon-phone:before {\n  content: \"\\e145\";\n}\n.glyphicon-pushpin:before {\n  content: \"\\e146\";\n}\n.glyphicon-usd:before {\n  content: \"\\e148\";\n}\n.glyphicon-gbp:before {\n  content: \"\\e149\";\n}\n.glyphicon-sort:before {\n  content: \"\\e150\";\n}\n.glyphicon-sort-by-alphabet:before {\n  content: \"\\e151\";\n}\n.glyphicon-sort-by-alphabet-alt:before {\n  content: \"\\e152\";\n}\n.glyphicon-sort-by-order:before {\n  content: \"\\e153\";\n}\n.glyphicon-sort-by-order-alt:before {\n  content: \"\\e154\";\n}\n.glyphicon-sort-by-attributes:before {\n  content: \"\\e155\";\n}\n.glyphicon-sort-by-attributes-alt:before {\n  content: \"\\e156\";\n}\n.glyphicon-unchecked:before {\n  content: \"\\e157\";\n}\n.glyphicon-expand:before {\n  content: \"\\e158\";\n}\n.glyphicon-collapse-down:before {\n  content: \"\\e159\";\n}\n.glyphicon-collapse-up:before {\n  content: \"\\e160\";\n}\n.glyphicon-log-in:before {\n  content: \"\\e161\";\n}\n.glyphicon-flash:before {\n  content: \"\\e162\";\n}\n.glyphicon-log-out:before {\n  content: \"\\e163\";\n}\n.glyphicon-new-window:before {\n  content: \"\\e164\";\n}\n.glyphicon-record:before {\n  content: \"\\e165\";\n}\n.glyphicon-save:before {\n  content: \"\\e166\";\n}\n.glyphicon-open:before {\n  content: \"\\e167\";\n}\n.glyphicon-saved:before {\n  content: \"\\e168\";\n}\n.glyphicon-import:before {\n  content: \"\\e169\";\n}\n.glyphicon-export:before {\n  content: \"\\e170\";\n}\n.glyphicon-send:before {\n  content: \"\\e171\";\n}\n.glyphicon-floppy-disk:before {\n  content: \"\\e172\";\n}\n.glyphicon-floppy-saved:before {\n  content: \"\\e173\";\n}\n.glyphicon-floppy-remove:before {\n  content: \"\\e174\";\n}\n.glyphicon-floppy-save:before {\n  content: \"\\e175\";\n}\n.glyphicon-floppy-open:before {\n  content: \"\\e176\";\n}\n.glyphicon-credit-card:before {\n  content: \"\\e177\";\n}\n.glyphicon-transfer:before {\n  content: \"\\e178\";\n}\n.glyphicon-cutlery:before {\n  content: \"\\e179\";\n}\n.glyphicon-header:before {\n  content: \"\\e180\";\n}\n.glyphicon-compressed:before {\n  content: \"\\e181\";\n}\n.glyphicon-earphone:before {\n  content: \"\\e182\";\n}\n.glyphicon-phone-alt:before {\n  content: \"\\e183\";\n}\n.glyphicon-tower:before {\n  content: \"\\e184\";\n}\n.glyphicon-stats:before {\n  content: \"\\e185\";\n}\n.glyphicon-sd-video:before {\n  content: \"\\e186\";\n}\n.glyphicon-hd-video:before {\n  content: \"\\e187\";\n}\n.glyphicon-subtitles:before {\n  content: \"\\e188\";\n}\n.glyphicon-sound-stereo:before {\n  content: \"\\e189\";\n}\n.glyphicon-sound-dolby:before {\n  content: \"\\e190\";\n}\n.glyphicon-sound-5-1:before {\n  content: \"\\e191\";\n}\n.glyphicon-sound-6-1:before {\n  content: \"\\e192\";\n}\n.glyphicon-sound-7-1:before {\n  content: \"\\e193\";\n}\n.glyphicon-copyright-mark:before {\n  content: \"\\e194\";\n}\n.glyphicon-registration-mark:before {\n  content: \"\\e195\";\n}\n.glyphicon-cloud-download:before {\n  content: \"\\e197\";\n}\n.glyphicon-cloud-upload:before {\n  content: \"\\e198\";\n}\n.glyphicon-tree-conifer:before {\n  content: \"\\e199\";\n}\n.glyphicon-tree-deciduous:before {\n  content: \"\\e200\";\n}\n* {\n  -webkit-box-sizing: border-box;\n  -moz-box-sizing: border-box;\n  box-sizing: border-box;\n}\n*:before,\n*:after {\n  -webkit-box-sizing: border-box;\n  -moz-box-sizing: border-box;\n  box-sizing: border-box;\n}\nhtml {\n  font-size: 10px;\n  -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n}\nbody {\n  font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n  font-size: 14px;\n  line-height: 1.42857143;\n  color: #333333;\n  background-color: #ffffff;\n}\ninput,\nbutton,\nselect,\ntextarea {\n  font-family: inherit;\n  font-size: inherit;\n  line-height: inherit;\n}\na {\n  color: #4CAF50;\n  text-decoration: none;\n}\na:hover,\na:focus {\n  color: #357a38;\n  text-decoration: underline;\n}\na:focus {\n  outline: thin dotted;\n  outline: 5px auto -webkit-focus-ring-color;\n  outline-offset: -2px;\n}\nfigure {\n  margin: 0;\n}\nimg {\n  vertical-align: middle;\n}\n.img-responsive,\n.thumbnail > img,\n.thumbnail a > img,\n.carousel-inner > .item > img,\n.carousel-inner > .item > a > img {\n  display: block;\n  max-width: 100%;\n  height: auto;\n}\n.img-rounded {\n  border-radius: 6px;\n}\n.img-thumbnail {\n  padding: 4px;\n  line-height: 1.42857143;\n  background-color: #ffffff;\n  border: 1px solid #ddd;\n  border-radius: 4px;\n  -webkit-transition: all 0.2s ease-in-out;\n  -o-transition: all 0.2s ease-in-out;\n  transition: all 0.2s ease-in-out;\n  display: inline-block;\n  max-width: 100%;\n  height: auto;\n}\n.img-circle {\n  border-radius: 50%;\n}\nhr {\n  margin-top: 20px;\n  margin-bottom: 20px;\n  border: 0;\n  border-top: 1px solid #eeeeee;\n}\n.sr-only {\n  position: absolute;\n  width: 1px;\n  height: 1px;\n  margin: -1px;\n  padding: 0;\n  overflow: hidden;\n  clip: rect(0, 0, 0, 0);\n  border: 0;\n}\n.sr-only-focusable:active,\n.sr-only-focusable:focus {\n  position: static;\n  width: auto;\n  height: auto;\n  margin: 0;\n  overflow: visible;\n  clip: auto;\n}\nh1,\nh2,\nh3,\nh4,\nh5,\nh6,\n.h1,\n.h2,\n.h3,\n.h4,\n.h5,\n.h6 {\n  font-family: inherit;\n  font-weight: 500;\n  line-height: 1.1;\n  color: inherit;\n}\nh1 small,\nh2 small,\nh3 small,\nh4 small,\nh5 small,\nh6 small,\n.h1 small,\n.h2 small,\n.h3 small,\n.h4 small,\n.h5 small,\n.h6 small,\nh1 .small,\nh2 .small,\nh3 .small,\nh4 .small,\nh5 .small,\nh6 .small,\n.h1 .small,\n.h2 .small,\n.h3 .small,\n.h4 .small,\n.h5 .small,\n.h6 .small {\n  font-weight: normal;\n  line-height: 1;\n  color: #777777;\n}\nh1,\n.h1,\nh2,\n.h2,\nh3,\n.h3 {\n  margin-top: 20px;\n  margin-bottom: 10px;\n}\nh1 small,\n.h1 small,\nh2 small,\n.h2 small,\nh3 small,\n.h3 small,\nh1 .small,\n.h1 .small,\nh2 .small,\n.h2 .small,\nh3 .small,\n.h3 .small {\n  font-size: 65%;\n}\nh4,\n.h4,\nh5,\n.h5,\nh6,\n.h6 {\n  margin-top: 10px;\n  margin-bottom: 10px;\n}\nh4 small,\n.h4 small,\nh5 small,\n.h5 small,\nh6 small,\n.h6 small,\nh4 .small,\n.h4 .small,\nh5 .small,\n.h5 .small,\nh6 .small,\n.h6 .small {\n  font-size: 75%;\n}\nh1,\n.h1 {\n  font-size: 36px;\n}\nh2,\n.h2 {\n  font-size: 30px;\n}\nh3,\n.h3 {\n  font-size: 24px;\n}\nh4,\n.h4 {\n  font-size: 18px;\n}\nh5,\n.h5 {\n  font-size: 14px;\n}\nh6,\n.h6 {\n  font-size: 12px;\n}\np {\n  margin: 0 0 10px;\n}\n.lead {\n  margin-bottom: 20px;\n  font-size: 16px;\n  font-weight: 300;\n  line-height: 1.4;\n}\n@media (min-width: 768px) {\n  .lead {\n    font-size: 21px;\n  }\n}\nsmall,\n.small {\n  font-size: 85%;\n}\nmark,\n.mark {\n  background-color: #fcf8e3;\n  padding: .2em;\n}\n.text-left {\n  text-align: left;\n}\n.text-right {\n  text-align: right;\n}\n.text-center {\n  text-align: center;\n}\n.text-justify {\n  text-align: justify;\n}\n.text-nowrap {\n  white-space: nowrap;\n}\n.text-lowercase {\n  text-transform: lowercase;\n}\n.text-uppercase {\n  text-transform: uppercase;\n}\n.text-capitalize {\n  text-transform: capitalize;\n}\n.text-muted {\n  color: #777777;\n}\n.text-primary {\n  color: #4CAF50;\n}\na.text-primary:hover {\n  color: #3d8b40;\n}\n.text-success {\n  color: #215f1e;\n}\na.text-success:hover {\n  color: #143812;\n}\n.text-info {\n  color: #31708f;\n}\na.text-info:hover {\n  color: #245269;\n}\n.text-warning {\n  color: #8a6d3b;\n}\na.text-warning:hover {\n  color: #66512c;\n}\n.text-danger {\n  color: #a94442;\n}\na.text-danger:hover {\n  color: #843534;\n}\n.bg-primary {\n  color: #fff;\n  background-color: #4CAF50;\n}\na.bg-primary:hover {\n  background-color: #3d8b40;\n}\n.bg-success {\n  background-color: #dff0d8;\n}\na.bg-success:hover {\n  background-color: #c1e2b3;\n}\n.bg-info {\n  background-color: #d9edf7;\n}\na.bg-info:hover {\n  background-color: #afd9ee;\n}\n.bg-warning {\n  background-color: #fcf8e3;\n}\na.bg-warning:hover {\n  background-color: #f7ecb5;\n}\n.bg-danger {\n  background-color: #f2dede;\n}\na.bg-danger:hover {\n  background-color: #e4b9b9;\n}\n.page-header {\n  padding-bottom: 9px;\n  margin: 40px 0 20px;\n  border-bottom: 1px solid #eeeeee;\n}\nul,\nol {\n  margin-top: 0;\n  margin-bottom: 10px;\n}\nul ul,\nol ul,\nul ol,\nol ol {\n  margin-bottom: 0;\n}\n.list-unstyled {\n  padding-left: 0;\n  list-style: none;\n}\n.list-inline {\n  padding-left: 0;\n  list-style: none;\n  margin-left: -5px;\n}\n.list-inline > li {\n  display: inline-block;\n  padding-left: 5px;\n  padding-right: 5px;\n}\ndl {\n  margin-top: 0;\n  margin-bottom: 20px;\n}\ndt,\ndd {\n  line-height: 1.42857143;\n}\ndt {\n  font-weight: bold;\n}\ndd {\n  margin-left: 0;\n}\n@media (min-width: 768px) {\n  .dl-horizontal dt {\n    float: left;\n    width: 160px;\n    clear: left;\n    text-align: right;\n    overflow: hidden;\n    text-overflow: ellipsis;\n    white-space: nowrap;\n  }\n  .dl-horizontal dd {\n    margin-left: 180px;\n  }\n}\nabbr[title],\nabbr[data-original-title] {\n  cursor: help;\n  border-bottom: 1px dotted #777777;\n}\n.initialism {\n  font-size: 90%;\n  text-transform: uppercase;\n}\nblockquote {\n  padding: 10px 20px;\n  margin: 0 0 20px;\n  font-size: 17.5px;\n  border-left: 5px solid #eeeeee;\n}\nblockquote p:last-child,\nblockquote ul:last-child,\nblockquote ol:last-child {\n  margin-bottom: 0;\n}\nblockquote footer,\nblockquote small,\nblockquote .small {\n  display: block;\n  font-size: 80%;\n  line-height: 1.42857143;\n  color: #777777;\n}\nblockquote footer:before,\nblockquote small:before,\nblockquote .small:before {\n  content: '\\2014 \\00A0';\n}\n.blockquote-reverse,\nblockquote.pull-right {\n  padding-right: 15px;\n  padding-left: 0;\n  border-right: 5px solid #eeeeee;\n  border-left: 0;\n  text-align: right;\n}\n.blockquote-reverse footer:before,\nblockquote.pull-right footer:before,\n.blockquote-reverse small:before,\nblockquote.pull-right small:before,\n.blockquote-reverse .small:before,\nblockquote.pull-right .small:before {\n  content: '';\n}\n.blockquote-reverse footer:after,\nblockquote.pull-right footer:after,\n.blockquote-reverse small:after,\nblockquote.pull-right small:after,\n.blockquote-reverse .small:after,\nblockquote.pull-right .small:after {\n  content: '\\00A0 \\2014';\n}\naddress {\n  margin-bottom: 20px;\n  font-style: normal;\n  line-height: 1.42857143;\n}\ncode,\nkbd,\npre,\nsamp {\n  font-family: Menlo, Monaco, Consolas, \"Courier New\", monospace;\n}\ncode {\n  padding: 2px 4px;\n  font-size: 90%;\n  color: #c7254e;\n  background-color: #f9f2f4;\n  border-radius: 4px;\n}\nkbd {\n  padding: 2px 4px;\n  font-size: 90%;\n  color: #eeeeee;\n  background-color: #333;\n  border-radius: 3px;\n  box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.25);\n}\nkbd kbd {\n  padding: 0;\n  font-size: 100%;\n  font-weight: bold;\n  box-shadow: none;\n}\npre {\n  display: block;\n  padding: 9.5px;\n  margin: 0 0 10px;\n  font-size: 13px;\n  line-height: 1.42857143;\n  word-break: break-all;\n  word-wrap: break-word;\n  color: #333333;\n  background-color: #f5f5f5;\n  border: 1px solid #ccc;\n  border-radius: 4px;\n}\npre code {\n  padding: 0;\n  font-size: inherit;\n  color: inherit;\n  white-space: pre-wrap;\n  background-color: transparent;\n  border-radius: 0;\n}\n.pre-scrollable {\n  max-height: 340px;\n  overflow-y: scroll;\n}\n.container {\n  margin-right: auto;\n  margin-left: auto;\n  padding-left: 15px;\n  padding-right: 15px;\n}\n@media (min-width: 768px) {\n  .container {\n    width: 750px;\n  }\n}\n@media (min-width: 1031px) {\n  .container {\n    width: 970px;\n  }\n}\n@media (min-width: 1200px) {\n  .container {\n    width: 1170px;\n  }\n}\n.container-fluid {\n  margin-right: auto;\n  margin-left: auto;\n  padding-left: 15px;\n  padding-right: 15px;\n}\n.row {\n  margin-left: -15px;\n  margin-right: -15px;\n}\n.col-xs-1, .col-sm-1, .col-md-1, .col-lg-1, .col-xs-2, .col-sm-2, .col-md-2, .col-lg-2, .col-xs-3, .col-sm-3, .col-md-3, .col-lg-3, .col-xs-4, .col-sm-4, .col-md-4, .col-lg-4, .col-xs-5, .col-sm-5, .col-md-5, .col-lg-5, .col-xs-6, .col-sm-6, .col-md-6, .col-lg-6, .col-xs-7, .col-sm-7, .col-md-7, .col-lg-7, .col-xs-8, .col-sm-8, .col-md-8, .col-lg-8, .col-xs-9, .col-sm-9, .col-md-9, .col-lg-9, .col-xs-10, .col-sm-10, .col-md-10, .col-lg-10, .col-xs-11, .col-sm-11, .col-md-11, .col-lg-11, .col-xs-12, .col-sm-12, .col-md-12, .col-lg-12 {\n  position: relative;\n  min-height: 1px;\n  padding-left: 15px;\n  padding-right: 15px;\n}\n.col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12 {\n  float: left;\n}\n.col-xs-12 {\n  width: 100%;\n}\n.col-xs-11 {\n  width: 91.66666667%;\n}\n.col-xs-10 {\n  width: 83.33333333%;\n}\n.col-xs-9 {\n  width: 75%;\n}\n.col-xs-8 {\n  width: 66.66666667%;\n}\n.col-xs-7 {\n  width: 58.33333333%;\n}\n.col-xs-6 {\n  width: 50%;\n}\n.col-xs-5 {\n  width: 41.66666667%;\n}\n.col-xs-4 {\n  width: 33.33333333%;\n}\n.col-xs-3 {\n  width: 25%;\n}\n.col-xs-2 {\n  width: 16.66666667%;\n}\n.col-xs-1 {\n  width: 8.33333333%;\n}\n.col-xs-pull-12 {\n  right: 100%;\n}\n.col-xs-pull-11 {\n  right: 91.66666667%;\n}\n.col-xs-pull-10 {\n  right: 83.33333333%;\n}\n.col-xs-pull-9 {\n  right: 75%;\n}\n.col-xs-pull-8 {\n  right: 66.66666667%;\n}\n.col-xs-pull-7 {\n  right: 58.33333333%;\n}\n.col-xs-pull-6 {\n  right: 50%;\n}\n.col-xs-pull-5 {\n  right: 41.66666667%;\n}\n.col-xs-pull-4 {\n  right: 33.33333333%;\n}\n.col-xs-pull-3 {\n  right: 25%;\n}\n.col-xs-pull-2 {\n  right: 16.66666667%;\n}\n.col-xs-pull-1 {\n  right: 8.33333333%;\n}\n.col-xs-pull-0 {\n  right: auto;\n}\n.col-xs-push-12 {\n  left: 100%;\n}\n.col-xs-push-11 {\n  left: 91.66666667%;\n}\n.col-xs-push-10 {\n  left: 83.33333333%;\n}\n.col-xs-push-9 {\n  left: 75%;\n}\n.col-xs-push-8 {\n  left: 66.66666667%;\n}\n.col-xs-push-7 {\n  left: 58.33333333%;\n}\n.col-xs-push-6 {\n  left: 50%;\n}\n.col-xs-push-5 {\n  left: 41.66666667%;\n}\n.col-xs-push-4 {\n  left: 33.33333333%;\n}\n.col-xs-push-3 {\n  left: 25%;\n}\n.col-xs-push-2 {\n  left: 16.66666667%;\n}\n.col-xs-push-1 {\n  left: 8.33333333%;\n}\n.col-xs-push-0 {\n  left: auto;\n}\n.col-xs-offset-12 {\n  margin-left: 100%;\n}\n.col-xs-offset-11 {\n  margin-left: 91.66666667%;\n}\n.col-xs-offset-10 {\n  margin-left: 83.33333333%;\n}\n.col-xs-offset-9 {\n  margin-left: 75%;\n}\n.col-xs-offset-8 {\n  margin-left: 66.66666667%;\n}\n.col-xs-offset-7 {\n  margin-left: 58.33333333%;\n}\n.col-xs-offset-6 {\n  margin-left: 50%;\n}\n.col-xs-offset-5 {\n  margin-left: 41.66666667%;\n}\n.col-xs-offset-4 {\n  margin-left: 33.33333333%;\n}\n.col-xs-offset-3 {\n  margin-left: 25%;\n}\n.col-xs-offset-2 {\n  margin-left: 16.66666667%;\n}\n.col-xs-offset-1 {\n  margin-left: 8.33333333%;\n}\n.col-xs-offset-0 {\n  margin-left: 0%;\n}\n@media (min-width: 768px) {\n  .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12 {\n    float: left;\n  }\n  .col-sm-12 {\n    width: 100%;\n  }\n  .col-sm-11 {\n    width: 91.66666667%;\n  }\n  .col-sm-10 {\n    width: 83.33333333%;\n  }\n  .col-sm-9 {\n    width: 75%;\n  }\n  .col-sm-8 {\n    width: 66.66666667%;\n  }\n  .col-sm-7 {\n    width: 58.33333333%;\n  }\n  .col-sm-6 {\n    width: 50%;\n  }\n  .col-sm-5 {\n    width: 41.66666667%;\n  }\n  .col-sm-4 {\n    width: 33.33333333%;\n  }\n  .col-sm-3 {\n    width: 25%;\n  }\n  .col-sm-2 {\n    width: 16.66666667%;\n  }\n  .col-sm-1 {\n    width: 8.33333333%;\n  }\n  .col-sm-pull-12 {\n    right: 100%;\n  }\n  .col-sm-pull-11 {\n    right: 91.66666667%;\n  }\n  .col-sm-pull-10 {\n    right: 83.33333333%;\n  }\n  .col-sm-pull-9 {\n    right: 75%;\n  }\n  .col-sm-pull-8 {\n    right: 66.66666667%;\n  }\n  .col-sm-pull-7 {\n    right: 58.33333333%;\n  }\n  .col-sm-pull-6 {\n    right: 50%;\n  }\n  .col-sm-pull-5 {\n    right: 41.66666667%;\n  }\n  .col-sm-pull-4 {\n    right: 33.33333333%;\n  }\n  .col-sm-pull-3 {\n    right: 25%;\n  }\n  .col-sm-pull-2 {\n    right: 16.66666667%;\n  }\n  .col-sm-pull-1 {\n    right: 8.33333333%;\n  }\n  .col-sm-pull-0 {\n    right: auto;\n  }\n  .col-sm-push-12 {\n    left: 100%;\n  }\n  .col-sm-push-11 {\n    left: 91.66666667%;\n  }\n  .col-sm-push-10 {\n    left: 83.33333333%;\n  }\n  .col-sm-push-9 {\n    left: 75%;\n  }\n  .col-sm-push-8 {\n    left: 66.66666667%;\n  }\n  .col-sm-push-7 {\n    left: 58.33333333%;\n  }\n  .col-sm-push-6 {\n    left: 50%;\n  }\n  .col-sm-push-5 {\n    left: 41.66666667%;\n  }\n  .col-sm-push-4 {\n    left: 33.33333333%;\n  }\n  .col-sm-push-3 {\n    left: 25%;\n  }\n  .col-sm-push-2 {\n    left: 16.66666667%;\n  }\n  .col-sm-push-1 {\n    left: 8.33333333%;\n  }\n  .col-sm-push-0 {\n    left: auto;\n  }\n  .col-sm-offset-12 {\n    margin-left: 100%;\n  }\n  .col-sm-offset-11 {\n    margin-left: 91.66666667%;\n  }\n  .col-sm-offset-10 {\n    margin-left: 83.33333333%;\n  }\n  .col-sm-offset-9 {\n    margin-left: 75%;\n  }\n  .col-sm-offset-8 {\n    margin-left: 66.66666667%;\n  }\n  .col-sm-offset-7 {\n    margin-left: 58.33333333%;\n  }\n  .col-sm-offset-6 {\n    margin-left: 50%;\n  }\n  .col-sm-offset-5 {\n    margin-left: 41.66666667%;\n  }\n  .col-sm-offset-4 {\n    margin-left: 33.33333333%;\n  }\n  .col-sm-offset-3 {\n    margin-left: 25%;\n  }\n  .col-sm-offset-2 {\n    margin-left: 16.66666667%;\n  }\n  .col-sm-offset-1 {\n    margin-left: 8.33333333%;\n  }\n  .col-sm-offset-0 {\n    margin-left: 0%;\n  }\n}\n@media (min-width: 1031px) {\n  .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12 {\n    float: left;\n  }\n  .col-md-12 {\n    width: 100%;\n  }\n  .col-md-11 {\n    width: 91.66666667%;\n  }\n  .col-md-10 {\n    width: 83.33333333%;\n  }\n  .col-md-9 {\n    width: 75%;\n  }\n  .col-md-8 {\n    width: 66.66666667%;\n  }\n  .col-md-7 {\n    width: 58.33333333%;\n  }\n  .col-md-6 {\n    width: 50%;\n  }\n  .col-md-5 {\n    width: 41.66666667%;\n  }\n  .col-md-4 {\n    width: 33.33333333%;\n  }\n  .col-md-3 {\n    width: 25%;\n  }\n  .col-md-2 {\n    width: 16.66666667%;\n  }\n  .col-md-1 {\n    width: 8.33333333%;\n  }\n  .col-md-pull-12 {\n    right: 100%;\n  }\n  .col-md-pull-11 {\n    right: 91.66666667%;\n  }\n  .col-md-pull-10 {\n    right: 83.33333333%;\n  }\n  .col-md-pull-9 {\n    right: 75%;\n  }\n  .col-md-pull-8 {\n    right: 66.66666667%;\n  }\n  .col-md-pull-7 {\n    right: 58.33333333%;\n  }\n  .col-md-pull-6 {\n    right: 50%;\n  }\n  .col-md-pull-5 {\n    right: 41.66666667%;\n  }\n  .col-md-pull-4 {\n    right: 33.33333333%;\n  }\n  .col-md-pull-3 {\n    right: 25%;\n  }\n  .col-md-pull-2 {\n    right: 16.66666667%;\n  }\n  .col-md-pull-1 {\n    right: 8.33333333%;\n  }\n  .col-md-pull-0 {\n    right: auto;\n  }\n  .col-md-push-12 {\n    left: 100%;\n  }\n  .col-md-push-11 {\n    left: 91.66666667%;\n  }\n  .col-md-push-10 {\n    left: 83.33333333%;\n  }\n  .col-md-push-9 {\n    left: 75%;\n  }\n  .col-md-push-8 {\n    left: 66.66666667%;\n  }\n  .col-md-push-7 {\n    left: 58.33333333%;\n  }\n  .col-md-push-6 {\n    left: 50%;\n  }\n  .col-md-push-5 {\n    left: 41.66666667%;\n  }\n  .col-md-push-4 {\n    left: 33.33333333%;\n  }\n  .col-md-push-3 {\n    left: 25%;\n  }\n  .col-md-push-2 {\n    left: 16.66666667%;\n  }\n  .col-md-push-1 {\n    left: 8.33333333%;\n  }\n  .col-md-push-0 {\n    left: auto;\n  }\n  .col-md-offset-12 {\n    margin-left: 100%;\n  }\n  .col-md-offset-11 {\n    margin-left: 91.66666667%;\n  }\n  .col-md-offset-10 {\n    margin-left: 83.33333333%;\n  }\n  .col-md-offset-9 {\n    margin-left: 75%;\n  }\n  .col-md-offset-8 {\n    margin-left: 66.66666667%;\n  }\n  .col-md-offset-7 {\n    margin-left: 58.33333333%;\n  }\n  .col-md-offset-6 {\n    margin-left: 50%;\n  }\n  .col-md-offset-5 {\n    margin-left: 41.66666667%;\n  }\n  .col-md-offset-4 {\n    margin-left: 33.33333333%;\n  }\n  .col-md-offset-3 {\n    margin-left: 25%;\n  }\n  .col-md-offset-2 {\n    margin-left: 16.66666667%;\n  }\n  .col-md-offset-1 {\n    margin-left: 8.33333333%;\n  }\n  .col-md-offset-0 {\n    margin-left: 0%;\n  }\n}\n@media (min-width: 1200px) {\n  .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12 {\n    float: left;\n  }\n  .col-lg-12 {\n    width: 100%;\n  }\n  .col-lg-11 {\n    width: 91.66666667%;\n  }\n  .col-lg-10 {\n    width: 83.33333333%;\n  }\n  .col-lg-9 {\n    width: 75%;\n  }\n  .col-lg-8 {\n    width: 66.66666667%;\n  }\n  .col-lg-7 {\n    width: 58.33333333%;\n  }\n  .col-lg-6 {\n    width: 50%;\n  }\n  .col-lg-5 {\n    width: 41.66666667%;\n  }\n  .col-lg-4 {\n    width: 33.33333333%;\n  }\n  .col-lg-3 {\n    width: 25%;\n  }\n  .col-lg-2 {\n    width: 16.66666667%;\n  }\n  .col-lg-1 {\n    width: 8.33333333%;\n  }\n  .col-lg-pull-12 {\n    right: 100%;\n  }\n  .col-lg-pull-11 {\n    right: 91.66666667%;\n  }\n  .col-lg-pull-10 {\n    right: 83.33333333%;\n  }\n  .col-lg-pull-9 {\n    right: 75%;\n  }\n  .col-lg-pull-8 {\n    right: 66.66666667%;\n  }\n  .col-lg-pull-7 {\n    right: 58.33333333%;\n  }\n  .col-lg-pull-6 {\n    right: 50%;\n  }\n  .col-lg-pull-5 {\n    right: 41.66666667%;\n  }\n  .col-lg-pull-4 {\n    right: 33.33333333%;\n  }\n  .col-lg-pull-3 {\n    right: 25%;\n  }\n  .col-lg-pull-2 {\n    right: 16.66666667%;\n  }\n  .col-lg-pull-1 {\n    right: 8.33333333%;\n  }\n  .col-lg-pull-0 {\n    right: auto;\n  }\n  .col-lg-push-12 {\n    left: 100%;\n  }\n  .col-lg-push-11 {\n    left: 91.66666667%;\n  }\n  .col-lg-push-10 {\n    left: 83.33333333%;\n  }\n  .col-lg-push-9 {\n    left: 75%;\n  }\n  .col-lg-push-8 {\n    left: 66.66666667%;\n  }\n  .col-lg-push-7 {\n    left: 58.33333333%;\n  }\n  .col-lg-push-6 {\n    left: 50%;\n  }\n  .col-lg-push-5 {\n    left: 41.66666667%;\n  }\n  .col-lg-push-4 {\n    left: 33.33333333%;\n  }\n  .col-lg-push-3 {\n    left: 25%;\n  }\n  .col-lg-push-2 {\n    left: 16.66666667%;\n  }\n  .col-lg-push-1 {\n    left: 8.33333333%;\n  }\n  .col-lg-push-0 {\n    left: auto;\n  }\n  .col-lg-offset-12 {\n    margin-left: 100%;\n  }\n  .col-lg-offset-11 {\n    margin-left: 91.66666667%;\n  }\n  .col-lg-offset-10 {\n    margin-left: 83.33333333%;\n  }\n  .col-lg-offset-9 {\n    margin-left: 75%;\n  }\n  .col-lg-offset-8 {\n    margin-left: 66.66666667%;\n  }\n  .col-lg-offset-7 {\n    margin-left: 58.33333333%;\n  }\n  .col-lg-offset-6 {\n    margin-left: 50%;\n  }\n  .col-lg-offset-5 {\n    margin-left: 41.66666667%;\n  }\n  .col-lg-offset-4 {\n    margin-left: 33.33333333%;\n  }\n  .col-lg-offset-3 {\n    margin-left: 25%;\n  }\n  .col-lg-offset-2 {\n    margin-left: 16.66666667%;\n  }\n  .col-lg-offset-1 {\n    margin-left: 8.33333333%;\n  }\n  .col-lg-offset-0 {\n    margin-left: 0%;\n  }\n}\ntable {\n  background-color: transparent;\n}\ncaption {\n  padding-top: 8px;\n  padding-bottom: 8px;\n  color: #777777;\n  text-align: left;\n}\nth {\n  text-align: left;\n}\n.table {\n  width: 100%;\n  max-width: 100%;\n  margin-bottom: 20px;\n}\n.table > thead > tr > th,\n.table > tbody > tr > th,\n.table > tfoot > tr > th,\n.table > thead > tr > td,\n.table > tbody > tr > td,\n.table > tfoot > tr > td {\n  padding: 8px;\n  line-height: 1.42857143;\n  vertical-align: top;\n  border-top: 1px solid #ddd;\n}\n.table > thead > tr > th {\n  vertical-align: bottom;\n  border-bottom: 2px solid #ddd;\n}\n.table > caption + thead > tr:first-child > th,\n.table > colgroup + thead > tr:first-child > th,\n.table > thead:first-child > tr:first-child > th,\n.table > caption + thead > tr:first-child > td,\n.table > colgroup + thead > tr:first-child > td,\n.table > thead:first-child > tr:first-child > td {\n  border-top: 0;\n}\n.table > tbody + tbody {\n  border-top: 2px solid #ddd;\n}\n.table .table {\n  background-color: #ffffff;\n}\n.table-condensed > thead > tr > th,\n.table-condensed > tbody > tr > th,\n.table-condensed > tfoot > tr > th,\n.table-condensed > thead > tr > td,\n.table-condensed > tbody > tr > td,\n.table-condensed > tfoot > tr > td {\n  padding: 5px;\n}\n.table-bordered {\n  border: 1px solid #ddd;\n}\n.table-bordered > thead > tr > th,\n.table-bordered > tbody > tr > th,\n.table-bordered > tfoot > tr > th,\n.table-bordered > thead > tr > td,\n.table-bordered > tbody > tr > td,\n.table-bordered > tfoot > tr > td {\n  border: 1px solid #ddd;\n}\n.table-bordered > thead > tr > th,\n.table-bordered > thead > tr > td {\n  border-bottom-width: 2px;\n}\n.table-striped > tbody > tr:nth-child(odd) {\n  background-color: #f9f9f9;\n}\n.table-hover > tbody > tr:hover {\n  background-color: #f5f5f5;\n}\ntable col[class*=\"col-\"] {\n  position: static;\n  float: none;\n  display: table-column;\n}\ntable td[class*=\"col-\"],\ntable th[class*=\"col-\"] {\n  position: static;\n  float: none;\n  display: table-cell;\n}\n.table > thead > tr > td.active,\n.table > tbody > tr > td.active,\n.table > tfoot > tr > td.active,\n.table > thead > tr > th.active,\n.table > tbody > tr > th.active,\n.table > tfoot > tr > th.active,\n.table > thead > tr.active > td,\n.table > tbody > tr.active > td,\n.table > tfoot > tr.active > td,\n.table > thead > tr.active > th,\n.table > tbody > tr.active > th,\n.table > tfoot > tr.active > th {\n  background-color: #f5f5f5;\n}\n.table-hover > tbody > tr > td.active:hover,\n.table-hover > tbody > tr > th.active:hover,\n.table-hover > tbody > tr.active:hover > td,\n.table-hover > tbody > tr:hover > .active,\n.table-hover > tbody > tr.active:hover > th {\n  background-color: #e8e8e8;\n}\n.table > thead > tr > td.success,\n.table > tbody > tr > td.success,\n.table > tfoot > tr > td.success,\n.table > thead > tr > th.success,\n.table > tbody > tr > th.success,\n.table > tfoot > tr > th.success,\n.table > thead > tr.success > td,\n.table > tbody > tr.success > td,\n.table > tfoot > tr.success > td,\n.table > thead > tr.success > th,\n.table > tbody > tr.success > th,\n.table > tfoot > tr.success > th {\n  background-color: #dff0d8;\n}\n.table-hover > tbody > tr > td.success:hover,\n.table-hover > tbody > tr > th.success:hover,\n.table-hover > tbody > tr.success:hover > td,\n.table-hover > tbody > tr:hover > .success,\n.table-hover > tbody > tr.success:hover > th {\n  background-color: #d0e9c6;\n}\n.table > thead > tr > td.info,\n.table > tbody > tr > td.info,\n.table > tfoot > tr > td.info,\n.table > thead > tr > th.info,\n.table > tbody > tr > th.info,\n.table > tfoot > tr > th.info,\n.table > thead > tr.info > td,\n.table > tbody > tr.info > td,\n.table > tfoot > tr.info > td,\n.table > thead > tr.info > th,\n.table > tbody > tr.info > th,\n.table > tfoot > tr.info > th {\n  background-color: #d9edf7;\n}\n.table-hover > tbody > tr > td.info:hover,\n.table-hover > tbody > tr > th.info:hover,\n.table-hover > tbody > tr.info:hover > td,\n.table-hover > tbody > tr:hover > .info,\n.table-hover > tbody > tr.info:hover > th {\n  background-color: #c4e3f3;\n}\n.table > thead > tr > td.warning,\n.table > tbody > tr > td.warning,\n.table > tfoot > tr > td.warning,\n.table > thead > tr > th.warning,\n.table > tbody > tr > th.warning,\n.table > tfoot > tr > th.warning,\n.table > thead > tr.warning > td,\n.table > tbody > tr.warning > td,\n.table > tfoot > tr.warning > td,\n.table > thead > tr.warning > th,\n.table > tbody > tr.warning > th,\n.table > tfoot > tr.warning > th {\n  background-color: #fcf8e3;\n}\n.table-hover > tbody > tr > td.warning:hover,\n.table-hover > tbody > tr > th.warning:hover,\n.table-hover > tbody > tr.warning:hover > td,\n.table-hover > tbody > tr:hover > .warning,\n.table-hover > tbody > tr.warning:hover > th {\n  background-color: #faf2cc;\n}\n.table > thead > tr > td.danger,\n.table > tbody > tr > td.danger,\n.table > tfoot > tr > td.danger,\n.table > thead > tr > th.danger,\n.table > tbody > tr > th.danger,\n.table > tfoot > tr > th.danger,\n.table > thead > tr.danger > td,\n.table > tbody > tr.danger > td,\n.table > tfoot > tr.danger > td,\n.table > thead > tr.danger > th,\n.table > tbody > tr.danger > th,\n.table > tfoot > tr.danger > th {\n  background-color: #f2dede;\n}\n.table-hover > tbody > tr > td.danger:hover,\n.table-hover > tbody > tr > th.danger:hover,\n.table-hover > tbody > tr.danger:hover > td,\n.table-hover > tbody > tr:hover > .danger,\n.table-hover > tbody > tr.danger:hover > th {\n  background-color: #ebcccc;\n}\n.table-responsive {\n  overflow-x: auto;\n  min-height: 0.01%;\n}\n@media screen and (max-width: 767px) {\n  .table-responsive {\n    width: 100%;\n    margin-bottom: 15px;\n    overflow-y: hidden;\n    -ms-overflow-style: -ms-autohiding-scrollbar;\n    border: 1px solid #ddd;\n  }\n  .table-responsive > .table {\n    margin-bottom: 0;\n  }\n  .table-responsive > .table > thead > tr > th,\n  .table-responsive > .table > tbody > tr > th,\n  .table-responsive > .table > tfoot > tr > th,\n  .table-responsive > .table > thead > tr > td,\n  .table-responsive > .table > tbody > tr > td,\n  .table-responsive > .table > tfoot > tr > td {\n    white-space: nowrap;\n  }\n  .table-responsive > .table-bordered {\n    border: 0;\n  }\n  .table-responsive > .table-bordered > thead > tr > th:first-child,\n  .table-responsive > .table-bordered > tbody > tr > th:first-child,\n  .table-responsive > .table-bordered > tfoot > tr > th:first-child,\n  .table-responsive > .table-bordered > thead > tr > td:first-child,\n  .table-responsive > .table-bordered > tbody > tr > td:first-child,\n  .table-responsive > .table-bordered > tfoot > tr > td:first-child {\n    border-left: 0;\n  }\n  .table-responsive > .table-bordered > thead > tr > th:last-child,\n  .table-responsive > .table-bordered > tbody > tr > th:last-child,\n  .table-responsive > .table-bordered > tfoot > tr > th:last-child,\n  .table-responsive > .table-bordered > thead > tr > td:last-child,\n  .table-responsive > .table-bordered > tbody > tr > td:last-child,\n  .table-responsive > .table-bordered > tfoot > tr > td:last-child {\n    border-right: 0;\n  }\n  .table-responsive > .table-bordered > tbody > tr:last-child > th,\n  .table-responsive > .table-bordered > tfoot > tr:last-child > th,\n  .table-responsive > .table-bordered > tbody > tr:last-child > td,\n  .table-responsive > .table-bordered > tfoot > tr:last-child > td {\n    border-bottom: 0;\n  }\n}\nfieldset {\n  padding: 0;\n  margin: 0;\n  border: 0;\n  min-width: 0;\n}\nlegend {\n  display: block;\n  width: 100%;\n  padding: 0;\n  margin-bottom: 20px;\n  font-size: 21px;\n  line-height: inherit;\n  color: #333333;\n  border: 0;\n  border-bottom: 1px solid #e5e5e5;\n}\nlabel {\n  display: inline-block;\n  max-width: 100%;\n  margin-bottom: 5px;\n  font-weight: bold;\n}\ninput[type=\"search\"] {\n  -webkit-box-sizing: border-box;\n  -moz-box-sizing: border-box;\n  box-sizing: border-box;\n}\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n  margin: 4px 0 0;\n  margin-top: 1px \\9;\n  line-height: normal;\n}\ninput[type=\"file\"] {\n  display: block;\n}\ninput[type=\"range\"] {\n  display: block;\n  width: 100%;\n}\nselect[multiple],\nselect[size] {\n  height: auto;\n}\ninput[type=\"file\"]:focus,\ninput[type=\"radio\"]:focus,\ninput[type=\"checkbox\"]:focus {\n  outline: thin dotted;\n  outline: 5px auto -webkit-focus-ring-color;\n  outline-offset: -2px;\n}\noutput {\n  display: block;\n  padding-top: 7px;\n  font-size: 14px;\n  line-height: 1.42857143;\n  color: #555555;\n}\n.form-control {\n  display: block;\n  width: 100%;\n  height: 34px;\n  padding: 6px 12px;\n  font-size: 14px;\n  line-height: 1.42857143;\n  color: #555555;\n  background-color: #eeeeee;\n  background-image: none;\n  border: 1px solid #ccc;\n  border-radius: 4px;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n  -webkit-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;\n  -o-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;\n  transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;\n}\n.form-control:focus {\n  border-color: #66afe9;\n  outline: 0;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6);\n  box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6);\n}\n.form-control::-moz-placeholder {\n  color: #999;\n  opacity: 1;\n}\n.form-control:-ms-input-placeholder {\n  color: #999;\n}\n.form-control::-webkit-input-placeholder {\n  color: #999;\n}\n.form-control[disabled],\n.form-control[readonly],\nfieldset[disabled] .form-control {\n  cursor: not-allowed;\n  background-color: #eeeeee;\n  opacity: 1;\n}\ntextarea.form-control {\n  height: auto;\n}\ninput[type=\"search\"] {\n  -webkit-appearance: none;\n}\ninput[type=\"date\"],\ninput[type=\"time\"],\ninput[type=\"datetime-local\"],\ninput[type=\"month\"] {\n  line-height: 34px;\n  line-height: 1.42857143 \\0;\n}\ninput[type=\"date\"].input-sm,\ninput[type=\"time\"].input-sm,\ninput[type=\"datetime-local\"].input-sm,\ninput[type=\"month\"].input-sm {\n  line-height: 30px;\n  line-height: 1.5 \\0;\n}\ninput[type=\"date\"].input-lg,\ninput[type=\"time\"].input-lg,\ninput[type=\"datetime-local\"].input-lg,\ninput[type=\"month\"].input-lg {\n  line-height: 46px;\n  line-height: 1.33 \\0;\n}\n_:-ms-fullscreen,\n:root input[type=\"date\"],\n_:-ms-fullscreen,\n:root input[type=\"time\"],\n_:-ms-fullscreen,\n:root input[type=\"datetime-local\"],\n_:-ms-fullscreen,\n:root input[type=\"month\"] {\n  line-height: 1.42857143;\n}\n_:-ms-fullscreen.input-sm,\n:root input[type=\"date\"].input-sm,\n_:-ms-fullscreen.input-sm,\n:root input[type=\"time\"].input-sm,\n_:-ms-fullscreen.input-sm,\n:root input[type=\"datetime-local\"].input-sm,\n_:-ms-fullscreen.input-sm,\n:root input[type=\"month\"].input-sm {\n  line-height: 1.5;\n}\n_:-ms-fullscreen.input-lg,\n:root input[type=\"date\"].input-lg,\n_:-ms-fullscreen.input-lg,\n:root input[type=\"time\"].input-lg,\n_:-ms-fullscreen.input-lg,\n:root input[type=\"datetime-local\"].input-lg,\n_:-ms-fullscreen.input-lg,\n:root input[type=\"month\"].input-lg {\n  line-height: 1.33;\n}\n.form-group {\n  margin-bottom: 15px;\n}\n.radio,\n.checkbox {\n  position: relative;\n  display: block;\n  margin-top: 10px;\n  margin-bottom: 10px;\n}\n.radio label,\n.checkbox label {\n  min-height: 20px;\n  padding-left: 20px;\n  margin-bottom: 0;\n  font-weight: normal;\n  cursor: pointer;\n}\n.radio input[type=\"radio\"],\n.radio-inline input[type=\"radio\"],\n.checkbox input[type=\"checkbox\"],\n.checkbox-inline input[type=\"checkbox\"] {\n  position: absolute;\n  margin-left: -20px;\n  margin-top: 4px \\9;\n}\n.radio + .radio,\n.checkbox + .checkbox {\n  margin-top: -5px;\n}\n.radio-inline,\n.checkbox-inline {\n  display: inline-block;\n  padding-left: 20px;\n  margin-bottom: 0;\n  vertical-align: middle;\n  font-weight: normal;\n  cursor: pointer;\n}\n.radio-inline + .radio-inline,\n.checkbox-inline + .checkbox-inline {\n  margin-top: 0;\n  margin-left: 10px;\n}\ninput[type=\"radio\"][disabled],\ninput[type=\"checkbox\"][disabled],\ninput[type=\"radio\"].disabled,\ninput[type=\"checkbox\"].disabled,\nfieldset[disabled] input[type=\"radio\"],\nfieldset[disabled] input[type=\"checkbox\"] {\n  cursor: not-allowed;\n}\n.radio-inline.disabled,\n.checkbox-inline.disabled,\nfieldset[disabled] .radio-inline,\nfieldset[disabled] .checkbox-inline {\n  cursor: not-allowed;\n}\n.radio.disabled label,\n.checkbox.disabled label,\nfieldset[disabled] .radio label,\nfieldset[disabled] .checkbox label {\n  cursor: not-allowed;\n}\n.form-control-static {\n  padding-top: 7px;\n  padding-bottom: 7px;\n  margin-bottom: 0;\n}\n.form-control-static.input-lg,\n.form-control-static.input-sm {\n  padding-left: 0;\n  padding-right: 0;\n}\n.input-sm,\n.form-group-sm .form-control {\n  height: 30px;\n  padding: 5px 10px;\n  font-size: 12px;\n  line-height: 1.5;\n  border-radius: 3px;\n}\nselect.input-sm,\nselect.form-group-sm .form-control {\n  height: 30px;\n  line-height: 30px;\n}\ntextarea.input-sm,\ntextarea.form-group-sm .form-control,\nselect[multiple].input-sm,\nselect[multiple].form-group-sm .form-control {\n  height: auto;\n}\n.input-lg,\n.form-group-lg .form-control {\n  height: 46px;\n  padding: 10px 16px;\n  font-size: 18px;\n  line-height: 1.33;\n  border-radius: 6px;\n}\nselect.input-lg,\nselect.form-group-lg .form-control {\n  height: 46px;\n  line-height: 46px;\n}\ntextarea.input-lg,\ntextarea.form-group-lg .form-control,\nselect[multiple].input-lg,\nselect[multiple].form-group-lg .form-control {\n  height: auto;\n}\n.has-feedback {\n  position: relative;\n}\n.has-feedback .form-control {\n  padding-right: 42.5px;\n}\n.form-control-feedback {\n  position: absolute;\n  top: 0;\n  right: 0;\n  z-index: 2;\n  display: block;\n  width: 34px;\n  height: 34px;\n  line-height: 34px;\n  text-align: center;\n  pointer-events: none;\n}\n.input-lg + .form-control-feedback {\n  width: 46px;\n  height: 46px;\n  line-height: 46px;\n}\n.input-sm + .form-control-feedback {\n  width: 30px;\n  height: 30px;\n  line-height: 30px;\n}\n.has-success .help-block,\n.has-success .control-label,\n.has-success .radio,\n.has-success .checkbox,\n.has-success .radio-inline,\n.has-success .checkbox-inline,\n.has-success.radio label,\n.has-success.checkbox label,\n.has-success.radio-inline label,\n.has-success.checkbox-inline label {\n  color: #215f1e;\n}\n.has-success .form-control {\n  border-color: #215f1e;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n.has-success .form-control:focus {\n  border-color: #143812;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #3cad36;\n  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #3cad36;\n}\n.has-success .input-group-addon {\n  color: #215f1e;\n  border-color: #215f1e;\n  background-color: #dff0d8;\n}\n.has-success .form-control-feedback {\n  color: #215f1e;\n}\n.has-warning .help-block,\n.has-warning .control-label,\n.has-warning .radio,\n.has-warning .checkbox,\n.has-warning .radio-inline,\n.has-warning .checkbox-inline,\n.has-warning.radio label,\n.has-warning.checkbox label,\n.has-warning.radio-inline label,\n.has-warning.checkbox-inline label {\n  color: #8a6d3b;\n}\n.has-warning .form-control {\n  border-color: #8a6d3b;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n.has-warning .form-control:focus {\n  border-color: #66512c;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b;\n  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b;\n}\n.has-warning .input-group-addon {\n  color: #8a6d3b;\n  border-color: #8a6d3b;\n  background-color: #fcf8e3;\n}\n.has-warning .form-control-feedback {\n  color: #8a6d3b;\n}\n.has-error .help-block,\n.has-error .control-label,\n.has-error .radio,\n.has-error .checkbox,\n.has-error .radio-inline,\n.has-error .checkbox-inline,\n.has-error.radio label,\n.has-error.checkbox label,\n.has-error.radio-inline label,\n.has-error.checkbox-inline label {\n  color: #a94442;\n}\n.has-error .form-control {\n  border-color: #a94442;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n.has-error .form-control:focus {\n  border-color: #843534;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483;\n  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483;\n}\n.has-error .input-group-addon {\n  color: #a94442;\n  border-color: #a94442;\n  background-color: #f2dede;\n}\n.has-error .form-control-feedback {\n  color: #a94442;\n}\n.has-feedback label ~ .form-control-feedback {\n  top: 25px;\n}\n.has-feedback label.sr-only ~ .form-control-feedback {\n  top: 0;\n}\n.help-block {\n  display: block;\n  margin-top: 5px;\n  margin-bottom: 10px;\n  color: #737373;\n}\n@media (min-width: 768px) {\n  .form-inline .form-group {\n    display: inline-block;\n    margin-bottom: 0;\n    vertical-align: middle;\n  }\n  .form-inline .form-control {\n    display: inline-block;\n    width: auto;\n    vertical-align: middle;\n  }\n  .form-inline .form-control-static {\n    display: inline-block;\n  }\n  .form-inline .input-group {\n    display: inline-table;\n    vertical-align: middle;\n  }\n  .form-inline .input-group .input-group-addon,\n  .form-inline .input-group .input-group-btn,\n  .form-inline .input-group .form-control {\n    width: auto;\n  }\n  .form-inline .input-group > .form-control {\n    width: 100%;\n  }\n  .form-inline .control-label {\n    margin-bottom: 0;\n    vertical-align: middle;\n  }\n  .form-inline .radio,\n  .form-inline .checkbox {\n    display: inline-block;\n    margin-top: 0;\n    margin-bottom: 0;\n    vertical-align: middle;\n  }\n  .form-inline .radio label,\n  .form-inline .checkbox label {\n    padding-left: 0;\n  }\n  .form-inline .radio input[type=\"radio\"],\n  .form-inline .checkbox input[type=\"checkbox\"] {\n    position: relative;\n    margin-left: 0;\n  }\n  .form-inline .has-feedback .form-control-feedback {\n    top: 0;\n  }\n}\n.form-horizontal .radio,\n.form-horizontal .checkbox,\n.form-horizontal .radio-inline,\n.form-horizontal .checkbox-inline {\n  margin-top: 0;\n  margin-bottom: 0;\n  padding-top: 7px;\n}\n.form-horizontal .radio,\n.form-horizontal .checkbox {\n  min-height: 27px;\n}\n.form-horizontal .form-group {\n  margin-left: -15px;\n  margin-right: -15px;\n}\n@media (min-width: 768px) {\n  .form-horizontal .control-label {\n    text-align: right;\n    margin-bottom: 0;\n    padding-top: 7px;\n  }\n}\n.form-horizontal .has-feedback .form-control-feedback {\n  right: 15px;\n}\n@media (min-width: 768px) {\n  .form-horizontal .form-group-lg .control-label {\n    padding-top: 14.3px;\n  }\n}\n@media (min-width: 768px) {\n  .form-horizontal .form-group-sm .control-label {\n    padding-top: 6px;\n  }\n}\n.btn {\n  display: inline-block;\n  margin-bottom: 0;\n  font-weight: normal;\n  text-align: center;\n  vertical-align: middle;\n  touch-action: manipulation;\n  cursor: pointer;\n  background-image: none;\n  border: 1px solid transparent;\n  white-space: nowrap;\n  padding: 6px 12px;\n  font-size: 14px;\n  line-height: 1.42857143;\n  border-radius: 4px;\n  -webkit-user-select: none;\n  -moz-user-select: none;\n  -ms-user-select: none;\n  user-select: none;\n}\n.btn:focus,\n.btn:active:focus,\n.btn.active:focus,\n.btn.focus,\n.btn:active.focus,\n.btn.active.focus {\n  outline: thin dotted;\n  outline: 5px auto -webkit-focus-ring-color;\n  outline-offset: -2px;\n}\n.btn:hover,\n.btn:focus,\n.btn.focus {\n  color: #eeeeee;\n  text-decoration: none;\n}\n.btn:active,\n.btn.active {\n  outline: 0;\n  background-image: none;\n  -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n  box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n}\n.btn.disabled,\n.btn[disabled],\nfieldset[disabled] .btn {\n  cursor: not-allowed;\n  pointer-events: none;\n  opacity: 0.65;\n  -ms-filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=65);\n  filter: alpha(opacity=65);\n  -webkit-box-shadow: none;\n  box-shadow: none;\n}\n.btn-default {\n  color: #000000;\n  background-color: #ffffff;\n  border-color: #000000;\n}\n.btn-default:hover,\n.btn-default:focus,\n.btn-default.focus,\n.btn-default:active,\n.btn-default.active,\n.open > .dropdown-toggle.btn-default {\n  color: #eeeeee;\n  background-color: #ffffff;\n  border-color: #000000;\n}\n.btn-default:active,\n.btn-default.active,\n.open > .dropdown-toggle.btn-default {\n  background-image: none;\n}\n.btn-default.disabled,\n.btn-default[disabled],\nfieldset[disabled] .btn-default,\n.btn-default.disabled:hover,\n.btn-default[disabled]:hover,\nfieldset[disabled] .btn-default:hover,\n.btn-default.disabled:focus,\n.btn-default[disabled]:focus,\nfieldset[disabled] .btn-default:focus,\n.btn-default.disabled.focus,\n.btn-default[disabled].focus,\nfieldset[disabled] .btn-default.focus,\n.btn-default.disabled:active,\n.btn-default[disabled]:active,\nfieldset[disabled] .btn-default:active,\n.btn-default.disabled.active,\n.btn-default[disabled].active,\nfieldset[disabled] .btn-default.active {\n  background-color: #ffffff;\n  border-color: #000000;\n}\n.btn-default .badge {\n  color: #ffffff;\n  background-color: #000000;\n}\n.btn-primary {\n  color: #4CAF50;\n  background-color: #4CAF50;\n  border-color: #449d48;\n}\n.btn-primary:hover,\n.btn-primary:focus,\n.btn-primary.focus,\n.btn-primary:active,\n.btn-primary.active,\n.open > .dropdown-toggle.btn-primary {\n  color: #eeeeee;\n  background-color: #4CAF50;\n  border-color: #327334;\n}\n.btn-primary:active,\n.btn-primary.active,\n.open > .dropdown-toggle.btn-primary {\n  background-image: none;\n}\n.btn-primary.disabled,\n.btn-primary[disabled],\nfieldset[disabled] .btn-primary,\n.btn-primary.disabled:hover,\n.btn-primary[disabled]:hover,\nfieldset[disabled] .btn-primary:hover,\n.btn-primary.disabled:focus,\n.btn-primary[disabled]:focus,\nfieldset[disabled] .btn-primary:focus,\n.btn-primary.disabled.focus,\n.btn-primary[disabled].focus,\nfieldset[disabled] .btn-primary.focus,\n.btn-primary.disabled:active,\n.btn-primary[disabled]:active,\nfieldset[disabled] .btn-primary:active,\n.btn-primary.disabled.active,\n.btn-primary[disabled].active,\nfieldset[disabled] .btn-primary.active {\n  background-color: #4CAF50;\n  border-color: #449d48;\n}\n.btn-primary .badge {\n  color: #4CAF50;\n  background-color: #4CAF50;\n}\n.btn-success {\n  color: #457E86;\n  background-color: #457E86;\n  border-color: #3c6e75;\n}\n.btn-success:hover,\n.btn-success:focus,\n.btn-success.focus,\n.btn-success:active,\n.btn-success.active,\n.open > .dropdown-toggle.btn-success {\n  color: #eeeeee;\n  background-color: #457E86;\n  border-color: #28484d;\n}\n.btn-success:active,\n.btn-success.active,\n.open > .dropdown-toggle.btn-success {\n  background-image: none;\n}\n.btn-success.disabled,\n.btn-success[disabled],\nfieldset[disabled] .btn-success,\n.btn-success.disabled:hover,\n.btn-success[disabled]:hover,\nfieldset[disabled] .btn-success:hover,\n.btn-success.disabled:focus,\n.btn-success[disabled]:focus,\nfieldset[disabled] .btn-success:focus,\n.btn-success.disabled.focus,\n.btn-success[disabled].focus,\nfieldset[disabled] .btn-success.focus,\n.btn-success.disabled:active,\n.btn-success[disabled]:active,\nfieldset[disabled] .btn-success:active,\n.btn-success.disabled.active,\n.btn-success[disabled].active,\nfieldset[disabled] .btn-success.active {\n  background-color: #457E86;\n  border-color: #3c6e75;\n}\n.btn-success .badge {\n  color: #457E86;\n  background-color: #457E86;\n}\n.btn-info {\n  color: #4A2B0F;\n  background-color: #4A2B0F;\n  border-color: #351f0b;\n}\n.btn-info:hover,\n.btn-info:focus,\n.btn-info.focus,\n.btn-info:active,\n.btn-info.active,\n.open > .dropdown-toggle.btn-info {\n  color: #eeeeee;\n  background-color: #4A2B0F;\n  border-color: #020100;\n}\n.btn-info:active,\n.btn-info.active,\n.open > .dropdown-toggle.btn-info {\n  background-image: none;\n}\n.btn-info.disabled,\n.btn-info[disabled],\nfieldset[disabled] .btn-info,\n.btn-info.disabled:hover,\n.btn-info[disabled]:hover,\nfieldset[disabled] .btn-info:hover,\n.btn-info.disabled:focus,\n.btn-info[disabled]:focus,\nfieldset[disabled] .btn-info:focus,\n.btn-info.disabled.focus,\n.btn-info[disabled].focus,\nfieldset[disabled] .btn-info.focus,\n.btn-info.disabled:active,\n.btn-info[disabled]:active,\nfieldset[disabled] .btn-info:active,\n.btn-info.disabled.active,\n.btn-info[disabled].active,\nfieldset[disabled] .btn-info.active {\n  background-color: #4A2B0F;\n  border-color: #351f0b;\n}\n.btn-info .badge {\n  color: #4A2B0F;\n  background-color: #4A2B0F;\n}\n.btn-warning {\n  color: #f0ad4e;\n  background-color: #f0ad4e;\n  border-color: #eea236;\n}\n.btn-warning:hover,\n.btn-warning:focus,\n.btn-warning.focus,\n.btn-warning:active,\n.btn-warning.active,\n.open > .dropdown-toggle.btn-warning {\n  color: #eeeeee;\n  background-color: #f0ad4e;\n  border-color: #d58512;\n}\n.btn-warning:active,\n.btn-warning.active,\n.open > .dropdown-toggle.btn-warning {\n  background-image: none;\n}\n.btn-warning.disabled,\n.btn-warning[disabled],\nfieldset[disabled] .btn-warning,\n.btn-warning.disabled:hover,\n.btn-warning[disabled]:hover,\nfieldset[disabled] .btn-warning:hover,\n.btn-warning.disabled:focus,\n.btn-warning[disabled]:focus,\nfieldset[disabled] .btn-warning:focus,\n.btn-warning.disabled.focus,\n.btn-warning[disabled].focus,\nfieldset[disabled] .btn-warning.focus,\n.btn-warning.disabled:active,\n.btn-warning[disabled]:active,\nfieldset[disabled] .btn-warning:active,\n.btn-warning.disabled.active,\n.btn-warning[disabled].active,\nfieldset[disabled] .btn-warning.active {\n  background-color: #f0ad4e;\n  border-color: #eea236;\n}\n.btn-warning .badge {\n  color: #f0ad4e;\n  background-color: #f0ad4e;\n}\n.btn-danger {\n  color: #d9534f;\n  background-color: #d9534f;\n  border-color: #d43f3a;\n}\n.btn-danger:hover,\n.btn-danger:focus,\n.btn-danger.focus,\n.btn-danger:active,\n.btn-danger.active,\n.open > .dropdown-toggle.btn-danger {\n  color: #eeeeee;\n  background-color: #d9534f;\n  border-color: #ac2925;\n}\n.btn-danger:active,\n.btn-danger.active,\n.open > .dropdown-toggle.btn-danger {\n  background-image: none;\n}\n.btn-danger.disabled,\n.btn-danger[disabled],\nfieldset[disabled] .btn-danger,\n.btn-danger.disabled:hover,\n.btn-danger[disabled]:hover,\nfieldset[disabled] .btn-danger:hover,\n.btn-danger.disabled:focus,\n.btn-danger[disabled]:focus,\nfieldset[disabled] .btn-danger:focus,\n.btn-danger.disabled.focus,\n.btn-danger[disabled].focus,\nfieldset[disabled] .btn-danger.focus,\n.btn-danger.disabled:active,\n.btn-danger[disabled]:active,\nfieldset[disabled] .btn-danger:active,\n.btn-danger.disabled.active,\n.btn-danger[disabled].active,\nfieldset[disabled] .btn-danger.active {\n  background-color: #d9534f;\n  border-color: #d43f3a;\n}\n.btn-danger .badge {\n  color: #d9534f;\n  background-color: #d9534f;\n}\n.btn-link {\n  color: #4CAF50;\n  font-weight: normal;\n  border-radius: 0;\n}\n.btn-link,\n.btn-link:active,\n.btn-link.active,\n.btn-link[disabled],\nfieldset[disabled] .btn-link {\n  background-color: transparent;\n  -webkit-box-shadow: none;\n  box-shadow: none;\n}\n.btn-link,\n.btn-link:hover,\n.btn-link:focus,\n.btn-link:active {\n  border-color: transparent;\n}\n.btn-link:hover,\n.btn-link:focus {\n  color: #357a38;\n  text-decoration: underline;\n  background-color: transparent;\n}\n.btn-link[disabled]:hover,\nfieldset[disabled] .btn-link:hover,\n.btn-link[disabled]:focus,\nfieldset[disabled] .btn-link:focus {\n  color: #777777;\n  text-decoration: none;\n}\n.btn-lg,\n.btn-group-lg > .btn {\n  padding: 10px 16px;\n  font-size: 18px;\n  line-height: 1.33;\n  border-radius: 6px;\n}\n.btn-sm,\n.btn-group-sm > .btn {\n  padding: 5px 10px;\n  font-size: 12px;\n  line-height: 1.5;\n  border-radius: 3px;\n}\n.btn-xs,\n.btn-group-xs > .btn {\n  padding: 1px 5px;\n  font-size: 12px;\n  line-height: 1.5;\n  border-radius: 3px;\n}\n.btn-block {\n  display: block;\n  width: 100%;\n}\n.btn-block + .btn-block {\n  margin-top: 5px;\n}\ninput[type=\"submit\"].btn-block,\ninput[type=\"reset\"].btn-block,\ninput[type=\"button\"].btn-block {\n  width: 100%;\n}\n.fade {\n  opacity: 0;\n  -webkit-transition: opacity 0.15s linear;\n  -o-transition: opacity 0.15s linear;\n  transition: opacity 0.15s linear;\n}\n.fade.in {\n  opacity: 1;\n}\n.collapse {\n  display: none;\n  visibility: hidden;\n}\n.collapse.in {\n  display: block;\n  visibility: visible;\n}\ntr.collapse.in {\n  display: table-row;\n}\ntbody.collapse.in {\n  display: table-row-group;\n}\n.collapsing {\n  position: relative;\n  height: 0;\n  overflow: hidden;\n  -webkit-transition-property: height, visibility;\n  transition-property: height, visibility;\n  -webkit-transition-duration: 0.35s;\n  transition-duration: 0.35s;\n  -webkit-transition-timing-function: ease;\n  transition-timing-function: ease;\n}\n.caret {\n  display: inline-block;\n  width: 0;\n  height: 0;\n  margin-left: 2px;\n  vertical-align: middle;\n  border-top: 4px solid;\n  border-right: 4px solid transparent;\n  border-left: 4px solid transparent;\n}\n.dropdown {\n  position: relative;\n}\n.dropdown-toggle:focus {\n  outline: 0;\n}\n.dropdown-menu {\n  position: absolute;\n  top: 100%;\n  left: 0;\n  z-index: 1000;\n  display: none;\n  float: left;\n  min-width: 160px;\n  padding: 5px 0;\n  margin: 2px 0 0;\n  list-style: none;\n  font-size: 14px;\n  text-align: left;\n  background-color: #eeeeee;\n  border: 1px solid #ccc;\n  border: 1px solid rgba(0, 0, 0, 0.15);\n  border-radius: 4px;\n  -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);\n  box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);\n  background-clip: padding-box;\n}\n.dropdown-menu.pull-right {\n  right: 0;\n  left: auto;\n}\n.dropdown-menu .divider {\n  height: 1px;\n  margin: 9px 0;\n  overflow: hidden;\n  background-color: #e5e5e5;\n}\n.dropdown-menu > li > a {\n  display: block;\n  padding: 3px 20px;\n  clear: both;\n  font-weight: normal;\n  line-height: 1.42857143;\n  color: #333333;\n  white-space: nowrap;\n}\n.dropdown-menu > li > a:hover,\n.dropdown-menu > li > a:focus {\n  text-decoration: none;\n  color: #262626;\n  background-color: #f5f5f5;\n}\n.dropdown-menu > .active > a,\n.dropdown-menu > .active > a:hover,\n.dropdown-menu > .active > a:focus {\n  color: #eeeeee;\n  text-decoration: none;\n  outline: 0;\n  background-color: #4CAF50;\n}\n.dropdown-menu > .disabled > a,\n.dropdown-menu > .disabled > a:hover,\n.dropdown-menu > .disabled > a:focus {\n  color: #777777;\n}\n.dropdown-menu > .disabled > a:hover,\n.dropdown-menu > .disabled > a:focus {\n  text-decoration: none;\n  background-color: transparent;\n  background-image: none;\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n  cursor: not-allowed;\n}\n.open > .dropdown-menu {\n  display: block;\n}\n.open > a {\n  outline: 0;\n}\n.dropdown-menu-right {\n  left: auto;\n  right: 0;\n}\n.dropdown-menu-left {\n  left: 0;\n  right: auto;\n}\n.dropdown-header {\n  display: block;\n  padding: 3px 20px;\n  font-size: 12px;\n  line-height: 1.42857143;\n  color: #777777;\n  white-space: nowrap;\n}\n.dropdown-backdrop {\n  position: fixed;\n  left: 0;\n  right: 0;\n  bottom: 0;\n  top: 0;\n  z-index: 990;\n}\n.pull-right > .dropdown-menu {\n  right: 0;\n  left: auto;\n}\n.dropup .caret,\n.navbar-fixed-bottom .dropdown .caret {\n  border-top: 0;\n  border-bottom: 4px solid;\n  content: \"\";\n}\n.dropup .dropdown-menu,\n.navbar-fixed-bottom .dropdown .dropdown-menu {\n  top: auto;\n  bottom: 100%;\n  margin-bottom: 1px;\n}\n@media (min-width: 768px) {\n  .navbar-right .dropdown-menu {\n    left: auto;\n    right: 0;\n  }\n  .navbar-right .dropdown-menu-left {\n    left: 0;\n    right: auto;\n  }\n}\n.btn-group,\n.btn-group-vertical {\n  position: relative;\n  display: inline-block;\n  vertical-align: middle;\n}\n.btn-group > .btn,\n.btn-group-vertical > .btn {\n  position: relative;\n  float: left;\n}\n.btn-group > .btn:hover,\n.btn-group-vertical > .btn:hover,\n.btn-group > .btn:focus,\n.btn-group-vertical > .btn:focus,\n.btn-group > .btn:active,\n.btn-group-vertical > .btn:active,\n.btn-group > .btn.active,\n.btn-group-vertical > .btn.active {\n  z-index: 2;\n}\n.btn-group > .btn:focus,\n.btn-group-vertical > .btn:focus {\n  outline: 0;\n}\n.btn-group .btn + .btn,\n.btn-group .btn + .btn-group,\n.btn-group .btn-group + .btn,\n.btn-group .btn-group + .btn-group {\n  margin-left: -1px;\n}\n.btn-toolbar {\n  margin-left: -5px;\n}\n.btn-toolbar .btn-group,\n.btn-toolbar .input-group {\n  float: left;\n}\n.btn-toolbar > .btn,\n.btn-toolbar > .btn-group,\n.btn-toolbar > .input-group {\n  margin-left: 5px;\n}\n.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) {\n  border-radius: 0;\n}\n.btn-group > .btn:first-child {\n  margin-left: 0;\n}\n.btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) {\n  border-bottom-right-radius: 0;\n  border-top-right-radius: 0;\n}\n.btn-group > .btn:last-child:not(:first-child),\n.btn-group > .dropdown-toggle:not(:first-child) {\n  border-bottom-left-radius: 0;\n  border-top-left-radius: 0;\n}\n.btn-group > .btn-group {\n  float: left;\n}\n.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn {\n  border-radius: 0;\n}\n.btn-group > .btn-group:first-child > .btn:last-child,\n.btn-group > .btn-group:first-child > .dropdown-toggle {\n  border-bottom-right-radius: 0;\n  border-top-right-radius: 0;\n}\n.btn-group > .btn-group:last-child > .btn:first-child {\n  border-bottom-left-radius: 0;\n  border-top-left-radius: 0;\n}\n.btn-group .dropdown-toggle:active,\n.btn-group.open .dropdown-toggle {\n  outline: 0;\n}\n.btn-group > .btn + .dropdown-toggle {\n  padding-left: 8px;\n  padding-right: 8px;\n}\n.btn-group > .btn-lg + .dropdown-toggle {\n  padding-left: 12px;\n  padding-right: 12px;\n}\n.btn-group.open .dropdown-toggle {\n  -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n  box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n}\n.btn-group.open .dropdown-toggle.btn-link {\n  -webkit-box-shadow: none;\n  box-shadow: none;\n}\n.btn .caret {\n  margin-left: 0;\n}\n.btn-lg .caret {\n  border-width: 5px 5px 0;\n  border-bottom-width: 0;\n}\n.dropup .btn-lg .caret {\n  border-width: 0 5px 5px;\n}\n.btn-group-vertical > .btn,\n.btn-group-vertical > .btn-group,\n.btn-group-vertical > .btn-group > .btn {\n  display: block;\n  float: none;\n  width: 100%;\n  max-width: 100%;\n}\n.btn-group-vertical > .btn-group > .btn {\n  float: none;\n}\n.btn-group-vertical > .btn + .btn,\n.btn-group-vertical > .btn + .btn-group,\n.btn-group-vertical > .btn-group + .btn,\n.btn-group-vertical > .btn-group + .btn-group {\n  margin-top: -1px;\n  margin-left: 0;\n}\n.btn-group-vertical > .btn:not(:first-child):not(:last-child) {\n  border-radius: 0;\n}\n.btn-group-vertical > .btn:first-child:not(:last-child) {\n  border-top-right-radius: 4px;\n  border-bottom-right-radius: 0;\n  border-bottom-left-radius: 0;\n}\n.btn-group-vertical > .btn:last-child:not(:first-child) {\n  border-bottom-left-radius: 4px;\n  border-top-right-radius: 0;\n  border-top-left-radius: 0;\n}\n.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn {\n  border-radius: 0;\n}\n.btn-group-vertical > .btn-group:first-child:not(:last-child) > .btn:last-child,\n.btn-group-vertical > .btn-group:first-child:not(:last-child) > .dropdown-toggle {\n  border-bottom-right-radius: 0;\n  border-bottom-left-radius: 0;\n}\n.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child {\n  border-top-right-radius: 0;\n  border-top-left-radius: 0;\n}\n.btn-group-justified {\n  display: table;\n  width: 100%;\n  table-layout: fixed;\n  border-collapse: separate;\n}\n.btn-group-justified > .btn,\n.btn-group-justified > .btn-group {\n  float: none;\n  display: table-cell;\n  width: 1%;\n}\n.btn-group-justified > .btn-group .btn {\n  width: 100%;\n}\n.btn-group-justified > .btn-group .dropdown-menu {\n  left: auto;\n}\n[data-toggle=\"buttons\"] > .btn input[type=\"radio\"],\n[data-toggle=\"buttons\"] > .btn-group > .btn input[type=\"radio\"],\n[data-toggle=\"buttons\"] > .btn input[type=\"checkbox\"],\n[data-toggle=\"buttons\"] > .btn-group > .btn input[type=\"checkbox\"] {\n  position: absolute;\n  clip: rect(0, 0, 0, 0);\n  pointer-events: none;\n}\n.input-group {\n  position: relative;\n  display: table;\n  border-collapse: separate;\n}\n.input-group[class*=\"col-\"] {\n  float: none;\n  padding-left: 0;\n  padding-right: 0;\n}\n.input-group .form-control {\n  position: relative;\n  z-index: 2;\n  float: left;\n  width: 100%;\n  margin-bottom: 0;\n}\n.input-group-lg > .form-control,\n.input-group-lg > .input-group-addon,\n.input-group-lg > .input-group-btn > .btn {\n  height: 46px;\n  padding: 10px 16px;\n  font-size: 18px;\n  line-height: 1.33;\n  border-radius: 6px;\n}\nselect.input-group-lg > .form-control,\nselect.input-group-lg > .input-group-addon,\nselect.input-group-lg > .input-group-btn > .btn {\n  height: 46px;\n  line-height: 46px;\n}\ntextarea.input-group-lg > .form-control,\ntextarea.input-group-lg > .input-group-addon,\ntextarea.input-group-lg > .input-group-btn > .btn,\nselect[multiple].input-group-lg > .form-control,\nselect[multiple].input-group-lg > .input-group-addon,\nselect[multiple].input-group-lg > .input-group-btn > .btn {\n  height: auto;\n}\n.input-group-sm > .form-control,\n.input-group-sm > .input-group-addon,\n.input-group-sm > .input-group-btn > .btn {\n  height: 30px;\n  padding: 5px 10px;\n  font-size: 12px;\n  line-height: 1.5;\n  border-radius: 3px;\n}\nselect.input-group-sm > .form-control,\nselect.input-group-sm > .input-group-addon,\nselect.input-group-sm > .input-group-btn > .btn {\n  height: 30px;\n  line-height: 30px;\n}\ntextarea.input-group-sm > .form-control,\ntextarea.input-group-sm > .input-group-addon,\ntextarea.input-group-sm > .input-group-btn > .btn,\nselect[multiple].input-group-sm > .form-control,\nselect[multiple].input-group-sm > .input-group-addon,\nselect[multiple].input-group-sm > .input-group-btn > .btn {\n  height: auto;\n}\n.input-group-addon,\n.input-group-btn,\n.input-group .form-control {\n  display: table-cell;\n}\n.input-group-addon:not(:first-child):not(:last-child),\n.input-group-btn:not(:first-child):not(:last-child),\n.input-group .form-control:not(:first-child):not(:last-child) {\n  border-radius: 0;\n}\n.input-group-addon,\n.input-group-btn {\n  width: 1%;\n  white-space: nowrap;\n  vertical-align: middle;\n}\n.input-group-addon {\n  padding: 6px 12px;\n  font-size: 14px;\n  font-weight: normal;\n  line-height: 1;\n  color: #555555;\n  text-align: center;\n  background-color: #eeeeee;\n  border: 1px solid #ccc;\n  border-radius: 4px;\n}\n.input-group-addon.input-sm {\n  padding: 5px 10px;\n  font-size: 12px;\n  border-radius: 3px;\n}\n.input-group-addon.input-lg {\n  padding: 10px 16px;\n  font-size: 18px;\n  border-radius: 6px;\n}\n.input-group-addon input[type=\"radio\"],\n.input-group-addon input[type=\"checkbox\"] {\n  margin-top: 0;\n}\n.input-group .form-control:first-child,\n.input-group-addon:first-child,\n.input-group-btn:first-child > .btn,\n.input-group-btn:first-child > .btn-group > .btn,\n.input-group-btn:first-child > .dropdown-toggle,\n.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle),\n.input-group-btn:last-child > .btn-group:not(:last-child) > .btn {\n  border-bottom-right-radius: 0;\n  border-top-right-radius: 0;\n}\n.input-group-addon:first-child {\n  border-right: 0;\n}\n.input-group .form-control:last-child,\n.input-group-addon:last-child,\n.input-group-btn:last-child > .btn,\n.input-group-btn:last-child > .btn-group > .btn,\n.input-group-btn:last-child > .dropdown-toggle,\n.input-group-btn:first-child > .btn:not(:first-child),\n.input-group-btn:first-child > .btn-group:not(:first-child) > .btn {\n  border-bottom-left-radius: 0;\n  border-top-left-radius: 0;\n}\n.input-group-addon:last-child {\n  border-left: 0;\n}\n.input-group-btn {\n  position: relative;\n  font-size: 0;\n  white-space: nowrap;\n}\n.input-group-btn > .btn {\n  position: relative;\n}\n.input-group-btn > .btn + .btn {\n  margin-left: -1px;\n}\n.input-group-btn > .btn:hover,\n.input-group-btn > .btn:focus,\n.input-group-btn > .btn:active {\n  z-index: 2;\n}\n.input-group-btn:first-child > .btn,\n.input-group-btn:first-child > .btn-group {\n  margin-right: -1px;\n}\n.input-group-btn:last-child > .btn,\n.input-group-btn:last-child > .btn-group {\n  margin-left: -1px;\n}\n.nav {\n  margin-bottom: 0;\n  padding-left: 0;\n  list-style: none;\n}\n.nav > li {\n  position: relative;\n  display: block;\n}\n.nav > li > a {\n  position: relative;\n  display: block;\n  padding: 10px 15px;\n}\n.nav > li > a:hover,\n.nav > li > a:focus {\n  text-decoration: none;\n  background-color: #eeeeee;\n}\n.nav > li.disabled > a {\n  color: #777777;\n}\n.nav > li.disabled > a:hover,\n.nav > li.disabled > a:focus {\n  color: #777777;\n  text-decoration: none;\n  background-color: transparent;\n  cursor: not-allowed;\n}\n.nav .open > a,\n.nav .open > a:hover,\n.nav .open > a:focus {\n  background-color: #eeeeee;\n  border-color: #4CAF50;\n}\n.nav .nav-divider {\n  height: 1px;\n  margin: 9px 0;\n  overflow: hidden;\n  background-color: #e5e5e5;\n}\n.nav > li > a > img {\n  max-width: none;\n}\n.nav-tabs {\n  border-bottom: 1px solid #ddd;\n}\n.nav-tabs > li {\n  float: left;\n  margin-bottom: -1px;\n}\n.nav-tabs > li > a {\n  margin-right: 2px;\n  line-height: 1.42857143;\n  border: 1px solid transparent;\n  border-radius: 4px 4px 0 0;\n}\n.nav-tabs > li > a:hover {\n  border-color: #eeeeee #eeeeee #ddd;\n}\n.nav-tabs > li.active > a,\n.nav-tabs > li.active > a:hover,\n.nav-tabs > li.active > a:focus {\n  color: #555555;\n  background-color: #ffffff;\n  border: 1px solid #ddd;\n  border-bottom-color: transparent;\n  cursor: default;\n}\n.nav-tabs.nav-justified {\n  width: 100%;\n  border-bottom: 0;\n}\n.nav-tabs.nav-justified > li {\n  float: none;\n}\n.nav-tabs.nav-justified > li > a {\n  text-align: center;\n  margin-bottom: 5px;\n}\n.nav-tabs.nav-justified > .dropdown .dropdown-menu {\n  top: auto;\n  left: auto;\n}\n@media (min-width: 768px) {\n  .nav-tabs.nav-justified > li {\n    display: table-cell;\n    width: 1%;\n  }\n  .nav-tabs.nav-justified > li > a {\n    margin-bottom: 0;\n  }\n}\n.nav-tabs.nav-justified > li > a {\n  margin-right: 0;\n  border-radius: 4px;\n}\n.nav-tabs.nav-justified > .active > a,\n.nav-tabs.nav-justified > .active > a:hover,\n.nav-tabs.nav-justified > .active > a:focus {\n  border: 1px solid #ddd;\n}\n@media (min-width: 768px) {\n  .nav-tabs.nav-justified > li > a {\n    border-bottom: 1px solid #ddd;\n    border-radius: 4px 4px 0 0;\n  }\n  .nav-tabs.nav-justified > .active > a,\n  .nav-tabs.nav-justified > .active > a:hover,\n  .nav-tabs.nav-justified > .active > a:focus {\n    border-bottom-color: #ffffff;\n  }\n}\n.nav-pills > li {\n  float: left;\n}\n.nav-pills > li > a {\n  border-radius: 4px;\n}\n.nav-pills > li + li {\n  margin-left: 2px;\n}\n.nav-pills > li.active > a,\n.nav-pills > li.active > a:hover,\n.nav-pills > li.active > a:focus {\n  color: #eeeeee;\n  background-color: #4CAF50;\n}\n.nav-stacked > li {\n  float: none;\n}\n.nav-stacked > li + li {\n  margin-top: 2px;\n  margin-left: 0;\n}\n.nav-justified {\n  width: 100%;\n}\n.nav-justified > li {\n  float: none;\n}\n.nav-justified > li > a {\n  text-align: center;\n  margin-bottom: 5px;\n}\n.nav-justified > .dropdown .dropdown-menu {\n  top: auto;\n  left: auto;\n}\n@media (min-width: 768px) {\n  .nav-justified > li {\n    display: table-cell;\n    width: 1%;\n  }\n  .nav-justified > li > a {\n    margin-bottom: 0;\n  }\n}\n.nav-tabs-justified {\n  border-bottom: 0;\n}\n.nav-tabs-justified > li > a {\n  margin-right: 0;\n  border-radius: 4px;\n}\n.nav-tabs-justified > .active > a,\n.nav-tabs-justified > .active > a:hover,\n.nav-tabs-justified > .active > a:focus {\n  border: 1px solid #ddd;\n}\n@media (min-width: 768px) {\n  .nav-tabs-justified > li > a {\n    border-bottom: 1px solid #ddd;\n    border-radius: 4px 4px 0 0;\n  }\n  .nav-tabs-justified > .active > a,\n  .nav-tabs-justified > .active > a:hover,\n  .nav-tabs-justified > .active > a:focus {\n    border-bottom-color: #ffffff;\n  }\n}\n.tab-content > .tab-pane {\n  display: none;\n  visibility: hidden;\n}\n.tab-content > .active {\n  display: block;\n  visibility: visible;\n}\n.nav-tabs .dropdown-menu {\n  margin-top: -1px;\n  border-top-right-radius: 0;\n  border-top-left-radius: 0;\n}\n.navbar {\n  position: relative;\n  min-height: 50px;\n  margin-bottom: 30px;\n  border: 1px solid transparent;\n}\n@media (min-width: 768px) {\n  .navbar {\n    border-radius: 4px;\n  }\n}\n@media (min-width: 768px) {\n  .navbar-header {\n    float: left;\n  }\n}\n.navbar-collapse {\n  overflow-x: visible;\n  padding-right: 15px;\n  padding-left: 15px;\n  border-top: 1px solid transparent;\n  box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1);\n  -webkit-overflow-scrolling: touch;\n}\n.navbar-collapse.in {\n  overflow-y: auto;\n}\n@media (min-width: 768px) {\n  .navbar-collapse {\n    width: auto;\n    border-top: 0;\n    box-shadow: none;\n  }\n  .navbar-collapse.collapse {\n    display: block !important;\n    visibility: visible !important;\n    height: auto !important;\n    padding-bottom: 0;\n    overflow: visible !important;\n  }\n  .navbar-collapse.in {\n    overflow-y: visible;\n  }\n  .navbar-fixed-top .navbar-collapse,\n  .navbar-static-top .navbar-collapse,\n  .navbar-fixed-bottom .navbar-collapse {\n    padding-left: 0;\n    padding-right: 0;\n  }\n}\n.navbar-fixed-top .navbar-collapse,\n.navbar-fixed-bottom .navbar-collapse {\n  max-height: 340px;\n}\n@media (max-device-width: 480px) and (orientation: landscape) {\n  .navbar-fixed-top .navbar-collapse,\n  .navbar-fixed-bottom .navbar-collapse {\n    max-height: 200px;\n  }\n}\n.container > .navbar-header,\n.container-fluid > .navbar-header,\n.container > .navbar-collapse,\n.container-fluid > .navbar-collapse {\n  margin-right: -15px;\n  margin-left: -15px;\n}\n@media (min-width: 768px) {\n  .container > .navbar-header,\n  .container-fluid > .navbar-header,\n  .container > .navbar-collapse,\n  .container-fluid > .navbar-collapse {\n    margin-right: 0;\n    margin-left: 0;\n  }\n}\n.navbar-static-top {\n  z-index: 1000;\n  border-width: 0 0 1px;\n}\n@media (min-width: 768px) {\n  .navbar-static-top {\n    border-radius: 0;\n  }\n}\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n  position: fixed;\n  right: 0;\n  left: 0;\n  z-index: 1030;\n}\n@media (min-width: 768px) {\n  .navbar-fixed-top,\n  .navbar-fixed-bottom {\n    border-radius: 0;\n  }\n}\n.navbar-fixed-top {\n  top: 0;\n  border-width: 0 0 1px;\n}\n.navbar-fixed-bottom {\n  bottom: 0;\n  margin-bottom: 0;\n  border-width: 1px 0 0;\n}\n.navbar-brand {\n  float: left;\n  padding: 15px 15px;\n  font-size: 18px;\n  line-height: 20px;\n  height: 50px;\n}\n.navbar-brand:hover,\n.navbar-brand:focus {\n  text-decoration: none;\n}\n.navbar-brand > img {\n  display: block;\n}\n@media (min-width: 768px) {\n  .navbar > .container .navbar-brand,\n  .navbar > .container-fluid .navbar-brand {\n    margin-left: -15px;\n  }\n}\n.navbar-toggle {\n  position: relative;\n  float: right;\n  margin-right: 15px;\n  padding: 9px 10px;\n  margin-top: 8px;\n  margin-bottom: 8px;\n  background-color: transparent;\n  background-image: none;\n  border: 1px solid transparent;\n  border-radius: 4px;\n}\n.navbar-toggle:focus {\n  outline: 0;\n}\n.navbar-toggle .icon-bar {\n  display: block;\n  width: 22px;\n  height: 2px;\n  border-radius: 1px;\n  background-color: #eeeeee !important;\n}\n.navbar-toggle .icon-bar + .icon-bar {\n  margin-top: 4px;\n}\n@media (min-width: 768px) {\n  .navbar-toggle {\n    display: none;\n  }\n}\n.navbar-nav {\n  margin: 7.5px -15px;\n}\n.navbar-nav > li > a {\n  padding-top: 10px;\n  padding-bottom: 10px;\n  line-height: 20px;\n}\n@media (max-width: 767px) {\n  .navbar-nav .open .dropdown-menu {\n    position: static;\n    float: none;\n    width: auto;\n    margin-top: 0;\n    background-color: transparent;\n    border: 0;\n    box-shadow: none;\n  }\n  .navbar-nav .open .dropdown-menu > li > a,\n  .navbar-nav .open .dropdown-menu .dropdown-header {\n    padding: 5px 15px 5px 25px;\n  }\n  .navbar-nav .open .dropdown-menu > li > a {\n    line-height: 20px;\n  }\n  .navbar-nav .open .dropdown-menu > li > a:hover,\n  .navbar-nav .open .dropdown-menu > li > a:focus {\n    background-image: none;\n  }\n}\n@media (min-width: 768px) {\n  .navbar-nav {\n    float: left;\n    margin: 0;\n  }\n  .navbar-nav > li {\n    float: left;\n  }\n  .navbar-nav > li > a {\n    padding-top: 15px;\n    padding-bottom: 15px;\n  }\n}\n.navbar-form {\n  margin-left: -15px;\n  margin-right: -15px;\n  padding: 10px 15px;\n  border-top: 1px solid transparent;\n  border-bottom: 1px solid transparent;\n  -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  margin-top: 8px;\n  margin-bottom: 8px;\n}\n@media (min-width: 768px) {\n  .navbar-form .form-group {\n    display: inline-block;\n    margin-bottom: 0;\n    vertical-align: middle;\n  }\n  .navbar-form .form-control {\n    display: inline-block;\n    width: auto;\n    vertical-align: middle;\n  }\n  .navbar-form .form-control-static {\n    display: inline-block;\n  }\n  .navbar-form .input-group {\n    display: inline-table;\n    vertical-align: middle;\n  }\n  .navbar-form .input-group .input-group-addon,\n  .navbar-form .input-group .input-group-btn,\n  .navbar-form .input-group .form-control {\n    width: auto;\n  }\n  .navbar-form .input-group > .form-control {\n    width: 100%;\n  }\n  .navbar-form .control-label {\n    margin-bottom: 0;\n    vertical-align: middle;\n  }\n  .navbar-form .radio,\n  .navbar-form .checkbox {\n    display: inline-block;\n    margin-top: 0;\n    margin-bottom: 0;\n    vertical-align: middle;\n  }\n  .navbar-form .radio label,\n  .navbar-form .checkbox label {\n    padding-left: 0;\n  }\n  .navbar-form .radio input[type=\"radio\"],\n  .navbar-form .checkbox input[type=\"checkbox\"] {\n    position: relative;\n    margin-left: 0;\n  }\n  .navbar-form .has-feedback .form-control-feedback {\n    top: 0;\n  }\n}\n@media (max-width: 767px) {\n  .navbar-form .form-group {\n    margin-bottom: 5px;\n  }\n  .navbar-form .form-group:last-child {\n    margin-bottom: 0;\n  }\n}\n@media (min-width: 768px) {\n  .navbar-form {\n    width: auto;\n    border: 0;\n    margin-left: 0;\n    margin-right: 0;\n    padding-top: 0;\n    padding-bottom: 0;\n    -webkit-box-shadow: none;\n    box-shadow: none;\n  }\n}\n.navbar-nav > li > .dropdown-menu {\n  margin-top: 0;\n  border-top-right-radius: 0;\n  border-top-left-radius: 0;\n}\n.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu {\n  border-bottom-right-radius: 0;\n  border-bottom-left-radius: 0;\n}\n.navbar-btn {\n  margin-top: 8px;\n  margin-bottom: 8px;\n}\n.navbar-btn.btn-sm {\n  margin-top: 10px;\n  margin-bottom: 10px;\n}\n.navbar-btn.btn-xs {\n  margin-top: 14px;\n  margin-bottom: 14px;\n}\n.navbar-text {\n  margin-top: 15px;\n  margin-bottom: 15px;\n}\n@media (min-width: 768px) {\n  .navbar-text {\n    float: left;\n    margin-left: 15px;\n    margin-right: 15px;\n  }\n}\n@media (min-width: 768px) {\n  .navbar-left {\n    float: left !important;\n  }\n  .navbar-right {\n    float: right !important;\n    margin-right: -15px;\n  }\n  .navbar-right ~ .navbar-right {\n    margin-right: 0;\n  }\n}\n.navbar-default {\n  background-color: #f8f8f8;\n  border-color: #e7e7e7;\n}\n.navbar-default .navbar-brand {\n  color: #eeeeee;\n}\n.navbar-default .navbar-brand:hover,\n.navbar-default .navbar-brand:focus {\n  color: #d5d5d5;\n  background-color: transparent;\n}\n.navbar-default .navbar-text {\n  color: #777;\n}\n.navbar-default .navbar-nav > li > a {\n  color: #eeeeee;\n}\n.navbar-default .navbar-nav > li > a:hover,\n.navbar-default .navbar-nav > li > a:focus {\n  color: #4CAF50;\n  background-color: #eeeeee;\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: #eeeeee;\n}\n.navbar-default .navbar-nav > .disabled > a,\n.navbar-default .navbar-nav > .disabled > a:hover,\n.navbar-default .navbar-nav > .disabled > a:focus {\n  color: #ccc;\n  background-color: transparent;\n}\n.navbar-default .navbar-toggle {\n  border-color: #ddd;\n}\n.navbar-default .navbar-toggle:hover,\n.navbar-default .navbar-toggle:focus {\n  background-color: #ddd;\n}\n.navbar-default .navbar-toggle .icon-bar {\n  background-color: #888;\n}\n.navbar-default .navbar-collapse,\n.navbar-default .navbar-form {\n  border-color: #e7e7e7;\n}\n.navbar-default .navbar-nav > .open > a,\n.navbar-default .navbar-nav > .open > a:hover,\n.navbar-default .navbar-nav > .open > a:focus {\n  background-color: #e7e7e7;\n  color: #eeeeee;\n}\n@media (max-width: 767px) {\n  .navbar-default .navbar-nav .open .dropdown-menu > li > a {\n    color: #eeeeee;\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: #4CAF50;\n    background-color: #eeeeee;\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: #eeeeee;\n    background-color: #e7e7e7;\n  }\n  .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a,\n  .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover,\n  .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus {\n    color: #ccc;\n    background-color: transparent;\n  }\n}\n.navbar-default .navbar-link {\n  color: #eeeeee;\n}\n.navbar-default .navbar-link:hover {\n  color: #4CAF50;\n}\n.navbar-default .btn-link {\n  color: #eeeeee;\n}\n.navbar-default .btn-link:hover,\n.navbar-default .btn-link:focus {\n  color: #4CAF50;\n}\n.navbar-default .btn-link[disabled]:hover,\nfieldset[disabled] .navbar-default .btn-link:hover,\n.navbar-default .btn-link[disabled]:focus,\nfieldset[disabled] .navbar-default .btn-link:focus {\n  color: #ccc;\n}\n.navbar-inverse {\n  background-color: #222;\n  border-color: #080808;\n}\n.navbar-inverse .navbar-brand {\n  color: #777777;\n}\n.navbar-inverse .navbar-brand:hover,\n.navbar-inverse .navbar-brand:focus {\n  color: #eeeeee;\n  background-color: transparent;\n}\n.navbar-inverse .navbar-text {\n  color: #9d9d9d;\n}\n.navbar-inverse .navbar-nav > li > a {\n  color: #777777;\n}\n.navbar-inverse .navbar-nav > li > a:hover,\n.navbar-inverse .navbar-nav > li > a:focus {\n  color: #eeeeee;\n  background-color: transparent;\n}\n.navbar-inverse .navbar-nav > .active > a,\n.navbar-inverse .navbar-nav > .active > a:hover,\n.navbar-inverse .navbar-nav > .active > a:focus {\n  color: #eeeeee;\n  background-color: #080808;\n}\n.navbar-inverse .navbar-nav > .disabled > a,\n.navbar-inverse .navbar-nav > .disabled > a:hover,\n.navbar-inverse .navbar-nav > .disabled > a:focus {\n  color: #444;\n  background-color: transparent;\n}\n.navbar-inverse .navbar-toggle {\n  border-color: #333;\n}\n.navbar-inverse .navbar-toggle:hover,\n.navbar-inverse .navbar-toggle:focus {\n  background-color: #333;\n}\n.navbar-inverse .navbar-toggle .icon-bar {\n  background-color: #eeeeee;\n}\n.navbar-inverse .navbar-collapse,\n.navbar-inverse .navbar-form {\n  border-color: #101010;\n}\n.navbar-inverse .navbar-nav > .open > a,\n.navbar-inverse .navbar-nav > .open > a:hover,\n.navbar-inverse .navbar-nav > .open > a:focus {\n  background-color: #080808;\n  color: #eeeeee;\n}\n@media (max-width: 767px) {\n  .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header {\n    border-color: #080808;\n  }\n  .navbar-inverse .navbar-nav .open .dropdown-menu .divider {\n    background-color: #080808;\n  }\n  .navbar-inverse .navbar-nav .open .dropdown-menu > li > a {\n    color: #777777;\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: #eeeeee;\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: #eeeeee;\n    background-color: #080808;\n  }\n  .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a,\n  .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover,\n  .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus {\n    color: #444;\n    background-color: transparent;\n  }\n}\n.navbar-inverse .navbar-link {\n  color: #777777;\n}\n.navbar-inverse .navbar-link:hover {\n  color: #eeeeee;\n}\n.navbar-inverse .btn-link {\n  color: #777777;\n}\n.navbar-inverse .btn-link:hover,\n.navbar-inverse .btn-link:focus {\n  color: #eeeeee;\n}\n.navbar-inverse .btn-link[disabled]:hover,\nfieldset[disabled] .navbar-inverse .btn-link:hover,\n.navbar-inverse .btn-link[disabled]:focus,\nfieldset[disabled] .navbar-inverse .btn-link:focus {\n  color: #444;\n}\n.breadcrumb {\n  padding: 8px 15px;\n  margin-bottom: 20px;\n  list-style: none;\n  background-color: #f5f5f5;\n  border-radius: 4px;\n}\n.breadcrumb > li {\n  display: inline-block;\n}\n.breadcrumb > li + li:before {\n  content: \"/\\00a0\";\n  padding: 0 5px;\n  color: #ccc;\n}\n.breadcrumb > .active {\n  color: #777777;\n}\n.pagination {\n  display: inline-block;\n  padding-left: 0;\n  margin: 20px 0;\n  border-radius: 4px;\n}\n.pagination > li {\n  display: inline;\n}\n.pagination > li > a,\n.pagination > li > span {\n  position: relative;\n  float: left;\n  padding: 6px 12px;\n  line-height: 1.42857143;\n  text-decoration: none;\n  color: #4CAF50;\n  background-color: #eeeeee;\n  border: 1px solid #ddd;\n  margin-left: -1px;\n}\n.pagination > li:first-child > a,\n.pagination > li:first-child > span {\n  margin-left: 0;\n  border-bottom-left-radius: 4px;\n  border-top-left-radius: 4px;\n}\n.pagination > li:last-child > a,\n.pagination > li:last-child > span {\n  border-bottom-right-radius: 4px;\n  border-top-right-radius: 4px;\n}\n.pagination > li > a:hover,\n.pagination > li > span:hover,\n.pagination > li > a:focus,\n.pagination > li > span:focus {\n  color: #357a38;\n  background-color: #eeeeee;\n  border-color: #ddd;\n}\n.pagination > .active > a,\n.pagination > .active > span,\n.pagination > .active > a:hover,\n.pagination > .active > span:hover,\n.pagination > .active > a:focus,\n.pagination > .active > span:focus {\n  z-index: 2;\n  color: #eeeeee;\n  background-color: #4CAF50;\n  border-color: #4CAF50;\n  cursor: default;\n}\n.pagination > .disabled > span,\n.pagination > .disabled > span:hover,\n.pagination > .disabled > span:focus,\n.pagination > .disabled > a,\n.pagination > .disabled > a:hover,\n.pagination > .disabled > a:focus {\n  color: #777777;\n  background-color: #eeeeee;\n  border-color: #ddd;\n  cursor: not-allowed;\n}\n.pagination-lg > li > a,\n.pagination-lg > li > span {\n  padding: 10px 16px;\n  font-size: 18px;\n}\n.pagination-lg > li:first-child > a,\n.pagination-lg > li:first-child > span {\n  border-bottom-left-radius: 6px;\n  border-top-left-radius: 6px;\n}\n.pagination-lg > li:last-child > a,\n.pagination-lg > li:last-child > span {\n  border-bottom-right-radius: 6px;\n  border-top-right-radius: 6px;\n}\n.pagination-sm > li > a,\n.pagination-sm > li > span {\n  padding: 5px 10px;\n  font-size: 12px;\n}\n.pagination-sm > li:first-child > a,\n.pagination-sm > li:first-child > span {\n  border-bottom-left-radius: 3px;\n  border-top-left-radius: 3px;\n}\n.pagination-sm > li:last-child > a,\n.pagination-sm > li:last-child > span {\n  border-bottom-right-radius: 3px;\n  border-top-right-radius: 3px;\n}\n.pager {\n  padding-left: 0;\n  margin: 20px 0;\n  list-style: none;\n  text-align: center;\n}\n.pager li {\n  display: inline;\n}\n.pager li > a,\n.pager li > span {\n  display: inline-block;\n  padding: 5px 14px;\n  background-color: #eeeeee;\n  border: 1px solid #ddd;\n  border-radius: 15px;\n}\n.pager li > a:hover,\n.pager li > a:focus {\n  text-decoration: none;\n  background-color: #eeeeee;\n}\n.pager .next > a,\n.pager .next > span {\n  float: right;\n}\n.pager .previous > a,\n.pager .previous > span {\n  float: left;\n}\n.pager .disabled > a,\n.pager .disabled > a:hover,\n.pager .disabled > a:focus,\n.pager .disabled > span {\n  color: #777777;\n  background-color: #eeeeee;\n  cursor: not-allowed;\n}\n.label {\n  display: inline;\n  padding: .2em .6em .3em;\n  font-size: 75%;\n  font-weight: bold;\n  line-height: 1;\n  color: #eeeeee;\n  text-align: center;\n  white-space: nowrap;\n  vertical-align: baseline;\n  border-radius: .25em;\n}\na.label:hover,\na.label:focus {\n  color: #eeeeee;\n  text-decoration: none;\n  cursor: pointer;\n}\n.label:empty {\n  display: none;\n}\n.btn .label {\n  position: relative;\n  top: -1px;\n}\n.label-default {\n  background-color: #777777;\n}\n.label-default[href]:hover,\n.label-default[href]:focus {\n  background-color: #5e5e5e;\n}\n.label-primary {\n  background-color: #4CAF50;\n}\n.label-primary[href]:hover,\n.label-primary[href]:focus {\n  background-color: #3d8b40;\n}\n.label-success {\n  background-color: #457E86;\n}\n.label-success[href]:hover,\n.label-success[href]:focus {\n  background-color: #345e64;\n}\n.label-info {\n  background-color: #4A2B0F;\n}\n.label-info[href]:hover,\n.label-info[href]:focus {\n  background-color: #201206;\n}\n.label-warning {\n  background-color: #f0ad4e;\n}\n.label-warning[href]:hover,\n.label-warning[href]:focus {\n  background-color: #ec971f;\n}\n.label-danger {\n  background-color: #d9534f;\n}\n.label-danger[href]:hover,\n.label-danger[href]:focus {\n  background-color: #c9302c;\n}\n.badge {\n  display: inline-block;\n  min-width: 10px;\n  padding: 3px 7px;\n  font-size: 12px;\n  font-weight: bold;\n  color: #eeeeee;\n  line-height: 1;\n  vertical-align: baseline;\n  white-space: nowrap;\n  text-align: center;\n  background-color: #777777;\n  border-radius: 10px;\n}\n.badge:empty {\n  display: none;\n}\n.btn .badge {\n  position: relative;\n  top: -1px;\n}\n.btn-xs .badge {\n  top: 0;\n  padding: 1px 5px;\n}\na.badge:hover,\na.badge:focus {\n  color: #eeeeee;\n  text-decoration: none;\n  cursor: pointer;\n}\na.list-group-item.active > .badge,\n.nav-pills > .active > a > .badge {\n  color: #4CAF50;\n  background-color: #eeeeee;\n}\n.nav-pills > li > a > .badge {\n  margin-left: 3px;\n}\n.jumbotron {\n  padding: 30px 15px;\n  margin-bottom: 30px;\n  color: inherit;\n  background-color: #eeeeee;\n}\n.jumbotron h1,\n.jumbotron .h1 {\n  color: inherit;\n}\n.jumbotron p {\n  margin-bottom: 15px;\n  font-size: 21px;\n  font-weight: 200;\n}\n.jumbotron > hr {\n  border-top-color: #d5d5d5;\n}\n.container .jumbotron,\n.container-fluid .jumbotron {\n  border-radius: 6px;\n}\n.jumbotron .container {\n  max-width: 100%;\n}\n@media screen and (min-width: 768px) {\n  .jumbotron {\n    padding: 48px 0;\n  }\n  .container .jumbotron {\n    padding-left: 60px;\n    padding-right: 60px;\n  }\n  .jumbotron h1,\n  .jumbotron .h1 {\n    font-size: 63px;\n  }\n}\n.thumbnail {\n  display: block;\n  padding: 4px;\n  margin-bottom: 20px;\n  line-height: 1.42857143;\n  background-color: #ffffff;\n  border: 1px solid #ddd;\n  border-radius: 4px;\n  -webkit-transition: border 0.2s ease-in-out;\n  -o-transition: border 0.2s ease-in-out;\n  transition: border 0.2s ease-in-out;\n}\n.thumbnail > img,\n.thumbnail a > img {\n  margin-left: auto;\n  margin-right: auto;\n}\na.thumbnail:hover,\na.thumbnail:focus,\na.thumbnail.active {\n  border-color: #4CAF50;\n}\n.thumbnail .caption {\n  padding: 9px;\n  color: #333333;\n}\n.alert {\n  padding: 15px;\n  margin-bottom: 20px;\n  border: 1px solid transparent;\n  border-radius: 4px;\n}\n.alert h4 {\n  margin-top: 0;\n  color: inherit;\n}\n.alert .alert-link {\n  font-weight: bold;\n}\n.alert > p,\n.alert > ul {\n  margin-bottom: 0;\n}\n.alert > p + p {\n  margin-top: 5px;\n}\n.alert-dismissable,\n.alert-dismissible {\n  padding-right: 35px;\n}\n.alert-dismissable .close,\n.alert-dismissible .close {\n  position: relative;\n  top: -2px;\n  right: -21px;\n  color: inherit;\n}\n.alert-success {\n  background-color: #dff0d8;\n  border-color: #d6e9c6;\n  color: #215f1e;\n}\n.alert-success hr {\n  border-top-color: #c9e2b3;\n}\n.alert-success .alert-link {\n  color: #143812;\n}\n.alert-info {\n  background-color: #d9edf7;\n  border-color: #bce8f1;\n  color: #31708f;\n}\n.alert-info hr {\n  border-top-color: #a6e1ec;\n}\n.alert-info .alert-link {\n  color: #245269;\n}\n.alert-warning {\n  background-color: #fcf8e3;\n  border-color: #faebcc;\n  color: #8a6d3b;\n}\n.alert-warning hr {\n  border-top-color: #f7e1b5;\n}\n.alert-warning .alert-link {\n  color: #66512c;\n}\n.alert-danger {\n  background-color: #f2dede;\n  border-color: #ebccd1;\n  color: #a94442;\n}\n.alert-danger hr {\n  border-top-color: #e4b9c0;\n}\n.alert-danger .alert-link {\n  color: #843534;\n}\n@-webkit-keyframes progress-bar-stripes {\n  from {\n    background-position: 40px 0;\n  }\n  to {\n    background-position: 0 0;\n  }\n}\n@keyframes progress-bar-stripes {\n  from {\n    background-position: 40px 0;\n  }\n  to {\n    background-position: 0 0;\n  }\n}\n.progress {\n  overflow: hidden;\n  height: 20px;\n  margin-bottom: 20px;\n  background-color: #f5f5f5;\n  border-radius: 4px;\n  -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);\n  box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);\n}\n.progress-bar {\n  float: left;\n  width: 0%;\n  height: 100%;\n  font-size: 12px;\n  line-height: 20px;\n  color: #eeeeee;\n  text-align: center;\n  background-color: #4CAF50;\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  -o-transition: width 0.6s ease;\n  transition: width 0.6s ease;\n}\n.progress-striped .progress-bar,\n.progress-bar-striped {\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: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-size: 40px 40px;\n}\n.progress.active .progress-bar,\n.progress-bar.active {\n  -webkit-animation: progress-bar-stripes 2s linear infinite;\n  -o-animation: progress-bar-stripes 2s linear infinite;\n  animation: progress-bar-stripes 2s linear infinite;\n}\n.progress-bar-success {\n  background-color: #457E86;\n}\n.progress-striped .progress-bar-success {\n  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.progress-bar-info {\n  background-color: #4A2B0F;\n}\n.progress-striped .progress-bar-info {\n  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.progress-bar-warning {\n  background-color: #f0ad4e;\n}\n.progress-striped .progress-bar-warning {\n  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.progress-bar-danger {\n  background-color: #d9534f;\n}\n.progress-striped .progress-bar-danger {\n  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.media {\n  margin-top: 15px;\n}\n.media:first-child {\n  margin-top: 0;\n}\n.media-right,\n.media > .pull-right {\n  padding-left: 10px;\n}\n.media-left,\n.media > .pull-left {\n  padding-right: 10px;\n}\n.media-left,\n.media-right,\n.media-body {\n  display: table-cell;\n  vertical-align: top;\n}\n.media-middle {\n  vertical-align: middle;\n}\n.media-bottom {\n  vertical-align: bottom;\n}\n.media-heading {\n  margin-top: 0;\n  margin-bottom: 5px;\n}\n.media-list {\n  padding-left: 0;\n  list-style: none;\n}\n.list-group {\n  margin-bottom: 20px;\n  padding-left: 0;\n}\n.list-group-item {\n  position: relative;\n  display: block;\n  padding: 10px 15px;\n  margin-bottom: -1px;\n  background-color: #ffffff;\n  border: 1px solid #ddd;\n}\n.list-group-item:first-child {\n  border-top-right-radius: 4px;\n  border-top-left-radius: 4px;\n}\n.list-group-item:last-child {\n  margin-bottom: 0;\n  border-bottom-right-radius: 4px;\n  border-bottom-left-radius: 4px;\n}\n.list-group-item > .badge {\n  float: right;\n}\n.list-group-item > .badge + .badge {\n  margin-right: 5px;\n}\na.list-group-item {\n  color: #555;\n}\na.list-group-item .list-group-item-heading {\n  color: #333;\n}\na.list-group-item:hover,\na.list-group-item:focus {\n  text-decoration: none;\n  color: #555;\n  background-color: #f5f5f5;\n}\n.list-group-item.disabled,\n.list-group-item.disabled:hover,\n.list-group-item.disabled:focus {\n  background-color: #eeeeee;\n  color: #777777;\n  cursor: not-allowed;\n}\n.list-group-item.disabled .list-group-item-heading,\n.list-group-item.disabled:hover .list-group-item-heading,\n.list-group-item.disabled:focus .list-group-item-heading {\n  color: inherit;\n}\n.list-group-item.disabled .list-group-item-text,\n.list-group-item.disabled:hover .list-group-item-text,\n.list-group-item.disabled:focus .list-group-item-text {\n  color: #777777;\n}\n.list-group-item.active,\n.list-group-item.active:hover,\n.list-group-item.active:focus {\n  z-index: 2;\n  color: #eeeeee;\n  background-color: #4CAF50;\n  border-color: #4CAF50;\n}\n.list-group-item.active .list-group-item-heading,\n.list-group-item.active:hover .list-group-item-heading,\n.list-group-item.active:focus .list-group-item-heading,\n.list-group-item.active .list-group-item-heading > small,\n.list-group-item.active:hover .list-group-item-heading > small,\n.list-group-item.active:focus .list-group-item-heading > small,\n.list-group-item.active .list-group-item-heading > .small,\n.list-group-item.active:hover .list-group-item-heading > .small,\n.list-group-item.active:focus .list-group-item-heading > .small {\n  color: inherit;\n}\n.list-group-item.active .list-group-item-text,\n.list-group-item.active:hover .list-group-item-text,\n.list-group-item.active:focus .list-group-item-text {\n  color: #d9eeda;\n}\n.list-group-item-success {\n  color: #215f1e;\n  background-color: #dff0d8;\n}\na.list-group-item-success {\n  color: #215f1e;\n}\na.list-group-item-success .list-group-item-heading {\n  color: inherit;\n}\na.list-group-item-success:hover,\na.list-group-item-success:focus {\n  color: #215f1e;\n  background-color: #d0e9c6;\n}\na.list-group-item-success.active,\na.list-group-item-success.active:hover,\na.list-group-item-success.active:focus {\n  color: #fff;\n  background-color: #215f1e;\n  border-color: #215f1e;\n}\n.list-group-item-info {\n  color: #31708f;\n  background-color: #d9edf7;\n}\na.list-group-item-info {\n  color: #31708f;\n}\na.list-group-item-info .list-group-item-heading {\n  color: inherit;\n}\na.list-group-item-info:hover,\na.list-group-item-info:focus {\n  color: #31708f;\n  background-color: #c4e3f3;\n}\na.list-group-item-info.active,\na.list-group-item-info.active:hover,\na.list-group-item-info.active:focus {\n  color: #fff;\n  background-color: #31708f;\n  border-color: #31708f;\n}\n.list-group-item-warning {\n  color: #8a6d3b;\n  background-color: #fcf8e3;\n}\na.list-group-item-warning {\n  color: #8a6d3b;\n}\na.list-group-item-warning .list-group-item-heading {\n  color: inherit;\n}\na.list-group-item-warning:hover,\na.list-group-item-warning:focus {\n  color: #8a6d3b;\n  background-color: #faf2cc;\n}\na.list-group-item-warning.active,\na.list-group-item-warning.active:hover,\na.list-group-item-warning.active:focus {\n  color: #fff;\n  background-color: #8a6d3b;\n  border-color: #8a6d3b;\n}\n.list-group-item-danger {\n  color: #a94442;\n  background-color: #f2dede;\n}\na.list-group-item-danger {\n  color: #a94442;\n}\na.list-group-item-danger .list-group-item-heading {\n  color: inherit;\n}\na.list-group-item-danger:hover,\na.list-group-item-danger:focus {\n  color: #a94442;\n  background-color: #ebcccc;\n}\na.list-group-item-danger.active,\na.list-group-item-danger.active:hover,\na.list-group-item-danger.active:focus {\n  color: #fff;\n  background-color: #a94442;\n  border-color: #a94442;\n}\n.list-group-item-heading {\n  margin-top: 0;\n  margin-bottom: 5px;\n}\n.list-group-item-text {\n  margin-bottom: 0;\n  line-height: 1.3;\n}\n.panel {\n  margin-bottom: 20px;\n  background-color: #eeeeee;\n  border: 1px solid transparent;\n  border-radius: 4px;\n  -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05);\n  box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05);\n}\n.panel-body {\n  padding: 15px;\n}\n.panel-heading {\n  padding: 10px 15px;\n  border-bottom: 1px solid transparent;\n  border-top-right-radius: 3px;\n  border-top-left-radius: 3px;\n}\n.panel-heading > .dropdown .dropdown-toggle {\n  color: inherit;\n}\n.panel-title {\n  margin-top: 0;\n  margin-bottom: 0;\n  font-size: 16px;\n  color: inherit;\n}\n.panel-title > a {\n  color: inherit;\n}\n.panel-footer {\n  padding: 10px 15px;\n  background-color: #dedede;\n  border-top: 1px solid #ccc;\n  border-bottom-right-radius: 3px;\n  border-bottom-left-radius: 3px;\n}\n.panel > .list-group,\n.panel > .panel-collapse > .list-group {\n  margin-bottom: 0;\n}\n.panel > .list-group .list-group-item,\n.panel > .panel-collapse > .list-group .list-group-item {\n  border-width: 1px 0;\n  border-radius: 0;\n}\n.panel > .list-group:first-child .list-group-item:first-child,\n.panel > .panel-collapse > .list-group:first-child .list-group-item:first-child {\n  border-top: 0;\n  border-top-right-radius: 3px;\n  border-top-left-radius: 3px;\n}\n.panel > .list-group:last-child .list-group-item:last-child,\n.panel > .panel-collapse > .list-group:last-child .list-group-item:last-child {\n  border-bottom: 0;\n  border-bottom-right-radius: 3px;\n  border-bottom-left-radius: 3px;\n}\n.panel-heading + .list-group .list-group-item:first-child {\n  border-top-width: 0;\n}\n.list-group + .panel-footer {\n  border-top-width: 0;\n}\n.panel > .table,\n.panel > .table-responsive > .table,\n.panel > .panel-collapse > .table {\n  margin-bottom: 0;\n}\n.panel > .table caption,\n.panel > .table-responsive > .table caption,\n.panel > .panel-collapse > .table caption {\n  padding-left: 15px;\n  padding-right: 15px;\n}\n.panel > .table:first-child,\n.panel > .table-responsive:first-child > .table:first-child {\n  border-top-right-radius: 3px;\n  border-top-left-radius: 3px;\n}\n.panel > .table:first-child > thead:first-child > tr:first-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child {\n  border-top-left-radius: 3px;\n  border-top-right-radius: 3px;\n}\n.panel > .table:first-child > thead:first-child > tr:first-child td:first-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:first-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child td:first-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:first-child,\n.panel > .table:first-child > thead:first-child > tr:first-child th:first-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:first-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child th:first-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:first-child {\n  border-top-left-radius: 3px;\n}\n.panel > .table:first-child > thead:first-child > tr:first-child td:last-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:last-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child td:last-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:last-child,\n.panel > .table:first-child > thead:first-child > tr:first-child th:last-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:last-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child th:last-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:last-child {\n  border-top-right-radius: 3px;\n}\n.panel > .table:last-child,\n.panel > .table-responsive:last-child > .table:last-child {\n  border-bottom-right-radius: 3px;\n  border-bottom-left-radius: 3px;\n}\n.panel > .table:last-child > tbody:last-child > tr:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child {\n  border-bottom-left-radius: 3px;\n  border-bottom-right-radius: 3px;\n}\n.panel > .table:last-child > tbody:last-child > tr:last-child td:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:first-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child td:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:first-child,\n.panel > .table:last-child > tbody:last-child > tr:last-child th:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:first-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child th:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:first-child {\n  border-bottom-left-radius: 3px;\n}\n.panel > .table:last-child > tbody:last-child > tr:last-child td:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:last-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child td:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:last-child,\n.panel > .table:last-child > tbody:last-child > tr:last-child th:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:last-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child th:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:last-child {\n  border-bottom-right-radius: 3px;\n}\n.panel > .panel-body + .table,\n.panel > .panel-body + .table-responsive,\n.panel > .table + .panel-body,\n.panel > .table-responsive + .panel-body {\n  border-top: 1px solid #ddd;\n}\n.panel > .table > tbody:first-child > tr:first-child th,\n.panel > .table > tbody:first-child > tr:first-child td {\n  border-top: 0;\n}\n.panel > .table-bordered,\n.panel > .table-responsive > .table-bordered {\n  border: 0;\n}\n.panel > .table-bordered > thead > tr > th:first-child,\n.panel > .table-responsive > .table-bordered > thead > tr > th:first-child,\n.panel > .table-bordered > tbody > tr > th:first-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > th:first-child,\n.panel > .table-bordered > tfoot > tr > th:first-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > th:first-child,\n.panel > .table-bordered > thead > tr > td:first-child,\n.panel > .table-responsive > .table-bordered > thead > tr > td:first-child,\n.panel > .table-bordered > tbody > tr > td:first-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > td:first-child,\n.panel > .table-bordered > tfoot > tr > td:first-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > td:first-child {\n  border-left: 0;\n}\n.panel > .table-bordered > thead > tr > th:last-child,\n.panel > .table-responsive > .table-bordered > thead > tr > th:last-child,\n.panel > .table-bordered > tbody > tr > th:last-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > th:last-child,\n.panel > .table-bordered > tfoot > tr > th:last-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > th:last-child,\n.panel > .table-bordered > thead > tr > td:last-child,\n.panel > .table-responsive > .table-bordered > thead > tr > td:last-child,\n.panel > .table-bordered > tbody > tr > td:last-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > td:last-child,\n.panel > .table-bordered > tfoot > tr > td:last-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > td:last-child {\n  border-right: 0;\n}\n.panel > .table-bordered > thead > tr:first-child > td,\n.panel > .table-responsive > .table-bordered > thead > tr:first-child > td,\n.panel > .table-bordered > tbody > tr:first-child > td,\n.panel > .table-responsive > .table-bordered > tbody > tr:first-child > td,\n.panel > .table-bordered > thead > tr:first-child > th,\n.panel > .table-responsive > .table-bordered > thead > tr:first-child > th,\n.panel > .table-bordered > tbody > tr:first-child > th,\n.panel > .table-responsive > .table-bordered > tbody > tr:first-child > th {\n  border-bottom: 0;\n}\n.panel > .table-bordered > tbody > tr:last-child > td,\n.panel > .table-responsive > .table-bordered > tbody > tr:last-child > td,\n.panel > .table-bordered > tfoot > tr:last-child > td,\n.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > td,\n.panel > .table-bordered > tbody > tr:last-child > th,\n.panel > .table-responsive > .table-bordered > tbody > tr:last-child > th,\n.panel > .table-bordered > tfoot > tr:last-child > th,\n.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > th {\n  border-bottom: 0;\n}\n.panel > .table-responsive {\n  border: 0;\n  margin-bottom: 0;\n}\n.panel-group {\n  margin-bottom: 20px;\n}\n.panel-group .panel {\n  margin-bottom: 0;\n  border-radius: 4px;\n}\n.panel-group .panel + .panel {\n  margin-top: 5px;\n}\n.panel-group .panel-heading {\n  border-bottom: 0;\n}\n.panel-group .panel-heading + .panel-collapse > .panel-body,\n.panel-group .panel-heading + .panel-collapse > .list-group {\n  border-top: 1px solid #ccc;\n}\n.panel-group .panel-footer {\n  border-top: 0;\n}\n.panel-group .panel-footer + .panel-collapse .panel-body {\n  border-bottom: 1px solid #ccc;\n}\n.panel-default {\n  border-color: #ddd;\n}\n.panel-default > .panel-heading {\n  color: #333333;\n  background-color: #f5f5f5;\n  border-color: #ddd;\n}\n.panel-default > .panel-heading + .panel-collapse > .panel-body {\n  border-top-color: #ddd;\n}\n.panel-default > .panel-heading .badge {\n  color: #f5f5f5;\n  background-color: #333333;\n}\n.panel-default > .panel-footer + .panel-collapse > .panel-body {\n  border-bottom-color: #ddd;\n}\n.panel-primary {\n  border-color: #4CAF50;\n}\n.panel-primary > .panel-heading {\n  color: #eeeeee;\n  background-color: #4CAF50;\n  border-color: #4CAF50;\n}\n.panel-primary > .panel-heading + .panel-collapse > .panel-body {\n  border-top-color: #4CAF50;\n}\n.panel-primary > .panel-heading .badge {\n  color: #4CAF50;\n  background-color: #eeeeee;\n}\n.panel-primary > .panel-footer + .panel-collapse > .panel-body {\n  border-bottom-color: #4CAF50;\n}\n.panel-success {\n  border-color: #d6e9c6;\n}\n.panel-success > .panel-heading {\n  color: #215f1e;\n  background-color: #dff0d8;\n  border-color: #d6e9c6;\n}\n.panel-success > .panel-heading + .panel-collapse > .panel-body {\n  border-top-color: #d6e9c6;\n}\n.panel-success > .panel-heading .badge {\n  color: #dff0d8;\n  background-color: #215f1e;\n}\n.panel-success > .panel-footer + .panel-collapse > .panel-body {\n  border-bottom-color: #d6e9c6;\n}\n.panel-info {\n  border-color: #449d48;\n}\n.panel-info > .panel-heading {\n  color: #eeeeee;\n  background-color: #4CAF50;\n  border-color: #449d48;\n}\n.panel-info > .panel-heading + .panel-collapse > .panel-body {\n  border-top-color: #449d48;\n}\n.panel-info > .panel-heading .badge {\n  color: #4CAF50;\n  background-color: #eeeeee;\n}\n.panel-info > .panel-footer + .panel-collapse > .panel-body {\n  border-bottom-color: #449d48;\n}\n.panel-warning {\n  border-color: #faebcc;\n}\n.panel-warning > .panel-heading {\n  color: #8a6d3b;\n  background-color: #fcf8e3;\n  border-color: #faebcc;\n}\n.panel-warning > .panel-heading + .panel-collapse > .panel-body {\n  border-top-color: #faebcc;\n}\n.panel-warning > .panel-heading .badge {\n  color: #fcf8e3;\n  background-color: #8a6d3b;\n}\n.panel-warning > .panel-footer + .panel-collapse > .panel-body {\n  border-bottom-color: #faebcc;\n}\n.panel-danger {\n  border-color: #ebccd1;\n}\n.panel-danger > .panel-heading {\n  color: #a94442;\n  background-color: #f2dede;\n  border-color: #ebccd1;\n}\n.panel-danger > .panel-heading + .panel-collapse > .panel-body {\n  border-top-color: #ebccd1;\n}\n.panel-danger > .panel-heading .badge {\n  color: #f2dede;\n  background-color: #a94442;\n}\n.panel-danger > .panel-footer + .panel-collapse > .panel-body {\n  border-bottom-color: #ebccd1;\n}\n.embed-responsive {\n  position: relative;\n  display: block;\n  height: 0;\n  padding: 0;\n  overflow: hidden;\n}\n.embed-responsive .embed-responsive-item,\n.embed-responsive iframe,\n.embed-responsive embed,\n.embed-responsive object,\n.embed-responsive video {\n  position: absolute;\n  top: 0;\n  left: 0;\n  bottom: 0;\n  height: 100%;\n  width: 100%;\n  border: 0;\n}\n.embed-responsive.embed-responsive-16by9 {\n  padding-bottom: 56.25%;\n}\n.embed-responsive.embed-responsive-4by3 {\n  padding-bottom: 75%;\n}\n.well {\n  min-height: 20px;\n  padding: 19px;\n  margin-bottom: 20px;\n  background-color: #f5f5f5;\n  border: 1px solid #e3e3e3;\n  border-radius: 4px;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);\n  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);\n}\n.well blockquote {\n  border-color: #ddd;\n  border-color: rgba(0, 0, 0, 0.15);\n}\n.well-lg {\n  padding: 24px;\n  border-radius: 6px;\n}\n.well-sm {\n  padding: 9px;\n  border-radius: 3px;\n}\n.close {\n  float: right;\n  font-size: 21px;\n  font-weight: bold;\n  line-height: 1;\n  color: #000;\n  text-shadow: 0 1px 0 #eeeeee;\n  opacity: 0.2;\n  -ms-filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=20);\n  filter: alpha(opacity=20);\n}\n.close:hover,\n.close:focus {\n  color: #000;\n  text-decoration: none;\n  cursor: pointer;\n  opacity: 0.5;\n  -ms-filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=50);\n  filter: alpha(opacity=50);\n}\nbutton.close {\n  padding: 0;\n  cursor: pointer;\n  background: transparent;\n  border: 0;\n  -webkit-appearance: none;\n}\n.modal-open {\n  overflow: hidden;\n}\n.modal {\n  display: none;\n  overflow: hidden;\n  position: fixed;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  z-index: 1040;\n  -webkit-overflow-scrolling: touch;\n  outline: 0;\n}\n.modal.fade .modal-dialog {\n  -webkit-transform: translate(0, -25%);\n  -ms-transform: translate(0, -25%);\n  -o-transform: translate(0, -25%);\n  transform: translate(0, -25%);\n  -webkit-transition: -webkit-transform 0.3s ease-out;\n  -moz-transition: -moz-transform 0.3s ease-out;\n  -o-transition: -o-transform 0.3s ease-out;\n  transition: transform 0.3s ease-out;\n}\n.modal.in .modal-dialog {\n  -webkit-transform: translate(0, 0);\n  -ms-transform: translate(0, 0);\n  -o-transform: translate(0, 0);\n  transform: translate(0, 0);\n}\n.modal-open .modal {\n  overflow-x: hidden;\n  overflow-y: auto;\n}\n.modal-dialog {\n  position: relative;\n  width: auto;\n  margin: 10px;\n}\n.modal-content {\n  position: relative;\n  background-color: #eeeeee;\n  border: 1px solid #999;\n  border: 1px solid rgba(0, 0, 0, 0.2);\n  border-radius: 6px;\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  outline: 0;\n}\n.modal-backdrop {\n  position: fixed;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  background-color: #000;\n}\n.modal-backdrop.fade {\n  opacity: 0;\n  -ms-filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=0);\n  filter: alpha(opacity=0);\n}\n.modal-backdrop.in {\n  opacity: 0.5;\n  -ms-filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=50);\n  filter: alpha(opacity=50);\n}\n.modal-header {\n  padding: 15px;\n  border-bottom: 1px solid #e5e5e5;\n  min-height: 16.42857143px;\n}\n.modal-header .close {\n  margin-top: -2px;\n}\n.modal-title {\n  margin: 0;\n  line-height: 1.42857143;\n}\n.modal-body {\n  position: relative;\n  padding: 15px;\n}\n.modal-footer {\n  padding: 15px;\n  text-align: right;\n  border-top: 1px solid #e5e5e5;\n}\n.modal-footer .btn + .btn {\n  margin-left: 5px;\n  margin-bottom: 0;\n}\n.modal-footer .btn-group .btn + .btn {\n  margin-left: -1px;\n}\n.modal-footer .btn-block + .btn-block {\n  margin-left: 0;\n}\n.modal-scrollbar-measure {\n  position: absolute;\n  top: -9999px;\n  width: 50px;\n  height: 50px;\n  overflow: scroll;\n}\n@media (min-width: 768px) {\n  .modal-dialog {\n    width: 600px;\n    margin: 30px auto;\n  }\n  .modal-content {\n    -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  .modal-sm {\n    width: 300px;\n  }\n}\n@media (min-width: 1031px) {\n  .modal-lg {\n    width: 900px;\n  }\n}\n.tooltip {\n  position: absolute;\n  z-index: 1070;\n  display: block;\n  visibility: visible;\n  font-size: 12px;\n  line-height: 1.4;\n  opacity: 0;\n  -ms-filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=0);\n  filter: alpha(opacity=0);\n}\n.tooltip.in {\n  opacity: 0.9;\n  -ms-filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=90);\n  filter: alpha(opacity=90);\n}\n.tooltip.top {\n  margin-top: -3px;\n  padding: 5px 0;\n}\n.tooltip.right {\n  margin-left: 3px;\n  padding: 0 5px;\n}\n.tooltip.bottom {\n  margin-top: 3px;\n  padding: 5px 0;\n}\n.tooltip.left {\n  margin-left: -3px;\n  padding: 0 5px;\n}\n.tooltip-inner {\n  max-width: 200px;\n  padding: 3px 8px;\n  color: #eeeeee;\n  text-align: center;\n  text-decoration: none;\n  background-color: #000;\n  border-radius: 4px;\n}\n.tooltip-arrow {\n  position: absolute;\n  width: 0;\n  height: 0;\n  border-color: transparent;\n  border-style: solid;\n}\n.tooltip.top .tooltip-arrow {\n  bottom: 0;\n  left: 50%;\n  margin-left: -5px;\n  border-width: 5px 5px 0;\n  border-top-color: #000;\n}\n.tooltip.top-left .tooltip-arrow {\n  bottom: 0;\n  left: 5px;\n  border-width: 5px 5px 0;\n  border-top-color: #000;\n}\n.tooltip.top-right .tooltip-arrow {\n  bottom: 0;\n  right: 5px;\n  border-width: 5px 5px 0;\n  border-top-color: #000;\n}\n.tooltip.right .tooltip-arrow {\n  top: 50%;\n  left: 0;\n  margin-top: -5px;\n  border-width: 5px 5px 5px 0;\n  border-right-color: #000;\n}\n.tooltip.left .tooltip-arrow {\n  top: 50%;\n  right: 0;\n  margin-top: -5px;\n  border-width: 5px 0 5px 5px;\n  border-left-color: #000;\n}\n.tooltip.bottom .tooltip-arrow {\n  top: 0;\n  left: 50%;\n  margin-left: -5px;\n  border-width: 0 5px 5px;\n  border-bottom-color: #000;\n}\n.tooltip.bottom-left .tooltip-arrow {\n  top: 0;\n  left: 5px;\n  border-width: 0 5px 5px;\n  border-bottom-color: #000;\n}\n.tooltip.bottom-right .tooltip-arrow {\n  top: 0;\n  right: 5px;\n  border-width: 0 5px 5px;\n  border-bottom-color: #000;\n}\n.popover {\n  position: absolute;\n  top: 0;\n  left: 0;\n  z-index: 1060;\n  display: none;\n  max-width: 276px;\n  padding: 1px;\n  font-size: 14px;\n  font-weight: normal;\n  line-height: 1.42857143;\n  text-align: left;\n  background-color: #eeeeee;\n  background-clip: padding-box;\n  border: 1px solid #ccc;\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  white-space: normal;\n}\n.popover.top {\n  margin-top: -10px;\n}\n.popover.right {\n  margin-left: 10px;\n}\n.popover.bottom {\n  margin-top: 10px;\n}\n.popover.left {\n  margin-left: -10px;\n}\n.popover-title {\n  margin: 0;\n  padding: 8px 14px;\n  font-size: 14px;\n  background-color: #e7e7e7;\n  border-bottom: 1px solid #dadada;\n  border-radius: 5px 5px 0 0;\n}\n.popover-content {\n  padding: 9px 14px;\n}\n.popover > .arrow,\n.popover > .arrow:after {\n  position: absolute;\n  display: block;\n  width: 0;\n  height: 0;\n  border-color: transparent;\n  border-style: solid;\n}\n.popover > .arrow {\n  border-width: 11px;\n}\n.popover > .arrow:after {\n  border-width: 10px;\n  content: \"\";\n}\n.popover.top > .arrow {\n  left: 50%;\n  margin-left: -11px;\n  border-bottom-width: 0;\n  border-top-color: #999999;\n  border-top-color: rgba(0, 0, 0, 0.25);\n  bottom: -11px;\n}\n.popover.top > .arrow:after {\n  content: \" \";\n  bottom: 1px;\n  margin-left: -10px;\n  border-bottom-width: 0;\n  border-top-color: #eeeeee;\n}\n.popover.right > .arrow {\n  top: 50%;\n  left: -11px;\n  margin-top: -11px;\n  border-left-width: 0;\n  border-right-color: #999999;\n  border-right-color: rgba(0, 0, 0, 0.25);\n}\n.popover.right > .arrow:after {\n  content: \" \";\n  left: 1px;\n  bottom: -10px;\n  border-left-width: 0;\n  border-right-color: #eeeeee;\n}\n.popover.bottom > .arrow {\n  left: 50%;\n  margin-left: -11px;\n  border-top-width: 0;\n  border-bottom-color: #999999;\n  border-bottom-color: rgba(0, 0, 0, 0.25);\n  top: -11px;\n}\n.popover.bottom > .arrow:after {\n  content: \" \";\n  top: 1px;\n  margin-left: -10px;\n  border-top-width: 0;\n  border-bottom-color: #eeeeee;\n}\n.popover.left > .arrow {\n  top: 50%;\n  right: -11px;\n  margin-top: -11px;\n  border-right-width: 0;\n  border-left-color: #999999;\n  border-left-color: rgba(0, 0, 0, 0.25);\n}\n.popover.left > .arrow:after {\n  content: \" \";\n  right: 1px;\n  border-right-width: 0;\n  border-left-color: #eeeeee;\n  bottom: -10px;\n}\n.carousel {\n  position: relative;\n}\n.carousel-inner {\n  position: relative;\n  overflow: hidden;\n  width: 100%;\n}\n.carousel-inner > .item {\n  display: none;\n  position: relative;\n  -webkit-transition: 0.6s ease-in-out left;\n  -o-transition: 0.6s ease-in-out left;\n  transition: 0.6s ease-in-out left;\n}\n.carousel-inner > .item > img,\n.carousel-inner > .item > a > img {\n  line-height: 1;\n}\n@media all and (transform-3d), (-webkit-transform-3d) {\n  .carousel-inner > .item {\n    transition: transform 0.6s ease-in-out;\n    backface-visibility: hidden;\n    perspective: 1000;\n  }\n  .carousel-inner > .item.next,\n  .carousel-inner > .item.active.right {\n    transform: translate3d(100%, 0, 0);\n    left: 0;\n  }\n  .carousel-inner > .item.prev,\n  .carousel-inner > .item.active.left {\n    transform: translate3d(-100%, 0, 0);\n    left: 0;\n  }\n  .carousel-inner > .item.next.left,\n  .carousel-inner > .item.prev.right,\n  .carousel-inner > .item.active {\n    transform: translate3d(0, 0, 0);\n    left: 0;\n  }\n}\n.carousel-inner > .active,\n.carousel-inner > .next,\n.carousel-inner > .prev {\n  display: block;\n}\n.carousel-inner > .active {\n  left: 0;\n}\n.carousel-inner > .next,\n.carousel-inner > .prev {\n  position: absolute;\n  top: 0;\n  width: 100%;\n}\n.carousel-inner > .next {\n  left: 100%;\n}\n.carousel-inner > .prev {\n  left: -100%;\n}\n.carousel-inner > .next.left,\n.carousel-inner > .prev.right {\n  left: 0;\n}\n.carousel-inner > .active.left {\n  left: -100%;\n}\n.carousel-inner > .active.right {\n  left: 100%;\n}\n.carousel-control {\n  position: absolute;\n  top: 0;\n  left: 0;\n  bottom: 0;\n  width: 15%;\n  opacity: 0.5;\n  -ms-filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=50);\n  filter: alpha(opacity=50);\n  font-size: 20px;\n  color: #eeeeee;\n  text-align: center;\n  text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6);\n}\n.carousel-control.left {\n  background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%);\n  background-image: -o-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.carousel-control.right {\n  left: auto;\n  right: 0;\n  background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%);\n  background-image: -o-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.carousel-control:hover,\n.carousel-control:focus {\n  outline: 0;\n  color: #eeeeee;\n  text-decoration: none;\n  opacity: 0.9;\n  -ms-filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=90);\n  filter: alpha(opacity=90);\n}\n.carousel-control .icon-prev,\n.carousel-control .icon-next,\n.carousel-control .glyphicon-chevron-left,\n.carousel-control .glyphicon-chevron-right {\n  position: absolute;\n  top: 50%;\n  z-index: 5;\n  display: inline-block;\n}\n.carousel-control .icon-prev,\n.carousel-control .glyphicon-chevron-left {\n  left: 50%;\n  margin-left: -10px;\n}\n.carousel-control .icon-next,\n.carousel-control .glyphicon-chevron-right {\n  right: 50%;\n  margin-right: -10px;\n}\n.carousel-control .icon-prev,\n.carousel-control .icon-next {\n  width: 20px;\n  height: 20px;\n  margin-top: -10px;\n  font-family: serif;\n}\n.carousel-control .icon-prev:before {\n  content: '\\2039';\n}\n.carousel-control .icon-next:before {\n  content: '\\203a';\n}\n.carousel-indicators {\n  position: absolute;\n  bottom: 10px;\n  left: 50%;\n  z-index: 15;\n  width: 60%;\n  margin-left: -30%;\n  padding-left: 0;\n  list-style: none;\n  text-align: center;\n}\n.carousel-indicators li {\n  display: inline-block;\n  width: 10px;\n  height: 10px;\n  margin: 1px;\n  text-indent: -999px;\n  border: 1px solid #eeeeee;\n  border-radius: 10px;\n  cursor: pointer;\n  background-color: #000 \\9;\n  background-color: rgba(0, 0, 0, 0);\n}\n.carousel-indicators .active {\n  margin: 0;\n  width: 12px;\n  height: 12px;\n  background-color: #eeeeee;\n}\n.carousel-caption {\n  position: absolute;\n  left: 15%;\n  right: 15%;\n  bottom: 20px;\n  z-index: 10;\n  padding-top: 20px;\n  padding-bottom: 20px;\n  color: #eeeeee;\n  text-align: center;\n  text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6);\n}\n.carousel-caption .btn {\n  text-shadow: none;\n}\n@media screen and (min-width: 768px) {\n  .carousel-control .glyphicon-chevron-left,\n  .carousel-control .glyphicon-chevron-right,\n  .carousel-control .icon-prev,\n  .carousel-control .icon-next {\n    width: 30px;\n    height: 30px;\n    margin-top: -15px;\n    font-size: 30px;\n  }\n  .carousel-control .glyphicon-chevron-left,\n  .carousel-control .icon-prev {\n    margin-left: -15px;\n  }\n  .carousel-control .glyphicon-chevron-right,\n  .carousel-control .icon-next {\n    margin-right: -15px;\n  }\n  .carousel-caption {\n    left: 20%;\n    right: 20%;\n    padding-bottom: 30px;\n  }\n  .carousel-indicators {\n    bottom: 20px;\n  }\n}\n.clearfix:before,\n.clearfix:after,\n.dl-horizontal dd:before,\n.dl-horizontal dd:after,\n.container:before,\n.container:after,\n.container-fluid:before,\n.container-fluid:after,\n.row:before,\n.row:after,\n.form-horizontal .form-group:before,\n.form-horizontal .form-group:after,\n.btn-toolbar:before,\n.btn-toolbar:after,\n.btn-group-vertical > .btn-group:before,\n.btn-group-vertical > .btn-group:after,\n.nav:before,\n.nav:after,\n.navbar:before,\n.navbar:after,\n.navbar-header:before,\n.navbar-header:after,\n.navbar-collapse:before,\n.navbar-collapse:after,\n.pager:before,\n.pager:after,\n.panel-body:before,\n.panel-body:after,\n.modal-footer:before,\n.modal-footer:after {\n  content: \" \";\n  display: table;\n}\n.clearfix:after,\n.dl-horizontal dd:after,\n.container:after,\n.container-fluid:after,\n.row:after,\n.form-horizontal .form-group:after,\n.btn-toolbar:after,\n.btn-group-vertical > .btn-group:after,\n.nav:after,\n.navbar:after,\n.navbar-header:after,\n.navbar-collapse:after,\n.pager:after,\n.panel-body:after,\n.modal-footer:after {\n  clear: both;\n}\n.center-block {\n  display: block;\n  margin-left: auto;\n  margin-right: auto;\n}\n.pull-right {\n  float: right !important;\n}\n.pull-left {\n  float: left !important;\n}\n.hide {\n  display: none !important;\n}\n.show {\n  display: block !important;\n}\n.invisible {\n  visibility: hidden;\n}\n.text-hide {\n  font: 0/0 a;\n  color: transparent;\n  text-shadow: none;\n  background-color: transparent;\n  border: 0;\n}\n.hidden {\n  display: none !important;\n  visibility: hidden !important;\n}\n.affix {\n  position: fixed;\n}\n@-ms-viewport {\n  width: device-width;\n}\n.visible-xs,\n.visible-sm,\n.visible-md,\n.visible-lg {\n  display: none !important;\n}\n.visible-xs-block,\n.visible-xs-inline,\n.visible-xs-inline-block,\n.visible-sm-block,\n.visible-sm-inline,\n.visible-sm-inline-block,\n.visible-md-block,\n.visible-md-inline,\n.visible-md-inline-block,\n.visible-lg-block,\n.visible-lg-inline,\n.visible-lg-inline-block {\n  display: none !important;\n}\n@media (max-width: 767px) {\n  .visible-xs {\n    display: block !important;\n  }\n  table.visible-xs {\n    display: table;\n  }\n  tr.visible-xs {\n    display: table-row !important;\n  }\n  th.visible-xs,\n  td.visible-xs {\n    display: table-cell !important;\n  }\n}\n@media (max-width: 767px) {\n  .visible-xs-block {\n    display: block !important;\n  }\n}\n@media (max-width: 767px) {\n  .visible-xs-inline {\n    display: inline !important;\n  }\n}\n@media (max-width: 767px) {\n  .visible-xs-inline-block {\n    display: inline-block !important;\n  }\n}\n@media (min-width: 768px) and (max-width: 1030px) {\n  .visible-sm {\n    display: block !important;\n  }\n  table.visible-sm {\n    display: table;\n  }\n  tr.visible-sm {\n    display: table-row !important;\n  }\n  th.visible-sm,\n  td.visible-sm {\n    display: table-cell !important;\n  }\n}\n@media (min-width: 768px) and (max-width: 1030px) {\n  .visible-sm-block {\n    display: block !important;\n  }\n}\n@media (min-width: 768px) and (max-width: 1030px) {\n  .visible-sm-inline {\n    display: inline !important;\n  }\n}\n@media (min-width: 768px) and (max-width: 1030px) {\n  .visible-sm-inline-block {\n    display: inline-block !important;\n  }\n}\n@media (min-width: 1031px) and (max-width: 1199px) {\n  .visible-md {\n    display: block !important;\n  }\n  table.visible-md {\n    display: table;\n  }\n  tr.visible-md {\n    display: table-row !important;\n  }\n  th.visible-md,\n  td.visible-md {\n    display: table-cell !important;\n  }\n}\n@media (min-width: 1031px) and (max-width: 1199px) {\n  .visible-md-block {\n    display: block !important;\n  }\n}\n@media (min-width: 1031px) and (max-width: 1199px) {\n  .visible-md-inline {\n    display: inline !important;\n  }\n}\n@media (min-width: 1031px) and (max-width: 1199px) {\n  .visible-md-inline-block {\n    display: inline-block !important;\n  }\n}\n@media (min-width: 1200px) {\n  .visible-lg {\n    display: block !important;\n  }\n  table.visible-lg {\n    display: table;\n  }\n  tr.visible-lg {\n    display: table-row !important;\n  }\n  th.visible-lg,\n  td.visible-lg {\n    display: table-cell !important;\n  }\n}\n@media (min-width: 1200px) {\n  .visible-lg-block {\n    display: block !important;\n  }\n}\n@media (min-width: 1200px) {\n  .visible-lg-inline {\n    display: inline !important;\n  }\n}\n@media (min-width: 1200px) {\n  .visible-lg-inline-block {\n    display: inline-block !important;\n  }\n}\n@media (max-width: 767px) {\n  .hidden-xs {\n    display: none !important;\n  }\n}\n@media (min-width: 768px) and (max-width: 1030px) {\n  .hidden-sm {\n    display: none !important;\n  }\n}\n@media (min-width: 1031px) and (max-width: 1199px) {\n  .hidden-md {\n    display: none !important;\n  }\n}\n@media (min-width: 1200px) {\n  .hidden-lg {\n    display: none !important;\n  }\n}\n.visible-print {\n  display: none !important;\n}\n@media print {\n  .visible-print {\n    display: block !important;\n  }\n  table.visible-print {\n    display: table;\n  }\n  tr.visible-print {\n    display: table-row !important;\n  }\n  th.visible-print,\n  td.visible-print {\n    display: table-cell !important;\n  }\n}\n.visible-print-block {\n  display: none !important;\n}\n@media print {\n  .visible-print-block {\n    display: block !important;\n  }\n}\n.visible-print-inline {\n  display: none !important;\n}\n@media print {\n  .visible-print-inline {\n    display: inline !important;\n  }\n}\n.visible-print-inline-block {\n  display: none !important;\n}\n@media print {\n  .visible-print-inline-block {\n    display: inline-block !important;\n  }\n}\n@media print {\n  .hidden-print {\n    display: none !important;\n  }\n}\n/*\n * Social Buttons for Bootstrap\n *\n * Copyright 2013-2014 Panayiotis Lipiridis\n * Licensed under the MIT License\n *\n * https://github.com/lipis/bootstrap-social\n */\n.btn-social {\n  position: relative;\n  padding-left: 44px;\n  text-align: left;\n  white-space: nowrap;\n  overflow: hidden;\n  text-overflow: ellipsis;\n}\n.btn-social > :first-child {\n  position: absolute;\n  left: 0;\n  top: 0;\n  bottom: 0;\n  width: 32px;\n  line-height: 34px;\n  font-size: 1.6em;\n  text-align: center;\n  border-right: 1px solid rgba(0, 0, 0, 0.2);\n}\n.btn-social.btn-lg {\n  padding-left: 61px;\n}\n.btn-social.btn-lg :first-child {\n  line-height: 45px;\n  width: 45px;\n  font-size: 1.8em;\n}\n.btn-social.btn-sm {\n  padding-left: 38px;\n}\n.btn-social.btn-sm :first-child {\n  line-height: 28px;\n  width: 28px;\n  font-size: 1.4em;\n}\n.btn-social.btn-xs {\n  padding-left: 30px;\n}\n.btn-social.btn-xs :first-child {\n  line-height: 20px;\n  width: 20px;\n  font-size: 1.2em;\n}\n.btn-social-icon {\n  position: relative;\n  padding-left: 44px;\n  text-align: left;\n  white-space: nowrap;\n  overflow: hidden;\n  text-overflow: ellipsis;\n  width: 250px;\n  margin: auto;\n  height: 34px;\n  width: 34px;\n  padding: 0;\n}\n.btn-social-icon > :first-child {\n  position: absolute;\n  left: 0;\n  top: 0;\n  bottom: 0;\n  width: 32px;\n  line-height: 34px;\n  font-size: 1.6em;\n  text-align: center;\n  border-right: 1px solid rgba(0, 0, 0, 0.2);\n}\n.btn-social-icon.btn-lg {\n  padding-left: 61px;\n}\n.btn-social-icon.btn-lg :first-child {\n  line-height: 45px;\n  width: 45px;\n  font-size: 1.8em;\n}\n.btn-social-icon.btn-sm {\n  padding-left: 38px;\n}\n.btn-social-icon.btn-sm :first-child {\n  line-height: 28px;\n  width: 28px;\n  font-size: 1.4em;\n}\n.btn-social-icon.btn-xs {\n  padding-left: 30px;\n}\n.btn-social-icon.btn-xs :first-child {\n  line-height: 20px;\n  width: 20px;\n  font-size: 1.2em;\n}\n.btn-social-icon :first-child {\n  border: none;\n  text-align: center;\n  width: 100%!important;\n}\n.btn-social-icon.btn-lg {\n  height: 45px;\n  width: 45px;\n  padding-left: 0;\n  padding-right: 0;\n}\n.btn-social-icon.btn-sm {\n  height: 30px;\n  width: 30px;\n  padding-left: 0;\n  padding-right: 0;\n}\n.btn-social-icon.btn-xs {\n  height: 22px;\n  width: 22px;\n  padding-left: 0;\n  padding-right: 0;\n}\n.btn-adn {\n  color: #d87a68;\n  background-color: #d87a68;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-adn:hover,\n.btn-adn:focus,\n.btn-adn.focus,\n.btn-adn:active,\n.btn-adn.active,\n.open > .dropdown-toggle.btn-adn {\n  color: #eeeeee;\n  background-color: #d87a68;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-adn:active,\n.btn-adn.active,\n.open > .dropdown-toggle.btn-adn {\n  background-image: none;\n}\n.btn-adn.disabled,\n.btn-adn[disabled],\nfieldset[disabled] .btn-adn,\n.btn-adn.disabled:hover,\n.btn-adn[disabled]:hover,\nfieldset[disabled] .btn-adn:hover,\n.btn-adn.disabled:focus,\n.btn-adn[disabled]:focus,\nfieldset[disabled] .btn-adn:focus,\n.btn-adn.disabled.focus,\n.btn-adn[disabled].focus,\nfieldset[disabled] .btn-adn.focus,\n.btn-adn.disabled:active,\n.btn-adn[disabled]:active,\nfieldset[disabled] .btn-adn:active,\n.btn-adn.disabled.active,\n.btn-adn[disabled].active,\nfieldset[disabled] .btn-adn.active {\n  background-color: #d87a68;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-adn .badge {\n  color: #d87a68;\n  background-color: #d87a68;\n}\n.btn-bitbucket {\n  color: #205081;\n  background-color: #205081;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-bitbucket:hover,\n.btn-bitbucket:focus,\n.btn-bitbucket.focus,\n.btn-bitbucket:active,\n.btn-bitbucket.active,\n.open > .dropdown-toggle.btn-bitbucket {\n  color: #eeeeee;\n  background-color: #205081;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-bitbucket:active,\n.btn-bitbucket.active,\n.open > .dropdown-toggle.btn-bitbucket {\n  background-image: none;\n}\n.btn-bitbucket.disabled,\n.btn-bitbucket[disabled],\nfieldset[disabled] .btn-bitbucket,\n.btn-bitbucket.disabled:hover,\n.btn-bitbucket[disabled]:hover,\nfieldset[disabled] .btn-bitbucket:hover,\n.btn-bitbucket.disabled:focus,\n.btn-bitbucket[disabled]:focus,\nfieldset[disabled] .btn-bitbucket:focus,\n.btn-bitbucket.disabled.focus,\n.btn-bitbucket[disabled].focus,\nfieldset[disabled] .btn-bitbucket.focus,\n.btn-bitbucket.disabled:active,\n.btn-bitbucket[disabled]:active,\nfieldset[disabled] .btn-bitbucket:active,\n.btn-bitbucket.disabled.active,\n.btn-bitbucket[disabled].active,\nfieldset[disabled] .btn-bitbucket.active {\n  background-color: #205081;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-bitbucket .badge {\n  color: #205081;\n  background-color: #205081;\n}\n.btn-dropbox {\n  color: #1087dd;\n  background-color: #1087dd;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-dropbox:hover,\n.btn-dropbox:focus,\n.btn-dropbox.focus,\n.btn-dropbox:active,\n.btn-dropbox.active,\n.open > .dropdown-toggle.btn-dropbox {\n  color: #eeeeee;\n  background-color: #1087dd;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-dropbox:active,\n.btn-dropbox.active,\n.open > .dropdown-toggle.btn-dropbox {\n  background-image: none;\n}\n.btn-dropbox.disabled,\n.btn-dropbox[disabled],\nfieldset[disabled] .btn-dropbox,\n.btn-dropbox.disabled:hover,\n.btn-dropbox[disabled]:hover,\nfieldset[disabled] .btn-dropbox:hover,\n.btn-dropbox.disabled:focus,\n.btn-dropbox[disabled]:focus,\nfieldset[disabled] .btn-dropbox:focus,\n.btn-dropbox.disabled.focus,\n.btn-dropbox[disabled].focus,\nfieldset[disabled] .btn-dropbox.focus,\n.btn-dropbox.disabled:active,\n.btn-dropbox[disabled]:active,\nfieldset[disabled] .btn-dropbox:active,\n.btn-dropbox.disabled.active,\n.btn-dropbox[disabled].active,\nfieldset[disabled] .btn-dropbox.active {\n  background-color: #1087dd;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-dropbox .badge {\n  color: #1087dd;\n  background-color: #1087dd;\n}\n.btn-facebook {\n  color: #3b5998;\n  background-color: #3b5998;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-facebook:hover,\n.btn-facebook:focus,\n.btn-facebook.focus,\n.btn-facebook:active,\n.btn-facebook.active,\n.open > .dropdown-toggle.btn-facebook {\n  color: #eeeeee;\n  background-color: #3b5998;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-facebook:active,\n.btn-facebook.active,\n.open > .dropdown-toggle.btn-facebook {\n  background-image: none;\n}\n.btn-facebook.disabled,\n.btn-facebook[disabled],\nfieldset[disabled] .btn-facebook,\n.btn-facebook.disabled:hover,\n.btn-facebook[disabled]:hover,\nfieldset[disabled] .btn-facebook:hover,\n.btn-facebook.disabled:focus,\n.btn-facebook[disabled]:focus,\nfieldset[disabled] .btn-facebook:focus,\n.btn-facebook.disabled.focus,\n.btn-facebook[disabled].focus,\nfieldset[disabled] .btn-facebook.focus,\n.btn-facebook.disabled:active,\n.btn-facebook[disabled]:active,\nfieldset[disabled] .btn-facebook:active,\n.btn-facebook.disabled.active,\n.btn-facebook[disabled].active,\nfieldset[disabled] .btn-facebook.active {\n  background-color: #3b5998;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-facebook .badge {\n  color: #3b5998;\n  background-color: #3b5998;\n}\n.btn-flickr {\n  color: #ff0084;\n  background-color: #ff0084;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-flickr:hover,\n.btn-flickr:focus,\n.btn-flickr.focus,\n.btn-flickr:active,\n.btn-flickr.active,\n.open > .dropdown-toggle.btn-flickr {\n  color: #eeeeee;\n  background-color: #ff0084;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-flickr:active,\n.btn-flickr.active,\n.open > .dropdown-toggle.btn-flickr {\n  background-image: none;\n}\n.btn-flickr.disabled,\n.btn-flickr[disabled],\nfieldset[disabled] .btn-flickr,\n.btn-flickr.disabled:hover,\n.btn-flickr[disabled]:hover,\nfieldset[disabled] .btn-flickr:hover,\n.btn-flickr.disabled:focus,\n.btn-flickr[disabled]:focus,\nfieldset[disabled] .btn-flickr:focus,\n.btn-flickr.disabled.focus,\n.btn-flickr[disabled].focus,\nfieldset[disabled] .btn-flickr.focus,\n.btn-flickr.disabled:active,\n.btn-flickr[disabled]:active,\nfieldset[disabled] .btn-flickr:active,\n.btn-flickr.disabled.active,\n.btn-flickr[disabled].active,\nfieldset[disabled] .btn-flickr.active {\n  background-color: #ff0084;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-flickr .badge {\n  color: #ff0084;\n  background-color: #ff0084;\n}\n.btn-foursquare {\n  color: #f94877;\n  background-color: #f94877;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-foursquare:hover,\n.btn-foursquare:focus,\n.btn-foursquare.focus,\n.btn-foursquare:active,\n.btn-foursquare.active,\n.open > .dropdown-toggle.btn-foursquare {\n  color: #eeeeee;\n  background-color: #f94877;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-foursquare:active,\n.btn-foursquare.active,\n.open > .dropdown-toggle.btn-foursquare {\n  background-image: none;\n}\n.btn-foursquare.disabled,\n.btn-foursquare[disabled],\nfieldset[disabled] .btn-foursquare,\n.btn-foursquare.disabled:hover,\n.btn-foursquare[disabled]:hover,\nfieldset[disabled] .btn-foursquare:hover,\n.btn-foursquare.disabled:focus,\n.btn-foursquare[disabled]:focus,\nfieldset[disabled] .btn-foursquare:focus,\n.btn-foursquare.disabled.focus,\n.btn-foursquare[disabled].focus,\nfieldset[disabled] .btn-foursquare.focus,\n.btn-foursquare.disabled:active,\n.btn-foursquare[disabled]:active,\nfieldset[disabled] .btn-foursquare:active,\n.btn-foursquare.disabled.active,\n.btn-foursquare[disabled].active,\nfieldset[disabled] .btn-foursquare.active {\n  background-color: #f94877;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-foursquare .badge {\n  color: #f94877;\n  background-color: #f94877;\n}\n.btn-github {\n  color: #444444;\n  background-color: #444444;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-github:hover,\n.btn-github:focus,\n.btn-github.focus,\n.btn-github:active,\n.btn-github.active,\n.open > .dropdown-toggle.btn-github {\n  color: #eeeeee;\n  background-color: #444444;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-github:active,\n.btn-github.active,\n.open > .dropdown-toggle.btn-github {\n  background-image: none;\n}\n.btn-github.disabled,\n.btn-github[disabled],\nfieldset[disabled] .btn-github,\n.btn-github.disabled:hover,\n.btn-github[disabled]:hover,\nfieldset[disabled] .btn-github:hover,\n.btn-github.disabled:focus,\n.btn-github[disabled]:focus,\nfieldset[disabled] .btn-github:focus,\n.btn-github.disabled.focus,\n.btn-github[disabled].focus,\nfieldset[disabled] .btn-github.focus,\n.btn-github.disabled:active,\n.btn-github[disabled]:active,\nfieldset[disabled] .btn-github:active,\n.btn-github.disabled.active,\n.btn-github[disabled].active,\nfieldset[disabled] .btn-github.active {\n  background-color: #444444;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-github .badge {\n  color: #444444;\n  background-color: #444444;\n}\n.btn-google-plus {\n  color: #dd4b39;\n  background-color: #dd4b39;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-google-plus:hover,\n.btn-google-plus:focus,\n.btn-google-plus.focus,\n.btn-google-plus:active,\n.btn-google-plus.active,\n.open > .dropdown-toggle.btn-google-plus {\n  color: #eeeeee;\n  background-color: #dd4b39;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-google-plus:active,\n.btn-google-plus.active,\n.open > .dropdown-toggle.btn-google-plus {\n  background-image: none;\n}\n.btn-google-plus.disabled,\n.btn-google-plus[disabled],\nfieldset[disabled] .btn-google-plus,\n.btn-google-plus.disabled:hover,\n.btn-google-plus[disabled]:hover,\nfieldset[disabled] .btn-google-plus:hover,\n.btn-google-plus.disabled:focus,\n.btn-google-plus[disabled]:focus,\nfieldset[disabled] .btn-google-plus:focus,\n.btn-google-plus.disabled.focus,\n.btn-google-plus[disabled].focus,\nfieldset[disabled] .btn-google-plus.focus,\n.btn-google-plus.disabled:active,\n.btn-google-plus[disabled]:active,\nfieldset[disabled] .btn-google-plus:active,\n.btn-google-plus.disabled.active,\n.btn-google-plus[disabled].active,\nfieldset[disabled] .btn-google-plus.active {\n  background-color: #dd4b39;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-google-plus .badge {\n  color: #dd4b39;\n  background-color: #dd4b39;\n}\n.btn-instagram {\n  color: #3f729b;\n  background-color: #3f729b;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-instagram:hover,\n.btn-instagram:focus,\n.btn-instagram.focus,\n.btn-instagram:active,\n.btn-instagram.active,\n.open > .dropdown-toggle.btn-instagram {\n  color: #eeeeee;\n  background-color: #3f729b;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-instagram:active,\n.btn-instagram.active,\n.open > .dropdown-toggle.btn-instagram {\n  background-image: none;\n}\n.btn-instagram.disabled,\n.btn-instagram[disabled],\nfieldset[disabled] .btn-instagram,\n.btn-instagram.disabled:hover,\n.btn-instagram[disabled]:hover,\nfieldset[disabled] .btn-instagram:hover,\n.btn-instagram.disabled:focus,\n.btn-instagram[disabled]:focus,\nfieldset[disabled] .btn-instagram:focus,\n.btn-instagram.disabled.focus,\n.btn-instagram[disabled].focus,\nfieldset[disabled] .btn-instagram.focus,\n.btn-instagram.disabled:active,\n.btn-instagram[disabled]:active,\nfieldset[disabled] .btn-instagram:active,\n.btn-instagram.disabled.active,\n.btn-instagram[disabled].active,\nfieldset[disabled] .btn-instagram.active {\n  background-color: #3f729b;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-instagram .badge {\n  color: #3f729b;\n  background-color: #3f729b;\n}\n.btn-linkedin {\n  color: #007bb6;\n  background-color: #007bb6;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-linkedin:hover,\n.btn-linkedin:focus,\n.btn-linkedin.focus,\n.btn-linkedin:active,\n.btn-linkedin.active,\n.open > .dropdown-toggle.btn-linkedin {\n  color: #eeeeee;\n  background-color: #007bb6;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-linkedin:active,\n.btn-linkedin.active,\n.open > .dropdown-toggle.btn-linkedin {\n  background-image: none;\n}\n.btn-linkedin.disabled,\n.btn-linkedin[disabled],\nfieldset[disabled] .btn-linkedin,\n.btn-linkedin.disabled:hover,\n.btn-linkedin[disabled]:hover,\nfieldset[disabled] .btn-linkedin:hover,\n.btn-linkedin.disabled:focus,\n.btn-linkedin[disabled]:focus,\nfieldset[disabled] .btn-linkedin:focus,\n.btn-linkedin.disabled.focus,\n.btn-linkedin[disabled].focus,\nfieldset[disabled] .btn-linkedin.focus,\n.btn-linkedin.disabled:active,\n.btn-linkedin[disabled]:active,\nfieldset[disabled] .btn-linkedin:active,\n.btn-linkedin.disabled.active,\n.btn-linkedin[disabled].active,\nfieldset[disabled] .btn-linkedin.active {\n  background-color: #007bb6;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-linkedin .badge {\n  color: #007bb6;\n  background-color: #007bb6;\n}\n.btn-microsoft {\n  color: #2672ec;\n  background-color: #2672ec;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-microsoft:hover,\n.btn-microsoft:focus,\n.btn-microsoft.focus,\n.btn-microsoft:active,\n.btn-microsoft.active,\n.open > .dropdown-toggle.btn-microsoft {\n  color: #eeeeee;\n  background-color: #2672ec;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-microsoft:active,\n.btn-microsoft.active,\n.open > .dropdown-toggle.btn-microsoft {\n  background-image: none;\n}\n.btn-microsoft.disabled,\n.btn-microsoft[disabled],\nfieldset[disabled] .btn-microsoft,\n.btn-microsoft.disabled:hover,\n.btn-microsoft[disabled]:hover,\nfieldset[disabled] .btn-microsoft:hover,\n.btn-microsoft.disabled:focus,\n.btn-microsoft[disabled]:focus,\nfieldset[disabled] .btn-microsoft:focus,\n.btn-microsoft.disabled.focus,\n.btn-microsoft[disabled].focus,\nfieldset[disabled] .btn-microsoft.focus,\n.btn-microsoft.disabled:active,\n.btn-microsoft[disabled]:active,\nfieldset[disabled] .btn-microsoft:active,\n.btn-microsoft.disabled.active,\n.btn-microsoft[disabled].active,\nfieldset[disabled] .btn-microsoft.active {\n  background-color: #2672ec;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-microsoft .badge {\n  color: #2672ec;\n  background-color: #2672ec;\n}\n.btn-openid {\n  color: #f7931e;\n  background-color: #f7931e;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-openid:hover,\n.btn-openid:focus,\n.btn-openid.focus,\n.btn-openid:active,\n.btn-openid.active,\n.open > .dropdown-toggle.btn-openid {\n  color: #eeeeee;\n  background-color: #f7931e;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-openid:active,\n.btn-openid.active,\n.open > .dropdown-toggle.btn-openid {\n  background-image: none;\n}\n.btn-openid.disabled,\n.btn-openid[disabled],\nfieldset[disabled] .btn-openid,\n.btn-openid.disabled:hover,\n.btn-openid[disabled]:hover,\nfieldset[disabled] .btn-openid:hover,\n.btn-openid.disabled:focus,\n.btn-openid[disabled]:focus,\nfieldset[disabled] .btn-openid:focus,\n.btn-openid.disabled.focus,\n.btn-openid[disabled].focus,\nfieldset[disabled] .btn-openid.focus,\n.btn-openid.disabled:active,\n.btn-openid[disabled]:active,\nfieldset[disabled] .btn-openid:active,\n.btn-openid.disabled.active,\n.btn-openid[disabled].active,\nfieldset[disabled] .btn-openid.active {\n  background-color: #f7931e;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-openid .badge {\n  color: #f7931e;\n  background-color: #f7931e;\n}\n.btn-pinterest {\n  color: #cb2027;\n  background-color: #cb2027;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-pinterest:hover,\n.btn-pinterest:focus,\n.btn-pinterest.focus,\n.btn-pinterest:active,\n.btn-pinterest.active,\n.open > .dropdown-toggle.btn-pinterest {\n  color: #eeeeee;\n  background-color: #cb2027;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-pinterest:active,\n.btn-pinterest.active,\n.open > .dropdown-toggle.btn-pinterest {\n  background-image: none;\n}\n.btn-pinterest.disabled,\n.btn-pinterest[disabled],\nfieldset[disabled] .btn-pinterest,\n.btn-pinterest.disabled:hover,\n.btn-pinterest[disabled]:hover,\nfieldset[disabled] .btn-pinterest:hover,\n.btn-pinterest.disabled:focus,\n.btn-pinterest[disabled]:focus,\nfieldset[disabled] .btn-pinterest:focus,\n.btn-pinterest.disabled.focus,\n.btn-pinterest[disabled].focus,\nfieldset[disabled] .btn-pinterest.focus,\n.btn-pinterest.disabled:active,\n.btn-pinterest[disabled]:active,\nfieldset[disabled] .btn-pinterest:active,\n.btn-pinterest.disabled.active,\n.btn-pinterest[disabled].active,\nfieldset[disabled] .btn-pinterest.active {\n  background-color: #cb2027;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-pinterest .badge {\n  color: #cb2027;\n  background-color: #cb2027;\n}\n.btn-reddit {\n  color: #000;\n  background-color: #eff7ff;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-reddit:hover,\n.btn-reddit:focus,\n.btn-reddit.focus,\n.btn-reddit:active,\n.btn-reddit.active,\n.open > .dropdown-toggle.btn-reddit {\n  color: #eeeeee;\n  background-color: #eff7ff;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-reddit:active,\n.btn-reddit.active,\n.open > .dropdown-toggle.btn-reddit {\n  background-image: none;\n}\n.btn-reddit.disabled,\n.btn-reddit[disabled],\nfieldset[disabled] .btn-reddit,\n.btn-reddit.disabled:hover,\n.btn-reddit[disabled]:hover,\nfieldset[disabled] .btn-reddit:hover,\n.btn-reddit.disabled:focus,\n.btn-reddit[disabled]:focus,\nfieldset[disabled] .btn-reddit:focus,\n.btn-reddit.disabled.focus,\n.btn-reddit[disabled].focus,\nfieldset[disabled] .btn-reddit.focus,\n.btn-reddit.disabled:active,\n.btn-reddit[disabled]:active,\nfieldset[disabled] .btn-reddit:active,\n.btn-reddit.disabled.active,\n.btn-reddit[disabled].active,\nfieldset[disabled] .btn-reddit.active {\n  background-color: #eff7ff;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-reddit .badge {\n  color: #eff7ff;\n  background-color: #000;\n}\n.btn-soundcloud {\n  color: #ff5500;\n  background-color: #ff5500;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-soundcloud:hover,\n.btn-soundcloud:focus,\n.btn-soundcloud.focus,\n.btn-soundcloud:active,\n.btn-soundcloud.active,\n.open > .dropdown-toggle.btn-soundcloud {\n  color: #eeeeee;\n  background-color: #ff5500;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-soundcloud:active,\n.btn-soundcloud.active,\n.open > .dropdown-toggle.btn-soundcloud {\n  background-image: none;\n}\n.btn-soundcloud.disabled,\n.btn-soundcloud[disabled],\nfieldset[disabled] .btn-soundcloud,\n.btn-soundcloud.disabled:hover,\n.btn-soundcloud[disabled]:hover,\nfieldset[disabled] .btn-soundcloud:hover,\n.btn-soundcloud.disabled:focus,\n.btn-soundcloud[disabled]:focus,\nfieldset[disabled] .btn-soundcloud:focus,\n.btn-soundcloud.disabled.focus,\n.btn-soundcloud[disabled].focus,\nfieldset[disabled] .btn-soundcloud.focus,\n.btn-soundcloud.disabled:active,\n.btn-soundcloud[disabled]:active,\nfieldset[disabled] .btn-soundcloud:active,\n.btn-soundcloud.disabled.active,\n.btn-soundcloud[disabled].active,\nfieldset[disabled] .btn-soundcloud.active {\n  background-color: #ff5500;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-soundcloud .badge {\n  color: #ff5500;\n  background-color: #ff5500;\n}\n.btn-tumblr {\n  color: #2c4762;\n  background-color: #2c4762;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-tumblr:hover,\n.btn-tumblr:focus,\n.btn-tumblr.focus,\n.btn-tumblr:active,\n.btn-tumblr.active,\n.open > .dropdown-toggle.btn-tumblr {\n  color: #eeeeee;\n  background-color: #2c4762;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-tumblr:active,\n.btn-tumblr.active,\n.open > .dropdown-toggle.btn-tumblr {\n  background-image: none;\n}\n.btn-tumblr.disabled,\n.btn-tumblr[disabled],\nfieldset[disabled] .btn-tumblr,\n.btn-tumblr.disabled:hover,\n.btn-tumblr[disabled]:hover,\nfieldset[disabled] .btn-tumblr:hover,\n.btn-tumblr.disabled:focus,\n.btn-tumblr[disabled]:focus,\nfieldset[disabled] .btn-tumblr:focus,\n.btn-tumblr.disabled.focus,\n.btn-tumblr[disabled].focus,\nfieldset[disabled] .btn-tumblr.focus,\n.btn-tumblr.disabled:active,\n.btn-tumblr[disabled]:active,\nfieldset[disabled] .btn-tumblr:active,\n.btn-tumblr.disabled.active,\n.btn-tumblr[disabled].active,\nfieldset[disabled] .btn-tumblr.active {\n  background-color: #2c4762;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-tumblr .badge {\n  color: #2c4762;\n  background-color: #2c4762;\n}\n.btn-twitter {\n  color: #55acee;\n  background-color: #55acee;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-twitter:hover,\n.btn-twitter:focus,\n.btn-twitter.focus,\n.btn-twitter:active,\n.btn-twitter.active,\n.open > .dropdown-toggle.btn-twitter {\n  color: #eeeeee;\n  background-color: #55acee;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-twitter:active,\n.btn-twitter.active,\n.open > .dropdown-toggle.btn-twitter {\n  background-image: none;\n}\n.btn-twitter.disabled,\n.btn-twitter[disabled],\nfieldset[disabled] .btn-twitter,\n.btn-twitter.disabled:hover,\n.btn-twitter[disabled]:hover,\nfieldset[disabled] .btn-twitter:hover,\n.btn-twitter.disabled:focus,\n.btn-twitter[disabled]:focus,\nfieldset[disabled] .btn-twitter:focus,\n.btn-twitter.disabled.focus,\n.btn-twitter[disabled].focus,\nfieldset[disabled] .btn-twitter.focus,\n.btn-twitter.disabled:active,\n.btn-twitter[disabled]:active,\nfieldset[disabled] .btn-twitter:active,\n.btn-twitter.disabled.active,\n.btn-twitter[disabled].active,\nfieldset[disabled] .btn-twitter.active {\n  background-color: #55acee;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-twitter .badge {\n  color: #55acee;\n  background-color: #55acee;\n}\n.btn-vimeo {\n  color: #1ab7ea;\n  background-color: #1ab7ea;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-vimeo:hover,\n.btn-vimeo:focus,\n.btn-vimeo.focus,\n.btn-vimeo:active,\n.btn-vimeo.active,\n.open > .dropdown-toggle.btn-vimeo {\n  color: #eeeeee;\n  background-color: #1ab7ea;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-vimeo:active,\n.btn-vimeo.active,\n.open > .dropdown-toggle.btn-vimeo {\n  background-image: none;\n}\n.btn-vimeo.disabled,\n.btn-vimeo[disabled],\nfieldset[disabled] .btn-vimeo,\n.btn-vimeo.disabled:hover,\n.btn-vimeo[disabled]:hover,\nfieldset[disabled] .btn-vimeo:hover,\n.btn-vimeo.disabled:focus,\n.btn-vimeo[disabled]:focus,\nfieldset[disabled] .btn-vimeo:focus,\n.btn-vimeo.disabled.focus,\n.btn-vimeo[disabled].focus,\nfieldset[disabled] .btn-vimeo.focus,\n.btn-vimeo.disabled:active,\n.btn-vimeo[disabled]:active,\nfieldset[disabled] .btn-vimeo:active,\n.btn-vimeo.disabled.active,\n.btn-vimeo[disabled].active,\nfieldset[disabled] .btn-vimeo.active {\n  background-color: #1ab7ea;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-vimeo .badge {\n  color: #1ab7ea;\n  background-color: #1ab7ea;\n}\n.btn-vk {\n  color: #587ea3;\n  background-color: #587ea3;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-vk:hover,\n.btn-vk:focus,\n.btn-vk.focus,\n.btn-vk:active,\n.btn-vk.active,\n.open > .dropdown-toggle.btn-vk {\n  color: #eeeeee;\n  background-color: #587ea3;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-vk:active,\n.btn-vk.active,\n.open > .dropdown-toggle.btn-vk {\n  background-image: none;\n}\n.btn-vk.disabled,\n.btn-vk[disabled],\nfieldset[disabled] .btn-vk,\n.btn-vk.disabled:hover,\n.btn-vk[disabled]:hover,\nfieldset[disabled] .btn-vk:hover,\n.btn-vk.disabled:focus,\n.btn-vk[disabled]:focus,\nfieldset[disabled] .btn-vk:focus,\n.btn-vk.disabled.focus,\n.btn-vk[disabled].focus,\nfieldset[disabled] .btn-vk.focus,\n.btn-vk.disabled:active,\n.btn-vk[disabled]:active,\nfieldset[disabled] .btn-vk:active,\n.btn-vk.disabled.active,\n.btn-vk[disabled].active,\nfieldset[disabled] .btn-vk.active {\n  background-color: #587ea3;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-vk .badge {\n  color: #587ea3;\n  background-color: #587ea3;\n}\n.btn-yahoo {\n  color: #720e9e;\n  background-color: #720e9e;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-yahoo:hover,\n.btn-yahoo:focus,\n.btn-yahoo.focus,\n.btn-yahoo:active,\n.btn-yahoo.active,\n.open > .dropdown-toggle.btn-yahoo {\n  color: #eeeeee;\n  background-color: #720e9e;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-yahoo:active,\n.btn-yahoo.active,\n.open > .dropdown-toggle.btn-yahoo {\n  background-image: none;\n}\n.btn-yahoo.disabled,\n.btn-yahoo[disabled],\nfieldset[disabled] .btn-yahoo,\n.btn-yahoo.disabled:hover,\n.btn-yahoo[disabled]:hover,\nfieldset[disabled] .btn-yahoo:hover,\n.btn-yahoo.disabled:focus,\n.btn-yahoo[disabled]:focus,\nfieldset[disabled] .btn-yahoo:focus,\n.btn-yahoo.disabled.focus,\n.btn-yahoo[disabled].focus,\nfieldset[disabled] .btn-yahoo.focus,\n.btn-yahoo.disabled:active,\n.btn-yahoo[disabled]:active,\nfieldset[disabled] .btn-yahoo:active,\n.btn-yahoo.disabled.active,\n.btn-yahoo[disabled].active,\nfieldset[disabled] .btn-yahoo.active {\n  background-color: #720e9e;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-yahoo .badge {\n  color: #720e9e;\n  background-color: #720e9e;\n}\n/*!\nIonicons, v2.0.0\nCreated by Ben Sperry for the Ionic Framework, http://ionicons.com/\nhttps://twitter.com/benjsperry  https://twitter.com/ionicframework\nMIT License: https://github.com/driftyco/ionicons\n*/\n@font-face {\n  font-family: \"Ionicons\";\n  src: url(\"../fonts/ionicons.eot?v=2.0.0\");\n  src: url(\"../fonts/ionicons.eot?v=2.0.0#iefix\") format(\"embedded-opentype\"), url(\"../fonts/ionicons.ttf?v=2.0.0\") format(\"truetype\"), url(\"../fonts/ionicons.woff?v=2.0.0\") format(\"woff\"), url(\"../fonts/ionicons.svg?v=2.0.0#Ionicons\") format(\"svg\");\n  font-weight: normal;\n  font-style: normal;\n}\n.ion,\n.ion-loading-a,\n.ion-loading-b,\n.ion-loading-c,\n.ion-loading-d,\n.ion-looping,\n.ion-refreshing,\n.ion-ios7-reloading,\n.ionicons,\n.ion-alert:before,\n.ion-alert-circled:before,\n.ion-android-add:before,\n.ion-android-add-circle:before,\n.ion-android-alarm-clock:before,\n.ion-android-alert:before,\n.ion-android-apps:before,\n.ion-android-archive:before,\n.ion-android-arrow-back:before,\n.ion-android-arrow-down:before,\n.ion-android-arrow-dropdown:before,\n.ion-android-arrow-dropdown-circle:before,\n.ion-android-arrow-dropleft:before,\n.ion-android-arrow-dropleft-circle:before,\n.ion-android-arrow-dropright:before,\n.ion-android-arrow-dropright-circle:before,\n.ion-android-arrow-dropup:before,\n.ion-android-arrow-dropup-circle:before,\n.ion-android-arrow-forward:before,\n.ion-android-arrow-up:before,\n.ion-android-attach:before,\n.ion-android-bar:before,\n.ion-android-bicycle:before,\n.ion-android-boat:before,\n.ion-android-bookmark:before,\n.ion-android-bulb:before,\n.ion-android-bus:before,\n.ion-android-calendar:before,\n.ion-android-call:before,\n.ion-android-camera:before,\n.ion-android-cancel:before,\n.ion-android-car:before,\n.ion-android-cart:before,\n.ion-android-chat:before,\n.ion-android-checkbox:before,\n.ion-android-checkbox-blank:before,\n.ion-android-checkbox-outline:before,\n.ion-android-checkbox-outline-blank:before,\n.ion-android-checkmark-circle:before,\n.ion-android-clipboard:before,\n.ion-android-close:before,\n.ion-android-cloud:before,\n.ion-android-cloud-circle:before,\n.ion-android-cloud-done:before,\n.ion-android-cloud-outline:before,\n.ion-android-color-palette:before,\n.ion-android-compass:before,\n.ion-android-contact:before,\n.ion-android-contacts:before,\n.ion-android-contract:before,\n.ion-android-create:before,\n.ion-android-delete:before,\n.ion-android-desktop:before,\n.ion-android-document:before,\n.ion-android-done:before,\n.ion-android-done-all:before,\n.ion-android-download:before,\n.ion-android-drafts:before,\n.ion-android-exit:before,\n.ion-android-expand:before,\n.ion-android-favorite:before,\n.ion-android-favorite-outline:before,\n.ion-android-film:before,\n.ion-android-folder:before,\n.ion-android-folder-open:before,\n.ion-android-funnel:before,\n.ion-android-globe:before,\n.ion-android-hand:before,\n.ion-android-hangout:before,\n.ion-android-happy:before,\n.ion-android-home:before,\n.ion-android-image:before,\n.ion-android-laptop:before,\n.ion-android-list:before,\n.ion-android-locate:before,\n.ion-android-lock:before,\n.ion-android-mail:before,\n.ion-android-map:before,\n.ion-android-menu:before,\n.ion-android-microphone:before,\n.ion-android-microphone-off:before,\n.ion-android-more-horizontal:before,\n.ion-android-more-vertical:before,\n.ion-android-navigate:before,\n.ion-android-notifications:before,\n.ion-android-notifications-none:before,\n.ion-android-notifications-off:before,\n.ion-android-open:before,\n.ion-android-options:before,\n.ion-android-people:before,\n.ion-android-person:before,\n.ion-android-person-add:before,\n.ion-android-phone-landscape:before,\n.ion-android-phone-portrait:before,\n.ion-android-pin:before,\n.ion-android-plane:before,\n.ion-android-playstore:before,\n.ion-android-print:before,\n.ion-android-radio-button-off:before,\n.ion-android-radio-button-on:before,\n.ion-android-refresh:before,\n.ion-android-remove:before,\n.ion-android-remove-circle:before,\n.ion-android-restaurant:before,\n.ion-android-sad:before,\n.ion-android-search:before,\n.ion-android-send:before,\n.ion-android-settings:before,\n.ion-android-share:before,\n.ion-android-share-alt:before,\n.ion-android-star:before,\n.ion-android-star-half:before,\n.ion-android-star-outline:before,\n.ion-android-stopwatch:before,\n.ion-android-subway:before,\n.ion-android-sunny:before,\n.ion-android-sync:before,\n.ion-android-textsms:before,\n.ion-android-time:before,\n.ion-android-train:before,\n.ion-android-unlock:before,\n.ion-android-upload:before,\n.ion-android-volume-down:before,\n.ion-android-volume-mute:before,\n.ion-android-volume-off:before,\n.ion-android-volume-up:before,\n.ion-android-walk:before,\n.ion-android-warning:before,\n.ion-android-watch:before,\n.ion-android-wifi:before,\n.ion-aperture:before,\n.ion-archive:before,\n.ion-arrow-down-a:before,\n.ion-arrow-down-b:before,\n.ion-arrow-down-c:before,\n.ion-arrow-expand:before,\n.ion-arrow-graph-down-left:before,\n.ion-arrow-graph-down-right:before,\n.ion-arrow-graph-up-left:before,\n.ion-arrow-graph-up-right:before,\n.ion-arrow-left-a:before,\n.ion-arrow-left-b:before,\n.ion-arrow-left-c:before,\n.ion-arrow-move:before,\n.ion-arrow-resize:before,\n.ion-arrow-return-left:before,\n.ion-arrow-return-right:before,\n.ion-arrow-right-a:before,\n.ion-arrow-right-b:before,\n.ion-arrow-right-c:before,\n.ion-arrow-shrink:before,\n.ion-arrow-swap:before,\n.ion-arrow-up-a:before,\n.ion-arrow-up-b:before,\n.ion-arrow-up-c:before,\n.ion-asterisk:before,\n.ion-at:before,\n.ion-backspace:before,\n.ion-backspace-outline:before,\n.ion-bag:before,\n.ion-battery-charging:before,\n.ion-battery-empty:before,\n.ion-battery-full:before,\n.ion-battery-half:before,\n.ion-battery-low:before,\n.ion-beaker:before,\n.ion-beer:before,\n.ion-bluetooth:before,\n.ion-bonfire:before,\n.ion-bookmark:before,\n.ion-bowtie:before,\n.ion-briefcase:before,\n.ion-bug:before,\n.ion-calculator:before,\n.ion-calendar:before,\n.ion-camera:before,\n.ion-card:before,\n.ion-cash:before,\n.ion-chatbox:before,\n.ion-chatbox-working:before,\n.ion-chatboxes:before,\n.ion-chatbubble:before,\n.ion-chatbubble-working:before,\n.ion-chatbubbles:before,\n.ion-checkmark:before,\n.ion-checkmark-circled:before,\n.ion-checkmark-round:before,\n.ion-chevron-down:before,\n.ion-chevron-left:before,\n.ion-chevron-right:before,\n.ion-chevron-up:before,\n.ion-clipboard:before,\n.ion-clock:before,\n.ion-close:before,\n.ion-close-circled:before,\n.ion-close-round:before,\n.ion-closed-captioning:before,\n.ion-cloud:before,\n.ion-code:before,\n.ion-code-download:before,\n.ion-code-working:before,\n.ion-coffee:before,\n.ion-compass:before,\n.ion-compose:before,\n.ion-connection-bars:before,\n.ion-contrast:before,\n.ion-crop:before,\n.ion-cube:before,\n.ion-disc:before,\n.ion-document:before,\n.ion-document-text:before,\n.ion-drag:before,\n.ion-earth:before,\n.ion-easel:before,\n.ion-edit:before,\n.ion-egg:before,\n.ion-eject:before,\n.ion-email:before,\n.ion-email-unread:before,\n.ion-erlenmeyer-flask:before,\n.ion-erlenmeyer-flask-bubbles:before,\n.ion-eye:before,\n.ion-eye-disabled:before,\n.ion-female:before,\n.ion-filing:before,\n.ion-film-marker:before,\n.ion-fireball:before,\n.ion-flag:before,\n.ion-flame:before,\n.ion-flash:before,\n.ion-flash-off:before,\n.ion-folder:before,\n.ion-fork:before,\n.ion-fork-repo:before,\n.ion-forward:before,\n.ion-funnel:before,\n.ion-gear-a:before,\n.ion-gear-b:before,\n.ion-grid:before,\n.ion-hammer:before,\n.ion-happy:before,\n.ion-happy-outline:before,\n.ion-headphone:before,\n.ion-heart:before,\n.ion-heart-broken:before,\n.ion-help:before,\n.ion-help-buoy:before,\n.ion-help-circled:before,\n.ion-home:before,\n.ion-icecream:before,\n.ion-image:before,\n.ion-images:before,\n.ion-information:before,\n.ion-information-circled:before,\n.ion-ionic:before,\n.ion-ios-alarm:before,\n.ion-ios-alarm-outline:before,\n.ion-ios-albums:before,\n.ion-ios-albums-outline:before,\n.ion-ios-americanfootball:before,\n.ion-ios-americanfootball-outline:before,\n.ion-ios-analytics:before,\n.ion-ios-analytics-outline:before,\n.ion-ios-arrow-back:before,\n.ion-ios-arrow-down:before,\n.ion-ios-arrow-forward:before,\n.ion-ios-arrow-left:before,\n.ion-ios-arrow-right:before,\n.ion-ios-arrow-thin-down:before,\n.ion-ios-arrow-thin-left:before,\n.ion-ios-arrow-thin-right:before,\n.ion-ios-arrow-thin-up:before,\n.ion-ios-arrow-up:before,\n.ion-ios-at:before,\n.ion-ios-at-outline:before,\n.ion-ios-barcode:before,\n.ion-ios-barcode-outline:before,\n.ion-ios-baseball:before,\n.ion-ios-baseball-outline:before,\n.ion-ios-basketball:before,\n.ion-ios-basketball-outline:before,\n.ion-ios-bell:before,\n.ion-ios-bell-outline:before,\n.ion-ios-body:before,\n.ion-ios-body-outline:before,\n.ion-ios-bolt:before,\n.ion-ios-bolt-outline:before,\n.ion-ios-book:before,\n.ion-ios-book-outline:before,\n.ion-ios-bookmarks:before,\n.ion-ios-bookmarks-outline:before,\n.ion-ios-box:before,\n.ion-ios-box-outline:before,\n.ion-ios-briefcase:before,\n.ion-ios-briefcase-outline:before,\n.ion-ios-browsers:before,\n.ion-ios-browsers-outline:before,\n.ion-ios-calculator:before,\n.ion-ios-calculator-outline:before,\n.ion-ios-calendar:before,\n.ion-ios-calendar-outline:before,\n.ion-ios-camera:before,\n.ion-ios-camera-outline:before,\n.ion-ios-cart:before,\n.ion-ios-cart-outline:before,\n.ion-ios-chatboxes:before,\n.ion-ios-chatboxes-outline:before,\n.ion-ios-chatbubble:before,\n.ion-ios-chatbubble-outline:before,\n.ion-ios-checkmark:before,\n.ion-ios-checkmark-empty:before,\n.ion-ios-checkmark-outline:before,\n.ion-ios-circle-filled:before,\n.ion-ios-circle-outline:before,\n.ion-ios-clock:before,\n.ion-ios-clock-outline:before,\n.ion-ios-close:before,\n.ion-ios-close-empty:before,\n.ion-ios-close-outline:before,\n.ion-ios-cloud:before,\n.ion-ios-cloud-download:before,\n.ion-ios-cloud-download-outline:before,\n.ion-ios-cloud-outline:before,\n.ion-ios-cloud-upload:before,\n.ion-ios-cloud-upload-outline:before,\n.ion-ios-cloudy:before,\n.ion-ios-cloudy-night:before,\n.ion-ios-cloudy-night-outline:before,\n.ion-ios-cloudy-outline:before,\n.ion-ios-cog:before,\n.ion-ios-cog-outline:before,\n.ion-ios-color-filter:before,\n.ion-ios-color-filter-outline:before,\n.ion-ios-color-wand:before,\n.ion-ios-color-wand-outline:before,\n.ion-ios-compose:before,\n.ion-ios-compose-outline:before,\n.ion-ios-contact:before,\n.ion-ios-contact-outline:before,\n.ion-ios-copy:before,\n.ion-ios-copy-outline:before,\n.ion-ios-crop:before,\n.ion-ios-crop-strong:before,\n.ion-ios-download:before,\n.ion-ios-download-outline:before,\n.ion-ios-drag:before,\n.ion-ios-email:before,\n.ion-ios-email-outline:before,\n.ion-ios-eye:before,\n.ion-ios-eye-outline:before,\n.ion-ios-fastforward:before,\n.ion-ios-fastforward-outline:before,\n.ion-ios-filing:before,\n.ion-ios-filing-outline:before,\n.ion-ios-film:before,\n.ion-ios-film-outline:before,\n.ion-ios-flag:before,\n.ion-ios-flag-outline:before,\n.ion-ios-flame:before,\n.ion-ios-flame-outline:before,\n.ion-ios-flask:before,\n.ion-ios-flask-outline:before,\n.ion-ios-flower:before,\n.ion-ios-flower-outline:before,\n.ion-ios-folder:before,\n.ion-ios-folder-outline:before,\n.ion-ios-football:before,\n.ion-ios-football-outline:before,\n.ion-ios-game-controller-a:before,\n.ion-ios-game-controller-a-outline:before,\n.ion-ios-game-controller-b:before,\n.ion-ios-game-controller-b-outline:before,\n.ion-ios-gear:before,\n.ion-ios-gear-outline:before,\n.ion-ios-glasses:before,\n.ion-ios-glasses-outline:before,\n.ion-ios-grid-view:before,\n.ion-ios-grid-view-outline:before,\n.ion-ios-heart:before,\n.ion-ios-heart-outline:before,\n.ion-ios-help:before,\n.ion-ios-help-empty:before,\n.ion-ios-help-outline:before,\n.ion-ios-home:before,\n.ion-ios-home-outline:before,\n.ion-ios-infinite:before,\n.ion-ios-infinite-outline:before,\n.ion-ios-information:before,\n.ion-ios-information-empty:before,\n.ion-ios-information-outline:before,\n.ion-ios-ionic-outline:before,\n.ion-ios-keypad:before,\n.ion-ios-keypad-outline:before,\n.ion-ios-lightbulb:before,\n.ion-ios-lightbulb-outline:before,\n.ion-ios-list:before,\n.ion-ios-list-outline:before,\n.ion-ios-location:before,\n.ion-ios-location-outline:before,\n.ion-ios-locked:before,\n.ion-ios-locked-outline:before,\n.ion-ios-loop:before,\n.ion-ios-loop-strong:before,\n.ion-ios-medical:before,\n.ion-ios-medical-outline:before,\n.ion-ios-medkit:before,\n.ion-ios-medkit-outline:before,\n.ion-ios-mic:before,\n.ion-ios-mic-off:before,\n.ion-ios-mic-outline:before,\n.ion-ios-minus:before,\n.ion-ios-minus-empty:before,\n.ion-ios-minus-outline:before,\n.ion-ios-monitor:before,\n.ion-ios-monitor-outline:before,\n.ion-ios-moon:before,\n.ion-ios-moon-outline:before,\n.ion-ios-more:before,\n.ion-ios-more-outline:before,\n.ion-ios-musical-note:before,\n.ion-ios-musical-notes:before,\n.ion-ios-navigate:before,\n.ion-ios-navigate-outline:before,\n.ion-ios-nutrition:before,\n.ion-ios-nutrition-outline:before,\n.ion-ios-paper:before,\n.ion-ios-paper-outline:before,\n.ion-ios-paperplane:before,\n.ion-ios-paperplane-outline:before,\n.ion-ios-partlysunny:before,\n.ion-ios-partlysunny-outline:before,\n.ion-ios-pause:before,\n.ion-ios-pause-outline:before,\n.ion-ios-paw:before,\n.ion-ios-paw-outline:before,\n.ion-ios-people:before,\n.ion-ios-people-outline:before,\n.ion-ios-person:before,\n.ion-ios-person-outline:before,\n.ion-ios-personadd:before,\n.ion-ios-personadd-outline:before,\n.ion-ios-photos:before,\n.ion-ios-photos-outline:before,\n.ion-ios-pie:before,\n.ion-ios-pie-outline:before,\n.ion-ios-pint:before,\n.ion-ios-pint-outline:before,\n.ion-ios-play:before,\n.ion-ios-play-outline:before,\n.ion-ios-plus:before,\n.ion-ios-plus-empty:before,\n.ion-ios-plus-outline:before,\n.ion-ios-pricetag:before,\n.ion-ios-pricetag-outline:before,\n.ion-ios-pricetags:before,\n.ion-ios-pricetags-outline:before,\n.ion-ios-printer:before,\n.ion-ios-printer-outline:before,\n.ion-ios-pulse:before,\n.ion-ios-pulse-strong:before,\n.ion-ios-rainy:before,\n.ion-ios-rainy-outline:before,\n.ion-ios-recording:before,\n.ion-ios-recording-outline:before,\n.ion-ios-redo:before,\n.ion-ios-redo-outline:before,\n.ion-ios-refresh:before,\n.ion-ios-refresh-empty:before,\n.ion-ios-refresh-outline:before,\n.ion-ios-reload:before,\n.ion-ios-reverse-camera:before,\n.ion-ios-reverse-camera-outline:before,\n.ion-ios-rewind:before,\n.ion-ios-rewind-outline:before,\n.ion-ios-rose:before,\n.ion-ios-rose-outline:before,\n.ion-ios-search:before,\n.ion-ios-search-strong:before,\n.ion-ios-settings:before,\n.ion-ios-settings-strong:before,\n.ion-ios-shuffle:before,\n.ion-ios-shuffle-strong:before,\n.ion-ios-skipbackward:before,\n.ion-ios-skipbackward-outline:before,\n.ion-ios-skipforward:before,\n.ion-ios-skipforward-outline:before,\n.ion-ios-snowy:before,\n.ion-ios-speedometer:before,\n.ion-ios-speedometer-outline:before,\n.ion-ios-star:before,\n.ion-ios-star-half:before,\n.ion-ios-star-outline:before,\n.ion-ios-stopwatch:before,\n.ion-ios-stopwatch-outline:before,\n.ion-ios-sunny:before,\n.ion-ios-sunny-outline:before,\n.ion-ios-telephone:before,\n.ion-ios-telephone-outline:before,\n.ion-ios-tennisball:before,\n.ion-ios-tennisball-outline:before,\n.ion-ios-thunderstorm:before,\n.ion-ios-thunderstorm-outline:before,\n.ion-ios-time:before,\n.ion-ios-time-outline:before,\n.ion-ios-timer:before,\n.ion-ios-timer-outline:before,\n.ion-ios-toggle:before,\n.ion-ios-toggle-outline:before,\n.ion-ios-trash:before,\n.ion-ios-trash-outline:before,\n.ion-ios-undo:before,\n.ion-ios-undo-outline:before,\n.ion-ios-unlocked:before,\n.ion-ios-unlocked-outline:before,\n.ion-ios-upload:before,\n.ion-ios-upload-outline:before,\n.ion-ios-videocam:before,\n.ion-ios-videocam-outline:before,\n.ion-ios-volume-high:before,\n.ion-ios-volume-low:before,\n.ion-ios-wineglass:before,\n.ion-ios-wineglass-outline:before,\n.ion-ios-world:before,\n.ion-ios-world-outline:before,\n.ion-ipad:before,\n.ion-iphone:before,\n.ion-ipod:before,\n.ion-jet:before,\n.ion-key:before,\n.ion-knife:before,\n.ion-laptop:before,\n.ion-leaf:before,\n.ion-levels:before,\n.ion-lightbulb:before,\n.ion-link:before,\n.ion-load-a:before,\n.ion-load-b:before,\n.ion-load-c:before,\n.ion-load-d:before,\n.ion-location:before,\n.ion-lock-combination:before,\n.ion-locked:before,\n.ion-log-in:before,\n.ion-log-out:before,\n.ion-loop:before,\n.ion-magnet:before,\n.ion-male:before,\n.ion-man:before,\n.ion-map:before,\n.ion-medkit:before,\n.ion-merge:before,\n.ion-mic-a:before,\n.ion-mic-b:before,\n.ion-mic-c:before,\n.ion-minus:before,\n.ion-minus-circled:before,\n.ion-minus-round:before,\n.ion-model-s:before,\n.ion-monitor:before,\n.ion-more:before,\n.ion-mouse:before,\n.ion-music-note:before,\n.ion-navicon:before,\n.ion-navicon-round:before,\n.ion-navigate:before,\n.ion-network:before,\n.ion-no-smoking:before,\n.ion-nuclear:before,\n.ion-outlet:before,\n.ion-paintbrush:before,\n.ion-paintbucket:before,\n.ion-paper-airplane:before,\n.ion-paperclip:before,\n.ion-pause:before,\n.ion-person:before,\n.ion-person-add:before,\n.ion-person-stalker:before,\n.ion-pie-graph:before,\n.ion-pin:before,\n.ion-pinpoint:before,\n.ion-pizza:before,\n.ion-plane:before,\n.ion-planet:before,\n.ion-play:before,\n.ion-playstation:before,\n.ion-plus:before,\n.ion-plus-circled:before,\n.ion-plus-round:before,\n.ion-podium:before,\n.ion-pound:before,\n.ion-power:before,\n.ion-pricetag:before,\n.ion-pricetags:before,\n.ion-printer:before,\n.ion-pull-request:before,\n.ion-qr-scanner:before,\n.ion-quote:before,\n.ion-radio-waves:before,\n.ion-record:before,\n.ion-refresh:before,\n.ion-reply:before,\n.ion-reply-all:before,\n.ion-ribbon-a:before,\n.ion-ribbon-b:before,\n.ion-sad:before,\n.ion-sad-outline:before,\n.ion-scissors:before,\n.ion-search:before,\n.ion-settings:before,\n.ion-share:before,\n.ion-shuffle:before,\n.ion-skip-backward:before,\n.ion-skip-forward:before,\n.ion-social-android:before,\n.ion-social-android-outline:before,\n.ion-social-angular:before,\n.ion-social-angular-outline:before,\n.ion-social-apple:before,\n.ion-social-apple-outline:before,\n.ion-social-bitcoin:before,\n.ion-social-bitcoin-outline:before,\n.ion-social-buffer:before,\n.ion-social-buffer-outline:before,\n.ion-social-chrome:before,\n.ion-social-chrome-outline:before,\n.ion-social-codepen:before,\n.ion-social-codepen-outline:before,\n.ion-social-css3:before,\n.ion-social-css3-outline:before,\n.ion-social-designernews:before,\n.ion-social-designernews-outline:before,\n.ion-social-dribbble:before,\n.ion-social-dribbble-outline:before,\n.ion-social-dropbox:before,\n.ion-social-dropbox-outline:before,\n.ion-social-euro:before,\n.ion-social-euro-outline:before,\n.ion-social-facebook:before,\n.ion-social-facebook-outline:before,\n.ion-social-foursquare:before,\n.ion-social-foursquare-outline:before,\n.ion-social-freebsd-devil:before,\n.ion-social-github:before,\n.ion-social-github-outline:before,\n.ion-social-google:before,\n.ion-social-google-outline:before,\n.ion-social-googleplus:before,\n.ion-social-googleplus-outline:before,\n.ion-social-hackernews:before,\n.ion-social-hackernews-outline:before,\n.ion-social-html5:before,\n.ion-social-html5-outline:before,\n.ion-social-instagram:before,\n.ion-social-instagram-outline:before,\n.ion-social-javascript:before,\n.ion-social-javascript-outline:before,\n.ion-social-linkedin:before,\n.ion-social-linkedin-outline:before,\n.ion-social-markdown:before,\n.ion-social-nodejs:before,\n.ion-social-octocat:before,\n.ion-social-pinterest:before,\n.ion-social-pinterest-outline:before,\n.ion-social-python:before,\n.ion-social-reddit:before,\n.ion-social-reddit-outline:before,\n.ion-social-rss:before,\n.ion-social-rss-outline:before,\n.ion-social-sass:before,\n.ion-social-skype:before,\n.ion-social-skype-outline:before,\n.ion-social-snapchat:before,\n.ion-social-snapchat-outline:before,\n.ion-social-tumblr:before,\n.ion-social-tumblr-outline:before,\n.ion-social-tux:before,\n.ion-social-twitch:before,\n.ion-social-twitch-outline:before,\n.ion-social-twitter:before,\n.ion-social-twitter-outline:before,\n.ion-social-usd:before,\n.ion-social-usd-outline:before,\n.ion-social-vimeo:before,\n.ion-social-vimeo-outline:before,\n.ion-social-whatsapp:before,\n.ion-social-whatsapp-outline:before,\n.ion-social-windows:before,\n.ion-social-windows-outline:before,\n.ion-social-wordpress:before,\n.ion-social-wordpress-outline:before,\n.ion-social-yahoo:before,\n.ion-social-yahoo-outline:before,\n.ion-social-yen:before,\n.ion-social-yen-outline:before,\n.ion-social-youtube:before,\n.ion-social-youtube-outline:before,\n.ion-soup-can:before,\n.ion-soup-can-outline:before,\n.ion-speakerphone:before,\n.ion-speedometer:before,\n.ion-spoon:before,\n.ion-star:before,\n.ion-stats-bars:before,\n.ion-steam:before,\n.ion-stop:before,\n.ion-thermometer:before,\n.ion-thumbsdown:before,\n.ion-thumbsup:before,\n.ion-toggle:before,\n.ion-toggle-filled:before,\n.ion-transgender:before,\n.ion-trash-a:before,\n.ion-trash-b:before,\n.ion-trophy:before,\n.ion-tshirt:before,\n.ion-tshirt-outline:before,\n.ion-umbrella:before,\n.ion-university:before,\n.ion-unlocked:before,\n.ion-upload:before,\n.ion-usb:before,\n.ion-videocamera:before,\n.ion-volume-high:before,\n.ion-volume-low:before,\n.ion-volume-medium:before,\n.ion-volume-mute:before,\n.ion-wand:before,\n.ion-waterdrop:before,\n.ion-wifi:before,\n.ion-wineglass:before,\n.ion-woman:before,\n.ion-wrench:before,\n.ion-xbox:before {\n  display: inline-block;\n  font-family: \"Ionicons\";\n  speak: none;\n  font-style: normal;\n  font-weight: normal;\n  font-variant: normal;\n  text-transform: none;\n  text-rendering: auto;\n  line-height: 1;\n  -webkit-font-smoothing: antialiased;\n  -moz-osx-font-smoothing: grayscale;\n}\n.ion-spin,\n.ion-loading-a,\n.ion-loading-b,\n.ion-loading-c,\n.ion-loading-d,\n.ion-looping,\n.ion-refreshing,\n.ion-ios7-reloading {\n  -webkit-animation: spin 1s infinite linear;\n  -moz-animation: spin 1s infinite linear;\n  -o-animation: spin 1s infinite linear;\n  animation: spin 1s infinite linear;\n}\n@-moz-keyframes spin {\n  0% {\n    -moz-transform: rotate(0deg);\n  }\n  100% {\n    -moz-transform: rotate(359deg);\n  }\n}\n@-webkit-keyframes spin {\n  0% {\n    -webkit-transform: rotate(0deg);\n  }\n  100% {\n    -webkit-transform: rotate(359deg);\n  }\n}\n@-o-keyframes spin {\n  0% {\n    -o-transform: rotate(0deg);\n  }\n  100% {\n    -o-transform: rotate(359deg);\n  }\n}\n@-ms-keyframes spin {\n  0% {\n    -ms-transform: rotate(0deg);\n  }\n  100% {\n    -ms-transform: rotate(359deg);\n  }\n}\n@keyframes spin {\n  0% {\n    transform: rotate(0deg);\n  }\n  100% {\n    transform: rotate(359deg);\n  }\n}\n.ion-loading-a {\n  -webkit-animation-timing-function: steps(8, start);\n  -moz-animation-timing-function: steps(8, start);\n  animation-timing-function: steps(8, start);\n}\n.ion-alert:before {\n  content: \"\\f101\";\n}\n.ion-alert-circled:before {\n  content: \"\\f100\";\n}\n.ion-android-add:before {\n  content: \"\\f2c7\";\n}\n.ion-android-add-circle:before {\n  content: \"\\f359\";\n}\n.ion-android-alarm-clock:before {\n  content: \"\\f35a\";\n}\n.ion-android-alert:before {\n  content: \"\\f35b\";\n}\n.ion-android-apps:before {\n  content: \"\\f35c\";\n}\n.ion-android-archive:before {\n  content: \"\\f2c9\";\n}\n.ion-android-arrow-back:before {\n  content: \"\\f2ca\";\n}\n.ion-android-arrow-down:before {\n  content: \"\\f35d\";\n}\n.ion-android-arrow-dropdown:before {\n  content: \"\\f35f\";\n}\n.ion-android-arrow-dropdown-circle:before {\n  content: \"\\f35e\";\n}\n.ion-android-arrow-dropleft:before {\n  content: \"\\f361\";\n}\n.ion-android-arrow-dropleft-circle:before {\n  content: \"\\f360\";\n}\n.ion-android-arrow-dropright:before {\n  content: \"\\f363\";\n}\n.ion-android-arrow-dropright-circle:before {\n  content: \"\\f362\";\n}\n.ion-android-arrow-dropup:before {\n  content: \"\\f365\";\n}\n.ion-android-arrow-dropup-circle:before {\n  content: \"\\f364\";\n}\n.ion-android-arrow-forward:before {\n  content: \"\\f30f\";\n}\n.ion-android-arrow-up:before {\n  content: \"\\f366\";\n}\n.ion-android-attach:before {\n  content: \"\\f367\";\n}\n.ion-android-bar:before {\n  content: \"\\f368\";\n}\n.ion-android-bicycle:before {\n  content: \"\\f369\";\n}\n.ion-android-boat:before {\n  content: \"\\f36a\";\n}\n.ion-android-bookmark:before {\n  content: \"\\f36b\";\n}\n.ion-android-bulb:before {\n  content: \"\\f36c\";\n}\n.ion-android-bus:before {\n  content: \"\\f36d\";\n}\n.ion-android-calendar:before {\n  content: \"\\f2d1\";\n}\n.ion-android-call:before {\n  content: \"\\f2d2\";\n}\n.ion-android-camera:before {\n  content: \"\\f2d3\";\n}\n.ion-android-cancel:before {\n  content: \"\\f36e\";\n}\n.ion-android-car:before {\n  content: \"\\f36f\";\n}\n.ion-android-cart:before {\n  content: \"\\f370\";\n}\n.ion-android-chat:before {\n  content: \"\\f2d4\";\n}\n.ion-android-checkbox:before {\n  content: \"\\f374\";\n}\n.ion-android-checkbox-blank:before {\n  content: \"\\f371\";\n}\n.ion-android-checkbox-outline:before {\n  content: \"\\f373\";\n}\n.ion-android-checkbox-outline-blank:before {\n  content: \"\\f372\";\n}\n.ion-android-checkmark-circle:before {\n  content: \"\\f375\";\n}\n.ion-android-clipboard:before {\n  content: \"\\f376\";\n}\n.ion-android-close:before {\n  content: \"\\f2d7\";\n}\n.ion-android-cloud:before {\n  content: \"\\f37a\";\n}\n.ion-android-cloud-circle:before {\n  content: \"\\f377\";\n}\n.ion-android-cloud-done:before {\n  content: \"\\f378\";\n}\n.ion-android-cloud-outline:before {\n  content: \"\\f379\";\n}\n.ion-android-color-palette:before {\n  content: \"\\f37b\";\n}\n.ion-android-compass:before {\n  content: \"\\f37c\";\n}\n.ion-android-contact:before {\n  content: \"\\f2d8\";\n}\n.ion-android-contacts:before {\n  content: \"\\f2d9\";\n}\n.ion-android-contract:before {\n  content: \"\\f37d\";\n}\n.ion-android-create:before {\n  content: \"\\f37e\";\n}\n.ion-android-delete:before {\n  content: \"\\f37f\";\n}\n.ion-android-desktop:before {\n  content: \"\\f380\";\n}\n.ion-android-document:before {\n  content: \"\\f381\";\n}\n.ion-android-done:before {\n  content: \"\\f383\";\n}\n.ion-android-done-all:before {\n  content: \"\\f382\";\n}\n.ion-android-download:before {\n  content: \"\\f2dd\";\n}\n.ion-android-drafts:before {\n  content: \"\\f384\";\n}\n.ion-android-exit:before {\n  content: \"\\f385\";\n}\n.ion-android-expand:before {\n  content: \"\\f386\";\n}\n.ion-android-favorite:before {\n  content: \"\\f388\";\n}\n.ion-android-favorite-outline:before {\n  content: \"\\f387\";\n}\n.ion-android-film:before {\n  content: \"\\f389\";\n}\n.ion-android-folder:before {\n  content: \"\\f2e0\";\n}\n.ion-android-folder-open:before {\n  content: \"\\f38a\";\n}\n.ion-android-funnel:before {\n  content: \"\\f38b\";\n}\n.ion-android-globe:before {\n  content: \"\\f38c\";\n}\n.ion-android-hand:before {\n  content: \"\\f2e3\";\n}\n.ion-android-hangout:before {\n  content: \"\\f38d\";\n}\n.ion-android-happy:before {\n  content: \"\\f38e\";\n}\n.ion-android-home:before {\n  content: \"\\f38f\";\n}\n.ion-android-image:before {\n  content: \"\\f2e4\";\n}\n.ion-android-laptop:before {\n  content: \"\\f390\";\n}\n.ion-android-list:before {\n  content: \"\\f391\";\n}\n.ion-android-locate:before {\n  content: \"\\f2e9\";\n}\n.ion-android-lock:before {\n  content: \"\\f392\";\n}\n.ion-android-mail:before {\n  content: \"\\f2eb\";\n}\n.ion-android-map:before {\n  content: \"\\f393\";\n}\n.ion-android-menu:before {\n  content: \"\\f394\";\n}\n.ion-android-microphone:before {\n  content: \"\\f2ec\";\n}\n.ion-android-microphone-off:before {\n  content: \"\\f395\";\n}\n.ion-android-more-horizontal:before {\n  content: \"\\f396\";\n}\n.ion-android-more-vertical:before {\n  content: \"\\f397\";\n}\n.ion-android-navigate:before {\n  content: \"\\f398\";\n}\n.ion-android-notifications:before {\n  content: \"\\f39b\";\n}\n.ion-android-notifications-none:before {\n  content: \"\\f399\";\n}\n.ion-android-notifications-off:before {\n  content: \"\\f39a\";\n}\n.ion-android-open:before {\n  content: \"\\f39c\";\n}\n.ion-android-options:before {\n  content: \"\\f39d\";\n}\n.ion-android-people:before {\n  content: \"\\f39e\";\n}\n.ion-android-person:before {\n  content: \"\\f3a0\";\n}\n.ion-android-person-add:before {\n  content: \"\\f39f\";\n}\n.ion-android-phone-landscape:before {\n  content: \"\\f3a1\";\n}\n.ion-android-phone-portrait:before {\n  content: \"\\f3a2\";\n}\n.ion-android-pin:before {\n  content: \"\\f3a3\";\n}\n.ion-android-plane:before {\n  content: \"\\f3a4\";\n}\n.ion-android-playstore:before {\n  content: \"\\f2f0\";\n}\n.ion-android-print:before {\n  content: \"\\f3a5\";\n}\n.ion-android-radio-button-off:before {\n  content: \"\\f3a6\";\n}\n.ion-android-radio-button-on:before {\n  content: \"\\f3a7\";\n}\n.ion-android-refresh:before {\n  content: \"\\f3a8\";\n}\n.ion-android-remove:before {\n  content: \"\\f2f4\";\n}\n.ion-android-remove-circle:before {\n  content: \"\\f3a9\";\n}\n.ion-android-restaurant:before {\n  content: \"\\f3aa\";\n}\n.ion-android-sad:before {\n  content: \"\\f3ab\";\n}\n.ion-android-search:before {\n  content: \"\\f2f5\";\n}\n.ion-android-send:before {\n  content: \"\\f2f6\";\n}\n.ion-android-settings:before {\n  content: \"\\f2f7\";\n}\n.ion-android-share:before {\n  content: \"\\f2f8\";\n}\n.ion-android-share-alt:before {\n  content: \"\\f3ac\";\n}\n.ion-android-star:before {\n  content: \"\\f2fc\";\n}\n.ion-android-star-half:before {\n  content: \"\\f3ad\";\n}\n.ion-android-star-outline:before {\n  content: \"\\f3ae\";\n}\n.ion-android-stopwatch:before {\n  content: \"\\f2fd\";\n}\n.ion-android-subway:before {\n  content: \"\\f3af\";\n}\n.ion-android-sunny:before {\n  content: \"\\f3b0\";\n}\n.ion-android-sync:before {\n  content: \"\\f3b1\";\n}\n.ion-android-textsms:before {\n  content: \"\\f3b2\";\n}\n.ion-android-time:before {\n  content: \"\\f3b3\";\n}\n.ion-android-train:before {\n  content: \"\\f3b4\";\n}\n.ion-android-unlock:before {\n  content: \"\\f3b5\";\n}\n.ion-android-upload:before {\n  content: \"\\f3b6\";\n}\n.ion-android-volume-down:before {\n  content: \"\\f3b7\";\n}\n.ion-android-volume-mute:before {\n  content: \"\\f3b8\";\n}\n.ion-android-volume-off:before {\n  content: \"\\f3b9\";\n}\n.ion-android-volume-up:before {\n  content: \"\\f3ba\";\n}\n.ion-android-walk:before {\n  content: \"\\f3bb\";\n}\n.ion-android-warning:before {\n  content: \"\\f3bc\";\n}\n.ion-android-watch:before {\n  content: \"\\f3bd\";\n}\n.ion-android-wifi:before {\n  content: \"\\f305\";\n}\n.ion-aperture:before {\n  content: \"\\f313\";\n}\n.ion-archive:before {\n  content: \"\\f102\";\n}\n.ion-arrow-down-a:before {\n  content: \"\\f103\";\n}\n.ion-arrow-down-b:before {\n  content: \"\\f104\";\n}\n.ion-arrow-down-c:before {\n  content: \"\\f105\";\n}\n.ion-arrow-expand:before {\n  content: \"\\f25e\";\n}\n.ion-arrow-graph-down-left:before {\n  content: \"\\f25f\";\n}\n.ion-arrow-graph-down-right:before {\n  content: \"\\f260\";\n}\n.ion-arrow-graph-up-left:before {\n  content: \"\\f261\";\n}\n.ion-arrow-graph-up-right:before {\n  content: \"\\f262\";\n}\n.ion-arrow-left-a:before {\n  content: \"\\f106\";\n}\n.ion-arrow-left-b:before {\n  content: \"\\f107\";\n}\n.ion-arrow-left-c:before {\n  content: \"\\f108\";\n}\n.ion-arrow-move:before {\n  content: \"\\f263\";\n}\n.ion-arrow-resize:before {\n  content: \"\\f264\";\n}\n.ion-arrow-return-left:before {\n  content: \"\\f265\";\n}\n.ion-arrow-return-right:before {\n  content: \"\\f266\";\n}\n.ion-arrow-right-a:before {\n  content: \"\\f109\";\n}\n.ion-arrow-right-b:before {\n  content: \"\\f10a\";\n}\n.ion-arrow-right-c:before {\n  content: \"\\f10b\";\n}\n.ion-arrow-shrink:before {\n  content: \"\\f267\";\n}\n.ion-arrow-swap:before {\n  content: \"\\f268\";\n}\n.ion-arrow-up-a:before {\n  content: \"\\f10c\";\n}\n.ion-arrow-up-b:before {\n  content: \"\\f10d\";\n}\n.ion-arrow-up-c:before {\n  content: \"\\f10e\";\n}\n.ion-asterisk:before {\n  content: \"\\f314\";\n}\n.ion-at:before {\n  content: \"\\f10f\";\n}\n.ion-backspace:before {\n  content: \"\\f3bf\";\n}\n.ion-backspace-outline:before {\n  content: \"\\f3be\";\n}\n.ion-bag:before {\n  content: \"\\f110\";\n}\n.ion-battery-charging:before {\n  content: \"\\f111\";\n}\n.ion-battery-empty:before {\n  content: \"\\f112\";\n}\n.ion-battery-full:before {\n  content: \"\\f113\";\n}\n.ion-battery-half:before {\n  content: \"\\f114\";\n}\n.ion-battery-low:before {\n  content: \"\\f115\";\n}\n.ion-beaker:before {\n  content: \"\\f269\";\n}\n.ion-beer:before {\n  content: \"\\f26a\";\n}\n.ion-bluetooth:before {\n  content: \"\\f116\";\n}\n.ion-bonfire:before {\n  content: \"\\f315\";\n}\n.ion-bookmark:before {\n  content: \"\\f26b\";\n}\n.ion-bowtie:before {\n  content: \"\\f3c0\";\n}\n.ion-briefcase:before {\n  content: \"\\f26c\";\n}\n.ion-bug:before {\n  content: \"\\f2be\";\n}\n.ion-calculator:before {\n  content: \"\\f26d\";\n}\n.ion-calendar:before {\n  content: \"\\f117\";\n}\n.ion-camera:before {\n  content: \"\\f118\";\n}\n.ion-card:before {\n  content: \"\\f119\";\n}\n.ion-cash:before {\n  content: \"\\f316\";\n}\n.ion-chatbox:before {\n  content: \"\\f11b\";\n}\n.ion-chatbox-working:before {\n  content: \"\\f11a\";\n}\n.ion-chatboxes:before {\n  content: \"\\f11c\";\n}\n.ion-chatbubble:before {\n  content: \"\\f11e\";\n}\n.ion-chatbubble-working:before {\n  content: \"\\f11d\";\n}\n.ion-chatbubbles:before {\n  content: \"\\f11f\";\n}\n.ion-checkmark:before {\n  content: \"\\f122\";\n}\n.ion-checkmark-circled:before {\n  content: \"\\f120\";\n}\n.ion-checkmark-round:before {\n  content: \"\\f121\";\n}\n.ion-chevron-down:before {\n  content: \"\\f123\";\n}\n.ion-chevron-left:before {\n  content: \"\\f124\";\n}\n.ion-chevron-right:before {\n  content: \"\\f125\";\n}\n.ion-chevron-up:before {\n  content: \"\\f126\";\n}\n.ion-clipboard:before {\n  content: \"\\f127\";\n}\n.ion-clock:before {\n  content: \"\\f26e\";\n}\n.ion-close:before {\n  content: \"\\f12a\";\n}\n.ion-close-circled:before {\n  content: \"\\f128\";\n}\n.ion-close-round:before {\n  content: \"\\f129\";\n}\n.ion-closed-captioning:before {\n  content: \"\\f317\";\n}\n.ion-cloud:before {\n  content: \"\\f12b\";\n}\n.ion-code:before {\n  content: \"\\f271\";\n}\n.ion-code-download:before {\n  content: \"\\f26f\";\n}\n.ion-code-working:before {\n  content: \"\\f270\";\n}\n.ion-coffee:before {\n  content: \"\\f272\";\n}\n.ion-compass:before {\n  content: \"\\f273\";\n}\n.ion-compose:before {\n  content: \"\\f12c\";\n}\n.ion-connection-bars:before {\n  content: \"\\f274\";\n}\n.ion-contrast:before {\n  content: \"\\f275\";\n}\n.ion-crop:before {\n  content: \"\\f3c1\";\n}\n.ion-cube:before {\n  content: \"\\f318\";\n}\n.ion-disc:before {\n  content: \"\\f12d\";\n}\n.ion-document:before {\n  content: \"\\f12f\";\n}\n.ion-document-text:before {\n  content: \"\\f12e\";\n}\n.ion-drag:before {\n  content: \"\\f130\";\n}\n.ion-earth:before {\n  content: \"\\f276\";\n}\n.ion-easel:before {\n  content: \"\\f3c2\";\n}\n.ion-edit:before {\n  content: \"\\f2bf\";\n}\n.ion-egg:before {\n  content: \"\\f277\";\n}\n.ion-eject:before {\n  content: \"\\f131\";\n}\n.ion-email:before {\n  content: \"\\f132\";\n}\n.ion-email-unread:before {\n  content: \"\\f3c3\";\n}\n.ion-erlenmeyer-flask:before {\n  content: \"\\f3c5\";\n}\n.ion-erlenmeyer-flask-bubbles:before {\n  content: \"\\f3c4\";\n}\n.ion-eye:before {\n  content: \"\\f133\";\n}\n.ion-eye-disabled:before {\n  content: \"\\f306\";\n}\n.ion-female:before {\n  content: \"\\f278\";\n}\n.ion-filing:before {\n  content: \"\\f134\";\n}\n.ion-film-marker:before {\n  content: \"\\f135\";\n}\n.ion-fireball:before {\n  content: \"\\f319\";\n}\n.ion-flag:before {\n  content: \"\\f279\";\n}\n.ion-flame:before {\n  content: \"\\f31a\";\n}\n.ion-flash:before {\n  content: \"\\f137\";\n}\n.ion-flash-off:before {\n  content: \"\\f136\";\n}\n.ion-folder:before {\n  content: \"\\f139\";\n}\n.ion-fork:before {\n  content: \"\\f27a\";\n}\n.ion-fork-repo:before {\n  content: \"\\f2c0\";\n}\n.ion-forward:before {\n  content: \"\\f13a\";\n}\n.ion-funnel:before {\n  content: \"\\f31b\";\n}\n.ion-gear-a:before {\n  content: \"\\f13d\";\n}\n.ion-gear-b:before {\n  content: \"\\f13e\";\n}\n.ion-grid:before {\n  content: \"\\f13f\";\n}\n.ion-hammer:before {\n  content: \"\\f27b\";\n}\n.ion-happy:before {\n  content: \"\\f31c\";\n}\n.ion-happy-outline:before {\n  content: \"\\f3c6\";\n}\n.ion-headphone:before {\n  content: \"\\f140\";\n}\n.ion-heart:before {\n  content: \"\\f141\";\n}\n.ion-heart-broken:before {\n  content: \"\\f31d\";\n}\n.ion-help:before {\n  content: \"\\f143\";\n}\n.ion-help-buoy:before {\n  content: \"\\f27c\";\n}\n.ion-help-circled:before {\n  content: \"\\f142\";\n}\n.ion-home:before {\n  content: \"\\f144\";\n}\n.ion-icecream:before {\n  content: \"\\f27d\";\n}\n.ion-image:before {\n  content: \"\\f147\";\n}\n.ion-images:before {\n  content: \"\\f148\";\n}\n.ion-information:before {\n  content: \"\\f14a\";\n}\n.ion-information-circled:before {\n  content: \"\\f149\";\n}\n.ion-ionic:before {\n  content: \"\\f14b\";\n}\n.ion-ios-alarm:before {\n  content: \"\\f3c8\";\n}\n.ion-ios-alarm-outline:before {\n  content: \"\\f3c7\";\n}\n.ion-ios-albums:before {\n  content: \"\\f3ca\";\n}\n.ion-ios-albums-outline:before {\n  content: \"\\f3c9\";\n}\n.ion-ios-americanfootball:before {\n  content: \"\\f3cc\";\n}\n.ion-ios-americanfootball-outline:before {\n  content: \"\\f3cb\";\n}\n.ion-ios-analytics:before {\n  content: \"\\f3ce\";\n}\n.ion-ios-analytics-outline:before {\n  content: \"\\f3cd\";\n}\n.ion-ios-arrow-back:before {\n  content: \"\\f3cf\";\n}\n.ion-ios-arrow-down:before {\n  content: \"\\f3d0\";\n}\n.ion-ios-arrow-forward:before {\n  content: \"\\f3d1\";\n}\n.ion-ios-arrow-left:before {\n  content: \"\\f3d2\";\n}\n.ion-ios-arrow-right:before {\n  content: \"\\f3d3\";\n}\n.ion-ios-arrow-thin-down:before {\n  content: \"\\f3d4\";\n}\n.ion-ios-arrow-thin-left:before {\n  content: \"\\f3d5\";\n}\n.ion-ios-arrow-thin-right:before {\n  content: \"\\f3d6\";\n}\n.ion-ios-arrow-thin-up:before {\n  content: \"\\f3d7\";\n}\n.ion-ios-arrow-up:before {\n  content: \"\\f3d8\";\n}\n.ion-ios-at:before {\n  content: \"\\f3da\";\n}\n.ion-ios-at-outline:before {\n  content: \"\\f3d9\";\n}\n.ion-ios-barcode:before {\n  content: \"\\f3dc\";\n}\n.ion-ios-barcode-outline:before {\n  content: \"\\f3db\";\n}\n.ion-ios-baseball:before {\n  content: \"\\f3de\";\n}\n.ion-ios-baseball-outline:before {\n  content: \"\\f3dd\";\n}\n.ion-ios-basketball:before {\n  content: \"\\f3e0\";\n}\n.ion-ios-basketball-outline:before {\n  content: \"\\f3df\";\n}\n.ion-ios-bell:before {\n  content: \"\\f3e2\";\n}\n.ion-ios-bell-outline:before {\n  content: \"\\f3e1\";\n}\n.ion-ios-body:before {\n  content: \"\\f3e4\";\n}\n.ion-ios-body-outline:before {\n  content: \"\\f3e3\";\n}\n.ion-ios-bolt:before {\n  content: \"\\f3e6\";\n}\n.ion-ios-bolt-outline:before {\n  content: \"\\f3e5\";\n}\n.ion-ios-book:before {\n  content: \"\\f3e8\";\n}\n.ion-ios-book-outline:before {\n  content: \"\\f3e7\";\n}\n.ion-ios-bookmarks:before {\n  content: \"\\f3ea\";\n}\n.ion-ios-bookmarks-outline:before {\n  content: \"\\f3e9\";\n}\n.ion-ios-box:before {\n  content: \"\\f3ec\";\n}\n.ion-ios-box-outline:before {\n  content: \"\\f3eb\";\n}\n.ion-ios-briefcase:before {\n  content: \"\\f3ee\";\n}\n.ion-ios-briefcase-outline:before {\n  content: \"\\f3ed\";\n}\n.ion-ios-browsers:before {\n  content: \"\\f3f0\";\n}\n.ion-ios-browsers-outline:before {\n  content: \"\\f3ef\";\n}\n.ion-ios-calculator:before {\n  content: \"\\f3f2\";\n}\n.ion-ios-calculator-outline:before {\n  content: \"\\f3f1\";\n}\n.ion-ios-calendar:before {\n  content: \"\\f3f4\";\n}\n.ion-ios-calendar-outline:before {\n  content: \"\\f3f3\";\n}\n.ion-ios-camera:before {\n  content: \"\\f3f6\";\n}\n.ion-ios-camera-outline:before {\n  content: \"\\f3f5\";\n}\n.ion-ios-cart:before {\n  content: \"\\f3f8\";\n}\n.ion-ios-cart-outline:before {\n  content: \"\\f3f7\";\n}\n.ion-ios-chatboxes:before {\n  content: \"\\f3fa\";\n}\n.ion-ios-chatboxes-outline:before {\n  content: \"\\f3f9\";\n}\n.ion-ios-chatbubble:before {\n  content: \"\\f3fc\";\n}\n.ion-ios-chatbubble-outline:before {\n  content: \"\\f3fb\";\n}\n.ion-ios-checkmark:before {\n  content: \"\\f3ff\";\n}\n.ion-ios-checkmark-empty:before {\n  content: \"\\f3fd\";\n}\n.ion-ios-checkmark-outline:before {\n  content: \"\\f3fe\";\n}\n.ion-ios-circle-filled:before {\n  content: \"\\f400\";\n}\n.ion-ios-circle-outline:before {\n  content: \"\\f401\";\n}\n.ion-ios-clock:before {\n  content: \"\\f403\";\n}\n.ion-ios-clock-outline:before {\n  content: \"\\f402\";\n}\n.ion-ios-close:before {\n  content: \"\\f406\";\n}\n.ion-ios-close-empty:before {\n  content: \"\\f404\";\n}\n.ion-ios-close-outline:before {\n  content: \"\\f405\";\n}\n.ion-ios-cloud:before {\n  content: \"\\f40c\";\n}\n.ion-ios-cloud-download:before {\n  content: \"\\f408\";\n}\n.ion-ios-cloud-download-outline:before {\n  content: \"\\f407\";\n}\n.ion-ios-cloud-outline:before {\n  content: \"\\f409\";\n}\n.ion-ios-cloud-upload:before {\n  content: \"\\f40b\";\n}\n.ion-ios-cloud-upload-outline:before {\n  content: \"\\f40a\";\n}\n.ion-ios-cloudy:before {\n  content: \"\\f410\";\n}\n.ion-ios-cloudy-night:before {\n  content: \"\\f40e\";\n}\n.ion-ios-cloudy-night-outline:before {\n  content: \"\\f40d\";\n}\n.ion-ios-cloudy-outline:before {\n  content: \"\\f40f\";\n}\n.ion-ios-cog:before {\n  content: \"\\f412\";\n}\n.ion-ios-cog-outline:before {\n  content: \"\\f411\";\n}\n.ion-ios-color-filter:before {\n  content: \"\\f414\";\n}\n.ion-ios-color-filter-outline:before {\n  content: \"\\f413\";\n}\n.ion-ios-color-wand:before {\n  content: \"\\f416\";\n}\n.ion-ios-color-wand-outline:before {\n  content: \"\\f415\";\n}\n.ion-ios-compose:before {\n  content: \"\\f418\";\n}\n.ion-ios-compose-outline:before {\n  content: \"\\f417\";\n}\n.ion-ios-contact:before {\n  content: \"\\f41a\";\n}\n.ion-ios-contact-outline:before {\n  content: \"\\f419\";\n}\n.ion-ios-copy:before {\n  content: \"\\f41c\";\n}\n.ion-ios-copy-outline:before {\n  content: \"\\f41b\";\n}\n.ion-ios-crop:before {\n  content: \"\\f41e\";\n}\n.ion-ios-crop-strong:before {\n  content: \"\\f41d\";\n}\n.ion-ios-download:before {\n  content: \"\\f420\";\n}\n.ion-ios-download-outline:before {\n  content: \"\\f41f\";\n}\n.ion-ios-drag:before {\n  content: \"\\f421\";\n}\n.ion-ios-email:before {\n  content: \"\\f423\";\n}\n.ion-ios-email-outline:before {\n  content: \"\\f422\";\n}\n.ion-ios-eye:before {\n  content: \"\\f425\";\n}\n.ion-ios-eye-outline:before {\n  content: \"\\f424\";\n}\n.ion-ios-fastforward:before {\n  content: \"\\f427\";\n}\n.ion-ios-fastforward-outline:before {\n  content: \"\\f426\";\n}\n.ion-ios-filing:before {\n  content: \"\\f429\";\n}\n.ion-ios-filing-outline:before {\n  content: \"\\f428\";\n}\n.ion-ios-film:before {\n  content: \"\\f42b\";\n}\n.ion-ios-film-outline:before {\n  content: \"\\f42a\";\n}\n.ion-ios-flag:before {\n  content: \"\\f42d\";\n}\n.ion-ios-flag-outline:before {\n  content: \"\\f42c\";\n}\n.ion-ios-flame:before {\n  content: \"\\f42f\";\n}\n.ion-ios-flame-outline:before {\n  content: \"\\f42e\";\n}\n.ion-ios-flask:before {\n  content: \"\\f431\";\n}\n.ion-ios-flask-outline:before {\n  content: \"\\f430\";\n}\n.ion-ios-flower:before {\n  content: \"\\f433\";\n}\n.ion-ios-flower-outline:before {\n  content: \"\\f432\";\n}\n.ion-ios-folder:before {\n  content: \"\\f435\";\n}\n.ion-ios-folder-outline:before {\n  content: \"\\f434\";\n}\n.ion-ios-football:before {\n  content: \"\\f437\";\n}\n.ion-ios-football-outline:before {\n  content: \"\\f436\";\n}\n.ion-ios-game-controller-a:before {\n  content: \"\\f439\";\n}\n.ion-ios-game-controller-a-outline:before {\n  content: \"\\f438\";\n}\n.ion-ios-game-controller-b:before {\n  content: \"\\f43b\";\n}\n.ion-ios-game-controller-b-outline:before {\n  content: \"\\f43a\";\n}\n.ion-ios-gear:before {\n  content: \"\\f43d\";\n}\n.ion-ios-gear-outline:before {\n  content: \"\\f43c\";\n}\n.ion-ios-glasses:before {\n  content: \"\\f43f\";\n}\n.ion-ios-glasses-outline:before {\n  content: \"\\f43e\";\n}\n.ion-ios-grid-view:before {\n  content: \"\\f441\";\n}\n.ion-ios-grid-view-outline:before {\n  content: \"\\f440\";\n}\n.ion-ios-heart:before {\n  content: \"\\f443\";\n}\n.ion-ios-heart-outline:before {\n  content: \"\\f442\";\n}\n.ion-ios-help:before {\n  content: \"\\f446\";\n}\n.ion-ios-help-empty:before {\n  content: \"\\f444\";\n}\n.ion-ios-help-outline:before {\n  content: \"\\f445\";\n}\n.ion-ios-home:before {\n  content: \"\\f448\";\n}\n.ion-ios-home-outline:before {\n  content: \"\\f447\";\n}\n.ion-ios-infinite:before {\n  content: \"\\f44a\";\n}\n.ion-ios-infinite-outline:before {\n  content: \"\\f449\";\n}\n.ion-ios-information:before {\n  content: \"\\f44d\";\n}\n.ion-ios-information-empty:before {\n  content: \"\\f44b\";\n}\n.ion-ios-information-outline:before {\n  content: \"\\f44c\";\n}\n.ion-ios-ionic-outline:before {\n  content: \"\\f44e\";\n}\n.ion-ios-keypad:before {\n  content: \"\\f450\";\n}\n.ion-ios-keypad-outline:before {\n  content: \"\\f44f\";\n}\n.ion-ios-lightbulb:before {\n  content: \"\\f452\";\n}\n.ion-ios-lightbulb-outline:before {\n  content: \"\\f451\";\n}\n.ion-ios-list:before {\n  content: \"\\f454\";\n}\n.ion-ios-list-outline:before {\n  content: \"\\f453\";\n}\n.ion-ios-location:before {\n  content: \"\\f456\";\n}\n.ion-ios-location-outline:before {\n  content: \"\\f455\";\n}\n.ion-ios-locked:before {\n  content: \"\\f458\";\n}\n.ion-ios-locked-outline:before {\n  content: \"\\f457\";\n}\n.ion-ios-loop:before {\n  content: \"\\f45a\";\n}\n.ion-ios-loop-strong:before {\n  content: \"\\f459\";\n}\n.ion-ios-medical:before {\n  content: \"\\f45c\";\n}\n.ion-ios-medical-outline:before {\n  content: \"\\f45b\";\n}\n.ion-ios-medkit:before {\n  content: \"\\f45e\";\n}\n.ion-ios-medkit-outline:before {\n  content: \"\\f45d\";\n}\n.ion-ios-mic:before {\n  content: \"\\f461\";\n}\n.ion-ios-mic-off:before {\n  content: \"\\f45f\";\n}\n.ion-ios-mic-outline:before {\n  content: \"\\f460\";\n}\n.ion-ios-minus:before {\n  content: \"\\f464\";\n}\n.ion-ios-minus-empty:before {\n  content: \"\\f462\";\n}\n.ion-ios-minus-outline:before {\n  content: \"\\f463\";\n}\n.ion-ios-monitor:before {\n  content: \"\\f466\";\n}\n.ion-ios-monitor-outline:before {\n  content: \"\\f465\";\n}\n.ion-ios-moon:before {\n  content: \"\\f468\";\n}\n.ion-ios-moon-outline:before {\n  content: \"\\f467\";\n}\n.ion-ios-more:before {\n  content: \"\\f46a\";\n}\n.ion-ios-more-outline:before {\n  content: \"\\f469\";\n}\n.ion-ios-musical-note:before {\n  content: \"\\f46b\";\n}\n.ion-ios-musical-notes:before {\n  content: \"\\f46c\";\n}\n.ion-ios-navigate:before {\n  content: \"\\f46e\";\n}\n.ion-ios-navigate-outline:before {\n  content: \"\\f46d\";\n}\n.ion-ios-nutrition:before {\n  content: \"\\f470\";\n}\n.ion-ios-nutrition-outline:before {\n  content: \"\\f46f\";\n}\n.ion-ios-paper:before {\n  content: \"\\f472\";\n}\n.ion-ios-paper-outline:before {\n  content: \"\\f471\";\n}\n.ion-ios-paperplane:before {\n  content: \"\\f474\";\n}\n.ion-ios-paperplane-outline:before {\n  content: \"\\f473\";\n}\n.ion-ios-partlysunny:before {\n  content: \"\\f476\";\n}\n.ion-ios-partlysunny-outline:before {\n  content: \"\\f475\";\n}\n.ion-ios-pause:before {\n  content: \"\\f478\";\n}\n.ion-ios-pause-outline:before {\n  content: \"\\f477\";\n}\n.ion-ios-paw:before {\n  content: \"\\f47a\";\n}\n.ion-ios-paw-outline:before {\n  content: \"\\f479\";\n}\n.ion-ios-people:before {\n  content: \"\\f47c\";\n}\n.ion-ios-people-outline:before {\n  content: \"\\f47b\";\n}\n.ion-ios-person:before {\n  content: \"\\f47e\";\n}\n.ion-ios-person-outline:before {\n  content: \"\\f47d\";\n}\n.ion-ios-personadd:before {\n  content: \"\\f480\";\n}\n.ion-ios-personadd-outline:before {\n  content: \"\\f47f\";\n}\n.ion-ios-photos:before {\n  content: \"\\f482\";\n}\n.ion-ios-photos-outline:before {\n  content: \"\\f481\";\n}\n.ion-ios-pie:before {\n  content: \"\\f484\";\n}\n.ion-ios-pie-outline:before {\n  content: \"\\f483\";\n}\n.ion-ios-pint:before {\n  content: \"\\f486\";\n}\n.ion-ios-pint-outline:before {\n  content: \"\\f485\";\n}\n.ion-ios-play:before {\n  content: \"\\f488\";\n}\n.ion-ios-play-outline:before {\n  content: \"\\f487\";\n}\n.ion-ios-plus:before {\n  content: \"\\f48b\";\n}\n.ion-ios-plus-empty:before {\n  content: \"\\f489\";\n}\n.ion-ios-plus-outline:before {\n  content: \"\\f48a\";\n}\n.ion-ios-pricetag:before {\n  content: \"\\f48d\";\n}\n.ion-ios-pricetag-outline:before {\n  content: \"\\f48c\";\n}\n.ion-ios-pricetags:before {\n  content: \"\\f48f\";\n}\n.ion-ios-pricetags-outline:before {\n  content: \"\\f48e\";\n}\n.ion-ios-printer:before {\n  content: \"\\f491\";\n}\n.ion-ios-printer-outline:before {\n  content: \"\\f490\";\n}\n.ion-ios-pulse:before {\n  content: \"\\f493\";\n}\n.ion-ios-pulse-strong:before {\n  content: \"\\f492\";\n}\n.ion-ios-rainy:before {\n  content: \"\\f495\";\n}\n.ion-ios-rainy-outline:before {\n  content: \"\\f494\";\n}\n.ion-ios-recording:before {\n  content: \"\\f497\";\n}\n.ion-ios-recording-outline:before {\n  content: \"\\f496\";\n}\n.ion-ios-redo:before {\n  content: \"\\f499\";\n}\n.ion-ios-redo-outline:before {\n  content: \"\\f498\";\n}\n.ion-ios-refresh:before {\n  content: \"\\f49c\";\n}\n.ion-ios-refresh-empty:before {\n  content: \"\\f49a\";\n}\n.ion-ios-refresh-outline:before {\n  content: \"\\f49b\";\n}\n.ion-ios-reload:before {\n  content: \"\\f49d\";\n}\n.ion-ios-reverse-camera:before {\n  content: \"\\f49f\";\n}\n.ion-ios-reverse-camera-outline:before {\n  content: \"\\f49e\";\n}\n.ion-ios-rewind:before {\n  content: \"\\f4a1\";\n}\n.ion-ios-rewind-outline:before {\n  content: \"\\f4a0\";\n}\n.ion-ios-rose:before {\n  content: \"\\f4a3\";\n}\n.ion-ios-rose-outline:before {\n  content: \"\\f4a2\";\n}\n.ion-ios-search:before {\n  content: \"\\f4a5\";\n}\n.ion-ios-search-strong:before {\n  content: \"\\f4a4\";\n}\n.ion-ios-settings:before {\n  content: \"\\f4a7\";\n}\n.ion-ios-settings-strong:before {\n  content: \"\\f4a6\";\n}\n.ion-ios-shuffle:before {\n  content: \"\\f4a9\";\n}\n.ion-ios-shuffle-strong:before {\n  content: \"\\f4a8\";\n}\n.ion-ios-skipbackward:before {\n  content: \"\\f4ab\";\n}\n.ion-ios-skipbackward-outline:before {\n  content: \"\\f4aa\";\n}\n.ion-ios-skipforward:before {\n  content: \"\\f4ad\";\n}\n.ion-ios-skipforward-outline:before {\n  content: \"\\f4ac\";\n}\n.ion-ios-snowy:before {\n  content: \"\\f4ae\";\n}\n.ion-ios-speedometer:before {\n  content: \"\\f4b0\";\n}\n.ion-ios-speedometer-outline:before {\n  content: \"\\f4af\";\n}\n.ion-ios-star:before {\n  content: \"\\f4b3\";\n}\n.ion-ios-star-half:before {\n  content: \"\\f4b1\";\n}\n.ion-ios-star-outline:before {\n  content: \"\\f4b2\";\n}\n.ion-ios-stopwatch:before {\n  content: \"\\f4b5\";\n}\n.ion-ios-stopwatch-outline:before {\n  content: \"\\f4b4\";\n}\n.ion-ios-sunny:before {\n  content: \"\\f4b7\";\n}\n.ion-ios-sunny-outline:before {\n  content: \"\\f4b6\";\n}\n.ion-ios-telephone:before {\n  content: \"\\f4b9\";\n}\n.ion-ios-telephone-outline:before {\n  content: \"\\f4b8\";\n}\n.ion-ios-tennisball:before {\n  content: \"\\f4bb\";\n}\n.ion-ios-tennisball-outline:before {\n  content: \"\\f4ba\";\n}\n.ion-ios-thunderstorm:before {\n  content: \"\\f4bd\";\n}\n.ion-ios-thunderstorm-outline:before {\n  content: \"\\f4bc\";\n}\n.ion-ios-time:before {\n  content: \"\\f4bf\";\n}\n.ion-ios-time-outline:before {\n  content: \"\\f4be\";\n}\n.ion-ios-timer:before {\n  content: \"\\f4c1\";\n}\n.ion-ios-timer-outline:before {\n  content: \"\\f4c0\";\n}\n.ion-ios-toggle:before {\n  content: \"\\f4c3\";\n}\n.ion-ios-toggle-outline:before {\n  content: \"\\f4c2\";\n}\n.ion-ios-trash:before {\n  content: \"\\f4c5\";\n}\n.ion-ios-trash-outline:before {\n  content: \"\\f4c4\";\n}\n.ion-ios-undo:before {\n  content: \"\\f4c7\";\n}\n.ion-ios-undo-outline:before {\n  content: \"\\f4c6\";\n}\n.ion-ios-unlocked:before {\n  content: \"\\f4c9\";\n}\n.ion-ios-unlocked-outline:before {\n  content: \"\\f4c8\";\n}\n.ion-ios-upload:before {\n  content: \"\\f4cb\";\n}\n.ion-ios-upload-outline:before {\n  content: \"\\f4ca\";\n}\n.ion-ios-videocam:before {\n  content: \"\\f4cd\";\n}\n.ion-ios-videocam-outline:before {\n  content: \"\\f4cc\";\n}\n.ion-ios-volume-high:before {\n  content: \"\\f4ce\";\n}\n.ion-ios-volume-low:before {\n  content: \"\\f4cf\";\n}\n.ion-ios-wineglass:before {\n  content: \"\\f4d1\";\n}\n.ion-ios-wineglass-outline:before {\n  content: \"\\f4d0\";\n}\n.ion-ios-world:before {\n  content: \"\\f4d3\";\n}\n.ion-ios-world-outline:before {\n  content: \"\\f4d2\";\n}\n.ion-ipad:before {\n  content: \"\\f1f9\";\n}\n.ion-iphone:before {\n  content: \"\\f1fa\";\n}\n.ion-ipod:before {\n  content: \"\\f1fb\";\n}\n.ion-jet:before {\n  content: \"\\f295\";\n}\n.ion-key:before {\n  content: \"\\f296\";\n}\n.ion-knife:before {\n  content: \"\\f297\";\n}\n.ion-laptop:before {\n  content: \"\\f1fc\";\n}\n.ion-leaf:before {\n  content: \"\\f1fd\";\n}\n.ion-levels:before {\n  content: \"\\f298\";\n}\n.ion-lightbulb:before {\n  content: \"\\f299\";\n}\n.ion-link:before {\n  content: \"\\f1fe\";\n}\n.ion-load-a:before {\n  content: \"\\f29a\";\n}\n.ion-load-b:before {\n  content: \"\\f29b\";\n}\n.ion-load-c:before {\n  content: \"\\f29c\";\n}\n.ion-load-d:before {\n  content: \"\\f29d\";\n}\n.ion-location:before {\n  content: \"\\f1ff\";\n}\n.ion-lock-combination:before {\n  content: \"\\f4d4\";\n}\n.ion-locked:before {\n  content: \"\\f200\";\n}\n.ion-log-in:before {\n  content: \"\\f29e\";\n}\n.ion-log-out:before {\n  content: \"\\f29f\";\n}\n.ion-loop:before {\n  content: \"\\f201\";\n}\n.ion-magnet:before {\n  content: \"\\f2a0\";\n}\n.ion-male:before {\n  content: \"\\f2a1\";\n}\n.ion-man:before {\n  content: \"\\f202\";\n}\n.ion-map:before {\n  content: \"\\f203\";\n}\n.ion-medkit:before {\n  content: \"\\f2a2\";\n}\n.ion-merge:before {\n  content: \"\\f33f\";\n}\n.ion-mic-a:before {\n  content: \"\\f204\";\n}\n.ion-mic-b:before {\n  content: \"\\f205\";\n}\n.ion-mic-c:before {\n  content: \"\\f206\";\n}\n.ion-minus:before {\n  content: \"\\f209\";\n}\n.ion-minus-circled:before {\n  content: \"\\f207\";\n}\n.ion-minus-round:before {\n  content: \"\\f208\";\n}\n.ion-model-s:before {\n  content: \"\\f2c1\";\n}\n.ion-monitor:before {\n  content: \"\\f20a\";\n}\n.ion-more:before {\n  content: \"\\f20b\";\n}\n.ion-mouse:before {\n  content: \"\\f340\";\n}\n.ion-music-note:before {\n  content: \"\\f20c\";\n}\n.ion-navicon:before {\n  content: \"\\f20e\";\n}\n.ion-navicon-round:before {\n  content: \"\\f20d\";\n}\n.ion-navigate:before {\n  content: \"\\f2a3\";\n}\n.ion-network:before {\n  content: \"\\f341\";\n}\n.ion-no-smoking:before {\n  content: \"\\f2c2\";\n}\n.ion-nuclear:before {\n  content: \"\\f2a4\";\n}\n.ion-outlet:before {\n  content: \"\\f342\";\n}\n.ion-paintbrush:before {\n  content: \"\\f4d5\";\n}\n.ion-paintbucket:before {\n  content: \"\\f4d6\";\n}\n.ion-paper-airplane:before {\n  content: \"\\f2c3\";\n}\n.ion-paperclip:before {\n  content: \"\\f20f\";\n}\n.ion-pause:before {\n  content: \"\\f210\";\n}\n.ion-person:before {\n  content: \"\\f213\";\n}\n.ion-person-add:before {\n  content: \"\\f211\";\n}\n.ion-person-stalker:before {\n  content: \"\\f212\";\n}\n.ion-pie-graph:before {\n  content: \"\\f2a5\";\n}\n.ion-pin:before {\n  content: \"\\f2a6\";\n}\n.ion-pinpoint:before {\n  content: \"\\f2a7\";\n}\n.ion-pizza:before {\n  content: \"\\f2a8\";\n}\n.ion-plane:before {\n  content: \"\\f214\";\n}\n.ion-planet:before {\n  content: \"\\f343\";\n}\n.ion-play:before {\n  content: \"\\f215\";\n}\n.ion-playstation:before {\n  content: \"\\f30a\";\n}\n.ion-plus:before {\n  content: \"\\f218\";\n}\n.ion-plus-circled:before {\n  content: \"\\f216\";\n}\n.ion-plus-round:before {\n  content: \"\\f217\";\n}\n.ion-podium:before {\n  content: \"\\f344\";\n}\n.ion-pound:before {\n  content: \"\\f219\";\n}\n.ion-power:before {\n  content: \"\\f2a9\";\n}\n.ion-pricetag:before {\n  content: \"\\f2aa\";\n}\n.ion-pricetags:before {\n  content: \"\\f2ab\";\n}\n.ion-printer:before {\n  content: \"\\f21a\";\n}\n.ion-pull-request:before {\n  content: \"\\f345\";\n}\n.ion-qr-scanner:before {\n  content: \"\\f346\";\n}\n.ion-quote:before {\n  content: \"\\f347\";\n}\n.ion-radio-waves:before {\n  content: \"\\f2ac\";\n}\n.ion-record:before {\n  content: \"\\f21b\";\n}\n.ion-refresh:before {\n  content: \"\\f21c\";\n}\n.ion-reply:before {\n  content: \"\\f21e\";\n}\n.ion-reply-all:before {\n  content: \"\\f21d\";\n}\n.ion-ribbon-a:before {\n  content: \"\\f348\";\n}\n.ion-ribbon-b:before {\n  content: \"\\f349\";\n}\n.ion-sad:before {\n  content: \"\\f34a\";\n}\n.ion-sad-outline:before {\n  content: \"\\f4d7\";\n}\n.ion-scissors:before {\n  content: \"\\f34b\";\n}\n.ion-search:before {\n  content: \"\\f21f\";\n}\n.ion-settings:before {\n  content: \"\\f2ad\";\n}\n.ion-share:before {\n  content: \"\\f220\";\n}\n.ion-shuffle:before {\n  content: \"\\f221\";\n}\n.ion-skip-backward:before {\n  content: \"\\f222\";\n}\n.ion-skip-forward:before {\n  content: \"\\f223\";\n}\n.ion-social-android:before {\n  content: \"\\f225\";\n}\n.ion-social-android-outline:before {\n  content: \"\\f224\";\n}\n.ion-social-angular:before {\n  content: \"\\f4d9\";\n}\n.ion-social-angular-outline:before {\n  content: \"\\f4d8\";\n}\n.ion-social-apple:before {\n  content: \"\\f227\";\n}\n.ion-social-apple-outline:before {\n  content: \"\\f226\";\n}\n.ion-social-bitcoin:before {\n  content: \"\\f2af\";\n}\n.ion-social-bitcoin-outline:before {\n  content: \"\\f2ae\";\n}\n.ion-social-buffer:before {\n  content: \"\\f229\";\n}\n.ion-social-buffer-outline:before {\n  content: \"\\f228\";\n}\n.ion-social-chrome:before {\n  content: \"\\f4db\";\n}\n.ion-social-chrome-outline:before {\n  content: \"\\f4da\";\n}\n.ion-social-codepen:before {\n  content: \"\\f4dd\";\n}\n.ion-social-codepen-outline:before {\n  content: \"\\f4dc\";\n}\n.ion-social-css3:before {\n  content: \"\\f4df\";\n}\n.ion-social-css3-outline:before {\n  content: \"\\f4de\";\n}\n.ion-social-designernews:before {\n  content: \"\\f22b\";\n}\n.ion-social-designernews-outline:before {\n  content: \"\\f22a\";\n}\n.ion-social-dribbble:before {\n  content: \"\\f22d\";\n}\n.ion-social-dribbble-outline:before {\n  content: \"\\f22c\";\n}\n.ion-social-dropbox:before {\n  content: \"\\f22f\";\n}\n.ion-social-dropbox-outline:before {\n  content: \"\\f22e\";\n}\n.ion-social-euro:before {\n  content: \"\\f4e1\";\n}\n.ion-social-euro-outline:before {\n  content: \"\\f4e0\";\n}\n.ion-social-facebook:before {\n  content: \"\\f231\";\n}\n.ion-social-facebook-outline:before {\n  content: \"\\f230\";\n}\n.ion-social-foursquare:before {\n  content: \"\\f34d\";\n}\n.ion-social-foursquare-outline:before {\n  content: \"\\f34c\";\n}\n.ion-social-freebsd-devil:before {\n  content: \"\\f2c4\";\n}\n.ion-social-github:before {\n  content: \"\\f233\";\n}\n.ion-social-github-outline:before {\n  content: \"\\f232\";\n}\n.ion-social-google:before {\n  content: \"\\f34f\";\n}\n.ion-social-google-outline:before {\n  content: \"\\f34e\";\n}\n.ion-social-googleplus:before {\n  content: \"\\f235\";\n}\n.ion-social-googleplus-outline:before {\n  content: \"\\f234\";\n}\n.ion-social-hackernews:before {\n  content: \"\\f237\";\n}\n.ion-social-hackernews-outline:before {\n  content: \"\\f236\";\n}\n.ion-social-html5:before {\n  content: \"\\f4e3\";\n}\n.ion-social-html5-outline:before {\n  content: \"\\f4e2\";\n}\n.ion-social-instagram:before {\n  content: \"\\f351\";\n}\n.ion-social-instagram-outline:before {\n  content: \"\\f350\";\n}\n.ion-social-javascript:before {\n  content: \"\\f4e5\";\n}\n.ion-social-javascript-outline:before {\n  content: \"\\f4e4\";\n}\n.ion-social-linkedin:before {\n  content: \"\\f239\";\n}\n.ion-social-linkedin-outline:before {\n  content: \"\\f238\";\n}\n.ion-social-markdown:before {\n  content: \"\\f4e6\";\n}\n.ion-social-nodejs:before {\n  content: \"\\f4e7\";\n}\n.ion-social-octocat:before {\n  content: \"\\f4e8\";\n}\n.ion-social-pinterest:before {\n  content: \"\\f2b1\";\n}\n.ion-social-pinterest-outline:before {\n  content: \"\\f2b0\";\n}\n.ion-social-python:before {\n  content: \"\\f4e9\";\n}\n.ion-social-reddit:before {\n  content: \"\\f23b\";\n}\n.ion-social-reddit-outline:before {\n  content: \"\\f23a\";\n}\n.ion-social-rss:before {\n  content: \"\\f23d\";\n}\n.ion-social-rss-outline:before {\n  content: \"\\f23c\";\n}\n.ion-social-sass:before {\n  content: \"\\f4ea\";\n}\n.ion-social-skype:before {\n  content: \"\\f23f\";\n}\n.ion-social-skype-outline:before {\n  content: \"\\f23e\";\n}\n.ion-social-snapchat:before {\n  content: \"\\f4ec\";\n}\n.ion-social-snapchat-outline:before {\n  content: \"\\f4eb\";\n}\n.ion-social-tumblr:before {\n  content: \"\\f241\";\n}\n.ion-social-tumblr-outline:before {\n  content: \"\\f240\";\n}\n.ion-social-tux:before {\n  content: \"\\f2c5\";\n}\n.ion-social-twitch:before {\n  content: \"\\f4ee\";\n}\n.ion-social-twitch-outline:before {\n  content: \"\\f4ed\";\n}\n.ion-social-twitter:before {\n  content: \"\\f243\";\n}\n.ion-social-twitter-outline:before {\n  content: \"\\f242\";\n}\n.ion-social-usd:before {\n  content: \"\\f353\";\n}\n.ion-social-usd-outline:before {\n  content: \"\\f352\";\n}\n.ion-social-vimeo:before {\n  content: \"\\f245\";\n}\n.ion-social-vimeo-outline:before {\n  content: \"\\f244\";\n}\n.ion-social-whatsapp:before {\n  content: \"\\f4f0\";\n}\n.ion-social-whatsapp-outline:before {\n  content: \"\\f4ef\";\n}\n.ion-social-windows:before {\n  content: \"\\f247\";\n}\n.ion-social-windows-outline:before {\n  content: \"\\f246\";\n}\n.ion-social-wordpress:before {\n  content: \"\\f249\";\n}\n.ion-social-wordpress-outline:before {\n  content: \"\\f248\";\n}\n.ion-social-yahoo:before {\n  content: \"\\f24b\";\n}\n.ion-social-yahoo-outline:before {\n  content: \"\\f24a\";\n}\n.ion-social-yen:before {\n  content: \"\\f4f2\";\n}\n.ion-social-yen-outline:before {\n  content: \"\\f4f1\";\n}\n.ion-social-youtube:before {\n  content: \"\\f24d\";\n}\n.ion-social-youtube-outline:before {\n  content: \"\\f24c\";\n}\n.ion-soup-can:before {\n  content: \"\\f4f4\";\n}\n.ion-soup-can-outline:before {\n  content: \"\\f4f3\";\n}\n.ion-speakerphone:before {\n  content: \"\\f2b2\";\n}\n.ion-speedometer:before {\n  content: \"\\f2b3\";\n}\n.ion-spoon:before {\n  content: \"\\f2b4\";\n}\n.ion-star:before {\n  content: \"\\f24e\";\n}\n.ion-stats-bars:before {\n  content: \"\\f2b5\";\n}\n.ion-steam:before {\n  content: \"\\f30b\";\n}\n.ion-stop:before {\n  content: \"\\f24f\";\n}\n.ion-thermometer:before {\n  content: \"\\f2b6\";\n}\n.ion-thumbsdown:before {\n  content: \"\\f250\";\n}\n.ion-thumbsup:before {\n  content: \"\\f251\";\n}\n.ion-toggle:before {\n  content: \"\\f355\";\n}\n.ion-toggle-filled:before {\n  content: \"\\f354\";\n}\n.ion-transgender:before {\n  content: \"\\f4f5\";\n}\n.ion-trash-a:before {\n  content: \"\\f252\";\n}\n.ion-trash-b:before {\n  content: \"\\f253\";\n}\n.ion-trophy:before {\n  content: \"\\f356\";\n}\n.ion-tshirt:before {\n  content: \"\\f4f7\";\n}\n.ion-tshirt-outline:before {\n  content: \"\\f4f6\";\n}\n.ion-umbrella:before {\n  content: \"\\f2b7\";\n}\n.ion-university:before {\n  content: \"\\f357\";\n}\n.ion-unlocked:before {\n  content: \"\\f254\";\n}\n.ion-upload:before {\n  content: \"\\f255\";\n}\n.ion-usb:before {\n  content: \"\\f2b8\";\n}\n.ion-videocamera:before {\n  content: \"\\f256\";\n}\n.ion-volume-high:before {\n  content: \"\\f257\";\n}\n.ion-volume-low:before {\n  content: \"\\f258\";\n}\n.ion-volume-medium:before {\n  content: \"\\f259\";\n}\n.ion-volume-mute:before {\n  content: \"\\f25a\";\n}\n.ion-wand:before {\n  content: \"\\f358\";\n}\n.ion-waterdrop:before {\n  content: \"\\f25b\";\n}\n.ion-wifi:before {\n  content: \"\\f25c\";\n}\n.ion-wineglass:before {\n  content: \"\\f2b9\";\n}\n.ion-woman:before {\n  content: \"\\f25d\";\n}\n.ion-wrench:before {\n  content: \"\\f2ba\";\n}\n.ion-xbox:before {\n  content: \"\\f30c\";\n}\n/*!\nAnimate.css - http://daneden.me/animate\nLicensed under the MIT license - http://opensource.org/licenses/MIT\n\nCopyright (c) 2014 Daniel Eden\n*/\n.animated {\n  -webkit-animation-duration: 1s;\n  animation-duration: 1s;\n  -webkit-animation-fill-mode: both;\n  animation-fill-mode: both;\n}\n.animated.infinite {\n  -webkit-animation-iteration-count: infinite;\n  animation-iteration-count: infinite;\n}\n.animated.hinge {\n  -webkit-animation-duration: 2s;\n  animation-duration: 2s;\n}\n@-webkit-keyframes bounce {\n  0%,\n  100%,\n  20%,\n  53%,\n  80% {\n    -webkit-transition-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1);\n    transition-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1);\n    -webkit-transform: translate3d(0, 0, 0);\n    transform: translate3d(0, 0, 0);\n  }\n  40%,\n  43% {\n    -webkit-transition-timing-function: cubic-bezier(0.755, 0.05, 0.855, 0.06);\n    transition-timing-function: cubic-bezier(0.755, 0.05, 0.855, 0.06);\n    -webkit-transform: translate3d(0, -30px, 0);\n    transform: translate3d(0, -30px, 0);\n  }\n  70% {\n    -webkit-transition-timing-function: cubic-bezier(0.755, 0.05, 0.855, 0.06);\n    transition-timing-function: cubic-bezier(0.755, 0.05, 0.855, 0.06);\n    -webkit-transform: translate3d(0, -15px, 0);\n    transform: translate3d(0, -15px, 0);\n  }\n  90% {\n    -webkit-transform: translate3d(0, -4px, 0);\n    transform: translate3d(0, -4px, 0);\n  }\n}\n@keyframes bounce {\n  0%,\n  100%,\n  20%,\n  53%,\n  80% {\n    -webkit-transition-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1);\n    transition-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1);\n    -webkit-transform: translate3d(0, 0, 0);\n    transform: translate3d(0, 0, 0);\n  }\n  40%,\n  43% {\n    -webkit-transition-timing-function: cubic-bezier(0.755, 0.05, 0.855, 0.06);\n    transition-timing-function: cubic-bezier(0.755, 0.05, 0.855, 0.06);\n    -webkit-transform: translate3d(0, -30px, 0);\n    transform: translate3d(0, -30px, 0);\n  }\n  70% {\n    -webkit-transition-timing-function: cubic-bezier(0.755, 0.05, 0.855, 0.06);\n    transition-timing-function: cubic-bezier(0.755, 0.05, 0.855, 0.06);\n    -webkit-transform: translate3d(0, -15px, 0);\n    transform: translate3d(0, -15px, 0);\n  }\n  90% {\n    -webkit-transform: translate3d(0, -4px, 0);\n    transform: translate3d(0, -4px, 0);\n  }\n}\n.bounce {\n  -webkit-animation-name: bounce;\n  animation-name: bounce;\n  -webkit-transform-origin: center bottom;\n  -ms-transform-origin: center bottom;\n  transform-origin: center bottom;\n}\n@-webkit-keyframes flash {\n  0%,\n  100%,\n  50% {\n    opacity: 1;\n  }\n  25%,\n  75% {\n    opacity: 0;\n  }\n}\n@keyframes flash {\n  0%,\n  100%,\n  50% {\n    opacity: 1;\n  }\n  25%,\n  75% {\n    opacity: 0;\n  }\n}\n.flash {\n  -webkit-animation-name: flash;\n  animation-name: flash;\n}\n@-webkit-keyframes pulse {\n  0% {\n    -webkit-transform: scale3d(1, 1, 1);\n    transform: scale3d(1, 1, 1);\n  }\n  50% {\n    -webkit-transform: scale3d(1.05, 1.05, 1.05);\n    transform: scale3d(1.05, 1.05, 1.05);\n  }\n  100% {\n    -webkit-transform: scale3d(1, 1, 1);\n    transform: scale3d(1, 1, 1);\n  }\n}\n@keyframes pulse {\n  0% {\n    -webkit-transform: scale3d(1, 1, 1);\n    transform: scale3d(1, 1, 1);\n  }\n  50% {\n    -webkit-transform: scale3d(1.05, 1.05, 1.05);\n    transform: scale3d(1.05, 1.05, 1.05);\n  }\n  100% {\n    -webkit-transform: scale3d(1, 1, 1);\n    transform: scale3d(1, 1, 1);\n  }\n}\n.pulse {\n  -webkit-animation-name: pulse;\n  animation-name: pulse;\n}\n@-webkit-keyframes rubberBand {\n  0% {\n    -webkit-transform: scale3d(1, 1, 1);\n    transform: scale3d(1, 1, 1);\n  }\n  30% {\n    -webkit-transform: scale3d(1.25, 0.75, 1);\n    transform: scale3d(1.25, 0.75, 1);\n  }\n  40% {\n    -webkit-transform: scale3d(0.75, 1.25, 1);\n    transform: scale3d(0.75, 1.25, 1);\n  }\n  50% {\n    -webkit-transform: scale3d(1.15, 0.85, 1);\n    transform: scale3d(1.15, 0.85, 1);\n  }\n  65% {\n    -webkit-transform: scale3d(0.95, 1.05, 1);\n    transform: scale3d(0.95, 1.05, 1);\n  }\n  75% {\n    -webkit-transform: scale3d(1.05, 0.95, 1);\n    transform: scale3d(1.05, 0.95, 1);\n  }\n  100% {\n    -webkit-transform: scale3d(1, 1, 1);\n    transform: scale3d(1, 1, 1);\n  }\n}\n@keyframes rubberBand {\n  0% {\n    -webkit-transform: scale3d(1, 1, 1);\n    transform: scale3d(1, 1, 1);\n  }\n  30% {\n    -webkit-transform: scale3d(1.25, 0.75, 1);\n    transform: scale3d(1.25, 0.75, 1);\n  }\n  40% {\n    -webkit-transform: scale3d(0.75, 1.25, 1);\n    transform: scale3d(0.75, 1.25, 1);\n  }\n  50% {\n    -webkit-transform: scale3d(1.15, 0.85, 1);\n    transform: scale3d(1.15, 0.85, 1);\n  }\n  65% {\n    -webkit-transform: scale3d(0.95, 1.05, 1);\n    transform: scale3d(0.95, 1.05, 1);\n  }\n  75% {\n    -webkit-transform: scale3d(1.05, 0.95, 1);\n    transform: scale3d(1.05, 0.95, 1);\n  }\n  100% {\n    -webkit-transform: scale3d(1, 1, 1);\n    transform: scale3d(1, 1, 1);\n  }\n}\n.rubberBand {\n  -webkit-animation-name: rubberBand;\n  animation-name: rubberBand;\n}\n@-webkit-keyframes shake {\n  0%,\n  100% {\n    -webkit-transform: translate3d(0, 0, 0);\n    transform: translate3d(0, 0, 0);\n  }\n  10%,\n  30%,\n  50%,\n  70%,\n  90% {\n    -webkit-transform: translate3d(-10px, 0, 0);\n    transform: translate3d(-10px, 0, 0);\n  }\n  20%,\n  40%,\n  60%,\n  80% {\n    -webkit-transform: translate3d(10px, 0, 0);\n    transform: translate3d(10px, 0, 0);\n  }\n}\n@keyframes shake {\n  0%,\n  100% {\n    -webkit-transform: translate3d(0, 0, 0);\n    transform: translate3d(0, 0, 0);\n  }\n  10%,\n  30%,\n  50%,\n  70%,\n  90% {\n    -webkit-transform: translate3d(-10px, 0, 0);\n    transform: translate3d(-10px, 0, 0);\n  }\n  20%,\n  40%,\n  60%,\n  80% {\n    -webkit-transform: translate3d(10px, 0, 0);\n    transform: translate3d(10px, 0, 0);\n  }\n}\n.shake {\n  -webkit-animation-name: shake;\n  animation-name: shake;\n}\n@-webkit-keyframes swing {\n  20% {\n    -webkit-transform: rotate3d(0, 0, 1, 15deg);\n    transform: rotate3d(0, 0, 1, 15deg);\n  }\n  40% {\n    -webkit-transform: rotate3d(0, 0, 1, -10deg);\n    transform: rotate3d(0, 0, 1, -10deg);\n  }\n  60% {\n    -webkit-transform: rotate3d(0, 0, 1, 5deg);\n    transform: rotate3d(0, 0, 1, 5deg);\n  }\n  80% {\n    -webkit-transform: rotate3d(0, 0, 1, -5deg);\n    transform: rotate3d(0, 0, 1, -5deg);\n  }\n  100% {\n    -webkit-transform: rotate3d(0, 0, 1, 0deg);\n    transform: rotate3d(0, 0, 1, 0deg);\n  }\n}\n@keyframes swing {\n  20% {\n    -webkit-transform: rotate3d(0, 0, 1, 15deg);\n    transform: rotate3d(0, 0, 1, 15deg);\n  }\n  40% {\n    -webkit-transform: rotate3d(0, 0, 1, -10deg);\n    transform: rotate3d(0, 0, 1, -10deg);\n  }\n  60% {\n    -webkit-transform: rotate3d(0, 0, 1, 5deg);\n    transform: rotate3d(0, 0, 1, 5deg);\n  }\n  80% {\n    -webkit-transform: rotate3d(0, 0, 1, -5deg);\n    transform: rotate3d(0, 0, 1, -5deg);\n  }\n  100% {\n    -webkit-transform: rotate3d(0, 0, 1, 0deg);\n    transform: rotate3d(0, 0, 1, 0deg);\n  }\n}\n.swing {\n  -webkit-transform-origin: top center;\n  -ms-transform-origin: top center;\n  transform-origin: top center;\n  -webkit-animation-name: swing;\n  animation-name: swing;\n}\n@-webkit-keyframes tada {\n  0% {\n    -webkit-transform: scale3d(1, 1, 1);\n    transform: scale3d(1, 1, 1);\n  }\n  10%,\n  20% {\n    -webkit-transform: scale3d(0.9, 0.9, 0.9) rotate3d(0, 0, 1, -3deg);\n    transform: scale3d(0.9, 0.9, 0.9) rotate3d(0, 0, 1, -3deg);\n  }\n  30%,\n  50%,\n  70%,\n  90% {\n    -webkit-transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, 3deg);\n    transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, 3deg);\n  }\n  40%,\n  60%,\n  80% {\n    -webkit-transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, -3deg);\n    transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, -3deg);\n  }\n  100% {\n    -webkit-transform: scale3d(1, 1, 1);\n    transform: scale3d(1, 1, 1);\n  }\n}\n@keyframes tada {\n  0% {\n    -webkit-transform: scale3d(1, 1, 1);\n    transform: scale3d(1, 1, 1);\n  }\n  10%,\n  20% {\n    -webkit-transform: scale3d(0.9, 0.9, 0.9) rotate3d(0, 0, 1, -3deg);\n    transform: scale3d(0.9, 0.9, 0.9) rotate3d(0, 0, 1, -3deg);\n  }\n  30%,\n  50%,\n  70%,\n  90% {\n    -webkit-transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, 3deg);\n    transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, 3deg);\n  }\n  40%,\n  60%,\n  80% {\n    -webkit-transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, -3deg);\n    transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, -3deg);\n  }\n  100% {\n    -webkit-transform: scale3d(1, 1, 1);\n    transform: scale3d(1, 1, 1);\n  }\n}\n.tada {\n  -webkit-animation-name: tada;\n  animation-name: tada;\n}\n@-webkit-keyframes wobble {\n  0% {\n    -webkit-transform: none;\n    transform: none;\n  }\n  15% {\n    -webkit-transform: translate3d(-25%, 0, 0) rotate3d(0, 0, 1, -5deg);\n    transform: translate3d(-25%, 0, 0) rotate3d(0, 0, 1, -5deg);\n  }\n  30% {\n    -webkit-transform: translate3d(20%, 0, 0) rotate3d(0, 0, 1, 3deg);\n    transform: translate3d(20%, 0, 0) rotate3d(0, 0, 1, 3deg);\n  }\n  45% {\n    -webkit-transform: translate3d(-15%, 0, 0) rotate3d(0, 0, 1, -3deg);\n    transform: translate3d(-15%, 0, 0) rotate3d(0, 0, 1, -3deg);\n  }\n  60% {\n    -webkit-transform: translate3d(10%, 0, 0) rotate3d(0, 0, 1, 2deg);\n    transform: translate3d(10%, 0, 0) rotate3d(0, 0, 1, 2deg);\n  }\n  75% {\n    -webkit-transform: translate3d(-5%, 0, 0) rotate3d(0, 0, 1, -1deg);\n    transform: translate3d(-5%, 0, 0) rotate3d(0, 0, 1, -1deg);\n  }\n  100% {\n    -webkit-transform: none;\n    transform: none;\n  }\n}\n@keyframes wobble {\n  0% {\n    -webkit-transform: none;\n    transform: none;\n  }\n  15% {\n    -webkit-transform: translate3d(-25%, 0, 0) rotate3d(0, 0, 1, -5deg);\n    transform: translate3d(-25%, 0, 0) rotate3d(0, 0, 1, -5deg);\n  }\n  30% {\n    -webkit-transform: translate3d(20%, 0, 0) rotate3d(0, 0, 1, 3deg);\n    transform: translate3d(20%, 0, 0) rotate3d(0, 0, 1, 3deg);\n  }\n  45% {\n    -webkit-transform: translate3d(-15%, 0, 0) rotate3d(0, 0, 1, -3deg);\n    transform: translate3d(-15%, 0, 0) rotate3d(0, 0, 1, -3deg);\n  }\n  60% {\n    -webkit-transform: translate3d(10%, 0, 0) rotate3d(0, 0, 1, 2deg);\n    transform: translate3d(10%, 0, 0) rotate3d(0, 0, 1, 2deg);\n  }\n  75% {\n    -webkit-transform: translate3d(-5%, 0, 0) rotate3d(0, 0, 1, -1deg);\n    transform: translate3d(-5%, 0, 0) rotate3d(0, 0, 1, -1deg);\n  }\n  100% {\n    -webkit-transform: none;\n    transform: none;\n  }\n}\n.wobble {\n  -webkit-animation-name: wobble;\n  animation-name: wobble;\n}\n@-webkit-keyframes bounceIn {\n  0%,\n  100%,\n  20%,\n  40%,\n  60%,\n  80% {\n    -webkit-transition-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1);\n    transition-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1);\n  }\n  0% {\n    opacity: 0;\n    -webkit-transform: scale3d(0.3, 0.3, 0.3);\n    transform: scale3d(0.3, 0.3, 0.3);\n  }\n  20% {\n    -webkit-transform: scale3d(1.1, 1.1, 1.1);\n    transform: scale3d(1.1, 1.1, 1.1);\n  }\n  40% {\n    -webkit-transform: scale3d(0.9, 0.9, 0.9);\n    transform: scale3d(0.9, 0.9, 0.9);\n  }\n  60% {\n    opacity: 1;\n    -webkit-transform: scale3d(1.03, 1.03, 1.03);\n    transform: scale3d(1.03, 1.03, 1.03);\n  }\n  80% {\n    -webkit-transform: scale3d(0.97, 0.97, 0.97);\n    transform: scale3d(0.97, 0.97, 0.97);\n  }\n  100% {\n    opacity: 1;\n    -webkit-transform: scale3d(1, 1, 1);\n    transform: scale3d(1, 1, 1);\n  }\n}\n@keyframes bounceIn {\n  0%,\n  100%,\n  20%,\n  40%,\n  60%,\n  80% {\n    -webkit-transition-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1);\n    transition-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1);\n  }\n  0% {\n    opacity: 0;\n    -webkit-transform: scale3d(0.3, 0.3, 0.3);\n    transform: scale3d(0.3, 0.3, 0.3);\n  }\n  20% {\n    -webkit-transform: scale3d(1.1, 1.1, 1.1);\n    transform: scale3d(1.1, 1.1, 1.1);\n  }\n  40% {\n    -webkit-transform: scale3d(0.9, 0.9, 0.9);\n    transform: scale3d(0.9, 0.9, 0.9);\n  }\n  60% {\n    opacity: 1;\n    -webkit-transform: scale3d(1.03, 1.03, 1.03);\n    transform: scale3d(1.03, 1.03, 1.03);\n  }\n  80% {\n    -webkit-transform: scale3d(0.97, 0.97, 0.97);\n    transform: scale3d(0.97, 0.97, 0.97);\n  }\n  100% {\n    opacity: 1;\n    -webkit-transform: scale3d(1, 1, 1);\n    transform: scale3d(1, 1, 1);\n  }\n}\n.bounceIn {\n  -webkit-animation-name: bounceIn;\n  animation-name: bounceIn;\n  -webkit-animation-duration: .75s;\n  animation-duration: 0.75s;\n}\n@-webkit-keyframes bounceInDown {\n  0%,\n  100%,\n  60%,\n  75%,\n  90% {\n    -webkit-transition-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1);\n    transition-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1);\n  }\n  0% {\n    opacity: 0;\n    -webkit-transform: translate3d(0, -3000px, 0);\n    transform: translate3d(0, -3000px, 0);\n  }\n  60% {\n    opacity: 1;\n    -webkit-transform: translate3d(0, 25px, 0);\n    transform: translate3d(0, 25px, 0);\n  }\n  75% {\n    -webkit-transform: translate3d(0, -10px, 0);\n    transform: translate3d(0, -10px, 0);\n  }\n  90% {\n    -webkit-transform: translate3d(0, 5px, 0);\n    transform: translate3d(0, 5px, 0);\n  }\n  100% {\n    -webkit-transform: none;\n    transform: none;\n  }\n}\n@keyframes bounceInDown {\n  0%,\n  100%,\n  60%,\n  75%,\n  90% {\n    -webkit-transition-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1);\n    transition-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1);\n  }\n  0% {\n    opacity: 0;\n    -webkit-transform: translate3d(0, -3000px, 0);\n    transform: translate3d(0, -3000px, 0);\n  }\n  60% {\n    opacity: 1;\n    -webkit-transform: translate3d(0, 25px, 0);\n    transform: translate3d(0, 25px, 0);\n  }\n  75% {\n    -webkit-transform: translate3d(0, -10px, 0);\n    transform: translate3d(0, -10px, 0);\n  }\n  90% {\n    -webkit-transform: translate3d(0, 5px, 0);\n    transform: translate3d(0, 5px, 0);\n  }\n  100% {\n    -webkit-transform: none;\n    transform: none;\n  }\n}\n.bounceInDown {\n  -webkit-animation-name: bounceInDown;\n  animation-name: bounceInDown;\n}\n@-webkit-keyframes bounceInLeft {\n  0%,\n  100%,\n  60%,\n  75%,\n  90% {\n    -webkit-transition-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1);\n    transition-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1);\n  }\n  0% {\n    opacity: 0;\n    -webkit-transform: translate3d(-3000px, 0, 0);\n    transform: translate3d(-3000px, 0, 0);\n  }\n  60% {\n    opacity: 1;\n    -webkit-transform: translate3d(25px, 0, 0);\n    transform: translate3d(25px, 0, 0);\n  }\n  75% {\n    -webkit-transform: translate3d(-10px, 0, 0);\n    transform: translate3d(-10px, 0, 0);\n  }\n  90% {\n    -webkit-transform: translate3d(5px, 0, 0);\n    transform: translate3d(5px, 0, 0);\n  }\n  100% {\n    -webkit-transform: none;\n    transform: none;\n  }\n}\n@keyframes bounceInLeft {\n  0%,\n  100%,\n  60%,\n  75%,\n  90% {\n    -webkit-transition-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1);\n    transition-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1);\n  }\n  0% {\n    opacity: 0;\n    -webkit-transform: translate3d(-3000px, 0, 0);\n    transform: translate3d(-3000px, 0, 0);\n  }\n  60% {\n    opacity: 1;\n    -webkit-transform: translate3d(25px, 0, 0);\n    transform: translate3d(25px, 0, 0);\n  }\n  75% {\n    -webkit-transform: translate3d(-10px, 0, 0);\n    transform: translate3d(-10px, 0, 0);\n  }\n  90% {\n    -webkit-transform: translate3d(5px, 0, 0);\n    transform: translate3d(5px, 0, 0);\n  }\n  100% {\n    -webkit-transform: none;\n    transform: none;\n  }\n}\n.bounceInLeft {\n  -webkit-animation-name: bounceInLeft;\n  animation-name: bounceInLeft;\n}\n@-webkit-keyframes bounceInRight {\n  0%,\n  100%,\n  60%,\n  75%,\n  90% {\n    -webkit-transition-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1);\n    transition-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1);\n  }\n  0% {\n    opacity: 0;\n    -webkit-transform: translate3d(3000px, 0, 0);\n    transform: translate3d(3000px, 0, 0);\n  }\n  60% {\n    opacity: 1;\n    -webkit-transform: translate3d(-25px, 0, 0);\n    transform: translate3d(-25px, 0, 0);\n  }\n  75% {\n    -webkit-transform: translate3d(10px, 0, 0);\n    transform: translate3d(10px, 0, 0);\n  }\n  90% {\n    -webkit-transform: translate3d(-5px, 0, 0);\n    transform: translate3d(-5px, 0, 0);\n  }\n  100% {\n    -webkit-transform: none;\n    transform: none;\n  }\n}\n@keyframes bounceInRight {\n  0%,\n  100%,\n  60%,\n  75%,\n  90% {\n    -webkit-transition-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1);\n    transition-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1);\n  }\n  0% {\n    opacity: 0;\n    -webkit-transform: translate3d(3000px, 0, 0);\n    transform: translate3d(3000px, 0, 0);\n  }\n  60% {\n    opacity: 1;\n    -webkit-transform: translate3d(-25px, 0, 0);\n    transform: translate3d(-25px, 0, 0);\n  }\n  75% {\n    -webkit-transform: translate3d(10px, 0, 0);\n    transform: translate3d(10px, 0, 0);\n  }\n  90% {\n    -webkit-transform: translate3d(-5px, 0, 0);\n    transform: translate3d(-5px, 0, 0);\n  }\n  100% {\n    -webkit-transform: none;\n    transform: none;\n  }\n}\n.bounceInRight {\n  -webkit-animation-name: bounceInRight;\n  animation-name: bounceInRight;\n}\n@-webkit-keyframes bounceInUp {\n  0%,\n  100%,\n  60%,\n  75%,\n  90% {\n    -webkit-transition-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1);\n    transition-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1);\n  }\n  0% {\n    opacity: 0;\n    -webkit-transform: translate3d(0, 3000px, 0);\n    transform: translate3d(0, 3000px, 0);\n  }\n  60% {\n    opacity: 1;\n    -webkit-transform: translate3d(0, -20px, 0);\n    transform: translate3d(0, -20px, 0);\n  }\n  75% {\n    -webkit-transform: translate3d(0, 10px, 0);\n    transform: translate3d(0, 10px, 0);\n  }\n  90% {\n    -webkit-transform: translate3d(0, -5px, 0);\n    transform: translate3d(0, -5px, 0);\n  }\n  100% {\n    -webkit-transform: translate3d(0, 0, 0);\n    transform: translate3d(0, 0, 0);\n  }\n}\n@keyframes bounceInUp {\n  0%,\n  100%,\n  60%,\n  75%,\n  90% {\n    -webkit-transition-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1);\n    transition-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1);\n  }\n  0% {\n    opacity: 0;\n    -webkit-transform: translate3d(0, 3000px, 0);\n    transform: translate3d(0, 3000px, 0);\n  }\n  60% {\n    opacity: 1;\n    -webkit-transform: translate3d(0, -20px, 0);\n    transform: translate3d(0, -20px, 0);\n  }\n  75% {\n    -webkit-transform: translate3d(0, 10px, 0);\n    transform: translate3d(0, 10px, 0);\n  }\n  90% {\n    -webkit-transform: translate3d(0, -5px, 0);\n    transform: translate3d(0, -5px, 0);\n  }\n  100% {\n    -webkit-transform: translate3d(0, 0, 0);\n    transform: translate3d(0, 0, 0);\n  }\n}\n.bounceInUp {\n  -webkit-animation-name: bounceInUp;\n  animation-name: bounceInUp;\n}\n@-webkit-keyframes bounceOut {\n  20% {\n    -webkit-transform: scale3d(0.9, 0.9, 0.9);\n    transform: scale3d(0.9, 0.9, 0.9);\n  }\n  50%,\n  55% {\n    opacity: 1;\n    -webkit-transform: scale3d(1.1, 1.1, 1.1);\n    transform: scale3d(1.1, 1.1, 1.1);\n  }\n  100% {\n    opacity: 0;\n    -webkit-transform: scale3d(0.3, 0.3, 0.3);\n    transform: scale3d(0.3, 0.3, 0.3);\n  }\n}\n@keyframes bounceOut {\n  20% {\n    -webkit-transform: scale3d(0.9, 0.9, 0.9);\n    transform: scale3d(0.9, 0.9, 0.9);\n  }\n  50%,\n  55% {\n    opacity: 1;\n    -webkit-transform: scale3d(1.1, 1.1, 1.1);\n    transform: scale3d(1.1, 1.1, 1.1);\n  }\n  100% {\n    opacity: 0;\n    -webkit-transform: scale3d(0.3, 0.3, 0.3);\n    transform: scale3d(0.3, 0.3, 0.3);\n  }\n}\n.bounceOut {\n  -webkit-animation-name: bounceOut;\n  animation-name: bounceOut;\n  -webkit-animation-duration: .75s;\n  animation-duration: 0.75s;\n}\n@-webkit-keyframes bounceOutDown {\n  20% {\n    -webkit-transform: translate3d(0, 10px, 0);\n    transform: translate3d(0, 10px, 0);\n  }\n  40%,\n  45% {\n    opacity: 1;\n    -webkit-transform: translate3d(0, -20px, 0);\n    transform: translate3d(0, -20px, 0);\n  }\n  100% {\n    opacity: 0;\n    -webkit-transform: translate3d(0, 2000px, 0);\n    transform: translate3d(0, 2000px, 0);\n  }\n}\n@keyframes bounceOutDown {\n  20% {\n    -webkit-transform: translate3d(0, 10px, 0);\n    transform: translate3d(0, 10px, 0);\n  }\n  40%,\n  45% {\n    opacity: 1;\n    -webkit-transform: translate3d(0, -20px, 0);\n    transform: translate3d(0, -20px, 0);\n  }\n  100% {\n    opacity: 0;\n    -webkit-transform: translate3d(0, 2000px, 0);\n    transform: translate3d(0, 2000px, 0);\n  }\n}\n.bounceOutDown {\n  -webkit-animation-name: bounceOutDown;\n  animation-name: bounceOutDown;\n}\n@-webkit-keyframes bounceOutLeft {\n  20% {\n    opacity: 1;\n    -webkit-transform: translate3d(20px, 0, 0);\n    transform: translate3d(20px, 0, 0);\n  }\n  100% {\n    opacity: 0;\n    -webkit-transform: translate3d(-2000px, 0, 0);\n    transform: translate3d(-2000px, 0, 0);\n  }\n}\n@keyframes bounceOutLeft {\n  20% {\n    opacity: 1;\n    -webkit-transform: translate3d(20px, 0, 0);\n    transform: translate3d(20px, 0, 0);\n  }\n  100% {\n    opacity: 0;\n    -webkit-transform: translate3d(-2000px, 0, 0);\n    transform: translate3d(-2000px, 0, 0);\n  }\n}\n.bounceOutLeft {\n  -webkit-animation-name: bounceOutLeft;\n  animation-name: bounceOutLeft;\n}\n@-webkit-keyframes bounceOutRight {\n  20% {\n    opacity: 1;\n    -webkit-transform: translate3d(-20px, 0, 0);\n    transform: translate3d(-20px, 0, 0);\n  }\n  100% {\n    opacity: 0;\n    -webkit-transform: translate3d(2000px, 0, 0);\n    transform: translate3d(2000px, 0, 0);\n  }\n}\n@keyframes bounceOutRight {\n  20% {\n    opacity: 1;\n    -webkit-transform: translate3d(-20px, 0, 0);\n    transform: translate3d(-20px, 0, 0);\n  }\n  100% {\n    opacity: 0;\n    -webkit-transform: translate3d(2000px, 0, 0);\n    transform: translate3d(2000px, 0, 0);\n  }\n}\n.bounceOutRight {\n  -webkit-animation-name: bounceOutRight;\n  animation-name: bounceOutRight;\n}\n@-webkit-keyframes bounceOutUp {\n  20% {\n    -webkit-transform: translate3d(0, -10px, 0);\n    transform: translate3d(0, -10px, 0);\n  }\n  40%,\n  45% {\n    opacity: 1;\n    -webkit-transform: translate3d(0, 20px, 0);\n    transform: translate3d(0, 20px, 0);\n  }\n  100% {\n    opacity: 0;\n    -webkit-transform: translate3d(0, -2000px, 0);\n    transform: translate3d(0, -2000px, 0);\n  }\n}\n@keyframes bounceOutUp {\n  20% {\n    -webkit-transform: translate3d(0, -10px, 0);\n    transform: translate3d(0, -10px, 0);\n  }\n  40%,\n  45% {\n    opacity: 1;\n    -webkit-transform: translate3d(0, 20px, 0);\n    transform: translate3d(0, 20px, 0);\n  }\n  100% {\n    opacity: 0;\n    -webkit-transform: translate3d(0, -2000px, 0);\n    transform: translate3d(0, -2000px, 0);\n  }\n}\n.bounceOutUp {\n  -webkit-animation-name: bounceOutUp;\n  animation-name: bounceOutUp;\n}\n@-webkit-keyframes fadeIn {\n  0% {\n    opacity: 0;\n  }\n  100% {\n    opacity: 1;\n  }\n}\n@keyframes fadeIn {\n  0% {\n    opacity: 0;\n  }\n  100% {\n    opacity: 1;\n  }\n}\n.fadeIn {\n  -webkit-animation-name: fadeIn;\n  animation-name: fadeIn;\n}\n@-webkit-keyframes fadeInDown {\n  0% {\n    opacity: 0;\n    -webkit-transform: translate3d(0, -100%, 0);\n    transform: translate3d(0, -100%, 0);\n  }\n  100% {\n    opacity: 1;\n    -webkit-transform: none;\n    transform: none;\n  }\n}\n@keyframes fadeInDown {\n  0% {\n    opacity: 0;\n    -webkit-transform: translate3d(0, -100%, 0);\n    transform: translate3d(0, -100%, 0);\n  }\n  100% {\n    opacity: 1;\n    -webkit-transform: none;\n    transform: none;\n  }\n}\n.fadeInDown {\n  -webkit-animation-name: fadeInDown;\n  animation-name: fadeInDown;\n}\n@-webkit-keyframes fadeInDownBig {\n  0% {\n    opacity: 0;\n    -webkit-transform: translate3d(0, -2000px, 0);\n    transform: translate3d(0, -2000px, 0);\n  }\n  100% {\n    opacity: 1;\n    -webkit-transform: none;\n    transform: none;\n  }\n}\n@keyframes fadeInDownBig {\n  0% {\n    opacity: 0;\n    -webkit-transform: translate3d(0, -2000px, 0);\n    transform: translate3d(0, -2000px, 0);\n  }\n  100% {\n    opacity: 1;\n    -webkit-transform: none;\n    transform: none;\n  }\n}\n.fadeInDownBig {\n  -webkit-animation-name: fadeInDownBig;\n  animation-name: fadeInDownBig;\n}\n@-webkit-keyframes fadeInLeft {\n  0% {\n    opacity: 0;\n    -webkit-transform: translate3d(-100%, 0, 0);\n    transform: translate3d(-100%, 0, 0);\n  }\n  100% {\n    opacity: 1;\n    -webkit-transform: none;\n    transform: none;\n  }\n}\n@keyframes fadeInLeft {\n  0% {\n    opacity: 0;\n    -webkit-transform: translate3d(-100%, 0, 0);\n    transform: translate3d(-100%, 0, 0);\n  }\n  100% {\n    opacity: 1;\n    -webkit-transform: none;\n    transform: none;\n  }\n}\n.fadeInLeft {\n  -webkit-animation-name: fadeInLeft;\n  animation-name: fadeInLeft;\n}\n@-webkit-keyframes fadeInLeftBig {\n  0% {\n    opacity: 0;\n    -webkit-transform: translate3d(-2000px, 0, 0);\n    transform: translate3d(-2000px, 0, 0);\n  }\n  100% {\n    opacity: 1;\n    -webkit-transform: none;\n    transform: none;\n  }\n}\n@keyframes fadeInLeftBig {\n  0% {\n    opacity: 0;\n    -webkit-transform: translate3d(-2000px, 0, 0);\n    transform: translate3d(-2000px, 0, 0);\n  }\n  100% {\n    opacity: 1;\n    -webkit-transform: none;\n    transform: none;\n  }\n}\n.fadeInLeftBig {\n  -webkit-animation-name: fadeInLeftBig;\n  animation-name: fadeInLeftBig;\n}\n@-webkit-keyframes fadeInRight {\n  0% {\n    opacity: 0;\n    -webkit-transform: translate3d(100%, 0, 0);\n    transform: translate3d(100%, 0, 0);\n  }\n  100% {\n    opacity: 1;\n    -webkit-transform: none;\n    transform: none;\n  }\n}\n@keyframes fadeInRight {\n  0% {\n    opacity: 0;\n    -webkit-transform: translate3d(100%, 0, 0);\n    transform: translate3d(100%, 0, 0);\n  }\n  100% {\n    opacity: 1;\n    -webkit-transform: none;\n    transform: none;\n  }\n}\n.fadeInRight {\n  -webkit-animation-name: fadeInRight;\n  animation-name: fadeInRight;\n}\n@-webkit-keyframes fadeInRightBig {\n  0% {\n    opacity: 0;\n    -webkit-transform: translate3d(2000px, 0, 0);\n    transform: translate3d(2000px, 0, 0);\n  }\n  100% {\n    opacity: 1;\n    -webkit-transform: none;\n    transform: none;\n  }\n}\n@keyframes fadeInRightBig {\n  0% {\n    opacity: 0;\n    -webkit-transform: translate3d(2000px, 0, 0);\n    transform: translate3d(2000px, 0, 0);\n  }\n  100% {\n    opacity: 1;\n    -webkit-transform: none;\n    transform: none;\n  }\n}\n.fadeInRightBig {\n  -webkit-animation-name: fadeInRightBig;\n  animation-name: fadeInRightBig;\n}\n@-webkit-keyframes fadeInUp {\n  0% {\n    opacity: 0;\n    -webkit-transform: translate3d(0, 100%, 0);\n    transform: translate3d(0, 100%, 0);\n  }\n  100% {\n    opacity: 1;\n    -webkit-transform: none;\n    transform: none;\n  }\n}\n@keyframes fadeInUp {\n  0% {\n    opacity: 0;\n    -webkit-transform: translate3d(0, 100%, 0);\n    transform: translate3d(0, 100%, 0);\n  }\n  100% {\n    opacity: 1;\n    -webkit-transform: none;\n    transform: none;\n  }\n}\n.fadeInUp {\n  -webkit-animation-name: fadeInUp;\n  animation-name: fadeInUp;\n}\n@-webkit-keyframes fadeInUpBig {\n  0% {\n    opacity: 0;\n    -webkit-transform: translate3d(0, 2000px, 0);\n    transform: translate3d(0, 2000px, 0);\n  }\n  100% {\n    opacity: 1;\n    -webkit-transform: none;\n    transform: none;\n  }\n}\n@keyframes fadeInUpBig {\n  0% {\n    opacity: 0;\n    -webkit-transform: translate3d(0, 2000px, 0);\n    transform: translate3d(0, 2000px, 0);\n  }\n  100% {\n    opacity: 1;\n    -webkit-transform: none;\n    transform: none;\n  }\n}\n.fadeInUpBig {\n  -webkit-animation-name: fadeInUpBig;\n  animation-name: fadeInUpBig;\n}\n@-webkit-keyframes fadeOut {\n  0% {\n    opacity: 1;\n  }\n  100% {\n    opacity: 0;\n  }\n}\n@keyframes fadeOut {\n  0% {\n    opacity: 1;\n  }\n  100% {\n    opacity: 0;\n  }\n}\n.fadeOut {\n  -webkit-animation-name: fadeOut;\n  animation-name: fadeOut;\n}\n@-webkit-keyframes fadeOutDown {\n  0% {\n    opacity: 1;\n  }\n  100% {\n    opacity: 0;\n    -webkit-transform: translate3d(0, 100%, 0);\n    transform: translate3d(0, 100%, 0);\n  }\n}\n@keyframes fadeOutDown {\n  0% {\n    opacity: 1;\n  }\n  100% {\n    opacity: 0;\n    -webkit-transform: translate3d(0, 100%, 0);\n    transform: translate3d(0, 100%, 0);\n  }\n}\n.fadeOutDown {\n  -webkit-animation-name: fadeOutDown;\n  animation-name: fadeOutDown;\n}\n@-webkit-keyframes fadeOutDownBig {\n  0% {\n    opacity: 1;\n  }\n  100% {\n    opacity: 0;\n    -webkit-transform: translate3d(0, 2000px, 0);\n    transform: translate3d(0, 2000px, 0);\n  }\n}\n@keyframes fadeOutDownBig {\n  0% {\n    opacity: 1;\n  }\n  100% {\n    opacity: 0;\n    -webkit-transform: translate3d(0, 2000px, 0);\n    transform: translate3d(0, 2000px, 0);\n  }\n}\n.fadeOutDownBig {\n  -webkit-animation-name: fadeOutDownBig;\n  animation-name: fadeOutDownBig;\n}\n@-webkit-keyframes fadeOutLeft {\n  0% {\n    opacity: 1;\n  }\n  100% {\n    opacity: 0;\n    -webkit-transform: translate3d(-100%, 0, 0);\n    transform: translate3d(-100%, 0, 0);\n  }\n}\n@keyframes fadeOutLeft {\n  0% {\n    opacity: 1;\n  }\n  100% {\n    opacity: 0;\n    -webkit-transform: translate3d(-100%, 0, 0);\n    transform: translate3d(-100%, 0, 0);\n  }\n}\n.fadeOutLeft {\n  -webkit-animation-name: fadeOutLeft;\n  animation-name: fadeOutLeft;\n}\n@-webkit-keyframes fadeOutLeftBig {\n  0% {\n    opacity: 1;\n  }\n  100% {\n    opacity: 0;\n    -webkit-transform: translate3d(-2000px, 0, 0);\n    transform: translate3d(-2000px, 0, 0);\n  }\n}\n@keyframes fadeOutLeftBig {\n  0% {\n    opacity: 1;\n  }\n  100% {\n    opacity: 0;\n    -webkit-transform: translate3d(-2000px, 0, 0);\n    transform: translate3d(-2000px, 0, 0);\n  }\n}\n.fadeOutLeftBig {\n  -webkit-animation-name: fadeOutLeftBig;\n  animation-name: fadeOutLeftBig;\n}\n@-webkit-keyframes fadeOutRight {\n  0% {\n    opacity: 1;\n  }\n  100% {\n    opacity: 0;\n    -webkit-transform: translate3d(100%, 0, 0);\n    transform: translate3d(100%, 0, 0);\n  }\n}\n@keyframes fadeOutRight {\n  0% {\n    opacity: 1;\n  }\n  100% {\n    opacity: 0;\n    -webkit-transform: translate3d(100%, 0, 0);\n    transform: translate3d(100%, 0, 0);\n  }\n}\n.fadeOutRight {\n  -webkit-animation-name: fadeOutRight;\n  animation-name: fadeOutRight;\n}\n@-webkit-keyframes fadeOutRightBig {\n  0% {\n    opacity: 1;\n  }\n  100% {\n    opacity: 0;\n    -webkit-transform: translate3d(2000px, 0, 0);\n    transform: translate3d(2000px, 0, 0);\n  }\n}\n@keyframes fadeOutRightBig {\n  0% {\n    opacity: 1;\n  }\n  100% {\n    opacity: 0;\n    -webkit-transform: translate3d(2000px, 0, 0);\n    transform: translate3d(2000px, 0, 0);\n  }\n}\n.fadeOutRightBig {\n  -webkit-animation-name: fadeOutRightBig;\n  animation-name: fadeOutRightBig;\n}\n@-webkit-keyframes fadeOutUp {\n  0% {\n    opacity: 1;\n  }\n  100% {\n    opacity: 0;\n    -webkit-transform: translate3d(0, -100%, 0);\n    transform: translate3d(0, -100%, 0);\n  }\n}\n@keyframes fadeOutUp {\n  0% {\n    opacity: 1;\n  }\n  100% {\n    opacity: 0;\n    -webkit-transform: translate3d(0, -100%, 0);\n    transform: translate3d(0, -100%, 0);\n  }\n}\n.fadeOutUp {\n  -webkit-animation-name: fadeOutUp;\n  animation-name: fadeOutUp;\n}\n@-webkit-keyframes fadeOutUpBig {\n  0% {\n    opacity: 1;\n  }\n  100% {\n    opacity: 0;\n    -webkit-transform: translate3d(0, -2000px, 0);\n    transform: translate3d(0, -2000px, 0);\n  }\n}\n@keyframes fadeOutUpBig {\n  0% {\n    opacity: 1;\n  }\n  100% {\n    opacity: 0;\n    -webkit-transform: translate3d(0, -2000px, 0);\n    transform: translate3d(0, -2000px, 0);\n  }\n}\n.fadeOutUpBig {\n  -webkit-animation-name: fadeOutUpBig;\n  animation-name: fadeOutUpBig;\n}\n@-webkit-keyframes flip {\n  0% {\n    -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -360deg);\n    transform: perspective(400px) rotate3d(0, 1, 0, -360deg);\n    -webkit-animation-timing-function: ease-out;\n    animation-timing-function: ease-out;\n  }\n  40% {\n    -webkit-transform: perspective(400px) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -190deg);\n    transform: perspective(400px) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -190deg);\n    -webkit-animation-timing-function: ease-out;\n    animation-timing-function: ease-out;\n  }\n  50% {\n    -webkit-transform: perspective(400px) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -170deg);\n    transform: perspective(400px) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -170deg);\n    -webkit-animation-timing-function: ease-in;\n    animation-timing-function: ease-in;\n  }\n  80% {\n    -webkit-transform: perspective(400px) scale3d(0.95, 0.95, 0.95);\n    transform: perspective(400px) scale3d(0.95, 0.95, 0.95);\n    -webkit-animation-timing-function: ease-in;\n    animation-timing-function: ease-in;\n  }\n  100% {\n    -webkit-transform: perspective(400px);\n    transform: perspective(400px);\n    -webkit-animation-timing-function: ease-in;\n    animation-timing-function: ease-in;\n  }\n}\n@keyframes flip {\n  0% {\n    -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -360deg);\n    transform: perspective(400px) rotate3d(0, 1, 0, -360deg);\n    -webkit-animation-timing-function: ease-out;\n    animation-timing-function: ease-out;\n  }\n  40% {\n    -webkit-transform: perspective(400px) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -190deg);\n    transform: perspective(400px) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -190deg);\n    -webkit-animation-timing-function: ease-out;\n    animation-timing-function: ease-out;\n  }\n  50% {\n    -webkit-transform: perspective(400px) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -170deg);\n    transform: perspective(400px) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -170deg);\n    -webkit-animation-timing-function: ease-in;\n    animation-timing-function: ease-in;\n  }\n  80% {\n    -webkit-transform: perspective(400px) scale3d(0.95, 0.95, 0.95);\n    transform: perspective(400px) scale3d(0.95, 0.95, 0.95);\n    -webkit-animation-timing-function: ease-in;\n    animation-timing-function: ease-in;\n  }\n  100% {\n    -webkit-transform: perspective(400px);\n    transform: perspective(400px);\n    -webkit-animation-timing-function: ease-in;\n    animation-timing-function: ease-in;\n  }\n}\n.animated.flip {\n  -webkit-backface-visibility: visible;\n  backface-visibility: visible;\n  -webkit-animation-name: flip;\n  animation-name: flip;\n}\n@-webkit-keyframes flipInX {\n  0% {\n    -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 90deg);\n    transform: perspective(400px) rotate3d(1, 0, 0, 90deg);\n    -webkit-transition-timing-function: ease-in;\n    transition-timing-function: ease-in;\n    opacity: 0;\n  }\n  40% {\n    -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -20deg);\n    transform: perspective(400px) rotate3d(1, 0, 0, -20deg);\n    -webkit-transition-timing-function: ease-in;\n    transition-timing-function: ease-in;\n  }\n  60% {\n    -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 10deg);\n    transform: perspective(400px) rotate3d(1, 0, 0, 10deg);\n    opacity: 1;\n  }\n  80% {\n    -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -5deg);\n    transform: perspective(400px) rotate3d(1, 0, 0, -5deg);\n  }\n  100% {\n    -webkit-transform: perspective(400px);\n    transform: perspective(400px);\n  }\n}\n@keyframes flipInX {\n  0% {\n    -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 90deg);\n    transform: perspective(400px) rotate3d(1, 0, 0, 90deg);\n    -webkit-transition-timing-function: ease-in;\n    transition-timing-function: ease-in;\n    opacity: 0;\n  }\n  40% {\n    -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -20deg);\n    transform: perspective(400px) rotate3d(1, 0, 0, -20deg);\n    -webkit-transition-timing-function: ease-in;\n    transition-timing-function: ease-in;\n  }\n  60% {\n    -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 10deg);\n    transform: perspective(400px) rotate3d(1, 0, 0, 10deg);\n    opacity: 1;\n  }\n  80% {\n    -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -5deg);\n    transform: perspective(400px) rotate3d(1, 0, 0, -5deg);\n  }\n  100% {\n    -webkit-transform: perspective(400px);\n    transform: perspective(400px);\n  }\n}\n.flipInX {\n  -webkit-backface-visibility: visible!important;\n  backface-visibility: visible!important;\n  -webkit-animation-name: flipInX;\n  animation-name: flipInX;\n}\n@-webkit-keyframes flipInY {\n  0% {\n    -webkit-transform: perspective(400px) rotate3d(0, 1, 0, 90deg);\n    transform: perspective(400px) rotate3d(0, 1, 0, 90deg);\n    -webkit-transition-timing-function: ease-in;\n    transition-timing-function: ease-in;\n    opacity: 0;\n  }\n  40% {\n    -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -20deg);\n    transform: perspective(400px) rotate3d(0, 1, 0, -20deg);\n    -webkit-transition-timing-function: ease-in;\n    transition-timing-function: ease-in;\n  }\n  60% {\n    -webkit-transform: perspective(400px) rotate3d(0, 1, 0, 10deg);\n    transform: perspective(400px) rotate3d(0, 1, 0, 10deg);\n    opacity: 1;\n  }\n  80% {\n    -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -5deg);\n    transform: perspective(400px) rotate3d(0, 1, 0, -5deg);\n  }\n  100% {\n    -webkit-transform: perspective(400px);\n    transform: perspective(400px);\n  }\n}\n@keyframes flipInY {\n  0% {\n    -webkit-transform: perspective(400px) rotate3d(0, 1, 0, 90deg);\n    transform: perspective(400px) rotate3d(0, 1, 0, 90deg);\n    -webkit-transition-timing-function: ease-in;\n    transition-timing-function: ease-in;\n    opacity: 0;\n  }\n  40% {\n    -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -20deg);\n    transform: perspective(400px) rotate3d(0, 1, 0, -20deg);\n    -webkit-transition-timing-function: ease-in;\n    transition-timing-function: ease-in;\n  }\n  60% {\n    -webkit-transform: perspective(400px) rotate3d(0, 1, 0, 10deg);\n    transform: perspective(400px) rotate3d(0, 1, 0, 10deg);\n    opacity: 1;\n  }\n  80% {\n    -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -5deg);\n    transform: perspective(400px) rotate3d(0, 1, 0, -5deg);\n  }\n  100% {\n    -webkit-transform: perspective(400px);\n    transform: perspective(400px);\n  }\n}\n.flipInY {\n  -webkit-backface-visibility: visible!important;\n  backface-visibility: visible!important;\n  -webkit-animation-name: flipInY;\n  animation-name: flipInY;\n}\n@-webkit-keyframes flipOutX {\n  0% {\n    -webkit-transform: perspective(400px);\n    transform: perspective(400px);\n  }\n  30% {\n    -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -20deg);\n    transform: perspective(400px) rotate3d(1, 0, 0, -20deg);\n    opacity: 1;\n  }\n  100% {\n    -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 90deg);\n    transform: perspective(400px) rotate3d(1, 0, 0, 90deg);\n    opacity: 0;\n  }\n}\n@keyframes flipOutX {\n  0% {\n    -webkit-transform: perspective(400px);\n    transform: perspective(400px);\n  }\n  30% {\n    -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -20deg);\n    transform: perspective(400px) rotate3d(1, 0, 0, -20deg);\n    opacity: 1;\n  }\n  100% {\n    -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 90deg);\n    transform: perspective(400px) rotate3d(1, 0, 0, 90deg);\n    opacity: 0;\n  }\n}\n.flipOutX {\n  -webkit-animation-name: flipOutX;\n  animation-name: flipOutX;\n  -webkit-animation-duration: .75s;\n  animation-duration: .75s;\n  -webkit-backface-visibility: visible!important;\n  backface-visibility: visible !important;\n}\n@-webkit-keyframes flipOutY {\n  0% {\n    -webkit-transform: perspective(400px);\n    transform: perspective(400px);\n  }\n  30% {\n    -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -15deg);\n    transform: perspective(400px) rotate3d(0, 1, 0, -15deg);\n    opacity: 1;\n  }\n  100% {\n    -webkit-transform: perspective(400px) rotate3d(0, 1, 0, 90deg);\n    transform: perspective(400px) rotate3d(0, 1, 0, 90deg);\n    opacity: 0;\n  }\n}\n@keyframes flipOutY {\n  0% {\n    -webkit-transform: perspective(400px);\n    transform: perspective(400px);\n  }\n  30% {\n    -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -15deg);\n    transform: perspective(400px) rotate3d(0, 1, 0, -15deg);\n    opacity: 1;\n  }\n  100% {\n    -webkit-transform: perspective(400px) rotate3d(0, 1, 0, 90deg);\n    transform: perspective(400px) rotate3d(0, 1, 0, 90deg);\n    opacity: 0;\n  }\n}\n.flipOutY {\n  -webkit-backface-visibility: visible!important;\n  backface-visibility: visible!important;\n  -webkit-animation-name: flipOutY;\n  animation-name: flipOutY;\n  -webkit-animation-duration: .75s;\n  animation-duration: 0.75s;\n}\n@-webkit-keyframes lightSpeedIn {\n  0% {\n    -webkit-transform: translate3d(100%, 0, 0) skewX(-30deg);\n    transform: translate3d(100%, 0, 0) skewX(-30deg);\n    opacity: 0;\n  }\n  60% {\n    -webkit-transform: skewX(20deg);\n    transform: skewX(20deg);\n    opacity: 1;\n  }\n  80% {\n    -webkit-transform: skewX(-5deg);\n    transform: skewX(-5deg);\n    opacity: 1;\n  }\n  100% {\n    -webkit-transform: none;\n    transform: none;\n    opacity: 1;\n  }\n}\n@keyframes lightSpeedIn {\n  0% {\n    -webkit-transform: translate3d(100%, 0, 0) skewX(-30deg);\n    transform: translate3d(100%, 0, 0) skewX(-30deg);\n    opacity: 0;\n  }\n  60% {\n    -webkit-transform: skewX(20deg);\n    transform: skewX(20deg);\n    opacity: 1;\n  }\n  80% {\n    -webkit-transform: skewX(-5deg);\n    transform: skewX(-5deg);\n    opacity: 1;\n  }\n  100% {\n    -webkit-transform: none;\n    transform: none;\n    opacity: 1;\n  }\n}\n.lightSpeedIn {\n  -webkit-animation-name: lightSpeedIn;\n  animation-name: lightSpeedIn;\n  -webkit-animation-timing-function: ease-out;\n  animation-timing-function: ease-out;\n}\n@-webkit-keyframes lightSpeedOut {\n  0% {\n    opacity: 1;\n  }\n  100% {\n    -webkit-transform: translate3d(100%, 0, 0) skewX(30deg);\n    transform: translate3d(100%, 0, 0) skewX(30deg);\n    opacity: 0;\n  }\n}\n@keyframes lightSpeedOut {\n  0% {\n    opacity: 1;\n  }\n  100% {\n    -webkit-transform: translate3d(100%, 0, 0) skewX(30deg);\n    transform: translate3d(100%, 0, 0) skewX(30deg);\n    opacity: 0;\n  }\n}\n.lightSpeedOut {\n  -webkit-animation-name: lightSpeedOut;\n  animation-name: lightSpeedOut;\n  -webkit-animation-timing-function: ease-in;\n  animation-timing-function: ease-in;\n}\n@-webkit-keyframes rotateIn {\n  0% {\n    -webkit-transform-origin: center;\n    transform-origin: center;\n    -webkit-transform: rotate3d(0, 0, 1, -200deg);\n    transform: rotate3d(0, 0, 1, -200deg);\n    opacity: 0;\n  }\n  100% {\n    -webkit-transform-origin: center;\n    transform-origin: center;\n    -webkit-transform: none;\n    transform: none;\n    opacity: 1;\n  }\n}\n@keyframes rotateIn {\n  0% {\n    -webkit-transform-origin: center;\n    transform-origin: center;\n    -webkit-transform: rotate3d(0, 0, 1, -200deg);\n    transform: rotate3d(0, 0, 1, -200deg);\n    opacity: 0;\n  }\n  100% {\n    -webkit-transform-origin: center;\n    transform-origin: center;\n    -webkit-transform: none;\n    transform: none;\n    opacity: 1;\n  }\n}\n.rotateIn {\n  -webkit-animation-name: rotateIn;\n  animation-name: rotateIn;\n}\n@-webkit-keyframes rotateInDownLeft {\n  0% {\n    -webkit-transform-origin: left bottom;\n    transform-origin: left bottom;\n    -webkit-transform: rotate3d(0, 0, 1, -45deg);\n    transform: rotate3d(0, 0, 1, -45deg);\n    opacity: 0;\n  }\n  100% {\n    -webkit-transform-origin: left bottom;\n    transform-origin: left bottom;\n    -webkit-transform: none;\n    transform: none;\n    opacity: 1;\n  }\n}\n@keyframes rotateInDownLeft {\n  0% {\n    -webkit-transform-origin: left bottom;\n    transform-origin: left bottom;\n    -webkit-transform: rotate3d(0, 0, 1, -45deg);\n    transform: rotate3d(0, 0, 1, -45deg);\n    opacity: 0;\n  }\n  100% {\n    -webkit-transform-origin: left bottom;\n    transform-origin: left bottom;\n    -webkit-transform: none;\n    transform: none;\n    opacity: 1;\n  }\n}\n.rotateInDownLeft {\n  -webkit-animation-name: rotateInDownLeft;\n  animation-name: rotateInDownLeft;\n}\n@-webkit-keyframes rotateInDownRight {\n  0% {\n    -webkit-transform-origin: right bottom;\n    transform-origin: right bottom;\n    -webkit-transform: rotate3d(0, 0, 1, 45deg);\n    transform: rotate3d(0, 0, 1, 45deg);\n    opacity: 0;\n  }\n  100% {\n    -webkit-transform-origin: right bottom;\n    transform-origin: right bottom;\n    -webkit-transform: none;\n    transform: none;\n    opacity: 1;\n  }\n}\n@keyframes rotateInDownRight {\n  0% {\n    -webkit-transform-origin: right bottom;\n    transform-origin: right bottom;\n    -webkit-transform: rotate3d(0, 0, 1, 45deg);\n    transform: rotate3d(0, 0, 1, 45deg);\n    opacity: 0;\n  }\n  100% {\n    -webkit-transform-origin: right bottom;\n    transform-origin: right bottom;\n    -webkit-transform: none;\n    transform: none;\n    opacity: 1;\n  }\n}\n.rotateInDownRight {\n  -webkit-animation-name: rotateInDownRight;\n  animation-name: rotateInDownRight;\n}\n@-webkit-keyframes rotateInUpLeft {\n  0% {\n    -webkit-transform-origin: left bottom;\n    transform-origin: left bottom;\n    -webkit-transform: rotate3d(0, 0, 1, 45deg);\n    transform: rotate3d(0, 0, 1, 45deg);\n    opacity: 0;\n  }\n  100% {\n    -webkit-transform-origin: left bottom;\n    transform-origin: left bottom;\n    -webkit-transform: none;\n    transform: none;\n    opacity: 1;\n  }\n}\n@keyframes rotateInUpLeft {\n  0% {\n    -webkit-transform-origin: left bottom;\n    transform-origin: left bottom;\n    -webkit-transform: rotate3d(0, 0, 1, 45deg);\n    transform: rotate3d(0, 0, 1, 45deg);\n    opacity: 0;\n  }\n  100% {\n    -webkit-transform-origin: left bottom;\n    transform-origin: left bottom;\n    -webkit-transform: none;\n    transform: none;\n    opacity: 1;\n  }\n}\n.rotateInUpLeft {\n  -webkit-animation-name: rotateInUpLeft;\n  animation-name: rotateInUpLeft;\n}\n@-webkit-keyframes rotateInUpRight {\n  0% {\n    -webkit-transform-origin: right bottom;\n    transform-origin: right bottom;\n    -webkit-transform: rotate3d(0, 0, 1, -90deg);\n    transform: rotate3d(0, 0, 1, -90deg);\n    opacity: 0;\n  }\n  100% {\n    -webkit-transform-origin: right bottom;\n    transform-origin: right bottom;\n    -webkit-transform: none;\n    transform: none;\n    opacity: 1;\n  }\n}\n@keyframes rotateInUpRight {\n  0% {\n    -webkit-transform-origin: right bottom;\n    transform-origin: right bottom;\n    -webkit-transform: rotate3d(0, 0, 1, -90deg);\n    transform: rotate3d(0, 0, 1, -90deg);\n    opacity: 0;\n  }\n  100% {\n    -webkit-transform-origin: right bottom;\n    transform-origin: right bottom;\n    -webkit-transform: none;\n    transform: none;\n    opacity: 1;\n  }\n}\n.rotateInUpRight {\n  -webkit-animation-name: rotateInUpRight;\n  animation-name: rotateInUpRight;\n}\n@-webkit-keyframes rotateOut {\n  0% {\n    -webkit-transform-origin: center;\n    transform-origin: center;\n    opacity: 1;\n  }\n  100% {\n    -webkit-transform-origin: center;\n    transform-origin: center;\n    -webkit-transform: rotate3d(0, 0, 1, 200deg);\n    transform: rotate3d(0, 0, 1, 200deg);\n    opacity: 0;\n  }\n}\n@keyframes rotateOut {\n  0% {\n    -webkit-transform-origin: center;\n    transform-origin: center;\n    opacity: 1;\n  }\n  100% {\n    -webkit-transform-origin: center;\n    transform-origin: center;\n    -webkit-transform: rotate3d(0, 0, 1, 200deg);\n    transform: rotate3d(0, 0, 1, 200deg);\n    opacity: 0;\n  }\n}\n.rotateOut {\n  -webkit-animation-name: rotateOut;\n  animation-name: rotateOut;\n}\n@-webkit-keyframes rotateOutDownLeft {\n  0% {\n    -webkit-transform-origin: left bottom;\n    transform-origin: left bottom;\n    opacity: 1;\n  }\n  100% {\n    -webkit-transform-origin: left bottom;\n    transform-origin: left bottom;\n    -webkit-transform: rotate3d(0, 0, 1, 45deg);\n    transform: rotate3d(0, 0, 1, 45deg);\n    opacity: 0;\n  }\n}\n@keyframes rotateOutDownLeft {\n  0% {\n    -webkit-transform-origin: left bottom;\n    transform-origin: left bottom;\n    opacity: 1;\n  }\n  100% {\n    -webkit-transform-origin: left bottom;\n    transform-origin: left bottom;\n    -webkit-transform: rotate3d(0, 0, 1, 45deg);\n    transform: rotate3d(0, 0, 1, 45deg);\n    opacity: 0;\n  }\n}\n.rotateOutDownLeft {\n  -webkit-animation-name: rotateOutDownLeft;\n  animation-name: rotateOutDownLeft;\n}\n@-webkit-keyframes rotateOutDownRight {\n  0% {\n    -webkit-transform-origin: right bottom;\n    transform-origin: right bottom;\n    opacity: 1;\n  }\n  100% {\n    -webkit-transform-origin: right bottom;\n    transform-origin: right bottom;\n    -webkit-transform: rotate3d(0, 0, 1, -45deg);\n    transform: rotate3d(0, 0, 1, -45deg);\n    opacity: 0;\n  }\n}\n@keyframes rotateOutDownRight {\n  0% {\n    -webkit-transform-origin: right bottom;\n    transform-origin: right bottom;\n    opacity: 1;\n  }\n  100% {\n    -webkit-transform-origin: right bottom;\n    transform-origin: right bottom;\n    -webkit-transform: rotate3d(0, 0, 1, -45deg);\n    transform: rotate3d(0, 0, 1, -45deg);\n    opacity: 0;\n  }\n}\n.rotateOutDownRight {\n  -webkit-animation-name: rotateOutDownRight;\n  animation-name: rotateOutDownRight;\n}\n@-webkit-keyframes rotateOutUpLeft {\n  0% {\n    -webkit-transform-origin: left bottom;\n    transform-origin: left bottom;\n    opacity: 1;\n  }\n  100% {\n    -webkit-transform-origin: left bottom;\n    transform-origin: left bottom;\n    -webkit-transform: rotate3d(0, 0, 1, -45deg);\n    transform: rotate3d(0, 0, 1, -45deg);\n    opacity: 0;\n  }\n}\n@keyframes rotateOutUpLeft {\n  0% {\n    -webkit-transform-origin: left bottom;\n    transform-origin: left bottom;\n    opacity: 1;\n  }\n  100% {\n    -webkit-transform-origin: left bottom;\n    transform-origin: left bottom;\n    -webkit-transform: rotate3d(0, 0, 1, -45deg);\n    transform: rotate3d(0, 0, 1, -45deg);\n    opacity: 0;\n  }\n}\n.rotateOutUpLeft {\n  -webkit-animation-name: rotateOutUpLeft;\n  animation-name: rotateOutUpLeft;\n}\n@-webkit-keyframes rotateOutUpRight {\n  0% {\n    -webkit-transform-origin: right bottom;\n    transform-origin: right bottom;\n    opacity: 1;\n  }\n  100% {\n    -webkit-transform-origin: right bottom;\n    transform-origin: right bottom;\n    -webkit-transform: rotate3d(0, 0, 1, 90deg);\n    transform: rotate3d(0, 0, 1, 90deg);\n    opacity: 0;\n  }\n}\n@keyframes rotateOutUpRight {\n  0% {\n    -webkit-transform-origin: right bottom;\n    transform-origin: right bottom;\n    opacity: 1;\n  }\n  100% {\n    -webkit-transform-origin: right bottom;\n    transform-origin: right bottom;\n    -webkit-transform: rotate3d(0, 0, 1, 90deg);\n    transform: rotate3d(0, 0, 1, 90deg);\n    opacity: 0;\n  }\n}\n.rotateOutUpRight {\n  -webkit-animation-name: rotateOutUpRight;\n  animation-name: rotateOutUpRight;\n}\n@-webkit-keyframes hinge {\n  0% {\n    -webkit-transform-origin: top left;\n    transform-origin: top left;\n    -webkit-animation-timing-function: ease-in-out;\n    animation-timing-function: ease-in-out;\n  }\n  20%,\n  60% {\n    -webkit-transform: rotate3d(0, 0, 1, 80deg);\n    transform: rotate3d(0, 0, 1, 80deg);\n    -webkit-transform-origin: top left;\n    transform-origin: top left;\n    -webkit-animation-timing-function: ease-in-out;\n    animation-timing-function: ease-in-out;\n  }\n  40%,\n  80% {\n    -webkit-transform: rotate3d(0, 0, 1, 60deg);\n    transform: rotate3d(0, 0, 1, 60deg);\n    -webkit-transform-origin: top left;\n    transform-origin: top left;\n    -webkit-animation-timing-function: ease-in-out;\n    animation-timing-function: ease-in-out;\n    opacity: 1;\n  }\n  100% {\n    -webkit-transform: translate3d(0, 700px, 0);\n    transform: translate3d(0, 700px, 0);\n    opacity: 0;\n  }\n}\n@keyframes hinge {\n  0% {\n    -webkit-transform-origin: top left;\n    transform-origin: top left;\n    -webkit-animation-timing-function: ease-in-out;\n    animation-timing-function: ease-in-out;\n  }\n  20%,\n  60% {\n    -webkit-transform: rotate3d(0, 0, 1, 80deg);\n    transform: rotate3d(0, 0, 1, 80deg);\n    -webkit-transform-origin: top left;\n    transform-origin: top left;\n    -webkit-animation-timing-function: ease-in-out;\n    animation-timing-function: ease-in-out;\n  }\n  40%,\n  80% {\n    -webkit-transform: rotate3d(0, 0, 1, 60deg);\n    transform: rotate3d(0, 0, 1, 60deg);\n    -webkit-transform-origin: top left;\n    transform-origin: top left;\n    -webkit-animation-timing-function: ease-in-out;\n    animation-timing-function: ease-in-out;\n    opacity: 1;\n  }\n  100% {\n    -webkit-transform: translate3d(0, 700px, 0);\n    transform: translate3d(0, 700px, 0);\n    opacity: 0;\n  }\n}\n.hinge {\n  -webkit-animation-name: hinge;\n  animation-name: hinge;\n}\n@-webkit-keyframes rollIn {\n  0% {\n    opacity: 0;\n    -webkit-transform: translate3d(-100%, 0, 0) rotate3d(0, 0, 1, -120deg);\n    transform: translate3d(-100%, 0, 0) rotate3d(0, 0, 1, -120deg);\n  }\n  100% {\n    opacity: 1;\n    -webkit-transform: none;\n    transform: none;\n  }\n}\n@keyframes rollIn {\n  0% {\n    opacity: 0;\n    -webkit-transform: translate3d(-100%, 0, 0) rotate3d(0, 0, 1, -120deg);\n    transform: translate3d(-100%, 0, 0) rotate3d(0, 0, 1, -120deg);\n  }\n  100% {\n    opacity: 1;\n    -webkit-transform: none;\n    transform: none;\n  }\n}\n.rollIn {\n  -webkit-animation-name: rollIn;\n  animation-name: rollIn;\n}\n@-webkit-keyframes rollOut {\n  0% {\n    opacity: 1;\n  }\n  100% {\n    opacity: 0;\n    -webkit-transform: translate3d(100%, 0, 0) rotate3d(0, 0, 1, 120deg);\n    transform: translate3d(100%, 0, 0) rotate3d(0, 0, 1, 120deg);\n  }\n}\n@keyframes rollOut {\n  0% {\n    opacity: 1;\n  }\n  100% {\n    opacity: 0;\n    -webkit-transform: translate3d(100%, 0, 0) rotate3d(0, 0, 1, 120deg);\n    transform: translate3d(100%, 0, 0) rotate3d(0, 0, 1, 120deg);\n  }\n}\n.rollOut {\n  -webkit-animation-name: rollOut;\n  animation-name: rollOut;\n}\n@-webkit-keyframes zoomIn {\n  0% {\n    opacity: 0;\n    -webkit-transform: scale3d(0.3, 0.3, 0.3);\n    transform: scale3d(0.3, 0.3, 0.3);\n  }\n  50% {\n    opacity: 1;\n  }\n}\n@keyframes zoomIn {\n  0% {\n    opacity: 0;\n    -webkit-transform: scale3d(0.3, 0.3, 0.3);\n    transform: scale3d(0.3, 0.3, 0.3);\n  }\n  50% {\n    opacity: 1;\n  }\n}\n.zoomIn {\n  -webkit-animation-name: zoomIn;\n  animation-name: zoomIn;\n}\n@-webkit-keyframes zoomInDown {\n  0% {\n    opacity: 0;\n    -webkit-transform: scale3d(0.1, 0.1, 0.1) translate3d(0, -1000px, 0);\n    transform: scale3d(0.1, 0.1, 0.1) translate3d(0, -1000px, 0);\n    -webkit-animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19);\n    animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19);\n  }\n  60% {\n    opacity: 1;\n    -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(0, 60px, 0);\n    transform: scale3d(0.475, 0.475, 0.475) translate3d(0, 60px, 0);\n    -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1);\n    animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1);\n  }\n}\n@keyframes zoomInDown {\n  0% {\n    opacity: 0;\n    -webkit-transform: scale3d(0.1, 0.1, 0.1) translate3d(0, -1000px, 0);\n    transform: scale3d(0.1, 0.1, 0.1) translate3d(0, -1000px, 0);\n    -webkit-animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19);\n    animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19);\n  }\n  60% {\n    opacity: 1;\n    -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(0, 60px, 0);\n    transform: scale3d(0.475, 0.475, 0.475) translate3d(0, 60px, 0);\n    -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1);\n    animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1);\n  }\n}\n.zoomInDown {\n  -webkit-animation-name: zoomInDown;\n  animation-name: zoomInDown;\n}\n@-webkit-keyframes zoomInLeft {\n  0% {\n    opacity: 0;\n    -webkit-transform: scale3d(0.1, 0.1, 0.1) translate3d(-1000px, 0, 0);\n    transform: scale3d(0.1, 0.1, 0.1) translate3d(-1000px, 0, 0);\n    -webkit-animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19);\n    animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19);\n  }\n  60% {\n    opacity: 1;\n    -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(10px, 0, 0);\n    transform: scale3d(0.475, 0.475, 0.475) translate3d(10px, 0, 0);\n    -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1);\n    animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1);\n  }\n}\n@keyframes zoomInLeft {\n  0% {\n    opacity: 0;\n    -webkit-transform: scale3d(0.1, 0.1, 0.1) translate3d(-1000px, 0, 0);\n    transform: scale3d(0.1, 0.1, 0.1) translate3d(-1000px, 0, 0);\n    -webkit-animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19);\n    animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19);\n  }\n  60% {\n    opacity: 1;\n    -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(10px, 0, 0);\n    transform: scale3d(0.475, 0.475, 0.475) translate3d(10px, 0, 0);\n    -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1);\n    animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1);\n  }\n}\n.zoomInLeft {\n  -webkit-animation-name: zoomInLeft;\n  animation-name: zoomInLeft;\n}\n@-webkit-keyframes zoomInRight {\n  0% {\n    opacity: 0;\n    -webkit-transform: scale3d(0.1, 0.1, 0.1) translate3d(1000px, 0, 0);\n    transform: scale3d(0.1, 0.1, 0.1) translate3d(1000px, 0, 0);\n    -webkit-animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19);\n    animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19);\n  }\n  60% {\n    opacity: 1;\n    -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(-10px, 0, 0);\n    transform: scale3d(0.475, 0.475, 0.475) translate3d(-10px, 0, 0);\n    -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1);\n    animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1);\n  }\n}\n@keyframes zoomInRight {\n  0% {\n    opacity: 0;\n    -webkit-transform: scale3d(0.1, 0.1, 0.1) translate3d(1000px, 0, 0);\n    transform: scale3d(0.1, 0.1, 0.1) translate3d(1000px, 0, 0);\n    -webkit-animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19);\n    animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19);\n  }\n  60% {\n    opacity: 1;\n    -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(-10px, 0, 0);\n    transform: scale3d(0.475, 0.475, 0.475) translate3d(-10px, 0, 0);\n    -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1);\n    animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1);\n  }\n}\n.zoomInRight {\n  -webkit-animation-name: zoomInRight;\n  animation-name: zoomInRight;\n}\n@-webkit-keyframes zoomInUp {\n  0% {\n    opacity: 0;\n    -webkit-transform: scale3d(0.1, 0.1, 0.1) translate3d(0, 1000px, 0);\n    transform: scale3d(0.1, 0.1, 0.1) translate3d(0, 1000px, 0);\n    -webkit-animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19);\n    animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19);\n  }\n  60% {\n    opacity: 1;\n    -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(0, -60px, 0);\n    transform: scale3d(0.475, 0.475, 0.475) translate3d(0, -60px, 0);\n    -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1);\n    animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1);\n  }\n}\n@keyframes zoomInUp {\n  0% {\n    opacity: 0;\n    -webkit-transform: scale3d(0.1, 0.1, 0.1) translate3d(0, 1000px, 0);\n    transform: scale3d(0.1, 0.1, 0.1) translate3d(0, 1000px, 0);\n    -webkit-animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19);\n    animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19);\n  }\n  60% {\n    opacity: 1;\n    -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(0, -60px, 0);\n    transform: scale3d(0.475, 0.475, 0.475) translate3d(0, -60px, 0);\n    -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1);\n    animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1);\n  }\n}\n.zoomInUp {\n  -webkit-animation-name: zoomInUp;\n  animation-name: zoomInUp;\n}\n@-webkit-keyframes zoomOut {\n  0% {\n    opacity: 1;\n  }\n  50% {\n    opacity: 0;\n    -webkit-transform: scale3d(0.3, 0.3, 0.3);\n    transform: scale3d(0.3, 0.3, 0.3);\n  }\n  100% {\n    opacity: 0;\n  }\n}\n@keyframes zoomOut {\n  0% {\n    opacity: 1;\n  }\n  50% {\n    opacity: 0;\n    -webkit-transform: scale3d(0.3, 0.3, 0.3);\n    transform: scale3d(0.3, 0.3, 0.3);\n  }\n  100% {\n    opacity: 0;\n  }\n}\n.zoomOut {\n  -webkit-animation-name: zoomOut;\n  animation-name: zoomOut;\n}\n@-webkit-keyframes zoomOutDown {\n  40% {\n    opacity: 1;\n    -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(0, -60px, 0);\n    transform: scale3d(0.475, 0.475, 0.475) translate3d(0, -60px, 0);\n    -webkit-animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19);\n    animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19);\n  }\n  100% {\n    opacity: 0;\n    -webkit-transform: scale3d(0.1, 0.1, 0.1) translate3d(0, 2000px, 0);\n    transform: scale3d(0.1, 0.1, 0.1) translate3d(0, 2000px, 0);\n    -webkit-transform-origin: center bottom;\n    transform-origin: center bottom;\n    -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1);\n    animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1);\n  }\n}\n@keyframes zoomOutDown {\n  40% {\n    opacity: 1;\n    -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(0, -60px, 0);\n    transform: scale3d(0.475, 0.475, 0.475) translate3d(0, -60px, 0);\n    -webkit-animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19);\n    animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19);\n  }\n  100% {\n    opacity: 0;\n    -webkit-transform: scale3d(0.1, 0.1, 0.1) translate3d(0, 2000px, 0);\n    transform: scale3d(0.1, 0.1, 0.1) translate3d(0, 2000px, 0);\n    -webkit-transform-origin: center bottom;\n    transform-origin: center bottom;\n    -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1);\n    animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1);\n  }\n}\n.zoomOutDown {\n  -webkit-animation-name: zoomOutDown;\n  animation-name: zoomOutDown;\n}\n@-webkit-keyframes zoomOutLeft {\n  40% {\n    opacity: 1;\n    -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(42px, 0, 0);\n    transform: scale3d(0.475, 0.475, 0.475) translate3d(42px, 0, 0);\n  }\n  100% {\n    opacity: 0;\n    -webkit-transform: scale(0.1) translate3d(-2000px, 0, 0);\n    transform: scale(0.1) translate3d(-2000px, 0, 0);\n    -webkit-transform-origin: left center;\n    transform-origin: left center;\n  }\n}\n@keyframes zoomOutLeft {\n  40% {\n    opacity: 1;\n    -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(42px, 0, 0);\n    transform: scale3d(0.475, 0.475, 0.475) translate3d(42px, 0, 0);\n  }\n  100% {\n    opacity: 0;\n    -webkit-transform: scale(0.1) translate3d(-2000px, 0, 0);\n    transform: scale(0.1) translate3d(-2000px, 0, 0);\n    -webkit-transform-origin: left center;\n    transform-origin: left center;\n  }\n}\n.zoomOutLeft {\n  -webkit-animation-name: zoomOutLeft;\n  animation-name: zoomOutLeft;\n}\n@-webkit-keyframes zoomOutRight {\n  40% {\n    opacity: 1;\n    -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(-42px, 0, 0);\n    transform: scale3d(0.475, 0.475, 0.475) translate3d(-42px, 0, 0);\n  }\n  100% {\n    opacity: 0;\n    -webkit-transform: scale(0.1) translate3d(2000px, 0, 0);\n    transform: scale(0.1) translate3d(2000px, 0, 0);\n    -webkit-transform-origin: right center;\n    transform-origin: right center;\n  }\n}\n@keyframes zoomOutRight {\n  40% {\n    opacity: 1;\n    -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(-42px, 0, 0);\n    transform: scale3d(0.475, 0.475, 0.475) translate3d(-42px, 0, 0);\n  }\n  100% {\n    opacity: 0;\n    -webkit-transform: scale(0.1) translate3d(2000px, 0, 0);\n    transform: scale(0.1) translate3d(2000px, 0, 0);\n    -webkit-transform-origin: right center;\n    transform-origin: right center;\n  }\n}\n.zoomOutRight {\n  -webkit-animation-name: zoomOutRight;\n  animation-name: zoomOutRight;\n}\n@-webkit-keyframes zoomOutUp {\n  40% {\n    opacity: 1;\n    -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(0, 60px, 0);\n    transform: scale3d(0.475, 0.475, 0.475) translate3d(0, 60px, 0);\n    -webkit-animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19);\n    animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19);\n  }\n  100% {\n    opacity: 0;\n    -webkit-transform: scale3d(0.1, 0.1, 0.1) translate3d(0, -2000px, 0);\n    transform: scale3d(0.1, 0.1, 0.1) translate3d(0, -2000px, 0);\n    -webkit-transform-origin: center bottom;\n    transform-origin: center bottom;\n    -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1);\n    animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1);\n  }\n}\n@keyframes zoomOutUp {\n  40% {\n    opacity: 1;\n    -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(0, 60px, 0);\n    transform: scale3d(0.475, 0.475, 0.475) translate3d(0, 60px, 0);\n    -webkit-animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19);\n    animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19);\n  }\n  100% {\n    opacity: 0;\n    -webkit-transform: scale3d(0.1, 0.1, 0.1) translate3d(0, -2000px, 0);\n    transform: scale3d(0.1, 0.1, 0.1) translate3d(0, -2000px, 0);\n    -webkit-transform-origin: center bottom;\n    transform-origin: center bottom;\n    -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1);\n    animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1);\n  }\n}\n.zoomOutUp {\n  -webkit-animation-name: zoomOutUp;\n  animation-name: zoomOutUp;\n}\n@-webkit-keyframes slideInDown {\n  0% {\n    -webkit-transform: translateY(-100%);\n    transform: translateY(-100%);\n    visibility: visible;\n  }\n  100% {\n    -webkit-transform: translateY(0);\n    transform: translateY(0);\n  }\n}\n@keyframes slideInDown {\n  0% {\n    -webkit-transform: translateY(-100%);\n    transform: translateY(-100%);\n    visibility: visible;\n  }\n  100% {\n    -webkit-transform: translateY(0);\n    transform: translateY(0);\n  }\n}\n.slideInDown {\n  -webkit-animation-name: slideInDown;\n  animation-name: slideInDown;\n}\n@-webkit-keyframes slideInLeft {\n  0% {\n    -webkit-transform: translateX(-100%);\n    transform: translateX(-100%);\n    visibility: visible;\n  }\n  100% {\n    -webkit-transform: translateX(0);\n    transform: translateX(0);\n  }\n}\n@keyframes slideInLeft {\n  0% {\n    -webkit-transform: translateX(-100%);\n    transform: translateX(-100%);\n    visibility: visible;\n  }\n  100% {\n    -webkit-transform: translateX(0);\n    transform: translateX(0);\n  }\n}\n.slideInLeft {\n  -webkit-animation-name: slideInLeft;\n  animation-name: slideInLeft;\n}\n@-webkit-keyframes slideInRight {\n  0% {\n    -webkit-transform: translateX(100%);\n    transform: translateX(100%);\n    visibility: visible;\n  }\n  100% {\n    -webkit-transform: translateX(0);\n    transform: translateX(0);\n  }\n}\n@keyframes slideInRight {\n  0% {\n    -webkit-transform: translateX(100%);\n    transform: translateX(100%);\n    visibility: visible;\n  }\n  100% {\n    -webkit-transform: translateX(0);\n    transform: translateX(0);\n  }\n}\n.slideInRight {\n  -webkit-animation-name: slideInRight;\n  animation-name: slideInRight;\n}\n@-webkit-keyframes slideInUp {\n  0% {\n    -webkit-transform: translateY(100%);\n    transform: translateY(100%);\n    visibility: visible;\n  }\n  100% {\n    -webkit-transform: translateY(0);\n    transform: translateY(0);\n  }\n}\n@keyframes slideInUp {\n  0% {\n    -webkit-transform: translateY(100%);\n    transform: translateY(100%);\n    visibility: visible;\n  }\n  100% {\n    -webkit-transform: translateY(0);\n    transform: translateY(0);\n  }\n}\n.slideInUp {\n  -webkit-animation-name: slideInUp;\n  animation-name: slideInUp;\n}\n@-webkit-keyframes slideOutDown {\n  0% {\n    -webkit-transform: translateY(0);\n    transform: translateY(0);\n  }\n  100% {\n    visibility: hidden;\n    -webkit-transform: translateY(100%);\n    transform: translateY(100%);\n  }\n}\n@keyframes slideOutDown {\n  0% {\n    -webkit-transform: translateY(0);\n    transform: translateY(0);\n  }\n  100% {\n    visibility: hidden;\n    -webkit-transform: translateY(100%);\n    transform: translateY(100%);\n  }\n}\n.slideOutDown {\n  -webkit-animation-name: slideOutDown;\n  animation-name: slideOutDown;\n}\n@-webkit-keyframes slideOutLeft {\n  0% {\n    -webkit-transform: translateX(0);\n    transform: translateX(0);\n  }\n  100% {\n    visibility: hidden;\n    -webkit-transform: translateX(-100%);\n    transform: translateX(-100%);\n  }\n}\n@keyframes slideOutLeft {\n  0% {\n    -webkit-transform: translateX(0);\n    transform: translateX(0);\n  }\n  100% {\n    visibility: hidden;\n    -webkit-transform: translateX(-100%);\n    transform: translateX(-100%);\n  }\n}\n.slideOutLeft {\n  -webkit-animation-name: slideOutLeft;\n  animation-name: slideOutLeft;\n}\n@-webkit-keyframes slideOutRight {\n  0% {\n    -webkit-transform: translateX(0);\n    transform: translateX(0);\n  }\n  100% {\n    visibility: hidden;\n    -webkit-transform: translateX(100%);\n    transform: translateX(100%);\n  }\n}\n@keyframes slideOutRight {\n  0% {\n    -webkit-transform: translateX(0);\n    transform: translateX(0);\n  }\n  100% {\n    visibility: hidden;\n    -webkit-transform: translateX(100%);\n    transform: translateX(100%);\n  }\n}\n.slideOutRight {\n  -webkit-animation-name: slideOutRight;\n  animation-name: slideOutRight;\n}\n@-webkit-keyframes slideOutUp {\n  0% {\n    -webkit-transform: translateY(0);\n    transform: translateY(0);\n  }\n  100% {\n    visibility: hidden;\n    -webkit-transform: translateY(-100%);\n    transform: translateY(-100%);\n  }\n}\n@keyframes slideOutUp {\n  0% {\n    -webkit-transform: translateY(0);\n    transform: translateY(0);\n  }\n  100% {\n    visibility: hidden;\n    -webkit-transform: translateY(-100%);\n    transform: translateY(-100%);\n  }\n}\n.slideOutUp {\n  -webkit-animation-name: slideOutUp;\n  animation-name: slideOutUp;\n}\nhtml,\nbody,\ndiv,\nspan,\na,\nli,\ntd,\nth {\n  font-family: '微软雅黑', 'Lato', sans-serif;\n}\nbold {\n  font-family: 'Lato-Bold', sans-serif;\n  font-weight: Bold;\n}\nli,\n.wrappable {\n  white-space: pre;\n  /* CSS 2.0 */\n  white-space: pre-wrap;\n  /* CSS 2.1 */\n  white-space: pre-line;\n  /* CSS 3.0 */\n  white-space: -pre-wrap;\n  /* Opera 4-6 */\n  white-space: -o-pre-wrap;\n  /* Opera 7 */\n  white-space: -moz-pre-wrap;\n  /* Mozilla */\n  white-space: -hp-pre-wrap;\n  /* HP Printers */\n  word-wrap: break-word;\n  /* IE 5+ */\n}\npre.wrappable {\n  white-space: pre;\n  /* CSS 2.0 */\n  white-space: pre-wrap;\n  /* CSS 2.1 */\n  white-space: -pre-wrap;\n  /* Opera 4-6 */\n  white-space: -o-pre-wrap;\n  /* Opera 7 */\n  white-space: -moz-pre-wrap;\n  /* Mozilla */\n  white-space: -hp-pre-wrap;\n  /* HP Printers */\n  word-wrap: break-word;\n  /* IE 5+ */\n}\nhtml {\n  position: relative;\n  min-height: 100%;\n  overflow-x: hidden;\n}\n.btn-group {\n  border-color: #4CAF50;\n}\nbody.full-screen-body-background {\n  background-color: #ffffff;\n}\nbody.top-and-bottom-margins {\n  padding-top: 80px;\n  margin-bottom: 60px;\n}\nbody.no-top-and-bottom-margins {\n  margin: 75px 10px 0px 20px;\n}\nh1,\nh2 {\n  font-weight: 400;\n}\nh1,\nh2,\nh3,\nh4,\nh5,\nh6,\np,\nli {\n  padding-top: 5px;\n  padding-bottom: 5px;\n}\n.alert {\n  margin-top: 20px;\n}\n.thumbnail {\n  background-color: #EEEEEE;\n}\n.fa,\n[class^='ion-'] {\n  margin-right: 5px;\n}\n.fa:hover {\n  text-decoration: none;\n}\n.no-link-underline {\n  text-decoration: none;\n}\n.img-center {\n  margin: 0 auto;\n}\n.btn-cta {\n  font-size: 40px;\n}\n.shadow {\n  white-space: normal;\n  -webkit-box-shadow: 2px 4px 1px rgba(0, 0, 0, 0.3);\n  -moz-box-shadow: 2px 4px 1px rgba(0, 0, 0, 0.3);\n  box-shadow: 2px 4px 1px rgba(0, 0, 0, 0.3);\n}\n.btn-nav {\n  margin-top: 10px;\n}\nul {\n  list-style: none;\n}\n.panel-heading {\n  font-size: 25px;\n}\n.panel-heading > h1 {\n  font-size: 25px;\n  padding: 2px;\n  margin: 2px;\n}\n.navbar-brand {\n  font-size: 26px;\n}\n.navbar > .container {\n  width: auto;\n  padding-left: 0px;\n  padding-right: 0px;\n}\n.nav-height {\n  height: 50px;\n  border: none;\n}\n.landing-icon {\n  height: 200px;\n  width: 200px;\n}\n.completion-icon {\n  font-size: 150px;\n}\n.positive-15 {\n  margin-top: 15px;\n}\n.positive-20 {\n  margin-top: 20px;\n}\n.positive-15-bottom {\n  margin-bottom: 15px;\n}\n.positive-10 {\n  margin-top: 10px;\n}\n.positive-5 {\n  margin-top: 5px;\n}\n.negative-5 {\n  margin-top: -5px;\n}\n.negative-10 {\n  margin-top: -10px;\n}\n.negative-15 {\n  margin-top: -15px;\n}\n.negative-20 {\n  margin-top: -20px;\n}\n.negative-28 {\n  margin-top: -28px;\n}\n.negative-30 {\n  margin-top: -30px;\n}\n.negative-30-bottom {\n  margin-bottom: -30px;\n}\n.negative-35 {\n  margin-top: -35px;\n}\n.negative-55 {\n  margin-top: -55px;\n  margin-bottom: -55px;\n}\n.large-p {\n  font-size: 24px;\n}\n.small-p {\n  font-size: 14px;\n}\n.map-p {\n  font-size: 20px;\n}\n.map-row-numbers {\n  text-align: right;\n  padding-right: 5px;\n  padding-left: 5px;\n}\n.link-table td {\n  font-size: 16px;\n  border-top: none !important;\n}\n@media (min-width: 767px) {\n  .link-table td {\n    font-size: 24px;\n  }\n}\n.capitalize {\n  text-transform: capitalize;\n}\n.text-success {\n  color: #4CAF50;\n}\n.fast-animation {\n  -webkit-animation-duration: 0.5s;\n  animation-duration: 0.5s;\n}\n.disabled {\n  pointer-events: none;\n  cursor: default;\n  color: graytext !important;\n}\n.hidden-element {\n  display: none;\n}\n.nav-logo {\n  height: 40px;\n  margin-top: -10px;\n}\n@media (max-width: 397px) {\n  .nav-logo {\n    height: 30px;\n    margin-top: -5px;\n  }\n}\n@media (max-width: 335px) {\n  .nav-logo {\n    height: 25px;\n    margin-top: -2px;\n  }\n}\n.navbar-right {\n  background-color: #4CAF50;\n  text-align: center;\n}\n@media (min-width: 767px) {\n  .navbar-right {\n    margin-right: 0;\n  }\n}\n@media (max-width: 991px) and (min-width: 767px) {\n  .navbar-right {\n    position: absolute;\n    left: 0;\n    right: 0;\n    margin-right: 0px;\n    white-space: nowrap;\n  }\n}\n.navbar {\n  white-space: nowrap;\n  border: none;\n  line-height: 1;\n}\n@media (min-width: 767px) {\n  .navbar {\n    padding-left: 15px;\n    padding-right: 30px;\n  }\n}\nli.avatar,\nli.avatar > a {\n  padding: 0;\n  margin: 0;\n}\n.thin-progress-bar {\n  height: 8px;\n  margin-top: 3px;\n  margin-bottom: 0px;\n  width: 60%;\n  margin-right: auto;\n  margin-left: auto;\n}\n.panel-body {\n  margin-bottom: -6px;\n}\n.lb-container {\n  padding: 0px;\n}\n.btn-social {\n  width: 250px;\n  margin: auto;\n}\n.btn-link-social {\n  max-width: 400px;\n  margin: auto;\n  margin-bottom: 10px;\n}\n.navbar {\n  background-color: #4CAF50;\n}\na {\n  font-weight: bold;\n}\np {\n  font-size: 14px;\n}\n.map-aside-body p {\n  line-height: 1.8;\n}\n.navbar-nav > li > a {\n  color: #ffffff;\n}\n.navbar-nav > li > a:hover {\n  color: #4CAF50;\n}\n.hug-top {\n  margin-top: -35px;\n  margin-bottom: -10px;\n}\n.nonprofit-landing {\n  font-size: 50px;\n}\n.big-text {\n  font-size: 63px;\n}\n.signup-btn.btn {\n  background-color: #ffac33;\n  background-image: linear-gradient(#ffcc4d, #ffac33);\n  -ms-filter: \"progid:DXImageTransform.Microsoft.gradient(startColorstr=#ffcc4d,  endColorstr=#ffac33,  GradientType=0)\";\n  border-color: #f1a02a;\n  color: #292f33 !important;\n  text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5);\n}\n.signup-btn:hover,\n.signup-btn:focus {\n  background-color: #e99110;\n  background-image: linear-gradient(#ffcc4d, #e99110);\n  -ms-filter: \"progid:DXImageTransform.Microsoft.gradient(startColorstr=#ffcc4d,  endColorstr=#e99110,  GradientType=0)\";\n  border-color: #ec8b11;\n  color: #292f33 !important;\n}\n.signup-btn:active {\n  background-color: #f2a330;\n  background-image: none;\n  box-shadow: inset 0 1px 4px rgba(0, 0, 0, 0.3);\n}\n*,\n*:before,\n*:after {\n  box-sizing: border-box !important;\n}\n.btn-big {\n  font-size: 20px;\n  border-radius: 6px;\n}\n.btn-bigger {\n  font-size: 30px;\n}\n.big-text-field {\n  font-size: 30px;\n  height: 57px;\n  background-color: #ffffff !important;\n}\nh4 {\n  font-size: 22px;\n}\n.no-transition {\n  -webkit-transition: height 0.001s;\n  -moz-transition: height 0.001s;\n  -ms-transition: height 0.001s;\n  -o-transition: height 0.001s;\n  transition: height 0.001s;\n}\n.margin-left-10 {\n  margin-left: 10px;\n}\n@media (max-width: 768px) {\n  .btn-responsive {\n    font-size: 15px;\n    height: 26.5px;\n    padding-top: 1px;\n  }\n}\n@media (max-width: 768px) {\n  .field-responsive {\n    font-size: 15px;\n    height: 26.5px;\n  }\n}\nthead {\n  font-size: 150%;\n}\n.nowrap {\n  white-space: nowrap;\n}\n.big-break {\n  margin-top: 50px;\n  margin-bottom: 50px;\n}\n.profile-picture {\n  height: 50px;\n  width: 50px;\n}\n@media (min-width: 991px) and (max-width: 999px) {\n  .brownie-points-nav {\n    margin-right: -10px;\n  }\n}\n.navbar-nav a {\n  color: #ffffff;\n  font-size: 20px;\n  margin-top: -5px;\n  margin-bottom: -5px;\n}\n.navbar-toggle {\n  color: #ffffff;\n}\n.navbar-toggle:hover,\n.navbar-toggle:focus {\n  color: #4a2b0f;\n}\n.signup-btn-nav {\n  margin-top: -2px !important;\n  padding-top: 10px !important;\n  padding-bottom: 10px !important;\n  margin-right: -12px;\n}\n@media (min-width: 991px) and (max-width: 1010px) {\n  .signup-btn-nav {\n    margin-left: -10px;\n    margin-right: -5px;\n  }\n}\n.public-profile-img {\n  height: 200px;\n  width: 200px;\n  border-radius: 5px;\n}\n.ng-invalid.ng-dirty {\n  border-color: #FA787E;\n}\n.ng-valid.ng-dirty {\n  border-color: #78FA89;\n}\n.flat-top {\n  margin-top: -5px;\n}\n.negative-bottom {\n  margin-bottom: -20px;\n}\n.min-height-1000 {\n  min-height: 1000px;\n}\n.points-on-top {\n  color: #ffffff;\n  font-size: 35px;\n  z-index: 2;\n  width: 60%;\n  margin: 0 auto;\n  position: relative;\n  top: 50%;\n  -webkit-transform: translateY(-50%);\n  transform: translateY(-50%);\n}\n.landing-skill-icon {\n  color: #4CAF50;\n  font-size: 150px;\n}\n.custom-landing-skill-icon {\n  margin-top: -15px;\n  padding-bottom: 15px;\n}\n.black-text {\n  color: #333;\n  font-weight: 400;\n  font-size: 40px;\n}\n.font-awesome-padding {\n  margin-top: 45px;\n  margin-bottom: 20px;\n}\n.background-svg {\n  width: 220px;\n  height: 220px;\n  background-image: url(\"/images/certificate-icon.svg\");\n  background-size: 120%;\n  background-repeat: no-repeat;\n  background-position: center;\n}\n.testimonial-image {\n  border-radius: 5px;\n  height: 200px;\n  width: 200px;\n  color: #009900;\n}\n.testimonial-image-jobs {\n  border-radius: 5px;\n  color: #009900;\n}\n.default-border-radius {\n  border-radius: 5px;\n}\n.height-500 {\n  height: 500px;\n}\n.height-400 {\n  height: 400px;\n}\n.testimonial-copy {\n  text-align: justify;\n  font-size: 18px !important;\n  margin-left: 20px;\n  margin-right: 20px;\n}\n@media (min-width: 991px) and (max-width: 1199px) {\n  .testimonial-copy {\n    height: 150px;\n  }\n}\n@media (min-width: 1200px) {\n  .testimonial-copy {\n    height: 100px;\n  }\n}\n.nonprofit-testimonial-copy {\n  text-align: justify;\n  font-size: 18px !important;\n  margin-left: 20px;\n  margin-right: 20px;\n}\n@media (min-width: 991px) and (max-width: 1199px) {\n  .nonprofit-testimonial-copy {\n    height: 300px !important;\n  }\n}\n@media (min-width: 1200px) {\n  .nonprofit-testimonial-copy {\n    height: 200px !important;\n  }\n}\n.navbar-collapse {\n  border-top: 0;\n}\n.challenge-list-header {\n  background-color: #4CAF50;\n  color: #eeeeee;\n  font-size: 36px;\n  text-align: center;\n  margin-bottom: -30px;\n  border-radius: 5px 5px 0px 0px;\n  padding-left: 50px;\n}\n.closing-x {\n  color: #eeeeee;\n  font-size: 50px;\n  text-align: right;\n}\n.fcc-footer {\n  width: 100%;\n  height: 50px;\n  text-align: center;\n  background-color: #4CAF50;\n  padding: 12px;\n  bottom: 0;\n  left: 0;\n  position: absolute;\n}\n.fcc-footer a {\n  font-size: 20px;\n  color: #eeeeee;\n  margin-left: 0px;\n  margin-right: 0px;\n  padding-left: 10px;\n  padding-right: 10px;\n  padding-top: 14px;\n  padding-bottom: 12px;\n}\n.fcc-footer a:hover {\n  color: #4CAF50;\n  background-color: #eeeeee;\n  text-decoration: none;\n}\n.embed-responsive-twitch-chat {\n  padding-bottom: 117%;\n}\n#directions {\n  text-align: left;\n  font-size: 15px;\n}\n.graph-rect {\n  fill: #ddd !important;\n}\n/**\n * Bonfire styling\n */\nform.code span {\n  font-size: 18px;\n  font-family: \"Ubuntu Mono\";\n  padding-bottom: 0px;\n  margin-bottom: 0px;\n  height: 100%;\n}\n.CodeMirror {\n  line-height: 1 !important;\n}\n.CodeMirror-linenumber {\n  font-size: 18px;\n  font-family: \"Ubuntu Mono\";\n}\n#mainEditorPanel {\n  height: 100%;\n  width: 99%;\n}\n.scroll-locker {\n  overflow-x: hidden;\n  overflow-y: auto;\n}\n#mainEditorPanel .panel-body {\n  padding-bottom: 0px;\n}\ndiv.CodeMirror-scroll {\n  padding-bottom: 30px;\n}\n.test-vertical-center {\n  margin-top: 8px;\n}\n.cm-s-monokai.CodeMirror {\n  border-radius: 5px;\n}\n.courseware-height {\n  min-height: 650px;\n}\n.btn {\n  font-weight: 400;\n  white-space: normal;\n  background: transparent;\n  -webkit-transition: background 0.2s ease-in-out, border 0.2s ease-in-out;\n  -moz-transition: background 0.2s ease-in-out, border 0.2s ease-in-out;\n  -ms-transition: background 0.2s ease-in-out, border 0.2s ease-in-out;\n  -o-transition: background 0.2s ease-in-out, border 0.2s ease-in-out;\n  transition: background 0.2s ease-in-out, border 0.2s ease-in-out;\n}\n.population-table {\n  font-size: 30px;\n  width: 460px;\n  margin: 0 auto;\n  padding: 0;\n}\n.population-table h2 {\n  margin: 0;\n  text-align: left;\n}\n.population-table .tag {\n  width: 165px;\n  display: inline-block;\n}\n.population-table .text-primary {\n  margin-right: 5px;\n}\n@media (max-width: 767px) {\n  .population-table {\n    font-size: 16px;\n    width: 260px;\n  }\n  .population-table .tag {\n    width: 95px;\n  }\n}\n@media (max-width: 991px) {\n  .navbar-header {\n    float: none;\n  }\n  .navbar-toggle {\n    display: block;\n  }\n  .navbar-collapse.collapse {\n    display: none !important;\n  }\n  .navbar-nav {\n    margin-top: 0;\n  }\n  .navbar-nav > li {\n    float: none;\n  }\n  .navbar-nav > li > a {\n    padding-top: 10px;\n    padding-bottom: 10px;\n  }\n  .navbar-text {\n    float: none;\n    margin: 15px 0;\n  }\n  /* since 3.1.0 */\n  .navbar-collapse.collapse.in {\n    display: block !important;\n  }\n  .collapsing {\n    overflow: hidden !important;\n    position: absolute;\n    left: 0;\n    right: 0;\n  }\n}\n.navbar-toggle {\n  width: 80px;\n  padding-left: 0;\n  padding-right: 8px;\n  margin: 7px 2px 7px 0;\n  text-align: left;\n  font-size: 10px;\n}\n.hamburger-text {\n  line-height: 0.75em;\n  margin-top: 10px;\n  font-size: 18px;\n}\n.story-list {\n  padding-bottom: 30px;\n  margin-bottom: 30px;\n}\n.button-spacer {\n  padding: 5px 0;\n}\n.spacer {\n  padding: 15px 0 15px 0;\n}\n.img-news {\n  width: 50px;\n  height: 50px;\n}\n.url-preview {\n  max-width: 250px;\n  max-height: 250px;\n}\n@media (min-width: 768px) {\n  .news-box {\n    margin-top: -40px;\n  }\n}\n@media (max-width: 767px) {\n  .news-box {\n    padding: 5px;\n    border-color: #4A2B0F;\n    border-width: 1px;\n    border-style: solid;\n    border-radius: 5px;\n    width: 100%;\n    float: left;\n  }\n}\n@media (min-width: 768px) {\n  .news-box-search {\n    margin-top: -30px;\n    padding-bottom: 20px;\n  }\n}\n@media (max-width: 767px) {\n  .news-box-search {\n    padding: 5px;\n    border-color: #4A2B0F;\n    border-width: 1px;\n    border-style: solid;\n    border-radius: 5px;\n    width: 100%;\n    float: left;\n  }\n}\n.story-headline {\n  font-size: 20px;\n  margin-left: 14px;\n  margin-top: -5px;\n}\n.landing-heading {\n  font-size: 50px !important;\n  font-family: Georgia;\n}\n.mobile-story-headline {\n  font-size: 20px;\n}\n.story-byline {\n  margin-top: 5px;\n  font-size: 14px;\n}\n.media-stories {\n  margin-left: 20px;\n}\nhr {\n  border: 0;\n  height: 1px;\n  background-image: linear-gradient(to right, rgba(0, 0, 0, 0), rgba(0, 0, 0, 0.75), rgba(0, 0, 0, 0));\n}\n.big-spacer {\n  padding: 30px 0 30px 0;\n}\n#reply-to-main-post,\n#upvote {\n  cursor: pointer;\n}\n.btn-no-shadow {\n  -webkit-box-shadow: 0px 0px 0px rgba(0, 0, 0, 0);\n  -moz-box-shadow: 0px 0px 0px rgba(0, 0, 0, 0);\n  box-shadow: 0px 0px 0px rgba(0, 0, 0, 0);\n}\n.dotted-underline {\n  border-bottom: dashed 1px #457E86;\n}\n.d3-centered {\n  width: 771px;\n  margin: 0 auto;\n}\n.cal-heatmap-container {\n  background-color: #ffffff;\n}\n.interested-camper-image {\n  height: 50px;\n  width: 50px;\n  padding: 5px;\n}\n.mobile-story-image {\n  border-radius: 5px;\n  width: 100%;\n}\n@media (max-width: 768px) {\n  .mobile-story-image {\n    margin-right: 5px;\n  }\n}\n.alert a {\n  text-decoration: underline;\n}\n.step-text {\n  line-height: 120%;\n  padding-bottom: 10px;\n}\n.faded {\n  opacity: 0.5;\n}\n.slightly-faded {\n  opacity: 0.75;\n}\n.padded-ionic-icon {\n  padding-top: 5px;\n}\n.checklist-element {\n  margin-left: -60px;\n  margin-right: -20px;\n}\n.profile-social-icons {\n  margin-left: 8px;\n}\n.border-radius-5 {\n  border-radius: 5px;\n}\ncode {\n  padding: 0;\n}\n@media only screen and (min-width: 993px) {\n  .iframe-scroll {\n    z-index: 1;\n  }\n}\n@media only screen and (max-width: 992px) {\n  .iframe-scroll {\n    height: auto;\n    overflow: auto;\n  }\n}\n.chart rect {\n  fill: steelblue;\n}\n.chart text {\n  font-size: 14px;\n  text-anchor: end;\n}\n.axis path,\n.axis line {\n  fill: none;\n  stroke: #121401;\n  stroke-width: 2px;\n  shape-rendering: crispEdges;\n}\n.gitter-chat-embed {\n  z-index: 20000 !important;\n}\n/* :not(:required) hides this rule from IE9 and below */\n.inner-circles-loader:not(:required) {\n  -moz-transform: translate3d(0, 0, 0);\n  -ms-transform: translate3d(0, 0, 0);\n  -webkit-transform: translate3d(0, 0, 0);\n  transform: translate3d(0, 0, 0);\n  position: relative;\n  display: inline-block;\n  width: 125px;\n  height: 125px;\n  background: rgba(25, 165, 152, 0.5);\n  border-radius: 50%;\n  overflow: hidden;\n  text-indent: -9999px;\n  margin-top: 10%;\n  /* Hides inner circles outside base circle at safari */\n  -webkit-mask-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAIAAACQd1PeAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAA5JREFUeNpiYGBgAAgwAAAEAAGbA+oJAAAAAElFTkSuQmCC);\n}\n.inner-circles-loader:not(:required):before,\n.inner-circles-loader:not(:required):after {\n  content: '';\n  position: absolute;\n  top: 0;\n  display: inline-block;\n  width: 125px;\n  height: 125px;\n  border-radius: 50%;\n}\n.inner-circles-loader:not(:required):before {\n  -moz-animation: inner-circles-loader 3s infinite;\n  -webkit-animation: inner-circles-loader 3s infinite;\n  animation: inner-circles-loader 3s infinite;\n  -moz-transform-origin: 0 50%;\n  -ms-transform-origin: 0 50%;\n  -webkit-transform-origin: 0 50%;\n  transform-origin: 0 50%;\n  left: 0;\n  background: #c7efcf;\n}\n.inner-circles-loader:not(:required):after {\n  -moz-animation: inner-circles-loader 3s 0.2s reverse infinite;\n  -webkit-animation: inner-circles-loader 3s 0.2s reverse infinite;\n  animation: inner-circles-loader 3s 0.2s reverse infinite;\n  -moz-transform-origin: 100% 50%;\n  -ms-transform-origin: 100% 50%;\n  -webkit-transform-origin: 100% 50%;\n  transform-origin: 100% 50%;\n  right: 0;\n  background: #eef5db;\n}\n@-moz-keyframes inner-circles-loader {\n  0% {\n    -moz-transform: rotate(0deg);\n    transform: rotate(0deg);\n  }\n  50% {\n    -moz-transform: rotate(360deg);\n    transform: rotate(360deg);\n  }\n  100% {\n    -moz-transform: rotate(0deg);\n    transform: rotate(0deg);\n  }\n}\n@-webkit-keyframes inner-circles-loader {\n  0% {\n    -webkit-transform: rotate(0deg);\n    transform: rotate(0deg);\n  }\n  50% {\n    -webkit-transform: rotate(360deg);\n    transform: rotate(360deg);\n  }\n  100% {\n    -webkit-transform: rotate(0deg);\n    transform: rotate(0deg);\n  }\n}\n@keyframes inner-circles-loader {\n  0% {\n    -moz-transform: rotate(0deg);\n    -ms-transform: rotate(0deg);\n    -webkit-transform: rotate(0deg);\n    transform: rotate(0deg);\n  }\n  50% {\n    -moz-transform: rotate(360deg);\n    -ms-transform: rotate(360deg);\n    -webkit-transform: rotate(360deg);\n    transform: rotate(360deg);\n  }\n  100% {\n    -moz-transform: rotate(0deg);\n    -ms-transform: rotate(0deg);\n    -webkit-transform: rotate(0deg);\n    transform: rotate(0deg);\n  }\n}\n.chat-embed-main-title {\n  display: flex;\n  flex-grow: 1;\n  padding-left: 31px;\n  padding-top: 7px;\n}\n.gitter-chat-embed {\n  z-index: 100;\n  position: fixed;\n  top: 0;\n  left: 60%;\n  bottom: 0;\n  right: 0;\n  display: flex;\n  flex-direction: row;\n  transition: transform 0.3s cubic-bezier(0.16, 0.22, 0.22, 1.7);\n}\n.gitter-chat-embed.is-collapsed:not(.is-loading) {\n  transform: translateX(110%);\n}\n.jobs-list-highlight {\n  background-color: #ffc;\n}\na.jobs-list-highlight:hover {\n  background-color: #ffc;\n}\n.jobs-list {\n  cursor: pointer;\n  cursor: hand;\n}\n.jobs-checkbox-spacer input[type=\"checkbox\"] {\n  margin-left: -23px;\n}\n.challenge-step-description {\n  font-size: 1.5em;\n}\n.challenge-step-counter {\n  font-size: 20px;\n  line-height: 44px;\n}\n.challenge-instructions-title {\n  margin-top: 0;\n}\n.challenge-instructions-title i {\n  margin-left: 5px;\n  line-height: 20px;\n}\n.challenge-instructions {\n  margin-bottom: 5px;\n}\n.challenge-instructions h4 {\n  margin-bottom: 0;\n}\n.challenge-instructions blockquote {\n  font-size: 90%;\n  font-family: Menlo, Monaco, Consolas, \"Courier New\", monospace;\n  color: #c7254e;\n  background-color: #fffbe5;\n  border-radius: 4px;\n  border: 1px solid #ccc;\n  white-space: pre;\n  padding: 5px 10px;\n  margin-bottom: 10px;\n  margin-top: -10px;\n  overflow: auto;\n}\n.challenge-instructions dfn {\n  font-family: Menlo, Monaco, Consolas, \"Courier New\", monospace;\n  color: #c7254e;\n  background-color: #f9f2f4;\n  border-radius: 4px;\n}\n.challenge-instructions a,\n.challenge-instructions #MDN-links a {\n  color: #31708f;\n}\n.challenge-instructions a::after,\n.challenge-instructions #MDN-links a::after {\n  font-size: 70%;\n  font-family: FontAwesome;\n  content: \" \\f08e\";\n}\n.challenge-instructions ol {\n  font-size: 16px;\n}\n#testSuite {\n  margin-top: 10px;\n}\n#testSuite > div > .row {\n  margin: 0!important;\n}\n.test-output {\n  font-size: 15px;\n  font-family: \"Ubuntu Mono\";\n  margin-top: 8px;\n  line-height: 20px;\n}\n.grayed-out-test-output {\n  color: #777777;\n}\n.big-error-icon {\n  font-size: 30px;\n  color: #d9534f;\n  top: 50%;\n}\n.big-success-icon {\n  font-size: 30px;\n  color: #4CAF50;\n}\niframe.iphone {\n  border: none;\n}\n@media (min-width: 992px) {\n  iframe.iphone {\n    width: 280px;\n    height: 500px;\n    position: absolute;\n    top: 70px;\n    right: 35px;\n    overflow-y: scroll;\n  }\n}\n@media (max-width: 991px) {\n  iframe.iphone {\n    width: 100%;\n    border-radius: 5px;\n    overflow-y: visible;\n    height: 500px;\n  }\n}\n@media (min-width: 1200px) and (max-width: 1250px) {\n  iframe.iphone {\n    right: 22px;\n  }\n}\n.iphone-position {\n  position: absolute;\n  top: -50px;\n  z-index: -1;\n  right: -195px;\n}\n@media (min-width: 1200px) and (max-width: 1250px) {\n  .iphone-position {\n    right: -207px;\n  }\n}\n.toast-title {\n  font-weight: bold;\n}\n.toast-message {\n  -ms-word-wrap: break-word;\n  word-wrap: break-word;\n}\n.toast-message a,\n.toast-message label {\n  color: #FFFFFF;\n}\n.toast-message a:hover {\n  color: #CCCCCC;\n  text-decoration: none;\n}\n.toast-close-button {\n  position: relative;\n  right: -0.3em;\n  top: -0.3em;\n  float: right;\n  font-size: 20px;\n  font-weight: bold;\n  color: #FFFFFF;\n  -webkit-text-shadow: 0 1px 0 #ffffff;\n  text-shadow: 0 1px 0 #ffffff;\n  opacity: 0.8;\n  -ms-filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=80);\n  filter: alpha(opacity=80);\n}\n.toast-close-button:hover,\n.toast-close-button:focus {\n  color: #000000;\n  text-decoration: none;\n  cursor: pointer;\n  opacity: 0.4;\n  -ms-filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=40);\n  filter: alpha(opacity=40);\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=\"#\"`.*/\nbutton.toast-close-button {\n  padding: 0;\n  cursor: pointer;\n  background: transparent;\n  border: 0;\n  -webkit-appearance: none;\n}\n.toast-top-center {\n  top: 0;\n  right: 0;\n  width: 100%;\n}\n.toast-bottom-center {\n  bottom: 0;\n  right: 0;\n  width: 100%;\n}\n.toast-top-full-width {\n  top: 0;\n  right: 0;\n  width: 100%;\n}\n.toast-bottom-full-width {\n  bottom: 0;\n  right: 0;\n  width: 100%;\n}\n.toast-top-left {\n  top: 12px;\n  left: 12px;\n}\n.toast-top-right {\n  top: 12px;\n  right: 12px;\n}\n.toast-bottom-right {\n  right: 12px;\n  bottom: 12px;\n}\n.toast-bottom-left {\n  bottom: 12px;\n  left: 12px;\n}\n#toast-container {\n  position: fixed;\n  z-index: 999999;\n  pointer-events: none;\n  /*overrides*/\n}\n#toast-container * {\n  -moz-box-sizing: border-box;\n  -webkit-box-sizing: border-box;\n  box-sizing: border-box;\n}\n#toast-container > div {\n  position: relative;\n  pointer-events: auto;\n  overflow: hidden;\n  margin: 0 0 6px;\n  padding: 15px 15px 15px 50px;\n  width: 300px;\n  -moz-border-radius: 3px 3px 3px 3px;\n  -webkit-border-radius: 3px 3px 3px 3px;\n  border-radius: 3px 3px 3px 3px;\n  background-position: 15px center;\n  background-repeat: no-repeat;\n  -moz-box-shadow: 0 0 12px #999999;\n  -webkit-box-shadow: 0 0 12px #999999;\n  box-shadow: 0 0 12px #999999;\n  color: #FFFFFF;\n  opacity: 0.8;\n  -ms-filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=80);\n  filter: alpha(opacity=80);\n}\n#toast-container > :hover {\n  -moz-box-shadow: 0 0 12px #000000;\n  -webkit-box-shadow: 0 0 12px #000000;\n  box-shadow: 0 0 12px #000000;\n  opacity: 1;\n  -ms-filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=100);\n  filter: alpha(opacity=100);\n  cursor: pointer;\n}\n#toast-container > .toast-info {\n  background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAGwSURBVEhLtZa9SgNBEMc9sUxxRcoUKSzSWIhXpFMhhYWFhaBg4yPYiWCXZxBLERsLRS3EQkEfwCKdjWJAwSKCgoKCcudv4O5YLrt7EzgXhiU3/4+b2ckmwVjJSpKkQ6wAi4gwhT+z3wRBcEz0yjSseUTrcRyfsHsXmD0AmbHOC9Ii8VImnuXBPglHpQ5wwSVM7sNnTG7Za4JwDdCjxyAiH3nyA2mtaTJufiDZ5dCaqlItILh1NHatfN5skvjx9Z38m69CgzuXmZgVrPIGE763Jx9qKsRozWYw6xOHdER+nn2KkO+Bb+UV5CBN6WC6QtBgbRVozrahAbmm6HtUsgtPC19tFdxXZYBOfkbmFJ1VaHA1VAHjd0pp70oTZzvR+EVrx2Ygfdsq6eu55BHYR8hlcki+n+kERUFG8BrA0BwjeAv2M8WLQBtcy+SD6fNsmnB3AlBLrgTtVW1c2QN4bVWLATaIS60J2Du5y1TiJgjSBvFVZgTmwCU+dAZFoPxGEEs8nyHC9Bwe2GvEJv2WXZb0vjdyFT4Cxk3e/kIqlOGoVLwwPevpYHT+00T+hWwXDf4AJAOUqWcDhbwAAAAASUVORK5CYII=\") !important;\n}\n#toast-container > .toast-error {\n  background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAHOSURBVEhLrZa/SgNBEMZzh0WKCClSCKaIYOED+AAKeQQLG8HWztLCImBrYadgIdY+gIKNYkBFSwu7CAoqCgkkoGBI/E28PdbLZmeDLgzZzcx83/zZ2SSXC1j9fr+I1Hq93g2yxH4iwM1vkoBWAdxCmpzTxfkN2RcyZNaHFIkSo10+8kgxkXIURV5HGxTmFuc75B2RfQkpxHG8aAgaAFa0tAHqYFfQ7Iwe2yhODk8+J4C7yAoRTWI3w/4klGRgR4lO7Rpn9+gvMyWp+uxFh8+H+ARlgN1nJuJuQAYvNkEnwGFck18Er4q3egEc/oO+mhLdKgRyhdNFiacC0rlOCbhNVz4H9FnAYgDBvU3QIioZlJFLJtsoHYRDfiZoUyIxqCtRpVlANq0EU4dApjrtgezPFad5S19Wgjkc0hNVnuF4HjVA6C7QrSIbylB+oZe3aHgBsqlNqKYH48jXyJKMuAbiyVJ8KzaB3eRc0pg9VwQ4niFryI68qiOi3AbjwdsfnAtk0bCjTLJKr6mrD9g8iq/S/B81hguOMlQTnVyG40wAcjnmgsCNESDrjme7wfftP4P7SP4N3CJZdvzoNyGq2c/HWOXJGsvVg+RA/k2MC/wN6I2YA2Pt8GkAAAAASUVORK5CYII=\") !important;\n}\n#toast-container > .toast-success {\n  background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAADsSURBVEhLY2AYBfQMgf///3P8+/evAIgvA/FsIF+BavYDDWMBGroaSMMBiE8VC7AZDrIFaMFnii3AZTjUgsUUWUDA8OdAH6iQbQEhw4HyGsPEcKBXBIC4ARhex4G4BsjmweU1soIFaGg/WtoFZRIZdEvIMhxkCCjXIVsATV6gFGACs4Rsw0EGgIIH3QJYJgHSARQZDrWAB+jawzgs+Q2UO49D7jnRSRGoEFRILcdmEMWGI0cm0JJ2QpYA1RDvcmzJEWhABhD/pqrL0S0CWuABKgnRki9lLseS7g2AlqwHWQSKH4oKLrILpRGhEQCw2LiRUIa4lwAAAABJRU5ErkJggg==\") !important;\n}\n#toast-container > .toast-warning {\n  background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAGYSURBVEhL5ZSvTsNQFMbXZGICMYGYmJhAQIJAICYQPAACiSDB8AiICQQJT4CqQEwgJvYASAQCiZiYmJhAIBATCARJy+9rTsldd8sKu1M0+dLb057v6/lbq/2rK0mS/TRNj9cWNAKPYIJII7gIxCcQ51cvqID+GIEX8ASG4B1bK5gIZFeQfoJdEXOfgX4QAQg7kH2A65yQ87lyxb27sggkAzAuFhbbg1K2kgCkB1bVwyIR9m2L7PRPIhDUIXgGtyKw575yz3lTNs6X4JXnjV+LKM/m3MydnTbtOKIjtz6VhCBq4vSm3ncdrD2lk0VgUXSVKjVDJXJzijW1RQdsU7F77He8u68koNZTz8Oz5yGa6J3H3lZ0xYgXBK2QymlWWA+RWnYhskLBv2vmE+hBMCtbA7KX5drWyRT/2JsqZ2IvfB9Y4bWDNMFbJRFmC9E74SoS0CqulwjkC0+5bpcV1CZ8NMej4pjy0U+doDQsGyo1hzVJttIjhQ7GnBtRFN1UarUlH8F3xict+HY07rEzoUGPlWcjRFRr4/gChZgc3ZL2d8oAAAAASUVORK5CYII=\") !important;\n}\n#toast-container.toast-top-center > div,\n#toast-container.toast-bottom-center > div {\n  width: 300px;\n  margin-left: auto;\n  margin-right: auto;\n}\n#toast-container.toast-top-full-width > div,\n#toast-container.toast-bottom-full-width > div {\n  width: 96%;\n  margin-left: auto;\n  margin-right: auto;\n}\n.toast {\n  background-color: #030303;\n}\n.toast-success {\n  background-color: #51A351;\n}\n.toast-error {\n  background-color: #BD362F;\n}\n.toast-info {\n  background-color: #2F96B4;\n}\n.toast-warning {\n  background-color: #F89406;\n}\n.toast-progress {\n  position: absolute;\n  left: 0;\n  bottom: 0;\n  height: 4px;\n  background-color: #000000;\n  opacity: 0.4;\n  -ms-filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=40);\n  filter: alpha(opacity=40);\n}\n/*Responsive Design*/\n@media all and (max-width: 240px) {\n  #toast-container > div {\n    padding: 8px 8px 8px 50px;\n    width: 11em;\n  }\n  #toast-container .toast-close-button {\n    right: -0.2em;\n    top: -0.2em;\n  }\n}\n@media all and (min-width: 241px) and (max-width: 480px) {\n  #toast-container > div {\n    padding: 8px 8px 8px 50px;\n    width: 18em;\n  }\n  #toast-container .toast-close-button {\n    right: -0.2em;\n    top: -0.2em;\n  }\n}\n@media all and (min-width: 481px) and (max-width: 768px) {\n  #toast-container > div {\n    padding: 15px 15px 15px 50px;\n    width: 25em;\n  }\n}\n/*\n * based off of https://github.com/gitterHQ/sidecar\n * license: MIT\n */\n.map-aside {\n  width: 500px;\n  z-index: 20000;\n  position: fixed;\n  top: 0;\n  bottom: 0;\n  right: 0;\n  display: -webkit-flex;\n  display: flex;\n  -webkit-flex-direction: row;\n  flex-direction: row;\n  background-color: #ffffff;\n  border-left: 1px solid #ddd;\n  box-shadow: -12px 0 18px 0 rgba(50, 50, 50, 0.1);\n  transition: transform 0.3s cubic-bezier(0.16, 0.22, 0.22, 1.7);\n  /* Add some \"extension\" so that there isn't a gap\n     * when we translate(via animation) more than 100% */\n}\n.map-aside.is-collapsed:not(.is-loading) {\n  -webkit-transform: translateX(110%);\n  transform: translateX(110%);\n}\n.map-aside:after {\n  content: '';\n  z-index: -1;\n  position: absolute;\n  top: 0;\n  left: 100%;\n  bottom: 0;\n  right: -100%;\n  background-color: #ffffff;\n}\n.map-aside iframe {\n  width: 100%;\n  height: 100%;\n}\n.map-aside-action-bar {\n  position: absolute;\n  top: 0;\n  right: 0;\n  display: -webkit-flex;\n  display: flex;\n  justify-content: flex-end;\n  padding-bottom: 5px;\n  padding-right: 10px;\n  padding-top: 5px;\n  z-index: 100;\n}\n.map-fixed-header {\n  position: fixed;\n  background: white;\n  padding-top: 5px;\n  width: 100%;\n  z-index: 1;\n  left: 0;\n  top: 0;\n}\n@media (max-width: 720px) {\n  .map-fixed-header {\n    padding-top: 30px;\n  }\n}\n.map-fixed-header p {\n  margin: 5px 0 20px;\n}\n@media (max-width: 720px) {\n  .map-fixed-header p {\n    margin-bottom: 10px;\n  }\n}\n.map-fixed-header hr {\n  margin: 30px 0;\n}\n@media (max-width: 720px) {\n  .map-fixed-header hr {\n    margin: 25px 0;\n  }\n}\n.map-fixed-header .flashMessage {\n  position: fixed;\n  margin: 0 auto;\n  z-index: 2;\n  top: 160px;\n  width: 100%;\n}\n.map-buttons {\n  margin-top: -10px;\n}\n.map-buttons button,\n.map-buttons .input-group {\n  width: 300px;\n}\n.map-buttons .input-group {\n  margin-top: 15px;\n  margin-left: auto;\n  margin-right: auto;\n}\n#map-filter {\n  background: #fff;\n  border-color: darkgreen;\n}\n.input-group-addon {\n  width: 40px;\n  color: darkgreen;\n  background: #fff;\n  border-color: darkgreen;\n}\n.input-group-addon.filled {\n  background: darkgreen;\n  border-color: #000d00;\n  color: #fff;\n  cursor: pointer;\n}\n.input-group-addon .fa {\n  position: absolute;\n  top: 50%;\n  -webkit-transform: translateY(-50%);\n  transform: translateY(-50%);\n  right: 10px;\n}\n.mapWrapper {\n  position: absolute;\n  display: block;\n  height: 100%;\n  width: 100%;\n}\n.map-accordion {\n  width: 700px;\n  margin: 155px auto 0;\n  position: relative;\n}\n.map-accordion #nested {\n  margin: 0 10px;\n}\n@media (max-width: 400px) {\n  .map-accordion #nested {\n    margin: 0;\n  }\n}\n.map-accordion a:focus {\n  text-decoration: none;\n  color: darkgreen;\n}\n.map-accordion a:focus:hover {\n  text-decoration: underline;\n  color: #001800;\n}\n.map-accordion h2 > a {\n  width: 100%;\n  display: block;\n  background: #efefef;\n  padding: 10px 0;\n  padding-left: 50px;\n  padding-right: 20px;\n}\n.map-accordion h3 {\n  margin: 15px 0;\n  padding: 0;\n}\n.map-accordion h3:first-child {\n  margin-top: 25px;\n}\n.map-accordion h3 > a {\n  padding-left: 40px;\n  padding-bottom: 10px;\n  display: block;\n  max-width: 535px;\n}\n.map-accordion div.chapterBlock :before {\n  margin-right: 15px;\n}\n.map-accordion div.chapterBlock p {\n  text-indent: -15px;\n  margin-left: 60px;\n  padding-right: 20px;\n}\n@media (max-width: 400px) {\n  .map-accordion div.chapterBlock p {\n    margin-left: 30px;\n  }\n}\n.map-accordion .challengeBlockDescription {\n  margin: 0;\n  margin-top: -10px;\n  padding: 0 15px 23px 30px;\n}\n.map-accordion span.no-link-underline {\n  position: absolute;\n  margin-left: -30px;\n  color: #666;\n}\n.map-accordion div > div:last-child {\n  margin-bottom: 30px;\n}\n.challengeBlockTime {\n  font-size: 18px;\n  color: #BBBBBB;\n  display: block;\n  margin-left: 40px;\n  margin-bottom: 20px;\n}\n@media (min-width: 721px) {\n  .challengeBlockTime {\n    margin-right: 20px;\n    margin-top: -30px;\n    float: right;\n  }\n}\n@media (max-width: 720px) {\n  .map-accordion {\n    left: 0;\n    right: 0;\n    width: 100%;\n    top: 195px;\n    bottom: 0;\n    margin: 0;\n    position: absolute;\n    overflow-x: hidden;\n    overflow-y: auto;\n    -webkit-overflow-scrolling: touch;\n  }\n  .map-accordion h2 {\n    margin: 15px 0;\n    padding: 0;\n  }\n  .map-accordion h2:first-of-type {\n    margin-top: 0;\n  }\n  .map-accordion h2 > a {\n    padding: 10px 0;\n    padding-left: 50px;\n    padding-right: 20px;\n    font-size: 20px;\n  }\n  .map-accordion h3 {\n    margin: 10px 0;\n    padding: 0;\n  }\n  .map-accordion h3 > a {\n    clear: both;\n    font-size: 20px;\n  }\n}\n.map-aside-action-item {\n  display: -webkit-flex;\n  display: flex;\n  /* main axis */\n  justify-content: center;\n  /* cross axis */\n  align-items: center;\n  width: 40px;\n  height: 40px;\n  padding-left: 0;\n  padding-right: 0;\n  opacity: 0.65;\n  background: none;\n  background-position: center center;\n  background-repeat: no-repeat;\n  background-size: 22px 22px;\n  border: 0;\n  outline: none;\n  cursor: pointer;\n  cursor: hand;\n  transition: all 0.2s ease;\n}\n.map-aside-action-item:hover,\n.map-aside-action-item:focus {\n  opacity: 1;\n}\n.map-aside-action-item:active {\n  filter: hue-rotate(80deg) saturate(150);\n}\n#noneFound {\n  display: none;\n  margin: 60px 30px 0;\n  font-size: 30px;\n  text-align: center;\n  color: darkgreen;\n}\n#noneFound .fa {\n  display: block;\n  font-size: 300px;\n}\n.map-aside-action-pop-out {\n  margin-right: -4px;\n  background-image: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMDAgMTcxLjQyOSIgZmlsbD0iIzNhMzEzMyI+PHBhdGggZD0iTTE1Ny4xNDMsMTAzLjU3MXYzNS43MTRjMCw4Ljg1NC0zLjE0NCwxNi40MjYtOS40MzEsMjIuNzEzcy0xMy44NTgsOS40MzEtMjIuNzEyLDkuNDMxSDMyLjE0MyBjLTguODU0LDAtMTYuNDI1LTMuMTQ0LTIyLjcxMi05LjQzMVMwLDE0OC4xNCwwLDEzOS4yODVWNDYuNDI5YzAtOC44NTQsMy4xNDQtMTYuNDI1LDkuNDMxLTIyLjcxMiBjNi4yODctNi4yODcsMTMuODU4LTkuNDMxLDIyLjcxMi05LjQzMWg3OC41NzJjMS4wNDEsMCwxLjg5NiwwLjMzNSwyLjU2NiwxLjAwNGMwLjY3LDAuNjcsMS4wMDQsMS41MjUsMS4wMDQsMi41NjdWMjUgYzAsMS4wNDItMC4zMzQsMS44OTctMS4wMDQsMi41NjdjLTAuNjcsMC42Ny0xLjUyNSwxLjAwNC0yLjU2NiwxLjAwNEgzMi4xNDNjLTQuOTExLDAtOS4xMTUsMS43NDktMTIuNjEyLDUuMjQ2IHMtNS4yNDYsNy43MDEtNS4yNDYsMTIuNjEydjkyLjg1NmMwLDQuOTExLDEuNzQ5LDkuMTE1LDUuMjQ2LDEyLjYxMnM3LjcwMSw1LjI0NSwxMi42MTIsNS4yNDVIMTI1YzQuOTEsMCw5LjExNS0xLjc0OCwxMi42MTEtNS4yNDUgYzMuNDk3LTMuNDk3LDUuMjQ2LTcuNzAxLDUuMjQ2LTEyLjYxMnYtMzUuNzE0YzAtMS4wNDIsMC4zMzQtMS44OTcsMS4wMDQtMi41NjdjMC42Ny0wLjY2OSwxLjUyNS0xLjAwNCwyLjU2Ny0xLjAwNGg3LjE0MyBjMS4wNDIsMCwxLjg5NywwLjMzNSwyLjU2NywxLjAwNEMxNTYuODA5LDEwMS42NzQsMTU3LjE0MywxMDIuNTI5LDE1Ny4xNDMsMTAzLjU3MXogTTIwMCw3LjE0M3Y1Ny4xNDMgYzAsMS45MzUtMC43MDcsMy42MDktMi4xMjEsNS4wMjJjLTEuNDEzLDEuNDE0LTMuMDg4LDIuMTIxLTUuMDIxLDIuMTIxYy0xLjkzNSwwLTMuNjA5LTAuNzA3LTUuMDIyLTIuMTIxbC0xOS42NDQtMTkuNjQzIGwtNzIuNzY3LDcyLjc2OWMtMC43NDQsMC43NDQtMS42LDEuMTE1LTIuNTY3LDEuMTE1cy0xLjgyMy0wLjM3MS0yLjU2Ny0xLjExNUw3Ny41NjcsMTA5LjcxYy0wLjc0NC0wLjc0NC0xLjExNi0xLjYtMS4xMTYtMi41NjcgYzAtMC45NjcsMC4zNzItMS44MjIsMS4xMTYtMi41NjZsNzIuNzY4LTcyLjc2OGwtMTkuNjQ0LTE5LjY0M2MtMS40MTMtMS40MTQtMi4xMi0zLjA4OC0yLjEyLTUuMDIyYzAtMS45MzUsMC43MDctMy42MDksMi4xMi01LjAyMiBDMTMyLjEwNSwwLjcwNywxMzMuNzc5LDAsMTM1LjcxNSwwaDU3LjE0M2MxLjkzNCwwLDMuNjA4LDAuNzA3LDUuMDIxLDIuMTIxQzE5OS4yOTMsMy41MzQsMjAwLDUuMjA4LDIwMCw3LjE0M3oiLz48L3N2Zz4=);\n}\n.map-aside-action-collapse {\n  background-image: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAxNzEuNDI5IDE3MS40MjkiIGZpbGw9IiMzYTMxMzMiPjxwYXRoIGQ9Ik0xMjIuNDMzLDEwNi4xMzhsLTE2LjI5NSwxNi4yOTVjLTAuNzQ0LDAuNzQ0LTEuNiwxLjExNi0yLjU2NiwxLjExNmMtMC45NjgsMC0xLjgyMy0wLjM3Mi0yLjU2Ny0xLjExNmwtMTUuMjktMTUuMjkgbC0xNS4yOSwxNS4yOWMtMC43NDQsMC43NDQtMS42LDEuMTE2LTIuNTY3LDEuMTE2cy0xLjgyMy0wLjM3Mi0yLjU2Ny0xLjExNmwtMTYuMjk0LTE2LjI5NWMtMC43NDQtMC43NDQtMS4xMTYtMS42LTEuMTE2LTIuNTY2IGMwLTAuOTY4LDAuMzcyLTEuODIzLDEuMTE2LTIuNTY3bDE1LjI5LTE1LjI5bC0xNS4yOS0xNS4yOWMtMC43NDQtMC43NDQtMS4xMTYtMS42LTEuMTE2LTIuNTY3czAuMzcyLTEuODIzLDEuMTE2LTIuNTY3IEw2NS4yOSw0OC45OTZjMC43NDQtMC43NDQsMS42LTEuMTE2LDIuNTY3LTEuMTE2czEuODIzLDAuMzcyLDIuNTY3LDEuMTE2bDE1LjI5LDE1LjI5bDE1LjI5LTE1LjI5IGMwLjc0NC0wLjc0NCwxLjYtMS4xMTYsMi41NjctMS4xMTZjMC45NjcsMCwxLjgyMiwwLjM3MiwyLjU2NiwxLjExNmwxNi4yOTUsMTYuMjk0YzAuNzQ0LDAuNzQ0LDEuMTE2LDEuNiwxLjExNiwyLjU2NyBzLTAuMzcyLDEuODIzLTEuMTE2LDIuNTY3bC0xNS4yOSwxNS4yOWwxNS4yOSwxNS4yOWMwLjc0NCwwLjc0NCwxLjExNiwxLjYsMS4xMTYsMi41NjcgQzEyMy41NDksMTA0LjUzOSwxMjMuMTc3LDEwNS4zOTQsMTIyLjQzMywxMDYuMTM4eiBNMTQ2LjQyOSw4NS43MTRjMC0xMS4wMTItMi43MTctMjEuMTY4LTguMTQ4LTMwLjQ2OSBzLTEyLjc5Ny0xNi42NjctMjIuMDk4LTIyLjA5OFM5Ni43MjYsMjUsODUuNzE0LDI1cy0yMS4xNjgsMi43MTYtMzAuNDY5LDguMTQ3UzM4LjU3OSw0NS45NDUsMzMuMTQ3LDU1LjI0NlMyNSw3NC43MDMsMjUsODUuNzE0IHMyLjcxNiwyMS4xNjgsOC4xNDcsMzAuNDY5czEyLjc5NywxNi42NjYsMjIuMDk4LDIyLjA5OHMxOS40NTcsOC4xNDgsMzAuNDY5LDguMTQ4czIxLjE2OC0yLjcxNywzMC40NjktOC4xNDggczE2LjY2Ni0xMi43OTcsMjIuMDk4LTIyLjA5OFMxNDYuNDI5LDk2LjcyNiwxNDYuNDI5LDg1LjcxNHogTTE3MS40MjksODUuNzE0YzAsMTUuNTUxLTMuODMyLDI5Ljg5My0xMS40OTYsNDMuMDI0IGMtNy42NjQsMTMuMTMzLTE4LjA2MiwyMy41My0zMS4xOTQsMzEuMTk0Yy0xMy4xMzIsNy42NjQtMjcuNDc0LDExLjQ5Ni00My4wMjQsMTEuNDk2cy0yOS44OTItMy44MzItNDMuMDI0LTExLjQ5NiBjLTEzLjEzMy03LjY2NC0yMy41MzEtMTguMDYyLTMxLjE5NC0zMS4xOTRDMy44MzIsMTE1LjYwNywwLDEwMS4yNjUsMCw4NS43MTRTMy44MzIsNTUuODIyLDExLjQ5Niw0Mi42OSBjNy42NjQtMTMuMTMzLDE4LjA2Mi0yMy41MzEsMzEuMTk0LTMxLjE5NEM1NS44MjIsMy44MzIsNzAuMTY0LDAsODUuNzE0LDBzMjkuODkzLDMuODMyLDQzLjAyNCwxMS40OTYgYzEzLjEzMyw3LjY2NCwyMy41MywxOC4wNjIsMzEuMTk0LDMxLjE5NEMxNjcuNTk3LDU1LjgyMiwxNzEuNDI5LDcwLjE2NCwxNzEuNDI5LDg1LjcxNHoiLz48L3N2Zz4=);\n}\n/*\n * based off of https://github.com/gitterHQ/sidecar\n * license: MIT\n */\n#wikiFrame {\n  width: 100%;\n  height: 100%;\n  top: 0;\n  bottom: 0;\n  position: absolute;\n  overflow: hidden;\n}\n.wiki-aside {\n  width: 500px;\n  z-index: 20000;\n  position: fixed;\n  top: 0;\n  bottom: 0;\n  right: 0;\n  display: -webkit-flex;\n  display: flex;\n  -webkit-flex-direction: row;\n  flex-direction: row;\n  background-color: #ffffff;\n  border-left: 1px solid #ddd;\n  box-shadow: -12px 0 18px 0 rgba(50, 50, 50, 0.1);\n  transition: transform 0.3s cubic-bezier(0.16, 0.22, 0.22, 1.7);\n  /* Add some \"extension\" so that there isn't a gap\n     * when we translate(via animation) more than 100% */\n}\n.wiki-aside.is-collapsed:not(.is-loading) {\n  -webkit-transform: translateX(110%);\n  transform: translateX(110%);\n}\n.wiki-aside:after {\n  content: '';\n  z-index: -1;\n  position: absolute;\n  top: 0;\n  left: 100%;\n  bottom: 0;\n  right: -100%;\n  background-color: #ffffff;\n}\n.wiki-aside iframe {\n  width: 100%;\n  height: 100%;\n  top: 0;\n  bottom: 0;\n  position: absolute;\n  overflow: hidden;\n}\n.wiki-aside .wiki-header {\n  display: none;\n}\n.wiki-aside .wiki-container {\n  padding-top: 10px;\n}\n.wiki-aside .wikiSelector {\n  top: 50px;\n}\n.wiki-aside-action-bar {\n  position: absolute;\n  top: 0;\n  right: 15px;\n  display: -webkit-flex;\n  display: flex;\n  justify-content: flex-end;\n  padding-bottom: 5px;\n  padding-right: 0px;\n  padding-top: 5px;\n  z-index: 100;\n}\n.wiki-fixed-header {\n  position: fixed;\n  background: white;\n  padding-top: 5px;\n  width: 100%;\n  z-index: 1;\n  left: 0;\n  top: 0;\n}\n@media (max-width: 720px) {\n  .wiki-fixed-header {\n    padding-top: 30px;\n  }\n}\n.wiki-fixed-header p {\n  margin: 5px 0 20px;\n}\n@media (max-width: 720px) {\n  .wiki-fixed-header p {\n    margin-bottom: 10px;\n  }\n}\n.wiki-fixed-header hr {\n  margin: 30px 0;\n}\n@media (max-width: 720px) {\n  .wiki-fixed-header hr {\n    margin: 25px 0;\n  }\n}\n.wiki-buttons {\n  margin-top: -10px;\n}\n.wiki-buttons button,\n.wiki-buttons .input-group {\n  width: 300px;\n}\n.wiki-buttons .input-group {\n  margin-top: 15px;\n  margin-left: auto;\n  margin-right: auto;\n}\n#wiki-filter {\n  background: #fff;\n  border-color: darkgreen;\n}\n.wiki-aside-action-item {\n  display: -webkit-flex;\n  display: flex;\n  /* main axis */\n  justify-content: center;\n  /* cross axis */\n  align-items: center;\n  width: 40px;\n  height: 40px;\n  padding-left: 0;\n  padding-right: 0;\n  opacity: 0.65;\n  background: none;\n  background-position: center center;\n  background-repeat: no-repeat;\n  background-size: 22px 22px;\n  border: 0;\n  outline: none;\n  cursor: pointer;\n  cursor: hand;\n  transition: all 0.2s ease;\n}\n.wiki-aside-action-item:hover,\n.wiki-aside-action-item:focus {\n  opacity: 1;\n}\n.wiki-aside-action-item:active {\n  filter: hue-rotate(80deg) saturate(150);\n}\n.wiki-aside-action-pop-out {\n  margin-right: -4px;\n  background-image: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMDAgMTcxLjQyOSIgZmlsbD0iIzNhMzEzMyI+PHBhdGggZD0iTTE1Ny4xNDMsMTAzLjU3MXYzNS43MTRjMCw4Ljg1NC0zLjE0NCwxNi40MjYtOS40MzEsMjIuNzEzcy0xMy44NTgsOS40MzEtMjIuNzEyLDkuNDMxSDMyLjE0MyBjLTguODU0LDAtMTYuNDI1LTMuMTQ0LTIyLjcxMi05LjQzMVMwLDE0OC4xNCwwLDEzOS4yODVWNDYuNDI5YzAtOC44NTQsMy4xNDQtMTYuNDI1LDkuNDMxLTIyLjcxMiBjNi4yODctNi4yODcsMTMuODU4LTkuNDMxLDIyLjcxMi05LjQzMWg3OC41NzJjMS4wNDEsMCwxLjg5NiwwLjMzNSwyLjU2NiwxLjAwNGMwLjY3LDAuNjcsMS4wMDQsMS41MjUsMS4wMDQsMi41NjdWMjUgYzAsMS4wNDItMC4zMzQsMS44OTctMS4wMDQsMi41NjdjLTAuNjcsMC42Ny0xLjUyNSwxLjAwNC0yLjU2NiwxLjAwNEgzMi4xNDNjLTQuOTExLDAtOS4xMTUsMS43NDktMTIuNjEyLDUuMjQ2IHMtNS4yNDYsNy43MDEtNS4yNDYsMTIuNjEydjkyLjg1NmMwLDQuOTExLDEuNzQ5LDkuMTE1LDUuMjQ2LDEyLjYxMnM3LjcwMSw1LjI0NSwxMi42MTIsNS4yNDVIMTI1YzQuOTEsMCw5LjExNS0xLjc0OCwxMi42MTEtNS4yNDUgYzMuNDk3LTMuNDk3LDUuMjQ2LTcuNzAxLDUuMjQ2LTEyLjYxMnYtMzUuNzE0YzAtMS4wNDIsMC4zMzQtMS44OTcsMS4wMDQtMi41NjdjMC42Ny0wLjY2OSwxLjUyNS0xLjAwNCwyLjU2Ny0xLjAwNGg3LjE0MyBjMS4wNDIsMCwxLjg5NywwLjMzNSwyLjU2NywxLjAwNEMxNTYuODA5LDEwMS42NzQsMTU3LjE0MywxMDIuNTI5LDE1Ny4xNDMsMTAzLjU3MXogTTIwMCw3LjE0M3Y1Ny4xNDMgYzAsMS45MzUtMC43MDcsMy42MDktMi4xMjEsNS4wMjJjLTEuNDEzLDEuNDE0LTMuMDg4LDIuMTIxLTUuMDIxLDIuMTIxYy0xLjkzNSwwLTMuNjA5LTAuNzA3LTUuMDIyLTIuMTIxbC0xOS42NDQtMTkuNjQzIGwtNzIuNzY3LDcyLjc2OWMtMC43NDQsMC43NDQtMS42LDEuMTE1LTIuNTY3LDEuMTE1cy0xLjgyMy0wLjM3MS0yLjU2Ny0xLjExNUw3Ny41NjcsMTA5LjcxYy0wLjc0NC0wLjc0NC0xLjExNi0xLjYtMS4xMTYtMi41NjcgYzAtMC45NjcsMC4zNzItMS44MjIsMS4xMTYtMi41NjZsNzIuNzY4LTcyLjc2OGwtMTkuNjQ0LTE5LjY0M2MtMS40MTMtMS40MTQtMi4xMi0zLjA4OC0yLjEyLTUuMDIyYzAtMS45MzUsMC43MDctMy42MDksMi4xMi01LjAyMiBDMTMyLjEwNSwwLjcwNywxMzMuNzc5LDAsMTM1LjcxNSwwaDU3LjE0M2MxLjkzNCwwLDMuNjA4LDAuNzA3LDUuMDIxLDIuMTIxQzE5OS4yOTMsMy41MzQsMjAwLDUuMjA4LDIwMCw3LjE0M3oiLz48L3N2Zz4=);\n}\n.wiki-aside-action-collapse {\n  background-image: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAxNzEuNDI5IDE3MS40MjkiIGZpbGw9IiMzYTMxMzMiPjxwYXRoIGQ9Ik0xMjIuNDMzLDEwNi4xMzhsLTE2LjI5NSwxNi4yOTVjLTAuNzQ0LDAuNzQ0LTEuNiwxLjExNi0yLjU2NiwxLjExNmMtMC45NjgsMC0xLjgyMy0wLjM3Mi0yLjU2Ny0xLjExNmwtMTUuMjktMTUuMjkgbC0xNS4yOSwxNS4yOWMtMC43NDQsMC43NDQtMS42LDEuMTE2LTIuNTY3LDEuMTE2cy0xLjgyMy0wLjM3Mi0yLjU2Ny0xLjExNmwtMTYuMjk0LTE2LjI5NWMtMC43NDQtMC43NDQtMS4xMTYtMS42LTEuMTE2LTIuNTY2IGMwLTAuOTY4LDAuMzcyLTEuODIzLDEuMTE2LTIuNTY3bDE1LjI5LTE1LjI5bC0xNS4yOS0xNS4yOWMtMC43NDQtMC43NDQtMS4xMTYtMS42LTEuMTE2LTIuNTY3czAuMzcyLTEuODIzLDEuMTE2LTIuNTY3IEw2NS4yOSw0OC45OTZjMC43NDQtMC43NDQsMS42LTEuMTE2LDIuNTY3LTEuMTE2czEuODIzLDAuMzcyLDIuNTY3LDEuMTE2bDE1LjI5LDE1LjI5bDE1LjI5LTE1LjI5IGMwLjc0NC0wLjc0NCwxLjYtMS4xMTYsMi41NjctMS4xMTZjMC45NjcsMCwxLjgyMiwwLjM3MiwyLjU2NiwxLjExNmwxNi4yOTUsMTYuMjk0YzAuNzQ0LDAuNzQ0LDEuMTE2LDEuNiwxLjExNiwyLjU2NyBzLTAuMzcyLDEuODIzLTEuMTE2LDIuNTY3bC0xNS4yOSwxNS4yOWwxNS4yOSwxNS4yOWMwLjc0NCwwLjc0NCwxLjExNiwxLjYsMS4xMTYsMi41NjcgQzEyMy41NDksMTA0LjUzOSwxMjMuMTc3LDEwNS4zOTQsMTIyLjQzMywxMDYuMTM4eiBNMTQ2LjQyOSw4NS43MTRjMC0xMS4wMTItMi43MTctMjEuMTY4LTguMTQ4LTMwLjQ2OSBzLTEyLjc5Ny0xNi42NjctMjIuMDk4LTIyLjA5OFM5Ni43MjYsMjUsODUuNzE0LDI1cy0yMS4xNjgsMi43MTYtMzAuNDY5LDguMTQ3UzM4LjU3OSw0NS45NDUsMzMuMTQ3LDU1LjI0NlMyNSw3NC43MDMsMjUsODUuNzE0IHMyLjcxNiwyMS4xNjgsOC4xNDcsMzAuNDY5czEyLjc5NywxNi42NjYsMjIuMDk4LDIyLjA5OHMxOS40NTcsOC4xNDgsMzAuNDY5LDguMTQ4czIxLjE2OC0yLjcxNywzMC40NjktOC4xNDggczE2LjY2Ni0xMi43OTcsMjIuMDk4LTIyLjA5OFMxNDYuNDI5LDk2LjcyNiwxNDYuNDI5LDg1LjcxNHogTTE3MS40MjksODUuNzE0YzAsMTUuNTUxLTMuODMyLDI5Ljg5My0xMS40OTYsNDMuMDI0IGMtNy42NjQsMTMuMTMzLTE4LjA2MiwyMy41My0zMS4xOTQsMzEuMTk0Yy0xMy4xMzIsNy42NjQtMjcuNDc0LDExLjQ5Ni00My4wMjQsMTEuNDk2cy0yOS44OTItMy44MzItNDMuMDI0LTExLjQ5NiBjLTEzLjEzMy03LjY2NC0yMy41MzEtMTguMDYyLTMxLjE5NC0zMS4xOTRDMy44MzIsMTE1LjYwNywwLDEwMS4yNjUsMCw4NS43MTRTMy44MzIsNTUuODIyLDExLjQ5Niw0Mi42OSBjNy42NjQtMTMuMTMzLDE4LjA2Mi0yMy41MzEsMzEuMTk0LTMxLjE5NEM1NS44MjIsMy44MzIsNzAuMTY0LDAsODUuNzE0LDBzMjkuODkzLDMuODMyLDQzLjAyNCwxMS40OTYgYzEzLjEzMyw3LjY2NCwyMy41MywxOC4wNjIsMzEuMTk0LDMxLjE5NEMxNjcuNTk3LDU1LjgyMiwxNzEuNDI5LDcwLjE2NCwxNzEuNDI5LDg1LjcxNHoiLz48L3N2Zz4=);\n}\n"
  },
  {
    "path": "public/css/main-ec0d2f5228.css",
    "content": "@charset \"UTF-8\";\n/*! normalize.css v3.0.2 | MIT License | git.io/normalize */\nhtml {\n  font-family: sans-serif;\n  -ms-text-size-adjust: 100%;\n  -webkit-text-size-adjust: 100%;\n}\nbody {\n  margin: 0;\n}\narticle,\naside,\ndetails,\nfigcaption,\nfigure,\nfooter,\nheader,\nhgroup,\nmain,\nmenu,\nnav,\nsection,\nsummary {\n  display: block;\n}\naudio,\ncanvas,\nprogress,\nvideo {\n  display: inline-block;\n  vertical-align: baseline;\n}\naudio:not([controls]) {\n  display: none;\n  height: 0;\n}\n[hidden],\ntemplate {\n  display: none;\n}\na {\n  background-color: transparent;\n}\na:active,\na:hover {\n  outline: 0;\n}\nabbr[title] {\n  border-bottom: 1px dotted;\n}\nb,\nstrong {\n  font-weight: bold;\n}\ndfn {\n  font-style: italic;\n}\nh1 {\n  font-size: 2em;\n  margin: 0.67em 0;\n}\nmark {\n  background: #ff0;\n  color: #000;\n}\nsmall {\n  font-size: 80%;\n}\nsub,\nsup {\n  font-size: 75%;\n  line-height: 0;\n  position: relative;\n  vertical-align: baseline;\n}\nsup {\n  top: -0.5em;\n}\nsub {\n  bottom: -0.25em;\n}\nimg {\n  border: 0;\n}\nsvg:not(:root) {\n  overflow: hidden;\n}\nfigure {\n  margin: 1em 40px;\n}\nhr {\n  -moz-box-sizing: content-box;\n  box-sizing: content-box;\n  height: 0;\n}\npre {\n  overflow: auto;\n}\ncode,\nkbd,\npre,\nsamp {\n  font-family: monospace, monospace;\n  font-size: 1em;\n}\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n  color: inherit;\n  font: inherit;\n  margin: 0;\n}\nbutton {\n  overflow: visible;\n}\nbutton,\nselect {\n  text-transform: none;\n}\nbutton,\nhtml input[type=\"button\"],\ninput[type=\"reset\"],\ninput[type=\"submit\"] {\n  -webkit-appearance: button;\n  cursor: pointer;\n}\nbutton[disabled],\nhtml input[disabled] {\n  cursor: default;\n}\nbutton::-moz-focus-inner,\ninput::-moz-focus-inner {\n  border: 0;\n  padding: 0;\n}\ninput {\n  line-height: normal;\n}\ninput[type=\"checkbox\"],\ninput[type=\"radio\"] {\n  box-sizing: border-box;\n  padding: 0;\n}\ninput[type=\"number\"]::-webkit-inner-spin-button,\ninput[type=\"number\"]::-webkit-outer-spin-button {\n  height: auto;\n}\ninput[type=\"search\"] {\n  -webkit-appearance: textfield;\n  -moz-box-sizing: content-box;\n  -webkit-box-sizing: content-box;\n  box-sizing: content-box;\n}\ninput[type=\"search\"]::-webkit-search-cancel-button,\ninput[type=\"search\"]::-webkit-search-decoration {\n  -webkit-appearance: none;\n}\nfieldset {\n  border: 1px solid #c0c0c0;\n  margin: 0 2px;\n  padding: 0.35em 0.625em 0.75em;\n}\nlegend {\n  border: 0;\n  padding: 0;\n}\ntextarea {\n  overflow: auto;\n}\noptgroup {\n  font-weight: bold;\n}\ntable {\n  border-collapse: collapse;\n  border-spacing: 0;\n}\ntd,\nth {\n  padding: 0;\n}\n/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */\n@media print {\n  *,\n  *:before,\n  *:after {\n    background: transparent !important;\n    color: #000 !important;\n    box-shadow: none !important;\n    text-shadow: none !important;\n  }\n  a,\n  a:visited {\n    text-decoration: underline;\n  }\n  a[href]:after {\n    content: \" (\" attr(href) \")\";\n  }\n  abbr[title]:after {\n    content: \" (\" attr(title) \")\";\n  }\n  a[href^=\"#\"]:after,\n  a[href^=\"javascript:\"]:after {\n    content: \"\";\n  }\n  pre,\n  blockquote {\n    border: 1px solid #999;\n    page-break-inside: avoid;\n  }\n  thead {\n    display: table-header-group;\n  }\n  tr,\n  img {\n    page-break-inside: avoid;\n  }\n  img {\n    max-width: 100% !important;\n  }\n  p,\n  h2,\n  h3 {\n    orphans: 3;\n    widows: 3;\n  }\n  h2,\n  h3 {\n    page-break-after: avoid;\n  }\n  select {\n    background: #fff !important;\n  }\n  .navbar {\n    display: none;\n  }\n  .btn > .caret,\n  .dropup > .btn > .caret {\n    border-top-color: #000 !important;\n  }\n  .label {\n    border: 1px solid #000;\n  }\n  .table {\n    border-collapse: collapse !important;\n  }\n  .table td,\n  .table th {\n    background-color: #fff !important;\n  }\n  .table-bordered th,\n  .table-bordered td {\n    border: 1px solid #ddd !important;\n  }\n}\n@font-face {\n  font-family: 'Glyphicons Halflings';\n  src: url('../fonts/glyphicons-halflings-regular.eot');\n  src: url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'), url('../fonts/glyphicons-halflings-regular.woff') format('woff'), url('../fonts/glyphicons-halflings-regular.ttf') format('truetype'), url('../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular') format('svg');\n}\n.glyphicon {\n  position: relative;\n  top: 1px;\n  display: inline-block;\n  font-family: 'Glyphicons Halflings';\n  font-style: normal;\n  font-weight: normal;\n  line-height: 1;\n  -webkit-font-smoothing: antialiased;\n  -moz-osx-font-smoothing: grayscale;\n}\n.glyphicon-asterisk:before {\n  content: \"\\2a\";\n}\n.glyphicon-plus:before {\n  content: \"\\2b\";\n}\n.glyphicon-euro:before,\n.glyphicon-eur:before {\n  content: \"\\20ac\";\n}\n.glyphicon-minus:before {\n  content: \"\\2212\";\n}\n.glyphicon-cloud:before {\n  content: \"\\2601\";\n}\n.glyphicon-envelope:before {\n  content: \"\\2709\";\n}\n.glyphicon-pencil:before {\n  content: \"\\270f\";\n}\n.glyphicon-glass:before {\n  content: \"\\e001\";\n}\n.glyphicon-music:before {\n  content: \"\\e002\";\n}\n.glyphicon-search:before {\n  content: \"\\e003\";\n}\n.glyphicon-heart:before {\n  content: \"\\e005\";\n}\n.glyphicon-star:before {\n  content: \"\\e006\";\n}\n.glyphicon-star-empty:before {\n  content: \"\\e007\";\n}\n.glyphicon-user:before {\n  content: \"\\e008\";\n}\n.glyphicon-film:before {\n  content: \"\\e009\";\n}\n.glyphicon-th-large:before {\n  content: \"\\e010\";\n}\n.glyphicon-th:before {\n  content: \"\\e011\";\n}\n.glyphicon-th-list:before {\n  content: \"\\e012\";\n}\n.glyphicon-ok:before {\n  content: \"\\e013\";\n}\n.glyphicon-remove:before {\n  content: \"\\e014\";\n}\n.glyphicon-zoom-in:before {\n  content: \"\\e015\";\n}\n.glyphicon-zoom-out:before {\n  content: \"\\e016\";\n}\n.glyphicon-off:before {\n  content: \"\\e017\";\n}\n.glyphicon-signal:before {\n  content: \"\\e018\";\n}\n.glyphicon-cog:before {\n  content: \"\\e019\";\n}\n.glyphicon-trash:before {\n  content: \"\\e020\";\n}\n.glyphicon-home:before {\n  content: \"\\e021\";\n}\n.glyphicon-file:before {\n  content: \"\\e022\";\n}\n.glyphicon-time:before {\n  content: \"\\e023\";\n}\n.glyphicon-road:before {\n  content: \"\\e024\";\n}\n.glyphicon-download-alt:before {\n  content: \"\\e025\";\n}\n.glyphicon-download:before {\n  content: \"\\e026\";\n}\n.glyphicon-upload:before {\n  content: \"\\e027\";\n}\n.glyphicon-inbox:before {\n  content: \"\\e028\";\n}\n.glyphicon-play-circle:before {\n  content: \"\\e029\";\n}\n.glyphicon-repeat:before {\n  content: \"\\e030\";\n}\n.glyphicon-refresh:before {\n  content: \"\\e031\";\n}\n.glyphicon-list-alt:before {\n  content: \"\\e032\";\n}\n.glyphicon-lock:before {\n  content: \"\\e033\";\n}\n.glyphicon-flag:before {\n  content: \"\\e034\";\n}\n.glyphicon-headphones:before {\n  content: \"\\e035\";\n}\n.glyphicon-volume-off:before {\n  content: \"\\e036\";\n}\n.glyphicon-volume-down:before {\n  content: \"\\e037\";\n}\n.glyphicon-volume-up:before {\n  content: \"\\e038\";\n}\n.glyphicon-qrcode:before {\n  content: \"\\e039\";\n}\n.glyphicon-barcode:before {\n  content: \"\\e040\";\n}\n.glyphicon-tag:before {\n  content: \"\\e041\";\n}\n.glyphicon-tags:before {\n  content: \"\\e042\";\n}\n.glyphicon-book:before {\n  content: \"\\e043\";\n}\n.glyphicon-bookmark:before {\n  content: \"\\e044\";\n}\n.glyphicon-print:before {\n  content: \"\\e045\";\n}\n.glyphicon-camera:before {\n  content: \"\\e046\";\n}\n.glyphicon-font:before {\n  content: \"\\e047\";\n}\n.glyphicon-bold:before {\n  content: \"\\e048\";\n}\n.glyphicon-italic:before {\n  content: \"\\e049\";\n}\n.glyphicon-text-height:before {\n  content: \"\\e050\";\n}\n.glyphicon-text-width:before {\n  content: \"\\e051\";\n}\n.glyphicon-align-left:before {\n  content: \"\\e052\";\n}\n.glyphicon-align-center:before {\n  content: \"\\e053\";\n}\n.glyphicon-align-right:before {\n  content: \"\\e054\";\n}\n.glyphicon-align-justify:before {\n  content: \"\\e055\";\n}\n.glyphicon-list:before {\n  content: \"\\e056\";\n}\n.glyphicon-indent-left:before {\n  content: \"\\e057\";\n}\n.glyphicon-indent-right:before {\n  content: \"\\e058\";\n}\n.glyphicon-facetime-video:before {\n  content: \"\\e059\";\n}\n.glyphicon-picture:before {\n  content: \"\\e060\";\n}\n.glyphicon-map-marker:before {\n  content: \"\\e062\";\n}\n.glyphicon-adjust:before {\n  content: \"\\e063\";\n}\n.glyphicon-tint:before {\n  content: \"\\e064\";\n}\n.glyphicon-edit:before {\n  content: \"\\e065\";\n}\n.glyphicon-share:before {\n  content: \"\\e066\";\n}\n.glyphicon-check:before {\n  content: \"\\e067\";\n}\n.glyphicon-move:before {\n  content: \"\\e068\";\n}\n.glyphicon-step-backward:before {\n  content: \"\\e069\";\n}\n.glyphicon-fast-backward:before {\n  content: \"\\e070\";\n}\n.glyphicon-backward:before {\n  content: \"\\e071\";\n}\n.glyphicon-play:before {\n  content: \"\\e072\";\n}\n.glyphicon-pause:before {\n  content: \"\\e073\";\n}\n.glyphicon-stop:before {\n  content: \"\\e074\";\n}\n.glyphicon-forward:before {\n  content: \"\\e075\";\n}\n.glyphicon-fast-forward:before {\n  content: \"\\e076\";\n}\n.glyphicon-step-forward:before {\n  content: \"\\e077\";\n}\n.glyphicon-eject:before {\n  content: \"\\e078\";\n}\n.glyphicon-chevron-left:before {\n  content: \"\\e079\";\n}\n.glyphicon-chevron-right:before {\n  content: \"\\e080\";\n}\n.glyphicon-plus-sign:before {\n  content: \"\\e081\";\n}\n.glyphicon-minus-sign:before {\n  content: \"\\e082\";\n}\n.glyphicon-remove-sign:before {\n  content: \"\\e083\";\n}\n.glyphicon-ok-sign:before {\n  content: \"\\e084\";\n}\n.glyphicon-question-sign:before {\n  content: \"\\e085\";\n}\n.glyphicon-info-sign:before {\n  content: \"\\e086\";\n}\n.glyphicon-screenshot:before {\n  content: \"\\e087\";\n}\n.glyphicon-remove-circle:before {\n  content: \"\\e088\";\n}\n.glyphicon-ok-circle:before {\n  content: \"\\e089\";\n}\n.glyphicon-ban-circle:before {\n  content: \"\\e090\";\n}\n.glyphicon-arrow-left:before {\n  content: \"\\e091\";\n}\n.glyphicon-arrow-right:before {\n  content: \"\\e092\";\n}\n.glyphicon-arrow-up:before {\n  content: \"\\e093\";\n}\n.glyphicon-arrow-down:before {\n  content: \"\\e094\";\n}\n.glyphicon-share-alt:before {\n  content: \"\\e095\";\n}\n.glyphicon-resize-full:before {\n  content: \"\\e096\";\n}\n.glyphicon-resize-small:before {\n  content: \"\\e097\";\n}\n.glyphicon-exclamation-sign:before {\n  content: \"\\e101\";\n}\n.glyphicon-gift:before {\n  content: \"\\e102\";\n}\n.glyphicon-leaf:before {\n  content: \"\\e103\";\n}\n.glyphicon-fire:before {\n  content: \"\\e104\";\n}\n.glyphicon-eye-open:before {\n  content: \"\\e105\";\n}\n.glyphicon-eye-close:before {\n  content: \"\\e106\";\n}\n.glyphicon-warning-sign:before {\n  content: \"\\e107\";\n}\n.glyphicon-plane:before {\n  content: \"\\e108\";\n}\n.glyphicon-calendar:before {\n  content: \"\\e109\";\n}\n.glyphicon-random:before {\n  content: \"\\e110\";\n}\n.glyphicon-comment:before {\n  content: \"\\e111\";\n}\n.glyphicon-magnet:before {\n  content: \"\\e112\";\n}\n.glyphicon-chevron-up:before {\n  content: \"\\e113\";\n}\n.glyphicon-chevron-down:before {\n  content: \"\\e114\";\n}\n.glyphicon-retweet:before {\n  content: \"\\e115\";\n}\n.glyphicon-shopping-cart:before {\n  content: \"\\e116\";\n}\n.glyphicon-folder-close:before {\n  content: \"\\e117\";\n}\n.glyphicon-folder-open:before {\n  content: \"\\e118\";\n}\n.glyphicon-resize-vertical:before {\n  content: \"\\e119\";\n}\n.glyphicon-resize-horizontal:before {\n  content: \"\\e120\";\n}\n.glyphicon-hdd:before {\n  content: \"\\e121\";\n}\n.glyphicon-bullhorn:before {\n  content: \"\\e122\";\n}\n.glyphicon-bell:before {\n  content: \"\\e123\";\n}\n.glyphicon-certificate:before {\n  content: \"\\e124\";\n}\n.glyphicon-thumbs-up:before {\n  content: \"\\e125\";\n}\n.glyphicon-thumbs-down:before {\n  content: \"\\e126\";\n}\n.glyphicon-hand-right:before {\n  content: \"\\e127\";\n}\n.glyphicon-hand-left:before {\n  content: \"\\e128\";\n}\n.glyphicon-hand-up:before {\n  content: \"\\e129\";\n}\n.glyphicon-hand-down:before {\n  content: \"\\e130\";\n}\n.glyphicon-circle-arrow-right:before {\n  content: \"\\e131\";\n}\n.glyphicon-circle-arrow-left:before {\n  content: \"\\e132\";\n}\n.glyphicon-circle-arrow-up:before {\n  content: \"\\e133\";\n}\n.glyphicon-circle-arrow-down:before {\n  content: \"\\e134\";\n}\n.glyphicon-globe:before {\n  content: \"\\e135\";\n}\n.glyphicon-wrench:before {\n  content: \"\\e136\";\n}\n.glyphicon-tasks:before {\n  content: \"\\e137\";\n}\n.glyphicon-filter:before {\n  content: \"\\e138\";\n}\n.glyphicon-briefcase:before {\n  content: \"\\e139\";\n}\n.glyphicon-fullscreen:before {\n  content: \"\\e140\";\n}\n.glyphicon-dashboard:before {\n  content: \"\\e141\";\n}\n.glyphicon-paperclip:before {\n  content: \"\\e142\";\n}\n.glyphicon-heart-empty:before {\n  content: \"\\e143\";\n}\n.glyphicon-link:before {\n  content: \"\\e144\";\n}\n.glyphicon-phone:before {\n  content: \"\\e145\";\n}\n.glyphicon-pushpin:before {\n  content: \"\\e146\";\n}\n.glyphicon-usd:before {\n  content: \"\\e148\";\n}\n.glyphicon-gbp:before {\n  content: \"\\e149\";\n}\n.glyphicon-sort:before {\n  content: \"\\e150\";\n}\n.glyphicon-sort-by-alphabet:before {\n  content: \"\\e151\";\n}\n.glyphicon-sort-by-alphabet-alt:before {\n  content: \"\\e152\";\n}\n.glyphicon-sort-by-order:before {\n  content: \"\\e153\";\n}\n.glyphicon-sort-by-order-alt:before {\n  content: \"\\e154\";\n}\n.glyphicon-sort-by-attributes:before {\n  content: \"\\e155\";\n}\n.glyphicon-sort-by-attributes-alt:before {\n  content: \"\\e156\";\n}\n.glyphicon-unchecked:before {\n  content: \"\\e157\";\n}\n.glyphicon-expand:before {\n  content: \"\\e158\";\n}\n.glyphicon-collapse-down:before {\n  content: \"\\e159\";\n}\n.glyphicon-collapse-up:before {\n  content: \"\\e160\";\n}\n.glyphicon-log-in:before {\n  content: \"\\e161\";\n}\n.glyphicon-flash:before {\n  content: \"\\e162\";\n}\n.glyphicon-log-out:before {\n  content: \"\\e163\";\n}\n.glyphicon-new-window:before {\n  content: \"\\e164\";\n}\n.glyphicon-record:before {\n  content: \"\\e165\";\n}\n.glyphicon-save:before {\n  content: \"\\e166\";\n}\n.glyphicon-open:before {\n  content: \"\\e167\";\n}\n.glyphicon-saved:before {\n  content: \"\\e168\";\n}\n.glyphicon-import:before {\n  content: \"\\e169\";\n}\n.glyphicon-export:before {\n  content: \"\\e170\";\n}\n.glyphicon-send:before {\n  content: \"\\e171\";\n}\n.glyphicon-floppy-disk:before {\n  content: \"\\e172\";\n}\n.glyphicon-floppy-saved:before {\n  content: \"\\e173\";\n}\n.glyphicon-floppy-remove:before {\n  content: \"\\e174\";\n}\n.glyphicon-floppy-save:before {\n  content: \"\\e175\";\n}\n.glyphicon-floppy-open:before {\n  content: \"\\e176\";\n}\n.glyphicon-credit-card:before {\n  content: \"\\e177\";\n}\n.glyphicon-transfer:before {\n  content: \"\\e178\";\n}\n.glyphicon-cutlery:before {\n  content: \"\\e179\";\n}\n.glyphicon-header:before {\n  content: \"\\e180\";\n}\n.glyphicon-compressed:before {\n  content: \"\\e181\";\n}\n.glyphicon-earphone:before {\n  content: \"\\e182\";\n}\n.glyphicon-phone-alt:before {\n  content: \"\\e183\";\n}\n.glyphicon-tower:before {\n  content: \"\\e184\";\n}\n.glyphicon-stats:before {\n  content: \"\\e185\";\n}\n.glyphicon-sd-video:before {\n  content: \"\\e186\";\n}\n.glyphicon-hd-video:before {\n  content: \"\\e187\";\n}\n.glyphicon-subtitles:before {\n  content: \"\\e188\";\n}\n.glyphicon-sound-stereo:before {\n  content: \"\\e189\";\n}\n.glyphicon-sound-dolby:before {\n  content: \"\\e190\";\n}\n.glyphicon-sound-5-1:before {\n  content: \"\\e191\";\n}\n.glyphicon-sound-6-1:before {\n  content: \"\\e192\";\n}\n.glyphicon-sound-7-1:before {\n  content: \"\\e193\";\n}\n.glyphicon-copyright-mark:before {\n  content: \"\\e194\";\n}\n.glyphicon-registration-mark:before {\n  content: \"\\e195\";\n}\n.glyphicon-cloud-download:before {\n  content: \"\\e197\";\n}\n.glyphicon-cloud-upload:before {\n  content: \"\\e198\";\n}\n.glyphicon-tree-conifer:before {\n  content: \"\\e199\";\n}\n.glyphicon-tree-deciduous:before {\n  content: \"\\e200\";\n}\n* {\n  -webkit-box-sizing: border-box;\n  -moz-box-sizing: border-box;\n  box-sizing: border-box;\n}\n*:before,\n*:after {\n  -webkit-box-sizing: border-box;\n  -moz-box-sizing: border-box;\n  box-sizing: border-box;\n}\nhtml {\n  font-size: 10px;\n  -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n}\nbody {\n  font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n  font-size: 14px;\n  line-height: 1.42857143;\n  color: #333333;\n  background-color: #ffffff;\n}\ninput,\nbutton,\nselect,\ntextarea {\n  font-family: inherit;\n  font-size: inherit;\n  line-height: inherit;\n}\na {\n  color: #4CAF50;\n  text-decoration: none;\n}\na:hover,\na:focus {\n  color: #357a38;\n  text-decoration: underline;\n}\na:focus {\n  outline: thin dotted;\n  outline: 5px auto -webkit-focus-ring-color;\n  outline-offset: -2px;\n}\nfigure {\n  margin: 0;\n}\nimg {\n  vertical-align: middle;\n}\n.img-responsive,\n.thumbnail > img,\n.thumbnail a > img,\n.carousel-inner > .item > img,\n.carousel-inner > .item > a > img {\n  display: block;\n  max-width: 100%;\n  height: auto;\n}\n.img-rounded {\n  border-radius: 6px;\n}\n.img-thumbnail {\n  padding: 4px;\n  line-height: 1.42857143;\n  background-color: #ffffff;\n  border: 1px solid #ddd;\n  border-radius: 4px;\n  -webkit-transition: all 0.2s ease-in-out;\n  -o-transition: all 0.2s ease-in-out;\n  transition: all 0.2s ease-in-out;\n  display: inline-block;\n  max-width: 100%;\n  height: auto;\n}\n.img-circle {\n  border-radius: 50%;\n}\nhr {\n  margin-top: 20px;\n  margin-bottom: 20px;\n  border: 0;\n  border-top: 1px solid #eeeeee;\n}\n.sr-only {\n  position: absolute;\n  width: 1px;\n  height: 1px;\n  margin: -1px;\n  padding: 0;\n  overflow: hidden;\n  clip: rect(0, 0, 0, 0);\n  border: 0;\n}\n.sr-only-focusable:active,\n.sr-only-focusable:focus {\n  position: static;\n  width: auto;\n  height: auto;\n  margin: 0;\n  overflow: visible;\n  clip: auto;\n}\nh1,\nh2,\nh3,\nh4,\nh5,\nh6,\n.h1,\n.h2,\n.h3,\n.h4,\n.h5,\n.h6 {\n  font-family: inherit;\n  font-weight: 500;\n  line-height: 1.1;\n  color: inherit;\n}\nh1 small,\nh2 small,\nh3 small,\nh4 small,\nh5 small,\nh6 small,\n.h1 small,\n.h2 small,\n.h3 small,\n.h4 small,\n.h5 small,\n.h6 small,\nh1 .small,\nh2 .small,\nh3 .small,\nh4 .small,\nh5 .small,\nh6 .small,\n.h1 .small,\n.h2 .small,\n.h3 .small,\n.h4 .small,\n.h5 .small,\n.h6 .small {\n  font-weight: normal;\n  line-height: 1;\n  color: #777777;\n}\nh1,\n.h1,\nh2,\n.h2,\nh3,\n.h3 {\n  margin-top: 20px;\n  margin-bottom: 10px;\n}\nh1 small,\n.h1 small,\nh2 small,\n.h2 small,\nh3 small,\n.h3 small,\nh1 .small,\n.h1 .small,\nh2 .small,\n.h2 .small,\nh3 .small,\n.h3 .small {\n  font-size: 65%;\n}\nh4,\n.h4,\nh5,\n.h5,\nh6,\n.h6 {\n  margin-top: 10px;\n  margin-bottom: 10px;\n}\nh4 small,\n.h4 small,\nh5 small,\n.h5 small,\nh6 small,\n.h6 small,\nh4 .small,\n.h4 .small,\nh5 .small,\n.h5 .small,\nh6 .small,\n.h6 .small {\n  font-size: 75%;\n}\nh1,\n.h1 {\n  font-size: 36px;\n}\nh2,\n.h2 {\n  font-size: 30px;\n}\nh3,\n.h3 {\n  font-size: 24px;\n}\nh4,\n.h4 {\n  font-size: 18px;\n}\nh5,\n.h5 {\n  font-size: 14px;\n}\nh6,\n.h6 {\n  font-size: 12px;\n}\np {\n  margin: 0 0 10px;\n}\n.lead {\n  margin-bottom: 20px;\n  font-size: 16px;\n  font-weight: 300;\n  line-height: 1.4;\n}\n@media (min-width: 768px) {\n  .lead {\n    font-size: 21px;\n  }\n}\nsmall,\n.small {\n  font-size: 85%;\n}\nmark,\n.mark {\n  background-color: #fcf8e3;\n  padding: .2em;\n}\n.text-left {\n  text-align: left;\n}\n.text-right {\n  text-align: right;\n}\n.text-center {\n  text-align: center;\n}\n.text-justify {\n  text-align: justify;\n}\n.text-nowrap {\n  white-space: nowrap;\n}\n.text-lowercase {\n  text-transform: lowercase;\n}\n.text-uppercase {\n  text-transform: uppercase;\n}\n.text-capitalize {\n  text-transform: capitalize;\n}\n.text-muted {\n  color: #777777;\n}\n.text-primary {\n  color: #4CAF50;\n}\na.text-primary:hover {\n  color: #3d8b40;\n}\n.text-success {\n  color: #215f1e;\n}\na.text-success:hover {\n  color: #143812;\n}\n.text-info {\n  color: #31708f;\n}\na.text-info:hover {\n  color: #245269;\n}\n.text-warning {\n  color: #8a6d3b;\n}\na.text-warning:hover {\n  color: #66512c;\n}\n.text-danger {\n  color: #a94442;\n}\na.text-danger:hover {\n  color: #843534;\n}\n.bg-primary {\n  color: #fff;\n  background-color: #4CAF50;\n}\na.bg-primary:hover {\n  background-color: #3d8b40;\n}\n.bg-success {\n  background-color: #dff0d8;\n}\na.bg-success:hover {\n  background-color: #c1e2b3;\n}\n.bg-info {\n  background-color: #d9edf7;\n}\na.bg-info:hover {\n  background-color: #afd9ee;\n}\n.bg-warning {\n  background-color: #fcf8e3;\n}\na.bg-warning:hover {\n  background-color: #f7ecb5;\n}\n.bg-danger {\n  background-color: #f2dede;\n}\na.bg-danger:hover {\n  background-color: #e4b9b9;\n}\n.page-header {\n  padding-bottom: 9px;\n  margin: 40px 0 20px;\n  border-bottom: 1px solid #eeeeee;\n}\nul,\nol {\n  margin-top: 0;\n  margin-bottom: 10px;\n}\nul ul,\nol ul,\nul ol,\nol ol {\n  margin-bottom: 0;\n}\n.list-unstyled {\n  padding-left: 0;\n  list-style: none;\n}\n.list-inline {\n  padding-left: 0;\n  list-style: none;\n  margin-left: -5px;\n}\n.list-inline > li {\n  display: inline-block;\n  padding-left: 5px;\n  padding-right: 5px;\n}\ndl {\n  margin-top: 0;\n  margin-bottom: 20px;\n}\ndt,\ndd {\n  line-height: 1.42857143;\n}\ndt {\n  font-weight: bold;\n}\ndd {\n  margin-left: 0;\n}\n@media (min-width: 768px) {\n  .dl-horizontal dt {\n    float: left;\n    width: 160px;\n    clear: left;\n    text-align: right;\n    overflow: hidden;\n    text-overflow: ellipsis;\n    white-space: nowrap;\n  }\n  .dl-horizontal dd {\n    margin-left: 180px;\n  }\n}\nabbr[title],\nabbr[data-original-title] {\n  cursor: help;\n  border-bottom: 1px dotted #777777;\n}\n.initialism {\n  font-size: 90%;\n  text-transform: uppercase;\n}\nblockquote {\n  padding: 10px 20px;\n  margin: 0 0 20px;\n  font-size: 17.5px;\n  border-left: 5px solid #eeeeee;\n}\nblockquote p:last-child,\nblockquote ul:last-child,\nblockquote ol:last-child {\n  margin-bottom: 0;\n}\nblockquote footer,\nblockquote small,\nblockquote .small {\n  display: block;\n  font-size: 80%;\n  line-height: 1.42857143;\n  color: #777777;\n}\nblockquote footer:before,\nblockquote small:before,\nblockquote .small:before {\n  content: '\\2014 \\00A0';\n}\n.blockquote-reverse,\nblockquote.pull-right {\n  padding-right: 15px;\n  padding-left: 0;\n  border-right: 5px solid #eeeeee;\n  border-left: 0;\n  text-align: right;\n}\n.blockquote-reverse footer:before,\nblockquote.pull-right footer:before,\n.blockquote-reverse small:before,\nblockquote.pull-right small:before,\n.blockquote-reverse .small:before,\nblockquote.pull-right .small:before {\n  content: '';\n}\n.blockquote-reverse footer:after,\nblockquote.pull-right footer:after,\n.blockquote-reverse small:after,\nblockquote.pull-right small:after,\n.blockquote-reverse .small:after,\nblockquote.pull-right .small:after {\n  content: '\\00A0 \\2014';\n}\naddress {\n  margin-bottom: 20px;\n  font-style: normal;\n  line-height: 1.42857143;\n}\ncode,\nkbd,\npre,\nsamp {\n  font-family: Menlo, Monaco, Consolas, \"Courier New\", monospace;\n}\ncode {\n  padding: 2px 4px;\n  font-size: 90%;\n  color: #c7254e;\n  background-color: #f9f2f4;\n  border-radius: 4px;\n}\nkbd {\n  padding: 2px 4px;\n  font-size: 90%;\n  color: #eeeeee;\n  background-color: #333;\n  border-radius: 3px;\n  box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.25);\n}\nkbd kbd {\n  padding: 0;\n  font-size: 100%;\n  font-weight: bold;\n  box-shadow: none;\n}\npre {\n  display: block;\n  padding: 9.5px;\n  margin: 0 0 10px;\n  font-size: 13px;\n  line-height: 1.42857143;\n  word-break: break-all;\n  word-wrap: break-word;\n  color: #333333;\n  background-color: #f5f5f5;\n  border: 1px solid #ccc;\n  border-radius: 4px;\n}\npre code {\n  padding: 0;\n  font-size: inherit;\n  color: inherit;\n  white-space: pre-wrap;\n  background-color: transparent;\n  border-radius: 0;\n}\n.pre-scrollable {\n  max-height: 340px;\n  overflow-y: scroll;\n}\n.container {\n  margin-right: auto;\n  margin-left: auto;\n  padding-left: 15px;\n  padding-right: 15px;\n}\n@media (min-width: 768px) {\n  .container {\n    width: 750px;\n  }\n}\n@media (min-width: 1031px) {\n  .container {\n    width: 970px;\n  }\n}\n@media (min-width: 1200px) {\n  .container {\n    width: 1170px;\n  }\n}\n.container-fluid {\n  margin-right: auto;\n  margin-left: auto;\n  padding-left: 15px;\n  padding-right: 15px;\n}\n.row {\n  margin-left: -15px;\n  margin-right: -15px;\n}\n.col-xs-1, .col-sm-1, .col-md-1, .col-lg-1, .col-xs-2, .col-sm-2, .col-md-2, .col-lg-2, .col-xs-3, .col-sm-3, .col-md-3, .col-lg-3, .col-xs-4, .col-sm-4, .col-md-4, .col-lg-4, .col-xs-5, .col-sm-5, .col-md-5, .col-lg-5, .col-xs-6, .col-sm-6, .col-md-6, .col-lg-6, .col-xs-7, .col-sm-7, .col-md-7, .col-lg-7, .col-xs-8, .col-sm-8, .col-md-8, .col-lg-8, .col-xs-9, .col-sm-9, .col-md-9, .col-lg-9, .col-xs-10, .col-sm-10, .col-md-10, .col-lg-10, .col-xs-11, .col-sm-11, .col-md-11, .col-lg-11, .col-xs-12, .col-sm-12, .col-md-12, .col-lg-12 {\n  position: relative;\n  min-height: 1px;\n  padding-left: 15px;\n  padding-right: 15px;\n}\n.col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12 {\n  float: left;\n}\n.col-xs-12 {\n  width: 100%;\n}\n.col-xs-11 {\n  width: 91.66666667%;\n}\n.col-xs-10 {\n  width: 83.33333333%;\n}\n.col-xs-9 {\n  width: 75%;\n}\n.col-xs-8 {\n  width: 66.66666667%;\n}\n.col-xs-7 {\n  width: 58.33333333%;\n}\n.col-xs-6 {\n  width: 50%;\n}\n.col-xs-5 {\n  width: 41.66666667%;\n}\n.col-xs-4 {\n  width: 33.33333333%;\n}\n.col-xs-3 {\n  width: 25%;\n}\n.col-xs-2 {\n  width: 16.66666667%;\n}\n.col-xs-1 {\n  width: 8.33333333%;\n}\n.col-xs-pull-12 {\n  right: 100%;\n}\n.col-xs-pull-11 {\n  right: 91.66666667%;\n}\n.col-xs-pull-10 {\n  right: 83.33333333%;\n}\n.col-xs-pull-9 {\n  right: 75%;\n}\n.col-xs-pull-8 {\n  right: 66.66666667%;\n}\n.col-xs-pull-7 {\n  right: 58.33333333%;\n}\n.col-xs-pull-6 {\n  right: 50%;\n}\n.col-xs-pull-5 {\n  right: 41.66666667%;\n}\n.col-xs-pull-4 {\n  right: 33.33333333%;\n}\n.col-xs-pull-3 {\n  right: 25%;\n}\n.col-xs-pull-2 {\n  right: 16.66666667%;\n}\n.col-xs-pull-1 {\n  right: 8.33333333%;\n}\n.col-xs-pull-0 {\n  right: auto;\n}\n.col-xs-push-12 {\n  left: 100%;\n}\n.col-xs-push-11 {\n  left: 91.66666667%;\n}\n.col-xs-push-10 {\n  left: 83.33333333%;\n}\n.col-xs-push-9 {\n  left: 75%;\n}\n.col-xs-push-8 {\n  left: 66.66666667%;\n}\n.col-xs-push-7 {\n  left: 58.33333333%;\n}\n.col-xs-push-6 {\n  left: 50%;\n}\n.col-xs-push-5 {\n  left: 41.66666667%;\n}\n.col-xs-push-4 {\n  left: 33.33333333%;\n}\n.col-xs-push-3 {\n  left: 25%;\n}\n.col-xs-push-2 {\n  left: 16.66666667%;\n}\n.col-xs-push-1 {\n  left: 8.33333333%;\n}\n.col-xs-push-0 {\n  left: auto;\n}\n.col-xs-offset-12 {\n  margin-left: 100%;\n}\n.col-xs-offset-11 {\n  margin-left: 91.66666667%;\n}\n.col-xs-offset-10 {\n  margin-left: 83.33333333%;\n}\n.col-xs-offset-9 {\n  margin-left: 75%;\n}\n.col-xs-offset-8 {\n  margin-left: 66.66666667%;\n}\n.col-xs-offset-7 {\n  margin-left: 58.33333333%;\n}\n.col-xs-offset-6 {\n  margin-left: 50%;\n}\n.col-xs-offset-5 {\n  margin-left: 41.66666667%;\n}\n.col-xs-offset-4 {\n  margin-left: 33.33333333%;\n}\n.col-xs-offset-3 {\n  margin-left: 25%;\n}\n.col-xs-offset-2 {\n  margin-left: 16.66666667%;\n}\n.col-xs-offset-1 {\n  margin-left: 8.33333333%;\n}\n.col-xs-offset-0 {\n  margin-left: 0%;\n}\n@media (min-width: 768px) {\n  .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12 {\n    float: left;\n  }\n  .col-sm-12 {\n    width: 100%;\n  }\n  .col-sm-11 {\n    width: 91.66666667%;\n  }\n  .col-sm-10 {\n    width: 83.33333333%;\n  }\n  .col-sm-9 {\n    width: 75%;\n  }\n  .col-sm-8 {\n    width: 66.66666667%;\n  }\n  .col-sm-7 {\n    width: 58.33333333%;\n  }\n  .col-sm-6 {\n    width: 50%;\n  }\n  .col-sm-5 {\n    width: 41.66666667%;\n  }\n  .col-sm-4 {\n    width: 33.33333333%;\n  }\n  .col-sm-3 {\n    width: 25%;\n  }\n  .col-sm-2 {\n    width: 16.66666667%;\n  }\n  .col-sm-1 {\n    width: 8.33333333%;\n  }\n  .col-sm-pull-12 {\n    right: 100%;\n  }\n  .col-sm-pull-11 {\n    right: 91.66666667%;\n  }\n  .col-sm-pull-10 {\n    right: 83.33333333%;\n  }\n  .col-sm-pull-9 {\n    right: 75%;\n  }\n  .col-sm-pull-8 {\n    right: 66.66666667%;\n  }\n  .col-sm-pull-7 {\n    right: 58.33333333%;\n  }\n  .col-sm-pull-6 {\n    right: 50%;\n  }\n  .col-sm-pull-5 {\n    right: 41.66666667%;\n  }\n  .col-sm-pull-4 {\n    right: 33.33333333%;\n  }\n  .col-sm-pull-3 {\n    right: 25%;\n  }\n  .col-sm-pull-2 {\n    right: 16.66666667%;\n  }\n  .col-sm-pull-1 {\n    right: 8.33333333%;\n  }\n  .col-sm-pull-0 {\n    right: auto;\n  }\n  .col-sm-push-12 {\n    left: 100%;\n  }\n  .col-sm-push-11 {\n    left: 91.66666667%;\n  }\n  .col-sm-push-10 {\n    left: 83.33333333%;\n  }\n  .col-sm-push-9 {\n    left: 75%;\n  }\n  .col-sm-push-8 {\n    left: 66.66666667%;\n  }\n  .col-sm-push-7 {\n    left: 58.33333333%;\n  }\n  .col-sm-push-6 {\n    left: 50%;\n  }\n  .col-sm-push-5 {\n    left: 41.66666667%;\n  }\n  .col-sm-push-4 {\n    left: 33.33333333%;\n  }\n  .col-sm-push-3 {\n    left: 25%;\n  }\n  .col-sm-push-2 {\n    left: 16.66666667%;\n  }\n  .col-sm-push-1 {\n    left: 8.33333333%;\n  }\n  .col-sm-push-0 {\n    left: auto;\n  }\n  .col-sm-offset-12 {\n    margin-left: 100%;\n  }\n  .col-sm-offset-11 {\n    margin-left: 91.66666667%;\n  }\n  .col-sm-offset-10 {\n    margin-left: 83.33333333%;\n  }\n  .col-sm-offset-9 {\n    margin-left: 75%;\n  }\n  .col-sm-offset-8 {\n    margin-left: 66.66666667%;\n  }\n  .col-sm-offset-7 {\n    margin-left: 58.33333333%;\n  }\n  .col-sm-offset-6 {\n    margin-left: 50%;\n  }\n  .col-sm-offset-5 {\n    margin-left: 41.66666667%;\n  }\n  .col-sm-offset-4 {\n    margin-left: 33.33333333%;\n  }\n  .col-sm-offset-3 {\n    margin-left: 25%;\n  }\n  .col-sm-offset-2 {\n    margin-left: 16.66666667%;\n  }\n  .col-sm-offset-1 {\n    margin-left: 8.33333333%;\n  }\n  .col-sm-offset-0 {\n    margin-left: 0%;\n  }\n}\n@media (min-width: 1031px) {\n  .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12 {\n    float: left;\n  }\n  .col-md-12 {\n    width: 100%;\n  }\n  .col-md-11 {\n    width: 91.66666667%;\n  }\n  .col-md-10 {\n    width: 83.33333333%;\n  }\n  .col-md-9 {\n    width: 75%;\n  }\n  .col-md-8 {\n    width: 66.66666667%;\n  }\n  .col-md-7 {\n    width: 58.33333333%;\n  }\n  .col-md-6 {\n    width: 50%;\n  }\n  .col-md-5 {\n    width: 41.66666667%;\n  }\n  .col-md-4 {\n    width: 33.33333333%;\n  }\n  .col-md-3 {\n    width: 25%;\n  }\n  .col-md-2 {\n    width: 16.66666667%;\n  }\n  .col-md-1 {\n    width: 8.33333333%;\n  }\n  .col-md-pull-12 {\n    right: 100%;\n  }\n  .col-md-pull-11 {\n    right: 91.66666667%;\n  }\n  .col-md-pull-10 {\n    right: 83.33333333%;\n  }\n  .col-md-pull-9 {\n    right: 75%;\n  }\n  .col-md-pull-8 {\n    right: 66.66666667%;\n  }\n  .col-md-pull-7 {\n    right: 58.33333333%;\n  }\n  .col-md-pull-6 {\n    right: 50%;\n  }\n  .col-md-pull-5 {\n    right: 41.66666667%;\n  }\n  .col-md-pull-4 {\n    right: 33.33333333%;\n  }\n  .col-md-pull-3 {\n    right: 25%;\n  }\n  .col-md-pull-2 {\n    right: 16.66666667%;\n  }\n  .col-md-pull-1 {\n    right: 8.33333333%;\n  }\n  .col-md-pull-0 {\n    right: auto;\n  }\n  .col-md-push-12 {\n    left: 100%;\n  }\n  .col-md-push-11 {\n    left: 91.66666667%;\n  }\n  .col-md-push-10 {\n    left: 83.33333333%;\n  }\n  .col-md-push-9 {\n    left: 75%;\n  }\n  .col-md-push-8 {\n    left: 66.66666667%;\n  }\n  .col-md-push-7 {\n    left: 58.33333333%;\n  }\n  .col-md-push-6 {\n    left: 50%;\n  }\n  .col-md-push-5 {\n    left: 41.66666667%;\n  }\n  .col-md-push-4 {\n    left: 33.33333333%;\n  }\n  .col-md-push-3 {\n    left: 25%;\n  }\n  .col-md-push-2 {\n    left: 16.66666667%;\n  }\n  .col-md-push-1 {\n    left: 8.33333333%;\n  }\n  .col-md-push-0 {\n    left: auto;\n  }\n  .col-md-offset-12 {\n    margin-left: 100%;\n  }\n  .col-md-offset-11 {\n    margin-left: 91.66666667%;\n  }\n  .col-md-offset-10 {\n    margin-left: 83.33333333%;\n  }\n  .col-md-offset-9 {\n    margin-left: 75%;\n  }\n  .col-md-offset-8 {\n    margin-left: 66.66666667%;\n  }\n  .col-md-offset-7 {\n    margin-left: 58.33333333%;\n  }\n  .col-md-offset-6 {\n    margin-left: 50%;\n  }\n  .col-md-offset-5 {\n    margin-left: 41.66666667%;\n  }\n  .col-md-offset-4 {\n    margin-left: 33.33333333%;\n  }\n  .col-md-offset-3 {\n    margin-left: 25%;\n  }\n  .col-md-offset-2 {\n    margin-left: 16.66666667%;\n  }\n  .col-md-offset-1 {\n    margin-left: 8.33333333%;\n  }\n  .col-md-offset-0 {\n    margin-left: 0%;\n  }\n}\n@media (min-width: 1200px) {\n  .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12 {\n    float: left;\n  }\n  .col-lg-12 {\n    width: 100%;\n  }\n  .col-lg-11 {\n    width: 91.66666667%;\n  }\n  .col-lg-10 {\n    width: 83.33333333%;\n  }\n  .col-lg-9 {\n    width: 75%;\n  }\n  .col-lg-8 {\n    width: 66.66666667%;\n  }\n  .col-lg-7 {\n    width: 58.33333333%;\n  }\n  .col-lg-6 {\n    width: 50%;\n  }\n  .col-lg-5 {\n    width: 41.66666667%;\n  }\n  .col-lg-4 {\n    width: 33.33333333%;\n  }\n  .col-lg-3 {\n    width: 25%;\n  }\n  .col-lg-2 {\n    width: 16.66666667%;\n  }\n  .col-lg-1 {\n    width: 8.33333333%;\n  }\n  .col-lg-pull-12 {\n    right: 100%;\n  }\n  .col-lg-pull-11 {\n    right: 91.66666667%;\n  }\n  .col-lg-pull-10 {\n    right: 83.33333333%;\n  }\n  .col-lg-pull-9 {\n    right: 75%;\n  }\n  .col-lg-pull-8 {\n    right: 66.66666667%;\n  }\n  .col-lg-pull-7 {\n    right: 58.33333333%;\n  }\n  .col-lg-pull-6 {\n    right: 50%;\n  }\n  .col-lg-pull-5 {\n    right: 41.66666667%;\n  }\n  .col-lg-pull-4 {\n    right: 33.33333333%;\n  }\n  .col-lg-pull-3 {\n    right: 25%;\n  }\n  .col-lg-pull-2 {\n    right: 16.66666667%;\n  }\n  .col-lg-pull-1 {\n    right: 8.33333333%;\n  }\n  .col-lg-pull-0 {\n    right: auto;\n  }\n  .col-lg-push-12 {\n    left: 100%;\n  }\n  .col-lg-push-11 {\n    left: 91.66666667%;\n  }\n  .col-lg-push-10 {\n    left: 83.33333333%;\n  }\n  .col-lg-push-9 {\n    left: 75%;\n  }\n  .col-lg-push-8 {\n    left: 66.66666667%;\n  }\n  .col-lg-push-7 {\n    left: 58.33333333%;\n  }\n  .col-lg-push-6 {\n    left: 50%;\n  }\n  .col-lg-push-5 {\n    left: 41.66666667%;\n  }\n  .col-lg-push-4 {\n    left: 33.33333333%;\n  }\n  .col-lg-push-3 {\n    left: 25%;\n  }\n  .col-lg-push-2 {\n    left: 16.66666667%;\n  }\n  .col-lg-push-1 {\n    left: 8.33333333%;\n  }\n  .col-lg-push-0 {\n    left: auto;\n  }\n  .col-lg-offset-12 {\n    margin-left: 100%;\n  }\n  .col-lg-offset-11 {\n    margin-left: 91.66666667%;\n  }\n  .col-lg-offset-10 {\n    margin-left: 83.33333333%;\n  }\n  .col-lg-offset-9 {\n    margin-left: 75%;\n  }\n  .col-lg-offset-8 {\n    margin-left: 66.66666667%;\n  }\n  .col-lg-offset-7 {\n    margin-left: 58.33333333%;\n  }\n  .col-lg-offset-6 {\n    margin-left: 50%;\n  }\n  .col-lg-offset-5 {\n    margin-left: 41.66666667%;\n  }\n  .col-lg-offset-4 {\n    margin-left: 33.33333333%;\n  }\n  .col-lg-offset-3 {\n    margin-left: 25%;\n  }\n  .col-lg-offset-2 {\n    margin-left: 16.66666667%;\n  }\n  .col-lg-offset-1 {\n    margin-left: 8.33333333%;\n  }\n  .col-lg-offset-0 {\n    margin-left: 0%;\n  }\n}\ntable {\n  background-color: transparent;\n}\ncaption {\n  padding-top: 8px;\n  padding-bottom: 8px;\n  color: #777777;\n  text-align: left;\n}\nth {\n  text-align: left;\n}\n.table {\n  width: 100%;\n  max-width: 100%;\n  margin-bottom: 20px;\n}\n.table > thead > tr > th,\n.table > tbody > tr > th,\n.table > tfoot > tr > th,\n.table > thead > tr > td,\n.table > tbody > tr > td,\n.table > tfoot > tr > td {\n  padding: 8px;\n  line-height: 1.42857143;\n  vertical-align: top;\n  border-top: 1px solid #ddd;\n}\n.table > thead > tr > th {\n  vertical-align: bottom;\n  border-bottom: 2px solid #ddd;\n}\n.table > caption + thead > tr:first-child > th,\n.table > colgroup + thead > tr:first-child > th,\n.table > thead:first-child > tr:first-child > th,\n.table > caption + thead > tr:first-child > td,\n.table > colgroup + thead > tr:first-child > td,\n.table > thead:first-child > tr:first-child > td {\n  border-top: 0;\n}\n.table > tbody + tbody {\n  border-top: 2px solid #ddd;\n}\n.table .table {\n  background-color: #ffffff;\n}\n.table-condensed > thead > tr > th,\n.table-condensed > tbody > tr > th,\n.table-condensed > tfoot > tr > th,\n.table-condensed > thead > tr > td,\n.table-condensed > tbody > tr > td,\n.table-condensed > tfoot > tr > td {\n  padding: 5px;\n}\n.table-bordered {\n  border: 1px solid #ddd;\n}\n.table-bordered > thead > tr > th,\n.table-bordered > tbody > tr > th,\n.table-bordered > tfoot > tr > th,\n.table-bordered > thead > tr > td,\n.table-bordered > tbody > tr > td,\n.table-bordered > tfoot > tr > td {\n  border: 1px solid #ddd;\n}\n.table-bordered > thead > tr > th,\n.table-bordered > thead > tr > td {\n  border-bottom-width: 2px;\n}\n.table-striped > tbody > tr:nth-child(odd) {\n  background-color: #f9f9f9;\n}\n.table-hover > tbody > tr:hover {\n  background-color: #f5f5f5;\n}\ntable col[class*=\"col-\"] {\n  position: static;\n  float: none;\n  display: table-column;\n}\ntable td[class*=\"col-\"],\ntable th[class*=\"col-\"] {\n  position: static;\n  float: none;\n  display: table-cell;\n}\n.table > thead > tr > td.active,\n.table > tbody > tr > td.active,\n.table > tfoot > tr > td.active,\n.table > thead > tr > th.active,\n.table > tbody > tr > th.active,\n.table > tfoot > tr > th.active,\n.table > thead > tr.active > td,\n.table > tbody > tr.active > td,\n.table > tfoot > tr.active > td,\n.table > thead > tr.active > th,\n.table > tbody > tr.active > th,\n.table > tfoot > tr.active > th {\n  background-color: #f5f5f5;\n}\n.table-hover > tbody > tr > td.active:hover,\n.table-hover > tbody > tr > th.active:hover,\n.table-hover > tbody > tr.active:hover > td,\n.table-hover > tbody > tr:hover > .active,\n.table-hover > tbody > tr.active:hover > th {\n  background-color: #e8e8e8;\n}\n.table > thead > tr > td.success,\n.table > tbody > tr > td.success,\n.table > tfoot > tr > td.success,\n.table > thead > tr > th.success,\n.table > tbody > tr > th.success,\n.table > tfoot > tr > th.success,\n.table > thead > tr.success > td,\n.table > tbody > tr.success > td,\n.table > tfoot > tr.success > td,\n.table > thead > tr.success > th,\n.table > tbody > tr.success > th,\n.table > tfoot > tr.success > th {\n  background-color: #dff0d8;\n}\n.table-hover > tbody > tr > td.success:hover,\n.table-hover > tbody > tr > th.success:hover,\n.table-hover > tbody > tr.success:hover > td,\n.table-hover > tbody > tr:hover > .success,\n.table-hover > tbody > tr.success:hover > th {\n  background-color: #d0e9c6;\n}\n.table > thead > tr > td.info,\n.table > tbody > tr > td.info,\n.table > tfoot > tr > td.info,\n.table > thead > tr > th.info,\n.table > tbody > tr > th.info,\n.table > tfoot > tr > th.info,\n.table > thead > tr.info > td,\n.table > tbody > tr.info > td,\n.table > tfoot > tr.info > td,\n.table > thead > tr.info > th,\n.table > tbody > tr.info > th,\n.table > tfoot > tr.info > th {\n  background-color: #d9edf7;\n}\n.table-hover > tbody > tr > td.info:hover,\n.table-hover > tbody > tr > th.info:hover,\n.table-hover > tbody > tr.info:hover > td,\n.table-hover > tbody > tr:hover > .info,\n.table-hover > tbody > tr.info:hover > th {\n  background-color: #c4e3f3;\n}\n.table > thead > tr > td.warning,\n.table > tbody > tr > td.warning,\n.table > tfoot > tr > td.warning,\n.table > thead > tr > th.warning,\n.table > tbody > tr > th.warning,\n.table > tfoot > tr > th.warning,\n.table > thead > tr.warning > td,\n.table > tbody > tr.warning > td,\n.table > tfoot > tr.warning > td,\n.table > thead > tr.warning > th,\n.table > tbody > tr.warning > th,\n.table > tfoot > tr.warning > th {\n  background-color: #fcf8e3;\n}\n.table-hover > tbody > tr > td.warning:hover,\n.table-hover > tbody > tr > th.warning:hover,\n.table-hover > tbody > tr.warning:hover > td,\n.table-hover > tbody > tr:hover > .warning,\n.table-hover > tbody > tr.warning:hover > th {\n  background-color: #faf2cc;\n}\n.table > thead > tr > td.danger,\n.table > tbody > tr > td.danger,\n.table > tfoot > tr > td.danger,\n.table > thead > tr > th.danger,\n.table > tbody > tr > th.danger,\n.table > tfoot > tr > th.danger,\n.table > thead > tr.danger > td,\n.table > tbody > tr.danger > td,\n.table > tfoot > tr.danger > td,\n.table > thead > tr.danger > th,\n.table > tbody > tr.danger > th,\n.table > tfoot > tr.danger > th {\n  background-color: #f2dede;\n}\n.table-hover > tbody > tr > td.danger:hover,\n.table-hover > tbody > tr > th.danger:hover,\n.table-hover > tbody > tr.danger:hover > td,\n.table-hover > tbody > tr:hover > .danger,\n.table-hover > tbody > tr.danger:hover > th {\n  background-color: #ebcccc;\n}\n.table-responsive {\n  overflow-x: auto;\n  min-height: 0.01%;\n}\n@media screen and (max-width: 767px) {\n  .table-responsive {\n    width: 100%;\n    margin-bottom: 15px;\n    overflow-y: hidden;\n    -ms-overflow-style: -ms-autohiding-scrollbar;\n    border: 1px solid #ddd;\n  }\n  .table-responsive > .table {\n    margin-bottom: 0;\n  }\n  .table-responsive > .table > thead > tr > th,\n  .table-responsive > .table > tbody > tr > th,\n  .table-responsive > .table > tfoot > tr > th,\n  .table-responsive > .table > thead > tr > td,\n  .table-responsive > .table > tbody > tr > td,\n  .table-responsive > .table > tfoot > tr > td {\n    white-space: nowrap;\n  }\n  .table-responsive > .table-bordered {\n    border: 0;\n  }\n  .table-responsive > .table-bordered > thead > tr > th:first-child,\n  .table-responsive > .table-bordered > tbody > tr > th:first-child,\n  .table-responsive > .table-bordered > tfoot > tr > th:first-child,\n  .table-responsive > .table-bordered > thead > tr > td:first-child,\n  .table-responsive > .table-bordered > tbody > tr > td:first-child,\n  .table-responsive > .table-bordered > tfoot > tr > td:first-child {\n    border-left: 0;\n  }\n  .table-responsive > .table-bordered > thead > tr > th:last-child,\n  .table-responsive > .table-bordered > tbody > tr > th:last-child,\n  .table-responsive > .table-bordered > tfoot > tr > th:last-child,\n  .table-responsive > .table-bordered > thead > tr > td:last-child,\n  .table-responsive > .table-bordered > tbody > tr > td:last-child,\n  .table-responsive > .table-bordered > tfoot > tr > td:last-child {\n    border-right: 0;\n  }\n  .table-responsive > .table-bordered > tbody > tr:last-child > th,\n  .table-responsive > .table-bordered > tfoot > tr:last-child > th,\n  .table-responsive > .table-bordered > tbody > tr:last-child > td,\n  .table-responsive > .table-bordered > tfoot > tr:last-child > td {\n    border-bottom: 0;\n  }\n}\nfieldset {\n  padding: 0;\n  margin: 0;\n  border: 0;\n  min-width: 0;\n}\nlegend {\n  display: block;\n  width: 100%;\n  padding: 0;\n  margin-bottom: 20px;\n  font-size: 21px;\n  line-height: inherit;\n  color: #333333;\n  border: 0;\n  border-bottom: 1px solid #e5e5e5;\n}\nlabel {\n  display: inline-block;\n  max-width: 100%;\n  margin-bottom: 5px;\n  font-weight: bold;\n}\ninput[type=\"search\"] {\n  -webkit-box-sizing: border-box;\n  -moz-box-sizing: border-box;\n  box-sizing: border-box;\n}\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n  margin: 4px 0 0;\n  margin-top: 1px \\9;\n  line-height: normal;\n}\ninput[type=\"file\"] {\n  display: block;\n}\ninput[type=\"range\"] {\n  display: block;\n  width: 100%;\n}\nselect[multiple],\nselect[size] {\n  height: auto;\n}\ninput[type=\"file\"]:focus,\ninput[type=\"radio\"]:focus,\ninput[type=\"checkbox\"]:focus {\n  outline: thin dotted;\n  outline: 5px auto -webkit-focus-ring-color;\n  outline-offset: -2px;\n}\noutput {\n  display: block;\n  padding-top: 7px;\n  font-size: 14px;\n  line-height: 1.42857143;\n  color: #555555;\n}\n.form-control {\n  display: block;\n  width: 100%;\n  height: 34px;\n  padding: 6px 12px;\n  font-size: 14px;\n  line-height: 1.42857143;\n  color: #555555;\n  background-color: #eeeeee;\n  background-image: none;\n  border: 1px solid #ccc;\n  border-radius: 4px;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n  -webkit-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;\n  -o-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;\n  transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;\n}\n.form-control:focus {\n  border-color: #66afe9;\n  outline: 0;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6);\n  box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6);\n}\n.form-control::-moz-placeholder {\n  color: #999;\n  opacity: 1;\n}\n.form-control:-ms-input-placeholder {\n  color: #999;\n}\n.form-control::-webkit-input-placeholder {\n  color: #999;\n}\n.form-control[disabled],\n.form-control[readonly],\nfieldset[disabled] .form-control {\n  cursor: not-allowed;\n  background-color: #eeeeee;\n  opacity: 1;\n}\ntextarea.form-control {\n  height: auto;\n}\ninput[type=\"search\"] {\n  -webkit-appearance: none;\n}\ninput[type=\"date\"],\ninput[type=\"time\"],\ninput[type=\"datetime-local\"],\ninput[type=\"month\"] {\n  line-height: 34px;\n  line-height: 1.42857143 \\0;\n}\ninput[type=\"date\"].input-sm,\ninput[type=\"time\"].input-sm,\ninput[type=\"datetime-local\"].input-sm,\ninput[type=\"month\"].input-sm {\n  line-height: 30px;\n  line-height: 1.5 \\0;\n}\ninput[type=\"date\"].input-lg,\ninput[type=\"time\"].input-lg,\ninput[type=\"datetime-local\"].input-lg,\ninput[type=\"month\"].input-lg {\n  line-height: 46px;\n  line-height: 1.33 \\0;\n}\n_:-ms-fullscreen,\n:root input[type=\"date\"],\n_:-ms-fullscreen,\n:root input[type=\"time\"],\n_:-ms-fullscreen,\n:root input[type=\"datetime-local\"],\n_:-ms-fullscreen,\n:root input[type=\"month\"] {\n  line-height: 1.42857143;\n}\n_:-ms-fullscreen.input-sm,\n:root input[type=\"date\"].input-sm,\n_:-ms-fullscreen.input-sm,\n:root input[type=\"time\"].input-sm,\n_:-ms-fullscreen.input-sm,\n:root input[type=\"datetime-local\"].input-sm,\n_:-ms-fullscreen.input-sm,\n:root input[type=\"month\"].input-sm {\n  line-height: 1.5;\n}\n_:-ms-fullscreen.input-lg,\n:root input[type=\"date\"].input-lg,\n_:-ms-fullscreen.input-lg,\n:root input[type=\"time\"].input-lg,\n_:-ms-fullscreen.input-lg,\n:root input[type=\"datetime-local\"].input-lg,\n_:-ms-fullscreen.input-lg,\n:root input[type=\"month\"].input-lg {\n  line-height: 1.33;\n}\n.form-group {\n  margin-bottom: 15px;\n}\n.radio,\n.checkbox {\n  position: relative;\n  display: block;\n  margin-top: 10px;\n  margin-bottom: 10px;\n}\n.radio label,\n.checkbox label {\n  min-height: 20px;\n  padding-left: 20px;\n  margin-bottom: 0;\n  font-weight: normal;\n  cursor: pointer;\n}\n.radio input[type=\"radio\"],\n.radio-inline input[type=\"radio\"],\n.checkbox input[type=\"checkbox\"],\n.checkbox-inline input[type=\"checkbox\"] {\n  position: absolute;\n  margin-left: -20px;\n  margin-top: 4px \\9;\n}\n.radio + .radio,\n.checkbox + .checkbox {\n  margin-top: -5px;\n}\n.radio-inline,\n.checkbox-inline {\n  display: inline-block;\n  padding-left: 20px;\n  margin-bottom: 0;\n  vertical-align: middle;\n  font-weight: normal;\n  cursor: pointer;\n}\n.radio-inline + .radio-inline,\n.checkbox-inline + .checkbox-inline {\n  margin-top: 0;\n  margin-left: 10px;\n}\ninput[type=\"radio\"][disabled],\ninput[type=\"checkbox\"][disabled],\ninput[type=\"radio\"].disabled,\ninput[type=\"checkbox\"].disabled,\nfieldset[disabled] input[type=\"radio\"],\nfieldset[disabled] input[type=\"checkbox\"] {\n  cursor: not-allowed;\n}\n.radio-inline.disabled,\n.checkbox-inline.disabled,\nfieldset[disabled] .radio-inline,\nfieldset[disabled] .checkbox-inline {\n  cursor: not-allowed;\n}\n.radio.disabled label,\n.checkbox.disabled label,\nfieldset[disabled] .radio label,\nfieldset[disabled] .checkbox label {\n  cursor: not-allowed;\n}\n.form-control-static {\n  padding-top: 7px;\n  padding-bottom: 7px;\n  margin-bottom: 0;\n}\n.form-control-static.input-lg,\n.form-control-static.input-sm {\n  padding-left: 0;\n  padding-right: 0;\n}\n.input-sm,\n.form-group-sm .form-control {\n  height: 30px;\n  padding: 5px 10px;\n  font-size: 12px;\n  line-height: 1.5;\n  border-radius: 3px;\n}\nselect.input-sm,\nselect.form-group-sm .form-control {\n  height: 30px;\n  line-height: 30px;\n}\ntextarea.input-sm,\ntextarea.form-group-sm .form-control,\nselect[multiple].input-sm,\nselect[multiple].form-group-sm .form-control {\n  height: auto;\n}\n.input-lg,\n.form-group-lg .form-control {\n  height: 46px;\n  padding: 10px 16px;\n  font-size: 18px;\n  line-height: 1.33;\n  border-radius: 6px;\n}\nselect.input-lg,\nselect.form-group-lg .form-control {\n  height: 46px;\n  line-height: 46px;\n}\ntextarea.input-lg,\ntextarea.form-group-lg .form-control,\nselect[multiple].input-lg,\nselect[multiple].form-group-lg .form-control {\n  height: auto;\n}\n.has-feedback {\n  position: relative;\n}\n.has-feedback .form-control {\n  padding-right: 42.5px;\n}\n.form-control-feedback {\n  position: absolute;\n  top: 0;\n  right: 0;\n  z-index: 2;\n  display: block;\n  width: 34px;\n  height: 34px;\n  line-height: 34px;\n  text-align: center;\n  pointer-events: none;\n}\n.input-lg + .form-control-feedback {\n  width: 46px;\n  height: 46px;\n  line-height: 46px;\n}\n.input-sm + .form-control-feedback {\n  width: 30px;\n  height: 30px;\n  line-height: 30px;\n}\n.has-success .help-block,\n.has-success .control-label,\n.has-success .radio,\n.has-success .checkbox,\n.has-success .radio-inline,\n.has-success .checkbox-inline,\n.has-success.radio label,\n.has-success.checkbox label,\n.has-success.radio-inline label,\n.has-success.checkbox-inline label {\n  color: #215f1e;\n}\n.has-success .form-control {\n  border-color: #215f1e;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n.has-success .form-control:focus {\n  border-color: #143812;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #3cad36;\n  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #3cad36;\n}\n.has-success .input-group-addon {\n  color: #215f1e;\n  border-color: #215f1e;\n  background-color: #dff0d8;\n}\n.has-success .form-control-feedback {\n  color: #215f1e;\n}\n.has-warning .help-block,\n.has-warning .control-label,\n.has-warning .radio,\n.has-warning .checkbox,\n.has-warning .radio-inline,\n.has-warning .checkbox-inline,\n.has-warning.radio label,\n.has-warning.checkbox label,\n.has-warning.radio-inline label,\n.has-warning.checkbox-inline label {\n  color: #8a6d3b;\n}\n.has-warning .form-control {\n  border-color: #8a6d3b;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n.has-warning .form-control:focus {\n  border-color: #66512c;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b;\n  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b;\n}\n.has-warning .input-group-addon {\n  color: #8a6d3b;\n  border-color: #8a6d3b;\n  background-color: #fcf8e3;\n}\n.has-warning .form-control-feedback {\n  color: #8a6d3b;\n}\n.has-error .help-block,\n.has-error .control-label,\n.has-error .radio,\n.has-error .checkbox,\n.has-error .radio-inline,\n.has-error .checkbox-inline,\n.has-error.radio label,\n.has-error.checkbox label,\n.has-error.radio-inline label,\n.has-error.checkbox-inline label {\n  color: #a94442;\n}\n.has-error .form-control {\n  border-color: #a94442;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n.has-error .form-control:focus {\n  border-color: #843534;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483;\n  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483;\n}\n.has-error .input-group-addon {\n  color: #a94442;\n  border-color: #a94442;\n  background-color: #f2dede;\n}\n.has-error .form-control-feedback {\n  color: #a94442;\n}\n.has-feedback label ~ .form-control-feedback {\n  top: 25px;\n}\n.has-feedback label.sr-only ~ .form-control-feedback {\n  top: 0;\n}\n.help-block {\n  display: block;\n  margin-top: 5px;\n  margin-bottom: 10px;\n  color: #737373;\n}\n@media (min-width: 768px) {\n  .form-inline .form-group {\n    display: inline-block;\n    margin-bottom: 0;\n    vertical-align: middle;\n  }\n  .form-inline .form-control {\n    display: inline-block;\n    width: auto;\n    vertical-align: middle;\n  }\n  .form-inline .form-control-static {\n    display: inline-block;\n  }\n  .form-inline .input-group {\n    display: inline-table;\n    vertical-align: middle;\n  }\n  .form-inline .input-group .input-group-addon,\n  .form-inline .input-group .input-group-btn,\n  .form-inline .input-group .form-control {\n    width: auto;\n  }\n  .form-inline .input-group > .form-control {\n    width: 100%;\n  }\n  .form-inline .control-label {\n    margin-bottom: 0;\n    vertical-align: middle;\n  }\n  .form-inline .radio,\n  .form-inline .checkbox {\n    display: inline-block;\n    margin-top: 0;\n    margin-bottom: 0;\n    vertical-align: middle;\n  }\n  .form-inline .radio label,\n  .form-inline .checkbox label {\n    padding-left: 0;\n  }\n  .form-inline .radio input[type=\"radio\"],\n  .form-inline .checkbox input[type=\"checkbox\"] {\n    position: relative;\n    margin-left: 0;\n  }\n  .form-inline .has-feedback .form-control-feedback {\n    top: 0;\n  }\n}\n.form-horizontal .radio,\n.form-horizontal .checkbox,\n.form-horizontal .radio-inline,\n.form-horizontal .checkbox-inline {\n  margin-top: 0;\n  margin-bottom: 0;\n  padding-top: 7px;\n}\n.form-horizontal .radio,\n.form-horizontal .checkbox {\n  min-height: 27px;\n}\n.form-horizontal .form-group {\n  margin-left: -15px;\n  margin-right: -15px;\n}\n@media (min-width: 768px) {\n  .form-horizontal .control-label {\n    text-align: right;\n    margin-bottom: 0;\n    padding-top: 7px;\n  }\n}\n.form-horizontal .has-feedback .form-control-feedback {\n  right: 15px;\n}\n@media (min-width: 768px) {\n  .form-horizontal .form-group-lg .control-label {\n    padding-top: 14.3px;\n  }\n}\n@media (min-width: 768px) {\n  .form-horizontal .form-group-sm .control-label {\n    padding-top: 6px;\n  }\n}\n.btn {\n  display: inline-block;\n  margin-bottom: 0;\n  font-weight: normal;\n  text-align: center;\n  vertical-align: middle;\n  touch-action: manipulation;\n  cursor: pointer;\n  background-image: none;\n  border: 1px solid transparent;\n  white-space: nowrap;\n  padding: 6px 12px;\n  font-size: 14px;\n  line-height: 1.42857143;\n  border-radius: 4px;\n  -webkit-user-select: none;\n  -moz-user-select: none;\n  -ms-user-select: none;\n  user-select: none;\n}\n.btn:focus,\n.btn:active:focus,\n.btn.active:focus,\n.btn.focus,\n.btn:active.focus,\n.btn.active.focus {\n  outline: thin dotted;\n  outline: 5px auto -webkit-focus-ring-color;\n  outline-offset: -2px;\n}\n.btn:hover,\n.btn:focus,\n.btn.focus {\n  color: #eeeeee;\n  text-decoration: none;\n}\n.btn:active,\n.btn.active {\n  outline: 0;\n  background-image: none;\n  -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n  box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n}\n.btn.disabled,\n.btn[disabled],\nfieldset[disabled] .btn {\n  cursor: not-allowed;\n  pointer-events: none;\n  opacity: 0.65;\n  -ms-filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=65);\n  filter: alpha(opacity=65);\n  -webkit-box-shadow: none;\n  box-shadow: none;\n}\n.btn-default {\n  color: #000000;\n  background-color: #ffffff;\n  border-color: #000000;\n}\n.btn-default:hover,\n.btn-default:focus,\n.btn-default.focus,\n.btn-default:active,\n.btn-default.active,\n.open > .dropdown-toggle.btn-default {\n  color: #eeeeee;\n  background-color: #ffffff;\n  border-color: #000000;\n}\n.btn-default:active,\n.btn-default.active,\n.open > .dropdown-toggle.btn-default {\n  background-image: none;\n}\n.btn-default.disabled,\n.btn-default[disabled],\nfieldset[disabled] .btn-default,\n.btn-default.disabled:hover,\n.btn-default[disabled]:hover,\nfieldset[disabled] .btn-default:hover,\n.btn-default.disabled:focus,\n.btn-default[disabled]:focus,\nfieldset[disabled] .btn-default:focus,\n.btn-default.disabled.focus,\n.btn-default[disabled].focus,\nfieldset[disabled] .btn-default.focus,\n.btn-default.disabled:active,\n.btn-default[disabled]:active,\nfieldset[disabled] .btn-default:active,\n.btn-default.disabled.active,\n.btn-default[disabled].active,\nfieldset[disabled] .btn-default.active {\n  background-color: #ffffff;\n  border-color: #000000;\n}\n.btn-default .badge {\n  color: #ffffff;\n  background-color: #000000;\n}\n.btn-primary {\n  color: #4CAF50;\n  background-color: #4CAF50;\n  border-color: #449d48;\n}\n.btn-primary:hover,\n.btn-primary:focus,\n.btn-primary.focus,\n.btn-primary:active,\n.btn-primary.active,\n.open > .dropdown-toggle.btn-primary {\n  color: #eeeeee;\n  background-color: #4CAF50;\n  border-color: #327334;\n}\n.btn-primary:active,\n.btn-primary.active,\n.open > .dropdown-toggle.btn-primary {\n  background-image: none;\n}\n.btn-primary.disabled,\n.btn-primary[disabled],\nfieldset[disabled] .btn-primary,\n.btn-primary.disabled:hover,\n.btn-primary[disabled]:hover,\nfieldset[disabled] .btn-primary:hover,\n.btn-primary.disabled:focus,\n.btn-primary[disabled]:focus,\nfieldset[disabled] .btn-primary:focus,\n.btn-primary.disabled.focus,\n.btn-primary[disabled].focus,\nfieldset[disabled] .btn-primary.focus,\n.btn-primary.disabled:active,\n.btn-primary[disabled]:active,\nfieldset[disabled] .btn-primary:active,\n.btn-primary.disabled.active,\n.btn-primary[disabled].active,\nfieldset[disabled] .btn-primary.active {\n  background-color: #4CAF50;\n  border-color: #449d48;\n}\n.btn-primary .badge {\n  color: #4CAF50;\n  background-color: #4CAF50;\n}\n.btn-success {\n  color: #457E86;\n  background-color: #457E86;\n  border-color: #3c6e75;\n}\n.btn-success:hover,\n.btn-success:focus,\n.btn-success.focus,\n.btn-success:active,\n.btn-success.active,\n.open > .dropdown-toggle.btn-success {\n  color: #eeeeee;\n  background-color: #457E86;\n  border-color: #28484d;\n}\n.btn-success:active,\n.btn-success.active,\n.open > .dropdown-toggle.btn-success {\n  background-image: none;\n}\n.btn-success.disabled,\n.btn-success[disabled],\nfieldset[disabled] .btn-success,\n.btn-success.disabled:hover,\n.btn-success[disabled]:hover,\nfieldset[disabled] .btn-success:hover,\n.btn-success.disabled:focus,\n.btn-success[disabled]:focus,\nfieldset[disabled] .btn-success:focus,\n.btn-success.disabled.focus,\n.btn-success[disabled].focus,\nfieldset[disabled] .btn-success.focus,\n.btn-success.disabled:active,\n.btn-success[disabled]:active,\nfieldset[disabled] .btn-success:active,\n.btn-success.disabled.active,\n.btn-success[disabled].active,\nfieldset[disabled] .btn-success.active {\n  background-color: #457E86;\n  border-color: #3c6e75;\n}\n.btn-success .badge {\n  color: #457E86;\n  background-color: #457E86;\n}\n.btn-info {\n  color: #4A2B0F;\n  background-color: #4A2B0F;\n  border-color: #351f0b;\n}\n.btn-info:hover,\n.btn-info:focus,\n.btn-info.focus,\n.btn-info:active,\n.btn-info.active,\n.open > .dropdown-toggle.btn-info {\n  color: #eeeeee;\n  background-color: #4A2B0F;\n  border-color: #020100;\n}\n.btn-info:active,\n.btn-info.active,\n.open > .dropdown-toggle.btn-info {\n  background-image: none;\n}\n.btn-info.disabled,\n.btn-info[disabled],\nfieldset[disabled] .btn-info,\n.btn-info.disabled:hover,\n.btn-info[disabled]:hover,\nfieldset[disabled] .btn-info:hover,\n.btn-info.disabled:focus,\n.btn-info[disabled]:focus,\nfieldset[disabled] .btn-info:focus,\n.btn-info.disabled.focus,\n.btn-info[disabled].focus,\nfieldset[disabled] .btn-info.focus,\n.btn-info.disabled:active,\n.btn-info[disabled]:active,\nfieldset[disabled] .btn-info:active,\n.btn-info.disabled.active,\n.btn-info[disabled].active,\nfieldset[disabled] .btn-info.active {\n  background-color: #4A2B0F;\n  border-color: #351f0b;\n}\n.btn-info .badge {\n  color: #4A2B0F;\n  background-color: #4A2B0F;\n}\n.btn-warning {\n  color: #f0ad4e;\n  background-color: #f0ad4e;\n  border-color: #eea236;\n}\n.btn-warning:hover,\n.btn-warning:focus,\n.btn-warning.focus,\n.btn-warning:active,\n.btn-warning.active,\n.open > .dropdown-toggle.btn-warning {\n  color: #eeeeee;\n  background-color: #f0ad4e;\n  border-color: #d58512;\n}\n.btn-warning:active,\n.btn-warning.active,\n.open > .dropdown-toggle.btn-warning {\n  background-image: none;\n}\n.btn-warning.disabled,\n.btn-warning[disabled],\nfieldset[disabled] .btn-warning,\n.btn-warning.disabled:hover,\n.btn-warning[disabled]:hover,\nfieldset[disabled] .btn-warning:hover,\n.btn-warning.disabled:focus,\n.btn-warning[disabled]:focus,\nfieldset[disabled] .btn-warning:focus,\n.btn-warning.disabled.focus,\n.btn-warning[disabled].focus,\nfieldset[disabled] .btn-warning.focus,\n.btn-warning.disabled:active,\n.btn-warning[disabled]:active,\nfieldset[disabled] .btn-warning:active,\n.btn-warning.disabled.active,\n.btn-warning[disabled].active,\nfieldset[disabled] .btn-warning.active {\n  background-color: #f0ad4e;\n  border-color: #eea236;\n}\n.btn-warning .badge {\n  color: #f0ad4e;\n  background-color: #f0ad4e;\n}\n.btn-danger {\n  color: #d9534f;\n  background-color: #d9534f;\n  border-color: #d43f3a;\n}\n.btn-danger:hover,\n.btn-danger:focus,\n.btn-danger.focus,\n.btn-danger:active,\n.btn-danger.active,\n.open > .dropdown-toggle.btn-danger {\n  color: #eeeeee;\n  background-color: #d9534f;\n  border-color: #ac2925;\n}\n.btn-danger:active,\n.btn-danger.active,\n.open > .dropdown-toggle.btn-danger {\n  background-image: none;\n}\n.btn-danger.disabled,\n.btn-danger[disabled],\nfieldset[disabled] .btn-danger,\n.btn-danger.disabled:hover,\n.btn-danger[disabled]:hover,\nfieldset[disabled] .btn-danger:hover,\n.btn-danger.disabled:focus,\n.btn-danger[disabled]:focus,\nfieldset[disabled] .btn-danger:focus,\n.btn-danger.disabled.focus,\n.btn-danger[disabled].focus,\nfieldset[disabled] .btn-danger.focus,\n.btn-danger.disabled:active,\n.btn-danger[disabled]:active,\nfieldset[disabled] .btn-danger:active,\n.btn-danger.disabled.active,\n.btn-danger[disabled].active,\nfieldset[disabled] .btn-danger.active {\n  background-color: #d9534f;\n  border-color: #d43f3a;\n}\n.btn-danger .badge {\n  color: #d9534f;\n  background-color: #d9534f;\n}\n.btn-link {\n  color: #4CAF50;\n  font-weight: normal;\n  border-radius: 0;\n}\n.btn-link,\n.btn-link:active,\n.btn-link.active,\n.btn-link[disabled],\nfieldset[disabled] .btn-link {\n  background-color: transparent;\n  -webkit-box-shadow: none;\n  box-shadow: none;\n}\n.btn-link,\n.btn-link:hover,\n.btn-link:focus,\n.btn-link:active {\n  border-color: transparent;\n}\n.btn-link:hover,\n.btn-link:focus {\n  color: #357a38;\n  text-decoration: underline;\n  background-color: transparent;\n}\n.btn-link[disabled]:hover,\nfieldset[disabled] .btn-link:hover,\n.btn-link[disabled]:focus,\nfieldset[disabled] .btn-link:focus {\n  color: #777777;\n  text-decoration: none;\n}\n.btn-lg,\n.btn-group-lg > .btn {\n  padding: 10px 16px;\n  font-size: 18px;\n  line-height: 1.33;\n  border-radius: 6px;\n}\n.btn-sm,\n.btn-group-sm > .btn {\n  padding: 5px 10px;\n  font-size: 12px;\n  line-height: 1.5;\n  border-radius: 3px;\n}\n.btn-xs,\n.btn-group-xs > .btn {\n  padding: 1px 5px;\n  font-size: 12px;\n  line-height: 1.5;\n  border-radius: 3px;\n}\n.btn-block {\n  display: block;\n  width: 100%;\n}\n.btn-block + .btn-block {\n  margin-top: 5px;\n}\ninput[type=\"submit\"].btn-block,\ninput[type=\"reset\"].btn-block,\ninput[type=\"button\"].btn-block {\n  width: 100%;\n}\n.fade {\n  opacity: 0;\n  -webkit-transition: opacity 0.15s linear;\n  -o-transition: opacity 0.15s linear;\n  transition: opacity 0.15s linear;\n}\n.fade.in {\n  opacity: 1;\n}\n.collapse {\n  display: none;\n  visibility: hidden;\n}\n.collapse.in {\n  display: block;\n  visibility: visible;\n}\ntr.collapse.in {\n  display: table-row;\n}\ntbody.collapse.in {\n  display: table-row-group;\n}\n.collapsing {\n  position: relative;\n  height: 0;\n  overflow: hidden;\n  -webkit-transition-property: height, visibility;\n  transition-property: height, visibility;\n  -webkit-transition-duration: 0.35s;\n  transition-duration: 0.35s;\n  -webkit-transition-timing-function: ease;\n  transition-timing-function: ease;\n}\n.caret {\n  display: inline-block;\n  width: 0;\n  height: 0;\n  margin-left: 2px;\n  vertical-align: middle;\n  border-top: 4px solid;\n  border-right: 4px solid transparent;\n  border-left: 4px solid transparent;\n}\n.dropdown {\n  position: relative;\n}\n.dropdown-toggle:focus {\n  outline: 0;\n}\n.dropdown-menu {\n  position: absolute;\n  top: 100%;\n  left: 0;\n  z-index: 1000;\n  display: none;\n  float: left;\n  min-width: 160px;\n  padding: 5px 0;\n  margin: 2px 0 0;\n  list-style: none;\n  font-size: 14px;\n  text-align: left;\n  background-color: #eeeeee;\n  border: 1px solid #ccc;\n  border: 1px solid rgba(0, 0, 0, 0.15);\n  border-radius: 4px;\n  -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);\n  box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);\n  background-clip: padding-box;\n}\n.dropdown-menu.pull-right {\n  right: 0;\n  left: auto;\n}\n.dropdown-menu .divider {\n  height: 1px;\n  margin: 9px 0;\n  overflow: hidden;\n  background-color: #e5e5e5;\n}\n.dropdown-menu > li > a {\n  display: block;\n  padding: 3px 20px;\n  clear: both;\n  font-weight: normal;\n  line-height: 1.42857143;\n  color: #333333;\n  white-space: nowrap;\n}\n.dropdown-menu > li > a:hover,\n.dropdown-menu > li > a:focus {\n  text-decoration: none;\n  color: #262626;\n  background-color: #f5f5f5;\n}\n.dropdown-menu > .active > a,\n.dropdown-menu > .active > a:hover,\n.dropdown-menu > .active > a:focus {\n  color: #eeeeee;\n  text-decoration: none;\n  outline: 0;\n  background-color: #4CAF50;\n}\n.dropdown-menu > .disabled > a,\n.dropdown-menu > .disabled > a:hover,\n.dropdown-menu > .disabled > a:focus {\n  color: #777777;\n}\n.dropdown-menu > .disabled > a:hover,\n.dropdown-menu > .disabled > a:focus {\n  text-decoration: none;\n  background-color: transparent;\n  background-image: none;\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n  cursor: not-allowed;\n}\n.open > .dropdown-menu {\n  display: block;\n}\n.open > a {\n  outline: 0;\n}\n.dropdown-menu-right {\n  left: auto;\n  right: 0;\n}\n.dropdown-menu-left {\n  left: 0;\n  right: auto;\n}\n.dropdown-header {\n  display: block;\n  padding: 3px 20px;\n  font-size: 12px;\n  line-height: 1.42857143;\n  color: #777777;\n  white-space: nowrap;\n}\n.dropdown-backdrop {\n  position: fixed;\n  left: 0;\n  right: 0;\n  bottom: 0;\n  top: 0;\n  z-index: 990;\n}\n.pull-right > .dropdown-menu {\n  right: 0;\n  left: auto;\n}\n.dropup .caret,\n.navbar-fixed-bottom .dropdown .caret {\n  border-top: 0;\n  border-bottom: 4px solid;\n  content: \"\";\n}\n.dropup .dropdown-menu,\n.navbar-fixed-bottom .dropdown .dropdown-menu {\n  top: auto;\n  bottom: 100%;\n  margin-bottom: 1px;\n}\n@media (min-width: 768px) {\n  .navbar-right .dropdown-menu {\n    left: auto;\n    right: 0;\n  }\n  .navbar-right .dropdown-menu-left {\n    left: 0;\n    right: auto;\n  }\n}\n.btn-group,\n.btn-group-vertical {\n  position: relative;\n  display: inline-block;\n  vertical-align: middle;\n}\n.btn-group > .btn,\n.btn-group-vertical > .btn {\n  position: relative;\n  float: left;\n}\n.btn-group > .btn:hover,\n.btn-group-vertical > .btn:hover,\n.btn-group > .btn:focus,\n.btn-group-vertical > .btn:focus,\n.btn-group > .btn:active,\n.btn-group-vertical > .btn:active,\n.btn-group > .btn.active,\n.btn-group-vertical > .btn.active {\n  z-index: 2;\n}\n.btn-group > .btn:focus,\n.btn-group-vertical > .btn:focus {\n  outline: 0;\n}\n.btn-group .btn + .btn,\n.btn-group .btn + .btn-group,\n.btn-group .btn-group + .btn,\n.btn-group .btn-group + .btn-group {\n  margin-left: -1px;\n}\n.btn-toolbar {\n  margin-left: -5px;\n}\n.btn-toolbar .btn-group,\n.btn-toolbar .input-group {\n  float: left;\n}\n.btn-toolbar > .btn,\n.btn-toolbar > .btn-group,\n.btn-toolbar > .input-group {\n  margin-left: 5px;\n}\n.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) {\n  border-radius: 0;\n}\n.btn-group > .btn:first-child {\n  margin-left: 0;\n}\n.btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) {\n  border-bottom-right-radius: 0;\n  border-top-right-radius: 0;\n}\n.btn-group > .btn:last-child:not(:first-child),\n.btn-group > .dropdown-toggle:not(:first-child) {\n  border-bottom-left-radius: 0;\n  border-top-left-radius: 0;\n}\n.btn-group > .btn-group {\n  float: left;\n}\n.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn {\n  border-radius: 0;\n}\n.btn-group > .btn-group:first-child > .btn:last-child,\n.btn-group > .btn-group:first-child > .dropdown-toggle {\n  border-bottom-right-radius: 0;\n  border-top-right-radius: 0;\n}\n.btn-group > .btn-group:last-child > .btn:first-child {\n  border-bottom-left-radius: 0;\n  border-top-left-radius: 0;\n}\n.btn-group .dropdown-toggle:active,\n.btn-group.open .dropdown-toggle {\n  outline: 0;\n}\n.btn-group > .btn + .dropdown-toggle {\n  padding-left: 8px;\n  padding-right: 8px;\n}\n.btn-group > .btn-lg + .dropdown-toggle {\n  padding-left: 12px;\n  padding-right: 12px;\n}\n.btn-group.open .dropdown-toggle {\n  -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n  box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n}\n.btn-group.open .dropdown-toggle.btn-link {\n  -webkit-box-shadow: none;\n  box-shadow: none;\n}\n.btn .caret {\n  margin-left: 0;\n}\n.btn-lg .caret {\n  border-width: 5px 5px 0;\n  border-bottom-width: 0;\n}\n.dropup .btn-lg .caret {\n  border-width: 0 5px 5px;\n}\n.btn-group-vertical > .btn,\n.btn-group-vertical > .btn-group,\n.btn-group-vertical > .btn-group > .btn {\n  display: block;\n  float: none;\n  width: 100%;\n  max-width: 100%;\n}\n.btn-group-vertical > .btn-group > .btn {\n  float: none;\n}\n.btn-group-vertical > .btn + .btn,\n.btn-group-vertical > .btn + .btn-group,\n.btn-group-vertical > .btn-group + .btn,\n.btn-group-vertical > .btn-group + .btn-group {\n  margin-top: -1px;\n  margin-left: 0;\n}\n.btn-group-vertical > .btn:not(:first-child):not(:last-child) {\n  border-radius: 0;\n}\n.btn-group-vertical > .btn:first-child:not(:last-child) {\n  border-top-right-radius: 4px;\n  border-bottom-right-radius: 0;\n  border-bottom-left-radius: 0;\n}\n.btn-group-vertical > .btn:last-child:not(:first-child) {\n  border-bottom-left-radius: 4px;\n  border-top-right-radius: 0;\n  border-top-left-radius: 0;\n}\n.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn {\n  border-radius: 0;\n}\n.btn-group-vertical > .btn-group:first-child:not(:last-child) > .btn:last-child,\n.btn-group-vertical > .btn-group:first-child:not(:last-child) > .dropdown-toggle {\n  border-bottom-right-radius: 0;\n  border-bottom-left-radius: 0;\n}\n.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child {\n  border-top-right-radius: 0;\n  border-top-left-radius: 0;\n}\n.btn-group-justified {\n  display: table;\n  width: 100%;\n  table-layout: fixed;\n  border-collapse: separate;\n}\n.btn-group-justified > .btn,\n.btn-group-justified > .btn-group {\n  float: none;\n  display: table-cell;\n  width: 1%;\n}\n.btn-group-justified > .btn-group .btn {\n  width: 100%;\n}\n.btn-group-justified > .btn-group .dropdown-menu {\n  left: auto;\n}\n[data-toggle=\"buttons\"] > .btn input[type=\"radio\"],\n[data-toggle=\"buttons\"] > .btn-group > .btn input[type=\"radio\"],\n[data-toggle=\"buttons\"] > .btn input[type=\"checkbox\"],\n[data-toggle=\"buttons\"] > .btn-group > .btn input[type=\"checkbox\"] {\n  position: absolute;\n  clip: rect(0, 0, 0, 0);\n  pointer-events: none;\n}\n.input-group {\n  position: relative;\n  display: table;\n  border-collapse: separate;\n}\n.input-group[class*=\"col-\"] {\n  float: none;\n  padding-left: 0;\n  padding-right: 0;\n}\n.input-group .form-control {\n  position: relative;\n  z-index: 2;\n  float: left;\n  width: 100%;\n  margin-bottom: 0;\n}\n.input-group-lg > .form-control,\n.input-group-lg > .input-group-addon,\n.input-group-lg > .input-group-btn > .btn {\n  height: 46px;\n  padding: 10px 16px;\n  font-size: 18px;\n  line-height: 1.33;\n  border-radius: 6px;\n}\nselect.input-group-lg > .form-control,\nselect.input-group-lg > .input-group-addon,\nselect.input-group-lg > .input-group-btn > .btn {\n  height: 46px;\n  line-height: 46px;\n}\ntextarea.input-group-lg > .form-control,\ntextarea.input-group-lg > .input-group-addon,\ntextarea.input-group-lg > .input-group-btn > .btn,\nselect[multiple].input-group-lg > .form-control,\nselect[multiple].input-group-lg > .input-group-addon,\nselect[multiple].input-group-lg > .input-group-btn > .btn {\n  height: auto;\n}\n.input-group-sm > .form-control,\n.input-group-sm > .input-group-addon,\n.input-group-sm > .input-group-btn > .btn {\n  height: 30px;\n  padding: 5px 10px;\n  font-size: 12px;\n  line-height: 1.5;\n  border-radius: 3px;\n}\nselect.input-group-sm > .form-control,\nselect.input-group-sm > .input-group-addon,\nselect.input-group-sm > .input-group-btn > .btn {\n  height: 30px;\n  line-height: 30px;\n}\ntextarea.input-group-sm > .form-control,\ntextarea.input-group-sm > .input-group-addon,\ntextarea.input-group-sm > .input-group-btn > .btn,\nselect[multiple].input-group-sm > .form-control,\nselect[multiple].input-group-sm > .input-group-addon,\nselect[multiple].input-group-sm > .input-group-btn > .btn {\n  height: auto;\n}\n.input-group-addon,\n.input-group-btn,\n.input-group .form-control {\n  display: table-cell;\n}\n.input-group-addon:not(:first-child):not(:last-child),\n.input-group-btn:not(:first-child):not(:last-child),\n.input-group .form-control:not(:first-child):not(:last-child) {\n  border-radius: 0;\n}\n.input-group-addon,\n.input-group-btn {\n  width: 1%;\n  white-space: nowrap;\n  vertical-align: middle;\n}\n.input-group-addon {\n  padding: 6px 12px;\n  font-size: 14px;\n  font-weight: normal;\n  line-height: 1;\n  color: #555555;\n  text-align: center;\n  background-color: #eeeeee;\n  border: 1px solid #ccc;\n  border-radius: 4px;\n}\n.input-group-addon.input-sm {\n  padding: 5px 10px;\n  font-size: 12px;\n  border-radius: 3px;\n}\n.input-group-addon.input-lg {\n  padding: 10px 16px;\n  font-size: 18px;\n  border-radius: 6px;\n}\n.input-group-addon input[type=\"radio\"],\n.input-group-addon input[type=\"checkbox\"] {\n  margin-top: 0;\n}\n.input-group .form-control:first-child,\n.input-group-addon:first-child,\n.input-group-btn:first-child > .btn,\n.input-group-btn:first-child > .btn-group > .btn,\n.input-group-btn:first-child > .dropdown-toggle,\n.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle),\n.input-group-btn:last-child > .btn-group:not(:last-child) > .btn {\n  border-bottom-right-radius: 0;\n  border-top-right-radius: 0;\n}\n.input-group-addon:first-child {\n  border-right: 0;\n}\n.input-group .form-control:last-child,\n.input-group-addon:last-child,\n.input-group-btn:last-child > .btn,\n.input-group-btn:last-child > .btn-group > .btn,\n.input-group-btn:last-child > .dropdown-toggle,\n.input-group-btn:first-child > .btn:not(:first-child),\n.input-group-btn:first-child > .btn-group:not(:first-child) > .btn {\n  border-bottom-left-radius: 0;\n  border-top-left-radius: 0;\n}\n.input-group-addon:last-child {\n  border-left: 0;\n}\n.input-group-btn {\n  position: relative;\n  font-size: 0;\n  white-space: nowrap;\n}\n.input-group-btn > .btn {\n  position: relative;\n}\n.input-group-btn > .btn + .btn {\n  margin-left: -1px;\n}\n.input-group-btn > .btn:hover,\n.input-group-btn > .btn:focus,\n.input-group-btn > .btn:active {\n  z-index: 2;\n}\n.input-group-btn:first-child > .btn,\n.input-group-btn:first-child > .btn-group {\n  margin-right: -1px;\n}\n.input-group-btn:last-child > .btn,\n.input-group-btn:last-child > .btn-group {\n  margin-left: -1px;\n}\n.nav {\n  margin-bottom: 0;\n  padding-left: 0;\n  list-style: none;\n}\n.nav > li {\n  position: relative;\n  display: block;\n}\n.nav > li > a {\n  position: relative;\n  display: block;\n  padding: 10px 15px;\n}\n.nav > li > a:hover,\n.nav > li > a:focus {\n  text-decoration: none;\n  background-color: #eeeeee;\n}\n.nav > li.disabled > a {\n  color: #777777;\n}\n.nav > li.disabled > a:hover,\n.nav > li.disabled > a:focus {\n  color: #777777;\n  text-decoration: none;\n  background-color: transparent;\n  cursor: not-allowed;\n}\n.nav .open > a,\n.nav .open > a:hover,\n.nav .open > a:focus {\n  background-color: #eeeeee;\n  border-color: #4CAF50;\n}\n.nav .nav-divider {\n  height: 1px;\n  margin: 9px 0;\n  overflow: hidden;\n  background-color: #e5e5e5;\n}\n.nav > li > a > img {\n  max-width: none;\n}\n.nav-tabs {\n  border-bottom: 1px solid #ddd;\n}\n.nav-tabs > li {\n  float: left;\n  margin-bottom: -1px;\n}\n.nav-tabs > li > a {\n  margin-right: 2px;\n  line-height: 1.42857143;\n  border: 1px solid transparent;\n  border-radius: 4px 4px 0 0;\n}\n.nav-tabs > li > a:hover {\n  border-color: #eeeeee #eeeeee #ddd;\n}\n.nav-tabs > li.active > a,\n.nav-tabs > li.active > a:hover,\n.nav-tabs > li.active > a:focus {\n  color: #555555;\n  background-color: #ffffff;\n  border: 1px solid #ddd;\n  border-bottom-color: transparent;\n  cursor: default;\n}\n.nav-tabs.nav-justified {\n  width: 100%;\n  border-bottom: 0;\n}\n.nav-tabs.nav-justified > li {\n  float: none;\n}\n.nav-tabs.nav-justified > li > a {\n  text-align: center;\n  margin-bottom: 5px;\n}\n.nav-tabs.nav-justified > .dropdown .dropdown-menu {\n  top: auto;\n  left: auto;\n}\n@media (min-width: 768px) {\n  .nav-tabs.nav-justified > li {\n    display: table-cell;\n    width: 1%;\n  }\n  .nav-tabs.nav-justified > li > a {\n    margin-bottom: 0;\n  }\n}\n.nav-tabs.nav-justified > li > a {\n  margin-right: 0;\n  border-radius: 4px;\n}\n.nav-tabs.nav-justified > .active > a,\n.nav-tabs.nav-justified > .active > a:hover,\n.nav-tabs.nav-justified > .active > a:focus {\n  border: 1px solid #ddd;\n}\n@media (min-width: 768px) {\n  .nav-tabs.nav-justified > li > a {\n    border-bottom: 1px solid #ddd;\n    border-radius: 4px 4px 0 0;\n  }\n  .nav-tabs.nav-justified > .active > a,\n  .nav-tabs.nav-justified > .active > a:hover,\n  .nav-tabs.nav-justified > .active > a:focus {\n    border-bottom-color: #ffffff;\n  }\n}\n.nav-pills > li {\n  float: left;\n}\n.nav-pills > li > a {\n  border-radius: 4px;\n}\n.nav-pills > li + li {\n  margin-left: 2px;\n}\n.nav-pills > li.active > a,\n.nav-pills > li.active > a:hover,\n.nav-pills > li.active > a:focus {\n  color: #eeeeee;\n  background-color: #4CAF50;\n}\n.nav-stacked > li {\n  float: none;\n}\n.nav-stacked > li + li {\n  margin-top: 2px;\n  margin-left: 0;\n}\n.nav-justified {\n  width: 100%;\n}\n.nav-justified > li {\n  float: none;\n}\n.nav-justified > li > a {\n  text-align: center;\n  margin-bottom: 5px;\n}\n.nav-justified > .dropdown .dropdown-menu {\n  top: auto;\n  left: auto;\n}\n@media (min-width: 768px) {\n  .nav-justified > li {\n    display: table-cell;\n    width: 1%;\n  }\n  .nav-justified > li > a {\n    margin-bottom: 0;\n  }\n}\n.nav-tabs-justified {\n  border-bottom: 0;\n}\n.nav-tabs-justified > li > a {\n  margin-right: 0;\n  border-radius: 4px;\n}\n.nav-tabs-justified > .active > a,\n.nav-tabs-justified > .active > a:hover,\n.nav-tabs-justified > .active > a:focus {\n  border: 1px solid #ddd;\n}\n@media (min-width: 768px) {\n  .nav-tabs-justified > li > a {\n    border-bottom: 1px solid #ddd;\n    border-radius: 4px 4px 0 0;\n  }\n  .nav-tabs-justified > .active > a,\n  .nav-tabs-justified > .active > a:hover,\n  .nav-tabs-justified > .active > a:focus {\n    border-bottom-color: #ffffff;\n  }\n}\n.tab-content > .tab-pane {\n  display: none;\n  visibility: hidden;\n}\n.tab-content > .active {\n  display: block;\n  visibility: visible;\n}\n.nav-tabs .dropdown-menu {\n  margin-top: -1px;\n  border-top-right-radius: 0;\n  border-top-left-radius: 0;\n}\n.navbar {\n  position: relative;\n  min-height: 50px;\n  margin-bottom: 30px;\n  border: 1px solid transparent;\n}\n@media (min-width: 768px) {\n  .navbar {\n    border-radius: 4px;\n  }\n}\n@media (min-width: 768px) {\n  .navbar-header {\n    float: left;\n  }\n}\n.navbar-collapse {\n  overflow-x: visible;\n  padding-right: 15px;\n  padding-left: 15px;\n  border-top: 1px solid transparent;\n  box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1);\n  -webkit-overflow-scrolling: touch;\n}\n.navbar-collapse.in {\n  overflow-y: auto;\n}\n@media (min-width: 768px) {\n  .navbar-collapse {\n    width: auto;\n    border-top: 0;\n    box-shadow: none;\n  }\n  .navbar-collapse.collapse {\n    display: block !important;\n    visibility: visible !important;\n    height: auto !important;\n    padding-bottom: 0;\n    overflow: visible !important;\n  }\n  .navbar-collapse.in {\n    overflow-y: visible;\n  }\n  .navbar-fixed-top .navbar-collapse,\n  .navbar-static-top .navbar-collapse,\n  .navbar-fixed-bottom .navbar-collapse {\n    padding-left: 0;\n    padding-right: 0;\n  }\n}\n.navbar-fixed-top .navbar-collapse,\n.navbar-fixed-bottom .navbar-collapse {\n  max-height: 340px;\n}\n@media (max-device-width: 480px) and (orientation: landscape) {\n  .navbar-fixed-top .navbar-collapse,\n  .navbar-fixed-bottom .navbar-collapse {\n    max-height: 200px;\n  }\n}\n.container > .navbar-header,\n.container-fluid > .navbar-header,\n.container > .navbar-collapse,\n.container-fluid > .navbar-collapse {\n  margin-right: -15px;\n  margin-left: -15px;\n}\n@media (min-width: 768px) {\n  .container > .navbar-header,\n  .container-fluid > .navbar-header,\n  .container > .navbar-collapse,\n  .container-fluid > .navbar-collapse {\n    margin-right: 0;\n    margin-left: 0;\n  }\n}\n.navbar-static-top {\n  z-index: 1000;\n  border-width: 0 0 1px;\n}\n@media (min-width: 768px) {\n  .navbar-static-top {\n    border-radius: 0;\n  }\n}\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n  position: fixed;\n  right: 0;\n  left: 0;\n  z-index: 1030;\n}\n@media (min-width: 768px) {\n  .navbar-fixed-top,\n  .navbar-fixed-bottom {\n    border-radius: 0;\n  }\n}\n.navbar-fixed-top {\n  top: 0;\n  border-width: 0 0 1px;\n}\n.navbar-fixed-bottom {\n  bottom: 0;\n  margin-bottom: 0;\n  border-width: 1px 0 0;\n}\n.navbar-brand {\n  float: left;\n  padding: 15px 15px;\n  font-size: 18px;\n  line-height: 20px;\n  height: 50px;\n}\n.navbar-brand:hover,\n.navbar-brand:focus {\n  text-decoration: none;\n}\n.navbar-brand > img {\n  display: block;\n}\n@media (min-width: 768px) {\n  .navbar > .container .navbar-brand,\n  .navbar > .container-fluid .navbar-brand {\n    margin-left: -15px;\n  }\n}\n.navbar-toggle {\n  position: relative;\n  float: right;\n  margin-right: 15px;\n  padding: 9px 10px;\n  margin-top: 8px;\n  margin-bottom: 8px;\n  background-color: transparent;\n  background-image: none;\n  border: 1px solid transparent;\n  border-radius: 4px;\n}\n.navbar-toggle:focus {\n  outline: 0;\n}\n.navbar-toggle .icon-bar {\n  display: block;\n  width: 22px;\n  height: 2px;\n  border-radius: 1px;\n  background-color: #eeeeee !important;\n}\n.navbar-toggle .icon-bar + .icon-bar {\n  margin-top: 4px;\n}\n@media (min-width: 768px) {\n  .navbar-toggle {\n    display: none;\n  }\n}\n.navbar-nav {\n  margin: 7.5px -15px;\n}\n.navbar-nav > li > a {\n  padding-top: 10px;\n  padding-bottom: 10px;\n  line-height: 20px;\n}\n@media (max-width: 767px) {\n  .navbar-nav .open .dropdown-menu {\n    position: static;\n    float: none;\n    width: auto;\n    margin-top: 0;\n    background-color: transparent;\n    border: 0;\n    box-shadow: none;\n  }\n  .navbar-nav .open .dropdown-menu > li > a,\n  .navbar-nav .open .dropdown-menu .dropdown-header {\n    padding: 5px 15px 5px 25px;\n  }\n  .navbar-nav .open .dropdown-menu > li > a {\n    line-height: 20px;\n  }\n  .navbar-nav .open .dropdown-menu > li > a:hover,\n  .navbar-nav .open .dropdown-menu > li > a:focus {\n    background-image: none;\n  }\n}\n@media (min-width: 768px) {\n  .navbar-nav {\n    float: left;\n    margin: 0;\n  }\n  .navbar-nav > li {\n    float: left;\n  }\n  .navbar-nav > li > a {\n    padding-top: 15px;\n    padding-bottom: 15px;\n  }\n}\n.navbar-form {\n  margin-left: -15px;\n  margin-right: -15px;\n  padding: 10px 15px;\n  border-top: 1px solid transparent;\n  border-bottom: 1px solid transparent;\n  -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  margin-top: 8px;\n  margin-bottom: 8px;\n}\n@media (min-width: 768px) {\n  .navbar-form .form-group {\n    display: inline-block;\n    margin-bottom: 0;\n    vertical-align: middle;\n  }\n  .navbar-form .form-control {\n    display: inline-block;\n    width: auto;\n    vertical-align: middle;\n  }\n  .navbar-form .form-control-static {\n    display: inline-block;\n  }\n  .navbar-form .input-group {\n    display: inline-table;\n    vertical-align: middle;\n  }\n  .navbar-form .input-group .input-group-addon,\n  .navbar-form .input-group .input-group-btn,\n  .navbar-form .input-group .form-control {\n    width: auto;\n  }\n  .navbar-form .input-group > .form-control {\n    width: 100%;\n  }\n  .navbar-form .control-label {\n    margin-bottom: 0;\n    vertical-align: middle;\n  }\n  .navbar-form .radio,\n  .navbar-form .checkbox {\n    display: inline-block;\n    margin-top: 0;\n    margin-bottom: 0;\n    vertical-align: middle;\n  }\n  .navbar-form .radio label,\n  .navbar-form .checkbox label {\n    padding-left: 0;\n  }\n  .navbar-form .radio input[type=\"radio\"],\n  .navbar-form .checkbox input[type=\"checkbox\"] {\n    position: relative;\n    margin-left: 0;\n  }\n  .navbar-form .has-feedback .form-control-feedback {\n    top: 0;\n  }\n}\n@media (max-width: 767px) {\n  .navbar-form .form-group {\n    margin-bottom: 5px;\n  }\n  .navbar-form .form-group:last-child {\n    margin-bottom: 0;\n  }\n}\n@media (min-width: 768px) {\n  .navbar-form {\n    width: auto;\n    border: 0;\n    margin-left: 0;\n    margin-right: 0;\n    padding-top: 0;\n    padding-bottom: 0;\n    -webkit-box-shadow: none;\n    box-shadow: none;\n  }\n}\n.navbar-nav > li > .dropdown-menu {\n  margin-top: 0;\n  border-top-right-radius: 0;\n  border-top-left-radius: 0;\n}\n.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu {\n  border-bottom-right-radius: 0;\n  border-bottom-left-radius: 0;\n}\n.navbar-btn {\n  margin-top: 8px;\n  margin-bottom: 8px;\n}\n.navbar-btn.btn-sm {\n  margin-top: 10px;\n  margin-bottom: 10px;\n}\n.navbar-btn.btn-xs {\n  margin-top: 14px;\n  margin-bottom: 14px;\n}\n.navbar-text {\n  margin-top: 15px;\n  margin-bottom: 15px;\n}\n@media (min-width: 768px) {\n  .navbar-text {\n    float: left;\n    margin-left: 15px;\n    margin-right: 15px;\n  }\n}\n@media (min-width: 768px) {\n  .navbar-left {\n    float: left !important;\n  }\n  .navbar-right {\n    float: right !important;\n    margin-right: -15px;\n  }\n  .navbar-right ~ .navbar-right {\n    margin-right: 0;\n  }\n}\n.navbar-default {\n  background-color: #f8f8f8;\n  border-color: #e7e7e7;\n}\n.navbar-default .navbar-brand {\n  color: #eeeeee;\n}\n.navbar-default .navbar-brand:hover,\n.navbar-default .navbar-brand:focus {\n  color: #d5d5d5;\n  background-color: transparent;\n}\n.navbar-default .navbar-text {\n  color: #777;\n}\n.navbar-default .navbar-nav > li > a {\n  color: #eeeeee;\n}\n.navbar-default .navbar-nav > li > a:hover,\n.navbar-default .navbar-nav > li > a:focus {\n  color: #4CAF50;\n  background-color: #eeeeee;\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: #eeeeee;\n}\n.navbar-default .navbar-nav > .disabled > a,\n.navbar-default .navbar-nav > .disabled > a:hover,\n.navbar-default .navbar-nav > .disabled > a:focus {\n  color: #ccc;\n  background-color: transparent;\n}\n.navbar-default .navbar-toggle {\n  border-color: #ddd;\n}\n.navbar-default .navbar-toggle:hover,\n.navbar-default .navbar-toggle:focus {\n  background-color: #ddd;\n}\n.navbar-default .navbar-toggle .icon-bar {\n  background-color: #888;\n}\n.navbar-default .navbar-collapse,\n.navbar-default .navbar-form {\n  border-color: #e7e7e7;\n}\n.navbar-default .navbar-nav > .open > a,\n.navbar-default .navbar-nav > .open > a:hover,\n.navbar-default .navbar-nav > .open > a:focus {\n  background-color: #e7e7e7;\n  color: #eeeeee;\n}\n@media (max-width: 767px) {\n  .navbar-default .navbar-nav .open .dropdown-menu > li > a {\n    color: #eeeeee;\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: #4CAF50;\n    background-color: #eeeeee;\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: #eeeeee;\n    background-color: #e7e7e7;\n  }\n  .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a,\n  .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover,\n  .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus {\n    color: #ccc;\n    background-color: transparent;\n  }\n}\n.navbar-default .navbar-link {\n  color: #eeeeee;\n}\n.navbar-default .navbar-link:hover {\n  color: #4CAF50;\n}\n.navbar-default .btn-link {\n  color: #eeeeee;\n}\n.navbar-default .btn-link:hover,\n.navbar-default .btn-link:focus {\n  color: #4CAF50;\n}\n.navbar-default .btn-link[disabled]:hover,\nfieldset[disabled] .navbar-default .btn-link:hover,\n.navbar-default .btn-link[disabled]:focus,\nfieldset[disabled] .navbar-default .btn-link:focus {\n  color: #ccc;\n}\n.navbar-inverse {\n  background-color: #222;\n  border-color: #080808;\n}\n.navbar-inverse .navbar-brand {\n  color: #777777;\n}\n.navbar-inverse .navbar-brand:hover,\n.navbar-inverse .navbar-brand:focus {\n  color: #eeeeee;\n  background-color: transparent;\n}\n.navbar-inverse .navbar-text {\n  color: #9d9d9d;\n}\n.navbar-inverse .navbar-nav > li > a {\n  color: #777777;\n}\n.navbar-inverse .navbar-nav > li > a:hover,\n.navbar-inverse .navbar-nav > li > a:focus {\n  color: #eeeeee;\n  background-color: transparent;\n}\n.navbar-inverse .navbar-nav > .active > a,\n.navbar-inverse .navbar-nav > .active > a:hover,\n.navbar-inverse .navbar-nav > .active > a:focus {\n  color: #eeeeee;\n  background-color: #080808;\n}\n.navbar-inverse .navbar-nav > .disabled > a,\n.navbar-inverse .navbar-nav > .disabled > a:hover,\n.navbar-inverse .navbar-nav > .disabled > a:focus {\n  color: #444;\n  background-color: transparent;\n}\n.navbar-inverse .navbar-toggle {\n  border-color: #333;\n}\n.navbar-inverse .navbar-toggle:hover,\n.navbar-inverse .navbar-toggle:focus {\n  background-color: #333;\n}\n.navbar-inverse .navbar-toggle .icon-bar {\n  background-color: #eeeeee;\n}\n.navbar-inverse .navbar-collapse,\n.navbar-inverse .navbar-form {\n  border-color: #101010;\n}\n.navbar-inverse .navbar-nav > .open > a,\n.navbar-inverse .navbar-nav > .open > a:hover,\n.navbar-inverse .navbar-nav > .open > a:focus {\n  background-color: #080808;\n  color: #eeeeee;\n}\n@media (max-width: 767px) {\n  .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header {\n    border-color: #080808;\n  }\n  .navbar-inverse .navbar-nav .open .dropdown-menu .divider {\n    background-color: #080808;\n  }\n  .navbar-inverse .navbar-nav .open .dropdown-menu > li > a {\n    color: #777777;\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: #eeeeee;\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: #eeeeee;\n    background-color: #080808;\n  }\n  .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a,\n  .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover,\n  .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus {\n    color: #444;\n    background-color: transparent;\n  }\n}\n.navbar-inverse .navbar-link {\n  color: #777777;\n}\n.navbar-inverse .navbar-link:hover {\n  color: #eeeeee;\n}\n.navbar-inverse .btn-link {\n  color: #777777;\n}\n.navbar-inverse .btn-link:hover,\n.navbar-inverse .btn-link:focus {\n  color: #eeeeee;\n}\n.navbar-inverse .btn-link[disabled]:hover,\nfieldset[disabled] .navbar-inverse .btn-link:hover,\n.navbar-inverse .btn-link[disabled]:focus,\nfieldset[disabled] .navbar-inverse .btn-link:focus {\n  color: #444;\n}\n.breadcrumb {\n  padding: 8px 15px;\n  margin-bottom: 20px;\n  list-style: none;\n  background-color: #f5f5f5;\n  border-radius: 4px;\n}\n.breadcrumb > li {\n  display: inline-block;\n}\n.breadcrumb > li + li:before {\n  content: \"/\\00a0\";\n  padding: 0 5px;\n  color: #ccc;\n}\n.breadcrumb > .active {\n  color: #777777;\n}\n.pagination {\n  display: inline-block;\n  padding-left: 0;\n  margin: 20px 0;\n  border-radius: 4px;\n}\n.pagination > li {\n  display: inline;\n}\n.pagination > li > a,\n.pagination > li > span {\n  position: relative;\n  float: left;\n  padding: 6px 12px;\n  line-height: 1.42857143;\n  text-decoration: none;\n  color: #4CAF50;\n  background-color: #eeeeee;\n  border: 1px solid #ddd;\n  margin-left: -1px;\n}\n.pagination > li:first-child > a,\n.pagination > li:first-child > span {\n  margin-left: 0;\n  border-bottom-left-radius: 4px;\n  border-top-left-radius: 4px;\n}\n.pagination > li:last-child > a,\n.pagination > li:last-child > span {\n  border-bottom-right-radius: 4px;\n  border-top-right-radius: 4px;\n}\n.pagination > li > a:hover,\n.pagination > li > span:hover,\n.pagination > li > a:focus,\n.pagination > li > span:focus {\n  color: #357a38;\n  background-color: #eeeeee;\n  border-color: #ddd;\n}\n.pagination > .active > a,\n.pagination > .active > span,\n.pagination > .active > a:hover,\n.pagination > .active > span:hover,\n.pagination > .active > a:focus,\n.pagination > .active > span:focus {\n  z-index: 2;\n  color: #eeeeee;\n  background-color: #4CAF50;\n  border-color: #4CAF50;\n  cursor: default;\n}\n.pagination > .disabled > span,\n.pagination > .disabled > span:hover,\n.pagination > .disabled > span:focus,\n.pagination > .disabled > a,\n.pagination > .disabled > a:hover,\n.pagination > .disabled > a:focus {\n  color: #777777;\n  background-color: #eeeeee;\n  border-color: #ddd;\n  cursor: not-allowed;\n}\n.pagination-lg > li > a,\n.pagination-lg > li > span {\n  padding: 10px 16px;\n  font-size: 18px;\n}\n.pagination-lg > li:first-child > a,\n.pagination-lg > li:first-child > span {\n  border-bottom-left-radius: 6px;\n  border-top-left-radius: 6px;\n}\n.pagination-lg > li:last-child > a,\n.pagination-lg > li:last-child > span {\n  border-bottom-right-radius: 6px;\n  border-top-right-radius: 6px;\n}\n.pagination-sm > li > a,\n.pagination-sm > li > span {\n  padding: 5px 10px;\n  font-size: 12px;\n}\n.pagination-sm > li:first-child > a,\n.pagination-sm > li:first-child > span {\n  border-bottom-left-radius: 3px;\n  border-top-left-radius: 3px;\n}\n.pagination-sm > li:last-child > a,\n.pagination-sm > li:last-child > span {\n  border-bottom-right-radius: 3px;\n  border-top-right-radius: 3px;\n}\n.pager {\n  padding-left: 0;\n  margin: 20px 0;\n  list-style: none;\n  text-align: center;\n}\n.pager li {\n  display: inline;\n}\n.pager li > a,\n.pager li > span {\n  display: inline-block;\n  padding: 5px 14px;\n  background-color: #eeeeee;\n  border: 1px solid #ddd;\n  border-radius: 15px;\n}\n.pager li > a:hover,\n.pager li > a:focus {\n  text-decoration: none;\n  background-color: #eeeeee;\n}\n.pager .next > a,\n.pager .next > span {\n  float: right;\n}\n.pager .previous > a,\n.pager .previous > span {\n  float: left;\n}\n.pager .disabled > a,\n.pager .disabled > a:hover,\n.pager .disabled > a:focus,\n.pager .disabled > span {\n  color: #777777;\n  background-color: #eeeeee;\n  cursor: not-allowed;\n}\n.label {\n  display: inline;\n  padding: .2em .6em .3em;\n  font-size: 75%;\n  font-weight: bold;\n  line-height: 1;\n  color: #eeeeee;\n  text-align: center;\n  white-space: nowrap;\n  vertical-align: baseline;\n  border-radius: .25em;\n}\na.label:hover,\na.label:focus {\n  color: #eeeeee;\n  text-decoration: none;\n  cursor: pointer;\n}\n.label:empty {\n  display: none;\n}\n.btn .label {\n  position: relative;\n  top: -1px;\n}\n.label-default {\n  background-color: #777777;\n}\n.label-default[href]:hover,\n.label-default[href]:focus {\n  background-color: #5e5e5e;\n}\n.label-primary {\n  background-color: #4CAF50;\n}\n.label-primary[href]:hover,\n.label-primary[href]:focus {\n  background-color: #3d8b40;\n}\n.label-success {\n  background-color: #457E86;\n}\n.label-success[href]:hover,\n.label-success[href]:focus {\n  background-color: #345e64;\n}\n.label-info {\n  background-color: #4A2B0F;\n}\n.label-info[href]:hover,\n.label-info[href]:focus {\n  background-color: #201206;\n}\n.label-warning {\n  background-color: #f0ad4e;\n}\n.label-warning[href]:hover,\n.label-warning[href]:focus {\n  background-color: #ec971f;\n}\n.label-danger {\n  background-color: #d9534f;\n}\n.label-danger[href]:hover,\n.label-danger[href]:focus {\n  background-color: #c9302c;\n}\n.badge {\n  display: inline-block;\n  min-width: 10px;\n  padding: 3px 7px;\n  font-size: 12px;\n  font-weight: bold;\n  color: #eeeeee;\n  line-height: 1;\n  vertical-align: baseline;\n  white-space: nowrap;\n  text-align: center;\n  background-color: #777777;\n  border-radius: 10px;\n}\n.badge:empty {\n  display: none;\n}\n.btn .badge {\n  position: relative;\n  top: -1px;\n}\n.btn-xs .badge {\n  top: 0;\n  padding: 1px 5px;\n}\na.badge:hover,\na.badge:focus {\n  color: #eeeeee;\n  text-decoration: none;\n  cursor: pointer;\n}\na.list-group-item.active > .badge,\n.nav-pills > .active > a > .badge {\n  color: #4CAF50;\n  background-color: #eeeeee;\n}\n.nav-pills > li > a > .badge {\n  margin-left: 3px;\n}\n.jumbotron {\n  padding: 30px 15px;\n  margin-bottom: 30px;\n  color: inherit;\n  background-color: #eeeeee;\n}\n.jumbotron h1,\n.jumbotron .h1 {\n  color: inherit;\n}\n.jumbotron p {\n  margin-bottom: 15px;\n  font-size: 21px;\n  font-weight: 200;\n}\n.jumbotron > hr {\n  border-top-color: #d5d5d5;\n}\n.container .jumbotron,\n.container-fluid .jumbotron {\n  border-radius: 6px;\n}\n.jumbotron .container {\n  max-width: 100%;\n}\n@media screen and (min-width: 768px) {\n  .jumbotron {\n    padding: 48px 0;\n  }\n  .container .jumbotron {\n    padding-left: 60px;\n    padding-right: 60px;\n  }\n  .jumbotron h1,\n  .jumbotron .h1 {\n    font-size: 63px;\n  }\n}\n.thumbnail {\n  display: block;\n  padding: 4px;\n  margin-bottom: 20px;\n  line-height: 1.42857143;\n  background-color: #ffffff;\n  border: 1px solid #ddd;\n  border-radius: 4px;\n  -webkit-transition: border 0.2s ease-in-out;\n  -o-transition: border 0.2s ease-in-out;\n  transition: border 0.2s ease-in-out;\n}\n.thumbnail > img,\n.thumbnail a > img {\n  margin-left: auto;\n  margin-right: auto;\n}\na.thumbnail:hover,\na.thumbnail:focus,\na.thumbnail.active {\n  border-color: #4CAF50;\n}\n.thumbnail .caption {\n  padding: 9px;\n  color: #333333;\n}\n.alert {\n  padding: 15px;\n  margin-bottom: 20px;\n  border: 1px solid transparent;\n  border-radius: 4px;\n}\n.alert h4 {\n  margin-top: 0;\n  color: inherit;\n}\n.alert .alert-link {\n  font-weight: bold;\n}\n.alert > p,\n.alert > ul {\n  margin-bottom: 0;\n}\n.alert > p + p {\n  margin-top: 5px;\n}\n.alert-dismissable,\n.alert-dismissible {\n  padding-right: 35px;\n}\n.alert-dismissable .close,\n.alert-dismissible .close {\n  position: relative;\n  top: -2px;\n  right: -21px;\n  color: inherit;\n}\n.alert-success {\n  background-color: #dff0d8;\n  border-color: #d6e9c6;\n  color: #215f1e;\n}\n.alert-success hr {\n  border-top-color: #c9e2b3;\n}\n.alert-success .alert-link {\n  color: #143812;\n}\n.alert-info {\n  background-color: #d9edf7;\n  border-color: #bce8f1;\n  color: #31708f;\n}\n.alert-info hr {\n  border-top-color: #a6e1ec;\n}\n.alert-info .alert-link {\n  color: #245269;\n}\n.alert-warning {\n  background-color: #fcf8e3;\n  border-color: #faebcc;\n  color: #8a6d3b;\n}\n.alert-warning hr {\n  border-top-color: #f7e1b5;\n}\n.alert-warning .alert-link {\n  color: #66512c;\n}\n.alert-danger {\n  background-color: #f2dede;\n  border-color: #ebccd1;\n  color: #a94442;\n}\n.alert-danger hr {\n  border-top-color: #e4b9c0;\n}\n.alert-danger .alert-link {\n  color: #843534;\n}\n@-webkit-keyframes progress-bar-stripes {\n  from {\n    background-position: 40px 0;\n  }\n  to {\n    background-position: 0 0;\n  }\n}\n@keyframes progress-bar-stripes {\n  from {\n    background-position: 40px 0;\n  }\n  to {\n    background-position: 0 0;\n  }\n}\n.progress {\n  overflow: hidden;\n  height: 20px;\n  margin-bottom: 20px;\n  background-color: #f5f5f5;\n  border-radius: 4px;\n  -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);\n  box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);\n}\n.progress-bar {\n  float: left;\n  width: 0%;\n  height: 100%;\n  font-size: 12px;\n  line-height: 20px;\n  color: #eeeeee;\n  text-align: center;\n  background-color: #4CAF50;\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  -o-transition: width 0.6s ease;\n  transition: width 0.6s ease;\n}\n.progress-striped .progress-bar,\n.progress-bar-striped {\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: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-size: 40px 40px;\n}\n.progress.active .progress-bar,\n.progress-bar.active {\n  -webkit-animation: progress-bar-stripes 2s linear infinite;\n  -o-animation: progress-bar-stripes 2s linear infinite;\n  animation: progress-bar-stripes 2s linear infinite;\n}\n.progress-bar-success {\n  background-color: #457E86;\n}\n.progress-striped .progress-bar-success {\n  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.progress-bar-info {\n  background-color: #4A2B0F;\n}\n.progress-striped .progress-bar-info {\n  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.progress-bar-warning {\n  background-color: #f0ad4e;\n}\n.progress-striped .progress-bar-warning {\n  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.progress-bar-danger {\n  background-color: #d9534f;\n}\n.progress-striped .progress-bar-danger {\n  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.media {\n  margin-top: 15px;\n}\n.media:first-child {\n  margin-top: 0;\n}\n.media-right,\n.media > .pull-right {\n  padding-left: 10px;\n}\n.media-left,\n.media > .pull-left {\n  padding-right: 10px;\n}\n.media-left,\n.media-right,\n.media-body {\n  display: table-cell;\n  vertical-align: top;\n}\n.media-middle {\n  vertical-align: middle;\n}\n.media-bottom {\n  vertical-align: bottom;\n}\n.media-heading {\n  margin-top: 0;\n  margin-bottom: 5px;\n}\n.media-list {\n  padding-left: 0;\n  list-style: none;\n}\n.list-group {\n  margin-bottom: 20px;\n  padding-left: 0;\n}\n.list-group-item {\n  position: relative;\n  display: block;\n  padding: 10px 15px;\n  margin-bottom: -1px;\n  background-color: #ffffff;\n  border: 1px solid #ddd;\n}\n.list-group-item:first-child {\n  border-top-right-radius: 4px;\n  border-top-left-radius: 4px;\n}\n.list-group-item:last-child {\n  margin-bottom: 0;\n  border-bottom-right-radius: 4px;\n  border-bottom-left-radius: 4px;\n}\n.list-group-item > .badge {\n  float: right;\n}\n.list-group-item > .badge + .badge {\n  margin-right: 5px;\n}\na.list-group-item {\n  color: #555;\n}\na.list-group-item .list-group-item-heading {\n  color: #333;\n}\na.list-group-item:hover,\na.list-group-item:focus {\n  text-decoration: none;\n  color: #555;\n  background-color: #f5f5f5;\n}\n.list-group-item.disabled,\n.list-group-item.disabled:hover,\n.list-group-item.disabled:focus {\n  background-color: #eeeeee;\n  color: #777777;\n  cursor: not-allowed;\n}\n.list-group-item.disabled .list-group-item-heading,\n.list-group-item.disabled:hover .list-group-item-heading,\n.list-group-item.disabled:focus .list-group-item-heading {\n  color: inherit;\n}\n.list-group-item.disabled .list-group-item-text,\n.list-group-item.disabled:hover .list-group-item-text,\n.list-group-item.disabled:focus .list-group-item-text {\n  color: #777777;\n}\n.list-group-item.active,\n.list-group-item.active:hover,\n.list-group-item.active:focus {\n  z-index: 2;\n  color: #eeeeee;\n  background-color: #4CAF50;\n  border-color: #4CAF50;\n}\n.list-group-item.active .list-group-item-heading,\n.list-group-item.active:hover .list-group-item-heading,\n.list-group-item.active:focus .list-group-item-heading,\n.list-group-item.active .list-group-item-heading > small,\n.list-group-item.active:hover .list-group-item-heading > small,\n.list-group-item.active:focus .list-group-item-heading > small,\n.list-group-item.active .list-group-item-heading > .small,\n.list-group-item.active:hover .list-group-item-heading > .small,\n.list-group-item.active:focus .list-group-item-heading > .small {\n  color: inherit;\n}\n.list-group-item.active .list-group-item-text,\n.list-group-item.active:hover .list-group-item-text,\n.list-group-item.active:focus .list-group-item-text {\n  color: #d9eeda;\n}\n.list-group-item-success {\n  color: #215f1e;\n  background-color: #dff0d8;\n}\na.list-group-item-success {\n  color: #215f1e;\n}\na.list-group-item-success .list-group-item-heading {\n  color: inherit;\n}\na.list-group-item-success:hover,\na.list-group-item-success:focus {\n  color: #215f1e;\n  background-color: #d0e9c6;\n}\na.list-group-item-success.active,\na.list-group-item-success.active:hover,\na.list-group-item-success.active:focus {\n  color: #fff;\n  background-color: #215f1e;\n  border-color: #215f1e;\n}\n.list-group-item-info {\n  color: #31708f;\n  background-color: #d9edf7;\n}\na.list-group-item-info {\n  color: #31708f;\n}\na.list-group-item-info .list-group-item-heading {\n  color: inherit;\n}\na.list-group-item-info:hover,\na.list-group-item-info:focus {\n  color: #31708f;\n  background-color: #c4e3f3;\n}\na.list-group-item-info.active,\na.list-group-item-info.active:hover,\na.list-group-item-info.active:focus {\n  color: #fff;\n  background-color: #31708f;\n  border-color: #31708f;\n}\n.list-group-item-warning {\n  color: #8a6d3b;\n  background-color: #fcf8e3;\n}\na.list-group-item-warning {\n  color: #8a6d3b;\n}\na.list-group-item-warning .list-group-item-heading {\n  color: inherit;\n}\na.list-group-item-warning:hover,\na.list-group-item-warning:focus {\n  color: #8a6d3b;\n  background-color: #faf2cc;\n}\na.list-group-item-warning.active,\na.list-group-item-warning.active:hover,\na.list-group-item-warning.active:focus {\n  color: #fff;\n  background-color: #8a6d3b;\n  border-color: #8a6d3b;\n}\n.list-group-item-danger {\n  color: #a94442;\n  background-color: #f2dede;\n}\na.list-group-item-danger {\n  color: #a94442;\n}\na.list-group-item-danger .list-group-item-heading {\n  color: inherit;\n}\na.list-group-item-danger:hover,\na.list-group-item-danger:focus {\n  color: #a94442;\n  background-color: #ebcccc;\n}\na.list-group-item-danger.active,\na.list-group-item-danger.active:hover,\na.list-group-item-danger.active:focus {\n  color: #fff;\n  background-color: #a94442;\n  border-color: #a94442;\n}\n.list-group-item-heading {\n  margin-top: 0;\n  margin-bottom: 5px;\n}\n.list-group-item-text {\n  margin-bottom: 0;\n  line-height: 1.3;\n}\n.panel {\n  margin-bottom: 20px;\n  background-color: #eeeeee;\n  border: 1px solid transparent;\n  border-radius: 4px;\n  -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05);\n  box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05);\n}\n.panel-body {\n  padding: 15px;\n}\n.panel-heading {\n  padding: 10px 15px;\n  border-bottom: 1px solid transparent;\n  border-top-right-radius: 3px;\n  border-top-left-radius: 3px;\n}\n.panel-heading > .dropdown .dropdown-toggle {\n  color: inherit;\n}\n.panel-title {\n  margin-top: 0;\n  margin-bottom: 0;\n  font-size: 16px;\n  color: inherit;\n}\n.panel-title > a {\n  color: inherit;\n}\n.panel-footer {\n  padding: 10px 15px;\n  background-color: #dedede;\n  border-top: 1px solid #ccc;\n  border-bottom-right-radius: 3px;\n  border-bottom-left-radius: 3px;\n}\n.panel > .list-group,\n.panel > .panel-collapse > .list-group {\n  margin-bottom: 0;\n}\n.panel > .list-group .list-group-item,\n.panel > .panel-collapse > .list-group .list-group-item {\n  border-width: 1px 0;\n  border-radius: 0;\n}\n.panel > .list-group:first-child .list-group-item:first-child,\n.panel > .panel-collapse > .list-group:first-child .list-group-item:first-child {\n  border-top: 0;\n  border-top-right-radius: 3px;\n  border-top-left-radius: 3px;\n}\n.panel > .list-group:last-child .list-group-item:last-child,\n.panel > .panel-collapse > .list-group:last-child .list-group-item:last-child {\n  border-bottom: 0;\n  border-bottom-right-radius: 3px;\n  border-bottom-left-radius: 3px;\n}\n.panel-heading + .list-group .list-group-item:first-child {\n  border-top-width: 0;\n}\n.list-group + .panel-footer {\n  border-top-width: 0;\n}\n.panel > .table,\n.panel > .table-responsive > .table,\n.panel > .panel-collapse > .table {\n  margin-bottom: 0;\n}\n.panel > .table caption,\n.panel > .table-responsive > .table caption,\n.panel > .panel-collapse > .table caption {\n  padding-left: 15px;\n  padding-right: 15px;\n}\n.panel > .table:first-child,\n.panel > .table-responsive:first-child > .table:first-child {\n  border-top-right-radius: 3px;\n  border-top-left-radius: 3px;\n}\n.panel > .table:first-child > thead:first-child > tr:first-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child {\n  border-top-left-radius: 3px;\n  border-top-right-radius: 3px;\n}\n.panel > .table:first-child > thead:first-child > tr:first-child td:first-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:first-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child td:first-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:first-child,\n.panel > .table:first-child > thead:first-child > tr:first-child th:first-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:first-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child th:first-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:first-child {\n  border-top-left-radius: 3px;\n}\n.panel > .table:first-child > thead:first-child > tr:first-child td:last-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:last-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child td:last-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:last-child,\n.panel > .table:first-child > thead:first-child > tr:first-child th:last-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:last-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child th:last-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:last-child {\n  border-top-right-radius: 3px;\n}\n.panel > .table:last-child,\n.panel > .table-responsive:last-child > .table:last-child {\n  border-bottom-right-radius: 3px;\n  border-bottom-left-radius: 3px;\n}\n.panel > .table:last-child > tbody:last-child > tr:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child {\n  border-bottom-left-radius: 3px;\n  border-bottom-right-radius: 3px;\n}\n.panel > .table:last-child > tbody:last-child > tr:last-child td:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:first-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child td:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:first-child,\n.panel > .table:last-child > tbody:last-child > tr:last-child th:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:first-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child th:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:first-child {\n  border-bottom-left-radius: 3px;\n}\n.panel > .table:last-child > tbody:last-child > tr:last-child td:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:last-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child td:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:last-child,\n.panel > .table:last-child > tbody:last-child > tr:last-child th:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:last-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child th:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:last-child {\n  border-bottom-right-radius: 3px;\n}\n.panel > .panel-body + .table,\n.panel > .panel-body + .table-responsive,\n.panel > .table + .panel-body,\n.panel > .table-responsive + .panel-body {\n  border-top: 1px solid #ddd;\n}\n.panel > .table > tbody:first-child > tr:first-child th,\n.panel > .table > tbody:first-child > tr:first-child td {\n  border-top: 0;\n}\n.panel > .table-bordered,\n.panel > .table-responsive > .table-bordered {\n  border: 0;\n}\n.panel > .table-bordered > thead > tr > th:first-child,\n.panel > .table-responsive > .table-bordered > thead > tr > th:first-child,\n.panel > .table-bordered > tbody > tr > th:first-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > th:first-child,\n.panel > .table-bordered > tfoot > tr > th:first-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > th:first-child,\n.panel > .table-bordered > thead > tr > td:first-child,\n.panel > .table-responsive > .table-bordered > thead > tr > td:first-child,\n.panel > .table-bordered > tbody > tr > td:first-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > td:first-child,\n.panel > .table-bordered > tfoot > tr > td:first-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > td:first-child {\n  border-left: 0;\n}\n.panel > .table-bordered > thead > tr > th:last-child,\n.panel > .table-responsive > .table-bordered > thead > tr > th:last-child,\n.panel > .table-bordered > tbody > tr > th:last-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > th:last-child,\n.panel > .table-bordered > tfoot > tr > th:last-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > th:last-child,\n.panel > .table-bordered > thead > tr > td:last-child,\n.panel > .table-responsive > .table-bordered > thead > tr > td:last-child,\n.panel > .table-bordered > tbody > tr > td:last-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > td:last-child,\n.panel > .table-bordered > tfoot > tr > td:last-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > td:last-child {\n  border-right: 0;\n}\n.panel > .table-bordered > thead > tr:first-child > td,\n.panel > .table-responsive > .table-bordered > thead > tr:first-child > td,\n.panel > .table-bordered > tbody > tr:first-child > td,\n.panel > .table-responsive > .table-bordered > tbody > tr:first-child > td,\n.panel > .table-bordered > thead > tr:first-child > th,\n.panel > .table-responsive > .table-bordered > thead > tr:first-child > th,\n.panel > .table-bordered > tbody > tr:first-child > th,\n.panel > .table-responsive > .table-bordered > tbody > tr:first-child > th {\n  border-bottom: 0;\n}\n.panel > .table-bordered > tbody > tr:last-child > td,\n.panel > .table-responsive > .table-bordered > tbody > tr:last-child > td,\n.panel > .table-bordered > tfoot > tr:last-child > td,\n.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > td,\n.panel > .table-bordered > tbody > tr:last-child > th,\n.panel > .table-responsive > .table-bordered > tbody > tr:last-child > th,\n.panel > .table-bordered > tfoot > tr:last-child > th,\n.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > th {\n  border-bottom: 0;\n}\n.panel > .table-responsive {\n  border: 0;\n  margin-bottom: 0;\n}\n.panel-group {\n  margin-bottom: 20px;\n}\n.panel-group .panel {\n  margin-bottom: 0;\n  border-radius: 4px;\n}\n.panel-group .panel + .panel {\n  margin-top: 5px;\n}\n.panel-group .panel-heading {\n  border-bottom: 0;\n}\n.panel-group .panel-heading + .panel-collapse > .panel-body,\n.panel-group .panel-heading + .panel-collapse > .list-group {\n  border-top: 1px solid #ccc;\n}\n.panel-group .panel-footer {\n  border-top: 0;\n}\n.panel-group .panel-footer + .panel-collapse .panel-body {\n  border-bottom: 1px solid #ccc;\n}\n.panel-default {\n  border-color: #ddd;\n}\n.panel-default > .panel-heading {\n  color: #333333;\n  background-color: #f5f5f5;\n  border-color: #ddd;\n}\n.panel-default > .panel-heading + .panel-collapse > .panel-body {\n  border-top-color: #ddd;\n}\n.panel-default > .panel-heading .badge {\n  color: #f5f5f5;\n  background-color: #333333;\n}\n.panel-default > .panel-footer + .panel-collapse > .panel-body {\n  border-bottom-color: #ddd;\n}\n.panel-primary {\n  border-color: #4CAF50;\n}\n.panel-primary > .panel-heading {\n  color: #eeeeee;\n  background-color: #4CAF50;\n  border-color: #4CAF50;\n}\n.panel-primary > .panel-heading + .panel-collapse > .panel-body {\n  border-top-color: #4CAF50;\n}\n.panel-primary > .panel-heading .badge {\n  color: #4CAF50;\n  background-color: #eeeeee;\n}\n.panel-primary > .panel-footer + .panel-collapse > .panel-body {\n  border-bottom-color: #4CAF50;\n}\n.panel-success {\n  border-color: #d6e9c6;\n}\n.panel-success > .panel-heading {\n  color: #215f1e;\n  background-color: #dff0d8;\n  border-color: #d6e9c6;\n}\n.panel-success > .panel-heading + .panel-collapse > .panel-body {\n  border-top-color: #d6e9c6;\n}\n.panel-success > .panel-heading .badge {\n  color: #dff0d8;\n  background-color: #215f1e;\n}\n.panel-success > .panel-footer + .panel-collapse > .panel-body {\n  border-bottom-color: #d6e9c6;\n}\n.panel-info {\n  border-color: #449d48;\n}\n.panel-info > .panel-heading {\n  color: #eeeeee;\n  background-color: #4CAF50;\n  border-color: #449d48;\n}\n.panel-info > .panel-heading + .panel-collapse > .panel-body {\n  border-top-color: #449d48;\n}\n.panel-info > .panel-heading .badge {\n  color: #4CAF50;\n  background-color: #eeeeee;\n}\n.panel-info > .panel-footer + .panel-collapse > .panel-body {\n  border-bottom-color: #449d48;\n}\n.panel-warning {\n  border-color: #faebcc;\n}\n.panel-warning > .panel-heading {\n  color: #8a6d3b;\n  background-color: #fcf8e3;\n  border-color: #faebcc;\n}\n.panel-warning > .panel-heading + .panel-collapse > .panel-body {\n  border-top-color: #faebcc;\n}\n.panel-warning > .panel-heading .badge {\n  color: #fcf8e3;\n  background-color: #8a6d3b;\n}\n.panel-warning > .panel-footer + .panel-collapse > .panel-body {\n  border-bottom-color: #faebcc;\n}\n.panel-danger {\n  border-color: #ebccd1;\n}\n.panel-danger > .panel-heading {\n  color: #a94442;\n  background-color: #f2dede;\n  border-color: #ebccd1;\n}\n.panel-danger > .panel-heading + .panel-collapse > .panel-body {\n  border-top-color: #ebccd1;\n}\n.panel-danger > .panel-heading .badge {\n  color: #f2dede;\n  background-color: #a94442;\n}\n.panel-danger > .panel-footer + .panel-collapse > .panel-body {\n  border-bottom-color: #ebccd1;\n}\n.embed-responsive {\n  position: relative;\n  display: block;\n  height: 0;\n  padding: 0;\n  overflow: hidden;\n}\n.embed-responsive .embed-responsive-item,\n.embed-responsive iframe,\n.embed-responsive embed,\n.embed-responsive object,\n.embed-responsive video {\n  position: absolute;\n  top: 0;\n  left: 0;\n  bottom: 0;\n  height: 100%;\n  width: 100%;\n  border: 0;\n}\n.embed-responsive.embed-responsive-16by9 {\n  padding-bottom: 56.25%;\n}\n.embed-responsive.embed-responsive-4by3 {\n  padding-bottom: 75%;\n}\n.well {\n  min-height: 20px;\n  padding: 19px;\n  margin-bottom: 20px;\n  background-color: #f5f5f5;\n  border: 1px solid #e3e3e3;\n  border-radius: 4px;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);\n  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);\n}\n.well blockquote {\n  border-color: #ddd;\n  border-color: rgba(0, 0, 0, 0.15);\n}\n.well-lg {\n  padding: 24px;\n  border-radius: 6px;\n}\n.well-sm {\n  padding: 9px;\n  border-radius: 3px;\n}\n.close {\n  float: right;\n  font-size: 21px;\n  font-weight: bold;\n  line-height: 1;\n  color: #000;\n  text-shadow: 0 1px 0 #eeeeee;\n  opacity: 0.2;\n  -ms-filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=20);\n  filter: alpha(opacity=20);\n}\n.close:hover,\n.close:focus {\n  color: #000;\n  text-decoration: none;\n  cursor: pointer;\n  opacity: 0.5;\n  -ms-filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=50);\n  filter: alpha(opacity=50);\n}\nbutton.close {\n  padding: 0;\n  cursor: pointer;\n  background: transparent;\n  border: 0;\n  -webkit-appearance: none;\n}\n.modal-open {\n  overflow: hidden;\n}\n.modal {\n  display: none;\n  overflow: hidden;\n  position: fixed;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  z-index: 1040;\n  -webkit-overflow-scrolling: touch;\n  outline: 0;\n}\n.modal.fade .modal-dialog {\n  -webkit-transform: translate(0, -25%);\n  -ms-transform: translate(0, -25%);\n  -o-transform: translate(0, -25%);\n  transform: translate(0, -25%);\n  -webkit-transition: -webkit-transform 0.3s ease-out;\n  -moz-transition: -moz-transform 0.3s ease-out;\n  -o-transition: -o-transform 0.3s ease-out;\n  transition: transform 0.3s ease-out;\n}\n.modal.in .modal-dialog {\n  -webkit-transform: translate(0, 0);\n  -ms-transform: translate(0, 0);\n  -o-transform: translate(0, 0);\n  transform: translate(0, 0);\n}\n.modal-open .modal {\n  overflow-x: hidden;\n  overflow-y: auto;\n}\n.modal-dialog {\n  position: relative;\n  width: auto;\n  margin: 10px;\n}\n.modal-content {\n  position: relative;\n  background-color: #eeeeee;\n  border: 1px solid #999;\n  border: 1px solid rgba(0, 0, 0, 0.2);\n  border-radius: 6px;\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  outline: 0;\n}\n.modal-backdrop {\n  position: fixed;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  background-color: #000;\n}\n.modal-backdrop.fade {\n  opacity: 0;\n  -ms-filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=0);\n  filter: alpha(opacity=0);\n}\n.modal-backdrop.in {\n  opacity: 0.5;\n  -ms-filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=50);\n  filter: alpha(opacity=50);\n}\n.modal-header {\n  padding: 15px;\n  border-bottom: 1px solid #e5e5e5;\n  min-height: 16.42857143px;\n}\n.modal-header .close {\n  margin-top: -2px;\n}\n.modal-title {\n  margin: 0;\n  line-height: 1.42857143;\n}\n.modal-body {\n  position: relative;\n  padding: 15px;\n}\n.modal-footer {\n  padding: 15px;\n  text-align: right;\n  border-top: 1px solid #e5e5e5;\n}\n.modal-footer .btn + .btn {\n  margin-left: 5px;\n  margin-bottom: 0;\n}\n.modal-footer .btn-group .btn + .btn {\n  margin-left: -1px;\n}\n.modal-footer .btn-block + .btn-block {\n  margin-left: 0;\n}\n.modal-scrollbar-measure {\n  position: absolute;\n  top: -9999px;\n  width: 50px;\n  height: 50px;\n  overflow: scroll;\n}\n@media (min-width: 768px) {\n  .modal-dialog {\n    width: 600px;\n    margin: 30px auto;\n  }\n  .modal-content {\n    -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  .modal-sm {\n    width: 300px;\n  }\n}\n@media (min-width: 1031px) {\n  .modal-lg {\n    width: 900px;\n  }\n}\n.tooltip {\n  position: absolute;\n  z-index: 1070;\n  display: block;\n  visibility: visible;\n  font-size: 12px;\n  line-height: 1.4;\n  opacity: 0;\n  -ms-filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=0);\n  filter: alpha(opacity=0);\n}\n.tooltip.in {\n  opacity: 0.9;\n  -ms-filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=90);\n  filter: alpha(opacity=90);\n}\n.tooltip.top {\n  margin-top: -3px;\n  padding: 5px 0;\n}\n.tooltip.right {\n  margin-left: 3px;\n  padding: 0 5px;\n}\n.tooltip.bottom {\n  margin-top: 3px;\n  padding: 5px 0;\n}\n.tooltip.left {\n  margin-left: -3px;\n  padding: 0 5px;\n}\n.tooltip-inner {\n  max-width: 200px;\n  padding: 3px 8px;\n  color: #eeeeee;\n  text-align: center;\n  text-decoration: none;\n  background-color: #000;\n  border-radius: 4px;\n}\n.tooltip-arrow {\n  position: absolute;\n  width: 0;\n  height: 0;\n  border-color: transparent;\n  border-style: solid;\n}\n.tooltip.top .tooltip-arrow {\n  bottom: 0;\n  left: 50%;\n  margin-left: -5px;\n  border-width: 5px 5px 0;\n  border-top-color: #000;\n}\n.tooltip.top-left .tooltip-arrow {\n  bottom: 0;\n  left: 5px;\n  border-width: 5px 5px 0;\n  border-top-color: #000;\n}\n.tooltip.top-right .tooltip-arrow {\n  bottom: 0;\n  right: 5px;\n  border-width: 5px 5px 0;\n  border-top-color: #000;\n}\n.tooltip.right .tooltip-arrow {\n  top: 50%;\n  left: 0;\n  margin-top: -5px;\n  border-width: 5px 5px 5px 0;\n  border-right-color: #000;\n}\n.tooltip.left .tooltip-arrow {\n  top: 50%;\n  right: 0;\n  margin-top: -5px;\n  border-width: 5px 0 5px 5px;\n  border-left-color: #000;\n}\n.tooltip.bottom .tooltip-arrow {\n  top: 0;\n  left: 50%;\n  margin-left: -5px;\n  border-width: 0 5px 5px;\n  border-bottom-color: #000;\n}\n.tooltip.bottom-left .tooltip-arrow {\n  top: 0;\n  left: 5px;\n  border-width: 0 5px 5px;\n  border-bottom-color: #000;\n}\n.tooltip.bottom-right .tooltip-arrow {\n  top: 0;\n  right: 5px;\n  border-width: 0 5px 5px;\n  border-bottom-color: #000;\n}\n.popover {\n  position: absolute;\n  top: 0;\n  left: 0;\n  z-index: 1060;\n  display: none;\n  max-width: 276px;\n  padding: 1px;\n  font-size: 14px;\n  font-weight: normal;\n  line-height: 1.42857143;\n  text-align: left;\n  background-color: #eeeeee;\n  background-clip: padding-box;\n  border: 1px solid #ccc;\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  white-space: normal;\n}\n.popover.top {\n  margin-top: -10px;\n}\n.popover.right {\n  margin-left: 10px;\n}\n.popover.bottom {\n  margin-top: 10px;\n}\n.popover.left {\n  margin-left: -10px;\n}\n.popover-title {\n  margin: 0;\n  padding: 8px 14px;\n  font-size: 14px;\n  background-color: #e7e7e7;\n  border-bottom: 1px solid #dadada;\n  border-radius: 5px 5px 0 0;\n}\n.popover-content {\n  padding: 9px 14px;\n}\n.popover > .arrow,\n.popover > .arrow:after {\n  position: absolute;\n  display: block;\n  width: 0;\n  height: 0;\n  border-color: transparent;\n  border-style: solid;\n}\n.popover > .arrow {\n  border-width: 11px;\n}\n.popover > .arrow:after {\n  border-width: 10px;\n  content: \"\";\n}\n.popover.top > .arrow {\n  left: 50%;\n  margin-left: -11px;\n  border-bottom-width: 0;\n  border-top-color: #999999;\n  border-top-color: rgba(0, 0, 0, 0.25);\n  bottom: -11px;\n}\n.popover.top > .arrow:after {\n  content: \" \";\n  bottom: 1px;\n  margin-left: -10px;\n  border-bottom-width: 0;\n  border-top-color: #eeeeee;\n}\n.popover.right > .arrow {\n  top: 50%;\n  left: -11px;\n  margin-top: -11px;\n  border-left-width: 0;\n  border-right-color: #999999;\n  border-right-color: rgba(0, 0, 0, 0.25);\n}\n.popover.right > .arrow:after {\n  content: \" \";\n  left: 1px;\n  bottom: -10px;\n  border-left-width: 0;\n  border-right-color: #eeeeee;\n}\n.popover.bottom > .arrow {\n  left: 50%;\n  margin-left: -11px;\n  border-top-width: 0;\n  border-bottom-color: #999999;\n  border-bottom-color: rgba(0, 0, 0, 0.25);\n  top: -11px;\n}\n.popover.bottom > .arrow:after {\n  content: \" \";\n  top: 1px;\n  margin-left: -10px;\n  border-top-width: 0;\n  border-bottom-color: #eeeeee;\n}\n.popover.left > .arrow {\n  top: 50%;\n  right: -11px;\n  margin-top: -11px;\n  border-right-width: 0;\n  border-left-color: #999999;\n  border-left-color: rgba(0, 0, 0, 0.25);\n}\n.popover.left > .arrow:after {\n  content: \" \";\n  right: 1px;\n  border-right-width: 0;\n  border-left-color: #eeeeee;\n  bottom: -10px;\n}\n.carousel {\n  position: relative;\n}\n.carousel-inner {\n  position: relative;\n  overflow: hidden;\n  width: 100%;\n}\n.carousel-inner > .item {\n  display: none;\n  position: relative;\n  -webkit-transition: 0.6s ease-in-out left;\n  -o-transition: 0.6s ease-in-out left;\n  transition: 0.6s ease-in-out left;\n}\n.carousel-inner > .item > img,\n.carousel-inner > .item > a > img {\n  line-height: 1;\n}\n@media all and (transform-3d), (-webkit-transform-3d) {\n  .carousel-inner > .item {\n    transition: transform 0.6s ease-in-out;\n    backface-visibility: hidden;\n    perspective: 1000;\n  }\n  .carousel-inner > .item.next,\n  .carousel-inner > .item.active.right {\n    transform: translate3d(100%, 0, 0);\n    left: 0;\n  }\n  .carousel-inner > .item.prev,\n  .carousel-inner > .item.active.left {\n    transform: translate3d(-100%, 0, 0);\n    left: 0;\n  }\n  .carousel-inner > .item.next.left,\n  .carousel-inner > .item.prev.right,\n  .carousel-inner > .item.active {\n    transform: translate3d(0, 0, 0);\n    left: 0;\n  }\n}\n.carousel-inner > .active,\n.carousel-inner > .next,\n.carousel-inner > .prev {\n  display: block;\n}\n.carousel-inner > .active {\n  left: 0;\n}\n.carousel-inner > .next,\n.carousel-inner > .prev {\n  position: absolute;\n  top: 0;\n  width: 100%;\n}\n.carousel-inner > .next {\n  left: 100%;\n}\n.carousel-inner > .prev {\n  left: -100%;\n}\n.carousel-inner > .next.left,\n.carousel-inner > .prev.right {\n  left: 0;\n}\n.carousel-inner > .active.left {\n  left: -100%;\n}\n.carousel-inner > .active.right {\n  left: 100%;\n}\n.carousel-control {\n  position: absolute;\n  top: 0;\n  left: 0;\n  bottom: 0;\n  width: 15%;\n  opacity: 0.5;\n  -ms-filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=50);\n  filter: alpha(opacity=50);\n  font-size: 20px;\n  color: #eeeeee;\n  text-align: center;\n  text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6);\n}\n.carousel-control.left {\n  background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%);\n  background-image: -o-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.carousel-control.right {\n  left: auto;\n  right: 0;\n  background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%);\n  background-image: -o-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.carousel-control:hover,\n.carousel-control:focus {\n  outline: 0;\n  color: #eeeeee;\n  text-decoration: none;\n  opacity: 0.9;\n  -ms-filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=90);\n  filter: alpha(opacity=90);\n}\n.carousel-control .icon-prev,\n.carousel-control .icon-next,\n.carousel-control .glyphicon-chevron-left,\n.carousel-control .glyphicon-chevron-right {\n  position: absolute;\n  top: 50%;\n  z-index: 5;\n  display: inline-block;\n}\n.carousel-control .icon-prev,\n.carousel-control .glyphicon-chevron-left {\n  left: 50%;\n  margin-left: -10px;\n}\n.carousel-control .icon-next,\n.carousel-control .glyphicon-chevron-right {\n  right: 50%;\n  margin-right: -10px;\n}\n.carousel-control .icon-prev,\n.carousel-control .icon-next {\n  width: 20px;\n  height: 20px;\n  margin-top: -10px;\n  font-family: serif;\n}\n.carousel-control .icon-prev:before {\n  content: '\\2039';\n}\n.carousel-control .icon-next:before {\n  content: '\\203a';\n}\n.carousel-indicators {\n  position: absolute;\n  bottom: 10px;\n  left: 50%;\n  z-index: 15;\n  width: 60%;\n  margin-left: -30%;\n  padding-left: 0;\n  list-style: none;\n  text-align: center;\n}\n.carousel-indicators li {\n  display: inline-block;\n  width: 10px;\n  height: 10px;\n  margin: 1px;\n  text-indent: -999px;\n  border: 1px solid #eeeeee;\n  border-radius: 10px;\n  cursor: pointer;\n  background-color: #000 \\9;\n  background-color: rgba(0, 0, 0, 0);\n}\n.carousel-indicators .active {\n  margin: 0;\n  width: 12px;\n  height: 12px;\n  background-color: #eeeeee;\n}\n.carousel-caption {\n  position: absolute;\n  left: 15%;\n  right: 15%;\n  bottom: 20px;\n  z-index: 10;\n  padding-top: 20px;\n  padding-bottom: 20px;\n  color: #eeeeee;\n  text-align: center;\n  text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6);\n}\n.carousel-caption .btn {\n  text-shadow: none;\n}\n@media screen and (min-width: 768px) {\n  .carousel-control .glyphicon-chevron-left,\n  .carousel-control .glyphicon-chevron-right,\n  .carousel-control .icon-prev,\n  .carousel-control .icon-next {\n    width: 30px;\n    height: 30px;\n    margin-top: -15px;\n    font-size: 30px;\n  }\n  .carousel-control .glyphicon-chevron-left,\n  .carousel-control .icon-prev {\n    margin-left: -15px;\n  }\n  .carousel-control .glyphicon-chevron-right,\n  .carousel-control .icon-next {\n    margin-right: -15px;\n  }\n  .carousel-caption {\n    left: 20%;\n    right: 20%;\n    padding-bottom: 30px;\n  }\n  .carousel-indicators {\n    bottom: 20px;\n  }\n}\n.clearfix:before,\n.clearfix:after,\n.dl-horizontal dd:before,\n.dl-horizontal dd:after,\n.container:before,\n.container:after,\n.container-fluid:before,\n.container-fluid:after,\n.row:before,\n.row:after,\n.form-horizontal .form-group:before,\n.form-horizontal .form-group:after,\n.btn-toolbar:before,\n.btn-toolbar:after,\n.btn-group-vertical > .btn-group:before,\n.btn-group-vertical > .btn-group:after,\n.nav:before,\n.nav:after,\n.navbar:before,\n.navbar:after,\n.navbar-header:before,\n.navbar-header:after,\n.navbar-collapse:before,\n.navbar-collapse:after,\n.pager:before,\n.pager:after,\n.panel-body:before,\n.panel-body:after,\n.modal-footer:before,\n.modal-footer:after {\n  content: \" \";\n  display: table;\n}\n.clearfix:after,\n.dl-horizontal dd:after,\n.container:after,\n.container-fluid:after,\n.row:after,\n.form-horizontal .form-group:after,\n.btn-toolbar:after,\n.btn-group-vertical > .btn-group:after,\n.nav:after,\n.navbar:after,\n.navbar-header:after,\n.navbar-collapse:after,\n.pager:after,\n.panel-body:after,\n.modal-footer:after {\n  clear: both;\n}\n.center-block {\n  display: block;\n  margin-left: auto;\n  margin-right: auto;\n}\n.pull-right {\n  float: right !important;\n}\n.pull-left {\n  float: left !important;\n}\n.hide {\n  display: none !important;\n}\n.show {\n  display: block !important;\n}\n.invisible {\n  visibility: hidden;\n}\n.text-hide {\n  font: 0/0 a;\n  color: transparent;\n  text-shadow: none;\n  background-color: transparent;\n  border: 0;\n}\n.hidden {\n  display: none !important;\n  visibility: hidden !important;\n}\n.affix {\n  position: fixed;\n}\n@-ms-viewport {\n  width: device-width;\n}\n.visible-xs,\n.visible-sm,\n.visible-md,\n.visible-lg {\n  display: none !important;\n}\n.visible-xs-block,\n.visible-xs-inline,\n.visible-xs-inline-block,\n.visible-sm-block,\n.visible-sm-inline,\n.visible-sm-inline-block,\n.visible-md-block,\n.visible-md-inline,\n.visible-md-inline-block,\n.visible-lg-block,\n.visible-lg-inline,\n.visible-lg-inline-block {\n  display: none !important;\n}\n@media (max-width: 767px) {\n  .visible-xs {\n    display: block !important;\n  }\n  table.visible-xs {\n    display: table;\n  }\n  tr.visible-xs {\n    display: table-row !important;\n  }\n  th.visible-xs,\n  td.visible-xs {\n    display: table-cell !important;\n  }\n}\n@media (max-width: 767px) {\n  .visible-xs-block {\n    display: block !important;\n  }\n}\n@media (max-width: 767px) {\n  .visible-xs-inline {\n    display: inline !important;\n  }\n}\n@media (max-width: 767px) {\n  .visible-xs-inline-block {\n    display: inline-block !important;\n  }\n}\n@media (min-width: 768px) and (max-width: 1030px) {\n  .visible-sm {\n    display: block !important;\n  }\n  table.visible-sm {\n    display: table;\n  }\n  tr.visible-sm {\n    display: table-row !important;\n  }\n  th.visible-sm,\n  td.visible-sm {\n    display: table-cell !important;\n  }\n}\n@media (min-width: 768px) and (max-width: 1030px) {\n  .visible-sm-block {\n    display: block !important;\n  }\n}\n@media (min-width: 768px) and (max-width: 1030px) {\n  .visible-sm-inline {\n    display: inline !important;\n  }\n}\n@media (min-width: 768px) and (max-width: 1030px) {\n  .visible-sm-inline-block {\n    display: inline-block !important;\n  }\n}\n@media (min-width: 1031px) and (max-width: 1199px) {\n  .visible-md {\n    display: block !important;\n  }\n  table.visible-md {\n    display: table;\n  }\n  tr.visible-md {\n    display: table-row !important;\n  }\n  th.visible-md,\n  td.visible-md {\n    display: table-cell !important;\n  }\n}\n@media (min-width: 1031px) and (max-width: 1199px) {\n  .visible-md-block {\n    display: block !important;\n  }\n}\n@media (min-width: 1031px) and (max-width: 1199px) {\n  .visible-md-inline {\n    display: inline !important;\n  }\n}\n@media (min-width: 1031px) and (max-width: 1199px) {\n  .visible-md-inline-block {\n    display: inline-block !important;\n  }\n}\n@media (min-width: 1200px) {\n  .visible-lg {\n    display: block !important;\n  }\n  table.visible-lg {\n    display: table;\n  }\n  tr.visible-lg {\n    display: table-row !important;\n  }\n  th.visible-lg,\n  td.visible-lg {\n    display: table-cell !important;\n  }\n}\n@media (min-width: 1200px) {\n  .visible-lg-block {\n    display: block !important;\n  }\n}\n@media (min-width: 1200px) {\n  .visible-lg-inline {\n    display: inline !important;\n  }\n}\n@media (min-width: 1200px) {\n  .visible-lg-inline-block {\n    display: inline-block !important;\n  }\n}\n@media (max-width: 767px) {\n  .hidden-xs {\n    display: none !important;\n  }\n}\n@media (min-width: 768px) and (max-width: 1030px) {\n  .hidden-sm {\n    display: none !important;\n  }\n}\n@media (min-width: 1031px) and (max-width: 1199px) {\n  .hidden-md {\n    display: none !important;\n  }\n}\n@media (min-width: 1200px) {\n  .hidden-lg {\n    display: none !important;\n  }\n}\n.visible-print {\n  display: none !important;\n}\n@media print {\n  .visible-print {\n    display: block !important;\n  }\n  table.visible-print {\n    display: table;\n  }\n  tr.visible-print {\n    display: table-row !important;\n  }\n  th.visible-print,\n  td.visible-print {\n    display: table-cell !important;\n  }\n}\n.visible-print-block {\n  display: none !important;\n}\n@media print {\n  .visible-print-block {\n    display: block !important;\n  }\n}\n.visible-print-inline {\n  display: none !important;\n}\n@media print {\n  .visible-print-inline {\n    display: inline !important;\n  }\n}\n.visible-print-inline-block {\n  display: none !important;\n}\n@media print {\n  .visible-print-inline-block {\n    display: inline-block !important;\n  }\n}\n@media print {\n  .hidden-print {\n    display: none !important;\n  }\n}\n/*\n * Social Buttons for Bootstrap\n *\n * Copyright 2013-2014 Panayiotis Lipiridis\n * Licensed under the MIT License\n *\n * https://github.com/lipis/bootstrap-social\n */\n.btn-social {\n  position: relative;\n  padding-left: 44px;\n  text-align: left;\n  white-space: nowrap;\n  overflow: hidden;\n  text-overflow: ellipsis;\n}\n.btn-social > :first-child {\n  position: absolute;\n  left: 0;\n  top: 0;\n  bottom: 0;\n  width: 32px;\n  line-height: 34px;\n  font-size: 1.6em;\n  text-align: center;\n  border-right: 1px solid rgba(0, 0, 0, 0.2);\n}\n.btn-social.btn-lg {\n  padding-left: 61px;\n}\n.btn-social.btn-lg :first-child {\n  line-height: 45px;\n  width: 45px;\n  font-size: 1.8em;\n}\n.btn-social.btn-sm {\n  padding-left: 38px;\n}\n.btn-social.btn-sm :first-child {\n  line-height: 28px;\n  width: 28px;\n  font-size: 1.4em;\n}\n.btn-social.btn-xs {\n  padding-left: 30px;\n}\n.btn-social.btn-xs :first-child {\n  line-height: 20px;\n  width: 20px;\n  font-size: 1.2em;\n}\n.btn-social-icon {\n  position: relative;\n  padding-left: 44px;\n  text-align: left;\n  white-space: nowrap;\n  overflow: hidden;\n  text-overflow: ellipsis;\n  width: 250px;\n  margin: auto;\n  height: 34px;\n  width: 34px;\n  padding: 0;\n}\n.btn-social-icon > :first-child {\n  position: absolute;\n  left: 0;\n  top: 0;\n  bottom: 0;\n  width: 32px;\n  line-height: 34px;\n  font-size: 1.6em;\n  text-align: center;\n  border-right: 1px solid rgba(0, 0, 0, 0.2);\n}\n.btn-social-icon.btn-lg {\n  padding-left: 61px;\n}\n.btn-social-icon.btn-lg :first-child {\n  line-height: 45px;\n  width: 45px;\n  font-size: 1.8em;\n}\n.btn-social-icon.btn-sm {\n  padding-left: 38px;\n}\n.btn-social-icon.btn-sm :first-child {\n  line-height: 28px;\n  width: 28px;\n  font-size: 1.4em;\n}\n.btn-social-icon.btn-xs {\n  padding-left: 30px;\n}\n.btn-social-icon.btn-xs :first-child {\n  line-height: 20px;\n  width: 20px;\n  font-size: 1.2em;\n}\n.btn-social-icon :first-child {\n  border: none;\n  text-align: center;\n  width: 100%!important;\n}\n.btn-social-icon.btn-lg {\n  height: 45px;\n  width: 45px;\n  padding-left: 0;\n  padding-right: 0;\n}\n.btn-social-icon.btn-sm {\n  height: 30px;\n  width: 30px;\n  padding-left: 0;\n  padding-right: 0;\n}\n.btn-social-icon.btn-xs {\n  height: 22px;\n  width: 22px;\n  padding-left: 0;\n  padding-right: 0;\n}\n.btn-adn {\n  color: #d87a68;\n  background-color: #d87a68;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-adn:hover,\n.btn-adn:focus,\n.btn-adn.focus,\n.btn-adn:active,\n.btn-adn.active,\n.open > .dropdown-toggle.btn-adn {\n  color: #eeeeee;\n  background-color: #d87a68;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-adn:active,\n.btn-adn.active,\n.open > .dropdown-toggle.btn-adn {\n  background-image: none;\n}\n.btn-adn.disabled,\n.btn-adn[disabled],\nfieldset[disabled] .btn-adn,\n.btn-adn.disabled:hover,\n.btn-adn[disabled]:hover,\nfieldset[disabled] .btn-adn:hover,\n.btn-adn.disabled:focus,\n.btn-adn[disabled]:focus,\nfieldset[disabled] .btn-adn:focus,\n.btn-adn.disabled.focus,\n.btn-adn[disabled].focus,\nfieldset[disabled] .btn-adn.focus,\n.btn-adn.disabled:active,\n.btn-adn[disabled]:active,\nfieldset[disabled] .btn-adn:active,\n.btn-adn.disabled.active,\n.btn-adn[disabled].active,\nfieldset[disabled] .btn-adn.active {\n  background-color: #d87a68;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-adn .badge {\n  color: #d87a68;\n  background-color: #d87a68;\n}\n.btn-bitbucket {\n  color: #205081;\n  background-color: #205081;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-bitbucket:hover,\n.btn-bitbucket:focus,\n.btn-bitbucket.focus,\n.btn-bitbucket:active,\n.btn-bitbucket.active,\n.open > .dropdown-toggle.btn-bitbucket {\n  color: #eeeeee;\n  background-color: #205081;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-bitbucket:active,\n.btn-bitbucket.active,\n.open > .dropdown-toggle.btn-bitbucket {\n  background-image: none;\n}\n.btn-bitbucket.disabled,\n.btn-bitbucket[disabled],\nfieldset[disabled] .btn-bitbucket,\n.btn-bitbucket.disabled:hover,\n.btn-bitbucket[disabled]:hover,\nfieldset[disabled] .btn-bitbucket:hover,\n.btn-bitbucket.disabled:focus,\n.btn-bitbucket[disabled]:focus,\nfieldset[disabled] .btn-bitbucket:focus,\n.btn-bitbucket.disabled.focus,\n.btn-bitbucket[disabled].focus,\nfieldset[disabled] .btn-bitbucket.focus,\n.btn-bitbucket.disabled:active,\n.btn-bitbucket[disabled]:active,\nfieldset[disabled] .btn-bitbucket:active,\n.btn-bitbucket.disabled.active,\n.btn-bitbucket[disabled].active,\nfieldset[disabled] .btn-bitbucket.active {\n  background-color: #205081;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-bitbucket .badge {\n  color: #205081;\n  background-color: #205081;\n}\n.btn-dropbox {\n  color: #1087dd;\n  background-color: #1087dd;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-dropbox:hover,\n.btn-dropbox:focus,\n.btn-dropbox.focus,\n.btn-dropbox:active,\n.btn-dropbox.active,\n.open > .dropdown-toggle.btn-dropbox {\n  color: #eeeeee;\n  background-color: #1087dd;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-dropbox:active,\n.btn-dropbox.active,\n.open > .dropdown-toggle.btn-dropbox {\n  background-image: none;\n}\n.btn-dropbox.disabled,\n.btn-dropbox[disabled],\nfieldset[disabled] .btn-dropbox,\n.btn-dropbox.disabled:hover,\n.btn-dropbox[disabled]:hover,\nfieldset[disabled] .btn-dropbox:hover,\n.btn-dropbox.disabled:focus,\n.btn-dropbox[disabled]:focus,\nfieldset[disabled] .btn-dropbox:focus,\n.btn-dropbox.disabled.focus,\n.btn-dropbox[disabled].focus,\nfieldset[disabled] .btn-dropbox.focus,\n.btn-dropbox.disabled:active,\n.btn-dropbox[disabled]:active,\nfieldset[disabled] .btn-dropbox:active,\n.btn-dropbox.disabled.active,\n.btn-dropbox[disabled].active,\nfieldset[disabled] .btn-dropbox.active {\n  background-color: #1087dd;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-dropbox .badge {\n  color: #1087dd;\n  background-color: #1087dd;\n}\n.btn-facebook {\n  color: #3b5998;\n  background-color: #3b5998;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-facebook:hover,\n.btn-facebook:focus,\n.btn-facebook.focus,\n.btn-facebook:active,\n.btn-facebook.active,\n.open > .dropdown-toggle.btn-facebook {\n  color: #eeeeee;\n  background-color: #3b5998;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-facebook:active,\n.btn-facebook.active,\n.open > .dropdown-toggle.btn-facebook {\n  background-image: none;\n}\n.btn-facebook.disabled,\n.btn-facebook[disabled],\nfieldset[disabled] .btn-facebook,\n.btn-facebook.disabled:hover,\n.btn-facebook[disabled]:hover,\nfieldset[disabled] .btn-facebook:hover,\n.btn-facebook.disabled:focus,\n.btn-facebook[disabled]:focus,\nfieldset[disabled] .btn-facebook:focus,\n.btn-facebook.disabled.focus,\n.btn-facebook[disabled].focus,\nfieldset[disabled] .btn-facebook.focus,\n.btn-facebook.disabled:active,\n.btn-facebook[disabled]:active,\nfieldset[disabled] .btn-facebook:active,\n.btn-facebook.disabled.active,\n.btn-facebook[disabled].active,\nfieldset[disabled] .btn-facebook.active {\n  background-color: #3b5998;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-facebook .badge {\n  color: #3b5998;\n  background-color: #3b5998;\n}\n.btn-flickr {\n  color: #ff0084;\n  background-color: #ff0084;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-flickr:hover,\n.btn-flickr:focus,\n.btn-flickr.focus,\n.btn-flickr:active,\n.btn-flickr.active,\n.open > .dropdown-toggle.btn-flickr {\n  color: #eeeeee;\n  background-color: #ff0084;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-flickr:active,\n.btn-flickr.active,\n.open > .dropdown-toggle.btn-flickr {\n  background-image: none;\n}\n.btn-flickr.disabled,\n.btn-flickr[disabled],\nfieldset[disabled] .btn-flickr,\n.btn-flickr.disabled:hover,\n.btn-flickr[disabled]:hover,\nfieldset[disabled] .btn-flickr:hover,\n.btn-flickr.disabled:focus,\n.btn-flickr[disabled]:focus,\nfieldset[disabled] .btn-flickr:focus,\n.btn-flickr.disabled.focus,\n.btn-flickr[disabled].focus,\nfieldset[disabled] .btn-flickr.focus,\n.btn-flickr.disabled:active,\n.btn-flickr[disabled]:active,\nfieldset[disabled] .btn-flickr:active,\n.btn-flickr.disabled.active,\n.btn-flickr[disabled].active,\nfieldset[disabled] .btn-flickr.active {\n  background-color: #ff0084;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-flickr .badge {\n  color: #ff0084;\n  background-color: #ff0084;\n}\n.btn-foursquare {\n  color: #f94877;\n  background-color: #f94877;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-foursquare:hover,\n.btn-foursquare:focus,\n.btn-foursquare.focus,\n.btn-foursquare:active,\n.btn-foursquare.active,\n.open > .dropdown-toggle.btn-foursquare {\n  color: #eeeeee;\n  background-color: #f94877;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-foursquare:active,\n.btn-foursquare.active,\n.open > .dropdown-toggle.btn-foursquare {\n  background-image: none;\n}\n.btn-foursquare.disabled,\n.btn-foursquare[disabled],\nfieldset[disabled] .btn-foursquare,\n.btn-foursquare.disabled:hover,\n.btn-foursquare[disabled]:hover,\nfieldset[disabled] .btn-foursquare:hover,\n.btn-foursquare.disabled:focus,\n.btn-foursquare[disabled]:focus,\nfieldset[disabled] .btn-foursquare:focus,\n.btn-foursquare.disabled.focus,\n.btn-foursquare[disabled].focus,\nfieldset[disabled] .btn-foursquare.focus,\n.btn-foursquare.disabled:active,\n.btn-foursquare[disabled]:active,\nfieldset[disabled] .btn-foursquare:active,\n.btn-foursquare.disabled.active,\n.btn-foursquare[disabled].active,\nfieldset[disabled] .btn-foursquare.active {\n  background-color: #f94877;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-foursquare .badge {\n  color: #f94877;\n  background-color: #f94877;\n}\n.btn-github {\n  color: #444444;\n  background-color: #444444;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-github:hover,\n.btn-github:focus,\n.btn-github.focus,\n.btn-github:active,\n.btn-github.active,\n.open > .dropdown-toggle.btn-github {\n  color: #eeeeee;\n  background-color: #444444;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-github:active,\n.btn-github.active,\n.open > .dropdown-toggle.btn-github {\n  background-image: none;\n}\n.btn-github.disabled,\n.btn-github[disabled],\nfieldset[disabled] .btn-github,\n.btn-github.disabled:hover,\n.btn-github[disabled]:hover,\nfieldset[disabled] .btn-github:hover,\n.btn-github.disabled:focus,\n.btn-github[disabled]:focus,\nfieldset[disabled] .btn-github:focus,\n.btn-github.disabled.focus,\n.btn-github[disabled].focus,\nfieldset[disabled] .btn-github.focus,\n.btn-github.disabled:active,\n.btn-github[disabled]:active,\nfieldset[disabled] .btn-github:active,\n.btn-github.disabled.active,\n.btn-github[disabled].active,\nfieldset[disabled] .btn-github.active {\n  background-color: #444444;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-github .badge {\n  color: #444444;\n  background-color: #444444;\n}\n.btn-google-plus {\n  color: #dd4b39;\n  background-color: #dd4b39;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-google-plus:hover,\n.btn-google-plus:focus,\n.btn-google-plus.focus,\n.btn-google-plus:active,\n.btn-google-plus.active,\n.open > .dropdown-toggle.btn-google-plus {\n  color: #eeeeee;\n  background-color: #dd4b39;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-google-plus:active,\n.btn-google-plus.active,\n.open > .dropdown-toggle.btn-google-plus {\n  background-image: none;\n}\n.btn-google-plus.disabled,\n.btn-google-plus[disabled],\nfieldset[disabled] .btn-google-plus,\n.btn-google-plus.disabled:hover,\n.btn-google-plus[disabled]:hover,\nfieldset[disabled] .btn-google-plus:hover,\n.btn-google-plus.disabled:focus,\n.btn-google-plus[disabled]:focus,\nfieldset[disabled] .btn-google-plus:focus,\n.btn-google-plus.disabled.focus,\n.btn-google-plus[disabled].focus,\nfieldset[disabled] .btn-google-plus.focus,\n.btn-google-plus.disabled:active,\n.btn-google-plus[disabled]:active,\nfieldset[disabled] .btn-google-plus:active,\n.btn-google-plus.disabled.active,\n.btn-google-plus[disabled].active,\nfieldset[disabled] .btn-google-plus.active {\n  background-color: #dd4b39;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-google-plus .badge {\n  color: #dd4b39;\n  background-color: #dd4b39;\n}\n.btn-instagram {\n  color: #3f729b;\n  background-color: #3f729b;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-instagram:hover,\n.btn-instagram:focus,\n.btn-instagram.focus,\n.btn-instagram:active,\n.btn-instagram.active,\n.open > .dropdown-toggle.btn-instagram {\n  color: #eeeeee;\n  background-color: #3f729b;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-instagram:active,\n.btn-instagram.active,\n.open > .dropdown-toggle.btn-instagram {\n  background-image: none;\n}\n.btn-instagram.disabled,\n.btn-instagram[disabled],\nfieldset[disabled] .btn-instagram,\n.btn-instagram.disabled:hover,\n.btn-instagram[disabled]:hover,\nfieldset[disabled] .btn-instagram:hover,\n.btn-instagram.disabled:focus,\n.btn-instagram[disabled]:focus,\nfieldset[disabled] .btn-instagram:focus,\n.btn-instagram.disabled.focus,\n.btn-instagram[disabled].focus,\nfieldset[disabled] .btn-instagram.focus,\n.btn-instagram.disabled:active,\n.btn-instagram[disabled]:active,\nfieldset[disabled] .btn-instagram:active,\n.btn-instagram.disabled.active,\n.btn-instagram[disabled].active,\nfieldset[disabled] .btn-instagram.active {\n  background-color: #3f729b;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-instagram .badge {\n  color: #3f729b;\n  background-color: #3f729b;\n}\n.btn-linkedin {\n  color: #007bb6;\n  background-color: #007bb6;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-linkedin:hover,\n.btn-linkedin:focus,\n.btn-linkedin.focus,\n.btn-linkedin:active,\n.btn-linkedin.active,\n.open > .dropdown-toggle.btn-linkedin {\n  color: #eeeeee;\n  background-color: #007bb6;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-linkedin:active,\n.btn-linkedin.active,\n.open > .dropdown-toggle.btn-linkedin {\n  background-image: none;\n}\n.btn-linkedin.disabled,\n.btn-linkedin[disabled],\nfieldset[disabled] .btn-linkedin,\n.btn-linkedin.disabled:hover,\n.btn-linkedin[disabled]:hover,\nfieldset[disabled] .btn-linkedin:hover,\n.btn-linkedin.disabled:focus,\n.btn-linkedin[disabled]:focus,\nfieldset[disabled] .btn-linkedin:focus,\n.btn-linkedin.disabled.focus,\n.btn-linkedin[disabled].focus,\nfieldset[disabled] .btn-linkedin.focus,\n.btn-linkedin.disabled:active,\n.btn-linkedin[disabled]:active,\nfieldset[disabled] .btn-linkedin:active,\n.btn-linkedin.disabled.active,\n.btn-linkedin[disabled].active,\nfieldset[disabled] .btn-linkedin.active {\n  background-color: #007bb6;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-linkedin .badge {\n  color: #007bb6;\n  background-color: #007bb6;\n}\n.btn-microsoft {\n  color: #2672ec;\n  background-color: #2672ec;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-microsoft:hover,\n.btn-microsoft:focus,\n.btn-microsoft.focus,\n.btn-microsoft:active,\n.btn-microsoft.active,\n.open > .dropdown-toggle.btn-microsoft {\n  color: #eeeeee;\n  background-color: #2672ec;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-microsoft:active,\n.btn-microsoft.active,\n.open > .dropdown-toggle.btn-microsoft {\n  background-image: none;\n}\n.btn-microsoft.disabled,\n.btn-microsoft[disabled],\nfieldset[disabled] .btn-microsoft,\n.btn-microsoft.disabled:hover,\n.btn-microsoft[disabled]:hover,\nfieldset[disabled] .btn-microsoft:hover,\n.btn-microsoft.disabled:focus,\n.btn-microsoft[disabled]:focus,\nfieldset[disabled] .btn-microsoft:focus,\n.btn-microsoft.disabled.focus,\n.btn-microsoft[disabled].focus,\nfieldset[disabled] .btn-microsoft.focus,\n.btn-microsoft.disabled:active,\n.btn-microsoft[disabled]:active,\nfieldset[disabled] .btn-microsoft:active,\n.btn-microsoft.disabled.active,\n.btn-microsoft[disabled].active,\nfieldset[disabled] .btn-microsoft.active {\n  background-color: #2672ec;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-microsoft .badge {\n  color: #2672ec;\n  background-color: #2672ec;\n}\n.btn-openid {\n  color: #f7931e;\n  background-color: #f7931e;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-openid:hover,\n.btn-openid:focus,\n.btn-openid.focus,\n.btn-openid:active,\n.btn-openid.active,\n.open > .dropdown-toggle.btn-openid {\n  color: #eeeeee;\n  background-color: #f7931e;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-openid:active,\n.btn-openid.active,\n.open > .dropdown-toggle.btn-openid {\n  background-image: none;\n}\n.btn-openid.disabled,\n.btn-openid[disabled],\nfieldset[disabled] .btn-openid,\n.btn-openid.disabled:hover,\n.btn-openid[disabled]:hover,\nfieldset[disabled] .btn-openid:hover,\n.btn-openid.disabled:focus,\n.btn-openid[disabled]:focus,\nfieldset[disabled] .btn-openid:focus,\n.btn-openid.disabled.focus,\n.btn-openid[disabled].focus,\nfieldset[disabled] .btn-openid.focus,\n.btn-openid.disabled:active,\n.btn-openid[disabled]:active,\nfieldset[disabled] .btn-openid:active,\n.btn-openid.disabled.active,\n.btn-openid[disabled].active,\nfieldset[disabled] .btn-openid.active {\n  background-color: #f7931e;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-openid .badge {\n  color: #f7931e;\n  background-color: #f7931e;\n}\n.btn-pinterest {\n  color: #cb2027;\n  background-color: #cb2027;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-pinterest:hover,\n.btn-pinterest:focus,\n.btn-pinterest.focus,\n.btn-pinterest:active,\n.btn-pinterest.active,\n.open > .dropdown-toggle.btn-pinterest {\n  color: #eeeeee;\n  background-color: #cb2027;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-pinterest:active,\n.btn-pinterest.active,\n.open > .dropdown-toggle.btn-pinterest {\n  background-image: none;\n}\n.btn-pinterest.disabled,\n.btn-pinterest[disabled],\nfieldset[disabled] .btn-pinterest,\n.btn-pinterest.disabled:hover,\n.btn-pinterest[disabled]:hover,\nfieldset[disabled] .btn-pinterest:hover,\n.btn-pinterest.disabled:focus,\n.btn-pinterest[disabled]:focus,\nfieldset[disabled] .btn-pinterest:focus,\n.btn-pinterest.disabled.focus,\n.btn-pinterest[disabled].focus,\nfieldset[disabled] .btn-pinterest.focus,\n.btn-pinterest.disabled:active,\n.btn-pinterest[disabled]:active,\nfieldset[disabled] .btn-pinterest:active,\n.btn-pinterest.disabled.active,\n.btn-pinterest[disabled].active,\nfieldset[disabled] .btn-pinterest.active {\n  background-color: #cb2027;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-pinterest .badge {\n  color: #cb2027;\n  background-color: #cb2027;\n}\n.btn-reddit {\n  color: #000;\n  background-color: #eff7ff;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-reddit:hover,\n.btn-reddit:focus,\n.btn-reddit.focus,\n.btn-reddit:active,\n.btn-reddit.active,\n.open > .dropdown-toggle.btn-reddit {\n  color: #eeeeee;\n  background-color: #eff7ff;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-reddit:active,\n.btn-reddit.active,\n.open > .dropdown-toggle.btn-reddit {\n  background-image: none;\n}\n.btn-reddit.disabled,\n.btn-reddit[disabled],\nfieldset[disabled] .btn-reddit,\n.btn-reddit.disabled:hover,\n.btn-reddit[disabled]:hover,\nfieldset[disabled] .btn-reddit:hover,\n.btn-reddit.disabled:focus,\n.btn-reddit[disabled]:focus,\nfieldset[disabled] .btn-reddit:focus,\n.btn-reddit.disabled.focus,\n.btn-reddit[disabled].focus,\nfieldset[disabled] .btn-reddit.focus,\n.btn-reddit.disabled:active,\n.btn-reddit[disabled]:active,\nfieldset[disabled] .btn-reddit:active,\n.btn-reddit.disabled.active,\n.btn-reddit[disabled].active,\nfieldset[disabled] .btn-reddit.active {\n  background-color: #eff7ff;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-reddit .badge {\n  color: #eff7ff;\n  background-color: #000;\n}\n.btn-soundcloud {\n  color: #ff5500;\n  background-color: #ff5500;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-soundcloud:hover,\n.btn-soundcloud:focus,\n.btn-soundcloud.focus,\n.btn-soundcloud:active,\n.btn-soundcloud.active,\n.open > .dropdown-toggle.btn-soundcloud {\n  color: #eeeeee;\n  background-color: #ff5500;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-soundcloud:active,\n.btn-soundcloud.active,\n.open > .dropdown-toggle.btn-soundcloud {\n  background-image: none;\n}\n.btn-soundcloud.disabled,\n.btn-soundcloud[disabled],\nfieldset[disabled] .btn-soundcloud,\n.btn-soundcloud.disabled:hover,\n.btn-soundcloud[disabled]:hover,\nfieldset[disabled] .btn-soundcloud:hover,\n.btn-soundcloud.disabled:focus,\n.btn-soundcloud[disabled]:focus,\nfieldset[disabled] .btn-soundcloud:focus,\n.btn-soundcloud.disabled.focus,\n.btn-soundcloud[disabled].focus,\nfieldset[disabled] .btn-soundcloud.focus,\n.btn-soundcloud.disabled:active,\n.btn-soundcloud[disabled]:active,\nfieldset[disabled] .btn-soundcloud:active,\n.btn-soundcloud.disabled.active,\n.btn-soundcloud[disabled].active,\nfieldset[disabled] .btn-soundcloud.active {\n  background-color: #ff5500;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-soundcloud .badge {\n  color: #ff5500;\n  background-color: #ff5500;\n}\n.btn-tumblr {\n  color: #2c4762;\n  background-color: #2c4762;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-tumblr:hover,\n.btn-tumblr:focus,\n.btn-tumblr.focus,\n.btn-tumblr:active,\n.btn-tumblr.active,\n.open > .dropdown-toggle.btn-tumblr {\n  color: #eeeeee;\n  background-color: #2c4762;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-tumblr:active,\n.btn-tumblr.active,\n.open > .dropdown-toggle.btn-tumblr {\n  background-image: none;\n}\n.btn-tumblr.disabled,\n.btn-tumblr[disabled],\nfieldset[disabled] .btn-tumblr,\n.btn-tumblr.disabled:hover,\n.btn-tumblr[disabled]:hover,\nfieldset[disabled] .btn-tumblr:hover,\n.btn-tumblr.disabled:focus,\n.btn-tumblr[disabled]:focus,\nfieldset[disabled] .btn-tumblr:focus,\n.btn-tumblr.disabled.focus,\n.btn-tumblr[disabled].focus,\nfieldset[disabled] .btn-tumblr.focus,\n.btn-tumblr.disabled:active,\n.btn-tumblr[disabled]:active,\nfieldset[disabled] .btn-tumblr:active,\n.btn-tumblr.disabled.active,\n.btn-tumblr[disabled].active,\nfieldset[disabled] .btn-tumblr.active {\n  background-color: #2c4762;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-tumblr .badge {\n  color: #2c4762;\n  background-color: #2c4762;\n}\n.btn-twitter {\n  color: #55acee;\n  background-color: #55acee;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-twitter:hover,\n.btn-twitter:focus,\n.btn-twitter.focus,\n.btn-twitter:active,\n.btn-twitter.active,\n.open > .dropdown-toggle.btn-twitter {\n  color: #eeeeee;\n  background-color: #55acee;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-twitter:active,\n.btn-twitter.active,\n.open > .dropdown-toggle.btn-twitter {\n  background-image: none;\n}\n.btn-twitter.disabled,\n.btn-twitter[disabled],\nfieldset[disabled] .btn-twitter,\n.btn-twitter.disabled:hover,\n.btn-twitter[disabled]:hover,\nfieldset[disabled] .btn-twitter:hover,\n.btn-twitter.disabled:focus,\n.btn-twitter[disabled]:focus,\nfieldset[disabled] .btn-twitter:focus,\n.btn-twitter.disabled.focus,\n.btn-twitter[disabled].focus,\nfieldset[disabled] .btn-twitter.focus,\n.btn-twitter.disabled:active,\n.btn-twitter[disabled]:active,\nfieldset[disabled] .btn-twitter:active,\n.btn-twitter.disabled.active,\n.btn-twitter[disabled].active,\nfieldset[disabled] .btn-twitter.active {\n  background-color: #55acee;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-twitter .badge {\n  color: #55acee;\n  background-color: #55acee;\n}\n.btn-vimeo {\n  color: #1ab7ea;\n  background-color: #1ab7ea;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-vimeo:hover,\n.btn-vimeo:focus,\n.btn-vimeo.focus,\n.btn-vimeo:active,\n.btn-vimeo.active,\n.open > .dropdown-toggle.btn-vimeo {\n  color: #eeeeee;\n  background-color: #1ab7ea;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-vimeo:active,\n.btn-vimeo.active,\n.open > .dropdown-toggle.btn-vimeo {\n  background-image: none;\n}\n.btn-vimeo.disabled,\n.btn-vimeo[disabled],\nfieldset[disabled] .btn-vimeo,\n.btn-vimeo.disabled:hover,\n.btn-vimeo[disabled]:hover,\nfieldset[disabled] .btn-vimeo:hover,\n.btn-vimeo.disabled:focus,\n.btn-vimeo[disabled]:focus,\nfieldset[disabled] .btn-vimeo:focus,\n.btn-vimeo.disabled.focus,\n.btn-vimeo[disabled].focus,\nfieldset[disabled] .btn-vimeo.focus,\n.btn-vimeo.disabled:active,\n.btn-vimeo[disabled]:active,\nfieldset[disabled] .btn-vimeo:active,\n.btn-vimeo.disabled.active,\n.btn-vimeo[disabled].active,\nfieldset[disabled] .btn-vimeo.active {\n  background-color: #1ab7ea;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-vimeo .badge {\n  color: #1ab7ea;\n  background-color: #1ab7ea;\n}\n.btn-vk {\n  color: #587ea3;\n  background-color: #587ea3;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-vk:hover,\n.btn-vk:focus,\n.btn-vk.focus,\n.btn-vk:active,\n.btn-vk.active,\n.open > .dropdown-toggle.btn-vk {\n  color: #eeeeee;\n  background-color: #587ea3;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-vk:active,\n.btn-vk.active,\n.open > .dropdown-toggle.btn-vk {\n  background-image: none;\n}\n.btn-vk.disabled,\n.btn-vk[disabled],\nfieldset[disabled] .btn-vk,\n.btn-vk.disabled:hover,\n.btn-vk[disabled]:hover,\nfieldset[disabled] .btn-vk:hover,\n.btn-vk.disabled:focus,\n.btn-vk[disabled]:focus,\nfieldset[disabled] .btn-vk:focus,\n.btn-vk.disabled.focus,\n.btn-vk[disabled].focus,\nfieldset[disabled] .btn-vk.focus,\n.btn-vk.disabled:active,\n.btn-vk[disabled]:active,\nfieldset[disabled] .btn-vk:active,\n.btn-vk.disabled.active,\n.btn-vk[disabled].active,\nfieldset[disabled] .btn-vk.active {\n  background-color: #587ea3;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-vk .badge {\n  color: #587ea3;\n  background-color: #587ea3;\n}\n.btn-yahoo {\n  color: #720e9e;\n  background-color: #720e9e;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-yahoo:hover,\n.btn-yahoo:focus,\n.btn-yahoo.focus,\n.btn-yahoo:active,\n.btn-yahoo.active,\n.open > .dropdown-toggle.btn-yahoo {\n  color: #eeeeee;\n  background-color: #720e9e;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-yahoo:active,\n.btn-yahoo.active,\n.open > .dropdown-toggle.btn-yahoo {\n  background-image: none;\n}\n.btn-yahoo.disabled,\n.btn-yahoo[disabled],\nfieldset[disabled] .btn-yahoo,\n.btn-yahoo.disabled:hover,\n.btn-yahoo[disabled]:hover,\nfieldset[disabled] .btn-yahoo:hover,\n.btn-yahoo.disabled:focus,\n.btn-yahoo[disabled]:focus,\nfieldset[disabled] .btn-yahoo:focus,\n.btn-yahoo.disabled.focus,\n.btn-yahoo[disabled].focus,\nfieldset[disabled] .btn-yahoo.focus,\n.btn-yahoo.disabled:active,\n.btn-yahoo[disabled]:active,\nfieldset[disabled] .btn-yahoo:active,\n.btn-yahoo.disabled.active,\n.btn-yahoo[disabled].active,\nfieldset[disabled] .btn-yahoo.active {\n  background-color: #720e9e;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-yahoo .badge {\n  color: #720e9e;\n  background-color: #720e9e;\n}\n/*!\nIonicons, v2.0.0\nCreated by Ben Sperry for the Ionic Framework, http://ionicons.com/\nhttps://twitter.com/benjsperry  https://twitter.com/ionicframework\nMIT License: https://github.com/driftyco/ionicons\n*/\n@font-face {\n  font-family: \"Ionicons\";\n  src: url(\"../fonts/ionicons.eot?v=2.0.0\");\n  src: url(\"../fonts/ionicons.eot?v=2.0.0#iefix\") format(\"embedded-opentype\"), url(\"../fonts/ionicons.ttf?v=2.0.0\") format(\"truetype\"), url(\"../fonts/ionicons.woff?v=2.0.0\") format(\"woff\"), url(\"../fonts/ionicons.svg?v=2.0.0#Ionicons\") format(\"svg\");\n  font-weight: normal;\n  font-style: normal;\n}\n.ion,\n.ion-loading-a,\n.ion-loading-b,\n.ion-loading-c,\n.ion-loading-d,\n.ion-looping,\n.ion-refreshing,\n.ion-ios7-reloading,\n.ionicons,\n.ion-alert:before,\n.ion-alert-circled:before,\n.ion-android-add:before,\n.ion-android-add-circle:before,\n.ion-android-alarm-clock:before,\n.ion-android-alert:before,\n.ion-android-apps:before,\n.ion-android-archive:before,\n.ion-android-arrow-back:before,\n.ion-android-arrow-down:before,\n.ion-android-arrow-dropdown:before,\n.ion-android-arrow-dropdown-circle:before,\n.ion-android-arrow-dropleft:before,\n.ion-android-arrow-dropleft-circle:before,\n.ion-android-arrow-dropright:before,\n.ion-android-arrow-dropright-circle:before,\n.ion-android-arrow-dropup:before,\n.ion-android-arrow-dropup-circle:before,\n.ion-android-arrow-forward:before,\n.ion-android-arrow-up:before,\n.ion-android-attach:before,\n.ion-android-bar:before,\n.ion-android-bicycle:before,\n.ion-android-boat:before,\n.ion-android-bookmark:before,\n.ion-android-bulb:before,\n.ion-android-bus:before,\n.ion-android-calendar:before,\n.ion-android-call:before,\n.ion-android-camera:before,\n.ion-android-cancel:before,\n.ion-android-car:before,\n.ion-android-cart:before,\n.ion-android-chat:before,\n.ion-android-checkbox:before,\n.ion-android-checkbox-blank:before,\n.ion-android-checkbox-outline:before,\n.ion-android-checkbox-outline-blank:before,\n.ion-android-checkmark-circle:before,\n.ion-android-clipboard:before,\n.ion-android-close:before,\n.ion-android-cloud:before,\n.ion-android-cloud-circle:before,\n.ion-android-cloud-done:before,\n.ion-android-cloud-outline:before,\n.ion-android-color-palette:before,\n.ion-android-compass:before,\n.ion-android-contact:before,\n.ion-android-contacts:before,\n.ion-android-contract:before,\n.ion-android-create:before,\n.ion-android-delete:before,\n.ion-android-desktop:before,\n.ion-android-document:before,\n.ion-android-done:before,\n.ion-android-done-all:before,\n.ion-android-download:before,\n.ion-android-drafts:before,\n.ion-android-exit:before,\n.ion-android-expand:before,\n.ion-android-favorite:before,\n.ion-android-favorite-outline:before,\n.ion-android-film:before,\n.ion-android-folder:before,\n.ion-android-folder-open:before,\n.ion-android-funnel:before,\n.ion-android-globe:before,\n.ion-android-hand:before,\n.ion-android-hangout:before,\n.ion-android-happy:before,\n.ion-android-home:before,\n.ion-android-image:before,\n.ion-android-laptop:before,\n.ion-android-list:before,\n.ion-android-locate:before,\n.ion-android-lock:before,\n.ion-android-mail:before,\n.ion-android-map:before,\n.ion-android-menu:before,\n.ion-android-microphone:before,\n.ion-android-microphone-off:before,\n.ion-android-more-horizontal:before,\n.ion-android-more-vertical:before,\n.ion-android-navigate:before,\n.ion-android-notifications:before,\n.ion-android-notifications-none:before,\n.ion-android-notifications-off:before,\n.ion-android-open:before,\n.ion-android-options:before,\n.ion-android-people:before,\n.ion-android-person:before,\n.ion-android-person-add:before,\n.ion-android-phone-landscape:before,\n.ion-android-phone-portrait:before,\n.ion-android-pin:before,\n.ion-android-plane:before,\n.ion-android-playstore:before,\n.ion-android-print:before,\n.ion-android-radio-button-off:before,\n.ion-android-radio-button-on:before,\n.ion-android-refresh:before,\n.ion-android-remove:before,\n.ion-android-remove-circle:before,\n.ion-android-restaurant:before,\n.ion-android-sad:before,\n.ion-android-search:before,\n.ion-android-send:before,\n.ion-android-settings:before,\n.ion-android-share:before,\n.ion-android-share-alt:before,\n.ion-android-star:before,\n.ion-android-star-half:before,\n.ion-android-star-outline:before,\n.ion-android-stopwatch:before,\n.ion-android-subway:before,\n.ion-android-sunny:before,\n.ion-android-sync:before,\n.ion-android-textsms:before,\n.ion-android-time:before,\n.ion-android-train:before,\n.ion-android-unlock:before,\n.ion-android-upload:before,\n.ion-android-volume-down:before,\n.ion-android-volume-mute:before,\n.ion-android-volume-off:before,\n.ion-android-volume-up:before,\n.ion-android-walk:before,\n.ion-android-warning:before,\n.ion-android-watch:before,\n.ion-android-wifi:before,\n.ion-aperture:before,\n.ion-archive:before,\n.ion-arrow-down-a:before,\n.ion-arrow-down-b:before,\n.ion-arrow-down-c:before,\n.ion-arrow-expand:before,\n.ion-arrow-graph-down-left:before,\n.ion-arrow-graph-down-right:before,\n.ion-arrow-graph-up-left:before,\n.ion-arrow-graph-up-right:before,\n.ion-arrow-left-a:before,\n.ion-arrow-left-b:before,\n.ion-arrow-left-c:before,\n.ion-arrow-move:before,\n.ion-arrow-resize:before,\n.ion-arrow-return-left:before,\n.ion-arrow-return-right:before,\n.ion-arrow-right-a:before,\n.ion-arrow-right-b:before,\n.ion-arrow-right-c:before,\n.ion-arrow-shrink:before,\n.ion-arrow-swap:before,\n.ion-arrow-up-a:before,\n.ion-arrow-up-b:before,\n.ion-arrow-up-c:before,\n.ion-asterisk:before,\n.ion-at:before,\n.ion-backspace:before,\n.ion-backspace-outline:before,\n.ion-bag:before,\n.ion-battery-charging:before,\n.ion-battery-empty:before,\n.ion-battery-full:before,\n.ion-battery-half:before,\n.ion-battery-low:before,\n.ion-beaker:before,\n.ion-beer:before,\n.ion-bluetooth:before,\n.ion-bonfire:before,\n.ion-bookmark:before,\n.ion-bowtie:before,\n.ion-briefcase:before,\n.ion-bug:before,\n.ion-calculator:before,\n.ion-calendar:before,\n.ion-camera:before,\n.ion-card:before,\n.ion-cash:before,\n.ion-chatbox:before,\n.ion-chatbox-working:before,\n.ion-chatboxes:before,\n.ion-chatbubble:before,\n.ion-chatbubble-working:before,\n.ion-chatbubbles:before,\n.ion-checkmark:before,\n.ion-checkmark-circled:before,\n.ion-checkmark-round:before,\n.ion-chevron-down:before,\n.ion-chevron-left:before,\n.ion-chevron-right:before,\n.ion-chevron-up:before,\n.ion-clipboard:before,\n.ion-clock:before,\n.ion-close:before,\n.ion-close-circled:before,\n.ion-close-round:before,\n.ion-closed-captioning:before,\n.ion-cloud:before,\n.ion-code:before,\n.ion-code-download:before,\n.ion-code-working:before,\n.ion-coffee:before,\n.ion-compass:before,\n.ion-compose:before,\n.ion-connection-bars:before,\n.ion-contrast:before,\n.ion-crop:before,\n.ion-cube:before,\n.ion-disc:before,\n.ion-document:before,\n.ion-document-text:before,\n.ion-drag:before,\n.ion-earth:before,\n.ion-easel:before,\n.ion-edit:before,\n.ion-egg:before,\n.ion-eject:before,\n.ion-email:before,\n.ion-email-unread:before,\n.ion-erlenmeyer-flask:before,\n.ion-erlenmeyer-flask-bubbles:before,\n.ion-eye:before,\n.ion-eye-disabled:before,\n.ion-female:before,\n.ion-filing:before,\n.ion-film-marker:before,\n.ion-fireball:before,\n.ion-flag:before,\n.ion-flame:before,\n.ion-flash:before,\n.ion-flash-off:before,\n.ion-folder:before,\n.ion-fork:before,\n.ion-fork-repo:before,\n.ion-forward:before,\n.ion-funnel:before,\n.ion-gear-a:before,\n.ion-gear-b:before,\n.ion-grid:before,\n.ion-hammer:before,\n.ion-happy:before,\n.ion-happy-outline:before,\n.ion-headphone:before,\n.ion-heart:before,\n.ion-heart-broken:before,\n.ion-help:before,\n.ion-help-buoy:before,\n.ion-help-circled:before,\n.ion-home:before,\n.ion-icecream:before,\n.ion-image:before,\n.ion-images:before,\n.ion-information:before,\n.ion-information-circled:before,\n.ion-ionic:before,\n.ion-ios-alarm:before,\n.ion-ios-alarm-outline:before,\n.ion-ios-albums:before,\n.ion-ios-albums-outline:before,\n.ion-ios-americanfootball:before,\n.ion-ios-americanfootball-outline:before,\n.ion-ios-analytics:before,\n.ion-ios-analytics-outline:before,\n.ion-ios-arrow-back:before,\n.ion-ios-arrow-down:before,\n.ion-ios-arrow-forward:before,\n.ion-ios-arrow-left:before,\n.ion-ios-arrow-right:before,\n.ion-ios-arrow-thin-down:before,\n.ion-ios-arrow-thin-left:before,\n.ion-ios-arrow-thin-right:before,\n.ion-ios-arrow-thin-up:before,\n.ion-ios-arrow-up:before,\n.ion-ios-at:before,\n.ion-ios-at-outline:before,\n.ion-ios-barcode:before,\n.ion-ios-barcode-outline:before,\n.ion-ios-baseball:before,\n.ion-ios-baseball-outline:before,\n.ion-ios-basketball:before,\n.ion-ios-basketball-outline:before,\n.ion-ios-bell:before,\n.ion-ios-bell-outline:before,\n.ion-ios-body:before,\n.ion-ios-body-outline:before,\n.ion-ios-bolt:before,\n.ion-ios-bolt-outline:before,\n.ion-ios-book:before,\n.ion-ios-book-outline:before,\n.ion-ios-bookmarks:before,\n.ion-ios-bookmarks-outline:before,\n.ion-ios-box:before,\n.ion-ios-box-outline:before,\n.ion-ios-briefcase:before,\n.ion-ios-briefcase-outline:before,\n.ion-ios-browsers:before,\n.ion-ios-browsers-outline:before,\n.ion-ios-calculator:before,\n.ion-ios-calculator-outline:before,\n.ion-ios-calendar:before,\n.ion-ios-calendar-outline:before,\n.ion-ios-camera:before,\n.ion-ios-camera-outline:before,\n.ion-ios-cart:before,\n.ion-ios-cart-outline:before,\n.ion-ios-chatboxes:before,\n.ion-ios-chatboxes-outline:before,\n.ion-ios-chatbubble:before,\n.ion-ios-chatbubble-outline:before,\n.ion-ios-checkmark:before,\n.ion-ios-checkmark-empty:before,\n.ion-ios-checkmark-outline:before,\n.ion-ios-circle-filled:before,\n.ion-ios-circle-outline:before,\n.ion-ios-clock:before,\n.ion-ios-clock-outline:before,\n.ion-ios-close:before,\n.ion-ios-close-empty:before,\n.ion-ios-close-outline:before,\n.ion-ios-cloud:before,\n.ion-ios-cloud-download:before,\n.ion-ios-cloud-download-outline:before,\n.ion-ios-cloud-outline:before,\n.ion-ios-cloud-upload:before,\n.ion-ios-cloud-upload-outline:before,\n.ion-ios-cloudy:before,\n.ion-ios-cloudy-night:before,\n.ion-ios-cloudy-night-outline:before,\n.ion-ios-cloudy-outline:before,\n.ion-ios-cog:before,\n.ion-ios-cog-outline:before,\n.ion-ios-color-filter:before,\n.ion-ios-color-filter-outline:before,\n.ion-ios-color-wand:before,\n.ion-ios-color-wand-outline:before,\n.ion-ios-compose:before,\n.ion-ios-compose-outline:before,\n.ion-ios-contact:before,\n.ion-ios-contact-outline:before,\n.ion-ios-copy:before,\n.ion-ios-copy-outline:before,\n.ion-ios-crop:before,\n.ion-ios-crop-strong:before,\n.ion-ios-download:before,\n.ion-ios-download-outline:before,\n.ion-ios-drag:before,\n.ion-ios-email:before,\n.ion-ios-email-outline:before,\n.ion-ios-eye:before,\n.ion-ios-eye-outline:before,\n.ion-ios-fastforward:before,\n.ion-ios-fastforward-outline:before,\n.ion-ios-filing:before,\n.ion-ios-filing-outline:before,\n.ion-ios-film:before,\n.ion-ios-film-outline:before,\n.ion-ios-flag:before,\n.ion-ios-flag-outline:before,\n.ion-ios-flame:before,\n.ion-ios-flame-outline:before,\n.ion-ios-flask:before,\n.ion-ios-flask-outline:before,\n.ion-ios-flower:before,\n.ion-ios-flower-outline:before,\n.ion-ios-folder:before,\n.ion-ios-folder-outline:before,\n.ion-ios-football:before,\n.ion-ios-football-outline:before,\n.ion-ios-game-controller-a:before,\n.ion-ios-game-controller-a-outline:before,\n.ion-ios-game-controller-b:before,\n.ion-ios-game-controller-b-outline:before,\n.ion-ios-gear:before,\n.ion-ios-gear-outline:before,\n.ion-ios-glasses:before,\n.ion-ios-glasses-outline:before,\n.ion-ios-grid-view:before,\n.ion-ios-grid-view-outline:before,\n.ion-ios-heart:before,\n.ion-ios-heart-outline:before,\n.ion-ios-help:before,\n.ion-ios-help-empty:before,\n.ion-ios-help-outline:before,\n.ion-ios-home:before,\n.ion-ios-home-outline:before,\n.ion-ios-infinite:before,\n.ion-ios-infinite-outline:before,\n.ion-ios-information:before,\n.ion-ios-information-empty:before,\n.ion-ios-information-outline:before,\n.ion-ios-ionic-outline:before,\n.ion-ios-keypad:before,\n.ion-ios-keypad-outline:before,\n.ion-ios-lightbulb:before,\n.ion-ios-lightbulb-outline:before,\n.ion-ios-list:before,\n.ion-ios-list-outline:before,\n.ion-ios-location:before,\n.ion-ios-location-outline:before,\n.ion-ios-locked:before,\n.ion-ios-locked-outline:before,\n.ion-ios-loop:before,\n.ion-ios-loop-strong:before,\n.ion-ios-medical:before,\n.ion-ios-medical-outline:before,\n.ion-ios-medkit:before,\n.ion-ios-medkit-outline:before,\n.ion-ios-mic:before,\n.ion-ios-mic-off:before,\n.ion-ios-mic-outline:before,\n.ion-ios-minus:before,\n.ion-ios-minus-empty:before,\n.ion-ios-minus-outline:before,\n.ion-ios-monitor:before,\n.ion-ios-monitor-outline:before,\n.ion-ios-moon:before,\n.ion-ios-moon-outline:before,\n.ion-ios-more:before,\n.ion-ios-more-outline:before,\n.ion-ios-musical-note:before,\n.ion-ios-musical-notes:before,\n.ion-ios-navigate:before,\n.ion-ios-navigate-outline:before,\n.ion-ios-nutrition:before,\n.ion-ios-nutrition-outline:before,\n.ion-ios-paper:before,\n.ion-ios-paper-outline:before,\n.ion-ios-paperplane:before,\n.ion-ios-paperplane-outline:before,\n.ion-ios-partlysunny:before,\n.ion-ios-partlysunny-outline:before,\n.ion-ios-pause:before,\n.ion-ios-pause-outline:before,\n.ion-ios-paw:before,\n.ion-ios-paw-outline:before,\n.ion-ios-people:before,\n.ion-ios-people-outline:before,\n.ion-ios-person:before,\n.ion-ios-person-outline:before,\n.ion-ios-personadd:before,\n.ion-ios-personadd-outline:before,\n.ion-ios-photos:before,\n.ion-ios-photos-outline:before,\n.ion-ios-pie:before,\n.ion-ios-pie-outline:before,\n.ion-ios-pint:before,\n.ion-ios-pint-outline:before,\n.ion-ios-play:before,\n.ion-ios-play-outline:before,\n.ion-ios-plus:before,\n.ion-ios-plus-empty:before,\n.ion-ios-plus-outline:before,\n.ion-ios-pricetag:before,\n.ion-ios-pricetag-outline:before,\n.ion-ios-pricetags:before,\n.ion-ios-pricetags-outline:before,\n.ion-ios-printer:before,\n.ion-ios-printer-outline:before,\n.ion-ios-pulse:before,\n.ion-ios-pulse-strong:before,\n.ion-ios-rainy:before,\n.ion-ios-rainy-outline:before,\n.ion-ios-recording:before,\n.ion-ios-recording-outline:before,\n.ion-ios-redo:before,\n.ion-ios-redo-outline:before,\n.ion-ios-refresh:before,\n.ion-ios-refresh-empty:before,\n.ion-ios-refresh-outline:before,\n.ion-ios-reload:before,\n.ion-ios-reverse-camera:before,\n.ion-ios-reverse-camera-outline:before,\n.ion-ios-rewind:before,\n.ion-ios-rewind-outline:before,\n.ion-ios-rose:before,\n.ion-ios-rose-outline:before,\n.ion-ios-search:before,\n.ion-ios-search-strong:before,\n.ion-ios-settings:before,\n.ion-ios-settings-strong:before,\n.ion-ios-shuffle:before,\n.ion-ios-shuffle-strong:before,\n.ion-ios-skipbackward:before,\n.ion-ios-skipbackward-outline:before,\n.ion-ios-skipforward:before,\n.ion-ios-skipforward-outline:before,\n.ion-ios-snowy:before,\n.ion-ios-speedometer:before,\n.ion-ios-speedometer-outline:before,\n.ion-ios-star:before,\n.ion-ios-star-half:before,\n.ion-ios-star-outline:before,\n.ion-ios-stopwatch:before,\n.ion-ios-stopwatch-outline:before,\n.ion-ios-sunny:before,\n.ion-ios-sunny-outline:before,\n.ion-ios-telephone:before,\n.ion-ios-telephone-outline:before,\n.ion-ios-tennisball:before,\n.ion-ios-tennisball-outline:before,\n.ion-ios-thunderstorm:before,\n.ion-ios-thunderstorm-outline:before,\n.ion-ios-time:before,\n.ion-ios-time-outline:before,\n.ion-ios-timer:before,\n.ion-ios-timer-outline:before,\n.ion-ios-toggle:before,\n.ion-ios-toggle-outline:before,\n.ion-ios-trash:before,\n.ion-ios-trash-outline:before,\n.ion-ios-undo:before,\n.ion-ios-undo-outline:before,\n.ion-ios-unlocked:before,\n.ion-ios-unlocked-outline:before,\n.ion-ios-upload:before,\n.ion-ios-upload-outline:before,\n.ion-ios-videocam:before,\n.ion-ios-videocam-outline:before,\n.ion-ios-volume-high:before,\n.ion-ios-volume-low:before,\n.ion-ios-wineglass:before,\n.ion-ios-wineglass-outline:before,\n.ion-ios-world:before,\n.ion-ios-world-outline:before,\n.ion-ipad:before,\n.ion-iphone:before,\n.ion-ipod:before,\n.ion-jet:before,\n.ion-key:before,\n.ion-knife:before,\n.ion-laptop:before,\n.ion-leaf:before,\n.ion-levels:before,\n.ion-lightbulb:before,\n.ion-link:before,\n.ion-load-a:before,\n.ion-load-b:before,\n.ion-load-c:before,\n.ion-load-d:before,\n.ion-location:before,\n.ion-lock-combination:before,\n.ion-locked:before,\n.ion-log-in:before,\n.ion-log-out:before,\n.ion-loop:before,\n.ion-magnet:before,\n.ion-male:before,\n.ion-man:before,\n.ion-map:before,\n.ion-medkit:before,\n.ion-merge:before,\n.ion-mic-a:before,\n.ion-mic-b:before,\n.ion-mic-c:before,\n.ion-minus:before,\n.ion-minus-circled:before,\n.ion-minus-round:before,\n.ion-model-s:before,\n.ion-monitor:before,\n.ion-more:before,\n.ion-mouse:before,\n.ion-music-note:before,\n.ion-navicon:before,\n.ion-navicon-round:before,\n.ion-navigate:before,\n.ion-network:before,\n.ion-no-smoking:before,\n.ion-nuclear:before,\n.ion-outlet:before,\n.ion-paintbrush:before,\n.ion-paintbucket:before,\n.ion-paper-airplane:before,\n.ion-paperclip:before,\n.ion-pause:before,\n.ion-person:before,\n.ion-person-add:before,\n.ion-person-stalker:before,\n.ion-pie-graph:before,\n.ion-pin:before,\n.ion-pinpoint:before,\n.ion-pizza:before,\n.ion-plane:before,\n.ion-planet:before,\n.ion-play:before,\n.ion-playstation:before,\n.ion-plus:before,\n.ion-plus-circled:before,\n.ion-plus-round:before,\n.ion-podium:before,\n.ion-pound:before,\n.ion-power:before,\n.ion-pricetag:before,\n.ion-pricetags:before,\n.ion-printer:before,\n.ion-pull-request:before,\n.ion-qr-scanner:before,\n.ion-quote:before,\n.ion-radio-waves:before,\n.ion-record:before,\n.ion-refresh:before,\n.ion-reply:before,\n.ion-reply-all:before,\n.ion-ribbon-a:before,\n.ion-ribbon-b:before,\n.ion-sad:before,\n.ion-sad-outline:before,\n.ion-scissors:before,\n.ion-search:before,\n.ion-settings:before,\n.ion-share:before,\n.ion-shuffle:before,\n.ion-skip-backward:before,\n.ion-skip-forward:before,\n.ion-social-android:before,\n.ion-social-android-outline:before,\n.ion-social-angular:before,\n.ion-social-angular-outline:before,\n.ion-social-apple:before,\n.ion-social-apple-outline:before,\n.ion-social-bitcoin:before,\n.ion-social-bitcoin-outline:before,\n.ion-social-buffer:before,\n.ion-social-buffer-outline:before,\n.ion-social-chrome:before,\n.ion-social-chrome-outline:before,\n.ion-social-codepen:before,\n.ion-social-codepen-outline:before,\n.ion-social-css3:before,\n.ion-social-css3-outline:before,\n.ion-social-designernews:before,\n.ion-social-designernews-outline:before,\n.ion-social-dribbble:before,\n.ion-social-dribbble-outline:before,\n.ion-social-dropbox:before,\n.ion-social-dropbox-outline:before,\n.ion-social-euro:before,\n.ion-social-euro-outline:before,\n.ion-social-facebook:before,\n.ion-social-facebook-outline:before,\n.ion-social-foursquare:before,\n.ion-social-foursquare-outline:before,\n.ion-social-freebsd-devil:before,\n.ion-social-github:before,\n.ion-social-github-outline:before,\n.ion-social-google:before,\n.ion-social-google-outline:before,\n.ion-social-googleplus:before,\n.ion-social-googleplus-outline:before,\n.ion-social-hackernews:before,\n.ion-social-hackernews-outline:before,\n.ion-social-html5:before,\n.ion-social-html5-outline:before,\n.ion-social-instagram:before,\n.ion-social-instagram-outline:before,\n.ion-social-javascript:before,\n.ion-social-javascript-outline:before,\n.ion-social-linkedin:before,\n.ion-social-linkedin-outline:before,\n.ion-social-markdown:before,\n.ion-social-nodejs:before,\n.ion-social-octocat:before,\n.ion-social-pinterest:before,\n.ion-social-pinterest-outline:before,\n.ion-social-python:before,\n.ion-social-reddit:before,\n.ion-social-reddit-outline:before,\n.ion-social-rss:before,\n.ion-social-rss-outline:before,\n.ion-social-sass:before,\n.ion-social-skype:before,\n.ion-social-skype-outline:before,\n.ion-social-snapchat:before,\n.ion-social-snapchat-outline:before,\n.ion-social-tumblr:before,\n.ion-social-tumblr-outline:before,\n.ion-social-tux:before,\n.ion-social-twitch:before,\n.ion-social-twitch-outline:before,\n.ion-social-twitter:before,\n.ion-social-twitter-outline:before,\n.ion-social-usd:before,\n.ion-social-usd-outline:before,\n.ion-social-vimeo:before,\n.ion-social-vimeo-outline:before,\n.ion-social-whatsapp:before,\n.ion-social-whatsapp-outline:before,\n.ion-social-windows:before,\n.ion-social-windows-outline:before,\n.ion-social-wordpress:before,\n.ion-social-wordpress-outline:before,\n.ion-social-yahoo:before,\n.ion-social-yahoo-outline:before,\n.ion-social-yen:before,\n.ion-social-yen-outline:before,\n.ion-social-youtube:before,\n.ion-social-youtube-outline:before,\n.ion-soup-can:before,\n.ion-soup-can-outline:before,\n.ion-speakerphone:before,\n.ion-speedometer:before,\n.ion-spoon:before,\n.ion-star:before,\n.ion-stats-bars:before,\n.ion-steam:before,\n.ion-stop:before,\n.ion-thermometer:before,\n.ion-thumbsdown:before,\n.ion-thumbsup:before,\n.ion-toggle:before,\n.ion-toggle-filled:before,\n.ion-transgender:before,\n.ion-trash-a:before,\n.ion-trash-b:before,\n.ion-trophy:before,\n.ion-tshirt:before,\n.ion-tshirt-outline:before,\n.ion-umbrella:before,\n.ion-university:before,\n.ion-unlocked:before,\n.ion-upload:before,\n.ion-usb:before,\n.ion-videocamera:before,\n.ion-volume-high:before,\n.ion-volume-low:before,\n.ion-volume-medium:before,\n.ion-volume-mute:before,\n.ion-wand:before,\n.ion-waterdrop:before,\n.ion-wifi:before,\n.ion-wineglass:before,\n.ion-woman:before,\n.ion-wrench:before,\n.ion-xbox:before {\n  display: inline-block;\n  font-family: \"Ionicons\";\n  speak: none;\n  font-style: normal;\n  font-weight: normal;\n  font-variant: normal;\n  text-transform: none;\n  text-rendering: auto;\n  line-height: 1;\n  -webkit-font-smoothing: antialiased;\n  -moz-osx-font-smoothing: grayscale;\n}\n.ion-spin,\n.ion-loading-a,\n.ion-loading-b,\n.ion-loading-c,\n.ion-loading-d,\n.ion-looping,\n.ion-refreshing,\n.ion-ios7-reloading {\n  -webkit-animation: spin 1s infinite linear;\n  -moz-animation: spin 1s infinite linear;\n  -o-animation: spin 1s infinite linear;\n  animation: spin 1s infinite linear;\n}\n@-moz-keyframes spin {\n  0% {\n    -moz-transform: rotate(0deg);\n  }\n  100% {\n    -moz-transform: rotate(359deg);\n  }\n}\n@-webkit-keyframes spin {\n  0% {\n    -webkit-transform: rotate(0deg);\n  }\n  100% {\n    -webkit-transform: rotate(359deg);\n  }\n}\n@-o-keyframes spin {\n  0% {\n    -o-transform: rotate(0deg);\n  }\n  100% {\n    -o-transform: rotate(359deg);\n  }\n}\n@-ms-keyframes spin {\n  0% {\n    -ms-transform: rotate(0deg);\n  }\n  100% {\n    -ms-transform: rotate(359deg);\n  }\n}\n@keyframes spin {\n  0% {\n    transform: rotate(0deg);\n  }\n  100% {\n    transform: rotate(359deg);\n  }\n}\n.ion-loading-a {\n  -webkit-animation-timing-function: steps(8, start);\n  -moz-animation-timing-function: steps(8, start);\n  animation-timing-function: steps(8, start);\n}\n.ion-alert:before {\n  content: \"\\f101\";\n}\n.ion-alert-circled:before {\n  content: \"\\f100\";\n}\n.ion-android-add:before {\n  content: \"\\f2c7\";\n}\n.ion-android-add-circle:before {\n  content: \"\\f359\";\n}\n.ion-android-alarm-clock:before {\n  content: \"\\f35a\";\n}\n.ion-android-alert:before {\n  content: \"\\f35b\";\n}\n.ion-android-apps:before {\n  content: \"\\f35c\";\n}\n.ion-android-archive:before {\n  content: \"\\f2c9\";\n}\n.ion-android-arrow-back:before {\n  content: \"\\f2ca\";\n}\n.ion-android-arrow-down:before {\n  content: \"\\f35d\";\n}\n.ion-android-arrow-dropdown:before {\n  content: \"\\f35f\";\n}\n.ion-android-arrow-dropdown-circle:before {\n  content: \"\\f35e\";\n}\n.ion-android-arrow-dropleft:before {\n  content: \"\\f361\";\n}\n.ion-android-arrow-dropleft-circle:before {\n  content: \"\\f360\";\n}\n.ion-android-arrow-dropright:before {\n  content: \"\\f363\";\n}\n.ion-android-arrow-dropright-circle:before {\n  content: \"\\f362\";\n}\n.ion-android-arrow-dropup:before {\n  content: \"\\f365\";\n}\n.ion-android-arrow-dropup-circle:before {\n  content: \"\\f364\";\n}\n.ion-android-arrow-forward:before {\n  content: \"\\f30f\";\n}\n.ion-android-arrow-up:before {\n  content: \"\\f366\";\n}\n.ion-android-attach:before {\n  content: \"\\f367\";\n}\n.ion-android-bar:before {\n  content: \"\\f368\";\n}\n.ion-android-bicycle:before {\n  content: \"\\f369\";\n}\n.ion-android-boat:before {\n  content: \"\\f36a\";\n}\n.ion-android-bookmark:before {\n  content: \"\\f36b\";\n}\n.ion-android-bulb:before {\n  content: \"\\f36c\";\n}\n.ion-android-bus:before {\n  content: \"\\f36d\";\n}\n.ion-android-calendar:before {\n  content: \"\\f2d1\";\n}\n.ion-android-call:before {\n  content: \"\\f2d2\";\n}\n.ion-android-camera:before {\n  content: \"\\f2d3\";\n}\n.ion-android-cancel:before {\n  content: \"\\f36e\";\n}\n.ion-android-car:before {\n  content: \"\\f36f\";\n}\n.ion-android-cart:before {\n  content: \"\\f370\";\n}\n.ion-android-chat:before {\n  content: \"\\f2d4\";\n}\n.ion-android-checkbox:before {\n  content: \"\\f374\";\n}\n.ion-android-checkbox-blank:before {\n  content: \"\\f371\";\n}\n.ion-android-checkbox-outline:before {\n  content: \"\\f373\";\n}\n.ion-android-checkbox-outline-blank:before {\n  content: \"\\f372\";\n}\n.ion-android-checkmark-circle:before {\n  content: \"\\f375\";\n}\n.ion-android-clipboard:before {\n  content: \"\\f376\";\n}\n.ion-android-close:before {\n  content: \"\\f2d7\";\n}\n.ion-android-cloud:before {\n  content: \"\\f37a\";\n}\n.ion-android-cloud-circle:before {\n  content: \"\\f377\";\n}\n.ion-android-cloud-done:before {\n  content: \"\\f378\";\n}\n.ion-android-cloud-outline:before {\n  content: \"\\f379\";\n}\n.ion-android-color-palette:before {\n  content: \"\\f37b\";\n}\n.ion-android-compass:before {\n  content: \"\\f37c\";\n}\n.ion-android-contact:before {\n  content: \"\\f2d8\";\n}\n.ion-android-contacts:before {\n  content: \"\\f2d9\";\n}\n.ion-android-contract:before {\n  content: \"\\f37d\";\n}\n.ion-android-create:before {\n  content: \"\\f37e\";\n}\n.ion-android-delete:before {\n  content: \"\\f37f\";\n}\n.ion-android-desktop:before {\n  content: \"\\f380\";\n}\n.ion-android-document:before {\n  content: \"\\f381\";\n}\n.ion-android-done:before {\n  content: \"\\f383\";\n}\n.ion-android-done-all:before {\n  content: \"\\f382\";\n}\n.ion-android-download:before {\n  content: \"\\f2dd\";\n}\n.ion-android-drafts:before {\n  content: \"\\f384\";\n}\n.ion-android-exit:before {\n  content: \"\\f385\";\n}\n.ion-android-expand:before {\n  content: \"\\f386\";\n}\n.ion-android-favorite:before {\n  content: \"\\f388\";\n}\n.ion-android-favorite-outline:before {\n  content: \"\\f387\";\n}\n.ion-android-film:before {\n  content: \"\\f389\";\n}\n.ion-android-folder:before {\n  content: \"\\f2e0\";\n}\n.ion-android-folder-open:before {\n  content: \"\\f38a\";\n}\n.ion-android-funnel:before {\n  content: \"\\f38b\";\n}\n.ion-android-globe:before {\n  content: \"\\f38c\";\n}\n.ion-android-hand:before {\n  content: \"\\f2e3\";\n}\n.ion-android-hangout:before {\n  content: \"\\f38d\";\n}\n.ion-android-happy:before {\n  content: \"\\f38e\";\n}\n.ion-android-home:before {\n  content: \"\\f38f\";\n}\n.ion-android-image:before {\n  content: \"\\f2e4\";\n}\n.ion-android-laptop:before {\n  content: \"\\f390\";\n}\n.ion-android-list:before {\n  content: \"\\f391\";\n}\n.ion-android-locate:before {\n  content: \"\\f2e9\";\n}\n.ion-android-lock:before {\n  content: \"\\f392\";\n}\n.ion-android-mail:before {\n  content: \"\\f2eb\";\n}\n.ion-android-map:before {\n  content: \"\\f393\";\n}\n.ion-android-menu:before {\n  content: \"\\f394\";\n}\n.ion-android-microphone:before {\n  content: \"\\f2ec\";\n}\n.ion-android-microphone-off:before {\n  content: \"\\f395\";\n}\n.ion-android-more-horizontal:before {\n  content: \"\\f396\";\n}\n.ion-android-more-vertical:before {\n  content: \"\\f397\";\n}\n.ion-android-navigate:before {\n  content: \"\\f398\";\n}\n.ion-android-notifications:before {\n  content: \"\\f39b\";\n}\n.ion-android-notifications-none:before {\n  content: \"\\f399\";\n}\n.ion-android-notifications-off:before {\n  content: \"\\f39a\";\n}\n.ion-android-open:before {\n  content: \"\\f39c\";\n}\n.ion-android-options:before {\n  content: \"\\f39d\";\n}\n.ion-android-people:before {\n  content: \"\\f39e\";\n}\n.ion-android-person:before {\n  content: \"\\f3a0\";\n}\n.ion-android-person-add:before {\n  content: \"\\f39f\";\n}\n.ion-android-phone-landscape:before {\n  content: \"\\f3a1\";\n}\n.ion-android-phone-portrait:before {\n  content: \"\\f3a2\";\n}\n.ion-android-pin:before {\n  content: \"\\f3a3\";\n}\n.ion-android-plane:before {\n  content: \"\\f3a4\";\n}\n.ion-android-playstore:before {\n  content: \"\\f2f0\";\n}\n.ion-android-print:before {\n  content: \"\\f3a5\";\n}\n.ion-android-radio-button-off:before {\n  content: \"\\f3a6\";\n}\n.ion-android-radio-button-on:before {\n  content: \"\\f3a7\";\n}\n.ion-android-refresh:before {\n  content: \"\\f3a8\";\n}\n.ion-android-remove:before {\n  content: \"\\f2f4\";\n}\n.ion-android-remove-circle:before {\n  content: \"\\f3a9\";\n}\n.ion-android-restaurant:before {\n  content: \"\\f3aa\";\n}\n.ion-android-sad:before {\n  content: \"\\f3ab\";\n}\n.ion-android-search:before {\n  content: \"\\f2f5\";\n}\n.ion-android-send:before {\n  content: \"\\f2f6\";\n}\n.ion-android-settings:before {\n  content: \"\\f2f7\";\n}\n.ion-android-share:before {\n  content: \"\\f2f8\";\n}\n.ion-android-share-alt:before {\n  content: \"\\f3ac\";\n}\n.ion-android-star:before {\n  content: \"\\f2fc\";\n}\n.ion-android-star-half:before {\n  content: \"\\f3ad\";\n}\n.ion-android-star-outline:before {\n  content: \"\\f3ae\";\n}\n.ion-android-stopwatch:before {\n  content: \"\\f2fd\";\n}\n.ion-android-subway:before {\n  content: \"\\f3af\";\n}\n.ion-android-sunny:before {\n  content: \"\\f3b0\";\n}\n.ion-android-sync:before {\n  content: \"\\f3b1\";\n}\n.ion-android-textsms:before {\n  content: \"\\f3b2\";\n}\n.ion-android-time:before {\n  content: \"\\f3b3\";\n}\n.ion-android-train:before {\n  content: \"\\f3b4\";\n}\n.ion-android-unlock:before {\n  content: \"\\f3b5\";\n}\n.ion-android-upload:before {\n  content: \"\\f3b6\";\n}\n.ion-android-volume-down:before {\n  content: \"\\f3b7\";\n}\n.ion-android-volume-mute:before {\n  content: \"\\f3b8\";\n}\n.ion-android-volume-off:before {\n  content: \"\\f3b9\";\n}\n.ion-android-volume-up:before {\n  content: \"\\f3ba\";\n}\n.ion-android-walk:before {\n  content: \"\\f3bb\";\n}\n.ion-android-warning:before {\n  content: \"\\f3bc\";\n}\n.ion-android-watch:before {\n  content: \"\\f3bd\";\n}\n.ion-android-wifi:before {\n  content: \"\\f305\";\n}\n.ion-aperture:before {\n  content: \"\\f313\";\n}\n.ion-archive:before {\n  content: \"\\f102\";\n}\n.ion-arrow-down-a:before {\n  content: \"\\f103\";\n}\n.ion-arrow-down-b:before {\n  content: \"\\f104\";\n}\n.ion-arrow-down-c:before {\n  content: \"\\f105\";\n}\n.ion-arrow-expand:before {\n  content: \"\\f25e\";\n}\n.ion-arrow-graph-down-left:before {\n  content: \"\\f25f\";\n}\n.ion-arrow-graph-down-right:before {\n  content: \"\\f260\";\n}\n.ion-arrow-graph-up-left:before {\n  content: \"\\f261\";\n}\n.ion-arrow-graph-up-right:before {\n  content: \"\\f262\";\n}\n.ion-arrow-left-a:before {\n  content: \"\\f106\";\n}\n.ion-arrow-left-b:before {\n  content: \"\\f107\";\n}\n.ion-arrow-left-c:before {\n  content: \"\\f108\";\n}\n.ion-arrow-move:before {\n  content: \"\\f263\";\n}\n.ion-arrow-resize:before {\n  content: \"\\f264\";\n}\n.ion-arrow-return-left:before {\n  content: \"\\f265\";\n}\n.ion-arrow-return-right:before {\n  content: \"\\f266\";\n}\n.ion-arrow-right-a:before {\n  content: \"\\f109\";\n}\n.ion-arrow-right-b:before {\n  content: \"\\f10a\";\n}\n.ion-arrow-right-c:before {\n  content: \"\\f10b\";\n}\n.ion-arrow-shrink:before {\n  content: \"\\f267\";\n}\n.ion-arrow-swap:before {\n  content: \"\\f268\";\n}\n.ion-arrow-up-a:before {\n  content: \"\\f10c\";\n}\n.ion-arrow-up-b:before {\n  content: \"\\f10d\";\n}\n.ion-arrow-up-c:before {\n  content: \"\\f10e\";\n}\n.ion-asterisk:before {\n  content: \"\\f314\";\n}\n.ion-at:before {\n  content: \"\\f10f\";\n}\n.ion-backspace:before {\n  content: \"\\f3bf\";\n}\n.ion-backspace-outline:before {\n  content: \"\\f3be\";\n}\n.ion-bag:before {\n  content: \"\\f110\";\n}\n.ion-battery-charging:before {\n  content: \"\\f111\";\n}\n.ion-battery-empty:before {\n  content: \"\\f112\";\n}\n.ion-battery-full:before {\n  content: \"\\f113\";\n}\n.ion-battery-half:before {\n  content: \"\\f114\";\n}\n.ion-battery-low:before {\n  content: \"\\f115\";\n}\n.ion-beaker:before {\n  content: \"\\f269\";\n}\n.ion-beer:before {\n  content: \"\\f26a\";\n}\n.ion-bluetooth:before {\n  content: \"\\f116\";\n}\n.ion-bonfire:before {\n  content: \"\\f315\";\n}\n.ion-bookmark:before {\n  content: \"\\f26b\";\n}\n.ion-bowtie:before {\n  content: \"\\f3c0\";\n}\n.ion-briefcase:before {\n  content: \"\\f26c\";\n}\n.ion-bug:before {\n  content: \"\\f2be\";\n}\n.ion-calculator:before {\n  content: \"\\f26d\";\n}\n.ion-calendar:before {\n  content: \"\\f117\";\n}\n.ion-camera:before {\n  content: \"\\f118\";\n}\n.ion-card:before {\n  content: \"\\f119\";\n}\n.ion-cash:before {\n  content: \"\\f316\";\n}\n.ion-chatbox:before {\n  content: \"\\f11b\";\n}\n.ion-chatbox-working:before {\n  content: \"\\f11a\";\n}\n.ion-chatboxes:before {\n  content: \"\\f11c\";\n}\n.ion-chatbubble:before {\n  content: \"\\f11e\";\n}\n.ion-chatbubble-working:before {\n  content: \"\\f11d\";\n}\n.ion-chatbubbles:before {\n  content: \"\\f11f\";\n}\n.ion-checkmark:before {\n  content: \"\\f122\";\n}\n.ion-checkmark-circled:before {\n  content: \"\\f120\";\n}\n.ion-checkmark-round:before {\n  content: \"\\f121\";\n}\n.ion-chevron-down:before {\n  content: \"\\f123\";\n}\n.ion-chevron-left:before {\n  content: \"\\f124\";\n}\n.ion-chevron-right:before {\n  content: \"\\f125\";\n}\n.ion-chevron-up:before {\n  content: \"\\f126\";\n}\n.ion-clipboard:before {\n  content: \"\\f127\";\n}\n.ion-clock:before {\n  content: \"\\f26e\";\n}\n.ion-close:before {\n  content: \"\\f12a\";\n}\n.ion-close-circled:before {\n  content: \"\\f128\";\n}\n.ion-close-round:before {\n  content: \"\\f129\";\n}\n.ion-closed-captioning:before {\n  content: \"\\f317\";\n}\n.ion-cloud:before {\n  content: \"\\f12b\";\n}\n.ion-code:before {\n  content: \"\\f271\";\n}\n.ion-code-download:before {\n  content: \"\\f26f\";\n}\n.ion-code-working:before {\n  content: \"\\f270\";\n}\n.ion-coffee:before {\n  content: \"\\f272\";\n}\n.ion-compass:before {\n  content: \"\\f273\";\n}\n.ion-compose:before {\n  content: \"\\f12c\";\n}\n.ion-connection-bars:before {\n  content: \"\\f274\";\n}\n.ion-contrast:before {\n  content: \"\\f275\";\n}\n.ion-crop:before {\n  content: \"\\f3c1\";\n}\n.ion-cube:before {\n  content: \"\\f318\";\n}\n.ion-disc:before {\n  content: \"\\f12d\";\n}\n.ion-document:before {\n  content: \"\\f12f\";\n}\n.ion-document-text:before {\n  content: \"\\f12e\";\n}\n.ion-drag:before {\n  content: \"\\f130\";\n}\n.ion-earth:before {\n  content: \"\\f276\";\n}\n.ion-easel:before {\n  content: \"\\f3c2\";\n}\n.ion-edit:before {\n  content: \"\\f2bf\";\n}\n.ion-egg:before {\n  content: \"\\f277\";\n}\n.ion-eject:before {\n  content: \"\\f131\";\n}\n.ion-email:before {\n  content: \"\\f132\";\n}\n.ion-email-unread:before {\n  content: \"\\f3c3\";\n}\n.ion-erlenmeyer-flask:before {\n  content: \"\\f3c5\";\n}\n.ion-erlenmeyer-flask-bubbles:before {\n  content: \"\\f3c4\";\n}\n.ion-eye:before {\n  content: \"\\f133\";\n}\n.ion-eye-disabled:before {\n  content: \"\\f306\";\n}\n.ion-female:before {\n  content: \"\\f278\";\n}\n.ion-filing:before {\n  content: \"\\f134\";\n}\n.ion-film-marker:before {\n  content: \"\\f135\";\n}\n.ion-fireball:before {\n  content: \"\\f319\";\n}\n.ion-flag:before {\n  content: \"\\f279\";\n}\n.ion-flame:before {\n  content: \"\\f31a\";\n}\n.ion-flash:before {\n  content: \"\\f137\";\n}\n.ion-flash-off:before {\n  content: \"\\f136\";\n}\n.ion-folder:before {\n  content: \"\\f139\";\n}\n.ion-fork:before {\n  content: \"\\f27a\";\n}\n.ion-fork-repo:before {\n  content: \"\\f2c0\";\n}\n.ion-forward:before {\n  content: \"\\f13a\";\n}\n.ion-funnel:before {\n  content: \"\\f31b\";\n}\n.ion-gear-a:before {\n  content: \"\\f13d\";\n}\n.ion-gear-b:before {\n  content: \"\\f13e\";\n}\n.ion-grid:before {\n  content: \"\\f13f\";\n}\n.ion-hammer:before {\n  content: \"\\f27b\";\n}\n.ion-happy:before {\n  content: \"\\f31c\";\n}\n.ion-happy-outline:before {\n  content: \"\\f3c6\";\n}\n.ion-headphone:before {\n  content: \"\\f140\";\n}\n.ion-heart:before {\n  content: \"\\f141\";\n}\n.ion-heart-broken:before {\n  content: \"\\f31d\";\n}\n.ion-help:before {\n  content: \"\\f143\";\n}\n.ion-help-buoy:before {\n  content: \"\\f27c\";\n}\n.ion-help-circled:before {\n  content: \"\\f142\";\n}\n.ion-home:before {\n  content: \"\\f144\";\n}\n.ion-icecream:before {\n  content: \"\\f27d\";\n}\n.ion-image:before {\n  content: \"\\f147\";\n}\n.ion-images:before {\n  content: \"\\f148\";\n}\n.ion-information:before {\n  content: \"\\f14a\";\n}\n.ion-information-circled:before {\n  content: \"\\f149\";\n}\n.ion-ionic:before {\n  content: \"\\f14b\";\n}\n.ion-ios-alarm:before {\n  content: \"\\f3c8\";\n}\n.ion-ios-alarm-outline:before {\n  content: \"\\f3c7\";\n}\n.ion-ios-albums:before {\n  content: \"\\f3ca\";\n}\n.ion-ios-albums-outline:before {\n  content: \"\\f3c9\";\n}\n.ion-ios-americanfootball:before {\n  content: \"\\f3cc\";\n}\n.ion-ios-americanfootball-outline:before {\n  content: \"\\f3cb\";\n}\n.ion-ios-analytics:before {\n  content: \"\\f3ce\";\n}\n.ion-ios-analytics-outline:before {\n  content: \"\\f3cd\";\n}\n.ion-ios-arrow-back:before {\n  content: \"\\f3cf\";\n}\n.ion-ios-arrow-down:before {\n  content: \"\\f3d0\";\n}\n.ion-ios-arrow-forward:before {\n  content: \"\\f3d1\";\n}\n.ion-ios-arrow-left:before {\n  content: \"\\f3d2\";\n}\n.ion-ios-arrow-right:before {\n  content: \"\\f3d3\";\n}\n.ion-ios-arrow-thin-down:before {\n  content: \"\\f3d4\";\n}\n.ion-ios-arrow-thin-left:before {\n  content: \"\\f3d5\";\n}\n.ion-ios-arrow-thin-right:before {\n  content: \"\\f3d6\";\n}\n.ion-ios-arrow-thin-up:before {\n  content: \"\\f3d7\";\n}\n.ion-ios-arrow-up:before {\n  content: \"\\f3d8\";\n}\n.ion-ios-at:before {\n  content: \"\\f3da\";\n}\n.ion-ios-at-outline:before {\n  content: \"\\f3d9\";\n}\n.ion-ios-barcode:before {\n  content: \"\\f3dc\";\n}\n.ion-ios-barcode-outline:before {\n  content: \"\\f3db\";\n}\n.ion-ios-baseball:before {\n  content: \"\\f3de\";\n}\n.ion-ios-baseball-outline:before {\n  content: \"\\f3dd\";\n}\n.ion-ios-basketball:before {\n  content: \"\\f3e0\";\n}\n.ion-ios-basketball-outline:before {\n  content: \"\\f3df\";\n}\n.ion-ios-bell:before {\n  content: \"\\f3e2\";\n}\n.ion-ios-bell-outline:before {\n  content: \"\\f3e1\";\n}\n.ion-ios-body:before {\n  content: \"\\f3e4\";\n}\n.ion-ios-body-outline:before {\n  content: \"\\f3e3\";\n}\n.ion-ios-bolt:before {\n  content: \"\\f3e6\";\n}\n.ion-ios-bolt-outline:before {\n  content: \"\\f3e5\";\n}\n.ion-ios-book:before {\n  content: \"\\f3e8\";\n}\n.ion-ios-book-outline:before {\n  content: \"\\f3e7\";\n}\n.ion-ios-bookmarks:before {\n  content: \"\\f3ea\";\n}\n.ion-ios-bookmarks-outline:before {\n  content: \"\\f3e9\";\n}\n.ion-ios-box:before {\n  content: \"\\f3ec\";\n}\n.ion-ios-box-outline:before {\n  content: \"\\f3eb\";\n}\n.ion-ios-briefcase:before {\n  content: \"\\f3ee\";\n}\n.ion-ios-briefcase-outline:before {\n  content: \"\\f3ed\";\n}\n.ion-ios-browsers:before {\n  content: \"\\f3f0\";\n}\n.ion-ios-browsers-outline:before {\n  content: \"\\f3ef\";\n}\n.ion-ios-calculator:before {\n  content: \"\\f3f2\";\n}\n.ion-ios-calculator-outline:before {\n  content: \"\\f3f1\";\n}\n.ion-ios-calendar:before {\n  content: \"\\f3f4\";\n}\n.ion-ios-calendar-outline:before {\n  content: \"\\f3f3\";\n}\n.ion-ios-camera:before {\n  content: \"\\f3f6\";\n}\n.ion-ios-camera-outline:before {\n  content: \"\\f3f5\";\n}\n.ion-ios-cart:before {\n  content: \"\\f3f8\";\n}\n.ion-ios-cart-outline:before {\n  content: \"\\f3f7\";\n}\n.ion-ios-chatboxes:before {\n  content: \"\\f3fa\";\n}\n.ion-ios-chatboxes-outline:before {\n  content: \"\\f3f9\";\n}\n.ion-ios-chatbubble:before {\n  content: \"\\f3fc\";\n}\n.ion-ios-chatbubble-outline:before {\n  content: \"\\f3fb\";\n}\n.ion-ios-checkmark:before {\n  content: \"\\f3ff\";\n}\n.ion-ios-checkmark-empty:before {\n  content: \"\\f3fd\";\n}\n.ion-ios-checkmark-outline:before {\n  content: \"\\f3fe\";\n}\n.ion-ios-circle-filled:before {\n  content: \"\\f400\";\n}\n.ion-ios-circle-outline:before {\n  content: \"\\f401\";\n}\n.ion-ios-clock:before {\n  content: \"\\f403\";\n}\n.ion-ios-clock-outline:before {\n  content: \"\\f402\";\n}\n.ion-ios-close:before {\n  content: \"\\f406\";\n}\n.ion-ios-close-empty:before {\n  content: \"\\f404\";\n}\n.ion-ios-close-outline:before {\n  content: \"\\f405\";\n}\n.ion-ios-cloud:before {\n  content: \"\\f40c\";\n}\n.ion-ios-cloud-download:before {\n  content: \"\\f408\";\n}\n.ion-ios-cloud-download-outline:before {\n  content: \"\\f407\";\n}\n.ion-ios-cloud-outline:before {\n  content: \"\\f409\";\n}\n.ion-ios-cloud-upload:before {\n  content: \"\\f40b\";\n}\n.ion-ios-cloud-upload-outline:before {\n  content: \"\\f40a\";\n}\n.ion-ios-cloudy:before {\n  content: \"\\f410\";\n}\n.ion-ios-cloudy-night:before {\n  content: \"\\f40e\";\n}\n.ion-ios-cloudy-night-outline:before {\n  content: \"\\f40d\";\n}\n.ion-ios-cloudy-outline:before {\n  content: \"\\f40f\";\n}\n.ion-ios-cog:before {\n  content: \"\\f412\";\n}\n.ion-ios-cog-outline:before {\n  content: \"\\f411\";\n}\n.ion-ios-color-filter:before {\n  content: \"\\f414\";\n}\n.ion-ios-color-filter-outline:before {\n  content: \"\\f413\";\n}\n.ion-ios-color-wand:before {\n  content: \"\\f416\";\n}\n.ion-ios-color-wand-outline:before {\n  content: \"\\f415\";\n}\n.ion-ios-compose:before {\n  content: \"\\f418\";\n}\n.ion-ios-compose-outline:before {\n  content: \"\\f417\";\n}\n.ion-ios-contact:before {\n  content: \"\\f41a\";\n}\n.ion-ios-contact-outline:before {\n  content: \"\\f419\";\n}\n.ion-ios-copy:before {\n  content: \"\\f41c\";\n}\n.ion-ios-copy-outline:before {\n  content: \"\\f41b\";\n}\n.ion-ios-crop:before {\n  content: \"\\f41e\";\n}\n.ion-ios-crop-strong:before {\n  content: \"\\f41d\";\n}\n.ion-ios-download:before {\n  content: \"\\f420\";\n}\n.ion-ios-download-outline:before {\n  content: \"\\f41f\";\n}\n.ion-ios-drag:before {\n  content: \"\\f421\";\n}\n.ion-ios-email:before {\n  content: \"\\f423\";\n}\n.ion-ios-email-outline:before {\n  content: \"\\f422\";\n}\n.ion-ios-eye:before {\n  content: \"\\f425\";\n}\n.ion-ios-eye-outline:before {\n  content: \"\\f424\";\n}\n.ion-ios-fastforward:before {\n  content: \"\\f427\";\n}\n.ion-ios-fastforward-outline:before {\n  content: \"\\f426\";\n}\n.ion-ios-filing:before {\n  content: \"\\f429\";\n}\n.ion-ios-filing-outline:before {\n  content: \"\\f428\";\n}\n.ion-ios-film:before {\n  content: \"\\f42b\";\n}\n.ion-ios-film-outline:before {\n  content: \"\\f42a\";\n}\n.ion-ios-flag:before {\n  content: \"\\f42d\";\n}\n.ion-ios-flag-outline:before {\n  content: \"\\f42c\";\n}\n.ion-ios-flame:before {\n  content: \"\\f42f\";\n}\n.ion-ios-flame-outline:before {\n  content: \"\\f42e\";\n}\n.ion-ios-flask:before {\n  content: \"\\f431\";\n}\n.ion-ios-flask-outline:before {\n  content: \"\\f430\";\n}\n.ion-ios-flower:before {\n  content: \"\\f433\";\n}\n.ion-ios-flower-outline:before {\n  content: \"\\f432\";\n}\n.ion-ios-folder:before {\n  content: \"\\f435\";\n}\n.ion-ios-folder-outline:before {\n  content: \"\\f434\";\n}\n.ion-ios-football:before {\n  content: \"\\f437\";\n}\n.ion-ios-football-outline:before {\n  content: \"\\f436\";\n}\n.ion-ios-game-controller-a:before {\n  content: \"\\f439\";\n}\n.ion-ios-game-controller-a-outline:before {\n  content: \"\\f438\";\n}\n.ion-ios-game-controller-b:before {\n  content: \"\\f43b\";\n}\n.ion-ios-game-controller-b-outline:before {\n  content: \"\\f43a\";\n}\n.ion-ios-gear:before {\n  content: \"\\f43d\";\n}\n.ion-ios-gear-outline:before {\n  content: \"\\f43c\";\n}\n.ion-ios-glasses:before {\n  content: \"\\f43f\";\n}\n.ion-ios-glasses-outline:before {\n  content: \"\\f43e\";\n}\n.ion-ios-grid-view:before {\n  content: \"\\f441\";\n}\n.ion-ios-grid-view-outline:before {\n  content: \"\\f440\";\n}\n.ion-ios-heart:before {\n  content: \"\\f443\";\n}\n.ion-ios-heart-outline:before {\n  content: \"\\f442\";\n}\n.ion-ios-help:before {\n  content: \"\\f446\";\n}\n.ion-ios-help-empty:before {\n  content: \"\\f444\";\n}\n.ion-ios-help-outline:before {\n  content: \"\\f445\";\n}\n.ion-ios-home:before {\n  content: \"\\f448\";\n}\n.ion-ios-home-outline:before {\n  content: \"\\f447\";\n}\n.ion-ios-infinite:before {\n  content: \"\\f44a\";\n}\n.ion-ios-infinite-outline:before {\n  content: \"\\f449\";\n}\n.ion-ios-information:before {\n  content: \"\\f44d\";\n}\n.ion-ios-information-empty:before {\n  content: \"\\f44b\";\n}\n.ion-ios-information-outline:before {\n  content: \"\\f44c\";\n}\n.ion-ios-ionic-outline:before {\n  content: \"\\f44e\";\n}\n.ion-ios-keypad:before {\n  content: \"\\f450\";\n}\n.ion-ios-keypad-outline:before {\n  content: \"\\f44f\";\n}\n.ion-ios-lightbulb:before {\n  content: \"\\f452\";\n}\n.ion-ios-lightbulb-outline:before {\n  content: \"\\f451\";\n}\n.ion-ios-list:before {\n  content: \"\\f454\";\n}\n.ion-ios-list-outline:before {\n  content: \"\\f453\";\n}\n.ion-ios-location:before {\n  content: \"\\f456\";\n}\n.ion-ios-location-outline:before {\n  content: \"\\f455\";\n}\n.ion-ios-locked:before {\n  content: \"\\f458\";\n}\n.ion-ios-locked-outline:before {\n  content: \"\\f457\";\n}\n.ion-ios-loop:before {\n  content: \"\\f45a\";\n}\n.ion-ios-loop-strong:before {\n  content: \"\\f459\";\n}\n.ion-ios-medical:before {\n  content: \"\\f45c\";\n}\n.ion-ios-medical-outline:before {\n  content: \"\\f45b\";\n}\n.ion-ios-medkit:before {\n  content: \"\\f45e\";\n}\n.ion-ios-medkit-outline:before {\n  content: \"\\f45d\";\n}\n.ion-ios-mic:before {\n  content: \"\\f461\";\n}\n.ion-ios-mic-off:before {\n  content: \"\\f45f\";\n}\n.ion-ios-mic-outline:before {\n  content: \"\\f460\";\n}\n.ion-ios-minus:before {\n  content: \"\\f464\";\n}\n.ion-ios-minus-empty:before {\n  content: \"\\f462\";\n}\n.ion-ios-minus-outline:before {\n  content: \"\\f463\";\n}\n.ion-ios-monitor:before {\n  content: \"\\f466\";\n}\n.ion-ios-monitor-outline:before {\n  content: \"\\f465\";\n}\n.ion-ios-moon:before {\n  content: \"\\f468\";\n}\n.ion-ios-moon-outline:before {\n  content: \"\\f467\";\n}\n.ion-ios-more:before {\n  content: \"\\f46a\";\n}\n.ion-ios-more-outline:before {\n  content: \"\\f469\";\n}\n.ion-ios-musical-note:before {\n  content: \"\\f46b\";\n}\n.ion-ios-musical-notes:before {\n  content: \"\\f46c\";\n}\n.ion-ios-navigate:before {\n  content: \"\\f46e\";\n}\n.ion-ios-navigate-outline:before {\n  content: \"\\f46d\";\n}\n.ion-ios-nutrition:before {\n  content: \"\\f470\";\n}\n.ion-ios-nutrition-outline:before {\n  content: \"\\f46f\";\n}\n.ion-ios-paper:before {\n  content: \"\\f472\";\n}\n.ion-ios-paper-outline:before {\n  content: \"\\f471\";\n}\n.ion-ios-paperplane:before {\n  content: \"\\f474\";\n}\n.ion-ios-paperplane-outline:before {\n  content: \"\\f473\";\n}\n.ion-ios-partlysunny:before {\n  content: \"\\f476\";\n}\n.ion-ios-partlysunny-outline:before {\n  content: \"\\f475\";\n}\n.ion-ios-pause:before {\n  content: \"\\f478\";\n}\n.ion-ios-pause-outline:before {\n  content: \"\\f477\";\n}\n.ion-ios-paw:before {\n  content: \"\\f47a\";\n}\n.ion-ios-paw-outline:before {\n  content: \"\\f479\";\n}\n.ion-ios-people:before {\n  content: \"\\f47c\";\n}\n.ion-ios-people-outline:before {\n  content: \"\\f47b\";\n}\n.ion-ios-person:before {\n  content: \"\\f47e\";\n}\n.ion-ios-person-outline:before {\n  content: \"\\f47d\";\n}\n.ion-ios-personadd:before {\n  content: \"\\f480\";\n}\n.ion-ios-personadd-outline:before {\n  content: \"\\f47f\";\n}\n.ion-ios-photos:before {\n  content: \"\\f482\";\n}\n.ion-ios-photos-outline:before {\n  content: \"\\f481\";\n}\n.ion-ios-pie:before {\n  content: \"\\f484\";\n}\n.ion-ios-pie-outline:before {\n  content: \"\\f483\";\n}\n.ion-ios-pint:before {\n  content: \"\\f486\";\n}\n.ion-ios-pint-outline:before {\n  content: \"\\f485\";\n}\n.ion-ios-play:before {\n  content: \"\\f488\";\n}\n.ion-ios-play-outline:before {\n  content: \"\\f487\";\n}\n.ion-ios-plus:before {\n  content: \"\\f48b\";\n}\n.ion-ios-plus-empty:before {\n  content: \"\\f489\";\n}\n.ion-ios-plus-outline:before {\n  content: \"\\f48a\";\n}\n.ion-ios-pricetag:before {\n  content: \"\\f48d\";\n}\n.ion-ios-pricetag-outline:before {\n  content: \"\\f48c\";\n}\n.ion-ios-pricetags:before {\n  content: \"\\f48f\";\n}\n.ion-ios-pricetags-outline:before {\n  content: \"\\f48e\";\n}\n.ion-ios-printer:before {\n  content: \"\\f491\";\n}\n.ion-ios-printer-outline:before {\n  content: \"\\f490\";\n}\n.ion-ios-pulse:before {\n  content: \"\\f493\";\n}\n.ion-ios-pulse-strong:before {\n  content: \"\\f492\";\n}\n.ion-ios-rainy:before {\n  content: \"\\f495\";\n}\n.ion-ios-rainy-outline:before {\n  content: \"\\f494\";\n}\n.ion-ios-recording:before {\n  content: \"\\f497\";\n}\n.ion-ios-recording-outline:before {\n  content: \"\\f496\";\n}\n.ion-ios-redo:before {\n  content: \"\\f499\";\n}\n.ion-ios-redo-outline:before {\n  content: \"\\f498\";\n}\n.ion-ios-refresh:before {\n  content: \"\\f49c\";\n}\n.ion-ios-refresh-empty:before {\n  content: \"\\f49a\";\n}\n.ion-ios-refresh-outline:before {\n  content: \"\\f49b\";\n}\n.ion-ios-reload:before {\n  content: \"\\f49d\";\n}\n.ion-ios-reverse-camera:before {\n  content: \"\\f49f\";\n}\n.ion-ios-reverse-camera-outline:before {\n  content: \"\\f49e\";\n}\n.ion-ios-rewind:before {\n  content: \"\\f4a1\";\n}\n.ion-ios-rewind-outline:before {\n  content: \"\\f4a0\";\n}\n.ion-ios-rose:before {\n  content: \"\\f4a3\";\n}\n.ion-ios-rose-outline:before {\n  content: \"\\f4a2\";\n}\n.ion-ios-search:before {\n  content: \"\\f4a5\";\n}\n.ion-ios-search-strong:before {\n  content: \"\\f4a4\";\n}\n.ion-ios-settings:before {\n  content: \"\\f4a7\";\n}\n.ion-ios-settings-strong:before {\n  content: \"\\f4a6\";\n}\n.ion-ios-shuffle:before {\n  content: \"\\f4a9\";\n}\n.ion-ios-shuffle-strong:before {\n  content: \"\\f4a8\";\n}\n.ion-ios-skipbackward:before {\n  content: \"\\f4ab\";\n}\n.ion-ios-skipbackward-outline:before {\n  content: \"\\f4aa\";\n}\n.ion-ios-skipforward:before {\n  content: \"\\f4ad\";\n}\n.ion-ios-skipforward-outline:before {\n  content: \"\\f4ac\";\n}\n.ion-ios-snowy:before {\n  content: \"\\f4ae\";\n}\n.ion-ios-speedometer:before {\n  content: \"\\f4b0\";\n}\n.ion-ios-speedometer-outline:before {\n  content: \"\\f4af\";\n}\n.ion-ios-star:before {\n  content: \"\\f4b3\";\n}\n.ion-ios-star-half:before {\n  content: \"\\f4b1\";\n}\n.ion-ios-star-outline:before {\n  content: \"\\f4b2\";\n}\n.ion-ios-stopwatch:before {\n  content: \"\\f4b5\";\n}\n.ion-ios-stopwatch-outline:before {\n  content: \"\\f4b4\";\n}\n.ion-ios-sunny:before {\n  content: \"\\f4b7\";\n}\n.ion-ios-sunny-outline:before {\n  content: \"\\f4b6\";\n}\n.ion-ios-telephone:before {\n  content: \"\\f4b9\";\n}\n.ion-ios-telephone-outline:before {\n  content: \"\\f4b8\";\n}\n.ion-ios-tennisball:before {\n  content: \"\\f4bb\";\n}\n.ion-ios-tennisball-outline:before {\n  content: \"\\f4ba\";\n}\n.ion-ios-thunderstorm:before {\n  content: \"\\f4bd\";\n}\n.ion-ios-thunderstorm-outline:before {\n  content: \"\\f4bc\";\n}\n.ion-ios-time:before {\n  content: \"\\f4bf\";\n}\n.ion-ios-time-outline:before {\n  content: \"\\f4be\";\n}\n.ion-ios-timer:before {\n  content: \"\\f4c1\";\n}\n.ion-ios-timer-outline:before {\n  content: \"\\f4c0\";\n}\n.ion-ios-toggle:before {\n  content: \"\\f4c3\";\n}\n.ion-ios-toggle-outline:before {\n  content: \"\\f4c2\";\n}\n.ion-ios-trash:before {\n  content: \"\\f4c5\";\n}\n.ion-ios-trash-outline:before {\n  content: \"\\f4c4\";\n}\n.ion-ios-undo:before {\n  content: \"\\f4c7\";\n}\n.ion-ios-undo-outline:before {\n  content: \"\\f4c6\";\n}\n.ion-ios-unlocked:before {\n  content: \"\\f4c9\";\n}\n.ion-ios-unlocked-outline:before {\n  content: \"\\f4c8\";\n}\n.ion-ios-upload:before {\n  content: \"\\f4cb\";\n}\n.ion-ios-upload-outline:before {\n  content: \"\\f4ca\";\n}\n.ion-ios-videocam:before {\n  content: \"\\f4cd\";\n}\n.ion-ios-videocam-outline:before {\n  content: \"\\f4cc\";\n}\n.ion-ios-volume-high:before {\n  content: \"\\f4ce\";\n}\n.ion-ios-volume-low:before {\n  content: \"\\f4cf\";\n}\n.ion-ios-wineglass:before {\n  content: \"\\f4d1\";\n}\n.ion-ios-wineglass-outline:before {\n  content: \"\\f4d0\";\n}\n.ion-ios-world:before {\n  content: \"\\f4d3\";\n}\n.ion-ios-world-outline:before {\n  content: \"\\f4d2\";\n}\n.ion-ipad:before {\n  content: \"\\f1f9\";\n}\n.ion-iphone:before {\n  content: \"\\f1fa\";\n}\n.ion-ipod:before {\n  content: \"\\f1fb\";\n}\n.ion-jet:before {\n  content: \"\\f295\";\n}\n.ion-key:before {\n  content: \"\\f296\";\n}\n.ion-knife:before {\n  content: \"\\f297\";\n}\n.ion-laptop:before {\n  content: \"\\f1fc\";\n}\n.ion-leaf:before {\n  content: \"\\f1fd\";\n}\n.ion-levels:before {\n  content: \"\\f298\";\n}\n.ion-lightbulb:before {\n  content: \"\\f299\";\n}\n.ion-link:before {\n  content: \"\\f1fe\";\n}\n.ion-load-a:before {\n  content: \"\\f29a\";\n}\n.ion-load-b:before {\n  content: \"\\f29b\";\n}\n.ion-load-c:before {\n  content: \"\\f29c\";\n}\n.ion-load-d:before {\n  content: \"\\f29d\";\n}\n.ion-location:before {\n  content: \"\\f1ff\";\n}\n.ion-lock-combination:before {\n  content: \"\\f4d4\";\n}\n.ion-locked:before {\n  content: \"\\f200\";\n}\n.ion-log-in:before {\n  content: \"\\f29e\";\n}\n.ion-log-out:before {\n  content: \"\\f29f\";\n}\n.ion-loop:before {\n  content: \"\\f201\";\n}\n.ion-magnet:before {\n  content: \"\\f2a0\";\n}\n.ion-male:before {\n  content: \"\\f2a1\";\n}\n.ion-man:before {\n  content: \"\\f202\";\n}\n.ion-map:before {\n  content: \"\\f203\";\n}\n.ion-medkit:before {\n  content: \"\\f2a2\";\n}\n.ion-merge:before {\n  content: \"\\f33f\";\n}\n.ion-mic-a:before {\n  content: \"\\f204\";\n}\n.ion-mic-b:before {\n  content: \"\\f205\";\n}\n.ion-mic-c:before {\n  content: \"\\f206\";\n}\n.ion-minus:before {\n  content: \"\\f209\";\n}\n.ion-minus-circled:before {\n  content: \"\\f207\";\n}\n.ion-minus-round:before {\n  content: \"\\f208\";\n}\n.ion-model-s:before {\n  content: \"\\f2c1\";\n}\n.ion-monitor:before {\n  content: \"\\f20a\";\n}\n.ion-more:before {\n  content: \"\\f20b\";\n}\n.ion-mouse:before {\n  content: \"\\f340\";\n}\n.ion-music-note:before {\n  content: \"\\f20c\";\n}\n.ion-navicon:before {\n  content: \"\\f20e\";\n}\n.ion-navicon-round:before {\n  content: \"\\f20d\";\n}\n.ion-navigate:before {\n  content: \"\\f2a3\";\n}\n.ion-network:before {\n  content: \"\\f341\";\n}\n.ion-no-smoking:before {\n  content: \"\\f2c2\";\n}\n.ion-nuclear:before {\n  content: \"\\f2a4\";\n}\n.ion-outlet:before {\n  content: \"\\f342\";\n}\n.ion-paintbrush:before {\n  content: \"\\f4d5\";\n}\n.ion-paintbucket:before {\n  content: \"\\f4d6\";\n}\n.ion-paper-airplane:before {\n  content: \"\\f2c3\";\n}\n.ion-paperclip:before {\n  content: \"\\f20f\";\n}\n.ion-pause:before {\n  content: \"\\f210\";\n}\n.ion-person:before {\n  content: \"\\f213\";\n}\n.ion-person-add:before {\n  content: \"\\f211\";\n}\n.ion-person-stalker:before {\n  content: \"\\f212\";\n}\n.ion-pie-graph:before {\n  content: \"\\f2a5\";\n}\n.ion-pin:before {\n  content: \"\\f2a6\";\n}\n.ion-pinpoint:before {\n  content: \"\\f2a7\";\n}\n.ion-pizza:before {\n  content: \"\\f2a8\";\n}\n.ion-plane:before {\n  content: \"\\f214\";\n}\n.ion-planet:before {\n  content: \"\\f343\";\n}\n.ion-play:before {\n  content: \"\\f215\";\n}\n.ion-playstation:before {\n  content: \"\\f30a\";\n}\n.ion-plus:before {\n  content: \"\\f218\";\n}\n.ion-plus-circled:before {\n  content: \"\\f216\";\n}\n.ion-plus-round:before {\n  content: \"\\f217\";\n}\n.ion-podium:before {\n  content: \"\\f344\";\n}\n.ion-pound:before {\n  content: \"\\f219\";\n}\n.ion-power:before {\n  content: \"\\f2a9\";\n}\n.ion-pricetag:before {\n  content: \"\\f2aa\";\n}\n.ion-pricetags:before {\n  content: \"\\f2ab\";\n}\n.ion-printer:before {\n  content: \"\\f21a\";\n}\n.ion-pull-request:before {\n  content: \"\\f345\";\n}\n.ion-qr-scanner:before {\n  content: \"\\f346\";\n}\n.ion-quote:before {\n  content: \"\\f347\";\n}\n.ion-radio-waves:before {\n  content: \"\\f2ac\";\n}\n.ion-record:before {\n  content: \"\\f21b\";\n}\n.ion-refresh:before {\n  content: \"\\f21c\";\n}\n.ion-reply:before {\n  content: \"\\f21e\";\n}\n.ion-reply-all:before {\n  content: \"\\f21d\";\n}\n.ion-ribbon-a:before {\n  content: \"\\f348\";\n}\n.ion-ribbon-b:before {\n  content: \"\\f349\";\n}\n.ion-sad:before {\n  content: \"\\f34a\";\n}\n.ion-sad-outline:before {\n  content: \"\\f4d7\";\n}\n.ion-scissors:before {\n  content: \"\\f34b\";\n}\n.ion-search:before {\n  content: \"\\f21f\";\n}\n.ion-settings:before {\n  content: \"\\f2ad\";\n}\n.ion-share:before {\n  content: \"\\f220\";\n}\n.ion-shuffle:before {\n  content: \"\\f221\";\n}\n.ion-skip-backward:before {\n  content: \"\\f222\";\n}\n.ion-skip-forward:before {\n  content: \"\\f223\";\n}\n.ion-social-android:before {\n  content: \"\\f225\";\n}\n.ion-social-android-outline:before {\n  content: \"\\f224\";\n}\n.ion-social-angular:before {\n  content: \"\\f4d9\";\n}\n.ion-social-angular-outline:before {\n  content: \"\\f4d8\";\n}\n.ion-social-apple:before {\n  content: \"\\f227\";\n}\n.ion-social-apple-outline:before {\n  content: \"\\f226\";\n}\n.ion-social-bitcoin:before {\n  content: \"\\f2af\";\n}\n.ion-social-bitcoin-outline:before {\n  content: \"\\f2ae\";\n}\n.ion-social-buffer:before {\n  content: \"\\f229\";\n}\n.ion-social-buffer-outline:before {\n  content: \"\\f228\";\n}\n.ion-social-chrome:before {\n  content: \"\\f4db\";\n}\n.ion-social-chrome-outline:before {\n  content: \"\\f4da\";\n}\n.ion-social-codepen:before {\n  content: \"\\f4dd\";\n}\n.ion-social-codepen-outline:before {\n  content: \"\\f4dc\";\n}\n.ion-social-css3:before {\n  content: \"\\f4df\";\n}\n.ion-social-css3-outline:before {\n  content: \"\\f4de\";\n}\n.ion-social-designernews:before {\n  content: \"\\f22b\";\n}\n.ion-social-designernews-outline:before {\n  content: \"\\f22a\";\n}\n.ion-social-dribbble:before {\n  content: \"\\f22d\";\n}\n.ion-social-dribbble-outline:before {\n  content: \"\\f22c\";\n}\n.ion-social-dropbox:before {\n  content: \"\\f22f\";\n}\n.ion-social-dropbox-outline:before {\n  content: \"\\f22e\";\n}\n.ion-social-euro:before {\n  content: \"\\f4e1\";\n}\n.ion-social-euro-outline:before {\n  content: \"\\f4e0\";\n}\n.ion-social-facebook:before {\n  content: \"\\f231\";\n}\n.ion-social-facebook-outline:before {\n  content: \"\\f230\";\n}\n.ion-social-foursquare:before {\n  content: \"\\f34d\";\n}\n.ion-social-foursquare-outline:before {\n  content: \"\\f34c\";\n}\n.ion-social-freebsd-devil:before {\n  content: \"\\f2c4\";\n}\n.ion-social-github:before {\n  content: \"\\f233\";\n}\n.ion-social-github-outline:before {\n  content: \"\\f232\";\n}\n.ion-social-google:before {\n  content: \"\\f34f\";\n}\n.ion-social-google-outline:before {\n  content: \"\\f34e\";\n}\n.ion-social-googleplus:before {\n  content: \"\\f235\";\n}\n.ion-social-googleplus-outline:before {\n  content: \"\\f234\";\n}\n.ion-social-hackernews:before {\n  content: \"\\f237\";\n}\n.ion-social-hackernews-outline:before {\n  content: \"\\f236\";\n}\n.ion-social-html5:before {\n  content: \"\\f4e3\";\n}\n.ion-social-html5-outline:before {\n  content: \"\\f4e2\";\n}\n.ion-social-instagram:before {\n  content: \"\\f351\";\n}\n.ion-social-instagram-outline:before {\n  content: \"\\f350\";\n}\n.ion-social-javascript:before {\n  content: \"\\f4e5\";\n}\n.ion-social-javascript-outline:before {\n  content: \"\\f4e4\";\n}\n.ion-social-linkedin:before {\n  content: \"\\f239\";\n}\n.ion-social-linkedin-outline:before {\n  content: \"\\f238\";\n}\n.ion-social-markdown:before {\n  content: \"\\f4e6\";\n}\n.ion-social-nodejs:before {\n  content: \"\\f4e7\";\n}\n.ion-social-octocat:before {\n  content: \"\\f4e8\";\n}\n.ion-social-pinterest:before {\n  content: \"\\f2b1\";\n}\n.ion-social-pinterest-outline:before {\n  content: \"\\f2b0\";\n}\n.ion-social-python:before {\n  content: \"\\f4e9\";\n}\n.ion-social-reddit:before {\n  content: \"\\f23b\";\n}\n.ion-social-reddit-outline:before {\n  content: \"\\f23a\";\n}\n.ion-social-rss:before {\n  content: \"\\f23d\";\n}\n.ion-social-rss-outline:before {\n  content: \"\\f23c\";\n}\n.ion-social-sass:before {\n  content: \"\\f4ea\";\n}\n.ion-social-skype:before {\n  content: \"\\f23f\";\n}\n.ion-social-skype-outline:before {\n  content: \"\\f23e\";\n}\n.ion-social-snapchat:before {\n  content: \"\\f4ec\";\n}\n.ion-social-snapchat-outline:before {\n  content: \"\\f4eb\";\n}\n.ion-social-tumblr:before {\n  content: \"\\f241\";\n}\n.ion-social-tumblr-outline:before {\n  content: \"\\f240\";\n}\n.ion-social-tux:before {\n  content: \"\\f2c5\";\n}\n.ion-social-twitch:before {\n  content: \"\\f4ee\";\n}\n.ion-social-twitch-outline:before {\n  content: \"\\f4ed\";\n}\n.ion-social-twitter:before {\n  content: \"\\f243\";\n}\n.ion-social-twitter-outline:before {\n  content: \"\\f242\";\n}\n.ion-social-usd:before {\n  content: \"\\f353\";\n}\n.ion-social-usd-outline:before {\n  content: \"\\f352\";\n}\n.ion-social-vimeo:before {\n  content: \"\\f245\";\n}\n.ion-social-vimeo-outline:before {\n  content: \"\\f244\";\n}\n.ion-social-whatsapp:before {\n  content: \"\\f4f0\";\n}\n.ion-social-whatsapp-outline:before {\n  content: \"\\f4ef\";\n}\n.ion-social-windows:before {\n  content: \"\\f247\";\n}\n.ion-social-windows-outline:before {\n  content: \"\\f246\";\n}\n.ion-social-wordpress:before {\n  content: \"\\f249\";\n}\n.ion-social-wordpress-outline:before {\n  content: \"\\f248\";\n}\n.ion-social-yahoo:before {\n  content: \"\\f24b\";\n}\n.ion-social-yahoo-outline:before {\n  content: \"\\f24a\";\n}\n.ion-social-yen:before {\n  content: \"\\f4f2\";\n}\n.ion-social-yen-outline:before {\n  content: \"\\f4f1\";\n}\n.ion-social-youtube:before {\n  content: \"\\f24d\";\n}\n.ion-social-youtube-outline:before {\n  content: \"\\f24c\";\n}\n.ion-soup-can:before {\n  content: \"\\f4f4\";\n}\n.ion-soup-can-outline:before {\n  content: \"\\f4f3\";\n}\n.ion-speakerphone:before {\n  content: \"\\f2b2\";\n}\n.ion-speedometer:before {\n  content: \"\\f2b3\";\n}\n.ion-spoon:before {\n  content: \"\\f2b4\";\n}\n.ion-star:before {\n  content: \"\\f24e\";\n}\n.ion-stats-bars:before {\n  content: \"\\f2b5\";\n}\n.ion-steam:before {\n  content: \"\\f30b\";\n}\n.ion-stop:before {\n  content: \"\\f24f\";\n}\n.ion-thermometer:before {\n  content: \"\\f2b6\";\n}\n.ion-thumbsdown:before {\n  content: \"\\f250\";\n}\n.ion-thumbsup:before {\n  content: \"\\f251\";\n}\n.ion-toggle:before {\n  content: \"\\f355\";\n}\n.ion-toggle-filled:before {\n  content: \"\\f354\";\n}\n.ion-transgender:before {\n  content: \"\\f4f5\";\n}\n.ion-trash-a:before {\n  content: \"\\f252\";\n}\n.ion-trash-b:before {\n  content: \"\\f253\";\n}\n.ion-trophy:before {\n  content: \"\\f356\";\n}\n.ion-tshirt:before {\n  content: \"\\f4f7\";\n}\n.ion-tshirt-outline:before {\n  content: \"\\f4f6\";\n}\n.ion-umbrella:before {\n  content: \"\\f2b7\";\n}\n.ion-university:before {\n  content: \"\\f357\";\n}\n.ion-unlocked:before {\n  content: \"\\f254\";\n}\n.ion-upload:before {\n  content: \"\\f255\";\n}\n.ion-usb:before {\n  content: \"\\f2b8\";\n}\n.ion-videocamera:before {\n  content: \"\\f256\";\n}\n.ion-volume-high:before {\n  content: \"\\f257\";\n}\n.ion-volume-low:before {\n  content: \"\\f258\";\n}\n.ion-volume-medium:before {\n  content: \"\\f259\";\n}\n.ion-volume-mute:before {\n  content: \"\\f25a\";\n}\n.ion-wand:before {\n  content: \"\\f358\";\n}\n.ion-waterdrop:before {\n  content: \"\\f25b\";\n}\n.ion-wifi:before {\n  content: \"\\f25c\";\n}\n.ion-wineglass:before {\n  content: \"\\f2b9\";\n}\n.ion-woman:before {\n  content: \"\\f25d\";\n}\n.ion-wrench:before {\n  content: \"\\f2ba\";\n}\n.ion-xbox:before {\n  content: \"\\f30c\";\n}\n/*!\nAnimate.css - http://daneden.me/animate\nLicensed under the MIT license - http://opensource.org/licenses/MIT\n\nCopyright (c) 2014 Daniel Eden\n*/\n.animated {\n  -webkit-animation-duration: 1s;\n  animation-duration: 1s;\n  -webkit-animation-fill-mode: both;\n  animation-fill-mode: both;\n}\n.animated.infinite {\n  -webkit-animation-iteration-count: infinite;\n  animation-iteration-count: infinite;\n}\n.animated.hinge {\n  -webkit-animation-duration: 2s;\n  animation-duration: 2s;\n}\n@-webkit-keyframes bounce {\n  0%,\n  100%,\n  20%,\n  53%,\n  80% {\n    -webkit-transition-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1);\n    transition-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1);\n    -webkit-transform: translate3d(0, 0, 0);\n    transform: translate3d(0, 0, 0);\n  }\n  40%,\n  43% {\n    -webkit-transition-timing-function: cubic-bezier(0.755, 0.05, 0.855, 0.06);\n    transition-timing-function: cubic-bezier(0.755, 0.05, 0.855, 0.06);\n    -webkit-transform: translate3d(0, -30px, 0);\n    transform: translate3d(0, -30px, 0);\n  }\n  70% {\n    -webkit-transition-timing-function: cubic-bezier(0.755, 0.05, 0.855, 0.06);\n    transition-timing-function: cubic-bezier(0.755, 0.05, 0.855, 0.06);\n    -webkit-transform: translate3d(0, -15px, 0);\n    transform: translate3d(0, -15px, 0);\n  }\n  90% {\n    -webkit-transform: translate3d(0, -4px, 0);\n    transform: translate3d(0, -4px, 0);\n  }\n}\n@keyframes bounce {\n  0%,\n  100%,\n  20%,\n  53%,\n  80% {\n    -webkit-transition-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1);\n    transition-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1);\n    -webkit-transform: translate3d(0, 0, 0);\n    transform: translate3d(0, 0, 0);\n  }\n  40%,\n  43% {\n    -webkit-transition-timing-function: cubic-bezier(0.755, 0.05, 0.855, 0.06);\n    transition-timing-function: cubic-bezier(0.755, 0.05, 0.855, 0.06);\n    -webkit-transform: translate3d(0, -30px, 0);\n    transform: translate3d(0, -30px, 0);\n  }\n  70% {\n    -webkit-transition-timing-function: cubic-bezier(0.755, 0.05, 0.855, 0.06);\n    transition-timing-function: cubic-bezier(0.755, 0.05, 0.855, 0.06);\n    -webkit-transform: translate3d(0, -15px, 0);\n    transform: translate3d(0, -15px, 0);\n  }\n  90% {\n    -webkit-transform: translate3d(0, -4px, 0);\n    transform: translate3d(0, -4px, 0);\n  }\n}\n.bounce {\n  -webkit-animation-name: bounce;\n  animation-name: bounce;\n  -webkit-transform-origin: center bottom;\n  -ms-transform-origin: center bottom;\n  transform-origin: center bottom;\n}\n@-webkit-keyframes flash {\n  0%,\n  100%,\n  50% {\n    opacity: 1;\n  }\n  25%,\n  75% {\n    opacity: 0;\n  }\n}\n@keyframes flash {\n  0%,\n  100%,\n  50% {\n    opacity: 1;\n  }\n  25%,\n  75% {\n    opacity: 0;\n  }\n}\n.flash {\n  -webkit-animation-name: flash;\n  animation-name: flash;\n}\n@-webkit-keyframes pulse {\n  0% {\n    -webkit-transform: scale3d(1, 1, 1);\n    transform: scale3d(1, 1, 1);\n  }\n  50% {\n    -webkit-transform: scale3d(1.05, 1.05, 1.05);\n    transform: scale3d(1.05, 1.05, 1.05);\n  }\n  100% {\n    -webkit-transform: scale3d(1, 1, 1);\n    transform: scale3d(1, 1, 1);\n  }\n}\n@keyframes pulse {\n  0% {\n    -webkit-transform: scale3d(1, 1, 1);\n    transform: scale3d(1, 1, 1);\n  }\n  50% {\n    -webkit-transform: scale3d(1.05, 1.05, 1.05);\n    transform: scale3d(1.05, 1.05, 1.05);\n  }\n  100% {\n    -webkit-transform: scale3d(1, 1, 1);\n    transform: scale3d(1, 1, 1);\n  }\n}\n.pulse {\n  -webkit-animation-name: pulse;\n  animation-name: pulse;\n}\n@-webkit-keyframes rubberBand {\n  0% {\n    -webkit-transform: scale3d(1, 1, 1);\n    transform: scale3d(1, 1, 1);\n  }\n  30% {\n    -webkit-transform: scale3d(1.25, 0.75, 1);\n    transform: scale3d(1.25, 0.75, 1);\n  }\n  40% {\n    -webkit-transform: scale3d(0.75, 1.25, 1);\n    transform: scale3d(0.75, 1.25, 1);\n  }\n  50% {\n    -webkit-transform: scale3d(1.15, 0.85, 1);\n    transform: scale3d(1.15, 0.85, 1);\n  }\n  65% {\n    -webkit-transform: scale3d(0.95, 1.05, 1);\n    transform: scale3d(0.95, 1.05, 1);\n  }\n  75% {\n    -webkit-transform: scale3d(1.05, 0.95, 1);\n    transform: scale3d(1.05, 0.95, 1);\n  }\n  100% {\n    -webkit-transform: scale3d(1, 1, 1);\n    transform: scale3d(1, 1, 1);\n  }\n}\n@keyframes rubberBand {\n  0% {\n    -webkit-transform: scale3d(1, 1, 1);\n    transform: scale3d(1, 1, 1);\n  }\n  30% {\n    -webkit-transform: scale3d(1.25, 0.75, 1);\n    transform: scale3d(1.25, 0.75, 1);\n  }\n  40% {\n    -webkit-transform: scale3d(0.75, 1.25, 1);\n    transform: scale3d(0.75, 1.25, 1);\n  }\n  50% {\n    -webkit-transform: scale3d(1.15, 0.85, 1);\n    transform: scale3d(1.15, 0.85, 1);\n  }\n  65% {\n    -webkit-transform: scale3d(0.95, 1.05, 1);\n    transform: scale3d(0.95, 1.05, 1);\n  }\n  75% {\n    -webkit-transform: scale3d(1.05, 0.95, 1);\n    transform: scale3d(1.05, 0.95, 1);\n  }\n  100% {\n    -webkit-transform: scale3d(1, 1, 1);\n    transform: scale3d(1, 1, 1);\n  }\n}\n.rubberBand {\n  -webkit-animation-name: rubberBand;\n  animation-name: rubberBand;\n}\n@-webkit-keyframes shake {\n  0%,\n  100% {\n    -webkit-transform: translate3d(0, 0, 0);\n    transform: translate3d(0, 0, 0);\n  }\n  10%,\n  30%,\n  50%,\n  70%,\n  90% {\n    -webkit-transform: translate3d(-10px, 0, 0);\n    transform: translate3d(-10px, 0, 0);\n  }\n  20%,\n  40%,\n  60%,\n  80% {\n    -webkit-transform: translate3d(10px, 0, 0);\n    transform: translate3d(10px, 0, 0);\n  }\n}\n@keyframes shake {\n  0%,\n  100% {\n    -webkit-transform: translate3d(0, 0, 0);\n    transform: translate3d(0, 0, 0);\n  }\n  10%,\n  30%,\n  50%,\n  70%,\n  90% {\n    -webkit-transform: translate3d(-10px, 0, 0);\n    transform: translate3d(-10px, 0, 0);\n  }\n  20%,\n  40%,\n  60%,\n  80% {\n    -webkit-transform: translate3d(10px, 0, 0);\n    transform: translate3d(10px, 0, 0);\n  }\n}\n.shake {\n  -webkit-animation-name: shake;\n  animation-name: shake;\n}\n@-webkit-keyframes swing {\n  20% {\n    -webkit-transform: rotate3d(0, 0, 1, 15deg);\n    transform: rotate3d(0, 0, 1, 15deg);\n  }\n  40% {\n    -webkit-transform: rotate3d(0, 0, 1, -10deg);\n    transform: rotate3d(0, 0, 1, -10deg);\n  }\n  60% {\n    -webkit-transform: rotate3d(0, 0, 1, 5deg);\n    transform: rotate3d(0, 0, 1, 5deg);\n  }\n  80% {\n    -webkit-transform: rotate3d(0, 0, 1, -5deg);\n    transform: rotate3d(0, 0, 1, -5deg);\n  }\n  100% {\n    -webkit-transform: rotate3d(0, 0, 1, 0deg);\n    transform: rotate3d(0, 0, 1, 0deg);\n  }\n}\n@keyframes swing {\n  20% {\n    -webkit-transform: rotate3d(0, 0, 1, 15deg);\n    transform: rotate3d(0, 0, 1, 15deg);\n  }\n  40% {\n    -webkit-transform: rotate3d(0, 0, 1, -10deg);\n    transform: rotate3d(0, 0, 1, -10deg);\n  }\n  60% {\n    -webkit-transform: rotate3d(0, 0, 1, 5deg);\n    transform: rotate3d(0, 0, 1, 5deg);\n  }\n  80% {\n    -webkit-transform: rotate3d(0, 0, 1, -5deg);\n    transform: rotate3d(0, 0, 1, -5deg);\n  }\n  100% {\n    -webkit-transform: rotate3d(0, 0, 1, 0deg);\n    transform: rotate3d(0, 0, 1, 0deg);\n  }\n}\n.swing {\n  -webkit-transform-origin: top center;\n  -ms-transform-origin: top center;\n  transform-origin: top center;\n  -webkit-animation-name: swing;\n  animation-name: swing;\n}\n@-webkit-keyframes tada {\n  0% {\n    -webkit-transform: scale3d(1, 1, 1);\n    transform: scale3d(1, 1, 1);\n  }\n  10%,\n  20% {\n    -webkit-transform: scale3d(0.9, 0.9, 0.9) rotate3d(0, 0, 1, -3deg);\n    transform: scale3d(0.9, 0.9, 0.9) rotate3d(0, 0, 1, -3deg);\n  }\n  30%,\n  50%,\n  70%,\n  90% {\n    -webkit-transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, 3deg);\n    transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, 3deg);\n  }\n  40%,\n  60%,\n  80% {\n    -webkit-transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, -3deg);\n    transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, -3deg);\n  }\n  100% {\n    -webkit-transform: scale3d(1, 1, 1);\n    transform: scale3d(1, 1, 1);\n  }\n}\n@keyframes tada {\n  0% {\n    -webkit-transform: scale3d(1, 1, 1);\n    transform: scale3d(1, 1, 1);\n  }\n  10%,\n  20% {\n    -webkit-transform: scale3d(0.9, 0.9, 0.9) rotate3d(0, 0, 1, -3deg);\n    transform: scale3d(0.9, 0.9, 0.9) rotate3d(0, 0, 1, -3deg);\n  }\n  30%,\n  50%,\n  70%,\n  90% {\n    -webkit-transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, 3deg);\n    transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, 3deg);\n  }\n  40%,\n  60%,\n  80% {\n    -webkit-transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, -3deg);\n    transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, -3deg);\n  }\n  100% {\n    -webkit-transform: scale3d(1, 1, 1);\n    transform: scale3d(1, 1, 1);\n  }\n}\n.tada {\n  -webkit-animation-name: tada;\n  animation-name: tada;\n}\n@-webkit-keyframes wobble {\n  0% {\n    -webkit-transform: none;\n    transform: none;\n  }\n  15% {\n    -webkit-transform: translate3d(-25%, 0, 0) rotate3d(0, 0, 1, -5deg);\n    transform: translate3d(-25%, 0, 0) rotate3d(0, 0, 1, -5deg);\n  }\n  30% {\n    -webkit-transform: translate3d(20%, 0, 0) rotate3d(0, 0, 1, 3deg);\n    transform: translate3d(20%, 0, 0) rotate3d(0, 0, 1, 3deg);\n  }\n  45% {\n    -webkit-transform: translate3d(-15%, 0, 0) rotate3d(0, 0, 1, -3deg);\n    transform: translate3d(-15%, 0, 0) rotate3d(0, 0, 1, -3deg);\n  }\n  60% {\n    -webkit-transform: translate3d(10%, 0, 0) rotate3d(0, 0, 1, 2deg);\n    transform: translate3d(10%, 0, 0) rotate3d(0, 0, 1, 2deg);\n  }\n  75% {\n    -webkit-transform: translate3d(-5%, 0, 0) rotate3d(0, 0, 1, -1deg);\n    transform: translate3d(-5%, 0, 0) rotate3d(0, 0, 1, -1deg);\n  }\n  100% {\n    -webkit-transform: none;\n    transform: none;\n  }\n}\n@keyframes wobble {\n  0% {\n    -webkit-transform: none;\n    transform: none;\n  }\n  15% {\n    -webkit-transform: translate3d(-25%, 0, 0) rotate3d(0, 0, 1, -5deg);\n    transform: translate3d(-25%, 0, 0) rotate3d(0, 0, 1, -5deg);\n  }\n  30% {\n    -webkit-transform: translate3d(20%, 0, 0) rotate3d(0, 0, 1, 3deg);\n    transform: translate3d(20%, 0, 0) rotate3d(0, 0, 1, 3deg);\n  }\n  45% {\n    -webkit-transform: translate3d(-15%, 0, 0) rotate3d(0, 0, 1, -3deg);\n    transform: translate3d(-15%, 0, 0) rotate3d(0, 0, 1, -3deg);\n  }\n  60% {\n    -webkit-transform: translate3d(10%, 0, 0) rotate3d(0, 0, 1, 2deg);\n    transform: translate3d(10%, 0, 0) rotate3d(0, 0, 1, 2deg);\n  }\n  75% {\n    -webkit-transform: translate3d(-5%, 0, 0) rotate3d(0, 0, 1, -1deg);\n    transform: translate3d(-5%, 0, 0) rotate3d(0, 0, 1, -1deg);\n  }\n  100% {\n    -webkit-transform: none;\n    transform: none;\n  }\n}\n.wobble {\n  -webkit-animation-name: wobble;\n  animation-name: wobble;\n}\n@-webkit-keyframes bounceIn {\n  0%,\n  100%,\n  20%,\n  40%,\n  60%,\n  80% {\n    -webkit-transition-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1);\n    transition-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1);\n  }\n  0% {\n    opacity: 0;\n    -webkit-transform: scale3d(0.3, 0.3, 0.3);\n    transform: scale3d(0.3, 0.3, 0.3);\n  }\n  20% {\n    -webkit-transform: scale3d(1.1, 1.1, 1.1);\n    transform: scale3d(1.1, 1.1, 1.1);\n  }\n  40% {\n    -webkit-transform: scale3d(0.9, 0.9, 0.9);\n    transform: scale3d(0.9, 0.9, 0.9);\n  }\n  60% {\n    opacity: 1;\n    -webkit-transform: scale3d(1.03, 1.03, 1.03);\n    transform: scale3d(1.03, 1.03, 1.03);\n  }\n  80% {\n    -webkit-transform: scale3d(0.97, 0.97, 0.97);\n    transform: scale3d(0.97, 0.97, 0.97);\n  }\n  100% {\n    opacity: 1;\n    -webkit-transform: scale3d(1, 1, 1);\n    transform: scale3d(1, 1, 1);\n  }\n}\n@keyframes bounceIn {\n  0%,\n  100%,\n  20%,\n  40%,\n  60%,\n  80% {\n    -webkit-transition-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1);\n    transition-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1);\n  }\n  0% {\n    opacity: 0;\n    -webkit-transform: scale3d(0.3, 0.3, 0.3);\n    transform: scale3d(0.3, 0.3, 0.3);\n  }\n  20% {\n    -webkit-transform: scale3d(1.1, 1.1, 1.1);\n    transform: scale3d(1.1, 1.1, 1.1);\n  }\n  40% {\n    -webkit-transform: scale3d(0.9, 0.9, 0.9);\n    transform: scale3d(0.9, 0.9, 0.9);\n  }\n  60% {\n    opacity: 1;\n    -webkit-transform: scale3d(1.03, 1.03, 1.03);\n    transform: scale3d(1.03, 1.03, 1.03);\n  }\n  80% {\n    -webkit-transform: scale3d(0.97, 0.97, 0.97);\n    transform: scale3d(0.97, 0.97, 0.97);\n  }\n  100% {\n    opacity: 1;\n    -webkit-transform: scale3d(1, 1, 1);\n    transform: scale3d(1, 1, 1);\n  }\n}\n.bounceIn {\n  -webkit-animation-name: bounceIn;\n  animation-name: bounceIn;\n  -webkit-animation-duration: .75s;\n  animation-duration: 0.75s;\n}\n@-webkit-keyframes bounceInDown {\n  0%,\n  100%,\n  60%,\n  75%,\n  90% {\n    -webkit-transition-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1);\n    transition-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1);\n  }\n  0% {\n    opacity: 0;\n    -webkit-transform: translate3d(0, -3000px, 0);\n    transform: translate3d(0, -3000px, 0);\n  }\n  60% {\n    opacity: 1;\n    -webkit-transform: translate3d(0, 25px, 0);\n    transform: translate3d(0, 25px, 0);\n  }\n  75% {\n    -webkit-transform: translate3d(0, -10px, 0);\n    transform: translate3d(0, -10px, 0);\n  }\n  90% {\n    -webkit-transform: translate3d(0, 5px, 0);\n    transform: translate3d(0, 5px, 0);\n  }\n  100% {\n    -webkit-transform: none;\n    transform: none;\n  }\n}\n@keyframes bounceInDown {\n  0%,\n  100%,\n  60%,\n  75%,\n  90% {\n    -webkit-transition-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1);\n    transition-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1);\n  }\n  0% {\n    opacity: 0;\n    -webkit-transform: translate3d(0, -3000px, 0);\n    transform: translate3d(0, -3000px, 0);\n  }\n  60% {\n    opacity: 1;\n    -webkit-transform: translate3d(0, 25px, 0);\n    transform: translate3d(0, 25px, 0);\n  }\n  75% {\n    -webkit-transform: translate3d(0, -10px, 0);\n    transform: translate3d(0, -10px, 0);\n  }\n  90% {\n    -webkit-transform: translate3d(0, 5px, 0);\n    transform: translate3d(0, 5px, 0);\n  }\n  100% {\n    -webkit-transform: none;\n    transform: none;\n  }\n}\n.bounceInDown {\n  -webkit-animation-name: bounceInDown;\n  animation-name: bounceInDown;\n}\n@-webkit-keyframes bounceInLeft {\n  0%,\n  100%,\n  60%,\n  75%,\n  90% {\n    -webkit-transition-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1);\n    transition-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1);\n  }\n  0% {\n    opacity: 0;\n    -webkit-transform: translate3d(-3000px, 0, 0);\n    transform: translate3d(-3000px, 0, 0);\n  }\n  60% {\n    opacity: 1;\n    -webkit-transform: translate3d(25px, 0, 0);\n    transform: translate3d(25px, 0, 0);\n  }\n  75% {\n    -webkit-transform: translate3d(-10px, 0, 0);\n    transform: translate3d(-10px, 0, 0);\n  }\n  90% {\n    -webkit-transform: translate3d(5px, 0, 0);\n    transform: translate3d(5px, 0, 0);\n  }\n  100% {\n    -webkit-transform: none;\n    transform: none;\n  }\n}\n@keyframes bounceInLeft {\n  0%,\n  100%,\n  60%,\n  75%,\n  90% {\n    -webkit-transition-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1);\n    transition-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1);\n  }\n  0% {\n    opacity: 0;\n    -webkit-transform: translate3d(-3000px, 0, 0);\n    transform: translate3d(-3000px, 0, 0);\n  }\n  60% {\n    opacity: 1;\n    -webkit-transform: translate3d(25px, 0, 0);\n    transform: translate3d(25px, 0, 0);\n  }\n  75% {\n    -webkit-transform: translate3d(-10px, 0, 0);\n    transform: translate3d(-10px, 0, 0);\n  }\n  90% {\n    -webkit-transform: translate3d(5px, 0, 0);\n    transform: translate3d(5px, 0, 0);\n  }\n  100% {\n    -webkit-transform: none;\n    transform: none;\n  }\n}\n.bounceInLeft {\n  -webkit-animation-name: bounceInLeft;\n  animation-name: bounceInLeft;\n}\n@-webkit-keyframes bounceInRight {\n  0%,\n  100%,\n  60%,\n  75%,\n  90% {\n    -webkit-transition-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1);\n    transition-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1);\n  }\n  0% {\n    opacity: 0;\n    -webkit-transform: translate3d(3000px, 0, 0);\n    transform: translate3d(3000px, 0, 0);\n  }\n  60% {\n    opacity: 1;\n    -webkit-transform: translate3d(-25px, 0, 0);\n    transform: translate3d(-25px, 0, 0);\n  }\n  75% {\n    -webkit-transform: translate3d(10px, 0, 0);\n    transform: translate3d(10px, 0, 0);\n  }\n  90% {\n    -webkit-transform: translate3d(-5px, 0, 0);\n    transform: translate3d(-5px, 0, 0);\n  }\n  100% {\n    -webkit-transform: none;\n    transform: none;\n  }\n}\n@keyframes bounceInRight {\n  0%,\n  100%,\n  60%,\n  75%,\n  90% {\n    -webkit-transition-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1);\n    transition-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1);\n  }\n  0% {\n    opacity: 0;\n    -webkit-transform: translate3d(3000px, 0, 0);\n    transform: translate3d(3000px, 0, 0);\n  }\n  60% {\n    opacity: 1;\n    -webkit-transform: translate3d(-25px, 0, 0);\n    transform: translate3d(-25px, 0, 0);\n  }\n  75% {\n    -webkit-transform: translate3d(10px, 0, 0);\n    transform: translate3d(10px, 0, 0);\n  }\n  90% {\n    -webkit-transform: translate3d(-5px, 0, 0);\n    transform: translate3d(-5px, 0, 0);\n  }\n  100% {\n    -webkit-transform: none;\n    transform: none;\n  }\n}\n.bounceInRight {\n  -webkit-animation-name: bounceInRight;\n  animation-name: bounceInRight;\n}\n@-webkit-keyframes bounceInUp {\n  0%,\n  100%,\n  60%,\n  75%,\n  90% {\n    -webkit-transition-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1);\n    transition-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1);\n  }\n  0% {\n    opacity: 0;\n    -webkit-transform: translate3d(0, 3000px, 0);\n    transform: translate3d(0, 3000px, 0);\n  }\n  60% {\n    opacity: 1;\n    -webkit-transform: translate3d(0, -20px, 0);\n    transform: translate3d(0, -20px, 0);\n  }\n  75% {\n    -webkit-transform: translate3d(0, 10px, 0);\n    transform: translate3d(0, 10px, 0);\n  }\n  90% {\n    -webkit-transform: translate3d(0, -5px, 0);\n    transform: translate3d(0, -5px, 0);\n  }\n  100% {\n    -webkit-transform: translate3d(0, 0, 0);\n    transform: translate3d(0, 0, 0);\n  }\n}\n@keyframes bounceInUp {\n  0%,\n  100%,\n  60%,\n  75%,\n  90% {\n    -webkit-transition-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1);\n    transition-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1);\n  }\n  0% {\n    opacity: 0;\n    -webkit-transform: translate3d(0, 3000px, 0);\n    transform: translate3d(0, 3000px, 0);\n  }\n  60% {\n    opacity: 1;\n    -webkit-transform: translate3d(0, -20px, 0);\n    transform: translate3d(0, -20px, 0);\n  }\n  75% {\n    -webkit-transform: translate3d(0, 10px, 0);\n    transform: translate3d(0, 10px, 0);\n  }\n  90% {\n    -webkit-transform: translate3d(0, -5px, 0);\n    transform: translate3d(0, -5px, 0);\n  }\n  100% {\n    -webkit-transform: translate3d(0, 0, 0);\n    transform: translate3d(0, 0, 0);\n  }\n}\n.bounceInUp {\n  -webkit-animation-name: bounceInUp;\n  animation-name: bounceInUp;\n}\n@-webkit-keyframes bounceOut {\n  20% {\n    -webkit-transform: scale3d(0.9, 0.9, 0.9);\n    transform: scale3d(0.9, 0.9, 0.9);\n  }\n  50%,\n  55% {\n    opacity: 1;\n    -webkit-transform: scale3d(1.1, 1.1, 1.1);\n    transform: scale3d(1.1, 1.1, 1.1);\n  }\n  100% {\n    opacity: 0;\n    -webkit-transform: scale3d(0.3, 0.3, 0.3);\n    transform: scale3d(0.3, 0.3, 0.3);\n  }\n}\n@keyframes bounceOut {\n  20% {\n    -webkit-transform: scale3d(0.9, 0.9, 0.9);\n    transform: scale3d(0.9, 0.9, 0.9);\n  }\n  50%,\n  55% {\n    opacity: 1;\n    -webkit-transform: scale3d(1.1, 1.1, 1.1);\n    transform: scale3d(1.1, 1.1, 1.1);\n  }\n  100% {\n    opacity: 0;\n    -webkit-transform: scale3d(0.3, 0.3, 0.3);\n    transform: scale3d(0.3, 0.3, 0.3);\n  }\n}\n.bounceOut {\n  -webkit-animation-name: bounceOut;\n  animation-name: bounceOut;\n  -webkit-animation-duration: .75s;\n  animation-duration: 0.75s;\n}\n@-webkit-keyframes bounceOutDown {\n  20% {\n    -webkit-transform: translate3d(0, 10px, 0);\n    transform: translate3d(0, 10px, 0);\n  }\n  40%,\n  45% {\n    opacity: 1;\n    -webkit-transform: translate3d(0, -20px, 0);\n    transform: translate3d(0, -20px, 0);\n  }\n  100% {\n    opacity: 0;\n    -webkit-transform: translate3d(0, 2000px, 0);\n    transform: translate3d(0, 2000px, 0);\n  }\n}\n@keyframes bounceOutDown {\n  20% {\n    -webkit-transform: translate3d(0, 10px, 0);\n    transform: translate3d(0, 10px, 0);\n  }\n  40%,\n  45% {\n    opacity: 1;\n    -webkit-transform: translate3d(0, -20px, 0);\n    transform: translate3d(0, -20px, 0);\n  }\n  100% {\n    opacity: 0;\n    -webkit-transform: translate3d(0, 2000px, 0);\n    transform: translate3d(0, 2000px, 0);\n  }\n}\n.bounceOutDown {\n  -webkit-animation-name: bounceOutDown;\n  animation-name: bounceOutDown;\n}\n@-webkit-keyframes bounceOutLeft {\n  20% {\n    opacity: 1;\n    -webkit-transform: translate3d(20px, 0, 0);\n    transform: translate3d(20px, 0, 0);\n  }\n  100% {\n    opacity: 0;\n    -webkit-transform: translate3d(-2000px, 0, 0);\n    transform: translate3d(-2000px, 0, 0);\n  }\n}\n@keyframes bounceOutLeft {\n  20% {\n    opacity: 1;\n    -webkit-transform: translate3d(20px, 0, 0);\n    transform: translate3d(20px, 0, 0);\n  }\n  100% {\n    opacity: 0;\n    -webkit-transform: translate3d(-2000px, 0, 0);\n    transform: translate3d(-2000px, 0, 0);\n  }\n}\n.bounceOutLeft {\n  -webkit-animation-name: bounceOutLeft;\n  animation-name: bounceOutLeft;\n}\n@-webkit-keyframes bounceOutRight {\n  20% {\n    opacity: 1;\n    -webkit-transform: translate3d(-20px, 0, 0);\n    transform: translate3d(-20px, 0, 0);\n  }\n  100% {\n    opacity: 0;\n    -webkit-transform: translate3d(2000px, 0, 0);\n    transform: translate3d(2000px, 0, 0);\n  }\n}\n@keyframes bounceOutRight {\n  20% {\n    opacity: 1;\n    -webkit-transform: translate3d(-20px, 0, 0);\n    transform: translate3d(-20px, 0, 0);\n  }\n  100% {\n    opacity: 0;\n    -webkit-transform: translate3d(2000px, 0, 0);\n    transform: translate3d(2000px, 0, 0);\n  }\n}\n.bounceOutRight {\n  -webkit-animation-name: bounceOutRight;\n  animation-name: bounceOutRight;\n}\n@-webkit-keyframes bounceOutUp {\n  20% {\n    -webkit-transform: translate3d(0, -10px, 0);\n    transform: translate3d(0, -10px, 0);\n  }\n  40%,\n  45% {\n    opacity: 1;\n    -webkit-transform: translate3d(0, 20px, 0);\n    transform: translate3d(0, 20px, 0);\n  }\n  100% {\n    opacity: 0;\n    -webkit-transform: translate3d(0, -2000px, 0);\n    transform: translate3d(0, -2000px, 0);\n  }\n}\n@keyframes bounceOutUp {\n  20% {\n    -webkit-transform: translate3d(0, -10px, 0);\n    transform: translate3d(0, -10px, 0);\n  }\n  40%,\n  45% {\n    opacity: 1;\n    -webkit-transform: translate3d(0, 20px, 0);\n    transform: translate3d(0, 20px, 0);\n  }\n  100% {\n    opacity: 0;\n    -webkit-transform: translate3d(0, -2000px, 0);\n    transform: translate3d(0, -2000px, 0);\n  }\n}\n.bounceOutUp {\n  -webkit-animation-name: bounceOutUp;\n  animation-name: bounceOutUp;\n}\n@-webkit-keyframes fadeIn {\n  0% {\n    opacity: 0;\n  }\n  100% {\n    opacity: 1;\n  }\n}\n@keyframes fadeIn {\n  0% {\n    opacity: 0;\n  }\n  100% {\n    opacity: 1;\n  }\n}\n.fadeIn {\n  -webkit-animation-name: fadeIn;\n  animation-name: fadeIn;\n}\n@-webkit-keyframes fadeInDown {\n  0% {\n    opacity: 0;\n    -webkit-transform: translate3d(0, -100%, 0);\n    transform: translate3d(0, -100%, 0);\n  }\n  100% {\n    opacity: 1;\n    -webkit-transform: none;\n    transform: none;\n  }\n}\n@keyframes fadeInDown {\n  0% {\n    opacity: 0;\n    -webkit-transform: translate3d(0, -100%, 0);\n    transform: translate3d(0, -100%, 0);\n  }\n  100% {\n    opacity: 1;\n    -webkit-transform: none;\n    transform: none;\n  }\n}\n.fadeInDown {\n  -webkit-animation-name: fadeInDown;\n  animation-name: fadeInDown;\n}\n@-webkit-keyframes fadeInDownBig {\n  0% {\n    opacity: 0;\n    -webkit-transform: translate3d(0, -2000px, 0);\n    transform: translate3d(0, -2000px, 0);\n  }\n  100% {\n    opacity: 1;\n    -webkit-transform: none;\n    transform: none;\n  }\n}\n@keyframes fadeInDownBig {\n  0% {\n    opacity: 0;\n    -webkit-transform: translate3d(0, -2000px, 0);\n    transform: translate3d(0, -2000px, 0);\n  }\n  100% {\n    opacity: 1;\n    -webkit-transform: none;\n    transform: none;\n  }\n}\n.fadeInDownBig {\n  -webkit-animation-name: fadeInDownBig;\n  animation-name: fadeInDownBig;\n}\n@-webkit-keyframes fadeInLeft {\n  0% {\n    opacity: 0;\n    -webkit-transform: translate3d(-100%, 0, 0);\n    transform: translate3d(-100%, 0, 0);\n  }\n  100% {\n    opacity: 1;\n    -webkit-transform: none;\n    transform: none;\n  }\n}\n@keyframes fadeInLeft {\n  0% {\n    opacity: 0;\n    -webkit-transform: translate3d(-100%, 0, 0);\n    transform: translate3d(-100%, 0, 0);\n  }\n  100% {\n    opacity: 1;\n    -webkit-transform: none;\n    transform: none;\n  }\n}\n.fadeInLeft {\n  -webkit-animation-name: fadeInLeft;\n  animation-name: fadeInLeft;\n}\n@-webkit-keyframes fadeInLeftBig {\n  0% {\n    opacity: 0;\n    -webkit-transform: translate3d(-2000px, 0, 0);\n    transform: translate3d(-2000px, 0, 0);\n  }\n  100% {\n    opacity: 1;\n    -webkit-transform: none;\n    transform: none;\n  }\n}\n@keyframes fadeInLeftBig {\n  0% {\n    opacity: 0;\n    -webkit-transform: translate3d(-2000px, 0, 0);\n    transform: translate3d(-2000px, 0, 0);\n  }\n  100% {\n    opacity: 1;\n    -webkit-transform: none;\n    transform: none;\n  }\n}\n.fadeInLeftBig {\n  -webkit-animation-name: fadeInLeftBig;\n  animation-name: fadeInLeftBig;\n}\n@-webkit-keyframes fadeInRight {\n  0% {\n    opacity: 0;\n    -webkit-transform: translate3d(100%, 0, 0);\n    transform: translate3d(100%, 0, 0);\n  }\n  100% {\n    opacity: 1;\n    -webkit-transform: none;\n    transform: none;\n  }\n}\n@keyframes fadeInRight {\n  0% {\n    opacity: 0;\n    -webkit-transform: translate3d(100%, 0, 0);\n    transform: translate3d(100%, 0, 0);\n  }\n  100% {\n    opacity: 1;\n    -webkit-transform: none;\n    transform: none;\n  }\n}\n.fadeInRight {\n  -webkit-animation-name: fadeInRight;\n  animation-name: fadeInRight;\n}\n@-webkit-keyframes fadeInRightBig {\n  0% {\n    opacity: 0;\n    -webkit-transform: translate3d(2000px, 0, 0);\n    transform: translate3d(2000px, 0, 0);\n  }\n  100% {\n    opacity: 1;\n    -webkit-transform: none;\n    transform: none;\n  }\n}\n@keyframes fadeInRightBig {\n  0% {\n    opacity: 0;\n    -webkit-transform: translate3d(2000px, 0, 0);\n    transform: translate3d(2000px, 0, 0);\n  }\n  100% {\n    opacity: 1;\n    -webkit-transform: none;\n    transform: none;\n  }\n}\n.fadeInRightBig {\n  -webkit-animation-name: fadeInRightBig;\n  animation-name: fadeInRightBig;\n}\n@-webkit-keyframes fadeInUp {\n  0% {\n    opacity: 0;\n    -webkit-transform: translate3d(0, 100%, 0);\n    transform: translate3d(0, 100%, 0);\n  }\n  100% {\n    opacity: 1;\n    -webkit-transform: none;\n    transform: none;\n  }\n}\n@keyframes fadeInUp {\n  0% {\n    opacity: 0;\n    -webkit-transform: translate3d(0, 100%, 0);\n    transform: translate3d(0, 100%, 0);\n  }\n  100% {\n    opacity: 1;\n    -webkit-transform: none;\n    transform: none;\n  }\n}\n.fadeInUp {\n  -webkit-animation-name: fadeInUp;\n  animation-name: fadeInUp;\n}\n@-webkit-keyframes fadeInUpBig {\n  0% {\n    opacity: 0;\n    -webkit-transform: translate3d(0, 2000px, 0);\n    transform: translate3d(0, 2000px, 0);\n  }\n  100% {\n    opacity: 1;\n    -webkit-transform: none;\n    transform: none;\n  }\n}\n@keyframes fadeInUpBig {\n  0% {\n    opacity: 0;\n    -webkit-transform: translate3d(0, 2000px, 0);\n    transform: translate3d(0, 2000px, 0);\n  }\n  100% {\n    opacity: 1;\n    -webkit-transform: none;\n    transform: none;\n  }\n}\n.fadeInUpBig {\n  -webkit-animation-name: fadeInUpBig;\n  animation-name: fadeInUpBig;\n}\n@-webkit-keyframes fadeOut {\n  0% {\n    opacity: 1;\n  }\n  100% {\n    opacity: 0;\n  }\n}\n@keyframes fadeOut {\n  0% {\n    opacity: 1;\n  }\n  100% {\n    opacity: 0;\n  }\n}\n.fadeOut {\n  -webkit-animation-name: fadeOut;\n  animation-name: fadeOut;\n}\n@-webkit-keyframes fadeOutDown {\n  0% {\n    opacity: 1;\n  }\n  100% {\n    opacity: 0;\n    -webkit-transform: translate3d(0, 100%, 0);\n    transform: translate3d(0, 100%, 0);\n  }\n}\n@keyframes fadeOutDown {\n  0% {\n    opacity: 1;\n  }\n  100% {\n    opacity: 0;\n    -webkit-transform: translate3d(0, 100%, 0);\n    transform: translate3d(0, 100%, 0);\n  }\n}\n.fadeOutDown {\n  -webkit-animation-name: fadeOutDown;\n  animation-name: fadeOutDown;\n}\n@-webkit-keyframes fadeOutDownBig {\n  0% {\n    opacity: 1;\n  }\n  100% {\n    opacity: 0;\n    -webkit-transform: translate3d(0, 2000px, 0);\n    transform: translate3d(0, 2000px, 0);\n  }\n}\n@keyframes fadeOutDownBig {\n  0% {\n    opacity: 1;\n  }\n  100% {\n    opacity: 0;\n    -webkit-transform: translate3d(0, 2000px, 0);\n    transform: translate3d(0, 2000px, 0);\n  }\n}\n.fadeOutDownBig {\n  -webkit-animation-name: fadeOutDownBig;\n  animation-name: fadeOutDownBig;\n}\n@-webkit-keyframes fadeOutLeft {\n  0% {\n    opacity: 1;\n  }\n  100% {\n    opacity: 0;\n    -webkit-transform: translate3d(-100%, 0, 0);\n    transform: translate3d(-100%, 0, 0);\n  }\n}\n@keyframes fadeOutLeft {\n  0% {\n    opacity: 1;\n  }\n  100% {\n    opacity: 0;\n    -webkit-transform: translate3d(-100%, 0, 0);\n    transform: translate3d(-100%, 0, 0);\n  }\n}\n.fadeOutLeft {\n  -webkit-animation-name: fadeOutLeft;\n  animation-name: fadeOutLeft;\n}\n@-webkit-keyframes fadeOutLeftBig {\n  0% {\n    opacity: 1;\n  }\n  100% {\n    opacity: 0;\n    -webkit-transform: translate3d(-2000px, 0, 0);\n    transform: translate3d(-2000px, 0, 0);\n  }\n}\n@keyframes fadeOutLeftBig {\n  0% {\n    opacity: 1;\n  }\n  100% {\n    opacity: 0;\n    -webkit-transform: translate3d(-2000px, 0, 0);\n    transform: translate3d(-2000px, 0, 0);\n  }\n}\n.fadeOutLeftBig {\n  -webkit-animation-name: fadeOutLeftBig;\n  animation-name: fadeOutLeftBig;\n}\n@-webkit-keyframes fadeOutRight {\n  0% {\n    opacity: 1;\n  }\n  100% {\n    opacity: 0;\n    -webkit-transform: translate3d(100%, 0, 0);\n    transform: translate3d(100%, 0, 0);\n  }\n}\n@keyframes fadeOutRight {\n  0% {\n    opacity: 1;\n  }\n  100% {\n    opacity: 0;\n    -webkit-transform: translate3d(100%, 0, 0);\n    transform: translate3d(100%, 0, 0);\n  }\n}\n.fadeOutRight {\n  -webkit-animation-name: fadeOutRight;\n  animation-name: fadeOutRight;\n}\n@-webkit-keyframes fadeOutRightBig {\n  0% {\n    opacity: 1;\n  }\n  100% {\n    opacity: 0;\n    -webkit-transform: translate3d(2000px, 0, 0);\n    transform: translate3d(2000px, 0, 0);\n  }\n}\n@keyframes fadeOutRightBig {\n  0% {\n    opacity: 1;\n  }\n  100% {\n    opacity: 0;\n    -webkit-transform: translate3d(2000px, 0, 0);\n    transform: translate3d(2000px, 0, 0);\n  }\n}\n.fadeOutRightBig {\n  -webkit-animation-name: fadeOutRightBig;\n  animation-name: fadeOutRightBig;\n}\n@-webkit-keyframes fadeOutUp {\n  0% {\n    opacity: 1;\n  }\n  100% {\n    opacity: 0;\n    -webkit-transform: translate3d(0, -100%, 0);\n    transform: translate3d(0, -100%, 0);\n  }\n}\n@keyframes fadeOutUp {\n  0% {\n    opacity: 1;\n  }\n  100% {\n    opacity: 0;\n    -webkit-transform: translate3d(0, -100%, 0);\n    transform: translate3d(0, -100%, 0);\n  }\n}\n.fadeOutUp {\n  -webkit-animation-name: fadeOutUp;\n  animation-name: fadeOutUp;\n}\n@-webkit-keyframes fadeOutUpBig {\n  0% {\n    opacity: 1;\n  }\n  100% {\n    opacity: 0;\n    -webkit-transform: translate3d(0, -2000px, 0);\n    transform: translate3d(0, -2000px, 0);\n  }\n}\n@keyframes fadeOutUpBig {\n  0% {\n    opacity: 1;\n  }\n  100% {\n    opacity: 0;\n    -webkit-transform: translate3d(0, -2000px, 0);\n    transform: translate3d(0, -2000px, 0);\n  }\n}\n.fadeOutUpBig {\n  -webkit-animation-name: fadeOutUpBig;\n  animation-name: fadeOutUpBig;\n}\n@-webkit-keyframes flip {\n  0% {\n    -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -360deg);\n    transform: perspective(400px) rotate3d(0, 1, 0, -360deg);\n    -webkit-animation-timing-function: ease-out;\n    animation-timing-function: ease-out;\n  }\n  40% {\n    -webkit-transform: perspective(400px) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -190deg);\n    transform: perspective(400px) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -190deg);\n    -webkit-animation-timing-function: ease-out;\n    animation-timing-function: ease-out;\n  }\n  50% {\n    -webkit-transform: perspective(400px) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -170deg);\n    transform: perspective(400px) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -170deg);\n    -webkit-animation-timing-function: ease-in;\n    animation-timing-function: ease-in;\n  }\n  80% {\n    -webkit-transform: perspective(400px) scale3d(0.95, 0.95, 0.95);\n    transform: perspective(400px) scale3d(0.95, 0.95, 0.95);\n    -webkit-animation-timing-function: ease-in;\n    animation-timing-function: ease-in;\n  }\n  100% {\n    -webkit-transform: perspective(400px);\n    transform: perspective(400px);\n    -webkit-animation-timing-function: ease-in;\n    animation-timing-function: ease-in;\n  }\n}\n@keyframes flip {\n  0% {\n    -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -360deg);\n    transform: perspective(400px) rotate3d(0, 1, 0, -360deg);\n    -webkit-animation-timing-function: ease-out;\n    animation-timing-function: ease-out;\n  }\n  40% {\n    -webkit-transform: perspective(400px) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -190deg);\n    transform: perspective(400px) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -190deg);\n    -webkit-animation-timing-function: ease-out;\n    animation-timing-function: ease-out;\n  }\n  50% {\n    -webkit-transform: perspective(400px) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -170deg);\n    transform: perspective(400px) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -170deg);\n    -webkit-animation-timing-function: ease-in;\n    animation-timing-function: ease-in;\n  }\n  80% {\n    -webkit-transform: perspective(400px) scale3d(0.95, 0.95, 0.95);\n    transform: perspective(400px) scale3d(0.95, 0.95, 0.95);\n    -webkit-animation-timing-function: ease-in;\n    animation-timing-function: ease-in;\n  }\n  100% {\n    -webkit-transform: perspective(400px);\n    transform: perspective(400px);\n    -webkit-animation-timing-function: ease-in;\n    animation-timing-function: ease-in;\n  }\n}\n.animated.flip {\n  -webkit-backface-visibility: visible;\n  backface-visibility: visible;\n  -webkit-animation-name: flip;\n  animation-name: flip;\n}\n@-webkit-keyframes flipInX {\n  0% {\n    -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 90deg);\n    transform: perspective(400px) rotate3d(1, 0, 0, 90deg);\n    -webkit-transition-timing-function: ease-in;\n    transition-timing-function: ease-in;\n    opacity: 0;\n  }\n  40% {\n    -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -20deg);\n    transform: perspective(400px) rotate3d(1, 0, 0, -20deg);\n    -webkit-transition-timing-function: ease-in;\n    transition-timing-function: ease-in;\n  }\n  60% {\n    -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 10deg);\n    transform: perspective(400px) rotate3d(1, 0, 0, 10deg);\n    opacity: 1;\n  }\n  80% {\n    -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -5deg);\n    transform: perspective(400px) rotate3d(1, 0, 0, -5deg);\n  }\n  100% {\n    -webkit-transform: perspective(400px);\n    transform: perspective(400px);\n  }\n}\n@keyframes flipInX {\n  0% {\n    -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 90deg);\n    transform: perspective(400px) rotate3d(1, 0, 0, 90deg);\n    -webkit-transition-timing-function: ease-in;\n    transition-timing-function: ease-in;\n    opacity: 0;\n  }\n  40% {\n    -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -20deg);\n    transform: perspective(400px) rotate3d(1, 0, 0, -20deg);\n    -webkit-transition-timing-function: ease-in;\n    transition-timing-function: ease-in;\n  }\n  60% {\n    -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 10deg);\n    transform: perspective(400px) rotate3d(1, 0, 0, 10deg);\n    opacity: 1;\n  }\n  80% {\n    -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -5deg);\n    transform: perspective(400px) rotate3d(1, 0, 0, -5deg);\n  }\n  100% {\n    -webkit-transform: perspective(400px);\n    transform: perspective(400px);\n  }\n}\n.flipInX {\n  -webkit-backface-visibility: visible!important;\n  backface-visibility: visible!important;\n  -webkit-animation-name: flipInX;\n  animation-name: flipInX;\n}\n@-webkit-keyframes flipInY {\n  0% {\n    -webkit-transform: perspective(400px) rotate3d(0, 1, 0, 90deg);\n    transform: perspective(400px) rotate3d(0, 1, 0, 90deg);\n    -webkit-transition-timing-function: ease-in;\n    transition-timing-function: ease-in;\n    opacity: 0;\n  }\n  40% {\n    -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -20deg);\n    transform: perspective(400px) rotate3d(0, 1, 0, -20deg);\n    -webkit-transition-timing-function: ease-in;\n    transition-timing-function: ease-in;\n  }\n  60% {\n    -webkit-transform: perspective(400px) rotate3d(0, 1, 0, 10deg);\n    transform: perspective(400px) rotate3d(0, 1, 0, 10deg);\n    opacity: 1;\n  }\n  80% {\n    -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -5deg);\n    transform: perspective(400px) rotate3d(0, 1, 0, -5deg);\n  }\n  100% {\n    -webkit-transform: perspective(400px);\n    transform: perspective(400px);\n  }\n}\n@keyframes flipInY {\n  0% {\n    -webkit-transform: perspective(400px) rotate3d(0, 1, 0, 90deg);\n    transform: perspective(400px) rotate3d(0, 1, 0, 90deg);\n    -webkit-transition-timing-function: ease-in;\n    transition-timing-function: ease-in;\n    opacity: 0;\n  }\n  40% {\n    -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -20deg);\n    transform: perspective(400px) rotate3d(0, 1, 0, -20deg);\n    -webkit-transition-timing-function: ease-in;\n    transition-timing-function: ease-in;\n  }\n  60% {\n    -webkit-transform: perspective(400px) rotate3d(0, 1, 0, 10deg);\n    transform: perspective(400px) rotate3d(0, 1, 0, 10deg);\n    opacity: 1;\n  }\n  80% {\n    -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -5deg);\n    transform: perspective(400px) rotate3d(0, 1, 0, -5deg);\n  }\n  100% {\n    -webkit-transform: perspective(400px);\n    transform: perspective(400px);\n  }\n}\n.flipInY {\n  -webkit-backface-visibility: visible!important;\n  backface-visibility: visible!important;\n  -webkit-animation-name: flipInY;\n  animation-name: flipInY;\n}\n@-webkit-keyframes flipOutX {\n  0% {\n    -webkit-transform: perspective(400px);\n    transform: perspective(400px);\n  }\n  30% {\n    -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -20deg);\n    transform: perspective(400px) rotate3d(1, 0, 0, -20deg);\n    opacity: 1;\n  }\n  100% {\n    -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 90deg);\n    transform: perspective(400px) rotate3d(1, 0, 0, 90deg);\n    opacity: 0;\n  }\n}\n@keyframes flipOutX {\n  0% {\n    -webkit-transform: perspective(400px);\n    transform: perspective(400px);\n  }\n  30% {\n    -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -20deg);\n    transform: perspective(400px) rotate3d(1, 0, 0, -20deg);\n    opacity: 1;\n  }\n  100% {\n    -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 90deg);\n    transform: perspective(400px) rotate3d(1, 0, 0, 90deg);\n    opacity: 0;\n  }\n}\n.flipOutX {\n  -webkit-animation-name: flipOutX;\n  animation-name: flipOutX;\n  -webkit-animation-duration: .75s;\n  animation-duration: .75s;\n  -webkit-backface-visibility: visible!important;\n  backface-visibility: visible !important;\n}\n@-webkit-keyframes flipOutY {\n  0% {\n    -webkit-transform: perspective(400px);\n    transform: perspective(400px);\n  }\n  30% {\n    -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -15deg);\n    transform: perspective(400px) rotate3d(0, 1, 0, -15deg);\n    opacity: 1;\n  }\n  100% {\n    -webkit-transform: perspective(400px) rotate3d(0, 1, 0, 90deg);\n    transform: perspective(400px) rotate3d(0, 1, 0, 90deg);\n    opacity: 0;\n  }\n}\n@keyframes flipOutY {\n  0% {\n    -webkit-transform: perspective(400px);\n    transform: perspective(400px);\n  }\n  30% {\n    -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -15deg);\n    transform: perspective(400px) rotate3d(0, 1, 0, -15deg);\n    opacity: 1;\n  }\n  100% {\n    -webkit-transform: perspective(400px) rotate3d(0, 1, 0, 90deg);\n    transform: perspective(400px) rotate3d(0, 1, 0, 90deg);\n    opacity: 0;\n  }\n}\n.flipOutY {\n  -webkit-backface-visibility: visible!important;\n  backface-visibility: visible!important;\n  -webkit-animation-name: flipOutY;\n  animation-name: flipOutY;\n  -webkit-animation-duration: .75s;\n  animation-duration: 0.75s;\n}\n@-webkit-keyframes lightSpeedIn {\n  0% {\n    -webkit-transform: translate3d(100%, 0, 0) skewX(-30deg);\n    transform: translate3d(100%, 0, 0) skewX(-30deg);\n    opacity: 0;\n  }\n  60% {\n    -webkit-transform: skewX(20deg);\n    transform: skewX(20deg);\n    opacity: 1;\n  }\n  80% {\n    -webkit-transform: skewX(-5deg);\n    transform: skewX(-5deg);\n    opacity: 1;\n  }\n  100% {\n    -webkit-transform: none;\n    transform: none;\n    opacity: 1;\n  }\n}\n@keyframes lightSpeedIn {\n  0% {\n    -webkit-transform: translate3d(100%, 0, 0) skewX(-30deg);\n    transform: translate3d(100%, 0, 0) skewX(-30deg);\n    opacity: 0;\n  }\n  60% {\n    -webkit-transform: skewX(20deg);\n    transform: skewX(20deg);\n    opacity: 1;\n  }\n  80% {\n    -webkit-transform: skewX(-5deg);\n    transform: skewX(-5deg);\n    opacity: 1;\n  }\n  100% {\n    -webkit-transform: none;\n    transform: none;\n    opacity: 1;\n  }\n}\n.lightSpeedIn {\n  -webkit-animation-name: lightSpeedIn;\n  animation-name: lightSpeedIn;\n  -webkit-animation-timing-function: ease-out;\n  animation-timing-function: ease-out;\n}\n@-webkit-keyframes lightSpeedOut {\n  0% {\n    opacity: 1;\n  }\n  100% {\n    -webkit-transform: translate3d(100%, 0, 0) skewX(30deg);\n    transform: translate3d(100%, 0, 0) skewX(30deg);\n    opacity: 0;\n  }\n}\n@keyframes lightSpeedOut {\n  0% {\n    opacity: 1;\n  }\n  100% {\n    -webkit-transform: translate3d(100%, 0, 0) skewX(30deg);\n    transform: translate3d(100%, 0, 0) skewX(30deg);\n    opacity: 0;\n  }\n}\n.lightSpeedOut {\n  -webkit-animation-name: lightSpeedOut;\n  animation-name: lightSpeedOut;\n  -webkit-animation-timing-function: ease-in;\n  animation-timing-function: ease-in;\n}\n@-webkit-keyframes rotateIn {\n  0% {\n    -webkit-transform-origin: center;\n    transform-origin: center;\n    -webkit-transform: rotate3d(0, 0, 1, -200deg);\n    transform: rotate3d(0, 0, 1, -200deg);\n    opacity: 0;\n  }\n  100% {\n    -webkit-transform-origin: center;\n    transform-origin: center;\n    -webkit-transform: none;\n    transform: none;\n    opacity: 1;\n  }\n}\n@keyframes rotateIn {\n  0% {\n    -webkit-transform-origin: center;\n    transform-origin: center;\n    -webkit-transform: rotate3d(0, 0, 1, -200deg);\n    transform: rotate3d(0, 0, 1, -200deg);\n    opacity: 0;\n  }\n  100% {\n    -webkit-transform-origin: center;\n    transform-origin: center;\n    -webkit-transform: none;\n    transform: none;\n    opacity: 1;\n  }\n}\n.rotateIn {\n  -webkit-animation-name: rotateIn;\n  animation-name: rotateIn;\n}\n@-webkit-keyframes rotateInDownLeft {\n  0% {\n    -webkit-transform-origin: left bottom;\n    transform-origin: left bottom;\n    -webkit-transform: rotate3d(0, 0, 1, -45deg);\n    transform: rotate3d(0, 0, 1, -45deg);\n    opacity: 0;\n  }\n  100% {\n    -webkit-transform-origin: left bottom;\n    transform-origin: left bottom;\n    -webkit-transform: none;\n    transform: none;\n    opacity: 1;\n  }\n}\n@keyframes rotateInDownLeft {\n  0% {\n    -webkit-transform-origin: left bottom;\n    transform-origin: left bottom;\n    -webkit-transform: rotate3d(0, 0, 1, -45deg);\n    transform: rotate3d(0, 0, 1, -45deg);\n    opacity: 0;\n  }\n  100% {\n    -webkit-transform-origin: left bottom;\n    transform-origin: left bottom;\n    -webkit-transform: none;\n    transform: none;\n    opacity: 1;\n  }\n}\n.rotateInDownLeft {\n  -webkit-animation-name: rotateInDownLeft;\n  animation-name: rotateInDownLeft;\n}\n@-webkit-keyframes rotateInDownRight {\n  0% {\n    -webkit-transform-origin: right bottom;\n    transform-origin: right bottom;\n    -webkit-transform: rotate3d(0, 0, 1, 45deg);\n    transform: rotate3d(0, 0, 1, 45deg);\n    opacity: 0;\n  }\n  100% {\n    -webkit-transform-origin: right bottom;\n    transform-origin: right bottom;\n    -webkit-transform: none;\n    transform: none;\n    opacity: 1;\n  }\n}\n@keyframes rotateInDownRight {\n  0% {\n    -webkit-transform-origin: right bottom;\n    transform-origin: right bottom;\n    -webkit-transform: rotate3d(0, 0, 1, 45deg);\n    transform: rotate3d(0, 0, 1, 45deg);\n    opacity: 0;\n  }\n  100% {\n    -webkit-transform-origin: right bottom;\n    transform-origin: right bottom;\n    -webkit-transform: none;\n    transform: none;\n    opacity: 1;\n  }\n}\n.rotateInDownRight {\n  -webkit-animation-name: rotateInDownRight;\n  animation-name: rotateInDownRight;\n}\n@-webkit-keyframes rotateInUpLeft {\n  0% {\n    -webkit-transform-origin: left bottom;\n    transform-origin: left bottom;\n    -webkit-transform: rotate3d(0, 0, 1, 45deg);\n    transform: rotate3d(0, 0, 1, 45deg);\n    opacity: 0;\n  }\n  100% {\n    -webkit-transform-origin: left bottom;\n    transform-origin: left bottom;\n    -webkit-transform: none;\n    transform: none;\n    opacity: 1;\n  }\n}\n@keyframes rotateInUpLeft {\n  0% {\n    -webkit-transform-origin: left bottom;\n    transform-origin: left bottom;\n    -webkit-transform: rotate3d(0, 0, 1, 45deg);\n    transform: rotate3d(0, 0, 1, 45deg);\n    opacity: 0;\n  }\n  100% {\n    -webkit-transform-origin: left bottom;\n    transform-origin: left bottom;\n    -webkit-transform: none;\n    transform: none;\n    opacity: 1;\n  }\n}\n.rotateInUpLeft {\n  -webkit-animation-name: rotateInUpLeft;\n  animation-name: rotateInUpLeft;\n}\n@-webkit-keyframes rotateInUpRight {\n  0% {\n    -webkit-transform-origin: right bottom;\n    transform-origin: right bottom;\n    -webkit-transform: rotate3d(0, 0, 1, -90deg);\n    transform: rotate3d(0, 0, 1, -90deg);\n    opacity: 0;\n  }\n  100% {\n    -webkit-transform-origin: right bottom;\n    transform-origin: right bottom;\n    -webkit-transform: none;\n    transform: none;\n    opacity: 1;\n  }\n}\n@keyframes rotateInUpRight {\n  0% {\n    -webkit-transform-origin: right bottom;\n    transform-origin: right bottom;\n    -webkit-transform: rotate3d(0, 0, 1, -90deg);\n    transform: rotate3d(0, 0, 1, -90deg);\n    opacity: 0;\n  }\n  100% {\n    -webkit-transform-origin: right bottom;\n    transform-origin: right bottom;\n    -webkit-transform: none;\n    transform: none;\n    opacity: 1;\n  }\n}\n.rotateInUpRight {\n  -webkit-animation-name: rotateInUpRight;\n  animation-name: rotateInUpRight;\n}\n@-webkit-keyframes rotateOut {\n  0% {\n    -webkit-transform-origin: center;\n    transform-origin: center;\n    opacity: 1;\n  }\n  100% {\n    -webkit-transform-origin: center;\n    transform-origin: center;\n    -webkit-transform: rotate3d(0, 0, 1, 200deg);\n    transform: rotate3d(0, 0, 1, 200deg);\n    opacity: 0;\n  }\n}\n@keyframes rotateOut {\n  0% {\n    -webkit-transform-origin: center;\n    transform-origin: center;\n    opacity: 1;\n  }\n  100% {\n    -webkit-transform-origin: center;\n    transform-origin: center;\n    -webkit-transform: rotate3d(0, 0, 1, 200deg);\n    transform: rotate3d(0, 0, 1, 200deg);\n    opacity: 0;\n  }\n}\n.rotateOut {\n  -webkit-animation-name: rotateOut;\n  animation-name: rotateOut;\n}\n@-webkit-keyframes rotateOutDownLeft {\n  0% {\n    -webkit-transform-origin: left bottom;\n    transform-origin: left bottom;\n    opacity: 1;\n  }\n  100% {\n    -webkit-transform-origin: left bottom;\n    transform-origin: left bottom;\n    -webkit-transform: rotate3d(0, 0, 1, 45deg);\n    transform: rotate3d(0, 0, 1, 45deg);\n    opacity: 0;\n  }\n}\n@keyframes rotateOutDownLeft {\n  0% {\n    -webkit-transform-origin: left bottom;\n    transform-origin: left bottom;\n    opacity: 1;\n  }\n  100% {\n    -webkit-transform-origin: left bottom;\n    transform-origin: left bottom;\n    -webkit-transform: rotate3d(0, 0, 1, 45deg);\n    transform: rotate3d(0, 0, 1, 45deg);\n    opacity: 0;\n  }\n}\n.rotateOutDownLeft {\n  -webkit-animation-name: rotateOutDownLeft;\n  animation-name: rotateOutDownLeft;\n}\n@-webkit-keyframes rotateOutDownRight {\n  0% {\n    -webkit-transform-origin: right bottom;\n    transform-origin: right bottom;\n    opacity: 1;\n  }\n  100% {\n    -webkit-transform-origin: right bottom;\n    transform-origin: right bottom;\n    -webkit-transform: rotate3d(0, 0, 1, -45deg);\n    transform: rotate3d(0, 0, 1, -45deg);\n    opacity: 0;\n  }\n}\n@keyframes rotateOutDownRight {\n  0% {\n    -webkit-transform-origin: right bottom;\n    transform-origin: right bottom;\n    opacity: 1;\n  }\n  100% {\n    -webkit-transform-origin: right bottom;\n    transform-origin: right bottom;\n    -webkit-transform: rotate3d(0, 0, 1, -45deg);\n    transform: rotate3d(0, 0, 1, -45deg);\n    opacity: 0;\n  }\n}\n.rotateOutDownRight {\n  -webkit-animation-name: rotateOutDownRight;\n  animation-name: rotateOutDownRight;\n}\n@-webkit-keyframes rotateOutUpLeft {\n  0% {\n    -webkit-transform-origin: left bottom;\n    transform-origin: left bottom;\n    opacity: 1;\n  }\n  100% {\n    -webkit-transform-origin: left bottom;\n    transform-origin: left bottom;\n    -webkit-transform: rotate3d(0, 0, 1, -45deg);\n    transform: rotate3d(0, 0, 1, -45deg);\n    opacity: 0;\n  }\n}\n@keyframes rotateOutUpLeft {\n  0% {\n    -webkit-transform-origin: left bottom;\n    transform-origin: left bottom;\n    opacity: 1;\n  }\n  100% {\n    -webkit-transform-origin: left bottom;\n    transform-origin: left bottom;\n    -webkit-transform: rotate3d(0, 0, 1, -45deg);\n    transform: rotate3d(0, 0, 1, -45deg);\n    opacity: 0;\n  }\n}\n.rotateOutUpLeft {\n  -webkit-animation-name: rotateOutUpLeft;\n  animation-name: rotateOutUpLeft;\n}\n@-webkit-keyframes rotateOutUpRight {\n  0% {\n    -webkit-transform-origin: right bottom;\n    transform-origin: right bottom;\n    opacity: 1;\n  }\n  100% {\n    -webkit-transform-origin: right bottom;\n    transform-origin: right bottom;\n    -webkit-transform: rotate3d(0, 0, 1, 90deg);\n    transform: rotate3d(0, 0, 1, 90deg);\n    opacity: 0;\n  }\n}\n@keyframes rotateOutUpRight {\n  0% {\n    -webkit-transform-origin: right bottom;\n    transform-origin: right bottom;\n    opacity: 1;\n  }\n  100% {\n    -webkit-transform-origin: right bottom;\n    transform-origin: right bottom;\n    -webkit-transform: rotate3d(0, 0, 1, 90deg);\n    transform: rotate3d(0, 0, 1, 90deg);\n    opacity: 0;\n  }\n}\n.rotateOutUpRight {\n  -webkit-animation-name: rotateOutUpRight;\n  animation-name: rotateOutUpRight;\n}\n@-webkit-keyframes hinge {\n  0% {\n    -webkit-transform-origin: top left;\n    transform-origin: top left;\n    -webkit-animation-timing-function: ease-in-out;\n    animation-timing-function: ease-in-out;\n  }\n  20%,\n  60% {\n    -webkit-transform: rotate3d(0, 0, 1, 80deg);\n    transform: rotate3d(0, 0, 1, 80deg);\n    -webkit-transform-origin: top left;\n    transform-origin: top left;\n    -webkit-animation-timing-function: ease-in-out;\n    animation-timing-function: ease-in-out;\n  }\n  40%,\n  80% {\n    -webkit-transform: rotate3d(0, 0, 1, 60deg);\n    transform: rotate3d(0, 0, 1, 60deg);\n    -webkit-transform-origin: top left;\n    transform-origin: top left;\n    -webkit-animation-timing-function: ease-in-out;\n    animation-timing-function: ease-in-out;\n    opacity: 1;\n  }\n  100% {\n    -webkit-transform: translate3d(0, 700px, 0);\n    transform: translate3d(0, 700px, 0);\n    opacity: 0;\n  }\n}\n@keyframes hinge {\n  0% {\n    -webkit-transform-origin: top left;\n    transform-origin: top left;\n    -webkit-animation-timing-function: ease-in-out;\n    animation-timing-function: ease-in-out;\n  }\n  20%,\n  60% {\n    -webkit-transform: rotate3d(0, 0, 1, 80deg);\n    transform: rotate3d(0, 0, 1, 80deg);\n    -webkit-transform-origin: top left;\n    transform-origin: top left;\n    -webkit-animation-timing-function: ease-in-out;\n    animation-timing-function: ease-in-out;\n  }\n  40%,\n  80% {\n    -webkit-transform: rotate3d(0, 0, 1, 60deg);\n    transform: rotate3d(0, 0, 1, 60deg);\n    -webkit-transform-origin: top left;\n    transform-origin: top left;\n    -webkit-animation-timing-function: ease-in-out;\n    animation-timing-function: ease-in-out;\n    opacity: 1;\n  }\n  100% {\n    -webkit-transform: translate3d(0, 700px, 0);\n    transform: translate3d(0, 700px, 0);\n    opacity: 0;\n  }\n}\n.hinge {\n  -webkit-animation-name: hinge;\n  animation-name: hinge;\n}\n@-webkit-keyframes rollIn {\n  0% {\n    opacity: 0;\n    -webkit-transform: translate3d(-100%, 0, 0) rotate3d(0, 0, 1, -120deg);\n    transform: translate3d(-100%, 0, 0) rotate3d(0, 0, 1, -120deg);\n  }\n  100% {\n    opacity: 1;\n    -webkit-transform: none;\n    transform: none;\n  }\n}\n@keyframes rollIn {\n  0% {\n    opacity: 0;\n    -webkit-transform: translate3d(-100%, 0, 0) rotate3d(0, 0, 1, -120deg);\n    transform: translate3d(-100%, 0, 0) rotate3d(0, 0, 1, -120deg);\n  }\n  100% {\n    opacity: 1;\n    -webkit-transform: none;\n    transform: none;\n  }\n}\n.rollIn {\n  -webkit-animation-name: rollIn;\n  animation-name: rollIn;\n}\n@-webkit-keyframes rollOut {\n  0% {\n    opacity: 1;\n  }\n  100% {\n    opacity: 0;\n    -webkit-transform: translate3d(100%, 0, 0) rotate3d(0, 0, 1, 120deg);\n    transform: translate3d(100%, 0, 0) rotate3d(0, 0, 1, 120deg);\n  }\n}\n@keyframes rollOut {\n  0% {\n    opacity: 1;\n  }\n  100% {\n    opacity: 0;\n    -webkit-transform: translate3d(100%, 0, 0) rotate3d(0, 0, 1, 120deg);\n    transform: translate3d(100%, 0, 0) rotate3d(0, 0, 1, 120deg);\n  }\n}\n.rollOut {\n  -webkit-animation-name: rollOut;\n  animation-name: rollOut;\n}\n@-webkit-keyframes zoomIn {\n  0% {\n    opacity: 0;\n    -webkit-transform: scale3d(0.3, 0.3, 0.3);\n    transform: scale3d(0.3, 0.3, 0.3);\n  }\n  50% {\n    opacity: 1;\n  }\n}\n@keyframes zoomIn {\n  0% {\n    opacity: 0;\n    -webkit-transform: scale3d(0.3, 0.3, 0.3);\n    transform: scale3d(0.3, 0.3, 0.3);\n  }\n  50% {\n    opacity: 1;\n  }\n}\n.zoomIn {\n  -webkit-animation-name: zoomIn;\n  animation-name: zoomIn;\n}\n@-webkit-keyframes zoomInDown {\n  0% {\n    opacity: 0;\n    -webkit-transform: scale3d(0.1, 0.1, 0.1) translate3d(0, -1000px, 0);\n    transform: scale3d(0.1, 0.1, 0.1) translate3d(0, -1000px, 0);\n    -webkit-animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19);\n    animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19);\n  }\n  60% {\n    opacity: 1;\n    -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(0, 60px, 0);\n    transform: scale3d(0.475, 0.475, 0.475) translate3d(0, 60px, 0);\n    -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1);\n    animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1);\n  }\n}\n@keyframes zoomInDown {\n  0% {\n    opacity: 0;\n    -webkit-transform: scale3d(0.1, 0.1, 0.1) translate3d(0, -1000px, 0);\n    transform: scale3d(0.1, 0.1, 0.1) translate3d(0, -1000px, 0);\n    -webkit-animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19);\n    animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19);\n  }\n  60% {\n    opacity: 1;\n    -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(0, 60px, 0);\n    transform: scale3d(0.475, 0.475, 0.475) translate3d(0, 60px, 0);\n    -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1);\n    animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1);\n  }\n}\n.zoomInDown {\n  -webkit-animation-name: zoomInDown;\n  animation-name: zoomInDown;\n}\n@-webkit-keyframes zoomInLeft {\n  0% {\n    opacity: 0;\n    -webkit-transform: scale3d(0.1, 0.1, 0.1) translate3d(-1000px, 0, 0);\n    transform: scale3d(0.1, 0.1, 0.1) translate3d(-1000px, 0, 0);\n    -webkit-animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19);\n    animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19);\n  }\n  60% {\n    opacity: 1;\n    -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(10px, 0, 0);\n    transform: scale3d(0.475, 0.475, 0.475) translate3d(10px, 0, 0);\n    -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1);\n    animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1);\n  }\n}\n@keyframes zoomInLeft {\n  0% {\n    opacity: 0;\n    -webkit-transform: scale3d(0.1, 0.1, 0.1) translate3d(-1000px, 0, 0);\n    transform: scale3d(0.1, 0.1, 0.1) translate3d(-1000px, 0, 0);\n    -webkit-animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19);\n    animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19);\n  }\n  60% {\n    opacity: 1;\n    -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(10px, 0, 0);\n    transform: scale3d(0.475, 0.475, 0.475) translate3d(10px, 0, 0);\n    -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1);\n    animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1);\n  }\n}\n.zoomInLeft {\n  -webkit-animation-name: zoomInLeft;\n  animation-name: zoomInLeft;\n}\n@-webkit-keyframes zoomInRight {\n  0% {\n    opacity: 0;\n    -webkit-transform: scale3d(0.1, 0.1, 0.1) translate3d(1000px, 0, 0);\n    transform: scale3d(0.1, 0.1, 0.1) translate3d(1000px, 0, 0);\n    -webkit-animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19);\n    animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19);\n  }\n  60% {\n    opacity: 1;\n    -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(-10px, 0, 0);\n    transform: scale3d(0.475, 0.475, 0.475) translate3d(-10px, 0, 0);\n    -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1);\n    animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1);\n  }\n}\n@keyframes zoomInRight {\n  0% {\n    opacity: 0;\n    -webkit-transform: scale3d(0.1, 0.1, 0.1) translate3d(1000px, 0, 0);\n    transform: scale3d(0.1, 0.1, 0.1) translate3d(1000px, 0, 0);\n    -webkit-animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19);\n    animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19);\n  }\n  60% {\n    opacity: 1;\n    -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(-10px, 0, 0);\n    transform: scale3d(0.475, 0.475, 0.475) translate3d(-10px, 0, 0);\n    -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1);\n    animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1);\n  }\n}\n.zoomInRight {\n  -webkit-animation-name: zoomInRight;\n  animation-name: zoomInRight;\n}\n@-webkit-keyframes zoomInUp {\n  0% {\n    opacity: 0;\n    -webkit-transform: scale3d(0.1, 0.1, 0.1) translate3d(0, 1000px, 0);\n    transform: scale3d(0.1, 0.1, 0.1) translate3d(0, 1000px, 0);\n    -webkit-animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19);\n    animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19);\n  }\n  60% {\n    opacity: 1;\n    -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(0, -60px, 0);\n    transform: scale3d(0.475, 0.475, 0.475) translate3d(0, -60px, 0);\n    -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1);\n    animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1);\n  }\n}\n@keyframes zoomInUp {\n  0% {\n    opacity: 0;\n    -webkit-transform: scale3d(0.1, 0.1, 0.1) translate3d(0, 1000px, 0);\n    transform: scale3d(0.1, 0.1, 0.1) translate3d(0, 1000px, 0);\n    -webkit-animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19);\n    animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19);\n  }\n  60% {\n    opacity: 1;\n    -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(0, -60px, 0);\n    transform: scale3d(0.475, 0.475, 0.475) translate3d(0, -60px, 0);\n    -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1);\n    animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1);\n  }\n}\n.zoomInUp {\n  -webkit-animation-name: zoomInUp;\n  animation-name: zoomInUp;\n}\n@-webkit-keyframes zoomOut {\n  0% {\n    opacity: 1;\n  }\n  50% {\n    opacity: 0;\n    -webkit-transform: scale3d(0.3, 0.3, 0.3);\n    transform: scale3d(0.3, 0.3, 0.3);\n  }\n  100% {\n    opacity: 0;\n  }\n}\n@keyframes zoomOut {\n  0% {\n    opacity: 1;\n  }\n  50% {\n    opacity: 0;\n    -webkit-transform: scale3d(0.3, 0.3, 0.3);\n    transform: scale3d(0.3, 0.3, 0.3);\n  }\n  100% {\n    opacity: 0;\n  }\n}\n.zoomOut {\n  -webkit-animation-name: zoomOut;\n  animation-name: zoomOut;\n}\n@-webkit-keyframes zoomOutDown {\n  40% {\n    opacity: 1;\n    -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(0, -60px, 0);\n    transform: scale3d(0.475, 0.475, 0.475) translate3d(0, -60px, 0);\n    -webkit-animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19);\n    animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19);\n  }\n  100% {\n    opacity: 0;\n    -webkit-transform: scale3d(0.1, 0.1, 0.1) translate3d(0, 2000px, 0);\n    transform: scale3d(0.1, 0.1, 0.1) translate3d(0, 2000px, 0);\n    -webkit-transform-origin: center bottom;\n    transform-origin: center bottom;\n    -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1);\n    animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1);\n  }\n}\n@keyframes zoomOutDown {\n  40% {\n    opacity: 1;\n    -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(0, -60px, 0);\n    transform: scale3d(0.475, 0.475, 0.475) translate3d(0, -60px, 0);\n    -webkit-animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19);\n    animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19);\n  }\n  100% {\n    opacity: 0;\n    -webkit-transform: scale3d(0.1, 0.1, 0.1) translate3d(0, 2000px, 0);\n    transform: scale3d(0.1, 0.1, 0.1) translate3d(0, 2000px, 0);\n    -webkit-transform-origin: center bottom;\n    transform-origin: center bottom;\n    -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1);\n    animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1);\n  }\n}\n.zoomOutDown {\n  -webkit-animation-name: zoomOutDown;\n  animation-name: zoomOutDown;\n}\n@-webkit-keyframes zoomOutLeft {\n  40% {\n    opacity: 1;\n    -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(42px, 0, 0);\n    transform: scale3d(0.475, 0.475, 0.475) translate3d(42px, 0, 0);\n  }\n  100% {\n    opacity: 0;\n    -webkit-transform: scale(0.1) translate3d(-2000px, 0, 0);\n    transform: scale(0.1) translate3d(-2000px, 0, 0);\n    -webkit-transform-origin: left center;\n    transform-origin: left center;\n  }\n}\n@keyframes zoomOutLeft {\n  40% {\n    opacity: 1;\n    -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(42px, 0, 0);\n    transform: scale3d(0.475, 0.475, 0.475) translate3d(42px, 0, 0);\n  }\n  100% {\n    opacity: 0;\n    -webkit-transform: scale(0.1) translate3d(-2000px, 0, 0);\n    transform: scale(0.1) translate3d(-2000px, 0, 0);\n    -webkit-transform-origin: left center;\n    transform-origin: left center;\n  }\n}\n.zoomOutLeft {\n  -webkit-animation-name: zoomOutLeft;\n  animation-name: zoomOutLeft;\n}\n@-webkit-keyframes zoomOutRight {\n  40% {\n    opacity: 1;\n    -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(-42px, 0, 0);\n    transform: scale3d(0.475, 0.475, 0.475) translate3d(-42px, 0, 0);\n  }\n  100% {\n    opacity: 0;\n    -webkit-transform: scale(0.1) translate3d(2000px, 0, 0);\n    transform: scale(0.1) translate3d(2000px, 0, 0);\n    -webkit-transform-origin: right center;\n    transform-origin: right center;\n  }\n}\n@keyframes zoomOutRight {\n  40% {\n    opacity: 1;\n    -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(-42px, 0, 0);\n    transform: scale3d(0.475, 0.475, 0.475) translate3d(-42px, 0, 0);\n  }\n  100% {\n    opacity: 0;\n    -webkit-transform: scale(0.1) translate3d(2000px, 0, 0);\n    transform: scale(0.1) translate3d(2000px, 0, 0);\n    -webkit-transform-origin: right center;\n    transform-origin: right center;\n  }\n}\n.zoomOutRight {\n  -webkit-animation-name: zoomOutRight;\n  animation-name: zoomOutRight;\n}\n@-webkit-keyframes zoomOutUp {\n  40% {\n    opacity: 1;\n    -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(0, 60px, 0);\n    transform: scale3d(0.475, 0.475, 0.475) translate3d(0, 60px, 0);\n    -webkit-animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19);\n    animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19);\n  }\n  100% {\n    opacity: 0;\n    -webkit-transform: scale3d(0.1, 0.1, 0.1) translate3d(0, -2000px, 0);\n    transform: scale3d(0.1, 0.1, 0.1) translate3d(0, -2000px, 0);\n    -webkit-transform-origin: center bottom;\n    transform-origin: center bottom;\n    -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1);\n    animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1);\n  }\n}\n@keyframes zoomOutUp {\n  40% {\n    opacity: 1;\n    -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(0, 60px, 0);\n    transform: scale3d(0.475, 0.475, 0.475) translate3d(0, 60px, 0);\n    -webkit-animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19);\n    animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19);\n  }\n  100% {\n    opacity: 0;\n    -webkit-transform: scale3d(0.1, 0.1, 0.1) translate3d(0, -2000px, 0);\n    transform: scale3d(0.1, 0.1, 0.1) translate3d(0, -2000px, 0);\n    -webkit-transform-origin: center bottom;\n    transform-origin: center bottom;\n    -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1);\n    animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1);\n  }\n}\n.zoomOutUp {\n  -webkit-animation-name: zoomOutUp;\n  animation-name: zoomOutUp;\n}\n@-webkit-keyframes slideInDown {\n  0% {\n    -webkit-transform: translateY(-100%);\n    transform: translateY(-100%);\n    visibility: visible;\n  }\n  100% {\n    -webkit-transform: translateY(0);\n    transform: translateY(0);\n  }\n}\n@keyframes slideInDown {\n  0% {\n    -webkit-transform: translateY(-100%);\n    transform: translateY(-100%);\n    visibility: visible;\n  }\n  100% {\n    -webkit-transform: translateY(0);\n    transform: translateY(0);\n  }\n}\n.slideInDown {\n  -webkit-animation-name: slideInDown;\n  animation-name: slideInDown;\n}\n@-webkit-keyframes slideInLeft {\n  0% {\n    -webkit-transform: translateX(-100%);\n    transform: translateX(-100%);\n    visibility: visible;\n  }\n  100% {\n    -webkit-transform: translateX(0);\n    transform: translateX(0);\n  }\n}\n@keyframes slideInLeft {\n  0% {\n    -webkit-transform: translateX(-100%);\n    transform: translateX(-100%);\n    visibility: visible;\n  }\n  100% {\n    -webkit-transform: translateX(0);\n    transform: translateX(0);\n  }\n}\n.slideInLeft {\n  -webkit-animation-name: slideInLeft;\n  animation-name: slideInLeft;\n}\n@-webkit-keyframes slideInRight {\n  0% {\n    -webkit-transform: translateX(100%);\n    transform: translateX(100%);\n    visibility: visible;\n  }\n  100% {\n    -webkit-transform: translateX(0);\n    transform: translateX(0);\n  }\n}\n@keyframes slideInRight {\n  0% {\n    -webkit-transform: translateX(100%);\n    transform: translateX(100%);\n    visibility: visible;\n  }\n  100% {\n    -webkit-transform: translateX(0);\n    transform: translateX(0);\n  }\n}\n.slideInRight {\n  -webkit-animation-name: slideInRight;\n  animation-name: slideInRight;\n}\n@-webkit-keyframes slideInUp {\n  0% {\n    -webkit-transform: translateY(100%);\n    transform: translateY(100%);\n    visibility: visible;\n  }\n  100% {\n    -webkit-transform: translateY(0);\n    transform: translateY(0);\n  }\n}\n@keyframes slideInUp {\n  0% {\n    -webkit-transform: translateY(100%);\n    transform: translateY(100%);\n    visibility: visible;\n  }\n  100% {\n    -webkit-transform: translateY(0);\n    transform: translateY(0);\n  }\n}\n.slideInUp {\n  -webkit-animation-name: slideInUp;\n  animation-name: slideInUp;\n}\n@-webkit-keyframes slideOutDown {\n  0% {\n    -webkit-transform: translateY(0);\n    transform: translateY(0);\n  }\n  100% {\n    visibility: hidden;\n    -webkit-transform: translateY(100%);\n    transform: translateY(100%);\n  }\n}\n@keyframes slideOutDown {\n  0% {\n    -webkit-transform: translateY(0);\n    transform: translateY(0);\n  }\n  100% {\n    visibility: hidden;\n    -webkit-transform: translateY(100%);\n    transform: translateY(100%);\n  }\n}\n.slideOutDown {\n  -webkit-animation-name: slideOutDown;\n  animation-name: slideOutDown;\n}\n@-webkit-keyframes slideOutLeft {\n  0% {\n    -webkit-transform: translateX(0);\n    transform: translateX(0);\n  }\n  100% {\n    visibility: hidden;\n    -webkit-transform: translateX(-100%);\n    transform: translateX(-100%);\n  }\n}\n@keyframes slideOutLeft {\n  0% {\n    -webkit-transform: translateX(0);\n    transform: translateX(0);\n  }\n  100% {\n    visibility: hidden;\n    -webkit-transform: translateX(-100%);\n    transform: translateX(-100%);\n  }\n}\n.slideOutLeft {\n  -webkit-animation-name: slideOutLeft;\n  animation-name: slideOutLeft;\n}\n@-webkit-keyframes slideOutRight {\n  0% {\n    -webkit-transform: translateX(0);\n    transform: translateX(0);\n  }\n  100% {\n    visibility: hidden;\n    -webkit-transform: translateX(100%);\n    transform: translateX(100%);\n  }\n}\n@keyframes slideOutRight {\n  0% {\n    -webkit-transform: translateX(0);\n    transform: translateX(0);\n  }\n  100% {\n    visibility: hidden;\n    -webkit-transform: translateX(100%);\n    transform: translateX(100%);\n  }\n}\n.slideOutRight {\n  -webkit-animation-name: slideOutRight;\n  animation-name: slideOutRight;\n}\n@-webkit-keyframes slideOutUp {\n  0% {\n    -webkit-transform: translateY(0);\n    transform: translateY(0);\n  }\n  100% {\n    visibility: hidden;\n    -webkit-transform: translateY(-100%);\n    transform: translateY(-100%);\n  }\n}\n@keyframes slideOutUp {\n  0% {\n    -webkit-transform: translateY(0);\n    transform: translateY(0);\n  }\n  100% {\n    visibility: hidden;\n    -webkit-transform: translateY(-100%);\n    transform: translateY(-100%);\n  }\n}\n.slideOutUp {\n  -webkit-animation-name: slideOutUp;\n  animation-name: slideOutUp;\n}\nhtml,\nbody,\ndiv,\nspan,\na,\nli,\ntd,\nth {\n  font-family: '微软雅黑', 'Lato', sans-serif;\n}\nbold {\n  font-family: 'Lato-Bold', sans-serif;\n  font-weight: Bold;\n}\nli,\n.wrappable {\n  white-space: pre;\n  /* CSS 2.0 */\n  white-space: pre-wrap;\n  /* CSS 2.1 */\n  white-space: pre-line;\n  /* CSS 3.0 */\n  white-space: -pre-wrap;\n  /* Opera 4-6 */\n  white-space: -o-pre-wrap;\n  /* Opera 7 */\n  white-space: -moz-pre-wrap;\n  /* Mozilla */\n  white-space: -hp-pre-wrap;\n  /* HP Printers */\n  word-wrap: break-word;\n  /* IE 5+ */\n}\npre.wrappable {\n  white-space: pre;\n  /* CSS 2.0 */\n  white-space: pre-wrap;\n  /* CSS 2.1 */\n  white-space: -pre-wrap;\n  /* Opera 4-6 */\n  white-space: -o-pre-wrap;\n  /* Opera 7 */\n  white-space: -moz-pre-wrap;\n  /* Mozilla */\n  white-space: -hp-pre-wrap;\n  /* HP Printers */\n  word-wrap: break-word;\n  /* IE 5+ */\n}\nhtml {\n  position: relative;\n  min-height: 100%;\n  overflow-x: hidden;\n}\n.btn-group {\n  border-color: #4CAF50;\n}\nbody.full-screen-body-background {\n  background-color: #ffffff;\n}\nbody.top-and-bottom-margins {\n  padding-top: 80px;\n  margin-bottom: 60px;\n}\nbody.no-top-and-bottom-margins {\n  margin: 75px 10px 0px 20px;\n}\nh1,\nh2 {\n  font-weight: 400;\n}\nh1,\nh2,\nh3,\nh4,\nh5,\nh6,\np,\nli {\n  padding-top: 5px;\n  padding-bottom: 5px;\n}\n.alert {\n  margin-top: 20px;\n}\n.thumbnail {\n  background-color: #EEEEEE;\n}\n.fa,\n[class^='ion-'] {\n  margin-right: 5px;\n}\n.fa:hover {\n  text-decoration: none;\n}\n.no-link-underline {\n  text-decoration: none;\n}\n.img-center {\n  margin: 0 auto;\n}\n.btn-cta {\n  font-size: 40px;\n}\n.shadow {\n  white-space: normal;\n  -webkit-box-shadow: 2px 4px 1px rgba(0, 0, 0, 0.3);\n  -moz-box-shadow: 2px 4px 1px rgba(0, 0, 0, 0.3);\n  box-shadow: 2px 4px 1px rgba(0, 0, 0, 0.3);\n}\n.btn-nav {\n  margin-top: 10px;\n}\nul {\n  list-style: none;\n}\n.panel-heading {\n  font-size: 25px;\n}\n.panel-heading > h1 {\n  font-size: 25px;\n  padding: 2px;\n  margin: 2px;\n}\n.navbar-brand {\n  font-size: 26px;\n}\n.navbar > .container {\n  width: auto;\n  padding-left: 0px;\n  padding-right: 0px;\n}\n.nav-height {\n  height: 50px;\n  border: none;\n}\n.landing-icon {\n  height: 200px;\n  width: 200px;\n}\n.completion-icon {\n  font-size: 150px;\n}\n.positive-15 {\n  margin-top: 15px;\n}\n.positive-20 {\n  margin-top: 20px;\n}\n.positive-15-bottom {\n  margin-bottom: 15px;\n}\n.positive-10 {\n  margin-top: 10px;\n}\n.positive-5 {\n  margin-top: 5px;\n}\n.negative-5 {\n  margin-top: -5px;\n}\n.negative-10 {\n  margin-top: -10px;\n}\n.negative-15 {\n  margin-top: -15px;\n}\n.negative-20 {\n  margin-top: -20px;\n}\n.negative-28 {\n  margin-top: -28px;\n}\n.negative-30 {\n  margin-top: -30px;\n}\n.negative-30-bottom {\n  margin-bottom: -30px;\n}\n.negative-35 {\n  margin-top: -35px;\n}\n.negative-55 {\n  margin-top: -55px;\n  margin-bottom: -55px;\n}\n.large-p {\n  font-size: 24px;\n}\n.small-p {\n  font-size: 14px;\n}\n.map-p {\n  font-size: 20px;\n}\n.map-row-numbers {\n  text-align: right;\n  padding-right: 5px;\n  padding-left: 5px;\n}\n.link-table td {\n  font-size: 16px;\n  border-top: none !important;\n}\n@media (min-width: 767px) {\n  .link-table td {\n    font-size: 24px;\n  }\n}\n.capitalize {\n  text-transform: capitalize;\n}\n.text-success {\n  color: #4CAF50;\n}\n.fast-animation {\n  -webkit-animation-duration: 0.5s;\n  animation-duration: 0.5s;\n}\n.disabled {\n  pointer-events: none;\n  cursor: default;\n  color: graytext !important;\n}\n.hidden-element {\n  display: none;\n}\n.nav-logo {\n  height: 40px;\n  margin-top: -10px;\n}\n@media (max-width: 397px) {\n  .nav-logo {\n    height: 30px;\n    margin-top: -5px;\n  }\n}\n@media (max-width: 335px) {\n  .nav-logo {\n    height: 25px;\n    margin-top: -2px;\n  }\n}\n.navbar-right {\n  background-color: #4CAF50;\n  text-align: center;\n}\n@media (min-width: 767px) {\n  .navbar-right {\n    margin-right: 0;\n  }\n}\n@media (max-width: 991px) and (min-width: 767px) {\n  .navbar-right {\n    position: absolute;\n    left: 0;\n    right: 0;\n    margin-right: 0px;\n    white-space: nowrap;\n  }\n}\n.navbar {\n  white-space: nowrap;\n  border: none;\n  line-height: 1;\n}\n@media (min-width: 767px) {\n  .navbar {\n    padding-left: 15px;\n    padding-right: 30px;\n  }\n}\nli.avatar,\nli.avatar > a {\n  padding: 0;\n  margin: 0;\n}\n.thin-progress-bar {\n  height: 8px;\n  margin-top: 3px;\n  margin-bottom: 0px;\n  width: 60%;\n  margin-right: auto;\n  margin-left: auto;\n}\n.panel-body {\n  margin-bottom: -6px;\n}\n.lb-container {\n  padding: 0px;\n}\n.btn-social {\n  width: 250px;\n  margin: auto;\n}\n.btn-link-social {\n  max-width: 400px;\n  margin: auto;\n  margin-bottom: 10px;\n}\n.navbar {\n  background-color: #4CAF50;\n}\na {\n  font-weight: bold;\n}\np {\n  font-size: 14px;\n}\n.map-aside-body p {\n  line-height: 1.8;\n}\n.navbar-nav > li > a {\n  color: #ffffff;\n}\n.navbar-nav > li > a:hover {\n  color: #4CAF50;\n}\n.hug-top {\n  margin-top: -35px;\n  margin-bottom: -10px;\n}\n.nonprofit-landing {\n  font-size: 50px;\n}\n.big-text {\n  font-size: 63px;\n}\n.signup-btn.btn {\n  background-color: #ffac33;\n  background-image: linear-gradient(#ffcc4d, #ffac33);\n  -ms-filter: \"progid:DXImageTransform.Microsoft.gradient(startColorstr=#ffcc4d,  endColorstr=#ffac33,  GradientType=0)\";\n  border-color: #f1a02a;\n  color: #292f33 !important;\n  text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5);\n}\n.signup-btn:hover,\n.signup-btn:focus {\n  background-color: #e99110;\n  background-image: linear-gradient(#ffcc4d, #e99110);\n  -ms-filter: \"progid:DXImageTransform.Microsoft.gradient(startColorstr=#ffcc4d,  endColorstr=#e99110,  GradientType=0)\";\n  border-color: #ec8b11;\n  color: #292f33 !important;\n}\n.signup-btn:active {\n  background-color: #f2a330;\n  background-image: none;\n  box-shadow: inset 0 1px 4px rgba(0, 0, 0, 0.3);\n}\n*,\n*:before,\n*:after {\n  box-sizing: border-box !important;\n}\n.btn-big {\n  font-size: 20px;\n  border-radius: 6px;\n}\n.btn-bigger {\n  font-size: 30px;\n}\n.big-text-field {\n  font-size: 30px;\n  height: 57px;\n  background-color: #ffffff !important;\n}\nh4 {\n  font-size: 22px;\n}\n.no-transition {\n  -webkit-transition: height 0.001s;\n  -moz-transition: height 0.001s;\n  -ms-transition: height 0.001s;\n  -o-transition: height 0.001s;\n  transition: height 0.001s;\n}\n.margin-left-10 {\n  margin-left: 10px;\n}\n@media (max-width: 768px) {\n  .btn-responsive {\n    font-size: 15px;\n    height: 26.5px;\n    padding-top: 1px;\n  }\n}\n@media (max-width: 768px) {\n  .field-responsive {\n    font-size: 15px;\n    height: 26.5px;\n  }\n}\nthead {\n  font-size: 150%;\n}\n.nowrap {\n  white-space: nowrap;\n}\n.big-break {\n  margin-top: 50px;\n  margin-bottom: 50px;\n}\n.profile-picture {\n  height: 50px;\n  width: 50px;\n}\n@media (min-width: 991px) and (max-width: 999px) {\n  .brownie-points-nav {\n    margin-right: -10px;\n  }\n}\n.navbar-nav a {\n  color: #ffffff;\n  font-size: 20px;\n  margin-top: -5px;\n  margin-bottom: -5px;\n}\n.navbar-toggle {\n  color: #ffffff;\n}\n.navbar-toggle:hover,\n.navbar-toggle:focus {\n  color: #4a2b0f;\n}\n.signup-btn-nav {\n  margin-top: -2px !important;\n  padding-top: 10px !important;\n  padding-bottom: 10px !important;\n  margin-right: -12px;\n}\n@media (min-width: 991px) and (max-width: 1010px) {\n  .signup-btn-nav {\n    margin-left: -10px;\n    margin-right: -5px;\n  }\n}\n.public-profile-img {\n  height: 200px;\n  width: 200px;\n  border-radius: 5px;\n}\n.ng-invalid.ng-dirty {\n  border-color: #FA787E;\n}\n.ng-valid.ng-dirty {\n  border-color: #78FA89;\n}\n.flat-top {\n  margin-top: -5px;\n}\n.negative-bottom {\n  margin-bottom: -20px;\n}\n.min-height-1000 {\n  min-height: 1000px;\n}\n.points-on-top {\n  color: #ffffff;\n  font-size: 35px;\n  z-index: 2;\n  width: 60%;\n  margin: 0 auto;\n  position: relative;\n  top: 50%;\n  -webkit-transform: translateY(-50%);\n  transform: translateY(-50%);\n}\n.landing-skill-icon {\n  color: #4CAF50;\n  font-size: 150px;\n}\n.custom-landing-skill-icon {\n  margin-top: -15px;\n  padding-bottom: 15px;\n}\n.black-text {\n  color: #333;\n  font-weight: 400;\n  font-size: 40px;\n}\n.font-awesome-padding {\n  margin-top: 45px;\n  margin-bottom: 20px;\n}\n.background-svg {\n  width: 220px;\n  height: 220px;\n  background-image: url(\"/images/certificate-icon.svg\");\n  background-size: 120%;\n  background-repeat: no-repeat;\n  background-position: center;\n}\n.testimonial-image {\n  border-radius: 5px;\n  height: 200px;\n  width: 200px;\n  color: #009900;\n}\n.testimonial-image-jobs {\n  border-radius: 5px;\n  color: #009900;\n}\n.default-border-radius {\n  border-radius: 5px;\n}\n.height-500 {\n  height: 500px;\n}\n.height-400 {\n  height: 400px;\n}\n.testimonial-copy {\n  text-align: justify;\n  font-size: 18px !important;\n  margin-left: 20px;\n  margin-right: 20px;\n}\n@media (min-width: 991px) and (max-width: 1199px) {\n  .testimonial-copy {\n    height: 150px;\n  }\n}\n@media (min-width: 1200px) {\n  .testimonial-copy {\n    height: 100px;\n  }\n}\n.nonprofit-testimonial-copy {\n  text-align: justify;\n  font-size: 18px !important;\n  margin-left: 20px;\n  margin-right: 20px;\n}\n@media (min-width: 991px) and (max-width: 1199px) {\n  .nonprofit-testimonial-copy {\n    height: 300px !important;\n  }\n}\n@media (min-width: 1200px) {\n  .nonprofit-testimonial-copy {\n    height: 200px !important;\n  }\n}\n.navbar-collapse {\n  border-top: 0;\n}\n.challenge-list-header {\n  background-color: #4CAF50;\n  color: #eeeeee;\n  font-size: 36px;\n  text-align: center;\n  margin-bottom: -30px;\n  border-radius: 5px 5px 0px 0px;\n  padding-left: 50px;\n}\n.closing-x {\n  color: #eeeeee;\n  font-size: 50px;\n  text-align: right;\n}\n.fcc-footer {\n  width: 100%;\n  height: 50px;\n  text-align: center;\n  background-color: #4CAF50;\n  padding: 12px;\n  bottom: 0;\n  left: 0;\n  position: absolute;\n}\n.fcc-footer a {\n  font-size: 20px;\n  color: #eeeeee;\n  margin-left: 0px;\n  margin-right: 0px;\n  padding-left: 10px;\n  padding-right: 10px;\n  padding-top: 14px;\n  padding-bottom: 12px;\n}\n.fcc-footer a:hover {\n  color: #4CAF50;\n  background-color: #eeeeee;\n  text-decoration: none;\n}\n.embed-responsive-twitch-chat {\n  padding-bottom: 117%;\n}\n#directions {\n  text-align: left;\n  font-size: 15px;\n}\n.graph-rect {\n  fill: #ddd !important;\n}\n/**\n * Bonfire styling\n */\nform.code span {\n  font-size: 18px;\n  font-family: \"Ubuntu Mono\";\n  padding-bottom: 0px;\n  margin-bottom: 0px;\n  height: 100%;\n}\n.CodeMirror {\n  line-height: 1 !important;\n}\n.CodeMirror-linenumber {\n  font-size: 18px;\n  font-family: \"Ubuntu Mono\";\n}\n#mainEditorPanel {\n  height: 100%;\n  width: 99%;\n}\n.scroll-locker {\n  overflow-x: hidden;\n  overflow-y: auto;\n}\n#mainEditorPanel .panel-body {\n  padding-bottom: 0px;\n}\ndiv.CodeMirror-scroll {\n  padding-bottom: 30px;\n}\n.test-vertical-center {\n  margin-top: 8px;\n}\n.cm-s-monokai.CodeMirror {\n  border-radius: 5px;\n}\n.courseware-height {\n  min-height: 650px;\n}\n.btn {\n  font-weight: 400;\n  white-space: normal;\n  background: transparent;\n  -webkit-transition: background 0.2s ease-in-out, border 0.2s ease-in-out;\n  -moz-transition: background 0.2s ease-in-out, border 0.2s ease-in-out;\n  -ms-transition: background 0.2s ease-in-out, border 0.2s ease-in-out;\n  -o-transition: background 0.2s ease-in-out, border 0.2s ease-in-out;\n  transition: background 0.2s ease-in-out, border 0.2s ease-in-out;\n}\n.population-table {\n  font-size: 30px;\n  width: 460px;\n  margin: 0 auto;\n  padding: 0;\n}\n.population-table h2 {\n  margin: 0;\n  text-align: left;\n}\n.population-table .tag {\n  width: 165px;\n  display: inline-block;\n}\n.population-table .text-primary {\n  margin-right: 5px;\n}\n@media (max-width: 767px) {\n  .population-table {\n    font-size: 16px;\n    width: 260px;\n  }\n  .population-table .tag {\n    width: 95px;\n  }\n}\n@media (max-width: 991px) {\n  .navbar-header {\n    float: none;\n  }\n  .navbar-toggle {\n    display: block;\n  }\n  .navbar-collapse.collapse {\n    display: none !important;\n  }\n  .navbar-nav {\n    margin-top: 0;\n  }\n  .navbar-nav > li {\n    float: none;\n  }\n  .navbar-nav > li > a {\n    padding-top: 10px;\n    padding-bottom: 10px;\n  }\n  .navbar-text {\n    float: none;\n    margin: 15px 0;\n  }\n  /* since 3.1.0 */\n  .navbar-collapse.collapse.in {\n    display: block !important;\n  }\n  .collapsing {\n    overflow: hidden !important;\n    position: absolute;\n    left: 0;\n    right: 0;\n  }\n}\n.navbar-toggle {\n  width: 80px;\n  padding-left: 0;\n  padding-right: 8px;\n  margin: 7px 2px 7px 0;\n  text-align: left;\n  font-size: 10px;\n}\n.hamburger-text {\n  line-height: 0.75em;\n  margin-top: 10px;\n  font-size: 18px;\n}\n.story-list {\n  padding-bottom: 30px;\n  margin-bottom: 30px;\n}\n.button-spacer {\n  padding: 5px 0;\n}\n.spacer {\n  padding: 15px 0 15px 0;\n}\n.img-news {\n  width: 50px;\n  height: 50px;\n}\n.url-preview {\n  max-width: 250px;\n  max-height: 250px;\n}\n@media (min-width: 768px) {\n  .news-box {\n    margin-top: -40px;\n  }\n}\n@media (max-width: 767px) {\n  .news-box {\n    padding: 5px;\n    border-color: #4A2B0F;\n    border-width: 1px;\n    border-style: solid;\n    border-radius: 5px;\n    width: 100%;\n    float: left;\n  }\n}\n@media (min-width: 768px) {\n  .news-box-search {\n    margin-top: -30px;\n    padding-bottom: 20px;\n  }\n}\n@media (max-width: 767px) {\n  .news-box-search {\n    padding: 5px;\n    border-color: #4A2B0F;\n    border-width: 1px;\n    border-style: solid;\n    border-radius: 5px;\n    width: 100%;\n    float: left;\n  }\n}\n.story-headline {\n  font-size: 20px;\n  margin-left: 14px;\n  margin-top: -5px;\n}\n.landing-heading {\n  font-size: 50px !important;\n  font-family: Georgia;\n}\n.mobile-story-headline {\n  font-size: 20px;\n}\n.story-byline {\n  margin-top: 5px;\n  font-size: 14px;\n}\n.media-stories {\n  margin-left: 20px;\n}\nhr {\n  border: 0;\n  height: 1px;\n  background-image: linear-gradient(to right, rgba(0, 0, 0, 0), rgba(0, 0, 0, 0.75), rgba(0, 0, 0, 0));\n}\n.big-spacer {\n  padding: 30px 0 30px 0;\n}\n#reply-to-main-post,\n#upvote {\n  cursor: pointer;\n}\n.btn-no-shadow {\n  -webkit-box-shadow: 0px 0px 0px rgba(0, 0, 0, 0);\n  -moz-box-shadow: 0px 0px 0px rgba(0, 0, 0, 0);\n  box-shadow: 0px 0px 0px rgba(0, 0, 0, 0);\n}\n.dotted-underline {\n  border-bottom: dashed 1px #457E86;\n}\n.d3-centered {\n  width: 771px;\n  margin: 0 auto;\n}\n.cal-heatmap-container {\n  background-color: #ffffff;\n}\n.interested-camper-image {\n  height: 50px;\n  width: 50px;\n  padding: 5px;\n}\n.mobile-story-image {\n  border-radius: 5px;\n  width: 100%;\n}\n@media (max-width: 768px) {\n  .mobile-story-image {\n    margin-right: 5px;\n  }\n}\n.alert a {\n  text-decoration: underline;\n}\n.step-text {\n  line-height: 120%;\n  padding-bottom: 10px;\n}\n.faded {\n  opacity: 0.5;\n}\n.slightly-faded {\n  opacity: 0.75;\n}\n.padded-ionic-icon {\n  padding-top: 5px;\n}\n.checklist-element {\n  margin-left: -60px;\n  margin-right: -20px;\n}\n.profile-social-icons {\n  margin-left: 8px;\n}\n.border-radius-5 {\n  border-radius: 5px;\n}\ncode {\n  padding: 0;\n}\n@media only screen and (min-width: 993px) {\n  .iframe-scroll {\n    z-index: 1;\n  }\n}\n@media only screen and (max-width: 992px) {\n  .iframe-scroll {\n    height: auto;\n    overflow: auto;\n  }\n}\n.chart rect {\n  fill: steelblue;\n}\n.chart text {\n  font-size: 14px;\n  text-anchor: end;\n}\n.axis path,\n.axis line {\n  fill: none;\n  stroke: #121401;\n  stroke-width: 2px;\n  shape-rendering: crispEdges;\n}\n.gitter-chat-embed {\n  z-index: 20000 !important;\n}\n/* :not(:required) hides this rule from IE9 and below */\n.inner-circles-loader:not(:required) {\n  -moz-transform: translate3d(0, 0, 0);\n  -ms-transform: translate3d(0, 0, 0);\n  -webkit-transform: translate3d(0, 0, 0);\n  transform: translate3d(0, 0, 0);\n  position: relative;\n  display: inline-block;\n  width: 125px;\n  height: 125px;\n  background: rgba(25, 165, 152, 0.5);\n  border-radius: 50%;\n  overflow: hidden;\n  text-indent: -9999px;\n  margin-top: 10%;\n  /* Hides inner circles outside base circle at safari */\n  -webkit-mask-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAIAAACQd1PeAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAA5JREFUeNpiYGBgAAgwAAAEAAGbA+oJAAAAAElFTkSuQmCC);\n}\n.inner-circles-loader:not(:required):before,\n.inner-circles-loader:not(:required):after {\n  content: '';\n  position: absolute;\n  top: 0;\n  display: inline-block;\n  width: 125px;\n  height: 125px;\n  border-radius: 50%;\n}\n.inner-circles-loader:not(:required):before {\n  -moz-animation: inner-circles-loader 3s infinite;\n  -webkit-animation: inner-circles-loader 3s infinite;\n  animation: inner-circles-loader 3s infinite;\n  -moz-transform-origin: 0 50%;\n  -ms-transform-origin: 0 50%;\n  -webkit-transform-origin: 0 50%;\n  transform-origin: 0 50%;\n  left: 0;\n  background: #c7efcf;\n}\n.inner-circles-loader:not(:required):after {\n  -moz-animation: inner-circles-loader 3s 0.2s reverse infinite;\n  -webkit-animation: inner-circles-loader 3s 0.2s reverse infinite;\n  animation: inner-circles-loader 3s 0.2s reverse infinite;\n  -moz-transform-origin: 100% 50%;\n  -ms-transform-origin: 100% 50%;\n  -webkit-transform-origin: 100% 50%;\n  transform-origin: 100% 50%;\n  right: 0;\n  background: #eef5db;\n}\n@-moz-keyframes inner-circles-loader {\n  0% {\n    -moz-transform: rotate(0deg);\n    transform: rotate(0deg);\n  }\n  50% {\n    -moz-transform: rotate(360deg);\n    transform: rotate(360deg);\n  }\n  100% {\n    -moz-transform: rotate(0deg);\n    transform: rotate(0deg);\n  }\n}\n@-webkit-keyframes inner-circles-loader {\n  0% {\n    -webkit-transform: rotate(0deg);\n    transform: rotate(0deg);\n  }\n  50% {\n    -webkit-transform: rotate(360deg);\n    transform: rotate(360deg);\n  }\n  100% {\n    -webkit-transform: rotate(0deg);\n    transform: rotate(0deg);\n  }\n}\n@keyframes inner-circles-loader {\n  0% {\n    -moz-transform: rotate(0deg);\n    -ms-transform: rotate(0deg);\n    -webkit-transform: rotate(0deg);\n    transform: rotate(0deg);\n  }\n  50% {\n    -moz-transform: rotate(360deg);\n    -ms-transform: rotate(360deg);\n    -webkit-transform: rotate(360deg);\n    transform: rotate(360deg);\n  }\n  100% {\n    -moz-transform: rotate(0deg);\n    -ms-transform: rotate(0deg);\n    -webkit-transform: rotate(0deg);\n    transform: rotate(0deg);\n  }\n}\n.chat-embed-main-title {\n  display: flex;\n  flex-grow: 1;\n  padding-left: 31px;\n  padding-top: 7px;\n}\n.gitter-chat-embed {\n  z-index: 100;\n  position: fixed;\n  top: 0;\n  left: 60%;\n  bottom: 0;\n  right: 0;\n  display: flex;\n  flex-direction: row;\n  transition: transform 0.3s cubic-bezier(0.16, 0.22, 0.22, 1.7);\n}\n.gitter-chat-embed.is-collapsed:not(.is-loading) {\n  transform: translateX(110%);\n}\n.jobs-list-highlight {\n  background-color: #ffc;\n}\na.jobs-list-highlight:hover {\n  background-color: #ffc;\n}\n.jobs-list {\n  cursor: pointer;\n  cursor: hand;\n}\n.jobs-checkbox-spacer input[type=\"checkbox\"] {\n  margin-left: -23px;\n}\n.challenge-step-description {\n  font-size: 1.5em;\n}\n.challenge-step-counter {\n  font-size: 20px;\n  line-height: 44px;\n}\n.challenge-instructions-title {\n  margin-top: 0;\n}\n.challenge-instructions-title i {\n  margin-left: 5px;\n  line-height: 20px;\n}\n.challenge-instructions {\n  margin-bottom: 5px;\n}\n.challenge-instructions h4 {\n  margin-bottom: 0;\n}\n.challenge-instructions blockquote {\n  font-size: 90%;\n  font-family: Menlo, Monaco, Consolas, \"Courier New\", monospace;\n  color: #c7254e;\n  background-color: #fffbe5;\n  border-radius: 4px;\n  border: 1px solid #ccc;\n  white-space: pre;\n  padding: 5px 10px;\n  margin-bottom: 10px;\n  margin-top: -10px;\n  overflow: auto;\n}\n.challenge-instructions dfn {\n  font-family: Menlo, Monaco, Consolas, \"Courier New\", monospace;\n  color: #c7254e;\n  background-color: #f9f2f4;\n  border-radius: 4px;\n}\n.challenge-instructions a,\n.challenge-instructions #MDN-links a {\n  color: #31708f;\n}\n.challenge-instructions a::after,\n.challenge-instructions #MDN-links a::after {\n  font-size: 70%;\n  font-family: FontAwesome;\n  content: \" \\f08e\";\n}\n.challenge-instructions ol {\n  font-size: 16px;\n}\n#testSuite {\n  margin-top: 10px;\n}\n#testSuite > div > .row {\n  margin: 0!important;\n}\n.test-output {\n  font-size: 15px;\n  font-family: \"Ubuntu Mono\";\n  margin-top: 8px;\n  line-height: 20px;\n}\n.grayed-out-test-output {\n  color: #777777;\n}\n.big-error-icon {\n  font-size: 30px;\n  color: #d9534f;\n  top: 50%;\n}\n.big-success-icon {\n  font-size: 30px;\n  color: #4CAF50;\n}\niframe.iphone {\n  border: none;\n}\n@media (min-width: 992px) {\n  iframe.iphone {\n    width: 280px;\n    height: 500px;\n    position: absolute;\n    top: 70px;\n    right: 35px;\n    overflow-y: scroll;\n  }\n}\n@media (max-width: 991px) {\n  iframe.iphone {\n    width: 100%;\n    border-radius: 5px;\n    overflow-y: visible;\n    height: 500px;\n  }\n}\n@media (min-width: 1200px) and (max-width: 1250px) {\n  iframe.iphone {\n    right: 22px;\n  }\n}\n.iphone-position {\n  position: absolute;\n  top: -50px;\n  z-index: -1;\n  right: -195px;\n}\n@media (min-width: 1200px) and (max-width: 1250px) {\n  .iphone-position {\n    right: -207px;\n  }\n}\n.toast-title {\n  font-weight: bold;\n}\n.toast-message {\n  -ms-word-wrap: break-word;\n  word-wrap: break-word;\n}\n.toast-message a,\n.toast-message label {\n  color: #FFFFFF;\n}\n.toast-message a:hover {\n  color: #CCCCCC;\n  text-decoration: none;\n}\n.toast-close-button {\n  position: relative;\n  right: -0.3em;\n  top: -0.3em;\n  float: right;\n  font-size: 20px;\n  font-weight: bold;\n  color: #FFFFFF;\n  -webkit-text-shadow: 0 1px 0 #ffffff;\n  text-shadow: 0 1px 0 #ffffff;\n  opacity: 0.8;\n  -ms-filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=80);\n  filter: alpha(opacity=80);\n}\n.toast-close-button:hover,\n.toast-close-button:focus {\n  color: #000000;\n  text-decoration: none;\n  cursor: pointer;\n  opacity: 0.4;\n  -ms-filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=40);\n  filter: alpha(opacity=40);\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=\"#\"`.*/\nbutton.toast-close-button {\n  padding: 0;\n  cursor: pointer;\n  background: transparent;\n  border: 0;\n  -webkit-appearance: none;\n}\n.toast-top-center {\n  top: 0;\n  right: 0;\n  width: 100%;\n}\n.toast-bottom-center {\n  bottom: 0;\n  right: 0;\n  width: 100%;\n}\n.toast-top-full-width {\n  top: 0;\n  right: 0;\n  width: 100%;\n}\n.toast-bottom-full-width {\n  bottom: 0;\n  right: 0;\n  width: 100%;\n}\n.toast-top-left {\n  top: 12px;\n  left: 12px;\n}\n.toast-top-right {\n  top: 12px;\n  right: 12px;\n}\n.toast-bottom-right {\n  right: 12px;\n  bottom: 12px;\n}\n.toast-bottom-left {\n  bottom: 12px;\n  left: 12px;\n}\n#toast-container {\n  position: fixed;\n  z-index: 999999;\n  pointer-events: none;\n  /*overrides*/\n}\n#toast-container * {\n  -moz-box-sizing: border-box;\n  -webkit-box-sizing: border-box;\n  box-sizing: border-box;\n}\n#toast-container > div {\n  position: relative;\n  pointer-events: auto;\n  overflow: hidden;\n  margin: 0 0 6px;\n  padding: 15px 15px 15px 50px;\n  width: 300px;\n  -moz-border-radius: 3px 3px 3px 3px;\n  -webkit-border-radius: 3px 3px 3px 3px;\n  border-radius: 3px 3px 3px 3px;\n  background-position: 15px center;\n  background-repeat: no-repeat;\n  -moz-box-shadow: 0 0 12px #999999;\n  -webkit-box-shadow: 0 0 12px #999999;\n  box-shadow: 0 0 12px #999999;\n  color: #FFFFFF;\n  opacity: 0.8;\n  -ms-filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=80);\n  filter: alpha(opacity=80);\n}\n#toast-container > :hover {\n  -moz-box-shadow: 0 0 12px #000000;\n  -webkit-box-shadow: 0 0 12px #000000;\n  box-shadow: 0 0 12px #000000;\n  opacity: 1;\n  -ms-filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=100);\n  filter: alpha(opacity=100);\n  cursor: pointer;\n}\n#toast-container > .toast-info {\n  background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAGwSURBVEhLtZa9SgNBEMc9sUxxRcoUKSzSWIhXpFMhhYWFhaBg4yPYiWCXZxBLERsLRS3EQkEfwCKdjWJAwSKCgoKCcudv4O5YLrt7EzgXhiU3/4+b2ckmwVjJSpKkQ6wAi4gwhT+z3wRBcEz0yjSseUTrcRyfsHsXmD0AmbHOC9Ii8VImnuXBPglHpQ5wwSVM7sNnTG7Za4JwDdCjxyAiH3nyA2mtaTJufiDZ5dCaqlItILh1NHatfN5skvjx9Z38m69CgzuXmZgVrPIGE763Jx9qKsRozWYw6xOHdER+nn2KkO+Bb+UV5CBN6WC6QtBgbRVozrahAbmm6HtUsgtPC19tFdxXZYBOfkbmFJ1VaHA1VAHjd0pp70oTZzvR+EVrx2Ygfdsq6eu55BHYR8hlcki+n+kERUFG8BrA0BwjeAv2M8WLQBtcy+SD6fNsmnB3AlBLrgTtVW1c2QN4bVWLATaIS60J2Du5y1TiJgjSBvFVZgTmwCU+dAZFoPxGEEs8nyHC9Bwe2GvEJv2WXZb0vjdyFT4Cxk3e/kIqlOGoVLwwPevpYHT+00T+hWwXDf4AJAOUqWcDhbwAAAAASUVORK5CYII=\") !important;\n}\n#toast-container > .toast-error {\n  background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAHOSURBVEhLrZa/SgNBEMZzh0WKCClSCKaIYOED+AAKeQQLG8HWztLCImBrYadgIdY+gIKNYkBFSwu7CAoqCgkkoGBI/E28PdbLZmeDLgzZzcx83/zZ2SSXC1j9fr+I1Hq93g2yxH4iwM1vkoBWAdxCmpzTxfkN2RcyZNaHFIkSo10+8kgxkXIURV5HGxTmFuc75B2RfQkpxHG8aAgaAFa0tAHqYFfQ7Iwe2yhODk8+J4C7yAoRTWI3w/4klGRgR4lO7Rpn9+gvMyWp+uxFh8+H+ARlgN1nJuJuQAYvNkEnwGFck18Er4q3egEc/oO+mhLdKgRyhdNFiacC0rlOCbhNVz4H9FnAYgDBvU3QIioZlJFLJtsoHYRDfiZoUyIxqCtRpVlANq0EU4dApjrtgezPFad5S19Wgjkc0hNVnuF4HjVA6C7QrSIbylB+oZe3aHgBsqlNqKYH48jXyJKMuAbiyVJ8KzaB3eRc0pg9VwQ4niFryI68qiOi3AbjwdsfnAtk0bCjTLJKr6mrD9g8iq/S/B81hguOMlQTnVyG40wAcjnmgsCNESDrjme7wfftP4P7SP4N3CJZdvzoNyGq2c/HWOXJGsvVg+RA/k2MC/wN6I2YA2Pt8GkAAAAASUVORK5CYII=\") !important;\n}\n#toast-container > .toast-success {\n  background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAADsSURBVEhLY2AYBfQMgf///3P8+/evAIgvA/FsIF+BavYDDWMBGroaSMMBiE8VC7AZDrIFaMFnii3AZTjUgsUUWUDA8OdAH6iQbQEhw4HyGsPEcKBXBIC4ARhex4G4BsjmweU1soIFaGg/WtoFZRIZdEvIMhxkCCjXIVsATV6gFGACs4Rsw0EGgIIH3QJYJgHSARQZDrWAB+jawzgs+Q2UO49D7jnRSRGoEFRILcdmEMWGI0cm0JJ2QpYA1RDvcmzJEWhABhD/pqrL0S0CWuABKgnRki9lLseS7g2AlqwHWQSKH4oKLrILpRGhEQCw2LiRUIa4lwAAAABJRU5ErkJggg==\") !important;\n}\n#toast-container > .toast-warning {\n  background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAGYSURBVEhL5ZSvTsNQFMbXZGICMYGYmJhAQIJAICYQPAACiSDB8AiICQQJT4CqQEwgJvYASAQCiZiYmJhAIBATCARJy+9rTsldd8sKu1M0+dLb057v6/lbq/2rK0mS/TRNj9cWNAKPYIJII7gIxCcQ51cvqID+GIEX8ASG4B1bK5gIZFeQfoJdEXOfgX4QAQg7kH2A65yQ87lyxb27sggkAzAuFhbbg1K2kgCkB1bVwyIR9m2L7PRPIhDUIXgGtyKw575yz3lTNs6X4JXnjV+LKM/m3MydnTbtOKIjtz6VhCBq4vSm3ncdrD2lk0VgUXSVKjVDJXJzijW1RQdsU7F77He8u68koNZTz8Oz5yGa6J3H3lZ0xYgXBK2QymlWWA+RWnYhskLBv2vmE+hBMCtbA7KX5drWyRT/2JsqZ2IvfB9Y4bWDNMFbJRFmC9E74SoS0CqulwjkC0+5bpcV1CZ8NMej4pjy0U+doDQsGyo1hzVJttIjhQ7GnBtRFN1UarUlH8F3xict+HY07rEzoUGPlWcjRFRr4/gChZgc3ZL2d8oAAAAASUVORK5CYII=\") !important;\n}\n#toast-container.toast-top-center > div,\n#toast-container.toast-bottom-center > div {\n  width: 300px;\n  margin-left: auto;\n  margin-right: auto;\n}\n#toast-container.toast-top-full-width > div,\n#toast-container.toast-bottom-full-width > div {\n  width: 96%;\n  margin-left: auto;\n  margin-right: auto;\n}\n.toast {\n  background-color: #030303;\n}\n.toast-success {\n  background-color: #51A351;\n}\n.toast-error {\n  background-color: #BD362F;\n}\n.toast-info {\n  background-color: #2F96B4;\n}\n.toast-warning {\n  background-color: #F89406;\n}\n.toast-progress {\n  position: absolute;\n  left: 0;\n  bottom: 0;\n  height: 4px;\n  background-color: #000000;\n  opacity: 0.4;\n  -ms-filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=40);\n  filter: alpha(opacity=40);\n}\n/*Responsive Design*/\n@media all and (max-width: 240px) {\n  #toast-container > div {\n    padding: 8px 8px 8px 50px;\n    width: 11em;\n  }\n  #toast-container .toast-close-button {\n    right: -0.2em;\n    top: -0.2em;\n  }\n}\n@media all and (min-width: 241px) and (max-width: 480px) {\n  #toast-container > div {\n    padding: 8px 8px 8px 50px;\n    width: 18em;\n  }\n  #toast-container .toast-close-button {\n    right: -0.2em;\n    top: -0.2em;\n  }\n}\n@media all and (min-width: 481px) and (max-width: 768px) {\n  #toast-container > div {\n    padding: 15px 15px 15px 50px;\n    width: 25em;\n  }\n}\n/*\n * based off of https://github.com/gitterHQ/sidecar\n * license: MIT\n */\n.map-aside {\n  width: 500px;\n  z-index: 20000;\n  position: fixed;\n  top: 0;\n  bottom: 0;\n  right: 0;\n  display: -webkit-flex;\n  display: flex;\n  -webkit-flex-direction: row;\n  flex-direction: row;\n  background-color: #ffffff;\n  border-left: 1px solid #ddd;\n  box-shadow: -12px 0 18px 0 rgba(50, 50, 50, 0.1);\n  transition: transform 0.3s cubic-bezier(0.16, 0.22, 0.22, 1.7);\n  /* Add some \"extension\" so that there isn't a gap\n     * when we translate(via animation) more than 100% */\n}\n.map-aside.is-collapsed:not(.is-loading) {\n  -webkit-transform: translateX(110%);\n  transform: translateX(110%);\n}\n.map-aside:after {\n  content: '';\n  z-index: -1;\n  position: absolute;\n  top: 0;\n  left: 100%;\n  bottom: 0;\n  right: -100%;\n  background-color: #ffffff;\n}\n.map-aside iframe {\n  width: 100%;\n  height: 100%;\n}\n.map-aside-action-bar {\n  position: absolute;\n  top: 0;\n  right: 0;\n  display: -webkit-flex;\n  display: flex;\n  justify-content: flex-end;\n  padding-bottom: 5px;\n  padding-right: 10px;\n  padding-top: 5px;\n  z-index: 100;\n}\n.map-fixed-header {\n  position: fixed;\n  background: white;\n  padding-top: 5px;\n  width: 100%;\n  z-index: 1;\n  left: 0;\n  top: 0;\n}\n@media (max-width: 720px) {\n  .map-fixed-header {\n    padding-top: 30px;\n  }\n}\n.map-fixed-header p {\n  margin: 5px 0 20px;\n}\n@media (max-width: 720px) {\n  .map-fixed-header p {\n    margin-bottom: 10px;\n  }\n}\n.map-fixed-header hr {\n  margin: 30px 0;\n}\n@media (max-width: 720px) {\n  .map-fixed-header hr {\n    margin: 25px 0;\n  }\n}\n.map-fixed-header .flashMessage {\n  position: fixed;\n  margin: 0 auto;\n  z-index: 2;\n  top: 160px;\n  width: 100%;\n}\n.map-buttons {\n  margin-top: -10px;\n}\n.map-buttons button,\n.map-buttons .input-group {\n  width: 300px;\n}\n.map-buttons .input-group {\n  margin-top: 15px;\n  margin-left: auto;\n  margin-right: auto;\n}\n#map-filter {\n  background: #fff;\n  border-color: darkgreen;\n}\n.input-group-addon {\n  width: 40px;\n  color: darkgreen;\n  background: #fff;\n  border-color: darkgreen;\n}\n.input-group-addon.filled {\n  background: darkgreen;\n  border-color: #000d00;\n  color: #fff;\n  cursor: pointer;\n}\n.input-group-addon .fa {\n  position: absolute;\n  top: 50%;\n  -webkit-transform: translateY(-50%);\n  transform: translateY(-50%);\n  right: 10px;\n}\n.mapWrapper {\n  position: absolute;\n  display: block;\n  height: 100%;\n  width: 100%;\n}\n.map-accordion {\n  width: 700px;\n  margin: 155px auto 0;\n  position: relative;\n}\n.map-accordion #nested {\n  margin: 0 10px;\n}\n@media (max-width: 400px) {\n  .map-accordion #nested {\n    margin: 0;\n  }\n}\n.map-accordion a:focus {\n  text-decoration: none;\n  color: darkgreen;\n}\n.map-accordion a:focus:hover {\n  text-decoration: underline;\n  color: #001800;\n}\n.map-accordion h2 > a {\n  width: 100%;\n  display: block;\n  background: #efefef;\n  padding: 10px 0;\n  padding-left: 50px;\n  padding-right: 20px;\n}\n.map-accordion h3 {\n  margin: 15px 0;\n  padding: 0;\n}\n.map-accordion h3:first-child {\n  margin-top: 25px;\n}\n.map-accordion h3 > a {\n  padding-left: 40px;\n  padding-bottom: 10px;\n  display: block;\n  max-width: 535px;\n}\n.map-accordion div.chapterBlock :before {\n  margin-right: 15px;\n}\n.map-accordion div.chapterBlock p {\n  text-indent: -15px;\n  margin-left: 60px;\n  padding-right: 20px;\n}\n@media (max-width: 400px) {\n  .map-accordion div.chapterBlock p {\n    margin-left: 30px;\n  }\n}\n.map-accordion .challengeBlockDescription {\n  margin: 0;\n  margin-top: -10px;\n  padding: 0 15px 23px 30px;\n}\n.map-accordion span.no-link-underline {\n  position: absolute;\n  margin-left: -30px;\n  color: #666;\n}\n.map-accordion div > div:last-child {\n  margin-bottom: 30px;\n}\n.challengeBlockTime {\n  font-size: 18px;\n  color: #BBBBBB;\n  display: block;\n  margin-left: 40px;\n  margin-bottom: 20px;\n}\n@media (min-width: 721px) {\n  .challengeBlockTime {\n    margin-right: 20px;\n    margin-top: -30px;\n    float: right;\n  }\n}\n@media (max-width: 720px) {\n  .map-accordion {\n    left: 0;\n    right: 0;\n    width: 100%;\n    top: 195px;\n    bottom: 0;\n    margin: 0;\n    position: absolute;\n    overflow-x: hidden;\n    overflow-y: auto;\n    -webkit-overflow-scrolling: touch;\n  }\n  .map-accordion h2 {\n    margin: 15px 0;\n    padding: 0;\n  }\n  .map-accordion h2:first-of-type {\n    margin-top: 0;\n  }\n  .map-accordion h2 > a {\n    padding: 10px 0;\n    padding-left: 50px;\n    padding-right: 20px;\n    font-size: 20px;\n  }\n  .map-accordion h3 {\n    margin: 10px 0;\n    padding: 0;\n  }\n  .map-accordion h3 > a {\n    clear: both;\n    font-size: 20px;\n  }\n}\n.map-aside-action-item {\n  display: -webkit-flex;\n  display: flex;\n  /* main axis */\n  justify-content: center;\n  /* cross axis */\n  align-items: center;\n  width: 40px;\n  height: 40px;\n  padding-left: 0;\n  padding-right: 0;\n  opacity: 0.65;\n  background: none;\n  background-position: center center;\n  background-repeat: no-repeat;\n  background-size: 22px 22px;\n  border: 0;\n  outline: none;\n  cursor: pointer;\n  cursor: hand;\n  transition: all 0.2s ease;\n}\n.map-aside-action-item:hover,\n.map-aside-action-item:focus {\n  opacity: 1;\n}\n.map-aside-action-item:active {\n  filter: hue-rotate(80deg) saturate(150);\n}\n#noneFound {\n  display: none;\n  margin: 60px 30px 0;\n  font-size: 30px;\n  text-align: center;\n  color: darkgreen;\n}\n#noneFound .fa {\n  display: block;\n  font-size: 300px;\n}\n.map-aside-action-pop-out {\n  margin-right: -4px;\n  background-image: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMDAgMTcxLjQyOSIgZmlsbD0iIzNhMzEzMyI+PHBhdGggZD0iTTE1Ny4xNDMsMTAzLjU3MXYzNS43MTRjMCw4Ljg1NC0zLjE0NCwxNi40MjYtOS40MzEsMjIuNzEzcy0xMy44NTgsOS40MzEtMjIuNzEyLDkuNDMxSDMyLjE0MyBjLTguODU0LDAtMTYuNDI1LTMuMTQ0LTIyLjcxMi05LjQzMVMwLDE0OC4xNCwwLDEzOS4yODVWNDYuNDI5YzAtOC44NTQsMy4xNDQtMTYuNDI1LDkuNDMxLTIyLjcxMiBjNi4yODctNi4yODcsMTMuODU4LTkuNDMxLDIyLjcxMi05LjQzMWg3OC41NzJjMS4wNDEsMCwxLjg5NiwwLjMzNSwyLjU2NiwxLjAwNGMwLjY3LDAuNjcsMS4wMDQsMS41MjUsMS4wMDQsMi41NjdWMjUgYzAsMS4wNDItMC4zMzQsMS44OTctMS4wMDQsMi41NjdjLTAuNjcsMC42Ny0xLjUyNSwxLjAwNC0yLjU2NiwxLjAwNEgzMi4xNDNjLTQuOTExLDAtOS4xMTUsMS43NDktMTIuNjEyLDUuMjQ2IHMtNS4yNDYsNy43MDEtNS4yNDYsMTIuNjEydjkyLjg1NmMwLDQuOTExLDEuNzQ5LDkuMTE1LDUuMjQ2LDEyLjYxMnM3LjcwMSw1LjI0NSwxMi42MTIsNS4yNDVIMTI1YzQuOTEsMCw5LjExNS0xLjc0OCwxMi42MTEtNS4yNDUgYzMuNDk3LTMuNDk3LDUuMjQ2LTcuNzAxLDUuMjQ2LTEyLjYxMnYtMzUuNzE0YzAtMS4wNDIsMC4zMzQtMS44OTcsMS4wMDQtMi41NjdjMC42Ny0wLjY2OSwxLjUyNS0xLjAwNCwyLjU2Ny0xLjAwNGg3LjE0MyBjMS4wNDIsMCwxLjg5NywwLjMzNSwyLjU2NywxLjAwNEMxNTYuODA5LDEwMS42NzQsMTU3LjE0MywxMDIuNTI5LDE1Ny4xNDMsMTAzLjU3MXogTTIwMCw3LjE0M3Y1Ny4xNDMgYzAsMS45MzUtMC43MDcsMy42MDktMi4xMjEsNS4wMjJjLTEuNDEzLDEuNDE0LTMuMDg4LDIuMTIxLTUuMDIxLDIuMTIxYy0xLjkzNSwwLTMuNjA5LTAuNzA3LTUuMDIyLTIuMTIxbC0xOS42NDQtMTkuNjQzIGwtNzIuNzY3LDcyLjc2OWMtMC43NDQsMC43NDQtMS42LDEuMTE1LTIuNTY3LDEuMTE1cy0xLjgyMy0wLjM3MS0yLjU2Ny0xLjExNUw3Ny41NjcsMTA5LjcxYy0wLjc0NC0wLjc0NC0xLjExNi0xLjYtMS4xMTYtMi41NjcgYzAtMC45NjcsMC4zNzItMS44MjIsMS4xMTYtMi41NjZsNzIuNzY4LTcyLjc2OGwtMTkuNjQ0LTE5LjY0M2MtMS40MTMtMS40MTQtMi4xMi0zLjA4OC0yLjEyLTUuMDIyYzAtMS45MzUsMC43MDctMy42MDksMi4xMi01LjAyMiBDMTMyLjEwNSwwLjcwNywxMzMuNzc5LDAsMTM1LjcxNSwwaDU3LjE0M2MxLjkzNCwwLDMuNjA4LDAuNzA3LDUuMDIxLDIuMTIxQzE5OS4yOTMsMy41MzQsMjAwLDUuMjA4LDIwMCw3LjE0M3oiLz48L3N2Zz4=);\n}\n.map-aside-action-collapse {\n  background-image: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAxNzEuNDI5IDE3MS40MjkiIGZpbGw9IiMzYTMxMzMiPjxwYXRoIGQ9Ik0xMjIuNDMzLDEwNi4xMzhsLTE2LjI5NSwxNi4yOTVjLTAuNzQ0LDAuNzQ0LTEuNiwxLjExNi0yLjU2NiwxLjExNmMtMC45NjgsMC0xLjgyMy0wLjM3Mi0yLjU2Ny0xLjExNmwtMTUuMjktMTUuMjkgbC0xNS4yOSwxNS4yOWMtMC43NDQsMC43NDQtMS42LDEuMTE2LTIuNTY3LDEuMTE2cy0xLjgyMy0wLjM3Mi0yLjU2Ny0xLjExNmwtMTYuMjk0LTE2LjI5NWMtMC43NDQtMC43NDQtMS4xMTYtMS42LTEuMTE2LTIuNTY2IGMwLTAuOTY4LDAuMzcyLTEuODIzLDEuMTE2LTIuNTY3bDE1LjI5LTE1LjI5bC0xNS4yOS0xNS4yOWMtMC43NDQtMC43NDQtMS4xMTYtMS42LTEuMTE2LTIuNTY3czAuMzcyLTEuODIzLDEuMTE2LTIuNTY3IEw2NS4yOSw0OC45OTZjMC43NDQtMC43NDQsMS42LTEuMTE2LDIuNTY3LTEuMTE2czEuODIzLDAuMzcyLDIuNTY3LDEuMTE2bDE1LjI5LDE1LjI5bDE1LjI5LTE1LjI5IGMwLjc0NC0wLjc0NCwxLjYtMS4xMTYsMi41NjctMS4xMTZjMC45NjcsMCwxLjgyMiwwLjM3MiwyLjU2NiwxLjExNmwxNi4yOTUsMTYuMjk0YzAuNzQ0LDAuNzQ0LDEuMTE2LDEuNiwxLjExNiwyLjU2NyBzLTAuMzcyLDEuODIzLTEuMTE2LDIuNTY3bC0xNS4yOSwxNS4yOWwxNS4yOSwxNS4yOWMwLjc0NCwwLjc0NCwxLjExNiwxLjYsMS4xMTYsMi41NjcgQzEyMy41NDksMTA0LjUzOSwxMjMuMTc3LDEwNS4zOTQsMTIyLjQzMywxMDYuMTM4eiBNMTQ2LjQyOSw4NS43MTRjMC0xMS4wMTItMi43MTctMjEuMTY4LTguMTQ4LTMwLjQ2OSBzLTEyLjc5Ny0xNi42NjctMjIuMDk4LTIyLjA5OFM5Ni43MjYsMjUsODUuNzE0LDI1cy0yMS4xNjgsMi43MTYtMzAuNDY5LDguMTQ3UzM4LjU3OSw0NS45NDUsMzMuMTQ3LDU1LjI0NlMyNSw3NC43MDMsMjUsODUuNzE0IHMyLjcxNiwyMS4xNjgsOC4xNDcsMzAuNDY5czEyLjc5NywxNi42NjYsMjIuMDk4LDIyLjA5OHMxOS40NTcsOC4xNDgsMzAuNDY5LDguMTQ4czIxLjE2OC0yLjcxNywzMC40NjktOC4xNDggczE2LjY2Ni0xMi43OTcsMjIuMDk4LTIyLjA5OFMxNDYuNDI5LDk2LjcyNiwxNDYuNDI5LDg1LjcxNHogTTE3MS40MjksODUuNzE0YzAsMTUuNTUxLTMuODMyLDI5Ljg5My0xMS40OTYsNDMuMDI0IGMtNy42NjQsMTMuMTMzLTE4LjA2MiwyMy41My0zMS4xOTQsMzEuMTk0Yy0xMy4xMzIsNy42NjQtMjcuNDc0LDExLjQ5Ni00My4wMjQsMTEuNDk2cy0yOS44OTItMy44MzItNDMuMDI0LTExLjQ5NiBjLTEzLjEzMy03LjY2NC0yMy41MzEtMTguMDYyLTMxLjE5NC0zMS4xOTRDMy44MzIsMTE1LjYwNywwLDEwMS4yNjUsMCw4NS43MTRTMy44MzIsNTUuODIyLDExLjQ5Niw0Mi42OSBjNy42NjQtMTMuMTMzLDE4LjA2Mi0yMy41MzEsMzEuMTk0LTMxLjE5NEM1NS44MjIsMy44MzIsNzAuMTY0LDAsODUuNzE0LDBzMjkuODkzLDMuODMyLDQzLjAyNCwxMS40OTYgYzEzLjEzMyw3LjY2NCwyMy41MywxOC4wNjIsMzEuMTk0LDMxLjE5NEMxNjcuNTk3LDU1LjgyMiwxNzEuNDI5LDcwLjE2NCwxNzEuNDI5LDg1LjcxNHoiLz48L3N2Zz4=);\n}\n/*\n * based off of https://github.com/gitterHQ/sidecar\n * license: MIT\n */\n#wikiFrame {\n  width: 100%;\n  height: 100%;\n  top: 0;\n  bottom: 0;\n  position: absolute;\n  overflow: hidden;\n}\n.wiki-aside {\n  width: 500px;\n  z-index: 20000;\n  position: fixed;\n  top: 0;\n  bottom: 0;\n  right: 0;\n  display: -webkit-flex;\n  display: flex;\n  -webkit-flex-direction: row;\n  flex-direction: row;\n  background-color: #ffffff;\n  border-left: 1px solid #ddd;\n  box-shadow: -12px 0 18px 0 rgba(50, 50, 50, 0.1);\n  transition: transform 0.3s cubic-bezier(0.16, 0.22, 0.22, 1.7);\n  /* Add some \"extension\" so that there isn't a gap\n     * when we translate(via animation) more than 100% */\n}\n.wiki-aside.is-collapsed:not(.is-loading) {\n  -webkit-transform: translateX(110%);\n  transform: translateX(110%);\n}\n.wiki-aside:after {\n  content: '';\n  z-index: -1;\n  position: absolute;\n  top: 0;\n  left: 100%;\n  bottom: 0;\n  right: -100%;\n  background-color: #ffffff;\n}\n.wiki-aside iframe {\n  width: 100%;\n  height: 100%;\n  top: 0;\n  bottom: 0;\n  position: absolute;\n  overflow: hidden;\n}\n.wiki-aside .wiki-header {\n  display: none;\n}\n.wiki-aside .wiki-container {\n  padding-top: 10px;\n}\n.wiki-aside .wikiSelector {\n  top: 50px;\n}\n.wiki-aside-action-bar {\n  position: absolute;\n  top: 0;\n  right: 15px;\n  display: -webkit-flex;\n  display: flex;\n  justify-content: flex-end;\n  padding-bottom: 5px;\n  padding-right: 0px;\n  padding-top: 5px;\n  z-index: 100;\n}\n.wiki-fixed-header {\n  position: fixed;\n  background: white;\n  padding-top: 5px;\n  width: 100%;\n  z-index: 1;\n  left: 0;\n  top: 0;\n}\n@media (max-width: 720px) {\n  .wiki-fixed-header {\n    padding-top: 30px;\n  }\n}\n.wiki-fixed-header p {\n  margin: 5px 0 20px;\n}\n@media (max-width: 720px) {\n  .wiki-fixed-header p {\n    margin-bottom: 10px;\n  }\n}\n.wiki-fixed-header hr {\n  margin: 30px 0;\n}\n@media (max-width: 720px) {\n  .wiki-fixed-header hr {\n    margin: 25px 0;\n  }\n}\n.wiki-buttons {\n  margin-top: -10px;\n}\n.wiki-buttons button,\n.wiki-buttons .input-group {\n  width: 300px;\n}\n.wiki-buttons .input-group {\n  margin-top: 15px;\n  margin-left: auto;\n  margin-right: auto;\n}\n#wiki-filter {\n  background: #fff;\n  border-color: darkgreen;\n}\n.wiki-aside-action-item {\n  display: -webkit-flex;\n  display: flex;\n  /* main axis */\n  justify-content: center;\n  /* cross axis */\n  align-items: center;\n  width: 40px;\n  height: 40px;\n  padding-left: 0;\n  padding-right: 0;\n  opacity: 0.65;\n  background: none;\n  background-position: center center;\n  background-repeat: no-repeat;\n  background-size: 22px 22px;\n  border: 0;\n  outline: none;\n  cursor: pointer;\n  cursor: hand;\n  transition: all 0.2s ease;\n}\n.wiki-aside-action-item:hover,\n.wiki-aside-action-item:focus {\n  opacity: 1;\n}\n.wiki-aside-action-item:active {\n  filter: hue-rotate(80deg) saturate(150);\n}\n.wiki-aside-action-pop-out {\n  margin-right: -4px;\n  background-image: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMDAgMTcxLjQyOSIgZmlsbD0iIzNhMzEzMyI+PHBhdGggZD0iTTE1Ny4xNDMsMTAzLjU3MXYzNS43MTRjMCw4Ljg1NC0zLjE0NCwxNi40MjYtOS40MzEsMjIuNzEzcy0xMy44NTgsOS40MzEtMjIuNzEyLDkuNDMxSDMyLjE0MyBjLTguODU0LDAtMTYuNDI1LTMuMTQ0LTIyLjcxMi05LjQzMVMwLDE0OC4xNCwwLDEzOS4yODVWNDYuNDI5YzAtOC44NTQsMy4xNDQtMTYuNDI1LDkuNDMxLTIyLjcxMiBjNi4yODctNi4yODcsMTMuODU4LTkuNDMxLDIyLjcxMi05LjQzMWg3OC41NzJjMS4wNDEsMCwxLjg5NiwwLjMzNSwyLjU2NiwxLjAwNGMwLjY3LDAuNjcsMS4wMDQsMS41MjUsMS4wMDQsMi41NjdWMjUgYzAsMS4wNDItMC4zMzQsMS44OTctMS4wMDQsMi41NjdjLTAuNjcsMC42Ny0xLjUyNSwxLjAwNC0yLjU2NiwxLjAwNEgzMi4xNDNjLTQuOTExLDAtOS4xMTUsMS43NDktMTIuNjEyLDUuMjQ2IHMtNS4yNDYsNy43MDEtNS4yNDYsMTIuNjEydjkyLjg1NmMwLDQuOTExLDEuNzQ5LDkuMTE1LDUuMjQ2LDEyLjYxMnM3LjcwMSw1LjI0NSwxMi42MTIsNS4yNDVIMTI1YzQuOTEsMCw5LjExNS0xLjc0OCwxMi42MTEtNS4yNDUgYzMuNDk3LTMuNDk3LDUuMjQ2LTcuNzAxLDUuMjQ2LTEyLjYxMnYtMzUuNzE0YzAtMS4wNDIsMC4zMzQtMS44OTcsMS4wMDQtMi41NjdjMC42Ny0wLjY2OSwxLjUyNS0xLjAwNCwyLjU2Ny0xLjAwNGg3LjE0MyBjMS4wNDIsMCwxLjg5NywwLjMzNSwyLjU2NywxLjAwNEMxNTYuODA5LDEwMS42NzQsMTU3LjE0MywxMDIuNTI5LDE1Ny4xNDMsMTAzLjU3MXogTTIwMCw3LjE0M3Y1Ny4xNDMgYzAsMS45MzUtMC43MDcsMy42MDktMi4xMjEsNS4wMjJjLTEuNDEzLDEuNDE0LTMuMDg4LDIuMTIxLTUuMDIxLDIuMTIxYy0xLjkzNSwwLTMuNjA5LTAuNzA3LTUuMDIyLTIuMTIxbC0xOS42NDQtMTkuNjQzIGwtNzIuNzY3LDcyLjc2OWMtMC43NDQsMC43NDQtMS42LDEuMTE1LTIuNTY3LDEuMTE1cy0xLjgyMy0wLjM3MS0yLjU2Ny0xLjExNUw3Ny41NjcsMTA5LjcxYy0wLjc0NC0wLjc0NC0xLjExNi0xLjYtMS4xMTYtMi41NjcgYzAtMC45NjcsMC4zNzItMS44MjIsMS4xMTYtMi41NjZsNzIuNzY4LTcyLjc2OGwtMTkuNjQ0LTE5LjY0M2MtMS40MTMtMS40MTQtMi4xMi0zLjA4OC0yLjEyLTUuMDIyYzAtMS45MzUsMC43MDctMy42MDksMi4xMi01LjAyMiBDMTMyLjEwNSwwLjcwNywxMzMuNzc5LDAsMTM1LjcxNSwwaDU3LjE0M2MxLjkzNCwwLDMuNjA4LDAuNzA3LDUuMDIxLDIuMTIxQzE5OS4yOTMsMy41MzQsMjAwLDUuMjA4LDIwMCw3LjE0M3oiLz48L3N2Zz4=);\n}\n.wiki-aside-action-collapse {\n  background-image: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAxNzEuNDI5IDE3MS40MjkiIGZpbGw9IiMzYTMxMzMiPjxwYXRoIGQ9Ik0xMjIuNDMzLDEwNi4xMzhsLTE2LjI5NSwxNi4yOTVjLTAuNzQ0LDAuNzQ0LTEuNiwxLjExNi0yLjU2NiwxLjExNmMtMC45NjgsMC0xLjgyMy0wLjM3Mi0yLjU2Ny0xLjExNmwtMTUuMjktMTUuMjkgbC0xNS4yOSwxNS4yOWMtMC43NDQsMC43NDQtMS42LDEuMTE2LTIuNTY3LDEuMTE2cy0xLjgyMy0wLjM3Mi0yLjU2Ny0xLjExNmwtMTYuMjk0LTE2LjI5NWMtMC43NDQtMC43NDQtMS4xMTYtMS42LTEuMTE2LTIuNTY2IGMwLTAuOTY4LDAuMzcyLTEuODIzLDEuMTE2LTIuNTY3bDE1LjI5LTE1LjI5bC0xNS4yOS0xNS4yOWMtMC43NDQtMC43NDQtMS4xMTYtMS42LTEuMTE2LTIuNTY3czAuMzcyLTEuODIzLDEuMTE2LTIuNTY3IEw2NS4yOSw0OC45OTZjMC43NDQtMC43NDQsMS42LTEuMTE2LDIuNTY3LTEuMTE2czEuODIzLDAuMzcyLDIuNTY3LDEuMTE2bDE1LjI5LDE1LjI5bDE1LjI5LTE1LjI5IGMwLjc0NC0wLjc0NCwxLjYtMS4xMTYsMi41NjctMS4xMTZjMC45NjcsMCwxLjgyMiwwLjM3MiwyLjU2NiwxLjExNmwxNi4yOTUsMTYuMjk0YzAuNzQ0LDAuNzQ0LDEuMTE2LDEuNiwxLjExNiwyLjU2NyBzLTAuMzcyLDEuODIzLTEuMTE2LDIuNTY3bC0xNS4yOSwxNS4yOWwxNS4yOSwxNS4yOWMwLjc0NCwwLjc0NCwxLjExNiwxLjYsMS4xMTYsMi41NjcgQzEyMy41NDksMTA0LjUzOSwxMjMuMTc3LDEwNS4zOTQsMTIyLjQzMywxMDYuMTM4eiBNMTQ2LjQyOSw4NS43MTRjMC0xMS4wMTItMi43MTctMjEuMTY4LTguMTQ4LTMwLjQ2OSBzLTEyLjc5Ny0xNi42NjctMjIuMDk4LTIyLjA5OFM5Ni43MjYsMjUsODUuNzE0LDI1cy0yMS4xNjgsMi43MTYtMzAuNDY5LDguMTQ3UzM4LjU3OSw0NS45NDUsMzMuMTQ3LDU1LjI0NlMyNSw3NC43MDMsMjUsODUuNzE0IHMyLjcxNiwyMS4xNjgsOC4xNDcsMzAuNDY5czEyLjc5NywxNi42NjYsMjIuMDk4LDIyLjA5OHMxOS40NTcsOC4xNDgsMzAuNDY5LDguMTQ4czIxLjE2OC0yLjcxNywzMC40NjktOC4xNDggczE2LjY2Ni0xMi43OTcsMjIuMDk4LTIyLjA5OFMxNDYuNDI5LDk2LjcyNiwxNDYuNDI5LDg1LjcxNHogTTE3MS40MjksODUuNzE0YzAsMTUuNTUxLTMuODMyLDI5Ljg5My0xMS40OTYsNDMuMDI0IGMtNy42NjQsMTMuMTMzLTE4LjA2MiwyMy41My0zMS4xOTQsMzEuMTk0Yy0xMy4xMzIsNy42NjQtMjcuNDc0LDExLjQ5Ni00My4wMjQsMTEuNDk2cy0yOS44OTItMy44MzItNDMuMDI0LTExLjQ5NiBjLTEzLjEzMy03LjY2NC0yMy41MzEtMTguMDYyLTMxLjE5NC0zMS4xOTRDMy44MzIsMTE1LjYwNywwLDEwMS4yNjUsMCw4NS43MTRTMy44MzIsNTUuODIyLDExLjQ5Niw0Mi42OSBjNy42NjQtMTMuMTMzLDE4LjA2Mi0yMy41MzEsMzEuMTk0LTMxLjE5NEM1NS44MjIsMy44MzIsNzAuMTY0LDAsODUuNzE0LDBzMjkuODkzLDMuODMyLDQzLjAyNCwxMS40OTYgYzEzLjEzMyw3LjY2NCwyMy41MywxOC4wNjIsMzEuMTk0LDMxLjE5NEMxNjcuNTk3LDU1LjgyMiwxNzEuNDI5LDcwLjE2NCwxNzEuNDI5LDg1LjcxNHoiLz48L3N2Zz4=);\n}\n.github-login {\n  position: relative;\n  width: 300px;\n  margin-left: auto;\n  margin-right: auto;\n}\n.github-login .first {\n  position: relative;\n  height: 0;\n  top: -30px;\n  right: -180px;\n  color: red;\n}\n\n/*# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9hbmltYXRlLm1pbi5sZXNzIiwibGliL2Jvb3RzdHJhcC9ub3JtYWxpemUubGVzcyIsImxpYi9ib290c3RyYXAvcHJpbnQubGVzcyIsImxpYi9ib290c3RyYXAvZ2x5cGhpY29ucy5sZXNzIiwibGliL2Jvb3RzdHJhcC9zY2FmZm9sZGluZy5sZXNzIiwibGliL2Jvb3RzdHJhcC9taXhpbnMvdmVuZG9yLXByZWZpeGVzLmxlc3MiLCJsaWIvYm9vdHN0cmFwL3ZhcmlhYmxlcy5sZXNzIiwibGliL2Jvb3RzdHJhcC9taXhpbnMvdGFiLWZvY3VzLmxlc3MiLCJsaWIvYm9vdHN0cmFwL3RodW1ibmFpbHMubGVzcyIsImxpYi9ib290c3RyYXAvY2Fyb3VzZWwubGVzcyIsImxpYi9ib290c3RyYXAvbWl4aW5zL2ltYWdlLmxlc3MiLCJsaWIvYm9vdHN0cmFwL3R5cGUubGVzcyIsImxpYi9ib290c3RyYXAvbWl4aW5zL3RleHQtZW1waGFzaXMubGVzcyIsImxpYi9ib290c3RyYXAvbWl4aW5zL2JhY2tncm91bmQtdmFyaWFudC5sZXNzIiwibGliL2Jvb3RzdHJhcC9taXhpbnMvdGV4dC1vdmVyZmxvdy5sZXNzIiwibGliL2Jvb3RzdHJhcC9jb2RlLmxlc3MiLCJsaWIvYm9vdHN0cmFwL2dyaWQubGVzcyIsImxpYi9ib290c3RyYXAvbWl4aW5zL2dyaWQubGVzcyIsImxpYi9ib290c3RyYXAvbWl4aW5zL2dyaWQtZnJhbWV3b3JrLmxlc3MiLCJsaWIvYm9vdHN0cmFwL3RhYmxlcy5sZXNzIiwibGliL2Jvb3RzdHJhcC9taXhpbnMvdGFibGUtcm93Lmxlc3MiLCJsaWIvYm9vdHN0cmFwL2Zvcm1zLmxlc3MiLCJsaWIvYm9vdHN0cmFwL21peGlucy9mb3Jtcy5sZXNzIiwibGliL2Jvb3RzdHJhcC9idXR0b25zLmxlc3MiLCJsaWIvYm9vdHN0cmFwL21peGlucy9idXR0b25zLmxlc3MiLCJ0b2FzdHIubGVzcyIsImxpYi9ib290c3RyYXAvYnV0dG9uLWdyb3Vwcy5sZXNzIiwibGliL2Jvb3RzdHJhcC9jb21wb25lbnQtYW5pbWF0aW9ucy5sZXNzIiwibGliL2Jvb3RzdHJhcC9kcm9wZG93bnMubGVzcyIsImxpYi9ib290c3RyYXAvbWl4aW5zL25hdi1kaXZpZGVyLmxlc3MiLCJsaWIvYm9vdHN0cmFwL21peGlucy9yZXNldC1maWx0ZXIubGVzcyIsImxpYi9ib290c3RyYXAvbWl4aW5zL2JvcmRlci1yYWRpdXMubGVzcyIsImxpYi9ib290c3RyYXAvaW5wdXQtZ3JvdXBzLmxlc3MiLCJsaWIvYm9vdHN0cmFwL25hdnMubGVzcyIsImxpYi9ib290c3RyYXAvbmF2YmFyLmxlc3MiLCJsaWIvYm9vdHN0cmFwL21peGlucy9uYXYtdmVydGljYWwtYWxpZ24ubGVzcyIsImxpYi9ib290c3RyYXAvdXRpbGl0aWVzLmxlc3MiLCJsaWIvYm9vdHN0cmFwL2JyZWFkY3J1bWJzLmxlc3MiLCJsaWIvYm9vdHN0cmFwL3BhZ2luYXRpb24ubGVzcyIsImxpYi9ib290c3RyYXAvbWl4aW5zL3BhZ2luYXRpb24ubGVzcyIsImxpYi9ib290c3RyYXAvcGFnZXIubGVzcyIsImxpYi9ib290c3RyYXAvbGFiZWxzLmxlc3MiLCJsaWIvYm9vdHN0cmFwL21peGlucy9sYWJlbHMubGVzcyIsImxpYi9ib290c3RyYXAvYmFkZ2VzLmxlc3MiLCJsaWIvYm9vdHN0cmFwL2p1bWJvdHJvbi5sZXNzIiwibGliL2Jvb3RzdHJhcC9hbGVydHMubGVzcyIsImxpYi9ib290c3RyYXAvbWl4aW5zL2FsZXJ0cy5sZXNzIiwibGliL2Jvb3RzdHJhcC9wcm9ncmVzcy1iYXJzLmxlc3MiLCJsaWIvYm9vdHN0cmFwL21peGlucy9ncmFkaWVudHMubGVzcyIsImxpYi9ib290c3RyYXAvbWl4aW5zL3Byb2dyZXNzLWJhci5sZXNzIiwibGliL2Jvb3RzdHJhcC9tZWRpYS5sZXNzIiwibGliL2Jvb3RzdHJhcC9saXN0LWdyb3VwLmxlc3MiLCJsaWIvYm9vdHN0cmFwL21peGlucy9saXN0LWdyb3VwLmxlc3MiLCJsaWIvYm9vdHN0cmFwL3BhbmVscy5sZXNzIiwibGliL2Jvb3RzdHJhcC9taXhpbnMvcGFuZWxzLmxlc3MiLCJsaWIvYm9vdHN0cmFwL3Jlc3BvbnNpdmUtZW1iZWQubGVzcyIsImxpYi9ib290c3RyYXAvd2VsbHMubGVzcyIsImxpYi9ib290c3RyYXAvY2xvc2UubGVzcyIsImxpYi9ib290c3RyYXAvbW9kYWxzLmxlc3MiLCJsaWIvYm9vdHN0cmFwL3Rvb2x0aXAubGVzcyIsImxpYi9ib290c3RyYXAvcG9wb3ZlcnMubGVzcyIsImxpYi9ib290c3RyYXAvbWl4aW5zL2NsZWFyZml4Lmxlc3MiLCJsaWIvYm9vdHN0cmFwL21peGlucy9jZW50ZXItYmxvY2subGVzcyIsImxpYi9ib290c3RyYXAvbWl4aW5zL2hpZGUtdGV4dC5sZXNzIiwibGliL2Jvb3RzdHJhcC9yZXNwb25zaXZlLXV0aWxpdGllcy5sZXNzIiwibGliL2Jvb3RzdHJhcC9taXhpbnMvcmVzcG9uc2l2ZS12aXNpYmlsaXR5Lmxlc3MiLCJsaWIvYm9vdHN0cmFwLXNvY2lhbC9ib290c3RyYXAtc29jaWFsLmxlc3MiLCJtYWluLmxlc3MiLCJsaWIvaW9uaWNvbnMvX2lvbmljb25zLWZvbnQubGVzcyIsImxpYi9pb25pY29ucy9faW9uaWNvbnMtdmFyaWFibGVzLmxlc3MiLCJsaWIvaW9uaWNvbnMvX2lvbmljb25zLWFuaW1hdGlvbi5sZXNzIiwibGliL2lvbmljb25zL19pb25pY29ucy1pY29ucy5sZXNzIiwiY2hhdC5sZXNzIiwiam9icy5sZXNzIiwiY2hhbGxlbmdlLmxlc3MiLCJtYXAubGVzcyIsIndpa2kubGVzcyIsInNpZ25pbi5sZXNzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFNBQVM7O0FDUVQ7RUFDRSx1QkFBQTtFQUNBLDBCQUFBO0VBQ0EsOEJBQUE7O0FBT0Y7RUFDRSxTQUFBOztBQWFGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBQ0UsY0FBQTs7QUFR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QVUsU0FBUyxPQUFUOztBQUNYLHFCQUFDO0VBQVUsU0FBUyxPQUFUOztBQUNYLG9CQUFDO0VBQVUsU0FBUyxPQUFUOztBQUNYLHNCQUFDO0VBQVUsU0FBUyxPQUFUOztBQUNYLHVCQUFDO0VBQVUsU0FBUyxPQUFUOztBQUNYLDJCQUFDO0VBQVUsU0FBUyxPQUFUOztBQUNYLGVBQUM7RUFBVSxTQUFTLE9BQVQ7O0FBQ1gsZUFBQztFQUFVLFNBQVMsT0FBVDs7QUFDWCxlQUFDO0VBQVUsU0FBUyxPQUFUOztBQUNYLG1CQUFDO0VBQVUsU0FBUyxPQUFUOztBQUNYLG9CQUFDO0VBQVUsU0FBUyxPQUFUOztBQUNYLHVCQUFDO0VBQVUsU0FBUyxPQUFUOztBQUNYLGdCQUFDO0VBQVUsU0FBUyxPQUFUOztBQUNYLG1CQUFDO0VBQVUsU0FBUyxPQUFUOztBQUNYLGlCQUFDO0VBQVUsU0FBUyxPQUFUOztBQUNYLGtCQUFDO0VBQVUsU0FBUyxPQUFUOztBQUNYLGlCQUFDO0VBQVUsU0FBUyxPQUFUOztBQUNYLHFCQUFDO0VBQVUsU0FBUyxPQUFUOztBQUNYLHVCQUFDO0VBQVUsU0FBUyxPQUFUOztBQUNYLGtCQUFDO0VBQVUsU0FBUyxPQUFUOztBQUNYLHdCQUFDO0VBQVUsU0FBUyxPQUFUOztBQUNYLHVCQUFDO0VBQVUsU0FBUyxPQUFUOztBQUNYLHNCQUFDO0VBQVUsU0FBUyxPQUFUOztBQUNYLDBCQUFDO0VBQVUsU0FBUyxPQUFUOztBQUNYLDRCQUFDO0VBQVUsU0FBUyxPQUFUOztBQUNYLGNBQUM7RUFBVSxTQUFTLE9BQVQ7O0FBQ1gsbUJBQUM7RUFBVSxTQUFTLE9BQVQ7O0FBQ1gsZUFBQztFQUFVLFNBQVMsT0FBVDs7QUFDWCxzQkFBQztFQUFVLFNBQVMsT0FBVDs7QUFDWCxvQkFBQztFQUFVLFNBQVMsT0FBVDs7QUFDWCxzQkFBQztFQUFVLFNBQVMsT0FBVDs7QUFDWCxxQkFBQztFQUFVLFNBQVMsT0FBVDs7QUFDWCxvQkFBQztFQUFVLFNBQVMsT0FBVDs7QUFDWCxrQkFBQztFQUFVLFNBQVMsT0FBVDs7QUFDWCxvQkFBQztFQUFVLFNBQVMsT0FBVDs7QUFDWCw2QkFBQztFQUFVLFNBQVMsT0FBVDs7QUFDWCw0QkFBQztFQUFVLFNBQVMsT0FBVDs7QUFDWCwwQkFBQztFQUFVLFNBQVMsT0FBVDs7QUFDWCw0QkFBQztFQUFVLFNBQVMsT0FBVDs7QUFDWCxnQkFBQztFQUFVLFNBQVMsT0FBVDs7QUFDWCxpQkFBQztFQUFVLFNBQVMsT0FBVDs7QUFDWCxnQkFBQztFQUFVLFNBQVMsT0FBVDs7QUFDWCxpQkFBQztFQUFVLFNBQVMsT0FBVDs7QUFDWCxvQkFBQztFQUFVLFNBQVMsT0FBVDs7QUFDWCxxQkFBQztFQUFVLFNBQVMsT0FBVDs7QUFDWCxvQkFBQztFQUFVLFNBQVMsT0FBVDs7QUFDWCxvQkFBQztFQUFVLFNBQVMsT0FBVDs7QUFDWCxzQkFBQztFQUFVLFNBQVMsT0FBVDs7QUFDWCxlQUFDO0VBQVUsU0FBUyxPQUFUOztBQUNYLGdCQUFDO0VBQVUsU0FBUyxPQUFUOztBQUNYLGtCQUFDO0VBQVUsU0FBUyxPQUFUOztBQUNYLGNBQUM7RUFBVSxTQUFTLE9BQVQ7O0FBQ1gsY0FBQztFQUFVLFNBQVMsT0FBVDs7QUFDWCxlQUFDO0VBQVUsU0FBUyxPQUFUOztBQUNYLDJCQUFDO0VBQVUsU0FBUyxPQUFUOztBQUNYLCtCQUFDO0VBQVUsU0FBUyxPQUFUOztBQUNYLHdCQUFDO0VBQVUsU0FBUyxPQUFUOztBQUNYLDRCQUFDO0VBQVUsU0FBUyxPQUFUOztBQUNYLDZCQUFDO0VBQVUsU0FBUyxPQUFUOztBQUNYLGlDQUFDO0VBQVUsU0FBUyxPQUFUOztBQUNYLG9CQUFDO0VBQVUsU0FBUyxPQUFUOztBQUNYLGlCQUFDO0VBQVUsU0FBUyxPQUFUOztBQUNYLHdCQUFDO0VBQVUsU0FBUyxPQUFUOztBQUNYLHNCQUFDO0VBQVUsU0FBUyxPQUFUOztBQUNYLGlCQUFDO0VBQVUsU0FBUyxPQUFUOztBQUNYLGdCQUFDO0VBQVUsU0FBUyxPQUFUOztBQUNYLGtCQUFDO0VBQVUsU0FBUyxPQUFUOztBQUNYLHFCQUFDO0VBQVUsU0FBUyxPQUFUOztBQUNYLGlCQUFDO0VBQVUsU0FBUyxPQUFUOztBQUNYLGVBQUM7RUFBVSxTQUFTLE9BQVQ7O0FBQ1gsZUFBQztFQUFVLFNBQVMsT0FBVDs7QUFDWCxnQkFBQztFQUFVLFNBQVMsT0FBVDs7QUFDWCxpQkFBQztFQUFVLFNBQVMsT0FBVDs7QUFDWCxpQkFBQztFQUFVLFNBQVMsT0FBVDs7QUFDWCxlQUFDO0VBQVUsU0FBUyxPQUFUOztBQUNYLHNCQUFDO0VBQVUsU0FBUyxPQUFUOztBQUNYLHVCQUFDO0VBQVUsU0FBUyxPQUFUOztBQUNYLHdCQUFDO0VBQVUsU0FBUyxPQUFUOztBQUNYLHNCQUFDO0VBQVUsU0FBUyxPQUFUOztBQUNYLHNCQUFDO0VBQVUsU0FBUyxPQUFUOztBQUNYLHNCQUFDO0VBQVUsU0FBUyxPQUFUOztBQUNYLG1CQUFDO0VBQVUsU0FBUyxPQUFUOztBQUNYLGtCQUFDO0VBQVUsU0FBUyxPQUFUOztBQUNYLGlCQUFDO0VBQVUsU0FBUyxPQUFUOztBQUNYLHFCQUFDO0VBQVUsU0FBUyxPQUFUOztBQUNYLG1CQUFDO0VBQVUsU0FBUyxPQUFUOztBQUNYLG9CQUFDO0VBQVUsU0FBUyxPQUFUOztBQUNYLGdCQUFDO0VBQVUsU0FBUyxPQUFUOztBQUNYLGdCQUFDO0VBQVUsU0FBUyxPQUFUOztBQUNYLG1CQUFDO0VBQVUsU0FBUyxPQUFUOztBQUNYLG1CQUFDO0VBQVUsU0FBUyxPQUFUOztBQUNYLG9CQUFDO0VBQVUsU0FBUyxPQUFUOztBQUNYLHVCQUFDO0VBQVUsU0FBUyxPQUFUOztBQUNYLHNCQUFDO0VBQVUsU0FBUyxPQUFUOztBQUNYLG9CQUFDO0VBQVUsU0FBUyxPQUFUOztBQUNYLG9CQUFDO0VBQVUsU0FBUyxPQUFUOztBQUNYLG9CQUFDO0VBQVUsU0FBUyxPQUFUOztBQUNYLHlCQUFDO0VBQVUsU0FBUyxPQUFUOztBQUNYLDRCQUFDO0VBQVUsU0FBUyxPQUFUOztBQUNYLHlCQUFDO0VBQVUsU0FBUyxPQUFUOztBQUNYLHVCQUFDO0VBQVUsU0FBUyxPQUFU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USxDQUFDO0lBQ1osVUFBQTs7RUFERixLQUFLLEVBQVEsQ0FBQztJQUNaLG1CQUFBOztFQURGLEtBQUssRUFBUSxDQUFDO0lBQ1osa0JBQUE7O0VBY0YsS0FBSyxFQUFRLE1BQU07SUFDakIsV0FBQTs7RUFERixLQUFLLEVBQVEsTUFBTTtJQUNqQixtQkFBQTs7RUFERixLQUFLLEVBQVEsTUFBTTtJQUNqQixtQkFBQTs7RUFERixLQUFLLEVBQVEsTUFBTTtJQUNqQixVQUFBOztFQURGLEtBQUssRUFBUSxNQUFNO0lBQ2pCLG1CQUFBOztFQURGLEtBQUssRUFBUSxNQUFNO0lBQ2pCLG1CQUFBOztFQURGLEtBQUssRUFBUSxNQUFNO0lBQ2pCLFVBQUE7O0VBREYsS0FBSyxFQUFRLE1BQU07SUFDakIsbUJBQUE7O0VBREYsS0FBSyxFQUFRLE1BQU07SUFDakIsbUJBQUE7O0VBREYsS0FBSyxFQUFRLE1BQU07SUFDakIsVUFBQTs7RUFERixLQUFLLEVBQVEsTUFBTTtJQUNqQixtQkFBQTs7RUFERixLQUFLLEVBQVEsTUFBTTtJQUNqQixrQkFBQTs7RUFJRixLQUFLLEVBQVE7SUFDWCxXQUFBOztFQWhCRixLQUFLLEVBQVEsTUFBTTtJQUNqQixVQUFBOztFQURGLEtBQUssRUFBUSxNQUFNO0lBQ2pCLGtCQUFBOztFQURGLEtBQUssRUFBUSxNQUFNO0lBQ2pCLGtCQUFBOztFQURGLEtBQUssRUFBUSxNQUFNO0lBQ2pCLFNBQUE7O0VBREYsS0FBSyxFQUFRLE1BQU07SUFDakIsa0JBQUE7O0VBREYsS0FBSyxFQUFRLE1BQU07SUFDakIsa0JBQUE7O0VBREYsS0FBSyxFQUFRLE1BQU07SUFDakIsU0FBQTs7RUFERixLQUFLLEVBQVEsTUFBTTtJQUNqQixrQkFBQTs7RUFERixLQUFLLEVBQVEsTUFBTTtJQUNqQixrQkFBQTs7RUFERixLQUFLLEVBQVEsTUFBTTtJQUNqQixTQUFBOztFQURGLEtBQUssRUFBUSxNQUFNO0lBQ2pCLGtCQUFBOztFQURGLEtBQUssRUFBUSxNQUFNO0lBQ2pCLGlCQUFBOztFQUlGLEtB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QU07RUFBVSxTRnR0QmQsT0VzdEJjOztBQUNuQyxDQUFDLElBQWtCLElBQUk7RUFBVSxTRnR0QmQsT0VzdEJjOztBQUNqQyxDQUFDLElBQWtCLFNBQVM7RUFBVSxTRnR0QmQsT0VzdEJjOztBQUN0QyxDQUFDLElBQWtCLE9BQU87RUFBVSxTRnR0QmQsT0VzdEJjOztBQUNwQyxDQUFDLElBQWtCLE1BQU07RUFBVSxTRnR0QmQsT0VzdEJjOztBQUNuQyxDQUFDLElBQWtCLE1BQU07RUFBVSxTRnR0QmQsT0VzdEJjOztBQUNuQyxDQUFDLElBQWtCLE1BQU07RUFBVSxTRnR0QmQsT0VzdEJjOztBQUNuQyxDQUFDLElBQWtCLElBQUk7RUFBVSxTRnR0QmQsT0VzdEJjOztBQUNqQyxDQUFDLElBQWtCLE1BQU07RUFBVSxTRnR0QmQsT0VzdEJjOztBQUNuQyxDQUFDLElBQWtCLEtBQUs7RUFBVSxTRnR0QmQsT0VzdEJjOztBQUNsQyxDQUFDLElBQWtCLGFBQWE7RUFBVSxTRnR0QmQsT0VzdEJjOztBQUMxQyxDQUFDLElBQWtCLFNBQVM7RUFBVSxTRnR0QmQsT0VzdEJjOztBQUN0QyxDQUFDLElBQWtCLEtBQUs7RUFBVSxTRnR0QmQsT0VzdEJjOztBQUNsQyxDQUFDLElBQWtCLFlBQVk7RUFBVSxTRnR0QmQsT0VzdEJjOztBQUN6QyxDQUFDLElBQWtCLElBQUk7RUFBVSxTRnR0QmQsT0VzdEJjOztBQUNqQyxDQUFDLElBQWtCLFNBQVM7RUFBVSxTRnR0QmQsT0VzdEJjOztBQUN0QyxDQUFDLElBQWtCLFlBQVk7RUFBVSxTRnR0QmQsT0VzdEJjOztBQUN6QyxDQUFDLElBQWtCLElBQUk7RUFBVSxTRnR0QmQsT0VzdEJjOztBQUNqQyxDQUFDLElBQWtCLFFBQVE7RUFBVSxTRnR0QmQsT0VzdEJjOztBQUNyQyxDQUFDLElBQWtCLEtBQUs7RUFBVSxTRnR0QmQsT0VzdEJjOztBQUNsQyxDQUFDLElBQWtCLE1BQU07RUFBVSxTRnR0QmQsT0VzdEJjOztBQUNuQyxDQUFDLElBQWtCLFdBQVc7RUFBVSxTRnR0QmQsT0Vz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SUFBSTtFQUFVLFNGdHRCZCxPRXN0QmM7O0FBQ2pDLENBQUMsSUFBa0IsR0FBRztFQUFVLFNGdHRCZCxPRXN0QmM7O0FBQ2hDLENBQUMsSUFBa0IsR0FBRztFQUFVLFNGdHRCZCxPRXN0QmM7O0FBQ2hDLENBQUMsSUFBa0IsTUFBTTtFQUFVLFNGdHRCZCxPRXN0QmM7O0FBQ25DLENBQUMsSUFBa0IsS0FBSztFQUFVLFNGdHRCZCxPRXN0QmM7O0FBQ2xDLENBQUMsSUFBa0IsS0FBSztFQUFVLFNGdHRCZCxPRXN0QmM7O0FBQ2xDLENBQUMsSUFBa0IsS0FBSztFQUFVLFNGdHRCZCxPRXN0QmM7O0FBQ2xDLENBQUMsSUFBa0IsS0FBSztFQUFVLFNGdHRCZCxPRXN0QmM7O0FBQ2xDLENBQUMsSUFBa0IsS0FBSztFQUFVLFNGdHRCZCxPRXN0QmM7O0FBQ2xDLENBQUMsSUFBa0IsYUFBYTtFQUFVLFNGdHRCZCxPRXN0QmM7O0FBQzFDLENBQUMsSUFBa0IsV0FBVztFQUFVLFNGdHRCZCxPRXN0QmM7O0FBQ3hDLENBQUMsSUFBa0IsT0FBTztFQUFVLFNGdHRCZCxPRXN0QmM7O0FBQ3BDLENBQUMsSUFBa0IsT0FBTztFQUFVLFNGdHRCZCxPRXN0QmM7O0FBQ3BDLENBQUMsSUFBa0IsSUFBSTtFQUFVLFNGdHRCZCxPRXN0QmM7O0FBQ2pDLENBQUMsSUFBa0IsS0FBSztFQUFVLFNGdHRCZCxPRXN0QmM7O0FBQ2xDLENBQUMsSUFBa0IsVUFBVTtFQUFVLFNGdHRCZCxPRXN0QmM7O0FBQ3ZDLENBQUMsSUFBa0IsT0FBTztFQUFVLFNGdHRCZCxPRXN0QmM7O0FBQ3BDLENBQUMsSUFBa0IsYUFBYTtFQUFVLFNGdHRCZCxPRXN0QmM7O0FBQzFDLENBQUMsSUFBa0IsUUFBUTtFQUFVLFNGdHRCZCxPRXN0QmM7O0FBQ3JDLENBQUMsSUFBa0IsT0FBTztFQUFVLFNGdHRCZCxPRXN0QmM7O0FBQ3BDLENBQUMsSUFBa0IsVUFBVTtFQUFVLFNGdHRCZCxPRXN0QmM7O0FBQ3ZDLENBQUMsSUFBa0IsT0FBTztFQUFVLFNGdHRCZCxPRXN0QmM7O0FBQ3BDLENBQUMsSUFBa0IsTUFBTTtFQUFVLFNGdHRCZCxPRXN0QmM7O0FBQ25DLENBQUMsSUFBa0IsVUFBVTtFQUFVLFNGdHRCZCxPRXN0QmM7O0FBQ3ZDLENBQUMsSUFBa0IsV0FBVztFQUFVLFNGdHRCZCxPRXN0QmM7O0FBQ3hDLENBQUMsSUFBa0IsY0FBYztFQUFVLFNGdHRCZCxPRXN0QmM7O0FBQzNDLENBQUMsSUFBa0IsU0FBUztFQUFVLFNGdHRCZCxPRXN0QmM7O0FBQ3RDLENBQUMsSUFBa0IsS0FBSztFQUFVLFNGdHRCZCxPRXN0QmM7O0FBQ2xDLENBQUMsSUFBa0IsTUFBTTtFQUFVLFNGdHRCZCxPRXN0QmM7O0FBQ25DLENBQUMsSUFBa0IsVUFBVTtFQUFVLFNGdHRCZCxPRXN0QmM7O0FBQ3ZDLENBQUMsSUFBa0IsY0FBYztFQUFVLFNGdHRCZCxPRXN0QmM7O0FBQzNDLENBQUMsSUFBa0IsU0FBUztFQUFVLFNGdHRCZCxPRXN0QmM7O0FBQ3RDLENBQUMsSUFBa0IsR0FBRztFQUFVLFNGdHRCZCxPRXN0QmM7O0FBQ2hDLENBQUMsSUFBa0IsUUFBUTtFQUFVLFNGdHRCZCxPRXN0QmM7O0FBQ3JDLENBQUMsSUFBa0IsS0FBSztFQUFVLFNGdHRCZCxPRXN0QmM7O0FBQ2xDLENBQUMsSUFBa0IsS0FBSztFQUFVLFNGdHRCZCxPRXN0QmM7O0FBQ2xDLENBQUMsSUFBa0IsTUFBTTtFQUFVLFNGdHRCZCxPRXN0QmM7O0FBQ25DLENBQUMsSUFBa0IsSUFBSTtFQUFVLFNGdHRCZCxPRXN0QmM7O0FBQ2pDLENBQUMsSUFBa0IsV0FBVztFQUFVLFNGdHRCZCxPRXN0QmM7O0FBQ3hDLENBQUMsSUFBa0IsSUFBSTtFQUFVLFNGdHRCZCxPRXN0QmM7O0FBQ2pDLENBQUMsSUFBa0IsWUFBWTtFQUFVLFNGdHRCZCxPRXN0QmM7O0FBQ3pDLENBQUMsSUFBa0IsVUFBVTtFQUFVLFNGdHRCZCxPRXN0QmM7O0FBQ3ZDLENBQUMsSUFBa0IsTUFBTTtFQUFVLFNGdHRCZCxPRXN0QmM7O0FBQ25DLENBQUMsSUFBa0IsS0FBSztFQUFVLFNGdHRCZCxPRXN0QmM7O0FBQ2xDLENBQUMsSUFBa0IsS0FBSztFQUFVLFNGdHRCZCxPRXN0QmM7O0FBQ2xDLENBQUMsSUFBa0IsUUFBUTtFQUFVLFNGdHRCZCxPRXN0QmM7O0FBQ3JDLENBQUMsSUFBa0IsU0FBUztFQUFVLFNGdHRCZCxPRXN0QmM7O0FBQ3RDLENBQUMsSUFBa0IsT0FBTztFQUFVLFNGdHRCZCxPRXN0QmM7O0FBQ3BDLENBQUMsSUFBa0IsWUFBWTtFQUFVLFNGdHRCZCxPRXN0QmM7O0FBQ3pDLENBQUMsSUFBa0IsVUFBVTtFQUFVLFNGdHRCZCxPRXN0QmM7O0FBQ3ZDLENBQUMsSUFBa0IsS0FBSztFQUFVLFNGdHRCZCxPRXN0QmM7O0FBQ2xDLENBQUMsSUFBa0IsV0FBVztFQUFVLFNGdHRCZCxPRXN0QmM7O0FBQ3hDLENBQUMsSUFBa0IsTUFBTTtFQUFVLFNGdHRCZCxPRXN0QmM7O0FBQ25DLENBQUMsSUFBa0IsT0FBTztFQUFVLFNGdHRCZCxPRXN0QmM7O0FBQ3BDLENBQUMsSUFBa0IsS0FBSztFQUFVLFNGdHRCZCxPRXN0QmM7O0FBQ2xDLENBQUMsSUFBa0IsU0FBUztFQUFVLFNGdHRCZCxPRXN0QmM7O0FBQ3RDLENBQUMsSUFBa0IsUUFBUTtFQUFVLFNGdHRCZCxPRXN0QmM7O0FBQ3JDLENBQUMsSUFBa0IsUUFBUTtFQUFVLFNGdHRCZCxPRXN0QmM7O0FBQ3JDLENBQUMsSUFBa0IsR0FBRztFQUFVLFNGdHRCZCxPRXN0QmM7O0FBQ2hDLENBQUMsSUFBa0IsV0FBVztFQUFVLFNGdHRCZCxPRXN0QmM7O0FBQ3hDLENBQUMsSUFBa0IsUUFBUTtFQUFVLFNGdHRCZCxPRXN0QmM7O0FBQ3JDLENBQUMsSUFBa0IsTUFBTTtFQUFVLFNGdHRCZCxPRXN0QmM7O0FBQ25DLENBQUMsSUFBa0IsUUFBUTtFQUFVLFNGdHRCZCxPRXN0QmM7O0FBQ3JDLENBQUMsSUFBa0IsS0FBSztFQUFVLFNGdHRCZCxPRXN0QmM7O0FBQ2xDLENBQUMsSUFBa0IsT0FBTztFQUFVLFNG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Q0EsYUFBQTs7RUFFQSx1QkFBQTs7RUFFQSxtQkFBQTtFQUVBLFdBQUE7RUFDQSxZQUFBO0VBRUEsZUFBQTtFQUNBLGdCQUFBO0VBRUEsYUFBQTtFQUNBLGdCQUFBO0VBQ0Esa0NBQUE7RUFDQSw0QkFBQTtFQUNBLDBCQUFBO0VBQ0EsU0FBQTtFQUNBLGFBQUE7RUFFQSxlQUFBO0VBQ0EsWUFBQTtFQUVBLHlCQUFBOztBQUVBLHVCQUFDO0FBQ0QsdUJBQUM7RUFDQyxVQUFBOztBQUdGLHVCQUFDO0VBQ0MsUUFBUSxrQkFBa0IsYUFBMUI7O0FBSU47RUFDSSxrQkFBQTtFQUNBLHl5REFBQTs7QUFHSjtFQUNJLHFvRUFBQTs7QUNqTEo7RUFDQyxrQkFBQTtFQUNBLFlBQUE7RUFDQSxpQkFBQTtFQUNBLGtCQUFBOztBQUpELGFBS0M7RUFDQSxrQkFBQTtFQUNBLFNBQUE7RUFDQSxVQUFBO0VBQ0EsYUFBQTtFQUNBLFVBQUEiLCJzb3VyY2VzQ29udGVudCI6WyJAY2hhcnNldCBcIlVURi04XCI7LyohXG5BbmltYXRlLmNzcyAtIGh0dHA6Ly9kYW5lZGVuLm1lL2FuaW1hdGVcbkxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSAtIGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVRcblxuQ29weXJpZ2h0IChjKSAyMDE0IERhbmllbCBFZGVuXG4qLy5hbmltYXRlZHstd2Via2l0LWFuaW1hdGlvbi1kdXJhdGlvbjoxczthbmltYXRpb24tZHVyYXRpb246MXM7LXdlYmtpdC1hbmltYXRpb24tZmlsbC1tb2RlOmJvdGg7YW5pbWF0aW9uLWZpbGwtbW9kZTpib3RofS5hbmltYXRlZC5pbmZpbml0ZXstd2Via2l0LWFuaW1hdGlvbi1pdGVyYXRpb24tY291bnQ6aW5maW5pdGU7YW5pbWF0aW9uLWl0ZXJhdGlvbi1jb3VudDppbmZpbml0ZX0uYW5pbWF0ZWQuaGluZ2V7LXdlYmtpdC1hbmltYXRpb24tZHVyYXRpb246MnM7YW5pbWF0aW9uLWR1cmF0aW9uOjJzfUAtd2Via2l0LWtleWZyYW1lcyBib3VuY2V7MCUsMTAwJSwyMCUsNTMlLDgwJXstd2Via2l0LXRyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uOmN1YmljLWJlemllcigwLjIxNSwuNjEsLjM1NSwxKTt0cmFuc2l0aW9uLXRpbWluZy1mdW5jdGlvbjpjdWJpYy1iZXppZXIoMC4yMTUsLjYxLC4zNTUsMSk7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwwLDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLDAsMCl9NDAlLDQzJXstd2Via2l0LXRyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uOmN1YmljLWJlemllcigwLjc1NSwuMDUwLC44NTUsLjA2MCk7dHJhbnNpdGlvbi10aW1pbmctZnVuY3Rpb246Y3ViaWMtYmV6aWVyKDAuNzU1LC4wNTAsLjg1NSwuMDYwKTstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLC0zMHB4LDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLC0zMHB4LDApfTcwJXstd2Via2l0LXRyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uOmN1YmljLWJlemllcigwLjc1NSwuMDUwLC44NTUsLjA2MCk7dHJhbnNpdGlvbi10aW1pbmctZnVuY3Rpb246Y3ViaWMtYmV6aWVyKDAuNzU1LC4wNTAsLjg1NSwuMDYwKTstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLC0xNXB4LDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLC0xNXB4LDApfTkwJXstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLC00cHgsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsLTRweCwwKX19QGtleWZyYW1lcyBib3VuY2V7MCUsMTAwJSwyMCUsNTMlLDgwJXstd2Via2l0LXRyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uOmN1YmljLWJlemllcigwLjIxNSwuNjEsLjM1NSwxKTt0cmFuc2l0aW9uLXRpbWluZy1mdW5jdGlvbjpjdWJpYy1iZXppZXIoMC4yMTUsLjYxLC4zNTUsMSk7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwwLDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLDAsMCl9NDAlLDQzJXstd2Via2l0LXRyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uOmN1YmljLWJlemllcigwLjc1NSwuMDUwLC44NTUsLjA2MCk7dHJhbnNpdGlvbi10aW1pbmctZnVuY3Rpb246Y3ViaWMtYmV6aWVyKDAuNzU1LC4wNTAsLjg1NSwuMDYwKTstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLC0zMHB4LDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLC0zMHB4LDApfTcwJXstd2Via2l0LXRyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uOmN1YmljLWJlemllcigwLjc1NSwuMDUwLC44NTUsLjA2MCk7dHJhbnNpdGlvbi10aW1pbmctZnVuY3Rpb246Y3ViaWMtYmV6aWVyKDAuNzU1LC4wNTAsLjg1NSwuMDYwKTstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLC0xNXB4LDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLC0xNXB4LDApfTkwJXstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLC00cHgsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsLTRweCwwKX19LmJvdW5jZXstd2Via2l0LWFuaW1hdGlvbi1uYW1lOmJvdW5jZTthbmltYXRpb24tbmFtZTpib3VuY2U7LXdlYmtpdC10cmFuc2Zvcm0tb3JpZ2luOmNlbnRlciBib3R0b207LW1zLXRyYW5zZm9ybS1vcmlnaW46Y2VudGVyIGJvdHRvbTt0cmFuc2Zvcm0tb3JpZ2luOmNlbnRlciBib3R0b219QC13ZWJraXQta2V5ZnJhbWVzIGZsYXNoezAlLDEwMCUsNTAle29wYWNpdHk6MX0yNSUsNzUle29wYWNpdHk6MH19QGtleWZyYW1lcyBmbGFzaHswJSwxMDAlLDUwJXtvcGFjaXR5OjF9MjUlLDc1JXtvcGFjaXR5OjB9fS5mbGFzaHstd2Via2l0LWFuaW1hdGlvbi1uYW1lOmZsYXNoO2FuaW1hdGlvbi1uYW1lOmZsYXNofUAtd2Via2l0LWtleWZyYW1lcyBwdWxzZXswJXstd2Via2l0LXRyYW5zZm9ybTpzY2FsZTNkKDEsMSwxKTt0cmFuc2Zvcm06c2NhbGUzZCgxLDEsMSl9NTAley13ZWJraXQtdHJhbnNmb3JtOnNjYWxlM2QoMS4wNSwxLjA1LDEuMDUpO3RyYW5zZm9ybTpzY2FsZTNkKDEuMDUsMS4wNSwxLjA1KX0xMDAley13ZWJraXQtdHJhbnNmb3JtOnNjYWxlM2QoMSwxLDEpO3RyYW5zZm9ybTpzY2FsZTNkKDEsMSwxKX19QGtleWZyYW1lcyBwdWxzZXswJXstd2Via2l0LXRyYW5zZm9ybTpzY2FsZTNkKDEsMSwxKTt0cmFuc2Zvcm06c2NhbGUzZCgxLDEsMSl9NTAley13ZWJraXQtdHJhbnNmb3JtOnNjYWxlM2QoMS4wNSwxLjA1LDEuMDUpO3RyYW5zZm9ybTpzY2FsZTNkKDEuMDUsMS4wNSwxLjA1KX0xMDAley13ZWJraXQtdHJhbnNmb3JtOnNjYWxlM2QoMSwxLDEpO3RyYW5zZm9ybTpzY2FsZTNkKDEsMSwxKX19LnB1bHNley13ZWJraXQtYW5pbWF0aW9uLW5hbWU6cHVsc2U7YW5pbWF0aW9uLW5hbWU6cHVsc2V9QC13ZWJraXQta2V5ZnJhbWVzIHJ1YmJlckJhbmR7MCV7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGUzZCgxLDEsMSk7dHJhbnNmb3JtOnNjYWxlM2QoMSwxLDEpfTMwJXstd2Via2l0LXRyYW5zZm9ybTpzY2FsZTNkKDEuMjUsLjc1LDEpO3RyYW5zZm9ybTpzY2FsZTNkKDEuMjUsLjc1LDEpfTQwJXstd2Via2l0LXRyYW5zZm9ybTpzY2FsZTNkKDAuNzUsMS4yNSwxKTt0cmFuc2Zvcm06c2NhbGUzZCgwLjc1LDEuMjUsMSl9NTAley13ZWJraXQtdHJhbnNmb3JtOnNjYWxlM2QoMS4xNSwuODUsMSk7dHJhbnNmb3JtOnNjYWxlM2QoMS4xNSwuODUsMSl9NjUley13ZWJraXQtdHJhbnNmb3JtOnNjYWxlM2QoLjk1LDEuMDUsMSk7dHJhbnNmb3JtOnNjYWxlM2QoLjk1LDEuMDUsMSl9NzUley13ZWJraXQtdHJhbnNmb3JtOnNjYWxlM2QoMS4wNSwuOTUsMSk7dHJhbnNmb3JtOnNjYWxlM2QoMS4wNSwuOTUsMSl9MTAwJXstd2Via2l0LXRyYW5zZm9ybTpzY2FsZTNkKDEsMSwxKTt0cmFuc2Zvcm06c2NhbGUzZCgxLDEsMSl9fUBrZXlmcmFtZXMgcnViYmVyQmFuZHswJXstd2Via2l0LXRyYW5zZm9ybTpzY2FsZTNkKDEsMSwxKTt0cmFuc2Zvcm06c2NhbGUzZCgxLDEsMSl9MzAley13ZWJraXQtdHJhbnNmb3JtOnNjYWxlM2QoMS4yNSwuNzUsMSk7dHJhbnNmb3JtOnNjYWxlM2QoMS4yNSwuNzUsMSl9NDAley13ZWJraXQtdHJhbnNmb3JtOnNjYWxlM2QoMC43NSwxLjI1LDEpO3RyYW5zZm9ybTpzY2FsZTNkKDAuNzUsMS4yNSwxKX01MCV7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGUzZCgxLjE1LC44NSwxKTt0cmFuc2Zvcm06c2NhbGUzZCgxLjE1LC44NSwxKX02NSV7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGUzZCguOTUsMS4wNSwxKTt0cmFuc2Zvcm06c2NhbGUzZCguOTUsMS4wNSwxKX03NSV7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGUzZCgxLjA1LC45NSwxKTt0cmFuc2Zvcm06c2NhbGUzZCgxLjA1LC45NSwxKX0xMDAley13ZWJraXQtdHJhbnNmb3JtOnNjYWxlM2QoMSwxLDEpO3RyYW5zZm9ybTpzY2FsZTNkKDEsMSwxKX19LnJ1YmJlckJhbmR7LXdlYmtpdC1hbmltYXRpb24tbmFtZTpydWJiZXJCYW5kO2FuaW1hdGlvbi1uYW1lOnJ1YmJlckJhbmR9QC13ZWJraXQta2V5ZnJhbWVzIHNoYWtlezAlLDEwMCV7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwwLDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLDAsMCl9MTAlLDMwJSw1MCUsNzAlLDkwJXstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgtMTBweCwwLDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgtMTBweCwwLDApfTIwJSw0MCUsNjAlLDgwJXstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgxMHB4LDAsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDEwcHgsMCwwKX19QGtleWZyYW1lcyBzaGFrZXswJSwxMDAley13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsMCwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwwLDApfTEwJSwzMCUsNTAlLDcwJSw5MCV7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoLTEwcHgsMCwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoLTEwcHgsMCwwKX0yMCUsNDAlLDYwJSw4MCV7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoMTBweCwwLDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgxMHB4LDAsMCl9fS5zaGFrZXstd2Via2l0LWFuaW1hdGlvbi1uYW1lOnNoYWtlO2FuaW1hdGlvbi1uYW1lOnNoYWtlfUAtd2Via2l0LWtleWZyYW1lcyBzd2luZ3syMCV7LXdlYmtpdC10cmFuc2Zvcm06cm90YXRlM2QoMCwwLDEsMTVkZWcpO3RyYW5zZm9ybTpyb3RhdGUzZCgwLDAsMSwxNWRlZyl9NDAley13ZWJraXQtdHJhbnNmb3JtOnJvdGF0ZTNkKDAsMCwxLC0xMGRlZyk7dHJhbnNmb3JtOnJvdGF0ZTNkKDAsMCwxLC0xMGRlZyl9NjAley13ZWJraXQtdHJhbnNmb3JtOnJvdGF0ZTNkKDAsMCwxLDVkZWcpO3RyYW5zZm9ybTpyb3RhdGUzZCgwLDAsMSw1ZGVnKX04MCV7LXdlYmtpdC10cmFuc2Zvcm06cm90YXRlM2QoMCwwLDEsLTVkZWcpO3RyYW5zZm9ybTpyb3RhdGUzZCgwLDAsMSwtNWRlZyl9MTAwJXstd2Via2l0LXRyYW5zZm9ybTpyb3RhdGUzZCgwLDAsMSwwZGVnKTt0cmFuc2Zvcm06cm90YXRlM2QoMCwwLDEsMGRlZyl9fUBrZXlmcmFtZXMgc3dpbmd7MjAley13ZWJraXQtdHJhbnNmb3JtOnJvdGF0ZTNkKDAsMCwxLDE1ZGVnKTt0cmFuc2Zvcm06cm90YXRlM2QoMCwwLDEsMTVkZWcpfTQwJXstd2Via2l0LXRyYW5zZm9ybTpyb3RhdGUzZCgwLDAsMSwtMTBkZWcpO3RyYW5zZm9ybTpyb3RhdGUzZCgwLDAsMSwtMTBkZWcpfTYwJXstd2Via2l0LXRyYW5zZm9ybTpyb3RhdGUzZCgwLDAsMSw1ZGVnKTt0cmFuc2Zvcm06cm90YXRlM2QoMCwwLDEsNWRlZyl9ODAley13ZWJraXQtdHJhbnNmb3JtOnJvdGF0ZTNkKDAsMCwxLC01ZGVnKTt0cmFuc2Zvcm06cm90YXRlM2QoMCwwLDEsLTVkZWcpfTEwMCV7LXdlYmtpdC10cmFuc2Zvcm06cm90YXRlM2QoMCwwLDEsMGRlZyk7dHJhbnNmb3JtOnJvdGF0ZTNkKDAsMCwxLDBkZWcpfX0uc3dpbmd7LXdlYmtpdC10cmFuc2Zvcm0tb3JpZ2luOnRvcCBjZW50ZXI7LW1zLXRyYW5zZm9ybS1vcmlnaW46dG9wIGNlbnRlcjt0cmFuc2Zvcm0tb3JpZ2luOnRvcCBjZW50ZXI7LXdlYmtpdC1hbmltYXRpb24tbmFtZTpzd2luZzthbmltYXRpb24tbmFtZTpzd2luZ31ALXdlYmtpdC1rZXlmcmFtZXMgdGFkYXswJXstd2Via2l0LXRyYW5zZm9ybTpzY2FsZTNkKDEsMSwxKTt0cmFuc2Zvcm06c2NhbGUzZCgxLDEsMSl9MTAlLDIwJXstd2Via2l0LXRyYW5zZm9ybTpzY2FsZTNkKC45LC45LC45KSByb3RhdGUzZCgwLDAsMSwtM2RlZyk7dHJhbnNmb3JtOnNjYWxlM2QoLjksLjksLjkpIHJvdGF0ZTNkKDAsMCwxLC0zZGVnKX0zMCUsNTAlLDcwJSw5MCV7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGUzZCgxLjEsMS4xLDEuMSkgcm90YXRlM2QoMCwwLDEsM2RlZyk7dHJhbnNmb3JtOnNjYWxlM2QoMS4xLDEuMSwxLjEpIHJvdGF0ZTNkKDAsMCwxLDNkZWcpfTQwJSw2MCUsODAley13ZWJraXQtdHJhbnNmb3JtOnNjYWxlM2QoMS4xLDEuMSwxLjEpIHJvdGF0ZTNkKDAsMCwxLC0zZGVnKTt0cmFuc2Zvcm06c2NhbGUzZCgxLjEsMS4xLDEuMSkgcm90YXRlM2QoMCwwLDEsLTNkZWcpfTEwMCV7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGUzZCgxLDEsMSk7dHJhbnNmb3JtOnNjYWxlM2QoMSwxLDEpfX1Aa2V5ZnJhbWVzIHRhZGF7MCV7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGUzZCgxLDEsMSk7dHJhbnNmb3JtOnNjYWxlM2QoMSwxLDEpfTEwJSwyMCV7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGUzZCguOSwuOSwuOSkgcm90YXRlM2QoMCwwLDEsLTNkZWcpO3RyYW5zZm9ybTpzY2FsZTNkKC45LC45LC45KSByb3RhdGUzZCgwLDAsMSwtM2RlZyl9MzAlLDUwJSw3MCUsOTAley13ZWJraXQtdHJhbnNmb3JtOnNjYWxlM2QoMS4xLDEuMSwxLjEpIHJvdGF0ZTNkKDAsMCwxLDNkZWcpO3RyYW5zZm9ybTpzY2FsZTNkKDEuMSwxLjEsMS4xKSByb3RhdGUzZCgwLDAsMSwzZGVnKX00MCUsNjAlLDgwJXstd2Via2l0LXRyYW5zZm9ybTpzY2FsZTNkKDEuMSwxLjEsMS4xKSByb3RhdGUzZCgwLDAsMSwtM2RlZyk7dHJhbnNmb3JtOnNjYWxlM2QoMS4xLDEuMSwxLjEpIHJvdGF0ZTNkKDAsMCwxLC0zZGVnKX0xMDAley13ZWJraXQtdHJhbnNmb3JtOnNjYWxlM2QoMSwxLDEpO3RyYW5zZm9ybTpzY2FsZTNkKDEsMSwxKX19LnRhZGF7LXdlYmtpdC1hbmltYXRpb24tbmFtZTp0YWRhO2FuaW1hdGlvbi1uYW1lOnRhZGF9QC13ZWJraXQta2V5ZnJhbWVzIHdvYmJsZXswJXstd2Via2l0LXRyYW5zZm9ybTpub25lO3RyYW5zZm9ybTpub25lfTE1JXstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgtMjUlLDAsMCkgcm90YXRlM2QoMCwwLDEsLTVkZWcpO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgtMjUlLDAsMCkgcm90YXRlM2QoMCwwLDEsLTVkZWcpfTMwJXstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgyMCUsMCwwKSByb3RhdGUzZCgwLDAsMSwzZGVnKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoMjAlLDAsMCkgcm90YXRlM2QoMCwwLDEsM2RlZyl9NDUley13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKC0xNSUsMCwwKSByb3RhdGUzZCgwLDAsMSwtM2RlZyk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKC0xNSUsMCwwKSByb3RhdGUzZCgwLDAsMSwtM2RlZyl9NjAley13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDEwJSwwLDApIHJvdGF0ZTNkKDAsMCwxLDJkZWcpO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgxMCUsMCwwKSByb3RhdGUzZCgwLDAsMSwyZGVnKX03NSV7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoLTUlLDAsMCkgcm90YXRlM2QoMCwwLDEsLTFkZWcpO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgtNSUsMCwwKSByb3RhdGUzZCgwLDAsMSwtMWRlZyl9MTAwJXstd2Via2l0LXRyYW5zZm9ybTpub25lO3RyYW5zZm9ybTpub25lfX1Aa2V5ZnJhbWVzIHdvYmJsZXswJXstd2Via2l0LXRyYW5zZm9ybTpub25lO3RyYW5zZm9ybTpub25lfTE1JXstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgtMjUlLDAsMCkgcm90YXRlM2QoMCwwLDEsLTVkZWcpO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgtMjUlLDAsMCkgcm90YXRlM2QoMCwwLDEsLTVkZWcpfTMwJXstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgyMCUsMCwwKSByb3RhdGUzZCgwLDAsMSwzZGVnKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoMjAlLDAsMCkgcm90YXRlM2QoMCwwLDEsM2RlZyl9NDUley13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKC0xNSUsMCwwKSByb3RhdGUzZCgwLDAsMSwtM2RlZyk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKC0xNSUsMCwwKSByb3RhdGUzZCgwLDAsMSwtM2RlZyl9NjAley13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDEwJSwwLDApIHJvdGF0ZTNkKDAsMCwxLDJkZWcpO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgxMCUsMCwwKSByb3RhdGUzZCgwLDAsMSwyZGVnKX03NSV7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoLTUlLDAsMCkgcm90YXRlM2QoMCwwLDEsLTFkZWcpO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgtNSUsMCwwKSByb3RhdGUzZCgwLDAsMSwtMWRlZyl9MTAwJXstd2Via2l0LXRyYW5zZm9ybTpub25lO3RyYW5zZm9ybTpub25lfX0ud29iYmxley13ZWJraXQtYW5pbWF0aW9uLW5hbWU6d29iYmxlO2FuaW1hdGlvbi1uYW1lOndvYmJsZX1ALXdlYmtpdC1rZXlmcmFtZXMgYm91bmNlSW57MCUsMTAwJSwyMCUsNDAlLDYwJSw4MCV7LXdlYmtpdC10cmFuc2l0aW9uLXRpbWluZy1mdW5jdGlvbjpjdWJpYy1iZXppZXIoMC4yMTUsLjYxLC4zNTUsMSk7dHJhbnNpdGlvbi10aW1pbmctZnVuY3Rpb246Y3ViaWMtYmV6aWVyKDAuMjE1LC42MSwuMzU1LDEpfTAle29wYWNpdHk6MDstd2Via2l0LXRyYW5zZm9ybTpzY2FsZTNkKC4zLC4zLC4zKTt0cmFuc2Zvcm06c2NhbGUzZCguMywuMywuMyl9MjAley13ZWJraXQtdHJhbnNmb3JtOnNjYWxlM2QoMS4xLDEuMSwxLjEpO3RyYW5zZm9ybTpzY2FsZTNkKDEuMSwxLjEsMS4xKX00MCV7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGUzZCguOSwuOSwuOSk7dHJhbnNmb3JtOnNjYWxlM2QoLjksLjksLjkpfTYwJXtvcGFjaXR5OjE7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGUzZCgxLjAzLDEuMDMsMS4wMyk7dHJhbnNmb3JtOnNjYWxlM2QoMS4wMywxLjAzLDEuMDMpfTgwJXstd2Via2l0LXRyYW5zZm9ybTpzY2FsZTNkKC45NywuOTcsLjk3KTt0cmFuc2Zvcm06c2NhbGUzZCguOTcsLjk3LC45Nyl9MTAwJXtvcGFjaXR5OjE7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGUzZCgxLDEsMSk7dHJhbnNmb3JtOnNjYWxlM2QoMSwxLDEpfX1Aa2V5ZnJhbWVzIGJvdW5jZUluezAlLDEwMCUsMjAlLDQwJSw2MCUsODAley13ZWJraXQtdHJhbnNpdGlvbi10aW1pbmctZnVuY3Rpb246Y3ViaWMtYmV6aWVyKDAuMjE1LC42MSwuMzU1LDEpO3RyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uOmN1YmljLWJlemllcigwLjIxNSwuNjEsLjM1NSwxKX0wJXtvcGFjaXR5OjA7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGUzZCguMywuMywuMyk7dHJhbnNmb3JtOnNjYWxlM2QoLjMsLjMsLjMpfTIwJXstd2Via2l0LXRyYW5zZm9ybTpzY2FsZTNkKDEuMSwxLjEsMS4xKTt0cmFuc2Zvcm06c2NhbGUzZCgxLjEsMS4xLDEuMSl9NDAley13ZWJraXQtdHJhbnNmb3JtOnNjYWxlM2QoLjksLjksLjkpO3RyYW5zZm9ybTpzY2FsZTNkKC45LC45LC45KX02MCV7b3BhY2l0eToxOy13ZWJraXQtdHJhbnNmb3JtOnNjYWxlM2QoMS4wMywxLjAzLDEuMDMpO3RyYW5zZm9ybTpzY2FsZTNkKDEuMDMsMS4wMywxLjAzKX04MCV7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGUzZCguOTcsLjk3LC45Nyk7dHJhbnNmb3JtOnNjYWxlM2QoLjk3LC45NywuOTcpfTEwMCV7b3BhY2l0eToxOy13ZWJraXQtdHJhbnNmb3JtOnNjYWxlM2QoMSwxLDEpO3RyYW5zZm9ybTpzY2FsZTNkKDEsMSwxKX19LmJvdW5jZUluey13ZWJraXQtYW5pbWF0aW9uLW5hbWU6Ym91bmNlSW47YW5pbWF0aW9uLW5hbWU6Ym91bmNlSW47LXdlYmtpdC1hbmltYXRpb24tZHVyYXRpb246Ljc1czthbmltYXRpb24tZHVyYXRpb246Ljc1c31ALXdlYmtpdC1rZXlmcmFtZXMgYm91bmNlSW5Eb3duezAlLDEwMCUsNjAlLDc1JSw5MCV7LXdlYmtpdC10cmFuc2l0aW9uLXRpbWluZy1mdW5jdGlvbjpjdWJpYy1iZXppZXIoMC4yMTUsLjYxLC4zNTUsMSk7dHJhbnNpdGlvbi10aW1pbmctZnVuY3Rpb246Y3ViaWMtYmV6aWVyKDAuMjE1LC42MSwuMzU1LDEpfTAle29wYWNpdHk6MDstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLC0zMDAwcHgsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsLTMwMDBweCwwKX02MCV7b3BhY2l0eToxOy13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsMjVweCwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwyNXB4LDApfTc1JXstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLC0xMHB4LDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLC0xMHB4LDApfTkwJXstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLDVweCwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCw1cHgsMCl9MTAwJXstd2Via2l0LXRyYW5zZm9ybTpub25lO3RyYW5zZm9ybTpub25lfX1Aa2V5ZnJhbWVzIGJvdW5jZUluRG93bnswJSwxMDAlLDYwJSw3NSUsOTAley13ZWJraXQtdHJhbnNpdGlvbi10aW1pbmctZnVuY3Rpb246Y3ViaWMtYmV6aWVyKDAuMjE1LC42MSwuMzU1LDEpO3RyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uOmN1YmljLWJlemllcigwLjIxNSwuNjEsLjM1NSwxKX0wJXtvcGFjaXR5OjA7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwtMzAwMHB4LDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLC0zMDAwcHgsMCl9NjAle29wYWNpdHk6MTstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLDI1cHgsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsMjVweCwwKX03NSV7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwtMTBweCwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwtMTBweCwwKX05MCV7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCw1cHgsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsNXB4LDApfTEwMCV7LXdlYmtpdC10cmFuc2Zvcm06bm9uZTt0cmFuc2Zvcm06bm9uZX19LmJvdW5jZUluRG93bnstd2Via2l0LWFuaW1hdGlvbi1uYW1lOmJvdW5jZUluRG93bjthbmltYXRpb24tbmFtZTpib3VuY2VJbkRvd259QC13ZWJraXQta2V5ZnJhbWVzIGJvdW5jZUluTGVmdHswJSwxMDAlLDYwJSw3NSUsOTAley13ZWJraXQtdHJhbnNpdGlvbi10aW1pbmctZnVuY3Rpb246Y3ViaWMtYmV6aWVyKDAuMjE1LC42MSwuMzU1LDEpO3RyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uOmN1YmljLWJlemllcigwLjIxNSwuNjEsLjM1NSwxKX0wJXtvcGFjaXR5OjA7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoLTMwMDBweCwwLDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgtMzAwMHB4LDAsMCl9NjAle29wYWNpdHk6MTstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgyNXB4LDAsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDI1cHgsMCwwKX03NSV7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoLTEwcHgsMCwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoLTEwcHgsMCwwKX05MCV7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoNXB4LDAsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDVweCwwLDApfTEwMCV7LXdlYmtpdC10cmFuc2Zvcm06bm9uZTt0cmFuc2Zvcm06bm9uZX19QGtleWZyYW1lcyBib3VuY2VJbkxlZnR7MCUsMTAwJSw2MCUsNzUlLDkwJXstd2Via2l0LXRyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uOmN1YmljLWJlemllcigwLjIxNSwuNjEsLjM1NSwxKTt0cmFuc2l0aW9uLXRpbWluZy1mdW5jdGlvbjpjdWJpYy1iZXppZXIoMC4yMTUsLjYxLC4zNTUsMSl9MCV7b3BhY2l0eTowOy13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKC0zMDAwcHgsMCwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoLTMwMDBweCwwLDApfTYwJXtvcGFjaXR5OjE7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoMjVweCwwLDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgyNXB4LDAsMCl9NzUley13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKC0xMHB4LDAsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKC0xMHB4LDAsMCl9OTAley13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDVweCwwLDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCg1cHgsMCwwKX0xMDAley13ZWJraXQtdHJhbnNmb3JtOm5vbmU7dHJhbnNmb3JtOm5vbmV9fS5ib3VuY2VJbkxlZnR7LXdlYmtpdC1hbmltYXRpb24tbmFtZTpib3VuY2VJbkxlZnQ7YW5pbWF0aW9uLW5hbWU6Ym91bmNlSW5MZWZ0fUAtd2Via2l0LWtleWZyYW1lcyBib3VuY2VJblJpZ2h0ezAlLDEwMCUsNjAlLDc1JSw5MCV7LXdlYmtpdC10cmFuc2l0aW9uLXRpbWluZy1mdW5jdGlvbjpjdWJpYy1iZXppZXIoMC4yMTUsLjYxLC4zNTUsMSk7dHJhbnNpdGlvbi10aW1pbmctZnVuY3Rpb246Y3ViaWMtYmV6aWVyKDAuMjE1LC42MSwuMzU1LDEpfTAle29wYWNpdHk6MDstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgzMDAwcHgsMCwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoMzAwMHB4LDAsMCl9NjAle29wYWNpdHk6MTstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgtMjVweCwwLDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgtMjVweCwwLDApfTc1JXstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgxMHB4LDAsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDEwcHgsMCwwKX05MCV7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoLTVweCwwLDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgtNXB4LDAsMCl9MTAwJXstd2Via2l0LXRyYW5zZm9ybTpub25lO3RyYW5zZm9ybTpub25lfX1Aa2V5ZnJhbWVzIGJvdW5jZUluUmlnaHR7MCUsMTAwJSw2MCUsNzUlLDkwJXstd2Via2l0LXRyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uOmN1YmljLWJlemllcigwLjIxNSwuNjEsLjM1NSwxKTt0cmFuc2l0aW9uLXRpbWluZy1mdW5jdGlvbjpjdWJpYy1iZXppZXIoMC4yMTUsLjYxLC4zNTUsMSl9MCV7b3BhY2l0eTowOy13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDMwMDBweCwwLDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgzMDAwcHgsMCwwKX02MCV7b3BhY2l0eToxOy13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKC0yNXB4LDAsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKC0yNXB4LDAsMCl9NzUley13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDEwcHgsMCwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoMTBweCwwLDApfTkwJXstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgtNXB4LDAsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKC01cHgsMCwwKX0xMDAley13ZWJraXQtdHJhbnNmb3JtOm5vbmU7dHJhbnNmb3JtOm5vbmV9fS5ib3VuY2VJblJpZ2h0ey13ZWJraXQtYW5pbWF0aW9uLW5hbWU6Ym91bmNlSW5SaWdodDthbmltYXRpb24tbmFtZTpib3VuY2VJblJpZ2h0fUAtd2Via2l0LWtleWZyYW1lcyBib3VuY2VJblVwezAlLDEwMCUsNjAlLDc1JSw5MCV7LXdlYmtpdC10cmFuc2l0aW9uLXRpbWluZy1mdW5jdGlvbjpjdWJpYy1iZXppZXIoMC4yMTUsLjYxLC4zNTUsMSk7dHJhbnNpdGlvbi10aW1pbmctZnVuY3Rpb246Y3ViaWMtYmV6aWVyKDAuMjE1LC42MSwuMzU1LDEpfTAle29wYWNpdHk6MDstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLDMwMDBweCwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwzMDAwcHgsMCl9NjAle29wYWNpdHk6MTstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLC0yMHB4LDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLC0yMHB4LDApfTc1JXstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLDEwcHgsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsMTBweCwwKX05MCV7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwtNXB4LDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLC01cHgsMCl9MTAwJXstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLDAsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsMCwwKX19QGtleWZyYW1lcyBib3VuY2VJblVwezAlLDEwMCUsNjAlLDc1JSw5MCV7LXdlYmtpdC10cmFuc2l0aW9uLXRpbWluZy1mdW5jdGlvbjpjdWJpYy1iZXppZXIoMC4yMTUsLjYxLC4zNTUsMSk7dHJhbnNpdGlvbi10aW1pbmctZnVuY3Rpb246Y3ViaWMtYmV6aWVyKDAuMjE1LC42MSwuMzU1LDEpfTAle29wYWNpdHk6MDstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLDMwMDBweCwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwzMDAwcHgsMCl9NjAle29wYWNpdHk6MTstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLC0yMHB4LDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLC0yMHB4LDApfTc1JXstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLDEwcHgsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsMTBweCwwKX05MCV7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwtNXB4LDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLC01cHgsMCl9MTAwJXstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLDAsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsMCwwKX19LmJvdW5jZUluVXB7LXdlYmtpdC1hbmltYXRpb24tbmFtZTpib3VuY2VJblVwO2FuaW1hdGlvbi1uYW1lOmJvdW5jZUluVXB9QC13ZWJraXQta2V5ZnJhbWVzIGJvdW5jZU91dHsyMCV7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGUzZCguOSwuOSwuOSk7dHJhbnNmb3JtOnNjYWxlM2QoLjksLjksLjkpfTUwJSw1NSV7b3BhY2l0eToxOy13ZWJraXQtdHJhbnNmb3JtOnNjYWxlM2QoMS4xLDEuMSwxLjEpO3RyYW5zZm9ybTpzY2FsZTNkKDEuMSwxLjEsMS4xKX0xMDAle29wYWNpdHk6MDstd2Via2l0LXRyYW5zZm9ybTpzY2FsZTNkKC4zLC4zLC4zKTt0cmFuc2Zvcm06c2NhbGUzZCguMywuMywuMyl9fUBrZXlmcmFtZXMgYm91bmNlT3V0ezIwJXstd2Via2l0LXRyYW5zZm9ybTpzY2FsZTNkKC45LC45LC45KTt0cmFuc2Zvcm06c2NhbGUzZCguOSwuOSwuOSl9NTAlLDU1JXtvcGFjaXR5OjE7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGUzZCgxLjEsMS4xLDEuMSk7dHJhbnNmb3JtOnNjYWxlM2QoMS4xLDEuMSwxLjEpfTEwMCV7b3BhY2l0eTowOy13ZWJraXQtdHJhbnNmb3JtOnNjYWxlM2QoLjMsLjMsLjMpO3RyYW5zZm9ybTpzY2FsZTNkKC4zLC4zLC4zKX19LmJvdW5jZU91dHstd2Via2l0LWFuaW1hdGlvbi1uYW1lOmJvdW5jZU91dDthbmltYXRpb24tbmFtZTpib3VuY2VPdXQ7LXdlYmtpdC1hbmltYXRpb24tZHVyYXRpb246Ljc1czthbmltYXRpb24tZHVyYXRpb246Ljc1c31ALXdlYmtpdC1rZXlmcmFtZXMgYm91bmNlT3V0RG93bnsyMCV7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwxMHB4LDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLDEwcHgsMCl9NDAlLDQ1JXtvcGFjaXR5OjE7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwtMjBweCwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwtMjBweCwwKX0xMDAle29wYWNpdHk6MDstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLDIwMDBweCwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwyMDAwcHgsMCl9fUBrZXlmcmFtZXMgYm91bmNlT3V0RG93bnsyMCV7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwxMHB4LDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLDEwcHgsMCl9NDAlLDQ1JXtvcGFjaXR5OjE7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwtMjBweCwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwtMjBweCwwKX0xMDAle29wYWNpdHk6MDstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLDIwMDBweCwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwyMDAwcHgsMCl9fS5ib3VuY2VPdXREb3duey13ZWJraXQtYW5pbWF0aW9uLW5hbWU6Ym91bmNlT3V0RG93bjthbmltYXRpb24tbmFtZTpib3VuY2VPdXREb3dufUAtd2Via2l0LWtleWZyYW1lcyBib3VuY2VPdXRMZWZ0ezIwJXtvcGFjaXR5OjE7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoMjBweCwwLDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgyMHB4LDAsMCl9MTAwJXtvcGFjaXR5OjA7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoLTIwMDBweCwwLDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgtMjAwMHB4LDAsMCl9fUBrZXlmcmFtZXMgYm91bmNlT3V0TGVmdHsyMCV7b3BhY2l0eToxOy13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDIwcHgsMCwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoMjBweCwwLDApfTEwMCV7b3BhY2l0eTowOy13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKC0yMDAwcHgsMCwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoLTIwMDBweCwwLDApfX0uYm91bmNlT3V0TGVmdHstd2Via2l0LWFuaW1hdGlvbi1uYW1lOmJvdW5jZU91dExlZnQ7YW5pbWF0aW9uLW5hbWU6Ym91bmNlT3V0TGVmdH1ALXdlYmtpdC1rZXlmcmFtZXMgYm91bmNlT3V0UmlnaHR7MjAle29wYWNpdHk6MTstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgtMjBweCwwLDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgtMjBweCwwLDApfTEwMCV7b3BhY2l0eTowOy13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDIwMDBweCwwLDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgyMDAwcHgsMCwwKX19QGtleWZyYW1lcyBib3VuY2VPdXRSaWdodHsyMCV7b3BhY2l0eToxOy13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKC0yMHB4LDAsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKC0yMHB4LDAsMCl9MTAwJXtvcGFjaXR5OjA7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoMjAwMHB4LDAsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDIwMDBweCwwLDApfX0uYm91bmNlT3V0UmlnaHR7LXdlYmtpdC1hbmltYXRpb24tbmFtZTpib3VuY2VPdXRSaWdodDthbmltYXRpb24tbmFtZTpib3VuY2VPdXRSaWdodH1ALXdlYmtpdC1rZXlmcmFtZXMgYm91bmNlT3V0VXB7MjAley13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsLTEwcHgsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsLTEwcHgsMCl9NDAlLDQ1JXtvcGFjaXR5OjE7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwyMHB4LDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLDIwcHgsMCl9MTAwJXtvcGFjaXR5OjA7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwtMjAwMHB4LDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLC0yMDAwcHgsMCl9fUBrZXlmcmFtZXMgYm91bmNlT3V0VXB7MjAley13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsLTEwcHgsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsLTEwcHgsMCl9NDAlLDQ1JXtvcGFjaXR5OjE7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwyMHB4LDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLDIwcHgsMCl9MTAwJXtvcGFjaXR5OjA7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwtMjAwMHB4LDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLC0yMDAwcHgsMCl9fS5ib3VuY2VPdXRVcHstd2Via2l0LWFuaW1hdGlvbi1uYW1lOmJvdW5jZU91dFVwO2FuaW1hdGlvbi1uYW1lOmJvdW5jZU91dFVwfUAtd2Via2l0LWtleWZyYW1lcyBmYWRlSW57MCV7b3BhY2l0eTowfTEwMCV7b3BhY2l0eToxfX1Aa2V5ZnJhbWVzIGZhZGVJbnswJXtvcGFjaXR5OjB9MTAwJXtvcGFjaXR5OjF9fS5mYWRlSW57LXdlYmtpdC1hbmltYXRpb24tbmFtZTpmYWRlSW47YW5pbWF0aW9uLW5hbWU6ZmFkZUlufUAtd2Via2l0LWtleWZyYW1lcyBmYWRlSW5Eb3duezAle29wYWNpdHk6MDstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLC0xMDAlLDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLC0xMDAlLDApfTEwMCV7b3BhY2l0eToxOy13ZWJraXQtdHJhbnNmb3JtOm5vbmU7dHJhbnNmb3JtOm5vbmV9fUBrZXlmcmFtZXMgZmFkZUluRG93bnswJXtvcGFjaXR5OjA7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwtMTAwJSwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwtMTAwJSwwKX0xMDAle29wYWNpdHk6MTstd2Via2l0LXRyYW5zZm9ybTpub25lO3RyYW5zZm9ybTpub25lfX0uZmFkZUluRG93bnstd2Via2l0LWFuaW1hdGlvbi1uYW1lOmZhZGVJbkRvd247YW5pbWF0aW9uLW5hbWU6ZmFkZUluRG93bn1ALXdlYmtpdC1rZXlmcmFtZXMgZmFkZUluRG93bkJpZ3swJXtvcGFjaXR5OjA7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwtMjAwMHB4LDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLC0yMDAwcHgsMCl9MTAwJXtvcGFjaXR5OjE7LXdlYmtpdC10cmFuc2Zvcm06bm9uZTt0cmFuc2Zvcm06bm9uZX19QGtleWZyYW1lcyBmYWRlSW5Eb3duQmlnezAle29wYWNpdHk6MDstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLC0yMDAwcHgsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsLTIwMDBweCwwKX0xMDAle29wYWNpdHk6MTstd2Via2l0LXRyYW5zZm9ybTpub25lO3RyYW5zZm9ybTpub25lfX0uZmFkZUluRG93bkJpZ3std2Via2l0LWFuaW1hdGlvbi1uYW1lOmZhZGVJbkRvd25CaWc7YW5pbWF0aW9uLW5hbWU6ZmFkZUluRG93bkJpZ31ALXdlYmtpdC1rZXlmcmFtZXMgZmFkZUluTGVmdHswJXtvcGFjaXR5OjA7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoLTEwMCUsMCwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoLTEwMCUsMCwwKX0xMDAle29wYWNpdHk6MTstd2Via2l0LXRyYW5zZm9ybTpub25lO3RyYW5zZm9ybTpub25lfX1Aa2V5ZnJhbWVzIGZhZGVJbkxlZnR7MCV7b3BhY2l0eTowOy13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKC0xMDAlLDAsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKC0xMDAlLDAsMCl9MTAwJXtvcGFjaXR5OjE7LXdlYmtpdC10cmFuc2Zvcm06bm9uZTt0cmFuc2Zvcm06bm9uZX19LmZhZGVJbkxlZnR7LXdlYmtpdC1hbmltYXRpb24tbmFtZTpmYWRlSW5MZWZ0O2FuaW1hdGlvbi1uYW1lOmZhZGVJbkxlZnR9QC13ZWJraXQta2V5ZnJhbWVzIGZhZGVJbkxlZnRCaWd7MCV7b3BhY2l0eTowOy13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKC0yMDAwcHgsMCwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoLTIwMDBweCwwLDApfTEwMCV7b3BhY2l0eToxOy13ZWJraXQtdHJhbnNmb3JtOm5vbmU7dHJhbnNmb3JtOm5vbmV9fUBrZXlmcmFtZXMgZmFkZUluTGVmdEJpZ3swJXtvcGFjaXR5OjA7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoLTIwMDBweCwwLDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgtMjAwMHB4LDAsMCl9MTAwJXtvcGFjaXR5OjE7LXdlYmtpdC10cmFuc2Zvcm06bm9uZTt0cmFuc2Zvcm06bm9uZX19LmZhZGVJbkxlZnRCaWd7LXdlYmtpdC1hbmltYXRpb24tbmFtZTpmYWRlSW5MZWZ0QmlnO2FuaW1hdGlvbi1uYW1lOmZhZGVJbkxlZnRCaWd9QC13ZWJraXQta2V5ZnJhbWVzIGZhZGVJblJpZ2h0ezAle29wYWNpdHk6MDstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgxMDAlLDAsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDEwMCUsMCwwKX0xMDAle29wYWNpdHk6MTstd2Via2l0LXRyYW5zZm9ybTpub25lO3RyYW5zZm9ybTpub25lfX1Aa2V5ZnJhbWVzIGZhZGVJblJpZ2h0ezAle29wYWNpdHk6MDstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgxMDAlLDAsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDEwMCUsMCwwKX0xMDAle29wYWNpdHk6MTstd2Via2l0LXRyYW5zZm9ybTpub25lO3RyYW5zZm9ybTpub25lfX0uZmFkZUluUmlnaHR7LXdlYmtpdC1hbmltYXRpb24tbmFtZTpmYWRlSW5SaWdodDthbmltYXRpb24tbmFtZTpmYWRlSW5SaWdodH1ALXdlYmtpdC1rZXlmcmFtZXMgZmFkZUluUmlnaHRCaWd7MCV7b3BhY2l0eTowOy13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDIwMDBweCwwLDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgyMDAwcHgsMCwwKX0xMDAle29wYWNpdHk6MTstd2Via2l0LXRyYW5zZm9ybTpub25lO3RyYW5zZm9ybTpub25lfX1Aa2V5ZnJhbWVzIGZhZGVJblJpZ2h0QmlnezAle29wYWNpdHk6MDstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgyMDAwcHgsMCwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoMjAwMHB4LDAsMCl9MTAwJXtvcGFjaXR5OjE7LXdlYmtpdC10cmFuc2Zvcm06bm9uZTt0cmFuc2Zvcm06bm9uZX19LmZhZGVJblJpZ2h0Qmlney13ZWJraXQtYW5pbWF0aW9uLW5hbWU6ZmFkZUluUmlnaHRCaWc7YW5pbWF0aW9uLW5hbWU6ZmFkZUluUmlnaHRCaWd9QC13ZWJraXQta2V5ZnJhbWVzIGZhZGVJblVwezAle29wYWNpdHk6MDstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLDEwMCUsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsMTAwJSwwKX0xMDAle29wYWNpdHk6MTstd2Via2l0LXRyYW5zZm9ybTpub25lO3RyYW5zZm9ybTpub25lfX1Aa2V5ZnJhbWVzIGZhZGVJblVwezAle29wYWNpdHk6MDstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLDEwMCUsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsMTAwJSwwKX0xMDAle29wYWNpdHk6MTstd2Via2l0LXRyYW5zZm9ybTpub25lO3RyYW5zZm9ybTpub25lfX0uZmFkZUluVXB7LXdlYmtpdC1hbmltYXRpb24tbmFtZTpmYWRlSW5VcDthbmltYXRpb24tbmFtZTpmYWRlSW5VcH1ALXdlYmtpdC1rZXlmcmFtZXMgZmFkZUluVXBCaWd7MCV7b3BhY2l0eTowOy13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsMjAwMHB4LDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLDIwMDBweCwwKX0xMDAle29wYWNpdHk6MTstd2Via2l0LXRyYW5zZm9ybTpub25lO3RyYW5zZm9ybTpub25lfX1Aa2V5ZnJhbWVzIGZhZGVJblVwQmlnezAle29wYWNpdHk6MDstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLDIwMDBweCwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwyMDAwcHgsMCl9MTAwJXtvcGFjaXR5OjE7LXdlYmtpdC10cmFuc2Zvcm06bm9uZTt0cmFuc2Zvcm06bm9uZX19LmZhZGVJblVwQmlney13ZWJraXQtYW5pbWF0aW9uLW5hbWU6ZmFkZUluVXBCaWc7YW5pbWF0aW9uLW5hbWU6ZmFkZUluVXBCaWd9QC13ZWJraXQta2V5ZnJhbWVzIGZhZGVPdXR7MCV7b3BhY2l0eToxfTEwMCV7b3BhY2l0eTowfX1Aa2V5ZnJhbWVzIGZhZGVPdXR7MCV7b3BhY2l0eToxfTEwMCV7b3BhY2l0eTowfX0uZmFkZU91dHstd2Via2l0LWFuaW1hdGlvbi1uYW1lOmZhZGVPdXQ7YW5pbWF0aW9uLW5hbWU6ZmFkZU91dH1ALXdlYmtpdC1rZXlmcmFtZXMgZmFkZU91dERvd257MCV7b3BhY2l0eToxfTEwMCV7b3BhY2l0eTowOy13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsMTAwJSwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwxMDAlLDApfX1Aa2V5ZnJhbWVzIGZhZGVPdXREb3duezAle29wYWNpdHk6MX0xMDAle29wYWNpdHk6MDstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLDEwMCUsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsMTAwJSwwKX19LmZhZGVPdXREb3duey13ZWJraXQtYW5pbWF0aW9uLW5hbWU6ZmFkZU91dERvd247YW5pbWF0aW9uLW5hbWU6ZmFkZU91dERvd259QC13ZWJraXQta2V5ZnJhbWVzIGZhZGVPdXREb3duQmlnezAle29wYWNpdHk6MX0xMDAle29wYWNpdHk6MDstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLDIwMDBweCwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwyMDAwcHgsMCl9fUBrZXlmcmFtZXMgZmFkZU91dERvd25CaWd7MCV7b3BhY2l0eToxfTEwMCV7b3BhY2l0eTowOy13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsMjAwMHB4LDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLDIwMDBweCwwKX19LmZhZGVPdXREb3duQmlney13ZWJraXQtYW5pbWF0aW9uLW5hbWU6ZmFkZU91dERvd25CaWc7YW5pbWF0aW9uLW5hbWU6ZmFkZU91dERvd25CaWd9QC13ZWJraXQta2V5ZnJhbWVzIGZhZGVPdXRMZWZ0ezAle29wYWNpdHk6MX0xMDAle29wYWNpdHk6MDstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgtMTAwJSwwLDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgtMTAwJSwwLDApfX1Aa2V5ZnJhbWVzIGZhZGVPdXRMZWZ0ezAle29wYWNpdHk6MX0xMDAle29wYWNpdHk6MDstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgtMTAwJSwwLDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgtMTAwJSwwLDApfX0uZmFkZU91dExlZnR7LXdlYmtpdC1hbmltYXRpb24tbmFtZTpmYWRlT3V0TGVmdDthbmltYXRpb24tbmFtZTpmYWRlT3V0TGVmdH1ALXdlYmtpdC1rZXlmcmFtZXMgZmFkZU91dExlZnRCaWd7MCV7b3BhY2l0eToxfTEwMCV7b3BhY2l0eTowOy13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKC0yMDAwcHgsMCwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoLTIwMDBweCwwLDApfX1Aa2V5ZnJhbWVzIGZhZGVPdXRMZWZ0QmlnezAle29wYWNpdHk6MX0xMDAle29wYWNpdHk6MDstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgtMjAwMHB4LDAsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKC0yMDAwcHgsMCwwKX19LmZhZGVPdXRMZWZ0Qmlney13ZWJraXQtYW5pbWF0aW9uLW5hbWU6ZmFkZU91dExlZnRCaWc7YW5pbWF0aW9uLW5hbWU6ZmFkZU91dExlZnRCaWd9QC13ZWJraXQta2V5ZnJhbWVzIGZhZGVPdXRSaWdodHswJXtvcGFjaXR5OjF9MTAwJXtvcGFjaXR5OjA7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoMTAwJSwwLDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgxMDAlLDAsMCl9fUBrZXlmcmFtZXMgZmFkZU91dFJpZ2h0ezAle29wYWNpdHk6MX0xMDAle29wYWNpdHk6MDstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgxMDAlLDAsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDEwMCUsMCwwKX19LmZhZGVPdXRSaWdodHstd2Via2l0LWFuaW1hdGlvbi1uYW1lOmZhZGVPdXRSaWdodDthbmltYXRpb24tbmFtZTpmYWRlT3V0UmlnaHR9QC13ZWJraXQta2V5ZnJhbWVzIGZhZGVPdXRSaWdodEJpZ3swJXtvcGFjaXR5OjF9MTAwJXtvcGFjaXR5OjA7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoMjAwMHB4LDAsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDIwMDBweCwwLDApfX1Aa2V5ZnJhbWVzIGZhZGVPdXRSaWdodEJpZ3swJXtvcGFjaXR5OjF9MTAwJXtvcGFjaXR5OjA7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoMjAwMHB4LDAsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDIwMDBweCwwLDApfX0uZmFkZU91dFJpZ2h0Qmlney13ZWJraXQtYW5pbWF0aW9uLW5hbWU6ZmFkZU91dFJpZ2h0QmlnO2FuaW1hdGlvbi1uYW1lOmZhZGVPdXRSaWdodEJpZ31ALXdlYmtpdC1rZXlmcmFtZXMgZmFkZU91dFVwezAle29wYWNpdHk6MX0xMDAle29wYWNpdHk6MDstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLC0xMDAlLDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLC0xMDAlLDApfX1Aa2V5ZnJhbWVzIGZhZGVPdXRVcHswJXtvcGFjaXR5OjF9MTAwJXtvcGFjaXR5OjA7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwtMTAwJSwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwtMTAwJSwwKX19LmZhZGVPdXRVcHstd2Via2l0LWFuaW1hdGlvbi1uYW1lOmZhZGVPdXRVcDthbmltYXRpb24tbmFtZTpmYWRlT3V0VXB9QC13ZWJraXQta2V5ZnJhbWVzIGZhZGVPdXRVcEJpZ3swJXtvcGFjaXR5OjF9MTAwJXtvcGFjaXR5OjA7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwtMjAwMHB4LDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLC0yMDAwcHgsMCl9fUBrZXlmcmFtZXMgZmFkZU91dFVwQmlnezAle29wYWNpdHk6MX0xMDAle29wYWNpdHk6MDstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLC0yMDAwcHgsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsLTIwMDBweCwwKX19LmZhZGVPdXRVcEJpZ3std2Via2l0LWFuaW1hdGlvbi1uYW1lOmZhZGVPdXRVcEJpZzthbmltYXRpb24tbmFtZTpmYWRlT3V0VXBCaWd9QC13ZWJraXQta2V5ZnJhbWVzIGZsaXB7MCV7LXdlYmtpdC10cmFuc2Zvcm06cGVyc3BlY3RpdmUoNDAwcHgpIHJvdGF0ZTNkKDAsMSwwLC0zNjBkZWcpO3RyYW5zZm9ybTpwZXJzcGVjdGl2ZSg0MDBweCkgcm90YXRlM2QoMCwxLDAsLTM2MGRlZyk7LXdlYmtpdC1hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOmVhc2Utb3V0O2FuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246ZWFzZS1vdXR9NDAley13ZWJraXQtdHJhbnNmb3JtOnBlcnNwZWN0aXZlKDQwMHB4KSB0cmFuc2xhdGUzZCgwLDAsMTUwcHgpIHJvdGF0ZTNkKDAsMSwwLC0xOTBkZWcpO3RyYW5zZm9ybTpwZXJzcGVjdGl2ZSg0MDBweCkgdHJhbnNsYXRlM2QoMCwwLDE1MHB4KSByb3RhdGUzZCgwLDEsMCwtMTkwZGVnKTstd2Via2l0LWFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246ZWFzZS1vdXQ7YW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjplYXNlLW91dH01MCV7LXdlYmtpdC10cmFuc2Zvcm06cGVyc3BlY3RpdmUoNDAwcHgpIHRyYW5zbGF0ZTNkKDAsMCwxNTBweCkgcm90YXRlM2QoMCwxLDAsLTE3MGRlZyk7dHJhbnNmb3JtOnBlcnNwZWN0aXZlKDQwMHB4KSB0cmFuc2xhdGUzZCgwLDAsMTUwcHgpIHJvdGF0ZTNkKDAsMSwwLC0xNzBkZWcpOy13ZWJraXQtYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjplYXNlLWluO2FuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246ZWFzZS1pbn04MCV7LXdlYmtpdC10cmFuc2Zvcm06cGVyc3BlY3RpdmUoNDAwcHgpIHNjYWxlM2QoLjk1LC45NSwuOTUpO3RyYW5zZm9ybTpwZXJzcGVjdGl2ZSg0MDBweCkgc2NhbGUzZCguOTUsLjk1LC45NSk7LXdlYmtpdC1hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOmVhc2UtaW47YW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjplYXNlLWlufTEwMCV7LXdlYmtpdC10cmFuc2Zvcm06cGVyc3BlY3RpdmUoNDAwcHgpO3RyYW5zZm9ybTpwZXJzcGVjdGl2ZSg0MDBweCk7LXdlYmtpdC1hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOmVhc2UtaW47YW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjplYXNlLWlufX1Aa2V5ZnJhbWVzIGZsaXB7MCV7LXdlYmtpdC10cmFuc2Zvcm06cGVyc3BlY3RpdmUoNDAwcHgpIHJvdGF0ZTNkKDAsMSwwLC0zNjBkZWcpO3RyYW5zZm9ybTpwZXJzcGVjdGl2ZSg0MDBweCkgcm90YXRlM2QoMCwxLDAsLTM2MGRlZyk7LXdlYmtpdC1hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOmVhc2Utb3V0O2FuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246ZWFzZS1vdXR9NDAley13ZWJraXQtdHJhbnNmb3JtOnBlcnNwZWN0aXZlKDQwMHB4KSB0cmFuc2xhdGUzZCgwLDAsMTUwcHgpIHJvdGF0ZTNkKDAsMSwwLC0xOTBkZWcpO3RyYW5zZm9ybTpwZXJzcGVjdGl2ZSg0MDBweCkgdHJhbnNsYXRlM2QoMCwwLDE1MHB4KSByb3RhdGUzZCgwLDEsMCwtMTkwZGVnKTstd2Via2l0LWFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246ZWFzZS1vdXQ7YW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjplYXNlLW91dH01MCV7LXdlYmtpdC10cmFuc2Zvcm06cGVyc3BlY3RpdmUoNDAwcHgpIHRyYW5zbGF0ZTNkKDAsMCwxNTBweCkgcm90YXRlM2QoMCwxLDAsLTE3MGRlZyk7dHJhbnNmb3JtOnBlcnNwZWN0aXZlKDQwMHB4KSB0cmFuc2xhdGUzZCgwLDAsMTUwcHgpIHJvdGF0ZTNkKDAsMSwwLC0xNzBkZWcpOy13ZWJraXQtYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjplYXNlLWluO2FuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246ZWFzZS1pbn04MCV7LXdlYmtpdC10cmFuc2Zvcm06cGVyc3BlY3RpdmUoNDAwcHgpIHNjYWxlM2QoLjk1LC45NSwuOTUpO3RyYW5zZm9ybTpwZXJzcGVjdGl2ZSg0MDBweCkgc2NhbGUzZCguOTUsLjk1LC45NSk7LXdlYmtpdC1hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOmVhc2UtaW47YW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjplYXNlLWlufTEwMCV7LXdlYmtpdC10cmFuc2Zvcm06cGVyc3BlY3RpdmUoNDAwcHgpO3RyYW5zZm9ybTpwZXJzcGVjdGl2ZSg0MDBweCk7LXdlYmtpdC1hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOmVhc2UtaW47YW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjplYXNlLWlufX0uYW5pbWF0ZWQuZmxpcHstd2Via2l0LWJhY2tmYWNlLXZpc2liaWxpdHk6dmlzaWJsZTtiYWNrZmFjZS12aXNpYmlsaXR5OnZpc2libGU7LXdlYmtpdC1hbmltYXRpb24tbmFtZTpmbGlwO2FuaW1hdGlvbi1uYW1lOmZsaXB9QC13ZWJraXQta2V5ZnJhbWVzIGZsaXBJblh7MCV7LXdlYmtpdC10cmFuc2Zvcm06cGVyc3BlY3RpdmUoNDAwcHgpIHJvdGF0ZTNkKDEsMCwwLDkwZGVnKTt0cmFuc2Zvcm06cGVyc3BlY3RpdmUoNDAwcHgpIHJvdGF0ZTNkKDEsMCwwLDkwZGVnKTstd2Via2l0LXRyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uOmVhc2UtaW47dHJhbnNpdGlvbi10aW1pbmctZnVuY3Rpb246ZWFzZS1pbjtvcGFjaXR5OjB9NDAley13ZWJraXQtdHJhbnNmb3JtOnBlcnNwZWN0aXZlKDQwMHB4KSByb3RhdGUzZCgxLDAsMCwtMjBkZWcpO3RyYW5zZm9ybTpwZXJzcGVjdGl2ZSg0MDBweCkgcm90YXRlM2QoMSwwLDAsLTIwZGVnKTstd2Via2l0LXRyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uOmVhc2UtaW47dHJhbnNpdGlvbi10aW1pbmctZnVuY3Rpb246ZWFzZS1pbn02MCV7LXdlYmtpdC10cmFuc2Zvcm06cGVyc3BlY3RpdmUoNDAwcHgpIHJvdGF0ZTNkKDEsMCwwLDEwZGVnKTt0cmFuc2Zvcm06cGVyc3BlY3RpdmUoNDAwcHgpIHJvdGF0ZTNkKDEsMCwwLDEwZGVnKTtvcGFjaXR5OjF9ODAley13ZWJraXQtdHJhbnNmb3JtOnBlcnNwZWN0aXZlKDQwMHB4KSByb3RhdGUzZCgxLDAsMCwtNWRlZyk7dHJhbnNmb3JtOnBlcnNwZWN0aXZlKDQwMHB4KSByb3RhdGUzZCgxLDAsMCwtNWRlZyl9MTAwJXstd2Via2l0LXRyYW5zZm9ybTpwZXJzcGVjdGl2ZSg0MDBweCk7dHJhbnNmb3JtOnBlcnNwZWN0aXZlKDQwMHB4KX19QGtleWZyYW1lcyBmbGlwSW5YezAley13ZWJraXQtdHJhbnNmb3JtOnBlcnNwZWN0aXZlKDQwMHB4KSByb3RhdGUzZCgxLDAsMCw5MGRlZyk7dHJhbnNmb3JtOnBlcnNwZWN0aXZlKDQwMHB4KSByb3RhdGUzZCgxLDAsMCw5MGRlZyk7LXdlYmtpdC10cmFuc2l0aW9uLXRpbWluZy1mdW5jdGlvbjplYXNlLWluO3RyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uOmVhc2UtaW47b3BhY2l0eTowfTQwJXstd2Via2l0LXRyYW5zZm9ybTpwZXJzcGVjdGl2ZSg0MDBweCkgcm90YXRlM2QoMSwwLDAsLTIwZGVnKTt0cmFuc2Zvcm06cGVyc3BlY3RpdmUoNDAwcHgpIHJvdGF0ZTNkKDEsMCwwLC0yMGRlZyk7LXdlYmtpdC10cmFuc2l0aW9uLXRpbWluZy1mdW5jdGlvbjplYXNlLWluO3RyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uOmVhc2UtaW59NjAley13ZWJraXQtdHJhbnNmb3JtOnBlcnNwZWN0aXZlKDQwMHB4KSByb3RhdGUzZCgxLDAsMCwxMGRlZyk7dHJhbnNmb3JtOnBlcnNwZWN0aXZlKDQwMHB4KSByb3RhdGUzZCgxLDAsMCwxMGRlZyk7b3BhY2l0eToxfTgwJXstd2Via2l0LXRyYW5zZm9ybTpwZXJzcGVjdGl2ZSg0MDBweCkgcm90YXRlM2QoMSwwLDAsLTVkZWcpO3RyYW5zZm9ybTpwZXJzcGVjdGl2ZSg0MDBweCkgcm90YXRlM2QoMSwwLDAsLTVkZWcpfTEwMCV7LXdlYmtpdC10cmFuc2Zvcm06cGVyc3BlY3RpdmUoNDAwcHgpO3RyYW5zZm9ybTpwZXJzcGVjdGl2ZSg0MDBweCl9fS5mbGlwSW5Yey13ZWJraXQtYmFja2ZhY2UtdmlzaWJpbGl0eTp2aXNpYmxlIWltcG9ydGFudDtiYWNrZmFjZS12aXNpYmlsaXR5OnZpc2libGUhaW1wb3J0YW50Oy13ZWJraXQtYW5pbWF0aW9uLW5hbWU6ZmxpcEluWDthbmltYXRpb24tbmFtZTpmbGlwSW5YfUAtd2Via2l0LWtleWZyYW1lcyBmbGlwSW5ZezAley13ZWJraXQtdHJhbnNmb3JtOnBlcnNwZWN0aXZlKDQwMHB4KSByb3RhdGUzZCgwLDEsMCw5MGRlZyk7dHJhbnNmb3JtOnBlcnNwZWN0aXZlKDQwMHB4KSByb3RhdGUzZCgwLDEsMCw5MGRlZyk7LXdlYmtpdC10cmFuc2l0aW9uLXRpbWluZy1mdW5jdGlvbjplYXNlLWluO3RyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uOmVhc2UtaW47b3BhY2l0eTowfTQwJXstd2Via2l0LXRyYW5zZm9ybTpwZXJzcGVjdGl2ZSg0MDBweCkgcm90YXRlM2QoMCwxLDAsLTIwZGVnKTt0cmFuc2Zvcm06cGVyc3BlY3RpdmUoNDAwcHgpIHJvdGF0ZTNkKDAsMSwwLC0yMGRlZyk7LXdlYmtpdC10cmFuc2l0aW9uLXRpbWluZy1mdW5jdGlvbjplYXNlLWluO3RyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uOmVhc2UtaW59NjAley13ZWJraXQtdHJhbnNmb3JtOnBlcnNwZWN0aXZlKDQwMHB4KSByb3RhdGUzZCgwLDEsMCwxMGRlZyk7dHJhbnNmb3JtOnBlcnNwZWN0aXZlKDQwMHB4KSByb3RhdGUzZCgwLDEsMCwxMGRlZyk7b3BhY2l0eToxfTgwJXstd2Via2l0LXRyYW5zZm9ybTpwZXJzcGVjdGl2ZSg0MDBweCkgcm90YXRlM2QoMCwxLDAsLTVkZWcpO3RyYW5zZm9ybTpwZXJzcGVjdGl2ZSg0MDBweCkgcm90YXRlM2QoMCwxLDAsLTVkZWcpfTEwMCV7LXdlYmtpdC10cmFuc2Zvcm06cGVyc3BlY3RpdmUoNDAwcHgpO3RyYW5zZm9ybTpwZXJzcGVjdGl2ZSg0MDBweCl9fUBrZXlmcmFtZXMgZmxpcEluWXswJXstd2Via2l0LXRyYW5zZm9ybTpwZXJzcGVjdGl2ZSg0MDBweCkgcm90YXRlM2QoMCwxLDAsOTBkZWcpO3RyYW5zZm9ybTpwZXJzcGVjdGl2ZSg0MDBweCkgcm90YXRlM2QoMCwxLDAsOTBkZWcpOy13ZWJraXQtdHJhbnNpdGlvbi10aW1pbmctZnVuY3Rpb246ZWFzZS1pbjt0cmFuc2l0aW9uLXRpbWluZy1mdW5jdGlvbjplYXNlLWluO29wYWNpdHk6MH00MCV7LXdlYmtpdC10cmFuc2Zvcm06cGVyc3BlY3RpdmUoNDAwcHgpIHJvdGF0ZTNkKDAsMSwwLC0yMGRlZyk7dHJhbnNmb3JtOnBlcnNwZWN0aXZlKDQwMHB4KSByb3RhdGUzZCgwLDEsMCwtMjBkZWcpOy13ZWJraXQtdHJhbnNpdGlvbi10aW1pbmctZnVuY3Rpb246ZWFzZS1pbjt0cmFuc2l0aW9uLXRpbWluZy1mdW5jdGlvbjplYXNlLWlufTYwJXstd2Via2l0LXRyYW5zZm9ybTpwZXJzcGVjdGl2ZSg0MDBweCkgcm90YXRlM2QoMCwxLDAsMTBkZWcpO3RyYW5zZm9ybTpwZXJzcGVjdGl2ZSg0MDBweCkgcm90YXRlM2QoMCwxLDAsMTBkZWcpO29wYWNpdHk6MX04MCV7LXdlYmtpdC10cmFuc2Zvcm06cGVyc3BlY3RpdmUoNDAwcHgpIHJvdGF0ZTNkKDAsMSwwLC01ZGVnKTt0cmFuc2Zvcm06cGVyc3BlY3RpdmUoNDAwcHgpIHJvdGF0ZTNkKDAsMSwwLC01ZGVnKX0xMDAley13ZWJraXQtdHJhbnNmb3JtOnBlcnNwZWN0aXZlKDQwMHB4KTt0cmFuc2Zvcm06cGVyc3BlY3RpdmUoNDAwcHgpfX0uZmxpcEluWXstd2Via2l0LWJhY2tmYWNlLXZpc2liaWxpdHk6dmlzaWJsZSFpbXBvcnRhbnQ7YmFja2ZhY2UtdmlzaWJpbGl0eTp2aXNpYmxlIWltcG9ydGFudDstd2Via2l0LWFuaW1hdGlvbi1uYW1lOmZsaXBJblk7YW5pbWF0aW9uLW5hbWU6ZmxpcEluWX1ALXdlYmtpdC1rZXlmcmFtZXMgZmxpcE91dFh7MCV7LXdlYmtpdC10cmFuc2Zvcm06cGVyc3BlY3RpdmUoNDAwcHgpO3RyYW5zZm9ybTpwZXJzcGVjdGl2ZSg0MDBweCl9MzAley13ZWJraXQtdHJhbnNmb3JtOnBlcnNwZWN0aXZlKDQwMHB4KSByb3RhdGUzZCgxLDAsMCwtMjBkZWcpO3RyYW5zZm9ybTpwZXJzcGVjdGl2ZSg0MDBweCkgcm90YXRlM2QoMSwwLDAsLTIwZGVnKTtvcGFjaXR5OjF9MTAwJXstd2Via2l0LXRyYW5zZm9ybTpwZXJzcGVjdGl2ZSg0MDBweCkgcm90YXRlM2QoMSwwLDAsOTBkZWcpO3RyYW5zZm9ybTpwZXJzcGVjdGl2ZSg0MDBweCkgcm90YXRlM2QoMSwwLDAsOTBkZWcpO29wYWNpdHk6MH19QGtleWZyYW1lcyBmbGlwT3V0WHswJXstd2Via2l0LXRyYW5zZm9ybTpwZXJzcGVjdGl2ZSg0MDBweCk7dHJhbnNmb3JtOnBlcnNwZWN0aXZlKDQwMHB4KX0zMCV7LXdlYmtpdC10cmFuc2Zvcm06cGVyc3BlY3RpdmUoNDAwcHgpIHJvdGF0ZTNkKDEsMCwwLC0yMGRlZyk7dHJhbnNmb3JtOnBlcnNwZWN0aXZlKDQwMHB4KSByb3RhdGUzZCgxLDAsMCwtMjBkZWcpO29wYWNpdHk6MX0xMDAley13ZWJraXQtdHJhbnNmb3JtOnBlcnNwZWN0aXZlKDQwMHB4KSByb3RhdGUzZCgxLDAsMCw5MGRlZyk7dHJhbnNmb3JtOnBlcnNwZWN0aXZlKDQwMHB4KSByb3RhdGUzZCgxLDAsMCw5MGRlZyk7b3BhY2l0eTowfX0uZmxpcE91dFh7LXdlYmtpdC1hbmltYXRpb24tbmFtZTpmbGlwT3V0WDthbmltYXRpb24tbmFtZTpmbGlwT3V0WDstd2Via2l0LWFuaW1hdGlvbi1kdXJhdGlvbjouNzVzO2FuaW1hdGlvbi1kdXJhdGlvbjouNzVzOy13ZWJraXQtYmFja2ZhY2UtdmlzaWJpbGl0eTp2aXNpYmxlIWltcG9ydGFudDtiYWNrZmFjZS12aXNpYmlsaXR5OnZpc2libGUhaW1wb3J0YW50fUAtd2Via2l0LWtleWZyYW1lcyBmbGlwT3V0WXswJXstd2Via2l0LXRyYW5zZm9ybTpwZXJzcGVjdGl2ZSg0MDBweCk7dHJhbnNmb3JtOnBlcnNwZWN0aXZlKDQwMHB4KX0zMCV7LXdlYmtpdC10cmFuc2Zvcm06cGVyc3BlY3RpdmUoNDAwcHgpIHJvdGF0ZTNkKDAsMSwwLC0xNWRlZyk7dHJhbnNmb3JtOnBlcnNwZWN0aXZlKDQwMHB4KSByb3RhdGUzZCgwLDEsMCwtMTVkZWcpO29wYWNpdHk6MX0xMDAley13ZWJraXQtdHJhbnNmb3JtOnBlcnNwZWN0aXZlKDQwMHB4KSByb3RhdGUzZCgwLDEsMCw5MGRlZyk7dHJhbnNmb3JtOnBlcnNwZWN0aXZlKDQwMHB4KSByb3RhdGUzZCgwLDEsMCw5MGRlZyk7b3BhY2l0eTowfX1Aa2V5ZnJhbWVzIGZsaXBPdXRZezAley13ZWJraXQtdHJhbnNmb3JtOnBlcnNwZWN0aXZlKDQwMHB4KTt0cmFuc2Zvcm06cGVyc3BlY3RpdmUoNDAwcHgpfTMwJXstd2Via2l0LXRyYW5zZm9ybTpwZXJzcGVjdGl2ZSg0MDBweCkgcm90YXRlM2QoMCwxLDAsLTE1ZGVnKTt0cmFuc2Zvcm06cGVyc3BlY3RpdmUoNDAwcHgpIHJvdGF0ZTNkKDAsMSwwLC0xNWRlZyk7b3BhY2l0eToxfTEwMCV7LXdlYmtpdC10cmFuc2Zvcm06cGVyc3BlY3RpdmUoNDAwcHgpIHJvdGF0ZTNkKDAsMSwwLDkwZGVnKTt0cmFuc2Zvcm06cGVyc3BlY3RpdmUoNDAwcHgpIHJvdGF0ZTNkKDAsMSwwLDkwZGVnKTtvcGFjaXR5OjB9fS5mbGlwT3V0WXstd2Via2l0LWJhY2tmYWNlLXZpc2liaWxpdHk6dmlzaWJsZSFpbXBvcnRhbnQ7YmFja2ZhY2UtdmlzaWJpbGl0eTp2aXNpYmxlIWltcG9ydGFudDstd2Via2l0LWFuaW1hdGlvbi1uYW1lOmZsaXBPdXRZO2FuaW1hdGlvbi1uYW1lOmZsaXBPdXRZOy13ZWJraXQtYW5pbWF0aW9uLWR1cmF0aW9uOi43NXM7YW5pbWF0aW9uLWR1cmF0aW9uOi43NXN9QC13ZWJraXQta2V5ZnJhbWVzIGxpZ2h0U3BlZWRJbnswJXstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgxMDAlLDAsMCkgc2tld1goLTMwZGVnKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoMTAwJSwwLDApIHNrZXdYKC0zMGRlZyk7b3BhY2l0eTowfTYwJXstd2Via2l0LXRyYW5zZm9ybTpza2V3WCgyMGRlZyk7dHJhbnNmb3JtOnNrZXdYKDIwZGVnKTtvcGFjaXR5OjF9ODAley13ZWJraXQtdHJhbnNmb3JtOnNrZXdYKC01ZGVnKTt0cmFuc2Zvcm06c2tld1goLTVkZWcpO29wYWNpdHk6MX0xMDAley13ZWJraXQtdHJhbnNmb3JtOm5vbmU7dHJhbnNmb3JtOm5vbmU7b3BhY2l0eToxfX1Aa2V5ZnJhbWVzIGxpZ2h0U3BlZWRJbnswJXstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgxMDAlLDAsMCkgc2tld1goLTMwZGVnKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoMTAwJSwwLDApIHNrZXdYKC0zMGRlZyk7b3BhY2l0eTowfTYwJXstd2Via2l0LXRyYW5zZm9ybTpza2V3WCgyMGRlZyk7dHJhbnNmb3JtOnNrZXdYKDIwZGVnKTtvcGFjaXR5OjF9ODAley13ZWJraXQtdHJhbnNmb3JtOnNrZXdYKC01ZGVnKTt0cmFuc2Zvcm06c2tld1goLTVkZWcpO29wYWNpdHk6MX0xMDAley13ZWJraXQtdHJhbnNmb3JtOm5vbmU7dHJhbnNmb3JtOm5vbmU7b3BhY2l0eToxfX0ubGlnaHRTcGVlZEluey13ZWJraXQtYW5pbWF0aW9uLW5hbWU6bGlnaHRTcGVlZEluO2FuaW1hdGlvbi1uYW1lOmxpZ2h0U3BlZWRJbjstd2Via2l0LWFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246ZWFzZS1vdXQ7YW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjplYXNlLW91dH1ALXdlYmtpdC1rZXlmcmFtZXMgbGlnaHRTcGVlZE91dHswJXtvcGFjaXR5OjF9MTAwJXstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgxMDAlLDAsMCkgc2tld1goMzBkZWcpO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgxMDAlLDAsMCkgc2tld1goMzBkZWcpO29wYWNpdHk6MH19QGtleWZyYW1lcyBsaWdodFNwZWVkT3V0ezAle29wYWNpdHk6MX0xMDAley13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDEwMCUsMCwwKSBza2V3WCgzMGRlZyk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDEwMCUsMCwwKSBza2V3WCgzMGRlZyk7b3BhY2l0eTowfX0ubGlnaHRTcGVlZE91dHstd2Via2l0LWFuaW1hdGlvbi1uYW1lOmxpZ2h0U3BlZWRPdXQ7YW5pbWF0aW9uLW5hbWU6bGlnaHRTcGVlZE91dDstd2Via2l0LWFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246ZWFzZS1pbjthbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOmVhc2UtaW59QC13ZWJraXQta2V5ZnJhbWVzIHJvdGF0ZUluezAley13ZWJraXQtdHJhbnNmb3JtLW9yaWdpbjpjZW50ZXI7dHJhbnNmb3JtLW9yaWdpbjpjZW50ZXI7LXdlYmtpdC10cmFuc2Zvcm06cm90YXRlM2QoMCwwLDEsLTIwMGRlZyk7dHJhbnNmb3JtOnJvdGF0ZTNkKDAsMCwxLC0yMDBkZWcpO29wYWNpdHk6MH0xMDAley13ZWJraXQtdHJhbnNmb3JtLW9yaWdpbjpjZW50ZXI7dHJhbnNmb3JtLW9yaWdpbjpjZW50ZXI7LXdlYmtpdC10cmFuc2Zvcm06bm9uZTt0cmFuc2Zvcm06bm9uZTtvcGFjaXR5OjF9fUBrZXlmcmFtZXMgcm90YXRlSW57MCV7LXdlYmtpdC10cmFuc2Zvcm0tb3JpZ2luOmNlbnRlcjt0cmFuc2Zvcm0tb3JpZ2luOmNlbnRlcjstd2Via2l0LXRyYW5zZm9ybTpyb3RhdGUzZCgwLDAsMSwtMjAwZGVnKTt0cmFuc2Zvcm06cm90YXRlM2QoMCwwLDEsLTIwMGRlZyk7b3BhY2l0eTowfTEwMCV7LXdlYmtpdC10cmFuc2Zvcm0tb3JpZ2luOmNlbnRlcjt0cmFuc2Zvcm0tb3JpZ2luOmNlbnRlcjstd2Via2l0LXRyYW5zZm9ybTpub25lO3RyYW5zZm9ybTpub25lO29wYWNpdHk6MX19LnJvdGF0ZUluey13ZWJraXQtYW5pbWF0aW9uLW5hbWU6cm90YXRlSW47YW5pbWF0aW9uLW5hbWU6cm90YXRlSW59QC13ZWJraXQta2V5ZnJhbWVzIHJvdGF0ZUluRG93bkxlZnR7MCV7LXdlYmtpdC10cmFuc2Zvcm0tb3JpZ2luOmxlZnQgYm90dG9tO3RyYW5zZm9ybS1vcmlnaW46bGVmdCBib3R0b207LXdlYmtpdC10cmFuc2Zvcm06cm90YXRlM2QoMCwwLDEsLTQ1ZGVnKTt0cmFuc2Zvcm06cm90YXRlM2QoMCwwLDEsLTQ1ZGVnKTtvcGFjaXR5OjB9MTAwJXstd2Via2l0LXRyYW5zZm9ybS1vcmlnaW46bGVmdCBib3R0b207dHJhbnNmb3JtLW9yaWdpbjpsZWZ0IGJvdHRvbTstd2Via2l0LXRyYW5zZm9ybTpub25lO3RyYW5zZm9ybTpub25lO29wYWNpdHk6MX19QGtleWZyYW1lcyByb3RhdGVJbkRvd25MZWZ0ezAley13ZWJraXQtdHJhbnNmb3JtLW9yaWdpbjpsZWZ0IGJvdHRvbTt0cmFuc2Zvcm0tb3JpZ2luOmxlZnQgYm90dG9tOy13ZWJraXQtdHJhbnNmb3JtOnJvdGF0ZTNkKDAsMCwxLC00NWRlZyk7dHJhbnNmb3JtOnJvdGF0ZTNkKDAsMCwxLC00NWRlZyk7b3BhY2l0eTowfTEwMCV7LXdlYmtpdC10cmFuc2Zvcm0tb3JpZ2luOmxlZnQgYm90dG9tO3RyYW5zZm9ybS1vcmlnaW46bGVmdCBib3R0b207LXdlYmtpdC10cmFuc2Zvcm06bm9uZTt0cmFuc2Zvcm06bm9uZTtvcGFjaXR5OjF9fS5yb3RhdGVJbkRvd25MZWZ0ey13ZWJraXQtYW5pbWF0aW9uLW5hbWU6cm90YXRlSW5Eb3duTGVmdDthbmltYXRpb24tbmFtZTpyb3RhdGVJbkRvd25MZWZ0fUAtd2Via2l0LWtleWZyYW1lcyByb3RhdGVJbkRvd25SaWdodHswJXstd2Via2l0LXRyYW5zZm9ybS1vcmlnaW46cmlnaHQgYm90dG9tO3RyYW5zZm9ybS1vcmlnaW46cmlnaHQgYm90dG9tOy13ZWJraXQtdHJhbnNmb3JtOnJvdGF0ZTNkKDAsMCwxLDQ1ZGVnKTt0cmFuc2Zvcm06cm90YXRlM2QoMCwwLDEsNDVkZWcpO29wYWNpdHk6MH0xMDAley13ZWJraXQtdHJhbnNmb3JtLW9yaWdpbjpyaWdodCBib3R0b207dHJhbnNmb3JtLW9yaWdpbjpyaWdodCBib3R0b207LXdlYmtpdC10cmFuc2Zvcm06bm9uZTt0cmFuc2Zvcm06bm9uZTtvcGFjaXR5OjF9fUBrZXlmcmFtZXMgcm90YXRlSW5Eb3duUmlnaHR7MCV7LXdlYmtpdC10cmFuc2Zvcm0tb3JpZ2luOnJpZ2h0IGJvdHRvbTt0cmFuc2Zvcm0tb3JpZ2luOnJpZ2h0IGJvdHRvbTstd2Via2l0LXRyYW5zZm9ybTpyb3RhdGUzZCgwLDAsMSw0NWRlZyk7dHJhbnNmb3JtOnJvdGF0ZTNkKDAsMCwxLDQ1ZGVnKTtvcGFjaXR5OjB9MTAwJXstd2Via2l0LXRyYW5zZm9ybS1vcmlnaW46cmlnaHQgYm90dG9tO3RyYW5zZm9ybS1vcmlnaW46cmlnaHQgYm90dG9tOy13ZWJraXQtdHJhbnNmb3JtOm5vbmU7dHJhbnNmb3JtOm5vbmU7b3BhY2l0eToxfX0ucm90YXRlSW5Eb3duUmlnaHR7LXdlYmtpdC1hbmltYXRpb24tbmFtZTpyb3RhdGVJbkRvd25SaWdodDthbmltYXRpb24tbmFtZTpyb3RhdGVJbkRvd25SaWdodH1ALXdlYmtpdC1rZXlmcmFtZXMgcm90YXRlSW5VcExlZnR7MCV7LXdlYmtpdC10cmFuc2Zvcm0tb3JpZ2luOmxlZnQgYm90dG9tO3RyYW5zZm9ybS1vcmlnaW46bGVmdCBib3R0b207LXdlYmtpdC10cmFuc2Zvcm06cm90YXRlM2QoMCwwLDEsNDVkZWcpO3RyYW5zZm9ybTpyb3RhdGUzZCgwLDAsMSw0NWRlZyk7b3BhY2l0eTowfTEwMCV7LXdlYmtpdC10cmFuc2Zvcm0tb3JpZ2luOmxlZnQgYm90dG9tO3RyYW5zZm9ybS1vcmlnaW46bGVmdCBib3R0b207LXdlYmtpdC10cmFuc2Zvcm06bm9uZTt0cmFuc2Zvcm06bm9uZTtvcGFjaXR5OjF9fUBrZXlmcmFtZXMgcm90YXRlSW5VcExlZnR7MCV7LXdlYmtpdC10cmFuc2Zvcm0tb3JpZ2luOmxlZnQgYm90dG9tO3RyYW5zZm9ybS1vcmlnaW46bGVmdCBib3R0b207LXdlYmtpdC10cmFuc2Zvcm06cm90YXRlM2QoMCwwLDEsNDVkZWcpO3RyYW5zZm9ybTpyb3RhdGUzZCgwLDAsMSw0NWRlZyk7b3BhY2l0eTowfTEwMCV7LXdlYmtpdC10cmFuc2Zvcm0tb3JpZ2luOmxlZnQgYm90dG9tO3RyYW5zZm9ybS1vcmlnaW46bGVmdCBib3R0b207LXdlYmtpdC10cmFuc2Zvcm06bm9uZTt0cmFuc2Zvcm06bm9uZTtvcGFjaXR5OjF9fS5yb3RhdGVJblVwTGVmdHstd2Via2l0LWFuaW1hdGlvbi1uYW1lOnJvdGF0ZUluVXBMZWZ0O2FuaW1hdGlvbi1uYW1lOnJvdGF0ZUluVXBMZWZ0fUAtd2Via2l0LWtleWZyYW1lcyByb3RhdGVJblVwUmlnaHR7MCV7LXdlYmtpdC10cmFuc2Zvcm0tb3JpZ2luOnJpZ2h0IGJvdHRvbTt0cmFuc2Zvcm0tb3JpZ2luOnJpZ2h0IGJvdHRvbTstd2Via2l0LXRyYW5zZm9ybTpyb3RhdGUzZCgwLDAsMSwtOTBkZWcpO3RyYW5zZm9ybTpyb3RhdGUzZCgwLDAsMSwtOTBkZWcpO29wYWNpdHk6MH0xMDAley13ZWJraXQtdHJhbnNmb3JtLW9yaWdpbjpyaWdodCBib3R0b207dHJhbnNmb3JtLW9yaWdpbjpyaWdodCBib3R0b207LXdlYmtpdC10cmFuc2Zvcm06bm9uZTt0cmFuc2Zvcm06bm9uZTtvcGFjaXR5OjF9fUBrZXlmcmFtZXMgcm90YXRlSW5VcFJpZ2h0ezAley13ZWJraXQtdHJhbnNmb3JtLW9yaWdpbjpyaWdodCBib3R0b207dHJhbnNmb3JtLW9yaWdpbjpyaWdodCBib3R0b207LXdlYmtpdC10cmFuc2Zvcm06cm90YXRlM2QoMCwwLDEsLTkwZGVnKTt0cmFuc2Zvcm06cm90YXRlM2QoMCwwLDEsLTkwZGVnKTtvcGFjaXR5OjB9MTAwJXstd2Via2l0LXRyYW5zZm9ybS1vcmlnaW46cmlnaHQgYm90dG9tO3RyYW5zZm9ybS1vcmlnaW46cmlnaHQgYm90dG9tOy13ZWJraXQtdHJhbnNmb3JtOm5vbmU7dHJhbnNmb3JtOm5vbmU7b3BhY2l0eToxfX0ucm90YXRlSW5VcFJpZ2h0ey13ZWJraXQtYW5pbWF0aW9uLW5hbWU6cm90YXRlSW5VcFJpZ2h0O2FuaW1hdGlvbi1uYW1lOnJvdGF0ZUluVXBSaWdodH1ALXdlYmtpdC1rZXlmcmFtZXMgcm90YXRlT3V0ezAley13ZWJraXQtdHJhbnNmb3JtLW9yaWdpbjpjZW50ZXI7dHJhbnNmb3JtLW9yaWdpbjpjZW50ZXI7b3BhY2l0eToxfTEwMCV7LXdlYmtpdC10cmFuc2Zvcm0tb3JpZ2luOmNlbnRlcjt0cmFuc2Zvcm0tb3JpZ2luOmNlbnRlcjstd2Via2l0LXRyYW5zZm9ybTpyb3RhdGUzZCgwLDAsMSwyMDBkZWcpO3RyYW5zZm9ybTpyb3RhdGUzZCgwLDAsMSwyMDBkZWcpO29wYWNpdHk6MH19QGtleWZyYW1lcyByb3RhdGVPdXR7MCV7LXdlYmtpdC10cmFuc2Zvcm0tb3JpZ2luOmNlbnRlcjt0cmFuc2Zvcm0tb3JpZ2luOmNlbnRlcjtvcGFjaXR5OjF9MTAwJXstd2Via2l0LXRyYW5zZm9ybS1vcmlnaW46Y2VudGVyO3RyYW5zZm9ybS1vcmlnaW46Y2VudGVyOy13ZWJraXQtdHJhbnNmb3JtOnJvdGF0ZTNkKDAsMCwxLDIwMGRlZyk7dHJhbnNmb3JtOnJvdGF0ZTNkKDAsMCwxLDIwMGRlZyk7b3BhY2l0eTowfX0ucm90YXRlT3V0ey13ZWJraXQtYW5pbWF0aW9uLW5hbWU6cm90YXRlT3V0O2FuaW1hdGlvbi1uYW1lOnJvdGF0ZU91dH1ALXdlYmtpdC1rZXlmcmFtZXMgcm90YXRlT3V0RG93bkxlZnR7MCV7LXdlYmtpdC10cmFuc2Zvcm0tb3JpZ2luOmxlZnQgYm90dG9tO3RyYW5zZm9ybS1vcmlnaW46bGVmdCBib3R0b207b3BhY2l0eToxfTEwMCV7LXdlYmtpdC10cmFuc2Zvcm0tb3JpZ2luOmxlZnQgYm90dG9tO3RyYW5zZm9ybS1vcmlnaW46bGVmdCBib3R0b207LXdlYmtpdC10cmFuc2Zvcm06cm90YXRlM2QoMCwwLDEsNDVkZWcpO3RyYW5zZm9ybTpyb3RhdGUzZCgwLDAsMSw0NWRlZyk7b3BhY2l0eTowfX1Aa2V5ZnJhbWVzIHJvdGF0ZU91dERvd25MZWZ0ezAley13ZWJraXQtdHJhbnNmb3JtLW9yaWdpbjpsZWZ0IGJvdHRvbTt0cmFuc2Zvcm0tb3JpZ2luOmxlZnQgYm90dG9tO29wYWNpdHk6MX0xMDAley13ZWJraXQtdHJhbnNmb3JtLW9yaWdpbjpsZWZ0IGJvdHRvbTt0cmFuc2Zvcm0tb3JpZ2luOmxlZnQgYm90dG9tOy13ZWJraXQtdHJhbnNmb3JtOnJvdGF0ZTNkKDAsMCwxLDQ1ZGVnKTt0cmFuc2Zvcm06cm90YXRlM2QoMCwwLDEsNDVkZWcpO29wYWNpdHk6MH19LnJvdGF0ZU91dERvd25MZWZ0ey13ZWJraXQtYW5pbWF0aW9uLW5hbWU6cm90YXRlT3V0RG93bkxlZnQ7YW5pbWF0aW9uLW5hbWU6cm90YXRlT3V0RG93bkxlZnR9QC13ZWJraXQta2V5ZnJhbWVzIHJvdGF0ZU91dERvd25SaWdodHswJXstd2Via2l0LXRyYW5zZm9ybS1vcmlnaW46cmlnaHQgYm90dG9tO3RyYW5zZm9ybS1vcmlnaW46cmlnaHQgYm90dG9tO29wYWNpdHk6MX0xMDAley13ZWJraXQtdHJhbnNmb3JtLW9yaWdpbjpyaWdodCBib3R0b207dHJhbnNmb3JtLW9yaWdpbjpyaWdodCBib3R0b207LXdlYmtpdC10cmFuc2Zvcm06cm90YXRlM2QoMCwwLDEsLTQ1ZGVnKTt0cmFuc2Zvcm06cm90YXRlM2QoMCwwLDEsLTQ1ZGVnKTtvcGFjaXR5OjB9fUBrZXlmcmFtZXMgcm90YXRlT3V0RG93blJpZ2h0ezAley13ZWJraXQtdHJhbnNmb3JtLW9yaWdpbjpyaWdodCBib3R0b207dHJhbnNmb3JtLW9yaWdpbjpyaWdodCBib3R0b207b3BhY2l0eToxfTEwMCV7LXdlYmtpdC10cmFuc2Zvcm0tb3JpZ2luOnJpZ2h0IGJvdHRvbTt0cmFuc2Zvcm0tb3JpZ2luOnJpZ2h0IGJvdHRvbTstd2Via2l0LXRyYW5zZm9ybTpyb3RhdGUzZCgwLDAsMSwtNDVkZWcpO3RyYW5zZm9ybTpyb3RhdGUzZCgwLDAsMSwtNDVkZWcpO29wYWNpdHk6MH19LnJvdGF0ZU91dERvd25SaWdodHstd2Via2l0LWFuaW1hdGlvbi1uYW1lOnJvdGF0ZU91dERvd25SaWdodDthbmltYXRpb24tbmFtZTpyb3RhdGVPdXREb3duUmlnaHR9QC13ZWJraXQta2V5ZnJhbWVzIHJvdGF0ZU91dFVwTGVmdHswJXstd2Via2l0LXRyYW5zZm9ybS1vcmlnaW46bGVmdCBib3R0b207dHJhbnNmb3JtLW9yaWdpbjpsZWZ0IGJvdHRvbTtvcGFjaXR5OjF9MTAwJXstd2Via2l0LXRyYW5zZm9ybS1vcmlnaW46bGVmdCBib3R0b207dHJhbnNmb3JtLW9yaWdpbjpsZWZ0IGJvdHRvbTstd2Via2l0LXRyYW5zZm9ybTpyb3RhdGUzZCgwLDAsMSwtNDVkZWcpO3RyYW5zZm9ybTpyb3RhdGUzZCgwLDAsMSwtNDVkZWcpO29wYWNpdHk6MH19QGtleWZyYW1lcyByb3RhdGVPdXRVcExlZnR7MCV7LXdlYmtpdC10cmFuc2Zvcm0tb3JpZ2luOmxlZnQgYm90dG9tO3RyYW5zZm9ybS1vcmlnaW46bGVmdCBib3R0b207b3BhY2l0eToxfTEwMCV7LXdlYmtpdC10cmFuc2Zvcm0tb3JpZ2luOmxlZnQgYm90dG9tO3RyYW5zZm9ybS1vcmlnaW46bGVmdCBib3R0b207LXdlYmtpdC10cmFuc2Zvcm06cm90YXRlM2QoMCwwLDEsLTQ1ZGVnKTt0cmFuc2Zvcm06cm90YXRlM2QoMCwwLDEsLTQ1ZGVnKTtvcGFjaXR5OjB9fS5yb3RhdGVPdXRVcExlZnR7LXdlYmtpdC1hbmltYXRpb24tbmFtZTpyb3RhdGVPdXRVcExlZnQ7YW5pbWF0aW9uLW5hbWU6cm90YXRlT3V0VXBMZWZ0fUAtd2Via2l0LWtleWZyYW1lcyByb3RhdGVPdXRVcFJpZ2h0ezAley13ZWJraXQtdHJhbnNmb3JtLW9yaWdpbjpyaWdodCBib3R0b207dHJhbnNmb3JtLW9yaWdpbjpyaWdodCBib3R0b207b3BhY2l0eToxfTEwMCV7LXdlYmtpdC10cmFuc2Zvcm0tb3JpZ2luOnJpZ2h0IGJvdHRvbTt0cmFuc2Zvcm0tb3JpZ2luOnJpZ2h0IGJvdHRvbTstd2Via2l0LXRyYW5zZm9ybTpyb3RhdGUzZCgwLDAsMSw5MGRlZyk7dHJhbnNmb3JtOnJvdGF0ZTNkKDAsMCwxLDkwZGVnKTtvcGFjaXR5OjB9fUBrZXlmcmFtZXMgcm90YXRlT3V0VXBSaWdodHswJXstd2Via2l0LXRyYW5zZm9ybS1vcmlnaW46cmlnaHQgYm90dG9tO3RyYW5zZm9ybS1vcmlnaW46cmlnaHQgYm90dG9tO29wYWNpdHk6MX0xMDAley13ZWJraXQtdHJhbnNmb3JtLW9yaWdpbjpyaWdodCBib3R0b207dHJhbnNmb3JtLW9yaWdpbjpyaWdodCBib3R0b207LXdlYmtpdC10cmFuc2Zvcm06cm90YXRlM2QoMCwwLDEsOTBkZWcpO3RyYW5zZm9ybTpyb3RhdGUzZCgwLDAsMSw5MGRlZyk7b3BhY2l0eTowfX0ucm90YXRlT3V0VXBSaWdodHstd2Via2l0LWFuaW1hdGlvbi1uYW1lOnJvdGF0ZU91dFVwUmlnaHQ7YW5pbWF0aW9uLW5hbWU6cm90YXRlT3V0VXBSaWdodH1ALXdlYmtpdC1rZXlmcmFtZXMgaGluZ2V7MCV7LXdlYmtpdC10cmFuc2Zvcm0tb3JpZ2luOnRvcCBsZWZ0O3RyYW5zZm9ybS1vcmlnaW46dG9wIGxlZnQ7LXdlYmtpdC1hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOmVhc2UtaW4tb3V0O2FuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246ZWFzZS1pbi1vdXR9MjAlLDYwJXstd2Via2l0LXRyYW5zZm9ybTpyb3RhdGUzZCgwLDAsMSw4MGRlZyk7dHJhbnNmb3JtOnJvdGF0ZTNkKDAsMCwxLDgwZGVnKTstd2Via2l0LXRyYW5zZm9ybS1vcmlnaW46dG9wIGxlZnQ7dHJhbnNmb3JtLW9yaWdpbjp0b3AgbGVmdDstd2Via2l0LWFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246ZWFzZS1pbi1vdXQ7YW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjplYXNlLWluLW91dH00MCUsODAley13ZWJraXQtdHJhbnNmb3JtOnJvdGF0ZTNkKDAsMCwxLDYwZGVnKTt0cmFuc2Zvcm06cm90YXRlM2QoMCwwLDEsNjBkZWcpOy13ZWJraXQtdHJhbnNmb3JtLW9yaWdpbjp0b3AgbGVmdDt0cmFuc2Zvcm0tb3JpZ2luOnRvcCBsZWZ0Oy13ZWJraXQtYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjplYXNlLWluLW91dDthbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOmVhc2UtaW4tb3V0O29wYWNpdHk6MX0xMDAley13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsNzAwcHgsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsNzAwcHgsMCk7b3BhY2l0eTowfX1Aa2V5ZnJhbWVzIGhpbmdlezAley13ZWJraXQtdHJhbnNmb3JtLW9yaWdpbjp0b3AgbGVmdDt0cmFuc2Zvcm0tb3JpZ2luOnRvcCBsZWZ0Oy13ZWJraXQtYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjplYXNlLWluLW91dDthbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOmVhc2UtaW4tb3V0fTIwJSw2MCV7LXdlYmtpdC10cmFuc2Zvcm06cm90YXRlM2QoMCwwLDEsODBkZWcpO3RyYW5zZm9ybTpyb3RhdGUzZCgwLDAsMSw4MGRlZyk7LXdlYmtpdC10cmFuc2Zvcm0tb3JpZ2luOnRvcCBsZWZ0O3RyYW5zZm9ybS1vcmlnaW46dG9wIGxlZnQ7LXdlYmtpdC1hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOmVhc2UtaW4tb3V0O2FuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246ZWFzZS1pbi1vdXR9NDAlLDgwJXstd2Via2l0LXRyYW5zZm9ybTpyb3RhdGUzZCgwLDAsMSw2MGRlZyk7dHJhbnNmb3JtOnJvdGF0ZTNkKDAsMCwxLDYwZGVnKTstd2Via2l0LXRyYW5zZm9ybS1vcmlnaW46dG9wIGxlZnQ7dHJhbnNmb3JtLW9yaWdpbjp0b3AgbGVmdDstd2Via2l0LWFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246ZWFzZS1pbi1vdXQ7YW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjplYXNlLWluLW91dDtvcGFjaXR5OjF9MTAwJXstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLDcwMHB4LDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLDcwMHB4LDApO29wYWNpdHk6MH19Lmhpbmdley13ZWJraXQtYW5pbWF0aW9uLW5hbWU6aGluZ2U7YW5pbWF0aW9uLW5hbWU6aGluZ2V9QC13ZWJraXQta2V5ZnJhbWVzIHJvbGxJbnswJXtvcGFjaXR5OjA7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoLTEwMCUsMCwwKSByb3RhdGUzZCgwLDAsMSwtMTIwZGVnKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoLTEwMCUsMCwwKSByb3RhdGUzZCgwLDAsMSwtMTIwZGVnKX0xMDAle29wYWNpdHk6MTstd2Via2l0LXRyYW5zZm9ybTpub25lO3RyYW5zZm9ybTpub25lfX1Aa2V5ZnJhbWVzIHJvbGxJbnswJXtvcGFjaXR5OjA7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoLTEwMCUsMCwwKSByb3RhdGUzZCgwLDAsMSwtMTIwZGVnKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoLTEwMCUsMCwwKSByb3RhdGUzZCgwLDAsMSwtMTIwZGVnKX0xMDAle29wYWNpdHk6MTstd2Via2l0LXRyYW5zZm9ybTpub25lO3RyYW5zZm9ybTpub25lfX0ucm9sbEluey13ZWJraXQtYW5pbWF0aW9uLW5hbWU6cm9sbEluO2FuaW1hdGlvbi1uYW1lOnJvbGxJbn1ALXdlYmtpdC1rZXlmcmFtZXMgcm9sbE91dHswJXtvcGFjaXR5OjF9MTAwJXtvcGFjaXR5OjA7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoMTAwJSwwLDApIHJvdGF0ZTNkKDAsMCwxLDEyMGRlZyk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDEwMCUsMCwwKSByb3RhdGUzZCgwLDAsMSwxMjBkZWcpfX1Aa2V5ZnJhbWVzIHJvbGxPdXR7MCV7b3BhY2l0eToxfTEwMCV7b3BhY2l0eTowOy13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDEwMCUsMCwwKSByb3RhdGUzZCgwLDAsMSwxMjBkZWcpO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgxMDAlLDAsMCkgcm90YXRlM2QoMCwwLDEsMTIwZGVnKX19LnJvbGxPdXR7LXdlYmtpdC1hbmltYXRpb24tbmFtZTpyb2xsT3V0O2FuaW1hdGlvbi1uYW1lOnJvbGxPdXR9QC13ZWJraXQta2V5ZnJhbWVzIHpvb21JbnswJXtvcGFjaXR5OjA7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGUzZCguMywuMywuMyk7dHJhbnNmb3JtOnNjYWxlM2QoLjMsLjMsLjMpfTUwJXtvcGFjaXR5OjF9fUBrZXlmcmFtZXMgem9vbUluezAle29wYWNpdHk6MDstd2Via2l0LXRyYW5zZm9ybTpzY2FsZTNkKC4zLC4zLC4zKTt0cmFuc2Zvcm06c2NhbGUzZCguMywuMywuMyl9NTAle29wYWNpdHk6MX19Lnpvb21Jbnstd2Via2l0LWFuaW1hdGlvbi1uYW1lOnpvb21JbjthbmltYXRpb24tbmFtZTp6b29tSW59QC13ZWJraXQta2V5ZnJhbWVzIHpvb21JbkRvd257MCV7b3BhY2l0eTowOy13ZWJraXQtdHJhbnNmb3JtOnNjYWxlM2QoLjEsLjEsLjEpIHRyYW5zbGF0ZTNkKDAsLTEwMDBweCwwKTt0cmFuc2Zvcm06c2NhbGUzZCguMSwuMSwuMSkgdHJhbnNsYXRlM2QoMCwtMTAwMHB4LDApOy13ZWJraXQtYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjpjdWJpYy1iZXppZXIoMC41NSwuMDU1LC42NzUsLjE5KTthbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOmN1YmljLWJlemllcigwLjU1LC4wNTUsLjY3NSwuMTkpfTYwJXtvcGFjaXR5OjE7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGUzZCguNDc1LC40NzUsLjQ3NSkgdHJhbnNsYXRlM2QoMCw2MHB4LDApO3RyYW5zZm9ybTpzY2FsZTNkKC40NzUsLjQ3NSwuNDc1KSB0cmFuc2xhdGUzZCgwLDYwcHgsMCk7LXdlYmtpdC1hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOmN1YmljLWJlemllcigwLjE3NSwuODg1LC4zMiwxKTthbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOmN1YmljLWJlemllcigwLjE3NSwuODg1LC4zMiwxKX19QGtleWZyYW1lcyB6b29tSW5Eb3duezAle29wYWNpdHk6MDstd2Via2l0LXRyYW5zZm9ybTpzY2FsZTNkKC4xLC4xLC4xKSB0cmFuc2xhdGUzZCgwLC0xMDAwcHgsMCk7dHJhbnNmb3JtOnNjYWxlM2QoLjEsLjEsLjEpIHRyYW5zbGF0ZTNkKDAsLTEwMDBweCwwKTstd2Via2l0LWFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246Y3ViaWMtYmV6aWVyKDAuNTUsLjA1NSwuNjc1LC4xOSk7YW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjpjdWJpYy1iZXppZXIoMC41NSwuMDU1LC42NzUsLjE5KX02MCV7b3BhY2l0eToxOy13ZWJraXQtdHJhbnNmb3JtOnNjYWxlM2QoLjQ3NSwuNDc1LC40NzUpIHRyYW5zbGF0ZTNkKDAsNjBweCwwKTt0cmFuc2Zvcm06c2NhbGUzZCguNDc1LC40NzUsLjQ3NSkgdHJhbnNsYXRlM2QoMCw2MHB4LDApOy13ZWJraXQtYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjpjdWJpYy1iZXppZXIoMC4xNzUsLjg4NSwuMzIsMSk7YW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjpjdWJpYy1iZXppZXIoMC4xNzUsLjg4NSwuMzIsMSl9fS56b29tSW5Eb3duey13ZWJraXQtYW5pbWF0aW9uLW5hbWU6em9vbUluRG93bjthbmltYXRpb24tbmFtZTp6b29tSW5Eb3dufUAtd2Via2l0LWtleWZyYW1lcyB6b29tSW5MZWZ0ezAle29wYWNpdHk6MDstd2Via2l0LXRyYW5zZm9ybTpzY2FsZTNkKC4xLC4xLC4xKSB0cmFuc2xhdGUzZCgtMTAwMHB4LDAsMCk7dHJhbnNmb3JtOnNjYWxlM2QoLjEsLjEsLjEpIHRyYW5zbGF0ZTNkKC0xMDAwcHgsMCwwKTstd2Via2l0LWFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246Y3ViaWMtYmV6aWVyKDAuNTUsLjA1NSwuNjc1LC4xOSk7YW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjpjdWJpYy1iZXppZXIoMC41NSwuMDU1LC42NzUsLjE5KX02MCV7b3BhY2l0eToxOy13ZWJraXQtdHJhbnNmb3JtOnNjYWxlM2QoLjQ3NSwuNDc1LC40NzUpIHRyYW5zbGF0ZTNkKDEwcHgsMCwwKTt0cmFuc2Zvcm06c2NhbGUzZCguNDc1LC40NzUsLjQ3NSkgdHJhbnNsYXRlM2QoMTBweCwwLDApOy13ZWJraXQtYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjpjdWJpYy1iZXppZXIoMC4xNzUsLjg4NSwuMzIsMSk7YW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjpjdWJpYy1iZXppZXIoMC4xNzUsLjg4NSwuMzIsMSl9fUBrZXlmcmFtZXMgem9vbUluTGVmdHswJXtvcGFjaXR5OjA7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGUzZCguMSwuMSwuMSkgdHJhbnNsYXRlM2QoLTEwMDBweCwwLDApO3RyYW5zZm9ybTpzY2FsZTNkKC4xLC4xLC4xKSB0cmFuc2xhdGUzZCgtMTAwMHB4LDAsMCk7LXdlYmtpdC1hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOmN1YmljLWJlemllcigwLjU1LC4wNTUsLjY3NSwuMTkpO2FuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246Y3ViaWMtYmV6aWVyKDAuNTUsLjA1NSwuNjc1LC4xOSl9NjAle29wYWNpdHk6MTstd2Via2l0LXRyYW5zZm9ybTpzY2FsZTNkKC40NzUsLjQ3NSwuNDc1KSB0cmFuc2xhdGUzZCgxMHB4LDAsMCk7dHJhbnNmb3JtOnNjYWxlM2QoLjQ3NSwuNDc1LC40NzUpIHRyYW5zbGF0ZTNkKDEwcHgsMCwwKTstd2Via2l0LWFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246Y3ViaWMtYmV6aWVyKDAuMTc1LC44ODUsLjMyLDEpO2FuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246Y3ViaWMtYmV6aWVyKDAuMTc1LC44ODUsLjMyLDEpfX0uem9vbUluTGVmdHstd2Via2l0LWFuaW1hdGlvbi1uYW1lOnpvb21JbkxlZnQ7YW5pbWF0aW9uLW5hbWU6em9vbUluTGVmdH1ALXdlYmtpdC1rZXlmcmFtZXMgem9vbUluUmlnaHR7MCV7b3BhY2l0eTowOy13ZWJraXQtdHJhbnNmb3JtOnNjYWxlM2QoLjEsLjEsLjEpIHRyYW5zbGF0ZTNkKDEwMDBweCwwLDApO3RyYW5zZm9ybTpzY2FsZTNkKC4xLC4xLC4xKSB0cmFuc2xhdGUzZCgxMDAwcHgsMCwwKTstd2Via2l0LWFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246Y3ViaWMtYmV6aWVyKDAuNTUsLjA1NSwuNjc1LC4xOSk7YW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjpjdWJpYy1iZXppZXIoMC41NSwuMDU1LC42NzUsLjE5KX02MCV7b3BhY2l0eToxOy13ZWJraXQtdHJhbnNmb3JtOnNjYWxlM2QoLjQ3NSwuNDc1LC40NzUpIHRyYW5zbGF0ZTNkKC0xMHB4LDAsMCk7dHJhbnNmb3JtOnNjYWxlM2QoLjQ3NSwuNDc1LC40NzUpIHRyYW5zbGF0ZTNkKC0xMHB4LDAsMCk7LXdlYmtpdC1hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOmN1YmljLWJlemllcigwLjE3NSwuODg1LC4zMiwxKTthbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOmN1YmljLWJlemllcigwLjE3NSwuODg1LC4zMiwxKX19QGtleWZyYW1lcyB6b29tSW5SaWdodHswJXtvcGFjaXR5OjA7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGUzZCguMSwuMSwuMSkgdHJhbnNsYXRlM2QoMTAwMHB4LDAsMCk7dHJhbnNmb3JtOnNjYWxlM2QoLjEsLjEsLjEpIHRyYW5zbGF0ZTNkKDEwMDBweCwwLDApOy13ZWJraXQtYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjpjdWJpYy1iZXppZXIoMC41NSwuMDU1LC42NzUsLjE5KTthbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOmN1YmljLWJlemllcigwLjU1LC4wNTUsLjY3NSwuMTkpfTYwJXtvcGFjaXR5OjE7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGUzZCguNDc1LC40NzUsLjQ3NSkgdHJhbnNsYXRlM2QoLTEwcHgsMCwwKTt0cmFuc2Zvcm06c2NhbGUzZCguNDc1LC40NzUsLjQ3NSkgdHJhbnNsYXRlM2QoLTEwcHgsMCwwKTstd2Via2l0LWFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246Y3ViaWMtYmV6aWVyKDAuMTc1LC44ODUsLjMyLDEpO2FuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246Y3ViaWMtYmV6aWVyKDAuMTc1LC44ODUsLjMyLDEpfX0uem9vbUluUmlnaHR7LXdlYmtpdC1hbmltYXRpb24tbmFtZTp6b29tSW5SaWdodDthbmltYXRpb24tbmFtZTp6b29tSW5SaWdodH1ALXdlYmtpdC1rZXlmcmFtZXMgem9vbUluVXB7MCV7b3BhY2l0eTowOy13ZWJraXQtdHJhbnNmb3JtOnNjYWxlM2QoLjEsLjEsLjEpIHRyYW5zbGF0ZTNkKDAsMTAwMHB4LDApO3RyYW5zZm9ybTpzY2FsZTNkKC4xLC4xLC4xKSB0cmFuc2xhdGUzZCgwLDEwMDBweCwwKTstd2Via2l0LWFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246Y3ViaWMtYmV6aWVyKDAuNTUsLjA1NSwuNjc1LC4xOSk7YW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjpjdWJpYy1iZXppZXIoMC41NSwuMDU1LC42NzUsLjE5KX02MCV7b3BhY2l0eToxOy13ZWJraXQtdHJhbnNmb3JtOnNjYWxlM2QoLjQ3NSwuNDc1LC40NzUpIHRyYW5zbGF0ZTNkKDAsLTYwcHgsMCk7dHJhbnNmb3JtOnNjYWxlM2QoLjQ3NSwuNDc1LC40NzUpIHRyYW5zbGF0ZTNkKDAsLTYwcHgsMCk7LXdlYmtpdC1hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOmN1YmljLWJlemllcigwLjE3NSwuODg1LC4zMiwxKTthbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOmN1YmljLWJlemllcigwLjE3NSwuODg1LC4zMiwxKX19QGtleWZyYW1lcyB6b29tSW5VcHswJXtvcGFjaXR5OjA7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGUzZCguMSwuMSwuMSkgdHJhbnNsYXRlM2QoMCwxMDAwcHgsMCk7dHJhbnNmb3JtOnNjYWxlM2QoLjEsLjEsLjEpIHRyYW5zbGF0ZTNkKDAsMTAwMHB4LDApOy13ZWJraXQtYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjpjdWJpYy1iZXppZXIoMC41NSwuMDU1LC42NzUsLjE5KTthbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOmN1YmljLWJlemllcigwLjU1LC4wNTUsLjY3NSwuMTkpfTYwJXtvcGFjaXR5OjE7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGUzZCguNDc1LC40NzUsLjQ3NSkgdHJhbnNsYXRlM2QoMCwtNjBweCwwKTt0cmFuc2Zvcm06c2NhbGUzZCguNDc1LC40NzUsLjQ3NSkgdHJhbnNsYXRlM2QoMCwtNjBweCwwKTstd2Via2l0LWFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246Y3ViaWMtYmV6aWVyKDAuMTc1LC44ODUsLjMyLDEpO2FuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246Y3ViaWMtYmV6aWVyKDAuMTc1LC44ODUsLjMyLDEpfX0uem9vbUluVXB7LXdlYmtpdC1hbmltYXRpb24tbmFtZTp6b29tSW5VcDthbmltYXRpb24tbmFtZTp6b29tSW5VcH1ALXdlYmtpdC1rZXlmcmFtZXMgem9vbU91dHswJXtvcGFjaXR5OjF9NTAle29wYWNpdHk6MDstd2Via2l0LXRyYW5zZm9ybTpzY2FsZTNkKC4zLC4zLC4zKTt0cmFuc2Zvcm06c2NhbGUzZCguMywuMywuMyl9MTAwJXtvcGFjaXR5OjB9fUBrZXlmcmFtZXMgem9vbU91dHswJXtvcGFjaXR5OjF9NTAle29wYWNpdHk6MDstd2Via2l0LXRyYW5zZm9ybTpzY2FsZTNkKC4zLC4zLC4zKTt0cmFuc2Zvcm06c2NhbGUzZCguMywuMywuMyl9MTAwJXtvcGFjaXR5OjB9fS56b29tT3V0ey13ZWJraXQtYW5pbWF0aW9uLW5hbWU6em9vbU91dDthbmltYXRpb24tbmFtZTp6b29tT3V0fUAtd2Via2l0LWtleWZyYW1lcyB6b29tT3V0RG93bns0MCV7b3BhY2l0eToxOy13ZWJraXQtdHJhbnNmb3JtOnNjYWxlM2QoLjQ3NSwuNDc1LC40NzUpIHRyYW5zbGF0ZTNkKDAsLTYwcHgsMCk7dHJhbnNmb3JtOnNjYWxlM2QoLjQ3NSwuNDc1LC40NzUpIHRyYW5zbGF0ZTNkKDAsLTYwcHgsMCk7LXdlYmtpdC1hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOmN1YmljLWJlemllcigwLjU1LC4wNTUsLjY3NSwuMTkpO2FuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246Y3ViaWMtYmV6aWVyKDAuNTUsLjA1NSwuNjc1LC4xOSl9MTAwJXtvcGFjaXR5OjA7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGUzZCguMSwuMSwuMSkgdHJhbnNsYXRlM2QoMCwyMDAwcHgsMCk7dHJhbnNmb3JtOnNjYWxlM2QoLjEsLjEsLjEpIHRyYW5zbGF0ZTNkKDAsMjAwMHB4LDApOy13ZWJraXQtdHJhbnNmb3JtLW9yaWdpbjpjZW50ZXIgYm90dG9tO3RyYW5zZm9ybS1vcmlnaW46Y2VudGVyIGJvdHRvbTstd2Via2l0LWFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246Y3ViaWMtYmV6aWVyKDAuMTc1LC44ODUsLjMyLDEpO2FuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246Y3ViaWMtYmV6aWVyKDAuMTc1LC44ODUsLjMyLDEpfX1Aa2V5ZnJhbWVzIHpvb21PdXREb3duezQwJXtvcGFjaXR5OjE7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGUzZCguNDc1LC40NzUsLjQ3NSkgdHJhbnNsYXRlM2QoMCwtNjBweCwwKTt0cmFuc2Zvcm06c2NhbGUzZCguNDc1LC40NzUsLjQ3NSkgdHJhbnNsYXRlM2QoMCwtNjBweCwwKTstd2Via2l0LWFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246Y3ViaWMtYmV6aWVyKDAuNTUsLjA1NSwuNjc1LC4xOSk7YW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjpjdWJpYy1iZXppZXIoMC41NSwuMDU1LC42NzUsLjE5KX0xMDAle29wYWNpdHk6MDstd2Via2l0LXRyYW5zZm9ybTpzY2FsZTNkKC4xLC4xLC4xKSB0cmFuc2xhdGUzZCgwLDIwMDBweCwwKTt0cmFuc2Zvcm06c2NhbGUzZCguMSwuMSwuMSkgdHJhbnNsYXRlM2QoMCwyMDAwcHgsMCk7LXdlYmtpdC10cmFuc2Zvcm0tb3JpZ2luOmNlbnRlciBib3R0b207dHJhbnNmb3JtLW9yaWdpbjpjZW50ZXIgYm90dG9tOy13ZWJraXQtYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjpjdWJpYy1iZXppZXIoMC4xNzUsLjg4NSwuMzIsMSk7YW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjpjdWJpYy1iZXppZXIoMC4xNzUsLjg4NSwuMzIsMSl9fS56b29tT3V0RG93bnstd2Via2l0LWFuaW1hdGlvbi1uYW1lOnpvb21PdXREb3duO2FuaW1hdGlvbi1uYW1lOnpvb21PdXREb3dufUAtd2Via2l0LWtleWZyYW1lcyB6b29tT3V0TGVmdHs0MCV7b3BhY2l0eToxOy13ZWJraXQtdHJhbnNmb3JtOnNjYWxlM2QoLjQ3NSwuNDc1LC40NzUpIHRyYW5zbGF0ZTNkKDQycHgsMCwwKTt0cmFuc2Zvcm06c2NhbGUzZCguNDc1LC40NzUsLjQ3NSkgdHJhbnNsYXRlM2QoNDJweCwwLDApfTEwMCV7b3BhY2l0eTowOy13ZWJraXQtdHJhbnNmb3JtOnNjYWxlKC4xKSB0cmFuc2xhdGUzZCgtMjAwMHB4LDAsMCk7dHJhbnNmb3JtOnNjYWxlKC4xKSB0cmFuc2xhdGUzZCgtMjAwMHB4LDAsMCk7LXdlYmtpdC10cmFuc2Zvcm0tb3JpZ2luOmxlZnQgY2VudGVyO3RyYW5zZm9ybS1vcmlnaW46bGVmdCBjZW50ZXJ9fUBrZXlmcmFtZXMgem9vbU91dExlZnR7NDAle29wYWNpdHk6MTstd2Via2l0LXRyYW5zZm9ybTpzY2FsZTNkKC40NzUsLjQ3NSwuNDc1KSB0cmFuc2xhdGUzZCg0MnB4LDAsMCk7dHJhbnNmb3JtOnNjYWxlM2QoLjQ3NSwuNDc1LC40NzUpIHRyYW5zbGF0ZTNkKDQycHgsMCwwKX0xMDAle29wYWNpdHk6MDstd2Via2l0LXRyYW5zZm9ybTpzY2FsZSguMSkgdHJhbnNsYXRlM2QoLTIwMDBweCwwLDApO3RyYW5zZm9ybTpzY2FsZSguMSkgdHJhbnNsYXRlM2QoLTIwMDBweCwwLDApOy13ZWJraXQtdHJhbnNmb3JtLW9yaWdpbjpsZWZ0IGNlbnRlcjt0cmFuc2Zvcm0tb3JpZ2luOmxlZnQgY2VudGVyfX0uem9vbU91dExlZnR7LXdlYmtpdC1hbmltYXRpb24tbmFtZTp6b29tT3V0TGVmdDthbmltYXRpb24tbmFtZTp6b29tT3V0TGVmdH1ALXdlYmtpdC1rZXlmcmFtZXMgem9vbU91dFJpZ2h0ezQwJXtvcGFjaXR5OjE7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGUzZCguNDc1LC40NzUsLjQ3NSkgdHJhbnNsYXRlM2QoLTQycHgsMCwwKTt0cmFuc2Zvcm06c2NhbGUzZCguNDc1LC40NzUsLjQ3NSkgdHJhbnNsYXRlM2QoLTQycHgsMCwwKX0xMDAle29wYWNpdHk6MDstd2Via2l0LXRyYW5zZm9ybTpzY2FsZSguMSkgdHJhbnNsYXRlM2QoMjAwMHB4LDAsMCk7dHJhbnNmb3JtOnNjYWxlKC4xKSB0cmFuc2xhdGUzZCgyMDAwcHgsMCwwKTstd2Via2l0LXRyYW5zZm9ybS1vcmlnaW46cmlnaHQgY2VudGVyO3RyYW5zZm9ybS1vcmlnaW46cmlnaHQgY2VudGVyfX1Aa2V5ZnJhbWVzIHpvb21PdXRSaWdodHs0MCV7b3BhY2l0eToxOy13ZWJraXQtdHJhbnNmb3JtOnNjYWxlM2QoLjQ3NSwuNDc1LC40NzUpIHRyYW5zbGF0ZTNkKC00MnB4LDAsMCk7dHJhbnNmb3JtOnNjYWxlM2QoLjQ3NSwuNDc1LC40NzUpIHRyYW5zbGF0ZTNkKC00MnB4LDAsMCl9MTAwJXtvcGFjaXR5OjA7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGUoLjEpIHRyYW5zbGF0ZTNkKDIwMDBweCwwLDApO3RyYW5zZm9ybTpzY2FsZSguMSkgdHJhbnNsYXRlM2QoMjAwMHB4LDAsMCk7LXdlYmtpdC10cmFuc2Zvcm0tb3JpZ2luOnJpZ2h0IGNlbnRlcjt0cmFuc2Zvcm0tb3JpZ2luOnJpZ2h0IGNlbnRlcn19Lnpvb21PdXRSaWdodHstd2Via2l0LWFuaW1hdGlvbi1uYW1lOnpvb21PdXRSaWdodDthbmltYXRpb24tbmFtZTp6b29tT3V0UmlnaHR9QC13ZWJraXQta2V5ZnJhbWVzIHpvb21PdXRVcHs0MCV7b3BhY2l0eToxOy13ZWJraXQtdHJhbnNmb3JtOnNjYWxlM2QoLjQ3NSwuNDc1LC40NzUpIHRyYW5zbGF0ZTNkKDAsNjBweCwwKTt0cmFuc2Zvcm06c2NhbGUzZCguNDc1LC40NzUsLjQ3NSkgdHJhbnNsYXRlM2QoMCw2MHB4LDApOy13ZWJraXQtYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjpjdWJpYy1iZXppZXIoMC41NSwuMDU1LC42NzUsLjE5KTthbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOmN1YmljLWJlemllcigwLjU1LC4wNTUsLjY3NSwuMTkpfTEwMCV7b3BhY2l0eTowOy13ZWJraXQtdHJhbnNmb3JtOnNjYWxlM2QoLjEsLjEsLjEpIHRyYW5zbGF0ZTNkKDAsLTIwMDBweCwwKTt0cmFuc2Zvcm06c2NhbGUzZCguMSwuMSwuMSkgdHJhbnNsYXRlM2QoMCwtMjAwMHB4LDApOy13ZWJraXQtdHJhbnNmb3JtLW9yaWdpbjpjZW50ZXIgYm90dG9tO3RyYW5zZm9ybS1vcmlnaW46Y2VudGVyIGJvdHRvbTstd2Via2l0LWFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246Y3ViaWMtYmV6aWVyKDAuMTc1LC44ODUsLjMyLDEpO2FuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246Y3ViaWMtYmV6aWVyKDAuMTc1LC44ODUsLjMyLDEpfX1Aa2V5ZnJhbWVzIHpvb21PdXRVcHs0MCV7b3BhY2l0eToxOy13ZWJraXQtdHJhbnNmb3JtOnNjYWxlM2QoLjQ3NSwuNDc1LC40NzUpIHRyYW5zbGF0ZTNkKDAsNjBweCwwKTt0cmFuc2Zvcm06c2NhbGUzZCguNDc1LC40NzUsLjQ3NSkgdHJhbnNsYXRlM2QoMCw2MHB4LDApOy13ZWJraXQtYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjpjdWJpYy1iZXppZXIoMC41NSwuMDU1LC42NzUsLjE5KTthbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOmN1YmljLWJlemllcigwLjU1LC4wNTUsLjY3NSwuMTkpfTEwMCV7b3BhY2l0eTowOy13ZWJraXQtdHJhbnNmb3JtOnNjYWxlM2QoLjEsLjEsLjEpIHRyYW5zbGF0ZTNkKDAsLTIwMDBweCwwKTt0cmFuc2Zvcm06c2NhbGUzZCguMSwuMSwuMSkgdHJhbnNsYXRlM2QoMCwtMjAwMHB4LDApOy13ZWJraXQtdHJhbnNmb3JtLW9yaWdpbjpjZW50ZXIgYm90dG9tO3RyYW5zZm9ybS1vcmlnaW46Y2VudGVyIGJvdHRvbTstd2Via2l0LWFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246Y3ViaWMtYmV6aWVyKDAuMTc1LC44ODUsLjMyLDEpO2FuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246Y3ViaWMtYmV6aWVyKDAuMTc1LC44ODUsLjMyLDEpfX0uem9vbU91dFVwey13ZWJraXQtYW5pbWF0aW9uLW5hbWU6em9vbU91dFVwO2FuaW1hdGlvbi1uYW1lOnpvb21PdXRVcH1ALXdlYmtpdC1rZXlmcmFtZXMgc2xpZGVJbkRvd257MCV7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlWSgtMTAwJSk7dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEwMCUpO3Zpc2liaWxpdHk6dmlzaWJsZX0xMDAley13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZVkoMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZVkoMCl9fUBrZXlmcmFtZXMgc2xpZGVJbkRvd257MCV7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlWSgtMTAwJSk7dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEwMCUpO3Zpc2liaWxpdHk6dmlzaWJsZX0xMDAley13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZVkoMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZVkoMCl9fS5zbGlkZUluRG93bnstd2Via2l0LWFuaW1hdGlvbi1uYW1lOnNsaWRlSW5Eb3duO2FuaW1hdGlvbi1uYW1lOnNsaWRlSW5Eb3dufUAtd2Via2l0LWtleWZyYW1lcyBzbGlkZUluTGVmdHswJXstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGVYKC0xMDAlKTt0cmFuc2Zvcm06dHJhbnNsYXRlWCgtMTAwJSk7dmlzaWJpbGl0eTp2aXNpYmxlfTEwMCV7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlWCgwKTt0cmFuc2Zvcm06dHJhbnNsYXRlWCgwKX19QGtleWZyYW1lcyBzbGlkZUluTGVmdHswJXstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGVYKC0xMDAlKTt0cmFuc2Zvcm06dHJhbnNsYXRlWCgtMTAwJSk7dmlzaWJpbGl0eTp2aXNpYmxlfTEwMCV7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlWCgwKTt0cmFuc2Zvcm06dHJhbnNsYXRlWCgwKX19LnNsaWRlSW5MZWZ0ey13ZWJraXQtYW5pbWF0aW9uLW5hbWU6c2xpZGVJbkxlZnQ7YW5pbWF0aW9uLW5hbWU6c2xpZGVJbkxlZnR9QC13ZWJraXQta2V5ZnJhbWVzIHNsaWRlSW5SaWdodHswJXstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGVYKDEwMCUpO3RyYW5zZm9ybTp0cmFuc2xhdGVYKDEwMCUpO3Zpc2liaWxpdHk6dmlzaWJsZX0xMDAley13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZVgoMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZVgoMCl9fUBrZXlmcmFtZXMgc2xpZGVJblJpZ2h0ezAley13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZVgoMTAwJSk7dHJhbnNmb3JtOnRyYW5zbGF0ZVgoMTAwJSk7dmlzaWJpbGl0eTp2aXNpYmxlfTEwMCV7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlWCgwKTt0cmFuc2Zvcm06dHJhbnNsYXRlWCgwKX19LnNsaWRlSW5SaWdodHstd2Via2l0LWFuaW1hdGlvbi1uYW1lOnNsaWRlSW5SaWdodDthbmltYXRpb24tbmFtZTpzbGlkZUluUmlnaHR9QC13ZWJraXQta2V5ZnJhbWVzIHNsaWRlSW5VcHswJXstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGVZKDEwMCUpO3RyYW5zZm9ybTp0cmFuc2xhdGVZKDEwMCUpO3Zpc2liaWxpdHk6dmlzaWJsZX0xMDAley13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZVkoMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZVkoMCl9fUBrZXlmcmFtZXMgc2xpZGVJblVwezAley13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZVkoMTAwJSk7dHJhbnNmb3JtOnRyYW5zbGF0ZVkoMTAwJSk7dmlzaWJpbGl0eTp2aXNpYmxlfTEwMCV7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlWSgwKTt0cmFuc2Zvcm06dHJhbnNsYXRlWSgwKX19LnNsaWRlSW5VcHstd2Via2l0LWFuaW1hdGlvbi1uYW1lOnNsaWRlSW5VcDthbmltYXRpb24tbmFtZTpzbGlkZUluVXB9QC13ZWJraXQta2V5ZnJhbWVzIHNsaWRlT3V0RG93bnswJXstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGVZKDApO3RyYW5zZm9ybTp0cmFuc2xhdGVZKDApfTEwMCV7dmlzaWJpbGl0eTpoaWRkZW47LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlWSgxMDAlKTt0cmFuc2Zvcm06dHJhbnNsYXRlWSgxMDAlKX19QGtleWZyYW1lcyBzbGlkZU91dERvd257MCV7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlWSgwKTt0cmFuc2Zvcm06dHJhbnNsYXRlWSgwKX0xMDAle3Zpc2liaWxpdHk6aGlkZGVuOy13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZVkoMTAwJSk7dHJhbnNmb3JtOnRyYW5zbGF0ZVkoMTAwJSl9fS5zbGlkZU91dERvd257LXdlYmtpdC1hbmltYXRpb24tbmFtZTpzbGlkZU91dERvd247YW5pbWF0aW9uLW5hbWU6c2xpZGVPdXREb3dufUAtd2Via2l0LWtleWZyYW1lcyBzbGlkZU91dExlZnR7MCV7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlWCgwKTt0cmFuc2Zvcm06dHJhbnNsYXRlWCgwKX0xMDAle3Zpc2liaWxpdHk6aGlkZGVuOy13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZVgoLTEwMCUpO3RyYW5zZm9ybTp0cmFuc2xhdGVYKC0xMDAlKX19QGtleWZyYW1lcyBzbGlkZU91dExlZnR7MCV7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlWCgwKTt0cmFuc2Zvcm06dHJhbnNsYXRlWCgwKX0xMDAle3Zpc2liaWxpdHk6aGlkZGVuOy13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZVgoLTEwMCUpO3RyYW5zZm9ybTp0cmFuc2xhdGVYKC0xMDAlKX19LnNsaWRlT3V0TGVmdHstd2Via2l0LWFuaW1hdGlvbi1uYW1lOnNsaWRlT3V0TGVmdDthbmltYXRpb24tbmFtZTpzbGlkZU91dExlZnR9QC13ZWJraXQta2V5ZnJhbWVzIHNsaWRlT3V0UmlnaHR7MCV7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlWCgwKTt0cmFuc2Zvcm06dHJhbnNsYXRlWCgwKX0xMDAle3Zpc2liaWxpdHk6aGlkZGVuOy13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZVgoMTAwJSk7dHJhbnNmb3JtOnRyYW5zbGF0ZVgoMTAwJSl9fUBrZXlmcmFtZXMgc2xpZGVPdXRSaWdodHswJXstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGVYKDApO3RyYW5zZm9ybTp0cmFuc2xhdGVYKDApfTEwMCV7dmlzaWJpbGl0eTpoaWRkZW47LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlWCgxMDAlKTt0cmFuc2Zvcm06dHJhbnNsYXRlWCgxMDAlKX19LnNsaWRlT3V0UmlnaHR7LXdlYmtpdC1hbmltYXRpb24tbmFtZTpzbGlkZU91dFJpZ2h0O2FuaW1hdGlvbi1uYW1lOnNsaWRlT3V0UmlnaHR9QC13ZWJraXQta2V5ZnJhbWVzIHNsaWRlT3V0VXB7MCV7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlWSgwKTt0cmFuc2Zvcm06dHJhbnNsYXRlWSgwKX0xMDAle3Zpc2liaWxpdHk6aGlkZGVuOy13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEwMCUpO3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xMDAlKX19QGtleWZyYW1lcyBzbGlkZU91dFVwezAley13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZVkoMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZVkoMCl9MTAwJXt2aXNpYmlsaXR5OmhpZGRlbjstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGVZKC0xMDAlKTt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMTAwJSl9fS5zbGlkZU91dFVwey13ZWJraXQtYW5pbWF0aW9uLW5hbWU6c2xpZGVPdXRVcDthbmltYXRpb24tbmFtZTpzbGlkZU91dFVwfSIsIi8qISBub3JtYWxpemUuY3NzIHYzLjAuMiB8IE1JVCBMaWNlbnNlIHwgZ2l0LmlvL25vcm1hbGl6ZSAqL1xuXG4vL1xuLy8gMS4gU2V0IGRlZmF1bHQgZm9udCBmYW1pbHkgdG8gc2Fucy1zZXJpZi5cbi8vIDIuIFByZXZlbnQgaU9TIHRleHQgc2l6ZSBhZGp1c3QgYWZ0ZXIgb3JpZW50YXRpb24gY2hhbmdlLCB3aXRob3V0IGRpc2FibGluZ1xuLy8gICAgdXNlciB6b29tLlxuLy9cblxuaHRtbCB7XG4gIGZvbnQtZmFtaWx5OiBzYW5zLXNlcmlmOyAvLyAxXG4gIC1tcy10ZXh0LXNpemUtYWRqdXN0OiAxMDAlOyAvLyAyXG4gIC13ZWJraXQtdGV4dC1zaXplLWFkanVzdDogMTAwJTsgLy8gMlxufVxuXG4vL1xuLy8gUmVtb3ZlIGRlZmF1bHQgbWFyZ2luLlxuLy9cblxuYm9keSB7XG4gIG1hcmdpbjogMDtcbn1cblxuLy8gSFRNTDUgZGlzcGxheSBkZWZpbml0aW9uc1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLy9cbi8vIENvcnJlY3QgYGJsb2NrYCBkaXNwbGF5IG5vdCBkZWZpbmVkIGZvciBhbnkgSFRNTDUgZWxlbWVudCBpbiBJRSA4LzkuXG4vLyBDb3JyZWN0IGBibG9ja2AgZGlzcGxheSBub3QgZGVmaW5lZCBmb3IgYGRldGFpbHNgIG9yIGBzdW1tYXJ5YCBpbiBJRSAxMC8xMVxuLy8gYW5kIEZpcmVmb3guXG4vLyBDb3JyZWN0IGBibG9ja2AgZGlzcGxheSBub3QgZGVmaW5lZCBmb3IgYG1haW5gIGluIElFIDExLlxuLy9cblxuYXJ0aWNsZSxcbmFzaWRlLFxuZGV0YWlscyxcbmZpZ2NhcHRpb24sXG5maWd1cmUsXG5mb290ZXIsXG5oZWFkZXIsXG5oZ3JvdXAsXG5tYWluLFxubWVudSxcbm5hdixcbnNlY3Rpb24sXG5zdW1tYXJ5IHtcbiAgZGlzcGxheTogYmxvY2s7XG59XG5cbi8vXG4vLyAxLiBDb3JyZWN0IGBpbmxpbmUtYmxvY2tgIGRpc3BsYXkgbm90IGRlZmluZWQgaW4gSUUgOC85LlxuLy8gMi4gTm9ybWFsaXplIHZlcnRpY2FsIGFsaWdubWVudCBvZiBgcHJvZ3Jlc3NgIGluIENocm9tZSwgRmlyZWZveCwgYW5kIE9wZXJhLlxuLy9cblxuYXVkaW8sXG5jYW52YXMsXG5wcm9ncmVzcyxcbnZpZGVvIHtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrOyAvLyAxXG4gIHZlcnRpY2FsLWFsaWduOiBiYXNlbGluZTsgLy8gMlxufVxuXG4vL1xuLy8gUHJldmVudCBtb2Rlcm4gYnJvd3NlcnMgZnJvbSBkaXNwbGF5aW5nIGBhdWRpb2Agd2l0aG91dCBjb250cm9scy5cbi8vIFJlbW92ZSBleGNlc3MgaGVpZ2h0IGluIGlPUyA1IGRldmljZXMuXG4vL1xuXG5hdWRpbzpub3QoW2NvbnRyb2xzXSkge1xuICBkaXNwbGF5OiBub25lO1xuICBoZWlnaHQ6IDA7XG59XG5cbi8vXG4vLyBBZGRyZXNzIGBbaGlkZGVuXWAgc3R5bGluZyBub3QgcHJlc2VudCBpbiBJRSA4LzkvMTAuXG4vLyBIaWRlIHRoZSBgdGVtcGxhdGVgIGVsZW1lbnQgaW4gSUUgOC85LzExLCBTYWZhcmksIGFuZCBGaXJlZm94IDwgMjIuXG4vL1xuXG5baGlkZGVuXSxcbnRlbXBsYXRlIHtcbiAgZGlzcGxheTogbm9uZTtcbn1cblxuLy8gTGlua3Ncbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8vXG4vLyBSZW1vdmUgdGhlIGdyYXkgYmFja2dyb3VuZCBjb2xvciBmcm9tIGFjdGl2ZSBsaW5rcyBpbiBJRSAxMC5cbi8vXG5cbmEge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDtcbn1cblxuLy9cbi8vIEltcHJvdmUgcmVhZGFiaWxpdHkgd2hlbiBmb2N1c2VkIGFuZCBhbHNvIG1vdXNlIGhvdmVyZWQgaW4gYWxsIGJyb3dzZXJzLlxuLy9cblxuYTphY3RpdmUsXG5hOmhvdmVyIHtcbiAgb3V0bGluZTogMDtcbn1cblxuLy8gVGV4dC1sZXZlbCBzZW1hbnRpY3Ncbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8vXG4vLyBBZGRyZXNzIHN0eWxpbmcgbm90IHByZXNlbnQgaW4gSUUgOC85LzEwLzExLCBTYWZhcmksIGFuZCBDaHJvbWUuXG4vL1xuXG5hYmJyW3RpdGxlXSB7XG4gIGJvcmRlci1ib3R0b206IDFweCBkb3R0ZWQ7XG59XG5cbi8vXG4vLyBBZGRyZXNzIHN0eWxlIHNldCB0byBgYm9sZGVyYCBpbiBGaXJlZm94IDQrLCBTYWZhcmksIGFuZCBDaHJvbWUuXG4vL1xuXG5iLFxuc3Ryb25nIHtcbiAgZm9udC13ZWlnaHQ6IGJvbGQ7XG59XG5cbi8vXG4vLyBBZGRyZXNzIHN0eWxpbmcgbm90IHByZXNlbnQgaW4gU2FmYXJpIGFuZCBDaHJvbWUuXG4vL1xuXG5kZm4ge1xuICBmb250LXN0eWxlOiBpdGFsaWM7XG59XG5cbi8vXG4vLyBBZGRyZXNzIHZhcmlhYmxlIGBoMWAgZm9udC1zaXplIGFuZCBtYXJnaW4gd2l0aGluIGBzZWN0aW9uYCBhbmQgYGFydGljbGVgXG4vLyBjb250ZXh0cyBpbiBGaXJlZm94IDQrLCBTYWZhcmksIGFuZCBDaHJvbWUuXG4vL1xuXG5oMSB7XG4gIGZvbnQtc2l6ZTogMmVtO1xuICBtYXJnaW46IDAuNjdlbSAwO1xufVxuXG4vL1xuLy8gQWRkcmVzcyBzdHlsaW5nIG5vdCBwcmVzZW50IGluIElFIDgvOS5cbi8vXG5cbm1hcmsge1xuICBiYWNrZ3JvdW5kOiAjZmYwO1xuICBjb2xvcjogIzAwMDtcbn1cblxuLy9cbi8vIEFkZHJlc3MgaW5jb25zaXN0ZW50IGFuZCB2YXJpYWJsZSBmb250IHNpemUgaW4gYWxsIGJyb3dzZXJzLlxuLy9cblxuc21hbGwge1xuICBmb250LXNpemU6IDgwJTtcbn1cblxuLy9cbi8vIFByZXZlbnQgYHN1YmAgYW5kIGBzdXBgIGFmZmVjdGluZyBgbGluZS1oZWlnaHRgIGluIGFsbCBicm93c2Vycy5cbi8vXG5cbnN1YixcbnN1cCB7XG4gIGZvbnQtc2l6ZTogNzUlO1xuICBsaW5lLWhlaWdodDogMDtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICB2ZXJ0aWNhbC1hbGlnbjogYmFzZWxpbmU7XG59XG5cbnN1cCB7XG4gIHRvcDogLTAuNWVtO1xufVxuXG5zdWIge1xuICBib3R0b206IC0wLjI1ZW07XG59XG5cbi8vIEVtYmVkZGVkIGNvbnRlbnRcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8vXG4vLyBSZW1vdmUgYm9yZGVyIHdoZW4gaW5zaWRlIGBhYCBlbGVtZW50IGluIElFIDgvOS8xMC5cbi8vXG5cbmltZyB7XG4gIGJvcmRlcjogMDtcbn1cblxuLy9cbi8vIENvcnJlY3Qgb3ZlcmZsb3cgbm90IGhpZGRlbiBpbiBJRSA5LzEwLzExLlxuLy9cblxuc3ZnOm5vdCg6cm9vdCkge1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuXG4vLyBHcm91cGluZyBjb250ZW50XG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vL1xuLy8gQWRkcmVzcyBtYXJnaW4gbm90IHByZXNlbnQgaW4gSUUgOC85IGFuZCBTYWZhcmkuXG4vL1xuXG5maWd1cmUge1xuICBtYXJnaW46IDFlbSA0MHB4O1xufVxuXG4vL1xuLy8gQWRkcmVzcyBkaWZmZXJlbmNlcyBiZXR3ZWVuIEZpcmVmb3ggYW5kIG90aGVyIGJyb3dzZXJzLlxuLy9cblxuaHIge1xuICAtbW96LWJveC1zaXppbmc6IGNvbnRlbnQtYm94O1xuICBib3gtc2l6aW5nOiBjb250ZW50LWJveDtcbiAgaGVpZ2h0OiAwO1xufVxuXG4vL1xuLy8gQ29udGFpbiBvdmVyZmxvdyBpbiBhbGwgYnJvd3NlcnMuXG4vL1xuXG5wcmUge1xuICBvdmVyZmxvdzogYXV0bztcbn1cblxuLy9cbi8vIEFkZHJlc3Mgb2RkIGBlbWAtdW5pdCBmb250IHNpemUgcmVuZGVyaW5nIGluIGFsbCBicm93c2Vycy5cbi8vXG5cbmNvZGUsXG5rYmQsXG5wcmUsXG5zYW1wIHtcbiAgZm9udC1mYW1pbHk6IG1vbm9zcGFjZSwgbW9ub3NwYWNlO1xuICBmb250LXNpemU6IDFlbTtcbn1cblxuLy8gRm9ybXNcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8vXG4vLyBLbm93biBsaW1pdGF0aW9uOiBieSBkZWZhdWx0LCBDaHJvbWUgYW5kIFNhZmFyaSBvbiBPUyBYIGFsbG93IHZlcnkgbGltaXRlZFxuLy8gc3R5bGluZyBvZiBgc2VsZWN0YCwgdW5sZXNzIGEgYGJvcmRlcmAgcHJvcGVydHkgaXMgc2V0LlxuLy9cblxuLy9cbi8vIDEuIENvcnJlY3QgY29sb3Igbm90IGJlaW5nIGluaGVyaXRlZC5cbi8vICAgIEtub3duIGlzc3VlOiBhZmZlY3RzIGNvbG9yIG9mIGRpc2FibGVkIGVsZW1lbnRzLlxuLy8gMi4gQ29ycmVjdCBmb250IHByb3BlcnRpZXMgbm90IGJlaW5nIGluaGVyaXRlZC5cbi8vIDMuIEFkZHJlc3MgbWFyZ2lucyBzZXQgZGlmZmVyZW50bHkgaW4gRmlyZWZveCA0KywgU2FmYXJpLCBhbmQgQ2hyb21lLlxuLy9cblxuYnV0dG9uLFxuaW5wdXQsXG5vcHRncm91cCxcbnNlbGVjdCxcbnRleHRhcmVhIHtcbiAgY29sb3I6IGluaGVyaXQ7IC8vIDFcbiAgZm9udDogaW5oZXJpdDsgLy8gMlxuICBtYXJnaW46IDA7IC8vIDNcbn1cblxuLy9cbi8vIEFkZHJlc3MgYG92ZXJmbG93YCBzZXQgdG8gYGhpZGRlbmAgaW4gSUUgOC85LzEwLzExLlxuLy9cblxuYnV0dG9uIHtcbiAgb3ZlcmZsb3c6IHZpc2libGU7XG59XG5cbi8vXG4vLyBBZGRyZXNzIGluY29uc2lzdGVudCBgdGV4dC10cmFuc2Zvcm1gIGluaGVyaXRhbmNlIGZvciBgYnV0dG9uYCBhbmQgYHNlbGVjdGAuXG4vLyBBbGwgb3RoZXIgZm9ybSBjb250cm9sIGVsZW1lbnRzIGRvIG5vdCBpbmhlcml0IGB0ZXh0LXRyYW5zZm9ybWAgdmFsdWVzLlxuLy8gQ29ycmVjdCBgYnV0dG9uYCBzdHlsZSBpbmhlcml0YW5jZSBpbiBGaXJlZm94LCBJRSA4LzkvMTAvMTEsIGFuZCBPcGVyYS5cbi8vIENvcnJlY3QgYHNlbGVjdGAgc3R5bGUgaW5oZXJpdGFuY2UgaW4gRmlyZWZveC5cbi8vXG5cbmJ1dHRvbixcbnNlbGVjdCB7XG4gIHRleHQtdHJhbnNmb3JtOiBub25lO1xufVxuXG4vL1xuLy8gMS4gQXZvaWQgdGhlIFdlYktpdCBidWcgaW4gQW5kcm9pZCA0LjAuKiB3aGVyZSAoMikgZGVzdHJveXMgbmF0aXZlIGBhdWRpb2Bcbi8vICAgIGFuZCBgdmlkZW9gIGNvbnRyb2xzLlxuLy8gMi4gQ29ycmVjdCBpbmFiaWxpdHkgdG8gc3R5bGUgY2xpY2thYmxlIGBpbnB1dGAgdHlwZXMgaW4gaU9TLlxuLy8gMy4gSW1wcm92ZSB1c2FiaWxpdHkgYW5kIGNvbnNpc3RlbmN5IG9mIGN1cnNvciBzdHlsZSBiZXR3ZWVuIGltYWdlLXR5cGVcbi8vICAgIGBpbnB1dGAgYW5kIG90aGVycy5cbi8vXG5cbmJ1dHRvbixcbmh0bWwgaW5wdXRbdHlwZT1cImJ1dHRvblwiXSwgLy8gMVxuaW5wdXRbdHlwZT1cInJlc2V0XCJdLFxuaW5wdXRbdHlwZT1cInN1Ym1pdFwiXSB7XG4gIC13ZWJraXQtYXBwZWFyYW5jZTogYnV0dG9uOyAvLyAyXG4gIGN1cnNvcjogcG9pbnRlcjsgLy8gM1xufVxuXG4vL1xuLy8gUmUtc2V0IGRlZmF1bHQgY3Vyc29yIGZvciBkaXNhYmxlZCBlbGVtZW50cy5cbi8vXG5cbmJ1dHRvbltkaXNhYmxlZF0sXG5odG1sIGlucHV0W2Rpc2FibGVkXSB7XG4gIGN1cnNvcjogZGVmYXVsdDtcbn1cblxuLy9cbi8vIFJlbW92ZSBpbm5lciBwYWRkaW5nIGFuZCBib3JkZXIgaW4gRmlyZWZveCA0Ky5cbi8vXG5cbmJ1dHRvbjo6LW1vei1mb2N1cy1pbm5lcixcbmlucHV0OjotbW96LWZvY3VzLWlubmVyIHtcbiAgYm9yZGVyOiAwO1xuICBwYWRkaW5nOiAwO1xufVxuXG4vL1xuLy8gQWRkcmVzcyBGaXJlZm94IDQrIHNldHRpbmcgYGxpbmUtaGVpZ2h0YCBvbiBgaW5wdXRgIHVzaW5nIGAhaW1wb3J0YW50YCBpblxuLy8gdGhlIFVBIHN0eWxlc2hlZXQuXG4vL1xuXG5pbnB1dCB7XG4gIGxpbmUtaGVpZ2h0OiBub3JtYWw7XG59XG5cbi8vXG4vLyBJdCdzIHJlY29tbWVuZGVkIHRoYXQgeW91IGRvbid0IGF0dGVtcHQgdG8gc3R5bGUgdGhlc2UgZWxlbWVudHMuXG4vLyBGaXJlZm94J3MgaW1wbGVtZW50YXRpb24gZG9lc24ndCByZXNwZWN0IGJveC1zaXppbmcsIHBhZGRpbmcsIG9yIHdpZHRoLlxuLy9cbi8vIDEuIEFkZHJlc3MgYm94IHNpemluZyBzZXQgdG8gYGNvbnRlbnQtYm94YCBpbiBJRSA4LzkvMTAuXG4vLyAyLiBSZW1vdmUgZXhjZXNzIHBhZGRpbmcgaW4gSUUgOC85LzEwLlxuLy9cblxuaW5wdXRbdHlwZT1cImNoZWNrYm94XCJdLFxuaW5wdXRbdHlwZT1cInJhZGlvXCJdIHtcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDsgLy8gMVxuICBwYWRkaW5nOiAwOyAvLyAyXG59XG5cbi8vXG4vLyBGaXggdGhlIGN1cnNvciBzdHlsZSBmb3IgQ2hyb21lJ3MgaW5jcmVtZW50L2RlY3JlbWVudCBidXR0b25zLiBGb3IgY2VydGFpblxuLy8gYGZvbnQtc2l6ZWAgdmFsdWVzIG9mIHRoZSBgaW5wdXRgLCBpdCBjYXVzZXMgdGhlIGN1cnNvciBzdHlsZSBvZiB0aGVcbi8vIGRlY3JlbWVudCBidXR0b24gdG8gY2hhbmdlIGZyb20gYGRlZmF1bHRgIHRvIGB0ZXh0YC5cbi8vXG5cbmlucHV0W3R5cGU9XCJudW1iZXJcIl06Oi13ZWJraXQtaW5uZXItc3Bpbi1idXR0b24sXG5pbnB1dFt0eXBlPVwibnVtYmVyXCJdOjotd2Via2l0LW91dGVyLXNwaW4tYnV0dG9uIHtcbiAgaGVpZ2h0OiBhdXRvO1xufVxuXG4vL1xuLy8gMS4gQWRkcmVzcyBgYXBwZWFyYW5jZWAgc2V0IHRvIGBzZWFyY2hmaWVsZGAgaW4gU2FmYXJpIGFuZCBDaHJvbWUuXG4vLyAyLiBBZGRyZXNzIGBib3gtc2l6aW5nYCBzZXQgdG8gYGJvcmRlci1ib3hgIGluIFNhZmFyaSBhbmQgQ2hyb21lXG4vLyAgICAoaW5jbHVkZSBgLW1vemAgdG8gZnV0dXJlLXByb29mKS5cbi8vXG5cbmlucHV0W3R5cGU9XCJzZWFyY2hcIl0ge1xuICAtd2Via2l0LWFwcGVhcmFuY2U6IHRleHRmaWVsZDsgLy8gMVxuICAtbW96LWJveC1zaXppbmc6IGNvbnRlbnQtYm94O1xuICAtd2Via2l0LWJveC1zaXppbmc6IGNvbnRlbnQtYm94OyAvLyAyXG4gIGJveC1zaXppbmc6IGNvbnRlbnQtYm94O1xufVxuXG4vL1xuLy8gUmVtb3ZlIGlubmVyIHBhZGRpbmcgYW5kIHNlYXJjaCBjYW5jZWwgYnV0dG9uIGluIFNhZmFyaSBhbmQgQ2hyb21lIG9uIE9TIFguXG4vLyBTYWZhcmkgKGJ1dCBub3QgQ2hyb21lKSBjbGlwcyB0aGUgY2FuY2VsIGJ1dHRvbiB3aGVuIHRoZSBzZWFyY2ggaW5wdXQgaGFzXG4vLyBwYWRkaW5nIChhbmQgYHRleHRmaWVsZGAgYXBwZWFyYW5jZSkuXG4vL1xuXG5pbnB1dFt0eXBlPVwic2VhcmNoXCJdOjotd2Via2l0LXNlYXJjaC1jYW5jZWwtYnV0dG9uLFxuaW5wdXRbdHlwZT1cInNlYXJjaFwiXTo6LXdlYmtpdC1zZWFyY2gtZGVjb3JhdGlvbiB7XG4gIC13ZWJraXQtYXBwZWFyYW5jZTogbm9uZTtcbn1cblxuLy9cbi8vIERlZmluZSBjb25zaXN0ZW50IGJvcmRlciwgbWFyZ2luLCBhbmQgcGFkZGluZy5cbi8vXG5cbmZpZWxkc2V0IHtcbiAgYm9yZGVyOiAxcHggc29saWQgI2MwYzBjMDtcbiAgbWFyZ2luOiAwIDJweDtcbiAgcGFkZGluZzogMC4zNWVtIDAuNjI1ZW0gMC43NWVtO1xufVxuXG4vL1xuLy8gMS4gQ29ycmVjdCBgY29sb3JgIG5vdCBiZWluZyBpbmhlcml0ZWQgaW4gSUUgOC85LzEwLzExLlxuLy8gMi4gUmVtb3ZlIHBhZGRpbmcgc28gcGVvcGxlIGFyZW4ndCBjYXVnaHQgb3V0IGlmIHRoZXkgemVybyBvdXQgZmllbGRzZXRzLlxuLy9cblxubGVnZW5kIHtcbiAgYm9yZGVyOiAwOyAvLyAxXG4gIHBhZGRpbmc6IDA7IC8vIDJcbn1cblxuLy9cbi8vIFJlbW92ZSBkZWZhdWx0IHZlcnRpY2FsIHNjcm9sbGJhciBpbiBJRSA4LzkvMTAvMTEuXG4vL1xuXG50ZXh0YXJlYSB7XG4gIG92ZXJmbG93OiBhdXRvO1xufVxuXG4vL1xuLy8gRG9uJ3QgaW5oZXJpdCB0aGUgYGZvbnQtd2VpZ2h0YCAoYXBwbGllZCBieSBhIHJ1bGUgYWJvdmUpLlxuLy8gTk9URTogdGhlIGRlZmF1bHQgY2Fubm90IHNhZmVseSBiZSBjaGFuZ2VkIGluIENocm9tZSBhbmQgU2FmYXJpIG9uIE9TIFguXG4vL1xuXG5vcHRncm91cCB7XG4gIGZvbnQtd2VpZ2h0OiBib2xkO1xufVxuXG4vLyBUYWJsZXNcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8vXG4vLyBSZW1vdmUgbW9zdCBzcGFjaW5nIGJldHdlZW4gdGFibGUgY2VsbHMuXG4vL1xuXG50YWJsZSB7XG4gIGJvcmRlci1jb2xsYXBzZTogY29sbGFwc2U7XG4gIGJvcmRlci1zcGFjaW5nOiAwO1xufVxuXG50ZCxcbnRoIHtcbiAgcGFkZGluZzogMDtcbn1cbiIsIi8qISBTb3VyY2U6IGh0dHBzOi8vZ2l0aHViLmNvbS9oNWJwL2h0bWw1LWJvaWxlcnBsYXRlL2Jsb2IvbWFzdGVyL3NyYy9jc3MvbWFpbi5jc3MgKi9cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFByaW50IHN0eWxlcy5cbi8vIElubGluZWQgdG8gYXZvaWQgdGhlIGFkZGl0aW9uYWwgSFRUUCByZXF1ZXN0OiBoNWJwLmNvbS9yXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5AbWVkaWEgcHJpbnQge1xuICAgICosXG4gICAgKjpiZWZvcmUsXG4gICAgKjphZnRlciB7XG4gICAgICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50ICFpbXBvcnRhbnQ7XG4gICAgICAgIGNvbG9yOiAjMDAwICFpbXBvcnRhbnQ7IC8vIEJsYWNrIHByaW50cyBmYXN0ZXI6IGg1YnAuY29tL3NcbiAgICAgICAgYm94LXNoYWRvdzogbm9uZSAhaW1wb3J0YW50O1xuICAgICAgICB0ZXh0LXNoYWRvdzogbm9uZSAhaW1wb3J0YW50O1xuICAgIH1cblxuICAgIGEsXG4gICAgYTp2aXNpdGVkIHtcbiAgICAgICAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7XG4gICAgfVxuXG4gICAgYVtocmVmXTphZnRlciB7XG4gICAgICAgIGNvbnRlbnQ6IFwiIChcIiBhdHRyKGhyZWYpIFwiKVwiO1xuICAgIH1cblxuICAgIGFiYnJbdGl0bGVdOmFmdGVyIHtcbiAgICAgICAgY29udGVudDogXCIgKFwiIGF0dHIodGl0bGUpIFwiKVwiO1xuICAgIH1cblxuICAgIC8vIERvbid0IHNob3cgbGlua3MgdGhhdCBhcmUgZnJhZ21lbnQgaWRlbnRpZmllcnMsXG4gICAgLy8gb3IgdXNlIHRoZSBgamF2YXNjcmlwdDpgIHBzZXVkbyBwcm90b2NvbFxuICAgIGFbaHJlZl49XCIjXCJdOmFmdGVyLFxuICAgIGFbaHJlZl49XCJqYXZhc2NyaXB0OlwiXTphZnRlciB7XG4gICAgICAgIGNvbnRlbnQ6IFwiXCI7XG4gICAgfVxuXG4gICAgcHJlLFxuICAgIGJsb2NrcXVvdGUge1xuICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAjOTk5O1xuICAgICAgICBwYWdlLWJyZWFrLWluc2lkZTogYXZvaWQ7XG4gICAgfVxuXG4gICAgdGhlYWQge1xuICAgICAgICBkaXNwbGF5OiB0YWJsZS1oZWFkZXItZ3JvdXA7IC8vIGg1YnAuY29tL3RcbiAgICB9XG5cbiAgICB0cixcbiAgICBpbWcge1xuICAgICAgICBwYWdlLWJyZWFrLWluc2lkZTogYXZvaWQ7XG4gICAgfVxuXG4gICAgaW1nIHtcbiAgICAgICAgbWF4LXdpZHRoOiAxMDAlICFpbXBvcnRhbnQ7XG4gICAgfVxuXG4gICAgcCxcbiAgICBoMixcbiAgICBoMyB7XG4gICAgICAgIG9ycGhhbnM6IDM7XG4gICAgICAgIHdpZG93czogMztcbiAgICB9XG5cbiAgICBoMixcbiAgICBoMyB7XG4gICAgICAgIHBhZ2UtYnJlYWstYWZ0ZXI6IGF2b2lkO1xuICAgIH1cblxuICAgIC8vIEJvb3RzdHJhcCBzcGVjaWZpYyBjaGFuZ2VzIHN0YXJ0XG4gICAgLy9cbiAgICAvLyBDaHJvbWUgKE9TWCkgZml4IGZvciBodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvaXNzdWVzLzExMjQ1XG4gICAgLy8gT25jZSBmaXhlZCwgd2UgY2FuIGp1c3Qgc3RyYWlnaHQgdXAgcmVtb3ZlIHRoaXMuXG4gICAgc2VsZWN0IHtcbiAgICAgICAgYmFja2dyb3VuZDogI2ZmZiAhaW1wb3J0YW50O1xuICAgIH1cblxuICAgIC8vIEJvb3RzdHJhcCBjb21wb25lbnRzXG4gICAgLm5hdmJhciB7XG4gICAgICAgIGRpc3BsYXk6IG5vbmU7XG4gICAgfVxuICAgIC5idG4sXG4gICAgLmRyb3B1cCA+IC5idG4ge1xuICAgICAgICA+IC5jYXJldCB7XG4gICAgICAgICAgICBib3JkZXItdG9wLWNvbG9yOiAjMDAwICFpbXBvcnRhbnQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLmxhYmVsIHtcbiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgIzAwMDtcbiAgICB9XG5cbiAgICAudGFibGUge1xuICAgICAgICBib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlICFpbXBvcnRhbnQ7XG5cbiAgICAgICAgdGQsXG4gICAgICAgIHRoIHtcbiAgICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmYgIWltcG9ydGFudDtcbiAgICAgICAgfVxuICAgIH1cbiAgICAudGFibGUtYm9yZGVyZWQge1xuICAgICAgICB0aCxcbiAgICAgICAgdGQge1xuICAgICAgICAgICAgYm9yZGVyOiAxcHggc29saWQgI2RkZCAhaW1wb3J0YW50O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gQm9vdHN0cmFwIHNwZWNpZmljIGNoYW5nZXMgZW5kXG59XG4iLCIvL1xuLy8gR2x5cGhpY29ucyBmb3IgQm9vdHN0cmFwXG4vL1xuLy8gU2luY2UgaWNvbnMgYXJlIGZvbnRzLCB0aGV5IGNhbiBiZSBwbGFjZWQgYW55d2hlcmUgdGV4dCBpcyBwbGFjZWQgYW5kIGFyZVxuLy8gdGh1cyBhdXRvbWF0aWNhbGx5IHNpemVkIHRvIG1hdGNoIHRoZSBzdXJyb3VuZGluZyBjaGlsZC4gVG8gdXNlLCBjcmVhdGUgYW5cbi8vIGlubGluZSBlbGVtZW50IHdpdGggdGhlIGFwcHJvcHJpYXRlIGNsYXNzZXMsIGxpa2Ugc286XG4vL1xuLy8gPGEgaHJlZj1cIiNcIj48c3BhbiBjbGFzcz1cImdseXBoaWNvbiBnbHlwaGljb24tc3RhclwiPjwvc3Bhbj4gU3RhcjwvYT5cblxuLy8gSW1wb3J0IHRoZSBmb250c1xuQGZvbnQtZmFjZSB7XG4gIGZvbnQtZmFtaWx5OiAnR2x5cGhpY29ucyBIYWxmbGluZ3MnO1xuICBzcmM6IHVybCgnQHtpY29uLWZvbnQtcGF0aH1Ae2ljb24tZm9udC1uYW1lfS5lb3QnKTtcbiAgc3JjOiB1cmwoJ0B7aWNvbi1mb250LXBhdGh9QHtpY29uLWZvbnQtbmFtZX0uZW90PyNpZWZpeCcpIGZvcm1hdCgnZW1iZWRkZWQtb3BlbnR5cGUnKSxcbiAgICAgICB1cmwoJ0B7aWNvbi1mb250LXBhdGh9QHtpY29uLWZvbnQtbmFtZX0ud29mZicpIGZvcm1hdCgnd29mZicpLFxuICAgICAgIHVybCgnQHtpY29uLWZvbnQtcGF0aH1Ae2ljb24tZm9udC1uYW1lfS50dGYnKSBmb3JtYXQoJ3RydWV0eXBlJyksXG4gICAgICAgdXJsKCdAe2ljb24tZm9udC1wYXRofUB7aWNvbi1mb250LW5hbWV9LnN2ZyNAe2ljb24tZm9udC1zdmctaWR9JykgZm9ybWF0KCdzdmcnKTtcbn1cblxuLy8gQ2F0Y2hhbGwgYmFzZWNsYXNzXG4uZ2x5cGhpY29uIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICB0b3A6IDFweDtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICBmb250LWZhbWlseTogJ0dseXBoaWNvbnMgSGFsZmxpbmdzJztcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xuICBmb250LXdlaWdodDogbm9ybWFsO1xuICBsaW5lLWhlaWdodDogMTtcbiAgLXdlYmtpdC1mb250LXNtb290aGluZzogYW50aWFsaWFzZWQ7XG4gIC1tb3otb3N4LWZvbnQtc21vb3RoaW5nOiBncmF5c2NhbGU7XG59XG5cbi8vIEluZGl2aWR1YWwgaWNvbnNcbi5nbHlwaGljb24tYXN0ZXJpc2sgICAgICAgICAgICAgICB7ICY6YmVmb3JlIHsgY29udGVudDogXCJcXDJhXCI7IH0gfVxuLmdseXBoaWNvbi1wbHVzICAgICAgICAgICAgICAgICAgIHsgJjpiZWZvcmUgeyBjb250ZW50OiBcIlxcMmJcIjsgfSB9XG4uZ2x5cGhpY29uLWV1cm8sXG4uZ2x5cGhpY29uLWV1ciAgICAgICAgICAgICAgICAgICAgeyAmOmJlZm9yZSB7IGNvbnRlbnQ6IFwiXFwyMGFjXCI7IH0gfVxuLmdseXBoaWNvbi1taW51cyAgICAgICAgICAgICAgICAgIHsgJjpiZWZvcmUgeyBjb250ZW50OiBcIlxcMjIxMlwiOyB9IH1cbi5nbHlwaGljb24tY2xvdWQgICAgICAgICAgICAgICAgICB7ICY6YmVmb3JlIHsgY29udGVudDogXCJcXDI2MDFcIjsgfSB9XG4uZ2x5cGhpY29uLWVudmVsb3BlICAgICAgICAgICAgICAgeyAmOmJlZm9yZSB7IGNvbnRlbnQ6IFwiXFwyNzA5XCI7IH0gfVxuLmdseXBoaWNvbi1wZW5jaWwgICAgICAgICAgICAgICAgIHsgJjpiZWZvcmUgeyBjb250ZW50OiBcIlxcMjcwZlwiOyB9IH1cbi5nbHlwaGljb24tZ2xhc3MgICAgICAgICAgICAgICAgICB7ICY6YmVmb3JlIHsgY29udGVudDogXCJcXGUwMDFcIjsgfSB9XG4uZ2x5cGhpY29uLW11c2ljICAgICAgICAgICAgICAgICAgeyAmOmJlZm9yZSB7IGNvbnRlbnQ6IFwiXFxlMDAyXCI7IH0gfVxuLmdseXBoaWNvbi1zZWFyY2ggICAgICAgICAgICAgICAgIHsgJjpiZWZvcmUgeyBjb250ZW50OiBcIlxcZTAwM1wiOyB9IH1cbi5nbHlwaGljb24taGVhcnQgICAgICAgICAgICAgICAgICB7ICY6YmVmb3JlIHsgY29udGVudDogXCJcXGUwMDVcIjsgfSB9XG4uZ2x5cGhpY29uLXN0YXIgICAgICAgICAgICAgICAgICAgeyAmOmJlZm9yZSB7IGNvbnRlbnQ6IFwiXFxlMDA2XCI7IH0gfVxuLmdseXBoaWNvbi1zdGFyLWVtcHR5ICAgICAgICAgICAgIHsgJjpiZWZvcmUgeyBjb250ZW50OiBcIlxcZTAwN1wiOyB9IH1cbi5nbHlwaGljb24tdXNlciAgICAgICAgICAgICAgICAgICB7ICY6YmVmb3JlIHsgY29udGVudDogXCJcXGUwMDhcIjsgfSB9XG4uZ2x5cGhpY29uLWZpbG0gICAgICAgICAgICAgICAgICAgeyAmOmJlZm9yZSB7IGNvbnRlbnQ6IFwiXFxlMDA5XCI7IH0gfVxuLmdseXBoaWNvbi10aC1sYXJnZSAgICAgICAgICAgICAgIHsgJjpiZWZvcmUgeyBjb250ZW50OiBcIlxcZTAxMFwiOyB9IH1cbi5nbHlwaGljb24tdGggICAgICAgICAgICAgICAgICAgICB7ICY6YmVmb3JlIHsgY29udGVudDogXCJcXGUwMTFcIjsgfSB9XG4uZ2x5cGhpY29uLXRoLWxpc3QgICAgICAgICAgICAgICAgeyAmOmJlZm9yZSB7IGNvbnRlbnQ6IFwiXFxlMDEyXCI7IH0gfVxuLmdseXBoaWNvbi1vayAgICAgICAgICAgICAgICAgICAgIHsgJjpiZWZvcmUgeyBjb250ZW50OiBcIlxcZTAxM1wiOyB9IH1cbi5nbHlwaGljb24tcmVtb3ZlICAgICAgICAgICAgICAgICB7ICY6YmVmb3JlIHsgY29udGVudDogXCJcXGUwMTRcIjsgfSB9XG4uZ2x5cGhpY29uLXpvb20taW4gICAgICAgICAgICAgICAgeyAmOmJlZm9yZSB7IGNvbnRlbnQ6IFwiXFxlMDE1XCI7IH0gfVxuLmdseXBoaWNvbi16b29tLW91dCAgICAgICAgICAgICAgIHsgJjpiZWZvcmUgeyBjb250ZW50OiBcIlxcZTAxNlwiOyB9IH1cbi5nbHlwaGljb24tb2ZmICAgICAgICAgICAgICAgICAgICB7ICY6YmVmb3JlIHsgY29udGVudDogXCJcXGUwMTdcIjsgfSB9XG4uZ2x5cGhpY29uLXNpZ25hbCAgICAgICAgICAgICAgICAgeyAmOmJlZm9yZSB7IGNvbnRlbnQ6IFwiXFxlMDE4XCI7IH0gfVxuLmdseXBoaWNvbi1jb2cgICAgICAgICAgICAgICAgICAgIHsgJjpiZWZvcmUgeyBjb250ZW50OiBcIlxcZTAxOVwiOyB9IH1cbi5nbHlwaGljb24tdHJhc2ggICAgICAgICAgICAgICAgICB7ICY6YmVmb3JlIHsgY29udGVudDogXCJcXGUwMjBcIjsgfSB9XG4uZ2x5cGhpY29uLWhvbWUgICAgICAgICAgICAgICAgICAgeyAmOmJlZm9yZSB7IGNvbnRlbnQ6IFwiXFxlMDIxXCI7IH0gfVxuLmdseXBoaWNvbi1maWxlICAgICAgICAgICAgICAgICAgIHsgJjpiZWZvcmUgeyBjb250ZW50OiBcIlxcZTAyMlwiOyB9IH1cbi5nbHlwaGljb24tdGltZSAgICAgICAgICAgICAgICAgICB7ICY6YmVmb3JlIHsgY29udGVudDogXCJcXGUwMjNcIjsgfSB9XG4uZ2x5cGhpY29uLXJvYWQgICAgICAgICAgICAgICAgICAgeyAmOmJlZm9yZSB7IGNvbnRlbnQ6IFwiXFxlMDI0XCI7IH0gfVxuLmdseXBoaWNvbi1kb3dubG9hZC1hbHQgICAgICAgICAgIHsgJjpiZWZvcmUgeyBjb250ZW50OiBcIlxcZTAyNVwiOyB9IH1cbi5nbHlwaGljb24tZG93bmxvYWQgICAgICAgICAgICAgICB7ICY6YmVmb3JlIHsgY29udGVudDogXCJcXGUwMjZcIjsgfSB9XG4uZ2x5cGhpY29uLXVwbG9hZCAgICAgICAgICAgICAgICAgeyAmOmJlZm9yZSB7IGNvbnRlbnQ6IFwiXFxlMDI3XCI7IH0gfVxuLmdseXBoaWNvbi1pbmJveCAgICAgICAgICAgICAgICAgIHsgJjpiZWZvcmUgeyBjb250ZW50OiBcIlxcZTAyOFwiOyB9IH1cbi5nbHlwaGljb24tcGxheS1jaXJjbGUgICAgICAgICAgICB7ICY6YmVmb3JlIHsgY29udGVudDogXCJcXGUwMjlcIjsgfSB9XG4uZ2x5cGhpY29uLXJlcGVhdCAgICAgICAgICAgICAgICAgeyAmOmJlZm9yZSB7IGNvbnRlbnQ6IFwiXFxlMDMwXCI7IH0gfVxuLmdseXBoaWNvbi1yZWZyZXNoICAgICAgICAgICAgICAgIHsgJjpiZWZvcmUgeyBjb250ZW50OiBcIlxcZTAzMVwiOyB9IH1cbi5nbHlwaGljb24tbGlzdC1hbHQgICAgICAgICAgICAgICB7ICY6YmVmb3JlIHsgY29udGVudDogXCJcXGUwMzJcIjsgfSB9XG4uZ2x5cGhpY29uLWxvY2sgICAgICAgICAgICAgICAgICAgeyAmOmJlZm9yZSB7IGNvbnRlbnQ6IFwiXFxlMDMzXCI7IH0gfVxuLmdseXBoaWNvbi1mbGFnICAgICAgICAgICAgICAgICAgIHsgJjpiZWZvcmUgeyBjb250ZW50OiBcIlxcZTAzNFwiOyB9IH1cbi5nbHlwaGljb24taGVhZHBob25lcyAgICAgICAgICAgICB7ICY6YmVmb3JlIHsgY29udGVudDogXCJcXGUwMzVcIjsgfSB9XG4uZ2x5cGhpY29uLXZvbHVtZS1vZmYgICAgICAgICAgICAgeyAmOmJlZm9yZSB7IGNvbnRlbnQ6IFwiXFxlMDM2XCI7IH0gfVxuLmdseXBoaWNvbi12b2x1bWUtZG93biAgICAgICAgICAgIHsgJjpiZWZvcmUgeyBjb250ZW50OiBcIlxcZTAzN1wiOyB9IH1cbi5nbHlwaGljb24tdm9sdW1lLXVwICAgICAgICAgICAgICB7ICY6YmVmb3JlIHsgY29udGVudDogXCJcXGUwMzhcIjsgfSB9XG4uZ2x5cGhpY29uLXFyY29kZSAgICAgICAgICAgICAgICAgeyAmOmJlZm9yZSB7IGNvbnRlbnQ6IFwiXFxlMDM5XCI7IH0gfVxuLmdseXBoaWNvbi1iYXJjb2RlICAgICAgICAgICAgICAgIHsgJjpiZWZvcmUgeyBjb250ZW50OiBcIlxcZTA0MFwiOyB9IH1cbi5nbHlwaGljb24tdGFnICAgICAgICAgICAgICAgICAgICB7ICY6YmVmb3JlIHsgY29udGVudDogXCJcXGUwNDFcIjsgfSB9XG4uZ2x5cGhpY29uLXRhZ3MgICAgICAgICAgICAgICAgICAgeyAmOmJlZm9yZSB7IGNvbnRlbnQ6IFwiXFxlMDQyXCI7IH0gfVxuLmdseXBoaWNvbi1ib29rICAgICAgICAgICAgICAgICAgIHsgJjpiZWZvcmUgeyBjb250ZW50OiBcIlxcZTA0M1wiOyB9IH1cbi5nbHlwaGljb24tYm9va21hcmsgICAgICAgICAgICAgICB7ICY6YmVmb3JlIHsgY29udGVudDogXCJcXGUwNDRcIjsgfSB9XG4uZ2x5cGhpY29uLXByaW50ICAgICAgICAgICAgICAgICAgeyAmOmJlZm9yZSB7IGNvbnRlbnQ6IFwiXFxlMDQ1XCI7IH0gfVxuLmdseXBoaWNvbi1jYW1lcmEgICAgICAgICAgICAgICAgIHsgJjpiZWZvcmUgeyBjb250ZW50OiBcIlxcZTA0NlwiOyB9IH1cbi5nbHlwaGljb24tZm9udCAgICAgICAgICAgICAgICAgICB7ICY6YmVmb3JlIHsgY29udGVudDogXCJcXGUwNDdcIjsgfSB9XG4uZ2x5cGhpY29uLWJvbGQgICAgICAgICAgICAgICAgICAgeyAmOmJlZm9yZSB7IGNvbnRlbnQ6IFwiXFxlMDQ4XCI7IH0gfVxuLmdseXBoaWNvbi1pdGFsaWMgICAgICAgICAgICAgICAgIHsgJjpiZWZvcmUgeyBjb250ZW50OiBcIlxcZTA0OVwiOyB9IH1cbi5nbHlwaGljb24tdGV4dC1oZWlnaHQgICAgICAgICAgICB7ICY6YmVmb3JlIHsgY29udGVudDogXCJcXGUwNTBcIjsgfSB9XG4uZ2x5cGhpY29uLXRleHQtd2lkdGggICAgICAgICAgICAgeyAmOmJlZm9yZSB7IGNvbnRlbnQ6IFwiXFxlMDUxXCI7IH0gfVxuLmdseXBoaWNvbi1hbGlnbi1sZWZ0ICAgICAgICAgICAgIHsgJjpiZWZvcmUgeyBjb250ZW50OiBcIlxcZTA1MlwiOyB9IH1cbi5nbHlwaGljb24tYWxpZ24tY2VudGVyICAgICAgICAgICB7ICY6YmVmb3JlIHsgY29udGVudDogXCJcXGUwNTNcIjsgfSB9XG4uZ2x5cGhpY29uLWFsaWduLXJpZ2h0ICAgICAgICAgICAgeyAmOmJlZm9yZSB7IGNvbnRlbnQ6IFwiXFxlMDU0XCI7IH0gfVxuLmdseXBoaWNvbi1hbGlnbi1qdXN0aWZ5ICAgICAgICAgIHsgJjpiZWZvcmUgeyBjb250ZW50OiBcIlxcZTA1NVwiOyB9IH1cbi5nbHlwaGljb24tbGlzdCAgICAgICAgICAgICAgICAgICB7ICY6YmVmb3JlIHsgY29udGVudDogXCJcXGUwNTZcIjsgfSB9XG4uZ2x5cGhpY29uLWluZGVudC1sZWZ0ICAgICAgICAgICAgeyAmOmJlZm9yZSB7IGNvbnRlbnQ6IFwiXFxlMDU3XCI7IH0gfVxuLmdseXBoaWNvbi1pbmRlbnQtcmlnaHQgICAgICAgICAgIHsgJjpiZWZvcmUgeyBjb250ZW50OiBcIlxcZTA1OFwiOyB9IH1cbi5nbHlwaGljb24tZmFjZXRpbWUtdmlkZW8gICAgICAgICB7ICY6YmVmb3JlIHsgY29udGVudDogXCJcXGUwNTlcIjsgfSB9XG4uZ2x5cGhpY29uLXBpY3R1cmUgICAgICAgICAgICAgICAgeyAmOmJlZm9yZSB7IGNvbnRlbnQ6IFwiXFxlMDYwXCI7IH0gfVxuLmdseXBoaWNvbi1tYXAtbWFya2VyICAgICAgICAgICAgIHsgJjpiZWZvcmUgeyBjb250ZW50OiBcIlxcZTA2MlwiOyB9IH1cbi5nbHlwaGljb24tYWRqdXN0ICAgICAgICAgICAgICAgICB7ICY6YmVmb3JlIHsgY29udGVudDogXCJcXGUwNjNcIjsgfSB9XG4uZ2x5cGhpY29uLXRpbnQgICAgICAgICAgICAgICAgICAgeyAmOmJlZm9yZSB7IGNvbnRlbnQ6IFwiXFxlMDY0XCI7IH0gfVxuLmdseXBoaWNvbi1lZGl0ICAgICAgICAgICAgICAgICAgIHsgJjpiZWZvcmUgeyBjb250ZW50OiBcIlxcZTA2NVwiOyB9IH1cbi5nbHlwaGljb24tc2hhcmUgICAgICAgICAgICAgICAgICB7ICY6YmVmb3JlIHsgY29udGVudDogXCJcXGUwNjZcIjsgfSB9XG4uZ2x5cGhpY29uLWNoZWNrICAgICAgICAgICAgICAgICAgeyAmOmJlZm9yZSB7IGNvbnRlbnQ6IFwiXFxlMDY3XCI7IH0gfVxuLmdseXBoaWNvbi1tb3ZlICAgICAgICAgICAgICAgICAgIHsgJjpiZWZvcmUgeyBjb250ZW50OiBcIlxcZTA2OFwiOyB9IH1cbi5nbHlwaGljb24tc3RlcC1iYWNrd2FyZCAgICAgICAgICB7ICY6YmVmb3JlIHsgY29udGVudDogXCJcXGUwNjlcIjsgfSB9XG4uZ2x5cGhpY29uLWZhc3QtYmFja3dhcmQgICAgICAgICAgeyAmOmJlZm9yZSB7IGNvbnRlbnQ6IFwiXFxlMDcwXCI7IH0gfVxuLmdseXBoaWNvbi1iYWNrd2FyZCAgICAgICAgICAgICAgIHsgJjpiZWZvcmUgeyBjb250ZW50OiBcIlxcZTA3MVwiOyB9IH1cbi5nbHlwaGljb24tcGxheSAgICAgICAgICAgICAgICAgICB7ICY6YmVmb3JlIHsgY29udGVudDogXCJcXGUwNzJcIjsgfSB9XG4uZ2x5cGhpY29uLXBhdXNlICAgICAgICAgICAgICAgICAgeyAmOmJlZm9yZSB7IGNvbnRlbnQ6IFwiXFxlMDczXCI7IH0gfVxuLmdseXBoaWNvbi1zdG9wICAgICAgICAgICAgICAgICAgIHsgJjpiZWZvcmUgeyBjb250ZW50OiBcIlxcZTA3NFwiOyB9IH1cbi5nbHlwaGljb24tZm9yd2FyZCAgICAgICAgICAgICAgICB7ICY6YmVmb3JlIHsgY29udGVudDogXCJcXGUwNzVcIjsgfSB9XG4uZ2x5cGhpY29uLWZhc3QtZm9yd2FyZCAgICAgICAgICAgeyAmOmJlZm9yZSB7IGNvbnRlbnQ6IFwiXFxlMDc2XCI7IH0gfVxuLmdseXBoaWNvbi1zdGVwLWZvcndhcmQgICAgICAgICAgIHsgJjpiZWZvcmUgeyBjb250ZW50OiBcIlxcZTA3N1wiOyB9IH1cbi5nbHlwaGljb24tZWplY3QgICAgICAgICAgICAgICAgICB7ICY6YmVmb3JlIHsgY29udGVudDogXCJcXGUwNzhcIjsgfSB9XG4uZ2x5cGhpY29uLWNoZXZyb24tbGVmdCAgICAgICAgICAgeyAmOmJlZm9yZSB7IGNvbnRlbnQ6IFwiXFxlMDc5XCI7IH0gfVxuLmdseXBoaWNvbi1jaGV2cm9uLXJpZ2h0ICAgICAgICAgIHsgJjpiZWZvcmUgeyBjb250ZW50OiBcIlxcZTA4MFwiOyB9IH1cbi5nbHlwaGljb24tcGx1cy1zaWduICAgICAgICAgICAgICB7ICY6YmVmb3JlIHsgY29udGVudDogXCJcXGUwODFcIjsgfSB9XG4uZ2x5cGhpY29uLW1pbnVzLXNpZ24gICAgICAgICAgICAgeyAmOmJlZm9yZSB7IGNvbnRlbnQ6IFwiXFxlMDgyXCI7IH0gfVxuLmdseXBoaWNvbi1yZW1vdmUtc2lnbiAgICAgICAgICAgIHsgJjpiZWZvcmUgeyBjb250ZW50OiBcIlxcZTA4M1wiOyB9IH1cbi5nbHlwaGljb24tb2stc2lnbiAgICAgICAgICAgICAgICB7ICY6YmVmb3JlIHsgY29udGVudDogXCJcXGUwODRcIjsgfSB9XG4uZ2x5cGhpY29uLXF1ZXN0aW9uLXNpZ24gICAgICAgICAgeyAmOmJlZm9yZSB7IGNvbnRlbnQ6IFwiXFxlMDg1XCI7IH0gfVxuLmdseXBoaWNvbi1pbmZvLXNpZ24gICAgICAgICAgICAgIHsgJjpiZWZvcmUgeyBjb250ZW50OiBcIlxcZTA4NlwiOyB9IH1cbi5nbHlwaGljb24tc2NyZWVuc2hvdCAgICAgICAgICAgICB7ICY6YmVmb3JlIHsgY29udGVudDogXCJcXGUwODdcIjsgfSB9XG4uZ2x5cGhpY29uLXJlbW92ZS1jaXJjbGUgICAgICAgICAgeyAmOmJlZm9yZSB7IGNvbnRlbnQ6IFwiXFxlMDg4XCI7IH0gfVxuLmdseXBoaWNvbi1vay1jaXJjbGUgICAgICAgICAgICAgIHsgJjpiZWZvcmUgeyBjb250ZW50OiBcIlxcZTA4OVwiOyB9IH1cbi5nbHlwaGljb24tYmFuLWNpcmNsZSAgICAgICAgICAgICB7ICY6YmVmb3JlIHsgY29udGVudDogXCJcXGUwOTBcIjsgfSB9XG4uZ2x5cGhpY29uLWFycm93LWxlZnQgICAgICAgICAgICAgeyAmOmJlZm9yZSB7IGNvbnRlbnQ6IFwiXFxlMDkxXCI7IH0gfVxuLmdseXBoaWNvbi1hcnJvdy1yaWdodCAgICAgICAgICAgIHsgJjpiZWZvcmUgeyBjb250ZW50OiBcIlxcZTA5MlwiOyB9IH1cbi5nbHlwaGljb24tYXJyb3ctdXAgICAgICAgICAgICAgICB7ICY6YmVmb3JlIHsgY29udGVudDogXCJcXGUwOTNcIjsgfSB9XG4uZ2x5cGhpY29uLWFycm93LWRvd24gICAgICAgICAgICAgeyAmOmJlZm9yZSB7IGNvbnRlbnQ6IFwiXFxlMDk0XCI7IH0gfVxuLmdseXBoaWNvbi1zaGFyZS1hbHQgICAgICAgICAgICAgIHsgJjpiZWZvcmUgeyBjb250ZW50OiBcIlxcZTA5NVwiOyB9IH1cbi5nbHlwaGljb24tcmVzaXplLWZ1bGwgICAgICAgICAgICB7ICY6YmVmb3JlIHsgY29udGVudDogXCJcXGUwOTZcIjsgfSB9XG4uZ2x5cGhpY29uLXJlc2l6ZS1zbWFsbCAgICAgICAgICAgeyAmOmJlZm9yZSB7IGNvbnRlbnQ6IFwiXFxlMDk3XCI7IH0gfVxuLmdseXBoaWNvbi1leGNsYW1hdGlvbi1zaWduICAgICAgIHsgJjpiZWZvcmUgeyBjb250ZW50OiBcIlxcZTEwMVwiOyB9IH1cbi5nbHlwaGljb24tZ2lmdCAgICAgICAgICAgICAgICAgICB7ICY6YmVmb3JlIHsgY29udGVudDogXCJcXGUxMDJcIjsgfSB9XG4uZ2x5cGhpY29uLWxlYWYgICAgICAgICAgICAgICAgICAgeyAmOmJlZm9yZSB7IGNvbnRlbnQ6IFwiXFxlMTAzXCI7IH0gfVxuLmdseXBoaWNvbi1maXJlICAgICAgICAgICAgICAgICAgIHsgJjpiZWZvcmUgeyBjb250ZW50OiBcIlxcZTEwNFwiOyB9IH1cbi5nbHlwaGljb24tZXllLW9wZW4gICAgICAgICAgICAgICB7ICY6YmVmb3JlIHsgY29udGVudDogXCJcXGUxMDVcIjsgfSB9XG4uZ2x5cGhpY29uLWV5ZS1jbG9zZSAgICAgICAgICAgICAgeyAmOmJlZm9yZSB7IGNvbnRlbnQ6IFwiXFxlMTA2XCI7IH0gfVxuLmdseXBoaWNvbi13YXJuaW5nLXNpZ24gICAgICAgICAgIHsgJjpiZWZvcmUgeyBjb250ZW50OiBcIlxcZTEwN1wiOyB9IH1cbi5nbHlwaGljb24tcGxhbmUgICAgICAgICAgICAgICAgICB7ICY6YmVmb3JlIHsgY29udGVudDogXCJcXGUxMDhcIjsgfSB9XG4uZ2x5cGhpY29uLWNhbGVuZGFyICAgICAgICAgICAgICAgeyAmOmJlZm9yZSB7IGNvbnRlbnQ6IFwiXFxlMTA5XCI7IH0gfVxuLmdseXBoaWNvbi1yYW5kb20gICAgICAgICAgICAgICAgIHsgJjpiZWZvcmUgeyBjb250ZW50OiBcIlxcZTExMFwiOyB9IH1cbi5nbHlwaGljb24tY29tbWVudCAgICAgICAgICAgICAgICB7ICY6YmVmb3JlIHsgY29udGVudDogXCJcXGUxMTFcIjsgfSB9XG4uZ2x5cGhpY29uLW1hZ25ldCAgICAgICAgICAgICAgICAgeyAmOmJlZm9yZSB7IGNvbnRlbnQ6IFwiXFxlMTEyXCI7IH0gfVxuLmdseXBoaWNvbi1jaGV2cm9uLXVwICAgICAgICAgICAgIHsgJjpiZWZvcmUgeyBjb250ZW50OiBcIlxcZTExM1wiOyB9IH1cbi5nbHlwaGljb24tY2hldnJvbi1kb3duICAgICAgICAgICB7ICY6YmVmb3JlIHsgY29udGVudDogXCJcXGUxMTRcIjsgfSB9XG4uZ2x5cGhpY29uLXJldHdlZXQgICAgICAgICAgICAgICAgeyAmOmJlZm9yZSB7IGNvbnRlbnQ6IFwiXFxlMTE1XCI7IH0gfVxuLmdseXBoaWNvbi1zaG9wcGluZy1jYXJ0ICAgICAgICAgIHsgJjpiZWZvcmUgeyBjb250ZW50OiBcIlxcZTExNlwiOyB9IH1cbi5nbHlwaGljb24tZm9sZGVyLWNsb3NlICAgICAgICAgICB7ICY6YmVmb3JlIHsgY29udGVudDogXCJcXGUxMTdcIjsgfSB9XG4uZ2x5cGhpY29uLWZvbGRlci1vcGVuICAgICAgICAgICAgeyAmOmJlZm9yZSB7IGNvbnRlbnQ6IFwiXFxlMTE4XCI7IH0gfVxuLmdseXBoaWNvbi1yZXNpemUtdmVydGljYWwgICAgICAgIHsgJjpiZWZvcmUgeyBjb250ZW50OiBcIlxcZTExOVwiOyB9IH1cbi5nbHlwaGljb24tcmVzaXplLWhvcml6b250YWwgICAgICB7ICY6YmVmb3JlIHsgY29udGVudDogXCJcXGUxMjBcIjsgfSB9XG4uZ2x5cGhpY29uLWhkZCAgICAgICAgICAgICAgICAgICAgeyAmOmJlZm9yZSB7IGNvbnRlbnQ6IFwiXFxlMTIxXCI7IH0gfVxuLmdseXBoaWNvbi1idWxsaG9ybiAgICAgICAgICAgICAgIHsgJjpiZWZvcmUgeyBjb250ZW50OiBcIlxcZTEyMlwiOyB9IH1cbi5nbHlwaGljb24tYmVsbCAgICAgICAgICAgICAgICAgICB7ICY6YmVmb3JlIHsgY29udGVudDogXCJcXGUxMjNcIjsgfSB9XG4uZ2x5cGhpY29uLWNlcnRpZmljYXRlICAgICAgICAgICAgeyAmOmJlZm9yZSB7IGNvbnRlbnQ6IFwiXFxlMTI0XCI7IH0gfVxuLmdseXBoaWNvbi10aHVtYnMtdXAgICAgICAgICAgICAgIHsgJjpiZWZvcmUgeyBjb250ZW50OiBcIlxcZTEyNVwiOyB9IH1cbi5nbHlwaGljb24tdGh1bWJzLWRvd24gICAgICAgICAgICB7ICY6YmVmb3JlIHsgY29udGVudDogXCJcXGUxMjZcIjsgfSB9XG4uZ2x5cGhpY29uLWhhbmQtcmlnaHQgICAgICAgICAgICAgeyAmOmJlZm9yZSB7IGNvbnRlbnQ6IFwiXFxlMTI3XCI7IH0gfVxuLmdseXBoaWNvbi1oYW5kLWxlZnQgICAgICAgICAgICAgIHsgJjpiZWZvcmUgeyBjb250ZW50OiBcIlxcZTEyOFwiOyB9IH1cbi5nbHlwaGljb24taGFuZC11cCAgICAgICAgICAgICAgICB7ICY6YmVmb3JlIHsgY29udGVudDogXCJcXGUxMjlcIjsgfSB9XG4uZ2x5cGhpY29uLWhhbmQtZG93biAgICAgICAgICAgICAgeyAmOmJlZm9yZSB7IGNvbnRlbnQ6IFwiXFxlMTMwXCI7IH0gfVxuLmdseXBoaWNvbi1jaXJjbGUtYXJyb3ctcmlnaHQgICAgIHsgJjpiZWZvcmUgeyBjb250ZW50OiBcIlxcZTEzMVwiOyB9IH1cbi5nbHlwaGljb24tY2lyY2xlLWFycm93LWxlZnQgICAgICB7ICY6YmVmb3JlIHsgY29udGVudDogXCJcXGUxMzJcIjsgfSB9XG4uZ2x5cGhpY29uLWNpcmNsZS1hcnJvdy11cCAgICAgICAgeyAmOmJlZm9yZSB7IGNvbnRlbnQ6IFwiXFxlMTMzXCI7IH0gfVxuLmdseXBoaWNvbi1jaXJjbGUtYXJyb3ctZG93biAgICAgIHsgJjpiZWZvcmUgeyBjb250ZW50OiBcIlxcZTEzNFwiOyB9IH1cbi5nbHlwaGljb24tZ2xvYmUgICAgICAgICAgICAgICAgICB7ICY6YmVmb3JlIHsgY29udGVudDogXCJcXGUxMzVcIjsgfSB9XG4uZ2x5cGhpY29uLXdyZW5jaCAgICAgICAgICAgICAgICAgeyAmOmJlZm9yZSB7IGNvbnRlbnQ6IFwiXFxlMTM2XCI7IH0gfVxuLmdseXBoaWNvbi10YXNrcyAgICAgICAgICAgICAgICAgIHsgJjpiZWZvcmUgeyBjb250ZW50OiBcIlxcZTEzN1wiOyB9IH1cbi5nbHlwaGljb24tZmlsdGVyICAgICAgICAgICAgICAgICB7ICY6YmVmb3JlIHsgY29udGVudDogXCJcXGUxMzhcIjsgfSB9XG4uZ2x5cGhpY29uLWJyaWVmY2FzZSAgICAgICAgICAgICAgeyAmOmJlZm9yZSB7IGNvbnRlbnQ6IFwiXFxlMTM5XCI7IH0gfVxuLmdseXBoaWNvbi1mdWxsc2NyZWVuICAgICAgICAgICAgIHsgJjpiZWZvcmUgeyBjb250ZW50OiBcIlxcZTE0MFwiOyB9IH1cbi5nbHlwaGljb24tZGFzaGJvYXJkICAgICAgICAgICAgICB7ICY6YmVmb3JlIHsgY29udGVudDogXCJcXGUxNDFcIjsgfSB9XG4uZ2x5cGhpY29uLXBhcGVyY2xpcCAgICAgICAgICAgICAgeyAmOmJlZm9yZSB7IGNvbnRlbnQ6IFwiXFxlMTQyXCI7IH0gfVxuLmdseXBoaWNvbi1oZWFydC1lbXB0eSAgICAgICAgICAgIHsgJjpiZWZvcmUgeyBjb250ZW50OiBcIlxcZTE0M1wiOyB9IH1cbi5nbHlwaGljb24tbGluayAgICAgICAgICAgICAgICAgICB7ICY6YmVmb3JlIHsgY29udGVudDogXCJcXGUxNDRcIjsgfSB9XG4uZ2x5cGhpY29uLXBob25lICAgICAgICAgICAgICAgICAgeyAmOmJlZm9yZSB7IGNvbnRlbnQ6IFwiXFxlMTQ1XCI7IH0gfVxuLmdseXBoaWNvbi1wdXNocGluICAgICAgICAgICAgICAgIHsgJjpiZWZvcmUgeyBjb250ZW50OiBcIlxcZTE0NlwiOyB9IH1cbi5nbHlwaGljb24tdXNkICAgICAgICAgICAgICAgICAgICB7ICY6YmVmb3JlIHsgY29udGVudDogXCJcXGUxNDhcIjsgfSB9XG4uZ2x5cGhpY29uLWdicCAgICAgICAgICAgICAgICAgICAgeyAmOmJlZm9yZSB7IGNvbnRlbnQ6IFwiXFxlMTQ5XCI7IH0gfVxuLmdseXBoaWNvbi1zb3J0ICAgICAgICAgICAgICAgICAgIHsgJjpiZWZvcmUgeyBjb250ZW50OiBcIlxcZTE1MFwiOyB9IH1cbi5nbHlwaGljb24tc29ydC1ieS1hbHBoYWJldCAgICAgICB7ICY6YmVmb3JlIHsgY29udGVudDogXCJcXGUxNTFcIjsgfSB9XG4uZ2x5cGhpY29uLXNvcnQtYnktYWxwaGFiZXQtYWx0ICAgeyAmOmJlZm9yZSB7IGNvbnRlbnQ6IFwiXFxlMTUyXCI7IH0gfVxuLmdseXBoaWNvbi1zb3J0LWJ5LW9yZGVyICAgICAgICAgIHsgJjpiZWZvcmUgeyBjb250ZW50OiBcIlxcZTE1M1wiOyB9IH1cbi5nbHlwaGljb24tc29ydC1ieS1vcmRlci1hbHQgICAgICB7ICY6YmVmb3JlIHsgY29udGVudDogXCJcXGUxNTRcIjsgfSB9XG4uZ2x5cGhpY29uLXNvcnQtYnktYXR0cmlidXRlcyAgICAgeyAmOmJlZm9yZSB7IGNvbnRlbnQ6IFwiXFxlMTU1XCI7IH0gfVxuLmdseXBoaWNvbi1zb3J0LWJ5LWF0dHJpYnV0ZXMtYWx0IHsgJjpiZWZvcmUgeyBjb250ZW50OiBcIlxcZTE1NlwiOyB9IH1cbi5nbHlwaGljb24tdW5jaGVja2VkICAgICAgICAgICAgICB7ICY6YmVmb3JlIHsgY29udGVudDogXCJcXGUxNTdcIjsgfSB9XG4uZ2x5cGhpY29uLWV4cGFuZCAgICAgICAgICAgICAgICAgeyAmOmJlZm9yZSB7IGNvbnRlbnQ6IFwiXFxlMTU4XCI7IH0gfVxuLmdseXBoaWNvbi1jb2xsYXBzZS1kb3duICAgICAgICAgIHsgJjpiZWZvcmUgeyBjb250ZW50OiBcIlxcZTE1OVwiOyB9IH1cbi5nbHlwaGljb24tY29sbGFwc2UtdXAgICAgICAgICAgICB7ICY6YmVmb3JlIHsgY29udGVudDogXCJcXGUxNjBcIjsgfSB9XG4uZ2x5cGhpY29uLWxvZy1pbiAgICAgICAgICAgICAgICAgeyAmOmJlZm9yZSB7IGNvbnRlbnQ6IFwiXFxlMTYxXCI7IH0gfVxuLmdseXBoaWNvbi1mbGFzaCAgICAgICAgICAgICAgICAgIHsgJjpiZWZvcmUgeyBjb250ZW50OiBcIlxcZTE2MlwiOyB9IH1cbi5nbHlwaGljb24tbG9nLW91dCAgICAgICAgICAgICAgICB7ICY6YmVmb3JlIHsgY29udGVudDogXCJcXGUxNjNcIjsgfSB9XG4uZ2x5cGhpY29uLW5ldy13aW5kb3cgICAgICAgICAgICAgeyAmOmJlZm9yZSB7IGNvbnRlbnQ6IFwiXFxlMTY0XCI7IH0gfVxuLmdseXBoaWNvbi1yZWNvcmQgICAgICAgICAgICAgICAgIHsgJjpiZWZvcmUgeyBjb250ZW50OiBcIlxcZTE2NVwiOyB9IH1cbi5nbHlwaGljb24tc2F2ZSAgICAgICAgICAgICAgICAgICB7ICY6YmVmb3JlIHsgY29udGVudDogXCJcXGUxNjZcIjsgfSB9XG4uZ2x5cGhpY29uLW9wZW4gICAgICAgICAgICAgICAgICAgeyAmOmJlZm9yZSB7IGNvbnRlbnQ6IFwiXFxlMTY3XCI7IH0gfVxuLmdseXBoaWNvbi1zYXZlZCAgICAgICAgICAgICAgICAgIHsgJjpiZWZvcmUgeyBjb250ZW50OiBcIlxcZTE2OFwiOyB9IH1cbi5nbHlwaGljb24taW1wb3J0ICAgICAgICAgICAgICAgICB7ICY6YmVmb3JlIHsgY29udGVudDogXCJcXGUxNjlcIjsgfSB9XG4uZ2x5cGhpY29uLWV4cG9ydCAgICAgICAgICAgICAgICAgeyAmOmJlZm9yZSB7IGNvbnRlbnQ6IFwiXFxlMTcwXCI7IH0gfVxuLmdseXBoaWNvbi1zZW5kICAgICAgICAgICAgICAgICAgIHsgJjpiZWZvcmUgeyBjb250ZW50OiBcIlxcZTE3MVwiOyB9IH1cbi5nbHlwaGljb24tZmxvcHB5LWRpc2sgICAgICAgICAgICB7ICY6YmVmb3JlIHsgY29udGVudDogXCJcXGUxNzJcIjsgfSB9XG4uZ2x5cGhpY29uLWZsb3BweS1zYXZlZCAgICAgICAgICAgeyAmOmJlZm9yZSB7IGNvbnRlbnQ6IFwiXFxlMTczXCI7IH0gfVxuLmdseXBoaWNvbi1mbG9wcHktcmVtb3ZlICAgICAgICAgIHsgJjpiZWZvcmUgeyBjb250ZW50OiBcIlxcZTE3NFwiOyB9IH1cbi5nbHlwaGljb24tZmxvcHB5LXNhdmUgICAgICAgICAgICB7ICY6YmVmb3JlIHsgY29udGVudDogXCJcXGUxNzVcIjsgfSB9XG4uZ2x5cGhpY29uLWZsb3BweS1vcGVuICAgICAgICAgICAgeyAmOmJlZm9yZSB7IGNvbnRlbnQ6IFwiXFxlMTc2XCI7IH0gfVxuLmdseXBoaWNvbi1jcmVkaXQtY2FyZCAgICAgICAgICAgIHsgJjpiZWZvcmUgeyBjb250ZW50OiBcIlxcZTE3N1wiOyB9IH1cbi5nbHlwaGljb24tdHJhbnNmZXIgICAgICAgICAgICAgICB7ICY6YmVmb3JlIHsgY29udGVudDogXCJcXGUxNzhcIjsgfSB9XG4uZ2x5cGhpY29uLWN1dGxlcnkgICAgICAgICAgICAgICAgeyAmOmJlZm9yZSB7IGNvbnRlbnQ6IFwiXFxlMTc5XCI7IH0gfVxuLmdseXBoaWNvbi1oZWFkZXIgICAgICAgICAgICAgICAgIHsgJjpiZWZvcmUgeyBjb250ZW50OiBcIlxcZTE4MFwiOyB9IH1cbi5nbHlwaGljb24tY29tcHJlc3NlZCAgICAgICAgICAgICB7ICY6YmVmb3JlIHsgY29udGVudDogXCJcXGUxODFcIjsgfSB9XG4uZ2x5cGhpY29uLWVhcnBob25lICAgICAgICAgICAgICAgeyAmOmJlZm9yZSB7IGNvbnRlbnQ6IFwiXFxlMTgyXCI7IH0gfVxuLmdseXBoaWNvbi1waG9uZS1hbHQgICAgICAgICAgICAgIHsgJjpiZWZvcmUgeyBjb250ZW50OiBcIlxcZTE4M1wiOyB9IH1cbi5nbHlwaGljb24tdG93ZXIgICAgICAgICAgICAgICAgICB7ICY6YmVmb3JlIHsgY29udGVudDogXCJcXGUxODRcIjsgfSB9XG4uZ2x5cGhpY29uLXN0YXRzICAgICAgICAgICAgICAgICAgeyAmOmJlZm9yZSB7IGNvbnRlbnQ6IFwiXFxlMTg1XCI7IH0gfVxuLmdseXBoaWNvbi1zZC12aWRlbyAgICAgICAgICAgICAgIHsgJjpiZWZvcmUgeyBjb250ZW50OiBcIlxcZTE4NlwiOyB9IH1cbi5nbHlwaGljb24taGQtdmlkZW8gICAgICAgICAgICAgICB7ICY6YmVmb3JlIHsgY29udGVudDogXCJcXGUxODdcIjsgfSB9XG4uZ2x5cGhpY29uLXN1YnRpdGxlcyAgICAgICAgICAgICAgeyAmOmJlZm9yZSB7IGNvbnRlbnQ6IFwiXFxlMTg4XCI7IH0gfVxuLmdseXBoaWNvbi1zb3VuZC1zdGVyZW8gICAgICAgICAgIHsgJjpiZWZvcmUgeyBjb250ZW50OiBcIlxcZTE4OVwiOyB9IH1cbi5nbHlwaGljb24tc291bmQtZG9sYnkgICAgICAgICAgICB7ICY6YmVmb3JlIHsgY29udGVudDogXCJcXGUxOTBcIjsgfSB9XG4uZ2x5cGhpY29uLXNvdW5kLTUtMSAgICAgICAgICAgICAgeyAmOmJlZm9yZSB7IGNvbnRlbnQ6IFwiXFxlMTkxXCI7IH0gfVxuLmdseXBoaWNvbi1zb3VuZC02LTEgICAgICAgICAgICAgIHsgJjpiZWZvcmUgeyBjb250ZW50OiBcIlxcZTE5MlwiOyB9IH1cbi5nbHlwaGljb24tc291bmQtNy0xICAgICAgICAgICAgICB7ICY6YmVmb3JlIHsgY29udGVudDogXCJcXGUxOTNcIjsgfSB9XG4uZ2x5cGhpY29uLWNvcHlyaWdodC1tYXJrICAgICAgICAgeyAmOmJlZm9yZSB7IGNvbnRlbnQ6IFwiXFxlMTk0XCI7IH0gfVxuLmdseXBoaWNvbi1yZWdpc3RyYXRpb24tbWFyayAgICAgIHsgJjpiZWZvcmUgeyBjb250ZW50OiBcIlxcZTE5NVwiOyB9IH1cbi5nbHlwaGljb24tY2xvdWQtZG93bmxvYWQgICAgICAgICB7ICY6YmVmb3JlIHsgY29udGVudDogXCJcXGUxOTdcIjsgfSB9XG4uZ2x5cGhpY29uLWNsb3VkLXVwbG9hZCAgICAgICAgICAgeyAmOmJlZm9yZSB7IGNvbnRlbnQ6IFwiXFxlMTk4XCI7IH0gfVxuLmdseXBoaWNvbi10cmVlLWNvbmlmZXIgICAgICAgICAgIHsgJjpiZWZvcmUgeyBjb250ZW50OiBcIlxcZTE5OVwiOyB9IH1cbi5nbHlwaGljb24tdHJlZS1kZWNpZHVvdXMgICAgICAgICB7ICY6YmVmb3JlIHsgY29udGVudDogXCJcXGUyMDBcIjsgfSB9XG4iLCIvL1xuLy8gU2NhZmZvbGRpbmdcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cblxuLy8gUmVzZXQgdGhlIGJveC1zaXppbmdcbi8vXG4vLyBIZWFkcyB1cCEgVGhpcyByZXNldCBtYXkgY2F1c2UgY29uZmxpY3RzIHdpdGggc29tZSB0aGlyZC1wYXJ0eSB3aWRnZXRzLlxuLy8gRm9yIHJlY29tbWVuZGF0aW9ucyBvbiByZXNvbHZpbmcgc3VjaCBjb25mbGljdHMsIHNlZVxuLy8gaHR0cDovL2dldGJvb3RzdHJhcC5jb20vZ2V0dGluZy1zdGFydGVkLyN0aGlyZC1ib3gtc2l6aW5nXG4qIHtcbiAgLmJveC1zaXppbmcoYm9yZGVyLWJveCk7XG59XG4qOmJlZm9yZSxcbio6YWZ0ZXIge1xuICAuYm94LXNpemluZyhib3JkZXItYm94KTtcbn1cblxuXG4vLyBCb2R5IHJlc2V0XG5cbmh0bWwge1xuICBmb250LXNpemU6IDEwcHg7XG4gIC13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvcjogcmdiYSgwLDAsMCwwKTtcbn1cblxuYm9keSB7XG4gIGZvbnQtZmFtaWx5OiBAZm9udC1mYW1pbHktYmFzZTtcbiAgZm9udC1zaXplOiBAZm9udC1zaXplLWJhc2U7XG4gIGxpbmUtaGVpZ2h0OiBAbGluZS1oZWlnaHQtYmFzZTtcbiAgY29sb3I6IEB0ZXh0LWNvbG9yO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiBAYm9keS1iZztcbn1cblxuLy8gUmVzZXQgZm9udHMgZm9yIHJlbGV2YW50IGVsZW1lbnRzXG5pbnB1dCxcbmJ1dHRvbixcbnNlbGVjdCxcbnRleHRhcmVhIHtcbiAgZm9udC1mYW1pbHk6IGluaGVyaXQ7XG4gIGZvbnQtc2l6ZTogaW5oZXJpdDtcbiAgbGluZS1oZWlnaHQ6IGluaGVyaXQ7XG59XG5cblxuLy8gTGlua3NcblxuYSB7XG4gIGNvbG9yOiBAbGluay1jb2xvcjtcbiAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xuXG4gICY6aG92ZXIsXG4gICY6Zm9jdXMge1xuICAgIGNvbG9yOiBAbGluay1ob3Zlci1jb2xvcjtcbiAgICB0ZXh0LWRlY29yYXRpb246IEBsaW5rLWhvdmVyLWRlY29yYXRpb247XG4gIH1cblxuICAmOmZvY3VzIHtcbiAgICAudGFiLWZvY3VzKCk7XG4gIH1cbn1cblxuXG4vLyBGaWd1cmVzXG4vL1xuLy8gV2UgcmVzZXQgdGhpcyBoZXJlIGJlY2F1c2UgcHJldmlvdXNseSBOb3JtYWxpemUgaGFkIG5vIGBmaWd1cmVgIG1hcmdpbnMuIFRoaXNcbi8vIGVuc3VyZXMgd2UgZG9uJ3QgYnJlYWsgYW55b25lJ3MgdXNlIG9mIHRoZSBlbGVtZW50LlxuXG5maWd1cmUge1xuICBtYXJnaW46IDA7XG59XG5cblxuLy8gSW1hZ2VzXG5cbmltZyB7XG4gIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XG59XG5cbi8vIFJlc3BvbnNpdmUgaW1hZ2VzIChlbnN1cmUgaW1hZ2VzIGRvbid0IHNjYWxlIGJleW9uZCB0aGVpciBwYXJlbnRzKVxuLmltZy1yZXNwb25zaXZlIHtcbiAgLmltZy1yZXNwb25zaXZlKCk7XG59XG5cbi8vIFJvdW5kZWQgY29ybmVyc1xuLmltZy1yb3VuZGVkIHtcbiAgYm9yZGVyLXJhZGl1czogQGJvcmRlci1yYWRpdXMtbGFyZ2U7XG59XG5cbi8vIEltYWdlIHRodW1ibmFpbHNcbi8vXG4vLyBIZWFkcyB1cCEgVGhpcyBpcyBtaXhpbi1lZCBpbnRvIHRodW1ibmFpbHMubGVzcyBmb3IgYC50aHVtYm5haWxgLlxuLmltZy10aHVtYm5haWwge1xuICBwYWRkaW5nOiBAdGh1bWJuYWlsLXBhZGRpbmc7XG4gIGxpbmUtaGVpZ2h0OiBAbGluZS1oZWlnaHQtYmFzZTtcbiAgYmFja2dyb3VuZC1jb2xvcjogQHRodW1ibmFpbC1iZztcbiAgYm9yZGVyOiAxcHggc29saWQgQHRodW1ibmFpbC1ib3JkZXI7XG4gIGJvcmRlci1yYWRpdXM6IEB0aHVtYm5haWwtYm9yZGVyLXJhZGl1cztcbiAgLnRyYW5zaXRpb24oYWxsIC4ycyBlYXNlLWluLW91dCk7XG5cbiAgLy8gS2VlcCB0aGVtIGF0IG1vc3QgMTAwJSB3aWRlXG4gIC5pbWctcmVzcG9uc2l2ZShpbmxpbmUtYmxvY2spO1xufVxuXG4vLyBQZXJmZWN0IGNpcmNsZVxuLmltZy1jaXJjbGUge1xuICBib3JkZXItcmFkaXVzOiA1MCU7IC8vIHNldCByYWRpdXMgaW4gcGVyY2VudHNcbn1cblxuXG4vLyBIb3Jpem9udGFsIHJ1bGVzXG5cbmhyIHtcbiAgbWFyZ2luLXRvcDogICAgQGxpbmUtaGVpZ2h0LWNvbXB1dGVkO1xuICBtYXJnaW4tYm90dG9tOiBAbGluZS1oZWlnaHQtY29tcHV0ZWQ7XG4gIGJvcmRlcjogMDtcbiAgYm9yZGVyLXRvcDogMXB4IHNvbGlkIEBoci1ib3JkZXI7XG59XG5cblxuLy8gT25seSBkaXNwbGF5IGNvbnRlbnQgdG8gc2NyZWVuIHJlYWRlcnNcbi8vXG4vLyBTZWU6IGh0dHA6Ly9hMTF5cHJvamVjdC5jb20vcG9zdHMvaG93LXRvLWhpZGUtY29udGVudC9cblxuLnNyLW9ubHkge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHdpZHRoOiAxcHg7XG4gIGhlaWdodDogMXB4O1xuICBtYXJnaW46IC0xcHg7XG4gIHBhZGRpbmc6IDA7XG4gIG92ZXJmbG93OiBoaWRkZW47XG4gIGNsaXA6IHJlY3QoMCwwLDAsMCk7XG4gIGJvcmRlcjogMDtcbn1cblxuLy8gVXNlIGluIGNvbmp1bmN0aW9uIHdpdGggLnNyLW9ubHkgdG8gb25seSBkaXNwbGF5IGNvbnRlbnQgd2hlbiBpdCdzIGZvY3VzZWQuXG4vLyBVc2VmdWwgZm9yIFwiU2tpcCB0byBtYWluIGNvbnRlbnRcIiBsaW5rczsgc2VlIGh0dHA6Ly93d3cudzMub3JnL1RSLzIwMTMvTk9URS1XQ0FHMjAtVEVDSFMtMjAxMzA5MDUvRzFcbi8vIENyZWRpdDogSFRNTDUgQm9pbGVycGxhdGVcblxuLnNyLW9ubHktZm9jdXNhYmxlIHtcbiAgJjphY3RpdmUsXG4gICY6Zm9jdXMge1xuICAgIHBvc2l0aW9uOiBzdGF0aWM7XG4gICAgd2lkdGg6IGF1dG87XG4gICAgaGVpZ2h0OiBhdXRvO1xuICAgIG1hcmdpbjogMDtcbiAgICBvdmVyZmxvdzogdmlzaWJsZTtcbiAgICBjbGlwOiBhdXRvO1xuICB9XG59XG4iLCIvLyBWZW5kb3IgUHJlZml4ZXNcbi8vXG4vLyBBbGwgdmVuZG9yIG1peGlucyBhcmUgZGVwcmVjYXRlZCBhcyBvZiB2My4yLjAgZHVlIHRvIHRoZSBpbnRyb2R1Y3Rpb24gb2Zcbi8vIEF1dG9wcmVmaXhlciBpbiBvdXIgR3J1bnRmaWxlLiBUaGV5IHdpbGwgYmUgcmVtb3ZlZCBpbiB2NC5cblxuLy8gLSBBbmltYXRpb25zXG4vLyAtIEJhY2tmYWNlIHZpc2liaWxpdHlcbi8vIC0gQm94IHNoYWRvd1xuLy8gLSBCb3ggc2l6aW5nXG4vLyAtIENvbnRlbnQgY29sdW1uc1xuLy8gLSBIeXBoZW5zXG4vLyAtIFBsYWNlaG9sZGVyIHRleHRcbi8vIC0gVHJhbnNmb3JtYXRpb25zXG4vLyAtIFRyYW5zaXRpb25zXG4vLyAtIFVzZXIgU2VsZWN0XG5cblxuLy8gQW5pbWF0aW9uc1xuLmFuaW1hdGlvbihAYW5pbWF0aW9uKSB7XG4gIC13ZWJraXQtYW5pbWF0aW9uOiBAYW5pbWF0aW9uO1xuICAgICAgIC1vLWFuaW1hdGlvbjogQGFuaW1hdGlvbjtcbiAgICAgICAgICBhbmltYXRpb246IEBhbmltYXRpb247XG59XG4uYW5pbWF0aW9uLW5hbWUoQG5hbWUpIHtcbiAgLXdlYmtpdC1hbmltYXRpb24tbmFtZTogQG5hbWU7XG4gICAgICAgICAgYW5pbWF0aW9uLW5hbWU6IEBuYW1lO1xufVxuLmFuaW1hdGlvbi1kdXJhdGlvbihAZHVyYXRpb24pIHtcbiAgLXdlYmtpdC1hbmltYXRpb24tZHVyYXRpb246IEBkdXJhdGlvbjtcbiAgICAgICAgICBhbmltYXRpb24tZHVyYXRpb246IEBkdXJhdGlvbjtcbn1cbi5hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uKEB0aW1pbmctZnVuY3Rpb24pIHtcbiAgLXdlYmtpdC1hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBAdGltaW5nLWZ1bmN0aW9uO1xuICAgICAgICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IEB0aW1pbmctZnVuY3Rpb247XG59XG4uYW5pbWF0aW9uLWRlbGF5KEBkZWxheSkge1xuICAtd2Via2l0LWFuaW1hdGlvbi1kZWxheTogQGRlbGF5O1xuICAgICAgICAgIGFuaW1hdGlvbi1kZWxheTogQGRlbGF5O1xufVxuLmFuaW1hdGlvbi1pdGVyYXRpb24tY291bnQoQGl0ZXJhdGlvbi1jb3VudCkge1xuICAtd2Via2l0LWFuaW1hdGlvbi1pdGVyYXRpb24tY291bnQ6IEBpdGVyYXRpb24tY291bnQ7XG4gICAgICAgICAgYW5pbWF0aW9uLWl0ZXJhdGlvbi1jb3VudDogQGl0ZXJhdGlvbi1jb3VudDtcbn1cbi5hbmltYXRpb24tZGlyZWN0aW9uKEBkaXJlY3Rpb24pIHtcbiAgLXdlYmtpdC1hbmltYXRpb24tZGlyZWN0aW9uOiBAZGlyZWN0aW9uO1xuICAgICAgICAgIGFuaW1hdGlvbi1kaXJlY3Rpb246IEBkaXJlY3Rpb247XG59XG4uYW5pbWF0aW9uLWZpbGwtbW9kZShAZmlsbC1tb2RlKSB7XG4gIC13ZWJraXQtYW5pbWF0aW9uLWZpbGwtbW9kZTogQGZpbGwtbW9kZTtcbiAgICAgICAgICBhbmltYXRpb24tZmlsbC1tb2RlOiBAZmlsbC1tb2RlO1xufVxuXG4vLyBCYWNrZmFjZSB2aXNpYmlsaXR5XG4vLyBQcmV2ZW50IGJyb3dzZXJzIGZyb20gZmxpY2tlcmluZyB3aGVuIHVzaW5nIENTUyAzRCB0cmFuc2Zvcm1zLlxuLy8gRGVmYXVsdCB2YWx1ZSBpcyBgdmlzaWJsZWAsIGJ1dCBjYW4gYmUgY2hhbmdlZCB0byBgaGlkZGVuYFxuXG4uYmFja2ZhY2UtdmlzaWJpbGl0eShAdmlzaWJpbGl0eSl7XG4gIC13ZWJraXQtYmFja2ZhY2UtdmlzaWJpbGl0eTogQHZpc2liaWxpdHk7XG4gICAgIC1tb3otYmFja2ZhY2UtdmlzaWJpbGl0eTogQHZpc2liaWxpdHk7XG4gICAgICAgICAgYmFja2ZhY2UtdmlzaWJpbGl0eTogQHZpc2liaWxpdHk7XG59XG5cbi8vIERyb3Agc2hhZG93c1xuLy9cbi8vIE5vdGU6IERlcHJlY2F0ZWQgYC5ib3gtc2hhZG93KClgIGFzIG9mIHYzLjEuMCBzaW5jZSBhbGwgb2YgQm9vdHN0cmFwJ3Ncbi8vIHN1cHBvcnRlZCBicm93c2VycyB0aGF0IGhhdmUgYm94IHNoYWRvdyBjYXBhYmlsaXRpZXMgbm93IHN1cHBvcnQgaXQuXG5cbi5ib3gtc2hhZG93KEBzaGFkb3cpIHtcbiAgLXdlYmtpdC1ib3gtc2hhZG93OiBAc2hhZG93OyAvLyBpT1MgPDQuMyAmIEFuZHJvaWQgPDQuMVxuICAgICAgICAgIGJveC1zaGFkb3c6IEBzaGFkb3c7XG59XG5cbi8vIEJveCBzaXppbmdcbi5ib3gtc2l6aW5nKEBib3htb2RlbCkge1xuICAtd2Via2l0LWJveC1zaXppbmc6IEBib3htb2RlbDtcbiAgICAgLW1vei1ib3gtc2l6aW5nOiBAYm94bW9kZWw7XG4gICAgICAgICAgYm94LXNpemluZzogQGJveG1vZGVsO1xufVxuXG4vLyBDU1MzIENvbnRlbnQgQ29sdW1uc1xuLmNvbnRlbnQtY29sdW1ucyhAY29sdW1uLWNvdW50OyBAY29sdW1uLWdhcDogQGdyaWQtZ3V0dGVyLXdpZHRoKSB7XG4gIC13ZWJraXQtY29sdW1uLWNvdW50OiBAY29sdW1uLWNvdW50O1xuICAgICAtbW96LWNvbHVtbi1jb3VudDogQGNvbHVtbi1jb3VudDtcbiAgICAgICAgICBjb2x1bW4tY291bnQ6IEBjb2x1bW4tY291bnQ7XG4gIC13ZWJraXQtY29sdW1uLWdhcDogQGNvbHVtbi1nYXA7XG4gICAgIC1tb3otY29sdW1uLWdhcDogQGNvbHVtbi1nYXA7XG4gICAgICAgICAgY29sdW1uLWdhcDogQGNvbHVtbi1nYXA7XG59XG5cbi8vIE9wdGlvbmFsIGh5cGhlbmF0aW9uXG4uaHlwaGVucyhAbW9kZTogYXV0bykge1xuICB3b3JkLXdyYXA6IGJyZWFrLXdvcmQ7XG4gIC13ZWJraXQtaHlwaGVuczogQG1vZGU7XG4gICAgIC1tb3otaHlwaGVuczogQG1vZGU7XG4gICAgICAtbXMtaHlwaGVuczogQG1vZGU7IC8vIElFMTArXG4gICAgICAgLW8taHlwaGVuczogQG1vZGU7XG4gICAgICAgICAgaHlwaGVuczogQG1vZGU7XG59XG5cbi8vIFBsYWNlaG9sZGVyIHRleHRcbi5wbGFjZWhvbGRlcihAY29sb3I6IEBpbnB1dC1jb2xvci1wbGFjZWhvbGRlcikge1xuICAvLyBGaXJlZm94XG4gICY6Oi1tb3otcGxhY2Vob2xkZXIge1xuICAgIGNvbG9yOiBAY29sb3I7XG4gICAgb3BhY2l0eTogMTsgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9wdWxsLzExNTI2XG4gIH1cbiAgJjotbXMtaW5wdXQtcGxhY2Vob2xkZXIgeyBjb2xvcjogQGNvbG9yOyB9IC8vIEludGVybmV0IEV4cGxvcmVyIDEwK1xuICAmOjotd2Via2l0LWlucHV0LXBsYWNlaG9sZGVyICB7IGNvbG9yOiBAY29sb3I7IH0gLy8gU2FmYXJpIGFuZCBDaHJvbWVcbn1cblxuLy8gVHJhbnNmb3JtYXRpb25zXG4uc2NhbGUoQHJhdGlvKSB7XG4gIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZShAcmF0aW8pO1xuICAgICAgLW1zLXRyYW5zZm9ybTogc2NhbGUoQHJhdGlvKTsgLy8gSUU5IG9ubHlcbiAgICAgICAtby10cmFuc2Zvcm06IHNjYWxlKEByYXRpbyk7XG4gICAgICAgICAgdHJhbnNmb3JtOiBzY2FsZShAcmF0aW8pO1xufVxuLnNjYWxlKEByYXRpb1g7IEByYXRpb1kpIHtcbiAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlKEByYXRpb1gsIEByYXRpb1kpO1xuICAgICAgLW1zLXRyYW5zZm9ybTogc2NhbGUoQHJhdGlvWCwgQHJhdGlvWSk7IC8vIElFOSBvbmx5XG4gICAgICAgLW8tdHJhbnNmb3JtOiBzY2FsZShAcmF0aW9YLCBAcmF0aW9ZKTtcbiAgICAgICAgICB0cmFuc2Zvcm06IHNjYWxlKEByYXRpb1gsIEByYXRpb1kpO1xufVxuLnNjYWxlWChAcmF0aW8pIHtcbiAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlWChAcmF0aW8pO1xuICAgICAgLW1zLXRyYW5zZm9ybTogc2NhbGVYKEByYXRpbyk7IC8vIElFOSBvbmx5XG4gICAgICAgLW8tdHJhbnNmb3JtOiBzY2FsZVgoQHJhdGlvKTtcbiAgICAgICAgICB0cmFuc2Zvcm06IHNjYWxlWChAcmF0aW8pO1xufVxuLnNjYWxlWShAcmF0aW8pIHtcbiAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlWShAcmF0aW8pO1xuICAgICAgLW1zLXRyYW5zZm9ybTogc2NhbGVZKEByYXRpbyk7IC8vIElFOSBvbmx5XG4gICAgICAgLW8tdHJhbnNmb3JtOiBzY2FsZVkoQHJhdGlvKTtcbiAgICAgICAgICB0cmFuc2Zvcm06IHNjYWxlWShAcmF0aW8pO1xufVxuLnNrZXcoQHg7IEB5KSB7XG4gIC13ZWJraXQtdHJhbnNmb3JtOiBza2V3WChAeCkgc2tld1koQHkpO1xuICAgICAgLW1zLXRyYW5zZm9ybTogc2tld1goQHgpIHNrZXdZKEB5KTsgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9pc3N1ZXMvNDg4NTsgSUU5K1xuICAgICAgIC1vLXRyYW5zZm9ybTogc2tld1goQHgpIHNrZXdZKEB5KTtcbiAgICAgICAgICB0cmFuc2Zvcm06IHNrZXdYKEB4KSBza2V3WShAeSk7XG59XG4udHJhbnNsYXRlKEB4OyBAeSkge1xuICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlKEB4LCBAeSk7XG4gICAgICAtbXMtdHJhbnNmb3JtOiB0cmFuc2xhdGUoQHgsIEB5KTsgLy8gSUU5IG9ubHlcbiAgICAgICAtby10cmFuc2Zvcm06IHRyYW5zbGF0ZShAeCwgQHkpO1xuICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlKEB4LCBAeSk7XG59XG4udHJhbnNsYXRlM2QoQHg7IEB5OyBAeikge1xuICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlM2QoQHgsIEB5LCBAeik7XG4gICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUzZChAeCwgQHksIEB6KTtcbn1cbi5yb3RhdGUoQGRlZ3JlZXMpIHtcbiAgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZShAZGVncmVlcyk7XG4gICAgICAtbXMtdHJhbnNmb3JtOiByb3RhdGUoQGRlZ3JlZXMpOyAvLyBJRTkgb25seVxuICAgICAgIC1vLXRyYW5zZm9ybTogcm90YXRlKEBkZWdyZWVzKTtcbiAgICAgICAgICB0cmFuc2Zvcm06IHJvdGF0ZShAZGVncmVlcyk7XG59XG4ucm90YXRlWChAZGVncmVlcykge1xuICAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlWChAZGVncmVlcyk7XG4gICAgICAtbXMtdHJhbnNmb3JtOiByb3RhdGVYKEBkZWdyZWVzKTsgLy8gSUU5IG9ubHlcbiAgICAgICAtby10cmFuc2Zvcm06IHJvdGF0ZVgoQGRlZ3JlZXMpO1xuICAgICAgICAgIHRyYW5zZm9ybTogcm90YXRlWChAZGVncmVlcyk7XG59XG4ucm90YXRlWShAZGVncmVlcykge1xuICAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlWShAZGVncmVlcyk7XG4gICAgICAtbXMtdHJhbnNmb3JtOiByb3RhdGVZKEBkZWdyZWVzKTsgLy8gSUU5IG9ubHlcbiAgICAgICAtby10cmFuc2Zvcm06IHJvdGF0ZVkoQGRlZ3JlZXMpO1xuICAgICAgICAgIHRyYW5zZm9ybTogcm90YXRlWShAZGVncmVlcyk7XG59XG4ucGVyc3BlY3RpdmUoQHBlcnNwZWN0aXZlKSB7XG4gIC13ZWJraXQtcGVyc3BlY3RpdmU6IEBwZXJzcGVjdGl2ZTtcbiAgICAgLW1vei1wZXJzcGVjdGl2ZTogQHBlcnNwZWN0aXZlO1xuICAgICAgICAgIHBlcnNwZWN0aXZlOiBAcGVyc3BlY3RpdmU7XG59XG4ucGVyc3BlY3RpdmUtb3JpZ2luKEBwZXJzcGVjdGl2ZSkge1xuICAtd2Via2l0LXBlcnNwZWN0aXZlLW9yaWdpbjogQHBlcnNwZWN0aXZlO1xuICAgICAtbW96LXBlcnNwZWN0aXZlLW9yaWdpbjogQHBlcnNwZWN0aXZlO1xuICAgICAgICAgIHBlcnNwZWN0aXZlLW9yaWdpbjogQHBlcnNwZWN0aXZlO1xufVxuLnRyYW5zZm9ybS1vcmlnaW4oQG9yaWdpbikge1xuICAtd2Via2l0LXRyYW5zZm9ybS1vcmlnaW46IEBvcmlnaW47XG4gICAgIC1tb3otdHJhbnNmb3JtLW9yaWdpbjogQG9yaWdpbjtcbiAgICAgIC1tcy10cmFuc2Zvcm0tb3JpZ2luOiBAb3JpZ2luOyAvLyBJRTkgb25seVxuICAgICAgICAgIHRyYW5zZm9ybS1vcmlnaW46IEBvcmlnaW47XG59XG5cblxuLy8gVHJhbnNpdGlvbnNcblxuLnRyYW5zaXRpb24oQHRyYW5zaXRpb24pIHtcbiAgLXdlYmtpdC10cmFuc2l0aW9uOiBAdHJhbnNpdGlvbjtcbiAgICAgICAtby10cmFuc2l0aW9uOiBAdHJhbnNpdGlvbjtcbiAgICAgICAgICB0cmFuc2l0aW9uOiBAdHJhbnNpdGlvbjtcbn1cbi50cmFuc2l0aW9uLXByb3BlcnR5KEB0cmFuc2l0aW9uLXByb3BlcnR5KSB7XG4gIC13ZWJraXQtdHJhbnNpdGlvbi1wcm9wZXJ0eTogQHRyYW5zaXRpb24tcHJvcGVydHk7XG4gICAgICAgICAgdHJhbnNpdGlvbi1wcm9wZXJ0eTogQHRyYW5zaXRpb24tcHJvcGVydHk7XG59XG4udHJhbnNpdGlvbi1kZWxheShAdHJhbnNpdGlvbi1kZWxheSkge1xuICAtd2Via2l0LXRyYW5zaXRpb24tZGVsYXk6IEB0cmFuc2l0aW9uLWRlbGF5O1xuICAgICAgICAgIHRyYW5zaXRpb24tZGVsYXk6IEB0cmFuc2l0aW9uLWRlbGF5O1xufVxuLnRyYW5zaXRpb24tZHVyYXRpb24oQHRyYW5zaXRpb24tZHVyYXRpb24pIHtcbiAgLXdlYmtpdC10cmFuc2l0aW9uLWR1cmF0aW9uOiBAdHJhbnNpdGlvbi1kdXJhdGlvbjtcbiAgICAgICAgICB0cmFuc2l0aW9uLWR1cmF0aW9uOiBAdHJhbnNpdGlvbi1kdXJhdGlvbjtcbn1cbi50cmFuc2l0aW9uLXRpbWluZy1mdW5jdGlvbihAdGltaW5nLWZ1bmN0aW9uKSB7XG4gIC13ZWJraXQtdHJhbnNpdGlvbi10aW1pbmctZnVuY3Rpb246IEB0aW1pbmctZnVuY3Rpb247XG4gICAgICAgICAgdHJhbnNpdGlvbi10aW1pbmctZnVuY3Rpb246IEB0aW1pbmctZnVuY3Rpb247XG59XG4udHJhbnNpdGlvbi10cmFuc2Zvcm0oQHRyYW5zaXRpb24pIHtcbiAgLXdlYmtpdC10cmFuc2l0aW9uOiAtd2Via2l0LXRyYW5zZm9ybSBAdHJhbnNpdGlvbjtcbiAgICAgLW1vei10cmFuc2l0aW9uOiAtbW96LXRyYW5zZm9ybSBAdHJhbnNpdGlvbjtcbiAgICAgICAtby10cmFuc2l0aW9uOiAtby10cmFuc2Zvcm0gQHRyYW5zaXRpb247XG4gICAgICAgICAgdHJhbnNpdGlvbjogdHJhbnNmb3JtIEB0cmFuc2l0aW9uO1xufVxuXG5cbi8vIFVzZXIgc2VsZWN0XG4vLyBGb3Igc2VsZWN0aW5nIHRleHQgb24gdGhlIHBhZ2VcblxuLnVzZXItc2VsZWN0KEBzZWxlY3QpIHtcbiAgLXdlYmtpdC11c2VyLXNlbGVjdDogQHNlbGVjdDtcbiAgICAgLW1vei11c2VyLXNlbGVjdDogQHNlbGVjdDtcbiAgICAgIC1tcy11c2VyLXNlbGVjdDogQHNlbGVjdDsgLy8gSUUxMCtcbiAgICAgICAgICB1c2VyLXNlbGVjdDogQHNlbGVjdDtcbn1cbiIsIi8vXG4vLyBWYXJpYWJsZXNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cblxuLy89PSBDb2xvcnNcbi8vXG4vLyMjIEdyYXkgYW5kIGJyYW5kIGNvbG9ycyBmb3IgdXNlIGFjcm9zcyBCb290c3RyYXAuXG5cbkBncmF5LWJhc2U6ICAgICAgICAgICAgICAjMDAwO1xuQGdyYXktZGFya2VyOiAgICAgICAgICAgIGxpZ2h0ZW4oQGdyYXktYmFzZSwgMTMuNSUpOyAvLyAjMjIyXG5AZ3JheS1kYXJrOiAgICAgICAgICAgICAgbGlnaHRlbihAZ3JheS1iYXNlLCAyMCUpOyAgIC8vICMzMzNcbkBncmF5OiAgICAgICAgICAgICAgICAgICBsaWdodGVuKEBncmF5LWJhc2UsIDMzLjUlKTsgLy8gIzU1NVxuQGdyYXktbGlnaHQ6ICAgICAgICAgICAgIGxpZ2h0ZW4oQGdyYXktYmFzZSwgNDYuNyUpOyAvLyAjNzc3XG5AZ3JheS1saWdodGVyOiAgICAgICAgICAgbGlnaHRlbihAZ3JheS1iYXNlLCA5My41JSk7IC8vICNlZWVcblxuQGJyYW5kLXByaW1hcnk6ICAgICAgICAgIzRDQUY1MDtcbkBicmFuZC1zdWNjZXNzOiAgICAgICAgICM0NTdFODY7XG5AYnJhbmQtaW5mbzogICAgICAgICAgICAjNEEyQjBGO1xuQGJyYW5kLXdhcm5pbmc6ICAgICAgICAgI2YwYWQ0ZTtcbkBicmFuZC1kYW5nZXI6ICAgICAgICAgICNkOTUzNGY7XG5cblxuLy89PSBTY2FmZm9sZGluZ1xuLy9cbi8vIyMgU2V0dGluZ3MgZm9yIHNvbWUgb2YgdGhlIG1vc3QgZ2xvYmFsIHN0eWxlcy5cblxuLy8qKiBCYWNrZ3JvdW5kIGNvbG9yIGZvciBgPGJvZHk+YC5cbkBib2R5LWJnOiAgICAgICAgICAgICAgICNmZmZmZmY7XG4vLyoqIEdsb2JhbCB0ZXh0IGNvbG9yIG9uIGA8Ym9keT5gLlxuQHRleHQtY29sb3I6ICAgICAgICAgICAgQGdyYXktZGFyaztcblxuLy8qKiBHbG9iYWwgdGV4dHVhbCBsaW5rIGNvbG9yLlxuQGxpbmstY29sb3I6ICAgICAgICAgICAgQGJyYW5kLXByaW1hcnk7XG4vLyoqIExpbmsgaG92ZXIgY29sb3Igc2V0IHZpYSBgZGFya2VuKClgIGZ1bmN0aW9uLlxuQGxpbmstaG92ZXItY29sb3I6ICAgICAgZGFya2VuKEBsaW5rLWNvbG9yLCAxNSUpO1xuLy8qKiBMaW5rIGhvdmVyIGRlY29yYXRpb24uXG5AbGluay1ob3Zlci1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7XG5cblxuLy89PSBUeXBvZ3JhcGh5XG4vL1xuLy8jIyBGb250LCBsaW5lLWhlaWdodCwgYW5kIGNvbG9yIGZvciBib2R5IHRleHQsIGhlYWRpbmdzLCBhbmQgbW9yZS5cblxuQGZvbnQtZmFtaWx5LXNhbnMtc2VyaWY6ICBcIkhlbHZldGljYSBOZXVlXCIsIEhlbHZldGljYSwgQXJpYWwsIHNhbnMtc2VyaWY7XG5AZm9udC1mYW1pbHktc2VyaWY6ICAgICAgIEdlb3JnaWEsIFwiVGltZXMgTmV3IFJvbWFuXCIsIFRpbWVzLCBzZXJpZjtcbi8vKiogRGVmYXVsdCBtb25vc3BhY2UgZm9udHMgZm9yIGA8Y29kZT5gLCBgPGtiZD5gLCBhbmQgYDxwcmU+YC5cbkBmb250LWZhbWlseS1tb25vc3BhY2U6ICAgTWVubG8sIE1vbmFjbywgQ29uc29sYXMsIFwiQ291cmllciBOZXdcIiwgbW9ub3NwYWNlO1xuQGZvbnQtZmFtaWx5LWJhc2U6ICAgICAgICBAZm9udC1mYW1pbHktc2Fucy1zZXJpZjtcblxuQGZvbnQtc2l6ZS1iYXNlOiAgICAgICAgICAxNHB4O1xuQGZvbnQtc2l6ZS1sYXJnZTogICAgICAgICBjZWlsKChAZm9udC1zaXplLWJhc2UgKiAxLjI1KSk7IC8vIH4xOHB4XG5AZm9udC1zaXplLXNtYWxsOiAgICAgICAgIGNlaWwoKEBmb250LXNpemUtYmFzZSAqIDAuODUpKTsgLy8gfjEycHhcblxuQGZvbnQtc2l6ZS1oMTogICAgICAgICAgICBmbG9vcigoQGZvbnQtc2l6ZS1iYXNlICogMi42KSk7IC8vIH4zNnB4XG5AZm9udC1zaXplLWgyOiAgICAgICAgICAgIGZsb29yKChAZm9udC1zaXplLWJhc2UgKiAyLjE1KSk7IC8vIH4zMHB4XG5AZm9udC1zaXplLWgzOiAgICAgICAgICAgIGNlaWwoKEBmb250LXNpemUtYmFzZSAqIDEuNykpOyAvLyB+MjRweFxuQGZvbnQtc2l6ZS1oNDogICAgICAgICAgICBjZWlsKChAZm9udC1zaXplLWJhc2UgKiAxLjI1KSk7IC8vIH4xOHB4XG5AZm9udC1zaXplLWg1OiAgICAgICAgICAgIEBmb250LXNpemUtYmFzZTtcbkBmb250LXNpemUtaDY6ICAgICAgICAgICAgY2VpbCgoQGZvbnQtc2l6ZS1iYXNlICogMC44NSkpOyAvLyB+MTJweFxuXG4vLyoqIFVuaXQtbGVzcyBgbGluZS1oZWlnaHRgIGZvciB1c2UgaW4gY29tcG9uZW50cyBsaWtlIGJ1dHRvbnMuXG5AbGluZS1oZWlnaHQtYmFzZTogICAgICAgIDEuNDI4NTcxNDI5OyAvLyAyMC8xNFxuLy8qKiBDb21wdXRlZCBcImxpbmUtaGVpZ2h0XCIgKGBmb250LXNpemVgICogYGxpbmUtaGVpZ2h0YCkgZm9yIHVzZSB3aXRoIGBtYXJnaW5gLCBgcGFkZGluZ2AsIGV0Yy5cbkBsaW5lLWhlaWdodC1jb21wdXRlZDogICAgZmxvb3IoKEBmb250LXNpemUtYmFzZSAqIEBsaW5lLWhlaWdodC1iYXNlKSk7IC8vIH4yMHB4XG5cbi8vKiogQnkgZGVmYXVsdCwgdGhpcyBpbmhlcml0cyBmcm9tIHRoZSBgPGJvZHk+YC5cbkBoZWFkaW5ncy1mb250LWZhbWlseTogICAgaW5oZXJpdDtcbkBoZWFkaW5ncy1mb250LXdlaWdodDogICAgNTAwO1xuQGhlYWRpbmdzLWxpbmUtaGVpZ2h0OiAgICAxLjE7XG5AaGVhZGluZ3MtY29sb3I6ICAgICAgICAgIGluaGVyaXQ7XG5cblxuLy89PSBJY29ub2dyYXBoeVxuLy9cbi8vIyMgU3BlY2lmeSBjdXN0b20gbG9jYXRpb24gYW5kIGZpbGVuYW1lIG9mIHRoZSBpbmNsdWRlZCBHbHlwaGljb25zIGljb24gZm9udC4gVXNlZnVsIGZvciB0aG9zZSBpbmNsdWRpbmcgQm9vdHN0cmFwIHZpYSBCb3dlci5cblxuLy8qKiBMb2FkIGZvbnRzIGZyb20gdGhpcyBkaXJlY3RvcnkuXG5AaWNvbi1mb250LXBhdGg6ICAgICAgICAgIFwiLi4vZm9udHMvXCI7XG4vLyoqIEZpbGUgbmFtZSBmb3IgYWxsIGZvbnQgZmlsZXMuXG5AaWNvbi1mb250LW5hbWU6ICAgICAgICAgIFwiZ2x5cGhpY29ucy1oYWxmbGluZ3MtcmVndWxhclwiO1xuLy8qKiBFbGVtZW50IElEIHdpdGhpbiBTVkcgaWNvbiBmaWxlLlxuQGljb24tZm9udC1zdmctaWQ6ICAgICAgICBcImdseXBoaWNvbnNfaGFsZmxpbmdzcmVndWxhclwiO1xuXG5cbi8vPT0gQ29tcG9uZW50c1xuLy9cbi8vIyMgRGVmaW5lIGNvbW1vbiBwYWRkaW5nIGFuZCBib3JkZXIgcmFkaXVzIHNpemVzIGFuZCBtb3JlLiBWYWx1ZXMgYmFzZWQgb24gMTRweCB0ZXh0IGFuZCAxLjQyOCBsaW5lLWhlaWdodCAofjIwcHggdG8gc3RhcnQpLlxuXG5AcGFkZGluZy1iYXNlLXZlcnRpY2FsOiAgICAgNnB4O1xuQHBhZGRpbmctYmFzZS1ob3Jpem9udGFsOiAgIDEycHg7XG5cbkBwYWRkaW5nLWxhcmdlLXZlcnRpY2FsOiAgICAxMHB4O1xuQHBhZGRpbmctbGFyZ2UtaG9yaXpvbnRhbDogIDE2cHg7XG5cbkBwYWRkaW5nLXNtYWxsLXZlcnRpY2FsOiAgICA1cHg7XG5AcGFkZGluZy1zbWFsbC1ob3Jpem9udGFsOiAgMTBweDtcblxuQHBhZGRpbmcteHMtdmVydGljYWw6ICAgICAgIDFweDtcbkBwYWRkaW5nLXhzLWhvcml6b250YWw6ICAgICA1cHg7XG5cbkBsaW5lLWhlaWdodC1sYXJnZTogICAgICAgICAxLjMzO1xuQGxpbmUtaGVpZ2h0LXNtYWxsOiAgICAgICAgIDEuNTtcblxuQGJvcmRlci1yYWRpdXMtYmFzZTogICAgICAgIDRweDtcbkBib3JkZXItcmFkaXVzLWxhcmdlOiAgICAgICA2cHg7XG5AYm9yZGVyLXJhZGl1cy1zbWFsbDogICAgICAgM3B4O1xuXG4vLyoqIEdsb2JhbCBjb2xvciBmb3IgYWN0aXZlIGl0ZW1zIChlLmcuLCBuYXZzIG9yIGRyb3Bkb3ducykuXG5AY29tcG9uZW50LWFjdGl2ZS1jb2xvcjogICAgQGdyYXktbGlnaHRlcjtcbi8vKiogR2xvYmFsIGJhY2tncm91bmQgY29sb3IgZm9yIGFjdGl2ZSBpdGVtcyAoZS5nLiwgbmF2cyBvciBkcm9wZG93bnMpLlxuQGNvbXBvbmVudC1hY3RpdmUtYmc6ICAgICAgIEBicmFuZC1wcmltYXJ5O1xuXG4vLyoqIFdpZHRoIG9mIHRoZSBgYm9yZGVyYCBmb3IgZ2VuZXJhdGluZyBjYXJldHMgdGhhdCBpbmRpY2F0b3IgZHJvcGRvd25zLlxuQGNhcmV0LXdpZHRoLWJhc2U6ICAgICAgICAgIDRweDtcbi8vKiogQ2FyZXRzIGluY3JlYXNlIHNsaWdodGx5IGluIHNpemUgZm9yIGxhcmdlciBjb21wb25lbnRzLlxuQGNhcmV0LXdpZHRoLWxhcmdlOiAgICAgICAgIDVweDtcblxuXG4vLz09IFRhYmxlc1xuLy9cbi8vIyMgQ3VzdG9taXplcyB0aGUgYC50YWJsZWAgY29tcG9uZW50IHdpdGggYmFzaWMgdmFsdWVzLCBlYWNoIHVzZWQgYWNyb3NzIGFsbCB0YWJsZSB2YXJpYXRpb25zLlxuXG4vLyoqIFBhZGRpbmcgZm9yIGA8dGg+YHMgYW5kIGA8dGQ+YHMuXG5AdGFibGUtY2VsbC1wYWRkaW5nOiAgICAgICAgICAgIDhweDtcbi8vKiogUGFkZGluZyBmb3IgY2VsbHMgaW4gYC50YWJsZS1jb25kZW5zZWRgLlxuQHRhYmxlLWNvbmRlbnNlZC1jZWxsLXBhZGRpbmc6ICA1cHg7XG5cbi8vKiogRGVmYXVsdCBiYWNrZ3JvdW5kIGNvbG9yIHVzZWQgZm9yIGFsbCB0YWJsZXMuXG5AdGFibGUtYmc6ICAgICAgICAgICAgICAgICAgICAgIHRyYW5zcGFyZW50O1xuLy8qKiBCYWNrZ3JvdW5kIGNvbG9yIHVzZWQgZm9yIGAudGFibGUtc3RyaXBlZGAuXG5AdGFibGUtYmctYWNjZW50OiAgICAgICAgICAgICAgICNmOWY5Zjk7XG4vLyoqIEJhY2tncm91bmQgY29sb3IgdXNlZCBmb3IgYC50YWJsZS1ob3ZlcmAuXG5AdGFibGUtYmctaG92ZXI6ICAgICAgICAgICAgICAgICNmNWY1ZjU7XG5AdGFibGUtYmctYWN0aXZlOiAgICAgICAgICAgICAgIEB0YWJsZS1iZy1ob3ZlcjtcblxuLy8qKiBCb3JkZXIgY29sb3IgZm9yIHRhYmxlIGFuZCBjZWxsIGJvcmRlcnMuXG5AdGFibGUtYm9yZGVyLWNvbG9yOiAgICAgICAgICAgICNkZGQ7XG5cblxuLy89PSBCdXR0b25zXG4vL1xuLy8jIyBGb3IgZWFjaCBvZiBCb290c3RyYXAncyBidXR0b25zLCBkZWZpbmUgdGV4dCwgYmFja2dyb3VuZCBhbmQgYm9yZGVyIGNvbG9yLlxuXG5AYnRuLWZvbnQtd2VpZ2h0OiAgICAgICAgICAgICAgICBub3JtYWw7XG5cbkBidG4tZGVmYXVsdC1jb2xvcjogICAgICAgICAgICAgICMwMDAwMDA7XG5AYnRuLWRlZmF1bHQtYmc6ICAgICAgICAgICAgICAgICBAYm9keS1iZztcbkBidG4tZGVmYXVsdC1ib3JkZXI6ICAgICAgICAgICAgICMwMDAwMDA7XG5cbkBidG4tcHJpbWFyeS1jb2xvcjogICAgICAgICAgICAgIEBicmFuZC1wcmltYXJ5O1xuQGJ0bi1wcmltYXJ5LWJnOiAgICAgICAgICAgICAgICAgQGJyYW5kLXByaW1hcnk7XG5AYnRuLXByaW1hcnktYm9yZGVyOiAgICAgICAgICAgICBkYXJrZW4oQGJ0bi1wcmltYXJ5LWJnLCA1JSk7XG5cbkBidG4tc3VjY2Vzcy1jb2xvcjogICAgICAgICAgICAgIEBicmFuZC1zdWNjZXNzO1xuQGJ0bi1zdWNjZXNzLWJnOiAgICAgICAgICAgICAgICAgQGJyYW5kLXN1Y2Nlc3M7XG5AYnRuLXN1Y2Nlc3MtYm9yZGVyOiAgICAgICAgICAgICBkYXJrZW4oQGJ0bi1zdWNjZXNzLWJnLCA1JSk7XG5cbkBidG4taW5mby1jb2xvcjogICAgICAgICAgICAgICAgIEBicmFuZC1pbmZvO1xuQGJ0bi1pbmZvLWJnOiAgICAgICAgICAgICAgICAgICAgQGJyYW5kLWluZm87XG5AYnRuLWluZm8tYm9yZGVyOiAgICAgICAgICAgICAgICBkYXJrZW4oQGJ0bi1pbmZvLWJnLCA1JSk7XG5cbkBidG4td2FybmluZy1jb2xvcjogICAgICAgICAgICAgIEBicmFuZC13YXJuaW5nO1xuQGJ0bi13YXJuaW5nLWJnOiAgICAgICAgICAgICAgICAgQGJyYW5kLXdhcm5pbmc7XG5AYnRuLXdhcm5pbmctYm9yZGVyOiAgICAgICAgICAgICBkYXJrZW4oQGJ0bi13YXJuaW5nLWJnLCA1JSk7XG5cbkBidG4tZGFuZ2VyLWNvbG9yOiAgICAgICAgICAgICAgIEBicmFuZC1kYW5nZXI7XG5AYnRuLWRhbmdlci1iZzogICAgICAgICAgICAgICAgICBAYnJhbmQtZGFuZ2VyO1xuQGJ0bi1kYW5nZXItYm9yZGVyOiAgICAgICAgICAgICAgZGFya2VuKEBidG4tZGFuZ2VyLWJnLCA1JSk7XG5cbkBidG4tbGluay1kaXNhYmxlZC1jb2xvcjogICAgICAgIEBncmF5LWxpZ2h0O1xuXG5cbi8vPT0gRm9ybXNcbi8vXG4vLyMjXG5cbi8vKiogYDxpbnB1dD5gIGJhY2tncm91bmQgY29sb3JcbkBpbnB1dC1iZzogICAgICAgICAgICAgICAgICAgICAgIEBncmF5LWxpZ2h0ZXI7XG4vLyoqIGA8aW5wdXQgZGlzYWJsZWQ+YCBiYWNrZ3JvdW5kIGNvbG9yXG5AaW5wdXQtYmctZGlzYWJsZWQ6ICAgICAgICAgICAgICBAZ3JheS1saWdodGVyO1xuXG4vLyoqIFRleHQgY29sb3IgZm9yIGA8aW5wdXQ+YHNcbkBpbnB1dC1jb2xvcjogICAgICAgICAgICAgICAgICAgIEBncmF5O1xuLy8qKiBgPGlucHV0PmAgYm9yZGVyIGNvbG9yXG5AaW5wdXQtYm9yZGVyOiAgICAgICAgICAgICAgICAgICAjY2NjO1xuXG4vLyBUT0RPOiBSZW5hbWUgYEBpbnB1dC1ib3JkZXItcmFkaXVzYCB0byBgQGlucHV0LWJvcmRlci1yYWRpdXMtYmFzZWAgaW4gdjRcbi8vKiogRGVmYXVsdCBgLmZvcm0tY29udHJvbGAgYm9yZGVyIHJhZGl1c1xuQGlucHV0LWJvcmRlci1yYWRpdXM6ICAgICAgICAgICAgQGJvcmRlci1yYWRpdXMtYmFzZTtcbi8vKiogTGFyZ2UgYC5mb3JtLWNvbnRyb2xgIGJvcmRlciByYWRpdXNcbkBpbnB1dC1ib3JkZXItcmFkaXVzLWxhcmdlOiAgICAgIEBib3JkZXItcmFkaXVzLWxhcmdlO1xuLy8qKiBTbWFsbCBgLmZvcm0tY29udHJvbGAgYm9yZGVyIHJhZGl1c1xuQGlucHV0LWJvcmRlci1yYWRpdXMtc21hbGw6ICAgICAgQGJvcmRlci1yYWRpdXMtc21hbGw7XG5cbi8vKiogQm9yZGVyIGNvbG9yIGZvciBpbnB1dHMgb24gZm9jdXNcbkBpbnB1dC1ib3JkZXItZm9jdXM6ICAgICAgICAgICAgICM2NmFmZTk7XG5cbi8vKiogUGxhY2Vob2xkZXIgdGV4dCBjb2xvclxuQGlucHV0LWNvbG9yLXBsYWNlaG9sZGVyOiAgICAgICAgIzk5OTtcblxuLy8qKiBEZWZhdWx0IGAuZm9ybS1jb250cm9sYCBoZWlnaHRcbkBpbnB1dC1oZWlnaHQtYmFzZTogICAgICAgICAgICAgIChAbGluZS1oZWlnaHQtY29tcHV0ZWQgKyAoQHBhZGRpbmctYmFzZS12ZXJ0aWNhbCAqIDIpICsgMik7XG4vLyoqIExhcmdlIGAuZm9ybS1jb250cm9sYCBoZWlnaHRcbkBpbnB1dC1oZWlnaHQtbGFyZ2U6ICAgICAgICAgICAgIChjZWlsKEBmb250LXNpemUtbGFyZ2UgKiBAbGluZS1oZWlnaHQtbGFyZ2UpICsgKEBwYWRkaW5nLWxhcmdlLXZlcnRpY2FsICogMikgKyAyKTtcbi8vKiogU21hbGwgYC5mb3JtLWNvbnRyb2xgIGhlaWdodFxuQGlucHV0LWhlaWdodC1zbWFsbDogICAgICAgICAgICAgKGZsb29yKEBmb250LXNpemUtc21hbGwgKiBAbGluZS1oZWlnaHQtc21hbGwpICsgKEBwYWRkaW5nLXNtYWxsLXZlcnRpY2FsICogMikgKyAyKTtcblxuQGxlZ2VuZC1jb2xvcjogICAgICAgICAgICAgICAgICAgQGdyYXktZGFyaztcbkBsZWdlbmQtYm9yZGVyLWNvbG9yOiAgICAgICAgICAgICNlNWU1ZTU7XG5cbi8vKiogQmFja2dyb3VuZCBjb2xvciBmb3IgdGV4dHVhbCBpbnB1dCBhZGRvbnNcbkBpbnB1dC1ncm91cC1hZGRvbi1iZzogICAgICAgICAgIEBncmF5LWxpZ2h0ZXI7XG4vLyoqIEJvcmRlciBjb2xvciBmb3IgdGV4dHVhbCBpbnB1dCBhZGRvbnNcbkBpbnB1dC1ncm91cC1hZGRvbi1ib3JkZXItY29sb3I6IEBpbnB1dC1ib3JkZXI7XG5cbi8vKiogRGlzYWJsZWQgY3Vyc29yIGZvciBmb3JtIGNvbnRyb2xzIGFuZCBidXR0b25zLlxuQGN1cnNvci1kaXNhYmxlZDogICAgICAgICAgICAgICAgbm90LWFsbG93ZWQ7XG5cblxuLy89PSBEcm9wZG93bnNcbi8vXG4vLyMjIERyb3Bkb3duIG1lbnUgY29udGFpbmVyIGFuZCBjb250ZW50cy5cblxuLy8qKiBCYWNrZ3JvdW5kIGZvciB0aGUgZHJvcGRvd24gbWVudS5cbkBkcm9wZG93bi1iZzogICAgICAgICAgICAgICAgICAgIEBncmF5LWxpZ2h0ZXI7XG4vLyoqIERyb3Bkb3duIG1lbnUgYGJvcmRlci1jb2xvcmAuXG5AZHJvcGRvd24tYm9yZGVyOiAgICAgICAgICAgICAgICByZ2JhKDAsMCwwLC4xNSk7XG4vLyoqIERyb3Bkb3duIG1lbnUgYGJvcmRlci1jb2xvcmAgKipmb3IgSUU4KiouXG5AZHJvcGRvd24tZmFsbGJhY2stYm9yZGVyOiAgICAgICAjY2NjO1xuLy8qKiBEaXZpZGVyIGNvbG9yIGZvciBiZXR3ZWVuIGRyb3Bkb3duIGl0ZW1zLlxuQGRyb3Bkb3duLWRpdmlkZXItYmc6ICAgICAgICAgICAgI2U1ZTVlNTtcblxuLy8qKiBEcm9wZG93biBsaW5rIHRleHQgY29sb3IuXG5AZHJvcGRvd24tbGluay1jb2xvcjogICAgICAgICAgICBAZ3JheS1kYXJrO1xuLy8qKiBIb3ZlciBjb2xvciBmb3IgZHJvcGRvd24gbGlua3MuXG5AZHJvcGRvd24tbGluay1ob3Zlci1jb2xvcjogICAgICBkYXJrZW4oQGdyYXktZGFyaywgNSUpO1xuLy8qKiBIb3ZlciBiYWNrZ3JvdW5kIGZvciBkcm9wZG93biBsaW5rcy5cbkBkcm9wZG93bi1saW5rLWhvdmVyLWJnOiAgICAgICAgICNmNWY1ZjU7XG5cbi8vKiogQWN0aXZlIGRyb3Bkb3duIG1lbnUgaXRlbSB0ZXh0IGNvbG9yLlxuQGRyb3Bkb3duLWxpbmstYWN0aXZlLWNvbG9yOiAgICAgQGNvbXBvbmVudC1hY3RpdmUtY29sb3I7XG4vLyoqIEFjdGl2ZSBkcm9wZG93biBtZW51IGl0ZW0gYmFja2dyb3VuZCBjb2xvci5cbkBkcm9wZG93bi1saW5rLWFjdGl2ZS1iZzogICAgICAgIEBjb21wb25lbnQtYWN0aXZlLWJnO1xuXG4vLyoqIERpc2FibGVkIGRyb3Bkb3duIG1lbnUgaXRlbSBiYWNrZ3JvdW5kIGNvbG9yLlxuQGRyb3Bkb3duLWxpbmstZGlzYWJsZWQtY29sb3I6ICAgQGdyYXktbGlnaHQ7XG5cbi8vKiogVGV4dCBjb2xvciBmb3IgaGVhZGVycyB3aXRoaW4gZHJvcGRvd24gbWVudXMuXG5AZHJvcGRvd24taGVhZGVyLWNvbG9yOiAgICAgICAgICBAZ3JheS1saWdodDtcblxuLy8qKiBEZXByZWNhdGVkIGBAZHJvcGRvd24tY2FyZXQtY29sb3JgIGFzIG9mIHYzLjEuMFxuQGRyb3Bkb3duLWNhcmV0LWNvbG9yOiAgICAgICAgICAgIzAwMDtcblxuXG4vLy0tIFotaW5kZXggbWFzdGVyIGxpc3Rcbi8vXG4vLyBXYXJuaW5nOiBBdm9pZCBjdXN0b21pemluZyB0aGVzZSB2YWx1ZXMuIFRoZXkncmUgdXNlZCBmb3IgYSBiaXJkJ3MgZXllIHZpZXdcbi8vIG9mIGNvbXBvbmVudHMgZGVwZW5kZW50IG9uIHRoZSB6LWF4aXMgYW5kIGFyZSBkZXNpZ25lZCB0byBhbGwgd29yayB0b2dldGhlci5cbi8vXG4vLyBOb3RlOiBUaGVzZSB2YXJpYWJsZXMgYXJlIG5vdCBnZW5lcmF0ZWQgaW50byB0aGUgQ3VzdG9taXplci5cblxuQHppbmRleC1uYXZiYXI6ICAgICAgICAgICAgMTAwMDtcbkB6aW5kZXgtZHJvcGRvd246ICAgICAgICAgIDEwMDA7XG5AemluZGV4LXBvcG92ZXI6ICAgICAgICAgICAxMDYwO1xuQHppbmRleC10b29sdGlwOiAgICAgICAgICAgMTA3MDtcbkB6aW5kZXgtbmF2YmFyLWZpeGVkOiAgICAgIDEwMzA7XG5AemluZGV4LW1vZGFsOiAgICAgICAgICAgICAxMDQwO1xuXG5cbi8vPT0gTWVkaWEgcXVlcmllcyBicmVha3BvaW50c1xuLy9cbi8vIyMgRGVmaW5lIHRoZSBicmVha3BvaW50cyBhdCB3aGljaCB5b3VyIGxheW91dCB3aWxsIGNoYW5nZSwgYWRhcHRpbmcgdG8gZGlmZmVyZW50IHNjcmVlbiBzaXplcy5cblxuLy8gRXh0cmEgc21hbGwgc2NyZWVuIC8gcGhvbmVcbi8vKiogRGVwcmVjYXRlZCBgQHNjcmVlbi14c2AgYXMgb2YgdjMuMC4xXG5Ac2NyZWVuLXhzOiAgICAgICAgICAgICAgICAgIDQ4MHB4O1xuLy8qKiBEZXByZWNhdGVkIGBAc2NyZWVuLXhzLW1pbmAgYXMgb2YgdjMuMi4wXG5Ac2NyZWVuLXhzLW1pbjogICAgICAgICAgICAgIEBzY3JlZW4teHM7XG4vLyoqIERlcHJlY2F0ZWQgYEBzY3JlZW4tcGhvbmVgIGFzIG9mIHYzLjAuMVxuQHNjcmVlbi1waG9uZTogICAgICAgICAgICAgICBAc2NyZWVuLXhzLW1pbjtcblxuLy8gU21hbGwgc2NyZWVuIC8gdGFibGV0XG4vLyoqIERlcHJlY2F0ZWQgYEBzY3JlZW4tc21gIGFzIG9mIHYzLjAuMVxuQHNjcmVlbi1zbTogICAgICAgICAgICAgICAgICA3NjhweDtcbkBzY3JlZW4tc20tbWluOiAgICAgICAgICAgICAgQHNjcmVlbi1zbTtcbi8vKiogRGVwcmVjYXRlZCBgQHNjcmVlbi10YWJsZXRgIGFzIG9mIHYzLjAuMVxuQHNjcmVlbi10YWJsZXQ6ICAgICAgICAgICAgICBAc2NyZWVuLXNtLW1pbjtcblxuLy8gTWVkaXVtIHNjcmVlbiAvIGRlc2t0b3Bcbi8vKiogRGVwcmVjYXRlZCBgQHNjcmVlbi1tZGAgYXMgb2YgdjMuMC4xXG5Ac2NyZWVuLW1kOiAgICAgICAgICAgICAgICAgIDEwMzFweDtcbkBzY3JlZW4tbWQtbWluOiAgICAgICAgICAgICAgQHNjcmVlbi1tZDtcbi8vKiogRGVwcmVjYXRlZCBgQHNjcmVlbi1kZXNrdG9wYCBhcyBvZiB2My4wLjFcbkBzY3JlZW4tZGVza3RvcDogICAgICAgICAgICAgQHNjcmVlbi1tZC1taW47XG5cbi8vIExhcmdlIHNjcmVlbiAvIHdpZGUgZGVza3RvcFxuLy8qKiBEZXByZWNhdGVkIGBAc2NyZWVuLWxnYCBhcyBvZiB2My4wLjFcbkBzY3JlZW4tbGc6ICAgICAgICAgICAgICAgICAgMTIwMHB4O1xuQHNjcmVlbi1sZy1taW46ICAgICAgICAgICAgICBAc2NyZWVuLWxnO1xuLy8qKiBEZXByZWNhdGVkIGBAc2NyZWVuLWxnLWRlc2t0b3BgIGFzIG9mIHYzLjAuMVxuQHNjcmVlbi1sZy1kZXNrdG9wOiAgICAgICAgICBAc2NyZWVuLWxnLW1pbjtcblxuLy8gU28gbWVkaWEgcXVlcmllcyBkb24ndCBvdmVybGFwIHdoZW4gcmVxdWlyZWQsIHByb3ZpZGUgYSBtYXhpbXVtXG5Ac2NyZWVuLXhzLW1heDogICAgICAgICAgICAgIChAc2NyZWVuLXNtLW1pbiAtIDEpO1xuQHNjcmVlbi1zbS1tYXg6ICAgICAgICAgICAgICAoQHNjcmVlbi1tZC1taW4gLSAxKTtcbkBzY3JlZW4tbWQtbWF4OiAgICAgICAgICAgICAgKEBzY3JlZW4tbGctbWluIC0gMSk7XG5cblxuLy89PSBHcmlkIHN5c3RlbVxuLy9cbi8vIyMgRGVmaW5lIHlvdXIgY3VzdG9tIHJlc3BvbnNpdmUgZ3JpZC5cblxuLy8qKiBOdW1iZXIgb2YgY29sdW1ucyBpbiB0aGUgZ3JpZC5cbkBncmlkLWNvbHVtbnM6ICAgICAgICAgICAgICAxMjtcbi8vKiogUGFkZGluZyBiZXR3ZWVuIGNvbHVtbnMuIEdldHMgZGl2aWRlZCBpbiBoYWxmIGZvciB0aGUgbGVmdCBhbmQgcmlnaHQuXG5AZ3JpZC1ndXR0ZXItd2lkdGg6ICAgICAgICAgMzBweDtcbi8vIE5hdmJhciBjb2xsYXBzZVxuLy8qKiBQb2ludCBhdCB3aGljaCB0aGUgbmF2YmFyIGJlY29tZXMgdW5jb2xsYXBzZWQuXG5AZ3JpZC1mbG9hdC1icmVha3BvaW50OiAgICAgQHNjcmVlbi1zbS1taW47XG4vLyoqIFBvaW50IGF0IHdoaWNoIHRoZSBuYXZiYXIgYmVnaW5zIGNvbGxhcHNpbmcuXG5AZ3JpZC1mbG9hdC1icmVha3BvaW50LW1heDogKEBncmlkLWZsb2F0LWJyZWFrcG9pbnQgLSAxKTtcblxuXG4vLz09IENvbnRhaW5lciBzaXplc1xuLy9cbi8vIyMgRGVmaW5lIHRoZSBtYXhpbXVtIHdpZHRoIG9mIGAuY29udGFpbmVyYCBmb3IgZGlmZmVyZW50IHNjcmVlbiBzaXplcy5cblxuLy8gU21hbGwgc2NyZWVuIC8gdGFibGV0XG5AY29udGFpbmVyLXRhYmxldDogICAgICAgICAgICAgKDcyMHB4ICsgQGdyaWQtZ3V0dGVyLXdpZHRoKTtcbi8vKiogRm9yIGBAc2NyZWVuLXNtLW1pbmAgYW5kIHVwLlxuQGNvbnRhaW5lci1zbTogICAgICAgICAgICAgICAgIEBjb250YWluZXItdGFibGV0O1xuXG4vLyBNZWRpdW0gc2NyZWVuIC8gZGVza3RvcFxuQGNvbnRhaW5lci1kZXNrdG9wOiAgICAgICAgICAgICg5NDBweCArIEBncmlkLWd1dHRlci13aWR0aCk7XG4vLyoqIEZvciBgQHNjcmVlbi1tZC1taW5gIGFuZCB1cC5cbkBjb250YWluZXItbWQ6ICAgICAgICAgICAgICAgICBAY29udGFpbmVyLWRlc2t0b3A7XG5cbi8vIExhcmdlIHNjcmVlbiAvIHdpZGUgZGVza3RvcFxuQGNvbnRhaW5lci1sYXJnZS1kZXNrdG9wOiAgICAgICgxMTQwcHggKyBAZ3JpZC1ndXR0ZXItd2lkdGgpO1xuLy8qKiBGb3IgYEBzY3JlZW4tbGctbWluYCBhbmQgdXAuXG5AY29udGFpbmVyLWxnOiAgICAgICAgICAgICAgICAgQGNvbnRhaW5lci1sYXJnZS1kZXNrdG9wO1xuXG5cbi8vPT0gTmF2YmFyXG4vL1xuLy8jI1xuXG4vLyBCYXNpY3Mgb2YgYSBuYXZiYXJcbkBuYXZiYXItaGVpZ2h0OiAgICAgICAgICAgICAgICAgICAgNTBweDtcbkBuYXZiYXItbWFyZ2luLWJvdHRvbTogICAgICAgICAgICAgQGxpbmUtaGVpZ2h0LWNvbXB1dGVkKzEwcHg7XG5AbmF2YmFyLWJvcmRlci1yYWRpdXM6ICAgICAgICAgICAgIEBib3JkZXItcmFkaXVzLWJhc2U7XG5AbmF2YmFyLXBhZGRpbmctaG9yaXpvbnRhbDogICAgICAgIGZsb29yKChAZ3JpZC1ndXR0ZXItd2lkdGggLyAyKSk7XG5AbmF2YmFyLXBhZGRpbmctdmVydGljYWw6ICAgICAgICAgICgoQG5hdmJhci1oZWlnaHQgLSBAbGluZS1oZWlnaHQtY29tcHV0ZWQpIC8gMik7XG5AbmF2YmFyLWNvbGxhcHNlLW1heC1oZWlnaHQ6ICAgICAgIDM0MHB4O1xuXG5AbmF2YmFyLWRlZmF1bHQtY29sb3I6ICAgICAgICAgICAgICM3Nzc7XG5AbmF2YmFyLWRlZmF1bHQtYmc6ICAgICAgICAgICAgICAgICNmOGY4Zjg7XG5AbmF2YmFyLWRlZmF1bHQtYm9yZGVyOiAgICAgICAgICAgIGRhcmtlbihAbmF2YmFyLWRlZmF1bHQtYmcsIDYuNSUpO1xuXG4vLyBOYXZiYXIgbGlua3NcbkBuYXZiYXItZGVmYXVsdC1saW5rLWNvbG9yOiAgICAgICAgICAgICAgICBAZ3JheS1saWdodGVyO1xuQG5hdmJhci1kZWZhdWx0LWxpbmstaG92ZXItY29sb3I6ICAgICAgICAgICM0Q0FGNTA7XG5AbmF2YmFyLWRlZmF1bHQtbGluay1ob3Zlci1iZzogICAgICAgICAgICAgQGdyYXktbGlnaHRlcjtcbkBuYXZiYXItZGVmYXVsdC1saW5rLWFjdGl2ZS1jb2xvcjogICAgICAgICBAZ3JheS1saWdodGVyO1xuQG5hdmJhci1kZWZhdWx0LWxpbmstYWN0aXZlLWJnOiAgICAgICAgICAgIGRhcmtlbihAbmF2YmFyLWRlZmF1bHQtYmcsIDYuNSUpO1xuQG5hdmJhci1kZWZhdWx0LWxpbmstZGlzYWJsZWQtY29sb3I6ICAgICAgICNjY2M7XG5AbmF2YmFyLWRlZmF1bHQtbGluay1kaXNhYmxlZC1iZzogICAgICAgICAgdHJhbnNwYXJlbnQ7XG5cbi8vIE5hdmJhciBicmFuZCBsYWJlbFxuQG5hdmJhci1kZWZhdWx0LWJyYW5kLWNvbG9yOiAgICAgICAgICAgICAgIEBuYXZiYXItZGVmYXVsdC1saW5rLWNvbG9yO1xuQG5hdmJhci1kZWZhdWx0LWJyYW5kLWhvdmVyLWNvbG9yOiAgICAgICAgIGRhcmtlbihAbmF2YmFyLWRlZmF1bHQtYnJhbmQtY29sb3IsIDEwJSk7XG5AbmF2YmFyLWRlZmF1bHQtYnJhbmQtaG92ZXItYmc6ICAgICAgICAgICAgdHJhbnNwYXJlbnQ7XG5cbi8vIE5hdmJhciB0b2dnbGVcbkBuYXZiYXItZGVmYXVsdC10b2dnbGUtaG92ZXItYmc6ICAgICAgICAgICAjZGRkO1xuQG5hdmJhci1kZWZhdWx0LXRvZ2dsZS1pY29uLWJhci1iZzogICAgICAgICM4ODg7XG5AbmF2YmFyLWRlZmF1bHQtdG9nZ2xlLWJvcmRlci1jb2xvcjogICAgICAgI2RkZDtcblxuXG4vLyBJbnZlcnRlZCBuYXZiYXJcbi8vIFJlc2V0IGludmVydGVkIG5hdmJhciBiYXNpY3NcbkBuYXZiYXItaW52ZXJzZS1jb2xvcjogICAgICAgICAgICAgICAgICAgICAgbGlnaHRlbihAZ3JheS1saWdodCwgMTUlKTtcbkBuYXZiYXItaW52ZXJzZS1iZzogICAgICAgICAgICAgICAgICAgICAgICAgIzIyMjtcbkBuYXZiYXItaW52ZXJzZS1ib3JkZXI6ICAgICAgICAgICAgICAgICAgICAgZGFya2VuKEBuYXZiYXItaW52ZXJzZS1iZywgMTAlKTtcblxuLy8gSW52ZXJ0ZWQgbmF2YmFyIGxpbmtzXG5AbmF2YmFyLWludmVyc2UtbGluay1jb2xvcjogICAgICAgICAgICAgICAgIEBncmF5LWxpZ2h0O1xuQG5hdmJhci1pbnZlcnNlLWxpbmstaG92ZXItY29sb3I6ICAgICAgICAgICBAZ3JheS1saWdodGVyO1xuQG5hdmJhci1pbnZlcnNlLWxpbmstaG92ZXItYmc6ICAgICAgICAgICAgICB0cmFuc3BhcmVudDtcbkBuYXZiYXItaW52ZXJzZS1saW5rLWFjdGl2ZS1jb2xvcjogICAgICAgICAgQG5hdmJhci1pbnZlcnNlLWxpbmstaG92ZXItY29sb3I7XG5AbmF2YmFyLWludmVyc2UtbGluay1hY3RpdmUtYmc6ICAgICAgICAgICAgIGRhcmtlbihAbmF2YmFyLWludmVyc2UtYmcsIDEwJSk7XG5AbmF2YmFyLWludmVyc2UtbGluay1kaXNhYmxlZC1jb2xvcjogICAgICAgICM0NDQ7XG5AbmF2YmFyLWludmVyc2UtbGluay1kaXNhYmxlZC1iZzogICAgICAgICAgIHRyYW5zcGFyZW50O1xuXG4vLyBJbnZlcnRlZCBuYXZiYXIgYnJhbmQgbGFiZWxcbkBuYXZiYXItaW52ZXJzZS1icmFuZC1jb2xvcjogICAgICAgICAgICAgICAgQG5hdmJhci1pbnZlcnNlLWxpbmstY29sb3I7XG5AbmF2YmFyLWludmVyc2UtYnJhbmQtaG92ZXItY29sb3I6ICAgICAgICAgIEBncmF5LWxpZ2h0ZXI7XG5AbmF2YmFyLWludmVyc2UtYnJhbmQtaG92ZXItYmc6ICAgICAgICAgICAgIHRyYW5zcGFyZW50O1xuXG4vLyBJbnZlcnRlZCBuYXZiYXIgdG9nZ2xlXG5AbmF2YmFyLWludmVyc2UtdG9nZ2xlLWhvdmVyLWJnOiAgICAgICAgICAgICMzMzM7XG5AbmF2YmFyLWludmVyc2UtdG9nZ2xlLWljb24tYmFyLWJnOiAgICAgICAgIEBncmF5LWxpZ2h0ZXI7XG5AbmF2YmFyLWludmVyc2UtdG9nZ2xlLWJvcmRlci1jb2xvcjogICAgICAgICMzMzM7XG5cblxuLy89PSBOYXZzXG4vL1xuLy8jI1xuXG4vLz09PSBTaGFyZWQgbmF2IHN0eWxlc1xuQG5hdi1saW5rLXBhZGRpbmc6ICAgICAgICAgICAgICAgICAgICAgICAgICAxMHB4IDE1cHg7XG5AbmF2LWxpbmstaG92ZXItYmc6ICAgICAgICAgICAgICAgICAgICAgICAgIEBncmF5LWxpZ2h0ZXI7XG5cbkBuYXYtZGlzYWJsZWQtbGluay1jb2xvcjogICAgICAgICAgICAgICAgICAgQGdyYXktbGlnaHQ7XG5AbmF2LWRpc2FibGVkLWxpbmstaG92ZXItY29sb3I6ICAgICAgICAgICAgIEBncmF5LWxpZ2h0O1xuXG5AbmF2LW9wZW4tbGluay1ob3Zlci1jb2xvcjogICAgICAgICAgICAgICAgIEBncmF5LWxpZ2h0ZXI7XG5cbi8vPT0gVGFic1xuQG5hdi10YWJzLWJvcmRlci1jb2xvcjogICAgICAgICAgICAgICAgICAgICAjZGRkO1xuXG5AbmF2LXRhYnMtbGluay1ob3Zlci1ib3JkZXItY29sb3I6ICAgICAgICAgIEBncmF5LWxpZ2h0ZXI7XG5cbkBuYXYtdGFicy1hY3RpdmUtbGluay1ob3Zlci1iZzogICAgICAgICAgICAgQGJvZHktYmc7XG5AbmF2LXRhYnMtYWN0aXZlLWxpbmstaG92ZXItY29sb3I6ICAgICAgICAgIEBncmF5O1xuQG5hdi10YWJzLWFjdGl2ZS1saW5rLWhvdmVyLWJvcmRlci1jb2xvcjogICAjZGRkO1xuXG5AbmF2LXRhYnMtanVzdGlmaWVkLWxpbmstYm9yZGVyLWNvbG9yOiAgICAgICAgICAgICNkZGQ7XG5AbmF2LXRhYnMtanVzdGlmaWVkLWFjdGl2ZS1saW5rLWJvcmRlci1jb2xvcjogICAgIEBib2R5LWJnO1xuXG4vLz09IFBpbGxzXG5AbmF2LXBpbGxzLWJvcmRlci1yYWRpdXM6ICAgICAgICAgICAgICAgICAgIEBib3JkZXItcmFkaXVzLWJhc2U7XG5AbmF2LXBpbGxzLWFjdGl2ZS1saW5rLWhvdmVyLWJnOiAgICAgICAgICAgIEBjb21wb25lbnQtYWN0aXZlLWJnO1xuQG5hdi1waWxscy1hY3RpdmUtbGluay1ob3Zlci1jb2xvcjogICAgICAgICBAY29tcG9uZW50LWFjdGl2ZS1jb2xvcjtcblxuXG4vLz09IFBhZ2luYXRpb25cbi8vXG4vLyMjXG5cbkBwYWdpbmF0aW9uLWNvbG9yOiAgICAgICAgICAgICAgICAgICAgIEBsaW5rLWNvbG9yO1xuQHBhZ2luYXRpb24tYmc6ICAgICAgICAgICAgICAgICAgICAgICAgQGdyYXktbGlnaHRlcjtcbkBwYWdpbmF0aW9uLWJvcmRlcjogICAgICAgICAgICAgICAgICAgICNkZGQ7XG5cbkBwYWdpbmF0aW9uLWhvdmVyLWNvbG9yOiAgICAgICAgICAgICAgIEBsaW5rLWhvdmVyLWNvbG9yO1xuQHBhZ2luYXRpb24taG92ZXItYmc6ICAgICAgICAgICAgICAgICAgQGdyYXktbGlnaHRlcjtcbkBwYWdpbmF0aW9uLWhvdmVyLWJvcmRlcjogICAgICAgICAgICAgICNkZGQ7XG5cbkBwYWdpbmF0aW9uLWFjdGl2ZS1jb2xvcjogICAgICAgICAgICAgIEBncmF5LWxpZ2h0ZXI7XG5AcGFnaW5hdGlvbi1hY3RpdmUtYmc6ICAgICAgICAgICAgICAgICBAYnJhbmQtcHJpbWFyeTtcbkBwYWdpbmF0aW9uLWFjdGl2ZS1ib3JkZXI6ICAgICAgICAgICAgIEBicmFuZC1wcmltYXJ5O1xuXG5AcGFnaW5hdGlvbi1kaXNhYmxlZC1jb2xvcjogICAgICAgICAgICBAZ3JheS1saWdodDtcbkBwYWdpbmF0aW9uLWRpc2FibGVkLWJnOiAgICAgICAgICAgICAgIEBncmF5LWxpZ2h0ZXI7XG5AcGFnaW5hdGlvbi1kaXNhYmxlZC1ib3JkZXI6ICAgICAgICAgICAjZGRkO1xuXG5cbi8vPT0gUGFnZXJcbi8vXG4vLyMjXG5cbkBwYWdlci1iZzogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBwYWdpbmF0aW9uLWJnO1xuQHBhZ2VyLWJvcmRlcjogICAgICAgICAgICAgICAgICAgICAgICAgQHBhZ2luYXRpb24tYm9yZGVyO1xuQHBhZ2VyLWJvcmRlci1yYWRpdXM6ICAgICAgICAgICAgICAgICAgMTVweDtcblxuQHBhZ2VyLWhvdmVyLWJnOiAgICAgICAgICAgICAgICAgICAgICAgQHBhZ2luYXRpb24taG92ZXItYmc7XG5cbkBwYWdlci1hY3RpdmUtYmc6ICAgICAgICAgICAgICAgICAgICAgIEBwYWdpbmF0aW9uLWFjdGl2ZS1iZztcbkBwYWdlci1hY3RpdmUtY29sb3I6ICAgICAgICAgICAgICAgICAgIEBwYWdpbmF0aW9uLWFjdGl2ZS1jb2xvcjtcblxuQHBhZ2VyLWRpc2FibGVkLWNvbG9yOiAgICAgICAgICAgICAgICAgQHBhZ2luYXRpb24tZGlzYWJsZWQtY29sb3I7XG5cblxuLy89PSBKdW1ib3Ryb25cbi8vXG4vLyMjXG5cbkBqdW1ib3Ryb24tcGFkZGluZzogICAgICAgICAgICAgIDMwcHg7XG5AanVtYm90cm9uLWNvbG9yOiAgICAgICAgICAgICAgICBpbmhlcml0O1xuQGp1bWJvdHJvbi1iZzogICAgICAgICAgICAgICAgICAgQGdyYXktbGlnaHRlcjtcbkBqdW1ib3Ryb24taGVhZGluZy1jb2xvcjogICAgICAgIGluaGVyaXQ7XG5AanVtYm90cm9uLWZvbnQtc2l6ZTogICAgICAgICAgICBjZWlsKChAZm9udC1zaXplLWJhc2UgKiAxLjUpKTtcblxuXG4vLz09IEZvcm0gc3RhdGVzIGFuZCBhbGVydHNcbi8vXG4vLyMjIERlZmluZSBjb2xvcnMgZm9yIGZvcm0gZmVlZGJhY2sgc3RhdGVzIGFuZCwgYnkgZGVmYXVsdCwgYWxlcnRzLlxuXG5Ac3RhdGUtc3VjY2Vzcy10ZXh0OiAgICAgICAgICAgICAjMjE1ZjFlO1xuQHN0YXRlLXN1Y2Nlc3MtYmc6ICAgICAgICAgICAgICAgI2RmZjBkODtcbkBzdGF0ZS1zdWNjZXNzLWJvcmRlcjogICAgICAgICAgIGRhcmtlbihzcGluKEBzdGF0ZS1zdWNjZXNzLWJnLCAtMTApLCA1JSk7XG5cbkBzdGF0ZS1pbmZvLXRleHQ6ICAgICAgICAgICAgICAgICMzMTcwOGY7XG5Ac3RhdGUtaW5mby1iZzogICAgICAgICAgICAgICAgICAjZDllZGY3O1xuQHN0YXRlLWluZm8tYm9yZGVyOiAgICAgICAgICAgICAgZGFya2VuKHNwaW4oQHN0YXRlLWluZm8tYmcsIC0xMCksIDclKTtcblxuQHN0YXRlLXdhcm5pbmctdGV4dDogICAgICAgICAgICAgIzhhNmQzYjtcbkBzdGF0ZS13YXJuaW5nLWJnOiAgICAgICAgICAgICAgICNmY2Y4ZTM7XG5Ac3RhdGUtd2FybmluZy1ib3JkZXI6ICAgICAgICAgICBkYXJrZW4oc3BpbihAc3RhdGUtd2FybmluZy1iZywgLTEwKSwgNSUpO1xuXG5Ac3RhdGUtZGFuZ2VyLXRleHQ6ICAgICAgICAgICAgICAjYTk0NDQyO1xuQHN0YXRlLWRhbmdlci1iZzogICAgICAgICAgICAgICAgI2YyZGVkZTtcbkBzdGF0ZS1kYW5nZXItYm9yZGVyOiAgICAgICAgICAgIGRhcmtlbihzcGluKEBzdGF0ZS1kYW5nZXItYmcsIC0xMCksIDUlKTtcblxuXG4vLz09IFRvb2x0aXBzXG4vL1xuLy8jI1xuXG4vLyoqIFRvb2x0aXAgbWF4IHdpZHRoXG5AdG9vbHRpcC1tYXgtd2lkdGg6ICAgICAgICAgICAyMDBweDtcbi8vKiogVG9vbHRpcCB0ZXh0IGNvbG9yXG5AdG9vbHRpcC1jb2xvcjogICAgICAgICAgICAgICBAZ3JheS1saWdodGVyO1xuLy8qKiBUb29sdGlwIGJhY2tncm91bmQgY29sb3JcbkB0b29sdGlwLWJnOiAgICAgICAgICAgICAgICAgICMwMDA7XG5AdG9vbHRpcC1vcGFjaXR5OiAgICAgICAgICAgICAuOTtcblxuLy8qKiBUb29sdGlwIGFycm93IHdpZHRoXG5AdG9vbHRpcC1hcnJvdy13aWR0aDogICAgICAgICA1cHg7XG4vLyoqIFRvb2x0aXAgYXJyb3cgY29sb3JcbkB0b29sdGlwLWFycm93LWNvbG9yOiAgICAgICAgIEB0b29sdGlwLWJnO1xuXG5cbi8vPT0gUG9wb3ZlcnNcbi8vXG4vLyMjXG5cbi8vKiogUG9wb3ZlciBib2R5IGJhY2tncm91bmQgY29sb3JcbkBwb3BvdmVyLWJnOiAgICAgICAgICAgICAgICAgICAgICAgICAgQGdyYXktbGlnaHRlcjtcbi8vKiogUG9wb3ZlciBtYXhpbXVtIHdpZHRoXG5AcG9wb3Zlci1tYXgtd2lkdGg6ICAgICAgICAgICAgICAgICAgIDI3NnB4O1xuLy8qKiBQb3BvdmVyIGJvcmRlciBjb2xvclxuQHBvcG92ZXItYm9yZGVyLWNvbG9yOiAgICAgICAgICAgICAgICByZ2JhKDAsMCwwLC4yKTtcbi8vKiogUG9wb3ZlciBmYWxsYmFjayBib3JkZXIgY29sb3JcbkBwb3BvdmVyLWZhbGxiYWNrLWJvcmRlci1jb2xvcjogICAgICAgI2NjYztcblxuLy8qKiBQb3BvdmVyIHRpdGxlIGJhY2tncm91bmQgY29sb3JcbkBwb3BvdmVyLXRpdGxlLWJnOiAgICAgICAgICAgICAgICAgICAgZGFya2VuKEBwb3BvdmVyLWJnLCAzJSk7XG5cbi8vKiogUG9wb3ZlciBhcnJvdyB3aWR0aFxuQHBvcG92ZXItYXJyb3ctd2lkdGg6ICAgICAgICAgICAgICAgICAxMHB4O1xuLy8qKiBQb3BvdmVyIGFycm93IGNvbG9yXG5AcG9wb3Zlci1hcnJvdy1jb2xvcjogICAgICAgICAgICAgICAgIEBncmF5LWxpZ2h0ZXI7XG5AcG9wb3Zlci1hcnJvdy1jb2xvcjogICAgICAgICAgICAgICAgIEBwb3BvdmVyLWJnO1xuXG4vLyoqIFBvcG92ZXIgb3V0ZXIgYXJyb3cgd2lkdGhcbkBwb3BvdmVyLWFycm93LW91dGVyLXdpZHRoOiAgICAgICAgICAgKEBwb3BvdmVyLWFycm93LXdpZHRoICsgMSk7XG4vLyoqIFBvcG92ZXIgb3V0ZXIgYXJyb3cgY29sb3JcbkBwb3BvdmVyLWFycm93LW91dGVyLWNvbG9yOiAgICAgICAgICAgZmFkZWluKEBwb3BvdmVyLWJvcmRlci1jb2xvciwgNSUpO1xuLy8qKiBQb3BvdmVyIG91dGVyIGFycm93IGZhbGxiYWNrIGNvbG9yXG5AcG9wb3Zlci1hcnJvdy1vdXRlci1mYWxsYmFjay1jb2xvcjogIGRhcmtlbihAcG9wb3Zlci1mYWxsYmFjay1ib3JkZXItY29sb3IsIDIwJSk7XG5cblxuLy89PSBMYWJlbHNcbi8vXG4vLyMjXG5cbi8vKiogRGVmYXVsdCBsYWJlbCBiYWNrZ3JvdW5kIGNvbG9yXG5AbGFiZWwtZGVmYXVsdC1iZzogICAgICAgICAgICBAZ3JheS1saWdodDtcbi8vKiogUHJpbWFyeSBsYWJlbCBiYWNrZ3JvdW5kIGNvbG9yXG5AbGFiZWwtcHJpbWFyeS1iZzogICAgICAgICAgICBAYnJhbmQtcHJpbWFyeTtcbi8vKiogU3VjY2VzcyBsYWJlbCBiYWNrZ3JvdW5kIGNvbG9yXG5AbGFiZWwtc3VjY2Vzcy1iZzogICAgICAgICAgICBAYnJhbmQtc3VjY2Vzcztcbi8vKiogSW5mbyBsYWJlbCBiYWNrZ3JvdW5kIGNvbG9yXG5AbGFiZWwtaW5mby1iZzogICAgICAgICAgICAgICBAYnJhbmQtaW5mbztcbi8vKiogV2FybmluZyBsYWJlbCBiYWNrZ3JvdW5kIGNvbG9yXG5AbGFiZWwtd2FybmluZy1iZzogICAgICAgICAgICBAYnJhbmQtd2FybmluZztcbi8vKiogRGFuZ2VyIGxhYmVsIGJhY2tncm91bmQgY29sb3JcbkBsYWJlbC1kYW5nZXItYmc6ICAgICAgICAgICAgIEBicmFuZC1kYW5nZXI7XG5cbi8vKiogRGVmYXVsdCBsYWJlbCB0ZXh0IGNvbG9yXG5AbGFiZWwtY29sb3I6ICAgICAgICAgICAgICAgICBAZ3JheS1saWdodGVyO1xuLy8qKiBEZWZhdWx0IHRleHQgY29sb3Igb2YgYSBsaW5rZWQgbGFiZWxcbkBsYWJlbC1saW5rLWhvdmVyLWNvbG9yOiAgICAgIEBncmF5LWxpZ2h0ZXI7XG5cblxuLy89PSBNb2RhbHNcbi8vXG4vLyMjXG5cbi8vKiogUGFkZGluZyBhcHBsaWVkIHRvIHRoZSBtb2RhbCBib2R5XG5AbW9kYWwtaW5uZXItcGFkZGluZzogICAgICAgICAxNXB4O1xuXG4vLyoqIFBhZGRpbmcgYXBwbGllZCB0byB0aGUgbW9kYWwgdGl0bGVcbkBtb2RhbC10aXRsZS1wYWRkaW5nOiAgICAgICAgIDE1cHg7XG4vLyoqIE1vZGFsIHRpdGxlIGxpbmUtaGVpZ2h0XG5AbW9kYWwtdGl0bGUtbGluZS1oZWlnaHQ6ICAgICBAbGluZS1oZWlnaHQtYmFzZTtcblxuLy8qKiBCYWNrZ3JvdW5kIGNvbG9yIG9mIG1vZGFsIGNvbnRlbnQgYXJlYVxuQG1vZGFsLWNvbnRlbnQtYmc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAZ3JheS1saWdodGVyO1xuLy8qKiBNb2RhbCBjb250ZW50IGJvcmRlciBjb2xvclxuQG1vZGFsLWNvbnRlbnQtYm9yZGVyLWNvbG9yOiAgICAgICAgICAgICAgICAgICByZ2JhKDAsMCwwLC4yKTtcbi8vKiogTW9kYWwgY29udGVudCBib3JkZXIgY29sb3IgKipmb3IgSUU4KipcbkBtb2RhbC1jb250ZW50LWZhbGxiYWNrLWJvcmRlci1jb2xvcjogICAgICAgICAgIzk5OTtcblxuLy8qKiBNb2RhbCBiYWNrZHJvcCBiYWNrZ3JvdW5kIGNvbG9yXG5AbW9kYWwtYmFja2Ryb3AtYmc6ICAgICAgICAgICAjMDAwO1xuLy8qKiBNb2RhbCBiYWNrZHJvcCBvcGFjaXR5XG5AbW9kYWwtYmFja2Ryb3Atb3BhY2l0eTogICAgICAuNTtcbi8vKiogTW9kYWwgaGVhZGVyIGJvcmRlciBjb2xvclxuQG1vZGFsLWhlYWRlci1ib3JkZXItY29sb3I6ICAgI2U1ZTVlNTtcbi8vKiogTW9kYWwgZm9vdGVyIGJvcmRlciBjb2xvclxuQG1vZGFsLWZvb3Rlci1ib3JkZXItY29sb3I6ICAgQG1vZGFsLWhlYWRlci1ib3JkZXItY29sb3I7XG5cbkBtb2RhbC1sZzogICAgICAgICAgICAgICAgICAgIDkwMHB4O1xuQG1vZGFsLW1kOiAgICAgICAgICAgICAgICAgICAgNjAwcHg7XG5AbW9kYWwtc206ICAgICAgICAgICAgICAgICAgICAzMDBweDtcblxuXG4vLz09IEFsZXJ0c1xuLy9cbi8vIyMgRGVmaW5lIGFsZXJ0IGNvbG9ycywgYm9yZGVyIHJhZGl1cywgYW5kIHBhZGRpbmcuXG5cbkBhbGVydC1wYWRkaW5nOiAgICAgICAgICAgICAgIDE1cHg7XG5AYWxlcnQtYm9yZGVyLXJhZGl1czogICAgICAgICBAYm9yZGVyLXJhZGl1cy1iYXNlO1xuQGFsZXJ0LWxpbmstZm9udC13ZWlnaHQ6ICAgICAgYm9sZDtcblxuQGFsZXJ0LXN1Y2Nlc3MtYmc6ICAgICAgICAgICAgQHN0YXRlLXN1Y2Nlc3MtYmc7XG5AYWxlcnQtc3VjY2Vzcy10ZXh0OiAgICAgICAgICBAc3RhdGUtc3VjY2Vzcy10ZXh0O1xuQGFsZXJ0LXN1Y2Nlc3MtYm9yZGVyOiAgICAgICAgQHN0YXRlLXN1Y2Nlc3MtYm9yZGVyO1xuXG5AYWxlcnQtaW5mby1iZzogICAgICAgICAgICAgICBAc3RhdGUtaW5mby1iZztcbkBhbGVydC1pbmZvLXRleHQ6ICAgICAgICAgICAgIEBzdGF0ZS1pbmZvLXRleHQ7XG5AYWxlcnQtaW5mby1ib3JkZXI6ICAgICAgICAgICBAc3RhdGUtaW5mby1ib3JkZXI7XG5cbkBhbGVydC13YXJuaW5nLWJnOiAgICAgICAgICAgIEBzdGF0ZS13YXJuaW5nLWJnO1xuQGFsZXJ0LXdhcm5pbmctdGV4dDogICAgICAgICAgQHN0YXRlLXdhcm5pbmctdGV4dDtcbkBhbGVydC13YXJuaW5nLWJvcmRlcjogICAgICAgIEBzdGF0ZS13YXJuaW5nLWJvcmRlcjtcblxuQGFsZXJ0LWRhbmdlci1iZzogICAgICAgICAgICAgQHN0YXRlLWRhbmdlci1iZztcbkBhbGVydC1kYW5nZXItdGV4dDogICAgICAgICAgIEBzdGF0ZS1kYW5nZXItdGV4dDtcbkBhbGVydC1kYW5nZXItYm9yZGVyOiAgICAgICAgIEBzdGF0ZS1kYW5nZXItYm9yZGVyO1xuXG5cbi8vPT0gUHJvZ3Jlc3MgYmFyc1xuLy9cbi8vIyNcblxuLy8qKiBCYWNrZ3JvdW5kIGNvbG9yIG9mIHRoZSB3aG9sZSBwcm9ncmVzcyBjb21wb25lbnRcbkBwcm9ncmVzcy1iZzogICAgICAgICAgICAgICAgICNmNWY1ZjU7XG4vLyoqIFByb2dyZXNzIGJhciB0ZXh0IGNvbG9yXG5AcHJvZ3Jlc3MtYmFyLWNvbG9yOiAgICAgICAgICBAZ3JheS1saWdodGVyO1xuXG4vLyoqIFZhcmlhYmxlIGZvciBzZXR0aW5nIHJvdW5kZWQgY29ybmVycyBvbiBwcm9ncmVzcyBiYXIuXG5AcHJvZ3Jlc3MtYm9yZGVyLXJhZGl1czogICAgICBAYm9yZGVyLXJhZGl1cy1iYXNlO1xuXG4vLyoqIERlZmF1bHQgcHJvZ3Jlc3MgYmFyIGNvbG9yXG5AcHJvZ3Jlc3MtYmFyLWJnOiAgICAgICAgICAgICBAYnJhbmQtcHJpbWFyeTtcbi8vKiogU3VjY2VzcyBwcm9ncmVzcyBiYXIgY29sb3JcbkBwcm9ncmVzcy1iYXItc3VjY2Vzcy1iZzogICAgIEBicmFuZC1zdWNjZXNzO1xuLy8qKiBXYXJuaW5nIHByb2dyZXNzIGJhciBjb2xvclxuQHByb2dyZXNzLWJhci13YXJuaW5nLWJnOiAgICAgQGJyYW5kLXdhcm5pbmc7XG4vLyoqIERhbmdlciBwcm9ncmVzcyBiYXIgY29sb3JcbkBwcm9ncmVzcy1iYXItZGFuZ2VyLWJnOiAgICAgIEBicmFuZC1kYW5nZXI7XG4vLyoqIEluZm8gcHJvZ3Jlc3MgYmFyIGNvbG9yXG5AcHJvZ3Jlc3MtYmFyLWluZm8tYmc6ICAgICAgICBAYnJhbmQtaW5mbztcblxuXG4vLz09IExpc3QgZ3JvdXBcbi8vXG4vLyMjXG5cbi8vKiogQmFja2dyb3VuZCBjb2xvciBvbiBgLmxpc3QtZ3JvdXAtaXRlbWBcbkBsaXN0LWdyb3VwLWJnOiAgICAgICAgICAgICAgICAgQGJvZHktYmc7XG4vLyoqIGAubGlzdC1ncm91cC1pdGVtYCBib3JkZXIgY29sb3JcbkBsaXN0LWdyb3VwLWJvcmRlcjogICAgICAgICAgICAgI2RkZDtcbi8vKiogTGlzdCBncm91cCBib3JkZXIgcmFkaXVzXG5AbGlzdC1ncm91cC1ib3JkZXItcmFkaXVzOiAgICAgIEBib3JkZXItcmFkaXVzLWJhc2U7XG5cbi8vKiogQmFja2dyb3VuZCBjb2xvciBvZiBzaW5nbGUgbGlzdCBpdGVtcyBvbiBob3ZlclxuQGxpc3QtZ3JvdXAtaG92ZXItYmc6ICAgICAgICAgICAjZjVmNWY1O1xuLy8qKiBUZXh0IGNvbG9yIG9mIGFjdGl2ZSBsaXN0IGl0ZW1zXG5AbGlzdC1ncm91cC1hY3RpdmUtY29sb3I6ICAgICAgIEBjb21wb25lbnQtYWN0aXZlLWNvbG9yO1xuLy8qKiBCYWNrZ3JvdW5kIGNvbG9yIG9mIGFjdGl2ZSBsaXN0IGl0ZW1zXG5AbGlzdC1ncm91cC1hY3RpdmUtYmc6ICAgICAgICAgIEBjb21wb25lbnQtYWN0aXZlLWJnO1xuLy8qKiBCb3JkZXIgY29sb3Igb2YgYWN0aXZlIGxpc3QgZWxlbWVudHNcbkBsaXN0LWdyb3VwLWFjdGl2ZS1ib3JkZXI6ICAgICAgQGxpc3QtZ3JvdXAtYWN0aXZlLWJnO1xuLy8qKiBUZXh0IGNvbG9yIGZvciBjb250ZW50IHdpdGhpbiBhY3RpdmUgbGlzdCBpdGVtc1xuQGxpc3QtZ3JvdXAtYWN0aXZlLXRleHQtY29sb3I6ICBsaWdodGVuKEBsaXN0LWdyb3VwLWFjdGl2ZS1iZywgNDAlKTtcblxuLy8qKiBUZXh0IGNvbG9yIG9mIGRpc2FibGVkIGxpc3QgaXRlbXNcbkBsaXN0LWdyb3VwLWRpc2FibGVkLWNvbG9yOiAgICAgIEBncmF5LWxpZ2h0O1xuLy8qKiBCYWNrZ3JvdW5kIGNvbG9yIG9mIGRpc2FibGVkIGxpc3QgaXRlbXNcbkBsaXN0LWdyb3VwLWRpc2FibGVkLWJnOiAgICAgICAgIEBncmF5LWxpZ2h0ZXI7XG4vLyoqIFRleHQgY29sb3IgZm9yIGNvbnRlbnQgd2l0aGluIGRpc2FibGVkIGxpc3QgaXRlbXNcbkBsaXN0LWdyb3VwLWRpc2FibGVkLXRleHQtY29sb3I6IEBsaXN0LWdyb3VwLWRpc2FibGVkLWNvbG9yO1xuXG5AbGlzdC1ncm91cC1saW5rLWNvbG9yOiAgICAgICAgICM1NTU7XG5AbGlzdC1ncm91cC1saW5rLWhvdmVyLWNvbG9yOiAgIEBsaXN0LWdyb3VwLWxpbmstY29sb3I7XG5AbGlzdC1ncm91cC1saW5rLWhlYWRpbmctY29sb3I6ICMzMzM7XG5cblxuLy89PSBQYW5lbHNcbi8vXG4vLyMjXG5cbkBwYW5lbC1iZzogICAgICAgICAgICAgICAgICAgIEBncmF5LWxpZ2h0ZXI7XG5AcGFuZWwtYm9keS1wYWRkaW5nOiAgICAgICAgICAxNXB4O1xuQHBhbmVsLWhlYWRpbmctcGFkZGluZzogICAgICAgMTBweCAxNXB4O1xuQHBhbmVsLWZvb3Rlci1wYWRkaW5nOiAgICAgICAgQHBhbmVsLWhlYWRpbmctcGFkZGluZztcbkBwYW5lbC1ib3JkZXItcmFkaXVzOiAgICAgICAgIEBib3JkZXItcmFkaXVzLWJhc2U7XG5cbi8vKiogQm9yZGVyIGNvbG9yIGZvciBlbGVtZW50cyB3aXRoaW4gcGFuZWxzXG5AcGFuZWwtaW5uZXItYm9yZGVyOiAgICAgICAgICAjY2NjO1xuQHBhbmVsLWZvb3Rlci1iZzogICAgICAgICAgICAgI2RlZGVkZTtcblxuQHBhbmVsLWRlZmF1bHQtdGV4dDogICAgICAgICAgQGdyYXktZGFyaztcbkBwYW5lbC1kZWZhdWx0LWJvcmRlcjogICAgICAgICNkZGQ7XG5AcGFuZWwtZGVmYXVsdC1oZWFkaW5nLWJnOiAgICAjZjVmNWY1O1xuXG5AcGFuZWwtcHJpbWFyeS10ZXh0OiAgICAgICAgICBAZ3JheS1saWdodGVyO1xuQHBhbmVsLXByaW1hcnktYm9yZGVyOiAgICAgICAgQGJyYW5kLXByaW1hcnk7XG5AcGFuZWwtcHJpbWFyeS1oZWFkaW5nLWJnOiAgICBAYnJhbmQtcHJpbWFyeTtcblxuQHBhbmVsLXN1Y2Nlc3MtdGV4dDogICAgICAgICAgQHN0YXRlLXN1Y2Nlc3MtdGV4dDtcbkBwYW5lbC1zdWNjZXNzLWJvcmRlcjogICAgICAgIEBzdGF0ZS1zdWNjZXNzLWJvcmRlcjtcbkBwYW5lbC1zdWNjZXNzLWhlYWRpbmctYmc6ICAgIEBzdGF0ZS1zdWNjZXNzLWJnO1xuXG5AcGFuZWwtaW5mby10ZXh0OiAgICAgICAgICAgICBAZ3JheS1saWdodGVyO1xuQHBhbmVsLWluZm8tYm9yZGVyOiAgICAgICAgICAgZGFya2VuKEBicmFuZC1wcmltYXJ5LCA1JSk7XG5AcGFuZWwtaW5mby1oZWFkaW5nLWJnOiAgICAgICBAYnJhbmQtcHJpbWFyeTtcblxuQHBhbmVsLXdhcm5pbmctdGV4dDogICAgICAgICAgQHN0YXRlLXdhcm5pbmctdGV4dDtcbkBwYW5lbC13YXJuaW5nLWJvcmRlcjogICAgICAgIEBzdGF0ZS13YXJuaW5nLWJvcmRlcjtcbkBwYW5lbC13YXJuaW5nLWhlYWRpbmctYmc6ICAgIEBzdGF0ZS13YXJuaW5nLWJnO1xuXG5AcGFuZWwtZGFuZ2VyLXRleHQ6ICAgICAgICAgICBAc3RhdGUtZGFuZ2VyLXRleHQ7XG5AcGFuZWwtZGFuZ2VyLWJvcmRlcjogICAgICAgICBAc3RhdGUtZGFuZ2VyLWJvcmRlcjtcbkBwYW5lbC1kYW5nZXItaGVhZGluZy1iZzogICAgIEBzdGF0ZS1kYW5nZXItYmc7XG5cblxuLy89PSBUaHVtYm5haWxzXG4vL1xuLy8jI1xuXG4vLyoqIFBhZGRpbmcgYXJvdW5kIHRoZSB0aHVtYm5haWwgaW1hZ2VcbkB0aHVtYm5haWwtcGFkZGluZzogICAgICAgICAgIDRweDtcbi8vKiogVGh1bWJuYWlsIGJhY2tncm91bmQgY29sb3JcbkB0aHVtYm5haWwtYmc6ICAgICAgICAgICAgICAgIEBib2R5LWJnO1xuLy8qKiBUaHVtYm5haWwgYm9yZGVyIGNvbG9yXG5AdGh1bWJuYWlsLWJvcmRlcjogICAgICAgICAgICAjZGRkO1xuLy8qKiBUaHVtYm5haWwgYm9yZGVyIHJhZGl1c1xuQHRodW1ibmFpbC1ib3JkZXItcmFkaXVzOiAgICAgQGJvcmRlci1yYWRpdXMtYmFzZTtcblxuLy8qKiBDdXN0b20gdGV4dCBjb2xvciBmb3IgdGh1bWJuYWlsIGNhcHRpb25zXG5AdGh1bWJuYWlsLWNhcHRpb24tY29sb3I6ICAgICBAdGV4dC1jb2xvcjtcbi8vKiogUGFkZGluZyBhcm91bmQgdGhlIHRodW1ibmFpbCBjYXB0aW9uXG5AdGh1bWJuYWlsLWNhcHRpb24tcGFkZGluZzogICA5cHg7XG5cblxuLy89PSBXZWxsc1xuLy9cbi8vIyNcblxuQHdlbGwtYmc6ICAgICAgICAgICAgICAgICAgICAgI2Y1ZjVmNTtcbkB3ZWxsLWJvcmRlcjogICAgICAgICAgICAgICAgIGRhcmtlbihAd2VsbC1iZywgNyUpO1xuXG5cbi8vPT0gQmFkZ2VzXG4vL1xuLy8jI1xuXG5AYmFkZ2UtY29sb3I6ICAgICAgICAgICAgICAgICBAZ3JheS1saWdodGVyO1xuLy8qKiBMaW5rZWQgYmFkZ2UgdGV4dCBjb2xvciBvbiBob3ZlclxuQGJhZGdlLWxpbmstaG92ZXItY29sb3I6ICAgICAgQGdyYXktbGlnaHRlcjtcbkBiYWRnZS1iZzogICAgICAgICAgICAgICAgICAgIEBncmF5LWxpZ2h0O1xuXG4vLyoqIEJhZGdlIHRleHQgY29sb3IgaW4gYWN0aXZlIG5hdiBsaW5rXG5AYmFkZ2UtYWN0aXZlLWNvbG9yOiAgICAgICAgICBAbGluay1jb2xvcjtcbi8vKiogQmFkZ2UgYmFja2dyb3VuZCBjb2xvciBpbiBhY3RpdmUgbmF2IGxpbmtcbkBiYWRnZS1hY3RpdmUtYmc6ICAgICAgICAgICAgIEBncmF5LWxpZ2h0ZXI7XG5cbkBiYWRnZS1mb250LXdlaWdodDogICAgICAgICAgIGJvbGQ7XG5AYmFkZ2UtbGluZS1oZWlnaHQ6ICAgICAgICAgICAxO1xuQGJhZGdlLWJvcmRlci1yYWRpdXM6ICAgICAgICAgMTBweDtcblxuXG4vLz09IEJyZWFkY3J1bWJzXG4vL1xuLy8jI1xuXG5AYnJlYWRjcnVtYi1wYWRkaW5nLXZlcnRpY2FsOiAgIDhweDtcbkBicmVhZGNydW1iLXBhZGRpbmctaG9yaXpvbnRhbDogMTVweDtcbi8vKiogQnJlYWRjcnVtYiBiYWNrZ3JvdW5kIGNvbG9yXG5AYnJlYWRjcnVtYi1iZzogICAgICAgICAgICAgICAgICNmNWY1ZjU7XG4vLyoqIEJyZWFkY3J1bWIgdGV4dCBjb2xvclxuQGJyZWFkY3J1bWItY29sb3I6ICAgICAgICAgICAgICAjY2NjO1xuLy8qKiBUZXh0IGNvbG9yIG9mIGN1cnJlbnQgcGFnZSBpbiB0aGUgYnJlYWRjcnVtYlxuQGJyZWFkY3J1bWItYWN0aXZlLWNvbG9yOiAgICAgICBAZ3JheS1saWdodDtcbi8vKiogVGV4dHVhbCBzZXBhcmF0b3IgZm9yIGJldHdlZW4gYnJlYWRjcnVtYiBlbGVtZW50c1xuQGJyZWFkY3J1bWItc2VwYXJhdG9yOiAgICAgICAgICBcIi9cIjtcblxuXG4vLz09IENhcm91c2VsXG4vL1xuLy8jI1xuXG5AY2Fyb3VzZWwtdGV4dC1zaGFkb3c6ICAgICAgICAgICAgICAgICAgICAgICAgMCAxcHggMnB4IHJnYmEoMCwwLDAsLjYpO1xuXG5AY2Fyb3VzZWwtY29udHJvbC1jb2xvcjogICAgICAgICAgICAgICAgICAgICAgQGdyYXktbGlnaHRlcjtcbkBjYXJvdXNlbC1jb250cm9sLXdpZHRoOiAgICAgICAgICAgICAgICAgICAgICAxNSU7XG5AY2Fyb3VzZWwtY29udHJvbC1vcGFjaXR5OiAgICAgICAgICAgICAgICAgICAgLjU7XG5AY2Fyb3VzZWwtY29udHJvbC1mb250LXNpemU6ICAgICAgICAgICAgICAgICAgMjBweDtcblxuQGNhcm91c2VsLWluZGljYXRvci1hY3RpdmUtYmc6ICAgICAgICAgICAgICAgIEBncmF5LWxpZ2h0ZXI7XG5AY2Fyb3VzZWwtaW5kaWNhdG9yLWJvcmRlci1jb2xvcjogICAgICAgICAgICAgQGdyYXktbGlnaHRlcjtcblxuQGNhcm91c2VsLWNhcHRpb24tY29sb3I6ICAgICAgICAgICAgICAgICAgICAgIEBncmF5LWxpZ2h0ZXI7XG5cblxuLy89PSBDbG9zZVxuLy9cbi8vIyNcblxuQGNsb3NlLWZvbnQtd2VpZ2h0OiAgICAgICAgICAgYm9sZDtcbkBjbG9zZS1jb2xvcjogICAgICAgICAgICAgICAgICMwMDA7XG5AY2xvc2UtdGV4dC1zaGFkb3c6ICAgICAgICAgICAwIDFweCAwIEBncmF5LWxpZ2h0ZXI7XG5cblxuLy89PSBDb2RlXG4vL1xuLy8jI1xuXG5AY29kZS1jb2xvcjogICAgICAgICAgICAgICAgICAjYzcyNTRlO1xuQGNvZGUtYmc6ICAgICAgICAgICAgICAgICAgICAgI2Y5ZjJmNDtcblxuQGtiZC1jb2xvcjogICAgICAgICAgICAgICAgICAgQGdyYXktbGlnaHRlcjtcbkBrYmQtYmc6ICAgICAgICAgICAgICAgICAgICAgICMzMzM7XG5cbkBwcmUtYmc6ICAgICAgICAgICAgICAgICAgICAgICNmNWY1ZjU7XG5AcHJlLWNvbG9yOiAgICAgICAgICAgICAgICAgICBAZ3JheS1kYXJrO1xuQHByZS1ib3JkZXItY29sb3I6ICAgICAgICAgICAgI2NjYztcbkBwcmUtc2Nyb2xsYWJsZS1tYXgtaGVpZ2h0OiAgIDM0MHB4O1xuXG5cbi8vPT0gVHlwZVxuLy9cbi8vIyNcblxuLy8qKiBIb3Jpem9udGFsIG9mZnNldCBmb3IgZm9ybXMgYW5kIGxpc3RzLlxuQGNvbXBvbmVudC1vZmZzZXQtaG9yaXpvbnRhbDogMTgwcHg7XG4vLyoqIFRleHQgbXV0ZWQgY29sb3JcbkB0ZXh0LW11dGVkOiAgICAgICAgICAgICAgICAgIEBncmF5LWxpZ2h0O1xuLy8qKiBBYmJyZXZpYXRpb25zIGFuZCBhY3JvbnltcyBib3JkZXIgY29sb3JcbkBhYmJyLWJvcmRlci1jb2xvcjogICAgICAgICAgIEBncmF5LWxpZ2h0O1xuLy8qKiBIZWFkaW5ncyBzbWFsbCBjb2xvclxuQGhlYWRpbmdzLXNtYWxsLWNvbG9yOiAgICAgICAgQGdyYXktbGlnaHQ7XG4vLyoqIEJsb2NrcXVvdGUgc21hbGwgY29sb3JcbkBibG9ja3F1b3RlLXNtYWxsLWNvbG9yOiAgICAgIEBncmF5LWxpZ2h0O1xuLy8qKiBCbG9ja3F1b3RlIGZvbnQgc2l6ZVxuQGJsb2NrcXVvdGUtZm9udC1zaXplOiAgICAgICAgKEBmb250LXNpemUtYmFzZSAqIDEuMjUpO1xuLy8qKiBCbG9ja3F1b3RlIGJvcmRlciBjb2xvclxuQGJsb2NrcXVvdGUtYm9yZGVyLWNvbG9yOiAgICAgQGdyYXktbGlnaHRlcjtcbi8vKiogUGFnZSBoZWFkZXIgYm9yZGVyIGNvbG9yXG5AcGFnZS1oZWFkZXItYm9yZGVyLWNvbG9yOiAgICBAZ3JheS1saWdodGVyO1xuLy8qKiBXaWR0aCBvZiBob3Jpem9udGFsIGRlc2NyaXB0aW9uIGxpc3QgdGl0bGVzXG5AZGwtaG9yaXpvbnRhbC1vZmZzZXQ6ICAgICAgICBAY29tcG9uZW50LW9mZnNldC1ob3Jpem9udGFsO1xuLy8qKiBIb3Jpem9udGFsIGxpbmUgY29sb3IuXG5AaHItYm9yZGVyOiAgICAgICAgICAgICAgICAgICBAZ3JheS1saWdodGVyO1xuIiwiLy8gV2ViS2l0LXN0eWxlIGZvY3VzXG5cbi50YWItZm9jdXMoKSB7XG4gIC8vIERlZmF1bHRcbiAgb3V0bGluZTogdGhpbiBkb3R0ZWQ7XG4gIC8vIFdlYktpdFxuICBvdXRsaW5lOiA1cHggYXV0byAtd2Via2l0LWZvY3VzLXJpbmctY29sb3I7XG4gIG91dGxpbmUtb2Zmc2V0OiAtMnB4O1xufVxuIiwiLy9cbi8vIFRodW1ibmFpbHNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cblxuLy8gTWl4aW4gYW5kIGFkanVzdCB0aGUgcmVndWxhciBpbWFnZSBjbGFzc1xuLnRodW1ibmFpbCB7XG4gIGRpc3BsYXk6IGJsb2NrO1xuICBwYWRkaW5nOiBAdGh1bWJuYWlsLXBhZGRpbmc7XG4gIG1hcmdpbi1ib3R0b206IEBsaW5lLWhlaWdodC1jb21wdXRlZDtcbiAgbGluZS1oZWlnaHQ6IEBsaW5lLWhlaWdodC1iYXNlO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiBAdGh1bWJuYWlsLWJnO1xuICBib3JkZXI6IDFweCBzb2xpZCBAdGh1bWJuYWlsLWJvcmRlcjtcbiAgYm9yZGVyLXJhZGl1czogQHRodW1ibmFpbC1ib3JkZXItcmFkaXVzO1xuICAudHJhbnNpdGlvbihib3JkZXIgLjJzIGVhc2UtaW4tb3V0KTtcblxuICA+IGltZyxcbiAgYSA+IGltZyB7XG4gICAgJjpleHRlbmQoLmltZy1yZXNwb25zaXZlKTtcbiAgICBtYXJnaW4tbGVmdDogYXV0bztcbiAgICBtYXJnaW4tcmlnaHQ6IGF1dG87XG4gIH1cblxuICAvLyBBZGQgYSBob3ZlciBzdGF0ZSBmb3IgbGlua2VkIHZlcnNpb25zIG9ubHlcbiAgYSY6aG92ZXIsXG4gIGEmOmZvY3VzLFxuICBhJi5hY3RpdmUge1xuICAgIGJvcmRlci1jb2xvcjogQGxpbmstY29sb3I7XG4gIH1cblxuICAvLyBJbWFnZSBjYXB0aW9uc1xuICAuY2FwdGlvbiB7XG4gICAgcGFkZGluZzogQHRodW1ibmFpbC1jYXB0aW9uLXBhZGRpbmc7XG4gICAgY29sb3I6IEB0aHVtYm5haWwtY2FwdGlvbi1jb2xvcjtcbiAgfVxufVxuIiwiLy9cbi8vIENhcm91c2VsXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5cbi8vIFdyYXBwZXIgZm9yIHRoZSBzbGlkZSBjb250YWluZXIgYW5kIGluZGljYXRvcnNcbi5jYXJvdXNlbCB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbn1cblxuLmNhcm91c2VsLWlubmVyIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICBvdmVyZmxvdzogaGlkZGVuO1xuICB3aWR0aDogMTAwJTtcblxuICA+IC5pdGVtIHtcbiAgICBkaXNwbGF5OiBub25lO1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICAudHJhbnNpdGlvbiguNnMgZWFzZS1pbi1vdXQgbGVmdCk7XG5cbiAgICAvLyBBY2NvdW50IGZvciBqYW5raXR1ZGUgb24gaW1hZ2VzXG4gICAgPiBpbWcsXG4gICAgPiBhID4gaW1nIHtcbiAgICAgICY6ZXh0ZW5kKC5pbWctcmVzcG9uc2l2ZSk7XG4gICAgICBsaW5lLWhlaWdodDogMTtcbiAgICB9XG5cbiAgICAvLyBXZWJLaXQgQ1NTMyB0cmFuc2Zvcm1zIGZvciBzdXBwb3J0ZWQgZGV2aWNlc1xuICAgIEBtZWRpYSBhbGwgYW5kICh0cmFuc2Zvcm0tM2QpLCAoLXdlYmtpdC10cmFuc2Zvcm0tM2QpIHtcbiAgICAgIHRyYW5zaXRpb246IHRyYW5zZm9ybSAuNnMgZWFzZS1pbi1vdXQ7XG4gICAgICBiYWNrZmFjZS12aXNpYmlsaXR5OiBoaWRkZW47XG4gICAgICBwZXJzcGVjdGl2ZTogMTAwMDtcblxuICAgICAgJi5uZXh0LFxuICAgICAgJi5hY3RpdmUucmlnaHQge1xuICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDEwMCUsIDAsIDApO1xuICAgICAgICBsZWZ0OiAwO1xuICAgICAgfVxuICAgICAgJi5wcmV2LFxuICAgICAgJi5hY3RpdmUubGVmdCB7XG4gICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlM2QoLTEwMCUsIDAsIDApO1xuICAgICAgICBsZWZ0OiAwO1xuICAgICAgfVxuICAgICAgJi5uZXh0LmxlZnQsXG4gICAgICAmLnByZXYucmlnaHQsXG4gICAgICAmLmFjdGl2ZSB7XG4gICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlM2QoMCwgMCwgMCk7XG4gICAgICAgIGxlZnQ6IDA7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgPiAuYWN0aXZlLFxuICA+IC5uZXh0LFxuICA+IC5wcmV2IHtcbiAgICBkaXNwbGF5OiBibG9jaztcbiAgfVxuXG4gID4gLmFjdGl2ZSB7XG4gICAgbGVmdDogMDtcbiAgfVxuXG4gID4gLm5leHQsXG4gID4gLnByZXYge1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICB0b3A6IDA7XG4gICAgd2lkdGg6IDEwMCU7XG4gIH1cblxuICA+IC5uZXh0IHtcbiAgICBsZWZ0OiAxMDAlO1xuICB9XG4gID4gLnByZXYge1xuICAgIGxlZnQ6IC0xMDAlO1xuICB9XG4gID4gLm5leHQubGVmdCxcbiAgPiAucHJldi5yaWdodCB7XG4gICAgbGVmdDogMDtcbiAgfVxuXG4gID4gLmFjdGl2ZS5sZWZ0IHtcbiAgICBsZWZ0OiAtMTAwJTtcbiAgfVxuICA+IC5hY3RpdmUucmlnaHQge1xuICAgIGxlZnQ6IDEwMCU7XG4gIH1cblxufVxuXG4vLyBMZWZ0L3JpZ2h0IGNvbnRyb2xzIGZvciBuYXZcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4uY2Fyb3VzZWwtY29udHJvbCB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgdG9wOiAwO1xuICBsZWZ0OiAwO1xuICBib3R0b206IDA7XG4gIHdpZHRoOiBAY2Fyb3VzZWwtY29udHJvbC13aWR0aDtcbiAgLm9wYWNpdHkoQGNhcm91c2VsLWNvbnRyb2wtb3BhY2l0eSk7XG4gIGZvbnQtc2l6ZTogQGNhcm91c2VsLWNvbnRyb2wtZm9udC1zaXplO1xuICBjb2xvcjogQGNhcm91c2VsLWNvbnRyb2wtY29sb3I7XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgdGV4dC1zaGFkb3c6IEBjYXJvdXNlbC10ZXh0LXNoYWRvdztcbiAgLy8gV2UgY2FuJ3QgaGF2ZSB0aGlzIHRyYW5zaXRpb24gaGVyZSBiZWNhdXNlIFdlYktpdCBjYW5jZWxzIHRoZSBjYXJvdXNlbFxuICAvLyBhbmltYXRpb24gaWYgeW91IHRyaXAgdGhpcyB3aGlsZSBpbiB0aGUgbWlkZGxlIG9mIGFub3RoZXIgYW5pbWF0aW9uLlxuXG4gIC8vIFNldCBncmFkaWVudHMgZm9yIGJhY2tncm91bmRzXG4gICYubGVmdCB7XG4gICAgI2dyYWRpZW50ID4gLmhvcml6b250YWwoQHN0YXJ0LWNvbG9yOiByZ2JhKDAsMCwwLC41KTsgQGVuZC1jb2xvcjogcmdiYSgwLDAsMCwuMDAwMSkpO1xuICB9XG4gICYucmlnaHQge1xuICAgIGxlZnQ6IGF1dG87XG4gICAgcmlnaHQ6IDA7XG4gICAgI2dyYWRpZW50ID4gLmhvcml6b250YWwoQHN0YXJ0LWNvbG9yOiByZ2JhKDAsMCwwLC4wMDAxKTsgQGVuZC1jb2xvcjogcmdiYSgwLDAsMCwuNSkpO1xuICB9XG5cbiAgLy8gSG92ZXIvZm9jdXMgc3RhdGVcbiAgJjpob3ZlcixcbiAgJjpmb2N1cyB7XG4gICAgb3V0bGluZTogMDtcbiAgICBjb2xvcjogQGNhcm91c2VsLWNvbnRyb2wtY29sb3I7XG4gICAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xuICAgIC5vcGFjaXR5KC45KTtcbiAgfVxuXG4gIC8vIFRvZ2dsZXNcbiAgLmljb24tcHJldixcbiAgLmljb24tbmV4dCxcbiAgLmdseXBoaWNvbi1jaGV2cm9uLWxlZnQsXG4gIC5nbHlwaGljb24tY2hldnJvbi1yaWdodCB7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIHRvcDogNTAlO1xuICAgIHotaW5kZXg6IDU7XG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICB9XG4gIC5pY29uLXByZXYsXG4gIC5nbHlwaGljb24tY2hldnJvbi1sZWZ0IHtcbiAgICBsZWZ0OiA1MCU7XG4gICAgbWFyZ2luLWxlZnQ6IC0xMHB4O1xuICB9XG4gIC5pY29uLW5leHQsXG4gIC5nbHlwaGljb24tY2hldnJvbi1yaWdodCB7XG4gICAgcmlnaHQ6IDUwJTtcbiAgICBtYXJnaW4tcmlnaHQ6IC0xMHB4O1xuICB9XG4gIC5pY29uLXByZXYsXG4gIC5pY29uLW5leHQge1xuICAgIHdpZHRoOiAgMjBweDtcbiAgICBoZWlnaHQ6IDIwcHg7XG4gICAgbWFyZ2luLXRvcDogLTEwcHg7XG4gICAgZm9udC1mYW1pbHk6IHNlcmlmO1xuICB9XG5cblxuICAuaWNvbi1wcmV2IHtcbiAgICAmOmJlZm9yZSB7XG4gICAgICBjb250ZW50OiAnXFwyMDM5JzsvLyBTSU5HTEUgTEVGVC1QT0lOVElORyBBTkdMRSBRVU9UQVRJT04gTUFSSyAoVSsyMDM5KVxuICAgIH1cbiAgfVxuICAuaWNvbi1uZXh0IHtcbiAgICAmOmJlZm9yZSB7XG4gICAgICBjb250ZW50OiAnXFwyMDNhJzsvLyBTSU5HTEUgUklHSFQtUE9JTlRJTkcgQU5HTEUgUVVPVEFUSU9OIE1BUksgKFUrMjAzQSlcbiAgICB9XG4gIH1cbn1cblxuLy8gT3B0aW9uYWwgaW5kaWNhdG9yIHBpcHNcbi8vXG4vLyBBZGQgYW4gdW5vcmRlcmVkIGxpc3Qgd2l0aCB0aGUgZm9sbG93aW5nIGNsYXNzIGFuZCBhZGQgYSBsaXN0IGl0ZW0gZm9yIGVhY2hcbi8vIHNsaWRlIHlvdXIgY2Fyb3VzZWwgaG9sZHMuXG5cbi5jYXJvdXNlbC1pbmRpY2F0b3JzIHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICBib3R0b206IDEwcHg7XG4gIGxlZnQ6IDUwJTtcbiAgei1pbmRleDogMTU7XG4gIHdpZHRoOiA2MCU7XG4gIG1hcmdpbi1sZWZ0OiAtMzAlO1xuICBwYWRkaW5nLWxlZnQ6IDA7XG4gIGxpc3Qtc3R5bGU6IG5vbmU7XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcblxuICBsaSB7XG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgIHdpZHRoOiAgMTBweDtcbiAgICBoZWlnaHQ6IDEwcHg7XG4gICAgbWFyZ2luOiAxcHg7XG4gICAgdGV4dC1pbmRlbnQ6IC05OTlweDtcbiAgICBib3JkZXI6IDFweCBzb2xpZCBAY2Fyb3VzZWwtaW5kaWNhdG9yLWJvcmRlci1jb2xvcjtcbiAgICBib3JkZXItcmFkaXVzOiAxMHB4O1xuICAgIGN1cnNvcjogcG9pbnRlcjtcblxuICAgIC8vIElFOC05IGhhY2sgZm9yIGV2ZW50IGhhbmRsaW5nXG4gICAgLy9cbiAgICAvLyBJbnRlcm5ldCBFeHBsb3JlciA4LTkgZG9lcyBub3Qgc3VwcG9ydCBjbGlja3Mgb24gZWxlbWVudHMgd2l0aG91dCBhIHNldFxuICAgIC8vIGBiYWNrZ3JvdW5kLWNvbG9yYC4gV2UgY2Fubm90IHVzZSBgZmlsdGVyYCBzaW5jZSB0aGF0J3Mgbm90IHZpZXdlZCBhcyBhXG4gICAgLy8gYmFja2dyb3VuZCBjb2xvciBieSB0aGUgYnJvd3Nlci4gVGh1cywgYSBoYWNrIGlzIG5lZWRlZC5cbiAgICAvL1xuICAgIC8vIEZvciBJRTgsIHdlIHNldCBzb2xpZCBibGFjayBhcyBpdCBkb2Vzbid0IHN1cHBvcnQgYHJnYmEoKWAuIEZvciBJRTksIHdlXG4gICAgLy8gc2V0IGFscGhhIHRyYW5zcGFyZW5jeSBmb3IgdGhlIGJlc3QgcmVzdWx0cyBwb3NzaWJsZS5cbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjMDAwIFxcOTsgLy8gSUU4XG4gICAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgwLDAsMCwwKTsgLy8gSUU5XG4gIH1cbiAgLmFjdGl2ZSB7XG4gICAgbWFyZ2luOiAwO1xuICAgIHdpZHRoOiAgMTJweDtcbiAgICBoZWlnaHQ6IDEycHg7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogQGNhcm91c2VsLWluZGljYXRvci1hY3RpdmUtYmc7XG4gIH1cbn1cblxuLy8gT3B0aW9uYWwgY2FwdGlvbnNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBIaWRkZW4gYnkgZGVmYXVsdCBmb3Igc21hbGxlciB2aWV3cG9ydHNcbi5jYXJvdXNlbC1jYXB0aW9uIHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICBsZWZ0OiAxNSU7XG4gIHJpZ2h0OiAxNSU7XG4gIGJvdHRvbTogMjBweDtcbiAgei1pbmRleDogMTA7XG4gIHBhZGRpbmctdG9wOiAyMHB4O1xuICBwYWRkaW5nLWJvdHRvbTogMjBweDtcbiAgY29sb3I6IEBjYXJvdXNlbC1jYXB0aW9uLWNvbG9yO1xuICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gIHRleHQtc2hhZG93OiBAY2Fyb3VzZWwtdGV4dC1zaGFkb3c7XG4gICYgLmJ0biB7XG4gICAgdGV4dC1zaGFkb3c6IG5vbmU7IC8vIE5vIHNoYWRvdyBmb3IgYnV0dG9uIGVsZW1lbnRzIGluIGNhcm91c2VsLWNhcHRpb25cbiAgfVxufVxuXG5cbi8vIFNjYWxlIHVwIGNvbnRyb2xzIGZvciB0YWJsZXRzIGFuZCB1cFxuQG1lZGlhIHNjcmVlbiBhbmQgKG1pbi13aWR0aDogQHNjcmVlbi1zbS1taW4pIHtcblxuICAvLyBTY2FsZSB1cCB0aGUgY29udHJvbHMgYSBzbWlkZ2VcbiAgLmNhcm91c2VsLWNvbnRyb2wge1xuICAgIC5nbHlwaGljb24tY2hldnJvbi1sZWZ0LFxuICAgIC5nbHlwaGljb24tY2hldnJvbi1yaWdodCxcbiAgICAuaWNvbi1wcmV2LFxuICAgIC5pY29uLW5leHQge1xuICAgICAgd2lkdGg6IDMwcHg7XG4gICAgICBoZWlnaHQ6IDMwcHg7XG4gICAgICBtYXJnaW4tdG9wOiAtMTVweDtcbiAgICAgIGZvbnQtc2l6ZTogMzBweDtcbiAgICB9XG4gICAgLmdseXBoaWNvbi1jaGV2cm9uLWxlZnQsXG4gICAgLmljb24tcHJldiB7XG4gICAgICBtYXJnaW4tbGVmdDogLTE1cHg7XG4gICAgfVxuICAgIC5nbHlwaGljb24tY2hldnJvbi1yaWdodCxcbiAgICAuaWNvbi1uZXh0IHtcbiAgICAgIG1hcmdpbi1yaWdodDogLTE1cHg7XG4gICAgfVxuICB9XG5cbiAgLy8gU2hvdyBhbmQgbGVmdCBhbGlnbiB0aGUgY2FwdGlvbnNcbiAgLmNhcm91c2VsLWNhcHRpb24ge1xuICAgIGxlZnQ6IDIwJTtcbiAgICByaWdodDogMjAlO1xuICAgIHBhZGRpbmctYm90dG9tOiAzMHB4O1xuICB9XG5cbiAgLy8gTW92ZSB1cCB0aGUgaW5kaWNhdG9yc1xuICAuY2Fyb3VzZWwtaW5kaWNhdG9ycyB7XG4gICAgYm90dG9tOiAyMHB4O1xuICB9XG59XG4iLCIvLyBJbWFnZSBNaXhpbnNcbi8vIC0gUmVzcG9uc2l2ZSBpbWFnZVxuLy8gLSBSZXRpbmEgaW1hZ2VcblxuXG4vLyBSZXNwb25zaXZlIGltYWdlXG4vL1xuLy8gS2VlcCBpbWFnZXMgZnJvbSBzY2FsaW5nIGJleW9uZCB0aGUgd2lkdGggb2YgdGhlaXIgcGFyZW50cy5cbi5pbWctcmVzcG9uc2l2ZShAZGlzcGxheTogYmxvY2spIHtcbiAgZGlzcGxheTogQGRpc3BsYXk7XG4gIG1heC13aWR0aDogMTAwJTsgLy8gUGFydCAxOiBTZXQgYSBtYXhpbXVtIHJlbGF0aXZlIHRvIHRoZSBwYXJlbnRcbiAgaGVpZ2h0OiBhdXRvOyAvLyBQYXJ0IDI6IFNjYWxlIHRoZSBoZWlnaHQgYWNjb3JkaW5nIHRvIHRoZSB3aWR0aCwgb3RoZXJ3aXNlIHlvdSBnZXQgc3RyZXRjaGluZ1xufVxuXG5cbi8vIFJldGluYSBpbWFnZVxuLy9cbi8vIFNob3J0IHJldGluYSBtaXhpbiBmb3Igc2V0dGluZyBiYWNrZ3JvdW5kLWltYWdlIGFuZCAtc2l6ZS4gTm90ZSB0aGF0IHRoZVxuLy8gc3BlbGxpbmcgb2YgYG1pbi0tbW96LWRldmljZS1waXhlbC1yYXRpb2AgaXMgaW50ZW50aW9uYWwuXG4uaW1nLXJldGluYShAZmlsZS0xeDsgQGZpbGUtMng7IEB3aWR0aC0xeDsgQGhlaWdodC0xeCkge1xuICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoXCJAe2ZpbGUtMXh9XCIpO1xuXG4gIEBtZWRpYVxuICBvbmx5IHNjcmVlbiBhbmQgKC13ZWJraXQtbWluLWRldmljZS1waXhlbC1yYXRpbzogMiksXG4gIG9ubHkgc2NyZWVuIGFuZCAoICAgbWluLS1tb3otZGV2aWNlLXBpeGVsLXJhdGlvOiAyKSxcbiAgb25seSBzY3JlZW4gYW5kICggICAgIC1vLW1pbi1kZXZpY2UtcGl4ZWwtcmF0aW86IDIvMSksXG4gIG9ubHkgc2NyZWVuIGFuZCAoICAgICAgICBtaW4tZGV2aWNlLXBpeGVsLXJhdGlvOiAyKSxcbiAgb25seSBzY3JlZW4gYW5kICggICAgICAgICAgICAgICAgbWluLXJlc29sdXRpb246IDE5MmRwaSksXG4gIG9ubHkgc2NyZWVuIGFuZCAoICAgICAgICAgICAgICAgIG1pbi1yZXNvbHV0aW9uOiAyZHBweCkge1xuICAgIGJhY2tncm91bmQtaW1hZ2U6IHVybChcIkB7ZmlsZS0yeH1cIik7XG4gICAgYmFja2dyb3VuZC1zaXplOiBAd2lkdGgtMXggQGhlaWdodC0xeDtcbiAgfVxufVxuIiwiLy9cbi8vIFR5cG9ncmFwaHlcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cblxuLy8gSGVhZGluZ3Ncbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuaDEsIGgyLCBoMywgaDQsIGg1LCBoNixcbi5oMSwgLmgyLCAuaDMsIC5oNCwgLmg1LCAuaDYge1xuICBmb250LWZhbWlseTogQGhlYWRpbmdzLWZvbnQtZmFtaWx5O1xuICBmb250LXdlaWdodDogQGhlYWRpbmdzLWZvbnQtd2VpZ2h0O1xuICBsaW5lLWhlaWdodDogQGhlYWRpbmdzLWxpbmUtaGVpZ2h0O1xuICBjb2xvcjogQGhlYWRpbmdzLWNvbG9yO1xuXG4gIHNtYWxsLFxuICAuc21hbGwge1xuICAgIGZvbnQtd2VpZ2h0OiBub3JtYWw7XG4gICAgbGluZS1oZWlnaHQ6IDE7XG4gICAgY29sb3I6IEBoZWFkaW5ncy1zbWFsbC1jb2xvcjtcbiAgfVxufVxuXG5oMSwgLmgxLFxuaDIsIC5oMixcbmgzLCAuaDMge1xuICBtYXJnaW4tdG9wOiBAbGluZS1oZWlnaHQtY29tcHV0ZWQ7XG4gIG1hcmdpbi1ib3R0b206IChAbGluZS1oZWlnaHQtY29tcHV0ZWQgLyAyKTtcblxuICBzbWFsbCxcbiAgLnNtYWxsIHtcbiAgICBmb250LXNpemU6IDY1JTtcbiAgfVxufVxuaDQsIC5oNCxcbmg1LCAuaDUsXG5oNiwgLmg2IHtcbiAgbWFyZ2luLXRvcDogKEBsaW5lLWhlaWdodC1jb21wdXRlZCAvIDIpO1xuICBtYXJnaW4tYm90dG9tOiAoQGxpbmUtaGVpZ2h0LWNvbXB1dGVkIC8gMik7XG5cbiAgc21hbGwsXG4gIC5zbWFsbCB7XG4gICAgZm9udC1zaXplOiA3NSU7XG4gIH1cbn1cblxuaDEsIC5oMSB7IGZvbnQtc2l6ZTogQGZvbnQtc2l6ZS1oMTsgfVxuaDIsIC5oMiB7IGZvbnQtc2l6ZTogQGZvbnQtc2l6ZS1oMjsgfVxuaDMsIC5oMyB7IGZvbnQtc2l6ZTogQGZvbnQtc2l6ZS1oMzsgfVxuaDQsIC5oNCB7IGZvbnQtc2l6ZTogQGZvbnQtc2l6ZS1oNDsgfVxuaDUsIC5oNSB7IGZvbnQtc2l6ZTogQGZvbnQtc2l6ZS1oNTsgfVxuaDYsIC5oNiB7IGZvbnQtc2l6ZTogQGZvbnQtc2l6ZS1oNjsgfVxuXG5cbi8vIEJvZHkgdGV4dFxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5wIHtcbiAgbWFyZ2luOiAwIDAgKEBsaW5lLWhlaWdodC1jb21wdXRlZCAvIDIpO1xufVxuXG4ubGVhZCB7XG4gIG1hcmdpbi1ib3R0b206IEBsaW5lLWhlaWdodC1jb21wdXRlZDtcbiAgZm9udC1zaXplOiBmbG9vcigoQGZvbnQtc2l6ZS1iYXNlICogMS4xNSkpO1xuICBmb250LXdlaWdodDogMzAwO1xuICBsaW5lLWhlaWdodDogMS40O1xuXG4gIEBtZWRpYSAobWluLXdpZHRoOiBAc2NyZWVuLXNtLW1pbikge1xuICAgIGZvbnQtc2l6ZTogKEBmb250LXNpemUtYmFzZSAqIDEuNSk7XG4gIH1cbn1cblxuXG4vLyBFbXBoYXNpcyAmIG1pc2Ncbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLy8gRXg6ICgxMnB4IHNtYWxsIGZvbnQgLyAxNHB4IGJhc2UgZm9udCkgKiAxMDAlID0gYWJvdXQgODUlXG5zbWFsbCxcbi5zbWFsbCB7XG4gIGZvbnQtc2l6ZTogZmxvb3IoKDEwMCUgKiBAZm9udC1zaXplLXNtYWxsIC8gQGZvbnQtc2l6ZS1iYXNlKSk7XG59XG5cbm1hcmssXG4ubWFyayB7XG4gIGJhY2tncm91bmQtY29sb3I6IEBzdGF0ZS13YXJuaW5nLWJnO1xuICBwYWRkaW5nOiAuMmVtO1xufVxuXG4vLyBBbGlnbm1lbnRcbi50ZXh0LWxlZnQgICAgICAgICAgIHsgdGV4dC1hbGlnbjogbGVmdDsgfVxuLnRleHQtcmlnaHQgICAgICAgICAgeyB0ZXh0LWFsaWduOiByaWdodDsgfVxuLnRleHQtY2VudGVyICAgICAgICAgeyB0ZXh0LWFsaWduOiBjZW50ZXI7IH1cbi50ZXh0LWp1c3RpZnkgICAgICAgIHsgdGV4dC1hbGlnbjoganVzdGlmeTsgfVxuLnRleHQtbm93cmFwICAgICAgICAgeyB3aGl0ZS1zcGFjZTogbm93cmFwOyB9XG5cbi8vIFRyYW5zZm9ybWF0aW9uXG4udGV4dC1sb3dlcmNhc2UgICAgICB7IHRleHQtdHJhbnNmb3JtOiBsb3dlcmNhc2U7IH1cbi50ZXh0LXVwcGVyY2FzZSAgICAgIHsgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsgfVxuLnRleHQtY2FwaXRhbGl6ZSAgICAgeyB0ZXh0LXRyYW5zZm9ybTogY2FwaXRhbGl6ZTsgfVxuXG4vLyBDb250ZXh0dWFsIGNvbG9yc1xuLnRleHQtbXV0ZWQge1xuICBjb2xvcjogQHRleHQtbXV0ZWQ7XG59XG4udGV4dC1wcmltYXJ5IHtcbiAgLnRleHQtZW1waGFzaXMtdmFyaWFudChAYnJhbmQtcHJpbWFyeSk7XG59XG4udGV4dC1zdWNjZXNzIHtcbiAgLnRleHQtZW1waGFzaXMtdmFyaWFudChAc3RhdGUtc3VjY2Vzcy10ZXh0KTtcbn1cbi50ZXh0LWluZm8ge1xuICAudGV4dC1lbXBoYXNpcy12YXJpYW50KEBzdGF0ZS1pbmZvLXRleHQpO1xufVxuLnRleHQtd2FybmluZyB7XG4gIC50ZXh0LWVtcGhhc2lzLXZhcmlhbnQoQHN0YXRlLXdhcm5pbmctdGV4dCk7XG59XG4udGV4dC1kYW5nZXIge1xuICAudGV4dC1lbXBoYXNpcy12YXJpYW50KEBzdGF0ZS1kYW5nZXItdGV4dCk7XG59XG5cbi8vIENvbnRleHR1YWwgYmFja2dyb3VuZHNcbi8vIEZvciBub3cgd2UnbGwgbGVhdmUgdGhlc2UgYWxvbmdzaWRlIHRoZSB0ZXh0IGNsYXNzZXMgdW50aWwgdjQgd2hlbiB3ZSBjYW5cbi8vIHNhZmVseSBzaGlmdCB0aGluZ3MgYXJvdW5kIChwZXIgU2VtVmVyIHJ1bGVzKS5cbi5iZy1wcmltYXJ5IHtcbiAgLy8gR2l2ZW4gdGhlIGNvbnRyYXN0IGhlcmUsIHRoaXMgaXMgdGhlIG9ubHkgY2xhc3MgdG8gaGF2ZSBpdHMgY29sb3IgaW52ZXJ0ZWRcbiAgLy8gYXV0b21hdGljYWxseS5cbiAgY29sb3I6ICNmZmY7XG4gIC5iZy12YXJpYW50KEBicmFuZC1wcmltYXJ5KTtcbn1cbi5iZy1zdWNjZXNzIHtcbiAgLmJnLXZhcmlhbnQoQHN0YXRlLXN1Y2Nlc3MtYmcpO1xufVxuLmJnLWluZm8ge1xuICAuYmctdmFyaWFudChAc3RhdGUtaW5mby1iZyk7XG59XG4uYmctd2FybmluZyB7XG4gIC5iZy12YXJpYW50KEBzdGF0ZS13YXJuaW5nLWJnKTtcbn1cbi5iZy1kYW5nZXIge1xuICAuYmctdmFyaWFudChAc3RhdGUtZGFuZ2VyLWJnKTtcbn1cblxuXG4vLyBQYWdlIGhlYWRlclxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4ucGFnZS1oZWFkZXIge1xuICBwYWRkaW5nLWJvdHRvbTogKChAbGluZS1oZWlnaHQtY29tcHV0ZWQgLyAyKSAtIDEpO1xuICBtYXJnaW46IChAbGluZS1oZWlnaHQtY29tcHV0ZWQgKiAyKSAwIEBsaW5lLWhlaWdodC1jb21wdXRlZDtcbiAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIEBwYWdlLWhlYWRlci1ib3JkZXItY29sb3I7XG59XG5cblxuLy8gTGlzdHNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLy8gVW5vcmRlcmVkIGFuZCBPcmRlcmVkIGxpc3RzXG51bCxcbm9sIHtcbiAgbWFyZ2luLXRvcDogMDtcbiAgbWFyZ2luLWJvdHRvbTogKEBsaW5lLWhlaWdodC1jb21wdXRlZCAvIDIpO1xuICB1bCxcbiAgb2wge1xuICAgIG1hcmdpbi1ib3R0b206IDA7XG4gIH1cbn1cblxuLy8gTGlzdCBvcHRpb25zXG5cbi8vIFVuc3R5bGVkIGtlZXBzIGxpc3QgaXRlbXMgYmxvY2sgbGV2ZWwsIGp1c3QgcmVtb3ZlcyBkZWZhdWx0IGJyb3dzZXIgcGFkZGluZyBhbmQgbGlzdC1zdHlsZVxuLmxpc3QtdW5zdHlsZWQge1xuICBwYWRkaW5nLWxlZnQ6IDA7XG4gIGxpc3Qtc3R5bGU6IG5vbmU7XG59XG5cbi8vIElubGluZSB0dXJucyBsaXN0IGl0ZW1zIGludG8gaW5saW5lLWJsb2NrXG4ubGlzdC1pbmxpbmUge1xuICAubGlzdC11bnN0eWxlZCgpO1xuICBtYXJnaW4tbGVmdDogLTVweDtcblxuICA+IGxpIHtcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gICAgcGFkZGluZy1sZWZ0OiA1cHg7XG4gICAgcGFkZGluZy1yaWdodDogNXB4O1xuICB9XG59XG5cbi8vIERlc2NyaXB0aW9uIExpc3RzXG5kbCB7XG4gIG1hcmdpbi10b3A6IDA7IC8vIFJlbW92ZSBicm93c2VyIGRlZmF1bHRcbiAgbWFyZ2luLWJvdHRvbTogQGxpbmUtaGVpZ2h0LWNvbXB1dGVkO1xufVxuZHQsXG5kZCB7XG4gIGxpbmUtaGVpZ2h0OiBAbGluZS1oZWlnaHQtYmFzZTtcbn1cbmR0IHtcbiAgZm9udC13ZWlnaHQ6IGJvbGQ7XG59XG5kZCB7XG4gIG1hcmdpbi1sZWZ0OiAwOyAvLyBVbmRvIGJyb3dzZXIgZGVmYXVsdFxufVxuXG4vLyBIb3Jpem9udGFsIGRlc2NyaXB0aW9uIGxpc3RzXG4vL1xuLy8gRGVmYXVsdHMgdG8gYmVpbmcgc3RhY2tlZCB3aXRob3V0IGFueSBvZiB0aGUgYmVsb3cgc3R5bGVzIGFwcGxpZWQsIHVudGlsIHRoZVxuLy8gZ3JpZCBicmVha3BvaW50IGlzIHJlYWNoZWQgKGRlZmF1bHQgb2Ygfjc2OHB4KS5cblxuLmRsLWhvcml6b250YWwge1xuICBkZCB7XG4gICAgJjpleHRlbmQoLmNsZWFyZml4IGFsbCk7IC8vIENsZWFyIHRoZSBmbG9hdGVkIGBkdGAgaWYgYW4gZW1wdHkgYGRkYCBpcyBwcmVzZW50XG4gIH1cblxuICBAbWVkaWEgKG1pbi13aWR0aDogQGdyaWQtZmxvYXQtYnJlYWtwb2ludCkge1xuICAgIGR0IHtcbiAgICAgIGZsb2F0OiBsZWZ0O1xuICAgICAgd2lkdGg6IChAZGwtaG9yaXpvbnRhbC1vZmZzZXQgLSAyMCk7XG4gICAgICBjbGVhcjogbGVmdDtcbiAgICAgIHRleHQtYWxpZ246IHJpZ2h0O1xuICAgICAgLnRleHQtb3ZlcmZsb3coKTtcbiAgICB9XG4gICAgZGQge1xuICAgICAgbWFyZ2luLWxlZnQ6IEBkbC1ob3Jpem9udGFsLW9mZnNldDtcbiAgICB9XG4gIH1cbn1cblxuXG4vLyBNaXNjXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8vIEFiYnJldmlhdGlvbnMgYW5kIGFjcm9ueW1zXG5hYmJyW3RpdGxlXSxcbi8vIEFkZCBkYXRhLSogYXR0cmlidXRlIHRvIGhlbHAgb3V0IG91ciB0b29sdGlwIHBsdWdpbiwgcGVyIGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9pc3N1ZXMvNTI1N1xuYWJicltkYXRhLW9yaWdpbmFsLXRpdGxlXSB7XG4gIGN1cnNvcjogaGVscDtcbiAgYm9yZGVyLWJvdHRvbTogMXB4IGRvdHRlZCBAYWJici1ib3JkZXItY29sb3I7XG59XG4uaW5pdGlhbGlzbSB7XG4gIGZvbnQtc2l6ZTogOTAlO1xuICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlO1xufVxuXG4vLyBCbG9ja3F1b3Rlc1xuYmxvY2txdW90ZSB7XG4gIHBhZGRpbmc6IChAbGluZS1oZWlnaHQtY29tcHV0ZWQgLyAyKSBAbGluZS1oZWlnaHQtY29tcHV0ZWQ7XG4gIG1hcmdpbjogMCAwIEBsaW5lLWhlaWdodC1jb21wdXRlZDtcbiAgZm9udC1zaXplOiBAYmxvY2txdW90ZS1mb250LXNpemU7XG4gIGJvcmRlci1sZWZ0OiA1cHggc29saWQgQGJsb2NrcXVvdGUtYm9yZGVyLWNvbG9yO1xuXG4gIHAsXG4gIHVsLFxuICBvbCB7XG4gICAgJjpsYXN0LWNoaWxkIHtcbiAgICAgIG1hcmdpbi1ib3R0b206IDA7XG4gICAgfVxuICB9XG5cbiAgLy8gTm90ZTogRGVwcmVjYXRlZCBzbWFsbCBhbmQgLnNtYWxsIGFzIG9mIHYzLjEuMFxuICAvLyBDb250ZXh0OiBodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvaXNzdWVzLzExNjYwXG4gIGZvb3RlcixcbiAgc21hbGwsXG4gIC5zbWFsbCB7XG4gICAgZGlzcGxheTogYmxvY2s7XG4gICAgZm9udC1zaXplOiA4MCU7IC8vIGJhY2sgdG8gZGVmYXVsdCBmb250LXNpemVcbiAgICBsaW5lLWhlaWdodDogQGxpbmUtaGVpZ2h0LWJhc2U7XG4gICAgY29sb3I6IEBibG9ja3F1b3RlLXNtYWxsLWNvbG9yO1xuXG4gICAgJjpiZWZvcmUge1xuICAgICAgY29udGVudDogJ1xcMjAxNCBcXDAwQTAnOyAvLyBlbSBkYXNoLCBuYnNwXG4gICAgfVxuICB9XG59XG5cbi8vIE9wcG9zaXRlIGFsaWdubWVudCBvZiBibG9ja3F1b3RlXG4vL1xuLy8gSGVhZHMgdXA6IGBibG9ja3F1b3RlLnB1bGwtcmlnaHRgIGhhcyBiZWVuIGRlcHJlY2F0ZWQgYXMgb2YgdjMuMS4wLlxuLmJsb2NrcXVvdGUtcmV2ZXJzZSxcbmJsb2NrcXVvdGUucHVsbC1yaWdodCB7XG4gIHBhZGRpbmctcmlnaHQ6IDE1cHg7XG4gIHBhZGRpbmctbGVmdDogMDtcbiAgYm9yZGVyLXJpZ2h0OiA1cHggc29saWQgQGJsb2NrcXVvdGUtYm9yZGVyLWNvbG9yO1xuICBib3JkZXItbGVmdDogMDtcbiAgdGV4dC1hbGlnbjogcmlnaHQ7XG5cbiAgLy8gQWNjb3VudCBmb3IgY2l0YXRpb25cbiAgZm9vdGVyLFxuICBzbWFsbCxcbiAgLnNtYWxsIHtcbiAgICAmOmJlZm9yZSB7IGNvbnRlbnQ6ICcnOyB9XG4gICAgJjphZnRlciB7XG4gICAgICBjb250ZW50OiAnXFwwMEEwIFxcMjAxNCc7IC8vIG5ic3AsIGVtIGRhc2hcbiAgICB9XG4gIH1cbn1cblxuLy8gQWRkcmVzc2VzXG5hZGRyZXNzIHtcbiAgbWFyZ2luLWJvdHRvbTogQGxpbmUtaGVpZ2h0LWNvbXB1dGVkO1xuICBmb250LXN0eWxlOiBub3JtYWw7XG4gIGxpbmUtaGVpZ2h0OiBAbGluZS1oZWlnaHQtYmFzZTtcbn1cbiIsIi8vIFR5cG9ncmFwaHlcblxuLnRleHQtZW1waGFzaXMtdmFyaWFudChAY29sb3IpIHtcbiAgY29sb3I6IEBjb2xvcjtcbiAgYSY6aG92ZXIge1xuICAgIGNvbG9yOiBkYXJrZW4oQGNvbG9yLCAxMCUpO1xuICB9XG59XG4iLCIvLyBDb250ZXh0dWFsIGJhY2tncm91bmRzXG5cbi5iZy12YXJpYW50KEBjb2xvcikge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiBAY29sb3I7XG4gIGEmOmhvdmVyIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiBkYXJrZW4oQGNvbG9yLCAxMCUpO1xuICB9XG59XG4iLCIvLyBUZXh0IG92ZXJmbG93XG4vLyBSZXF1aXJlcyBpbmxpbmUtYmxvY2sgb3IgYmxvY2sgZm9yIHByb3BlciBzdHlsaW5nXG5cbi50ZXh0LW92ZXJmbG93KCkge1xuICBvdmVyZmxvdzogaGlkZGVuO1xuICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpcztcbiAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbn1cbiIsIi8vXG4vLyBDb2RlIChpbmxpbmUgYW5kIGJsb2NrKVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuXG4vLyBJbmxpbmUgYW5kIGJsb2NrIGNvZGUgc3R5bGVzXG5jb2RlLFxua2JkLFxucHJlLFxuc2FtcCB7XG4gIGZvbnQtZmFtaWx5OiBAZm9udC1mYW1pbHktbW9ub3NwYWNlO1xufVxuXG4vLyBJbmxpbmUgY29kZVxuY29kZSB7XG4gIHBhZGRpbmc6IDJweCA0cHg7XG4gIGZvbnQtc2l6ZTogOTAlO1xuICBjb2xvcjogQGNvZGUtY29sb3I7XG4gIGJhY2tncm91bmQtY29sb3I6IEBjb2RlLWJnO1xuICBib3JkZXItcmFkaXVzOiBAYm9yZGVyLXJhZGl1cy1iYXNlO1xufVxuXG4vLyBVc2VyIGlucHV0IHR5cGljYWxseSBlbnRlcmVkIHZpYSBrZXlib2FyZFxua2JkIHtcbiAgcGFkZGluZzogMnB4IDRweDtcbiAgZm9udC1zaXplOiA5MCU7XG4gIGNvbG9yOiBAa2JkLWNvbG9yO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiBAa2JkLWJnO1xuICBib3JkZXItcmFkaXVzOiBAYm9yZGVyLXJhZGl1cy1zbWFsbDtcbiAgYm94LXNoYWRvdzogaW5zZXQgMCAtMXB4IDAgcmdiYSgwLDAsMCwuMjUpO1xuXG4gIGtiZCB7XG4gICAgcGFkZGluZzogMDtcbiAgICBmb250LXNpemU6IDEwMCU7XG4gICAgZm9udC13ZWlnaHQ6IGJvbGQ7XG4gICAgYm94LXNoYWRvdzogbm9uZTtcbiAgfVxufVxuXG4vLyBCbG9ja3Mgb2YgY29kZVxucHJlIHtcbiAgZGlzcGxheTogYmxvY2s7XG4gIHBhZGRpbmc6ICgoQGxpbmUtaGVpZ2h0LWNvbXB1dGVkIC0gMSkgLyAyKTtcbiAgbWFyZ2luOiAwIDAgKEBsaW5lLWhlaWdodC1jb21wdXRlZCAvIDIpO1xuICBmb250LXNpemU6IChAZm9udC1zaXplLWJhc2UgLSAxKTsgLy8gMTRweCB0byAxM3B4XG4gIGxpbmUtaGVpZ2h0OiBAbGluZS1oZWlnaHQtYmFzZTtcbiAgd29yZC1icmVhazogYnJlYWstYWxsO1xuICB3b3JkLXdyYXA6IGJyZWFrLXdvcmQ7XG4gIGNvbG9yOiBAcHJlLWNvbG9yO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiBAcHJlLWJnO1xuICBib3JkZXI6IDFweCBzb2xpZCBAcHJlLWJvcmRlci1jb2xvcjtcbiAgYm9yZGVyLXJhZGl1czogQGJvcmRlci1yYWRpdXMtYmFzZTtcblxuICAvLyBBY2NvdW50IGZvciBzb21lIGNvZGUgb3V0cHV0cyB0aGF0IHBsYWNlIGNvZGUgdGFncyBpbiBwcmUgdGFnc1xuICBjb2RlIHtcbiAgICBwYWRkaW5nOiAwO1xuICAgIGZvbnQtc2l6ZTogaW5oZXJpdDtcbiAgICBjb2xvcjogaW5oZXJpdDtcbiAgICB3aGl0ZS1zcGFjZTogcHJlLXdyYXA7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7XG4gICAgYm9yZGVyLXJhZGl1czogMDtcbiAgfVxufVxuXG4vLyBFbmFibGUgc2Nyb2xsYWJsZSBibG9ja3Mgb2YgY29kZVxuLnByZS1zY3JvbGxhYmxlIHtcbiAgbWF4LWhlaWdodDogQHByZS1zY3JvbGxhYmxlLW1heC1oZWlnaHQ7XG4gIG92ZXJmbG93LXk6IHNjcm9sbDtcbn1cbiIsIi8vXG4vLyBHcmlkIHN5c3RlbVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuXG4vLyBDb250YWluZXIgd2lkdGhzXG4vL1xuLy8gU2V0IHRoZSBjb250YWluZXIgd2lkdGgsIGFuZCBvdmVycmlkZSBpdCBmb3IgZml4ZWQgbmF2YmFycyBpbiBtZWRpYSBxdWVyaWVzLlxuXG4uY29udGFpbmVyIHtcbiAgLmNvbnRhaW5lci1maXhlZCgpO1xuXG4gIEBtZWRpYSAobWluLXdpZHRoOiBAc2NyZWVuLXNtLW1pbikge1xuICAgIHdpZHRoOiBAY29udGFpbmVyLXNtO1xuICB9XG4gIEBtZWRpYSAobWluLXdpZHRoOiBAc2NyZWVuLW1kLW1pbikge1xuICAgIHdpZHRoOiBAY29udGFpbmVyLW1kO1xuICB9XG4gIEBtZWRpYSAobWluLXdpZHRoOiBAc2NyZWVuLWxnLW1pbikge1xuICAgIHdpZHRoOiBAY29udGFpbmVyLWxnO1xuICB9XG59XG5cblxuLy8gRmx1aWQgY29udGFpbmVyXG4vL1xuLy8gVXRpbGl6ZXMgdGhlIG1peGluIG1lYW50IGZvciBmaXhlZCB3aWR0aCBjb250YWluZXJzLCBidXQgd2l0aG91dCBhbnkgZGVmaW5lZFxuLy8gd2lkdGggZm9yIGZsdWlkLCBmdWxsIHdpZHRoIGxheW91dHMuXG5cbi5jb250YWluZXItZmx1aWQge1xuICAuY29udGFpbmVyLWZpeGVkKCk7XG59XG5cblxuLy8gUm93XG4vL1xuLy8gUm93cyBjb250YWluIGFuZCBjbGVhciB0aGUgZmxvYXRzIG9mIHlvdXIgY29sdW1ucy5cblxuLnJvdyB7XG4gIC5tYWtlLXJvdygpO1xufVxuXG5cbi8vIENvbHVtbnNcbi8vXG4vLyBDb21tb24gc3R5bGVzIGZvciBzbWFsbCBhbmQgbGFyZ2UgZ3JpZCBjb2x1bW5zXG5cbi5tYWtlLWdyaWQtY29sdW1ucygpO1xuXG5cbi8vIEV4dHJhIHNtYWxsIGdyaWRcbi8vXG4vLyBDb2x1bW5zLCBvZmZzZXRzLCBwdXNoZXMsIGFuZCBwdWxscyBmb3IgZXh0cmEgc21hbGwgZGV2aWNlcyBsaWtlXG4vLyBzbWFydHBob25lcy5cblxuLm1ha2UtZ3JpZCh4cyk7XG5cblxuLy8gU21hbGwgZ3JpZFxuLy9cbi8vIENvbHVtbnMsIG9mZnNldHMsIHB1c2hlcywgYW5kIHB1bGxzIGZvciB0aGUgc21hbGwgZGV2aWNlIHJhbmdlLCBmcm9tIHBob25lc1xuLy8gdG8gdGFibGV0cy5cblxuQG1lZGlhIChtaW4td2lkdGg6IEBzY3JlZW4tc20tbWluKSB7XG4gIC5tYWtlLWdyaWQoc20pO1xufVxuXG5cbi8vIE1lZGl1bSBncmlkXG4vL1xuLy8gQ29sdW1ucywgb2Zmc2V0cywgcHVzaGVzLCBhbmQgcHVsbHMgZm9yIHRoZSBkZXNrdG9wIGRldmljZSByYW5nZS5cblxuQG1lZGlhIChtaW4td2lkdGg6IEBzY3JlZW4tbWQtbWluKSB7XG4gIC5tYWtlLWdyaWQobWQpO1xufVxuXG5cbi8vIExhcmdlIGdyaWRcbi8vXG4vLyBDb2x1bW5zLCBvZmZzZXRzLCBwdXNoZXMsIGFuZCBwdWxscyBmb3IgdGhlIGxhcmdlIGRlc2t0b3AgZGV2aWNlIHJhbmdlLlxuXG5AbWVkaWEgKG1pbi13aWR0aDogQHNjcmVlbi1sZy1taW4pIHtcbiAgLm1ha2UtZ3JpZChsZyk7XG59XG4iLCIvLyBHcmlkIHN5c3RlbVxuLy9cbi8vIEdlbmVyYXRlIHNlbWFudGljIGdyaWQgY29sdW1ucyB3aXRoIHRoZXNlIG1peGlucy5cblxuLy8gQ2VudGVyZWQgY29udGFpbmVyIGVsZW1lbnRcbi5jb250YWluZXItZml4ZWQoQGd1dHRlcjogQGdyaWQtZ3V0dGVyLXdpZHRoKSB7XG4gIG1hcmdpbi1yaWdodDogYXV0bztcbiAgbWFyZ2luLWxlZnQ6IGF1dG87XG4gIHBhZGRpbmctbGVmdDogIChAZ3V0dGVyIC8gMik7XG4gIHBhZGRpbmctcmlnaHQ6IChAZ3V0dGVyIC8gMik7XG4gICY6ZXh0ZW5kKC5jbGVhcmZpeCBhbGwpO1xufVxuXG4vLyBDcmVhdGVzIGEgd3JhcHBlciBmb3IgYSBzZXJpZXMgb2YgY29sdW1uc1xuLm1ha2Utcm93KEBndXR0ZXI6IEBncmlkLWd1dHRlci13aWR0aCkge1xuICBtYXJnaW4tbGVmdDogIChAZ3V0dGVyIC8gLTIpO1xuICBtYXJnaW4tcmlnaHQ6IChAZ3V0dGVyIC8gLTIpO1xuICAmOmV4dGVuZCguY2xlYXJmaXggYWxsKTtcbn1cblxuLy8gR2VuZXJhdGUgdGhlIGV4dHJhIHNtYWxsIGNvbHVtbnNcbi5tYWtlLXhzLWNvbHVtbihAY29sdW1uczsgQGd1dHRlcjogQGdyaWQtZ3V0dGVyLXdpZHRoKSB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgZmxvYXQ6IGxlZnQ7XG4gIHdpZHRoOiBwZXJjZW50YWdlKChAY29sdW1ucyAvIEBncmlkLWNvbHVtbnMpKTtcbiAgbWluLWhlaWdodDogMXB4O1xuICBwYWRkaW5nLWxlZnQ6ICAoQGd1dHRlciAvIDIpO1xuICBwYWRkaW5nLXJpZ2h0OiAoQGd1dHRlciAvIDIpO1xufVxuLm1ha2UteHMtY29sdW1uLW9mZnNldChAY29sdW1ucykge1xuICBtYXJnaW4tbGVmdDogcGVyY2VudGFnZSgoQGNvbHVtbnMgLyBAZ3JpZC1jb2x1bW5zKSk7XG59XG4ubWFrZS14cy1jb2x1bW4tcHVzaChAY29sdW1ucykge1xuICBsZWZ0OiBwZXJjZW50YWdlKChAY29sdW1ucyAvIEBncmlkLWNvbHVtbnMpKTtcbn1cbi5tYWtlLXhzLWNvbHVtbi1wdWxsKEBjb2x1bW5zKSB7XG4gIHJpZ2h0OiBwZXJjZW50YWdlKChAY29sdW1ucyAvIEBncmlkLWNvbHVtbnMpKTtcbn1cblxuLy8gR2VuZXJhdGUgdGhlIHNtYWxsIGNvbHVtbnNcbi5tYWtlLXNtLWNvbHVtbihAY29sdW1uczsgQGd1dHRlcjogQGdyaWQtZ3V0dGVyLXdpZHRoKSB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgbWluLWhlaWdodDogMXB4O1xuICBwYWRkaW5nLWxlZnQ6ICAoQGd1dHRlciAvIDIpO1xuICBwYWRkaW5nLXJpZ2h0OiAoQGd1dHRlciAvIDIpO1xuXG4gIEBtZWRpYSAobWluLXdpZHRoOiBAc2NyZWVuLXNtLW1pbikge1xuICAgIGZsb2F0OiBsZWZ0O1xuICAgIHdpZHRoOiBwZXJjZW50YWdlKChAY29sdW1ucyAvIEBncmlkLWNvbHVtbnMpKTtcbiAgfVxufVxuLm1ha2Utc20tY29sdW1uLW9mZnNldChAY29sdW1ucykge1xuICBAbWVkaWEgKG1pbi13aWR0aDogQHNjcmVlbi1zbS1taW4pIHtcbiAgICBtYXJnaW4tbGVmdDogcGVyY2VudGFnZSgoQGNvbHVtbnMgLyBAZ3JpZC1jb2x1bW5zKSk7XG4gIH1cbn1cbi5tYWtlLXNtLWNvbHVtbi1wdXNoKEBjb2x1bW5zKSB7XG4gIEBtZWRpYSAobWluLXdpZHRoOiBAc2NyZWVuLXNtLW1pbikge1xuICAgIGxlZnQ6IHBlcmNlbnRhZ2UoKEBjb2x1bW5zIC8gQGdyaWQtY29sdW1ucykpO1xuICB9XG59XG4ubWFrZS1zbS1jb2x1bW4tcHVsbChAY29sdW1ucykge1xuICBAbWVkaWEgKG1pbi13aWR0aDogQHNjcmVlbi1zbS1taW4pIHtcbiAgICByaWdodDogcGVyY2VudGFnZSgoQGNvbHVtbnMgLyBAZ3JpZC1jb2x1bW5zKSk7XG4gIH1cbn1cblxuLy8gR2VuZXJhdGUgdGhlIG1lZGl1bSBjb2x1bW5zXG4ubWFrZS1tZC1jb2x1bW4oQGNvbHVtbnM7IEBndXR0ZXI6IEBncmlkLWd1dHRlci13aWR0aCkge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIG1pbi1oZWlnaHQ6IDFweDtcbiAgcGFkZGluZy1sZWZ0OiAgKEBndXR0ZXIgLyAyKTtcbiAgcGFkZGluZy1yaWdodDogKEBndXR0ZXIgLyAyKTtcblxuICBAbWVkaWEgKG1pbi13aWR0aDogQHNjcmVlbi1tZC1taW4pIHtcbiAgICBmbG9hdDogbGVmdDtcbiAgICB3aWR0aDogcGVyY2VudGFnZSgoQGNvbHVtbnMgLyBAZ3JpZC1jb2x1bW5zKSk7XG4gIH1cbn1cbi5tYWtlLW1kLWNvbHVtbi1vZmZzZXQoQGNvbHVtbnMpIHtcbiAgQG1lZGlhIChtaW4td2lkdGg6IEBzY3JlZW4tbWQtbWluKSB7XG4gICAgbWFyZ2luLWxlZnQ6IHBlcmNlbnRhZ2UoKEBjb2x1bW5zIC8gQGdyaWQtY29sdW1ucykpO1xuICB9XG59XG4ubWFrZS1tZC1jb2x1bW4tcHVzaChAY29sdW1ucykge1xuICBAbWVkaWEgKG1pbi13aWR0aDogQHNjcmVlbi1tZC1taW4pIHtcbiAgICBsZWZ0OiBwZXJjZW50YWdlKChAY29sdW1ucyAvIEBncmlkLWNvbHVtbnMpKTtcbiAgfVxufVxuLm1ha2UtbWQtY29sdW1uLXB1bGwoQGNvbHVtbnMpIHtcbiAgQG1lZGlhIChtaW4td2lkdGg6IEBzY3JlZW4tbWQtbWluKSB7XG4gICAgcmlnaHQ6IHBlcmNlbnRhZ2UoKEBjb2x1bW5zIC8gQGdyaWQtY29sdW1ucykpO1xuICB9XG59XG5cbi8vIEdlbmVyYXRlIHRoZSBsYXJnZSBjb2x1bW5zXG4ubWFrZS1sZy1jb2x1bW4oQGNvbHVtbnM7IEBndXR0ZXI6IEBncmlkLWd1dHRlci13aWR0aCkge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIG1pbi1oZWlnaHQ6IDFweDtcbiAgcGFkZGluZy1sZWZ0OiAgKEBndXR0ZXIgLyAyKTtcbiAgcGFkZGluZy1yaWdodDogKEBndXR0ZXIgLyAyKTtcblxuICBAbWVkaWEgKG1pbi13aWR0aDogQHNjcmVlbi1sZy1taW4pIHtcbiAgICBmbG9hdDogbGVmdDtcbiAgICB3aWR0aDogcGVyY2VudGFnZSgoQGNvbHVtbnMgLyBAZ3JpZC1jb2x1bW5zKSk7XG4gIH1cbn1cbi5tYWtlLWxnLWNvbHVtbi1vZmZzZXQoQGNvbHVtbnMpIHtcbiAgQG1lZGlhIChtaW4td2lkdGg6IEBzY3JlZW4tbGctbWluKSB7XG4gICAgbWFyZ2luLWxlZnQ6IHBlcmNlbnRhZ2UoKEBjb2x1bW5zIC8gQGdyaWQtY29sdW1ucykpO1xuICB9XG59XG4ubWFrZS1sZy1jb2x1bW4tcHVzaChAY29sdW1ucykge1xuICBAbWVkaWEgKG1pbi13aWR0aDogQHNjcmVlbi1sZy1taW4pIHtcbiAgICBsZWZ0OiBwZXJjZW50YWdlKChAY29sdW1ucyAvIEBncmlkLWNvbHVtbnMpKTtcbiAgfVxufVxuLm1ha2UtbGctY29sdW1uLXB1bGwoQGNvbHVtbnMpIHtcbiAgQG1lZGlhIChtaW4td2lkdGg6IEBzY3JlZW4tbGctbWluKSB7XG4gICAgcmlnaHQ6IHBlcmNlbnRhZ2UoKEBjb2x1bW5zIC8gQGdyaWQtY29sdW1ucykpO1xuICB9XG59XG4iLCIvLyBGcmFtZXdvcmsgZ3JpZCBnZW5lcmF0aW9uXG4vL1xuLy8gVXNlZCBvbmx5IGJ5IEJvb3RzdHJhcCB0byBnZW5lcmF0ZSB0aGUgY29ycmVjdCBudW1iZXIgb2YgZ3JpZCBjbGFzc2VzIGdpdmVuXG4vLyBhbnkgdmFsdWUgb2YgYEBncmlkLWNvbHVtbnNgLlxuXG4ubWFrZS1ncmlkLWNvbHVtbnMoKSB7XG4gIC8vIENvbW1vbiBzdHlsZXMgZm9yIGFsbCBzaXplcyBvZiBncmlkIGNvbHVtbnMsIHdpZHRocyAxLTEyXG4gIC5jb2woQGluZGV4KSB3aGVuIChAaW5kZXggPSAxKSB7IC8vIGluaXRpYWxcbiAgICBAaXRlbTogflwiLmNvbC14cy1Ae2luZGV4fSwgLmNvbC1zbS1Ae2luZGV4fSwgLmNvbC1tZC1Ae2luZGV4fSwgLmNvbC1sZy1Ae2luZGV4fVwiO1xuICAgIC5jb2woKEBpbmRleCArIDEpLCBAaXRlbSk7XG4gIH1cbiAgLmNvbChAaW5kZXgsIEBsaXN0KSB3aGVuIChAaW5kZXggPTwgQGdyaWQtY29sdW1ucykgeyAvLyBnZW5lcmFsOyBcIj08XCIgaXNuJ3QgYSB0eXBvXG4gICAgQGl0ZW06IH5cIi5jb2wteHMtQHtpbmRleH0sIC5jb2wtc20tQHtpbmRleH0sIC5jb2wtbWQtQHtpbmRleH0sIC5jb2wtbGctQHtpbmRleH1cIjtcbiAgICAuY29sKChAaW5kZXggKyAxKSwgflwiQHtsaXN0fSwgQHtpdGVtfVwiKTtcbiAgfVxuICAuY29sKEBpbmRleCwgQGxpc3QpIHdoZW4gKEBpbmRleCA+IEBncmlkLWNvbHVtbnMpIHsgLy8gdGVybWluYWxcbiAgICBAe2xpc3R9IHtcbiAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICAgIC8vIFByZXZlbnQgY29sdW1ucyBmcm9tIGNvbGxhcHNpbmcgd2hlbiBlbXB0eVxuICAgICAgbWluLWhlaWdodDogMXB4O1xuICAgICAgLy8gSW5uZXIgZ3V0dGVyIHZpYSBwYWRkaW5nXG4gICAgICBwYWRkaW5nLWxlZnQ6ICAoQGdyaWQtZ3V0dGVyLXdpZHRoIC8gMik7XG4gICAgICBwYWRkaW5nLXJpZ2h0OiAoQGdyaWQtZ3V0dGVyLXdpZHRoIC8gMik7XG4gICAgfVxuICB9XG4gIC5jb2woMSk7IC8vIGtpY2tzdGFydCBpdFxufVxuXG4uZmxvYXQtZ3JpZC1jb2x1bW5zKEBjbGFzcykge1xuICAuY29sKEBpbmRleCkgd2hlbiAoQGluZGV4ID0gMSkgeyAvLyBpbml0aWFsXG4gICAgQGl0ZW06IH5cIi5jb2wtQHtjbGFzc30tQHtpbmRleH1cIjtcbiAgICAuY29sKChAaW5kZXggKyAxKSwgQGl0ZW0pO1xuICB9XG4gIC5jb2woQGluZGV4LCBAbGlzdCkgd2hlbiAoQGluZGV4ID08IEBncmlkLWNvbHVtbnMpIHsgLy8gZ2VuZXJhbFxuICAgIEBpdGVtOiB+XCIuY29sLUB7Y2xhc3N9LUB7aW5kZXh9XCI7XG4gICAgLmNvbCgoQGluZGV4ICsgMSksIH5cIkB7bGlzdH0sIEB7aXRlbX1cIik7XG4gIH1cbiAgLmNvbChAaW5kZXgsIEBsaXN0KSB3aGVuIChAaW5kZXggPiBAZ3JpZC1jb2x1bW5zKSB7IC8vIHRlcm1pbmFsXG4gICAgQHtsaXN0fSB7XG4gICAgICBmbG9hdDogbGVmdDtcbiAgICB9XG4gIH1cbiAgLmNvbCgxKTsgLy8ga2lja3N0YXJ0IGl0XG59XG5cbi5jYWxjLWdyaWQtY29sdW1uKEBpbmRleCwgQGNsYXNzLCBAdHlwZSkgd2hlbiAoQHR5cGUgPSB3aWR0aCkgYW5kIChAaW5kZXggPiAwKSB7XG4gIC5jb2wtQHtjbGFzc30tQHtpbmRleH0ge1xuICAgIHdpZHRoOiBwZXJjZW50YWdlKChAaW5kZXggLyBAZ3JpZC1jb2x1bW5zKSk7XG4gIH1cbn1cbi5jYWxjLWdyaWQtY29sdW1uKEBpbmRleCwgQGNsYXNzLCBAdHlwZSkgd2hlbiAoQHR5cGUgPSBwdXNoKSBhbmQgKEBpbmRleCA+IDApIHtcbiAgLmNvbC1Ae2NsYXNzfS1wdXNoLUB7aW5kZXh9IHtcbiAgICBsZWZ0OiBwZXJjZW50YWdlKChAaW5kZXggLyBAZ3JpZC1jb2x1bW5zKSk7XG4gIH1cbn1cbi5jYWxjLWdyaWQtY29sdW1uKEBpbmRleCwgQGNsYXNzLCBAdHlwZSkgd2hlbiAoQHR5cGUgPSBwdXNoKSBhbmQgKEBpbmRleCA9IDApIHtcbiAgLmNvbC1Ae2NsYXNzfS1wdXNoLTAge1xuICAgIGxlZnQ6IGF1dG87XG4gIH1cbn1cbi5jYWxjLWdyaWQtY29sdW1uKEBpbmRleCwgQGNsYXNzLCBAdHlwZSkgd2hlbiAoQHR5cGUgPSBwdWxsKSBhbmQgKEBpbmRleCA+IDApIHtcbiAgLmNvbC1Ae2NsYXNzfS1wdWxsLUB7aW5kZXh9IHtcbiAgICByaWdodDogcGVyY2VudGFnZSgoQGluZGV4IC8gQGdyaWQtY29sdW1ucykpO1xuICB9XG59XG4uY2FsYy1ncmlkLWNvbHVtbihAaW5kZXgsIEBjbGFzcywgQHR5cGUpIHdoZW4gKEB0eXBlID0gcHVsbCkgYW5kIChAaW5kZXggPSAwKSB7XG4gIC5jb2wtQHtjbGFzc30tcHVsbC0wIHtcbiAgICByaWdodDogYXV0bztcbiAgfVxufVxuLmNhbGMtZ3JpZC1jb2x1bW4oQGluZGV4LCBAY2xhc3MsIEB0eXBlKSB3aGVuIChAdHlwZSA9IG9mZnNldCkge1xuICAuY29sLUB7Y2xhc3N9LW9mZnNldC1Ae2luZGV4fSB7XG4gICAgbWFyZ2luLWxlZnQ6IHBlcmNlbnRhZ2UoKEBpbmRleCAvIEBncmlkLWNvbHVtbnMpKTtcbiAgfVxufVxuXG4vLyBCYXNpYyBsb29waW5nIGluIExFU1Ncbi5sb29wLWdyaWQtY29sdW1ucyhAaW5kZXgsIEBjbGFzcywgQHR5cGUpIHdoZW4gKEBpbmRleCA+PSAwKSB7XG4gIC5jYWxjLWdyaWQtY29sdW1uKEBpbmRleCwgQGNsYXNzLCBAdHlwZSk7XG4gIC8vIG5leHQgaXRlcmF0aW9uXG4gIC5sb29wLWdyaWQtY29sdW1ucygoQGluZGV4IC0gMSksIEBjbGFzcywgQHR5cGUpO1xufVxuXG4vLyBDcmVhdGUgZ3JpZCBmb3Igc3BlY2lmaWMgY2xhc3Ncbi5tYWtlLWdyaWQoQGNsYXNzKSB7XG4gIC5mbG9hdC1ncmlkLWNvbHVtbnMoQGNsYXNzKTtcbiAgLmxvb3AtZ3JpZC1jb2x1bW5zKEBncmlkLWNvbHVtbnMsIEBjbGFzcywgd2lkdGgpO1xuICAubG9vcC1ncmlkLWNvbHVtbnMoQGdyaWQtY29sdW1ucywgQGNsYXNzLCBwdWxsKTtcbiAgLmxvb3AtZ3JpZC1jb2x1bW5zKEBncmlkLWNvbHVtbnMsIEBjbGFzcywgcHVzaCk7XG4gIC5sb29wLWdyaWQtY29sdW1ucyhAZ3JpZC1jb2x1bW5zLCBAY2xhc3MsIG9mZnNldCk7XG59XG4iLCIvL1xuLy8gVGFibGVzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5cbnRhYmxlIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogQHRhYmxlLWJnO1xufVxuY2FwdGlvbiB7XG4gIHBhZGRpbmctdG9wOiBAdGFibGUtY2VsbC1wYWRkaW5nO1xuICBwYWRkaW5nLWJvdHRvbTogQHRhYmxlLWNlbGwtcGFkZGluZztcbiAgY29sb3I6IEB0ZXh0LW11dGVkO1xuICB0ZXh0LWFsaWduOiBsZWZ0O1xufVxudGgge1xuICB0ZXh0LWFsaWduOiBsZWZ0O1xufVxuXG5cbi8vIEJhc2VsaW5lIHN0eWxlc1xuXG4udGFibGUge1xuICB3aWR0aDogMTAwJTtcbiAgbWF4LXdpZHRoOiAxMDAlO1xuICBtYXJnaW4tYm90dG9tOiBAbGluZS1oZWlnaHQtY29tcHV0ZWQ7XG4gIC8vIENlbGxzXG4gID4gdGhlYWQsXG4gID4gdGJvZHksXG4gID4gdGZvb3Qge1xuICAgID4gdHIge1xuICAgICAgPiB0aCxcbiAgICAgID4gdGQge1xuICAgICAgICBwYWRkaW5nOiBAdGFibGUtY2VsbC1wYWRkaW5nO1xuICAgICAgICBsaW5lLWhlaWdodDogQGxpbmUtaGVpZ2h0LWJhc2U7XG4gICAgICAgIHZlcnRpY2FsLWFsaWduOiB0b3A7XG4gICAgICAgIGJvcmRlci10b3A6IDFweCBzb2xpZCBAdGFibGUtYm9yZGVyLWNvbG9yO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICAvLyBCb3R0b20gYWxpZ24gZm9yIGNvbHVtbiBoZWFkaW5nc1xuICA+IHRoZWFkID4gdHIgPiB0aCB7XG4gICAgdmVydGljYWwtYWxpZ246IGJvdHRvbTtcbiAgICBib3JkZXItYm90dG9tOiAycHggc29saWQgQHRhYmxlLWJvcmRlci1jb2xvcjtcbiAgfVxuICAvLyBSZW1vdmUgdG9wIGJvcmRlciBmcm9tIHRoZWFkIGJ5IGRlZmF1bHRcbiAgPiBjYXB0aW9uICsgdGhlYWQsXG4gID4gY29sZ3JvdXAgKyB0aGVhZCxcbiAgPiB0aGVhZDpmaXJzdC1jaGlsZCB7XG4gICAgPiB0cjpmaXJzdC1jaGlsZCB7XG4gICAgICA+IHRoLFxuICAgICAgPiB0ZCB7XG4gICAgICAgIGJvcmRlci10b3A6IDA7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIC8vIEFjY291bnQgZm9yIG11bHRpcGxlIHRib2R5IGluc3RhbmNlc1xuICA+IHRib2R5ICsgdGJvZHkge1xuICAgIGJvcmRlci10b3A6IDJweCBzb2xpZCBAdGFibGUtYm9yZGVyLWNvbG9yO1xuICB9XG5cbiAgLy8gTmVzdGluZ1xuICAudGFibGUge1xuICAgIGJhY2tncm91bmQtY29sb3I6IEBib2R5LWJnO1xuICB9XG59XG5cblxuLy8gQ29uZGVuc2VkIHRhYmxlIHcvIGhhbGYgcGFkZGluZ1xuXG4udGFibGUtY29uZGVuc2VkIHtcbiAgPiB0aGVhZCxcbiAgPiB0Ym9keSxcbiAgPiB0Zm9vdCB7XG4gICAgPiB0ciB7XG4gICAgICA+IHRoLFxuICAgICAgPiB0ZCB7XG4gICAgICAgIHBhZGRpbmc6IEB0YWJsZS1jb25kZW5zZWQtY2VsbC1wYWRkaW5nO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5cbi8vIEJvcmRlcmVkIHZlcnNpb25cbi8vXG4vLyBBZGQgYm9yZGVycyBhbGwgYXJvdW5kIHRoZSB0YWJsZSBhbmQgYmV0d2VlbiBhbGwgdGhlIGNvbHVtbnMuXG5cbi50YWJsZS1ib3JkZXJlZCB7XG4gIGJvcmRlcjogMXB4IHNvbGlkIEB0YWJsZS1ib3JkZXItY29sb3I7XG4gID4gdGhlYWQsXG4gID4gdGJvZHksXG4gID4gdGZvb3Qge1xuICAgID4gdHIge1xuICAgICAgPiB0aCxcbiAgICAgID4gdGQge1xuICAgICAgICBib3JkZXI6IDFweCBzb2xpZCBAdGFibGUtYm9yZGVyLWNvbG9yO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICA+IHRoZWFkID4gdHIge1xuICAgID4gdGgsXG4gICAgPiB0ZCB7XG4gICAgICBib3JkZXItYm90dG9tLXdpZHRoOiAycHg7XG4gICAgfVxuICB9XG59XG5cblxuLy8gWmVicmEtc3RyaXBpbmdcbi8vXG4vLyBEZWZhdWx0IHplYnJhLXN0cmlwZSBzdHlsZXMgKGFsdGVybmF0aW5nIGdyYXkgYW5kIHRyYW5zcGFyZW50IGJhY2tncm91bmRzKVxuXG4udGFibGUtc3RyaXBlZCB7XG4gID4gdGJvZHkgPiB0cjpudGgtY2hpbGQob2RkKSB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogQHRhYmxlLWJnLWFjY2VudDtcbiAgfVxufVxuXG5cbi8vIEhvdmVyIGVmZmVjdFxuLy9cbi8vIFBsYWNlZCBoZXJlIHNpbmNlIGl0IGhhcyB0byBjb21lIGFmdGVyIHRoZSBwb3RlbnRpYWwgemVicmEgc3RyaXBpbmdcblxuLnRhYmxlLWhvdmVyIHtcbiAgPiB0Ym9keSA+IHRyOmhvdmVyIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAdGFibGUtYmctaG92ZXI7XG4gIH1cbn1cblxuXG4vLyBUYWJsZSBjZWxsIHNpemluZ1xuLy9cbi8vIFJlc2V0IGRlZmF1bHQgdGFibGUgYmVoYXZpb3JcblxudGFibGUgY29sW2NsYXNzKj1cImNvbC1cIl0ge1xuICBwb3NpdGlvbjogc3RhdGljOyAvLyBQcmV2ZW50IGJvcmRlciBoaWRpbmcgaW4gRmlyZWZveCBhbmQgSUU5LzEwIChzZWUgaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2lzc3Vlcy8xMTYyMylcbiAgZmxvYXQ6IG5vbmU7XG4gIGRpc3BsYXk6IHRhYmxlLWNvbHVtbjtcbn1cbnRhYmxlIHtcbiAgdGQsXG4gIHRoIHtcbiAgICAmW2NsYXNzKj1cImNvbC1cIl0ge1xuICAgICAgcG9zaXRpb246IHN0YXRpYzsgLy8gUHJldmVudCBib3JkZXIgaGlkaW5nIGluIEZpcmVmb3ggYW5kIElFOS8xMCAoc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9pc3N1ZXMvMTE2MjMpXG4gICAgICBmbG9hdDogbm9uZTtcbiAgICAgIGRpc3BsYXk6IHRhYmxlLWNlbGw7XG4gICAgfVxuICB9XG59XG5cblxuLy8gVGFibGUgYmFja2dyb3VuZHNcbi8vXG4vLyBFeGFjdCBzZWxlY3RvcnMgYmVsb3cgcmVxdWlyZWQgdG8gb3ZlcnJpZGUgYC50YWJsZS1zdHJpcGVkYCBhbmQgcHJldmVudFxuLy8gaW5oZXJpdGFuY2UgdG8gbmVzdGVkIHRhYmxlcy5cblxuLy8gR2VuZXJhdGUgdGhlIGNvbnRleHR1YWwgdmFyaWFudHNcbi50YWJsZS1yb3ctdmFyaWFudChhY3RpdmU7IEB0YWJsZS1iZy1hY3RpdmUpO1xuLnRhYmxlLXJvdy12YXJpYW50KHN1Y2Nlc3M7IEBzdGF0ZS1zdWNjZXNzLWJnKTtcbi50YWJsZS1yb3ctdmFyaWFudChpbmZvOyBAc3RhdGUtaW5mby1iZyk7XG4udGFibGUtcm93LXZhcmlhbnQod2FybmluZzsgQHN0YXRlLXdhcm5pbmctYmcpO1xuLnRhYmxlLXJvdy12YXJpYW50KGRhbmdlcjsgQHN0YXRlLWRhbmdlci1iZyk7XG5cblxuLy8gUmVzcG9uc2l2ZSB0YWJsZXNcbi8vXG4vLyBXcmFwIHlvdXIgdGFibGVzIGluIGAudGFibGUtcmVzcG9uc2l2ZWAgYW5kIHdlJ2xsIG1ha2UgdGhlbSBtb2JpbGUgZnJpZW5kbHlcbi8vIGJ5IGVuYWJsaW5nIGhvcml6b250YWwgc2Nyb2xsaW5nLiBPbmx5IGFwcGxpZXMgPDc2OHB4LiBFdmVyeXRoaW5nIGFib3ZlIHRoYXRcbi8vIHdpbGwgZGlzcGxheSBub3JtYWxseS5cblxuLnRhYmxlLXJlc3BvbnNpdmUge1xuICBvdmVyZmxvdy14OiBhdXRvO1xuICBtaW4taGVpZ2h0OiAwLjAxJTsgLy8gV29ya2Fyb3VuZCBmb3IgSUU5IGJ1ZyAoc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9pc3N1ZXMvMTQ4MzcpXG5cbiAgQG1lZGlhIHNjcmVlbiBhbmQgKG1heC13aWR0aDogQHNjcmVlbi14cy1tYXgpIHtcbiAgICB3aWR0aDogMTAwJTtcbiAgICBtYXJnaW4tYm90dG9tOiAoQGxpbmUtaGVpZ2h0LWNvbXB1dGVkICogMC43NSk7XG4gICAgb3ZlcmZsb3cteTogaGlkZGVuO1xuICAgIC1tcy1vdmVyZmxvdy1zdHlsZTogLW1zLWF1dG9oaWRpbmctc2Nyb2xsYmFyO1xuICAgIGJvcmRlcjogMXB4IHNvbGlkIEB0YWJsZS1ib3JkZXItY29sb3I7XG5cbiAgICAvLyBUaWdodGVuIHVwIHNwYWNpbmdcbiAgICA+IC50YWJsZSB7XG4gICAgICBtYXJnaW4tYm90dG9tOiAwO1xuXG4gICAgICAvLyBFbnN1cmUgdGhlIGNvbnRlbnQgZG9lc24ndCB3cmFwXG4gICAgICA+IHRoZWFkLFxuICAgICAgPiB0Ym9keSxcbiAgICAgID4gdGZvb3Qge1xuICAgICAgICA+IHRyIHtcbiAgICAgICAgICA+IHRoLFxuICAgICAgICAgID4gdGQge1xuICAgICAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBTcGVjaWFsIG92ZXJyaWRlcyBmb3IgdGhlIGJvcmRlcmVkIHRhYmxlc1xuICAgID4gLnRhYmxlLWJvcmRlcmVkIHtcbiAgICAgIGJvcmRlcjogMDtcblxuICAgICAgLy8gTnVrZSB0aGUgYXBwcm9wcmlhdGUgYm9yZGVycyBzbyB0aGF0IHRoZSBwYXJlbnQgY2FuIGhhbmRsZSB0aGVtXG4gICAgICA+IHRoZWFkLFxuICAgICAgPiB0Ym9keSxcbiAgICAgID4gdGZvb3Qge1xuICAgICAgICA+IHRyIHtcbiAgICAgICAgICA+IHRoOmZpcnN0LWNoaWxkLFxuICAgICAgICAgID4gdGQ6Zmlyc3QtY2hpbGQge1xuICAgICAgICAgICAgYm9yZGVyLWxlZnQ6IDA7XG4gICAgICAgICAgfVxuICAgICAgICAgID4gdGg6bGFzdC1jaGlsZCxcbiAgICAgICAgICA+IHRkOmxhc3QtY2hpbGQge1xuICAgICAgICAgICAgYm9yZGVyLXJpZ2h0OiAwO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBPbmx5IG51a2UgdGhlIGxhc3Qgcm93J3MgYm90dG9tLWJvcmRlciBpbiBgdGJvZHlgIGFuZCBgdGZvb3RgIHNpbmNlXG4gICAgICAvLyBjaGFuY2VzIGFyZSB0aGVyZSB3aWxsIGJlIG9ubHkgb25lIGB0cmAgaW4gYSBgdGhlYWRgIGFuZCB0aGF0IHdvdWxkXG4gICAgICAvLyByZW1vdmUgdGhlIGJvcmRlciBhbHRvZ2V0aGVyLlxuICAgICAgPiB0Ym9keSxcbiAgICAgID4gdGZvb3Qge1xuICAgICAgICA+IHRyOmxhc3QtY2hpbGQge1xuICAgICAgICAgID4gdGgsXG4gICAgICAgICAgPiB0ZCB7XG4gICAgICAgICAgICBib3JkZXItYm90dG9tOiAwO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgfVxuICB9XG59XG4iLCIvLyBUYWJsZXNcblxuLnRhYmxlLXJvdy12YXJpYW50KEBzdGF0ZTsgQGJhY2tncm91bmQpIHtcbiAgLy8gRXhhY3Qgc2VsZWN0b3JzIGJlbG93IHJlcXVpcmVkIHRvIG92ZXJyaWRlIGAudGFibGUtc3RyaXBlZGAgYW5kIHByZXZlbnRcbiAgLy8gaW5oZXJpdGFuY2UgdG8gbmVzdGVkIHRhYmxlcy5cbiAgLnRhYmxlID4gdGhlYWQgPiB0cixcbiAgLnRhYmxlID4gdGJvZHkgPiB0cixcbiAgLnRhYmxlID4gdGZvb3QgPiB0ciB7XG4gICAgPiB0ZC5Ae3N0YXRlfSxcbiAgICA+IHRoLkB7c3RhdGV9LFxuICAgICYuQHtzdGF0ZX0gPiB0ZCxcbiAgICAmLkB7c3RhdGV9ID4gdGgge1xuICAgICAgYmFja2dyb3VuZC1jb2xvcjogQGJhY2tncm91bmQ7XG4gICAgfVxuICB9XG5cbiAgLy8gSG92ZXIgc3RhdGVzIGZvciBgLnRhYmxlLWhvdmVyYFxuICAvLyBOb3RlOiB0aGlzIGlzIG5vdCBhdmFpbGFibGUgZm9yIGNlbGxzIG9yIHJvd3Mgd2l0aGluIGB0aGVhZGAgb3IgYHRmb290YC5cbiAgLnRhYmxlLWhvdmVyID4gdGJvZHkgPiB0ciB7XG4gICAgPiB0ZC5Ae3N0YXRlfTpob3ZlcixcbiAgICA+IHRoLkB7c3RhdGV9OmhvdmVyLFxuICAgICYuQHtzdGF0ZX06aG92ZXIgPiB0ZCxcbiAgICAmOmhvdmVyID4gLkB7c3RhdGV9LFxuICAgICYuQHtzdGF0ZX06aG92ZXIgPiB0aCB7XG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBkYXJrZW4oQGJhY2tncm91bmQsIDUlKTtcbiAgICB9XG4gIH1cbn1cbiIsIi8vXG4vLyBGb3Jtc1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuXG4vLyBOb3JtYWxpemUgbm9uLWNvbnRyb2xzXG4vL1xuLy8gUmVzdHlsZSBhbmQgYmFzZWxpbmUgbm9uLWNvbnRyb2wgZm9ybSBlbGVtZW50cy5cblxuZmllbGRzZXQge1xuICBwYWRkaW5nOiAwO1xuICBtYXJnaW46IDA7XG4gIGJvcmRlcjogMDtcbiAgLy8gQ2hyb21lIGFuZCBGaXJlZm94IHNldCBhIGBtaW4td2lkdGg6IG1pbi1jb250ZW50O2Agb24gZmllbGRzZXRzLFxuICAvLyBzbyB3ZSByZXNldCB0aGF0IHRvIGVuc3VyZSBpdCBiZWhhdmVzIG1vcmUgbGlrZSBhIHN0YW5kYXJkIGJsb2NrIGVsZW1lbnQuXG4gIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvaXNzdWVzLzEyMzU5LlxuICBtaW4td2lkdGg6IDA7XG59XG5cbmxlZ2VuZCB7XG4gIGRpc3BsYXk6IGJsb2NrO1xuICB3aWR0aDogMTAwJTtcbiAgcGFkZGluZzogMDtcbiAgbWFyZ2luLWJvdHRvbTogQGxpbmUtaGVpZ2h0LWNvbXB1dGVkO1xuICBmb250LXNpemU6IChAZm9udC1zaXplLWJhc2UgKiAxLjUpO1xuICBsaW5lLWhlaWdodDogaW5oZXJpdDtcbiAgY29sb3I6IEBsZWdlbmQtY29sb3I7XG4gIGJvcmRlcjogMDtcbiAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIEBsZWdlbmQtYm9yZGVyLWNvbG9yO1xufVxuXG5sYWJlbCB7XG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgbWF4LXdpZHRoOiAxMDAlOyAvLyBGb3JjZSBJRTggdG8gd3JhcCBsb25nIGNvbnRlbnQgKHNlZSBodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvaXNzdWVzLzEzMTQxKVxuICBtYXJnaW4tYm90dG9tOiA1cHg7XG4gIGZvbnQtd2VpZ2h0OiBib2xkO1xufVxuXG5cbi8vIE5vcm1hbGl6ZSBmb3JtIGNvbnRyb2xzXG4vL1xuLy8gV2hpbGUgbW9zdCBvZiBvdXIgZm9ybSBzdHlsZXMgcmVxdWlyZSBleHRyYSBjbGFzc2VzLCBzb21lIGJhc2ljIG5vcm1hbGl6YXRpb25cbi8vIGlzIHJlcXVpcmVkIHRvIGVuc3VyZSBvcHRpbXVtIGRpc3BsYXkgd2l0aCBvciB3aXRob3V0IHRob3NlIGNsYXNzZXMgdG8gYmV0dGVyXG4vLyBhZGRyZXNzIGJyb3dzZXIgaW5jb25zaXN0ZW5jaWVzLlxuXG4vLyBPdmVycmlkZSBjb250ZW50LWJveCBpbiBOb3JtYWxpemUgKCogaXNuJ3Qgc3BlY2lmaWMgZW5vdWdoKVxuaW5wdXRbdHlwZT1cInNlYXJjaFwiXSB7XG4gIC5ib3gtc2l6aW5nKGJvcmRlci1ib3gpO1xufVxuXG4vLyBQb3NpdGlvbiByYWRpb3MgYW5kIGNoZWNrYm94ZXMgYmV0dGVyXG5pbnB1dFt0eXBlPVwicmFkaW9cIl0sXG5pbnB1dFt0eXBlPVwiY2hlY2tib3hcIl0ge1xuICBtYXJnaW46IDRweCAwIDA7XG4gIG1hcmdpbi10b3A6IDFweCBcXDk7IC8vIElFOC05XG4gIGxpbmUtaGVpZ2h0OiBub3JtYWw7XG59XG5cbi8vIFNldCB0aGUgaGVpZ2h0IG9mIGZpbGUgY29udHJvbHMgdG8gbWF0Y2ggdGV4dCBpbnB1dHNcbmlucHV0W3R5cGU9XCJmaWxlXCJdIHtcbiAgZGlzcGxheTogYmxvY2s7XG59XG5cbi8vIE1ha2UgcmFuZ2UgaW5wdXRzIGJlaGF2ZSBsaWtlIHRleHR1YWwgZm9ybSBjb250cm9sc1xuaW5wdXRbdHlwZT1cInJhbmdlXCJdIHtcbiAgZGlzcGxheTogYmxvY2s7XG4gIHdpZHRoOiAxMDAlO1xufVxuXG4vLyBNYWtlIG11bHRpcGxlIHNlbGVjdCBlbGVtZW50cyBoZWlnaHQgbm90IGZpeGVkXG5zZWxlY3RbbXVsdGlwbGVdLFxuc2VsZWN0W3NpemVdIHtcbiAgaGVpZ2h0OiBhdXRvO1xufVxuXG4vLyBGb2N1cyBmb3IgZmlsZSwgcmFkaW8sIGFuZCBjaGVja2JveFxuaW5wdXRbdHlwZT1cImZpbGVcIl06Zm9jdXMsXG5pbnB1dFt0eXBlPVwicmFkaW9cIl06Zm9jdXMsXG5pbnB1dFt0eXBlPVwiY2hlY2tib3hcIl06Zm9jdXMge1xuICAudGFiLWZvY3VzKCk7XG59XG5cbi8vIEFkanVzdCBvdXRwdXQgZWxlbWVudFxub3V0cHV0IHtcbiAgZGlzcGxheTogYmxvY2s7XG4gIHBhZGRpbmctdG9wOiAoQHBhZGRpbmctYmFzZS12ZXJ0aWNhbCArIDEpO1xuICBmb250LXNpemU6IEBmb250LXNpemUtYmFzZTtcbiAgbGluZS1oZWlnaHQ6IEBsaW5lLWhlaWdodC1iYXNlO1xuICBjb2xvcjogQGlucHV0LWNvbG9yO1xufVxuXG5cbi8vIENvbW1vbiBmb3JtIGNvbnRyb2xzXG4vL1xuLy8gU2hhcmVkIHNpemUgYW5kIHR5cGUgcmVzZXRzIGZvciBmb3JtIGNvbnRyb2xzLiBBcHBseSBgLmZvcm0tY29udHJvbGAgdG8gYW55XG4vLyBvZiB0aGUgZm9sbG93aW5nIGZvcm0gY29udHJvbHM6XG4vL1xuLy8gc2VsZWN0XG4vLyB0ZXh0YXJlYVxuLy8gaW5wdXRbdHlwZT1cInRleHRcIl1cbi8vIGlucHV0W3R5cGU9XCJwYXNzd29yZFwiXVxuLy8gaW5wdXRbdHlwZT1cImRhdGV0aW1lXCJdXG4vLyBpbnB1dFt0eXBlPVwiZGF0ZXRpbWUtbG9jYWxcIl1cbi8vIGlucHV0W3R5cGU9XCJkYXRlXCJdXG4vLyBpbnB1dFt0eXBlPVwibW9udGhcIl1cbi8vIGlucHV0W3R5cGU9XCJ0aW1lXCJdXG4vLyBpbnB1dFt0eXBlPVwid2Vla1wiXVxuLy8gaW5wdXRbdHlwZT1cIm51bWJlclwiXVxuLy8gaW5wdXRbdHlwZT1cImVtYWlsXCJdXG4vLyBpbnB1dFt0eXBlPVwidXJsXCJdXG4vLyBpbnB1dFt0eXBlPVwic2VhcmNoXCJdXG4vLyBpbnB1dFt0eXBlPVwidGVsXCJdXG4vLyBpbnB1dFt0eXBlPVwiY29sb3JcIl1cblxuLmZvcm0tY29udHJvbCB7XG4gIGRpc3BsYXk6IGJsb2NrO1xuICB3aWR0aDogMTAwJTtcbiAgaGVpZ2h0OiBAaW5wdXQtaGVpZ2h0LWJhc2U7IC8vIE1ha2UgaW5wdXRzIGF0IGxlYXN0IHRoZSBoZWlnaHQgb2YgdGhlaXIgYnV0dG9uIGNvdW50ZXJwYXJ0IChiYXNlIGxpbmUtaGVpZ2h0ICsgcGFkZGluZyArIGJvcmRlcilcbiAgcGFkZGluZzogQHBhZGRpbmctYmFzZS12ZXJ0aWNhbCBAcGFkZGluZy1iYXNlLWhvcml6b250YWw7XG4gIGZvbnQtc2l6ZTogQGZvbnQtc2l6ZS1iYXNlO1xuICBsaW5lLWhlaWdodDogQGxpbmUtaGVpZ2h0LWJhc2U7XG4gIGNvbG9yOiBAaW5wdXQtY29sb3I7XG4gIGJhY2tncm91bmQtY29sb3I6IEBpbnB1dC1iZztcbiAgYmFja2dyb3VuZC1pbWFnZTogbm9uZTsgLy8gUmVzZXQgdW51c3VhbCBGaXJlZm94LW9uLUFuZHJvaWQgZGVmYXVsdCBzdHlsZTsgc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9uZWNvbGFzL25vcm1hbGl6ZS5jc3MvaXNzdWVzLzIxNFxuICBib3JkZXI6IDFweCBzb2xpZCBAaW5wdXQtYm9yZGVyO1xuICBib3JkZXItcmFkaXVzOiBAaW5wdXQtYm9yZGVyLXJhZGl1cztcbiAgLmJveC1zaGFkb3coaW5zZXQgMCAxcHggMXB4IHJnYmEoMCwwLDAsLjA3NSkpO1xuICAudHJhbnNpdGlvbih+XCJib3JkZXItY29sb3IgZWFzZS1pbi1vdXQgLjE1cywgYm94LXNoYWRvdyBlYXNlLWluLW91dCAuMTVzXCIpO1xuXG4gIC8vIEN1c3RvbWl6ZSB0aGUgYDpmb2N1c2Agc3RhdGUgdG8gaW1pdGF0ZSBuYXRpdmUgV2ViS2l0IHN0eWxlcy5cbiAgLmZvcm0tY29udHJvbC1mb2N1cygpO1xuXG4gIC8vIFBsYWNlaG9sZGVyXG4gIC5wbGFjZWhvbGRlcigpO1xuXG4gIC8vIERpc2FibGVkIGFuZCByZWFkLW9ubHkgaW5wdXRzXG4gIC8vXG4gIC8vIEhUTUw1IHNheXMgdGhhdCBjb250cm9scyB1bmRlciBhIGZpZWxkc2V0ID4gbGVnZW5kOmZpcnN0LWNoaWxkIHdvbid0IGJlXG4gIC8vIGRpc2FibGVkIGlmIHRoZSBmaWVsZHNldCBpcyBkaXNhYmxlZC4gRHVlIHRvIGltcGxlbWVudGF0aW9uIGRpZmZpY3VsdHksIHdlXG4gIC8vIGRvbid0IGhvbm9yIHRoYXQgZWRnZSBjYXNlOyB3ZSBzdHlsZSB0aGVtIGFzIGRpc2FibGVkIGFueXdheS5cbiAgJltkaXNhYmxlZF0sXG4gICZbcmVhZG9ubHldLFxuICBmaWVsZHNldFtkaXNhYmxlZF0gJiB7XG4gICAgY3Vyc29yOiBAY3Vyc29yLWRpc2FibGVkO1xuICAgIGJhY2tncm91bmQtY29sb3I6IEBpbnB1dC1iZy1kaXNhYmxlZDtcbiAgICBvcGFjaXR5OiAxOyAvLyBpT1MgZml4IGZvciB1bnJlYWRhYmxlIGRpc2FibGVkIGNvbnRlbnRcbiAgfVxuXG4gIC8vIFJlc2V0IGhlaWdodCBmb3IgYHRleHRhcmVhYHNcbiAgdGV4dGFyZWEmIHtcbiAgICBoZWlnaHQ6IGF1dG87XG4gIH1cbn1cblxuXG4vLyBTZWFyY2ggaW5wdXRzIGluIGlPU1xuLy9cbi8vIFRoaXMgb3ZlcnJpZGVzIHRoZSBleHRyYSByb3VuZGVkIGNvcm5lcnMgb24gc2VhcmNoIGlucHV0cyBpbiBpT1Mgc28gdGhhdCBvdXJcbi8vIGAuZm9ybS1jb250cm9sYCBjbGFzcyBjYW4gcHJvcGVybHkgc3R5bGUgdGhlbS4gTm90ZSB0aGF0IHRoaXMgY2Fubm90IHNpbXBseVxuLy8gYmUgYWRkZWQgdG8gYC5mb3JtLWNvbnRyb2xgIGFzIGl0J3Mgbm90IHNwZWNpZmljIGVub3VnaC4gRm9yIGRldGFpbHMsIHNlZVxuLy8gaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2lzc3Vlcy8xMTU4Ni5cblxuaW5wdXRbdHlwZT1cInNlYXJjaFwiXSB7XG4gIC13ZWJraXQtYXBwZWFyYW5jZTogbm9uZTtcbn1cblxuXG4vLyBTcGVjaWFsIHN0eWxlcyBmb3IgaU9TIHRlbXBvcmFsIGlucHV0c1xuLy9cbi8vIEluIE1vYmlsZSBTYWZhcmksIHNldHRpbmcgYGRpc3BsYXk6IGJsb2NrYCBvbiB0ZW1wb3JhbCBpbnB1dHMgY2F1c2VzIHRoZVxuLy8gdGV4dCB3aXRoaW4gdGhlIGlucHV0IHRvIGJlY29tZSB2ZXJ0aWNhbGx5IG1pc2FsaWduZWQuXG4vLyBBcyBhIHdvcmthcm91bmQsIHdlIHNldCBhIHBpeGVsIGxpbmUtaGVpZ2h0IHRoYXQgbWF0Y2hlcyB0aGVcbi8vIGdpdmVuIGhlaWdodCBvZiB0aGUgaW5wdXQuIFNpbmNlIHRoaXMgZnVja3MgdXAgZXZlcnl0aGluZyBlbHNlLCB3ZSBoYXZlIHRvXG4vLyBhcHByb3ByaWF0ZWx5IHJlc2V0IGl0IGZvciBJbnRlcm5ldCBFeHBsb3JlciBhbmQgdGhlIHNpemUgdmFyaWF0aW9ucy5cblxuaW5wdXRbdHlwZT1cImRhdGVcIl0sXG5pbnB1dFt0eXBlPVwidGltZVwiXSxcbmlucHV0W3R5cGU9XCJkYXRldGltZS1sb2NhbFwiXSxcbmlucHV0W3R5cGU9XCJtb250aFwiXSB7XG4gIGxpbmUtaGVpZ2h0OiBAaW5wdXQtaGVpZ2h0LWJhc2U7XG4gIC8vIElFOCsgbWlzYWxpZ25zIHRoZSB0ZXh0IHdpdGhpbiBkYXRlIGlucHV0cywgc28gd2UgcmVzZXRcbiAgbGluZS1oZWlnaHQ6IEBsaW5lLWhlaWdodC1iYXNlIH5cIlxcMFwiO1xuXG4gICYuaW5wdXQtc20ge1xuICAgIGxpbmUtaGVpZ2h0OiBAaW5wdXQtaGVpZ2h0LXNtYWxsO1xuICAgIGxpbmUtaGVpZ2h0OiBAbGluZS1oZWlnaHQtc21hbGwgflwiXFwwXCI7XG4gIH1cbiAgJi5pbnB1dC1sZyB7XG4gICAgbGluZS1oZWlnaHQ6IEBpbnB1dC1oZWlnaHQtbGFyZ2U7XG4gICAgbGluZS1oZWlnaHQ6IEBsaW5lLWhlaWdodC1sYXJnZSB+XCJcXDBcIjtcbiAgfVxufVxuXG4vLyBJRSAxMSBoYWNrIHRvIHJldmVyc2UgdGhlIGlPUyB0ZW1wb3JhbCBpbnB1dCBoYWNrLlxuXzotbXMtZnVsbHNjcmVlbiwgOnJvb3QgaW5wdXRbdHlwZT1cImRhdGVcIl0sXG5fOi1tcy1mdWxsc2NyZWVuLCA6cm9vdCBpbnB1dFt0eXBlPVwidGltZVwiXSxcbl86LW1zLWZ1bGxzY3JlZW4sIDpyb290IGlucHV0W3R5cGU9XCJkYXRldGltZS1sb2NhbFwiXSxcbl86LW1zLWZ1bGxzY3JlZW4sIDpyb290IGlucHV0W3R5cGU9XCJtb250aFwiXSB7XG4gIGxpbmUtaGVpZ2h0OiBAbGluZS1oZWlnaHQtYmFzZTtcblxuICAmLmlucHV0LXNtIHtcbiAgICBsaW5lLWhlaWdodDogQGxpbmUtaGVpZ2h0LXNtYWxsO1xuICB9XG4gICYuaW5wdXQtbGcge1xuICAgIGxpbmUtaGVpZ2h0OiBAbGluZS1oZWlnaHQtbGFyZ2U7XG4gIH1cbn1cblxuXG4vLyBGb3JtIGdyb3Vwc1xuLy9cbi8vIERlc2lnbmVkIHRvIGhlbHAgd2l0aCB0aGUgb3JnYW5pemF0aW9uIGFuZCBzcGFjaW5nIG9mIHZlcnRpY2FsIGZvcm1zLiBGb3Jcbi8vIGhvcml6b250YWwgZm9ybXMsIHVzZSB0aGUgcHJlZGVmaW5lZCBncmlkIGNsYXNzZXMuXG5cbi5mb3JtLWdyb3VwIHtcbiAgbWFyZ2luLWJvdHRvbTogMTVweDtcbn1cblxuXG4vLyBDaGVja2JveGVzIGFuZCByYWRpb3Ncbi8vXG4vLyBJbmRlbnQgdGhlIGxhYmVscyB0byBwb3NpdGlvbiByYWRpb3MvY2hlY2tib3hlcyBhcyBoYW5naW5nIGNvbnRyb2xzLlxuXG4ucmFkaW8sXG4uY2hlY2tib3gge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIGRpc3BsYXk6IGJsb2NrO1xuICBtYXJnaW4tdG9wOiAxMHB4O1xuICBtYXJnaW4tYm90dG9tOiAxMHB4O1xuXG4gIGxhYmVsIHtcbiAgICBtaW4taGVpZ2h0OiBAbGluZS1oZWlnaHQtY29tcHV0ZWQ7IC8vIEVuc3VyZSB0aGUgaW5wdXQgZG9lc24ndCBqdW1wIHdoZW4gdGhlcmUgaXMgbm8gdGV4dFxuICAgIHBhZGRpbmctbGVmdDogMjBweDtcbiAgICBtYXJnaW4tYm90dG9tOiAwO1xuICAgIGZvbnQtd2VpZ2h0OiBub3JtYWw7XG4gICAgY3Vyc29yOiBwb2ludGVyO1xuICB9XG59XG4ucmFkaW8gaW5wdXRbdHlwZT1cInJhZGlvXCJdLFxuLnJhZGlvLWlubGluZSBpbnB1dFt0eXBlPVwicmFkaW9cIl0sXG4uY2hlY2tib3ggaW5wdXRbdHlwZT1cImNoZWNrYm94XCJdLFxuLmNoZWNrYm94LWlubGluZSBpbnB1dFt0eXBlPVwiY2hlY2tib3hcIl0ge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIG1hcmdpbi1sZWZ0OiAtMjBweDtcbiAgbWFyZ2luLXRvcDogNHB4IFxcOTtcbn1cblxuLnJhZGlvICsgLnJhZGlvLFxuLmNoZWNrYm94ICsgLmNoZWNrYm94IHtcbiAgbWFyZ2luLXRvcDogLTVweDsgLy8gTW92ZSB1cCBzaWJsaW5nIHJhZGlvcyBvciBjaGVja2JveGVzIGZvciB0aWdodGVyIHNwYWNpbmdcbn1cblxuLy8gUmFkaW9zIGFuZCBjaGVja2JveGVzIG9uIHNhbWUgbGluZVxuLnJhZGlvLWlubGluZSxcbi5jaGVja2JveC1pbmxpbmUge1xuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gIHBhZGRpbmctbGVmdDogMjBweDtcbiAgbWFyZ2luLWJvdHRvbTogMDtcbiAgdmVydGljYWwtYWxpZ246IG1pZGRsZTtcbiAgZm9udC13ZWlnaHQ6IG5vcm1hbDtcbiAgY3Vyc29yOiBwb2ludGVyO1xufVxuLnJhZGlvLWlubGluZSArIC5yYWRpby1pbmxpbmUsXG4uY2hlY2tib3gtaW5saW5lICsgLmNoZWNrYm94LWlubGluZSB7XG4gIG1hcmdpbi10b3A6IDA7XG4gIG1hcmdpbi1sZWZ0OiAxMHB4OyAvLyBzcGFjZSBvdXQgY29uc2VjdXRpdmUgaW5saW5lIGNvbnRyb2xzXG59XG5cbi8vIEFwcGx5IHNhbWUgZGlzYWJsZWQgY3Vyc29yIHR3ZWFrIGFzIGZvciBpbnB1dHNcbi8vIFNvbWUgc3BlY2lhbCBjYXJlIGlzIG5lZWRlZCBiZWNhdXNlIDxsYWJlbD5zIGRvbid0IGluaGVyaXQgdGhlaXIgcGFyZW50J3MgYGN1cnNvcmAuXG4vL1xuLy8gTm90ZTogTmVpdGhlciByYWRpb3Mgbm9yIGNoZWNrYm94ZXMgY2FuIGJlIHJlYWRvbmx5LlxuaW5wdXRbdHlwZT1cInJhZGlvXCJdLFxuaW5wdXRbdHlwZT1cImNoZWNrYm94XCJdIHtcbiAgJltkaXNhYmxlZF0sXG4gICYuZGlzYWJsZWQsXG4gIGZpZWxkc2V0W2Rpc2FibGVkXSAmIHtcbiAgICBjdXJzb3I6IEBjdXJzb3ItZGlzYWJsZWQ7XG4gIH1cbn1cbi8vIFRoZXNlIGNsYXNzZXMgYXJlIHVzZWQgZGlyZWN0bHkgb24gPGxhYmVsPnNcbi5yYWRpby1pbmxpbmUsXG4uY2hlY2tib3gtaW5saW5lIHtcbiAgJi5kaXNhYmxlZCxcbiAgZmllbGRzZXRbZGlzYWJsZWRdICYge1xuICAgIGN1cnNvcjogQGN1cnNvci1kaXNhYmxlZDtcbiAgfVxufVxuLy8gVGhlc2UgY2xhc3NlcyBhcmUgdXNlZCBvbiBlbGVtZW50cyB3aXRoIDxsYWJlbD4gZGVzY2VuZGFudHNcbi5yYWRpbyxcbi5jaGVja2JveCB7XG4gICYuZGlzYWJsZWQsXG4gIGZpZWxkc2V0W2Rpc2FibGVkXSAmIHtcbiAgICBsYWJlbCB7XG4gICAgICBjdXJzb3I6IEBjdXJzb3ItZGlzYWJsZWQ7XG4gICAgfVxuICB9XG59XG5cblxuLy8gU3RhdGljIGZvcm0gY29udHJvbCB0ZXh0XG4vL1xuLy8gQXBwbHkgY2xhc3MgdG8gYSBgcGAgZWxlbWVudCB0byBtYWtlIGFueSBzdHJpbmcgb2YgdGV4dCBhbGlnbiB3aXRoIGxhYmVscyBpblxuLy8gYSBob3Jpem9udGFsIGZvcm0gbGF5b3V0LlxuXG4uZm9ybS1jb250cm9sLXN0YXRpYyB7XG4gIC8vIFNpemUgaXQgYXBwcm9wcmlhdGVseSBuZXh0IHRvIHJlYWwgZm9ybSBjb250cm9sc1xuICBwYWRkaW5nLXRvcDogKEBwYWRkaW5nLWJhc2UtdmVydGljYWwgKyAxKTtcbiAgcGFkZGluZy1ib3R0b206IChAcGFkZGluZy1iYXNlLXZlcnRpY2FsICsgMSk7XG4gIC8vIFJlbW92ZSBkZWZhdWx0IG1hcmdpbiBmcm9tIGBwYFxuICBtYXJnaW4tYm90dG9tOiAwO1xuXG4gICYuaW5wdXQtbGcsXG4gICYuaW5wdXQtc20ge1xuICAgIHBhZGRpbmctbGVmdDogMDtcbiAgICBwYWRkaW5nLXJpZ2h0OiAwO1xuICB9XG59XG5cblxuLy8gRm9ybSBjb250cm9sIHNpemluZ1xuLy9cbi8vIEJ1aWxkIG9uIGAuZm9ybS1jb250cm9sYCB3aXRoIG1vZGlmaWVyIGNsYXNzZXMgdG8gZGVjcmVhc2Ugb3IgaW5jcmVhc2UgdGhlXG4vLyBoZWlnaHQgYW5kIGZvbnQtc2l6ZSBvZiBmb3JtIGNvbnRyb2xzLlxuXG4uaW5wdXQtc20sXG4uZm9ybS1ncm91cC1zbSAuZm9ybS1jb250cm9sIHtcbiAgLmlucHV0LXNpemUoQGlucHV0LWhlaWdodC1zbWFsbDsgQHBhZGRpbmctc21hbGwtdmVydGljYWw7IEBwYWRkaW5nLXNtYWxsLWhvcml6b250YWw7IEBmb250LXNpemUtc21hbGw7IEBsaW5lLWhlaWdodC1zbWFsbDsgQGlucHV0LWJvcmRlci1yYWRpdXMtc21hbGwpO1xufVxuXG4uaW5wdXQtbGcsXG4uZm9ybS1ncm91cC1sZyAuZm9ybS1jb250cm9sIHtcbiAgLmlucHV0LXNpemUoQGlucHV0LWhlaWdodC1sYXJnZTsgQHBhZGRpbmctbGFyZ2UtdmVydGljYWw7IEBwYWRkaW5nLWxhcmdlLWhvcml6b250YWw7IEBmb250LXNpemUtbGFyZ2U7IEBsaW5lLWhlaWdodC1sYXJnZTsgQGlucHV0LWJvcmRlci1yYWRpdXMtbGFyZ2UpO1xufVxuXG5cbi8vIEZvcm0gY29udHJvbCBmZWVkYmFjayBzdGF0ZXNcbi8vXG4vLyBBcHBseSBjb250ZXh0dWFsIGFuZCBzZW1hbnRpYyBzdGF0ZXMgdG8gaW5kaXZpZHVhbCBmb3JtIGNvbnRyb2xzLlxuXG4uaGFzLWZlZWRiYWNrIHtcbiAgLy8gRW5hYmxlIGFic29sdXRlIHBvc2l0aW9uaW5nXG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcblxuICAvLyBFbnN1cmUgaWNvbnMgZG9uJ3Qgb3ZlcmxhcCB0ZXh0XG4gIC5mb3JtLWNvbnRyb2wge1xuICAgIHBhZGRpbmctcmlnaHQ6IChAaW5wdXQtaGVpZ2h0LWJhc2UgKiAxLjI1KTtcbiAgfVxufVxuLy8gRmVlZGJhY2sgaWNvbiAocmVxdWlyZXMgLmdseXBoaWNvbiBjbGFzc2VzKVxuLmZvcm0tY29udHJvbC1mZWVkYmFjayB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgdG9wOiAwO1xuICByaWdodDogMDtcbiAgei1pbmRleDogMjsgLy8gRW5zdXJlIGljb24gaXMgYWJvdmUgaW5wdXQgZ3JvdXBzXG4gIGRpc3BsYXk6IGJsb2NrO1xuICB3aWR0aDogQGlucHV0LWhlaWdodC1iYXNlO1xuICBoZWlnaHQ6IEBpbnB1dC1oZWlnaHQtYmFzZTtcbiAgbGluZS1oZWlnaHQ6IEBpbnB1dC1oZWlnaHQtYmFzZTtcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xuICBwb2ludGVyLWV2ZW50czogbm9uZTtcbn1cbi5pbnB1dC1sZyArIC5mb3JtLWNvbnRyb2wtZmVlZGJhY2sge1xuICB3aWR0aDogQGlucHV0LWhlaWdodC1sYXJnZTtcbiAgaGVpZ2h0OiBAaW5wdXQtaGVpZ2h0LWxhcmdlO1xuICBsaW5lLWhlaWdodDogQGlucHV0LWhlaWdodC1sYXJnZTtcbn1cbi5pbnB1dC1zbSArIC5mb3JtLWNvbnRyb2wtZmVlZGJhY2sge1xuICB3aWR0aDogQGlucHV0LWhlaWdodC1zbWFsbDtcbiAgaGVpZ2h0OiBAaW5wdXQtaGVpZ2h0LXNtYWxsO1xuICBsaW5lLWhlaWdodDogQGlucHV0LWhlaWdodC1zbWFsbDtcbn1cblxuLy8gRmVlZGJhY2sgc3RhdGVzXG4uaGFzLXN1Y2Nlc3Mge1xuICAuZm9ybS1jb250cm9sLXZhbGlkYXRpb24oQHN0YXRlLXN1Y2Nlc3MtdGV4dDsgQHN0YXRlLXN1Y2Nlc3MtdGV4dDsgQHN0YXRlLXN1Y2Nlc3MtYmcpO1xufVxuLmhhcy13YXJuaW5nIHtcbiAgLmZvcm0tY29udHJvbC12YWxpZGF0aW9uKEBzdGF0ZS13YXJuaW5nLXRleHQ7IEBzdGF0ZS13YXJuaW5nLXRleHQ7IEBzdGF0ZS13YXJuaW5nLWJnKTtcbn1cbi5oYXMtZXJyb3Ige1xuICAuZm9ybS1jb250cm9sLXZhbGlkYXRpb24oQHN0YXRlLWRhbmdlci10ZXh0OyBAc3RhdGUtZGFuZ2VyLXRleHQ7IEBzdGF0ZS1kYW5nZXItYmcpO1xufVxuXG4vLyBSZXBvc2l0aW9uIGZlZWRiYWNrIGljb24gaWYgaW5wdXQgaGFzIHZpc2libGUgbGFiZWwgYWJvdmVcbi5oYXMtZmVlZGJhY2sgbGFiZWwge1xuXG4gICYgfiAuZm9ybS1jb250cm9sLWZlZWRiYWNrIHtcbiAgICAgdG9wOiAoQGxpbmUtaGVpZ2h0LWNvbXB1dGVkICsgNSk7IC8vIEhlaWdodCBvZiB0aGUgYGxhYmVsYCBhbmQgaXRzIG1hcmdpblxuICB9XG4gICYuc3Itb25seSB+IC5mb3JtLWNvbnRyb2wtZmVlZGJhY2sge1xuICAgICB0b3A6IDA7XG4gIH1cbn1cblxuXG4vLyBIZWxwIHRleHRcbi8vXG4vLyBBcHBseSB0byBhbnkgZWxlbWVudCB5b3Ugd2lzaCB0byBjcmVhdGUgbGlnaHQgdGV4dCBmb3IgcGxhY2VtZW50IGltbWVkaWF0ZWx5XG4vLyBiZWxvdyBhIGZvcm0gY29udHJvbC4gVXNlIGZvciBnZW5lcmFsIGhlbHAsIGZvcm1hdHRpbmcsIG9yIGluc3RydWN0aW9uYWwgdGV4dC5cblxuLmhlbHAtYmxvY2sge1xuICBkaXNwbGF5OiBibG9jazsgLy8gYWNjb3VudCBmb3IgYW55IGVsZW1lbnQgdXNpbmcgaGVscC1ibG9ja1xuICBtYXJnaW4tdG9wOiA1cHg7XG4gIG1hcmdpbi1ib3R0b206IDEwcHg7XG4gIGNvbG9yOiBsaWdodGVuKEB0ZXh0LWNvbG9yLCAyNSUpOyAvLyBsaWdodGVuIHRoZSB0ZXh0IHNvbWUgZm9yIGNvbnRyYXN0XG59XG5cblxuLy8gSW5saW5lIGZvcm1zXG4vL1xuLy8gTWFrZSBmb3JtcyBhcHBlYXIgaW5saW5lKC1ibG9jaykgYnkgYWRkaW5nIHRoZSBgLmZvcm0taW5saW5lYCBjbGFzcy4gSW5saW5lXG4vLyBmb3JtcyBiZWdpbiBzdGFja2VkIG9uIGV4dHJhIHNtYWxsIChtb2JpbGUpIGRldmljZXMgYW5kIHRoZW4gZ28gaW5saW5lIHdoZW5cbi8vIHZpZXdwb3J0cyByZWFjaCA8NzY4cHguXG4vL1xuLy8gUmVxdWlyZXMgd3JhcHBpbmcgaW5wdXRzIGFuZCBsYWJlbHMgd2l0aCBgLmZvcm0tZ3JvdXBgIGZvciBwcm9wZXIgZGlzcGxheSBvZlxuLy8gZGVmYXVsdCBIVE1MIGZvcm0gY29udHJvbHMgYW5kIG91ciBjdXN0b20gZm9ybSBjb250cm9scyAoZS5nLiwgaW5wdXQgZ3JvdXBzKS5cbi8vXG4vLyBIZWFkcyB1cCEgVGhpcyBpcyBtaXhpbi1lZCBpbnRvIGAubmF2YmFyLWZvcm1gIGluIG5hdmJhcnMubGVzcy5cblxuLmZvcm0taW5saW5lIHtcblxuICAvLyBLaWNrIGluIHRoZSBpbmxpbmVcbiAgQG1lZGlhIChtaW4td2lkdGg6IEBzY3JlZW4tc20tbWluKSB7XG4gICAgLy8gSW5saW5lLWJsb2NrIGFsbCB0aGUgdGhpbmdzIGZvciBcImlubGluZVwiXG4gICAgLmZvcm0tZ3JvdXAge1xuICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgICAgbWFyZ2luLWJvdHRvbTogMDtcbiAgICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XG4gICAgfVxuXG4gICAgLy8gSW4gbmF2YmFyLWZvcm0sIGFsbG93IGZvbGtzIHRvICpub3QqIHVzZSBgLmZvcm0tZ3JvdXBgXG4gICAgLmZvcm0tY29udHJvbCB7XG4gICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gICAgICB3aWR0aDogYXV0bzsgLy8gUHJldmVudCBsYWJlbHMgZnJvbSBzdGFja2luZyBhYm92ZSBpbnB1dHMgaW4gYC5mb3JtLWdyb3VwYFxuICAgICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTtcbiAgICB9XG5cbiAgICAvLyBNYWtlIHN0YXRpYyBjb250cm9scyBiZWhhdmUgbGlrZSByZWd1bGFyIG9uZXNcbiAgICAuZm9ybS1jb250cm9sLXN0YXRpYyB7XG4gICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gICAgfVxuXG4gICAgLmlucHV0LWdyb3VwIHtcbiAgICAgIGRpc3BsYXk6IGlubGluZS10YWJsZTtcbiAgICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XG5cbiAgICAgIC5pbnB1dC1ncm91cC1hZGRvbixcbiAgICAgIC5pbnB1dC1ncm91cC1idG4sXG4gICAgICAuZm9ybS1jb250cm9sIHtcbiAgICAgICAgd2lkdGg6IGF1dG87XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gSW5wdXQgZ3JvdXBzIG5lZWQgdGhhdCAxMDAlIHdpZHRoIHRob3VnaFxuICAgIC5pbnB1dC1ncm91cCA+IC5mb3JtLWNvbnRyb2wge1xuICAgICAgd2lkdGg6IDEwMCU7XG4gICAgfVxuXG4gICAgLmNvbnRyb2wtbGFiZWwge1xuICAgICAgbWFyZ2luLWJvdHRvbTogMDtcbiAgICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XG4gICAgfVxuXG4gICAgLy8gUmVtb3ZlIGRlZmF1bHQgbWFyZ2luIG9uIHJhZGlvcy9jaGVja2JveGVzIHRoYXQgd2VyZSB1c2VkIGZvciBzdGFja2luZywgYW5kXG4gICAgLy8gdGhlbiB1bmRvIHRoZSBmbG9hdGluZyBvZiByYWRpb3MgYW5kIGNoZWNrYm94ZXMgdG8gbWF0Y2ggKHdoaWNoIGFsc28gYXZvaWRzXG4gICAgLy8gYSBidWcgaW4gV2ViS2l0OiBodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvaXNzdWVzLzE5NjkpLlxuICAgIC5yYWRpbyxcbiAgICAuY2hlY2tib3gge1xuICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgICAgbWFyZ2luLXRvcDogMDtcbiAgICAgIG1hcmdpbi1ib3R0b206IDA7XG4gICAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1xuXG4gICAgICBsYWJlbCB7XG4gICAgICAgIHBhZGRpbmctbGVmdDogMDtcbiAgICAgIH1cbiAgICB9XG4gICAgLnJhZGlvIGlucHV0W3R5cGU9XCJyYWRpb1wiXSxcbiAgICAuY2hlY2tib3ggaW5wdXRbdHlwZT1cImNoZWNrYm94XCJdIHtcbiAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICAgIG1hcmdpbi1sZWZ0OiAwO1xuICAgIH1cblxuICAgIC8vIFJlLW92ZXJyaWRlIHRoZSBmZWVkYmFjayBpY29uLlxuICAgIC5oYXMtZmVlZGJhY2sgLmZvcm0tY29udHJvbC1mZWVkYmFjayB7XG4gICAgICB0b3A6IDA7XG4gICAgfVxuICB9XG59XG5cblxuLy8gSG9yaXpvbnRhbCBmb3Jtc1xuLy9cbi8vIEhvcml6b250YWwgZm9ybXMgYXJlIGJ1aWx0IG9uIGdyaWQgY2xhc3NlcyBhbmQgYWxsb3cgeW91IHRvIGNyZWF0ZSBmb3JtcyB3aXRoXG4vLyBsYWJlbHMgb24gdGhlIGxlZnQgYW5kIGlucHV0cyBvbiB0aGUgcmlnaHQuXG5cbi5mb3JtLWhvcml6b250YWwge1xuXG4gIC8vIENvbnNpc3RlbnQgdmVydGljYWwgYWxpZ25tZW50IG9mIHJhZGlvcyBhbmQgY2hlY2tib3hlc1xuICAvL1xuICAvLyBMYWJlbHMgYWxzbyBnZXQgc29tZSByZXNldCBzdHlsZXMsIGJ1dCB0aGF0IGlzIHNjb3BlZCB0byBhIG1lZGlhIHF1ZXJ5IGJlbG93LlxuICAucmFkaW8sXG4gIC5jaGVja2JveCxcbiAgLnJhZGlvLWlubGluZSxcbiAgLmNoZWNrYm94LWlubGluZSB7XG4gICAgbWFyZ2luLXRvcDogMDtcbiAgICBtYXJnaW4tYm90dG9tOiAwO1xuICAgIHBhZGRpbmctdG9wOiAoQHBhZGRpbmctYmFzZS12ZXJ0aWNhbCArIDEpOyAvLyBEZWZhdWx0IHBhZGRpbmcgcGx1cyBhIGJvcmRlclxuICB9XG4gIC8vIEFjY291bnQgZm9yIHBhZGRpbmcgd2UncmUgYWRkaW5nIHRvIGVuc3VyZSB0aGUgYWxpZ25tZW50IGFuZCBvZiBoZWxwIHRleHRcbiAgLy8gYW5kIG90aGVyIGNvbnRlbnQgYmVsb3cgaXRlbXNcbiAgLnJhZGlvLFxuICAuY2hlY2tib3gge1xuICAgIG1pbi1oZWlnaHQ6IChAbGluZS1oZWlnaHQtY29tcHV0ZWQgKyAoQHBhZGRpbmctYmFzZS12ZXJ0aWNhbCArIDEpKTtcbiAgfVxuXG4gIC8vIE1ha2UgZm9ybSBncm91cHMgYmVoYXZlIGxpa2Ugcm93c1xuICAuZm9ybS1ncm91cCB7XG4gICAgLm1ha2Utcm93KCk7XG4gIH1cblxuICAvLyBSZXNldCBzcGFjaW5nIGFuZCByaWdodCBhbGlnbiBsYWJlbHMsIGJ1dCBzY29wZSB0byBtZWRpYSBxdWVyaWVzIHNvIHRoYXRcbiAgLy8gbGFiZWxzIG9uIG5hcnJvdyB2aWV3cG9ydHMgc3RhY2sgdGhlIHNhbWUgYXMgYSBkZWZhdWx0IGZvcm0gZXhhbXBsZS5cbiAgQG1lZGlhIChtaW4td2lkdGg6IEBzY3JlZW4tc20tbWluKSB7XG4gICAgLmNvbnRyb2wtbGFiZWwge1xuICAgICAgdGV4dC1hbGlnbjogcmlnaHQ7XG4gICAgICBtYXJnaW4tYm90dG9tOiAwO1xuICAgICAgcGFkZGluZy10b3A6IChAcGFkZGluZy1iYXNlLXZlcnRpY2FsICsgMSk7IC8vIERlZmF1bHQgcGFkZGluZyBwbHVzIGEgYm9yZGVyXG4gICAgfVxuICB9XG5cbiAgLy8gVmFsaWRhdGlvbiBzdGF0ZXNcbiAgLy9cbiAgLy8gUmVwb3NpdGlvbiB0aGUgaWNvbiBiZWNhdXNlIGl0J3Mgbm93IHdpdGhpbiBhIGdyaWQgY29sdW1uIGFuZCBjb2x1bW5zIGhhdmVcbiAgLy8gYHBvc2l0aW9uOiByZWxhdGl2ZTtgIG9uIHRoZW0uIEFsc28gYWNjb3VudHMgZm9yIHRoZSBncmlkIGd1dHRlciBwYWRkaW5nLlxuICAuaGFzLWZlZWRiYWNrIC5mb3JtLWNvbnRyb2wtZmVlZGJhY2sge1xuICAgIHJpZ2h0OiAoQGdyaWQtZ3V0dGVyLXdpZHRoIC8gMik7XG4gIH1cblxuICAvLyBGb3JtIGdyb3VwIHNpemVzXG4gIC8vXG4gIC8vIFF1aWNrIHV0aWxpdHkgY2xhc3MgZm9yIGFwcGx5aW5nIGAuaW5wdXQtbGdgIGFuZCBgLmlucHV0LXNtYCBzdHlsZXMgdG8gdGhlXG4gIC8vIGlucHV0cyBhbmQgbGFiZWxzIHdpdGhpbiBhIGAuZm9ybS1ncm91cGAuXG4gIC5mb3JtLWdyb3VwLWxnIHtcbiAgICBAbWVkaWEgKG1pbi13aWR0aDogQHNjcmVlbi1zbS1taW4pIHtcbiAgICAgIC5jb250cm9sLWxhYmVsIHtcbiAgICAgICAgcGFkZGluZy10b3A6ICgoQHBhZGRpbmctbGFyZ2UtdmVydGljYWwgKiBAbGluZS1oZWlnaHQtbGFyZ2UpICsgMSk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIC5mb3JtLWdyb3VwLXNtIHtcbiAgICBAbWVkaWEgKG1pbi13aWR0aDogQHNjcmVlbi1zbS1taW4pIHtcbiAgICAgIC5jb250cm9sLWxhYmVsIHtcbiAgICAgICAgcGFkZGluZy10b3A6IChAcGFkZGluZy1zbWFsbC12ZXJ0aWNhbCArIDEpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIiwiLy8gRm9ybSB2YWxpZGF0aW9uIHN0YXRlc1xuLy9cbi8vIFVzZWQgaW4gZm9ybXMubGVzcyB0byBnZW5lcmF0ZSB0aGUgZm9ybSB2YWxpZGF0aW9uIENTUyBmb3Igd2FybmluZ3MsIGVycm9ycyxcbi8vIGFuZCBzdWNjZXNzZXMuXG5cbi5mb3JtLWNvbnRyb2wtdmFsaWRhdGlvbihAdGV4dC1jb2xvcjogIzU1NTsgQGJvcmRlci1jb2xvcjogI2NjYzsgQGJhY2tncm91bmQtY29sb3I6ICNmNWY1ZjUpIHtcbiAgLy8gQ29sb3IgdGhlIGxhYmVsIGFuZCBoZWxwIHRleHRcbiAgLmhlbHAtYmxvY2ssXG4gIC5jb250cm9sLWxhYmVsLFxuICAucmFkaW8sXG4gIC5jaGVja2JveCxcbiAgLnJhZGlvLWlubGluZSxcbiAgLmNoZWNrYm94LWlubGluZSxcbiAgJi5yYWRpbyBsYWJlbCxcbiAgJi5jaGVja2JveCBsYWJlbCxcbiAgJi5yYWRpby1pbmxpbmUgbGFiZWwsXG4gICYuY2hlY2tib3gtaW5saW5lIGxhYmVsICB7XG4gICAgY29sb3I6IEB0ZXh0LWNvbG9yO1xuICB9XG4gIC8vIFNldCB0aGUgYm9yZGVyIGFuZCBib3ggc2hhZG93IG9uIHNwZWNpZmljIGlucHV0cyB0byBtYXRjaFxuICAuZm9ybS1jb250cm9sIHtcbiAgICBib3JkZXItY29sb3I6IEBib3JkZXItY29sb3I7XG4gICAgLmJveC1zaGFkb3coaW5zZXQgMCAxcHggMXB4IHJnYmEoMCwwLDAsLjA3NSkpOyAvLyBSZWRlY2xhcmUgc28gdHJhbnNpdGlvbnMgd29ya1xuICAgICY6Zm9jdXMge1xuICAgICAgYm9yZGVyLWNvbG9yOiBkYXJrZW4oQGJvcmRlci1jb2xvciwgMTAlKTtcbiAgICAgIEBzaGFkb3c6IGluc2V0IDAgMXB4IDFweCByZ2JhKDAsMCwwLC4wNzUpLCAwIDAgNnB4IGxpZ2h0ZW4oQGJvcmRlci1jb2xvciwgMjAlKTtcbiAgICAgIC5ib3gtc2hhZG93KEBzaGFkb3cpO1xuICAgIH1cbiAgfVxuICAvLyBTZXQgdmFsaWRhdGlvbiBzdGF0ZXMgYWxzbyBmb3IgYWRkb25zXG4gIC5pbnB1dC1ncm91cC1hZGRvbiB7XG4gICAgY29sb3I6IEB0ZXh0LWNvbG9yO1xuICAgIGJvcmRlci1jb2xvcjogQGJvcmRlci1jb2xvcjtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAYmFja2dyb3VuZC1jb2xvcjtcbiAgfVxuICAvLyBPcHRpb25hbCBmZWVkYmFjayBpY29uXG4gIC5mb3JtLWNvbnRyb2wtZmVlZGJhY2sge1xuICAgIGNvbG9yOiBAdGV4dC1jb2xvcjtcbiAgfVxufVxuXG5cbi8vIEZvcm0gY29udHJvbCBmb2N1cyBzdGF0ZVxuLy9cbi8vIEdlbmVyYXRlIGEgY3VzdG9taXplZCBmb2N1cyBzdGF0ZSBhbmQgZm9yIGFueSBpbnB1dCB3aXRoIHRoZSBzcGVjaWZpZWQgY29sb3IsXG4vLyB3aGljaCBkZWZhdWx0cyB0byB0aGUgYEBpbnB1dC1ib3JkZXItZm9jdXNgIHZhcmlhYmxlLlxuLy9cbi8vIFdlIGhpZ2hseSBlbmNvdXJhZ2UgeW91IHRvIG5vdCBjdXN0b21pemUgdGhlIGRlZmF1bHQgdmFsdWUsIGJ1dCBpbnN0ZWFkIHVzZVxuLy8gdGhpcyB0byB0d2VhayBjb2xvcnMgb24gYW4gYXMtbmVlZGVkIGJhc2lzLiBUaGlzIGFlc3RoZXRpYyBjaGFuZ2UgaXMgYmFzZWQgb25cbi8vIFdlYktpdCdzIGRlZmF1bHQgc3R5bGVzLCBidXQgYXBwbGljYWJsZSB0byBhIHdpZGVyIHJhbmdlIG9mIGJyb3dzZXJzLiBJdHNcbi8vIHVzYWJpbGl0eSBhbmQgYWNjZXNzaWJpbGl0eSBzaG91bGQgYmUgdGFrZW4gaW50byBhY2NvdW50IHdpdGggYW55IGNoYW5nZS5cbi8vXG4vLyBFeGFtcGxlIHVzYWdlOiBjaGFuZ2UgdGhlIGRlZmF1bHQgYmx1ZSBib3JkZXIgYW5kIHNoYWRvdyB0byB3aGl0ZSBmb3IgYmV0dGVyXG4vLyBjb250cmFzdCBhZ2FpbnN0IGEgZGFyayBncmF5IGJhY2tncm91bmQuXG4uZm9ybS1jb250cm9sLWZvY3VzKEBjb2xvcjogQGlucHV0LWJvcmRlci1mb2N1cykge1xuICBAY29sb3ItcmdiYTogcmdiYShyZWQoQGNvbG9yKSwgZ3JlZW4oQGNvbG9yKSwgYmx1ZShAY29sb3IpLCAuNik7XG4gICY6Zm9jdXMge1xuICAgIGJvcmRlci1jb2xvcjogQGNvbG9yO1xuICAgIG91dGxpbmU6IDA7XG4gICAgLmJveC1zaGFkb3coflwiaW5zZXQgMCAxcHggMXB4IHJnYmEoMCwwLDAsLjA3NSksIDAgMCA4cHggQHtjb2xvci1yZ2JhfVwiKTtcbiAgfVxufVxuXG4vLyBGb3JtIGNvbnRyb2wgc2l6aW5nXG4vL1xuLy8gUmVsYXRpdmUgdGV4dCBzaXplLCBwYWRkaW5nLCBhbmQgYm9yZGVyLXJhZGlpIGNoYW5nZXMgZm9yIGZvcm0gY29udHJvbHMuIEZvclxuLy8gaG9yaXpvbnRhbCBzaXppbmcsIHdyYXAgY29udHJvbHMgaW4gdGhlIHByZWRlZmluZWQgZ3JpZCBjbGFzc2VzLiBgPHNlbGVjdD5gXG4vLyBlbGVtZW50IGdldHMgc3BlY2lhbCBsb3ZlIGJlY2F1c2UgaXQncyBzcGVjaWFsLCBhbmQgdGhhdCdzIGEgZmFjdCFcbi5pbnB1dC1zaXplKEBpbnB1dC1oZWlnaHQ7IEBwYWRkaW5nLXZlcnRpY2FsOyBAcGFkZGluZy1ob3Jpem9udGFsOyBAZm9udC1zaXplOyBAbGluZS1oZWlnaHQ7IEBib3JkZXItcmFkaXVzKSB7XG4gIGhlaWdodDogQGlucHV0LWhlaWdodDtcbiAgcGFkZGluZzogQHBhZGRpbmctdmVydGljYWwgQHBhZGRpbmctaG9yaXpvbnRhbDtcbiAgZm9udC1zaXplOiBAZm9udC1zaXplO1xuICBsaW5lLWhlaWdodDogQGxpbmUtaGVpZ2h0O1xuICBib3JkZXItcmFkaXVzOiBAYm9yZGVyLXJhZGl1cztcblxuICBzZWxlY3QmIHtcbiAgICBoZWlnaHQ6IEBpbnB1dC1oZWlnaHQ7XG4gICAgbGluZS1oZWlnaHQ6IEBpbnB1dC1oZWlnaHQ7XG4gIH1cblxuICB0ZXh0YXJlYSYsXG4gIHNlbGVjdFttdWx0aXBsZV0mIHtcbiAgICBoZWlnaHQ6IGF1dG87XG4gIH1cbn1cbiIsIi8vXG4vLyBCdXR0b25zXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5cbi8vIEJhc2Ugc3R5bGVzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4uYnRuIHtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICBtYXJnaW4tYm90dG9tOiAwOyAvLyBGb3IgaW5wdXQuYnRuXG4gIGZvbnQtd2VpZ2h0OiBAYnRuLWZvbnQtd2VpZ2h0O1xuICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XG4gIHRvdWNoLWFjdGlvbjogbWFuaXB1bGF0aW9uO1xuICBjdXJzb3I6IHBvaW50ZXI7XG4gIGJhY2tncm91bmQtaW1hZ2U6IG5vbmU7IC8vIFJlc2V0IHVudXN1YWwgRmlyZWZveC1vbi1BbmRyb2lkIGRlZmF1bHQgc3R5bGU7IHNlZSBodHRwczovL2dpdGh1Yi5jb20vbmVjb2xhcy9ub3JtYWxpemUuY3NzL2lzc3Vlcy8yMTRcbiAgYm9yZGVyOiAxcHggc29saWQgdHJhbnNwYXJlbnQ7XG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gIC5idXR0b24tc2l6ZShAcGFkZGluZy1iYXNlLXZlcnRpY2FsOyBAcGFkZGluZy1iYXNlLWhvcml6b250YWw7IEBmb250LXNpemUtYmFzZTsgQGxpbmUtaGVpZ2h0LWJhc2U7IEBib3JkZXItcmFkaXVzLWJhc2UpO1xuICAudXNlci1zZWxlY3Qobm9uZSk7XG5cbiAgJixcbiAgJjphY3RpdmUsXG4gICYuYWN0aXZlIHtcbiAgICAmOmZvY3VzLFxuICAgICYuZm9jdXMge1xuICAgICAgLnRhYi1mb2N1cygpO1xuICAgIH1cbiAgfVxuXG4gICY6aG92ZXIsXG4gICY6Zm9jdXMsXG4gICYuZm9jdXMge1xuICAgIGNvbG9yOiBAZ3JheS1saWdodGVyO1xuICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTtcbiAgfVxuXG4gICY6YWN0aXZlLFxuICAmLmFjdGl2ZSB7XG4gICAgb3V0bGluZTogMDtcbiAgICBiYWNrZ3JvdW5kLWltYWdlOiBub25lO1xuICAgIC5ib3gtc2hhZG93KGluc2V0IDAgM3B4IDVweCByZ2JhKDAsMCwwLC4xMjUpKTtcbiAgfVxuXG4gICYuZGlzYWJsZWQsXG4gICZbZGlzYWJsZWRdLFxuICBmaWVsZHNldFtkaXNhYmxlZF0gJiB7XG4gICAgY3Vyc29yOiBAY3Vyc29yLWRpc2FibGVkO1xuICAgIHBvaW50ZXItZXZlbnRzOiBub25lOyAvLyBGdXR1cmUtcHJvb2YgZGlzYWJsaW5nIG9mIGNsaWNrc1xuICAgIC5vcGFjaXR5KC42NSk7XG4gICAgLmJveC1zaGFkb3cobm9uZSk7XG4gIH1cbn1cblxuXG4vLyBBbHRlcm5hdGUgYnV0dG9uc1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLmJ0bi1kZWZhdWx0IHtcbiAgLmJ1dHRvbi12YXJpYW50KEBidG4tZGVmYXVsdC1jb2xvcjsgQGJ0bi1kZWZhdWx0LWJnOyBAYnRuLWRlZmF1bHQtYm9yZGVyKTtcbn1cbi5idG4tcHJpbWFyeSB7XG4gIC5idXR0b24tdmFyaWFudChAYnRuLXByaW1hcnktY29sb3I7IEBidG4tcHJpbWFyeS1iZzsgQGJ0bi1wcmltYXJ5LWJvcmRlcik7XG59XG4vLyBTdWNjZXNzIGFwcGVhcnMgYXMgZ3JlZW5cbi5idG4tc3VjY2VzcyB7XG4gIC5idXR0b24tdmFyaWFudChAYnRuLXN1Y2Nlc3MtY29sb3I7IEBidG4tc3VjY2Vzcy1iZzsgQGJ0bi1zdWNjZXNzLWJvcmRlcik7XG59XG4vLyBJbmZvIGFwcGVhcnMgYXMgYmx1ZS1ncmVlblxuLmJ0bi1pbmZvIHtcbiAgLmJ1dHRvbi12YXJpYW50KEBidG4taW5mby1jb2xvcjsgQGJ0bi1pbmZvLWJnOyBAYnRuLWluZm8tYm9yZGVyKTtcbn1cbi8vIFdhcm5pbmcgYXBwZWFycyBhcyBvcmFuZ2Vcbi5idG4td2FybmluZyB7XG4gIC5idXR0b24tdmFyaWFudChAYnRuLXdhcm5pbmctY29sb3I7IEBidG4td2FybmluZy1iZzsgQGJ0bi13YXJuaW5nLWJvcmRlcik7XG59XG4vLyBEYW5nZXIgYW5kIGVycm9yIGFwcGVhciBhcyByZWRcbi5idG4tZGFuZ2VyIHtcbiAgLmJ1dHRvbi12YXJpYW50KEBidG4tZGFuZ2VyLWNvbG9yOyBAYnRuLWRhbmdlci1iZzsgQGJ0bi1kYW5nZXItYm9yZGVyKTtcbn1cblxuXG4vLyBMaW5rIGJ1dHRvbnNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLy8gTWFrZSBhIGJ1dHRvbiBsb29rIGFuZCBiZWhhdmUgbGlrZSBhIGxpbmtcbi5idG4tbGluayB7XG4gIGNvbG9yOiBAbGluay1jb2xvcjtcbiAgZm9udC13ZWlnaHQ6IG5vcm1hbDtcbiAgYm9yZGVyLXJhZGl1czogMDtcblxuICAmLFxuICAmOmFjdGl2ZSxcbiAgJi5hY3RpdmUsXG4gICZbZGlzYWJsZWRdLFxuICBmaWVsZHNldFtkaXNhYmxlZF0gJiB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7XG4gICAgLmJveC1zaGFkb3cobm9uZSk7XG4gIH1cbiAgJixcbiAgJjpob3ZlcixcbiAgJjpmb2N1cyxcbiAgJjphY3RpdmUge1xuICAgIGJvcmRlci1jb2xvcjogdHJhbnNwYXJlbnQ7XG4gIH1cbiAgJjpob3ZlcixcbiAgJjpmb2N1cyB7XG4gICAgY29sb3I6IEBsaW5rLWhvdmVyLWNvbG9yO1xuICAgIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lO1xuICAgIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50O1xuICB9XG4gICZbZGlzYWJsZWRdLFxuICBmaWVsZHNldFtkaXNhYmxlZF0gJiB7XG4gICAgJjpob3ZlcixcbiAgICAmOmZvY3VzIHtcbiAgICAgIGNvbG9yOiBAYnRuLWxpbmstZGlzYWJsZWQtY29sb3I7XG4gICAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7XG4gICAgfVxuICB9XG59XG5cblxuLy8gQnV0dG9uIFNpemVzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4uYnRuLWxnIHtcbiAgLy8gbGluZS1oZWlnaHQ6IGVuc3VyZSBldmVuLW51bWJlcmVkIGhlaWdodCBvZiBidXR0b24gbmV4dCB0byBsYXJnZSBpbnB1dFxuICAuYnV0dG9uLXNpemUoQHBhZGRpbmctbGFyZ2UtdmVydGljYWw7IEBwYWRkaW5nLWxhcmdlLWhvcml6b250YWw7IEBmb250LXNpemUtbGFyZ2U7IEBsaW5lLWhlaWdodC1sYXJnZTsgQGJvcmRlci1yYWRpdXMtbGFyZ2UpO1xufVxuLmJ0bi1zbSB7XG4gIC8vIGxpbmUtaGVpZ2h0OiBlbnN1cmUgcHJvcGVyIGhlaWdodCBvZiBidXR0b24gbmV4dCB0byBzbWFsbCBpbnB1dFxuICAuYnV0dG9uLXNpemUoQHBhZGRpbmctc21hbGwtdmVydGljYWw7IEBwYWRkaW5nLXNtYWxsLWhvcml6b250YWw7IEBmb250LXNpemUtc21hbGw7IEBsaW5lLWhlaWdodC1zbWFsbDsgQGJvcmRlci1yYWRpdXMtc21hbGwpO1xufVxuLmJ0bi14cyB7XG4gIC5idXR0b24tc2l6ZShAcGFkZGluZy14cy12ZXJ0aWNhbDsgQHBhZGRpbmcteHMtaG9yaXpvbnRhbDsgQGZvbnQtc2l6ZS1zbWFsbDsgQGxpbmUtaGVpZ2h0LXNtYWxsOyBAYm9yZGVyLXJhZGl1cy1zbWFsbCk7XG59XG5cblxuLy8gQmxvY2sgYnV0dG9uXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4uYnRuLWJsb2NrIHtcbiAgZGlzcGxheTogYmxvY2s7XG4gIHdpZHRoOiAxMDAlO1xufVxuXG4vLyBWZXJ0aWNhbGx5IHNwYWNlIG91dCBtdWx0aXBsZSBibG9jayBidXR0b25zXG4uYnRuLWJsb2NrICsgLmJ0bi1ibG9jayB7XG4gIG1hcmdpbi10b3A6IDVweDtcbn1cblxuLy8gU3BlY2lmaWNpdHkgb3ZlcnJpZGVzXG5pbnB1dFt0eXBlPVwic3VibWl0XCJdLFxuaW5wdXRbdHlwZT1cInJlc2V0XCJdLFxuaW5wdXRbdHlwZT1cImJ1dHRvblwiXSB7XG4gICYuYnRuLWJsb2NrIHtcbiAgICB3aWR0aDogMTAwJTtcbiAgfVxufVxuIiwiLy8gQnV0dG9uIHZhcmlhbnRzXG4vL1xuLy8gRWFzaWx5IHB1bXAgb3V0IGRlZmF1bHQgc3R5bGVzLCBhcyB3ZWxsIGFzIDpob3ZlciwgOmZvY3VzLCA6YWN0aXZlLFxuLy8gYW5kIGRpc2FibGVkIG9wdGlvbnMgZm9yIGFsbCBidXR0b25zXG5cbi5idXR0b24tdmFyaWFudChAY29sb3I7IEBiYWNrZ3JvdW5kOyBAYm9yZGVyKSB7XG4gIGNvbG9yOiBAY29sb3I7XG4gIGJhY2tncm91bmQtY29sb3I6IEBiYWNrZ3JvdW5kO1xuICBib3JkZXItY29sb3I6IEBib3JkZXI7XG5cbiAgJjpob3ZlcixcbiAgJjpmb2N1cyxcbiAgJi5mb2N1cyxcbiAgJjphY3RpdmUsXG4gICYuYWN0aXZlLFxuICAub3BlbiA+IC5kcm9wZG93bi10b2dnbGUmIHtcbiAgICBjb2xvcjogQGdyYXktbGlnaHRlcjtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAYmFja2dyb3VuZDtcbiAgICAgICAgYm9yZGVyLWNvbG9yOiBkYXJrZW4oQGJvcmRlciwgMTIlKTtcbiAgfVxuICAmOmFjdGl2ZSxcbiAgJi5hY3RpdmUsXG4gIC5vcGVuID4gLmRyb3Bkb3duLXRvZ2dsZSYge1xuICAgIGJhY2tncm91bmQtaW1hZ2U6IG5vbmU7XG4gIH1cbiAgJi5kaXNhYmxlZCxcbiAgJltkaXNhYmxlZF0sXG4gIGZpZWxkc2V0W2Rpc2FibGVkXSAmIHtcbiAgICAmLFxuICAgICY6aG92ZXIsXG4gICAgJjpmb2N1cyxcbiAgICAmLmZvY3VzLFxuICAgICY6YWN0aXZlLFxuICAgICYuYWN0aXZlIHtcbiAgICAgIGJhY2tncm91bmQtY29sb3I6IEBiYWNrZ3JvdW5kO1xuICAgICAgICAgIGJvcmRlci1jb2xvcjogQGJvcmRlcjtcbiAgICB9XG4gIH1cblxuICAuYmFkZ2Uge1xuICAgIGNvbG9yOiBAYmFja2dyb3VuZDtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAY29sb3I7XG4gIH1cbn1cblxuLy8gQnV0dG9uIHNpemVzXG4uYnV0dG9uLXNpemUoQHBhZGRpbmctdmVydGljYWw7IEBwYWRkaW5nLWhvcml6b250YWw7IEBmb250LXNpemU7IEBsaW5lLWhlaWdodDsgQGJvcmRlci1yYWRpdXMpIHtcbiAgcGFkZGluZzogQHBhZGRpbmctdmVydGljYWwgQHBhZGRpbmctaG9yaXpvbnRhbDtcbiAgZm9udC1zaXplOiBAZm9udC1zaXplO1xuICBsaW5lLWhlaWdodDogQGxpbmUtaGVpZ2h0O1xuICBib3JkZXItcmFkaXVzOiBAYm9yZGVyLXJhZGl1cztcbn1cbiIsIi8vIHNvdXJjZWQgZnJvbSBodHRwczovL2dpdGh1Yi5jb20vQ29kZVNldmVuL3RvYXN0clxuLy8gTUlUIGxpY2Vuc2Vcbi8vIE1peC1pbnNcbi5ib3JkZXJSYWRpdXMoQHJhZGl1cykge1xuICAgIC1tb3otYm9yZGVyLXJhZGl1czogQHJhZGl1cztcbiAgICAtd2Via2l0LWJvcmRlci1yYWRpdXM6IEByYWRpdXM7XG4gICAgYm9yZGVyLXJhZGl1czogQHJhZGl1cztcbn1cblxuLmJveFNoYWRvdyhAYm94U2hhZG93KSB7XG4gICAgLW1vei1ib3gtc2hhZG93OiBAYm94U2hhZG93O1xuICAgIC13ZWJraXQtYm94LXNoYWRvdzogQGJveFNoYWRvdztcbiAgICBib3gtc2hhZG93OiBAYm94U2hhZG93O1xufVxuXG4ub3BhY2l0eShAb3BhY2l0eSkge1xuICAgIEBvcGFjaXR5UGVyY2VudDogQG9wYWNpdHkgKiAxMDA7XG4gICAgb3BhY2l0eTogQG9wYWNpdHk7XG4gICAgLW1zLWZpbHRlcjogflwicHJvZ2lkOkRYSW1hZ2VUcmFuc2Zvcm0uTWljcm9zb2Z0LkFscGhhKE9wYWNpdHk9QHtvcGFjaXR5UGVyY2VudH0pXCI7XG4gICAgZmlsdGVyOiB+XCJhbHBoYShvcGFjaXR5PUB7b3BhY2l0eVBlcmNlbnR9KVwiO1xufVxuXG4ud29yZFdyYXAoQHdvcmRXcmFwOiBicmVhay13b3JkKSB7XG4gICAgLW1zLXdvcmQtd3JhcDogQHdvcmRXcmFwO1xuICAgIHdvcmQtd3JhcDogQHdvcmRXcmFwO1xufVxuXG4vLyBWYXJpYWJsZXNcbkBibGFjazogIzAwMDAwMDtcbkBncmV5OiAjOTk5OTk5O1xuQGxpZ2h0LWdyZXk6ICNDQ0NDQ0M7XG5Ad2hpdGU6ICNGRkZGRkY7XG5AbmVhci1ibGFjazogIzAzMDMwMztcbkBncmVlbjogIzUxQTM1MTtcbkByZWQ6ICNCRDM2MkY7XG5AYmx1ZTogIzJGOTZCNDtcbkBvcmFuZ2U6ICNGODk0MDY7XG5AZGVmYXVsdC1jb250YWluZXItb3BhY2l0eTogLjg7XG5cbi8vIFN0eWxlc1xuLnRvYXN0LXRpdGxlIHtcbiAgICBmb250LXdlaWdodDogYm9sZDtcbn1cblxuLnRvYXN0LW1lc3NhZ2Uge1xuICAgIC53b3JkV3JhcCgpO1xuXG4gICAgYSxcbiAgICBsYWJlbCB7XG4gICAgICAgIGNvbG9yOiBAd2hpdGU7XG4gICAgfVxuXG4gICAgICAgIGE6aG92ZXIge1xuICAgICAgICAgICAgY29sb3I6IEBsaWdodC1ncmV5O1xuICAgICAgICAgICAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xuICAgICAgICB9XG59XG5cbi50b2FzdC1jbG9zZS1idXR0b24ge1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICByaWdodDogLTAuM2VtO1xuICAgIHRvcDogLTAuM2VtO1xuICAgIGZsb2F0OiByaWdodDtcbiAgICBmb250LXNpemU6IDIwcHg7XG4gICAgZm9udC13ZWlnaHQ6IGJvbGQ7XG4gICAgY29sb3I6IEB3aGl0ZTtcbiAgICAtd2Via2l0LXRleHQtc2hhZG93OiAwIDFweCAwIHJnYmEoMjU1LDI1NSwyNTUsMSk7XG4gICAgdGV4dC1zaGFkb3c6IDAgMXB4IDAgcmdiYSgyNTUsMjU1LDI1NSwxKTtcbiAgICAub3BhY2l0eSgwLjgpO1xuXG4gICAgJjpob3ZlcixcbiAgICAmOmZvY3VzIHtcbiAgICAgICAgY29sb3I6IEBibGFjaztcbiAgICAgICAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xuICAgICAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgICAgIC5vcGFjaXR5KDAuNCk7XG4gICAgfVxufVxuXG4vKkFkZGl0aW9uYWwgcHJvcGVydGllcyBmb3IgYnV0dG9uIHZlcnNpb25cbiBpT1MgcmVxdWlyZXMgdGhlIGJ1dHRvbiBlbGVtZW50IGluc3RlYWQgb2YgYW4gYW5jaG9yIHRhZy5cbiBJZiB5b3Ugd2FudCB0aGUgYW5jaG9yIHZlcnNpb24sIGl0IHJlcXVpcmVzIGBocmVmPVwiI1wiYC4qL1xuYnV0dG9uLnRvYXN0LWNsb3NlLWJ1dHRvbiB7XG4gICAgcGFkZGluZzogMDtcbiAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG4gICAgYm9yZGVyOiAwO1xuICAgIC13ZWJraXQtYXBwZWFyYW5jZTogbm9uZTtcbn1cblxuLy8jZW5kcmVnaW9uXG5cbi50b2FzdC10b3AtY2VudGVyIHtcbiAgICB0b3A6IDA7XG4gICAgcmlnaHQ6IDA7XG4gICAgd2lkdGg6IDEwMCU7XG59XG5cbi50b2FzdC1ib3R0b20tY2VudGVyIHtcbiAgICBib3R0b206IDA7XG4gICAgcmlnaHQ6IDA7XG4gICAgd2lkdGg6IDEwMCU7XG59XG5cbi50b2FzdC10b3AtZnVsbC13aWR0aCB7XG4gICAgdG9wOiAwO1xuICAgIHJpZ2h0OiAwO1xuICAgIHdpZHRoOiAxMDAlO1xufVxuXG4udG9hc3QtYm90dG9tLWZ1bGwtd2lkdGgge1xuICAgIGJvdHRvbTogMDtcbiAgICByaWdodDogMDtcbiAgICB3aWR0aDogMTAwJTtcbn1cblxuLnRvYXN0LXRvcC1sZWZ0IHtcbiAgICB0b3A6IDEycHg7XG4gICAgbGVmdDogMTJweDtcbn1cblxuLnRvYXN0LXRvcC1yaWdodCB7XG4gICAgdG9wOiAxMnB4O1xuICAgIHJpZ2h0OiAxMnB4O1xufVxuXG4udG9hc3QtYm90dG9tLXJpZ2h0IHtcbiAgICByaWdodDogMTJweDtcbiAgICBib3R0b206IDEycHg7XG59XG5cbi50b2FzdC1ib3R0b20tbGVmdCB7XG4gICAgYm90dG9tOiAxMnB4O1xuICAgIGxlZnQ6IDEycHg7XG59XG5cbiN0b2FzdC1jb250YWluZXIge1xuICAgIHBvc2l0aW9uOiBmaXhlZDtcbiAgICB6LWluZGV4OiA5OTk5OTk7XG4gICAgLy8gVGhlIGNvbnRhaW5lciBzaG91bGQgbm90IGJlIGNsaWNrYWJsZS5cbiAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcbiAgICAqIHtcbiAgICAgICAgLW1vei1ib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgICAgICAtd2Via2l0LWJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgfVxuXG4gICAgPiBkaXYge1xuICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgICAgIC8vIFRoZSB0b2FzdCBpdHNlbGYgc2hvdWxkIGJlIGNsaWNrYWJsZS5cbiAgICAgICAgcG9pbnRlci1ldmVudHM6IGF1dG87XG4gICAgICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgICAgIG1hcmdpbjogMCAwIDZweDtcbiAgICAgICAgcGFkZGluZzogMTVweCAxNXB4IDE1cHggNTBweDtcbiAgICAgICAgd2lkdGg6IDMwMHB4O1xuICAgICAgICAuYm9yZGVyUmFkaXVzKDNweCAzcHggM3B4IDNweCk7XG4gICAgICAgIGJhY2tncm91bmQtcG9zaXRpb246IDE1cHggY2VudGVyO1xuICAgICAgICBiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0O1xuICAgICAgICAuYm94U2hhZG93KDAgMCAxMnB4IEBncmV5KTtcbiAgICAgICAgY29sb3I6IEB3aGl0ZTtcbiAgICAgICAgLm9wYWNpdHkoQGRlZmF1bHQtY29udGFpbmVyLW9wYWNpdHkpO1xuICAgIH1cblxuICAgID4gOmhvdmVyIHtcbiAgICAgICAgLmJveFNoYWRvdygwIDAgMTJweCBAYmxhY2spO1xuICAgICAgICAub3BhY2l0eSgxKTtcbiAgICAgICAgY3Vyc29yOiBwb2ludGVyO1xuICAgIH1cblxuICAgID4gLnRvYXN0LWluZm8ge1xuICAgICAgICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoXCJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUJnQUFBQVlDQVlBQUFEZ2R6MzRBQUFBQVhOU1IwSUFyczRjNlFBQUFBUm5RVTFCQUFDeGp3djhZUVVBQUFBSmNFaFpjd0FBRHNNQUFBN0RBY2R2cUdRQUFBR3dTVVJCVkVoTHRaYTlTZ05CRU1jOXNVeHhSY29VS1N6U1dJaFhwRk1oaFlXRmhhQmc0eVBZaVdDWFp4QkxFUnNMUlMzRVFrRWZ3Q0tkaldKQXdTS0Nnb0tDY3VkdjRPNVlMcnQ3RXpnWGhpVTMvNCtiMmNrbXdWakpTcEtrUTZ3QWk0Z3doVCt6M3dSQmNFejB5alNzZVVUcmNSeWZzSHNYbUQwQW1iSE9DOUlpOFZJbW51WEJQZ2xIcFE1d3dTVk03c05uVEc3WmE0SndEZENqeHlBaUgzbnlBMm10YVRKdWZpRFo1ZENhcWxJdElMaDFOSGF0Zk41c2t2ang5WjM4bTY5Q2d6dVhtWmdWclBJR0U3NjNKeDlxS3NSb3pXWXc2eE9IZEVSK25uMktrTytCYitVVjVDQk42V0M2UXRCZ2JSVm96cmFoQWJtbTZIdFVzZ3RQQzE5dEZkeFhaWUJPZmtibUZKMVZhSEExVkFIamQwcHA3MG9UWnp2UitFVnJ4MllnZmRzcTZldTU1QkhZUjhobGNraStuK2tFUlVGRzhCckEwQndqZUF2Mk04V0xRQnRjeStTRDZmTnNtbkIzQWxCTHJnVHRWVzFjMlFONGJWV0xBVGFJUzYwSjJEdTV5MVRpSmdqU0J2RlZaZ1Rtd0NVK2RBWkZvUHhHRUVzOG55SEM5QndlMkd2RUp2MldYWmIwdmpkeUZUNEN4azNlL2tJcWxPR29WTHd3UGV2cFlIVCswMFQraFd3WERmNEFKQU9VcVdjRGhid0FBQUFBU1VWT1JLNUNZSUk9XCIpICFpbXBvcnRhbnQ7XG4gICAgfVxuXG4gICAgPiAudG9hc3QtZXJyb3Ige1xuICAgICAgICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoXCJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUJnQUFBQVlDQVlBQUFEZ2R6MzRBQUFBQVhOU1IwSUFyczRjNlFBQUFBUm5RVTFCQUFDeGp3djhZUVVBQUFBSmNFaFpjd0FBRHNNQUFBN0RBY2R2cUdRQUFBSE9TVVJCVkVoTHJaYS9TZ05CRU1aemgwV0tDQ2xTQ0thSVlPRUQrQUFLZVFRTEc4SFd6dExDSW1CcllhZGdJZFkrZ0lLTllrQkZTd3U3Q0FvcUNna2tvR0JJL0UyOFBkYkxabWVETGd6WnpjeDgzL3paMlNTWEMxajlmcitJMUhxOTNnMnl4SDRpd00xdmtvQldBZHhDbXB6VHhma04yUmN5Wk5hSEZJa1NvMTArOGtneGtYSVVSVjVIR3hUbUZ1Yzc1QjJSZlFrcHhIRzhhQWdhQUZhMHRBSHFZRmZRN0l3ZTJ5aE9EazgrSjRDN3lBb1JUV0kzdy80a2xHUmdSNGxPN1JwbjkrZ3ZNeVdwK3V4Rmg4K0grQVJsZ04xbkp1SnVRQVl2TmtFbndHRmNrMThFcjRxM2VnRWMvb08rbWhMZEtnUnloZE5GaWFjQzBybE9DYmhOVno0SDlGbkFZZ0RCdlUzUUlpb1psSkZMSnRzb0hZUkRmaVpvVXlJeHFDdFJwVmxBTnEwRVU0ZEFwanJ0Z2V6UEZhZDVTMTlXZ2prYzBoTlZudUY0SGpWQTZDN1FyU0lieWxCK29aZTNhSGdCc3FsTnFLWUg0OGpYeUpLTXVBYml5Vko4S3phQjNlUmMwcGc5VndRNG5pRnJ5STY4cWlPaTNBYmp3ZHNmbkF0azBiQ2pUTEpLcjZtckQ5ZzhpcS9TL0I4MWhndU9NbFFUblZ5RzQwd0Fjam5tZ3NDTkVTRHJqbWU3d2ZmdFA0UDdTUDROM0NKWmR2em9OeUdxMmMvSFdPWEpHc3ZWZytSQS9rMk1DL3dONkkyWUEyUHQ4R2tBQUFBQVNVVk9SSzVDWUlJPVwiKSAhaW1wb3J0YW50O1xuICAgIH1cblxuICAgID4gLnRvYXN0LXN1Y2Nlc3Mge1xuICAgICAgICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoXCJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUJnQUFBQVlDQVlBQUFEZ2R6MzRBQUFBQVhOU1IwSUFyczRjNlFBQUFBUm5RVTFCQUFDeGp3djhZUVVBQUFBSmNFaFpjd0FBRHNNQUFBN0RBY2R2cUdRQUFBRHNTVVJCVkVoTFkyQVlCZlFNZ2YvLy8zUDgrL2V2QUlndkEvRnNJRitCYXZZRERXTUJHcm9hU01NQmlFOFZDN0FaRHJJRmFNRm5paTNBWlRqVWdzVVVXVURBOE9kQUg2aVFiUUVodzRIeUdzUEVjS0JYQklDNEFSaGV4NEc0QnNqbXdlVTFzb0lGYUdnL1d0b0ZaUklaZEV2SU1oeGtDQ2pYSVZzQVRWNmdGR0FDczRSc3cwRUdnSUlIM1FKWUpnSFNBUlFaRHJXQUIramF3emdzK1EyVU80OUQ3am5SU1JHb0VGUklMY2RtRU1XR0kwY20wSkoyUXBZQTFSRHZjbXpKRVdoQUJoRC9wcXJMMFMwQ1d1QUJLZ25Sa2k5bExzZVM3ZzJBbHF3SFdRU0tING9LTHJJTHBSR2hFUUN3MkxpUlVJYTRsd0FBQUFCSlJVNUVya0pnZ2c9PVwiKSAhaW1wb3J0YW50O1xuICAgIH1cblxuICAgID4gLnRvYXN0LXdhcm5pbmcge1xuICAgICAgICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoXCJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUJnQUFBQVlDQVlBQUFEZ2R6MzRBQUFBQVhOU1IwSUFyczRjNlFBQUFBUm5RVTFCQUFDeGp3djhZUVVBQUFBSmNFaFpjd0FBRHNNQUFBN0RBY2R2cUdRQUFBR1lTVVJCVkVoTDVaU3ZUc05RRk1iWFpHSUNNWUdZbUpoQVFJSkFJQ1lRUEFBQ2lTREI4QWlJQ1FRSlQ0Q3FRRXdnSnZZQVNBUUNpWmlZbUpoQUlCQVRDQVJKeSs5clRzbGRkOHNLdTFNMCtkTGIwNTd2Ni9sYnEvMnJLMG1TL1RSTmo5Y1dOQUtQWUlKSUk3Z0l4Q2NRNTFjdnFJRCtHSUVYOEFTRzRCMWJLNWdJWkZlUWZvSmRFWE9mZ1g0UUFRZzdrSDJBNjV5UTg3bHl4YjI3c2dna0F6QXVGaGJiZzFLMmtnQ2tCMWJWd3lJUjltMkw3UFJQSWhEVUlYZ0d0eUt3NTc1eXozbFROczZYNEpYbmpWK0xLTS9tM015ZG5UYnRPS0lqdHo2VmhDQnE0dlNtM25jZHJEMmxrMFZnVVhTVktqVkRKWEp6aWpXMVJRZHNVN0Y3N0hlOHU2OGtvTlpUejhPejV5R2E2SjNIM2xaMHhZZ1hCSzJReW1sV1dBK1JXblloc2tMQnYydm1FK2hCTUN0YkE3S1g1ZHJXeVJULzJKc3FaMkl2ZkI5WTRiV0ROTUZiSlJGbUM5RTc0U29TMENxdWx3amtDMCs1YnBjVjFDWjhOTWVqNHBqeTBVK2RvRFFzR3lvMWh6Vkp0dElqaFE3R25CdFJGTjFVYXJVbEg4RjN4aWN0K0hZMDdyRXpvVUdQbFdjalJGUnI0L2dDaFpnYzNaTDJkOG9BQUFBQVNVVk9SSzVDWUlJPVwiKSAhaW1wb3J0YW50O1xuICAgIH1cblxuICAgIC8qb3ZlcnJpZGVzKi9cbiAgICAmLnRvYXN0LXRvcC1jZW50ZXIgPiBkaXYsXG4gICAgJi50b2FzdC1ib3R0b20tY2VudGVyID4gZGl2IHtcbiAgICAgICAgd2lkdGg6IDMwMHB4O1xuICAgICAgICBtYXJnaW4tbGVmdDogYXV0bztcbiAgICAgICAgbWFyZ2luLXJpZ2h0OiBhdXRvO1xuICAgIH1cblxuICAgICYudG9hc3QtdG9wLWZ1bGwtd2lkdGggPiBkaXYsXG4gICAgJi50b2FzdC1ib3R0b20tZnVsbC13aWR0aCA+IGRpdiB7XG4gICAgICAgIHdpZHRoOiA5NiU7XG4gICAgICAgIG1hcmdpbi1sZWZ0OiBhdXRvO1xuICAgICAgICBtYXJnaW4tcmlnaHQ6IGF1dG87XG4gICAgfVxufVxuXG4udG9hc3Qge1xuICAgIGJhY2tncm91bmQtY29sb3I6IEBuZWFyLWJsYWNrO1xufVxuXG4udG9hc3Qtc3VjY2VzcyB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogQGdyZWVuO1xufVxuXG4udG9hc3QtZXJyb3Ige1xuICAgIGJhY2tncm91bmQtY29sb3I6IEByZWQ7XG59XG5cbi50b2FzdC1pbmZvIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAYmx1ZTtcbn1cblxuLnRvYXN0LXdhcm5pbmcge1xuICAgIGJhY2tncm91bmQtY29sb3I6IEBvcmFuZ2U7XG59XG5cbi50b2FzdC1wcm9ncmVzcyB7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIGxlZnQ6IDA7XG4gICAgYm90dG9tOiAwO1xuICAgIGhlaWdodDogNHB4O1xuICAgIGJhY2tncm91bmQtY29sb3I6IEBibGFjaztcbiAgICAub3BhY2l0eSgwLjQpO1xufVxuXG4vKlJlc3BvbnNpdmUgRGVzaWduKi9cblxuQG1lZGlhIGFsbCBhbmQgKG1heC13aWR0aDogMjQwcHgpIHtcbiAgICAjdG9hc3QtY29udGFpbmVyIHtcblxuICAgICAgICA+IGRpdiB7XG4gICAgICAgICAgICBwYWRkaW5nOiA4cHggOHB4IDhweCA1MHB4O1xuICAgICAgICAgICAgd2lkdGg6IDExZW07XG4gICAgICAgIH1cblxuICAgICAgICAmIC50b2FzdC1jbG9zZS1idXR0b24ge1xuICAgICAgICAgICAgcmlnaHQ6IC0wLjJlbTtcbiAgICAgICAgICAgIHRvcDogLTAuMmVtO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5AbWVkaWEgYWxsIGFuZCAobWluLXdpZHRoOiAyNDFweCkgYW5kIChtYXgtd2lkdGg6IDQ4MHB4KSB7XG4gICAgI3RvYXN0LWNvbnRhaW5lciB7XG4gICAgICAgID4gZGl2IHtcbiAgICAgICAgICAgIHBhZGRpbmc6IDhweCA4cHggOHB4IDUwcHg7XG4gICAgICAgICAgICB3aWR0aDogMThlbTtcbiAgICAgICAgfVxuXG4gICAgICAgICYgLnRvYXN0LWNsb3NlLWJ1dHRvbiB7XG4gICAgICAgICAgICByaWdodDogLTAuMmVtO1xuICAgICAgICAgICAgdG9wOiAtMC4yZW07XG4gICAgICAgIH1cbiAgICB9XG59XG5cbkBtZWRpYSBhbGwgYW5kIChtaW4td2lkdGg6IDQ4MXB4KSBhbmQgKG1heC13aWR0aDogNzY4cHgpIHtcbiAgICAjdG9hc3QtY29udGFpbmVyIHtcbiAgICAgICAgPiBkaXYge1xuICAgICAgICAgICAgcGFkZGluZzogMTVweCAxNXB4IDE1cHggNTBweDtcbiAgICAgICAgICAgIHdpZHRoOiAyNWVtO1xuICAgICAgICB9XG4gICAgfVxufVxuIiwiLy9cbi8vIEJ1dHRvbiBncm91cHNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8vIE1ha2UgdGhlIGRpdiBiZWhhdmUgbGlrZSBhIGJ1dHRvblxuLmJ0bi1ncm91cCxcbi5idG4tZ3JvdXAtdmVydGljYWwge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsgLy8gbWF0Y2ggLmJ0biBhbGlnbm1lbnQgZ2l2ZW4gZm9udC1zaXplIGhhY2sgYWJvdmVcbiAgPiAuYnRuIHtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgZmxvYXQ6IGxlZnQ7XG4gICAgLy8gQnJpbmcgdGhlIFwiYWN0aXZlXCIgYnV0dG9uIHRvIHRoZSBmcm9udFxuICAgICY6aG92ZXIsXG4gICAgJjpmb2N1cyxcbiAgICAmOmFjdGl2ZSxcbiAgICAmLmFjdGl2ZSB7XG4gICAgICB6LWluZGV4OiAyO1xuICAgIH1cbiAgICAmOmZvY3VzIHtcbiAgICAgIC8vIFJlbW92ZSBmb2N1cyBvdXRsaW5lIHdoZW4gZHJvcGRvd24gSlMgYWRkcyBpdCBhZnRlciBjbG9zaW5nIHRoZSBtZW51XG4gICAgICBvdXRsaW5lOiAwO1xuICAgIH1cbiAgfVxufVxuXG4vLyBQcmV2ZW50IGRvdWJsZSBib3JkZXJzIHdoZW4gYnV0dG9ucyBhcmUgbmV4dCB0byBlYWNoIG90aGVyXG4uYnRuLWdyb3VwIHtcbiAgLmJ0biArIC5idG4sXG4gIC5idG4gKyAuYnRuLWdyb3VwLFxuICAuYnRuLWdyb3VwICsgLmJ0bixcbiAgLmJ0bi1ncm91cCArIC5idG4tZ3JvdXAge1xuICAgIG1hcmdpbi1sZWZ0OiAtMXB4O1xuICB9XG59XG5cbi8vIE9wdGlvbmFsOiBHcm91cCBtdWx0aXBsZSBidXR0b24gZ3JvdXBzIHRvZ2V0aGVyIGZvciBhIHRvb2xiYXJcbi5idG4tdG9vbGJhciB7XG4gIG1hcmdpbi1sZWZ0OiAtNXB4OyAvLyBPZmZzZXQgdGhlIGZpcnN0IGNoaWxkJ3MgbWFyZ2luXG4gICY6ZXh0ZW5kKC5jbGVhcmZpeCBhbGwpO1xuXG4gIC5idG4tZ3JvdXAsXG4gIC5pbnB1dC1ncm91cCB7XG4gICAgZmxvYXQ6IGxlZnQ7XG4gIH1cbiAgPiAuYnRuLFxuICA+IC5idG4tZ3JvdXAsXG4gID4gLmlucHV0LWdyb3VwIHtcbiAgICBtYXJnaW4tbGVmdDogNXB4O1xuICB9XG59XG5cbi5idG4tZ3JvdXAgPiAuYnRuOm5vdCg6Zmlyc3QtY2hpbGQpOm5vdCg6bGFzdC1jaGlsZCk6bm90KC5kcm9wZG93bi10b2dnbGUpIHtcbiAgYm9yZGVyLXJhZGl1czogMDtcbn1cblxuLy8gU2V0IGNvcm5lcnMgaW5kaXZpZHVhbCBiZWNhdXNlIHNvbWV0aW1lcyBhIHNpbmdsZSBidXR0b24gY2FuIGJlIGluIGEgLmJ0bi1ncm91cCBhbmQgd2UgbmVlZCA6Zmlyc3QtY2hpbGQgYW5kIDpsYXN0LWNoaWxkIHRvIGJvdGggbWF0Y2hcbi5idG4tZ3JvdXAgPiAuYnRuOmZpcnN0LWNoaWxkIHtcbiAgbWFyZ2luLWxlZnQ6IDA7XG4gICY6bm90KDpsYXN0LWNoaWxkKTpub3QoLmRyb3Bkb3duLXRvZ2dsZSkge1xuICAgIC5ib3JkZXItcmlnaHQtcmFkaXVzKDApO1xuICB9XG59XG4vLyBOZWVkIC5kcm9wZG93bi10b2dnbGUgc2luY2UgOmxhc3QtY2hpbGQgZG9lc24ndCBhcHBseSBnaXZlbiBhIC5kcm9wZG93bi1tZW51IGltbWVkaWF0ZWx5IGFmdGVyIGl0XG4uYnRuLWdyb3VwID4gLmJ0bjpsYXN0LWNoaWxkOm5vdCg6Zmlyc3QtY2hpbGQpLFxuLmJ0bi1ncm91cCA+IC5kcm9wZG93bi10b2dnbGU6bm90KDpmaXJzdC1jaGlsZCkge1xuICAuYm9yZGVyLWxlZnQtcmFkaXVzKDApO1xufVxuXG4vLyBDdXN0b20gZWRpdHMgZm9yIGluY2x1ZGluZyBidG4tZ3JvdXBzIHdpdGhpbiBidG4tZ3JvdXBzICh1c2VmdWwgZm9yIGluY2x1ZGluZyBkcm9wZG93biBidXR0b25zIHdpdGhpbiBhIGJ0bi1ncm91cClcbi5idG4tZ3JvdXAgPiAuYnRuLWdyb3VwIHtcbiAgZmxvYXQ6IGxlZnQ7XG59XG4uYnRuLWdyb3VwID4gLmJ0bi1ncm91cDpub3QoOmZpcnN0LWNoaWxkKTpub3QoOmxhc3QtY2hpbGQpID4gLmJ0biB7XG4gIGJvcmRlci1yYWRpdXM6IDA7XG59XG4uYnRuLWdyb3VwID4gLmJ0bi1ncm91cDpmaXJzdC1jaGlsZCB7XG4gID4gLmJ0bjpsYXN0LWNoaWxkLFxuICA+IC5kcm9wZG93bi10b2dnbGUge1xuICAgIC5ib3JkZXItcmlnaHQtcmFkaXVzKDApO1xuICB9XG59XG4uYnRuLWdyb3VwID4gLmJ0bi1ncm91cDpsYXN0LWNoaWxkID4gLmJ0bjpmaXJzdC1jaGlsZCB7XG4gIC5ib3JkZXItbGVmdC1yYWRpdXMoMCk7XG59XG5cbi8vIE9uIGFjdGl2ZSBhbmQgb3BlbiwgZG9uJ3Qgc2hvdyBvdXRsaW5lXG4uYnRuLWdyb3VwIC5kcm9wZG93bi10b2dnbGU6YWN0aXZlLFxuLmJ0bi1ncm91cC5vcGVuIC5kcm9wZG93bi10b2dnbGUge1xuICBvdXRsaW5lOiAwO1xufVxuXG5cbi8vIFNpemluZ1xuLy9cbi8vIFJlbWl4IHRoZSBkZWZhdWx0IGJ1dHRvbiBzaXppbmcgY2xhc3NlcyBpbnRvIG5ldyBvbmVzIGZvciBlYXNpZXIgbWFuaXB1bGF0aW9uLlxuXG4uYnRuLWdyb3VwLXhzID4gLmJ0biB7ICY6ZXh0ZW5kKC5idG4teHMpOyB9XG4uYnRuLWdyb3VwLXNtID4gLmJ0biB7ICY6ZXh0ZW5kKC5idG4tc20pOyB9XG4uYnRuLWdyb3VwLWxnID4gLmJ0biB7ICY6ZXh0ZW5kKC5idG4tbGcpOyB9XG5cblxuLy8gU3BsaXQgYnV0dG9uIGRyb3Bkb3duc1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vLyBHaXZlIHRoZSBsaW5lIGJldHdlZW4gYnV0dG9ucyBzb21lIGRlcHRoXG4uYnRuLWdyb3VwID4gLmJ0biArIC5kcm9wZG93bi10b2dnbGUge1xuICBwYWRkaW5nLWxlZnQ6IDhweDtcbiAgcGFkZGluZy1yaWdodDogOHB4O1xufVxuLmJ0bi1ncm91cCA+IC5idG4tbGcgKyAuZHJvcGRvd24tdG9nZ2xlIHtcbiAgcGFkZGluZy1sZWZ0OiAxMnB4O1xuICBwYWRkaW5nLXJpZ2h0OiAxMnB4O1xufVxuXG4vLyBUaGUgY2xpY2thYmxlIGJ1dHRvbiBmb3IgdG9nZ2xpbmcgdGhlIG1lbnVcbi8vIFJlbW92ZSB0aGUgZ3JhZGllbnQgYW5kIHNldCB0aGUgc2FtZSBpbnNldCBzaGFkb3cgYXMgdGhlIDphY3RpdmUgc3RhdGVcbi5idG4tZ3JvdXAub3BlbiAuZHJvcGRvd24tdG9nZ2xlIHtcbiAgLmJveC1zaGFkb3coaW5zZXQgMCAzcHggNXB4IHJnYmEoMCwwLDAsLjEyNSkpO1xuXG4gIC8vIFNob3cgbm8gc2hhZG93IGZvciBgLmJ0bi1saW5rYCBzaW5jZSBpdCBoYXMgbm8gb3RoZXIgYnV0dG9uIHN0eWxlcy5cbiAgJi5idG4tbGluayB7XG4gICAgLmJveC1zaGFkb3cobm9uZSk7XG4gIH1cbn1cblxuXG4vLyBSZXBvc2l0aW9uIHRoZSBjYXJldFxuLmJ0biAuY2FyZXQge1xuICBtYXJnaW4tbGVmdDogMDtcbn1cbi8vIENhcmV0cyBpbiBvdGhlciBidXR0b24gc2l6ZXNcbi5idG4tbGcgLmNhcmV0IHtcbiAgYm9yZGVyLXdpZHRoOiBAY2FyZXQtd2lkdGgtbGFyZ2UgQGNhcmV0LXdpZHRoLWxhcmdlIDA7XG4gIGJvcmRlci1ib3R0b20td2lkdGg6IDA7XG59XG4vLyBVcHNpZGUgZG93biBjYXJldHMgZm9yIC5kcm9wdXBcbi5kcm9wdXAgLmJ0bi1sZyAuY2FyZXQge1xuICBib3JkZXItd2lkdGg6IDAgQGNhcmV0LXdpZHRoLWxhcmdlIEBjYXJldC13aWR0aC1sYXJnZTtcbn1cblxuXG4vLyBWZXJ0aWNhbCBidXR0b24gZ3JvdXBzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi5idG4tZ3JvdXAtdmVydGljYWwge1xuICA+IC5idG4sXG4gID4gLmJ0bi1ncm91cCxcbiAgPiAuYnRuLWdyb3VwID4gLmJ0biB7XG4gICAgZGlzcGxheTogYmxvY2s7XG4gICAgZmxvYXQ6IG5vbmU7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgbWF4LXdpZHRoOiAxMDAlO1xuICB9XG5cbiAgLy8gQ2xlYXIgZmxvYXRzIHNvIGRyb3Bkb3duIG1lbnVzIGNhbiBiZSBwcm9wZXJseSBwbGFjZWRcbiAgPiAuYnRuLWdyb3VwIHtcbiAgICAmOmV4dGVuZCguY2xlYXJmaXggYWxsKTtcbiAgICA+IC5idG4ge1xuICAgICAgZmxvYXQ6IG5vbmU7XG4gICAgfVxuICB9XG5cbiAgPiAuYnRuICsgLmJ0bixcbiAgPiAuYnRuICsgLmJ0bi1ncm91cCxcbiAgPiAuYnRuLWdyb3VwICsgLmJ0bixcbiAgPiAuYnRuLWdyb3VwICsgLmJ0bi1ncm91cCB7XG4gICAgbWFyZ2luLXRvcDogLTFweDtcbiAgICBtYXJnaW4tbGVmdDogMDtcbiAgfVxufVxuXG4uYnRuLWdyb3VwLXZlcnRpY2FsID4gLmJ0biB7XG4gICY6bm90KDpmaXJzdC1jaGlsZCk6bm90KDpsYXN0LWNoaWxkKSB7XG4gICAgYm9yZGVyLXJhZGl1czogMDtcbiAgfVxuICAmOmZpcnN0LWNoaWxkOm5vdCg6bGFzdC1jaGlsZCkge1xuICAgIGJvcmRlci10b3AtcmlnaHQtcmFkaXVzOiBAYm9yZGVyLXJhZGl1cy1iYXNlO1xuICAgIC5ib3JkZXItYm90dG9tLXJhZGl1cygwKTtcbiAgfVxuICAmOmxhc3QtY2hpbGQ6bm90KDpmaXJzdC1jaGlsZCkge1xuICAgIGJvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6IEBib3JkZXItcmFkaXVzLWJhc2U7XG4gICAgLmJvcmRlci10b3AtcmFkaXVzKDApO1xuICB9XG59XG4uYnRuLWdyb3VwLXZlcnRpY2FsID4gLmJ0bi1ncm91cDpub3QoOmZpcnN0LWNoaWxkKTpub3QoOmxhc3QtY2hpbGQpID4gLmJ0biB7XG4gIGJvcmRlci1yYWRpdXM6IDA7XG59XG4uYnRuLWdyb3VwLXZlcnRpY2FsID4gLmJ0bi1ncm91cDpmaXJzdC1jaGlsZDpub3QoOmxhc3QtY2hpbGQpIHtcbiAgPiAuYnRuOmxhc3QtY2hpbGQsXG4gID4gLmRyb3Bkb3duLXRvZ2dsZSB7XG4gICAgLmJvcmRlci1ib3R0b20tcmFkaXVzKDApO1xuICB9XG59XG4uYnRuLWdyb3VwLXZlcnRpY2FsID4gLmJ0bi1ncm91cDpsYXN0LWNoaWxkOm5vdCg6Zmlyc3QtY2hpbGQpID4gLmJ0bjpmaXJzdC1jaGlsZCB7XG4gIC5ib3JkZXItdG9wLXJhZGl1cygwKTtcbn1cblxuXG4vLyBKdXN0aWZpZWQgYnV0dG9uIGdyb3Vwc1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4uYnRuLWdyb3VwLWp1c3RpZmllZCB7XG4gIGRpc3BsYXk6IHRhYmxlO1xuICB3aWR0aDogMTAwJTtcbiAgdGFibGUtbGF5b3V0OiBmaXhlZDtcbiAgYm9yZGVyLWNvbGxhcHNlOiBzZXBhcmF0ZTtcbiAgPiAuYnRuLFxuICA+IC5idG4tZ3JvdXAge1xuICAgIGZsb2F0OiBub25lO1xuICAgIGRpc3BsYXk6IHRhYmxlLWNlbGw7XG4gICAgd2lkdGg6IDElO1xuICB9XG4gID4gLmJ0bi1ncm91cCAuYnRuIHtcbiAgICB3aWR0aDogMTAwJTtcbiAgfVxuXG4gID4gLmJ0bi1ncm91cCAuZHJvcGRvd24tbWVudSB7XG4gICAgbGVmdDogYXV0bztcbiAgfVxufVxuXG5cbi8vIENoZWNrYm94IGFuZCByYWRpbyBvcHRpb25zXG4vL1xuLy8gSW4gb3JkZXIgdG8gc3VwcG9ydCB0aGUgYnJvd3NlcidzIGZvcm0gdmFsaWRhdGlvbiBmZWVkYmFjaywgcG93ZXJlZCBieSB0aGVcbi8vIGByZXF1aXJlZGAgYXR0cmlidXRlLCB3ZSBoYXZlIHRvIFwiaGlkZVwiIHRoZSBpbnB1dHMgdmlhIGBjbGlwYC4gV2UgY2Fubm90IHVzZVxuLy8gYGRpc3BsYXk6IG5vbmU7YCBvciBgdmlzaWJpbGl0eTogaGlkZGVuO2AgYXMgdGhhdCBhbHNvIGhpZGVzIHRoZSBwb3BvdmVyLlxuLy8gU2ltcGx5IHZpc3VhbGx5IGhpZGluZyB0aGUgaW5wdXRzIHZpYSBgb3BhY2l0eWAgd291bGQgbGVhdmUgdGhlbSBjbGlja2FibGUgaW5cbi8vIGNlcnRhaW4gY2FzZXMgd2hpY2ggaXMgcHJldmVudGVkIGJ5IHVzaW5nIGBjbGlwYCBhbmQgYHBvaW50ZXItZXZlbnRzYC5cbi8vIFRoaXMgd2F5LCB3ZSBlbnN1cmUgYSBET00gZWxlbWVudCBpcyB2aXNpYmxlIHRvIHBvc2l0aW9uIHRoZSBwb3BvdmVyIGZyb20uXG4vL1xuLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9wdWxsLzEyNzk0IGFuZFxuLy8gaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL3B1bGwvMTQ1NTkgZm9yIG1vcmUgaW5mb3JtYXRpb24uXG5cbltkYXRhLXRvZ2dsZT1cImJ1dHRvbnNcIl0ge1xuICA+IC5idG4sXG4gID4gLmJ0bi1ncm91cCA+IC5idG4ge1xuICAgIGlucHV0W3R5cGU9XCJyYWRpb1wiXSxcbiAgICBpbnB1dFt0eXBlPVwiY2hlY2tib3hcIl0ge1xuICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgICAgY2xpcDogcmVjdCgwLDAsMCwwKTtcbiAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lO1xuICAgIH1cbiAgfVxufVxuIiwiLy9cbi8vIENvbXBvbmVudCBhbmltYXRpb25zXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vLyBIZWFkcyB1cCFcbi8vXG4vLyBXZSBkb24ndCB1c2UgdGhlIGAub3BhY2l0eSgpYCBtaXhpbiBoZXJlIHNpbmNlIGl0IGNhdXNlcyBhIGJ1ZyB3aXRoIHRleHRcbi8vIGZpZWxkcyBpbiBJRTctOC4gU291cmNlOiBodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvcHVsbC8zNTUyLlxuXG4uZmFkZSB7XG4gIG9wYWNpdHk6IDA7XG4gIC50cmFuc2l0aW9uKG9wYWNpdHkgLjE1cyBsaW5lYXIpO1xuICAmLmluIHtcbiAgICBvcGFjaXR5OiAxO1xuICB9XG59XG5cbi5jb2xsYXBzZSB7XG4gIGRpc3BsYXk6IG5vbmU7XG4gIHZpc2liaWxpdHk6IGhpZGRlbjtcblxuICAmLmluICAgICAgeyBkaXNwbGF5OiBibG9jazsgdmlzaWJpbGl0eTogdmlzaWJsZTsgfVxuICB0ciYuaW4gICAgeyBkaXNwbGF5OiB0YWJsZS1yb3c7IH1cbiAgdGJvZHkmLmluIHsgZGlzcGxheTogdGFibGUtcm93LWdyb3VwOyB9XG59XG5cbi5jb2xsYXBzaW5nIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICBoZWlnaHQ6IDA7XG4gIG92ZXJmbG93OiBoaWRkZW47XG4gIC50cmFuc2l0aW9uLXByb3BlcnR5KH5cImhlaWdodCwgdmlzaWJpbGl0eVwiKTtcbiAgLnRyYW5zaXRpb24tZHVyYXRpb24oLjM1cyk7XG4gIC50cmFuc2l0aW9uLXRpbWluZy1mdW5jdGlvbihlYXNlKTtcbn1cbiIsIi8vXG4vLyBEcm9wZG93biBtZW51c1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuXG4vLyBEcm9wZG93biBhcnJvdy9jYXJldFxuLmNhcmV0IHtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICB3aWR0aDogMDtcbiAgaGVpZ2h0OiAwO1xuICBtYXJnaW4tbGVmdDogMnB4O1xuICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1xuICBib3JkZXItdG9wOiAgIEBjYXJldC13aWR0aC1iYXNlIHNvbGlkO1xuICBib3JkZXItcmlnaHQ6IEBjYXJldC13aWR0aC1iYXNlIHNvbGlkIHRyYW5zcGFyZW50O1xuICBib3JkZXItbGVmdDogIEBjYXJldC13aWR0aC1iYXNlIHNvbGlkIHRyYW5zcGFyZW50O1xufVxuXG4vLyBUaGUgZHJvcGRvd24gd3JhcHBlciAoZGl2KVxuLmRyb3Bkb3duIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xufVxuXG4vLyBQcmV2ZW50IHRoZSBmb2N1cyBvbiB0aGUgZHJvcGRvd24gdG9nZ2xlIHdoZW4gY2xvc2luZyBkcm9wZG93bnNcbi5kcm9wZG93bi10b2dnbGU6Zm9jdXMge1xuICBvdXRsaW5lOiAwO1xufVxuXG4vLyBUaGUgZHJvcGRvd24gbWVudSAodWwpXG4uZHJvcGRvd24tbWVudSB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgdG9wOiAxMDAlO1xuICBsZWZ0OiAwO1xuICB6LWluZGV4OiBAemluZGV4LWRyb3Bkb3duO1xuICBkaXNwbGF5OiBub25lOyAvLyBub25lIGJ5IGRlZmF1bHQsIGJ1dCBibG9jayBvbiBcIm9wZW5cIiBvZiB0aGUgbWVudVxuICBmbG9hdDogbGVmdDtcbiAgbWluLXdpZHRoOiAxNjBweDtcbiAgcGFkZGluZzogNXB4IDA7XG4gIG1hcmdpbjogMnB4IDAgMDsgLy8gb3ZlcnJpZGUgZGVmYXVsdCB1bFxuICBsaXN0LXN0eWxlOiBub25lO1xuICBmb250LXNpemU6IEBmb250LXNpemUtYmFzZTtcbiAgdGV4dC1hbGlnbjogbGVmdDsgLy8gRW5zdXJlcyBwcm9wZXIgYWxpZ25tZW50IGlmIHBhcmVudCBoYXMgaXQgY2hhbmdlZCAoZS5nLiwgbW9kYWwgZm9vdGVyKVxuICBiYWNrZ3JvdW5kLWNvbG9yOiBAZHJvcGRvd24tYmc7XG4gIGJvcmRlcjogMXB4IHNvbGlkIEBkcm9wZG93bi1mYWxsYmFjay1ib3JkZXI7IC8vIElFOCBmYWxsYmFja1xuICBib3JkZXI6IDFweCBzb2xpZCBAZHJvcGRvd24tYm9yZGVyO1xuICBib3JkZXItcmFkaXVzOiBAYm9yZGVyLXJhZGl1cy1iYXNlO1xuICAuYm94LXNoYWRvdygwIDZweCAxMnB4IHJnYmEoMCwwLDAsLjE3NSkpO1xuICBiYWNrZ3JvdW5kLWNsaXA6IHBhZGRpbmctYm94O1xuXG4gIC8vIEFsaWducyB0aGUgZHJvcGRvd24gbWVudSB0byByaWdodFxuICAvL1xuICAvLyBEZXByZWNhdGVkIGFzIG9mIDMuMS4wIGluIGZhdm9yIG9mIGAuZHJvcGRvd24tbWVudS1bZGlyXWBcbiAgJi5wdWxsLXJpZ2h0IHtcbiAgICByaWdodDogMDtcbiAgICBsZWZ0OiBhdXRvO1xuICB9XG5cbiAgLy8gRGl2aWRlcnMgKGJhc2ljYWxseSBhbiBocikgd2l0aGluIHRoZSBkcm9wZG93blxuICAuZGl2aWRlciB7XG4gICAgLm5hdi1kaXZpZGVyKEBkcm9wZG93bi1kaXZpZGVyLWJnKTtcbiAgfVxuXG4gIC8vIExpbmtzIHdpdGhpbiB0aGUgZHJvcGRvd24gbWVudVxuICA+IGxpID4gYSB7XG4gICAgZGlzcGxheTogYmxvY2s7XG4gICAgcGFkZGluZzogM3B4IDIwcHg7XG4gICAgY2xlYXI6IGJvdGg7XG4gICAgZm9udC13ZWlnaHQ6IG5vcm1hbDtcbiAgICBsaW5lLWhlaWdodDogQGxpbmUtaGVpZ2h0LWJhc2U7XG4gICAgY29sb3I6IEBkcm9wZG93bi1saW5rLWNvbG9yO1xuICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7IC8vIHByZXZlbnQgbGlua3MgZnJvbSByYW5kb21seSBicmVha2luZyBvbnRvIG5ldyBsaW5lc1xuICB9XG59XG5cbi8vIEhvdmVyL0ZvY3VzIHN0YXRlXG4uZHJvcGRvd24tbWVudSA+IGxpID4gYSB7XG4gICY6aG92ZXIsXG4gICY6Zm9jdXMge1xuICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTtcbiAgICBjb2xvcjogQGRyb3Bkb3duLWxpbmstaG92ZXItY29sb3I7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogQGRyb3Bkb3duLWxpbmstaG92ZXItYmc7XG4gIH1cbn1cblxuLy8gQWN0aXZlIHN0YXRlXG4uZHJvcGRvd24tbWVudSA+IC5hY3RpdmUgPiBhIHtcbiAgJixcbiAgJjpob3ZlcixcbiAgJjpmb2N1cyB7XG4gICAgY29sb3I6IEBkcm9wZG93bi1saW5rLWFjdGl2ZS1jb2xvcjtcbiAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7XG4gICAgb3V0bGluZTogMDtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAZHJvcGRvd24tbGluay1hY3RpdmUtYmc7XG4gIH1cbn1cblxuLy8gRGlzYWJsZWQgc3RhdGVcbi8vXG4vLyBHcmF5IG91dCB0ZXh0IGFuZCBlbnN1cmUgdGhlIGhvdmVyL2ZvY3VzIHN0YXRlIHJlbWFpbnMgZ3JheVxuXG4uZHJvcGRvd24tbWVudSA+IC5kaXNhYmxlZCA+IGEge1xuICAmLFxuICAmOmhvdmVyLFxuICAmOmZvY3VzIHtcbiAgICBjb2xvcjogQGRyb3Bkb3duLWxpbmstZGlzYWJsZWQtY29sb3I7XG4gIH1cblxuICAvLyBOdWtlIGhvdmVyL2ZvY3VzIGVmZmVjdHNcbiAgJjpob3ZlcixcbiAgJjpmb2N1cyB7XG4gICAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xuICAgIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50O1xuICAgIGJhY2tncm91bmQtaW1hZ2U6IG5vbmU7IC8vIFJlbW92ZSBDU1MgZ3JhZGllbnRcbiAgICAucmVzZXQtZmlsdGVyKCk7XG4gICAgY3Vyc29yOiBAY3Vyc29yLWRpc2FibGVkO1xuICB9XG59XG5cbi8vIE9wZW4gc3RhdGUgZm9yIHRoZSBkcm9wZG93blxuLm9wZW4ge1xuICAvLyBTaG93IHRoZSBtZW51XG4gID4gLmRyb3Bkb3duLW1lbnUge1xuICAgIGRpc3BsYXk6IGJsb2NrO1xuICB9XG5cbiAgLy8gUmVtb3ZlIHRoZSBvdXRsaW5lIHdoZW4gOmZvY3VzIGlzIHRyaWdnZXJlZFxuICA+IGEge1xuICAgIG91dGxpbmU6IDA7XG4gIH1cbn1cblxuLy8gTWVudSBwb3NpdGlvbmluZ1xuLy9cbi8vIEFkZCBleHRyYSBjbGFzcyB0byBgLmRyb3Bkb3duLW1lbnVgIHRvIGZsaXAgdGhlIGFsaWdubWVudCBvZiB0aGUgZHJvcGRvd25cbi8vIG1lbnUgd2l0aCB0aGUgcGFyZW50LlxuLmRyb3Bkb3duLW1lbnUtcmlnaHQge1xuICBsZWZ0OiBhdXRvOyAvLyBSZXNldCB0aGUgZGVmYXVsdCBmcm9tIGAuZHJvcGRvd24tbWVudWBcbiAgcmlnaHQ6IDA7XG59XG4vLyBXaXRoIHYzLCB3ZSBlbmFibGVkIGF1dG8tZmxpcHBpbmcgaWYgeW91IGhhdmUgYSBkcm9wZG93biB3aXRoaW4gYSByaWdodFxuLy8gYWxpZ25lZCBuYXYgY29tcG9uZW50LiBUbyBlbmFibGUgdGhlIHVuZG9pbmcgb2YgdGhhdCwgd2UgcHJvdmlkZSBhbiBvdmVycmlkZVxuLy8gdG8gcmVzdG9yZSB0aGUgZGVmYXVsdCBkcm9wZG93biBtZW51IGFsaWdubWVudC5cbi8vXG4vLyBUaGlzIGlzIG9ubHkgZm9yIGxlZnQtYWxpZ25pbmcgYSBkcm9wZG93biBtZW51IHdpdGhpbiBhIGAubmF2YmFyLXJpZ2h0YCBvclxuLy8gYC5wdWxsLXJpZ2h0YCBuYXYgY29tcG9uZW50LlxuLmRyb3Bkb3duLW1lbnUtbGVmdCB7XG4gIGxlZnQ6IDA7XG4gIHJpZ2h0OiBhdXRvO1xufVxuXG4vLyBEcm9wZG93biBzZWN0aW9uIGhlYWRlcnNcbi5kcm9wZG93bi1oZWFkZXIge1xuICBkaXNwbGF5OiBibG9jaztcbiAgcGFkZGluZzogM3B4IDIwcHg7XG4gIGZvbnQtc2l6ZTogQGZvbnQtc2l6ZS1zbWFsbDtcbiAgbGluZS1oZWlnaHQ6IEBsaW5lLWhlaWdodC1iYXNlO1xuICBjb2xvcjogQGRyb3Bkb3duLWhlYWRlci1jb2xvcjtcbiAgd2hpdGUtc3BhY2U6IG5vd3JhcDsgLy8gYXMgd2l0aCA+IGxpID4gYVxufVxuXG4vLyBCYWNrZHJvcCB0byBjYXRjaCBib2R5IGNsaWNrcyBvbiBtb2JpbGUsIGV0Yy5cbi5kcm9wZG93bi1iYWNrZHJvcCB7XG4gIHBvc2l0aW9uOiBmaXhlZDtcbiAgbGVmdDogMDtcbiAgcmlnaHQ6IDA7XG4gIGJvdHRvbTogMDtcbiAgdG9wOiAwO1xuICB6LWluZGV4OiAoQHppbmRleC1kcm9wZG93biAtIDEwKTtcbn1cblxuLy8gUmlnaHQgYWxpZ25lZCBkcm9wZG93bnNcbi5wdWxsLXJpZ2h0ID4gLmRyb3Bkb3duLW1lbnUge1xuICByaWdodDogMDtcbiAgbGVmdDogYXV0bztcbn1cblxuLy8gQWxsb3cgZm9yIGRyb3Bkb3ducyB0byBnbyBib3R0b20gdXAgKGFrYSwgZHJvcHVwLW1lbnUpXG4vL1xuLy8gSnVzdCBhZGQgLmRyb3B1cCBhZnRlciB0aGUgc3RhbmRhcmQgLmRyb3Bkb3duIGNsYXNzIGFuZCB5b3UncmUgc2V0LCBicm8uXG4vLyBUT0RPOiBhYnN0cmFjdCB0aGlzIHNvIHRoYXQgdGhlIG5hdmJhciBmaXhlZCBzdHlsZXMgYXJlIG5vdCBwbGFjZWQgaGVyZT9cblxuLmRyb3B1cCxcbi5uYXZiYXItZml4ZWQtYm90dG9tIC5kcm9wZG93biB7XG4gIC8vIFJldmVyc2UgdGhlIGNhcmV0XG4gIC5jYXJldCB7XG4gICAgYm9yZGVyLXRvcDogMDtcbiAgICBib3JkZXItYm90dG9tOiBAY2FyZXQtd2lkdGgtYmFzZSBzb2xpZDtcbiAgICBjb250ZW50OiBcIlwiO1xuICB9XG4gIC8vIERpZmZlcmVudCBwb3NpdGlvbmluZyBmb3IgYm90dG9tIHVwIG1lbnVcbiAgLmRyb3Bkb3duLW1lbnUge1xuICAgIHRvcDogYXV0bztcbiAgICBib3R0b206IDEwMCU7XG4gICAgbWFyZ2luLWJvdHRvbTogMXB4O1xuICB9XG59XG5cblxuLy8gQ29tcG9uZW50IGFsaWdubWVudFxuLy9cbi8vIFJlaXRlcmF0ZSBwZXIgbmF2YmFyLmxlc3MgYW5kIHRoZSBtb2RpZmllZCBjb21wb25lbnQgYWxpZ25tZW50IHRoZXJlLlxuXG5AbWVkaWEgKG1pbi13aWR0aDogQGdyaWQtZmxvYXQtYnJlYWtwb2ludCkge1xuICAubmF2YmFyLXJpZ2h0IHtcbiAgICAuZHJvcGRvd24tbWVudSB7XG4gICAgICAuZHJvcGRvd24tbWVudS1yaWdodCgpO1xuICAgIH1cbiAgICAvLyBOZWNlc3NhcnkgZm9yIG92ZXJyaWRlcyBvZiB0aGUgZGVmYXVsdCByaWdodCBhbGlnbmVkIG1lbnUuXG4gICAgLy8gV2lsbCByZW1vdmUgY29tZSB2NCBpbiBhbGwgbGlrZWxpaG9vZC5cbiAgICAuZHJvcGRvd24tbWVudS1sZWZ0IHtcbiAgICAgIC5kcm9wZG93bi1tZW51LWxlZnQoKTtcbiAgICB9XG4gIH1cbn1cbiIsIi8vIEhvcml6b250YWwgZGl2aWRlcnNcbi8vXG4vLyBEaXZpZGVycyAoYmFzaWNhbGx5IGFuIGhyKSB3aXRoaW4gZHJvcGRvd25zIGFuZCBuYXYgbGlzdHNcblxuLm5hdi1kaXZpZGVyKEBjb2xvcjogI2U1ZTVlNSkge1xuICBoZWlnaHQ6IDFweDtcbiAgbWFyZ2luOiAoKEBsaW5lLWhlaWdodC1jb21wdXRlZCAvIDIpIC0gMSkgMDtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgYmFja2dyb3VuZC1jb2xvcjogQGNvbG9yO1xufVxuIiwiLy8gUmVzZXQgZmlsdGVycyBmb3IgSUVcbi8vXG4vLyBXaGVuIHlvdSBuZWVkIHRvIHJlbW92ZSBhIGdyYWRpZW50IGJhY2tncm91bmQsIGRvIG5vdCBmb3JnZXQgdG8gdXNlIHRoaXMgdG8gcmVzZXRcbi8vIHRoZSBJRSBmaWx0ZXIgZm9yIElFOSBhbmQgYmVsb3cuXG5cbi5yZXNldC1maWx0ZXIoKSB7XG4gIGZpbHRlcjogZSglKFwicHJvZ2lkOkRYSW1hZ2VUcmFuc2Zvcm0uTWljcm9zb2Z0LmdyYWRpZW50KGVuYWJsZWQgPSBmYWxzZSlcIikpO1xufVxuIiwiLy8gU2luZ2xlIHNpZGUgYm9yZGVyLXJhZGl1c1xuXG4uYm9yZGVyLXRvcC1yYWRpdXMoQHJhZGl1cykge1xuICBib3JkZXItdG9wLXJpZ2h0LXJhZGl1czogQHJhZGl1cztcbiAgIGJvcmRlci10b3AtbGVmdC1yYWRpdXM6IEByYWRpdXM7XG59XG4uYm9yZGVyLXJpZ2h0LXJhZGl1cyhAcmFkaXVzKSB7XG4gIGJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOiBAcmFkaXVzO1xuICAgICBib3JkZXItdG9wLXJpZ2h0LXJhZGl1czogQHJhZGl1cztcbn1cbi5ib3JkZXItYm90dG9tLXJhZGl1cyhAcmFkaXVzKSB7XG4gIGJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOiBAcmFkaXVzO1xuICAgYm9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czogQHJhZGl1cztcbn1cbi5ib3JkZXItbGVmdC1yYWRpdXMoQHJhZGl1cykge1xuICBib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOiBAcmFkaXVzO1xuICAgICBib3JkZXItdG9wLWxlZnQtcmFkaXVzOiBAcmFkaXVzO1xufVxuIiwiLy9cbi8vIElucHV0IGdyb3Vwc1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLy8gQmFzZSBzdHlsZXNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi5pbnB1dC1ncm91cCB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTsgLy8gRm9yIGRyb3Bkb3duc1xuICBkaXNwbGF5OiB0YWJsZTtcbiAgYm9yZGVyLWNvbGxhcHNlOiBzZXBhcmF0ZTsgLy8gcHJldmVudCBpbnB1dCBncm91cHMgZnJvbSBpbmhlcml0aW5nIGJvcmRlciBzdHlsZXMgZnJvbSB0YWJsZSBjZWxscyB3aGVuIHBsYWNlZCB3aXRoaW4gYSB0YWJsZVxuXG4gIC8vIFVuZG8gcGFkZGluZyBhbmQgZmxvYXQgb2YgZ3JpZCBjbGFzc2VzXG4gICZbY2xhc3MqPVwiY29sLVwiXSB7XG4gICAgZmxvYXQ6IG5vbmU7XG4gICAgcGFkZGluZy1sZWZ0OiAwO1xuICAgIHBhZGRpbmctcmlnaHQ6IDA7XG4gIH1cblxuICAuZm9ybS1jb250cm9sIHtcbiAgICAvLyBFbnN1cmUgdGhhdCB0aGUgaW5wdXQgaXMgYWx3YXlzIGFib3ZlIHRoZSAqYXBwZW5kZWQqIGFkZG9uIGJ1dHRvbiBmb3JcbiAgICAvLyBwcm9wZXIgYm9yZGVyIGNvbG9ycy5cbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgei1pbmRleDogMjtcblxuICAgIC8vIElFOSBmdWJhcnMgdGhlIHBsYWNlaG9sZGVyIGF0dHJpYnV0ZSBpbiB0ZXh0IGlucHV0cyBhbmQgdGhlIGFycm93cyBvblxuICAgIC8vIHNlbGVjdCBlbGVtZW50cyBpbiBpbnB1dCBncm91cHMuIFRvIGZpeCBpdCwgd2UgZmxvYXQgdGhlIGlucHV0LiBEZXRhaWxzOlxuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9pc3N1ZXMvMTE1NjEjaXNzdWVjb21tZW50LTI4OTM2ODU1XG4gICAgZmxvYXQ6IGxlZnQ7XG5cbiAgICB3aWR0aDogMTAwJTtcbiAgICBtYXJnaW4tYm90dG9tOiAwO1xuICB9XG59XG5cbi8vIFNpemluZyBvcHRpb25zXG4vL1xuLy8gUmVtaXggdGhlIGRlZmF1bHQgZm9ybSBjb250cm9sIHNpemluZyBjbGFzc2VzIGludG8gbmV3IG9uZXMgZm9yIGVhc2llclxuLy8gbWFuaXB1bGF0aW9uLlxuXG4uaW5wdXQtZ3JvdXAtbGcgPiAuZm9ybS1jb250cm9sLFxuLmlucHV0LWdyb3VwLWxnID4gLmlucHV0LWdyb3VwLWFkZG9uLFxuLmlucHV0LWdyb3VwLWxnID4gLmlucHV0LWdyb3VwLWJ0biA+IC5idG4ge1xuICAuaW5wdXQtbGcoKTtcbn1cbi5pbnB1dC1ncm91cC1zbSA+IC5mb3JtLWNvbnRyb2wsXG4uaW5wdXQtZ3JvdXAtc20gPiAuaW5wdXQtZ3JvdXAtYWRkb24sXG4uaW5wdXQtZ3JvdXAtc20gPiAuaW5wdXQtZ3JvdXAtYnRuID4gLmJ0biB7XG4gIC5pbnB1dC1zbSgpO1xufVxuXG5cbi8vIERpc3BsYXkgYXMgdGFibGUtY2VsbFxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLmlucHV0LWdyb3VwLWFkZG9uLFxuLmlucHV0LWdyb3VwLWJ0bixcbi5pbnB1dC1ncm91cCAuZm9ybS1jb250cm9sIHtcbiAgZGlzcGxheTogdGFibGUtY2VsbDtcblxuICAmOm5vdCg6Zmlyc3QtY2hpbGQpOm5vdCg6bGFzdC1jaGlsZCkge1xuICAgIGJvcmRlci1yYWRpdXM6IDA7XG4gIH1cbn1cbi8vIEFkZG9uIGFuZCBhZGRvbiB3cmFwcGVyIGZvciBidXR0b25zXG4uaW5wdXQtZ3JvdXAtYWRkb24sXG4uaW5wdXQtZ3JvdXAtYnRuIHtcbiAgd2lkdGg6IDElO1xuICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOyAvLyBNYXRjaCB0aGUgaW5wdXRzXG59XG5cbi8vIFRleHQgaW5wdXQgZ3JvdXBzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4uaW5wdXQtZ3JvdXAtYWRkb24ge1xuICBwYWRkaW5nOiBAcGFkZGluZy1iYXNlLXZlcnRpY2FsIEBwYWRkaW5nLWJhc2UtaG9yaXpvbnRhbDtcbiAgZm9udC1zaXplOiBAZm9udC1zaXplLWJhc2U7XG4gIGZvbnQtd2VpZ2h0OiBub3JtYWw7XG4gIGxpbmUtaGVpZ2h0OiAxO1xuICBjb2xvcjogQGlucHV0LWNvbG9yO1xuICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gIGJhY2tncm91bmQtY29sb3I6IEBpbnB1dC1ncm91cC1hZGRvbi1iZztcbiAgYm9yZGVyOiAxcHggc29saWQgQGlucHV0LWdyb3VwLWFkZG9uLWJvcmRlci1jb2xvcjtcbiAgYm9yZGVyLXJhZGl1czogQGJvcmRlci1yYWRpdXMtYmFzZTtcblxuICAvLyBTaXppbmdcbiAgJi5pbnB1dC1zbSB7XG4gICAgcGFkZGluZzogQHBhZGRpbmctc21hbGwtdmVydGljYWwgQHBhZGRpbmctc21hbGwtaG9yaXpvbnRhbDtcbiAgICBmb250LXNpemU6IEBmb250LXNpemUtc21hbGw7XG4gICAgYm9yZGVyLXJhZGl1czogQGJvcmRlci1yYWRpdXMtc21hbGw7XG4gIH1cbiAgJi5pbnB1dC1sZyB7XG4gICAgcGFkZGluZzogQHBhZGRpbmctbGFyZ2UtdmVydGljYWwgQHBhZGRpbmctbGFyZ2UtaG9yaXpvbnRhbDtcbiAgICBmb250LXNpemU6IEBmb250LXNpemUtbGFyZ2U7XG4gICAgYm9yZGVyLXJhZGl1czogQGJvcmRlci1yYWRpdXMtbGFyZ2U7XG4gIH1cblxuICAvLyBOdWtlIGRlZmF1bHQgbWFyZ2lucyBmcm9tIGNoZWNrYm94ZXMgYW5kIHJhZGlvcyB0byB2ZXJ0aWNhbGx5IGNlbnRlciB3aXRoaW4uXG4gIGlucHV0W3R5cGU9XCJyYWRpb1wiXSxcbiAgaW5wdXRbdHlwZT1cImNoZWNrYm94XCJdIHtcbiAgICBtYXJnaW4tdG9wOiAwO1xuICB9XG59XG5cbi8vIFJlc2V0IHJvdW5kZWQgY29ybmVyc1xuLmlucHV0LWdyb3VwIC5mb3JtLWNvbnRyb2w6Zmlyc3QtY2hpbGQsXG4uaW5wdXQtZ3JvdXAtYWRkb246Zmlyc3QtY2hpbGQsXG4uaW5wdXQtZ3JvdXAtYnRuOmZpcnN0LWNoaWxkID4gLmJ0bixcbi5pbnB1dC1ncm91cC1idG46Zmlyc3QtY2hpbGQgPiAuYnRuLWdyb3VwID4gLmJ0bixcbi5pbnB1dC1ncm91cC1idG46Zmlyc3QtY2hpbGQgPiAuZHJvcGRvd24tdG9nZ2xlLFxuLmlucHV0LWdyb3VwLWJ0bjpsYXN0LWNoaWxkID4gLmJ0bjpub3QoOmxhc3QtY2hpbGQpOm5vdCguZHJvcGRvd24tdG9nZ2xlKSxcbi5pbnB1dC1ncm91cC1idG46bGFzdC1jaGlsZCA+IC5idG4tZ3JvdXA6bm90KDpsYXN0LWNoaWxkKSA+IC5idG4ge1xuICAuYm9yZGVyLXJpZ2h0LXJhZGl1cygwKTtcbn1cbi5pbnB1dC1ncm91cC1hZGRvbjpmaXJzdC1jaGlsZCB7XG4gIGJvcmRlci1yaWdodDogMDtcbn1cbi5pbnB1dC1ncm91cCAuZm9ybS1jb250cm9sOmxhc3QtY2hpbGQsXG4uaW5wdXQtZ3JvdXAtYWRkb246bGFzdC1jaGlsZCxcbi5pbnB1dC1ncm91cC1idG46bGFzdC1jaGlsZCA+IC5idG4sXG4uaW5wdXQtZ3JvdXAtYnRuOmxhc3QtY2hpbGQgPiAuYnRuLWdyb3VwID4gLmJ0bixcbi5pbnB1dC1ncm91cC1idG46bGFzdC1jaGlsZCA+IC5kcm9wZG93bi10b2dnbGUsXG4uaW5wdXQtZ3JvdXAtYnRuOmZpcnN0LWNoaWxkID4gLmJ0bjpub3QoOmZpcnN0LWNoaWxkKSxcbi5pbnB1dC1ncm91cC1idG46Zmlyc3QtY2hpbGQgPiAuYnRuLWdyb3VwOm5vdCg6Zmlyc3QtY2hpbGQpID4gLmJ0biB7XG4gIC5ib3JkZXItbGVmdC1yYWRpdXMoMCk7XG59XG4uaW5wdXQtZ3JvdXAtYWRkb246bGFzdC1jaGlsZCB7XG4gIGJvcmRlci1sZWZ0OiAwO1xufVxuXG4vLyBCdXR0b24gaW5wdXQgZ3JvdXBzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4uaW5wdXQtZ3JvdXAtYnRuIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAvLyBKYW5raWx5IHByZXZlbnQgaW5wdXQgYnV0dG9uIGdyb3VwcyBmcm9tIHdyYXBwaW5nIHdpdGggYHdoaXRlLXNwYWNlYCBhbmRcbiAgLy8gYGZvbnQtc2l6ZWAgaW4gY29tYmluYXRpb24gd2l0aCBgaW5saW5lLWJsb2NrYCBvbiBidXR0b25zLlxuICBmb250LXNpemU6IDA7XG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XG5cbiAgLy8gTmVnYXRpdmUgbWFyZ2luIGZvciBzcGFjaW5nLCBwb3NpdGlvbiBmb3IgYnJpbmdpbmcgaG92ZXJlZC9mb2N1c2VkL2FjdGl2ZWRcbiAgLy8gZWxlbWVudCBhYm92ZSB0aGUgc2libGluZ3MuXG4gID4gLmJ0biB7XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgICsgLmJ0biB7XG4gICAgICBtYXJnaW4tbGVmdDogLTFweDtcbiAgICB9XG4gICAgLy8gQnJpbmcgdGhlIFwiYWN0aXZlXCIgYnV0dG9uIHRvIHRoZSBmcm9udFxuICAgICY6aG92ZXIsXG4gICAgJjpmb2N1cyxcbiAgICAmOmFjdGl2ZSB7XG4gICAgICB6LWluZGV4OiAyO1xuICAgIH1cbiAgfVxuXG4gIC8vIE5lZ2F0aXZlIG1hcmdpbiB0byBvbmx5IGhhdmUgYSAxcHggYm9yZGVyIGJldHdlZW4gdGhlIHR3b1xuICAmOmZpcnN0LWNoaWxkIHtcbiAgICA+IC5idG4sXG4gICAgPiAuYnRuLWdyb3VwIHtcbiAgICAgIG1hcmdpbi1yaWdodDogLTFweDtcbiAgICB9XG4gIH1cbiAgJjpsYXN0LWNoaWxkIHtcbiAgICA+IC5idG4sXG4gICAgPiAuYnRuLWdyb3VwIHtcbiAgICAgIG1hcmdpbi1sZWZ0OiAtMXB4O1xuICAgIH1cbiAgfVxufVxuIiwiLy9cbi8vIE5hdnNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cblxuLy8gQmFzZSBjbGFzc1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLm5hdiB7XG4gIG1hcmdpbi1ib3R0b206IDA7XG4gIHBhZGRpbmctbGVmdDogMDsgLy8gT3ZlcnJpZGUgZGVmYXVsdCB1bC9vbFxuICBsaXN0LXN0eWxlOiBub25lO1xuICAmOmV4dGVuZCguY2xlYXJmaXggYWxsKTtcblxuICA+IGxpIHtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgZGlzcGxheTogYmxvY2s7XG5cbiAgICA+IGEge1xuICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICBwYWRkaW5nOiBAbmF2LWxpbmstcGFkZGluZztcbiAgICAgICY6aG92ZXIsXG4gICAgICAmOmZvY3VzIHtcbiAgICAgICAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xuICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAbmF2LWxpbmstaG92ZXItYmc7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gRGlzYWJsZWQgc3RhdGUgc2V0cyB0ZXh0IHRvIGdyYXkgYW5kIG51a2VzIGhvdmVyL3RhYiBlZmZlY3RzXG4gICAgJi5kaXNhYmxlZCA+IGEge1xuICAgICAgY29sb3I6IEBuYXYtZGlzYWJsZWQtbGluay1jb2xvcjtcblxuICAgICAgJjpob3ZlcixcbiAgICAgICY6Zm9jdXMge1xuICAgICAgICBjb2xvcjogQG5hdi1kaXNhYmxlZC1saW5rLWhvdmVyLWNvbG9yO1xuICAgICAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7XG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50O1xuICAgICAgICBjdXJzb3I6IEBjdXJzb3ItZGlzYWJsZWQ7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gT3BlbiBkcm9wZG93bnNcbiAgLm9wZW4gPiBhIHtcbiAgICAmLFxuICAgICY6aG92ZXIsXG4gICAgJjpmb2N1cyB7XG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAbmF2LWxpbmstaG92ZXItYmc7XG4gICAgICBib3JkZXItY29sb3I6IEBsaW5rLWNvbG9yO1xuICAgIH1cbiAgfVxuXG4gIC8vIE5hdiBkaXZpZGVycyAoZGVwcmVjYXRlZCB3aXRoIHYzLjAuMSlcbiAgLy9cbiAgLy8gVGhpcyBzaG91bGQgaGF2ZSBiZWVuIHJlbW92ZWQgaW4gdjMgd2l0aCB0aGUgZHJvcHBpbmcgb2YgYC5uYXYtbGlzdGAsIGJ1dFxuICAvLyB3ZSBtaXNzZWQgaXQuIFdlIGRvbid0IGN1cnJlbnRseSBzdXBwb3J0IHRoaXMgYW55d2hlcmUsIGJ1dCBpbiB0aGUgaW50ZXJlc3RcbiAgLy8gb2YgbWFpbnRhaW5pbmcgYmFja3dhcmQgY29tcGF0aWJpbGl0eSBpbiBjYXNlIHlvdSB1c2UgaXQsIGl0J3MgZGVwcmVjYXRlZC5cbiAgLm5hdi1kaXZpZGVyIHtcbiAgICAubmF2LWRpdmlkZXIoKTtcbiAgfVxuXG4gIC8vIFByZXZlbnQgSUU4IGZyb20gbWlzcGxhY2luZyBpbWdzXG4gIC8vXG4gIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vaDVicC9odG1sNS1ib2lsZXJwbGF0ZS9pc3N1ZXMvOTg0I2lzc3VlY29tbWVudC0zOTg1OTg5XG4gID4gbGkgPiBhID4gaW1nIHtcbiAgICBtYXgtd2lkdGg6IG5vbmU7XG4gIH1cbn1cblxuXG4vLyBUYWJzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8vIEdpdmUgdGhlIHRhYnMgc29tZXRoaW5nIHRvIHNpdCBvblxuLm5hdi10YWJzIHtcbiAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIEBuYXYtdGFicy1ib3JkZXItY29sb3I7XG4gID4gbGkge1xuICAgIGZsb2F0OiBsZWZ0O1xuICAgIC8vIE1ha2UgdGhlIGxpc3QtaXRlbXMgb3ZlcmxheSB0aGUgYm90dG9tIGJvcmRlclxuICAgIG1hcmdpbi1ib3R0b206IC0xcHg7XG5cbiAgICAvLyBBY3R1YWwgdGFicyAoYXMgbGlua3MpXG4gICAgPiBhIHtcbiAgICAgIG1hcmdpbi1yaWdodDogMnB4O1xuICAgICAgbGluZS1oZWlnaHQ6IEBsaW5lLWhlaWdodC1iYXNlO1xuICAgICAgYm9yZGVyOiAxcHggc29saWQgdHJhbnNwYXJlbnQ7XG4gICAgICBib3JkZXItcmFkaXVzOiBAYm9yZGVyLXJhZGl1cy1iYXNlIEBib3JkZXItcmFkaXVzLWJhc2UgMCAwO1xuICAgICAgJjpob3ZlciB7XG4gICAgICAgIGJvcmRlci1jb2xvcjogQG5hdi10YWJzLWxpbmstaG92ZXItYm9yZGVyLWNvbG9yIEBuYXYtdGFicy1saW5rLWhvdmVyLWJvcmRlci1jb2xvciBAbmF2LXRhYnMtYm9yZGVyLWNvbG9yO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEFjdGl2ZSBzdGF0ZSwgYW5kIGl0cyA6aG92ZXIgdG8gb3ZlcnJpZGUgbm9ybWFsIDpob3ZlclxuICAgICYuYWN0aXZlID4gYSB7XG4gICAgICAmLFxuICAgICAgJjpob3ZlcixcbiAgICAgICY6Zm9jdXMge1xuICAgICAgICBjb2xvcjogQG5hdi10YWJzLWFjdGl2ZS1saW5rLWhvdmVyLWNvbG9yO1xuICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAbmF2LXRhYnMtYWN0aXZlLWxpbmstaG92ZXItYmc7XG4gICAgICAgIGJvcmRlcjogMXB4IHNvbGlkIEBuYXYtdGFicy1hY3RpdmUtbGluay1ob3Zlci1ib3JkZXItY29sb3I7XG4gICAgICAgIGJvcmRlci1ib3R0b20tY29sb3I6IHRyYW5zcGFyZW50O1xuICAgICAgICBjdXJzb3I6IGRlZmF1bHQ7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIC8vIHB1bGxpbmcgdGhpcyBpbiBtYWlubHkgZm9yIGxlc3Mgc2hvcnRoYW5kXG4gICYubmF2LWp1c3RpZmllZCB7XG4gICAgLm5hdi1qdXN0aWZpZWQoKTtcbiAgICAubmF2LXRhYnMtanVzdGlmaWVkKCk7XG4gIH1cbn1cblxuXG4vLyBQaWxsc1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLm5hdi1waWxscyB7XG4gID4gbGkge1xuICAgIGZsb2F0OiBsZWZ0O1xuXG4gICAgLy8gTGlua3MgcmVuZGVyZWQgYXMgcGlsbHNcbiAgICA+IGEge1xuICAgICAgYm9yZGVyLXJhZGl1czogQG5hdi1waWxscy1ib3JkZXItcmFkaXVzO1xuICAgIH1cbiAgICArIGxpIHtcbiAgICAgIG1hcmdpbi1sZWZ0OiAycHg7XG4gICAgfVxuXG4gICAgLy8gQWN0aXZlIHN0YXRlXG4gICAgJi5hY3RpdmUgPiBhIHtcbiAgICAgICYsXG4gICAgICAmOmhvdmVyLFxuICAgICAgJjpmb2N1cyB7XG4gICAgICAgIGNvbG9yOiBAbmF2LXBpbGxzLWFjdGl2ZS1saW5rLWhvdmVyLWNvbG9yO1xuICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAbmF2LXBpbGxzLWFjdGl2ZS1saW5rLWhvdmVyLWJnO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5cbi8vIFN0YWNrZWQgcGlsbHNcbi5uYXYtc3RhY2tlZCB7XG4gID4gbGkge1xuICAgIGZsb2F0OiBub25lO1xuICAgICsgbGkge1xuICAgICAgbWFyZ2luLXRvcDogMnB4O1xuICAgICAgbWFyZ2luLWxlZnQ6IDA7IC8vIG5vIG5lZWQgZm9yIHRoaXMgZ2FwIGJldHdlZW4gbmF2IGl0ZW1zXG4gICAgfVxuICB9XG59XG5cblxuLy8gTmF2IHZhcmlhdGlvbnNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8vIEp1c3RpZmllZCBuYXYgbGlua3Ncbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLm5hdi1qdXN0aWZpZWQge1xuICB3aWR0aDogMTAwJTtcblxuICA+IGxpIHtcbiAgICBmbG9hdDogbm9uZTtcbiAgICA+IGEge1xuICAgICAgdGV4dC1hbGlnbjogY2VudGVyO1xuICAgICAgbWFyZ2luLWJvdHRvbTogNXB4O1xuICAgIH1cbiAgfVxuXG4gID4gLmRyb3Bkb3duIC5kcm9wZG93bi1tZW51IHtcbiAgICB0b3A6IGF1dG87XG4gICAgbGVmdDogYXV0bztcbiAgfVxuXG4gIEBtZWRpYSAobWluLXdpZHRoOiBAc2NyZWVuLXNtLW1pbikge1xuICAgID4gbGkge1xuICAgICAgZGlzcGxheTogdGFibGUtY2VsbDtcbiAgICAgIHdpZHRoOiAxJTtcbiAgICAgID4gYSB7XG4gICAgICAgIG1hcmdpbi1ib3R0b206IDA7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbi8vIE1vdmUgYm9yZGVycyB0byBhbmNob3JzIGluc3RlYWQgb2YgYm90dG9tIG9mIGxpc3Rcbi8vXG4vLyBNaXhpbiBmb3IgYWRkaW5nIG9uIHRvcCB0aGUgc2hhcmVkIGAubmF2LWp1c3RpZmllZGAgc3R5bGVzIGZvciBvdXIgdGFic1xuLm5hdi10YWJzLWp1c3RpZmllZCB7XG4gIGJvcmRlci1ib3R0b206IDA7XG5cbiAgPiBsaSA+IGEge1xuICAgIC8vIE92ZXJyaWRlIG1hcmdpbiBmcm9tIC5uYXYtdGFic1xuICAgIG1hcmdpbi1yaWdodDogMDtcbiAgICBib3JkZXItcmFkaXVzOiBAYm9yZGVyLXJhZGl1cy1iYXNlO1xuICB9XG5cbiAgPiAuYWN0aXZlID4gYSxcbiAgPiAuYWN0aXZlID4gYTpob3ZlcixcbiAgPiAuYWN0aXZlID4gYTpmb2N1cyB7XG4gICAgYm9yZGVyOiAxcHggc29saWQgQG5hdi10YWJzLWp1c3RpZmllZC1saW5rLWJvcmRlci1jb2xvcjtcbiAgfVxuXG4gIEBtZWRpYSAobWluLXdpZHRoOiBAc2NyZWVuLXNtLW1pbikge1xuICAgID4gbGkgPiBhIHtcbiAgICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCBAbmF2LXRhYnMtanVzdGlmaWVkLWxpbmstYm9yZGVyLWNvbG9yO1xuICAgICAgYm9yZGVyLXJhZGl1czogQGJvcmRlci1yYWRpdXMtYmFzZSBAYm9yZGVyLXJhZGl1cy1iYXNlIDAgMDtcbiAgICB9XG4gICAgPiAuYWN0aXZlID4gYSxcbiAgICA+IC5hY3RpdmUgPiBhOmhvdmVyLFxuICAgID4gLmFjdGl2ZSA+IGE6Zm9jdXMge1xuICAgICAgYm9yZGVyLWJvdHRvbS1jb2xvcjogQG5hdi10YWJzLWp1c3RpZmllZC1hY3RpdmUtbGluay1ib3JkZXItY29sb3I7XG4gICAgfVxuICB9XG59XG5cblxuLy8gVGFiYmFibGUgdGFic1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vLyBIaWRlIHRhYmJhYmxlIHBhbmVzIHRvIHN0YXJ0LCBzaG93IHRoZW0gd2hlbiBgLmFjdGl2ZWBcbi50YWItY29udGVudCB7XG4gID4gLnRhYi1wYW5lIHtcbiAgICBkaXNwbGF5OiBub25lO1xuICAgIHZpc2liaWxpdHk6IGhpZGRlbjtcbiAgfVxuICA+IC5hY3RpdmUge1xuICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgIHZpc2liaWxpdHk6IHZpc2libGU7XG4gIH1cbn1cblxuXG4vLyBEcm9wZG93bnNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLy8gU3BlY2lmaWMgZHJvcGRvd25zXG4ubmF2LXRhYnMgLmRyb3Bkb3duLW1lbnUge1xuICAvLyBtYWtlIGRyb3Bkb3duIGJvcmRlciBvdmVybGFwIHRhYiBib3JkZXJcbiAgbWFyZ2luLXRvcDogLTFweDtcbiAgLy8gUmVtb3ZlIHRoZSB0b3Agcm91bmRlZCBjb3JuZXJzIGhlcmUgc2luY2UgdGhlcmUgaXMgYSBoYXJkIGVkZ2UgYWJvdmUgdGhlIG1lbnVcbiAgLmJvcmRlci10b3AtcmFkaXVzKDApO1xufVxuIiwiLy9cbi8vIE5hdmJhcnNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cblxuLy8gV3JhcHBlciBhbmQgYmFzZSBjbGFzc1xuLy9cbi8vIFByb3ZpZGUgYSBzdGF0aWMgbmF2YmFyIGZyb20gd2hpY2ggd2UgZXhwYW5kIHRvIGNyZWF0ZSBmdWxsLXdpZHRoLCBmaXhlZCwgYW5kXG4vLyBvdGhlciBuYXZiYXIgdmFyaWF0aW9ucy5cblxuLm5hdmJhciB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgbWluLWhlaWdodDogQG5hdmJhci1oZWlnaHQ7IC8vIEVuc3VyZSBhIG5hdmJhciBhbHdheXMgc2hvd3MgKGUuZy4sIHdpdGhvdXQgYSAubmF2YmFyLWJyYW5kIGluIGNvbGxhcHNlZCBtb2RlKVxuICBtYXJnaW4tYm90dG9tOiBAbmF2YmFyLW1hcmdpbi1ib3R0b207XG4gIGJvcmRlcjogMXB4IHNvbGlkIHRyYW5zcGFyZW50O1xuXG4gIC8vIFByZXZlbnQgZmxvYXRzIGZyb20gYnJlYWtpbmcgdGhlIG5hdmJhclxuICAmOmV4dGVuZCguY2xlYXJmaXggYWxsKTtcblxuICBAbWVkaWEgKG1pbi13aWR0aDogQGdyaWQtZmxvYXQtYnJlYWtwb2ludCkge1xuICAgIGJvcmRlci1yYWRpdXM6IEBuYXZiYXItYm9yZGVyLXJhZGl1cztcbiAgfVxufVxuXG5cbi8vIE5hdmJhciBoZWFkaW5nXG4vL1xuLy8gR3JvdXBzIGAubmF2YmFyLWJyYW5kYCBhbmQgYC5uYXZiYXItdG9nZ2xlYCBpbnRvIGEgc2luZ2xlIGNvbXBvbmVudCBmb3IgZWFzeVxuLy8gc3R5bGluZyBvZiByZXNwb25zaXZlIGFzcGVjdHMuXG5cbi5uYXZiYXItaGVhZGVyIHtcbiAgJjpleHRlbmQoLmNsZWFyZml4IGFsbCk7XG5cbiAgQG1lZGlhIChtaW4td2lkdGg6IEBncmlkLWZsb2F0LWJyZWFrcG9pbnQpIHtcbiAgICBmbG9hdDogbGVmdDtcbiAgfVxufVxuXG5cbi8vIE5hdmJhciBjb2xsYXBzZSAoYm9keSlcbi8vXG4vLyBHcm91cCB5b3VyIG5hdmJhciBjb250ZW50IGludG8gdGhpcyBmb3IgZWFzeSBjb2xsYXBzaW5nIGFuZCBleHBhbmRpbmcgYWNyb3NzXG4vLyB2YXJpb3VzIGRldmljZSBzaXplcy4gQnkgZGVmYXVsdCwgdGhpcyBjb250ZW50IGlzIGNvbGxhcHNlZCB3aGVuIDw3NjhweCwgYnV0XG4vLyB3aWxsIGV4cGFuZCBwYXN0IHRoYXQgZm9yIGEgaG9yaXpvbnRhbCBkaXNwbGF5LlxuLy9cbi8vIFRvIHN0YXJ0IChvbiBtb2JpbGUgZGV2aWNlcykgdGhlIG5hdmJhciBsaW5rcywgZm9ybXMsIGFuZCBidXR0b25zIGFyZSBzdGFja2VkXG4vLyB2ZXJ0aWNhbGx5IGFuZCBpbmNsdWRlIGEgYG1heC1oZWlnaHRgIHRvIG92ZXJmbG93IGluIGNhc2UgeW91IGhhdmUgdG9vIG11Y2hcbi8vIGNvbnRlbnQgZm9yIHRoZSB1c2VyJ3Mgdmlld3BvcnQuXG5cbi5uYXZiYXItY29sbGFwc2Uge1xuICBvdmVyZmxvdy14OiB2aXNpYmxlO1xuICBwYWRkaW5nLXJpZ2h0OiBAbmF2YmFyLXBhZGRpbmctaG9yaXpvbnRhbDtcbiAgcGFkZGluZy1sZWZ0OiAgQG5hdmJhci1wYWRkaW5nLWhvcml6b250YWw7XG4gIGJvcmRlci10b3A6IDFweCBzb2xpZCB0cmFuc3BhcmVudDtcbiAgYm94LXNoYWRvdzogaW5zZXQgMCAxcHggMCByZ2JhKDI1NSwyNTUsMjU1LC4xKTtcbiAgJjpleHRlbmQoLmNsZWFyZml4IGFsbCk7XG4gIC13ZWJraXQtb3ZlcmZsb3ctc2Nyb2xsaW5nOiB0b3VjaDtcblxuICAmLmluIHtcbiAgICBvdmVyZmxvdy15OiBhdXRvO1xuICB9XG5cbiAgQG1lZGlhIChtaW4td2lkdGg6IEBncmlkLWZsb2F0LWJyZWFrcG9pbnQpIHtcbiAgICB3aWR0aDogYXV0bztcbiAgICBib3JkZXItdG9wOiAwO1xuICAgIGJveC1zaGFkb3c6IG5vbmU7XG5cbiAgICAmLmNvbGxhcHNlIHtcbiAgICAgIGRpc3BsYXk6IGJsb2NrICFpbXBvcnRhbnQ7XG4gICAgICB2aXNpYmlsaXR5OiB2aXNpYmxlICFpbXBvcnRhbnQ7XG4gICAgICBoZWlnaHQ6IGF1dG8gIWltcG9ydGFudDtcbiAgICAgIHBhZGRpbmctYm90dG9tOiAwOyAvLyBPdmVycmlkZSBkZWZhdWx0IHNldHRpbmdcbiAgICAgIG92ZXJmbG93OiB2aXNpYmxlICFpbXBvcnRhbnQ7XG4gICAgfVxuXG4gICAgJi5pbiB7XG4gICAgICBvdmVyZmxvdy15OiB2aXNpYmxlO1xuICAgIH1cblxuICAgIC8vIFVuZG8gdGhlIGNvbGxhcHNlIHNpZGUgcGFkZGluZyBmb3IgbmF2YmFycyB3aXRoIGNvbnRhaW5lcnMgdG8gZW5zdXJlXG4gICAgLy8gYWxpZ25tZW50IG9mIHJpZ2h0LWFsaWduZWQgY29udGVudHMuXG4gICAgLm5hdmJhci1maXhlZC10b3AgJixcbiAgICAubmF2YmFyLXN0YXRpYy10b3AgJixcbiAgICAubmF2YmFyLWZpeGVkLWJvdHRvbSAmIHtcbiAgICAgIHBhZGRpbmctbGVmdDogMDtcbiAgICAgIHBhZGRpbmctcmlnaHQ6IDA7XG4gICAgfVxuICB9XG59XG5cbi5uYXZiYXItZml4ZWQtdG9wLFxuLm5hdmJhci1maXhlZC1ib3R0b20ge1xuICAubmF2YmFyLWNvbGxhcHNlIHtcbiAgICBtYXgtaGVpZ2h0OiBAbmF2YmFyLWNvbGxhcHNlLW1heC1oZWlnaHQ7XG5cbiAgICBAbWVkaWEgKG1heC1kZXZpY2Utd2lkdGg6IEBzY3JlZW4teHMtbWluKSBhbmQgKG9yaWVudGF0aW9uOiBsYW5kc2NhcGUpIHtcbiAgICAgIG1heC1oZWlnaHQ6IDIwMHB4O1xuICAgIH1cbiAgfVxufVxuXG5cbi8vIEJvdGggbmF2YmFyIGhlYWRlciBhbmQgY29sbGFwc2Vcbi8vXG4vLyBXaGVuIGEgY29udGFpbmVyIGlzIHByZXNlbnQsIGNoYW5nZSB0aGUgYmVoYXZpb3Igb2YgdGhlIGhlYWRlciBhbmQgY29sbGFwc2UuXG5cbi5jb250YWluZXIsXG4uY29udGFpbmVyLWZsdWlkIHtcbiAgPiAubmF2YmFyLWhlYWRlcixcbiAgPiAubmF2YmFyLWNvbGxhcHNlIHtcbiAgICBtYXJnaW4tcmlnaHQ6IC1AbmF2YmFyLXBhZGRpbmctaG9yaXpvbnRhbDtcbiAgICBtYXJnaW4tbGVmdDogIC1AbmF2YmFyLXBhZGRpbmctaG9yaXpvbnRhbDtcblxuICAgIEBtZWRpYSAobWluLXdpZHRoOiBAZ3JpZC1mbG9hdC1icmVha3BvaW50KSB7XG4gICAgICBtYXJnaW4tcmlnaHQ6IDA7XG4gICAgICBtYXJnaW4tbGVmdDogIDA7XG4gICAgfVxuICB9XG59XG5cblxuLy9cbi8vIE5hdmJhciBhbGlnbm1lbnQgb3B0aW9uc1xuLy9cbi8vIERpc3BsYXkgdGhlIG5hdmJhciBhY3Jvc3MgdGhlIGVudGlyZXR5IG9mIHRoZSBwYWdlIG9yIGZpeGVkIGl0IHRvIHRoZSB0b3Agb3Jcbi8vIGJvdHRvbSBvZiB0aGUgcGFnZS5cblxuLy8gU3RhdGljIHRvcCAodW5maXhlZCwgYnV0IDEwMCUgd2lkZSkgbmF2YmFyXG4ubmF2YmFyLXN0YXRpYy10b3Age1xuICB6LWluZGV4OiBAemluZGV4LW5hdmJhcjtcbiAgYm9yZGVyLXdpZHRoOiAwIDAgMXB4O1xuXG4gIEBtZWRpYSAobWluLXdpZHRoOiBAZ3JpZC1mbG9hdC1icmVha3BvaW50KSB7XG4gICAgYm9yZGVyLXJhZGl1czogMDtcbiAgfVxufVxuXG4vLyBGaXggdGhlIHRvcC9ib3R0b20gbmF2YmFycyB3aGVuIHNjcmVlbiByZWFsIGVzdGF0ZSBzdXBwb3J0cyBpdFxuLm5hdmJhci1maXhlZC10b3AsXG4ubmF2YmFyLWZpeGVkLWJvdHRvbSB7XG4gIHBvc2l0aW9uOiBmaXhlZDtcbiAgcmlnaHQ6IDA7XG4gIGxlZnQ6IDA7XG4gIHotaW5kZXg6IEB6aW5kZXgtbmF2YmFyLWZpeGVkO1xuXG4gIC8vIFVuZG8gdGhlIHJvdW5kZWQgY29ybmVyc1xuICBAbWVkaWEgKG1pbi13aWR0aDogQGdyaWQtZmxvYXQtYnJlYWtwb2ludCkge1xuICAgIGJvcmRlci1yYWRpdXM6IDA7XG4gIH1cbn1cbi5uYXZiYXItZml4ZWQtdG9wIHtcbiAgdG9wOiAwO1xuICBib3JkZXItd2lkdGg6IDAgMCAxcHg7XG59XG4ubmF2YmFyLWZpeGVkLWJvdHRvbSB7XG4gIGJvdHRvbTogMDtcbiAgbWFyZ2luLWJvdHRvbTogMDsgLy8gb3ZlcnJpZGUgLm5hdmJhciBkZWZhdWx0c1xuICBib3JkZXItd2lkdGg6IDFweCAwIDA7XG59XG5cblxuLy8gQnJhbmQvcHJvamVjdCBuYW1lXG5cbi5uYXZiYXItYnJhbmQge1xuICBmbG9hdDogbGVmdDtcbiAgcGFkZGluZzogQG5hdmJhci1wYWRkaW5nLXZlcnRpY2FsIEBuYXZiYXItcGFkZGluZy1ob3Jpem9udGFsO1xuICBmb250LXNpemU6IEBmb250LXNpemUtbGFyZ2U7XG4gIGxpbmUtaGVpZ2h0OiBAbGluZS1oZWlnaHQtY29tcHV0ZWQ7XG4gIGhlaWdodDogQG5hdmJhci1oZWlnaHQ7XG5cbiAgJjpob3ZlcixcbiAgJjpmb2N1cyB7XG4gICAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xuICB9XG5cbiAgPiBpbWcge1xuICAgIGRpc3BsYXk6IGJsb2NrO1xuICB9XG5cbiAgQG1lZGlhIChtaW4td2lkdGg6IEBncmlkLWZsb2F0LWJyZWFrcG9pbnQpIHtcbiAgICAubmF2YmFyID4gLmNvbnRhaW5lciAmLFxuICAgIC5uYXZiYXIgPiAuY29udGFpbmVyLWZsdWlkICYge1xuICAgICAgbWFyZ2luLWxlZnQ6IC1AbmF2YmFyLXBhZGRpbmctaG9yaXpvbnRhbDtcbiAgICB9XG4gIH1cbn1cblxuXG4vLyBOYXZiYXIgdG9nZ2xlXG4vL1xuLy8gQ3VzdG9tIGJ1dHRvbiBmb3IgdG9nZ2xpbmcgdGhlIGAubmF2YmFyLWNvbGxhcHNlYCwgcG93ZXJlZCBieSB0aGUgY29sbGFwc2Vcbi8vIEphdmFTY3JpcHQgcGx1Z2luLlxuXG4ubmF2YmFyLXRvZ2dsZSB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgZmxvYXQ6IHJpZ2h0O1xuICBtYXJnaW4tcmlnaHQ6IEBuYXZiYXItcGFkZGluZy1ob3Jpem9udGFsO1xuICBwYWRkaW5nOiA5cHggMTBweDtcbiAgLm5hdmJhci12ZXJ0aWNhbC1hbGlnbigzNHB4KTtcbiAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7XG4gIGJhY2tncm91bmQtaW1hZ2U6IG5vbmU7IC8vIFJlc2V0IHVudXN1YWwgRmlyZWZveC1vbi1BbmRyb2lkIGRlZmF1bHQgc3R5bGU7IHNlZSBodHRwczovL2dpdGh1Yi5jb20vbmVjb2xhcy9ub3JtYWxpemUuY3NzL2lzc3Vlcy8yMTRcbiAgYm9yZGVyOiAxcHggc29saWQgdHJhbnNwYXJlbnQ7XG4gIGJvcmRlci1yYWRpdXM6IEBib3JkZXItcmFkaXVzLWJhc2U7XG5cbiAgLy8gV2UgcmVtb3ZlIHRoZSBgb3V0bGluZWAgaGVyZSwgYnV0IGxhdGVyIGNvbXBlbnNhdGUgYnkgYXR0YWNoaW5nIGA6aG92ZXJgXG4gIC8vIHN0eWxlcyB0byBgOmZvY3VzYC5cbiAgJjpmb2N1cyB7XG4gICAgb3V0bGluZTogMDtcbiAgfVxuXG4gIC8vIEJhcnNcbiAgLmljb24tYmFyIHtcbiAgICBkaXNwbGF5OiBibG9jaztcbiAgICB3aWR0aDogMjJweDtcbiAgICBoZWlnaHQ6IDJweDtcbiAgICBib3JkZXItcmFkaXVzOiAxcHg7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2VlZWVlZSAhaW1wb3J0YW50O1xuICB9XG4gIC5pY29uLWJhciArIC5pY29uLWJhciB7XG4gICAgbWFyZ2luLXRvcDogNHB4O1xuICB9XG5cbiAgQG1lZGlhIChtaW4td2lkdGg6IEBncmlkLWZsb2F0LWJyZWFrcG9pbnQpIHtcbiAgICBkaXNwbGF5OiBub25lO1xuICB9XG59XG5cblxuLy8gTmF2YmFyIG5hdiBsaW5rc1xuLy9cbi8vIEJ1aWxkcyBvbiB0b3Agb2YgdGhlIGAubmF2YCBjb21wb25lbnRzIHdpdGggaXRzIG93biBtb2RpZmllciBjbGFzcyB0byBtYWtlXG4vLyB0aGUgbmF2IHRoZSBmdWxsIGhlaWdodCBvZiB0aGUgaG9yaXpvbnRhbCBuYXYgKGFib3ZlIDc2OHB4KS5cblxuLm5hdmJhci1uYXYge1xuICBtYXJnaW46IChAbmF2YmFyLXBhZGRpbmctdmVydGljYWwgLyAyKSAtQG5hdmJhci1wYWRkaW5nLWhvcml6b250YWw7XG5cbiAgPiBsaSA+IGEge1xuICAgIHBhZGRpbmctdG9wOiAgICAxMHB4O1xuICAgIHBhZGRpbmctYm90dG9tOiAxMHB4O1xuICAgIGxpbmUtaGVpZ2h0OiBAbGluZS1oZWlnaHQtY29tcHV0ZWQ7XG4gIH1cblxuICBAbWVkaWEgKG1heC13aWR0aDogQGdyaWQtZmxvYXQtYnJlYWtwb2ludC1tYXgpIHtcbiAgICAvLyBEcm9wZG93bnMgZ2V0IGN1c3RvbSBkaXNwbGF5IHdoZW4gY29sbGFwc2VkXG4gICAgLm9wZW4gLmRyb3Bkb3duLW1lbnUge1xuICAgICAgcG9zaXRpb246IHN0YXRpYztcbiAgICAgIGZsb2F0OiBub25lO1xuICAgICAgd2lkdGg6IGF1dG87XG4gICAgICBtYXJnaW4tdG9wOiAwO1xuICAgICAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7XG4gICAgICBib3JkZXI6IDA7XG4gICAgICBib3gtc2hhZG93OiBub25lO1xuICAgICAgPiBsaSA+IGEsXG4gICAgICAuZHJvcGRvd24taGVhZGVyIHtcbiAgICAgICAgcGFkZGluZzogNXB4IDE1cHggNXB4IDI1cHg7XG4gICAgICB9XG4gICAgICA+IGxpID4gYSB7XG4gICAgICAgIGxpbmUtaGVpZ2h0OiBAbGluZS1oZWlnaHQtY29tcHV0ZWQ7XG4gICAgICAgICY6aG92ZXIsXG4gICAgICAgICY6Zm9jdXMge1xuICAgICAgICAgIGJhY2tncm91bmQtaW1hZ2U6IG5vbmU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBVbmNvbGxhcHNlIHRoZSBuYXZcbiAgQG1lZGlhIChtaW4td2lkdGg6IEBncmlkLWZsb2F0LWJyZWFrcG9pbnQpIHtcbiAgICBmbG9hdDogbGVmdDtcbiAgICBtYXJnaW46IDA7XG5cbiAgICA+IGxpIHtcbiAgICAgIGZsb2F0OiBsZWZ0O1xuICAgICAgPiBhIHtcbiAgICAgICAgcGFkZGluZy10b3A6ICAgIEBuYXZiYXItcGFkZGluZy12ZXJ0aWNhbDtcbiAgICAgICAgcGFkZGluZy1ib3R0b206IEBuYXZiYXItcGFkZGluZy12ZXJ0aWNhbDtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuXG4vLyBOYXZiYXIgZm9ybVxuLy9cbi8vIEV4dGVuc2lvbiBvZiB0aGUgYC5mb3JtLWlubGluZWAgd2l0aCBzb21lIGV4dHJhIGZsYXZvciBmb3Igb3B0aW11bSBkaXNwbGF5IGluXG4vLyBvdXIgbmF2YmFycy5cblxuLm5hdmJhci1mb3JtIHtcbiAgbWFyZ2luLWxlZnQ6IC1AbmF2YmFyLXBhZGRpbmctaG9yaXpvbnRhbDtcbiAgbWFyZ2luLXJpZ2h0OiAtQG5hdmJhci1wYWRkaW5nLWhvcml6b250YWw7XG4gIHBhZGRpbmc6IDEwcHggQG5hdmJhci1wYWRkaW5nLWhvcml6b250YWw7XG4gIGJvcmRlci10b3A6IDFweCBzb2xpZCB0cmFuc3BhcmVudDtcbiAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHRyYW5zcGFyZW50O1xuICBAc2hhZG93OiBpbnNldCAwIDFweCAwIHJnYmEoMjU1LDI1NSwyNTUsLjEpLCAwIDFweCAwIHJnYmEoMjU1LDI1NSwyNTUsLjEpO1xuICAuYm94LXNoYWRvdyhAc2hhZG93KTtcblxuICAvLyBNaXhpbiBiZWhhdmlvciBmb3Igb3B0aW11bSBkaXNwbGF5XG4gIC5mb3JtLWlubGluZSgpO1xuXG4gIC5mb3JtLWdyb3VwIHtcbiAgICBAbWVkaWEgKG1heC13aWR0aDogQGdyaWQtZmxvYXQtYnJlYWtwb2ludC1tYXgpIHtcbiAgICAgIG1hcmdpbi1ib3R0b206IDVweDtcblxuICAgICAgJjpsYXN0LWNoaWxkIHtcbiAgICAgICAgbWFyZ2luLWJvdHRvbTogMDtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBWZXJ0aWNhbGx5IGNlbnRlciBpbiBleHBhbmRlZCwgaG9yaXpvbnRhbCBuYXZiYXJcbiAgLm5hdmJhci12ZXJ0aWNhbC1hbGlnbihAaW5wdXQtaGVpZ2h0LWJhc2UpO1xuXG4gIC8vIFVuZG8gMTAwJSB3aWR0aCBmb3IgcHVsbCBjbGFzc2VzXG4gIEBtZWRpYSAobWluLXdpZHRoOiBAZ3JpZC1mbG9hdC1icmVha3BvaW50KSB7XG4gICAgd2lkdGg6IGF1dG87XG4gICAgYm9yZGVyOiAwO1xuICAgIG1hcmdpbi1sZWZ0OiAwO1xuICAgIG1hcmdpbi1yaWdodDogMDtcbiAgICBwYWRkaW5nLXRvcDogMDtcbiAgICBwYWRkaW5nLWJvdHRvbTogMDtcbiAgICAuYm94LXNoYWRvdyhub25lKTtcbiAgfVxufVxuXG5cbi8vIERyb3Bkb3duIG1lbnVzXG5cbi8vIE1lbnUgcG9zaXRpb24gYW5kIG1lbnUgY2FyZXRzXG4ubmF2YmFyLW5hdiA+IGxpID4gLmRyb3Bkb3duLW1lbnUge1xuICBtYXJnaW4tdG9wOiAwO1xuICAuYm9yZGVyLXRvcC1yYWRpdXMoMCk7XG59XG4vLyBNZW51IHBvc2l0aW9uIGFuZCBtZW51IGNhcmV0IHN1cHBvcnQgZm9yIGRyb3B1cHMgdmlhIGV4dHJhIGRyb3B1cCBjbGFzc1xuLm5hdmJhci1maXhlZC1ib3R0b20gLm5hdmJhci1uYXYgPiBsaSA+IC5kcm9wZG93bi1tZW51IHtcbiAgLmJvcmRlci1ib3R0b20tcmFkaXVzKDApO1xufVxuXG5cbi8vIEJ1dHRvbnMgaW4gbmF2YmFyc1xuLy9cbi8vIFZlcnRpY2FsbHkgY2VudGVyIGEgYnV0dG9uIHdpdGhpbiBhIG5hdmJhciAod2hlbiAqbm90KiBpbiBhIGZvcm0pLlxuXG4ubmF2YmFyLWJ0biB7XG4gIC5uYXZiYXItdmVydGljYWwtYWxpZ24oQGlucHV0LWhlaWdodC1iYXNlKTtcblxuICAmLmJ0bi1zbSB7XG4gICAgLm5hdmJhci12ZXJ0aWNhbC1hbGlnbihAaW5wdXQtaGVpZ2h0LXNtYWxsKTtcbiAgfVxuICAmLmJ0bi14cyB7XG4gICAgLm5hdmJhci12ZXJ0aWNhbC1hbGlnbigyMik7XG4gIH1cbn1cblxuXG4vLyBUZXh0IGluIG5hdmJhcnNcbi8vXG4vLyBBZGQgYSBjbGFzcyB0byBtYWtlIGFueSBlbGVtZW50IHByb3Blcmx5IGFsaWduIGl0c2VsZiB2ZXJ0aWNhbGx5IHdpdGhpbiB0aGUgbmF2YmFycy5cblxuLm5hdmJhci10ZXh0IHtcbiAgLm5hdmJhci12ZXJ0aWNhbC1hbGlnbihAbGluZS1oZWlnaHQtY29tcHV0ZWQpO1xuXG4gIEBtZWRpYSAobWluLXdpZHRoOiBAZ3JpZC1mbG9hdC1icmVha3BvaW50KSB7XG4gICAgZmxvYXQ6IGxlZnQ7XG4gICAgbWFyZ2luLWxlZnQ6IEBuYXZiYXItcGFkZGluZy1ob3Jpem9udGFsO1xuICAgIG1hcmdpbi1yaWdodDogQG5hdmJhci1wYWRkaW5nLWhvcml6b250YWw7XG4gIH1cbn1cblxuXG4vLyBDb21wb25lbnQgYWxpZ25tZW50XG4vL1xuLy8gUmVwdXJwb3NlIHRoZSBwdWxsIHV0aWxpdGllcyBhcyB0aGVpciBvd24gbmF2YmFyIHV0aWxpdGllcyB0byBhdm9pZCBzcGVjaWZpY2l0eVxuLy8gaXNzdWVzIHdpdGggcGFyZW50cyBhbmQgY2hhaW5pbmcuIE9ubHkgZG8gdGhpcyB3aGVuIHRoZSBuYXZiYXIgaXMgdW5jb2xsYXBzZWRcbi8vIHRob3VnaCBzbyB0aGF0IG5hdmJhciBjb250ZW50cyBwcm9wZXJseSBzdGFjayBhbmQgYWxpZ24gaW4gbW9iaWxlLlxuLy9cbi8vIERlY2xhcmVkIGFmdGVyIHRoZSBuYXZiYXIgY29tcG9uZW50cyB0byBlbnN1cmUgbW9yZSBzcGVjaWZpY2l0eSBvbiB0aGUgbWFyZ2lucy5cblxuQG1lZGlhIChtaW4td2lkdGg6IEBncmlkLWZsb2F0LWJyZWFrcG9pbnQpIHtcbiAgLm5hdmJhci1sZWZ0ICB7IC5wdWxsLWxlZnQoKTsgfVxuICAubmF2YmFyLXJpZ2h0IHtcbiAgICAucHVsbC1yaWdodCgpO1xuICAgIG1hcmdpbi1yaWdodDogLUBuYXZiYXItcGFkZGluZy1ob3Jpem9udGFsO1xuXG4gICAgfiAubmF2YmFyLXJpZ2h0IHtcbiAgICAgIG1hcmdpbi1yaWdodDogMDtcbiAgICB9XG4gIH1cbn1cblxuXG4vLyBBbHRlcm5hdGUgbmF2YmFyc1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLy8gRGVmYXVsdCBuYXZiYXJcbi5uYXZiYXItZGVmYXVsdCB7XG4gIGJhY2tncm91bmQtY29sb3I6IEBuYXZiYXItZGVmYXVsdC1iZztcbiAgYm9yZGVyLWNvbG9yOiBAbmF2YmFyLWRlZmF1bHQtYm9yZGVyO1xuXG4gIC5uYXZiYXItYnJhbmQge1xuICAgIGNvbG9yOiBAbmF2YmFyLWRlZmF1bHQtYnJhbmQtY29sb3I7XG4gICAgJjpob3ZlcixcbiAgICAmOmZvY3VzIHtcbiAgICAgIGNvbG9yOiBAbmF2YmFyLWRlZmF1bHQtYnJhbmQtaG92ZXItY29sb3I7XG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAbmF2YmFyLWRlZmF1bHQtYnJhbmQtaG92ZXItYmc7XG4gICAgfVxuICB9XG5cbiAgLm5hdmJhci10ZXh0IHtcbiAgICBjb2xvcjogQG5hdmJhci1kZWZhdWx0LWNvbG9yO1xuICB9XG5cbiAgLm5hdmJhci1uYXYge1xuICAgID4gbGkgPiBhIHtcbiAgICAgIGNvbG9yOiBAbmF2YmFyLWRlZmF1bHQtbGluay1jb2xvcjtcblxuICAgICAgJjpob3ZlcixcbiAgICAgICY6Zm9jdXMge1xuICAgICAgICBjb2xvcjogQG5hdmJhci1kZWZhdWx0LWxpbmstaG92ZXItY29sb3I7XG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6IEBuYXZiYXItZGVmYXVsdC1saW5rLWhvdmVyLWJnO1xuICAgICAgfVxuICAgIH1cbiAgICA+IC5hY3RpdmUgPiBhIHtcbiAgICAgICYsXG4gICAgICAmOmhvdmVyLFxuICAgICAgJjpmb2N1cyB7XG4gICAgICAgIGNvbG9yOiBAbmF2YmFyLWRlZmF1bHQtbGluay1hY3RpdmUtY29sb3I7XG4gICAgICB9XG4gICAgfVxuICAgID4gLmRpc2FibGVkID4gYSB7XG4gICAgICAmLFxuICAgICAgJjpob3ZlcixcbiAgICAgICY6Zm9jdXMge1xuICAgICAgICBjb2xvcjogQG5hdmJhci1kZWZhdWx0LWxpbmstZGlzYWJsZWQtY29sb3I7XG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6IEBuYXZiYXItZGVmYXVsdC1saW5rLWRpc2FibGVkLWJnO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC5uYXZiYXItdG9nZ2xlIHtcbiAgICBib3JkZXItY29sb3I6IEBuYXZiYXItZGVmYXVsdC10b2dnbGUtYm9yZGVyLWNvbG9yO1xuICAgICY6aG92ZXIsXG4gICAgJjpmb2N1cyB7XG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAbmF2YmFyLWRlZmF1bHQtdG9nZ2xlLWhvdmVyLWJnO1xuICAgIH1cbiAgICAuaWNvbi1iYXIge1xuICAgICAgYmFja2dyb3VuZC1jb2xvcjogQG5hdmJhci1kZWZhdWx0LXRvZ2dsZS1pY29uLWJhci1iZztcbiAgICB9XG4gIH1cblxuICAubmF2YmFyLWNvbGxhcHNlLFxuICAubmF2YmFyLWZvcm0ge1xuICAgIGJvcmRlci1jb2xvcjogQG5hdmJhci1kZWZhdWx0LWJvcmRlcjtcbiAgfVxuXG4gIC8vIERyb3Bkb3duIG1lbnUgaXRlbXNcbiAgLm5hdmJhci1uYXYge1xuICAgIC8vIFJlbW92ZSBiYWNrZ3JvdW5kIGNvbG9yIGZyb20gb3BlbiBkcm9wZG93blxuICAgID4gLm9wZW4gPiBhIHtcbiAgICAgICYsXG4gICAgICAmOmhvdmVyLFxuICAgICAgJjpmb2N1cyB7XG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6IEBuYXZiYXItZGVmYXVsdC1saW5rLWFjdGl2ZS1iZztcbiAgICAgICAgY29sb3I6IEBuYXZiYXItZGVmYXVsdC1saW5rLWFjdGl2ZS1jb2xvcjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBAbWVkaWEgKG1heC13aWR0aDogQGdyaWQtZmxvYXQtYnJlYWtwb2ludC1tYXgpIHtcbiAgICAgIC8vIERyb3Bkb3ducyBnZXQgY3VzdG9tIGRpc3BsYXkgd2hlbiBjb2xsYXBzZWRcbiAgICAgIC5vcGVuIC5kcm9wZG93bi1tZW51IHtcbiAgICAgICAgPiBsaSA+IGEge1xuICAgICAgICAgIGNvbG9yOiBAbmF2YmFyLWRlZmF1bHQtbGluay1jb2xvcjtcbiAgICAgICAgICAmOmhvdmVyLFxuICAgICAgICAgICY6Zm9jdXMge1xuICAgICAgICAgICAgY29sb3I6IEBuYXZiYXItZGVmYXVsdC1saW5rLWhvdmVyLWNvbG9yO1xuICAgICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogQG5hdmJhci1kZWZhdWx0LWxpbmstaG92ZXItYmc7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgID4gLmFjdGl2ZSA+IGEge1xuICAgICAgICAgICYsXG4gICAgICAgICAgJjpob3ZlcixcbiAgICAgICAgICAmOmZvY3VzIHtcbiAgICAgICAgICAgIGNvbG9yOiBAbmF2YmFyLWRlZmF1bHQtbGluay1hY3RpdmUtY29sb3I7XG4gICAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAbmF2YmFyLWRlZmF1bHQtbGluay1hY3RpdmUtYmc7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgID4gLmRpc2FibGVkID4gYSB7XG4gICAgICAgICAgJixcbiAgICAgICAgICAmOmhvdmVyLFxuICAgICAgICAgICY6Zm9jdXMge1xuICAgICAgICAgICAgY29sb3I6IEBuYXZiYXItZGVmYXVsdC1saW5rLWRpc2FibGVkLWNvbG9yO1xuICAgICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogQG5hdmJhci1kZWZhdWx0LWxpbmstZGlzYWJsZWQtYmc7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cblxuICAvLyBMaW5rcyBpbiBuYXZiYXJzXG4gIC8vXG4gIC8vIEFkZCBhIGNsYXNzIHRvIGVuc3VyZSBsaW5rcyBvdXRzaWRlIHRoZSBuYXZiYXIgbmF2IGFyZSBjb2xvcmVkIGNvcnJlY3RseS5cblxuICAubmF2YmFyLWxpbmsge1xuICAgIGNvbG9yOiBAbmF2YmFyLWRlZmF1bHQtbGluay1jb2xvcjtcbiAgICAmOmhvdmVyIHtcbiAgICAgIGNvbG9yOiBAbmF2YmFyLWRlZmF1bHQtbGluay1ob3Zlci1jb2xvcjtcbiAgICB9XG4gIH1cblxuICAuYnRuLWxpbmsge1xuICAgIGNvbG9yOiBAbmF2YmFyLWRlZmF1bHQtbGluay1jb2xvcjtcbiAgICAmOmhvdmVyLFxuICAgICY6Zm9jdXMge1xuICAgICAgY29sb3I6IEBuYXZiYXItZGVmYXVsdC1saW5rLWhvdmVyLWNvbG9yO1xuICAgIH1cbiAgICAmW2Rpc2FibGVkXSxcbiAgICBmaWVsZHNldFtkaXNhYmxlZF0gJiB7XG4gICAgICAmOmhvdmVyLFxuICAgICAgJjpmb2N1cyB7XG4gICAgICAgIGNvbG9yOiBAbmF2YmFyLWRlZmF1bHQtbGluay1kaXNhYmxlZC1jb2xvcjtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuLy8gSW52ZXJzZSBuYXZiYXJcblxuLm5hdmJhci1pbnZlcnNlIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogQG5hdmJhci1pbnZlcnNlLWJnO1xuICBib3JkZXItY29sb3I6IEBuYXZiYXItaW52ZXJzZS1ib3JkZXI7XG5cbiAgLm5hdmJhci1icmFuZCB7XG4gICAgY29sb3I6IEBuYXZiYXItaW52ZXJzZS1icmFuZC1jb2xvcjtcbiAgICAmOmhvdmVyLFxuICAgICY6Zm9jdXMge1xuICAgICAgY29sb3I6IEBuYXZiYXItaW52ZXJzZS1icmFuZC1ob3Zlci1jb2xvcjtcbiAgICAgIGJhY2tncm91bmQtY29sb3I6IEBuYXZiYXItaW52ZXJzZS1icmFuZC1ob3Zlci1iZztcbiAgICB9XG4gIH1cblxuICAubmF2YmFyLXRleHQge1xuICAgIGNvbG9yOiBAbmF2YmFyLWludmVyc2UtY29sb3I7XG4gIH1cblxuICAubmF2YmFyLW5hdiB7XG4gICAgPiBsaSA+IGEge1xuICAgICAgY29sb3I6IEBuYXZiYXItaW52ZXJzZS1saW5rLWNvbG9yO1xuXG4gICAgICAmOmhvdmVyLFxuICAgICAgJjpmb2N1cyB7XG4gICAgICAgIGNvbG9yOiBAbmF2YmFyLWludmVyc2UtbGluay1ob3Zlci1jb2xvcjtcbiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogQG5hdmJhci1pbnZlcnNlLWxpbmstaG92ZXItYmc7XG4gICAgICB9XG4gICAgfVxuICAgID4gLmFjdGl2ZSA+IGEge1xuICAgICAgJixcbiAgICAgICY6aG92ZXIsXG4gICAgICAmOmZvY3VzIHtcbiAgICAgICAgY29sb3I6IEBuYXZiYXItaW52ZXJzZS1saW5rLWFjdGl2ZS1jb2xvcjtcbiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogQG5hdmJhci1pbnZlcnNlLWxpbmstYWN0aXZlLWJnO1xuICAgICAgfVxuICAgIH1cbiAgICA+IC5kaXNhYmxlZCA+IGEge1xuICAgICAgJixcbiAgICAgICY6aG92ZXIsXG4gICAgICAmOmZvY3VzIHtcbiAgICAgICAgY29sb3I6IEBuYXZiYXItaW52ZXJzZS1saW5rLWRpc2FibGVkLWNvbG9yO1xuICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAbmF2YmFyLWludmVyc2UtbGluay1kaXNhYmxlZC1iZztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBEYXJrZW4gdGhlIHJlc3BvbnNpdmUgbmF2IHRvZ2dsZVxuICAubmF2YmFyLXRvZ2dsZSB7XG4gICAgYm9yZGVyLWNvbG9yOiBAbmF2YmFyLWludmVyc2UtdG9nZ2xlLWJvcmRlci1jb2xvcjtcbiAgICAmOmhvdmVyLFxuICAgICY6Zm9jdXMge1xuICAgICAgYmFja2dyb3VuZC1jb2xvcjogQG5hdmJhci1pbnZlcnNlLXRvZ2dsZS1ob3Zlci1iZztcbiAgICB9XG4gICAgLmljb24tYmFyIHtcbiAgICAgIGJhY2tncm91bmQtY29sb3I6IEBuYXZiYXItaW52ZXJzZS10b2dnbGUtaWNvbi1iYXItYmc7XG4gICAgfVxuICB9XG5cbiAgLm5hdmJhci1jb2xsYXBzZSxcbiAgLm5hdmJhci1mb3JtIHtcbiAgICBib3JkZXItY29sb3I6IGRhcmtlbihAbmF2YmFyLWludmVyc2UtYmcsIDclKTtcbiAgfVxuXG4gIC8vIERyb3Bkb3duc1xuICAubmF2YmFyLW5hdiB7XG4gICAgPiAub3BlbiA+IGEge1xuICAgICAgJixcbiAgICAgICY6aG92ZXIsXG4gICAgICAmOmZvY3VzIHtcbiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogQG5hdmJhci1pbnZlcnNlLWxpbmstYWN0aXZlLWJnO1xuICAgICAgICBjb2xvcjogQG5hdmJhci1pbnZlcnNlLWxpbmstYWN0aXZlLWNvbG9yO1xuICAgICAgfVxuICAgIH1cblxuICAgIEBtZWRpYSAobWF4LXdpZHRoOiBAZ3JpZC1mbG9hdC1icmVha3BvaW50LW1heCkge1xuICAgICAgLy8gRHJvcGRvd25zIGdldCBjdXN0b20gZGlzcGxheVxuICAgICAgLm9wZW4gLmRyb3Bkb3duLW1lbnUge1xuICAgICAgICA+IC5kcm9wZG93bi1oZWFkZXIge1xuICAgICAgICAgIGJvcmRlci1jb2xvcjogQG5hdmJhci1pbnZlcnNlLWJvcmRlcjtcbiAgICAgICAgfVxuICAgICAgICAuZGl2aWRlciB7XG4gICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogQG5hdmJhci1pbnZlcnNlLWJvcmRlcjtcbiAgICAgICAgfVxuICAgICAgICA+IGxpID4gYSB7XG4gICAgICAgICAgY29sb3I6IEBuYXZiYXItaW52ZXJzZS1saW5rLWNvbG9yO1xuICAgICAgICAgICY6aG92ZXIsXG4gICAgICAgICAgJjpmb2N1cyB7XG4gICAgICAgICAgICBjb2xvcjogQG5hdmJhci1pbnZlcnNlLWxpbmstaG92ZXItY29sb3I7XG4gICAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAbmF2YmFyLWludmVyc2UtbGluay1ob3Zlci1iZztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgPiAuYWN0aXZlID4gYSB7XG4gICAgICAgICAgJixcbiAgICAgICAgICAmOmhvdmVyLFxuICAgICAgICAgICY6Zm9jdXMge1xuICAgICAgICAgICAgY29sb3I6IEBuYXZiYXItaW52ZXJzZS1saW5rLWFjdGl2ZS1jb2xvcjtcbiAgICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6IEBuYXZiYXItaW52ZXJzZS1saW5rLWFjdGl2ZS1iZztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgPiAuZGlzYWJsZWQgPiBhIHtcbiAgICAgICAgICAmLFxuICAgICAgICAgICY6aG92ZXIsXG4gICAgICAgICAgJjpmb2N1cyB7XG4gICAgICAgICAgICBjb2xvcjogQG5hdmJhci1pbnZlcnNlLWxpbmstZGlzYWJsZWQtY29sb3I7XG4gICAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAbmF2YmFyLWludmVyc2UtbGluay1kaXNhYmxlZC1iZztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAubmF2YmFyLWxpbmsge1xuICAgIGNvbG9yOiBAbmF2YmFyLWludmVyc2UtbGluay1jb2xvcjtcbiAgICAmOmhvdmVyIHtcbiAgICAgIGNvbG9yOiBAbmF2YmFyLWludmVyc2UtbGluay1ob3Zlci1jb2xvcjtcbiAgICB9XG4gIH1cblxuICAuYnRuLWxpbmsge1xuICAgIGNvbG9yOiBAbmF2YmFyLWludmVyc2UtbGluay1jb2xvcjtcbiAgICAmOmhvdmVyLFxuICAgICY6Zm9jdXMge1xuICAgICAgY29sb3I6IEBuYXZiYXItaW52ZXJzZS1saW5rLWhvdmVyLWNvbG9yO1xuICAgIH1cbiAgICAmW2Rpc2FibGVkXSxcbiAgICBmaWVsZHNldFtkaXNhYmxlZF0gJiB7XG4gICAgICAmOmhvdmVyLFxuICAgICAgJjpmb2N1cyB7XG4gICAgICAgIGNvbG9yOiBAbmF2YmFyLWludmVyc2UtbGluay1kaXNhYmxlZC1jb2xvcjtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiIsIi8vIE5hdmJhciB2ZXJ0aWNhbCBhbGlnblxuLy9cbi8vIFZlcnRpY2FsbHkgY2VudGVyIGVsZW1lbnRzIGluIHRoZSBuYXZiYXIuXG4vLyBFeGFtcGxlOiBhbiBlbGVtZW50IGhhcyBhIGhlaWdodCBvZiAzMHB4LCBzbyB3cml0ZSBvdXQgYC5uYXZiYXItdmVydGljYWwtYWxpZ24oMzBweCk7YCB0byBjYWxjdWxhdGUgdGhlIGFwcHJvcHJpYXRlIHRvcCBtYXJnaW4uXG5cbi5uYXZiYXItdmVydGljYWwtYWxpZ24oQGVsZW1lbnQtaGVpZ2h0KSB7XG4gIG1hcmdpbi10b3A6ICgoQG5hdmJhci1oZWlnaHQgLSBAZWxlbWVudC1oZWlnaHQpIC8gMik7XG4gIG1hcmdpbi1ib3R0b206ICgoQG5hdmJhci1oZWlnaHQgLSBAZWxlbWVudC1oZWlnaHQpIC8gMik7XG59XG4iLCIvL1xuLy8gVXRpbGl0eSBjbGFzc2VzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5cbi8vIEZsb2F0c1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4uY2xlYXJmaXgge1xuICAuY2xlYXJmaXgoKTtcbn1cbi5jZW50ZXItYmxvY2sge1xuICAuY2VudGVyLWJsb2NrKCk7XG59XG4ucHVsbC1yaWdodCB7XG4gIGZsb2F0OiByaWdodCAhaW1wb3J0YW50O1xufVxuLnB1bGwtbGVmdCB7XG4gIGZsb2F0OiBsZWZ0ICFpbXBvcnRhbnQ7XG59XG5cblxuLy8gVG9nZ2xpbmcgY29udGVudFxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vLyBOb3RlOiBEZXByZWNhdGVkIC5oaWRlIGluIGZhdm9yIG9mIC5oaWRkZW4gb3IgLnNyLW9ubHkgKGFzIGFwcHJvcHJpYXRlKSBpbiB2My4wLjFcbi5oaWRlIHtcbiAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50O1xufVxuLnNob3cge1xuICBkaXNwbGF5OiBibG9jayAhaW1wb3J0YW50O1xufVxuLmludmlzaWJsZSB7XG4gIHZpc2liaWxpdHk6IGhpZGRlbjtcbn1cbi50ZXh0LWhpZGUge1xuICAudGV4dC1oaWRlKCk7XG59XG5cblxuLy8gSGlkZSBmcm9tIHNjcmVlbnJlYWRlcnMgYW5kIGJyb3dzZXJzXG4vL1xuLy8gQ3JlZGl0OiBIVE1MNSBCb2lsZXJwbGF0ZVxuXG4uaGlkZGVuIHtcbiAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50O1xuICB2aXNpYmlsaXR5OiBoaWRkZW4gIWltcG9ydGFudDtcbn1cblxuXG4vLyBGb3IgQWZmaXggcGx1Z2luXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi5hZmZpeCB7XG4gIHBvc2l0aW9uOiBmaXhlZDtcbn1cbiIsIi8vXG4vLyBCcmVhZGNydW1ic1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuXG4uYnJlYWRjcnVtYiB7XG4gIHBhZGRpbmc6IEBicmVhZGNydW1iLXBhZGRpbmctdmVydGljYWwgQGJyZWFkY3J1bWItcGFkZGluZy1ob3Jpem9udGFsO1xuICBtYXJnaW4tYm90dG9tOiBAbGluZS1oZWlnaHQtY29tcHV0ZWQ7XG4gIGxpc3Qtc3R5bGU6IG5vbmU7XG4gIGJhY2tncm91bmQtY29sb3I6IEBicmVhZGNydW1iLWJnO1xuICBib3JkZXItcmFkaXVzOiBAYm9yZGVyLXJhZGl1cy1iYXNlO1xuXG4gID4gbGkge1xuICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcblxuICAgICsgbGk6YmVmb3JlIHtcbiAgICAgIGNvbnRlbnQ6IFwiQHticmVhZGNydW1iLXNlcGFyYXRvcn1cXDAwYTBcIjsgLy8gVW5pY29kZSBzcGFjZSBhZGRlZCBzaW5jZSBpbmxpbmUtYmxvY2sgbWVhbnMgbm9uLWNvbGxhcHNpbmcgd2hpdGUtc3BhY2VcbiAgICAgIHBhZGRpbmc6IDAgNXB4O1xuICAgICAgY29sb3I6IEBicmVhZGNydW1iLWNvbG9yO1xuICAgIH1cbiAgfVxuXG4gID4gLmFjdGl2ZSB7XG4gICAgY29sb3I6IEBicmVhZGNydW1iLWFjdGl2ZS1jb2xvcjtcbiAgfVxufVxuIiwiLy9cbi8vIFBhZ2luYXRpb24gKG11bHRpcGxlIHBhZ2VzKVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi5wYWdpbmF0aW9uIHtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICBwYWRkaW5nLWxlZnQ6IDA7XG4gIG1hcmdpbjogQGxpbmUtaGVpZ2h0LWNvbXB1dGVkIDA7XG4gIGJvcmRlci1yYWRpdXM6IEBib3JkZXItcmFkaXVzLWJhc2U7XG5cbiAgPiBsaSB7XG4gICAgZGlzcGxheTogaW5saW5lOyAvLyBSZW1vdmUgbGlzdC1zdHlsZSBhbmQgYmxvY2stbGV2ZWwgZGVmYXVsdHNcbiAgICA+IGEsXG4gICAgPiBzcGFuIHtcbiAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICAgIGZsb2F0OiBsZWZ0OyAvLyBDb2xsYXBzZSB3aGl0ZS1zcGFjZVxuICAgICAgcGFkZGluZzogQHBhZGRpbmctYmFzZS12ZXJ0aWNhbCBAcGFkZGluZy1iYXNlLWhvcml6b250YWw7XG4gICAgICBsaW5lLWhlaWdodDogQGxpbmUtaGVpZ2h0LWJhc2U7XG4gICAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7XG4gICAgICBjb2xvcjogQHBhZ2luYXRpb24tY29sb3I7XG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAcGFnaW5hdGlvbi1iZztcbiAgICAgIGJvcmRlcjogMXB4IHNvbGlkIEBwYWdpbmF0aW9uLWJvcmRlcjtcbiAgICAgIG1hcmdpbi1sZWZ0OiAtMXB4O1xuICAgIH1cbiAgICAmOmZpcnN0LWNoaWxkIHtcbiAgICAgID4gYSxcbiAgICAgID4gc3BhbiB7XG4gICAgICAgIG1hcmdpbi1sZWZ0OiAwO1xuICAgICAgICAuYm9yZGVyLWxlZnQtcmFkaXVzKEBib3JkZXItcmFkaXVzLWJhc2UpO1xuICAgICAgfVxuICAgIH1cbiAgICAmOmxhc3QtY2hpbGQge1xuICAgICAgPiBhLFxuICAgICAgPiBzcGFuIHtcbiAgICAgICAgLmJvcmRlci1yaWdodC1yYWRpdXMoQGJvcmRlci1yYWRpdXMtYmFzZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgPiBsaSA+IGEsXG4gID4gbGkgPiBzcGFuIHtcbiAgICAmOmhvdmVyLFxuICAgICY6Zm9jdXMge1xuICAgICAgY29sb3I6IEBwYWdpbmF0aW9uLWhvdmVyLWNvbG9yO1xuICAgICAgYmFja2dyb3VuZC1jb2xvcjogQHBhZ2luYXRpb24taG92ZXItYmc7XG4gICAgICBib3JkZXItY29sb3I6IEBwYWdpbmF0aW9uLWhvdmVyLWJvcmRlcjtcbiAgICB9XG4gIH1cblxuICA+IC5hY3RpdmUgPiBhLFxuICA+IC5hY3RpdmUgPiBzcGFuIHtcbiAgICAmLFxuICAgICY6aG92ZXIsXG4gICAgJjpmb2N1cyB7XG4gICAgICB6LWluZGV4OiAyO1xuICAgICAgY29sb3I6IEBwYWdpbmF0aW9uLWFjdGl2ZS1jb2xvcjtcbiAgICAgIGJhY2tncm91bmQtY29sb3I6IEBwYWdpbmF0aW9uLWFjdGl2ZS1iZztcbiAgICAgIGJvcmRlci1jb2xvcjogQHBhZ2luYXRpb24tYWN0aXZlLWJvcmRlcjtcbiAgICAgIGN1cnNvcjogZGVmYXVsdDtcbiAgICB9XG4gIH1cblxuICA+IC5kaXNhYmxlZCB7XG4gICAgPiBzcGFuLFxuICAgID4gc3Bhbjpob3ZlcixcbiAgICA+IHNwYW46Zm9jdXMsXG4gICAgPiBhLFxuICAgID4gYTpob3ZlcixcbiAgICA+IGE6Zm9jdXMge1xuICAgICAgY29sb3I6IEBwYWdpbmF0aW9uLWRpc2FibGVkLWNvbG9yO1xuICAgICAgYmFja2dyb3VuZC1jb2xvcjogQHBhZ2luYXRpb24tZGlzYWJsZWQtYmc7XG4gICAgICBib3JkZXItY29sb3I6IEBwYWdpbmF0aW9uLWRpc2FibGVkLWJvcmRlcjtcbiAgICAgIGN1cnNvcjogQGN1cnNvci1kaXNhYmxlZDtcbiAgICB9XG4gIH1cbn1cblxuLy8gU2l6aW5nXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vLyBMYXJnZVxuLnBhZ2luYXRpb24tbGcge1xuICAucGFnaW5hdGlvbi1zaXplKEBwYWRkaW5nLWxhcmdlLXZlcnRpY2FsOyBAcGFkZGluZy1sYXJnZS1ob3Jpem9udGFsOyBAZm9udC1zaXplLWxhcmdlOyBAYm9yZGVyLXJhZGl1cy1sYXJnZSk7XG59XG5cbi8vIFNtYWxsXG4ucGFnaW5hdGlvbi1zbSB7XG4gIC5wYWdpbmF0aW9uLXNpemUoQHBhZGRpbmctc21hbGwtdmVydGljYWw7IEBwYWRkaW5nLXNtYWxsLWhvcml6b250YWw7IEBmb250LXNpemUtc21hbGw7IEBib3JkZXItcmFkaXVzLXNtYWxsKTtcbn1cbiIsIi8vIFBhZ2luYXRpb25cblxuLnBhZ2luYXRpb24tc2l6ZShAcGFkZGluZy12ZXJ0aWNhbDsgQHBhZGRpbmctaG9yaXpvbnRhbDsgQGZvbnQtc2l6ZTsgQGJvcmRlci1yYWRpdXMpIHtcbiAgPiBsaSB7XG4gICAgPiBhLFxuICAgID4gc3BhbiB7XG4gICAgICBwYWRkaW5nOiBAcGFkZGluZy12ZXJ0aWNhbCBAcGFkZGluZy1ob3Jpem9udGFsO1xuICAgICAgZm9udC1zaXplOiBAZm9udC1zaXplO1xuICAgIH1cbiAgICAmOmZpcnN0LWNoaWxkIHtcbiAgICAgID4gYSxcbiAgICAgID4gc3BhbiB7XG4gICAgICAgIC5ib3JkZXItbGVmdC1yYWRpdXMoQGJvcmRlci1yYWRpdXMpO1xuICAgICAgfVxuICAgIH1cbiAgICAmOmxhc3QtY2hpbGQge1xuICAgICAgPiBhLFxuICAgICAgPiBzcGFuIHtcbiAgICAgICAgLmJvcmRlci1yaWdodC1yYWRpdXMoQGJvcmRlci1yYWRpdXMpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIiwiLy9cbi8vIFBhZ2VyIHBhZ2luYXRpb25cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cblxuLnBhZ2VyIHtcbiAgcGFkZGluZy1sZWZ0OiAwO1xuICBtYXJnaW46IEBsaW5lLWhlaWdodC1jb21wdXRlZCAwO1xuICBsaXN0LXN0eWxlOiBub25lO1xuICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gICY6ZXh0ZW5kKC5jbGVhcmZpeCBhbGwpO1xuICBsaSB7XG4gICAgZGlzcGxheTogaW5saW5lO1xuICAgID4gYSxcbiAgICA+IHNwYW4ge1xuICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgICAgcGFkZGluZzogNXB4IDE0cHg7XG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAcGFnZXItYmc7XG4gICAgICBib3JkZXI6IDFweCBzb2xpZCBAcGFnZXItYm9yZGVyO1xuICAgICAgYm9yZGVyLXJhZGl1czogQHBhZ2VyLWJvcmRlci1yYWRpdXM7XG4gICAgfVxuXG4gICAgPiBhOmhvdmVyLFxuICAgID4gYTpmb2N1cyB7XG4gICAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7XG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAcGFnZXItaG92ZXItYmc7XG4gICAgfVxuICB9XG5cbiAgLm5leHQge1xuICAgID4gYSxcbiAgICA+IHNwYW4ge1xuICAgICAgZmxvYXQ6IHJpZ2h0O1xuICAgIH1cbiAgfVxuXG4gIC5wcmV2aW91cyB7XG4gICAgPiBhLFxuICAgID4gc3BhbiB7XG4gICAgICBmbG9hdDogbGVmdDtcbiAgICB9XG4gIH1cblxuICAuZGlzYWJsZWQge1xuICAgID4gYSxcbiAgICA+IGE6aG92ZXIsXG4gICAgPiBhOmZvY3VzLFxuICAgID4gc3BhbiB7XG4gICAgICBjb2xvcjogQHBhZ2VyLWRpc2FibGVkLWNvbG9yO1xuICAgICAgYmFja2dyb3VuZC1jb2xvcjogQHBhZ2VyLWJnO1xuICAgICAgY3Vyc29yOiBAY3Vyc29yLWRpc2FibGVkO1xuICAgIH1cbiAgfVxufVxuIiwiLy9cbi8vIExhYmVsc1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLmxhYmVsIHtcbiAgZGlzcGxheTogaW5saW5lO1xuICBwYWRkaW5nOiAuMmVtIC42ZW0gLjNlbTtcbiAgZm9udC1zaXplOiA3NSU7XG4gIGZvbnQtd2VpZ2h0OiBib2xkO1xuICBsaW5lLWhlaWdodDogMTtcbiAgY29sb3I6IEBsYWJlbC1jb2xvcjtcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xuICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuICB2ZXJ0aWNhbC1hbGlnbjogYmFzZWxpbmU7XG4gIGJvcmRlci1yYWRpdXM6IC4yNWVtO1xuXG4gIC8vIEFkZCBob3ZlciBlZmZlY3RzLCBidXQgb25seSBmb3IgbGlua3NcbiAgYSYge1xuICAgICY6aG92ZXIsXG4gICAgJjpmb2N1cyB7XG4gICAgICBjb2xvcjogQGxhYmVsLWxpbmstaG92ZXItY29sb3I7XG4gICAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7XG4gICAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgfVxuICB9XG5cbiAgLy8gRW1wdHkgbGFiZWxzIGNvbGxhcHNlIGF1dG9tYXRpY2FsbHkgKG5vdCBhdmFpbGFibGUgaW4gSUU4KVxuICAmOmVtcHR5IHtcbiAgICBkaXNwbGF5OiBub25lO1xuICB9XG5cbiAgLy8gUXVpY2sgZml4IGZvciBsYWJlbHMgaW4gYnV0dG9uc1xuICAuYnRuICYge1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICB0b3A6IC0xcHg7XG4gIH1cbn1cblxuLy8gQ29sb3JzXG4vLyBDb250ZXh0dWFsIHZhcmlhdGlvbnMgKGxpbmtlZCBsYWJlbHMgZ2V0IGRhcmtlciBvbiA6aG92ZXIpXG5cbi5sYWJlbC1kZWZhdWx0IHtcbiAgLmxhYmVsLXZhcmlhbnQoQGxhYmVsLWRlZmF1bHQtYmcpO1xufVxuXG4ubGFiZWwtcHJpbWFyeSB7XG4gIC5sYWJlbC12YXJpYW50KEBsYWJlbC1wcmltYXJ5LWJnKTtcbn1cblxuLmxhYmVsLXN1Y2Nlc3Mge1xuICAubGFiZWwtdmFyaWFudChAbGFiZWwtc3VjY2Vzcy1iZyk7XG59XG5cbi5sYWJlbC1pbmZvIHtcbiAgLmxhYmVsLXZhcmlhbnQoQGxhYmVsLWluZm8tYmcpO1xufVxuXG4ubGFiZWwtd2FybmluZyB7XG4gIC5sYWJlbC12YXJpYW50KEBsYWJlbC13YXJuaW5nLWJnKTtcbn1cblxuLmxhYmVsLWRhbmdlciB7XG4gIC5sYWJlbC12YXJpYW50KEBsYWJlbC1kYW5nZXItYmcpO1xufVxuIiwiLy8gTGFiZWxzXG5cbi5sYWJlbC12YXJpYW50KEBjb2xvcikge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiBAY29sb3I7XG5cbiAgJltocmVmXSB7XG4gICAgJjpob3ZlcixcbiAgICAmOmZvY3VzIHtcbiAgICAgIGJhY2tncm91bmQtY29sb3I6IGRhcmtlbihAY29sb3IsIDEwJSk7XG4gICAgfVxuICB9XG59XG4iLCIvL1xuLy8gQmFkZ2VzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5cbi8vIEJhc2UgY2xhc3Ncbi5iYWRnZSB7XG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgbWluLXdpZHRoOiAxMHB4O1xuICBwYWRkaW5nOiAzcHggN3B4O1xuICBmb250LXNpemU6IEBmb250LXNpemUtc21hbGw7XG4gIGZvbnQtd2VpZ2h0OiBAYmFkZ2UtZm9udC13ZWlnaHQ7XG4gIGNvbG9yOiBAYmFkZ2UtY29sb3I7XG4gIGxpbmUtaGVpZ2h0OiBAYmFkZ2UtbGluZS1oZWlnaHQ7XG4gIHZlcnRpY2FsLWFsaWduOiBiYXNlbGluZTtcbiAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiBAYmFkZ2UtYmc7XG4gIGJvcmRlci1yYWRpdXM6IEBiYWRnZS1ib3JkZXItcmFkaXVzO1xuXG4gIC8vIEVtcHR5IGJhZGdlcyBjb2xsYXBzZSBhdXRvbWF0aWNhbGx5IChub3QgYXZhaWxhYmxlIGluIElFOClcbiAgJjplbXB0eSB7XG4gICAgZGlzcGxheTogbm9uZTtcbiAgfVxuXG4gIC8vIFF1aWNrIGZpeCBmb3IgYmFkZ2VzIGluIGJ1dHRvbnNcbiAgLmJ0biAmIHtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgdG9wOiAtMXB4O1xuICB9XG4gIC5idG4teHMgJiB7XG4gICAgdG9wOiAwO1xuICAgIHBhZGRpbmc6IDFweCA1cHg7XG4gIH1cblxuICAvLyBIb3ZlciBzdGF0ZSwgYnV0IG9ubHkgZm9yIGxpbmtzXG4gIGEmIHtcbiAgICAmOmhvdmVyLFxuICAgICY6Zm9jdXMge1xuICAgICAgY29sb3I6IEBiYWRnZS1saW5rLWhvdmVyLWNvbG9yO1xuICAgICAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xuICAgICAgY3Vyc29yOiBwb2ludGVyO1xuICAgIH1cbiAgfVxuXG4gIC8vIEFjY291bnQgZm9yIGJhZGdlcyBpbiBuYXZzXG4gIGEubGlzdC1ncm91cC1pdGVtLmFjdGl2ZSA+ICYsXG4gIC5uYXYtcGlsbHMgPiAuYWN0aXZlID4gYSA+ICYge1xuICAgIGNvbG9yOiBAYmFkZ2UtYWN0aXZlLWNvbG9yO1xuICAgIGJhY2tncm91bmQtY29sb3I6IEBiYWRnZS1hY3RpdmUtYmc7XG4gIH1cbiAgLm5hdi1waWxscyA+IGxpID4gYSA+ICYge1xuICAgIG1hcmdpbi1sZWZ0OiAzcHg7XG4gIH1cbn1cbiIsIi8vXG4vLyBKdW1ib3Ryb25cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cblxuLmp1bWJvdHJvbiB7XG4gIHBhZGRpbmc6IEBqdW1ib3Ryb24tcGFkZGluZyAoQGp1bWJvdHJvbi1wYWRkaW5nIC8gMik7XG4gIG1hcmdpbi1ib3R0b206IEBqdW1ib3Ryb24tcGFkZGluZztcbiAgY29sb3I6IEBqdW1ib3Ryb24tY29sb3I7XG4gIGJhY2tncm91bmQtY29sb3I6IEBqdW1ib3Ryb24tYmc7XG5cbiAgaDEsXG4gIC5oMSB7XG4gICAgY29sb3I6IEBqdW1ib3Ryb24taGVhZGluZy1jb2xvcjtcbiAgfVxuICBwIHtcbiAgICBtYXJnaW4tYm90dG9tOiAoQGp1bWJvdHJvbi1wYWRkaW5nIC8gMik7XG4gICAgZm9udC1zaXplOiBAanVtYm90cm9uLWZvbnQtc2l6ZTtcbiAgICBmb250LXdlaWdodDogMjAwO1xuICB9XG5cbiAgPiBociB7XG4gICAgYm9yZGVyLXRvcC1jb2xvcjogZGFya2VuKEBqdW1ib3Ryb24tYmcsIDEwJSk7XG4gIH1cblxuICAuY29udGFpbmVyICYsXG4gIC5jb250YWluZXItZmx1aWQgJiB7XG4gICAgYm9yZGVyLXJhZGl1czogQGJvcmRlci1yYWRpdXMtbGFyZ2U7IC8vIE9ubHkgcm91bmQgY29ybmVycyBhdCBoaWdoZXIgcmVzb2x1dGlvbnMgaWYgY29udGFpbmVkIGluIGEgY29udGFpbmVyXG4gIH1cblxuICAuY29udGFpbmVyIHtcbiAgICBtYXgtd2lkdGg6IDEwMCU7XG4gIH1cblxuICBAbWVkaWEgc2NyZWVuIGFuZCAobWluLXdpZHRoOiBAc2NyZWVuLXNtLW1pbikge1xuICAgIHBhZGRpbmc6IChAanVtYm90cm9uLXBhZGRpbmcgKiAxLjYpIDA7XG5cbiAgICAuY29udGFpbmVyICYge1xuICAgICAgcGFkZGluZy1sZWZ0OiAgKEBqdW1ib3Ryb24tcGFkZGluZyAqIDIpO1xuICAgICAgcGFkZGluZy1yaWdodDogKEBqdW1ib3Ryb24tcGFkZGluZyAqIDIpO1xuICAgIH1cblxuICAgIGgxLFxuICAgIC5oMSB7XG4gICAgICBmb250LXNpemU6IChAZm9udC1zaXplLWJhc2UgKiA0LjUpO1xuICAgIH1cbiAgfVxufVxuIiwiLy9cbi8vIEFsZXJ0c1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuXG4vLyBCYXNlIHN0eWxlc1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4uYWxlcnQge1xuICBwYWRkaW5nOiBAYWxlcnQtcGFkZGluZztcbiAgbWFyZ2luLWJvdHRvbTogQGxpbmUtaGVpZ2h0LWNvbXB1dGVkO1xuICBib3JkZXI6IDFweCBzb2xpZCB0cmFuc3BhcmVudDtcbiAgYm9yZGVyLXJhZGl1czogQGFsZXJ0LWJvcmRlci1yYWRpdXM7XG5cbiAgLy8gSGVhZGluZ3MgZm9yIGxhcmdlciBhbGVydHNcbiAgaDQge1xuICAgIG1hcmdpbi10b3A6IDA7XG4gICAgLy8gU3BlY2lmaWVkIGZvciB0aGUgaDQgdG8gcHJldmVudCBjb25mbGljdHMgb2YgY2hhbmdpbmcgQGhlYWRpbmdzLWNvbG9yXG4gICAgY29sb3I6IGluaGVyaXQ7XG4gIH1cbiAgLy8gUHJvdmlkZSBjbGFzcyBmb3IgbGlua3MgdGhhdCBtYXRjaCBhbGVydHNcbiAgLmFsZXJ0LWxpbmsge1xuICAgIGZvbnQtd2VpZ2h0OiBAYWxlcnQtbGluay1mb250LXdlaWdodDtcbiAgfVxuXG4gIC8vIEltcHJvdmUgYWxpZ25tZW50IGFuZCBzcGFjaW5nIG9mIGlubmVyIGNvbnRlbnRcbiAgPiBwLFxuICA+IHVsIHtcbiAgICBtYXJnaW4tYm90dG9tOiAwO1xuICB9XG4gID4gcCArIHAge1xuICAgIG1hcmdpbi10b3A6IDVweDtcbiAgfVxufVxuXG4vLyBEaXNtaXNzaWJsZSBhbGVydHNcbi8vXG4vLyBFeHBhbmQgdGhlIHJpZ2h0IHBhZGRpbmcgYW5kIGFjY291bnQgZm9yIHRoZSBjbG9zZSBidXR0b24ncyBwb3NpdGlvbmluZy5cblxuLmFsZXJ0LWRpc21pc3NhYmxlLCAvLyBUaGUgbWlzc3BlbGxlZCAuYWxlcnQtZGlzbWlzc2FibGUgd2FzIGRlcHJlY2F0ZWQgaW4gMy4yLjAuXG4uYWxlcnQtZGlzbWlzc2libGUge1xuICBwYWRkaW5nLXJpZ2h0OiAoQGFsZXJ0LXBhZGRpbmcgKyAyMCk7XG5cbiAgLy8gQWRqdXN0IGNsb3NlIGxpbmsgcG9zaXRpb25cbiAgLmNsb3NlIHtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgdG9wOiAtMnB4O1xuICAgIHJpZ2h0OiAtMjFweDtcbiAgICBjb2xvcjogaW5oZXJpdDtcbiAgfVxufVxuXG4vLyBBbHRlcm5hdGUgc3R5bGVzXG4vL1xuLy8gR2VuZXJhdGUgY29udGV4dHVhbCBtb2RpZmllciBjbGFzc2VzIGZvciBjb2xvcml6aW5nIHRoZSBhbGVydC5cblxuLmFsZXJ0LXN1Y2Nlc3Mge1xuICAuYWxlcnQtdmFyaWFudChAYWxlcnQtc3VjY2Vzcy1iZzsgQGFsZXJ0LXN1Y2Nlc3MtYm9yZGVyOyBAYWxlcnQtc3VjY2Vzcy10ZXh0KTtcbn1cbi5hbGVydC1pbmZvIHtcbiAgLmFsZXJ0LXZhcmlhbnQoQGFsZXJ0LWluZm8tYmc7IEBhbGVydC1pbmZvLWJvcmRlcjsgQGFsZXJ0LWluZm8tdGV4dCk7XG59XG4uYWxlcnQtd2FybmluZyB7XG4gIC5hbGVydC12YXJpYW50KEBhbGVydC13YXJuaW5nLWJnOyBAYWxlcnQtd2FybmluZy1ib3JkZXI7IEBhbGVydC13YXJuaW5nLXRleHQpO1xufVxuLmFsZXJ0LWRhbmdlciB7XG4gIC5hbGVydC12YXJpYW50KEBhbGVydC1kYW5nZXItYmc7IEBhbGVydC1kYW5nZXItYm9yZGVyOyBAYWxlcnQtZGFuZ2VyLXRleHQpO1xufVxuIiwiLy8gQWxlcnRzXG5cbi5hbGVydC12YXJpYW50KEBiYWNrZ3JvdW5kOyBAYm9yZGVyOyBAdGV4dC1jb2xvcikge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiBAYmFja2dyb3VuZDtcbiAgYm9yZGVyLWNvbG9yOiBAYm9yZGVyO1xuICBjb2xvcjogQHRleHQtY29sb3I7XG5cbiAgaHIge1xuICAgIGJvcmRlci10b3AtY29sb3I6IGRhcmtlbihAYm9yZGVyLCA1JSk7XG4gIH1cbiAgLmFsZXJ0LWxpbmsge1xuICAgIGNvbG9yOiBkYXJrZW4oQHRleHQtY29sb3IsIDEwJSk7XG4gIH1cbn1cbiIsIi8vXG4vLyBQcm9ncmVzcyBiYXJzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5cbi8vIEJhciBhbmltYXRpb25zXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8vIFdlYktpdFxuQC13ZWJraXQta2V5ZnJhbWVzIHByb2dyZXNzLWJhci1zdHJpcGVzIHtcbiAgZnJvbSAgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiA0MHB4IDA7IH1cbiAgdG8gICAgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAwIDA7IH1cbn1cblxuLy8gU3BlYyBhbmQgSUUxMCtcbkBrZXlmcmFtZXMgcHJvZ3Jlc3MtYmFyLXN0cmlwZXMge1xuICBmcm9tICB7IGJhY2tncm91bmQtcG9zaXRpb246IDQwcHggMDsgfVxuICB0byAgICB7IGJhY2tncm91bmQtcG9zaXRpb246IDAgMDsgfVxufVxuXG5cbi8vIEJhciBpdHNlbGZcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLy8gT3V0ZXIgY29udGFpbmVyXG4ucHJvZ3Jlc3Mge1xuICBvdmVyZmxvdzogaGlkZGVuO1xuICBoZWlnaHQ6IEBsaW5lLWhlaWdodC1jb21wdXRlZDtcbiAgbWFyZ2luLWJvdHRvbTogQGxpbmUtaGVpZ2h0LWNvbXB1dGVkO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiBAcHJvZ3Jlc3MtYmc7XG4gIGJvcmRlci1yYWRpdXM6IEBwcm9ncmVzcy1ib3JkZXItcmFkaXVzO1xuICAuYm94LXNoYWRvdyhpbnNldCAwIDFweCAycHggcmdiYSgwLDAsMCwuMSkpO1xufVxuXG4vLyBCYXIgb2YgcHJvZ3Jlc3Ncbi5wcm9ncmVzcy1iYXIge1xuICBmbG9hdDogbGVmdDtcbiAgd2lkdGg6IDAlO1xuICBoZWlnaHQ6IDEwMCU7XG4gIGZvbnQtc2l6ZTogQGZvbnQtc2l6ZS1zbWFsbDtcbiAgbGluZS1oZWlnaHQ6IEBsaW5lLWhlaWdodC1jb21wdXRlZDtcbiAgY29sb3I6IEBwcm9ncmVzcy1iYXItY29sb3I7XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgYmFja2dyb3VuZC1jb2xvcjogQHByb2dyZXNzLWJhci1iZztcbiAgLmJveC1zaGFkb3coaW5zZXQgMCAtMXB4IDAgcmdiYSgwLDAsMCwuMTUpKTtcbiAgLnRyYW5zaXRpb24od2lkdGggLjZzIGVhc2UpO1xufVxuXG4vLyBTdHJpcGVkIGJhcnNcbi8vXG4vLyBgLnByb2dyZXNzLXN0cmlwZWQgLnByb2dyZXNzLWJhcmAgaXMgZGVwcmVjYXRlZCBhcyBvZiB2My4yLjAgaW4gZmF2b3Igb2YgdGhlXG4vLyBgLnByb2dyZXNzLWJhci1zdHJpcGVkYCBjbGFzcywgd2hpY2ggeW91IGp1c3QgYWRkIHRvIGFuIGV4aXN0aW5nXG4vLyBgLnByb2dyZXNzLWJhcmAuXG4ucHJvZ3Jlc3Mtc3RyaXBlZCAucHJvZ3Jlc3MtYmFyLFxuLnByb2dyZXNzLWJhci1zdHJpcGVkIHtcbiAgI2dyYWRpZW50ID4gLnN0cmlwZWQoKTtcbiAgYmFja2dyb3VuZC1zaXplOiA0MHB4IDQwcHg7XG59XG5cbi8vIENhbGwgYW5pbWF0aW9uIGZvciB0aGUgYWN0aXZlIG9uZVxuLy9cbi8vIGAucHJvZ3Jlc3MuYWN0aXZlIC5wcm9ncmVzcy1iYXJgIGlzIGRlcHJlY2F0ZWQgYXMgb2YgdjMuMi4wIGluIGZhdm9yIG9mIHRoZVxuLy8gYC5wcm9ncmVzcy1iYXIuYWN0aXZlYCBhcHByb2FjaC5cbi5wcm9ncmVzcy5hY3RpdmUgLnByb2dyZXNzLWJhcixcbi5wcm9ncmVzcy1iYXIuYWN0aXZlIHtcbiAgLmFuaW1hdGlvbihwcm9ncmVzcy1iYXItc3RyaXBlcyAycyBsaW5lYXIgaW5maW5pdGUpO1xufVxuXG5cbi8vIFZhcmlhdGlvbnNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLnByb2dyZXNzLWJhci1zdWNjZXNzIHtcbiAgLnByb2dyZXNzLWJhci12YXJpYW50KEBwcm9ncmVzcy1iYXItc3VjY2Vzcy1iZyk7XG59XG5cbi5wcm9ncmVzcy1iYXItaW5mbyB7XG4gIC5wcm9ncmVzcy1iYXItdmFyaWFudChAcHJvZ3Jlc3MtYmFyLWluZm8tYmcpO1xufVxuXG4ucHJvZ3Jlc3MtYmFyLXdhcm5pbmcge1xuICAucHJvZ3Jlc3MtYmFyLXZhcmlhbnQoQHByb2dyZXNzLWJhci13YXJuaW5nLWJnKTtcbn1cblxuLnByb2dyZXNzLWJhci1kYW5nZXIge1xuICAucHJvZ3Jlc3MtYmFyLXZhcmlhbnQoQHByb2dyZXNzLWJhci1kYW5nZXItYmcpO1xufVxuIiwiLy8gR3JhZGllbnRzXG5cbiNncmFkaWVudCB7XG5cbiAgLy8gSG9yaXpvbnRhbCBncmFkaWVudCwgZnJvbSBsZWZ0IHRvIHJpZ2h0XG4gIC8vXG4gIC8vIENyZWF0ZXMgdHdvIGNvbG9yIHN0b3BzLCBzdGFydCBhbmQgZW5kLCBieSBzcGVjaWZ5aW5nIGEgY29sb3IgYW5kIHBvc2l0aW9uIGZvciBlYWNoIGNvbG9yIHN0b3AuXG4gIC8vIENvbG9yIHN0b3BzIGFyZSBub3QgYXZhaWxhYmxlIGluIElFOSBhbmQgYmVsb3cuXG4gIC5ob3Jpem9udGFsKEBzdGFydC1jb2xvcjogIzU1NTsgQGVuZC1jb2xvcjogIzMzMzsgQHN0YXJ0LXBlcmNlbnQ6IDAlOyBAZW5kLXBlcmNlbnQ6IDEwMCUpIHtcbiAgICBiYWNrZ3JvdW5kLWltYWdlOiAtd2Via2l0LWxpbmVhci1ncmFkaWVudChsZWZ0LCBAc3RhcnQtY29sb3IgQHN0YXJ0LXBlcmNlbnQsIEBlbmQtY29sb3IgQGVuZC1wZXJjZW50KTsgLy8gU2FmYXJpIDUuMS02LCBDaHJvbWUgMTArXG4gICAgYmFja2dyb3VuZC1pbWFnZTogLW8tbGluZWFyLWdyYWRpZW50KGxlZnQsIEBzdGFydC1jb2xvciBAc3RhcnQtcGVyY2VudCwgQGVuZC1jb2xvciBAZW5kLXBlcmNlbnQpOyAvLyBPcGVyYSAxMlxuICAgIGJhY2tncm91bmQtaW1hZ2U6IGxpbmVhci1ncmFkaWVudCh0byByaWdodCwgQHN0YXJ0LWNvbG9yIEBzdGFydC1wZXJjZW50LCBAZW5kLWNvbG9yIEBlbmQtcGVyY2VudCk7IC8vIFN0YW5kYXJkLCBJRTEwLCBGaXJlZm94IDE2KywgT3BlcmEgMTIuMTArLCBTYWZhcmkgNyssIENocm9tZSAyNitcbiAgICBiYWNrZ3JvdW5kLXJlcGVhdDogcmVwZWF0LXg7XG4gICAgZmlsdGVyOiBlKCUoXCJwcm9naWQ6RFhJbWFnZVRyYW5zZm9ybS5NaWNyb3NvZnQuZ3JhZGllbnQoc3RhcnRDb2xvcnN0cj0nJWQnLCBlbmRDb2xvcnN0cj0nJWQnLCBHcmFkaWVudFR5cGU9MSlcIixhcmdiKEBzdGFydC1jb2xvciksYXJnYihAZW5kLWNvbG9yKSkpOyAvLyBJRTkgYW5kIGRvd25cbiAgfVxuXG4gIC8vIFZlcnRpY2FsIGdyYWRpZW50LCBmcm9tIHRvcCB0byBib3R0b21cbiAgLy9cbiAgLy8gQ3JlYXRlcyB0d28gY29sb3Igc3RvcHMsIHN0YXJ0IGFuZCBlbmQsIGJ5IHNwZWNpZnlpbmcgYSBjb2xvciBhbmQgcG9zaXRpb24gZm9yIGVhY2ggY29sb3Igc3RvcC5cbiAgLy8gQ29sb3Igc3RvcHMgYXJlIG5vdCBhdmFpbGFibGUgaW4gSUU5IGFuZCBiZWxvdy5cbiAgLnZlcnRpY2FsKEBzdGFydC1jb2xvcjogIzU1NTsgQGVuZC1jb2xvcjogIzMzMzsgQHN0YXJ0LXBlcmNlbnQ6IDAlOyBAZW5kLXBlcmNlbnQ6IDEwMCUpIHtcbiAgICBiYWNrZ3JvdW5kLWltYWdlOiAtd2Via2l0LWxpbmVhci1ncmFkaWVudCh0b3AsIEBzdGFydC1jb2xvciBAc3RhcnQtcGVyY2VudCwgQGVuZC1jb2xvciBAZW5kLXBlcmNlbnQpOyAgLy8gU2FmYXJpIDUuMS02LCBDaHJvbWUgMTArXG4gICAgYmFja2dyb3VuZC1pbWFnZTogLW8tbGluZWFyLWdyYWRpZW50KHRvcCwgQHN0YXJ0LWNvbG9yIEBzdGFydC1wZXJjZW50LCBAZW5kLWNvbG9yIEBlbmQtcGVyY2VudCk7ICAvLyBPcGVyYSAxMlxuICAgIGJhY2tncm91bmQtaW1hZ2U6IGxpbmVhci1ncmFkaWVudCh0byBib3R0b20sIEBzdGFydC1jb2xvciBAc3RhcnQtcGVyY2VudCwgQGVuZC1jb2xvciBAZW5kLXBlcmNlbnQpOyAvLyBTdGFuZGFyZCwgSUUxMCwgRmlyZWZveCAxNissIE9wZXJhIDEyLjEwKywgU2FmYXJpIDcrLCBDaHJvbWUgMjYrXG4gICAgYmFja2dyb3VuZC1yZXBlYXQ6IHJlcGVhdC14O1xuICAgIGZpbHRlcjogZSglKFwicHJvZ2lkOkRYSW1hZ2VUcmFuc2Zvcm0uTWljcm9zb2Z0LmdyYWRpZW50KHN0YXJ0Q29sb3JzdHI9JyVkJywgZW5kQ29sb3JzdHI9JyVkJywgR3JhZGllbnRUeXBlPTApXCIsYXJnYihAc3RhcnQtY29sb3IpLGFyZ2IoQGVuZC1jb2xvcikpKTsgLy8gSUU5IGFuZCBkb3duXG4gIH1cblxuICAuZGlyZWN0aW9uYWwoQHN0YXJ0LWNvbG9yOiAjNTU1OyBAZW5kLWNvbG9yOiAjMzMzOyBAZGVnOiA0NWRlZykge1xuICAgIGJhY2tncm91bmQtcmVwZWF0OiByZXBlYXQteDtcbiAgICBiYWNrZ3JvdW5kLWltYWdlOiAtd2Via2l0LWxpbmVhci1ncmFkaWVudChAZGVnLCBAc3RhcnQtY29sb3IsIEBlbmQtY29sb3IpOyAvLyBTYWZhcmkgNS4xLTYsIENocm9tZSAxMCtcbiAgICBiYWNrZ3JvdW5kLWltYWdlOiAtby1saW5lYXItZ3JhZGllbnQoQGRlZywgQHN0YXJ0LWNvbG9yLCBAZW5kLWNvbG9yKTsgLy8gT3BlcmEgMTJcbiAgICBiYWNrZ3JvdW5kLWltYWdlOiBsaW5lYXItZ3JhZGllbnQoQGRlZywgQHN0YXJ0LWNvbG9yLCBAZW5kLWNvbG9yKTsgLy8gU3RhbmRhcmQsIElFMTAsIEZpcmVmb3ggMTYrLCBPcGVyYSAxMi4xMCssIFNhZmFyaSA3KywgQ2hyb21lIDI2K1xuICB9XG4gIC5ob3Jpem9udGFsLXRocmVlLWNvbG9ycyhAc3RhcnQtY29sb3I6ICMwMGIzZWU7IEBtaWQtY29sb3I6ICM3YTQzYjY7IEBjb2xvci1zdG9wOiA1MCU7IEBlbmQtY29sb3I6ICNjMzMyNWYpIHtcbiAgICBiYWNrZ3JvdW5kLWltYWdlOiAtd2Via2l0LWxpbmVhci1ncmFkaWVudChsZWZ0LCBAc3RhcnQtY29sb3IsIEBtaWQtY29sb3IgQGNvbG9yLXN0b3AsIEBlbmQtY29sb3IpO1xuICAgIGJhY2tncm91bmQtaW1hZ2U6IC1vLWxpbmVhci1ncmFkaWVudChsZWZ0LCBAc3RhcnQtY29sb3IsIEBtaWQtY29sb3IgQGNvbG9yLXN0b3AsIEBlbmQtY29sb3IpO1xuICAgIGJhY2tncm91bmQtaW1hZ2U6IGxpbmVhci1ncmFkaWVudCh0byByaWdodCwgQHN0YXJ0LWNvbG9yLCBAbWlkLWNvbG9yIEBjb2xvci1zdG9wLCBAZW5kLWNvbG9yKTtcbiAgICBiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0O1xuICAgIGZpbHRlcjogZSglKFwicHJvZ2lkOkRYSW1hZ2VUcmFuc2Zvcm0uTWljcm9zb2Z0LmdyYWRpZW50KHN0YXJ0Q29sb3JzdHI9JyVkJywgZW5kQ29sb3JzdHI9JyVkJywgR3JhZGllbnRUeXBlPTEpXCIsYXJnYihAc3RhcnQtY29sb3IpLGFyZ2IoQGVuZC1jb2xvcikpKTsgLy8gSUU5IGFuZCBkb3duLCBnZXRzIG5vIGNvbG9yLXN0b3AgYXQgYWxsIGZvciBwcm9wZXIgZmFsbGJhY2tcbiAgfVxuICAudmVydGljYWwtdGhyZWUtY29sb3JzKEBzdGFydC1jb2xvcjogIzAwYjNlZTsgQG1pZC1jb2xvcjogIzdhNDNiNjsgQGNvbG9yLXN0b3A6IDUwJTsgQGVuZC1jb2xvcjogI2MzMzI1Zikge1xuICAgIGJhY2tncm91bmQtaW1hZ2U6IC13ZWJraXQtbGluZWFyLWdyYWRpZW50KEBzdGFydC1jb2xvciwgQG1pZC1jb2xvciBAY29sb3Itc3RvcCwgQGVuZC1jb2xvcik7XG4gICAgYmFja2dyb3VuZC1pbWFnZTogLW8tbGluZWFyLWdyYWRpZW50KEBzdGFydC1jb2xvciwgQG1pZC1jb2xvciBAY29sb3Itc3RvcCwgQGVuZC1jb2xvcik7XG4gICAgYmFja2dyb3VuZC1pbWFnZTogbGluZWFyLWdyYWRpZW50KEBzdGFydC1jb2xvciwgQG1pZC1jb2xvciBAY29sb3Itc3RvcCwgQGVuZC1jb2xvcik7XG4gICAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDtcbiAgICBmaWx0ZXI6IGUoJShcInByb2dpZDpEWEltYWdlVHJhbnNmb3JtLk1pY3Jvc29mdC5ncmFkaWVudChzdGFydENvbG9yc3RyPSclZCcsIGVuZENvbG9yc3RyPSclZCcsIEdyYWRpZW50VHlwZT0wKVwiLGFyZ2IoQHN0YXJ0LWNvbG9yKSxhcmdiKEBlbmQtY29sb3IpKSk7IC8vIElFOSBhbmQgZG93biwgZ2V0cyBubyBjb2xvci1zdG9wIGF0IGFsbCBmb3IgcHJvcGVyIGZhbGxiYWNrXG4gIH1cbiAgLnJhZGlhbChAaW5uZXItY29sb3I6ICM1NTU7IEBvdXRlci1jb2xvcjogIzMzMykge1xuICAgIGJhY2tncm91bmQtaW1hZ2U6IC13ZWJraXQtcmFkaWFsLWdyYWRpZW50KGNpcmNsZSwgQGlubmVyLWNvbG9yLCBAb3V0ZXItY29sb3IpO1xuICAgIGJhY2tncm91bmQtaW1hZ2U6IHJhZGlhbC1ncmFkaWVudChjaXJjbGUsIEBpbm5lci1jb2xvciwgQG91dGVyLWNvbG9yKTtcbiAgICBiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0O1xuICB9XG4gIC5zdHJpcGVkKEBjb2xvcjogcmdiYSgyNTUsMjU1LDI1NSwuMTUpOyBAYW5nbGU6IDQ1ZGVnKSB7XG4gICAgYmFja2dyb3VuZC1pbWFnZTogLXdlYmtpdC1saW5lYXItZ3JhZGllbnQoQGFuZ2xlLCBAY29sb3IgMjUlLCB0cmFuc3BhcmVudCAyNSUsIHRyYW5zcGFyZW50IDUwJSwgQGNvbG9yIDUwJSwgQGNvbG9yIDc1JSwgdHJhbnNwYXJlbnQgNzUlLCB0cmFuc3BhcmVudCk7XG4gICAgYmFja2dyb3VuZC1pbWFnZTogLW8tbGluZWFyLWdyYWRpZW50KEBhbmdsZSwgQGNvbG9yIDI1JSwgdHJhbnNwYXJlbnQgMjUlLCB0cmFuc3BhcmVudCA1MCUsIEBjb2xvciA1MCUsIEBjb2xvciA3NSUsIHRyYW5zcGFyZW50IDc1JSwgdHJhbnNwYXJlbnQpO1xuICAgIGJhY2tncm91bmQtaW1hZ2U6IGxpbmVhci1ncmFkaWVudChAYW5nbGUsIEBjb2xvciAyNSUsIHRyYW5zcGFyZW50IDI1JSwgdHJhbnNwYXJlbnQgNTAlLCBAY29sb3IgNTAlLCBAY29sb3IgNzUlLCB0cmFuc3BhcmVudCA3NSUsIHRyYW5zcGFyZW50KTtcbiAgfVxufVxuIiwiLy8gUHJvZ3Jlc3MgYmFyc1xuXG4ucHJvZ3Jlc3MtYmFyLXZhcmlhbnQoQGNvbG9yKSB7XG4gIGJhY2tncm91bmQtY29sb3I6IEBjb2xvcjtcblxuICAvLyBEZXByZWNhdGVkIHBhcmVudCBjbGFzcyByZXF1aXJlbWVudCBhcyBvZiB2My4yLjBcbiAgLnByb2dyZXNzLXN0cmlwZWQgJiB7XG4gICAgI2dyYWRpZW50ID4gLnN0cmlwZWQoKTtcbiAgfVxufVxuIiwiLm1lZGlhIHtcbiAgLy8gUHJvcGVyIHNwYWNpbmcgYmV0d2VlbiBpbnN0YW5jZXMgb2YgLm1lZGlhXG4gIG1hcmdpbi10b3A6IDE1cHg7XG5cbiAgJjpmaXJzdC1jaGlsZCB7XG4gICAgbWFyZ2luLXRvcDogMDtcbiAgfVxufVxuXG4ubWVkaWEtcmlnaHQsXG4ubWVkaWEgPiAucHVsbC1yaWdodCB7XG4gIHBhZGRpbmctbGVmdDogMTBweDtcbn1cblxuLm1lZGlhLWxlZnQsXG4ubWVkaWEgPiAucHVsbC1sZWZ0IHtcbiAgcGFkZGluZy1yaWdodDogMTBweDtcbn1cblxuLm1lZGlhLWxlZnQsXG4ubWVkaWEtcmlnaHQsXG4ubWVkaWEtYm9keSB7XG4gIGRpc3BsYXk6IHRhYmxlLWNlbGw7XG4gIHZlcnRpY2FsLWFsaWduOiB0b3A7XG59XG5cbi5tZWRpYS1taWRkbGUge1xuICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1xufVxuXG4ubWVkaWEtYm90dG9tIHtcbiAgdmVydGljYWwtYWxpZ246IGJvdHRvbTtcbn1cblxuLy8gUmVzZXQgbWFyZ2lucyBvbiBoZWFkaW5ncyBmb3IgdGlnaHRlciBkZWZhdWx0IHNwYWNpbmdcbi5tZWRpYS1oZWFkaW5nIHtcbiAgbWFyZ2luLXRvcDogMDtcbiAgbWFyZ2luLWJvdHRvbTogNXB4O1xufVxuXG4vLyBNZWRpYSBsaXN0IHZhcmlhdGlvblxuLy9cbi8vIFVuZG8gZGVmYXVsdCB1bC9vbCBzdHlsZXNcbi5tZWRpYS1saXN0IHtcbiAgcGFkZGluZy1sZWZ0OiAwO1xuICBsaXN0LXN0eWxlOiBub25lO1xufVxuIiwiLy9cbi8vIExpc3QgZ3JvdXBzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5cbi8vIEJhc2UgY2xhc3Ncbi8vXG4vLyBFYXNpbHkgdXNhYmxlIG9uIDx1bD4sIDxvbD4sIG9yIDxkaXY+LlxuXG4ubGlzdC1ncm91cCB7XG4gIC8vIE5vIG5lZWQgdG8gc2V0IGxpc3Qtc3R5bGU6IG5vbmU7IHNpbmNlIC5saXN0LWdyb3VwLWl0ZW0gaXMgYmxvY2sgbGV2ZWxcbiAgbWFyZ2luLWJvdHRvbTogMjBweDtcbiAgcGFkZGluZy1sZWZ0OiAwOyAvLyByZXNldCBwYWRkaW5nIGJlY2F1c2UgdWwgYW5kIG9sXG59XG5cblxuLy8gSW5kaXZpZHVhbCBsaXN0IGl0ZW1zXG4vL1xuLy8gVXNlIG9uIGBsaWBzIG9yIGBkaXZgcyB3aXRoaW4gdGhlIGAubGlzdC1ncm91cGAgcGFyZW50LlxuXG4ubGlzdC1ncm91cC1pdGVtIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICBkaXNwbGF5OiBibG9jaztcbiAgcGFkZGluZzogMTBweCAxNXB4O1xuICAvLyBQbGFjZSB0aGUgYm9yZGVyIG9uIHRoZSBsaXN0IGl0ZW1zIGFuZCBuZWdhdGl2ZSBtYXJnaW4gdXAgZm9yIGJldHRlciBzdHlsaW5nXG4gIG1hcmdpbi1ib3R0b206IC0xcHg7XG4gIGJhY2tncm91bmQtY29sb3I6IEBsaXN0LWdyb3VwLWJnO1xuICBib3JkZXI6IDFweCBzb2xpZCBAbGlzdC1ncm91cC1ib3JkZXI7XG5cbiAgLy8gUm91bmQgdGhlIGZpcnN0IGFuZCBsYXN0IGl0ZW1zXG4gICY6Zmlyc3QtY2hpbGQge1xuICAgIC5ib3JkZXItdG9wLXJhZGl1cyhAbGlzdC1ncm91cC1ib3JkZXItcmFkaXVzKTtcbiAgfVxuICAmOmxhc3QtY2hpbGQge1xuICAgIG1hcmdpbi1ib3R0b206IDA7XG4gICAgLmJvcmRlci1ib3R0b20tcmFkaXVzKEBsaXN0LWdyb3VwLWJvcmRlci1yYWRpdXMpO1xuICB9XG5cbiAgLy8gQWxpZ24gYmFkZ2VzIHdpdGhpbiBsaXN0IGl0ZW1zXG4gID4gLmJhZGdlIHtcbiAgICBmbG9hdDogcmlnaHQ7XG4gIH1cbiAgPiAuYmFkZ2UgKyAuYmFkZ2Uge1xuICAgIG1hcmdpbi1yaWdodDogNXB4O1xuICB9XG59XG5cblxuLy8gTGlua2VkIGxpc3QgaXRlbXNcbi8vXG4vLyBVc2UgYW5jaG9yIGVsZW1lbnRzIGluc3RlYWQgb2YgYGxpYHMgb3IgYGRpdmBzIHRvIGNyZWF0ZSBsaW5rZWQgbGlzdCBpdGVtcy5cbi8vIEluY2x1ZGVzIGFuIGV4dHJhIGAuYWN0aXZlYCBtb2RpZmllciBjbGFzcyBmb3Igc2hvd2luZyBzZWxlY3RlZCBpdGVtcy5cblxuYS5saXN0LWdyb3VwLWl0ZW0ge1xuICBjb2xvcjogQGxpc3QtZ3JvdXAtbGluay1jb2xvcjtcblxuICAubGlzdC1ncm91cC1pdGVtLWhlYWRpbmcge1xuICAgIGNvbG9yOiBAbGlzdC1ncm91cC1saW5rLWhlYWRpbmctY29sb3I7XG4gIH1cblxuICAvLyBIb3ZlciBzdGF0ZVxuICAmOmhvdmVyLFxuICAmOmZvY3VzIHtcbiAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7XG4gICAgY29sb3I6IEBsaXN0LWdyb3VwLWxpbmstaG92ZXItY29sb3I7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogQGxpc3QtZ3JvdXAtaG92ZXItYmc7XG4gIH1cbn1cblxuLmxpc3QtZ3JvdXAtaXRlbSB7XG4gIC8vIERpc2FibGVkIHN0YXRlXG4gICYuZGlzYWJsZWQsXG4gICYuZGlzYWJsZWQ6aG92ZXIsXG4gICYuZGlzYWJsZWQ6Zm9jdXMge1xuICAgIGJhY2tncm91bmQtY29sb3I6IEBsaXN0LWdyb3VwLWRpc2FibGVkLWJnO1xuICAgIGNvbG9yOiBAbGlzdC1ncm91cC1kaXNhYmxlZC1jb2xvcjtcbiAgICBjdXJzb3I6IEBjdXJzb3ItZGlzYWJsZWQ7XG5cbiAgICAvLyBGb3JjZSBjb2xvciB0byBpbmhlcml0IGZvciBjdXN0b20gY29udGVudFxuICAgIC5saXN0LWdyb3VwLWl0ZW0taGVhZGluZyB7XG4gICAgICBjb2xvcjogaW5oZXJpdDtcbiAgICB9XG4gICAgLmxpc3QtZ3JvdXAtaXRlbS10ZXh0IHtcbiAgICAgIGNvbG9yOiBAbGlzdC1ncm91cC1kaXNhYmxlZC10ZXh0LWNvbG9yO1xuICAgIH1cbiAgfVxuXG4gIC8vIEFjdGl2ZSBjbGFzcyBvbiBpdGVtIGl0c2VsZiwgbm90IHBhcmVudFxuICAmLmFjdGl2ZSxcbiAgJi5hY3RpdmU6aG92ZXIsXG4gICYuYWN0aXZlOmZvY3VzIHtcbiAgICB6LWluZGV4OiAyOyAvLyBQbGFjZSBhY3RpdmUgaXRlbXMgYWJvdmUgdGhlaXIgc2libGluZ3MgZm9yIHByb3BlciBib3JkZXIgc3R5bGluZ1xuICAgIGNvbG9yOiBAbGlzdC1ncm91cC1hY3RpdmUtY29sb3I7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogQGxpc3QtZ3JvdXAtYWN0aXZlLWJnO1xuICAgIGJvcmRlci1jb2xvcjogQGxpc3QtZ3JvdXAtYWN0aXZlLWJvcmRlcjtcblxuICAgIC8vIEZvcmNlIGNvbG9yIHRvIGluaGVyaXQgZm9yIGN1c3RvbSBjb250ZW50XG4gICAgLmxpc3QtZ3JvdXAtaXRlbS1oZWFkaW5nLFxuICAgIC5saXN0LWdyb3VwLWl0ZW0taGVhZGluZyA+IHNtYWxsLFxuICAgIC5saXN0LWdyb3VwLWl0ZW0taGVhZGluZyA+IC5zbWFsbCB7XG4gICAgICBjb2xvcjogaW5oZXJpdDtcbiAgICB9XG4gICAgLmxpc3QtZ3JvdXAtaXRlbS10ZXh0IHtcbiAgICAgIGNvbG9yOiBAbGlzdC1ncm91cC1hY3RpdmUtdGV4dC1jb2xvcjtcbiAgICB9XG4gIH1cbn1cblxuXG4vLyBDb250ZXh0dWFsIHZhcmlhbnRzXG4vL1xuLy8gQWRkIG1vZGlmaWVyIGNsYXNzZXMgdG8gY2hhbmdlIHRleHQgYW5kIGJhY2tncm91bmQgY29sb3Igb24gaW5kaXZpZHVhbCBpdGVtcy5cbi8vIE9yZ2FuaXphdGlvbmFsbHksIHRoaXMgbXVzdCBjb21lIGFmdGVyIHRoZSBgOmhvdmVyYCBzdGF0ZXMuXG5cbi5saXN0LWdyb3VwLWl0ZW0tdmFyaWFudChzdWNjZXNzOyBAc3RhdGUtc3VjY2Vzcy1iZzsgQHN0YXRlLXN1Y2Nlc3MtdGV4dCk7XG4ubGlzdC1ncm91cC1pdGVtLXZhcmlhbnQoaW5mbzsgQHN0YXRlLWluZm8tYmc7IEBzdGF0ZS1pbmZvLXRleHQpO1xuLmxpc3QtZ3JvdXAtaXRlbS12YXJpYW50KHdhcm5pbmc7IEBzdGF0ZS13YXJuaW5nLWJnOyBAc3RhdGUtd2FybmluZy10ZXh0KTtcbi5saXN0LWdyb3VwLWl0ZW0tdmFyaWFudChkYW5nZXI7IEBzdGF0ZS1kYW5nZXItYmc7IEBzdGF0ZS1kYW5nZXItdGV4dCk7XG5cblxuLy8gQ3VzdG9tIGNvbnRlbnQgb3B0aW9uc1xuLy9cbi8vIEV4dHJhIGNsYXNzZXMgZm9yIGNyZWF0aW5nIHdlbGwtZm9ybWF0dGVkIGNvbnRlbnQgd2l0aGluIGAubGlzdC1ncm91cC1pdGVtYHMuXG5cbi5saXN0LWdyb3VwLWl0ZW0taGVhZGluZyB7XG4gIG1hcmdpbi10b3A6IDA7XG4gIG1hcmdpbi1ib3R0b206IDVweDtcbn1cbi5saXN0LWdyb3VwLWl0ZW0tdGV4dCB7XG4gIG1hcmdpbi1ib3R0b206IDA7XG4gIGxpbmUtaGVpZ2h0OiAxLjM7XG59XG4iLCIvLyBMaXN0IEdyb3Vwc1xuXG4ubGlzdC1ncm91cC1pdGVtLXZhcmlhbnQoQHN0YXRlOyBAYmFja2dyb3VuZDsgQGNvbG9yKSB7XG4gIC5saXN0LWdyb3VwLWl0ZW0tQHtzdGF0ZX0ge1xuICAgIGNvbG9yOiBAY29sb3I7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogQGJhY2tncm91bmQ7XG5cbiAgICBhJiB7XG4gICAgICBjb2xvcjogQGNvbG9yO1xuXG4gICAgICAubGlzdC1ncm91cC1pdGVtLWhlYWRpbmcge1xuICAgICAgICBjb2xvcjogaW5oZXJpdDtcbiAgICAgIH1cblxuICAgICAgJjpob3ZlcixcbiAgICAgICY6Zm9jdXMge1xuICAgICAgICBjb2xvcjogQGNvbG9yO1xuICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBkYXJrZW4oQGJhY2tncm91bmQsIDUlKTtcbiAgICAgIH1cbiAgICAgICYuYWN0aXZlLFxuICAgICAgJi5hY3RpdmU6aG92ZXIsXG4gICAgICAmLmFjdGl2ZTpmb2N1cyB7XG4gICAgICAgIGNvbG9yOiAjZmZmO1xuICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAY29sb3I7XG4gICAgICAgIGJvcmRlci1jb2xvcjogQGNvbG9yO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIiwiLy9cbi8vIFBhbmVsc1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuXG4vLyBCYXNlIGNsYXNzXG4ucGFuZWwge1xuICBtYXJnaW4tYm90dG9tOiBAbGluZS1oZWlnaHQtY29tcHV0ZWQ7XG4gIGJhY2tncm91bmQtY29sb3I6IEBwYW5lbC1iZztcbiAgYm9yZGVyOiAxcHggc29saWQgdHJhbnNwYXJlbnQ7XG4gIGJvcmRlci1yYWRpdXM6IEBwYW5lbC1ib3JkZXItcmFkaXVzO1xuICAuYm94LXNoYWRvdygwIDFweCAxcHggcmdiYSgwLDAsMCwuMDUpKTtcbn1cblxuLy8gUGFuZWwgY29udGVudHNcbi5wYW5lbC1ib2R5IHtcbiAgcGFkZGluZzogQHBhbmVsLWJvZHktcGFkZGluZztcbiAgJjpleHRlbmQoLmNsZWFyZml4IGFsbCk7XG59XG5cbi8vIE9wdGlvbmFsIGhlYWRpbmdcbi5wYW5lbC1oZWFkaW5nIHtcbiAgcGFkZGluZzogQHBhbmVsLWhlYWRpbmctcGFkZGluZztcbiAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHRyYW5zcGFyZW50O1xuICAuYm9yZGVyLXRvcC1yYWRpdXMoKEBwYW5lbC1ib3JkZXItcmFkaXVzIC0gMSkpO1xuXG4gID4gLmRyb3Bkb3duIC5kcm9wZG93bi10b2dnbGUge1xuICAgIGNvbG9yOiBpbmhlcml0O1xuICB9XG59XG5cbi8vIFdpdGhpbiBoZWFkaW5nLCBzdHJpcCBhbnkgYGgqYCB0YWcgb2YgaXRzIGRlZmF1bHQgbWFyZ2lucyBmb3Igc3BhY2luZy5cbi5wYW5lbC10aXRsZSB7XG4gIG1hcmdpbi10b3A6IDA7XG4gIG1hcmdpbi1ib3R0b206IDA7XG4gIGZvbnQtc2l6ZTogY2VpbCgoQGZvbnQtc2l6ZS1iYXNlICogMS4xMjUpKTtcbiAgY29sb3I6IGluaGVyaXQ7XG5cbiAgPiBhIHtcbiAgICBjb2xvcjogaW5oZXJpdDtcbiAgfVxufVxuXG4vLyBPcHRpb25hbCBmb290ZXIgKHN0YXlzIGdyYXkgaW4gZXZlcnkgbW9kaWZpZXIgY2xhc3MpXG4ucGFuZWwtZm9vdGVyIHtcbiAgcGFkZGluZzogQHBhbmVsLWZvb3Rlci1wYWRkaW5nO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiBAcGFuZWwtZm9vdGVyLWJnO1xuICBib3JkZXItdG9wOiAxcHggc29saWQgQHBhbmVsLWlubmVyLWJvcmRlcjtcbiAgLmJvcmRlci1ib3R0b20tcmFkaXVzKChAcGFuZWwtYm9yZGVyLXJhZGl1cyAtIDEpKTtcbn1cblxuXG4vLyBMaXN0IGdyb3VwcyBpbiBwYW5lbHNcbi8vXG4vLyBCeSBkZWZhdWx0LCBzcGFjZSBvdXQgbGlzdCBncm91cCBjb250ZW50IGZyb20gcGFuZWwgaGVhZGluZ3MgdG8gYWNjb3VudCBmb3Jcbi8vIGFueSBraW5kIG9mIGN1c3RvbSBjb250ZW50IGJldHdlZW4gdGhlIHR3by5cblxuLnBhbmVsIHtcbiAgPiAubGlzdC1ncm91cCxcbiAgPiAucGFuZWwtY29sbGFwc2UgPiAubGlzdC1ncm91cCB7XG4gICAgbWFyZ2luLWJvdHRvbTogMDtcblxuICAgIC5saXN0LWdyb3VwLWl0ZW0ge1xuICAgICAgYm9yZGVyLXdpZHRoOiAxcHggMDtcbiAgICAgIGJvcmRlci1yYWRpdXM6IDA7XG4gICAgfVxuXG4gICAgLy8gQWRkIGJvcmRlciB0b3AgcmFkaXVzIGZvciBmaXJzdCBvbmVcbiAgICAmOmZpcnN0LWNoaWxkIHtcbiAgICAgIC5saXN0LWdyb3VwLWl0ZW06Zmlyc3QtY2hpbGQge1xuICAgICAgICBib3JkZXItdG9wOiAwO1xuICAgICAgICAuYm9yZGVyLXRvcC1yYWRpdXMoKEBwYW5lbC1ib3JkZXItcmFkaXVzIC0gMSkpO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBBZGQgYm9yZGVyIGJvdHRvbSByYWRpdXMgZm9yIGxhc3Qgb25lXG4gICAgJjpsYXN0LWNoaWxkIHtcbiAgICAgIC5saXN0LWdyb3VwLWl0ZW06bGFzdC1jaGlsZCB7XG4gICAgICAgIGJvcmRlci1ib3R0b206IDA7XG4gICAgICAgIC5ib3JkZXItYm90dG9tLXJhZGl1cygoQHBhbmVsLWJvcmRlci1yYWRpdXMgLSAxKSk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4vLyBDb2xsYXBzZSBzcGFjZSBiZXR3ZWVuIHdoZW4gdGhlcmUncyBubyBhZGRpdGlvbmFsIGNvbnRlbnQuXG4ucGFuZWwtaGVhZGluZyArIC5saXN0LWdyb3VwIHtcbiAgLmxpc3QtZ3JvdXAtaXRlbTpmaXJzdC1jaGlsZCB7XG4gICAgYm9yZGVyLXRvcC13aWR0aDogMDtcbiAgfVxufVxuLmxpc3QtZ3JvdXAgKyAucGFuZWwtZm9vdGVyIHtcbiAgYm9yZGVyLXRvcC13aWR0aDogMDtcbn1cblxuLy8gVGFibGVzIGluIHBhbmVsc1xuLy9cbi8vIFBsYWNlIGEgbm9uLWJvcmRlcmVkIGAudGFibGVgIHdpdGhpbiBhIHBhbmVsIChub3Qgd2l0aGluIGEgYC5wYW5lbC1ib2R5YCkgYW5kXG4vLyB3YXRjaCBpdCBnbyBmdWxsIHdpZHRoLlxuXG4ucGFuZWwge1xuICA+IC50YWJsZSxcbiAgPiAudGFibGUtcmVzcG9uc2l2ZSA+IC50YWJsZSxcbiAgPiAucGFuZWwtY29sbGFwc2UgPiAudGFibGUge1xuICAgIG1hcmdpbi1ib3R0b206IDA7XG5cbiAgICBjYXB0aW9uIHtcbiAgICAgIHBhZGRpbmctbGVmdDogQHBhbmVsLWJvZHktcGFkZGluZztcbiAgICAgIHBhZGRpbmctcmlnaHQ6IEBwYW5lbC1ib2R5LXBhZGRpbmc7XG4gICAgfVxuICB9XG4gIC8vIEFkZCBib3JkZXIgdG9wIHJhZGl1cyBmb3IgZmlyc3Qgb25lXG4gID4gLnRhYmxlOmZpcnN0LWNoaWxkLFxuICA+IC50YWJsZS1yZXNwb25zaXZlOmZpcnN0LWNoaWxkID4gLnRhYmxlOmZpcnN0LWNoaWxkIHtcbiAgICAuYm9yZGVyLXRvcC1yYWRpdXMoKEBwYW5lbC1ib3JkZXItcmFkaXVzIC0gMSkpO1xuXG4gICAgPiB0aGVhZDpmaXJzdC1jaGlsZCxcbiAgICA+IHRib2R5OmZpcnN0LWNoaWxkIHtcbiAgICAgID4gdHI6Zmlyc3QtY2hpbGQge1xuICAgICAgICBib3JkZXItdG9wLWxlZnQtcmFkaXVzOiAoQHBhbmVsLWJvcmRlci1yYWRpdXMgLSAxKTtcbiAgICAgICAgYm9yZGVyLXRvcC1yaWdodC1yYWRpdXM6IChAcGFuZWwtYm9yZGVyLXJhZGl1cyAtIDEpO1xuXG4gICAgICAgIHRkOmZpcnN0LWNoaWxkLFxuICAgICAgICB0aDpmaXJzdC1jaGlsZCB7XG4gICAgICAgICAgYm9yZGVyLXRvcC1sZWZ0LXJhZGl1czogKEBwYW5lbC1ib3JkZXItcmFkaXVzIC0gMSk7XG4gICAgICAgIH1cbiAgICAgICAgdGQ6bGFzdC1jaGlsZCxcbiAgICAgICAgdGg6bGFzdC1jaGlsZCB7XG4gICAgICAgICAgYm9yZGVyLXRvcC1yaWdodC1yYWRpdXM6IChAcGFuZWwtYm9yZGVyLXJhZGl1cyAtIDEpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG4gIC8vIEFkZCBib3JkZXIgYm90dG9tIHJhZGl1cyBmb3IgbGFzdCBvbmVcbiAgPiAudGFibGU6bGFzdC1jaGlsZCxcbiAgPiAudGFibGUtcmVzcG9uc2l2ZTpsYXN0LWNoaWxkID4gLnRhYmxlOmxhc3QtY2hpbGQge1xuICAgIC5ib3JkZXItYm90dG9tLXJhZGl1cygoQHBhbmVsLWJvcmRlci1yYWRpdXMgLSAxKSk7XG5cbiAgICA+IHRib2R5Omxhc3QtY2hpbGQsXG4gICAgPiB0Zm9vdDpsYXN0LWNoaWxkIHtcbiAgICAgID4gdHI6bGFzdC1jaGlsZCB7XG4gICAgICAgIGJvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6IChAcGFuZWwtYm9yZGVyLXJhZGl1cyAtIDEpO1xuICAgICAgICBib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czogKEBwYW5lbC1ib3JkZXItcmFkaXVzIC0gMSk7XG5cbiAgICAgICAgdGQ6Zmlyc3QtY2hpbGQsXG4gICAgICAgIHRoOmZpcnN0LWNoaWxkIHtcbiAgICAgICAgICBib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOiAoQHBhbmVsLWJvcmRlci1yYWRpdXMgLSAxKTtcbiAgICAgICAgfVxuICAgICAgICB0ZDpsYXN0LWNoaWxkLFxuICAgICAgICB0aDpsYXN0LWNoaWxkIHtcbiAgICAgICAgICBib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czogKEBwYW5lbC1ib3JkZXItcmFkaXVzIC0gMSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgPiAucGFuZWwtYm9keSArIC50YWJsZSxcbiAgPiAucGFuZWwtYm9keSArIC50YWJsZS1yZXNwb25zaXZlLFxuICA+IC50YWJsZSArIC5wYW5lbC1ib2R5LFxuICA+IC50YWJsZS1yZXNwb25zaXZlICsgLnBhbmVsLWJvZHkge1xuICAgIGJvcmRlci10b3A6IDFweCBzb2xpZCBAdGFibGUtYm9yZGVyLWNvbG9yO1xuICB9XG4gID4gLnRhYmxlID4gdGJvZHk6Zmlyc3QtY2hpbGQgPiB0cjpmaXJzdC1jaGlsZCB0aCxcbiAgPiAudGFibGUgPiB0Ym9keTpmaXJzdC1jaGlsZCA+IHRyOmZpcnN0LWNoaWxkIHRkIHtcbiAgICBib3JkZXItdG9wOiAwO1xuICB9XG4gID4gLnRhYmxlLWJvcmRlcmVkLFxuICA+IC50YWJsZS1yZXNwb25zaXZlID4gLnRhYmxlLWJvcmRlcmVkIHtcbiAgICBib3JkZXI6IDA7XG4gICAgPiB0aGVhZCxcbiAgICA+IHRib2R5LFxuICAgID4gdGZvb3Qge1xuICAgICAgPiB0ciB7XG4gICAgICAgID4gdGg6Zmlyc3QtY2hpbGQsXG4gICAgICAgID4gdGQ6Zmlyc3QtY2hpbGQge1xuICAgICAgICAgIGJvcmRlci1sZWZ0OiAwO1xuICAgICAgICB9XG4gICAgICAgID4gdGg6bGFzdC1jaGlsZCxcbiAgICAgICAgPiB0ZDpsYXN0LWNoaWxkIHtcbiAgICAgICAgICBib3JkZXItcmlnaHQ6IDA7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgPiB0aGVhZCxcbiAgICA+IHRib2R5IHtcbiAgICAgID4gdHI6Zmlyc3QtY2hpbGQge1xuICAgICAgICA+IHRkLFxuICAgICAgICA+IHRoIHtcbiAgICAgICAgICBib3JkZXItYm90dG9tOiAwO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgID4gdGJvZHksXG4gICAgPiB0Zm9vdCB7XG4gICAgICA+IHRyOmxhc3QtY2hpbGQge1xuICAgICAgICA+IHRkLFxuICAgICAgICA+IHRoIHtcbiAgICAgICAgICBib3JkZXItYm90dG9tOiAwO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG4gID4gLnRhYmxlLXJlc3BvbnNpdmUge1xuICAgIGJvcmRlcjogMDtcbiAgICBtYXJnaW4tYm90dG9tOiAwO1xuICB9XG59XG5cblxuLy8gQ29sbGFwc2FibGUgcGFuZWxzIChha2EsIGFjY29yZGlvbilcbi8vXG4vLyBXcmFwIGEgc2VyaWVzIG9mIHBhbmVscyBpbiBgLnBhbmVsLWdyb3VwYCB0byB0dXJuIHRoZW0gaW50byBhbiBhY2NvcmRpb24gd2l0aFxuLy8gdGhlIGhlbHAgb2Ygb3VyIGNvbGxhcHNlIEphdmFTY3JpcHQgcGx1Z2luLlxuXG4ucGFuZWwtZ3JvdXAge1xuICBtYXJnaW4tYm90dG9tOiBAbGluZS1oZWlnaHQtY29tcHV0ZWQ7XG5cbiAgLy8gVGlnaHRlbiB1cCBtYXJnaW4gc28gaXQncyBvbmx5IGJldHdlZW4gcGFuZWxzXG4gIC5wYW5lbCB7XG4gICAgbWFyZ2luLWJvdHRvbTogMDtcbiAgICBib3JkZXItcmFkaXVzOiBAcGFuZWwtYm9yZGVyLXJhZGl1cztcblxuICAgICsgLnBhbmVsIHtcbiAgICAgIG1hcmdpbi10b3A6IDVweDtcbiAgICB9XG4gIH1cblxuICAucGFuZWwtaGVhZGluZyB7XG4gICAgYm9yZGVyLWJvdHRvbTogMDtcblxuICAgICsgLnBhbmVsLWNvbGxhcHNlID4gLnBhbmVsLWJvZHksXG4gICAgKyAucGFuZWwtY29sbGFwc2UgPiAubGlzdC1ncm91cCB7XG4gICAgICBib3JkZXItdG9wOiAxcHggc29saWQgQHBhbmVsLWlubmVyLWJvcmRlcjtcbiAgICB9XG4gIH1cblxuICAucGFuZWwtZm9vdGVyIHtcbiAgICBib3JkZXItdG9wOiAwO1xuICAgICsgLnBhbmVsLWNvbGxhcHNlIC5wYW5lbC1ib2R5IHtcbiAgICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCBAcGFuZWwtaW5uZXItYm9yZGVyO1xuICAgIH1cbiAgfVxufVxuXG5cbi8vIENvbnRleHR1YWwgdmFyaWF0aW9uc1xuLnBhbmVsLWRlZmF1bHQge1xuICAucGFuZWwtdmFyaWFudChAcGFuZWwtZGVmYXVsdC1ib3JkZXI7IEBwYW5lbC1kZWZhdWx0LXRleHQ7IEBwYW5lbC1kZWZhdWx0LWhlYWRpbmctYmc7IEBwYW5lbC1kZWZhdWx0LWJvcmRlcik7XG59XG4ucGFuZWwtcHJpbWFyeSB7XG4gIC5wYW5lbC12YXJpYW50KEBwYW5lbC1wcmltYXJ5LWJvcmRlcjsgQHBhbmVsLXByaW1hcnktdGV4dDsgQHBhbmVsLXByaW1hcnktaGVhZGluZy1iZzsgQHBhbmVsLXByaW1hcnktYm9yZGVyKTtcbn1cbi5wYW5lbC1zdWNjZXNzIHtcbiAgLnBhbmVsLXZhcmlhbnQoQHBhbmVsLXN1Y2Nlc3MtYm9yZGVyOyBAcGFuZWwtc3VjY2Vzcy10ZXh0OyBAcGFuZWwtc3VjY2Vzcy1oZWFkaW5nLWJnOyBAcGFuZWwtc3VjY2Vzcy1ib3JkZXIpO1xufVxuLnBhbmVsLWluZm8ge1xuICAucGFuZWwtdmFyaWFudChAcGFuZWwtaW5mby1ib3JkZXI7IEBwYW5lbC1pbmZvLXRleHQ7IEBwYW5lbC1pbmZvLWhlYWRpbmctYmc7IEBwYW5lbC1pbmZvLWJvcmRlcik7XG59XG4ucGFuZWwtd2FybmluZyB7XG4gIC5wYW5lbC12YXJpYW50KEBwYW5lbC13YXJuaW5nLWJvcmRlcjsgQHBhbmVsLXdhcm5pbmctdGV4dDsgQHBhbmVsLXdhcm5pbmctaGVhZGluZy1iZzsgQHBhbmVsLXdhcm5pbmctYm9yZGVyKTtcbn1cbi5wYW5lbC1kYW5nZXIge1xuICAucGFuZWwtdmFyaWFudChAcGFuZWwtZGFuZ2VyLWJvcmRlcjsgQHBhbmVsLWRhbmdlci10ZXh0OyBAcGFuZWwtZGFuZ2VyLWhlYWRpbmctYmc7IEBwYW5lbC1kYW5nZXItYm9yZGVyKTtcbn1cbiIsIi8vIFBhbmVsc1xuXG4ucGFuZWwtdmFyaWFudChAYm9yZGVyOyBAaGVhZGluZy10ZXh0LWNvbG9yOyBAaGVhZGluZy1iZy1jb2xvcjsgQGhlYWRpbmctYm9yZGVyKSB7XG4gIGJvcmRlci1jb2xvcjogQGJvcmRlcjtcblxuICAmID4gLnBhbmVsLWhlYWRpbmcge1xuICAgIGNvbG9yOiBAaGVhZGluZy10ZXh0LWNvbG9yO1xuICAgIGJhY2tncm91bmQtY29sb3I6IEBoZWFkaW5nLWJnLWNvbG9yO1xuICAgIGJvcmRlci1jb2xvcjogQGhlYWRpbmctYm9yZGVyO1xuXG4gICAgKyAucGFuZWwtY29sbGFwc2UgPiAucGFuZWwtYm9keSB7XG4gICAgICBib3JkZXItdG9wLWNvbG9yOiBAYm9yZGVyO1xuICAgIH1cbiAgICAuYmFkZ2Uge1xuICAgICAgY29sb3I6IEBoZWFkaW5nLWJnLWNvbG9yO1xuICAgICAgYmFja2dyb3VuZC1jb2xvcjogQGhlYWRpbmctdGV4dC1jb2xvcjtcbiAgICB9XG4gIH1cbiAgJiA+IC5wYW5lbC1mb290ZXIge1xuICAgICsgLnBhbmVsLWNvbGxhcHNlID4gLnBhbmVsLWJvZHkge1xuICAgICAgYm9yZGVyLWJvdHRvbS1jb2xvcjogQGJvcmRlcjtcbiAgICB9XG4gIH1cbn1cbiIsIi8vIEVtYmVkcyByZXNwb25zaXZlXG4vL1xuLy8gQ3JlZGl0OiBOaWNvbGFzIEdhbGxhZ2hlciBhbmQgU1VJVCBDU1MuXG5cbi5lbWJlZC1yZXNwb25zaXZlIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICBkaXNwbGF5OiBibG9jaztcbiAgaGVpZ2h0OiAwO1xuICBwYWRkaW5nOiAwO1xuICBvdmVyZmxvdzogaGlkZGVuO1xuXG4gIC5lbWJlZC1yZXNwb25zaXZlLWl0ZW0sXG4gIGlmcmFtZSxcbiAgZW1iZWQsXG4gIG9iamVjdCxcbiAgdmlkZW8ge1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICB0b3A6IDA7XG4gICAgbGVmdDogMDtcbiAgICBib3R0b206IDA7XG4gICAgaGVpZ2h0OiAxMDAlO1xuICAgIHdpZHRoOiAxMDAlO1xuICAgIGJvcmRlcjogMDtcbiAgfVxuXG4gIC8vIE1vZGlmaWVyIGNsYXNzIGZvciAxNjo5IGFzcGVjdCByYXRpb1xuICAmLmVtYmVkLXJlc3BvbnNpdmUtMTZieTkge1xuICAgIHBhZGRpbmctYm90dG9tOiA1Ni4yNSU7XG4gIH1cblxuICAvLyBNb2RpZmllciBjbGFzcyBmb3IgNDozIGFzcGVjdCByYXRpb1xuICAmLmVtYmVkLXJlc3BvbnNpdmUtNGJ5MyB7XG4gICAgcGFkZGluZy1ib3R0b206IDc1JTtcbiAgfVxufVxuIiwiLy9cbi8vIFdlbGxzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5cbi8vIEJhc2UgY2xhc3Ncbi53ZWxsIHtcbiAgbWluLWhlaWdodDogMjBweDtcbiAgcGFkZGluZzogMTlweDtcbiAgbWFyZ2luLWJvdHRvbTogMjBweDtcbiAgYmFja2dyb3VuZC1jb2xvcjogQHdlbGwtYmc7XG4gIGJvcmRlcjogMXB4IHNvbGlkIEB3ZWxsLWJvcmRlcjtcbiAgYm9yZGVyLXJhZGl1czogQGJvcmRlci1yYWRpdXMtYmFzZTtcbiAgLmJveC1zaGFkb3coaW5zZXQgMCAxcHggMXB4IHJnYmEoMCwwLDAsLjA1KSk7XG4gIGJsb2NrcXVvdGUge1xuICAgIGJvcmRlci1jb2xvcjogI2RkZDtcbiAgICBib3JkZXItY29sb3I6IHJnYmEoMCwwLDAsLjE1KTtcbiAgfVxufVxuXG4vLyBTaXplc1xuLndlbGwtbGcge1xuICBwYWRkaW5nOiAyNHB4O1xuICBib3JkZXItcmFkaXVzOiBAYm9yZGVyLXJhZGl1cy1sYXJnZTtcbn1cbi53ZWxsLXNtIHtcbiAgcGFkZGluZzogOXB4O1xuICBib3JkZXItcmFkaXVzOiBAYm9yZGVyLXJhZGl1cy1zbWFsbDtcbn1cbiIsIi8vXG4vLyBDbG9zZSBpY29uc1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuXG4uY2xvc2Uge1xuICBmbG9hdDogcmlnaHQ7XG4gIGZvbnQtc2l6ZTogKEBmb250LXNpemUtYmFzZSAqIDEuNSk7XG4gIGZvbnQtd2VpZ2h0OiBAY2xvc2UtZm9udC13ZWlnaHQ7XG4gIGxpbmUtaGVpZ2h0OiAxO1xuICBjb2xvcjogQGNsb3NlLWNvbG9yO1xuICB0ZXh0LXNoYWRvdzogQGNsb3NlLXRleHQtc2hhZG93O1xuICAub3BhY2l0eSguMik7XG5cbiAgJjpob3ZlcixcbiAgJjpmb2N1cyB7XG4gICAgY29sb3I6IEBjbG9zZS1jb2xvcjtcbiAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7XG4gICAgY3Vyc29yOiBwb2ludGVyO1xuICAgIC5vcGFjaXR5KC41KTtcbiAgfVxuXG4gIC8vIEFkZGl0aW9uYWwgcHJvcGVydGllcyBmb3IgYnV0dG9uIHZlcnNpb25cbiAgLy8gaU9TIHJlcXVpcmVzIHRoZSBidXR0b24gZWxlbWVudCBpbnN0ZWFkIG9mIGFuIGFuY2hvciB0YWcuXG4gIC8vIElmIHlvdSB3YW50IHRoZSBhbmNob3IgdmVyc2lvbiwgaXQgcmVxdWlyZXMgYGhyZWY9XCIjXCJgLlxuICBidXR0b24mIHtcbiAgICBwYWRkaW5nOiAwO1xuICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDtcbiAgICBib3JkZXI6IDA7XG4gICAgLXdlYmtpdC1hcHBlYXJhbmNlOiBub25lO1xuICB9XG59XG4iLCIvL1xuLy8gTW9kYWxzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vLyAubW9kYWwtb3BlbiAgICAgIC0gYm9keSBjbGFzcyBmb3Iga2lsbGluZyB0aGUgc2Nyb2xsXG4vLyAubW9kYWwgICAgICAgICAgIC0gY29udGFpbmVyIHRvIHNjcm9sbCB3aXRoaW5cbi8vIC5tb2RhbC1kaWFsb2cgICAgLSBwb3NpdGlvbmluZyBzaGVsbCBmb3IgdGhlIGFjdHVhbCBtb2RhbFxuLy8gLm1vZGFsLWNvbnRlbnQgICAtIGFjdHVhbCBtb2RhbCB3LyBiZyBhbmQgY29ybmVycyBhbmQgc2hpdFxuXG4vLyBLaWxsIHRoZSBzY3JvbGwgb24gdGhlIGJvZHlcbi5tb2RhbC1vcGVuIHtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cblxuLy8gQ29udGFpbmVyIHRoYXQgdGhlIG1vZGFsIHNjcm9sbHMgd2l0aGluXG4ubW9kYWwge1xuICBkaXNwbGF5OiBub25lO1xuICBvdmVyZmxvdzogaGlkZGVuO1xuICBwb3NpdGlvbjogZml4ZWQ7XG4gIHRvcDogMDtcbiAgcmlnaHQ6IDA7XG4gIGJvdHRvbTogMDtcbiAgbGVmdDogMDtcbiAgei1pbmRleDogQHppbmRleC1tb2RhbDtcbiAgLXdlYmtpdC1vdmVyZmxvdy1zY3JvbGxpbmc6IHRvdWNoO1xuXG4gIC8vIFByZXZlbnQgQ2hyb21lIG9uIFdpbmRvd3MgZnJvbSBhZGRpbmcgYSBmb2N1cyBvdXRsaW5lLiBGb3IgZGV0YWlscywgc2VlXG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9wdWxsLzEwOTUxLlxuICBvdXRsaW5lOiAwO1xuXG4gIC8vIFdoZW4gZmFkaW5nIGluIHRoZSBtb2RhbCwgYW5pbWF0ZSBpdCB0byBzbGlkZSBkb3duXG4gICYuZmFkZSAubW9kYWwtZGlhbG9nIHtcbiAgICAudHJhbnNsYXRlKDAsIC0yNSUpO1xuICAgIC50cmFuc2l0aW9uLXRyYW5zZm9ybSh+XCIwLjNzIGVhc2Utb3V0XCIpO1xuICB9XG4gICYuaW4gLm1vZGFsLWRpYWxvZyB7IC50cmFuc2xhdGUoMCwgMCkgfVxufVxuLm1vZGFsLW9wZW4gLm1vZGFsIHtcbiAgb3ZlcmZsb3cteDogaGlkZGVuO1xuICBvdmVyZmxvdy15OiBhdXRvO1xufVxuXG4vLyBTaGVsbCBkaXYgdG8gcG9zaXRpb24gdGhlIG1vZGFsIHdpdGggYm90dG9tIHBhZGRpbmdcbi5tb2RhbC1kaWFsb2cge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIHdpZHRoOiBhdXRvO1xuICBtYXJnaW46IDEwcHg7XG59XG5cbi8vIEFjdHVhbCBtb2RhbFxuLm1vZGFsLWNvbnRlbnQge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIGJhY2tncm91bmQtY29sb3I6IEBtb2RhbC1jb250ZW50LWJnO1xuICBib3JkZXI6IDFweCBzb2xpZCBAbW9kYWwtY29udGVudC1mYWxsYmFjay1ib3JkZXItY29sb3I7IC8vb2xkIGJyb3dzZXJzIGZhbGxiYWNrIChpZTggZXRjKVxuICBib3JkZXI6IDFweCBzb2xpZCBAbW9kYWwtY29udGVudC1ib3JkZXItY29sb3I7XG4gIGJvcmRlci1yYWRpdXM6IEBib3JkZXItcmFkaXVzLWxhcmdlO1xuICAuYm94LXNoYWRvdygwIDNweCA5cHggcmdiYSgwLDAsMCwuNSkpO1xuICBiYWNrZ3JvdW5kLWNsaXA6IHBhZGRpbmctYm94O1xuICAvLyBSZW1vdmUgZm9jdXMgb3V0bGluZSBmcm9tIG9wZW5lZCBtb2RhbFxuICBvdXRsaW5lOiAwO1xufVxuXG4vLyBNb2RhbCBiYWNrZ3JvdW5kXG4ubW9kYWwtYmFja2Ryb3Age1xuICBwb3NpdGlvbjogZml4ZWQ7XG4gIHRvcDogMDtcbiAgcmlnaHQ6IDA7XG4gIGJvdHRvbTogMDtcbiAgbGVmdDogMDtcbiAgYmFja2dyb3VuZC1jb2xvcjogQG1vZGFsLWJhY2tkcm9wLWJnO1xuICAvLyBGYWRlIGZvciBiYWNrZHJvcFxuICAmLmZhZGUgeyAub3BhY2l0eSgwKTsgfVxuICAmLmluIHsgLm9wYWNpdHkoQG1vZGFsLWJhY2tkcm9wLW9wYWNpdHkpOyB9XG59XG5cbi8vIE1vZGFsIGhlYWRlclxuLy8gVG9wIHNlY3Rpb24gb2YgdGhlIG1vZGFsIHcvIHRpdGxlIGFuZCBkaXNtaXNzXG4ubW9kYWwtaGVhZGVyIHtcbiAgcGFkZGluZzogQG1vZGFsLXRpdGxlLXBhZGRpbmc7XG4gIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCBAbW9kYWwtaGVhZGVyLWJvcmRlci1jb2xvcjtcbiAgbWluLWhlaWdodDogKEBtb2RhbC10aXRsZS1wYWRkaW5nICsgQG1vZGFsLXRpdGxlLWxpbmUtaGVpZ2h0KTtcbn1cbi8vIENsb3NlIGljb25cbi5tb2RhbC1oZWFkZXIgLmNsb3NlIHtcbiAgbWFyZ2luLXRvcDogLTJweDtcbn1cblxuLy8gVGl0bGUgdGV4dCB3aXRoaW4gaGVhZGVyXG4ubW9kYWwtdGl0bGUge1xuICBtYXJnaW46IDA7XG4gIGxpbmUtaGVpZ2h0OiBAbW9kYWwtdGl0bGUtbGluZS1oZWlnaHQ7XG59XG5cbi8vIE1vZGFsIGJvZHlcbi8vIFdoZXJlIGFsbCBtb2RhbCBjb250ZW50IHJlc2lkZXMgKHNpYmxpbmcgb2YgLm1vZGFsLWhlYWRlciBhbmQgLm1vZGFsLWZvb3Rlcilcbi5tb2RhbC1ib2R5IHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICBwYWRkaW5nOiBAbW9kYWwtaW5uZXItcGFkZGluZztcbn1cblxuLy8gRm9vdGVyIChmb3IgYWN0aW9ucylcbi5tb2RhbC1mb290ZXIge1xuICBwYWRkaW5nOiBAbW9kYWwtaW5uZXItcGFkZGluZztcbiAgdGV4dC1hbGlnbjogcmlnaHQ7IC8vIHJpZ2h0IGFsaWduIGJ1dHRvbnNcbiAgYm9yZGVyLXRvcDogMXB4IHNvbGlkIEBtb2RhbC1mb290ZXItYm9yZGVyLWNvbG9yO1xuICAmOmV4dGVuZCguY2xlYXJmaXggYWxsKTsgLy8gY2xlYXIgaXQgaW4gY2FzZSBmb2xrcyB1c2UgLnB1bGwtKiBjbGFzc2VzIG9uIGJ1dHRvbnNcblxuICAvLyBQcm9wZXJseSBzcGFjZSBvdXQgYnV0dG9uc1xuICAuYnRuICsgLmJ0biB7XG4gICAgbWFyZ2luLWxlZnQ6IDVweDtcbiAgICBtYXJnaW4tYm90dG9tOiAwOyAvLyBhY2NvdW50IGZvciBpbnB1dFt0eXBlPVwic3VibWl0XCJdIHdoaWNoIGdldHMgdGhlIGJvdHRvbSBtYXJnaW4gbGlrZSBhbGwgb3RoZXIgaW5wdXRzXG4gIH1cbiAgLy8gYnV0IG92ZXJyaWRlIHRoYXQgZm9yIGJ1dHRvbiBncm91cHNcbiAgLmJ0bi1ncm91cCAuYnRuICsgLmJ0biB7XG4gICAgbWFyZ2luLWxlZnQ6IC0xcHg7XG4gIH1cbiAgLy8gYW5kIG92ZXJyaWRlIGl0IGZvciBibG9jayBidXR0b25zIGFzIHdlbGxcbiAgLmJ0bi1ibG9jayArIC5idG4tYmxvY2sge1xuICAgIG1hcmdpbi1sZWZ0OiAwO1xuICB9XG59XG5cbi8vIE1lYXN1cmUgc2Nyb2xsYmFyIHdpZHRoIGZvciBwYWRkaW5nIGJvZHkgZHVyaW5nIG1vZGFsIHNob3cvaGlkZVxuLm1vZGFsLXNjcm9sbGJhci1tZWFzdXJlIHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB0b3A6IC05OTk5cHg7XG4gIHdpZHRoOiA1MHB4O1xuICBoZWlnaHQ6IDUwcHg7XG4gIG92ZXJmbG93OiBzY3JvbGw7XG59XG5cbi8vIFNjYWxlIHVwIHRoZSBtb2RhbFxuQG1lZGlhIChtaW4td2lkdGg6IEBzY3JlZW4tc20tbWluKSB7XG4gIC8vIEF1dG9tYXRpY2FsbHkgc2V0IG1vZGFsJ3Mgd2lkdGggZm9yIGxhcmdlciB2aWV3cG9ydHNcbiAgLm1vZGFsLWRpYWxvZyB7XG4gICAgd2lkdGg6IEBtb2RhbC1tZDtcbiAgICBtYXJnaW46IDMwcHggYXV0bztcbiAgfVxuICAubW9kYWwtY29udGVudCB7XG4gICAgLmJveC1zaGFkb3coMCA1cHggMTVweCByZ2JhKDAsMCwwLC41KSk7XG4gIH1cblxuICAvLyBNb2RhbCBzaXplc1xuICAubW9kYWwtc20geyB3aWR0aDogQG1vZGFsLXNtOyB9XG59XG5cbkBtZWRpYSAobWluLXdpZHRoOiBAc2NyZWVuLW1kLW1pbikge1xuICAubW9kYWwtbGcgeyB3aWR0aDogQG1vZGFsLWxnOyB9XG59XG4iLCIvL1xuLy8gVG9vbHRpcHNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cblxuLy8gQmFzZSBjbGFzc1xuLnRvb2x0aXAge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHotaW5kZXg6IEB6aW5kZXgtdG9vbHRpcDtcbiAgZGlzcGxheTogYmxvY2s7XG4gIHZpc2liaWxpdHk6IHZpc2libGU7XG4gIGZvbnQtc2l6ZTogQGZvbnQtc2l6ZS1zbWFsbDtcbiAgbGluZS1oZWlnaHQ6IDEuNDtcbiAgLm9wYWNpdHkoMCk7XG5cbiAgJi5pbiAgICAgeyAub3BhY2l0eShAdG9vbHRpcC1vcGFjaXR5KTsgfVxuICAmLnRvcCAgICB7IG1hcmdpbi10b3A6ICAtM3B4OyBwYWRkaW5nOiBAdG9vbHRpcC1hcnJvdy13aWR0aCAwOyB9XG4gICYucmlnaHQgIHsgbWFyZ2luLWxlZnQ6ICAzcHg7IHBhZGRpbmc6IDAgQHRvb2x0aXAtYXJyb3ctd2lkdGg7IH1cbiAgJi5ib3R0b20geyBtYXJnaW4tdG9wOiAgIDNweDsgcGFkZGluZzogQHRvb2x0aXAtYXJyb3ctd2lkdGggMDsgfVxuICAmLmxlZnQgICB7IG1hcmdpbi1sZWZ0OiAtM3B4OyBwYWRkaW5nOiAwIEB0b29sdGlwLWFycm93LXdpZHRoOyB9XG59XG5cbi8vIFdyYXBwZXIgZm9yIHRoZSB0b29sdGlwIGNvbnRlbnRcbi50b29sdGlwLWlubmVyIHtcbiAgbWF4LXdpZHRoOiBAdG9vbHRpcC1tYXgtd2lkdGg7XG4gIHBhZGRpbmc6IDNweCA4cHg7XG4gIGNvbG9yOiBAdG9vbHRpcC1jb2xvcjtcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xuICB0ZXh0LWRlY29yYXRpb246IG5vbmU7XG4gIGJhY2tncm91bmQtY29sb3I6IEB0b29sdGlwLWJnO1xuICBib3JkZXItcmFkaXVzOiBAYm9yZGVyLXJhZGl1cy1iYXNlO1xufVxuXG4vLyBBcnJvd3Ncbi50b29sdGlwLWFycm93IHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB3aWR0aDogMDtcbiAgaGVpZ2h0OiAwO1xuICBib3JkZXItY29sb3I6IHRyYW5zcGFyZW50O1xuICBib3JkZXItc3R5bGU6IHNvbGlkO1xufVxuLnRvb2x0aXAge1xuICAmLnRvcCAudG9vbHRpcC1hcnJvdyB7XG4gICAgYm90dG9tOiAwO1xuICAgIGxlZnQ6IDUwJTtcbiAgICBtYXJnaW4tbGVmdDogLUB0b29sdGlwLWFycm93LXdpZHRoO1xuICAgIGJvcmRlci13aWR0aDogQHRvb2x0aXAtYXJyb3ctd2lkdGggQHRvb2x0aXAtYXJyb3ctd2lkdGggMDtcbiAgICBib3JkZXItdG9wLWNvbG9yOiBAdG9vbHRpcC1hcnJvdy1jb2xvcjtcbiAgfVxuICAmLnRvcC1sZWZ0IC50b29sdGlwLWFycm93IHtcbiAgICBib3R0b206IDA7XG4gICAgbGVmdDogQHRvb2x0aXAtYXJyb3ctd2lkdGg7XG4gICAgYm9yZGVyLXdpZHRoOiBAdG9vbHRpcC1hcnJvdy13aWR0aCBAdG9vbHRpcC1hcnJvdy13aWR0aCAwO1xuICAgIGJvcmRlci10b3AtY29sb3I6IEB0b29sdGlwLWFycm93LWNvbG9yO1xuICB9XG4gICYudG9wLXJpZ2h0IC50b29sdGlwLWFycm93IHtcbiAgICBib3R0b206IDA7XG4gICAgcmlnaHQ6IEB0b29sdGlwLWFycm93LXdpZHRoO1xuICAgIGJvcmRlci13aWR0aDogQHRvb2x0aXAtYXJyb3ctd2lkdGggQHRvb2x0aXAtYXJyb3ctd2lkdGggMDtcbiAgICBib3JkZXItdG9wLWNvbG9yOiBAdG9vbHRpcC1hcnJvdy1jb2xvcjtcbiAgfVxuICAmLnJpZ2h0IC50b29sdGlwLWFycm93IHtcbiAgICB0b3A6IDUwJTtcbiAgICBsZWZ0OiAwO1xuICAgIG1hcmdpbi10b3A6IC1AdG9vbHRpcC1hcnJvdy13aWR0aDtcbiAgICBib3JkZXItd2lkdGg6IEB0b29sdGlwLWFycm93LXdpZHRoIEB0b29sdGlwLWFycm93LXdpZHRoIEB0b29sdGlwLWFycm93LXdpZHRoIDA7XG4gICAgYm9yZGVyLXJpZ2h0LWNvbG9yOiBAdG9vbHRpcC1hcnJvdy1jb2xvcjtcbiAgfVxuICAmLmxlZnQgLnRvb2x0aXAtYXJyb3cge1xuICAgIHRvcDogNTAlO1xuICAgIHJpZ2h0OiAwO1xuICAgIG1hcmdpbi10b3A6IC1AdG9vbHRpcC1hcnJvdy13aWR0aDtcbiAgICBib3JkZXItd2lkdGg6IEB0b29sdGlwLWFycm93LXdpZHRoIDAgQHRvb2x0aXAtYXJyb3ctd2lkdGggQHRvb2x0aXAtYXJyb3ctd2lkdGg7XG4gICAgYm9yZGVyLWxlZnQtY29sb3I6IEB0b29sdGlwLWFycm93LWNvbG9yO1xuICB9XG4gICYuYm90dG9tIC50b29sdGlwLWFycm93IHtcbiAgICB0b3A6IDA7XG4gICAgbGVmdDogNTAlO1xuICAgIG1hcmdpbi1sZWZ0OiAtQHRvb2x0aXAtYXJyb3ctd2lkdGg7XG4gICAgYm9yZGVyLXdpZHRoOiAwIEB0b29sdGlwLWFycm93LXdpZHRoIEB0b29sdGlwLWFycm93LXdpZHRoO1xuICAgIGJvcmRlci1ib3R0b20tY29sb3I6IEB0b29sdGlwLWFycm93LWNvbG9yO1xuICB9XG4gICYuYm90dG9tLWxlZnQgLnRvb2x0aXAtYXJyb3cge1xuICAgIHRvcDogMDtcbiAgICBsZWZ0OiBAdG9vbHRpcC1hcnJvdy13aWR0aDtcbiAgICBib3JkZXItd2lkdGg6IDAgQHRvb2x0aXAtYXJyb3ctd2lkdGggQHRvb2x0aXAtYXJyb3ctd2lkdGg7XG4gICAgYm9yZGVyLWJvdHRvbS1jb2xvcjogQHRvb2x0aXAtYXJyb3ctY29sb3I7XG4gIH1cbiAgJi5ib3R0b20tcmlnaHQgLnRvb2x0aXAtYXJyb3cge1xuICAgIHRvcDogMDtcbiAgICByaWdodDogQHRvb2x0aXAtYXJyb3ctd2lkdGg7XG4gICAgYm9yZGVyLXdpZHRoOiAwIEB0b29sdGlwLWFycm93LXdpZHRoIEB0b29sdGlwLWFycm93LXdpZHRoO1xuICAgIGJvcmRlci1ib3R0b20tY29sb3I6IEB0b29sdGlwLWFycm93LWNvbG9yO1xuICB9XG59XG4iLCIvL1xuLy8gUG9wb3ZlcnNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cblxuLnBvcG92ZXIge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHRvcDogMDtcbiAgbGVmdDogMDtcbiAgei1pbmRleDogQHppbmRleC1wb3BvdmVyO1xuICBkaXNwbGF5OiBub25lO1xuICBtYXgtd2lkdGg6IEBwb3BvdmVyLW1heC13aWR0aDtcbiAgcGFkZGluZzogMXB4O1xuICAvLyBSZXNldCBmb250IGFuZCB0ZXh0IHByb3BlcnRlcyBnaXZlbiBuZXcgaW5zZXJ0aW9uIG1ldGhvZFxuICBmb250LXNpemU6IEBmb250LXNpemUtYmFzZTtcbiAgZm9udC13ZWlnaHQ6IG5vcm1hbDtcbiAgbGluZS1oZWlnaHQ6IEBsaW5lLWhlaWdodC1iYXNlO1xuICB0ZXh0LWFsaWduOiBsZWZ0O1xuICBiYWNrZ3JvdW5kLWNvbG9yOiBAcG9wb3Zlci1iZztcbiAgYmFja2dyb3VuZC1jbGlwOiBwYWRkaW5nLWJveDtcbiAgYm9yZGVyOiAxcHggc29saWQgQHBvcG92ZXItZmFsbGJhY2stYm9yZGVyLWNvbG9yO1xuICBib3JkZXI6IDFweCBzb2xpZCBAcG9wb3Zlci1ib3JkZXItY29sb3I7XG4gIGJvcmRlci1yYWRpdXM6IEBib3JkZXItcmFkaXVzLWxhcmdlO1xuICAuYm94LXNoYWRvdygwIDVweCAxMHB4IHJnYmEoMCwwLDAsLjIpKTtcblxuICAvLyBPdmVycmlkZXMgZm9yIHByb3BlciBpbnNlcnRpb25cbiAgd2hpdGUtc3BhY2U6IG5vcm1hbDtcblxuICAvLyBPZmZzZXQgdGhlIHBvcG92ZXIgdG8gYWNjb3VudCBmb3IgdGhlIHBvcG92ZXIgYXJyb3dcbiAgJi50b3AgICAgIHsgbWFyZ2luLXRvcDogLUBwb3BvdmVyLWFycm93LXdpZHRoOyB9XG4gICYucmlnaHQgICB7IG1hcmdpbi1sZWZ0OiBAcG9wb3Zlci1hcnJvdy13aWR0aDsgfVxuICAmLmJvdHRvbSAgeyBtYXJnaW4tdG9wOiBAcG9wb3Zlci1hcnJvdy13aWR0aDsgfVxuICAmLmxlZnQgICAgeyBtYXJnaW4tbGVmdDogLUBwb3BvdmVyLWFycm93LXdpZHRoOyB9XG59XG5cbi5wb3BvdmVyLXRpdGxlIHtcbiAgbWFyZ2luOiAwOyAvLyByZXNldCBoZWFkaW5nIG1hcmdpblxuICBwYWRkaW5nOiA4cHggMTRweDtcbiAgZm9udC1zaXplOiBAZm9udC1zaXplLWJhc2U7XG4gIGJhY2tncm91bmQtY29sb3I6IEBwb3BvdmVyLXRpdGxlLWJnO1xuICBib3JkZXItYm90dG9tOiAxcHggc29saWQgZGFya2VuKEBwb3BvdmVyLXRpdGxlLWJnLCA1JSk7XG4gIGJvcmRlci1yYWRpdXM6IChAYm9yZGVyLXJhZGl1cy1sYXJnZSAtIDEpIChAYm9yZGVyLXJhZGl1cy1sYXJnZSAtIDEpIDAgMDtcbn1cblxuLnBvcG92ZXItY29udGVudCB7XG4gIHBhZGRpbmc6IDlweCAxNHB4O1xufVxuXG4vLyBBcnJvd3Ncbi8vXG4vLyAuYXJyb3cgaXMgb3V0ZXIsIC5hcnJvdzphZnRlciBpcyBpbm5lclxuXG4ucG9wb3ZlciA+IC5hcnJvdyB7XG4gICYsXG4gICY6YWZ0ZXIge1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICBkaXNwbGF5OiBibG9jaztcbiAgICB3aWR0aDogMDtcbiAgICBoZWlnaHQ6IDA7XG4gICAgYm9yZGVyLWNvbG9yOiB0cmFuc3BhcmVudDtcbiAgICBib3JkZXItc3R5bGU6IHNvbGlkO1xuICB9XG59XG4ucG9wb3ZlciA+IC5hcnJvdyB7XG4gIGJvcmRlci13aWR0aDogQHBvcG92ZXItYXJyb3ctb3V0ZXItd2lkdGg7XG59XG4ucG9wb3ZlciA+IC5hcnJvdzphZnRlciB7XG4gIGJvcmRlci13aWR0aDogQHBvcG92ZXItYXJyb3ctd2lkdGg7XG4gIGNvbnRlbnQ6IFwiXCI7XG59XG5cbi5wb3BvdmVyIHtcbiAgJi50b3AgPiAuYXJyb3cge1xuICAgIGxlZnQ6IDUwJTtcbiAgICBtYXJnaW4tbGVmdDogLUBwb3BvdmVyLWFycm93LW91dGVyLXdpZHRoO1xuICAgIGJvcmRlci1ib3R0b20td2lkdGg6IDA7XG4gICAgYm9yZGVyLXRvcC1jb2xvcjogQHBvcG92ZXItYXJyb3ctb3V0ZXItZmFsbGJhY2stY29sb3I7IC8vIElFOCBmYWxsYmFja1xuICAgIGJvcmRlci10b3AtY29sb3I6IEBwb3BvdmVyLWFycm93LW91dGVyLWNvbG9yO1xuICAgIGJvdHRvbTogLUBwb3BvdmVyLWFycm93LW91dGVyLXdpZHRoO1xuICAgICY6YWZ0ZXIge1xuICAgICAgY29udGVudDogXCIgXCI7XG4gICAgICBib3R0b206IDFweDtcbiAgICAgIG1hcmdpbi1sZWZ0OiAtQHBvcG92ZXItYXJyb3ctd2lkdGg7XG4gICAgICBib3JkZXItYm90dG9tLXdpZHRoOiAwO1xuICAgICAgYm9yZGVyLXRvcC1jb2xvcjogQHBvcG92ZXItYXJyb3ctY29sb3I7XG4gICAgfVxuICB9XG4gICYucmlnaHQgPiAuYXJyb3cge1xuICAgIHRvcDogNTAlO1xuICAgIGxlZnQ6IC1AcG9wb3Zlci1hcnJvdy1vdXRlci13aWR0aDtcbiAgICBtYXJnaW4tdG9wOiAtQHBvcG92ZXItYXJyb3ctb3V0ZXItd2lkdGg7XG4gICAgYm9yZGVyLWxlZnQtd2lkdGg6IDA7XG4gICAgYm9yZGVyLXJpZ2h0LWNvbG9yOiBAcG9wb3Zlci1hcnJvdy1vdXRlci1mYWxsYmFjay1jb2xvcjsgLy8gSUU4IGZhbGxiYWNrXG4gICAgYm9yZGVyLXJpZ2h0LWNvbG9yOiBAcG9wb3Zlci1hcnJvdy1vdXRlci1jb2xvcjtcbiAgICAmOmFmdGVyIHtcbiAgICAgIGNvbnRlbnQ6IFwiIFwiO1xuICAgICAgbGVmdDogMXB4O1xuICAgICAgYm90dG9tOiAtQHBvcG92ZXItYXJyb3ctd2lkdGg7XG4gICAgICBib3JkZXItbGVmdC13aWR0aDogMDtcbiAgICAgIGJvcmRlci1yaWdodC1jb2xvcjogQHBvcG92ZXItYXJyb3ctY29sb3I7XG4gICAgfVxuICB9XG4gICYuYm90dG9tID4gLmFycm93IHtcbiAgICBsZWZ0OiA1MCU7XG4gICAgbWFyZ2luLWxlZnQ6IC1AcG9wb3Zlci1hcnJvdy1vdXRlci13aWR0aDtcbiAgICBib3JkZXItdG9wLXdpZHRoOiAwO1xuICAgIGJvcmRlci1ib3R0b20tY29sb3I6IEBwb3BvdmVyLWFycm93LW91dGVyLWZhbGxiYWNrLWNvbG9yOyAvLyBJRTggZmFsbGJhY2tcbiAgICBib3JkZXItYm90dG9tLWNvbG9yOiBAcG9wb3Zlci1hcnJvdy1vdXRlci1jb2xvcjtcbiAgICB0b3A6IC1AcG9wb3Zlci1hcnJvdy1vdXRlci13aWR0aDtcbiAgICAmOmFmdGVyIHtcbiAgICAgIGNvbnRlbnQ6IFwiIFwiO1xuICAgICAgdG9wOiAxcHg7XG4gICAgICBtYXJnaW4tbGVmdDogLUBwb3BvdmVyLWFycm93LXdpZHRoO1xuICAgICAgYm9yZGVyLXRvcC13aWR0aDogMDtcbiAgICAgIGJvcmRlci1ib3R0b20tY29sb3I6IEBwb3BvdmVyLWFycm93LWNvbG9yO1xuICAgIH1cbiAgfVxuXG4gICYubGVmdCA+IC5hcnJvdyB7XG4gICAgdG9wOiA1MCU7XG4gICAgcmlnaHQ6IC1AcG9wb3Zlci1hcnJvdy1vdXRlci13aWR0aDtcbiAgICBtYXJnaW4tdG9wOiAtQHBvcG92ZXItYXJyb3ctb3V0ZXItd2lkdGg7XG4gICAgYm9yZGVyLXJpZ2h0LXdpZHRoOiAwO1xuICAgIGJvcmRlci1sZWZ0LWNvbG9yOiBAcG9wb3Zlci1hcnJvdy1vdXRlci1mYWxsYmFjay1jb2xvcjsgLy8gSUU4IGZhbGxiYWNrXG4gICAgYm9yZGVyLWxlZnQtY29sb3I6IEBwb3BvdmVyLWFycm93LW91dGVyLWNvbG9yO1xuICAgICY6YWZ0ZXIge1xuICAgICAgY29udGVudDogXCIgXCI7XG4gICAgICByaWdodDogMXB4O1xuICAgICAgYm9yZGVyLXJpZ2h0LXdpZHRoOiAwO1xuICAgICAgYm9yZGVyLWxlZnQtY29sb3I6IEBwb3BvdmVyLWFycm93LWNvbG9yO1xuICAgICAgYm90dG9tOiAtQHBvcG92ZXItYXJyb3ctd2lkdGg7XG4gICAgfVxuICB9XG59XG4iLCIvLyBDbGVhcmZpeFxuLy9cbi8vIEZvciBtb2Rlcm4gYnJvd3NlcnNcbi8vIDEuIFRoZSBzcGFjZSBjb250ZW50IGlzIG9uZSB3YXkgdG8gYXZvaWQgYW4gT3BlcmEgYnVnIHdoZW4gdGhlXG4vLyAgICBjb250ZW50ZWRpdGFibGUgYXR0cmlidXRlIGlzIGluY2x1ZGVkIGFueXdoZXJlIGVsc2UgaW4gdGhlIGRvY3VtZW50LlxuLy8gICAgT3RoZXJ3aXNlIGl0IGNhdXNlcyBzcGFjZSB0byBhcHBlYXIgYXQgdGhlIHRvcCBhbmQgYm90dG9tIG9mIGVsZW1lbnRzXG4vLyAgICB0aGF0IGFyZSBjbGVhcmZpeGVkLlxuLy8gMi4gVGhlIHVzZSBvZiBgdGFibGVgIHJhdGhlciB0aGFuIGBibG9ja2AgaXMgb25seSBuZWNlc3NhcnkgaWYgdXNpbmdcbi8vICAgIGA6YmVmb3JlYCB0byBjb250YWluIHRoZSB0b3AtbWFyZ2lucyBvZiBjaGlsZCBlbGVtZW50cy5cbi8vXG4vLyBTb3VyY2U6IGh0dHA6Ly9uaWNvbGFzZ2FsbGFnaGVyLmNvbS9taWNyby1jbGVhcmZpeC1oYWNrL1xuXG4uY2xlYXJmaXgoKSB7XG4gICY6YmVmb3JlLFxuICAmOmFmdGVyIHtcbiAgICBjb250ZW50OiBcIiBcIjsgLy8gMVxuICAgIGRpc3BsYXk6IHRhYmxlOyAvLyAyXG4gIH1cbiAgJjphZnRlciB7XG4gICAgY2xlYXI6IGJvdGg7XG4gIH1cbn1cbiIsIi8vIENlbnRlci1hbGlnbiBhIGJsb2NrIGxldmVsIGVsZW1lbnRcblxuLmNlbnRlci1ibG9jaygpIHtcbiAgZGlzcGxheTogYmxvY2s7XG4gIG1hcmdpbi1sZWZ0OiBhdXRvO1xuICBtYXJnaW4tcmlnaHQ6IGF1dG87XG59XG4iLCIvLyBDU1MgaW1hZ2UgcmVwbGFjZW1lbnRcbi8vXG4vLyBIZWFkcyB1cCEgdjMgbGF1bmNoZWQgd2l0aCB3aXRoIG9ubHkgYC5oaWRlLXRleHQoKWAsIGJ1dCBwZXIgb3VyIHBhdHRlcm4gZm9yXG4vLyBtaXhpbnMgYmVpbmcgcmV1c2VkIGFzIGNsYXNzZXMgd2l0aCB0aGUgc2FtZSBuYW1lLCB0aGlzIGRvZXNuJ3QgaG9sZCB1cC4gQXNcbi8vIG9mIHYzLjAuMSB3ZSBoYXZlIGFkZGVkIGAudGV4dC1oaWRlKClgIGFuZCBkZXByZWNhdGVkIGAuaGlkZS10ZXh0KClgLlxuLy9cbi8vIFNvdXJjZTogaHR0cHM6Ly9naXRodWIuY29tL2g1YnAvaHRtbDUtYm9pbGVycGxhdGUvY29tbWl0L2FhMDM5NmVhZTc1N1xuXG4vLyBEZXByZWNhdGVkIGFzIG9mIHYzLjAuMSAod2lsbCBiZSByZW1vdmVkIGluIHY0KVxuLmhpZGUtdGV4dCgpIHtcbiAgZm9udDogflwiMC8wXCIgYTtcbiAgY29sb3I6IHRyYW5zcGFyZW50O1xuICB0ZXh0LXNoYWRvdzogbm9uZTtcbiAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7XG4gIGJvcmRlcjogMDtcbn1cblxuLy8gTmV3IG1peGluIHRvIHVzZSBhcyBvZiB2My4wLjFcbi50ZXh0LWhpZGUoKSB7XG4gIC5oaWRlLXRleHQoKTtcbn1cbiIsIi8vXG4vLyBSZXNwb25zaXZlOiBVdGlsaXR5IGNsYXNzZXNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cblxuLy8gSUUxMCBpbiBXaW5kb3dzIChQaG9uZSkgOFxuLy9cbi8vIFN1cHBvcnQgZm9yIHJlc3BvbnNpdmUgdmlld3MgdmlhIG1lZGlhIHF1ZXJpZXMgaXMga2luZCBvZiBib3JrZWQgaW4gSUUxMCwgZm9yXG4vLyBTdXJmYWNlL2Rlc2t0b3AgaW4gc3BsaXQgdmlldyBhbmQgZm9yIFdpbmRvd3MgUGhvbmUgOC4gVGhpcyBwYXJ0aWN1bGFyIGZpeFxuLy8gbXVzdCBiZSBhY2NvbXBhbmllZCBieSBhIHNuaXBwZXQgb2YgSmF2YVNjcmlwdCB0byBzbmlmZiB0aGUgdXNlciBhZ2VudCBhbmRcbi8vIGFwcGx5IHNvbWUgY29uZGl0aW9uYWwgQ1NTIHRvICpvbmx5KiB0aGUgU3VyZmFjZS9kZXNrdG9wIFdpbmRvd3MgOC4gTG9vayBhdFxuLy8gb3VyIEdldHRpbmcgU3RhcnRlZCBwYWdlIGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoaXMgYnVnLlxuLy9cbi8vIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgdGhlIGZvbGxvd2luZzpcbi8vXG4vLyBJc3N1ZTogaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2lzc3Vlcy8xMDQ5N1xuLy8gRG9jczogaHR0cDovL2dldGJvb3RzdHJhcC5jb20vZ2V0dGluZy1zdGFydGVkLyNzdXBwb3J0LWllMTAtd2lkdGhcbi8vIFNvdXJjZTogaHR0cDovL3RpbWthZGxlYy5jb20vMjAxMy8wMS93aW5kb3dzLXBob25lLTgtYW5kLWRldmljZS13aWR0aC9cbi8vIFNvdXJjZTogaHR0cDovL3RpbWthZGxlYy5jb20vMjAxMi8xMC9pZTEwLXNuYXAtbW9kZS1hbmQtcmVzcG9uc2l2ZS1kZXNpZ24vXG5cbkAtbXMtdmlld3BvcnQge1xuICB3aWR0aDogZGV2aWNlLXdpZHRoO1xufVxuXG5cbi8vIFZpc2liaWxpdHkgdXRpbGl0aWVzXG4vLyBOb3RlOiBEZXByZWNhdGVkIC52aXNpYmxlLXhzLCAudmlzaWJsZS1zbSwgLnZpc2libGUtbWQsIGFuZCAudmlzaWJsZS1sZyBhcyBvZiB2My4yLjBcbi52aXNpYmxlLXhzLFxuLnZpc2libGUtc20sXG4udmlzaWJsZS1tZCxcbi52aXNpYmxlLWxnIHtcbiAgLnJlc3BvbnNpdmUtaW52aXNpYmlsaXR5KCk7XG59XG5cbi52aXNpYmxlLXhzLWJsb2NrLFxuLnZpc2libGUteHMtaW5saW5lLFxuLnZpc2libGUteHMtaW5saW5lLWJsb2NrLFxuLnZpc2libGUtc20tYmxvY2ssXG4udmlzaWJsZS1zbS1pbmxpbmUsXG4udmlzaWJsZS1zbS1pbmxpbmUtYmxvY2ssXG4udmlzaWJsZS1tZC1ibG9jayxcbi52aXNpYmxlLW1kLWlubGluZSxcbi52aXNpYmxlLW1kLWlubGluZS1ibG9jayxcbi52aXNpYmxlLWxnLWJsb2NrLFxuLnZpc2libGUtbGctaW5saW5lLFxuLnZpc2libGUtbGctaW5saW5lLWJsb2NrIHtcbiAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50O1xufVxuXG4udmlzaWJsZS14cyB7XG4gIEBtZWRpYSAobWF4LXdpZHRoOiBAc2NyZWVuLXhzLW1heCkge1xuICAgIC5yZXNwb25zaXZlLXZpc2liaWxpdHkoKTtcbiAgfVxufVxuLnZpc2libGUteHMtYmxvY2sge1xuICBAbWVkaWEgKG1heC13aWR0aDogQHNjcmVlbi14cy1tYXgpIHtcbiAgICBkaXNwbGF5OiBibG9jayAhaW1wb3J0YW50O1xuICB9XG59XG4udmlzaWJsZS14cy1pbmxpbmUge1xuICBAbWVkaWEgKG1heC13aWR0aDogQHNjcmVlbi14cy1tYXgpIHtcbiAgICBkaXNwbGF5OiBpbmxpbmUgIWltcG9ydGFudDtcbiAgfVxufVxuLnZpc2libGUteHMtaW5saW5lLWJsb2NrIHtcbiAgQG1lZGlhIChtYXgtd2lkdGg6IEBzY3JlZW4teHMtbWF4KSB7XG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrICFpbXBvcnRhbnQ7XG4gIH1cbn1cblxuLnZpc2libGUtc20ge1xuICBAbWVkaWEgKG1pbi13aWR0aDogQHNjcmVlbi1zbS1taW4pIGFuZCAobWF4LXdpZHRoOiBAc2NyZWVuLXNtLW1heCkge1xuICAgIC5yZXNwb25zaXZlLXZpc2liaWxpdHkoKTtcbiAgfVxufVxuLnZpc2libGUtc20tYmxvY2sge1xuICBAbWVkaWEgKG1pbi13aWR0aDogQHNjcmVlbi1zbS1taW4pIGFuZCAobWF4LXdpZHRoOiBAc2NyZWVuLXNtLW1heCkge1xuICAgIGRpc3BsYXk6IGJsb2NrICFpbXBvcnRhbnQ7XG4gIH1cbn1cbi52aXNpYmxlLXNtLWlubGluZSB7XG4gIEBtZWRpYSAobWluLXdpZHRoOiBAc2NyZWVuLXNtLW1pbikgYW5kIChtYXgtd2lkdGg6IEBzY3JlZW4tc20tbWF4KSB7XG4gICAgZGlzcGxheTogaW5saW5lICFpbXBvcnRhbnQ7XG4gIH1cbn1cbi52aXNpYmxlLXNtLWlubGluZS1ibG9jayB7XG4gIEBtZWRpYSAobWluLXdpZHRoOiBAc2NyZWVuLXNtLW1pbikgYW5kIChtYXgtd2lkdGg6IEBzY3JlZW4tc20tbWF4KSB7XG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrICFpbXBvcnRhbnQ7XG4gIH1cbn1cblxuLnZpc2libGUtbWQge1xuICBAbWVkaWEgKG1pbi13aWR0aDogQHNjcmVlbi1tZC1taW4pIGFuZCAobWF4LXdpZHRoOiBAc2NyZWVuLW1kLW1heCkge1xuICAgIC5yZXNwb25zaXZlLXZpc2liaWxpdHkoKTtcbiAgfVxufVxuLnZpc2libGUtbWQtYmxvY2sge1xuICBAbWVkaWEgKG1pbi13aWR0aDogQHNjcmVlbi1tZC1taW4pIGFuZCAobWF4LXdpZHRoOiBAc2NyZWVuLW1kLW1heCkge1xuICAgIGRpc3BsYXk6IGJsb2NrICFpbXBvcnRhbnQ7XG4gIH1cbn1cbi52aXNpYmxlLW1kLWlubGluZSB7XG4gIEBtZWRpYSAobWluLXdpZHRoOiBAc2NyZWVuLW1kLW1pbikgYW5kIChtYXgtd2lkdGg6IEBzY3JlZW4tbWQtbWF4KSB7XG4gICAgZGlzcGxheTogaW5saW5lICFpbXBvcnRhbnQ7XG4gIH1cbn1cbi52aXNpYmxlLW1kLWlubGluZS1ibG9jayB7XG4gIEBtZWRpYSAobWluLXdpZHRoOiBAc2NyZWVuLW1kLW1pbikgYW5kIChtYXgtd2lkdGg6IEBzY3JlZW4tbWQtbWF4KSB7XG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrICFpbXBvcnRhbnQ7XG4gIH1cbn1cblxuLnZpc2libGUtbGcge1xuICBAbWVkaWEgKG1pbi13aWR0aDogQHNjcmVlbi1sZy1taW4pIHtcbiAgICAucmVzcG9uc2l2ZS12aXNpYmlsaXR5KCk7XG4gIH1cbn1cbi52aXNpYmxlLWxnLWJsb2NrIHtcbiAgQG1lZGlhIChtaW4td2lkdGg6IEBzY3JlZW4tbGctbWluKSB7XG4gICAgZGlzcGxheTogYmxvY2sgIWltcG9ydGFudDtcbiAgfVxufVxuLnZpc2libGUtbGctaW5saW5lIHtcbiAgQG1lZGlhIChtaW4td2lkdGg6IEBzY3JlZW4tbGctbWluKSB7XG4gICAgZGlzcGxheTogaW5saW5lICFpbXBvcnRhbnQ7XG4gIH1cbn1cbi52aXNpYmxlLWxnLWlubGluZS1ibG9jayB7XG4gIEBtZWRpYSAobWluLXdpZHRoOiBAc2NyZWVuLWxnLW1pbikge1xuICAgIGRpc3BsYXk6IGlubGluZS1ibG9jayAhaW1wb3J0YW50O1xuICB9XG59XG5cbi5oaWRkZW4teHMge1xuICBAbWVkaWEgKG1heC13aWR0aDogQHNjcmVlbi14cy1tYXgpIHtcbiAgICAucmVzcG9uc2l2ZS1pbnZpc2liaWxpdHkoKTtcbiAgfVxufVxuLmhpZGRlbi1zbSB7XG4gIEBtZWRpYSAobWluLXdpZHRoOiBAc2NyZWVuLXNtLW1pbikgYW5kIChtYXgtd2lkdGg6IEBzY3JlZW4tc20tbWF4KSB7XG4gICAgLnJlc3BvbnNpdmUtaW52aXNpYmlsaXR5KCk7XG4gIH1cbn1cbi5oaWRkZW4tbWQge1xuICBAbWVkaWEgKG1pbi13aWR0aDogQHNjcmVlbi1tZC1taW4pIGFuZCAobWF4LXdpZHRoOiBAc2NyZWVuLW1kLW1heCkge1xuICAgIC5yZXNwb25zaXZlLWludmlzaWJpbGl0eSgpO1xuICB9XG59XG4uaGlkZGVuLWxnIHtcbiAgQG1lZGlhIChtaW4td2lkdGg6IEBzY3JlZW4tbGctbWluKSB7XG4gICAgLnJlc3BvbnNpdmUtaW52aXNpYmlsaXR5KCk7XG4gIH1cbn1cblxuXG4vLyBQcmludCB1dGlsaXRpZXNcbi8vXG4vLyBNZWRpYSBxdWVyaWVzIGFyZSBwbGFjZWQgb24gdGhlIGluc2lkZSB0byBiZSBtaXhpbi1mcmllbmRseS5cblxuLy8gTm90ZTogRGVwcmVjYXRlZCAudmlzaWJsZS1wcmludCBhcyBvZiB2My4yLjBcbi52aXNpYmxlLXByaW50IHtcbiAgLnJlc3BvbnNpdmUtaW52aXNpYmlsaXR5KCk7XG5cbiAgQG1lZGlhIHByaW50IHtcbiAgICAucmVzcG9uc2l2ZS12aXNpYmlsaXR5KCk7XG4gIH1cbn1cbi52aXNpYmxlLXByaW50LWJsb2NrIHtcbiAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50O1xuXG4gIEBtZWRpYSBwcmludCB7XG4gICAgZGlzcGxheTogYmxvY2sgIWltcG9ydGFudDtcbiAgfVxufVxuLnZpc2libGUtcHJpbnQtaW5saW5lIHtcbiAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50O1xuXG4gIEBtZWRpYSBwcmludCB7XG4gICAgZGlzcGxheTogaW5saW5lICFpbXBvcnRhbnQ7XG4gIH1cbn1cbi52aXNpYmxlLXByaW50LWlubGluZS1ibG9jayB7XG4gIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDtcblxuICBAbWVkaWEgcHJpbnQge1xuICAgIGRpc3BsYXk6IGlubGluZS1ibG9jayAhaW1wb3J0YW50O1xuICB9XG59XG5cbi5oaWRkZW4tcHJpbnQge1xuICBAbWVkaWEgcHJpbnQge1xuICAgIC5yZXNwb25zaXZlLWludmlzaWJpbGl0eSgpO1xuICB9XG59XG4iLCIvLyBSZXNwb25zaXZlIHV0aWxpdGllc1xuXG4vL1xuLy8gTW9yZSBlYXNpbHkgaW5jbHVkZSBhbGwgdGhlIHN0YXRlcyBmb3IgcmVzcG9uc2l2ZS11dGlsaXRpZXMubGVzcy5cbi5yZXNwb25zaXZlLXZpc2liaWxpdHkoKSB7XG4gIGRpc3BsYXk6IGJsb2NrICFpbXBvcnRhbnQ7XG4gIHRhYmxlJiAgeyBkaXNwbGF5OiB0YWJsZTsgfVxuICB0ciYgICAgIHsgZGlzcGxheTogdGFibGUtcm93ICFpbXBvcnRhbnQ7IH1cbiAgdGgmLFxuICB0ZCYgICAgIHsgZGlzcGxheTogdGFibGUtY2VsbCAhaW1wb3J0YW50OyB9XG59XG5cbi5yZXNwb25zaXZlLWludmlzaWJpbGl0eSgpIHtcbiAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50O1xufVxuIiwiLypcbiAqIFNvY2lhbCBCdXR0b25zIGZvciBCb290c3RyYXBcbiAqXG4gKiBDb3B5cmlnaHQgMjAxMy0yMDE0IFBhbmF5aW90aXMgTGlwaXJpZGlzXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2VcbiAqXG4gKiBodHRwczovL2dpdGh1Yi5jb20vbGlwaXMvYm9vdHN0cmFwLXNvY2lhbFxuICovXG5cbkBicy1oZWlnaHQtYmFzZTogKEBsaW5lLWhlaWdodC1jb21wdXRlZCArIEBwYWRkaW5nLWJhc2UtdmVydGljYWwgKiAyKTtcbkBicy1oZWlnaHQtbGc6ICAgKGZsb29yKEBmb250LXNpemUtbGFyZ2UgKiBAbGluZS1oZWlnaHQtYmFzZSkgKyBAcGFkZGluZy1sYXJnZS12ZXJ0aWNhbCAqIDIpO1xuQGJzLWhlaWdodC1zbTogICAoZmxvb3IoQGZvbnQtc2l6ZS1zbWFsbCAqIDEuNSkgKyBAcGFkZGluZy1zbWFsbC12ZXJ0aWNhbCAqIDIpO1xuQGJzLWhlaWdodC14czogICAoZmxvb3IoQGZvbnQtc2l6ZS1zbWFsbCAqIDEuMikgKyBAcGFkZGluZy1zbWFsbC12ZXJ0aWNhbCArIDEpO1xuXG4uYnRuLXNvY2lhbCB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgcGFkZGluZy1sZWZ0OiAoQGJzLWhlaWdodC1iYXNlICsgQHBhZGRpbmctYmFzZS1ob3Jpem9udGFsKTtcbiAgdGV4dC1hbGlnbjogbGVmdDtcbiAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7XG4gID4gOmZpcnN0LWNoaWxkIHtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgbGVmdDogMDtcbiAgICB0b3A6IDA7XG4gICAgYm90dG9tOiAwO1xuICAgIHdpZHRoOiBAYnMtaGVpZ2h0LWJhc2U7XG4gICAgbGluZS1oZWlnaHQ6IChAYnMtaGVpZ2h0LWJhc2UgKyAyKTtcbiAgICBmb250LXNpemU6IDEuNmVtO1xuICAgIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgICBib3JkZXItcmlnaHQ6IDFweCBzb2xpZCByZ2JhKDAsIDAsIDAsIDAuMik7XG4gIH1cbiAgJi5idG4tbGcge1xuICAgIHBhZGRpbmctbGVmdDogKEBicy1oZWlnaHQtbGcgKyBAcGFkZGluZy1sYXJnZS1ob3Jpem9udGFsKTtcbiAgICA6Zmlyc3QtY2hpbGQge1xuICAgICAgbGluZS1oZWlnaHQ6IEBicy1oZWlnaHQtbGc7XG4gICAgICB3aWR0aDogQGJzLWhlaWdodC1sZztcbiAgICAgIGZvbnQtc2l6ZTogMS44ZW07XG4gICAgfVxuICB9XG4gICYuYnRuLXNtIHtcbiAgICBwYWRkaW5nLWxlZnQ6IChAYnMtaGVpZ2h0LXNtICsgQHBhZGRpbmctc21hbGwtaG9yaXpvbnRhbCk7XG4gICAgOmZpcnN0LWNoaWxkIHtcbiAgICAgIGxpbmUtaGVpZ2h0OiBAYnMtaGVpZ2h0LXNtO1xuICAgICAgd2lkdGg6IEBicy1oZWlnaHQtc207XG4gICAgICBmb250LXNpemU6IDEuNGVtO1xuICAgIH1cbiAgfVxuICAmLmJ0bi14cyB7XG4gICAgcGFkZGluZy1sZWZ0OiAoQGJzLWhlaWdodC14cyArIEBwYWRkaW5nLXNtYWxsLWhvcml6b250YWwpO1xuICAgIDpmaXJzdC1jaGlsZCB7XG4gICAgICBsaW5lLWhlaWdodDogQGJzLWhlaWdodC14cztcbiAgICAgIHdpZHRoOiBAYnMtaGVpZ2h0LXhzO1xuICAgICAgZm9udC1zaXplOiAxLjJlbTtcbiAgICB9XG4gIH1cbn1cblxuLmJ0bi1zb2NpYWwtaWNvbiB7XG4gIC5idG4tc29jaWFsO1xuICBoZWlnaHQ6IChAYnMtaGVpZ2h0LWJhc2UgKyAyKTtcbiAgd2lkdGg6IChAYnMtaGVpZ2h0LWJhc2UgKyAyKTtcbiAgcGFkZGluZzogMDtcbiAgOmZpcnN0LWNoaWxkIHtcbiAgICBib3JkZXI6IG5vbmU7XG4gICAgdGV4dC1hbGlnbjogY2VudGVyO1xuICAgIHdpZHRoOiAxMDAlIWltcG9ydGFudDtcbiAgfVxuICAmLmJ0bi1sZyB7XG4gICAgaGVpZ2h0OiBAYnMtaGVpZ2h0LWxnO1xuICAgIHdpZHRoOiBAYnMtaGVpZ2h0LWxnO1xuICAgIHBhZGRpbmctbGVmdDogMDtcbiAgICBwYWRkaW5nLXJpZ2h0OiAwO1xuICB9XG4gICYuYnRuLXNtIHtcbiAgICBoZWlnaHQ6IChAYnMtaGVpZ2h0LXNtICsgMik7XG4gICAgd2lkdGg6IChAYnMtaGVpZ2h0LXNtICsgMik7XG4gICAgcGFkZGluZy1sZWZ0OiAwO1xuICAgIHBhZGRpbmctcmlnaHQ6IDA7XG4gIH1cbiAgJi5idG4teHMge1xuICAgIGhlaWdodDogKEBicy1oZWlnaHQteHMgKyAyKTtcbiAgICB3aWR0aDogKEBicy1oZWlnaHQteHMgKyAyKTtcbiAgICBwYWRkaW5nLWxlZnQ6IDA7XG4gICAgcGFkZGluZy1yaWdodDogMDtcbiAgfVxufVxuXG4uYnRuLXNvY2lhbChAY29sb3ItYmcsIEBjb2xvcjogQGNvbG9yLWJnKSB7XG4gIGJhY2tncm91bmQtY29sb3I6IEBjb2xvci1iZztcbiAgLmJ1dHRvbi12YXJpYW50KEBjb2xvciwgQGNvbG9yLWJnLCByZ2JhKDAsMCwwLC4yKSk7XG59XG5cblxuLmJ0bi1hZG4gICAgICAgICAgIHsgLmJ0bi1zb2NpYWwoI2Q4N2E2OCk7IH1cbi5idG4tYml0YnVja2V0ICAgICB7IC5idG4tc29jaWFsKCMyMDUwODEpOyB9XG4uYnRuLWRyb3Bib3ggICAgICAgeyAuYnRuLXNvY2lhbCgjMTA4N2RkKTsgfVxuLmJ0bi1mYWNlYm9vayAgICAgIHsgLmJ0bi1zb2NpYWwoIzNiNTk5OCk7IH1cbi5idG4tZmxpY2tyICAgICAgICB7IC5idG4tc29jaWFsKCNmZjAwODQpOyB9XG4uYnRuLWZvdXJzcXVhcmUgICAgeyAuYnRuLXNvY2lhbCgjZjk0ODc3KTsgfVxuLmJ0bi1naXRodWIgICAgICAgIHsgLmJ0bi1zb2NpYWwoIzQ0NDQ0NCk7IH1cbi5idG4tZ29vZ2xlLXBsdXMgICB7IC5idG4tc29jaWFsKCNkZDRiMzkpOyB9XG4uYnRuLWluc3RhZ3JhbSAgICAgeyAuYnRuLXNvY2lhbCgjM2Y3MjliKTsgfVxuLmJ0bi1saW5rZWRpbiAgICAgIHsgLmJ0bi1zb2NpYWwoIzAwN2JiNik7IH1cbi5idG4tbWljcm9zb2Z0ICAgICB7IC5idG4tc29jaWFsKCMyNjcyZWMpOyB9XG4uYnRuLW9wZW5pZCAgICAgICAgeyAuYnRuLXNvY2lhbCgjZjc5MzFlKTsgfVxuLmJ0bi1waW50ZXJlc3QgICAgIHsgLmJ0bi1zb2NpYWwoI2NiMjAyNyk7IH1cbi5idG4tcmVkZGl0ICAgICAgICB7IC5idG4tc29jaWFsKCNlZmY3ZmYsICMwMDApOyB9XG4uYnRuLXNvdW5kY2xvdWQgICAgeyAuYnRuLXNvY2lhbCgjZmY1NTAwKTsgfVxuLmJ0bi10dW1ibHIgICAgICAgIHsgLmJ0bi1zb2NpYWwoIzJjNDc2Mik7IH1cbi5idG4tdHdpdHRlciAgICAgICB7IC5idG4tc29jaWFsKCM1NWFjZWUpOyB9XG4uYnRuLXZpbWVvICAgICAgICAgeyAuYnRuLXNvY2lhbCgjMWFiN2VhKTsgfVxuLmJ0bi12ayAgICAgICAgICAgIHsgLmJ0bi1zb2NpYWwoIzU4N2VhMyk7IH1cbi5idG4teWFob28gICAgICAgICB7IC5idG4tc29jaWFsKCM3MjBlOWUpOyB9XG4iLCJAaW1wb3J0IFwibGliL2Jvb3RzdHJhcC9ib290c3RyYXBcIjtcbkBpbXBvcnQgXCJsaWIvYm9vdHN0cmFwLXNvY2lhbC9ib290c3RyYXAtc29jaWFsXCI7XG5AaW1wb3J0IFwibGliL2lvbmljb25zL2lvbmljb25zXCI7XG5AaW1wb3J0IFwibGliL2FuaW1hdGUubWluLmxlc3NcIjtcbkBpbXBvcnQgXCJsaWIvYm9vdHN0cmFwL3ZhcmlhYmxlc1wiO1xuXG5odG1sLGJvZHksZGl2LHNwYW4sYSxsaSx0ZCx0aCB7XG4gIGZvbnQtZmFtaWx5OiAn5b6u6L2v6ZuF6buRJywnTGF0bycsIHNhbnMtc2VyaWY7XG59XG5cbmJvbGQge1xuICBmb250LWZhbWlseTogJ0xhdG8tQm9sZCcsIHNhbnMtc2VyaWY7XG4gIGZvbnQtd2VpZ2h0OiBCb2xkO1xufVxuXG5saSwgLndyYXBwYWJsZSB7XG4gIHdoaXRlLXNwYWNlOiBwcmU7ICAgICAgICAgICAvKiBDU1MgMi4wICovXG4gIHdoaXRlLXNwYWNlOiBwcmUtd3JhcDsgICAgICAvKiBDU1MgMi4xICovXG4gIHdoaXRlLXNwYWNlOiBwcmUtbGluZTsgICAgICAvKiBDU1MgMy4wICovXG4gIHdoaXRlLXNwYWNlOiAtcHJlLXdyYXA7ICAgICAvKiBPcGVyYSA0LTYgKi9cbiAgd2hpdGUtc3BhY2U6IC1vLXByZS13cmFwOyAgIC8qIE9wZXJhIDcgKi9cbiAgd2hpdGUtc3BhY2U6IC1tb3otcHJlLXdyYXA7IC8qIE1vemlsbGEgKi9cbiAgd2hpdGUtc3BhY2U6IC1ocC1wcmUtd3JhcDsgIC8qIEhQIFByaW50ZXJzICovXG4gIHdvcmQtd3JhcDogYnJlYWstd29yZDsgICAgICAvKiBJRSA1KyAqL1xufVxuXG5wcmUud3JhcHBhYmxlIHtcbiAgd2hpdGUtc3BhY2U6IHByZTsgICAgICAgICAgIC8qIENTUyAyLjAgKi9cbiAgd2hpdGUtc3BhY2U6IHByZS13cmFwOyAgICAgIC8qIENTUyAyLjEgKi9cbiAgd2hpdGUtc3BhY2U6IC1wcmUtd3JhcDsgICAgIC8qIE9wZXJhIDQtNiAqL1xuICB3aGl0ZS1zcGFjZTogLW8tcHJlLXdyYXA7ICAgLyogT3BlcmEgNyAqL1xuICB3aGl0ZS1zcGFjZTogLW1vei1wcmUtd3JhcDsgLyogTW96aWxsYSAqL1xuICB3aGl0ZS1zcGFjZTogLWhwLXByZS13cmFwOyAgLyogSFAgUHJpbnRlcnMgKi9cbiAgd29yZC13cmFwOiBicmVhay13b3JkOyAgICAgIC8qIElFIDUrICovXG59XG5cbmh0bWwge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIG1pbi1oZWlnaHQ6IDEwMCU7XG4gIC8vIGhhY2sgdG8gcHJldmVudCBob3Jpem9udGFsIG92ZXJmbG93IHByb2JsZW0gb24gc2hvd0hUTUwgdmlld1xuICBvdmVyZmxvdy14OiBoaWRkZW47XG59XG5cbi8vaW5wdXRbdHlwZT1jaGVja2JveF0ge1xuLy8gIC8qIERvdWJsZS1zaXplZCBDaGVja2JveGVzICovXG4vLyAgLW1zLXRyYW5zZm9ybTogc2NhbGUoMik7IC8qIElFICovXG4vLyAgLW1vei10cmFuc2Zvcm06IHNjYWxlKDIpOyAvKiBGRiAqL1xuLy8gIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZSgyKTsgLyogU2FmYXJpIGFuZCBDaHJvbWUgKi9cbi8vICAtby10cmFuc2Zvcm06IHNjYWxlKDIpOyAvKiBPcGVyYSAqL1xuLy8gIHBhZGRpbmc6IDEwcHg7XG4vL31cblxuLmJ0bi1ncm91cCB7XG4gIGJvcmRlci1jb2xvcjogQGJyYW5kLXByaW1hcnk7XG59XG5cbmJvZHkuZnVsbC1zY3JlZW4tYm9keS1iYWNrZ3JvdW5kIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogQGJvZHktYmc7XG59XG5cblxuYm9keS50b3AtYW5kLWJvdHRvbS1tYXJnaW5zIHtcbiAgcGFkZGluZy10b3A6IDgwcHg7XG4gIG1hcmdpbi1ib3R0b206IDYwcHg7XG59XG5cbmJvZHkubm8tdG9wLWFuZC1ib3R0b20tbWFyZ2lucyB7XG4gIG1hcmdpbjogNzVweCAxMHB4IDBweCAyMHB4O1xufVxuXG5oMSwgaDIge1xuICBmb250LXdlaWdodDogNDAwO1xufVxuXG5cbmgxLCBoMiwgaDMsIGg0LCBoNSwgaDYsIHAsIGxpIHtcbiAgcGFkZGluZy10b3A6IDVweDtcbiAgcGFkZGluZy1ib3R0b206IDVweDtcbn1cblxuLy8gQWxlcnRzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi5hbGVydCB7XG4gIG1hcmdpbi10b3A6IDIwcHg7XG59XG5cbi8vIFRodW1ibmFpbHNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLnRodW1ibmFpbCB7XG4gIGJhY2tncm91bmQtY29sb3I6ICNFRUVFRUU7XG4vLyAgYm94LXNoYWRvdzogMCAwIDVweCAjY2NjLCBpbnNldCAwIDAgMCAjMDAwO1xufVxuXG4vLyBGb250IEljb25zXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi5mYSxcbltjbGFzc149J2lvbi0nXSB7XG4gIG1hcmdpbi1yaWdodDogNXB4O1xufVxuXG4uZmE6aG92ZXIge1xuICB0ZXh0LWRlY29yYXRpb246IG5vbmU7XG59XG5cbi5uby1saW5rLXVuZGVybGluZSB7XG4gIHRleHQtZGVjb3JhdGlvbjogbm9uZTtcbn1cblxuLmltZy1jZW50ZXIge1xuICBtYXJnaW46IDAgYXV0bztcbn1cblxuLmJ0bi1jdGEge1xuICBmb250LXNpemU6IDQwcHg7XG59XG5cbi5zaGFkb3cge1xuICB3aGl0ZS1zcGFjZTogbm9ybWFsO1xuICAtd2Via2l0LWJveC1zaGFkb3c6IDJweCA0cHggMXB4IHJnYmEoMCwgMCwgMCwgMC4zKTtcbiAgLW1vei1ib3gtc2hhZG93OiAgICAycHggNHB4IDFweCByZ2JhKDAsIDAsIDAsIDAuMyk7XG4gIGJveC1zaGFkb3c6ICAgICAgICAgMnB4IDRweCAxcHggcmdiYSgwLCAwLCAwLCAwLjMpO1xufVxuXG4uYnRuLW5hdiB7XG4gIG1hcmdpbi10b3A6IDEwcHg7XG59XG5cbnVsIHtcbiAgbGlzdC1zdHlsZTogbm9uZTtcbn1cblxuLnBhbmVsLWhlYWRpbmcge1xuICBmb250LXNpemU6IDI1cHg7XG59XG5cbi5wYW5lbC1oZWFkaW5nID4gaDEge1xuICBmb250LXNpemU6IDI1cHg7XG4gIHBhZGRpbmc6IDJweDtcbiAgbWFyZ2luOiAycHg7XG59XG5cbi5uYXZiYXItYnJhbmQge1xuICBmb250LXNpemU6IDI2cHg7XG59XG5cbi5uYXZiYXIgPiAuY29udGFpbmVyIHtcbiAgd2lkdGg6IGF1dG87XG4gIHBhZGRpbmctbGVmdDogMHB4O1xuICBwYWRkaW5nLXJpZ2h0OiAwcHg7XG59XG5cbi5uYXYtaGVpZ2h0IHtcbiAgaGVpZ2h0OiA1MHB4O1xuICBib3JkZXI6IG5vbmU7XG59XG5cbi5sYW5kaW5nLWljb24ge1xuICBoZWlnaHQ6IDIwMHB4O1xuICB3aWR0aDogMjAwcHg7XG59XG5cbi5jb21wbGV0aW9uLWljb24ge1xuICBmb250LXNpemU6IDE1MHB4O1xufVxuXG4ucG9zaXRpdmUtMTUge1xuICBtYXJnaW4tdG9wOiAxNXB4O1xufVxuXG4ucG9zaXRpdmUtMjAge1xuICBtYXJnaW4tdG9wOiAyMHB4O1xufVxuXG4ucG9zaXRpdmUtMTUtYm90dG9tIHtcbiAgbWFyZ2luLWJvdHRvbTogMTVweDtcbn1cblxuLnBvc2l0aXZlLTEwIHtcbiAgbWFyZ2luLXRvcDogMTBweDtcbn1cblxuLnBvc2l0aXZlLTUge1xuICBtYXJnaW4tdG9wOiA1cHg7XG59XG5cbi5uZWdhdGl2ZS01IHtcbiAgbWFyZ2luLXRvcDogLTVweDtcbn1cblxuLm5lZ2F0aXZlLTEwIHtcbiAgbWFyZ2luLXRvcDogLTEwcHg7XG59XG5cbi5uZWdhdGl2ZS0xNSB7XG4gIG1hcmdpbi10b3A6IC0xNXB4O1xufVxuXG4ubmVnYXRpdmUtMjAge1xuICBtYXJnaW4tdG9wOiAtMjBweDtcbn1cblxuLm5lZ2F0aXZlLTI4IHtcbiAgbWFyZ2luLXRvcDogLTI4cHg7XG59XG5cbi5uZWdhdGl2ZS0zMCB7XG4gIG1hcmdpbi10b3A6IC0zMHB4O1xufVxuXG4ubmVnYXRpdmUtMzAtYm90dG9tIHtcbiAgbWFyZ2luLWJvdHRvbTogLTMwcHg7XG59XG5cbi5uZWdhdGl2ZS0zNSB7XG4gIG1hcmdpbi10b3A6IC0zNXB4O1xufVxuXG4ubmVnYXRpdmUtNTUge1xuICBtYXJnaW4tdG9wOiAtNTVweDtcbiAgbWFyZ2luLWJvdHRvbTogLTU1cHg7XG59XG5cbi5sYXJnZS1wIHtcbiAgZm9udC1zaXplOiAyNHB4O1xufVxuXG4uc21hbGwtcCB7XG4gIGZvbnQtc2l6ZTogMTRweDtcbn1cblxuLm1hcC1wIHtcbiAgZm9udC1zaXplOiAyMHB4O1xufVxuXG4ubWFwLXJvdy1udW1iZXJzIHtcbiAgdGV4dC1hbGlnbjogcmlnaHQ7XG4gIHBhZGRpbmctcmlnaHQ6IDVweDtcbiAgcGFkZGluZy1sZWZ0OiA1cHg7XG59XG5cbi5saW5rLXRhYmxlIHRke1xuICBmb250LXNpemU6IDE2cHg7XG4gIGJvcmRlci10b3A6IG5vbmUgIWltcG9ydGFudDtcbiAgQG1lZGlhIChtaW4td2lkdGg6IDc2N3B4KSB7XG4gICAgZm9udC1zaXplOiAyNHB4O1xuICB9XG59XG5cbi5jYXBpdGFsaXplIHtcbiAgdGV4dC10cmFuc2Zvcm06IGNhcGl0YWxpemU7XG59XG5cbi50ZXh0LXN1Y2Nlc3Mge1xuICBjb2xvcjogQGJyYW5kLXByaW1hcnk7XG59XG5cbi5mYXN0LWFuaW1hdGlvbiB7XG4gIC13ZWJraXQtYW5pbWF0aW9uLWR1cmF0aW9uOiAwLjVzO1xuICBhbmltYXRpb24tZHVyYXRpb246IDAuNXM7XG59XG5cbi5kaXNhYmxlZCB7XG4gIHBvaW50ZXItZXZlbnRzOiBub25lO1xuICBjdXJzb3I6IGRlZmF1bHQ7XG4gIGNvbG9yOiBncmF5dGV4dCAhaW1wb3J0YW50O1xufVxuXG4uaGlkZGVuLWVsZW1lbnQge1xuICBkaXNwbGF5OiBub25lO1xufVxuXG4ubmF2LWxvZ28ge1xuICBoZWlnaHQ6IDQwcHg7XG4gIG1hcmdpbi10b3A6IC0xMHB4O1xuXG4gIEBtZWRpYSAobWF4LXdpZHRoOiAzOTdweCkge1xuICAgIGhlaWdodDogMzBweDtcbiAgICBtYXJnaW4tdG9wOiAtNXB4O1xuICB9XG4gIEBtZWRpYSAobWF4LXdpZHRoOiAzMzVweCkge1xuICAgIGhlaWdodDogMjVweDtcbiAgICBtYXJnaW4tdG9wOiAtMnB4O1xuICB9XG59XG5cbi5uYXZiYXItcmlnaHQge1xuICBAbWVkaWEgKG1pbi13aWR0aDogNzY3cHgpIHtcbiAgICBtYXJnaW4tcmlnaHQ6MDtcbiAgfVxuICBAbWVkaWEgKG1heC13aWR0aDogOTkxcHgpIGFuZCAobWluLXdpZHRoOiA3NjdweCkge1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICBsZWZ0OiAwO1xuICAgIHJpZ2h0OiAwO1xuICAgIG1hcmdpbi1yaWdodDogMHB4O1xuICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gIH1cbiAgYmFja2dyb3VuZC1jb2xvcjogQGJyYW5kLXByaW1hcnk7XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcbn1cbi5uYXZiYXIge1xuICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuICBib3JkZXI6IG5vbmU7XG4gIGxpbmUtaGVpZ2h0OiAxO1xuICBAbWVkaWEgKG1pbi13aWR0aDogNzY3cHgpIHtcbiAgICBwYWRkaW5nLWxlZnQ6IDE1cHg7XG4gICAgcGFkZGluZy1yaWdodDogMzBweDtcbiAgfVxufVxuXG5saS5hdmF0YXIsIGxpLmF2YXRhciA+IGEgeyBwYWRkaW5nOjA7IG1hcmdpbjowIH1cblxuLnRoaW4tcHJvZ3Jlc3MtYmFyIHtcbiAgaGVpZ2h0OiA4cHg7XG4gIG1hcmdpbi10b3A6IDNweDtcbiAgbWFyZ2luLWJvdHRvbTogMHB4O1xuICB3aWR0aDogNjAlO1xuICBtYXJnaW4tcmlnaHQ6IGF1dG87XG4gIG1hcmdpbi1sZWZ0OiBhdXRvO1xufVxuXG4ucGFuZWwtYm9keSB7XG4gIG1hcmdpbi1ib3R0b206IC02cHg7XG59XG5cbi5sYi1jb250YWluZXIge1xuICBwYWRkaW5nOiAwcHg7XG59XG5cbi5idG4tc29jaWFsIHtcbiAgd2lkdGg6IDI1MHB4O1xuICBtYXJnaW46IGF1dG87XG59XG5cbi5idG4tbGluay1zb2NpYWwge1xuICBtYXgtd2lkdGg6IDQwMHB4O1xuICBtYXJnaW46IGF1dG87XG4gIG1hcmdpbi1ib3R0b206IDEwcHg7XG59XG5cbi5uYXZiYXIge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiBAYnJhbmQtcHJpbWFyeTtcbn1cblxuYSB7XG4gIGZvbnQtd2VpZ2h0OiBib2xkO1xufVxuXG5wIHtcbiAgZm9udC1zaXplOiAxNHB4O1xufVxuXG4ubWFwLWFzaWRlLWJvZHkgcCB7XG4gIGxpbmUtaGVpZ2h0OiAxLjg7XG59XG5cbi5uYXZiYXItbmF2ID4gbGkgPiBhIHtcbiAgY29sb3I6IEBib2R5LWJnO1xuICAmOmhvdmVyIHtcbiAgICBjb2xvcjogQGJyYW5kLXByaW1hcnk7XG4gIH1cbn1cblxuLmh1Zy10b3Age1xuICBtYXJnaW4tdG9wOiAtMzVweDtcbiAgbWFyZ2luLWJvdHRvbTogLTEwcHg7XG59XG5cbi5ub25wcm9maXQtbGFuZGluZyB7XG4gIGZvbnQtc2l6ZTogNTBweDtcbn1cblxuLmJpZy10ZXh0IHtcbiAgZm9udC1zaXplOiA2M3B4O1xufVxuXG4uc2lnbnVwLWJ0bi5idG4ge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZhYzMzO1xuICBiYWNrZ3JvdW5kLWltYWdlOiBsaW5lYXItZ3JhZGllbnQoI2ZmY2M0ZCwgI2ZmYWMzMyk7XG4gIC1tcy1maWx0ZXI6IFwicHJvZ2lkOkRYSW1hZ2VUcmFuc2Zvcm0uTWljcm9zb2Z0LmdyYWRpZW50KHN0YXJ0Q29sb3JzdHI9I2ZmY2M0ZCwgIGVuZENvbG9yc3RyPSNmZmFjMzMsICBHcmFkaWVudFR5cGU9MClcIjtcbiAgYm9yZGVyLWNvbG9yOiAjZjFhMDJhO1xuICBjb2xvcjogIzI5MmYzMyAhaW1wb3J0YW50O1xuICB0ZXh0LXNoYWRvdzogMCAxcHggMCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNSk7XG59XG4uc2lnbnVwLWJ0bjpob3ZlciwgLnNpZ251cC1idG46Zm9jdXMge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZTk5MTEwO1xuICBiYWNrZ3JvdW5kLWltYWdlOiBsaW5lYXItZ3JhZGllbnQoI2ZmY2M0ZCwgI2U5OTExMCk7XG4gIC1tcy1maWx0ZXI6IFwicHJvZ2lkOkRYSW1hZ2VUcmFuc2Zvcm0uTWljcm9zb2Z0LmdyYWRpZW50KHN0YXJ0Q29sb3JzdHI9I2ZmY2M0ZCwgIGVuZENvbG9yc3RyPSNlOTkxMTAsICBHcmFkaWVudFR5cGU9MClcIjtcbiAgYm9yZGVyLWNvbG9yOiAjZWM4YjExO1xuICBjb2xvcjogIzI5MmYzMyAhaW1wb3J0YW50O1xufVxuLnNpZ251cC1idG46YWN0aXZlIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2YyYTMzMDtcbiAgYmFja2dyb3VuZC1pbWFnZTogbm9uZTtcbiAgYm94LXNoYWRvdzogaW5zZXQgMCAxcHggNHB4IHJnYmEoMCwgMCwgMCwgMC4zKTtcbn1cblxuKiwgKjpiZWZvcmUsICo6YWZ0ZXIge1xuICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3ggIWltcG9ydGFudDtcbn1cblxuLmJ0bi1iaWcge1xuICBmb250LXNpemU6IDIwcHg7XG4gIGJvcmRlci1yYWRpdXM6IDZweDtcbn1cblxuLmJ0bi1iaWdnZXIge1xuICBmb250LXNpemU6IDMwcHg7XG59XG5cbi5iaWctdGV4dC1maWVsZCB7XG4gIGZvbnQtc2l6ZTogMzBweDtcbiAgaGVpZ2h0OiA1N3B4O1xuICBiYWNrZ3JvdW5kLWNvbG9yOiBAYm9keS1iZyAhaW1wb3J0YW50O1xufVxuXG5oNCB7XG4gIGZvbnQtc2l6ZTogMjJweDtcbn1cblxuLm5vLXRyYW5zaXRpb24ge1xuICAtd2Via2l0LXRyYW5zaXRpb246IGhlaWdodCAwLjAwMXM7XG4gIC1tb3otdHJhbnNpdGlvbjogaGVpZ2h0IDAuMDAxcztcbiAgLW1zLXRyYW5zaXRpb246IGhlaWdodCAwLjAwMXM7XG4gIC1vLXRyYW5zaXRpb246IGhlaWdodCAwLjAwMXM7XG4gIHRyYW5zaXRpb246IGhlaWdodCAwLjAwMXM7XG59XG5cbi5tYXJnaW4tbGVmdC0xMCB7XG4gIG1hcmdpbi1sZWZ0OiAxMHB4O1xufVxuXG4uYnRuLXJlc3BvbnNpdmUge1xuICBAbWVkaWEgKG1heC13aWR0aDogNzY4cHgpIHtcbiAgICBmb250LXNpemU6IDE1cHg7XG4gICAgaGVpZ2h0OiAyNi41cHg7XG4gICAgcGFkZGluZy10b3A6IDFweDtcbiAgfVxufVxuXG4uZmllbGQtcmVzcG9uc2l2ZSB7XG4gIEBtZWRpYSAobWF4LXdpZHRoOiA3NjhweCkge1xuICAgIGZvbnQtc2l6ZTogMTVweDtcbiAgICBoZWlnaHQ6IDI2LjVweDtcbiAgfVxufVxuXG50aGVhZCB7XG4gIGZvbnQtc2l6ZTogMTUwJTtcbn1cblxuLm5vd3JhcCB7XG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XG59XG5cbi5iaWctYnJlYWsge1xuICBtYXJnaW4tdG9wOiA1MHB4O1xuICBtYXJnaW4tYm90dG9tOiA1MHB4O1xufVxuXG4ucHJvZmlsZS1waWN0dXJlIHtcbiAgaGVpZ2h0OiA1MHB4O1xuICB3aWR0aDogNTBweDtcbn1cblxuLmJyb3duaWUtcG9pbnRzLW5hdiB7XG4gIEBtZWRpYSAobWluLXdpZHRoOiA5OTFweCkgYW5kIChtYXgtd2lkdGg6IDk5OXB4KSB7XG4gICAgbWFyZ2luLXJpZ2h0OiAtMTBweDtcbiAgfVxufVxuXG4ubmF2YmFyLW5hdiBhIHtcbiAgY29sb3I6IEBib2R5LWJnO1xuICBmb250LXNpemU6IDIwcHg7XG4gIG1hcmdpbi10b3A6IC01cHg7XG4gIG1hcmdpbi1ib3R0b206IC01cHg7XG59XG5cbi5uYXZiYXItdG9nZ2xlIHtcbiAgY29sb3I6IEBib2R5LWJnO1xuXG4gICY6aG92ZXIsXG4gICY6Zm9jdXMge1xuICAgIGNvbG9yOiAjNGEyYjBmO1xuICB9XG59XG5cblxuLnNpZ251cC1idG4tbmF2IHtcbiAgbWFyZ2luLXRvcDogLTJweCAhaW1wb3J0YW50O1xuICBwYWRkaW5nLXRvcDogMTBweCAhaW1wb3J0YW50O1xuICBwYWRkaW5nLWJvdHRvbTogMTBweCAhaW1wb3J0YW50O1xuICBtYXJnaW4tcmlnaHQ6IC0xMnB4O1xuICBAbWVkaWEgKG1pbi13aWR0aDogOTkxcHgpIGFuZCAobWF4LXdpZHRoOiAxMDEwcHgpIHtcbiAgICBtYXJnaW4tbGVmdDogLTEwcHg7XG4gICAgbWFyZ2luLXJpZ2h0OiAtNXB4O1xuICB9XG59XG5cbi5wdWJsaWMtcHJvZmlsZS1pbWcge1xuICBoZWlnaHQ6IDIwMHB4O1xuICB3aWR0aDogMjAwcHg7XG4gIGJvcmRlci1yYWRpdXM6IDVweDtcbn1cblxuLm5nLWludmFsaWQubmctZGlydHkge1xuICBib3JkZXItY29sb3I6ICNGQTc4N0U7XG59XG4ubmctdmFsaWQubmctZGlydHkge1xuICBib3JkZXItY29sb3I6ICM3OEZBODk7XG59XG5cbi5mbGF0LXRvcCB7XG4gIG1hcmdpbi10b3A6IC01cHg7XG59XG5cbi5uZWdhdGl2ZS1ib3R0b20ge1xuICBtYXJnaW4tYm90dG9tOiAtMjBweDtcbn1cblxuLm1pbi1oZWlnaHQtMTAwMCB7XG4gIG1pbi1oZWlnaHQ6IDEwMDBweDtcbn1cblxuLnBvaW50cy1vbi10b3Age1xuICBjb2xvcjogQGJvZHktYmc7XG4gIGZvbnQtc2l6ZTogMzVweDtcbiAgei1pbmRleDogMjtcbiAgd2lkdGg6IDYwJTtcbiAgbWFyZ2luOiAwIGF1dG87XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgdG9wOiA1MCU7XG4gIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC01MCUpO1xuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTUwJSk7XG59XG5cbi5sYW5kaW5nLXNraWxsLWljb24ge1xuICBjb2xvcjogQGJyYW5kLXByaW1hcnk7XG4gIGZvbnQtc2l6ZTogMTUwcHg7XG59XG5cbi5jdXN0b20tbGFuZGluZy1za2lsbC1pY29uIHtcbiAgbWFyZ2luLXRvcDogLTE1cHg7XG4gIHBhZGRpbmctYm90dG9tOiAxNXB4O1xufVxuXG4uYmxhY2stdGV4dCB7XG4gIGNvbG9yOiAjMzMzO1xuICBmb250LXdlaWdodDogNDAwO1xuICBmb250LXNpemU6IDQwcHg7XG59XG5cbi5mb250LWF3ZXNvbWUtcGFkZGluZyB7XG4gIG1hcmdpbi10b3A6IDQ1cHg7XG4gIG1hcmdpbi1ib3R0b206IDIwcHg7XG59XG5cbi5iYWNrZ3JvdW5kLXN2ZyB7XG4gIHdpZHRoOiAyMjBweDtcbiAgaGVpZ2h0OiAyMjBweDtcbiAgYmFja2dyb3VuZC1pbWFnZTogdXJsKFwiL2ltYWdlcy9jZXJ0aWZpY2F0ZS1pY29uLnN2Z1wiKTtcbiAgYmFja2dyb3VuZC1zaXplOiAxMjAlO1xuICBiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0O1xuICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiBjZW50ZXI7XG59XG5cbi50ZXN0aW1vbmlhbC1pbWFnZSB7XG4gIGJvcmRlci1yYWRpdXM6IDVweDtcbiAgaGVpZ2h0OiAyMDBweDtcbiAgd2lkdGg6IDIwMHB4O1xuICBjb2xvcjogIzAwOTkwMFxufVxuXG4udGVzdGltb25pYWwtaW1hZ2Utam9icyB7XG4gIGJvcmRlci1yYWRpdXM6IDVweDtcbiAgY29sb3I6ICMwMDk5MDBcbn1cblxuXG4uZGVmYXVsdC1ib3JkZXItcmFkaXVzIHtcbiAgYm9yZGVyLXJhZGl1czogNXB4O1xufVxuXG4uaGVpZ2h0LTUwMCB7XG4gIGhlaWdodDogNTAwcHg7XG59XG5cbi5oZWlnaHQtNDAwIHtcbiAgaGVpZ2h0OiA0MDBweDtcbn1cblxuLnRlc3RpbW9uaWFsLWNvcHkge1xuICB0ZXh0LWFsaWduOiBqdXN0aWZ5O1xuICBmb250LXNpemU6IDE4cHggIWltcG9ydGFudDtcbiAgbWFyZ2luLWxlZnQ6IDIwcHg7XG4gIG1hcmdpbi1yaWdodDogMjBweDtcbiAgQG1lZGlhIChtaW4td2lkdGg6IDk5MXB4KSBhbmQgKG1heC13aWR0aDogMTE5OXB4KSB7XG4gICAgaGVpZ2h0OiAxNTBweDtcbiAgfVxuICBAbWVkaWEgKG1pbi13aWR0aDogMTIwMHB4KSB7XG4gICAgaGVpZ2h0OiAxMDBweDtcbiAgfVxufVxuXG4ubm9ucHJvZml0LXRlc3RpbW9uaWFsLWNvcHkge1xuICB0ZXh0LWFsaWduOiBqdXN0aWZ5O1xuICBmb250LXNpemU6IDE4cHggIWltcG9ydGFudDtcbiAgbWFyZ2luLWxlZnQ6IDIwcHg7XG4gIG1hcmdpbi1yaWdodDogMjBweDtcbiAgQG1lZGlhIChtaW4td2lkdGg6IDk5MXB4KSBhbmQgKG1heC13aWR0aDogMTE5OXB4KSB7XG4gICAgaGVpZ2h0OiAzMDBweCAhaW1wb3J0YW50O1xuICB9XG4gIEBtZWRpYSAobWluLXdpZHRoOiAxMjAwcHgpIHtcbiAgICBoZWlnaHQ6IDIwMHB4ICFpbXBvcnRhbnQ7XG4gIH1cbn1cblxuLm5hdmJhci1jb2xsYXBzZSB7XG4gIGJvcmRlci10b3A6IDA7XG59XG5cbi5jaGFsbGVuZ2UtbGlzdC1oZWFkZXIge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiBAYnJhbmQtcHJpbWFyeTtcbiAgY29sb3I6IEBncmF5LWxpZ2h0ZXI7XG4gIGZvbnQtc2l6ZTogMzZweDtcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xuICBtYXJnaW4tYm90dG9tOiAtMzBweDtcbiAgYm9yZGVyLXJhZGl1czogNXB4IDVweCAwcHggMHB4O1xuICBwYWRkaW5nLWxlZnQ6IDUwcHg7XG59XG5cbi5jbG9zaW5nLXgge1xuICBjb2xvcjogQGdyYXktbGlnaHRlcjtcbiAgZm9udC1zaXplOiA1MHB4O1xuICB0ZXh0LWFsaWduOiByaWdodDtcbn1cblxuLmZjYy1mb290ZXIge1xuICB3aWR0aDogMTAwJTtcbiAgaGVpZ2h0OiA1MHB4O1xuICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gIGJhY2tncm91bmQtY29sb3I6IEBicmFuZC1wcmltYXJ5O1xuICBwYWRkaW5nOiAxMnB4O1xuICBib3R0b206IDA7XG4gIGxlZnQ6IDA7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgYSB7XG4gICAgZm9udC1zaXplOiAyMHB4O1xuICAgIGNvbG9yOiBAZ3JheS1saWdodGVyO1xuICAgIG1hcmdpbi1sZWZ0OiAwcHg7XG4gICAgbWFyZ2luLXJpZ2h0OiAwcHg7XG4gICAgcGFkZGluZy1sZWZ0OiAxMHB4O1xuICAgIHBhZGRpbmctcmlnaHQ6IDEwcHg7XG4gICAgcGFkZGluZy10b3A6IDE0cHg7XG4gICAgcGFkZGluZy1ib3R0b206IDEycHg7XG4gICAgJjpob3ZlciB7XG4gICAgICBjb2xvcjogQGJyYW5kLXByaW1hcnk7XG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAZ3JheS1saWdodGVyO1xuICAgICAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xuICAgIH1cbiAgfVxufVxuXG4uZW1iZWQtcmVzcG9uc2l2ZS10d2l0Y2gtY2hhdCB7XG4gIHBhZGRpbmctYm90dG9tOiAxMTclO1xufVxuXG4jZGlyZWN0aW9ucyB7XG4gIHRleHQtYWxpZ246IGxlZnQ7XG4gIGZvbnQtc2l6ZTogMTVweDtcbn1cblxuLmdyYXBoLXJlY3Qge1xuICBmaWxsOiAjZGRkICFpbXBvcnRhbnRcbn1cblxuXG4vKipcbiAqIEJvbmZpcmUgc3R5bGluZ1xuICovXG5cbmZvcm0uY29kZSBzcGFuIHtcbiAgZm9udC1zaXplOiAxOHB4O1xuICBmb250LWZhbWlseTogXCJVYnVudHUgTW9ub1wiO1xuICBwYWRkaW5nLWJvdHRvbTogMHB4O1xuICBtYXJnaW4tYm90dG9tOiAwcHg7XG4gIGhlaWdodDogMTAwJTtcbn1cblxuLkNvZGVNaXJyb3Ige1xuICBsaW5lLWhlaWdodDogMSAhaW1wb3J0YW50O1xufVxuXG4uQ29kZU1pcnJvci1saW5lbnVtYmVyIHtcbiAgZm9udC1zaXplOiAxOHB4O1xuICBmb250LWZhbWlseTogXCJVYnVudHUgTW9ub1wiO1xufVxuXG4jbWFpbkVkaXRvclBhbmVsIHtcbiAgaGVpZ2h0OiAxMDAlO1xuICB3aWR0aDogOTklO1xufVxuXG4uc2Nyb2xsLWxvY2tlciB7XG4gIG92ZXJmbG93LXg6IGhpZGRlbjtcbiAgb3ZlcmZsb3cteTogYXV0bztcbn1cblxuI21haW5FZGl0b3JQYW5lbCAucGFuZWwtYm9keSB7XG4gIHBhZGRpbmctYm90dG9tOiAwcHg7XG59XG5cbmRpdi5Db2RlTWlycm9yLXNjcm9sbCB7XG4gIHBhZGRpbmctYm90dG9tOiAzMHB4O1xufVxuXG4udGVzdC12ZXJ0aWNhbC1jZW50ZXIge1xuICBtYXJnaW4tdG9wOiA4cHg7XG59XG5cbi5jbS1zLW1vbm9rYWkuQ29kZU1pcnJvciB7XG4gIGJvcmRlci1yYWRpdXM6IDVweDtcbn1cbi5jb3Vyc2V3YXJlLWhlaWdodCB7XG4gIG1pbi1oZWlnaHQ6IDY1MHB4O1xufVxuXG4uYnRuIHtcbiAgZm9udC13ZWlnaHQ6IDQwMDtcbiAgd2hpdGUtc3BhY2U6IG5vcm1hbDtcbiAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG5cbiAgLXdlYmtpdC10cmFuc2l0aW9uOiBiYWNrZ3JvdW5kIC4ycyBlYXNlLWluLW91dCwgYm9yZGVyIC4ycyBlYXNlLWluLW91dDtcbiAgLW1vei10cmFuc2l0aW9uOiBiYWNrZ3JvdW5kIC4ycyBlYXNlLWluLW91dCwgYm9yZGVyIC4ycyBlYXNlLWluLW91dDtcbiAgLW1zLXRyYW5zaXRpb246IGJhY2tncm91bmQgLjJzIGVhc2UtaW4tb3V0LCBib3JkZXIgLjJzIGVhc2UtaW4tb3V0O1xuICAtby10cmFuc2l0aW9uOiBiYWNrZ3JvdW5kIC4ycyBlYXNlLWluLW91dCwgYm9yZGVyIC4ycyBlYXNlLWluLW91dDtcbiAgdHJhbnNpdGlvbjogYmFja2dyb3VuZCAuMnMgZWFzZS1pbi1vdXQsIGJvcmRlciAuMnMgZWFzZS1pbi1vdXQ7XG59XG5cbi5wb3B1bGF0aW9uLXRhYmxlIHtcbiAgZm9udC1zaXplOjMwcHg7XG4gIHdpZHRoOjQ2MHB4O1xuICBtYXJnaW46MCBhdXRvO1xuICBwYWRkaW5nOjA7XG4gIGgyIHtcbiAgICBtYXJnaW46MDtcbiAgICB0ZXh0LWFsaWduOiBsZWZ0O1xuICB9XG4gIC50YWcge1xuICAgICAgd2lkdGg6MTY1cHg7XG4gICAgICBkaXNwbGF5OmlubGluZS1ibG9jaztcbiAgfVxuICAudGV4dC1wcmltYXJ5IHtcbiAgICAgIG1hcmdpbi1yaWdodDo1cHg7XG4gIH1cbiAgQG1lZGlhIChtYXgtd2lkdGg6IDc2N3B4KSB7XG4gICAgZm9udC1zaXplOiAxNnB4O1xuICAgIHdpZHRoOiAyNjBweDtcbiAgICAudGFnIHtcbiAgICAgIHdpZHRoOjk1cHg7XG4gICAgfVxuICB9XG59XG5cbkBtZWRpYSAobWF4LXdpZHRoOiA5OTFweCkge1xuICAubmF2YmFyLWhlYWRlciB7XG4gICAgZmxvYXQ6IG5vbmU7XG4gIH1cblxuICAubmF2YmFyLXRvZ2dsZSB7XG4gICAgZGlzcGxheTogYmxvY2s7XG4gIH1cblxuICAubmF2YmFyLWNvbGxhcHNlLmNvbGxhcHNlIHtcbiAgICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7XG4gIH1cblxuICAubmF2YmFyLW5hdiB7XG4gICAgbWFyZ2luLXRvcDogMDtcbiAgfVxuXG4gIC5uYXZiYXItbmF2ID4gbGkge1xuICAgIGZsb2F0OiBub25lO1xuICB9XG5cbiAgLm5hdmJhci1uYXYgPiBsaSA+IGEge1xuICAgIHBhZGRpbmctdG9wOiAxMHB4O1xuICAgIHBhZGRpbmctYm90dG9tOiAxMHB4O1xuICB9XG5cbiAgLm5hdmJhci10ZXh0IHtcbiAgICBmbG9hdDogbm9uZTtcbiAgICBtYXJnaW46IDE1cHggMDtcbiAgfVxuXG4gIC8qIHNpbmNlIDMuMS4wICovXG4gIC5uYXZiYXItY29sbGFwc2UuY29sbGFwc2UuaW4ge1xuICAgIGRpc3BsYXk6IGJsb2NrICFpbXBvcnRhbnQ7XG4gIH1cblxuICAuY29sbGFwc2luZyB7XG4gICAgb3ZlcmZsb3c6IGhpZGRlbiAhaW1wb3J0YW50O1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICBsZWZ0OiAwO1xuICAgIHJpZ2h0OiAwO1xuICB9XG59XG5cbi5uYXZiYXItdG9nZ2xlIHtcbiAgd2lkdGg6IDgwcHg7XG4gIHBhZGRpbmctbGVmdDogMDtcbiAgcGFkZGluZy1yaWdodDogOHB4O1xuICBtYXJnaW46IDdweCAycHggN3B4IDA7XG4gIHRleHQtYWxpZ246IGxlZnQ7XG4gIGZvbnQtc2l6ZTogMTBweDtcbn1cblxuLmhhbWJ1cmdlci10ZXh0IHtcbiAgbGluZS1oZWlnaHQ6IDAuNzVlbTtcbiAgbWFyZ2luLXRvcDogMTBweDtcbiAgZm9udC1zaXplOiAxOHB4O1xufVxuXG4uc3RvcnktbGlzdCB7XG4gIHBhZGRpbmctYm90dG9tOiAzMHB4O1xuICBtYXJnaW4tYm90dG9tOiAzMHB4O1xufVxuXG4uYnV0dG9uLXNwYWNlciB7XG4gIHBhZGRpbmc6IDVweCAwO1xufVxuXG4uc3BhY2VyIHtcbiAgcGFkZGluZzogMTVweCAwIDE1cHggMDtcbn1cblxuLmltZy1uZXdzIHtcbiAgd2lkdGg6IDUwcHg7XG4gIGhlaWdodDogNTBweDtcbn1cblxuLnVybC1wcmV2aWV3IHtcbiAgbWF4LXdpZHRoOiAyNTBweDtcbiAgbWF4LWhlaWdodDogMjUwcHg7XG59XG5cbi8vLm1lZGlhIH4gLm1lZGlhIC5tZWRpYS1ib2R5LXdyYXBwZXI6bnRoLWNoaWxkKG9kZCkge1xuLy8gIGJhY2tncm91bmQtY29sb3I6ICNlNWU1ZTU7XG4vL31cblxuLm5ld3MtYm94IHtcbiAgQG1lZGlhIChtaW4td2lkdGg6IDc2OHB4KSB7XG4gICAgbWFyZ2luLXRvcDogLTQwcHg7XG4gIH1cbiAgQG1lZGlhIChtYXgtd2lkdGg6IDc2N3B4KSB7XG4gICAgcGFkZGluZzogNXB4O1xuICAgIGJvcmRlci1jb2xvcjogQGJyYW5kLWluZm87XG4gICAgYm9yZGVyLXdpZHRoOiAxcHg7XG4gICAgYm9yZGVyLXN0eWxlOiBzb2xpZDtcbiAgICBib3JkZXItcmFkaXVzOiA1cHg7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgZmxvYXQ6IGxlZnQ7XG4gIH1cbn1cblxuLm5ld3MtYm94LXNlYXJjaCB7XG4gIEBtZWRpYSAobWluLXdpZHRoOiA3NjhweCkge1xuICAgIG1hcmdpbi10b3A6IC0zMHB4O1xuICAgIHBhZGRpbmctYm90dG9tOiAyMHB4O1xuICB9XG4gIEBtZWRpYSAobWF4LXdpZHRoOiA3NjdweCkge1xuICAgIHBhZGRpbmc6IDVweDtcbiAgICBib3JkZXItY29sb3I6IEBicmFuZC1pbmZvO1xuICAgIGJvcmRlci13aWR0aDogMXB4O1xuICAgIGJvcmRlci1zdHlsZTogc29saWQ7XG4gICAgYm9yZGVyLXJhZGl1czogNXB4O1xuICAgIHdpZHRoOiAxMDAlO1xuICAgIGZsb2F0OiBsZWZ0O1xuICB9XG59XG5cbi5zdG9yeS1oZWFkbGluZSB7XG4gIGZvbnQtc2l6ZTogMjBweDtcbiAgbWFyZ2luLWxlZnQ6IDE0cHg7XG4gIG1hcmdpbi10b3A6IC01cHg7XG59XG5cbi5sYW5kaW5nLWhlYWRpbmcge1xuICBmb250LXNpemU6IDUwcHggIWltcG9ydGFudDtcbiAgZm9udC1mYW1pbHk6IEdlb3JnaWE7XG59XG5cbi5tb2JpbGUtc3RvcnktaGVhZGxpbmUge1xuICBmb250LXNpemU6IDIwcHg7XG59XG5cbi5zdG9yeS1ieWxpbmUge1xuICBtYXJnaW4tdG9wOiA1cHg7XG4gIGZvbnQtc2l6ZTogMTRweDtcbn1cblxuLm1lZGlhLXN0b3JpZXMge1xuICBtYXJnaW4tbGVmdDogMjBweDtcbn1cblxuaHIge1xuICBib3JkZXI6IDA7XG4gIGhlaWdodDogMXB4O1xuICBiYWNrZ3JvdW5kLWltYWdlOiBsaW5lYXItZ3JhZGllbnQodG8gcmlnaHQsIHJnYmEoMCwgMCwgMCwgMCksIHJnYmEoMCwgMCwgMCwgMC43NSksIHJnYmEoMCwgMCwgMCwgMCkpO1xufVxuXG4uYmlnLXNwYWNlciB7XG4gIHBhZGRpbmc6IDMwcHggMCAzMHB4IDA7XG59XG5cbiNyZXBseS10by1tYWluLXBvc3QsICN1cHZvdGUge1xuICBjdXJzb3I6IHBvaW50ZXI7XG59XG5cbi5idG4tbm8tc2hhZG93IHtcbiAgLXdlYmtpdC1ib3gtc2hhZG93OiAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDApO1xuICAtbW96LWJveC1zaGFkb3c6ICAgIDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMCk7XG4gIGJveC1zaGFkb3c6ICAgICAgICAgMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwKTtcbn1cblxuLmRvdHRlZC11bmRlcmxpbmUge1xuICBib3JkZXItYm90dG9tOiBkYXNoZWQgMXB4IEBicmFuZC1zdWNjZXNzO1xufVxuXG4uZDMtY2VudGVyZWQge1xuICB3aWR0aDogNzcxcHg7XG4gIG1hcmdpbjogMCBhdXRvO1xufVxuXG4uY2FsLWhlYXRtYXAtY29udGFpbmVyIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogQGJvZHktYmc7XG59XG5cbi5pbnRlcmVzdGVkLWNhbXBlci1pbWFnZSB7XG4gIGhlaWdodDogNTBweDtcbiAgd2lkdGg6IDUwcHg7XG4gIHBhZGRpbmc6IDVweDtcbn1cblxuLm1vYmlsZS1zdG9yeS1pbWFnZSB7XG4gIGJvcmRlci1yYWRpdXM6IDVweDtcbiAgd2lkdGg6IDEwMCU7XG4gIEBtZWRpYSAobWF4LXdpZHRoOiA3NjhweCkge1xuICAgIG1hcmdpbi1yaWdodDogNXB4O1xuICB9XG59XG5cbi5hbGVydCBhIHtcbiAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7XG59XG5cbi5zdGVwLXRleHQge1xuICBsaW5lLWhlaWdodDogMTIwJTtcbiAgcGFkZGluZy1ib3R0b206IDEwcHg7XG59XG5cbi5mYWRlZCB7XG4gIG9wYWNpdHk6IDAuNTtcbn1cblxuLnNsaWdodGx5LWZhZGVkIHtcbiAgb3BhY2l0eTogMC43NTtcbn1cblxuLnBhZGRlZC1pb25pYy1pY29uIHtcbiAgcGFkZGluZy10b3A6IDVweDtcbn1cblxuLmNoZWNrbGlzdC1lbGVtZW50IHtcbiAgICBtYXJnaW4tbGVmdDogLTYwcHg7XG4gICAgbWFyZ2luLXJpZ2h0OiAtMjBweDtcbn1cblxuLnByb2ZpbGUtc29jaWFsLWljb25zIHtcbiAgbWFyZ2luLWxlZnQ6IDhweDtcbn1cblxuLmJvcmRlci1yYWRpdXMtNSB7XG4gIGJvcmRlci1yYWRpdXM6IDVweDtcbn1cblxuY29kZSB7XG4gIHBhZGRpbmc6IDA7XG59XG5cbkBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1pbi13aWR0aDogOTkzcHgpIHtcbiAgLmlmcmFtZS1zY3JvbGwge1xuICAgIHotaW5kZXg6IDE7XG4gIH1cbn1cbkBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1heC13aWR0aDogOTkycHgpIHtcbiAgLmlmcmFtZS1zY3JvbGwge1xuICAgIGhlaWdodDogYXV0bztcbiAgICBvdmVyZmxvdzogYXV0bztcbiAgfVxufVxuXG4vLyBDYWxjdWxhdG9yIHN0eWxlc1xuXG4uY2hhcnQgcmVjdCB7XG4gIGZpbGw6IHN0ZWVsYmx1ZTtcbn1cblxuLmNoYXJ0IHRleHQge1xuICBmb250LXNpemU6IDE0cHg7XG4gIHRleHQtYW5jaG9yOiBlbmQ7XG59XG5cbi5heGlzIHBhdGgsXG4uYXhpcyBsaW5lIHtcbiAgZmlsbDogbm9uZTtcbiAgc3Ryb2tlOiAjMTIxNDAxO1xuICBzdHJva2Utd2lkdGg6IDJweDtcbiAgc2hhcGUtcmVuZGVyaW5nOiBjcmlzcEVkZ2VzO1xufVxuXG4uZ2l0dGVyLWNoYXQtZW1iZWQge1xuIHotaW5kZXg6IDIwMDAwICFpbXBvcnRhbnQ7XG59XG5cblxuLy91bmNvbW1lbnQgdGhpcyB0byBzZWUgdGhlIGRpbWVuc2lvbnMgb2YgYWxsIGVsZW1lbnRzIG91dGxpbmVkIGluIHJlZFxuLy8qIHtcbi8vICBib3JkZXItY29sb3I6IHJlZDtcbi8vICBib3JkZXItd2lkdGg6IDFweDtcbi8vICBib3JkZXItc3R5bGU6IHNvbGlkO1xuLy99XG5cbi8vIHNvdXJjZTogaHR0cHM6Ly9naXRodWIuY29tL2psb25nL2Nzcy1zcGlubmVycy9ibG9iL21hc3Rlci9jc3Mvc3Bpbm5lci9pbm5lci1jaXJjbGVzLmNzc1xuLy8gbGljZW5zZSBNSVRcbi8qIDpub3QoOnJlcXVpcmVkKSBoaWRlcyB0aGlzIHJ1bGUgZnJvbSBJRTkgYW5kIGJlbG93ICovXG4uaW5uZXItY2lyY2xlcy1sb2FkZXI6bm90KDpyZXF1aXJlZCkge1xuICAtbW96LXRyYW5zZm9ybTogdHJhbnNsYXRlM2QoMCwgMCwgMCk7XG4gIC1tcy10cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDAsIDAsIDApO1xuICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlM2QoMCwgMCwgMCk7XG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlM2QoMCwgMCwgMCk7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICB3aWR0aDogMTI1cHg7XG4gIGhlaWdodDogMTI1cHg7XG4gIGJhY2tncm91bmQ6IHJnYmEoMjUsIDE2NSwgMTUyLCAwLjUpO1xuICBib3JkZXItcmFkaXVzOiA1MCU7XG4gIG92ZXJmbG93OiBoaWRkZW47XG4gIHRleHQtaW5kZW50OiAtOTk5OXB4O1xuICBtYXJnaW4tdG9wOiAxMCU7XG4gIC8qIEhpZGVzIGlubmVyIGNpcmNsZXMgb3V0c2lkZSBiYXNlIGNpcmNsZSBhdCBzYWZhcmkgKi9cbiAgLXdlYmtpdC1tYXNrLWltYWdlOiB1cmwoZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFBRUFBQUFCQ0FJQUFBQ1FkMVBlQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUFBNUpSRUZVZU5waVlHQmdBQWd3QUFBRUFBR2JBK29KQUFBQUFFbEZUa1N1UW1DQyk7XG59XG4uaW5uZXItY2lyY2xlcy1sb2FkZXI6bm90KDpyZXF1aXJlZCk6YmVmb3JlLCAuaW5uZXItY2lyY2xlcy1sb2FkZXI6bm90KDpyZXF1aXJlZCk6YWZ0ZXIge1xuICBjb250ZW50OiAnJztcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB0b3A6IDA7XG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgd2lkdGg6IDEyNXB4O1xuICBoZWlnaHQ6IDEyNXB4O1xuICBib3JkZXItcmFkaXVzOiA1MCU7XG59XG4uaW5uZXItY2lyY2xlcy1sb2FkZXI6bm90KDpyZXF1aXJlZCk6YmVmb3JlIHtcbiAgLW1vei1hbmltYXRpb246IGlubmVyLWNpcmNsZXMtbG9hZGVyIDNzIGluZmluaXRlO1xuICAtd2Via2l0LWFuaW1hdGlvbjogaW5uZXItY2lyY2xlcy1sb2FkZXIgM3MgaW5maW5pdGU7XG4gIGFuaW1hdGlvbjogaW5uZXItY2lyY2xlcy1sb2FkZXIgM3MgaW5maW5pdGU7XG4gIC1tb3otdHJhbnNmb3JtLW9yaWdpbjogMCA1MCU7XG4gIC1tcy10cmFuc2Zvcm0tb3JpZ2luOiAwIDUwJTtcbiAgLXdlYmtpdC10cmFuc2Zvcm0tb3JpZ2luOiAwIDUwJTtcbiAgdHJhbnNmb3JtLW9yaWdpbjogMCA1MCU7XG4gIGxlZnQ6IDA7XG4gIGJhY2tncm91bmQ6ICNjN2VmY2Y7XG59XG4uaW5uZXItY2lyY2xlcy1sb2FkZXI6bm90KDpyZXF1aXJlZCk6YWZ0ZXIge1xuICAtbW96LWFuaW1hdGlvbjogaW5uZXItY2lyY2xlcy1sb2FkZXIgM3MgMC4ycyByZXZlcnNlIGluZmluaXRlO1xuICAtd2Via2l0LWFuaW1hdGlvbjogaW5uZXItY2lyY2xlcy1sb2FkZXIgM3MgMC4ycyByZXZlcnNlIGluZmluaXRlO1xuICBhbmltYXRpb246IGlubmVyLWNpcmNsZXMtbG9hZGVyIDNzIDAuMnMgcmV2ZXJzZSBpbmZpbml0ZTtcbiAgLW1vei10cmFuc2Zvcm0tb3JpZ2luOiAxMDAlIDUwJTtcbiAgLW1zLXRyYW5zZm9ybS1vcmlnaW46IDEwMCUgNTAlO1xuICAtd2Via2l0LXRyYW5zZm9ybS1vcmlnaW46IDEwMCUgNTAlO1xuICB0cmFuc2Zvcm0tb3JpZ2luOiAxMDAlIDUwJTtcbiAgcmlnaHQ6IDA7XG4gIGJhY2tncm91bmQ6ICNlZWY1ZGI7XG59XG5cbkAtbW96LWtleWZyYW1lcyBpbm5lci1jaXJjbGVzLWxvYWRlciB7XG4gIDAlIHtcbiAgICAtbW96LXRyYW5zZm9ybTogcm90YXRlKDBkZWcpO1xuICAgIHRyYW5zZm9ybTogcm90YXRlKDBkZWcpO1xuICB9XG4gIDUwJSB7XG4gICAgLW1vei10cmFuc2Zvcm06IHJvdGF0ZSgzNjBkZWcpO1xuICAgIHRyYW5zZm9ybTogcm90YXRlKDM2MGRlZyk7XG4gIH1cbiAgMTAwJSB7XG4gICAgLW1vei10cmFuc2Zvcm06IHJvdGF0ZSgwZGVnKTtcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgwZGVnKTtcbiAgfVxufVxuQC13ZWJraXQta2V5ZnJhbWVzIGlubmVyLWNpcmNsZXMtbG9hZGVyIHtcbiAgMCUge1xuICAgIC13ZWJraXQtdHJhbnNmb3JtOiByb3RhdGUoMGRlZyk7XG4gICAgdHJhbnNmb3JtOiByb3RhdGUoMGRlZyk7XG4gIH1cbiAgNTAlIHtcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKDM2MGRlZyk7XG4gICAgdHJhbnNmb3JtOiByb3RhdGUoMzYwZGVnKTtcbiAgfVxuICAxMDAlIHtcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKDBkZWcpO1xuICAgIHRyYW5zZm9ybTogcm90YXRlKDBkZWcpO1xuICB9XG59XG5Aa2V5ZnJhbWVzIGlubmVyLWNpcmNsZXMtbG9hZGVyIHtcbiAgMCUge1xuICAgIC1tb3otdHJhbnNmb3JtOiByb3RhdGUoMGRlZyk7XG4gICAgLW1zLXRyYW5zZm9ybTogcm90YXRlKDBkZWcpO1xuICAgIC13ZWJraXQtdHJhbnNmb3JtOiByb3RhdGUoMGRlZyk7XG4gICAgdHJhbnNmb3JtOiByb3RhdGUoMGRlZyk7XG4gIH1cbiAgNTAlIHtcbiAgICAtbW96LXRyYW5zZm9ybTogcm90YXRlKDM2MGRlZyk7XG4gICAgLW1zLXRyYW5zZm9ybTogcm90YXRlKDM2MGRlZyk7XG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZSgzNjBkZWcpO1xuICAgIHRyYW5zZm9ybTogcm90YXRlKDM2MGRlZyk7XG4gIH1cbiAgMTAwJSB7XG4gICAgLW1vei10cmFuc2Zvcm06IHJvdGF0ZSgwZGVnKTtcbiAgICAtbXMtdHJhbnNmb3JtOiByb3RhdGUoMGRlZyk7XG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZSgwZGVnKTtcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgwZGVnKTtcbiAgfVxufVxuXG5AaW1wb3J0IFwiY2hhdC5sZXNzXCI7XG5AaW1wb3J0IFwiam9icy5sZXNzXCI7XG5AaW1wb3J0IFwiY2hhbGxlbmdlLmxlc3NcIjtcbkBpbXBvcnQgXCJ0b2FzdHIubGVzc1wiO1xuQGltcG9ydCBcIm1hcC5sZXNzXCI7XG5AaW1wb3J0IFwid2lraS5sZXNzXCI7XG5AaW1wb3J0IFwic2lnbmluLmxlc3NcIjtcbiIsIi8vIElvbmljb25zIEZvbnQgUGF0aFxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuQGZvbnQtZmFjZSB7XG4gIGZvbnQtZmFtaWx5OiBAaW9uaWNvbnMtZm9udC1mYW1pbHk7XG4gIHNyYzp1cmwoXCJAe2lvbmljb25zLWZvbnQtcGF0aH0vaW9uaWNvbnMuZW90P3Y9QHtpb25pY29ucy12ZXJzaW9ufVwiKTtcbiAgc3JjOnVybChcIkB7aW9uaWNvbnMtZm9udC1wYXRofS9pb25pY29ucy5lb3Q/dj1Ae2lvbmljb25zLXZlcnNpb259I2llZml4XCIpIGZvcm1hdChcImVtYmVkZGVkLW9wZW50eXBlXCIpLFxuICB1cmwoXCJAe2lvbmljb25zLWZvbnQtcGF0aH0vaW9uaWNvbnMudHRmP3Y9QHtpb25pY29ucy12ZXJzaW9ufVwiKSBmb3JtYXQoXCJ0cnVldHlwZVwiKSxcbiAgdXJsKFwiQHtpb25pY29ucy1mb250LXBhdGh9L2lvbmljb25zLndvZmY/dj1Ae2lvbmljb25zLXZlcnNpb259XCIpIGZvcm1hdChcIndvZmZcIiksXG4gIHVybChcIkB7aW9uaWNvbnMtZm9udC1wYXRofS9pb25pY29ucy5zdmc/dj1Ae2lvbmljb25zLXZlcnNpb259I0lvbmljb25zXCIpIGZvcm1hdChcInN2Z1wiKTtcbiAgZm9udC13ZWlnaHQ6IG5vcm1hbDtcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xufVxuXG4uaW9uIHtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICBmb250LWZhbWlseTogQGlvbmljb25zLWZvbnQtZmFtaWx5O1xuICBzcGVhazogbm9uZTtcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xuICBmb250LXdlaWdodDogbm9ybWFsO1xuICBmb250LXZhcmlhbnQ6IG5vcm1hbDtcbiAgdGV4dC10cmFuc2Zvcm06IG5vbmU7XG4gIHRleHQtcmVuZGVyaW5nOiBhdXRvO1xuICBsaW5lLWhlaWdodDogMTtcbiAgLXdlYmtpdC1mb250LXNtb290aGluZzogYW50aWFsaWFzZWQ7XG4gIC1tb3otb3N4LWZvbnQtc21vb3RoaW5nOiBncmF5c2NhbGU7XG59IiwiLyohXG5Jb25pY29ucywgdjIuMC4wXG5DcmVhdGVkIGJ5IEJlbiBTcGVycnkgZm9yIHRoZSBJb25pYyBGcmFtZXdvcmssIGh0dHA6Ly9pb25pY29ucy5jb20vXG5odHRwczovL3R3aXR0ZXIuY29tL2JlbmpzcGVycnkgIGh0dHBzOi8vdHdpdHRlci5jb20vaW9uaWNmcmFtZXdvcmtcbk1JVCBMaWNlbnNlOiBodHRwczovL2dpdGh1Yi5jb20vZHJpZnR5Y28vaW9uaWNvbnNcbiovXG4vLyBJb25pY29ucyBWYXJpYWJsZXNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbkBpb25pY29ucy1mb250LXBhdGg6IFwiLi4vZm9udHNcIjtcbkBpb25pY29ucy1mb250LWZhbWlseTogXCJJb25pY29uc1wiO1xuQGlvbmljb25zLXZlcnNpb246IFwiMi4wLjBcIjtcbkBpb25pY29ucy1wcmVmaXg6IGlvbi07XG5cbkBpb25pY29uLXZhci1hbGVydDogXCJcXGYxMDFcIjtcbkBpb25pY29uLXZhci1hbGVydC1jaXJjbGVkOiBcIlxcZjEwMFwiO1xuQGlvbmljb24tdmFyLWFuZHJvaWQtYWRkOiBcIlxcZjJjN1wiO1xuQGlvbmljb24tdmFyLWFuZHJvaWQtYWRkLWNpcmNsZTogXCJcXGYzNTlcIjtcbkBpb25pY29uLXZhci1hbmRyb2lkLWFsYXJtLWNsb2NrOiBcIlxcZjM1YVwiO1xuQGlvbmljb24tdmFyLWFuZHJvaWQtYWxlcnQ6IFwiXFxmMzViXCI7XG5AaW9uaWNvbi12YXItYW5kcm9pZC1hcHBzOiBcIlxcZjM1Y1wiO1xuQGlvbmljb24tdmFyLWFuZHJvaWQtYXJjaGl2ZTogXCJcXGYyYzlcIjtcbkBpb25pY29uLXZhci1hbmRyb2lkLWFycm93LWJhY2s6IFwiXFxmMmNhXCI7XG5AaW9uaWNvbi12YXItYW5kcm9pZC1hcnJvdy1kb3duOiBcIlxcZjM1ZFwiO1xuQGlvbmljb24tdmFyLWFuZHJvaWQtYXJyb3ctZHJvcGRvd246IFwiXFxmMzVmXCI7XG5AaW9uaWNvbi12YXItYW5kcm9pZC1hcnJvdy1kcm9wZG93bi1jaXJjbGU6IFwiXFxmMzVlXCI7XG5AaW9uaWNvbi12YXItYW5kcm9pZC1hcnJvdy1kcm9wbGVmdDogXCJcXGYzNjFcIjtcbkBpb25pY29uLXZhci1hbmRyb2lkLWFycm93LWRyb3BsZWZ0LWNpcmNsZTogXCJcXGYzNjBcIjtcbkBpb25pY29uLXZhci1hbmRyb2lkLWFycm93LWRyb3ByaWdodDogXCJcXGYzNjNcIjtcbkBpb25pY29uLXZhci1hbmRyb2lkLWFycm93LWRyb3ByaWdodC1jaXJjbGU6IFwiXFxmMzYyXCI7XG5AaW9uaWNvbi12YXItYW5kcm9pZC1hcnJvdy1kcm9wdXA6IFwiXFxmMzY1XCI7XG5AaW9uaWNvbi12YXItYW5kcm9pZC1hcnJvdy1kcm9wdXAtY2lyY2xlOiBcIlxcZjM2NFwiO1xuQGlvbmljb24tdmFyLWFuZHJvaWQtYXJyb3ctZm9yd2FyZDogXCJcXGYzMGZcIjtcbkBpb25pY29uLXZhci1hbmRyb2lkLWFycm93LXVwOiBcIlxcZjM2NlwiO1xuQGlvbmljb24tdmFyLWFuZHJvaWQtYXR0YWNoOiBcIlxcZjM2N1wiO1xuQGlvbmljb24tdmFyLWFuZHJvaWQtYmFyOiBcIlxcZjM2OFwiO1xuQGlvbmljb24tdmFyLWFuZHJvaWQtYmljeWNsZTogXCJcXGYzNjlcIjtcbkBpb25pY29uLXZhci1hbmRyb2lkLWJvYXQ6IFwiXFxmMzZhXCI7XG5AaW9uaWNvbi12YXItYW5kcm9pZC1ib29rbWFyazogXCJcXGYzNmJcIjtcbkBpb25pY29uLXZhci1hbmRyb2lkLWJ1bGI6IFwiXFxmMzZjXCI7XG5AaW9uaWNvbi12YXItYW5kcm9pZC1idXM6IFwiXFxmMzZkXCI7XG5AaW9uaWNvbi12YXItYW5kcm9pZC1jYWxlbmRhcjogXCJcXGYyZDFcIjtcbkBpb25pY29uLXZhci1hbmRyb2lkLWNhbGw6IFwiXFxmMmQyXCI7XG5AaW9uaWNvbi12YXItYW5kcm9pZC1jYW1lcmE6IFwiXFxmMmQzXCI7XG5AaW9uaWNvbi12YXItYW5kcm9pZC1jYW5jZWw6IFwiXFxmMzZlXCI7XG5AaW9uaWNvbi12YXItYW5kcm9pZC1jYXI6IFwiXFxmMzZmXCI7XG5AaW9uaWNvbi12YXItYW5kcm9pZC1jYXJ0OiBcIlxcZjM3MFwiO1xuQGlvbmljb24tdmFyLWFuZHJvaWQtY2hhdDogXCJcXGYyZDRcIjtcbkBpb25pY29uLXZhci1hbmRyb2lkLWNoZWNrYm94OiBcIlxcZjM3NFwiO1xuQGlvbmljb24tdmFyLWFuZHJvaWQtY2hlY2tib3gtYmxhbms6IFwiXFxmMzcxXCI7XG5AaW9uaWNvbi12YXItYW5kcm9pZC1jaGVja2JveC1vdXRsaW5lOiBcIlxcZjM3M1wiO1xuQGlvbmljb24tdmFyLWFuZHJvaWQtY2hlY2tib3gtb3V0bGluZS1ibGFuazogXCJcXGYzNzJcIjtcbkBpb25pY29uLXZhci1hbmRyb2lkLWNoZWNrbWFyay1jaXJjbGU6IFwiXFxmMzc1XCI7XG5AaW9uaWNvbi12YXItYW5kcm9pZC1jbGlwYm9hcmQ6IFwiXFxmMzc2XCI7XG5AaW9uaWNvbi12YXItYW5kcm9pZC1jbG9zZTogXCJcXGYyZDdcIjtcbkBpb25pY29uLXZhci1hbmRyb2lkLWNsb3VkOiBcIlxcZjM3YVwiO1xuQGlvbmljb24tdmFyLWFuZHJvaWQtY2xvdWQtY2lyY2xlOiBcIlxcZjM3N1wiO1xuQGlvbmljb24tdmFyLWFuZHJvaWQtY2xvdWQtZG9uZTogXCJcXGYzNzhcIjtcbkBpb25pY29uLXZhci1hbmRyb2lkLWNsb3VkLW91dGxpbmU6IFwiXFxmMzc5XCI7XG5AaW9uaWNvbi12YXItYW5kcm9pZC1jb2xvci1wYWxldHRlOiBcIlxcZjM3YlwiO1xuQGlvbmljb24tdmFyLWFuZHJvaWQtY29tcGFzczogXCJcXGYzN2NcIjtcbkBpb25pY29uLXZhci1hbmRyb2lkLWNvbnRhY3Q6IFwiXFxmMmQ4XCI7XG5AaW9uaWNvbi12YXItYW5kcm9pZC1jb250YWN0czogXCJcXGYyZDlcIjtcbkBpb25pY29uLXZhci1hbmRyb2lkLWNvbnRyYWN0OiBcIlxcZjM3ZFwiO1xuQGlvbmljb24tdmFyLWFuZHJvaWQtY3JlYXRlOiBcIlxcZjM3ZVwiO1xuQGlvbmljb24tdmFyLWFuZHJvaWQtZGVsZXRlOiBcIlxcZjM3ZlwiO1xuQGlvbmljb24tdmFyLWFuZHJvaWQtZGVza3RvcDogXCJcXGYzODBcIjtcbkBpb25pY29uLXZhci1hbmRyb2lkLWRvY3VtZW50OiBcIlxcZjM4MVwiO1xuQGlvbmljb24tdmFyLWFuZHJvaWQtZG9uZTogXCJcXGYzODNcIjtcbkBpb25pY29uLXZhci1hbmRyb2lkLWRvbmUtYWxsOiBcIlxcZjM4MlwiO1xuQGlvbmljb24tdmFyLWFuZHJvaWQtZG93bmxvYWQ6IFwiXFxmMmRkXCI7XG5AaW9uaWNvbi12YXItYW5kcm9pZC1kcmFmdHM6IFwiXFxmMzg0XCI7XG5AaW9uaWNvbi12YXItYW5kcm9pZC1leGl0OiBcIlxcZjM4NVwiO1xuQGlvbmljb24tdmFyLWFuZHJvaWQtZXhwYW5kOiBcIlxcZjM4NlwiO1xuQGlvbmljb24tdmFyLWFuZHJvaWQtZmF2b3JpdGU6IFwiXFxmMzg4XCI7XG5AaW9uaWNvbi12YXItYW5kcm9pZC1mYXZvcml0ZS1vdXRsaW5lOiBcIlxcZjM4N1wiO1xuQGlvbmljb24tdmFyLWFuZHJvaWQtZmlsbTogXCJcXGYzODlcIjtcbkBpb25pY29uLXZhci1hbmRyb2lkLWZvbGRlcjogXCJcXGYyZTBcIjtcbkBpb25pY29uLXZhci1hbmRyb2lkLWZvbGRlci1vcGVuOiBcIlxcZjM4YVwiO1xuQGlvbmljb24tdmFyLWFuZHJvaWQtZnVubmVsOiBcIlxcZjM4YlwiO1xuQGlvbmljb24tdmFyLWFuZHJvaWQtZ2xvYmU6IFwiXFxmMzhjXCI7XG5AaW9uaWNvbi12YXItYW5kcm9pZC1oYW5kOiBcIlxcZjJlM1wiO1xuQGlvbmljb24tdmFyLWFuZHJvaWQtaGFuZ291dDogXCJcXGYzOGRcIjtcbkBpb25pY29uLXZhci1hbmRyb2lkLWhhcHB5OiBcIlxcZjM4ZVwiO1xuQGlvbmljb24tdmFyLWFuZHJvaWQtaG9tZTogXCJcXGYzOGZcIjtcbkBpb25pY29uLXZhci1hbmRyb2lkLWltYWdlOiBcIlxcZjJlNFwiO1xuQGlvbmljb24tdmFyLWFuZHJvaWQtbGFwdG9wOiBcIlxcZjM5MFwiO1xuQGlvbmljb24tdmFyLWFuZHJvaWQtbGlzdDogXCJcXGYzOTFcIjtcbkBpb25pY29uLXZhci1hbmRyb2lkLWxvY2F0ZTogXCJcXGYyZTlcIjtcbkBpb25pY29uLXZhci1hbmRyb2lkLWxvY2s6IFwiXFxmMzkyXCI7XG5AaW9uaWNvbi12YXItYW5kcm9pZC1tYWlsOiBcIlxcZjJlYlwiO1xuQGlvbmljb24tdmFyLWFuZHJvaWQtbWFwOiBcIlxcZjM5M1wiO1xuQGlvbmljb24tdmFyLWFuZHJvaWQtbWVudTogXCJcXGYzOTRcIjtcbkBpb25pY29uLXZhci1hbmRyb2lkLW1pY3JvcGhvbmU6IFwiXFxmMmVjXCI7XG5AaW9uaWNvbi12YXItYW5kcm9pZC1taWNyb3Bob25lLW9mZjogXCJcXGYzOTVcIjtcbkBpb25pY29uLXZhci1hbmRyb2lkLW1vcmUtaG9yaXpvbnRhbDogXCJcXGYzOTZcIjtcbkBpb25pY29uLXZhci1hbmRyb2lkLW1vcmUtdmVydGljYWw6IFwiXFxmMzk3XCI7XG5AaW9uaWNvbi12YXItYW5kcm9pZC1uYXZpZ2F0ZTogXCJcXGYzOThcIjtcbkBpb25pY29uLXZhci1hbmRyb2lkLW5vdGlmaWNhdGlvbnM6IFwiXFxmMzliXCI7XG5AaW9uaWNvbi12YXItYW5kcm9pZC1ub3RpZmljYXRpb25zLW5vbmU6IFwiXFxmMzk5XCI7XG5AaW9uaWNvbi12YXItYW5kcm9pZC1ub3RpZmljYXRpb25zLW9mZjogXCJcXGYzOWFcIjtcbkBpb25pY29uLXZhci1hbmRyb2lkLW9wZW46IFwiXFxmMzljXCI7XG5AaW9uaWNvbi12YXItYW5kcm9pZC1vcHRpb25zOiBcIlxcZjM5ZFwiO1xuQGlvbmljb24tdmFyLWFuZHJvaWQtcGVvcGxlOiBcIlxcZjM5ZVwiO1xuQGlvbmljb24tdmFyLWFuZHJvaWQtcGVyc29uOiBcIlxcZjNhMFwiO1xuQGlvbmljb24tdmFyLWFuZHJvaWQtcGVyc29uLWFkZDogXCJcXGYzOWZcIjtcbkBpb25pY29uLXZhci1hbmRyb2lkLXBob25lLWxhbmRzY2FwZTogXCJcXGYzYTFcIjtcbkBpb25pY29uLXZhci1hbmRyb2lkLXBob25lLXBvcnRyYWl0OiBcIlxcZjNhMlwiO1xuQGlvbmljb24tdmFyLWFuZHJvaWQtcGluOiBcIlxcZjNhM1wiO1xuQGlvbmljb24tdmFyLWFuZHJvaWQtcGxhbmU6IFwiXFxmM2E0XCI7XG5AaW9uaWNvbi12YXItYW5kcm9pZC1wbGF5c3RvcmU6IFwiXFxmMmYwXCI7XG5AaW9uaWNvbi12YXItYW5kcm9pZC1wcmludDogXCJcXGYzYTVcIjtcbkBpb25pY29uLXZhci1hbmRyb2lkLXJhZGlvLWJ1dHRvbi1vZmY6IFwiXFxmM2E2XCI7XG5AaW9uaWNvbi12YXItYW5kcm9pZC1yYWRpby1idXR0b24tb246IFwiXFxmM2E3XCI7XG5AaW9uaWNvbi12YXItYW5kcm9pZC1yZWZyZXNoOiBcIlxcZjNhOFwiO1xuQGlvbmljb24tdmFyLWFuZHJvaWQtcmVtb3ZlOiBcIlxcZjJmNFwiO1xuQGlvbmljb24tdmFyLWFuZHJvaWQtcmVtb3ZlLWNpcmNsZTogXCJcXGYzYTlcIjtcbkBpb25pY29uLXZhci1hbmRyb2lkLXJlc3RhdXJhbnQ6IFwiXFxmM2FhXCI7XG5AaW9uaWNvbi12YXItYW5kcm9pZC1zYWQ6IFwiXFxmM2FiXCI7XG5AaW9uaWNvbi12YXItYW5kcm9pZC1zZWFyY2g6IFwiXFxmMmY1XCI7XG5AaW9uaWNvbi12YXItYW5kcm9pZC1zZW5kOiBcIlxcZjJmNlwiO1xuQGlvbmljb24tdmFyLWFuZHJvaWQtc2V0dGluZ3M6IFwiXFxmMmY3XCI7XG5AaW9uaWNvbi12YXItYW5kcm9pZC1zaGFyZTogXCJcXGYyZjhcIjtcbkBpb25pY29uLXZhci1hbmRyb2lkLXNoYXJlLWFsdDogXCJcXGYzYWNcIjtcbkBpb25pY29uLXZhci1hbmRyb2lkLXN0YXI6IFwiXFxmMmZjXCI7XG5AaW9uaWNvbi12YXItYW5kcm9pZC1zdGFyLWhhbGY6IFwiXFxmM2FkXCI7XG5AaW9uaWNvbi12YXItYW5kcm9pZC1zdGFyLW91dGxpbmU6IFwiXFxmM2FlXCI7XG5AaW9uaWNvbi12YXItYW5kcm9pZC1zdG9wd2F0Y2g6IFwiXFxmMmZkXCI7XG5AaW9uaWNvbi12YXItYW5kcm9pZC1zdWJ3YXk6IFwiXFxmM2FmXCI7XG5AaW9uaWNvbi12YXItYW5kcm9pZC1zdW5ueTogXCJcXGYzYjBcIjtcbkBpb25pY29uLXZhci1hbmRyb2lkLXN5bmM6IFwiXFxmM2IxXCI7XG5AaW9uaWNvbi12YXItYW5kcm9pZC10ZXh0c21zOiBcIlxcZjNiMlwiO1xuQGlvbmljb24tdmFyLWFuZHJvaWQtdGltZTogXCJcXGYzYjNcIjtcbkBpb25pY29uLXZhci1hbmRyb2lkLXRyYWluOiBcIlxcZjNiNFwiO1xuQGlvbmljb24tdmFyLWFuZHJvaWQtdW5sb2NrOiBcIlxcZjNiNVwiO1xuQGlvbmljb24tdmFyLWFuZHJvaWQtdXBsb2FkOiBcIlxcZjNiNlwiO1xuQGlvbmljb24tdmFyLWFuZHJvaWQtdm9sdW1lLWRvd246IFwiXFxmM2I3XCI7XG5AaW9uaWNvbi12YXItYW5kcm9pZC12b2x1bWUtbXV0ZTogXCJcXGYzYjhcIjtcbkBpb25pY29uLXZhci1hbmRyb2lkLXZvbHVtZS1vZmY6IFwiXFxmM2I5XCI7XG5AaW9uaWNvbi12YXItYW5kcm9pZC12b2x1bWUtdXA6IFwiXFxmM2JhXCI7XG5AaW9uaWNvbi12YXItYW5kcm9pZC13YWxrOiBcIlxcZjNiYlwiO1xuQGlvbmljb24tdmFyLWFuZHJvaWQtd2FybmluZzogXCJcXGYzYmNcIjtcbkBpb25pY29uLXZhci1hbmRyb2lkLXdhdGNoOiBcIlxcZjNiZFwiO1xuQGlvbmljb24tdmFyLWFuZHJvaWQtd2lmaTogXCJcXGYzMDVcIjtcbkBpb25pY29uLXZhci1hcGVydHVyZTogXCJcXGYzMTNcIjtcbkBpb25pY29uLXZhci1hcmNoaXZlOiBcIlxcZjEwMlwiO1xuQGlvbmljb24tdmFyLWFycm93LWRvd24tYTogXCJcXGYxMDNcIjtcbkBpb25pY29uLXZhci1hcnJvdy1kb3duLWI6IFwiXFxmMTA0XCI7XG5AaW9uaWNvbi12YXItYXJyb3ctZG93bi1jOiBcIlxcZjEwNVwiO1xuQGlvbmljb24tdmFyLWFycm93LWV4cGFuZDogXCJcXGYyNWVcIjtcbkBpb25pY29uLXZhci1hcnJvdy1ncmFwaC1kb3duLWxlZnQ6IFwiXFxmMjVmXCI7XG5AaW9uaWNvbi12YXItYXJyb3ctZ3JhcGgtZG93bi1yaWdodDogXCJcXGYyNjBcIjtcbkBpb25pY29uLXZhci1hcnJvdy1ncmFwaC11cC1sZWZ0OiBcIlxcZjI2MVwiO1xuQGlvbmljb24tdmFyLWFycm93LWdyYXBoLXVwLXJpZ2h0OiBcIlxcZjI2MlwiO1xuQGlvbmljb24tdmFyLWFycm93LWxlZnQtYTogXCJcXGYxMDZcIjtcbkBpb25pY29uLXZhci1hcnJvdy1sZWZ0LWI6IFwiXFxmMTA3XCI7XG5AaW9uaWNvbi12YXItYXJyb3ctbGVmdC1jOiBcIlxcZjEwOFwiO1xuQGlvbmljb24tdmFyLWFycm93LW1vdmU6IFwiXFxmMjYzXCI7XG5AaW9uaWNvbi12YXItYXJyb3ctcmVzaXplOiBcIlxcZjI2NFwiO1xuQGlvbmljb24tdmFyLWFycm93LXJldHVybi1sZWZ0OiBcIlxcZjI2NVwiO1xuQGlvbmljb24tdmFyLWFycm93LXJldHVybi1yaWdodDogXCJcXGYyNjZcIjtcbkBpb25pY29uLXZhci1hcnJvdy1yaWdodC1hOiBcIlxcZjEwOVwiO1xuQGlvbmljb24tdmFyLWFycm93LXJpZ2h0LWI6IFwiXFxmMTBhXCI7XG5AaW9uaWNvbi12YXItYXJyb3ctcmlnaHQtYzogXCJcXGYxMGJcIjtcbkBpb25pY29uLXZhci1hcnJvdy1zaHJpbms6IFwiXFxmMjY3XCI7XG5AaW9uaWNvbi12YXItYXJyb3ctc3dhcDogXCJcXGYyNjhcIjtcbkBpb25pY29uLXZhci1hcnJvdy11cC1hOiBcIlxcZjEwY1wiO1xuQGlvbmljb24tdmFyLWFycm93LXVwLWI6IFwiXFxmMTBkXCI7XG5AaW9uaWNvbi12YXItYXJyb3ctdXAtYzogXCJcXGYxMGVcIjtcbkBpb25pY29uLXZhci1hc3RlcmlzazogXCJcXGYzMTRcIjtcbkBpb25pY29uLXZhci1hdDogXCJcXGYxMGZcIjtcbkBpb25pY29uLXZhci1iYWNrc3BhY2U6IFwiXFxmM2JmXCI7XG5AaW9uaWNvbi12YXItYmFja3NwYWNlLW91dGxpbmU6IFwiXFxmM2JlXCI7XG5AaW9uaWNvbi12YXItYmFnOiBcIlxcZjExMFwiO1xuQGlvbmljb24tdmFyLWJhdHRlcnktY2hhcmdpbmc6IFwiXFxmMTExXCI7XG5AaW9uaWNvbi12YXItYmF0dGVyeS1lbXB0eTogXCJcXGYxMTJcIjtcbkBpb25pY29uLXZhci1iYXR0ZXJ5LWZ1bGw6IFwiXFxmMTEzXCI7XG5AaW9uaWNvbi12YXItYmF0dGVyeS1oYWxmOiBcIlxcZjExNFwiO1xuQGlvbmljb24tdmFyLWJhdHRlcnktbG93OiBcIlxcZjExNVwiO1xuQGlvbmljb24tdmFyLWJlYWtlcjogXCJcXGYyNjlcIjtcbkBpb25pY29uLXZhci1iZWVyOiBcIlxcZjI2YVwiO1xuQGlvbmljb24tdmFyLWJsdWV0b290aDogXCJcXGYxMTZcIjtcbkBpb25pY29uLXZhci1ib25maXJlOiBcIlxcZjMxNVwiO1xuQGlvbmljb24tdmFyLWJvb2ttYXJrOiBcIlxcZjI2YlwiO1xuQGlvbmljb24tdmFyLWJvd3RpZTogXCJcXGYzYzBcIjtcbkBpb25pY29uLXZhci1icmllZmNhc2U6IFwiXFxmMjZjXCI7XG5AaW9uaWNvbi12YXItYnVnOiBcIlxcZjJiZVwiO1xuQGlvbmljb24tdmFyLWNhbGN1bGF0b3I6IFwiXFxmMjZkXCI7XG5AaW9uaWNvbi12YXItY2FsZW5kYXI6IFwiXFxmMTE3XCI7XG5AaW9uaWNvbi12YXItY2FtZXJhOiBcIlxcZjExOFwiO1xuQGlvbmljb24tdmFyLWNhcmQ6IFwiXFxmMTE5XCI7XG5AaW9uaWNvbi12YXItY2FzaDogXCJcXGYzMTZcIjtcbkBpb25pY29uLXZhci1jaGF0Ym94OiBcIlxcZjExYlwiO1xuQGlvbmljb24tdmFyLWNoYXRib3gtd29ya2luZzogXCJcXGYxMWFcIjtcbkBpb25pY29uLXZhci1jaGF0Ym94ZXM6IFwiXFxmMTFjXCI7XG5AaW9uaWNvbi12YXItY2hhdGJ1YmJsZTogXCJcXGYxMWVcIjtcbkBpb25pY29uLXZhci1jaGF0YnViYmxlLXdvcmtpbmc6IFwiXFxmMTFkXCI7XG5AaW9uaWNvbi12YXItY2hhdGJ1YmJsZXM6IFwiXFxmMTFmXCI7XG5AaW9uaWNvbi12YXItY2hlY2ttYXJrOiBcIlxcZjEyMlwiO1xuQGlvbmljb24tdmFyLWNoZWNrbWFyay1jaXJjbGVkOiBcIlxcZjEyMFwiO1xuQGlvbmljb24tdmFyLWNoZWNrbWFyay1yb3VuZDogXCJcXGYxMjFcIjtcbkBpb25pY29uLXZhci1jaGV2cm9uLWRvd246IFwiXFxmMTIzXCI7XG5AaW9uaWNvbi12YXItY2hldnJvbi1sZWZ0OiBcIlxcZjEyNFwiO1xuQGlvbmljb24tdmFyLWNoZXZyb24tcmlnaHQ6IFwiXFxmMTI1XCI7XG5AaW9uaWNvbi12YXItY2hldnJvbi11cDogXCJcXGYxMjZcIjtcbkBpb25pY29uLXZhci1jbGlwYm9hcmQ6IFwiXFxmMTI3XCI7XG5AaW9uaWNvbi12YXItY2xvY2s6IFwiXFxmMjZlXCI7XG5AaW9uaWNvbi12YXItY2xvc2U6IFwiXFxmMTJhXCI7XG5AaW9uaWNvbi12YXItY2xvc2UtY2lyY2xlZDogXCJcXGYxMjhcIjtcbkBpb25pY29uLXZhci1jbG9zZS1yb3VuZDogXCJcXGYxMjlcIjtcbkBpb25pY29uLXZhci1jbG9zZWQtY2FwdGlvbmluZzogXCJcXGYzMTdcIjtcbkBpb25pY29uLXZhci1jbG91ZDogXCJcXGYxMmJcIjtcbkBpb25pY29uLXZhci1jb2RlOiBcIlxcZjI3MVwiO1xuQGlvbmljb24tdmFyLWNvZGUtZG93bmxvYWQ6IFwiXFxmMjZmXCI7XG5AaW9uaWNvbi12YXItY29kZS13b3JraW5nOiBcIlxcZjI3MFwiO1xuQGlvbmljb24tdmFyLWNvZmZlZTogXCJcXGYyNzJcIjtcbkBpb25pY29uLXZhci1jb21wYXNzOiBcIlxcZjI3M1wiO1xuQGlvbmljb24tdmFyLWNvbXBvc2U6IFwiXFxmMTJjXCI7XG5AaW9uaWNvbi12YXItY29ubmVjdGlvbi1iYXJzOiBcIlxcZjI3NFwiO1xuQGlvbmljb24tdmFyLWNvbnRyYXN0OiBcIlxcZjI3NVwiO1xuQGlvbmljb24tdmFyLWNyb3A6IFwiXFxmM2MxXCI7XG5AaW9uaWNvbi12YXItY3ViZTogXCJcXGYzMThcIjtcbkBpb25pY29uLXZhci1kaXNjOiBcIlxcZjEyZFwiO1xuQGlvbmljb24tdmFyLWRvY3VtZW50OiBcIlxcZjEyZlwiO1xuQGlvbmljb24tdmFyLWRvY3VtZW50LXRleHQ6IFwiXFxmMTJlXCI7XG5AaW9uaWNvbi12YXItZHJhZzogXCJcXGYxMzBcIjtcbkBpb25pY29uLXZhci1lYXJ0aDogXCJcXGYyNzZcIjtcbkBpb25pY29uLXZhci1lYXNlbDogXCJcXGYzYzJcIjtcbkBpb25pY29uLXZhci1lZGl0OiBcIlxcZjJiZlwiO1xuQGlvbmljb24tdmFyLWVnZzogXCJcXGYyNzdcIjtcbkBpb25pY29uLXZhci1lamVjdDogXCJcXGYxMzFcIjtcbkBpb25pY29uLXZhci1lbWFpbDogXCJcXGYxMzJcIjtcbkBpb25pY29uLXZhci1lbWFpbC11bnJlYWQ6IFwiXFxmM2MzXCI7XG5AaW9uaWNvbi12YXItZXJsZW5tZXllci1mbGFzazogXCJcXGYzYzVcIjtcbkBpb25pY29uLXZhci1lcmxlbm1leWVyLWZsYXNrLWJ1YmJsZXM6IFwiXFxmM2M0XCI7XG5AaW9uaWNvbi12YXItZXllOiBcIlxcZjEzM1wiO1xuQGlvbmljb24tdmFyLWV5ZS1kaXNhYmxlZDogXCJcXGYzMDZcIjtcbkBpb25pY29uLXZhci1mZW1hbGU6IFwiXFxmMjc4XCI7XG5AaW9uaWNvbi12YXItZmlsaW5nOiBcIlxcZjEzNFwiO1xuQGlvbmljb24tdmFyLWZpbG0tbWFya2VyOiBcIlxcZjEzNVwiO1xuQGlvbmljb24tdmFyLWZpcmViYWxsOiBcIlxcZjMxOVwiO1xuQGlvbmljb24tdmFyLWZsYWc6IFwiXFxmMjc5XCI7XG5AaW9uaWNvbi12YXItZmxhbWU6IFwiXFxmMzFhXCI7XG5AaW9uaWNvbi12YXItZmxhc2g6IFwiXFxmMTM3XCI7XG5AaW9uaWNvbi12YXItZmxhc2gtb2ZmOiBcIlxcZjEzNlwiO1xuQGlvbmljb24tdmFyLWZvbGRlcjogXCJcXGYxMzlcIjtcbkBpb25pY29uLXZhci1mb3JrOiBcIlxcZjI3YVwiO1xuQGlvbmljb24tdmFyLWZvcmstcmVwbzogXCJcXGYyYzBcIjtcbkBpb25pY29uLXZhci1mb3J3YXJkOiBcIlxcZjEzYVwiO1xuQGlvbmljb24tdmFyLWZ1bm5lbDogXCJcXGYzMWJcIjtcbkBpb25pY29uLXZhci1nZWFyLWE6IFwiXFxmMTNkXCI7XG5AaW9uaWNvbi12YXItZ2Vhci1iOiBcIlxcZjEzZVwiO1xuQGlvbmljb24tdmFyLWdyaWQ6IFwiXFxmMTNmXCI7XG5AaW9uaWNvbi12YXItaGFtbWVyOiBcIlxcZjI3YlwiO1xuQGlvbmljb24tdmFyLWhhcHB5OiBcIlxcZjMxY1wiO1xuQGlvbmljb24tdmFyLWhhcHB5LW91dGxpbmU6IFwiXFxmM2M2XCI7XG5AaW9uaWNvbi12YXItaGVhZHBob25lOiBcIlxcZjE0MFwiO1xuQGlvbmljb24tdmFyLWhlYXJ0OiBcIlxcZjE0MVwiO1xuQGlvbmljb24tdmFyLWhlYXJ0LWJyb2tlbjogXCJcXGYzMWRcIjtcbkBpb25pY29uLXZhci1oZWxwOiBcIlxcZjE0M1wiO1xuQGlvbmljb24tdmFyLWhlbHAtYnVveTogXCJcXGYyN2NcIjtcbkBpb25pY29uLXZhci1oZWxwLWNpcmNsZWQ6IFwiXFxmMTQyXCI7XG5AaW9uaWNvbi12YXItaG9tZTogXCJcXGYxNDRcIjtcbkBpb25pY29uLXZhci1pY2VjcmVhbTogXCJcXGYyN2RcIjtcbkBpb25pY29uLXZhci1pbWFnZTogXCJcXGYxNDdcIjtcbkBpb25pY29uLXZhci1pbWFnZXM6IFwiXFxmMTQ4XCI7XG5AaW9uaWNvbi12YXItaW5mb3JtYXRpb246IFwiXFxmMTRhXCI7XG5AaW9uaWNvbi12YXItaW5mb3JtYXRpb24tY2lyY2xlZDogXCJcXGYxNDlcIjtcbkBpb25pY29uLXZhci1pb25pYzogXCJcXGYxNGJcIjtcbkBpb25pY29uLXZhci1pb3MtYWxhcm06IFwiXFxmM2M4XCI7XG5AaW9uaWNvbi12YXItaW9zLWFsYXJtLW91dGxpbmU6IFwiXFxmM2M3XCI7XG5AaW9uaWNvbi12YXItaW9zLWFsYnVtczogXCJcXGYzY2FcIjtcbkBpb25pY29uLXZhci1pb3MtYWxidW1zLW91dGxpbmU6IFwiXFxmM2M5XCI7XG5AaW9uaWNvbi12YXItaW9zLWFtZXJpY2FuZm9vdGJhbGw6IFwiXFxmM2NjXCI7XG5AaW9uaWNvbi12YXItaW9zLWFtZXJpY2FuZm9vdGJhbGwtb3V0bGluZTogXCJcXGYzY2JcIjtcbkBpb25pY29uLXZhci1pb3MtYW5hbHl0aWNzOiBcIlxcZjNjZVwiO1xuQGlvbmljb24tdmFyLWlvcy1hbmFseXRpY3Mtb3V0bGluZTogXCJcXGYzY2RcIjtcbkBpb25pY29uLXZhci1pb3MtYXJyb3ctYmFjazogXCJcXGYzY2ZcIjtcbkBpb25pY29uLXZhci1pb3MtYXJyb3ctZG93bjogXCJcXGYzZDBcIjtcbkBpb25pY29uLXZhci1pb3MtYXJyb3ctZm9yd2FyZDogXCJcXGYzZDFcIjtcbkBpb25pY29uLXZhci1pb3MtYXJyb3ctbGVmdDogXCJcXGYzZDJcIjtcbkBpb25pY29uLXZhci1pb3MtYXJyb3ctcmlnaHQ6IFwiXFxmM2QzXCI7XG5AaW9uaWNvbi12YXItaW9zLWFycm93LXRoaW4tZG93bjogXCJcXGYzZDRcIjtcbkBpb25pY29uLXZhci1pb3MtYXJyb3ctdGhpbi1sZWZ0OiBcIlxcZjNkNVwiO1xuQGlvbmljb24tdmFyLWlvcy1hcnJvdy10aGluLXJpZ2h0OiBcIlxcZjNkNlwiO1xuQGlvbmljb24tdmFyLWlvcy1hcnJvdy10aGluLXVwOiBcIlxcZjNkN1wiO1xuQGlvbmljb24tdmFyLWlvcy1hcnJvdy11cDogXCJcXGYzZDhcIjtcbkBpb25pY29uLXZhci1pb3MtYXQ6IFwiXFxmM2RhXCI7XG5AaW9uaWNvbi12YXItaW9zLWF0LW91dGxpbmU6IFwiXFxmM2Q5XCI7XG5AaW9uaWNvbi12YXItaW9zLWJhcmNvZGU6IFwiXFxmM2RjXCI7XG5AaW9uaWNvbi12YXItaW9zLWJhcmNvZGUtb3V0bGluZTogXCJcXGYzZGJcIjtcbkBpb25pY29uLXZhci1pb3MtYmFzZWJhbGw6IFwiXFxmM2RlXCI7XG5AaW9uaWNvbi12YXItaW9zLWJhc2ViYWxsLW91dGxpbmU6IFwiXFxmM2RkXCI7XG5AaW9uaWNvbi12YXItaW9zLWJhc2tldGJhbGw6IFwiXFxmM2UwXCI7XG5AaW9uaWNvbi12YXItaW9zLWJhc2tldGJhbGwtb3V0bGluZTogXCJcXGYzZGZcIjtcbkBpb25pY29uLXZhci1pb3MtYmVsbDogXCJcXGYzZTJcIjtcbkBpb25pY29uLXZhci1pb3MtYmVsbC1vdXRsaW5lOiBcIlxcZjNlMVwiO1xuQGlvbmljb24tdmFyLWlvcy1ib2R5OiBcIlxcZjNlNFwiO1xuQGlvbmljb24tdmFyLWlvcy1ib2R5LW91dGxpbmU6IFwiXFxmM2UzXCI7XG5AaW9uaWNvbi12YXItaW9zLWJvbHQ6IFwiXFxmM2U2XCI7XG5AaW9uaWNvbi12YXItaW9zLWJvbHQtb3V0bGluZTogXCJcXGYzZTVcIjtcbkBpb25pY29uLXZhci1pb3MtYm9vazogXCJcXGYzZThcIjtcbkBpb25pY29uLXZhci1pb3MtYm9vay1vdXRsaW5lOiBcIlxcZjNlN1wiO1xuQGlvbmljb24tdmFyLWlvcy1ib29rbWFya3M6IFwiXFxmM2VhXCI7XG5AaW9uaWNvbi12YXItaW9zLWJvb2ttYXJrcy1vdXRsaW5lOiBcIlxcZjNlOVwiO1xuQGlvbmljb24tdmFyLWlvcy1ib3g6IFwiXFxmM2VjXCI7XG5AaW9uaWNvbi12YXItaW9zLWJveC1vdXRsaW5lOiBcIlxcZjNlYlwiO1xuQGlvbmljb24tdmFyLWlvcy1icmllZmNhc2U6IFwiXFxmM2VlXCI7XG5AaW9uaWNvbi12YXItaW9zLWJyaWVmY2FzZS1vdXRsaW5lOiBcIlxcZjNlZFwiO1xuQGlvbmljb24tdmFyLWlvcy1icm93c2VyczogXCJcXGYzZjBcIjtcbkBpb25pY29uLXZhci1pb3MtYnJvd3NlcnMtb3V0bGluZTogXCJcXGYzZWZcIjtcbkBpb25pY29uLXZhci1pb3MtY2FsY3VsYXRvcjogXCJcXGYzZjJcIjtcbkBpb25pY29uLXZhci1pb3MtY2FsY3VsYXRvci1vdXRsaW5lOiBcIlxcZjNmMVwiO1xuQGlvbmljb24tdmFyLWlvcy1jYWxlbmRhcjogXCJcXGYzZjRcIjtcbkBpb25pY29uLXZhci1pb3MtY2FsZW5kYXItb3V0bGluZTogXCJcXGYzZjNcIjtcbkBpb25pY29uLXZhci1pb3MtY2FtZXJhOiBcIlxcZjNmNlwiO1xuQGlvbmljb24tdmFyLWlvcy1jYW1lcmEtb3V0bGluZTogXCJcXGYzZjVcIjtcbkBpb25pY29uLXZhci1pb3MtY2FydDogXCJcXGYzZjhcIjtcbkBpb25pY29uLXZhci1pb3MtY2FydC1vdXRsaW5lOiBcIlxcZjNmN1wiO1xuQGlvbmljb24tdmFyLWlvcy1jaGF0Ym94ZXM6IFwiXFxmM2ZhXCI7XG5AaW9uaWNvbi12YXItaW9zLWNoYXRib3hlcy1vdXRsaW5lOiBcIlxcZjNmOVwiO1xuQGlvbmljb24tdmFyLWlvcy1jaGF0YnViYmxlOiBcIlxcZjNmY1wiO1xuQGlvbmljb24tdmFyLWlvcy1jaGF0YnViYmxlLW91dGxpbmU6IFwiXFxmM2ZiXCI7XG5AaW9uaWNvbi12YXItaW9zLWNoZWNrbWFyazogXCJcXGYzZmZcIjtcbkBpb25pY29uLXZhci1pb3MtY2hlY2ttYXJrLWVtcHR5OiBcIlxcZjNmZFwiO1xuQGlvbmljb24tdmFyLWlvcy1jaGVja21hcmstb3V0bGluZTogXCJcXGYzZmVcIjtcbkBpb25pY29uLXZhci1pb3MtY2lyY2xlLWZpbGxlZDogXCJcXGY0MDBcIjtcbkBpb25pY29uLXZhci1pb3MtY2lyY2xlLW91dGxpbmU6IFwiXFxmNDAxXCI7XG5AaW9uaWNvbi12YXItaW9zLWNsb2NrOiBcIlxcZjQwM1wiO1xuQGlvbmljb24tdmFyLWlvcy1jbG9jay1vdXRsaW5lOiBcIlxcZjQwMlwiO1xuQGlvbmljb24tdmFyLWlvcy1jbG9zZTogXCJcXGY0MDZcIjtcbkBpb25pY29uLXZhci1pb3MtY2xvc2UtZW1wdHk6IFwiXFxmNDA0XCI7XG5AaW9uaWNvbi12YXItaW9zLWNsb3NlLW91dGxpbmU6IFwiXFxmNDA1XCI7XG5AaW9uaWNvbi12YXItaW9zLWNsb3VkOiBcIlxcZjQwY1wiO1xuQGlvbmljb24tdmFyLWlvcy1jbG91ZC1kb3dubG9hZDogXCJcXGY0MDhcIjtcbkBpb25pY29uLXZhci1pb3MtY2xvdWQtZG93bmxvYWQtb3V0bGluZTogXCJcXGY0MDdcIjtcbkBpb25pY29uLXZhci1pb3MtY2xvdWQtb3V0bGluZTogXCJcXGY0MDlcIjtcbkBpb25pY29uLXZhci1pb3MtY2xvdWQtdXBsb2FkOiBcIlxcZjQwYlwiO1xuQGlvbmljb24tdmFyLWlvcy1jbG91ZC11cGxvYWQtb3V0bGluZTogXCJcXGY0MGFcIjtcbkBpb25pY29uLXZhci1pb3MtY2xvdWR5OiBcIlxcZjQxMFwiO1xuQGlvbmljb24tdmFyLWlvcy1jbG91ZHktbmlnaHQ6IFwiXFxmNDBlXCI7XG5AaW9uaWNvbi12YXItaW9zLWNsb3VkeS1uaWdodC1vdXRsaW5lOiBcIlxcZjQwZFwiO1xuQGlvbmljb24tdmFyLWlvcy1jbG91ZHktb3V0bGluZTogXCJcXGY0MGZcIjtcbkBpb25pY29uLXZhci1pb3MtY29nOiBcIlxcZjQxMlwiO1xuQGlvbmljb24tdmFyLWlvcy1jb2ctb3V0bGluZTogXCJcXGY0MTFcIjtcbkBpb25pY29uLXZhci1pb3MtY29sb3ItZmlsdGVyOiBcIlxcZjQxNFwiO1xuQGlvbmljb24tdmFyLWlvcy1jb2xvci1maWx0ZXItb3V0bGluZTogXCJcXGY0MTNcIjtcbkBpb25pY29uLXZhci1pb3MtY29sb3Itd2FuZDogXCJcXGY0MTZcIjtcbkBpb25pY29uLXZhci1pb3MtY29sb3Itd2FuZC1vdXRsaW5lOiBcIlxcZjQxNVwiO1xuQGlvbmljb24tdmFyLWlvcy1jb21wb3NlOiBcIlxcZjQxOFwiO1xuQGlvbmljb24tdmFyLWlvcy1jb21wb3NlLW91dGxpbmU6IFwiXFxmNDE3XCI7XG5AaW9uaWNvbi12YXItaW9zLWNvbnRhY3Q6IFwiXFxmNDFhXCI7XG5AaW9uaWNvbi12YXItaW9zLWNvbnRhY3Qtb3V0bGluZTogXCJcXGY0MTlcIjtcbkBpb25pY29uLXZhci1pb3MtY29weTogXCJcXGY0MWNcIjtcbkBpb25pY29uLXZhci1pb3MtY29weS1vdXRsaW5lOiBcIlxcZjQxYlwiO1xuQGlvbmljb24tdmFyLWlvcy1jcm9wOiBcIlxcZjQxZVwiO1xuQGlvbmljb24tdmFyLWlvcy1jcm9wLXN0cm9uZzogXCJcXGY0MWRcIjtcbkBpb25pY29uLXZhci1pb3MtZG93bmxvYWQ6IFwiXFxmNDIwXCI7XG5AaW9uaWNvbi12YXItaW9zLWRvd25sb2FkLW91dGxpbmU6IFwiXFxmNDFmXCI7XG5AaW9uaWNvbi12YXItaW9zLWRyYWc6IFwiXFxmNDIxXCI7XG5AaW9uaWNvbi12YXItaW9zLWVtYWlsOiBcIlxcZjQyM1wiO1xuQGlvbmljb24tdmFyLWlvcy1lbWFpbC1vdXRsaW5lOiBcIlxcZjQyMlwiO1xuQGlvbmljb24tdmFyLWlvcy1leWU6IFwiXFxmNDI1XCI7XG5AaW9uaWNvbi12YXItaW9zLWV5ZS1vdXRsaW5lOiBcIlxcZjQyNFwiO1xuQGlvbmljb24tdmFyLWlvcy1mYXN0Zm9yd2FyZDogXCJcXGY0MjdcIjtcbkBpb25pY29uLXZhci1pb3MtZmFzdGZvcndhcmQtb3V0bGluZTogXCJcXGY0MjZcIjtcbkBpb25pY29uLXZhci1pb3MtZmlsaW5nOiBcIlxcZjQyOVwiO1xuQGlvbmljb24tdmFyLWlvcy1maWxpbmctb3V0bGluZTogXCJcXGY0MjhcIjtcbkBpb25pY29uLXZhci1pb3MtZmlsbTogXCJcXGY0MmJcIjtcbkBpb25pY29uLXZhci1pb3MtZmlsbS1vdXRsaW5lOiBcIlxcZjQyYVwiO1xuQGlvbmljb24tdmFyLWlvcy1mbGFnOiBcIlxcZjQyZFwiO1xuQGlvbmljb24tdmFyLWlvcy1mbGFnLW91dGxpbmU6IFwiXFxmNDJjXCI7XG5AaW9uaWNvbi12YXItaW9zLWZsYW1lOiBcIlxcZjQyZlwiO1xuQGlvbmljb24tdmFyLWlvcy1mbGFtZS1vdXRsaW5lOiBcIlxcZjQyZVwiO1xuQGlvbmljb24tdmFyLWlvcy1mbGFzazogXCJcXGY0MzFcIjtcbkBpb25pY29uLXZhci1pb3MtZmxhc2stb3V0bGluZTogXCJcXGY0MzBcIjtcbkBpb25pY29uLXZhci1pb3MtZmxvd2VyOiBcIlxcZjQzM1wiO1xuQGlvbmljb24tdmFyLWlvcy1mbG93ZXItb3V0bGluZTogXCJcXGY0MzJcIjtcbkBpb25pY29uLXZhci1pb3MtZm9sZGVyOiBcIlxcZjQzNVwiO1xuQGlvbmljb24tdmFyLWlvcy1mb2xkZXItb3V0bGluZTogXCJcXGY0MzRcIjtcbkBpb25pY29uLXZhci1pb3MtZm9vdGJhbGw6IFwiXFxmNDM3XCI7XG5AaW9uaWNvbi12YXItaW9zLWZvb3RiYWxsLW91dGxpbmU6IFwiXFxmNDM2XCI7XG5AaW9uaWNvbi12YXItaW9zLWdhbWUtY29udHJvbGxlci1hOiBcIlxcZjQzOVwiO1xuQGlvbmljb24tdmFyLWlvcy1nYW1lLWNvbnRyb2xsZXItYS1vdXRsaW5lOiBcIlxcZjQzOFwiO1xuQGlvbmljb24tdmFyLWlvcy1nYW1lLWNvbnRyb2xsZXItYjogXCJcXGY0M2JcIjtcbkBpb25pY29uLXZhci1pb3MtZ2FtZS1jb250cm9sbGVyLWItb3V0bGluZTogXCJcXGY0M2FcIjtcbkBpb25pY29uLXZhci1pb3MtZ2VhcjogXCJcXGY0M2RcIjtcbkBpb25pY29uLXZhci1pb3MtZ2Vhci1vdXRsaW5lOiBcIlxcZjQzY1wiO1xuQGlvbmljb24tdmFyLWlvcy1nbGFzc2VzOiBcIlxcZjQzZlwiO1xuQGlvbmljb24tdmFyLWlvcy1nbGFzc2VzLW91dGxpbmU6IFwiXFxmNDNlXCI7XG5AaW9uaWNvbi12YXItaW9zLWdyaWQtdmlldzogXCJcXGY0NDFcIjtcbkBpb25pY29uLXZhci1pb3MtZ3JpZC12aWV3LW91dGxpbmU6IFwiXFxmNDQwXCI7XG5AaW9uaWNvbi12YXItaW9zLWhlYXJ0OiBcIlxcZjQ0M1wiO1xuQGlvbmljb24tdmFyLWlvcy1oZWFydC1vdXRsaW5lOiBcIlxcZjQ0MlwiO1xuQGlvbmljb24tdmFyLWlvcy1oZWxwOiBcIlxcZjQ0NlwiO1xuQGlvbmljb24tdmFyLWlvcy1oZWxwLWVtcHR5OiBcIlxcZjQ0NFwiO1xuQGlvbmljb24tdmFyLWlvcy1oZWxwLW91dGxpbmU6IFwiXFxmNDQ1XCI7XG5AaW9uaWNvbi12YXItaW9zLWhvbWU6IFwiXFxmNDQ4XCI7XG5AaW9uaWNvbi12YXItaW9zLWhvbWUtb3V0bGluZTogXCJcXGY0NDdcIjtcbkBpb25pY29uLXZhci1pb3MtaW5maW5pdGU6IFwiXFxmNDRhXCI7XG5AaW9uaWNvbi12YXItaW9zLWluZmluaXRlLW91dGxpbmU6IFwiXFxmNDQ5XCI7XG5AaW9uaWNvbi12YXItaW9zLWluZm9ybWF0aW9uOiBcIlxcZjQ0ZFwiO1xuQGlvbmljb24tdmFyLWlvcy1pbmZvcm1hdGlvbi1lbXB0eTogXCJcXGY0NGJcIjtcbkBpb25pY29uLXZhci1pb3MtaW5mb3JtYXRpb24tb3V0bGluZTogXCJcXGY0NGNcIjtcbkBpb25pY29uLXZhci1pb3MtaW9uaWMtb3V0bGluZTogXCJcXGY0NGVcIjtcbkBpb25pY29uLXZhci1pb3Mta2V5cGFkOiBcIlxcZjQ1MFwiO1xuQGlvbmljb24tdmFyLWlvcy1rZXlwYWQtb3V0bGluZTogXCJcXGY0NGZcIjtcbkBpb25pY29uLXZhci1pb3MtbGlnaHRidWxiOiBcIlxcZjQ1MlwiO1xuQGlvbmljb24tdmFyLWlvcy1saWdodGJ1bGItb3V0bGluZTogXCJcXGY0NTFcIjtcbkBpb25pY29uLXZhci1pb3MtbGlzdDogXCJcXGY0NTRcIjtcbkBpb25pY29uLXZhci1pb3MtbGlzdC1vdXRsaW5lOiBcIlxcZjQ1M1wiO1xuQGlvbmljb24tdmFyLWlvcy1sb2NhdGlvbjogXCJcXGY0NTZcIjtcbkBpb25pY29uLXZhci1pb3MtbG9jYXRpb24tb3V0bGluZTogXCJcXGY0NTVcIjtcbkBpb25pY29uLXZhci1pb3MtbG9ja2VkOiBcIlxcZjQ1OFwiO1xuQGlvbmljb24tdmFyLWlvcy1sb2NrZWQtb3V0bGluZTogXCJcXGY0NTdcIjtcbkBpb25pY29uLXZhci1pb3MtbG9vcDogXCJcXGY0NWFcIjtcbkBpb25pY29uLXZhci1pb3MtbG9vcC1zdHJvbmc6IFwiXFxmNDU5XCI7XG5AaW9uaWNvbi12YXItaW9zLW1lZGljYWw6IFwiXFxmNDVjXCI7XG5AaW9uaWNvbi12YXItaW9zLW1lZGljYWwtb3V0bGluZTogXCJcXGY0NWJcIjtcbkBpb25pY29uLXZhci1pb3MtbWVka2l0OiBcIlxcZjQ1ZVwiO1xuQGlvbmljb24tdmFyLWlvcy1tZWRraXQtb3V0bGluZTogXCJcXGY0NWRcIjtcbkBpb25pY29uLXZhci1pb3MtbWljOiBcIlxcZjQ2MVwiO1xuQGlvbmljb24tdmFyLWlvcy1taWMtb2ZmOiBcIlxcZjQ1ZlwiO1xuQGlvbmljb24tdmFyLWlvcy1taWMtb3V0bGluZTogXCJcXGY0NjBcIjtcbkBpb25pY29uLXZhci1pb3MtbWludXM6IFwiXFxmNDY0XCI7XG5AaW9uaWNvbi12YXItaW9zLW1pbnVzLWVtcHR5OiBcIlxcZjQ2MlwiO1xuQGlvbmljb24tdmFyLWlvcy1taW51cy1vdXRsaW5lOiBcIlxcZjQ2M1wiO1xuQGlvbmljb24tdmFyLWlvcy1tb25pdG9yOiBcIlxcZjQ2NlwiO1xuQGlvbmljb24tdmFyLWlvcy1tb25pdG9yLW91dGxpbmU6IFwiXFxmNDY1XCI7XG5AaW9uaWNvbi12YXItaW9zLW1vb246IFwiXFxmNDY4XCI7XG5AaW9uaWNvbi12YXItaW9zLW1vb24tb3V0bGluZTogXCJcXGY0NjdcIjtcbkBpb25pY29uLXZhci1pb3MtbW9yZTogXCJcXGY0NmFcIjtcbkBpb25pY29uLXZhci1pb3MtbW9yZS1vdXRsaW5lOiBcIlxcZjQ2OVwiO1xuQGlvbmljb24tdmFyLWlvcy1tdXNpY2FsLW5vdGU6IFwiXFxmNDZiXCI7XG5AaW9uaWNvbi12YXItaW9zLW11c2ljYWwtbm90ZXM6IFwiXFxmNDZjXCI7XG5AaW9uaWNvbi12YXItaW9zLW5hdmlnYXRlOiBcIlxcZjQ2ZVwiO1xuQGlvbmljb24tdmFyLWlvcy1uYXZpZ2F0ZS1vdXRsaW5lOiBcIlxcZjQ2ZFwiO1xuQGlvbmljb24tdmFyLWlvcy1udXRyaXRpb246IFwiXFxmNDcwXCI7XG5AaW9uaWNvbi12YXItaW9zLW51dHJpdGlvbi1vdXRsaW5lOiBcIlxcZjQ2ZlwiO1xuQGlvbmljb24tdmFyLWlvcy1wYXBlcjogXCJcXGY0NzJcIjtcbkBpb25pY29uLXZhci1pb3MtcGFwZXItb3V0bGluZTogXCJcXGY0NzFcIjtcbkBpb25pY29uLXZhci1pb3MtcGFwZXJwbGFuZTogXCJcXGY0NzRcIjtcbkBpb25pY29uLXZhci1pb3MtcGFwZXJwbGFuZS1vdXRsaW5lOiBcIlxcZjQ3M1wiO1xuQGlvbmljb24tdmFyLWlvcy1wYXJ0bHlzdW5ueTogXCJcXGY0NzZcIjtcbkBpb25pY29uLXZhci1pb3MtcGFydGx5c3Vubnktb3V0bGluZTogXCJcXGY0NzVcIjtcbkBpb25pY29uLXZhci1pb3MtcGF1c2U6IFwiXFxmNDc4XCI7XG5AaW9uaWNvbi12YXItaW9zLXBhdXNlLW91dGxpbmU6IFwiXFxmNDc3XCI7XG5AaW9uaWNvbi12YXItaW9zLXBhdzogXCJcXGY0N2FcIjtcbkBpb25pY29uLXZhci1pb3MtcGF3LW91dGxpbmU6IFwiXFxmNDc5XCI7XG5AaW9uaWNvbi12YXItaW9zLXBlb3BsZTogXCJcXGY0N2NcIjtcbkBpb25pY29uLXZhci1pb3MtcGVvcGxlLW91dGxpbmU6IFwiXFxmNDdiXCI7XG5AaW9uaWNvbi12YXItaW9zLXBlcnNvbjogXCJcXGY0N2VcIjtcbkBpb25pY29uLXZhci1pb3MtcGVyc29uLW91dGxpbmU6IFwiXFxmNDdkXCI7XG5AaW9uaWNvbi12YXItaW9zLXBlcnNvbmFkZDogXCJcXGY0ODBcIjtcbkBpb25pY29uLXZhci1pb3MtcGVyc29uYWRkLW91dGxpbmU6IFwiXFxmNDdmXCI7XG5AaW9uaWNvbi12YXItaW9zLXBob3RvczogXCJcXGY0ODJcIjtcbkBpb25pY29uLXZhci1pb3MtcGhvdG9zLW91dGxpbmU6IFwiXFxmNDgxXCI7XG5AaW9uaWNvbi12YXItaW9zLXBpZTogXCJcXGY0ODRcIjtcbkBpb25pY29uLXZhci1pb3MtcGllLW91dGxpbmU6IFwiXFxmNDgzXCI7XG5AaW9uaWNvbi12YXItaW9zLXBpbnQ6IFwiXFxmNDg2XCI7XG5AaW9uaWNvbi12YXItaW9zLXBpbnQtb3V0bGluZTogXCJcXGY0ODVcIjtcbkBpb25pY29uLXZhci1pb3MtcGxheTogXCJcXGY0ODhcIjtcbkBpb25pY29uLXZhci1pb3MtcGxheS1vdXRsaW5lOiBcIlxcZjQ4N1wiO1xuQGlvbmljb24tdmFyLWlvcy1wbHVzOiBcIlxcZjQ4YlwiO1xuQGlvbmljb24tdmFyLWlvcy1wbHVzLWVtcHR5OiBcIlxcZjQ4OVwiO1xuQGlvbmljb24tdmFyLWlvcy1wbHVzLW91dGxpbmU6IFwiXFxmNDhhXCI7XG5AaW9uaWNvbi12YXItaW9zLXByaWNldGFnOiBcIlxcZjQ4ZFwiO1xuQGlvbmljb24tdmFyLWlvcy1wcmljZXRhZy1vdXRsaW5lOiBcIlxcZjQ4Y1wiO1xuQGlvbmljb24tdmFyLWlvcy1wcmljZXRhZ3M6IFwiXFxmNDhmXCI7XG5AaW9uaWNvbi12YXItaW9zLXByaWNldGFncy1vdXRsaW5lOiBcIlxcZjQ4ZVwiO1xuQGlvbmljb24tdmFyLWlvcy1wcmludGVyOiBcIlxcZjQ5MVwiO1xuQGlvbmljb24tdmFyLWlvcy1wcmludGVyLW91dGxpbmU6IFwiXFxmNDkwXCI7XG5AaW9uaWNvbi12YXItaW9zLXB1bHNlOiBcIlxcZjQ5M1wiO1xuQGlvbmljb24tdmFyLWlvcy1wdWxzZS1zdHJvbmc6IFwiXFxmNDkyXCI7XG5AaW9uaWNvbi12YXItaW9zLXJhaW55OiBcIlxcZjQ5NVwiO1xuQGlvbmljb24tdmFyLWlvcy1yYWlueS1vdXRsaW5lOiBcIlxcZjQ5NFwiO1xuQGlvbmljb24tdmFyLWlvcy1yZWNvcmRpbmc6IFwiXFxmNDk3XCI7XG5AaW9uaWNvbi12YXItaW9zLXJlY29yZGluZy1vdXRsaW5lOiBcIlxcZjQ5NlwiO1xuQGlvbmljb24tdmFyLWlvcy1yZWRvOiBcIlxcZjQ5OVwiO1xuQGlvbmljb24tdmFyLWlvcy1yZWRvLW91dGxpbmU6IFwiXFxmNDk4XCI7XG5AaW9uaWNvbi12YXItaW9zLXJlZnJlc2g6IFwiXFxmNDljXCI7XG5AaW9uaWNvbi12YXItaW9zLXJlZnJlc2gtZW1wdHk6IFwiXFxmNDlhXCI7XG5AaW9uaWNvbi12YXItaW9zLXJlZnJlc2gtb3V0bGluZTogXCJcXGY0OWJcIjtcbkBpb25pY29uLXZhci1pb3MtcmVsb2FkOiBcIlxcZjQ5ZFwiO1xuQGlvbmljb24tdmFyLWlvcy1yZXZlcnNlLWNhbWVyYTogXCJcXGY0OWZcIjtcbkBpb25pY29uLXZhci1pb3MtcmV2ZXJzZS1jYW1lcmEtb3V0bGluZTogXCJcXGY0OWVcIjtcbkBpb25pY29uLXZhci1pb3MtcmV3aW5kOiBcIlxcZjRhMVwiO1xuQGlvbmljb24tdmFyLWlvcy1yZXdpbmQtb3V0bGluZTogXCJcXGY0YTBcIjtcbkBpb25pY29uLXZhci1pb3Mtcm9zZTogXCJcXGY0YTNcIjtcbkBpb25pY29uLXZhci1pb3Mtcm9zZS1vdXRsaW5lOiBcIlxcZjRhMlwiO1xuQGlvbmljb24tdmFyLWlvcy1zZWFyY2g6IFwiXFxmNGE1XCI7XG5AaW9uaWNvbi12YXItaW9zLXNlYXJjaC1zdHJvbmc6IFwiXFxmNGE0XCI7XG5AaW9uaWNvbi12YXItaW9zLXNldHRpbmdzOiBcIlxcZjRhN1wiO1xuQGlvbmljb24tdmFyLWlvcy1zZXR0aW5ncy1zdHJvbmc6IFwiXFxmNGE2XCI7XG5AaW9uaWNvbi12YXItaW9zLXNodWZmbGU6IFwiXFxmNGE5XCI7XG5AaW9uaWNvbi12YXItaW9zLXNodWZmbGUtc3Ryb25nOiBcIlxcZjRhOFwiO1xuQGlvbmljb24tdmFyLWlvcy1za2lwYmFja3dhcmQ6IFwiXFxmNGFiXCI7XG5AaW9uaWNvbi12YXItaW9zLXNraXBiYWNrd2FyZC1vdXRsaW5lOiBcIlxcZjRhYVwiO1xuQGlvbmljb24tdmFyLWlvcy1za2lwZm9yd2FyZDogXCJcXGY0YWRcIjtcbkBpb25pY29uLXZhci1pb3Mtc2tpcGZvcndhcmQtb3V0bGluZTogXCJcXGY0YWNcIjtcbkBpb25pY29uLXZhci1pb3Mtc25vd3k6IFwiXFxmNGFlXCI7XG5AaW9uaWNvbi12YXItaW9zLXNwZWVkb21ldGVyOiBcIlxcZjRiMFwiO1xuQGlvbmljb24tdmFyLWlvcy1zcGVlZG9tZXRlci1vdXRsaW5lOiBcIlxcZjRhZlwiO1xuQGlvbmljb24tdmFyLWlvcy1zdGFyOiBcIlxcZjRiM1wiO1xuQGlvbmljb24tdmFyLWlvcy1zdGFyLWhhbGY6IFwiXFxmNGIxXCI7XG5AaW9uaWNvbi12YXItaW9zLXN0YXItb3V0bGluZTogXCJcXGY0YjJcIjtcbkBpb25pY29uLXZhci1pb3Mtc3RvcHdhdGNoOiBcIlxcZjRiNVwiO1xuQGlvbmljb24tdmFyLWlvcy1zdG9wd2F0Y2gtb3V0bGluZTogXCJcXGY0YjRcIjtcbkBpb25pY29uLXZhci1pb3Mtc3Vubnk6IFwiXFxmNGI3XCI7XG5AaW9uaWNvbi12YXItaW9zLXN1bm55LW91dGxpbmU6IFwiXFxmNGI2XCI7XG5AaW9uaWNvbi12YXItaW9zLXRlbGVwaG9uZTogXCJcXGY0YjlcIjtcbkBpb25pY29uLXZhci1pb3MtdGVsZXBob25lLW91dGxpbmU6IFwiXFxmNGI4XCI7XG5AaW9uaWNvbi12YXItaW9zLXRlbm5pc2JhbGw6IFwiXFxmNGJiXCI7XG5AaW9uaWNvbi12YXItaW9zLXRlbm5pc2JhbGwtb3V0bGluZTogXCJcXGY0YmFcIjtcbkBpb25pY29uLXZhci1pb3MtdGh1bmRlcnN0b3JtOiBcIlxcZjRiZFwiO1xuQGlvbmljb24tdmFyLWlvcy10aHVuZGVyc3Rvcm0tb3V0bGluZTogXCJcXGY0YmNcIjtcbkBpb25pY29uLXZhci1pb3MtdGltZTogXCJcXGY0YmZcIjtcbkBpb25pY29uLXZhci1pb3MtdGltZS1vdXRsaW5lOiBcIlxcZjRiZVwiO1xuQGlvbmljb24tdmFyLWlvcy10aW1lcjogXCJcXGY0YzFcIjtcbkBpb25pY29uLXZhci1pb3MtdGltZXItb3V0bGluZTogXCJcXGY0YzBcIjtcbkBpb25pY29uLXZhci1pb3MtdG9nZ2xlOiBcIlxcZjRjM1wiO1xuQGlvbmljb24tdmFyLWlvcy10b2dnbGUtb3V0bGluZTogXCJcXGY0YzJcIjtcbkBpb25pY29uLXZhci1pb3MtdHJhc2g6IFwiXFxmNGM1XCI7XG5AaW9uaWNvbi12YXItaW9zLXRyYXNoLW91dGxpbmU6IFwiXFxmNGM0XCI7XG5AaW9uaWNvbi12YXItaW9zLXVuZG86IFwiXFxmNGM3XCI7XG5AaW9uaWNvbi12YXItaW9zLXVuZG8tb3V0bGluZTogXCJcXGY0YzZcIjtcbkBpb25pY29uLXZhci1pb3MtdW5sb2NrZWQ6IFwiXFxmNGM5XCI7XG5AaW9uaWNvbi12YXItaW9zLXVubG9ja2VkLW91dGxpbmU6IFwiXFxmNGM4XCI7XG5AaW9uaWNvbi12YXItaW9zLXVwbG9hZDogXCJcXGY0Y2JcIjtcbkBpb25pY29uLXZhci1pb3MtdXBsb2FkLW91dGxpbmU6IFwiXFxmNGNhXCI7XG5AaW9uaWNvbi12YXItaW9zLXZpZGVvY2FtOiBcIlxcZjRjZFwiO1xuQGlvbmljb24tdmFyLWlvcy12aWRlb2NhbS1vdXRsaW5lOiBcIlxcZjRjY1wiO1xuQGlvbmljb24tdmFyLWlvcy12b2x1bWUtaGlnaDogXCJcXGY0Y2VcIjtcbkBpb25pY29uLXZhci1pb3Mtdm9sdW1lLWxvdzogXCJcXGY0Y2ZcIjtcbkBpb25pY29uLXZhci1pb3Mtd2luZWdsYXNzOiBcIlxcZjRkMVwiO1xuQGlvbmljb24tdmFyLWlvcy13aW5lZ2xhc3Mtb3V0bGluZTogXCJcXGY0ZDBcIjtcbkBpb25pY29uLXZhci1pb3Mtd29ybGQ6IFwiXFxmNGQzXCI7XG5AaW9uaWNvbi12YXItaW9zLXdvcmxkLW91dGxpbmU6IFwiXFxmNGQyXCI7XG5AaW9uaWNvbi12YXItaXBhZDogXCJcXGYxZjlcIjtcbkBpb25pY29uLXZhci1pcGhvbmU6IFwiXFxmMWZhXCI7XG5AaW9uaWNvbi12YXItaXBvZDogXCJcXGYxZmJcIjtcbkBpb25pY29uLXZhci1qZXQ6IFwiXFxmMjk1XCI7XG5AaW9uaWNvbi12YXIta2V5OiBcIlxcZjI5NlwiO1xuQGlvbmljb24tdmFyLWtuaWZlOiBcIlxcZjI5N1wiO1xuQGlvbmljb24tdmFyLWxhcHRvcDogXCJcXGYxZmNcIjtcbkBpb25pY29uLXZhci1sZWFmOiBcIlxcZjFmZFwiO1xuQGlvbmljb24tdmFyLWxldmVsczogXCJcXGYyOThcIjtcbkBpb25pY29uLXZhci1saWdodGJ1bGI6IFwiXFxmMjk5XCI7XG5AaW9uaWNvbi12YXItbGluazogXCJcXGYxZmVcIjtcbkBpb25pY29uLXZhci1sb2FkLWE6IFwiXFxmMjlhXCI7XG5AaW9uaWNvbi12YXItbG9hZC1iOiBcIlxcZjI5YlwiO1xuQGlvbmljb24tdmFyLWxvYWQtYzogXCJcXGYyOWNcIjtcbkBpb25pY29uLXZhci1sb2FkLWQ6IFwiXFxmMjlkXCI7XG5AaW9uaWNvbi12YXItbG9jYXRpb246IFwiXFxmMWZmXCI7XG5AaW9uaWNvbi12YXItbG9jay1jb21iaW5hdGlvbjogXCJcXGY0ZDRcIjtcbkBpb25pY29uLXZhci1sb2NrZWQ6IFwiXFxmMjAwXCI7XG5AaW9uaWNvbi12YXItbG9nLWluOiBcIlxcZjI5ZVwiO1xuQGlvbmljb24tdmFyLWxvZy1vdXQ6IFwiXFxmMjlmXCI7XG5AaW9uaWNvbi12YXItbG9vcDogXCJcXGYyMDFcIjtcbkBpb25pY29uLXZhci1tYWduZXQ6IFwiXFxmMmEwXCI7XG5AaW9uaWNvbi12YXItbWFsZTogXCJcXGYyYTFcIjtcbkBpb25pY29uLXZhci1tYW46IFwiXFxmMjAyXCI7XG5AaW9uaWNvbi12YXItbWFwOiBcIlxcZjIwM1wiO1xuQGlvbmljb24tdmFyLW1lZGtpdDogXCJcXGYyYTJcIjtcbkBpb25pY29uLXZhci1tZXJnZTogXCJcXGYzM2ZcIjtcbkBpb25pY29uLXZhci1taWMtYTogXCJcXGYyMDRcIjtcbkBpb25pY29uLXZhci1taWMtYjogXCJcXGYyMDVcIjtcbkBpb25pY29uLXZhci1taWMtYzogXCJcXGYyMDZcIjtcbkBpb25pY29uLXZhci1taW51czogXCJcXGYyMDlcIjtcbkBpb25pY29uLXZhci1taW51cy1jaXJjbGVkOiBcIlxcZjIwN1wiO1xuQGlvbmljb24tdmFyLW1pbnVzLXJvdW5kOiBcIlxcZjIwOFwiO1xuQGlvbmljb24tdmFyLW1vZGVsLXM6IFwiXFxmMmMxXCI7XG5AaW9uaWNvbi12YXItbW9uaXRvcjogXCJcXGYyMGFcIjtcbkBpb25pY29uLXZhci1tb3JlOiBcIlxcZjIwYlwiO1xuQGlvbmljb24tdmFyLW1vdXNlOiBcIlxcZjM0MFwiO1xuQGlvbmljb24tdmFyLW11c2ljLW5vdGU6IFwiXFxmMjBjXCI7XG5AaW9uaWNvbi12YXItbmF2aWNvbjogXCJcXGYyMGVcIjtcbkBpb25pY29uLXZhci1uYXZpY29uLXJvdW5kOiBcIlxcZjIwZFwiO1xuQGlvbmljb24tdmFyLW5hdmlnYXRlOiBcIlxcZjJhM1wiO1xuQGlvbmljb24tdmFyLW5ldHdvcms6IFwiXFxmMzQxXCI7XG5AaW9uaWNvbi12YXItbm8tc21va2luZzogXCJcXGYyYzJcIjtcbkBpb25pY29uLXZhci1udWNsZWFyOiBcIlxcZjJhNFwiO1xuQGlvbmljb24tdmFyLW91dGxldDogXCJcXGYzNDJcIjtcbkBpb25pY29uLXZhci1wYWludGJydXNoOiBcIlxcZjRkNVwiO1xuQGlvbmljb24tdmFyLXBhaW50YnVja2V0OiBcIlxcZjRkNlwiO1xuQGlvbmljb24tdmFyLXBhcGVyLWFpcnBsYW5lOiBcIlxcZjJjM1wiO1xuQGlvbmljb24tdmFyLXBhcGVyY2xpcDogXCJcXGYyMGZcIjtcbkBpb25pY29uLXZhci1wYXVzZTogXCJcXGYyMTBcIjtcbkBpb25pY29uLXZhci1wZXJzb246IFwiXFxmMjEzXCI7XG5AaW9uaWNvbi12YXItcGVyc29uLWFkZDogXCJcXGYyMTFcIjtcbkBpb25pY29uLXZhci1wZXJzb24tc3RhbGtlcjogXCJcXGYyMTJcIjtcbkBpb25pY29uLXZhci1waWUtZ3JhcGg6IFwiXFxmMmE1XCI7XG5AaW9uaWNvbi12YXItcGluOiBcIlxcZjJhNlwiO1xuQGlvbmljb24tdmFyLXBpbnBvaW50OiBcIlxcZjJhN1wiO1xuQGlvbmljb24tdmFyLXBpenphOiBcIlxcZjJhOFwiO1xuQGlvbmljb24tdmFyLXBsYW5lOiBcIlxcZjIxNFwiO1xuQGlvbmljb24tdmFyLXBsYW5ldDogXCJcXGYzNDNcIjtcbkBpb25pY29uLXZhci1wbGF5OiBcIlxcZjIxNVwiO1xuQGlvbmljb24tdmFyLXBsYXlzdGF0aW9uOiBcIlxcZjMwYVwiO1xuQGlvbmljb24tdmFyLXBsdXM6IFwiXFxmMjE4XCI7XG5AaW9uaWNvbi12YXItcGx1cy1jaXJjbGVkOiBcIlxcZjIxNlwiO1xuQGlvbmljb24tdmFyLXBsdXMtcm91bmQ6IFwiXFxmMjE3XCI7XG5AaW9uaWNvbi12YXItcG9kaXVtOiBcIlxcZjM0NFwiO1xuQGlvbmljb24tdmFyLXBvdW5kOiBcIlxcZjIxOVwiO1xuQGlvbmljb24tdmFyLXBvd2VyOiBcIlxcZjJhOVwiO1xuQGlvbmljb24tdmFyLXByaWNldGFnOiBcIlxcZjJhYVwiO1xuQGlvbmljb24tdmFyLXByaWNldGFnczogXCJcXGYyYWJcIjtcbkBpb25pY29uLXZhci1wcmludGVyOiBcIlxcZjIxYVwiO1xuQGlvbmljb24tdmFyLXB1bGwtcmVxdWVzdDogXCJcXGYzNDVcIjtcbkBpb25pY29uLXZhci1xci1zY2FubmVyOiBcIlxcZjM0NlwiO1xuQGlvbmljb24tdmFyLXF1b3RlOiBcIlxcZjM0N1wiO1xuQGlvbmljb24tdmFyLXJhZGlvLXdhdmVzOiBcIlxcZjJhY1wiO1xuQGlvbmljb24tdmFyLXJlY29yZDogXCJcXGYyMWJcIjtcbkBpb25pY29uLXZhci1yZWZyZXNoOiBcIlxcZjIxY1wiO1xuQGlvbmljb24tdmFyLXJlcGx5OiBcIlxcZjIxZVwiO1xuQGlvbmljb24tdmFyLXJlcGx5LWFsbDogXCJcXGYyMWRcIjtcbkBpb25pY29uLXZhci1yaWJib24tYTogXCJcXGYzNDhcIjtcbkBpb25pY29uLXZhci1yaWJib24tYjogXCJcXGYzNDlcIjtcbkBpb25pY29uLXZhci1zYWQ6IFwiXFxmMzRhXCI7XG5AaW9uaWNvbi12YXItc2FkLW91dGxpbmU6IFwiXFxmNGQ3XCI7XG5AaW9uaWNvbi12YXItc2Npc3NvcnM6IFwiXFxmMzRiXCI7XG5AaW9uaWNvbi12YXItc2VhcmNoOiBcIlxcZjIxZlwiO1xuQGlvbmljb24tdmFyLXNldHRpbmdzOiBcIlxcZjJhZFwiO1xuQGlvbmljb24tdmFyLXNoYXJlOiBcIlxcZjIyMFwiO1xuQGlvbmljb24tdmFyLXNodWZmbGU6IFwiXFxmMjIxXCI7XG5AaW9uaWNvbi12YXItc2tpcC1iYWNrd2FyZDogXCJcXGYyMjJcIjtcbkBpb25pY29uLXZhci1za2lwLWZvcndhcmQ6IFwiXFxmMjIzXCI7XG5AaW9uaWNvbi12YXItc29jaWFsLWFuZHJvaWQ6IFwiXFxmMjI1XCI7XG5AaW9uaWNvbi12YXItc29jaWFsLWFuZHJvaWQtb3V0bGluZTogXCJcXGYyMjRcIjtcbkBpb25pY29uLXZhci1zb2NpYWwtYW5ndWxhcjogXCJcXGY0ZDlcIjtcbkBpb25pY29uLXZhci1zb2NpYWwtYW5ndWxhci1vdXRsaW5lOiBcIlxcZjRkOFwiO1xuQGlvbmljb24tdmFyLXNvY2lhbC1hcHBsZTogXCJcXGYyMjdcIjtcbkBpb25pY29uLXZhci1zb2NpYWwtYXBwbGUtb3V0bGluZTogXCJcXGYyMjZcIjtcbkBpb25pY29uLXZhci1zb2NpYWwtYml0Y29pbjogXCJcXGYyYWZcIjtcbkBpb25pY29uLXZhci1zb2NpYWwtYml0Y29pbi1vdXRsaW5lOiBcIlxcZjJhZVwiO1xuQGlvbmljb24tdmFyLXNvY2lhbC1idWZmZXI6IFwiXFxmMjI5XCI7XG5AaW9uaWNvbi12YXItc29jaWFsLWJ1ZmZlci1vdXRsaW5lOiBcIlxcZjIyOFwiO1xuQGlvbmljb24tdmFyLXNvY2lhbC1jaHJvbWU6IFwiXFxmNGRiXCI7XG5AaW9uaWNvbi12YXItc29jaWFsLWNocm9tZS1vdXRsaW5lOiBcIlxcZjRkYVwiO1xuQGlvbmljb24tdmFyLXNvY2lhbC1jb2RlcGVuOiBcIlxcZjRkZFwiO1xuQGlvbmljb24tdmFyLXNvY2lhbC1jb2RlcGVuLW91dGxpbmU6IFwiXFxmNGRjXCI7XG5AaW9uaWNvbi12YXItc29jaWFsLWNzczM6IFwiXFxmNGRmXCI7XG5AaW9uaWNvbi12YXItc29jaWFsLWNzczMtb3V0bGluZTogXCJcXGY0ZGVcIjtcbkBpb25pY29uLXZhci1zb2NpYWwtZGVzaWduZXJuZXdzOiBcIlxcZjIyYlwiO1xuQGlvbmljb24tdmFyLXNvY2lhbC1kZXNpZ25lcm5ld3Mtb3V0bGluZTogXCJcXGYyMmFcIjtcbkBpb25pY29uLXZhci1zb2NpYWwtZHJpYmJibGU6IFwiXFxmMjJkXCI7XG5AaW9uaWNvbi12YXItc29jaWFsLWRyaWJiYmxlLW91dGxpbmU6IFwiXFxmMjJjXCI7XG5AaW9uaWNvbi12YXItc29jaWFsLWRyb3Bib3g6IFwiXFxmMjJmXCI7XG5AaW9uaWNvbi12YXItc29jaWFsLWRyb3Bib3gtb3V0bGluZTogXCJcXGYyMmVcIjtcbkBpb25pY29uLXZhci1zb2NpYWwtZXVybzogXCJcXGY0ZTFcIjtcbkBpb25pY29uLXZhci1zb2NpYWwtZXVyby1vdXRsaW5lOiBcIlxcZjRlMFwiO1xuQGlvbmljb24tdmFyLXNvY2lhbC1mYWNlYm9vazogXCJcXGYyMzFcIjtcbkBpb25pY29uLXZhci1zb2NpYWwtZmFjZWJvb2stb3V0bGluZTogXCJcXGYyMzBcIjtcbkBpb25pY29uLXZhci1zb2NpYWwtZm91cnNxdWFyZTogXCJcXGYzNGRcIjtcbkBpb25pY29uLXZhci1zb2NpYWwtZm91cnNxdWFyZS1vdXRsaW5lOiBcIlxcZjM0Y1wiO1xuQGlvbmljb24tdmFyLXNvY2lhbC1mcmVlYnNkLWRldmlsOiBcIlxcZjJjNFwiO1xuQGlvbmljb24tdmFyLXNvY2lhbC1naXRodWI6IFwiXFxmMjMzXCI7XG5AaW9uaWNvbi12YXItc29jaWFsLWdpdGh1Yi1vdXRsaW5lOiBcIlxcZjIzMlwiO1xuQGlvbmljb24tdmFyLXNvY2lhbC1nb29nbGU6IFwiXFxmMzRmXCI7XG5AaW9uaWNvbi12YXItc29jaWFsLWdvb2dsZS1vdXRsaW5lOiBcIlxcZjM0ZVwiO1xuQGlvbmljb24tdmFyLXNvY2lhbC1nb29nbGVwbHVzOiBcIlxcZjIzNVwiO1xuQGlvbmljb24tdmFyLXNvY2lhbC1nb29nbGVwbHVzLW91dGxpbmU6IFwiXFxmMjM0XCI7XG5AaW9uaWNvbi12YXItc29jaWFsLWhhY2tlcm5ld3M6IFwiXFxmMjM3XCI7XG5AaW9uaWNvbi12YXItc29jaWFsLWhhY2tlcm5ld3Mtb3V0bGluZTogXCJcXGYyMzZcIjtcbkBpb25pY29uLXZhci1zb2NpYWwtaHRtbDU6IFwiXFxmNGUzXCI7XG5AaW9uaWNvbi12YXItc29jaWFsLWh0bWw1LW91dGxpbmU6IFwiXFxmNGUyXCI7XG5AaW9uaWNvbi12YXItc29jaWFsLWluc3RhZ3JhbTogXCJcXGYzNTFcIjtcbkBpb25pY29uLXZhci1zb2NpYWwtaW5zdGFncmFtLW91dGxpbmU6IFwiXFxmMzUwXCI7XG5AaW9uaWNvbi12YXItc29jaWFsLWphdmFzY3JpcHQ6IFwiXFxmNGU1XCI7XG5AaW9uaWNvbi12YXItc29jaWFsLWphdmFzY3JpcHQtb3V0bGluZTogXCJcXGY0ZTRcIjtcbkBpb25pY29uLXZhci1zb2NpYWwtbGlua2VkaW46IFwiXFxmMjM5XCI7XG5AaW9uaWNvbi12YXItc29jaWFsLWxpbmtlZGluLW91dGxpbmU6IFwiXFxmMjM4XCI7XG5AaW9uaWNvbi12YXItc29jaWFsLW1hcmtkb3duOiBcIlxcZjRlNlwiO1xuQGlvbmljb24tdmFyLXNvY2lhbC1ub2RlanM6IFwiXFxmNGU3XCI7XG5AaW9uaWNvbi12YXItc29jaWFsLW9jdG9jYXQ6IFwiXFxmNGU4XCI7XG5AaW9uaWNvbi12YXItc29jaWFsLXBpbnRlcmVzdDogXCJcXGYyYjFcIjtcbkBpb25pY29uLXZhci1zb2NpYWwtcGludGVyZXN0LW91dGxpbmU6IFwiXFxmMmIwXCI7XG5AaW9uaWNvbi12YXItc29jaWFsLXB5dGhvbjogXCJcXGY0ZTlcIjtcbkBpb25pY29uLXZhci1zb2NpYWwtcmVkZGl0OiBcIlxcZjIzYlwiO1xuQGlvbmljb24tdmFyLXNvY2lhbC1yZWRkaXQtb3V0bGluZTogXCJcXGYyM2FcIjtcbkBpb25pY29uLXZhci1zb2NpYWwtcnNzOiBcIlxcZjIzZFwiO1xuQGlvbmljb24tdmFyLXNvY2lhbC1yc3Mtb3V0bGluZTogXCJcXGYyM2NcIjtcbkBpb25pY29uLXZhci1zb2NpYWwtc2FzczogXCJcXGY0ZWFcIjtcbkBpb25pY29uLXZhci1zb2NpYWwtc2t5cGU6IFwiXFxmMjNmXCI7XG5AaW9uaWNvbi12YXItc29jaWFsLXNreXBlLW91dGxpbmU6IFwiXFxmMjNlXCI7XG5AaW9uaWNvbi12YXItc29jaWFsLXNuYXBjaGF0OiBcIlxcZjRlY1wiO1xuQGlvbmljb24tdmFyLXNvY2lhbC1zbmFwY2hhdC1vdXRsaW5lOiBcIlxcZjRlYlwiO1xuQGlvbmljb24tdmFyLXNvY2lhbC10dW1ibHI6IFwiXFxmMjQxXCI7XG5AaW9uaWNvbi12YXItc29jaWFsLXR1bWJsci1vdXRsaW5lOiBcIlxcZjI0MFwiO1xuQGlvbmljb24tdmFyLXNvY2lhbC10dXg6IFwiXFxmMmM1XCI7XG5AaW9uaWNvbi12YXItc29jaWFsLXR3aXRjaDogXCJcXGY0ZWVcIjtcbkBpb25pY29uLXZhci1zb2NpYWwtdHdpdGNoLW91dGxpbmU6IFwiXFxmNGVkXCI7XG5AaW9uaWNvbi12YXItc29jaWFsLXR3aXR0ZXI6IFwiXFxmMjQzXCI7XG5AaW9uaWNvbi12YXItc29jaWFsLXR3aXR0ZXItb3V0bGluZTogXCJcXGYyNDJcIjtcbkBpb25pY29uLXZhci1zb2NpYWwtdXNkOiBcIlxcZjM1M1wiO1xuQGlvbmljb24tdmFyLXNvY2lhbC11c2Qtb3V0bGluZTogXCJcXGYzNTJcIjtcbkBpb25pY29uLXZhci1zb2NpYWwtdmltZW86IFwiXFxmMjQ1XCI7XG5AaW9uaWNvbi12YXItc29jaWFsLXZpbWVvLW91dGxpbmU6IFwiXFxmMjQ0XCI7XG5AaW9uaWNvbi12YXItc29jaWFsLXdoYXRzYXBwOiBcIlxcZjRmMFwiO1xuQGlvbmljb24tdmFyLXNvY2lhbC13aGF0c2FwcC1vdXRsaW5lOiBcIlxcZjRlZlwiO1xuQGlvbmljb24tdmFyLXNvY2lhbC13aW5kb3dzOiBcIlxcZjI0N1wiO1xuQGlvbmljb24tdmFyLXNvY2lhbC13aW5kb3dzLW91dGxpbmU6IFwiXFxmMjQ2XCI7XG5AaW9uaWNvbi12YXItc29jaWFsLXdvcmRwcmVzczogXCJcXGYyNDlcIjtcbkBpb25pY29uLXZhci1zb2NpYWwtd29yZHByZXNzLW91dGxpbmU6IFwiXFxmMjQ4XCI7XG5AaW9uaWNvbi12YXItc29jaWFsLXlhaG9vOiBcIlxcZjI0YlwiO1xuQGlvbmljb24tdmFyLXNvY2lhbC15YWhvby1vdXRsaW5lOiBcIlxcZjI0YVwiO1xuQGlvbmljb24tdmFyLXNvY2lhbC15ZW46IFwiXFxmNGYyXCI7XG5AaW9uaWNvbi12YXItc29jaWFsLXllbi1vdXRsaW5lOiBcIlxcZjRmMVwiO1xuQGlvbmljb24tdmFyLXNvY2lhbC15b3V0dWJlOiBcIlxcZjI0ZFwiO1xuQGlvbmljb24tdmFyLXNvY2lhbC15b3V0dWJlLW91dGxpbmU6IFwiXFxmMjRjXCI7XG5AaW9uaWNvbi12YXItc291cC1jYW46IFwiXFxmNGY0XCI7XG5AaW9uaWNvbi12YXItc291cC1jYW4tb3V0bGluZTogXCJcXGY0ZjNcIjtcbkBpb25pY29uLXZhci1zcGVha2VycGhvbmU6IFwiXFxmMmIyXCI7XG5AaW9uaWNvbi12YXItc3BlZWRvbWV0ZXI6IFwiXFxmMmIzXCI7XG5AaW9uaWNvbi12YXItc3Bvb246IFwiXFxmMmI0XCI7XG5AaW9uaWNvbi12YXItc3RhcjogXCJcXGYyNGVcIjtcbkBpb25pY29uLXZhci1zdGF0cy1iYXJzOiBcIlxcZjJiNVwiO1xuQGlvbmljb24tdmFyLXN0ZWFtOiBcIlxcZjMwYlwiO1xuQGlvbmljb24tdmFyLXN0b3A6IFwiXFxmMjRmXCI7XG5AaW9uaWNvbi12YXItdGhlcm1vbWV0ZXI6IFwiXFxmMmI2XCI7XG5AaW9uaWNvbi12YXItdGh1bWJzZG93bjogXCJcXGYyNTBcIjtcbkBpb25pY29uLXZhci10aHVtYnN1cDogXCJcXGYyNTFcIjtcbkBpb25pY29uLXZhci10b2dnbGU6IFwiXFxmMzU1XCI7XG5AaW9uaWNvbi12YXItdG9nZ2xlLWZpbGxlZDogXCJcXGYzNTRcIjtcbkBpb25pY29uLXZhci10cmFuc2dlbmRlcjogXCJcXGY0ZjVcIjtcbkBpb25pY29uLXZhci10cmFzaC1hOiBcIlxcZjI1MlwiO1xuQGlvbmljb24tdmFyLXRyYXNoLWI6IFwiXFxmMjUzXCI7XG5AaW9uaWNvbi12YXItdHJvcGh5OiBcIlxcZjM1NlwiO1xuQGlvbmljb24tdmFyLXRzaGlydDogXCJcXGY0ZjdcIjtcbkBpb25pY29uLXZhci10c2hpcnQtb3V0bGluZTogXCJcXGY0ZjZcIjtcbkBpb25pY29uLXZhci11bWJyZWxsYTogXCJcXGYyYjdcIjtcbkBpb25pY29uLXZhci11bml2ZXJzaXR5OiBcIlxcZjM1N1wiO1xuQGlvbmljb24tdmFyLXVubG9ja2VkOiBcIlxcZjI1NFwiO1xuQGlvbmljb24tdmFyLXVwbG9hZDogXCJcXGYyNTVcIjtcbkBpb25pY29uLXZhci11c2I6IFwiXFxmMmI4XCI7XG5AaW9uaWNvbi12YXItdmlkZW9jYW1lcmE6IFwiXFxmMjU2XCI7XG5AaW9uaWNvbi12YXItdm9sdW1lLWhpZ2g6IFwiXFxmMjU3XCI7XG5AaW9uaWNvbi12YXItdm9sdW1lLWxvdzogXCJcXGYyNThcIjtcbkBpb25pY29uLXZhci12b2x1bWUtbWVkaXVtOiBcIlxcZjI1OVwiO1xuQGlvbmljb24tdmFyLXZvbHVtZS1tdXRlOiBcIlxcZjI1YVwiO1xuQGlvbmljb24tdmFyLXdhbmQ6IFwiXFxmMzU4XCI7XG5AaW9uaWNvbi12YXItd2F0ZXJkcm9wOiBcIlxcZjI1YlwiO1xuQGlvbmljb24tdmFyLXdpZmk6IFwiXFxmMjVjXCI7XG5AaW9uaWNvbi12YXItd2luZWdsYXNzOiBcIlxcZjJiOVwiO1xuQGlvbmljb24tdmFyLXdvbWFuOiBcIlxcZjI1ZFwiO1xuQGlvbmljb24tdmFyLXdyZW5jaDogXCJcXGYyYmFcIjtcbkBpb25pY29uLXZhci14Ym94OiBcIlxcZjMwY1wiOyIsIi8vIEFuaW1hdGlvbiBJY29uc1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLnNwaW4oKSB7XG4gIC13ZWJraXQtYW5pbWF0aW9uOiBzcGluIDFzIGluZmluaXRlIGxpbmVhcjtcbiAgLW1vei1hbmltYXRpb246IHNwaW4gMXMgaW5maW5pdGUgbGluZWFyO1xuICAtby1hbmltYXRpb246IHNwaW4gMXMgaW5maW5pdGUgbGluZWFyO1xuICBhbmltYXRpb246IHNwaW4gMXMgaW5maW5pdGUgbGluZWFyO1xufVxuXG4uQHtpb25pY29ucy1wcmVmaXh9bG9hZGluZy1hLFxuLkB7aW9uaWNvbnMtcHJlZml4fWxvYWRpbmctYixcbi5Ae2lvbmljb25zLXByZWZpeH1sb2FkaW5nLWMsXG4uQHtpb25pY29ucy1wcmVmaXh9bG9hZGluZy1kLFxuLkB7aW9uaWNvbnMtcHJlZml4fWxvb3BpbmcsXG4uQHtpb25pY29ucy1wcmVmaXh9cmVmcmVzaGluZyxcbi5Ae2lvbmljb25zLXByZWZpeH1pb3M3LXJlbG9hZGluZyB7XG4gICY6ZXh0ZW5kKC5pb24pO1xufVxuXG4uQHtpb25pY29ucy1wcmVmaXh9c3Bpbixcbi5Ae2lvbmljb25zLXByZWZpeH1sb2FkaW5nLWEsXG4uQHtpb25pY29ucy1wcmVmaXh9bG9hZGluZy1iLFxuLkB7aW9uaWNvbnMtcHJlZml4fWxvYWRpbmctYyxcbi5Ae2lvbmljb25zLXByZWZpeH1sb2FkaW5nLWQsXG4uQHtpb25pY29ucy1wcmVmaXh9bG9vcGluZyxcbi5Ae2lvbmljb25zLXByZWZpeH1yZWZyZXNoaW5nLFxuLkB7aW9uaWNvbnMtcHJlZml4fWlvczctcmVsb2FkaW5nIHtcbiAgLnNwaW4oKVxufVxuXG5ALW1vei1rZXlmcmFtZXMgc3BpbiB7XG4gIDAlIHsgLW1vei10cmFuc2Zvcm06IHJvdGF0ZSgwZGVnKTsgfVxuICAxMDAlIHsgLW1vei10cmFuc2Zvcm06IHJvdGF0ZSgzNTlkZWcpOyB9XG59XG5ALXdlYmtpdC1rZXlmcmFtZXMgc3BpbiB7XG4gIDAlIHsgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZSgwZGVnKTsgfVxuICAxMDAlIHsgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZSgzNTlkZWcpOyB9XG59XG5ALW8ta2V5ZnJhbWVzIHNwaW4ge1xuICAwJSB7IC1vLXRyYW5zZm9ybTogcm90YXRlKDBkZWcpOyB9XG4gIDEwMCUgeyAtby10cmFuc2Zvcm06IHJvdGF0ZSgzNTlkZWcpOyB9XG59XG5ALW1zLWtleWZyYW1lcyBzcGluIHtcbiAgMCUgeyAtbXMtdHJhbnNmb3JtOiByb3RhdGUoMGRlZyk7IH1cbiAgMTAwJSB7IC1tcy10cmFuc2Zvcm06IHJvdGF0ZSgzNTlkZWcpOyB9XG59XG5Aa2V5ZnJhbWVzIHNwaW4ge1xuICAwJSB7IHRyYW5zZm9ybTogcm90YXRlKDBkZWcpOyB9XG4gIDEwMCUgeyB0cmFuc2Zvcm06IHJvdGF0ZSgzNTlkZWcpOyB9XG59XG5cbi5Ae2lvbmljb25zLXByZWZpeH1sb2FkaW5nLWEge1xuICAtd2Via2l0LWFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IHN0ZXBzKDgsIHN0YXJ0KTtcbiAgLW1vei1hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBzdGVwcyg4LCBzdGFydCk7XG4gIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IHN0ZXBzKDgsIHN0YXJ0KTtcbn1cblxuLkB7aW9uaWNvbnMtcHJlZml4fWxvYWRpbmctYTpiZWZvcmUgeyBcbiAgJjpleHRlbmQoLkB7aW9uaWNvbnMtcHJlZml4fWxvYWQtYTpiZWZvcmUpO1xufVxuXG4uQHtpb25pY29ucy1wcmVmaXh9bG9hZGluZy1iOmJlZm9yZSB7IFxuICAmOmV4dGVuZCguQHtpb25pY29ucy1wcmVmaXh9bG9hZC1iOmJlZm9yZSk7XG59XG5cbi5Ae2lvbmljb25zLXByZWZpeH1sb2FkaW5nLWM6YmVmb3JlIHsgXG4gICY6ZXh0ZW5kKC5Ae2lvbmljb25zLXByZWZpeH1sb2FkLWM6YmVmb3JlKTtcbn1cblxuLkB7aW9uaWNvbnMtcHJlZml4fWxvYWRpbmctZDpiZWZvcmUgeyBcbiAgJjpleHRlbmQoLkB7aW9uaWNvbnMtcHJlZml4fWxvYWQtZDpiZWZvcmUpO1xufVxuXG4uQHtpb25pY29ucy1wcmVmaXh9bG9vcGluZzpiZWZvcmUgeyBcbiAgJjpleHRlbmQoLkB7aW9uaWNvbnMtcHJlZml4fWxvb3A6YmVmb3JlKTtcbn1cblxuLkB7aW9uaWNvbnMtcHJlZml4fXJlZnJlc2hpbmc6YmVmb3JlIHsgXG4gICY6ZXh0ZW5kKC5Ae2lvbmljb25zLXByZWZpeH1yZWZyZXNoOmJlZm9yZSk7XG59XG5cbi5Ae2lvbmljb25zLXByZWZpeH1pb3M3LXJlbG9hZGluZzpiZWZvcmUgeyBcbiAgJjpleHRlbmQoLkB7aW9uaWNvbnMtcHJlZml4fWlvczctcmVsb2FkOmJlZm9yZSk7XG59XG4iLCIvLyBJb25pY29ucyBJY29uc1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLmlvbmljb25zLFxuLkB7aW9uaWNvbnMtcHJlZml4fWFsZXJ0OmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1hbGVydC1jaXJjbGVkOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1hbmRyb2lkLWFkZDpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9YW5kcm9pZC1hZGQtY2lyY2xlOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1hbmRyb2lkLWFsYXJtLWNsb2NrOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1hbmRyb2lkLWFsZXJ0OmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1hbmRyb2lkLWFwcHM6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWFuZHJvaWQtYXJjaGl2ZTpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9YW5kcm9pZC1hcnJvdy1iYWNrOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1hbmRyb2lkLWFycm93LWRvd246YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWFuZHJvaWQtYXJyb3ctZHJvcGRvd246YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWFuZHJvaWQtYXJyb3ctZHJvcGRvd24tY2lyY2xlOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1hbmRyb2lkLWFycm93LWRyb3BsZWZ0OmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1hbmRyb2lkLWFycm93LWRyb3BsZWZ0LWNpcmNsZTpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9YW5kcm9pZC1hcnJvdy1kcm9wcmlnaHQ6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWFuZHJvaWQtYXJyb3ctZHJvcHJpZ2h0LWNpcmNsZTpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9YW5kcm9pZC1hcnJvdy1kcm9wdXA6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWFuZHJvaWQtYXJyb3ctZHJvcHVwLWNpcmNsZTpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9YW5kcm9pZC1hcnJvdy1mb3J3YXJkOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1hbmRyb2lkLWFycm93LXVwOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1hbmRyb2lkLWF0dGFjaDpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9YW5kcm9pZC1iYXI6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWFuZHJvaWQtYmljeWNsZTpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9YW5kcm9pZC1ib2F0OmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1hbmRyb2lkLWJvb2ttYXJrOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1hbmRyb2lkLWJ1bGI6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWFuZHJvaWQtYnVzOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1hbmRyb2lkLWNhbGVuZGFyOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1hbmRyb2lkLWNhbGw6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWFuZHJvaWQtY2FtZXJhOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1hbmRyb2lkLWNhbmNlbDpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9YW5kcm9pZC1jYXI6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWFuZHJvaWQtY2FydDpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9YW5kcm9pZC1jaGF0OmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1hbmRyb2lkLWNoZWNrYm94OmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1hbmRyb2lkLWNoZWNrYm94LWJsYW5rOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1hbmRyb2lkLWNoZWNrYm94LW91dGxpbmU6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWFuZHJvaWQtY2hlY2tib3gtb3V0bGluZS1ibGFuazpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9YW5kcm9pZC1jaGVja21hcmstY2lyY2xlOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1hbmRyb2lkLWNsaXBib2FyZDpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9YW5kcm9pZC1jbG9zZTpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9YW5kcm9pZC1jbG91ZDpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9YW5kcm9pZC1jbG91ZC1jaXJjbGU6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWFuZHJvaWQtY2xvdWQtZG9uZTpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9YW5kcm9pZC1jbG91ZC1vdXRsaW5lOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1hbmRyb2lkLWNvbG9yLXBhbGV0dGU6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWFuZHJvaWQtY29tcGFzczpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9YW5kcm9pZC1jb250YWN0OmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1hbmRyb2lkLWNvbnRhY3RzOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1hbmRyb2lkLWNvbnRyYWN0OmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1hbmRyb2lkLWNyZWF0ZTpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9YW5kcm9pZC1kZWxldGU6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWFuZHJvaWQtZGVza3RvcDpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9YW5kcm9pZC1kb2N1bWVudDpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9YW5kcm9pZC1kb25lOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1hbmRyb2lkLWRvbmUtYWxsOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1hbmRyb2lkLWRvd25sb2FkOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1hbmRyb2lkLWRyYWZ0czpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9YW5kcm9pZC1leGl0OmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1hbmRyb2lkLWV4cGFuZDpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9YW5kcm9pZC1mYXZvcml0ZTpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9YW5kcm9pZC1mYXZvcml0ZS1vdXRsaW5lOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1hbmRyb2lkLWZpbG06YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWFuZHJvaWQtZm9sZGVyOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1hbmRyb2lkLWZvbGRlci1vcGVuOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1hbmRyb2lkLWZ1bm5lbDpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9YW5kcm9pZC1nbG9iZTpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9YW5kcm9pZC1oYW5kOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1hbmRyb2lkLWhhbmdvdXQ6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWFuZHJvaWQtaGFwcHk6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWFuZHJvaWQtaG9tZTpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9YW5kcm9pZC1pbWFnZTpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9YW5kcm9pZC1sYXB0b3A6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWFuZHJvaWQtbGlzdDpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9YW5kcm9pZC1sb2NhdGU6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWFuZHJvaWQtbG9jazpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9YW5kcm9pZC1tYWlsOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1hbmRyb2lkLW1hcDpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9YW5kcm9pZC1tZW51OmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1hbmRyb2lkLW1pY3JvcGhvbmU6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWFuZHJvaWQtbWljcm9waG9uZS1vZmY6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWFuZHJvaWQtbW9yZS1ob3Jpem9udGFsOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1hbmRyb2lkLW1vcmUtdmVydGljYWw6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWFuZHJvaWQtbmF2aWdhdGU6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWFuZHJvaWQtbm90aWZpY2F0aW9uczpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9YW5kcm9pZC1ub3RpZmljYXRpb25zLW5vbmU6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWFuZHJvaWQtbm90aWZpY2F0aW9ucy1vZmY6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWFuZHJvaWQtb3BlbjpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9YW5kcm9pZC1vcHRpb25zOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1hbmRyb2lkLXBlb3BsZTpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9YW5kcm9pZC1wZXJzb246YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWFuZHJvaWQtcGVyc29uLWFkZDpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9YW5kcm9pZC1waG9uZS1sYW5kc2NhcGU6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWFuZHJvaWQtcGhvbmUtcG9ydHJhaXQ6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWFuZHJvaWQtcGluOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1hbmRyb2lkLXBsYW5lOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1hbmRyb2lkLXBsYXlzdG9yZTpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9YW5kcm9pZC1wcmludDpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9YW5kcm9pZC1yYWRpby1idXR0b24tb2ZmOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1hbmRyb2lkLXJhZGlvLWJ1dHRvbi1vbjpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9YW5kcm9pZC1yZWZyZXNoOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1hbmRyb2lkLXJlbW92ZTpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9YW5kcm9pZC1yZW1vdmUtY2lyY2xlOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1hbmRyb2lkLXJlc3RhdXJhbnQ6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWFuZHJvaWQtc2FkOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1hbmRyb2lkLXNlYXJjaDpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9YW5kcm9pZC1zZW5kOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1hbmRyb2lkLXNldHRpbmdzOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1hbmRyb2lkLXNoYXJlOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1hbmRyb2lkLXNoYXJlLWFsdDpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9YW5kcm9pZC1zdGFyOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1hbmRyb2lkLXN0YXItaGFsZjpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9YW5kcm9pZC1zdGFyLW91dGxpbmU6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWFuZHJvaWQtc3RvcHdhdGNoOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1hbmRyb2lkLXN1YndheTpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9YW5kcm9pZC1zdW5ueTpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9YW5kcm9pZC1zeW5jOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1hbmRyb2lkLXRleHRzbXM6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWFuZHJvaWQtdGltZTpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9YW5kcm9pZC10cmFpbjpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9YW5kcm9pZC11bmxvY2s6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWFuZHJvaWQtdXBsb2FkOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1hbmRyb2lkLXZvbHVtZS1kb3duOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1hbmRyb2lkLXZvbHVtZS1tdXRlOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1hbmRyb2lkLXZvbHVtZS1vZmY6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWFuZHJvaWQtdm9sdW1lLXVwOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1hbmRyb2lkLXdhbGs6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWFuZHJvaWQtd2FybmluZzpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9YW5kcm9pZC13YXRjaDpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9YW5kcm9pZC13aWZpOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1hcGVydHVyZTpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9YXJjaGl2ZTpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9YXJyb3ctZG93bi1hOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1hcnJvdy1kb3duLWI6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWFycm93LWRvd24tYzpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9YXJyb3ctZXhwYW5kOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1hcnJvdy1ncmFwaC1kb3duLWxlZnQ6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWFycm93LWdyYXBoLWRvd24tcmlnaHQ6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWFycm93LWdyYXBoLXVwLWxlZnQ6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWFycm93LWdyYXBoLXVwLXJpZ2h0OmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1hcnJvdy1sZWZ0LWE6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWFycm93LWxlZnQtYjpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9YXJyb3ctbGVmdC1jOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1hcnJvdy1tb3ZlOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1hcnJvdy1yZXNpemU6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWFycm93LXJldHVybi1sZWZ0OmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1hcnJvdy1yZXR1cm4tcmlnaHQ6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWFycm93LXJpZ2h0LWE6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWFycm93LXJpZ2h0LWI6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWFycm93LXJpZ2h0LWM6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWFycm93LXNocmluazpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9YXJyb3ctc3dhcDpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9YXJyb3ctdXAtYTpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9YXJyb3ctdXAtYjpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9YXJyb3ctdXAtYzpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9YXN0ZXJpc2s6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWF0OmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1iYWNrc3BhY2U6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWJhY2tzcGFjZS1vdXRsaW5lOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1iYWc6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWJhdHRlcnktY2hhcmdpbmc6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWJhdHRlcnktZW1wdHk6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWJhdHRlcnktZnVsbDpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9YmF0dGVyeS1oYWxmOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1iYXR0ZXJ5LWxvdzpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9YmVha2VyOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1iZWVyOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1ibHVldG9vdGg6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWJvbmZpcmU6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWJvb2ttYXJrOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1ib3d0aWU6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWJyaWVmY2FzZTpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9YnVnOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1jYWxjdWxhdG9yOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1jYWxlbmRhcjpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9Y2FtZXJhOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1jYXJkOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1jYXNoOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1jaGF0Ym94OmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1jaGF0Ym94LXdvcmtpbmc6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWNoYXRib3hlczpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9Y2hhdGJ1YmJsZTpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9Y2hhdGJ1YmJsZS13b3JraW5nOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1jaGF0YnViYmxlczpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9Y2hlY2ttYXJrOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1jaGVja21hcmstY2lyY2xlZDpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9Y2hlY2ttYXJrLXJvdW5kOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1jaGV2cm9uLWRvd246YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWNoZXZyb24tbGVmdDpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9Y2hldnJvbi1yaWdodDpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9Y2hldnJvbi11cDpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9Y2xpcGJvYXJkOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1jbG9jazpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9Y2xvc2U6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWNsb3NlLWNpcmNsZWQ6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWNsb3NlLXJvdW5kOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1jbG9zZWQtY2FwdGlvbmluZzpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9Y2xvdWQ6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWNvZGU6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWNvZGUtZG93bmxvYWQ6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWNvZGUtd29ya2luZzpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9Y29mZmVlOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1jb21wYXNzOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1jb21wb3NlOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1jb25uZWN0aW9uLWJhcnM6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWNvbnRyYXN0OmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1jcm9wOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1jdWJlOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1kaXNjOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1kb2N1bWVudDpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9ZG9jdW1lbnQtdGV4dDpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9ZHJhZzpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9ZWFydGg6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWVhc2VsOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1lZGl0OmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1lZ2c6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWVqZWN0OmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1lbWFpbDpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9ZW1haWwtdW5yZWFkOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1lcmxlbm1leWVyLWZsYXNrOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1lcmxlbm1leWVyLWZsYXNrLWJ1YmJsZXM6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWV5ZTpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9ZXllLWRpc2FibGVkOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1mZW1hbGU6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWZpbGluZzpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9ZmlsbS1tYXJrZXI6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWZpcmViYWxsOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1mbGFnOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1mbGFtZTpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9Zmxhc2g6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWZsYXNoLW9mZjpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9Zm9sZGVyOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1mb3JrOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1mb3JrLXJlcG86YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWZvcndhcmQ6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWZ1bm5lbDpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9Z2Vhci1hOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1nZWFyLWI6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWdyaWQ6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWhhbW1lcjpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9aGFwcHk6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWhhcHB5LW91dGxpbmU6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWhlYWRwaG9uZTpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9aGVhcnQ6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWhlYXJ0LWJyb2tlbjpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9aGVscDpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9aGVscC1idW95OmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1oZWxwLWNpcmNsZWQ6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWhvbWU6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWljZWNyZWFtOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1pbWFnZTpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9aW1hZ2VzOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1pbmZvcm1hdGlvbjpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9aW5mb3JtYXRpb24tY2lyY2xlZDpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9aW9uaWM6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1hbGFybTpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLWFsYXJtLW91dGxpbmU6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1hbGJ1bXM6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1hbGJ1bXMtb3V0bGluZTpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLWFtZXJpY2FuZm9vdGJhbGw6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1hbWVyaWNhbmZvb3RiYWxsLW91dGxpbmU6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1hbmFseXRpY3M6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1hbmFseXRpY3Mtb3V0bGluZTpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLWFycm93LWJhY2s6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1hcnJvdy1kb3duOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtYXJyb3ctZm9yd2FyZDpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLWFycm93LWxlZnQ6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1hcnJvdy1yaWdodDpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLWFycm93LXRoaW4tZG93bjpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLWFycm93LXRoaW4tbGVmdDpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLWFycm93LXRoaW4tcmlnaHQ6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1hcnJvdy10aGluLXVwOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtYXJyb3ctdXA6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1hdDpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLWF0LW91dGxpbmU6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1iYXJjb2RlOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtYmFyY29kZS1vdXRsaW5lOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtYmFzZWJhbGw6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1iYXNlYmFsbC1vdXRsaW5lOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtYmFza2V0YmFsbDpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLWJhc2tldGJhbGwtb3V0bGluZTpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLWJlbGw6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1iZWxsLW91dGxpbmU6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1ib2R5OmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtYm9keS1vdXRsaW5lOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtYm9sdDpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLWJvbHQtb3V0bGluZTpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLWJvb2s6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1ib29rLW91dGxpbmU6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1ib29rbWFya3M6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1ib29rbWFya3Mtb3V0bGluZTpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLWJveDpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLWJveC1vdXRsaW5lOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtYnJpZWZjYXNlOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtYnJpZWZjYXNlLW91dGxpbmU6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1icm93c2VyczpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLWJyb3dzZXJzLW91dGxpbmU6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1jYWxjdWxhdG9yOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtY2FsY3VsYXRvci1vdXRsaW5lOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtY2FsZW5kYXI6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1jYWxlbmRhci1vdXRsaW5lOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtY2FtZXJhOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtY2FtZXJhLW91dGxpbmU6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1jYXJ0OmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtY2FydC1vdXRsaW5lOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtY2hhdGJveGVzOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtY2hhdGJveGVzLW91dGxpbmU6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1jaGF0YnViYmxlOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtY2hhdGJ1YmJsZS1vdXRsaW5lOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtY2hlY2ttYXJrOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtY2hlY2ttYXJrLWVtcHR5OmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtY2hlY2ttYXJrLW91dGxpbmU6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1jaXJjbGUtZmlsbGVkOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtY2lyY2xlLW91dGxpbmU6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1jbG9jazpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLWNsb2NrLW91dGxpbmU6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1jbG9zZTpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLWNsb3NlLWVtcHR5OmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtY2xvc2Utb3V0bGluZTpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLWNsb3VkOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtY2xvdWQtZG93bmxvYWQ6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1jbG91ZC1kb3dubG9hZC1vdXRsaW5lOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtY2xvdWQtb3V0bGluZTpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLWNsb3VkLXVwbG9hZDpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLWNsb3VkLXVwbG9hZC1vdXRsaW5lOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtY2xvdWR5OmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtY2xvdWR5LW5pZ2h0OmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtY2xvdWR5LW5pZ2h0LW91dGxpbmU6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1jbG91ZHktb3V0bGluZTpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLWNvZzpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLWNvZy1vdXRsaW5lOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtY29sb3ItZmlsdGVyOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtY29sb3ItZmlsdGVyLW91dGxpbmU6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1jb2xvci13YW5kOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtY29sb3Itd2FuZC1vdXRsaW5lOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtY29tcG9zZTpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLWNvbXBvc2Utb3V0bGluZTpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLWNvbnRhY3Q6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1jb250YWN0LW91dGxpbmU6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1jb3B5OmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtY29weS1vdXRsaW5lOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtY3JvcDpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLWNyb3Atc3Ryb25nOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtZG93bmxvYWQ6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1kb3dubG9hZC1vdXRsaW5lOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtZHJhZzpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLWVtYWlsOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtZW1haWwtb3V0bGluZTpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLWV5ZTpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLWV5ZS1vdXRsaW5lOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtZmFzdGZvcndhcmQ6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1mYXN0Zm9yd2FyZC1vdXRsaW5lOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtZmlsaW5nOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtZmlsaW5nLW91dGxpbmU6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1maWxtOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtZmlsbS1vdXRsaW5lOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtZmxhZzpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLWZsYWctb3V0bGluZTpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLWZsYW1lOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtZmxhbWUtb3V0bGluZTpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLWZsYXNrOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtZmxhc2stb3V0bGluZTpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLWZsb3dlcjpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLWZsb3dlci1vdXRsaW5lOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtZm9sZGVyOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtZm9sZGVyLW91dGxpbmU6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1mb290YmFsbDpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLWZvb3RiYWxsLW91dGxpbmU6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1nYW1lLWNvbnRyb2xsZXItYTpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLWdhbWUtY29udHJvbGxlci1hLW91dGxpbmU6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1nYW1lLWNvbnRyb2xsZXItYjpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLWdhbWUtY29udHJvbGxlci1iLW91dGxpbmU6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1nZWFyOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtZ2Vhci1vdXRsaW5lOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtZ2xhc3NlczpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLWdsYXNzZXMtb3V0bGluZTpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLWdyaWQtdmlldzpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLWdyaWQtdmlldy1vdXRsaW5lOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtaGVhcnQ6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1oZWFydC1vdXRsaW5lOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtaGVscDpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLWhlbHAtZW1wdHk6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1oZWxwLW91dGxpbmU6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1ob21lOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtaG9tZS1vdXRsaW5lOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtaW5maW5pdGU6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1pbmZpbml0ZS1vdXRsaW5lOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtaW5mb3JtYXRpb246YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1pbmZvcm1hdGlvbi1lbXB0eTpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLWluZm9ybWF0aW9uLW91dGxpbmU6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1pb25pYy1vdXRsaW5lOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1pb3Mta2V5cGFkOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1pb3Mta2V5cGFkLW91dGxpbmU6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1saWdodGJ1bGI6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1saWdodGJ1bGItb3V0bGluZTpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLWxpc3Q6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1saXN0LW91dGxpbmU6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1sb2NhdGlvbjpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLWxvY2F0aW9uLW91dGxpbmU6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1sb2NrZWQ6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1sb2NrZWQtb3V0bGluZTpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLWxvb3A6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1sb29wLXN0cm9uZzpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLW1lZGljYWw6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1tZWRpY2FsLW91dGxpbmU6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1tZWRraXQ6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1tZWRraXQtb3V0bGluZTpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLW1pYzpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLW1pYy1vZmY6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1taWMtb3V0bGluZTpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLW1pbnVzOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtbWludXMtZW1wdHk6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1taW51cy1vdXRsaW5lOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtbW9uaXRvcjpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLW1vbml0b3Itb3V0bGluZTpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLW1vb246YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1tb29uLW91dGxpbmU6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1tb3JlOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtbW9yZS1vdXRsaW5lOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtbXVzaWNhbC1ub3RlOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtbXVzaWNhbC1ub3RlczpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLW5hdmlnYXRlOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtbmF2aWdhdGUtb3V0bGluZTpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLW51dHJpdGlvbjpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLW51dHJpdGlvbi1vdXRsaW5lOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtcGFwZXI6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1wYXBlci1vdXRsaW5lOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtcGFwZXJwbGFuZTpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLXBhcGVycGxhbmUtb3V0bGluZTpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLXBhcnRseXN1bm55OmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtcGFydGx5c3Vubnktb3V0bGluZTpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLXBhdXNlOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtcGF1c2Utb3V0bGluZTpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLXBhdzpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLXBhdy1vdXRsaW5lOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtcGVvcGxlOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtcGVvcGxlLW91dGxpbmU6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1wZXJzb246YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1wZXJzb24tb3V0bGluZTpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLXBlcnNvbmFkZDpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLXBlcnNvbmFkZC1vdXRsaW5lOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtcGhvdG9zOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtcGhvdG9zLW91dGxpbmU6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1waWU6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1waWUtb3V0bGluZTpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLXBpbnQ6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1waW50LW91dGxpbmU6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1wbGF5OmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtcGxheS1vdXRsaW5lOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtcGx1czpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLXBsdXMtZW1wdHk6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1wbHVzLW91dGxpbmU6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1wcmljZXRhZzpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLXByaWNldGFnLW91dGxpbmU6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1wcmljZXRhZ3M6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1wcmljZXRhZ3Mtb3V0bGluZTpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLXByaW50ZXI6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1wcmludGVyLW91dGxpbmU6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1wdWxzZTpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLXB1bHNlLXN0cm9uZzpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLXJhaW55OmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtcmFpbnktb3V0bGluZTpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLXJlY29yZGluZzpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLXJlY29yZGluZy1vdXRsaW5lOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtcmVkbzpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLXJlZG8tb3V0bGluZTpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLXJlZnJlc2g6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1yZWZyZXNoLWVtcHR5OmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtcmVmcmVzaC1vdXRsaW5lOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtcmVsb2FkOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtcmV2ZXJzZS1jYW1lcmE6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1yZXZlcnNlLWNhbWVyYS1vdXRsaW5lOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtcmV3aW5kOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtcmV3aW5kLW91dGxpbmU6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1yb3NlOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1pb3Mtcm9zZS1vdXRsaW5lOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1pb3Mtc2VhcmNoOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1pb3Mtc2VhcmNoLXN0cm9uZzpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLXNldHRpbmdzOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1pb3Mtc2V0dGluZ3Mtc3Ryb25nOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1pb3Mtc2h1ZmZsZTpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLXNodWZmbGUtc3Ryb25nOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1pb3Mtc2tpcGJhY2t3YXJkOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1pb3Mtc2tpcGJhY2t3YXJkLW91dGxpbmU6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1za2lwZm9yd2FyZDpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLXNraXBmb3J3YXJkLW91dGxpbmU6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1zbm93eTpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLXNwZWVkb21ldGVyOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1pb3Mtc3BlZWRvbWV0ZXItb3V0bGluZTpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLXN0YXI6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1zdGFyLWhhbGY6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1zdGFyLW91dGxpbmU6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1zdG9wd2F0Y2g6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1zdG9wd2F0Y2gtb3V0bGluZTpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLXN1bm55OmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1pb3Mtc3Vubnktb3V0bGluZTpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLXRlbGVwaG9uZTpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLXRlbGVwaG9uZS1vdXRsaW5lOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtdGVubmlzYmFsbDpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLXRlbm5pc2JhbGwtb3V0bGluZTpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLXRodW5kZXJzdG9ybTpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLXRodW5kZXJzdG9ybS1vdXRsaW5lOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtdGltZTpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLXRpbWUtb3V0bGluZTpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLXRpbWVyOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtdGltZXItb3V0bGluZTpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLXRvZ2dsZTpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLXRvZ2dsZS1vdXRsaW5lOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtdHJhc2g6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy10cmFzaC1vdXRsaW5lOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtdW5kbzpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLXVuZG8tb3V0bGluZTpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLXVubG9ja2VkOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtdW5sb2NrZWQtb3V0bGluZTpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLXVwbG9hZDpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLXVwbG9hZC1vdXRsaW5lOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtdmlkZW9jYW06YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy12aWRlb2NhbS1vdXRsaW5lOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1pb3Mtdm9sdW1lLWhpZ2g6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy12b2x1bWUtbG93OmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1pb3Mtd2luZWdsYXNzOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1pb3Mtd2luZWdsYXNzLW91dGxpbmU6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy13b3JsZDpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLXdvcmxkLW91dGxpbmU6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWlwYWQ6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWlwaG9uZTpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9aXBvZDpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9amV0OmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1rZXk6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWtuaWZlOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1sYXB0b3A6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWxlYWY6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWxldmVsczpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9bGlnaHRidWxiOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1saW5rOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1sb2FkLWE6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWxvYWQtYjpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9bG9hZC1jOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1sb2FkLWQ6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWxvY2F0aW9uOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1sb2NrLWNvbWJpbmF0aW9uOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1sb2NrZWQ6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWxvZy1pbjpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9bG9nLW91dDpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9bG9vcDpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9bWFnbmV0OmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1tYWxlOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1tYW46YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fW1hcDpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9bWVka2l0OmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1tZXJnZTpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9bWljLWE6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fW1pYy1iOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1taWMtYzpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9bWludXM6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fW1pbnVzLWNpcmNsZWQ6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fW1pbnVzLXJvdW5kOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1tb2RlbC1zOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1tb25pdG9yOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1tb3JlOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1tb3VzZTpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9bXVzaWMtbm90ZTpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9bmF2aWNvbjpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9bmF2aWNvbi1yb3VuZDpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9bmF2aWdhdGU6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fW5ldHdvcms6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fW5vLXNtb2tpbmc6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fW51Y2xlYXI6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fW91dGxldDpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9cGFpbnRicnVzaDpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9cGFpbnRidWNrZXQ6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fXBhcGVyLWFpcnBsYW5lOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1wYXBlcmNsaXA6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fXBhdXNlOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1wZXJzb246YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fXBlcnNvbi1hZGQ6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fXBlcnNvbi1zdGFsa2VyOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1waWUtZ3JhcGg6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fXBpbjpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9cGlucG9pbnQ6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fXBpenphOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1wbGFuZTpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9cGxhbmV0OmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1wbGF5OmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1wbGF5c3RhdGlvbjpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9cGx1czpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9cGx1cy1jaXJjbGVkOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1wbHVzLXJvdW5kOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1wb2RpdW06YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fXBvdW5kOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1wb3dlcjpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9cHJpY2V0YWc6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fXByaWNldGFnczpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9cHJpbnRlcjpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9cHVsbC1yZXF1ZXN0OmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1xci1zY2FubmVyOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1xdW90ZTpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9cmFkaW8td2F2ZXM6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fXJlY29yZDpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9cmVmcmVzaDpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9cmVwbHk6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fXJlcGx5LWFsbDpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9cmliYm9uLWE6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fXJpYmJvbi1iOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1zYWQ6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fXNhZC1vdXRsaW5lOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1zY2lzc29yczpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9c2VhcmNoOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1zZXR0aW5nczpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9c2hhcmU6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fXNodWZmbGU6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fXNraXAtYmFja3dhcmQ6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fXNraXAtZm9yd2FyZDpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9c29jaWFsLWFuZHJvaWQ6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fXNvY2lhbC1hbmRyb2lkLW91dGxpbmU6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fXNvY2lhbC1hbmd1bGFyOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1zb2NpYWwtYW5ndWxhci1vdXRsaW5lOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1zb2NpYWwtYXBwbGU6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fXNvY2lhbC1hcHBsZS1vdXRsaW5lOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1zb2NpYWwtYml0Y29pbjpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9c29jaWFsLWJpdGNvaW4tb3V0bGluZTpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9c29jaWFsLWJ1ZmZlcjpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9c29jaWFsLWJ1ZmZlci1vdXRsaW5lOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1zb2NpYWwtY2hyb21lOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1zb2NpYWwtY2hyb21lLW91dGxpbmU6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fXNvY2lhbC1jb2RlcGVuOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1zb2NpYWwtY29kZXBlbi1vdXRsaW5lOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1zb2NpYWwtY3NzMzpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9c29jaWFsLWNzczMtb3V0bGluZTpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9c29jaWFsLWRlc2lnbmVybmV3czpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9c29jaWFsLWRlc2lnbmVybmV3cy1vdXRsaW5lOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1zb2NpYWwtZHJpYmJibGU6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fXNvY2lhbC1kcmliYmJsZS1vdXRsaW5lOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1zb2NpYWwtZHJvcGJveDpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9c29jaWFsLWRyb3Bib3gtb3V0bGluZTpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9c29jaWFsLWV1cm86YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fXNvY2lhbC1ldXJvLW91dGxpbmU6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fXNvY2lhbC1mYWNlYm9vazpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9c29jaWFsLWZhY2Vib29rLW91dGxpbmU6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fXNvY2lhbC1mb3Vyc3F1YXJlOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1zb2NpYWwtZm91cnNxdWFyZS1vdXRsaW5lOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1zb2NpYWwtZnJlZWJzZC1kZXZpbDpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9c29jaWFsLWdpdGh1YjpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9c29jaWFsLWdpdGh1Yi1vdXRsaW5lOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1zb2NpYWwtZ29vZ2xlOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1zb2NpYWwtZ29vZ2xlLW91dGxpbmU6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fXNvY2lhbC1nb29nbGVwbHVzOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1zb2NpYWwtZ29vZ2xlcGx1cy1vdXRsaW5lOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1zb2NpYWwtaGFja2VybmV3czpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9c29jaWFsLWhhY2tlcm5ld3Mtb3V0bGluZTpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9c29jaWFsLWh0bWw1OmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1zb2NpYWwtaHRtbDUtb3V0bGluZTpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9c29jaWFsLWluc3RhZ3JhbTpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9c29jaWFsLWluc3RhZ3JhbS1vdXRsaW5lOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1zb2NpYWwtamF2YXNjcmlwdDpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9c29jaWFsLWphdmFzY3JpcHQtb3V0bGluZTpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9c29jaWFsLWxpbmtlZGluOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1zb2NpYWwtbGlua2VkaW4tb3V0bGluZTpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9c29jaWFsLW1hcmtkb3duOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1zb2NpYWwtbm9kZWpzOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1zb2NpYWwtb2N0b2NhdDpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9c29jaWFsLXBpbnRlcmVzdDpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9c29jaWFsLXBpbnRlcmVzdC1vdXRsaW5lOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1zb2NpYWwtcHl0aG9uOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1zb2NpYWwtcmVkZGl0OmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1zb2NpYWwtcmVkZGl0LW91dGxpbmU6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fXNvY2lhbC1yc3M6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fXNvY2lhbC1yc3Mtb3V0bGluZTpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9c29jaWFsLXNhc3M6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fXNvY2lhbC1za3lwZTpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9c29jaWFsLXNreXBlLW91dGxpbmU6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fXNvY2lhbC1zbmFwY2hhdDpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9c29jaWFsLXNuYXBjaGF0LW91dGxpbmU6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fXNvY2lhbC10dW1ibHI6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fXNvY2lhbC10dW1ibHItb3V0bGluZTpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9c29jaWFsLXR1eDpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9c29jaWFsLXR3aXRjaDpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9c29jaWFsLXR3aXRjaC1vdXRsaW5lOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1zb2NpYWwtdHdpdHRlcjpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9c29jaWFsLXR3aXR0ZXItb3V0bGluZTpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9c29jaWFsLXVzZDpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9c29jaWFsLXVzZC1vdXRsaW5lOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1zb2NpYWwtdmltZW86YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fXNvY2lhbC12aW1lby1vdXRsaW5lOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1zb2NpYWwtd2hhdHNhcHA6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fXNvY2lhbC13aGF0c2FwcC1vdXRsaW5lOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1zb2NpYWwtd2luZG93czpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9c29jaWFsLXdpbmRvd3Mtb3V0bGluZTpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9c29jaWFsLXdvcmRwcmVzczpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9c29jaWFsLXdvcmRwcmVzcy1vdXRsaW5lOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1zb2NpYWwteWFob286YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fXNvY2lhbC15YWhvby1vdXRsaW5lOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1zb2NpYWwteWVuOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1zb2NpYWwteWVuLW91dGxpbmU6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fXNvY2lhbC15b3V0dWJlOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1zb2NpYWwteW91dHViZS1vdXRsaW5lOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1zb3VwLWNhbjpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9c291cC1jYW4tb3V0bGluZTpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9c3BlYWtlcnBob25lOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1zcGVlZG9tZXRlcjpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9c3Bvb246YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fXN0YXI6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fXN0YXRzLWJhcnM6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fXN0ZWFtOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1zdG9wOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH10aGVybW9tZXRlcjpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9dGh1bWJzZG93bjpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9dGh1bWJzdXA6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fXRvZ2dsZTpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9dG9nZ2xlLWZpbGxlZDpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9dHJhbnNnZW5kZXI6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fXRyYXNoLWE6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fXRyYXNoLWI6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fXRyb3BoeTpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9dHNoaXJ0OmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH10c2hpcnQtb3V0bGluZTpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9dW1icmVsbGE6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fXVuaXZlcnNpdHk6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fXVubG9ja2VkOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH11cGxvYWQ6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fXVzYjpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9dmlkZW9jYW1lcmE6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fXZvbHVtZS1oaWdoOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH12b2x1bWUtbG93OmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH12b2x1bWUtbWVkaXVtOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH12b2x1bWUtbXV0ZTpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9d2FuZDpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9d2F0ZXJkcm9wOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH13aWZpOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH13aW5lZ2xhc3M6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fXdvbWFuOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH13cmVuY2g6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fXhib3g6YmVmb3JlXG57XG4gICY6ZXh0ZW5kKC5pb24pO1xufVxuLkB7aW9uaWNvbnMtcHJlZml4fWFsZXJ0OmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1hbGVydDsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWFsZXJ0LWNpcmNsZWQ6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWFsZXJ0LWNpcmNsZWQ7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1hbmRyb2lkLWFkZDpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItYW5kcm9pZC1hZGQ7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1hbmRyb2lkLWFkZC1jaXJjbGU6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWFuZHJvaWQtYWRkLWNpcmNsZTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWFuZHJvaWQtYWxhcm0tY2xvY2s6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWFuZHJvaWQtYWxhcm0tY2xvY2s7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1hbmRyb2lkLWFsZXJ0OmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1hbmRyb2lkLWFsZXJ0OyB9XG4uQHtpb25pY29ucy1wcmVmaXh9YW5kcm9pZC1hcHBzOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1hbmRyb2lkLWFwcHM7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1hbmRyb2lkLWFyY2hpdmU6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWFuZHJvaWQtYXJjaGl2ZTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWFuZHJvaWQtYXJyb3ctYmFjazpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItYW5kcm9pZC1hcnJvdy1iYWNrOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9YW5kcm9pZC1hcnJvdy1kb3duOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1hbmRyb2lkLWFycm93LWRvd247IH1cbi5Ae2lvbmljb25zLXByZWZpeH1hbmRyb2lkLWFycm93LWRyb3Bkb3duOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1hbmRyb2lkLWFycm93LWRyb3Bkb3duOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9YW5kcm9pZC1hcnJvdy1kcm9wZG93bi1jaXJjbGU6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWFuZHJvaWQtYXJyb3ctZHJvcGRvd24tY2lyY2xlOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9YW5kcm9pZC1hcnJvdy1kcm9wbGVmdDpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItYW5kcm9pZC1hcnJvdy1kcm9wbGVmdDsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWFuZHJvaWQtYXJyb3ctZHJvcGxlZnQtY2lyY2xlOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1hbmRyb2lkLWFycm93LWRyb3BsZWZ0LWNpcmNsZTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWFuZHJvaWQtYXJyb3ctZHJvcHJpZ2h0OmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1hbmRyb2lkLWFycm93LWRyb3ByaWdodDsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWFuZHJvaWQtYXJyb3ctZHJvcHJpZ2h0LWNpcmNsZTpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItYW5kcm9pZC1hcnJvdy1kcm9wcmlnaHQtY2lyY2xlOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9YW5kcm9pZC1hcnJvdy1kcm9wdXA6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWFuZHJvaWQtYXJyb3ctZHJvcHVwOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9YW5kcm9pZC1hcnJvdy1kcm9wdXAtY2lyY2xlOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1hbmRyb2lkLWFycm93LWRyb3B1cC1jaXJjbGU7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1hbmRyb2lkLWFycm93LWZvcndhcmQ6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWFuZHJvaWQtYXJyb3ctZm9yd2FyZDsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWFuZHJvaWQtYXJyb3ctdXA6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWFuZHJvaWQtYXJyb3ctdXA7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1hbmRyb2lkLWF0dGFjaDpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItYW5kcm9pZC1hdHRhY2g7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1hbmRyb2lkLWJhcjpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItYW5kcm9pZC1iYXI7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1hbmRyb2lkLWJpY3ljbGU6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWFuZHJvaWQtYmljeWNsZTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWFuZHJvaWQtYm9hdDpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItYW5kcm9pZC1ib2F0OyB9XG4uQHtpb25pY29ucy1wcmVmaXh9YW5kcm9pZC1ib29rbWFyazpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItYW5kcm9pZC1ib29rbWFyazsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWFuZHJvaWQtYnVsYjpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItYW5kcm9pZC1idWxiOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9YW5kcm9pZC1idXM6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWFuZHJvaWQtYnVzOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9YW5kcm9pZC1jYWxlbmRhcjpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItYW5kcm9pZC1jYWxlbmRhcjsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWFuZHJvaWQtY2FsbDpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItYW5kcm9pZC1jYWxsOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9YW5kcm9pZC1jYW1lcmE6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWFuZHJvaWQtY2FtZXJhOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9YW5kcm9pZC1jYW5jZWw6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWFuZHJvaWQtY2FuY2VsOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9YW5kcm9pZC1jYXI6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWFuZHJvaWQtY2FyOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9YW5kcm9pZC1jYXJ0OmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1hbmRyb2lkLWNhcnQ7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1hbmRyb2lkLWNoYXQ6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWFuZHJvaWQtY2hhdDsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWFuZHJvaWQtY2hlY2tib3g6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWFuZHJvaWQtY2hlY2tib3g7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1hbmRyb2lkLWNoZWNrYm94LWJsYW5rOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1hbmRyb2lkLWNoZWNrYm94LWJsYW5rOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9YW5kcm9pZC1jaGVja2JveC1vdXRsaW5lOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1hbmRyb2lkLWNoZWNrYm94LW91dGxpbmU7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1hbmRyb2lkLWNoZWNrYm94LW91dGxpbmUtYmxhbms6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWFuZHJvaWQtY2hlY2tib3gtb3V0bGluZS1ibGFuazsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWFuZHJvaWQtY2hlY2ttYXJrLWNpcmNsZTpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItYW5kcm9pZC1jaGVja21hcmstY2lyY2xlOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9YW5kcm9pZC1jbGlwYm9hcmQ6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWFuZHJvaWQtY2xpcGJvYXJkOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9YW5kcm9pZC1jbG9zZTpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItYW5kcm9pZC1jbG9zZTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWFuZHJvaWQtY2xvdWQ6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWFuZHJvaWQtY2xvdWQ7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1hbmRyb2lkLWNsb3VkLWNpcmNsZTpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItYW5kcm9pZC1jbG91ZC1jaXJjbGU7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1hbmRyb2lkLWNsb3VkLWRvbmU6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWFuZHJvaWQtY2xvdWQtZG9uZTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWFuZHJvaWQtY2xvdWQtb3V0bGluZTpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItYW5kcm9pZC1jbG91ZC1vdXRsaW5lOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9YW5kcm9pZC1jb2xvci1wYWxldHRlOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1hbmRyb2lkLWNvbG9yLXBhbGV0dGU7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1hbmRyb2lkLWNvbXBhc3M6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWFuZHJvaWQtY29tcGFzczsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWFuZHJvaWQtY29udGFjdDpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItYW5kcm9pZC1jb250YWN0OyB9XG4uQHtpb25pY29ucy1wcmVmaXh9YW5kcm9pZC1jb250YWN0czpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItYW5kcm9pZC1jb250YWN0czsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWFuZHJvaWQtY29udHJhY3Q6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWFuZHJvaWQtY29udHJhY3Q7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1hbmRyb2lkLWNyZWF0ZTpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItYW5kcm9pZC1jcmVhdGU7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1hbmRyb2lkLWRlbGV0ZTpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItYW5kcm9pZC1kZWxldGU7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1hbmRyb2lkLWRlc2t0b3A6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWFuZHJvaWQtZGVza3RvcDsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWFuZHJvaWQtZG9jdW1lbnQ6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWFuZHJvaWQtZG9jdW1lbnQ7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1hbmRyb2lkLWRvbmU6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWFuZHJvaWQtZG9uZTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWFuZHJvaWQtZG9uZS1hbGw6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWFuZHJvaWQtZG9uZS1hbGw7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1hbmRyb2lkLWRvd25sb2FkOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1hbmRyb2lkLWRvd25sb2FkOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9YW5kcm9pZC1kcmFmdHM6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWFuZHJvaWQtZHJhZnRzOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9YW5kcm9pZC1leGl0OmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1hbmRyb2lkLWV4aXQ7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1hbmRyb2lkLWV4cGFuZDpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItYW5kcm9pZC1leHBhbmQ7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1hbmRyb2lkLWZhdm9yaXRlOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1hbmRyb2lkLWZhdm9yaXRlOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9YW5kcm9pZC1mYXZvcml0ZS1vdXRsaW5lOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1hbmRyb2lkLWZhdm9yaXRlLW91dGxpbmU7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1hbmRyb2lkLWZpbG06YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWFuZHJvaWQtZmlsbTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWFuZHJvaWQtZm9sZGVyOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1hbmRyb2lkLWZvbGRlcjsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWFuZHJvaWQtZm9sZGVyLW9wZW46YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWFuZHJvaWQtZm9sZGVyLW9wZW47IH1cbi5Ae2lvbmljb25zLXByZWZpeH1hbmRyb2lkLWZ1bm5lbDpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItYW5kcm9pZC1mdW5uZWw7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1hbmRyb2lkLWdsb2JlOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1hbmRyb2lkLWdsb2JlOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9YW5kcm9pZC1oYW5kOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1hbmRyb2lkLWhhbmQ7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1hbmRyb2lkLWhhbmdvdXQ6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWFuZHJvaWQtaGFuZ291dDsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWFuZHJvaWQtaGFwcHk6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWFuZHJvaWQtaGFwcHk7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1hbmRyb2lkLWhvbWU6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWFuZHJvaWQtaG9tZTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWFuZHJvaWQtaW1hZ2U6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWFuZHJvaWQtaW1hZ2U7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1hbmRyb2lkLWxhcHRvcDpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItYW5kcm9pZC1sYXB0b3A7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1hbmRyb2lkLWxpc3Q6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWFuZHJvaWQtbGlzdDsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWFuZHJvaWQtbG9jYXRlOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1hbmRyb2lkLWxvY2F0ZTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWFuZHJvaWQtbG9jazpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItYW5kcm9pZC1sb2NrOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9YW5kcm9pZC1tYWlsOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1hbmRyb2lkLW1haWw7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1hbmRyb2lkLW1hcDpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItYW5kcm9pZC1tYXA7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1hbmRyb2lkLW1lbnU6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWFuZHJvaWQtbWVudTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWFuZHJvaWQtbWljcm9waG9uZTpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItYW5kcm9pZC1taWNyb3Bob25lOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9YW5kcm9pZC1taWNyb3Bob25lLW9mZjpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItYW5kcm9pZC1taWNyb3Bob25lLW9mZjsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWFuZHJvaWQtbW9yZS1ob3Jpem9udGFsOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1hbmRyb2lkLW1vcmUtaG9yaXpvbnRhbDsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWFuZHJvaWQtbW9yZS12ZXJ0aWNhbDpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItYW5kcm9pZC1tb3JlLXZlcnRpY2FsOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9YW5kcm9pZC1uYXZpZ2F0ZTpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItYW5kcm9pZC1uYXZpZ2F0ZTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWFuZHJvaWQtbm90aWZpY2F0aW9uczpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItYW5kcm9pZC1ub3RpZmljYXRpb25zOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9YW5kcm9pZC1ub3RpZmljYXRpb25zLW5vbmU6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWFuZHJvaWQtbm90aWZpY2F0aW9ucy1ub25lOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9YW5kcm9pZC1ub3RpZmljYXRpb25zLW9mZjpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItYW5kcm9pZC1ub3RpZmljYXRpb25zLW9mZjsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWFuZHJvaWQtb3BlbjpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItYW5kcm9pZC1vcGVuOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9YW5kcm9pZC1vcHRpb25zOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1hbmRyb2lkLW9wdGlvbnM7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1hbmRyb2lkLXBlb3BsZTpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItYW5kcm9pZC1wZW9wbGU7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1hbmRyb2lkLXBlcnNvbjpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItYW5kcm9pZC1wZXJzb247IH1cbi5Ae2lvbmljb25zLXByZWZpeH1hbmRyb2lkLXBlcnNvbi1hZGQ6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWFuZHJvaWQtcGVyc29uLWFkZDsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWFuZHJvaWQtcGhvbmUtbGFuZHNjYXBlOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1hbmRyb2lkLXBob25lLWxhbmRzY2FwZTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWFuZHJvaWQtcGhvbmUtcG9ydHJhaXQ6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWFuZHJvaWQtcGhvbmUtcG9ydHJhaXQ7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1hbmRyb2lkLXBpbjpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItYW5kcm9pZC1waW47IH1cbi5Ae2lvbmljb25zLXByZWZpeH1hbmRyb2lkLXBsYW5lOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1hbmRyb2lkLXBsYW5lOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9YW5kcm9pZC1wbGF5c3RvcmU6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWFuZHJvaWQtcGxheXN0b3JlOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9YW5kcm9pZC1wcmludDpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItYW5kcm9pZC1wcmludDsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWFuZHJvaWQtcmFkaW8tYnV0dG9uLW9mZjpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItYW5kcm9pZC1yYWRpby1idXR0b24tb2ZmOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9YW5kcm9pZC1yYWRpby1idXR0b24tb246YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWFuZHJvaWQtcmFkaW8tYnV0dG9uLW9uOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9YW5kcm9pZC1yZWZyZXNoOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1hbmRyb2lkLXJlZnJlc2g7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1hbmRyb2lkLXJlbW92ZTpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItYW5kcm9pZC1yZW1vdmU7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1hbmRyb2lkLXJlbW92ZS1jaXJjbGU6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWFuZHJvaWQtcmVtb3ZlLWNpcmNsZTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWFuZHJvaWQtcmVzdGF1cmFudDpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItYW5kcm9pZC1yZXN0YXVyYW50OyB9XG4uQHtpb25pY29ucy1wcmVmaXh9YW5kcm9pZC1zYWQ6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWFuZHJvaWQtc2FkOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9YW5kcm9pZC1zZWFyY2g6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWFuZHJvaWQtc2VhcmNoOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9YW5kcm9pZC1zZW5kOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1hbmRyb2lkLXNlbmQ7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1hbmRyb2lkLXNldHRpbmdzOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1hbmRyb2lkLXNldHRpbmdzOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9YW5kcm9pZC1zaGFyZTpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItYW5kcm9pZC1zaGFyZTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWFuZHJvaWQtc2hhcmUtYWx0OmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1hbmRyb2lkLXNoYXJlLWFsdDsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWFuZHJvaWQtc3RhcjpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItYW5kcm9pZC1zdGFyOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9YW5kcm9pZC1zdGFyLWhhbGY6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWFuZHJvaWQtc3Rhci1oYWxmOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9YW5kcm9pZC1zdGFyLW91dGxpbmU6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWFuZHJvaWQtc3Rhci1vdXRsaW5lOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9YW5kcm9pZC1zdG9wd2F0Y2g6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWFuZHJvaWQtc3RvcHdhdGNoOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9YW5kcm9pZC1zdWJ3YXk6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWFuZHJvaWQtc3Vid2F5OyB9XG4uQHtpb25pY29ucy1wcmVmaXh9YW5kcm9pZC1zdW5ueTpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItYW5kcm9pZC1zdW5ueTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWFuZHJvaWQtc3luYzpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItYW5kcm9pZC1zeW5jOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9YW5kcm9pZC10ZXh0c21zOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1hbmRyb2lkLXRleHRzbXM7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1hbmRyb2lkLXRpbWU6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWFuZHJvaWQtdGltZTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWFuZHJvaWQtdHJhaW46YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWFuZHJvaWQtdHJhaW47IH1cbi5Ae2lvbmljb25zLXByZWZpeH1hbmRyb2lkLXVubG9jazpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItYW5kcm9pZC11bmxvY2s7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1hbmRyb2lkLXVwbG9hZDpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItYW5kcm9pZC11cGxvYWQ7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1hbmRyb2lkLXZvbHVtZS1kb3duOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1hbmRyb2lkLXZvbHVtZS1kb3duOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9YW5kcm9pZC12b2x1bWUtbXV0ZTpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItYW5kcm9pZC12b2x1bWUtbXV0ZTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWFuZHJvaWQtdm9sdW1lLW9mZjpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItYW5kcm9pZC12b2x1bWUtb2ZmOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9YW5kcm9pZC12b2x1bWUtdXA6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWFuZHJvaWQtdm9sdW1lLXVwOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9YW5kcm9pZC13YWxrOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1hbmRyb2lkLXdhbGs7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1hbmRyb2lkLXdhcm5pbmc6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWFuZHJvaWQtd2FybmluZzsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWFuZHJvaWQtd2F0Y2g6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWFuZHJvaWQtd2F0Y2g7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1hbmRyb2lkLXdpZmk6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWFuZHJvaWQtd2lmaTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWFwZXJ0dXJlOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1hcGVydHVyZTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWFyY2hpdmU6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWFyY2hpdmU7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1hcnJvdy1kb3duLWE6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWFycm93LWRvd24tYTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWFycm93LWRvd24tYjpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItYXJyb3ctZG93bi1iOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9YXJyb3ctZG93bi1jOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1hcnJvdy1kb3duLWM7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1hcnJvdy1leHBhbmQ6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWFycm93LWV4cGFuZDsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWFycm93LWdyYXBoLWRvd24tbGVmdDpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItYXJyb3ctZ3JhcGgtZG93bi1sZWZ0OyB9XG4uQHtpb25pY29ucy1wcmVmaXh9YXJyb3ctZ3JhcGgtZG93bi1yaWdodDpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItYXJyb3ctZ3JhcGgtZG93bi1yaWdodDsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWFycm93LWdyYXBoLXVwLWxlZnQ6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWFycm93LWdyYXBoLXVwLWxlZnQ7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1hcnJvdy1ncmFwaC11cC1yaWdodDpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItYXJyb3ctZ3JhcGgtdXAtcmlnaHQ7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1hcnJvdy1sZWZ0LWE6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWFycm93LWxlZnQtYTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWFycm93LWxlZnQtYjpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItYXJyb3ctbGVmdC1iOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9YXJyb3ctbGVmdC1jOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1hcnJvdy1sZWZ0LWM7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1hcnJvdy1tb3ZlOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1hcnJvdy1tb3ZlOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9YXJyb3ctcmVzaXplOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1hcnJvdy1yZXNpemU7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1hcnJvdy1yZXR1cm4tbGVmdDpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItYXJyb3ctcmV0dXJuLWxlZnQ7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1hcnJvdy1yZXR1cm4tcmlnaHQ6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWFycm93LXJldHVybi1yaWdodDsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWFycm93LXJpZ2h0LWE6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWFycm93LXJpZ2h0LWE7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1hcnJvdy1yaWdodC1iOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1hcnJvdy1yaWdodC1iOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9YXJyb3ctcmlnaHQtYzpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItYXJyb3ctcmlnaHQtYzsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWFycm93LXNocmluazpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItYXJyb3ctc2hyaW5rOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9YXJyb3ctc3dhcDpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItYXJyb3ctc3dhcDsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWFycm93LXVwLWE6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWFycm93LXVwLWE7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1hcnJvdy11cC1iOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1hcnJvdy11cC1iOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9YXJyb3ctdXAtYzpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItYXJyb3ctdXAtYzsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWFzdGVyaXNrOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1hc3RlcmlzazsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWF0OmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1hdDsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWJhY2tzcGFjZTpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItYmFja3NwYWNlOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9YmFja3NwYWNlLW91dGxpbmU6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWJhY2tzcGFjZS1vdXRsaW5lOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9YmFnOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1iYWc7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1iYXR0ZXJ5LWNoYXJnaW5nOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1iYXR0ZXJ5LWNoYXJnaW5nOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9YmF0dGVyeS1lbXB0eTpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItYmF0dGVyeS1lbXB0eTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWJhdHRlcnktZnVsbDpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItYmF0dGVyeS1mdWxsOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9YmF0dGVyeS1oYWxmOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1iYXR0ZXJ5LWhhbGY7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1iYXR0ZXJ5LWxvdzpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItYmF0dGVyeS1sb3c7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1iZWFrZXI6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWJlYWtlcjsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWJlZXI6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWJlZXI7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1ibHVldG9vdGg6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWJsdWV0b290aDsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWJvbmZpcmU6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWJvbmZpcmU7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1ib29rbWFyazpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItYm9va21hcms7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1ib3d0aWU6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWJvd3RpZTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWJyaWVmY2FzZTpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItYnJpZWZjYXNlOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9YnVnOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1idWc7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1jYWxjdWxhdG9yOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1jYWxjdWxhdG9yOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9Y2FsZW5kYXI6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWNhbGVuZGFyOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9Y2FtZXJhOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1jYW1lcmE7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1jYXJkOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1jYXJkOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9Y2FzaDpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItY2FzaDsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWNoYXRib3g6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWNoYXRib3g7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1jaGF0Ym94LXdvcmtpbmc6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWNoYXRib3gtd29ya2luZzsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWNoYXRib3hlczpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItY2hhdGJveGVzOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9Y2hhdGJ1YmJsZTpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItY2hhdGJ1YmJsZTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWNoYXRidWJibGUtd29ya2luZzpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItY2hhdGJ1YmJsZS13b3JraW5nOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9Y2hhdGJ1YmJsZXM6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWNoYXRidWJibGVzOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9Y2hlY2ttYXJrOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1jaGVja21hcms7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1jaGVja21hcmstY2lyY2xlZDpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItY2hlY2ttYXJrLWNpcmNsZWQ7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1jaGVja21hcmstcm91bmQ6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWNoZWNrbWFyay1yb3VuZDsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWNoZXZyb24tZG93bjpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItY2hldnJvbi1kb3duOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9Y2hldnJvbi1sZWZ0OmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1jaGV2cm9uLWxlZnQ7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1jaGV2cm9uLXJpZ2h0OmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1jaGV2cm9uLXJpZ2h0OyB9XG4uQHtpb25pY29ucy1wcmVmaXh9Y2hldnJvbi11cDpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItY2hldnJvbi11cDsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWNsaXBib2FyZDpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItY2xpcGJvYXJkOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9Y2xvY2s6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWNsb2NrOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9Y2xvc2U6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWNsb3NlOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9Y2xvc2UtY2lyY2xlZDpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItY2xvc2UtY2lyY2xlZDsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWNsb3NlLXJvdW5kOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1jbG9zZS1yb3VuZDsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWNsb3NlZC1jYXB0aW9uaW5nOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1jbG9zZWQtY2FwdGlvbmluZzsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWNsb3VkOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1jbG91ZDsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWNvZGU6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWNvZGU7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1jb2RlLWRvd25sb2FkOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1jb2RlLWRvd25sb2FkOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9Y29kZS13b3JraW5nOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1jb2RlLXdvcmtpbmc7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1jb2ZmZWU6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWNvZmZlZTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWNvbXBhc3M6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWNvbXBhc3M7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1jb21wb3NlOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1jb21wb3NlOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9Y29ubmVjdGlvbi1iYXJzOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1jb25uZWN0aW9uLWJhcnM7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1jb250cmFzdDpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItY29udHJhc3Q7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1jcm9wOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1jcm9wOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9Y3ViZTpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItY3ViZTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWRpc2M6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWRpc2M7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1kb2N1bWVudDpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItZG9jdW1lbnQ7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1kb2N1bWVudC10ZXh0OmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1kb2N1bWVudC10ZXh0OyB9XG4uQHtpb25pY29ucy1wcmVmaXh9ZHJhZzpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItZHJhZzsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWVhcnRoOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1lYXJ0aDsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWVhc2VsOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1lYXNlbDsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWVkaXQ6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWVkaXQ7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1lZ2c6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWVnZzsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWVqZWN0OmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1lamVjdDsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWVtYWlsOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1lbWFpbDsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWVtYWlsLXVucmVhZDpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItZW1haWwtdW5yZWFkOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9ZXJsZW5tZXllci1mbGFzazpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItZXJsZW5tZXllci1mbGFzazsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWVybGVubWV5ZXItZmxhc2stYnViYmxlczpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItZXJsZW5tZXllci1mbGFzay1idWJibGVzOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9ZXllOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1leWU7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1leWUtZGlzYWJsZWQ6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWV5ZS1kaXNhYmxlZDsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWZlbWFsZTpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItZmVtYWxlOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9ZmlsaW5nOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1maWxpbmc7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1maWxtLW1hcmtlcjpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItZmlsbS1tYXJrZXI7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1maXJlYmFsbDpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItZmlyZWJhbGw7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1mbGFnOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1mbGFnOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9ZmxhbWU6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWZsYW1lOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9Zmxhc2g6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWZsYXNoOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9Zmxhc2gtb2ZmOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1mbGFzaC1vZmY7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1mb2xkZXI6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWZvbGRlcjsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWZvcms6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWZvcms7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1mb3JrLXJlcG86YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWZvcmstcmVwbzsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWZvcndhcmQ6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWZvcndhcmQ7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1mdW5uZWw6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWZ1bm5lbDsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWdlYXItYTpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItZ2Vhci1hOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9Z2Vhci1iOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1nZWFyLWI7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1ncmlkOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1ncmlkOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9aGFtbWVyOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1oYW1tZXI7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1oYXBweTpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItaGFwcHk7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1oYXBweS1vdXRsaW5lOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1oYXBweS1vdXRsaW5lOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9aGVhZHBob25lOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1oZWFkcGhvbmU7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1oZWFydDpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItaGVhcnQ7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1oZWFydC1icm9rZW46YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWhlYXJ0LWJyb2tlbjsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWhlbHA6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWhlbHA7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1oZWxwLWJ1b3k6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWhlbHAtYnVveTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWhlbHAtY2lyY2xlZDpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItaGVscC1jaXJjbGVkOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9aG9tZTpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItaG9tZTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWljZWNyZWFtOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1pY2VjcmVhbTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWltYWdlOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1pbWFnZTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWltYWdlczpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItaW1hZ2VzOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9aW5mb3JtYXRpb246YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWluZm9ybWF0aW9uOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9aW5mb3JtYXRpb24tY2lyY2xlZDpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItaW5mb3JtYXRpb24tY2lyY2xlZDsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWlvbmljOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1pb25pYzsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1hbGFybTpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItaW9zLWFsYXJtOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLWFsYXJtLW91dGxpbmU6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWlvcy1hbGFybS1vdXRsaW5lOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLWFsYnVtczpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItaW9zLWFsYnVtczsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1hbGJ1bXMtb3V0bGluZTpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItaW9zLWFsYnVtcy1vdXRsaW5lOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLWFtZXJpY2FuZm9vdGJhbGw6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWlvcy1hbWVyaWNhbmZvb3RiYWxsOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLWFtZXJpY2FuZm9vdGJhbGwtb3V0bGluZTpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItaW9zLWFtZXJpY2FuZm9vdGJhbGwtb3V0bGluZTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1hbmFseXRpY3M6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWlvcy1hbmFseXRpY3M7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtYW5hbHl0aWNzLW91dGxpbmU6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWlvcy1hbmFseXRpY3Mtb3V0bGluZTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1hcnJvdy1iYWNrOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1pb3MtYXJyb3ctYmFjazsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1hcnJvdy1kb3duOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1pb3MtYXJyb3ctZG93bjsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1hcnJvdy1mb3J3YXJkOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1pb3MtYXJyb3ctZm9yd2FyZDsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1hcnJvdy1sZWZ0OmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1pb3MtYXJyb3ctbGVmdDsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1hcnJvdy1yaWdodDpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItaW9zLWFycm93LXJpZ2h0OyB9XG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLWFycm93LXRoaW4tZG93bjpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItaW9zLWFycm93LXRoaW4tZG93bjsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1hcnJvdy10aGluLWxlZnQ6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWlvcy1hcnJvdy10aGluLWxlZnQ7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtYXJyb3ctdGhpbi1yaWdodDpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItaW9zLWFycm93LXRoaW4tcmlnaHQ7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtYXJyb3ctdGhpbi11cDpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItaW9zLWFycm93LXRoaW4tdXA7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtYXJyb3ctdXA6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWlvcy1hcnJvdy11cDsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1hdDpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItaW9zLWF0OyB9XG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLWF0LW91dGxpbmU6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWlvcy1hdC1vdXRsaW5lOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLWJhcmNvZGU6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWlvcy1iYXJjb2RlOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLWJhcmNvZGUtb3V0bGluZTpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItaW9zLWJhcmNvZGUtb3V0bGluZTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1iYXNlYmFsbDpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItaW9zLWJhc2ViYWxsOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLWJhc2ViYWxsLW91dGxpbmU6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWlvcy1iYXNlYmFsbC1vdXRsaW5lOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLWJhc2tldGJhbGw6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWlvcy1iYXNrZXRiYWxsOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLWJhc2tldGJhbGwtb3V0bGluZTpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItaW9zLWJhc2tldGJhbGwtb3V0bGluZTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1iZWxsOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1pb3MtYmVsbDsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1iZWxsLW91dGxpbmU6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWlvcy1iZWxsLW91dGxpbmU7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtYm9keTpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItaW9zLWJvZHk7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtYm9keS1vdXRsaW5lOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1pb3MtYm9keS1vdXRsaW5lOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLWJvbHQ6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWlvcy1ib2x0OyB9XG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLWJvbHQtb3V0bGluZTpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItaW9zLWJvbHQtb3V0bGluZTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1ib29rOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1pb3MtYm9vazsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1ib29rLW91dGxpbmU6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWlvcy1ib29rLW91dGxpbmU7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtYm9va21hcmtzOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1pb3MtYm9va21hcmtzOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLWJvb2ttYXJrcy1vdXRsaW5lOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1pb3MtYm9va21hcmtzLW91dGxpbmU7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtYm94OmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1pb3MtYm94OyB9XG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLWJveC1vdXRsaW5lOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1pb3MtYm94LW91dGxpbmU7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtYnJpZWZjYXNlOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1pb3MtYnJpZWZjYXNlOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLWJyaWVmY2FzZS1vdXRsaW5lOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1pb3MtYnJpZWZjYXNlLW91dGxpbmU7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtYnJvd3NlcnM6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWlvcy1icm93c2VyczsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1icm93c2Vycy1vdXRsaW5lOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1pb3MtYnJvd3NlcnMtb3V0bGluZTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1jYWxjdWxhdG9yOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1pb3MtY2FsY3VsYXRvcjsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1jYWxjdWxhdG9yLW91dGxpbmU6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWlvcy1jYWxjdWxhdG9yLW91dGxpbmU7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtY2FsZW5kYXI6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWlvcy1jYWxlbmRhcjsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1jYWxlbmRhci1vdXRsaW5lOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1pb3MtY2FsZW5kYXItb3V0bGluZTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1jYW1lcmE6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWlvcy1jYW1lcmE7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtY2FtZXJhLW91dGxpbmU6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWlvcy1jYW1lcmEtb3V0bGluZTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1jYXJ0OmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1pb3MtY2FydDsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1jYXJ0LW91dGxpbmU6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWlvcy1jYXJ0LW91dGxpbmU7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtY2hhdGJveGVzOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1pb3MtY2hhdGJveGVzOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLWNoYXRib3hlcy1vdXRsaW5lOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1pb3MtY2hhdGJveGVzLW91dGxpbmU7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtY2hhdGJ1YmJsZTpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItaW9zLWNoYXRidWJibGU7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtY2hhdGJ1YmJsZS1vdXRsaW5lOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1pb3MtY2hhdGJ1YmJsZS1vdXRsaW5lOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLWNoZWNrbWFyazpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItaW9zLWNoZWNrbWFyazsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1jaGVja21hcmstZW1wdHk6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWlvcy1jaGVja21hcmstZW1wdHk7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtY2hlY2ttYXJrLW91dGxpbmU6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWlvcy1jaGVja21hcmstb3V0bGluZTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1jaXJjbGUtZmlsbGVkOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1pb3MtY2lyY2xlLWZpbGxlZDsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1jaXJjbGUtb3V0bGluZTpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItaW9zLWNpcmNsZS1vdXRsaW5lOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLWNsb2NrOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1pb3MtY2xvY2s7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtY2xvY2stb3V0bGluZTpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItaW9zLWNsb2NrLW91dGxpbmU7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtY2xvc2U6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWlvcy1jbG9zZTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1jbG9zZS1lbXB0eTpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItaW9zLWNsb3NlLWVtcHR5OyB9XG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLWNsb3NlLW91dGxpbmU6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWlvcy1jbG9zZS1vdXRsaW5lOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLWNsb3VkOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1pb3MtY2xvdWQ7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtY2xvdWQtZG93bmxvYWQ6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWlvcy1jbG91ZC1kb3dubG9hZDsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1jbG91ZC1kb3dubG9hZC1vdXRsaW5lOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1pb3MtY2xvdWQtZG93bmxvYWQtb3V0bGluZTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1jbG91ZC1vdXRsaW5lOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1pb3MtY2xvdWQtb3V0bGluZTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1jbG91ZC11cGxvYWQ6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWlvcy1jbG91ZC11cGxvYWQ7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtY2xvdWQtdXBsb2FkLW91dGxpbmU6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWlvcy1jbG91ZC11cGxvYWQtb3V0bGluZTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1jbG91ZHk6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWlvcy1jbG91ZHk7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtY2xvdWR5LW5pZ2h0OmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1pb3MtY2xvdWR5LW5pZ2h0OyB9XG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLWNsb3VkeS1uaWdodC1vdXRsaW5lOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1pb3MtY2xvdWR5LW5pZ2h0LW91dGxpbmU7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtY2xvdWR5LW91dGxpbmU6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWlvcy1jbG91ZHktb3V0bGluZTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1jb2c6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWlvcy1jb2c7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtY29nLW91dGxpbmU6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWlvcy1jb2ctb3V0bGluZTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1jb2xvci1maWx0ZXI6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWlvcy1jb2xvci1maWx0ZXI7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtY29sb3ItZmlsdGVyLW91dGxpbmU6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWlvcy1jb2xvci1maWx0ZXItb3V0bGluZTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1jb2xvci13YW5kOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1pb3MtY29sb3Itd2FuZDsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1jb2xvci13YW5kLW91dGxpbmU6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWlvcy1jb2xvci13YW5kLW91dGxpbmU7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtY29tcG9zZTpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItaW9zLWNvbXBvc2U7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtY29tcG9zZS1vdXRsaW5lOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1pb3MtY29tcG9zZS1vdXRsaW5lOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLWNvbnRhY3Q6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWlvcy1jb250YWN0OyB9XG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLWNvbnRhY3Qtb3V0bGluZTpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItaW9zLWNvbnRhY3Qtb3V0bGluZTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1jb3B5OmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1pb3MtY29weTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1jb3B5LW91dGxpbmU6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWlvcy1jb3B5LW91dGxpbmU7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtY3JvcDpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItaW9zLWNyb3A7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtY3JvcC1zdHJvbmc6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWlvcy1jcm9wLXN0cm9uZzsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1kb3dubG9hZDpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItaW9zLWRvd25sb2FkOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLWRvd25sb2FkLW91dGxpbmU6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWlvcy1kb3dubG9hZC1vdXRsaW5lOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLWRyYWc6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWlvcy1kcmFnOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLWVtYWlsOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1pb3MtZW1haWw7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtZW1haWwtb3V0bGluZTpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItaW9zLWVtYWlsLW91dGxpbmU7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtZXllOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1pb3MtZXllOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLWV5ZS1vdXRsaW5lOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1pb3MtZXllLW91dGxpbmU7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtZmFzdGZvcndhcmQ6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWlvcy1mYXN0Zm9yd2FyZDsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1mYXN0Zm9yd2FyZC1vdXRsaW5lOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1pb3MtZmFzdGZvcndhcmQtb3V0bGluZTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1maWxpbmc6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWlvcy1maWxpbmc7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtZmlsaW5nLW91dGxpbmU6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWlvcy1maWxpbmctb3V0bGluZTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1maWxtOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1pb3MtZmlsbTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1maWxtLW91dGxpbmU6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWlvcy1maWxtLW91dGxpbmU7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtZmxhZzpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItaW9zLWZsYWc7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtZmxhZy1vdXRsaW5lOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1pb3MtZmxhZy1vdXRsaW5lOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLWZsYW1lOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1pb3MtZmxhbWU7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtZmxhbWUtb3V0bGluZTpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItaW9zLWZsYW1lLW91dGxpbmU7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtZmxhc2s6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWlvcy1mbGFzazsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1mbGFzay1vdXRsaW5lOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1pb3MtZmxhc2stb3V0bGluZTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1mbG93ZXI6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWlvcy1mbG93ZXI7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtZmxvd2VyLW91dGxpbmU6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWlvcy1mbG93ZXItb3V0bGluZTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1mb2xkZXI6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWlvcy1mb2xkZXI7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtZm9sZGVyLW91dGxpbmU6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWlvcy1mb2xkZXItb3V0bGluZTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1mb290YmFsbDpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItaW9zLWZvb3RiYWxsOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLWZvb3RiYWxsLW91dGxpbmU6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWlvcy1mb290YmFsbC1vdXRsaW5lOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLWdhbWUtY29udHJvbGxlci1hOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1pb3MtZ2FtZS1jb250cm9sbGVyLWE7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtZ2FtZS1jb250cm9sbGVyLWEtb3V0bGluZTpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItaW9zLWdhbWUtY29udHJvbGxlci1hLW91dGxpbmU7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtZ2FtZS1jb250cm9sbGVyLWI6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWlvcy1nYW1lLWNvbnRyb2xsZXItYjsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1nYW1lLWNvbnRyb2xsZXItYi1vdXRsaW5lOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1pb3MtZ2FtZS1jb250cm9sbGVyLWItb3V0bGluZTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1nZWFyOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1pb3MtZ2VhcjsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1nZWFyLW91dGxpbmU6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWlvcy1nZWFyLW91dGxpbmU7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtZ2xhc3NlczpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItaW9zLWdsYXNzZXM7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtZ2xhc3Nlcy1vdXRsaW5lOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1pb3MtZ2xhc3Nlcy1vdXRsaW5lOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLWdyaWQtdmlldzpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItaW9zLWdyaWQtdmlldzsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1ncmlkLXZpZXctb3V0bGluZTpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItaW9zLWdyaWQtdmlldy1vdXRsaW5lOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLWhlYXJ0OmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1pb3MtaGVhcnQ7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtaGVhcnQtb3V0bGluZTpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItaW9zLWhlYXJ0LW91dGxpbmU7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtaGVscDpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItaW9zLWhlbHA7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtaGVscC1lbXB0eTpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItaW9zLWhlbHAtZW1wdHk7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtaGVscC1vdXRsaW5lOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1pb3MtaGVscC1vdXRsaW5lOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLWhvbWU6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWlvcy1ob21lOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLWhvbWUtb3V0bGluZTpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItaW9zLWhvbWUtb3V0bGluZTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1pbmZpbml0ZTpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItaW9zLWluZmluaXRlOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLWluZmluaXRlLW91dGxpbmU6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWlvcy1pbmZpbml0ZS1vdXRsaW5lOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLWluZm9ybWF0aW9uOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1pb3MtaW5mb3JtYXRpb247IH1cbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtaW5mb3JtYXRpb24tZW1wdHk6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWlvcy1pbmZvcm1hdGlvbi1lbXB0eTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1pbmZvcm1hdGlvbi1vdXRsaW5lOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1pb3MtaW5mb3JtYXRpb24tb3V0bGluZTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1pb25pYy1vdXRsaW5lOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1pb3MtaW9uaWMtb3V0bGluZTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1rZXlwYWQ6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWlvcy1rZXlwYWQ7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1pb3Mta2V5cGFkLW91dGxpbmU6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWlvcy1rZXlwYWQtb3V0bGluZTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1saWdodGJ1bGI6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWlvcy1saWdodGJ1bGI7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtbGlnaHRidWxiLW91dGxpbmU6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWlvcy1saWdodGJ1bGItb3V0bGluZTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1saXN0OmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1pb3MtbGlzdDsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1saXN0LW91dGxpbmU6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWlvcy1saXN0LW91dGxpbmU7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtbG9jYXRpb246YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWlvcy1sb2NhdGlvbjsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1sb2NhdGlvbi1vdXRsaW5lOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1pb3MtbG9jYXRpb24tb3V0bGluZTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1sb2NrZWQ6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWlvcy1sb2NrZWQ7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtbG9ja2VkLW91dGxpbmU6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWlvcy1sb2NrZWQtb3V0bGluZTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1sb29wOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1pb3MtbG9vcDsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1sb29wLXN0cm9uZzpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItaW9zLWxvb3Atc3Ryb25nOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLW1lZGljYWw6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWlvcy1tZWRpY2FsOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLW1lZGljYWwtb3V0bGluZTpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItaW9zLW1lZGljYWwtb3V0bGluZTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1tZWRraXQ6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWlvcy1tZWRraXQ7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtbWVka2l0LW91dGxpbmU6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWlvcy1tZWRraXQtb3V0bGluZTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1taWM6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWlvcy1taWM7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtbWljLW9mZjpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItaW9zLW1pYy1vZmY7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtbWljLW91dGxpbmU6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWlvcy1taWMtb3V0bGluZTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1taW51czpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItaW9zLW1pbnVzOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLW1pbnVzLWVtcHR5OmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1pb3MtbWludXMtZW1wdHk7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtbWludXMtb3V0bGluZTpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItaW9zLW1pbnVzLW91dGxpbmU7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtbW9uaXRvcjpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItaW9zLW1vbml0b3I7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtbW9uaXRvci1vdXRsaW5lOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1pb3MtbW9uaXRvci1vdXRsaW5lOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLW1vb246YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWlvcy1tb29uOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLW1vb24tb3V0bGluZTpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItaW9zLW1vb24tb3V0bGluZTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1tb3JlOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1pb3MtbW9yZTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1tb3JlLW91dGxpbmU6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWlvcy1tb3JlLW91dGxpbmU7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtbXVzaWNhbC1ub3RlOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1pb3MtbXVzaWNhbC1ub3RlOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLW11c2ljYWwtbm90ZXM6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWlvcy1tdXNpY2FsLW5vdGVzOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLW5hdmlnYXRlOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1pb3MtbmF2aWdhdGU7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtbmF2aWdhdGUtb3V0bGluZTpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItaW9zLW5hdmlnYXRlLW91dGxpbmU7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtbnV0cml0aW9uOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1pb3MtbnV0cml0aW9uOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLW51dHJpdGlvbi1vdXRsaW5lOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1pb3MtbnV0cml0aW9uLW91dGxpbmU7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtcGFwZXI6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWlvcy1wYXBlcjsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1wYXBlci1vdXRsaW5lOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1pb3MtcGFwZXItb3V0bGluZTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1wYXBlcnBsYW5lOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1pb3MtcGFwZXJwbGFuZTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1wYXBlcnBsYW5lLW91dGxpbmU6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWlvcy1wYXBlcnBsYW5lLW91dGxpbmU7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtcGFydGx5c3Vubnk6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWlvcy1wYXJ0bHlzdW5ueTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1wYXJ0bHlzdW5ueS1vdXRsaW5lOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1pb3MtcGFydGx5c3Vubnktb3V0bGluZTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1wYXVzZTpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItaW9zLXBhdXNlOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLXBhdXNlLW91dGxpbmU6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWlvcy1wYXVzZS1vdXRsaW5lOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLXBhdzpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItaW9zLXBhdzsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1wYXctb3V0bGluZTpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItaW9zLXBhdy1vdXRsaW5lOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLXBlb3BsZTpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItaW9zLXBlb3BsZTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1wZW9wbGUtb3V0bGluZTpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItaW9zLXBlb3BsZS1vdXRsaW5lOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLXBlcnNvbjpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItaW9zLXBlcnNvbjsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1wZXJzb24tb3V0bGluZTpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItaW9zLXBlcnNvbi1vdXRsaW5lOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLXBlcnNvbmFkZDpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItaW9zLXBlcnNvbmFkZDsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1wZXJzb25hZGQtb3V0bGluZTpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItaW9zLXBlcnNvbmFkZC1vdXRsaW5lOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLXBob3RvczpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItaW9zLXBob3RvczsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1waG90b3Mtb3V0bGluZTpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItaW9zLXBob3Rvcy1vdXRsaW5lOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLXBpZTpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItaW9zLXBpZTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1waWUtb3V0bGluZTpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItaW9zLXBpZS1vdXRsaW5lOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLXBpbnQ6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWlvcy1waW50OyB9XG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLXBpbnQtb3V0bGluZTpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItaW9zLXBpbnQtb3V0bGluZTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1wbGF5OmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1pb3MtcGxheTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1wbGF5LW91dGxpbmU6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWlvcy1wbGF5LW91dGxpbmU7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtcGx1czpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItaW9zLXBsdXM7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtcGx1cy1lbXB0eTpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItaW9zLXBsdXMtZW1wdHk7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtcGx1cy1vdXRsaW5lOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1pb3MtcGx1cy1vdXRsaW5lOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLXByaWNldGFnOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1pb3MtcHJpY2V0YWc7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtcHJpY2V0YWctb3V0bGluZTpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItaW9zLXByaWNldGFnLW91dGxpbmU7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtcHJpY2V0YWdzOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1pb3MtcHJpY2V0YWdzOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLXByaWNldGFncy1vdXRsaW5lOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1pb3MtcHJpY2V0YWdzLW91dGxpbmU7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtcHJpbnRlcjpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItaW9zLXByaW50ZXI7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtcHJpbnRlci1vdXRsaW5lOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1pb3MtcHJpbnRlci1vdXRsaW5lOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLXB1bHNlOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1pb3MtcHVsc2U7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtcHVsc2Utc3Ryb25nOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1pb3MtcHVsc2Utc3Ryb25nOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLXJhaW55OmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1pb3MtcmFpbnk7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtcmFpbnktb3V0bGluZTpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItaW9zLXJhaW55LW91dGxpbmU7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtcmVjb3JkaW5nOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1pb3MtcmVjb3JkaW5nOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLXJlY29yZGluZy1vdXRsaW5lOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1pb3MtcmVjb3JkaW5nLW91dGxpbmU7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtcmVkbzpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItaW9zLXJlZG87IH1cbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtcmVkby1vdXRsaW5lOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1pb3MtcmVkby1vdXRsaW5lOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLXJlZnJlc2g6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWlvcy1yZWZyZXNoOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLXJlZnJlc2gtZW1wdHk6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWlvcy1yZWZyZXNoLWVtcHR5OyB9XG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLXJlZnJlc2gtb3V0bGluZTpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItaW9zLXJlZnJlc2gtb3V0bGluZTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1yZWxvYWQ6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWlvcy1yZWxvYWQ7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtcmV2ZXJzZS1jYW1lcmE6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWlvcy1yZXZlcnNlLWNhbWVyYTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1yZXZlcnNlLWNhbWVyYS1vdXRsaW5lOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1pb3MtcmV2ZXJzZS1jYW1lcmEtb3V0bGluZTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1yZXdpbmQ6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWlvcy1yZXdpbmQ7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtcmV3aW5kLW91dGxpbmU6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWlvcy1yZXdpbmQtb3V0bGluZTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1yb3NlOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1pb3Mtcm9zZTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1yb3NlLW91dGxpbmU6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWlvcy1yb3NlLW91dGxpbmU7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1pb3Mtc2VhcmNoOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1pb3Mtc2VhcmNoOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLXNlYXJjaC1zdHJvbmc6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWlvcy1zZWFyY2gtc3Ryb25nOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLXNldHRpbmdzOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1pb3Mtc2V0dGluZ3M7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1pb3Mtc2V0dGluZ3Mtc3Ryb25nOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1pb3Mtc2V0dGluZ3Mtc3Ryb25nOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLXNodWZmbGU6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWlvcy1zaHVmZmxlOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLXNodWZmbGUtc3Ryb25nOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1pb3Mtc2h1ZmZsZS1zdHJvbmc7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1pb3Mtc2tpcGJhY2t3YXJkOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1pb3Mtc2tpcGJhY2t3YXJkOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLXNraXBiYWNrd2FyZC1vdXRsaW5lOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1pb3Mtc2tpcGJhY2t3YXJkLW91dGxpbmU7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1pb3Mtc2tpcGZvcndhcmQ6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWlvcy1za2lwZm9yd2FyZDsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1za2lwZm9yd2FyZC1vdXRsaW5lOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1pb3Mtc2tpcGZvcndhcmQtb3V0bGluZTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1zbm93eTpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItaW9zLXNub3d5OyB9XG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLXNwZWVkb21ldGVyOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1pb3Mtc3BlZWRvbWV0ZXI7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1pb3Mtc3BlZWRvbWV0ZXItb3V0bGluZTpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItaW9zLXNwZWVkb21ldGVyLW91dGxpbmU7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1pb3Mtc3RhcjpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItaW9zLXN0YXI7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1pb3Mtc3Rhci1oYWxmOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1pb3Mtc3Rhci1oYWxmOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLXN0YXItb3V0bGluZTpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItaW9zLXN0YXItb3V0bGluZTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1zdG9wd2F0Y2g6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWlvcy1zdG9wd2F0Y2g7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1pb3Mtc3RvcHdhdGNoLW91dGxpbmU6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWlvcy1zdG9wd2F0Y2gtb3V0bGluZTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1zdW5ueTpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItaW9zLXN1bm55OyB9XG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLXN1bm55LW91dGxpbmU6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWlvcy1zdW5ueS1vdXRsaW5lOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLXRlbGVwaG9uZTpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItaW9zLXRlbGVwaG9uZTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy10ZWxlcGhvbmUtb3V0bGluZTpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItaW9zLXRlbGVwaG9uZS1vdXRsaW5lOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLXRlbm5pc2JhbGw6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWlvcy10ZW5uaXNiYWxsOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLXRlbm5pc2JhbGwtb3V0bGluZTpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItaW9zLXRlbm5pc2JhbGwtb3V0bGluZTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy10aHVuZGVyc3Rvcm06YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWlvcy10aHVuZGVyc3Rvcm07IH1cbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtdGh1bmRlcnN0b3JtLW91dGxpbmU6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWlvcy10aHVuZGVyc3Rvcm0tb3V0bGluZTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy10aW1lOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1pb3MtdGltZTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy10aW1lLW91dGxpbmU6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWlvcy10aW1lLW91dGxpbmU7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtdGltZXI6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWlvcy10aW1lcjsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy10aW1lci1vdXRsaW5lOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1pb3MtdGltZXItb3V0bGluZTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy10b2dnbGU6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWlvcy10b2dnbGU7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtdG9nZ2xlLW91dGxpbmU6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWlvcy10b2dnbGUtb3V0bGluZTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy10cmFzaDpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItaW9zLXRyYXNoOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLXRyYXNoLW91dGxpbmU6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWlvcy10cmFzaC1vdXRsaW5lOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLXVuZG86YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWlvcy11bmRvOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLXVuZG8tb3V0bGluZTpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItaW9zLXVuZG8tb3V0bGluZTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy11bmxvY2tlZDpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItaW9zLXVubG9ja2VkOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLXVubG9ja2VkLW91dGxpbmU6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWlvcy11bmxvY2tlZC1vdXRsaW5lOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLXVwbG9hZDpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItaW9zLXVwbG9hZDsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy11cGxvYWQtb3V0bGluZTpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItaW9zLXVwbG9hZC1vdXRsaW5lOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLXZpZGVvY2FtOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1pb3MtdmlkZW9jYW07IH1cbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtdmlkZW9jYW0tb3V0bGluZTpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItaW9zLXZpZGVvY2FtLW91dGxpbmU7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1pb3Mtdm9sdW1lLWhpZ2g6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWlvcy12b2x1bWUtaGlnaDsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy12b2x1bWUtbG93OmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1pb3Mtdm9sdW1lLWxvdzsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy13aW5lZ2xhc3M6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWlvcy13aW5lZ2xhc3M7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1pb3Mtd2luZWdsYXNzLW91dGxpbmU6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWlvcy13aW5lZ2xhc3Mtb3V0bGluZTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy13b3JsZDpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItaW9zLXdvcmxkOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLXdvcmxkLW91dGxpbmU6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWlvcy13b3JsZC1vdXRsaW5lOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9aXBhZDpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItaXBhZDsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWlwaG9uZTpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItaXBob25lOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9aXBvZDpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItaXBvZDsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWpldDpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItamV0OyB9XG4uQHtpb25pY29ucy1wcmVmaXh9a2V5OmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1rZXk7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1rbmlmZTpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXIta25pZmU7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1sYXB0b3A6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWxhcHRvcDsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWxlYWY6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWxlYWY7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1sZXZlbHM6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWxldmVsczsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWxpZ2h0YnVsYjpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItbGlnaHRidWxiOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9bGluazpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItbGluazsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWxvYWQtYTpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItbG9hZC1hOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9bG9hZC1iOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1sb2FkLWI7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1sb2FkLWM6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWxvYWQtYzsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWxvYWQtZDpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItbG9hZC1kOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9bG9jYXRpb246YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWxvY2F0aW9uOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9bG9jay1jb21iaW5hdGlvbjpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItbG9jay1jb21iaW5hdGlvbjsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWxvY2tlZDpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItbG9ja2VkOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9bG9nLWluOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1sb2ctaW47IH1cbi5Ae2lvbmljb25zLXByZWZpeH1sb2ctb3V0OmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1sb2ctb3V0OyB9XG4uQHtpb25pY29ucy1wcmVmaXh9bG9vcDpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItbG9vcDsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fW1hZ25ldDpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItbWFnbmV0OyB9XG4uQHtpb25pY29ucy1wcmVmaXh9bWFsZTpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItbWFsZTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fW1hbjpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItbWFuOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9bWFwOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1tYXA7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1tZWRraXQ6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLW1lZGtpdDsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fW1lcmdlOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1tZXJnZTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fW1pYy1hOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1taWMtYTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fW1pYy1iOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1taWMtYjsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fW1pYy1jOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1taWMtYzsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fW1pbnVzOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1taW51czsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fW1pbnVzLWNpcmNsZWQ6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLW1pbnVzLWNpcmNsZWQ7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1taW51cy1yb3VuZDpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItbWludXMtcm91bmQ7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1tb2RlbC1zOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1tb2RlbC1zOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9bW9uaXRvcjpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItbW9uaXRvcjsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fW1vcmU6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLW1vcmU7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1tb3VzZTpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItbW91c2U7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1tdXNpYy1ub3RlOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1tdXNpYy1ub3RlOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9bmF2aWNvbjpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItbmF2aWNvbjsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fW5hdmljb24tcm91bmQ6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLW5hdmljb24tcm91bmQ7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1uYXZpZ2F0ZTpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItbmF2aWdhdGU7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1uZXR3b3JrOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1uZXR3b3JrOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9bm8tc21va2luZzpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItbm8tc21va2luZzsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fW51Y2xlYXI6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLW51Y2xlYXI7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1vdXRsZXQ6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLW91dGxldDsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fXBhaW50YnJ1c2g6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLXBhaW50YnJ1c2g7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1wYWludGJ1Y2tldDpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItcGFpbnRidWNrZXQ7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1wYXBlci1haXJwbGFuZTpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItcGFwZXItYWlycGxhbmU7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1wYXBlcmNsaXA6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLXBhcGVyY2xpcDsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fXBhdXNlOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1wYXVzZTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fXBlcnNvbjpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItcGVyc29uOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9cGVyc29uLWFkZDpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItcGVyc29uLWFkZDsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fXBlcnNvbi1zdGFsa2VyOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1wZXJzb24tc3RhbGtlcjsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fXBpZS1ncmFwaDpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItcGllLWdyYXBoOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9cGluOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1waW47IH1cbi5Ae2lvbmljb25zLXByZWZpeH1waW5wb2ludDpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItcGlucG9pbnQ7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1waXp6YTpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItcGl6emE7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1wbGFuZTpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItcGxhbmU7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1wbGFuZXQ6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLXBsYW5ldDsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fXBsYXk6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLXBsYXk7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1wbGF5c3RhdGlvbjpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItcGxheXN0YXRpb247IH1cbi5Ae2lvbmljb25zLXByZWZpeH1wbHVzOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1wbHVzOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9cGx1cy1jaXJjbGVkOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1wbHVzLWNpcmNsZWQ7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1wbHVzLXJvdW5kOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1wbHVzLXJvdW5kOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9cG9kaXVtOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1wb2RpdW07IH1cbi5Ae2lvbmljb25zLXByZWZpeH1wb3VuZDpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItcG91bmQ7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1wb3dlcjpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItcG93ZXI7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1wcmljZXRhZzpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItcHJpY2V0YWc7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1wcmljZXRhZ3M6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLXByaWNldGFnczsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fXByaW50ZXI6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLXByaW50ZXI7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1wdWxsLXJlcXVlc3Q6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLXB1bGwtcmVxdWVzdDsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fXFyLXNjYW5uZXI6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLXFyLXNjYW5uZXI7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1xdW90ZTpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItcXVvdGU7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1yYWRpby13YXZlczpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItcmFkaW8td2F2ZXM7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1yZWNvcmQ6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLXJlY29yZDsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fXJlZnJlc2g6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLXJlZnJlc2g7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1yZXBseTpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItcmVwbHk7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1yZXBseS1hbGw6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLXJlcGx5LWFsbDsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fXJpYmJvbi1hOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1yaWJib24tYTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fXJpYmJvbi1iOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1yaWJib24tYjsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fXNhZDpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItc2FkOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9c2FkLW91dGxpbmU6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLXNhZC1vdXRsaW5lOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9c2Npc3NvcnM6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLXNjaXNzb3JzOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9c2VhcmNoOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1zZWFyY2g7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1zZXR0aW5nczpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItc2V0dGluZ3M7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1zaGFyZTpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItc2hhcmU7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1zaHVmZmxlOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1zaHVmZmxlOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9c2tpcC1iYWNrd2FyZDpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItc2tpcC1iYWNrd2FyZDsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fXNraXAtZm9yd2FyZDpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItc2tpcC1mb3J3YXJkOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9c29jaWFsLWFuZHJvaWQ6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLXNvY2lhbC1hbmRyb2lkOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9c29jaWFsLWFuZHJvaWQtb3V0bGluZTpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItc29jaWFsLWFuZHJvaWQtb3V0bGluZTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fXNvY2lhbC1hbmd1bGFyOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1zb2NpYWwtYW5ndWxhcjsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fXNvY2lhbC1hbmd1bGFyLW91dGxpbmU6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLXNvY2lhbC1hbmd1bGFyLW91dGxpbmU7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1zb2NpYWwtYXBwbGU6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLXNvY2lhbC1hcHBsZTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fXNvY2lhbC1hcHBsZS1vdXRsaW5lOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1zb2NpYWwtYXBwbGUtb3V0bGluZTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fXNvY2lhbC1iaXRjb2luOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1zb2NpYWwtYml0Y29pbjsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fXNvY2lhbC1iaXRjb2luLW91dGxpbmU6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLXNvY2lhbC1iaXRjb2luLW91dGxpbmU7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1zb2NpYWwtYnVmZmVyOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1zb2NpYWwtYnVmZmVyOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9c29jaWFsLWJ1ZmZlci1vdXRsaW5lOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1zb2NpYWwtYnVmZmVyLW91dGxpbmU7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1zb2NpYWwtY2hyb21lOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1zb2NpYWwtY2hyb21lOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9c29jaWFsLWNocm9tZS1vdXRsaW5lOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1zb2NpYWwtY2hyb21lLW91dGxpbmU7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1zb2NpYWwtY29kZXBlbjpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItc29jaWFsLWNvZGVwZW47IH1cbi5Ae2lvbmljb25zLXByZWZpeH1zb2NpYWwtY29kZXBlbi1vdXRsaW5lOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1zb2NpYWwtY29kZXBlbi1vdXRsaW5lOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9c29jaWFsLWNzczM6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLXNvY2lhbC1jc3MzOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9c29jaWFsLWNzczMtb3V0bGluZTpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItc29jaWFsLWNzczMtb3V0bGluZTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fXNvY2lhbC1kZXNpZ25lcm5ld3M6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLXNvY2lhbC1kZXNpZ25lcm5ld3M7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1zb2NpYWwtZGVzaWduZXJuZXdzLW91dGxpbmU6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLXNvY2lhbC1kZXNpZ25lcm5ld3Mtb3V0bGluZTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fXNvY2lhbC1kcmliYmJsZTpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItc29jaWFsLWRyaWJiYmxlOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9c29jaWFsLWRyaWJiYmxlLW91dGxpbmU6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLXNvY2lhbC1kcmliYmJsZS1vdXRsaW5lOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9c29jaWFsLWRyb3Bib3g6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLXNvY2lhbC1kcm9wYm94OyB9XG4uQHtpb25pY29ucy1wcmVmaXh9c29jaWFsLWRyb3Bib3gtb3V0bGluZTpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItc29jaWFsLWRyb3Bib3gtb3V0bGluZTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fXNvY2lhbC1ldXJvOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1zb2NpYWwtZXVybzsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fXNvY2lhbC1ldXJvLW91dGxpbmU6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLXNvY2lhbC1ldXJvLW91dGxpbmU7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1zb2NpYWwtZmFjZWJvb2s6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLXNvY2lhbC1mYWNlYm9vazsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fXNvY2lhbC1mYWNlYm9vay1vdXRsaW5lOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1zb2NpYWwtZmFjZWJvb2stb3V0bGluZTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fXNvY2lhbC1mb3Vyc3F1YXJlOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1zb2NpYWwtZm91cnNxdWFyZTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fXNvY2lhbC1mb3Vyc3F1YXJlLW91dGxpbmU6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLXNvY2lhbC1mb3Vyc3F1YXJlLW91dGxpbmU7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1zb2NpYWwtZnJlZWJzZC1kZXZpbDpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItc29jaWFsLWZyZWVic2QtZGV2aWw7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1zb2NpYWwtZ2l0aHViOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1zb2NpYWwtZ2l0aHViOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9c29jaWFsLWdpdGh1Yi1vdXRsaW5lOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1zb2NpYWwtZ2l0aHViLW91dGxpbmU7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1zb2NpYWwtZ29vZ2xlOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1zb2NpYWwtZ29vZ2xlOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9c29jaWFsLWdvb2dsZS1vdXRsaW5lOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1zb2NpYWwtZ29vZ2xlLW91dGxpbmU7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1zb2NpYWwtZ29vZ2xlcGx1czpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItc29jaWFsLWdvb2dsZXBsdXM7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1zb2NpYWwtZ29vZ2xlcGx1cy1vdXRsaW5lOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1zb2NpYWwtZ29vZ2xlcGx1cy1vdXRsaW5lOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9c29jaWFsLWhhY2tlcm5ld3M6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLXNvY2lhbC1oYWNrZXJuZXdzOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9c29jaWFsLWhhY2tlcm5ld3Mtb3V0bGluZTpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItc29jaWFsLWhhY2tlcm5ld3Mtb3V0bGluZTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fXNvY2lhbC1odG1sNTpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItc29jaWFsLWh0bWw1OyB9XG4uQHtpb25pY29ucy1wcmVmaXh9c29jaWFsLWh0bWw1LW91dGxpbmU6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLXNvY2lhbC1odG1sNS1vdXRsaW5lOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9c29jaWFsLWluc3RhZ3JhbTpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItc29jaWFsLWluc3RhZ3JhbTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fXNvY2lhbC1pbnN0YWdyYW0tb3V0bGluZTpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItc29jaWFsLWluc3RhZ3JhbS1vdXRsaW5lOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9c29jaWFsLWphdmFzY3JpcHQ6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLXNvY2lhbC1qYXZhc2NyaXB0OyB9XG4uQHtpb25pY29ucy1wcmVmaXh9c29jaWFsLWphdmFzY3JpcHQtb3V0bGluZTpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItc29jaWFsLWphdmFzY3JpcHQtb3V0bGluZTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fXNvY2lhbC1saW5rZWRpbjpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItc29jaWFsLWxpbmtlZGluOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9c29jaWFsLWxpbmtlZGluLW91dGxpbmU6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLXNvY2lhbC1saW5rZWRpbi1vdXRsaW5lOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9c29jaWFsLW1hcmtkb3duOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1zb2NpYWwtbWFya2Rvd247IH1cbi5Ae2lvbmljb25zLXByZWZpeH1zb2NpYWwtbm9kZWpzOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1zb2NpYWwtbm9kZWpzOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9c29jaWFsLW9jdG9jYXQ6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLXNvY2lhbC1vY3RvY2F0OyB9XG4uQHtpb25pY29ucy1wcmVmaXh9c29jaWFsLXBpbnRlcmVzdDpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItc29jaWFsLXBpbnRlcmVzdDsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fXNvY2lhbC1waW50ZXJlc3Qtb3V0bGluZTpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItc29jaWFsLXBpbnRlcmVzdC1vdXRsaW5lOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9c29jaWFsLXB5dGhvbjpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItc29jaWFsLXB5dGhvbjsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fXNvY2lhbC1yZWRkaXQ6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLXNvY2lhbC1yZWRkaXQ7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1zb2NpYWwtcmVkZGl0LW91dGxpbmU6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLXNvY2lhbC1yZWRkaXQtb3V0bGluZTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fXNvY2lhbC1yc3M6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLXNvY2lhbC1yc3M7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1zb2NpYWwtcnNzLW91dGxpbmU6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLXNvY2lhbC1yc3Mtb3V0bGluZTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fXNvY2lhbC1zYXNzOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1zb2NpYWwtc2FzczsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fXNvY2lhbC1za3lwZTpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItc29jaWFsLXNreXBlOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9c29jaWFsLXNreXBlLW91dGxpbmU6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLXNvY2lhbC1za3lwZS1vdXRsaW5lOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9c29jaWFsLXNuYXBjaGF0OmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1zb2NpYWwtc25hcGNoYXQ7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1zb2NpYWwtc25hcGNoYXQtb3V0bGluZTpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItc29jaWFsLXNuYXBjaGF0LW91dGxpbmU7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1zb2NpYWwtdHVtYmxyOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1zb2NpYWwtdHVtYmxyOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9c29jaWFsLXR1bWJsci1vdXRsaW5lOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1zb2NpYWwtdHVtYmxyLW91dGxpbmU7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1zb2NpYWwtdHV4OmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1zb2NpYWwtdHV4OyB9XG4uQHtpb25pY29ucy1wcmVmaXh9c29jaWFsLXR3aXRjaDpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItc29jaWFsLXR3aXRjaDsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fXNvY2lhbC10d2l0Y2gtb3V0bGluZTpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItc29jaWFsLXR3aXRjaC1vdXRsaW5lOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9c29jaWFsLXR3aXR0ZXI6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLXNvY2lhbC10d2l0dGVyOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9c29jaWFsLXR3aXR0ZXItb3V0bGluZTpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItc29jaWFsLXR3aXR0ZXItb3V0bGluZTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fXNvY2lhbC11c2Q6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLXNvY2lhbC11c2Q7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1zb2NpYWwtdXNkLW91dGxpbmU6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLXNvY2lhbC11c2Qtb3V0bGluZTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fXNvY2lhbC12aW1lbzpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItc29jaWFsLXZpbWVvOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9c29jaWFsLXZpbWVvLW91dGxpbmU6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLXNvY2lhbC12aW1lby1vdXRsaW5lOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9c29jaWFsLXdoYXRzYXBwOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1zb2NpYWwtd2hhdHNhcHA7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1zb2NpYWwtd2hhdHNhcHAtb3V0bGluZTpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItc29jaWFsLXdoYXRzYXBwLW91dGxpbmU7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1zb2NpYWwtd2luZG93czpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItc29jaWFsLXdpbmRvd3M7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1zb2NpYWwtd2luZG93cy1vdXRsaW5lOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1zb2NpYWwtd2luZG93cy1vdXRsaW5lOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9c29jaWFsLXdvcmRwcmVzczpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItc29jaWFsLXdvcmRwcmVzczsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fXNvY2lhbC13b3JkcHJlc3Mtb3V0bGluZTpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItc29jaWFsLXdvcmRwcmVzcy1vdXRsaW5lOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9c29jaWFsLXlhaG9vOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1zb2NpYWwteWFob287IH1cbi5Ae2lvbmljb25zLXByZWZpeH1zb2NpYWwteWFob28tb3V0bGluZTpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItc29jaWFsLXlhaG9vLW91dGxpbmU7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1zb2NpYWwteWVuOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1zb2NpYWwteWVuOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9c29jaWFsLXllbi1vdXRsaW5lOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1zb2NpYWwteWVuLW91dGxpbmU7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1zb2NpYWwteW91dHViZTpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItc29jaWFsLXlvdXR1YmU7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1zb2NpYWwteW91dHViZS1vdXRsaW5lOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1zb2NpYWwteW91dHViZS1vdXRsaW5lOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9c291cC1jYW46YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLXNvdXAtY2FuOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9c291cC1jYW4tb3V0bGluZTpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItc291cC1jYW4tb3V0bGluZTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fXNwZWFrZXJwaG9uZTpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItc3BlYWtlcnBob25lOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9c3BlZWRvbWV0ZXI6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLXNwZWVkb21ldGVyOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9c3Bvb246YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLXNwb29uOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9c3RhcjpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItc3RhcjsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fXN0YXRzLWJhcnM6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLXN0YXRzLWJhcnM7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1zdGVhbTpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItc3RlYW07IH1cbi5Ae2lvbmljb25zLXByZWZpeH1zdG9wOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1zdG9wOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9dGhlcm1vbWV0ZXI6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLXRoZXJtb21ldGVyOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9dGh1bWJzZG93bjpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItdGh1bWJzZG93bjsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fXRodW1ic3VwOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci10aHVtYnN1cDsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fXRvZ2dsZTpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItdG9nZ2xlOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9dG9nZ2xlLWZpbGxlZDpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItdG9nZ2xlLWZpbGxlZDsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fXRyYW5zZ2VuZGVyOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci10cmFuc2dlbmRlcjsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fXRyYXNoLWE6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLXRyYXNoLWE7IH1cbi5Ae2lvbmljb25zLXByZWZpeH10cmFzaC1iOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci10cmFzaC1iOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9dHJvcGh5OmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci10cm9waHk7IH1cbi5Ae2lvbmljb25zLXByZWZpeH10c2hpcnQ6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLXRzaGlydDsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fXRzaGlydC1vdXRsaW5lOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci10c2hpcnQtb3V0bGluZTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fXVtYnJlbGxhOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci11bWJyZWxsYTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fXVuaXZlcnNpdHk6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLXVuaXZlcnNpdHk7IH1cbi5Ae2lvbmljb25zLXByZWZpeH11bmxvY2tlZDpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItdW5sb2NrZWQ7IH1cbi5Ae2lvbmljb25zLXByZWZpeH11cGxvYWQ6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLXVwbG9hZDsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fXVzYjpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItdXNiOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9dmlkZW9jYW1lcmE6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLXZpZGVvY2FtZXJhOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9dm9sdW1lLWhpZ2g6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLXZvbHVtZS1oaWdoOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9dm9sdW1lLWxvdzpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItdm9sdW1lLWxvdzsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fXZvbHVtZS1tZWRpdW06YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLXZvbHVtZS1tZWRpdW07IH1cbi5Ae2lvbmljb25zLXByZWZpeH12b2x1bWUtbXV0ZTpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItdm9sdW1lLW11dGU7IH1cbi5Ae2lvbmljb25zLXByZWZpeH13YW5kOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci13YW5kOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9d2F0ZXJkcm9wOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci13YXRlcmRyb3A7IH1cbi5Ae2lvbmljb25zLXByZWZpeH13aWZpOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci13aWZpOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9d2luZWdsYXNzOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci13aW5lZ2xhc3M7IH1cbi5Ae2lvbmljb25zLXByZWZpeH13b21hbjpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItd29tYW47IH1cbi5Ae2lvbmljb25zLXByZWZpeH13cmVuY2g6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLXdyZW5jaDsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fXhib3g6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLXhib3g7IH0iLCIuY2hhdC1lbWJlZC1tYWluLXRpdGxlIHtcbiAgZGlzcGxheTogZmxleDtcbiAgZmxleC1ncm93OiAxO1xuICBwYWRkaW5nLWxlZnQ6IDMxcHg7XG4gIHBhZGRpbmctdG9wOiA3cHg7XG59XG5cbi5naXR0ZXItY2hhdC1lbWJlZCB7XG4gIHotaW5kZXg6IDEwMDtcbiAgcG9zaXRpb246IGZpeGVkO1xuXG4gIHRvcDogMDtcbiAgbGVmdDogNjAlO1xuICBib3R0b206IDA7XG4gIHJpZ2h0OiAwO1xuXG4gIGRpc3BsYXk6IGZsZXg7XG4gIGZsZXgtZGlyZWN0aW9uOiByb3c7XG4gIHRyYW5zaXRpb246IHRyYW5zZm9ybSAwLjNzIGN1YmljLWJlemllcigwLjE2LCAwLjIyLCAwLjIyLCAxLjcpO1xufVxuXG4uZ2l0dGVyLWNoYXQtZW1iZWQuaXMtY29sbGFwc2VkOm5vdCguaXMtbG9hZGluZykge1xuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoMTEwJSk7XG59XG4iLCIuam9icy1saXN0LWhpZ2hsaWdodCB7XG4gIGJhY2tncm91bmQtY29sb3I6ICNmZmNcbn1cblxuYS5qb2JzLWxpc3QtaGlnaGxpZ2h0OmhvdmVyIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZmY1xufVxuXG4uam9icy1saXN0IHtcbiAgY3Vyc29yOiBwb2ludGVyO1xuICBjdXJzb3I6IGhhbmQ7XG59XG5cbi5qb2JzLWNoZWNrYm94LXNwYWNlciBpbnB1dFt0eXBlPVwiY2hlY2tib3hcIl0ge1xuICBtYXJnaW4tbGVmdDogLTIzcHhcbn1cbiIsIi5jaGFsbGVuZ2Utc3RlcC1kZXNjcmlwdGlvbiB7XG4gIGZvbnQtc2l6ZTogMS41ZW07XG59XG4uY2hhbGxlbmdlLXN0ZXAtY291bnRlciB7XG4gIGZvbnQtc2l6ZTogMjBweDtcbiAgbGluZS1oZWlnaHQ6IDQ0cHg7XG59XG5cbi5jaGFsbGVuZ2UtaW5zdHJ1Y3Rpb25zLXRpdGxlIHtcbiAgbWFyZ2luLXRvcDogMDtcbiAgaSB7XG4gICAgbWFyZ2luLWxlZnQ6IDVweDtcbiAgICBsaW5lLWhlaWdodDogMjBweDtcbiAgfVxufVxuXG4uY2hhbGxlbmdlLWluc3RydWN0aW9ucyB7XG4gIG1hcmdpbi1ib3R0b206IDVweDtcbiAgaDQge1xuICAgIG1hcmdpbi1ib3R0b206IDA7XG4gIH1cbiAgYmxvY2txdW90ZSB7XG4gICAgZm9udC1zaXplOiA5MCU7XG4gICAgZm9udC1mYW1pbHk6IEBmb250LWZhbWlseS1tb25vc3BhY2U7XG4gICAgY29sb3I6IEBjb2RlLWNvbG9yO1xuICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmZiZTU7XG4gICAgYm9yZGVyLXJhZGl1czogQGJvcmRlci1yYWRpdXMtYmFzZTtcbiAgICBib3JkZXI6IDFweCBzb2xpZCBAcHJlLWJvcmRlci1jb2xvcjtcbiAgICB3aGl0ZS1zcGFjZTogcHJlO1xuICAgIHBhZGRpbmc6IDVweCAxMHB4O1xuICAgIG1hcmdpbi1ib3R0b206IDEwcHg7XG4gICAgbWFyZ2luLXRvcDogLTEwcHg7XG4gICAgb3ZlcmZsb3c6IGF1dG87XG4gIH1cbiAgZGZuIHtcbiAgICBmb250LWZhbWlseTogQGZvbnQtZmFtaWx5LW1vbm9zcGFjZTtcbiAgICBjb2xvcjogQGNvZGUtY29sb3I7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogQGNvZGUtYmc7XG4gICAgYm9yZGVyLXJhZGl1czogQGJvcmRlci1yYWRpdXMtYmFzZTtcbiAgfVxuICAmIGEsICNNRE4tbGlua3MgYSB7XG4gICAgY29sb3I6ICMzMTcwOGY7XG4gIH1cbiAgJiBhOjphZnRlciwgI01ETi1saW5rcyBhOjphZnRlciB7XG4gICAgZm9udC1zaXplOiA3MCU7XG4gICAgZm9udC1mYW1pbHk6IEZvbnRBd2Vzb21lO1xuICAgIGNvbnRlbnQ6IFwiIFxcZjA4ZVwiO1xuICB9XG4gIG9sIHtcbiAgICBmb250LXNpemU6IDE2cHg7XG4gIH1cbn1cblxuI3Rlc3RTdWl0ZSB7XG4gIG1hcmdpbi10b3A6IDEwcHg7XG4gID4gZGl2ID4ucm93IHtcbiAgICBtYXJnaW46IDAhaW1wb3J0YW50O1xuICB9XG59XG5cbi50ZXN0LW91dHB1dCB7XG4gIGZvbnQtc2l6ZTogMTVweDtcbiAgZm9udC1mYW1pbHk6IFwiVWJ1bnR1IE1vbm9cIjtcbiAgbWFyZ2luLXRvcDogOHB4O1xuICBsaW5lLWhlaWdodDoyMHB4O1xufVxuXG4uZ3JheWVkLW91dC10ZXN0LW91dHB1dCB7XG4gIGNvbG9yOiBAZ3JheS1saWdodDtcbn1cblxuLmJpZy1lcnJvci1pY29uIHtcbiAgZm9udC1zaXplOiAzMHB4O1xuICBjb2xvcjogQGJyYW5kLWRhbmdlcjtcbiAgdG9wOjUwJTtcbn1cblxuLmJpZy1zdWNjZXNzLWljb24ge1xuICBmb250LXNpemU6IDMwcHg7XG4gIGNvbG9yOiBAYnJhbmQtcHJpbWFyeTtcbn1cblxuaWZyYW1lLmlwaG9uZSB7XG4gIGJvcmRlcjogbm9uZTtcbiAgQG1lZGlhKG1pbi13aWR0aDogOTkycHgpIHtcbiAgICB3aWR0aDogMjgwcHg7XG4gICAgaGVpZ2h0OiA1MDBweDtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgdG9wOiA3MHB4O1xuICAgIHJpZ2h0OiAzNXB4O1xuICAgIG92ZXJmbG93LXk6IHNjcm9sbDtcbiAgfVxuICBAbWVkaWEobWF4LXdpZHRoOiA5OTFweCkge1xuICAgIHdpZHRoOiAxMDAlO1xuICAgIGJvcmRlci1yYWRpdXM6IDVweDtcbiAgICBvdmVyZmxvdy15OiB2aXNpYmxlO1xuICAgIGhlaWdodDogNTAwcHg7XG4gIH1cbiAgQG1lZGlhIChtaW4td2lkdGg6IDEyMDBweCkgYW5kIChtYXgtd2lkdGg6IDEyNTBweCl7XG4gICAgcmlnaHQ6IDIycHg7ICAgICAgXG4gIH1cbn1cblxuLy8gVG8gYWRqdXN0IHJpZ2h0IG1hcmdpbiwgbmVnYXRpdmUgdmFsdWVzIGJyaW5nIHRoZSBpbWFnZSBjbG9zZXIgdG8gdGhlIGVkZ2Ugb2YgdGhlIHNjcmVlblxuLmlwaG9uZS1wb3NpdGlvbiB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgdG9wOiAtNTBweDtcbiAgei1pbmRleDogLTE7XG4gIHJpZ2h0OiAtMTk1cHg7XG4gIEBtZWRpYSAobWluLXdpZHRoOiAxMjAwcHgpIGFuZCAobWF4LXdpZHRoOiAxMjUwcHgpe1xuICAgIHJpZ2h0OiAtMjA3cHg7ICAgICAgXG4gIH1cbn1cbiIsIi8qXG4gKiBiYXNlZCBvZmYgb2YgaHR0cHM6Ly9naXRodWIuY29tL2dpdHRlckhRL3NpZGVjYXJcbiAqIGxpY2Vuc2U6IE1JVFxuICovXG4ubWFwLWFzaWRlIHtcbiAgICB3aWR0aDo1MDBweDtcblxuICAgIHotaW5kZXg6IDIwMDAwO1xuICAgIHBvc2l0aW9uOiBmaXhlZDtcbiAgICB0b3A6IDA7XG4gICAgYm90dG9tOiAwO1xuICAgIHJpZ2h0OiAwO1xuXG4gICAgZGlzcGxheTogLXdlYmtpdC1mbGV4O1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgLXdlYmtpdC1mbGV4LWRpcmVjdGlvbjogcm93O1xuICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogQGJvZHktYmc7XG4gICAgYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjZGRkO1xuICAgIGJveC1zaGFkb3c6IC0xMnB4IDAgMThweCAwIHJnYmEoNTAsIDUwLCA1MCwgMC4xKTtcblxuICAgIHRyYW5zaXRpb246IHRyYW5zZm9ybSAwLjNzIGN1YmljLWJlemllcigwLjE2LCAwLjIyLCAwLjIyLCAxLjcpO1xuXG4gICAgJi5pcy1jb2xsYXBzZWQ6bm90KC5pcy1sb2FkaW5nKSB7XG4gICAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlWCgxMTAlKTtcbiAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgxMTAlKTtcbiAgICB9XG5cbiAgICAvKiBBZGQgc29tZSBcImV4dGVuc2lvblwiIHNvIHRoYXQgdGhlcmUgaXNuJ3QgYSBnYXBcbiAgICAgKiB3aGVuIHdlIHRyYW5zbGF0ZSh2aWEgYW5pbWF0aW9uKSBtb3JlIHRoYW4gMTAwJSAqL1xuICAgICY6YWZ0ZXIge1xuICAgICAgY29udGVudDogJyc7XG5cbiAgICAgIHotaW5kZXg6IC0xO1xuICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgICAgdG9wOiAwO1xuICAgICAgbGVmdDogMTAwJTtcbiAgICAgIGJvdHRvbTogMDtcbiAgICAgIHJpZ2h0OiAtMTAwJTtcblxuICAgICAgYmFja2dyb3VuZC1jb2xvcjogQGJvZHktYmc7XG4gICAgfVxuICAgIGlmcmFtZSB7XG4gICAgICB3aWR0aDogMTAwJTtcbiAgICAgIGhlaWdodDogMTAwJTtcbiAgICB9XG59XG5cbi5tYXAtYXNpZGUtYWN0aW9uLWJhciB7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIHRvcDogMDtcbiAgICByaWdodDogMDtcblxuICAgIGRpc3BsYXk6IC13ZWJraXQtZmxleDtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGp1c3RpZnktY29udGVudDogZmxleC1lbmQ7XG5cbiAgICBwYWRkaW5nLWJvdHRvbTogNXB4O1xuICAgIHBhZGRpbmctcmlnaHQ6MTBweDtcbiAgICBwYWRkaW5nLXRvcDo1cHg7XG4gICAgei1pbmRleDogMTAwO1xufVxuXG4ubWFwLWZpeGVkLWhlYWRlciB7XG4gIHBvc2l0aW9uOiBmaXhlZDtcbiAgYmFja2dyb3VuZDogd2hpdGU7XG4gIHBhZGRpbmctdG9wOiA1cHg7XG4gIHdpZHRoOiAxMDAlO1xuICB6LWluZGV4OiAxO1xuICBsZWZ0OiAwO1xuICB0b3A6IDA7XG4gIEBtZWRpYSAobWF4LXdpZHRoOiA3MjBweCkge1xuICAgIHBhZGRpbmctdG9wOjMwcHg7XG4gIH1cbiAgcCB7XG4gIG1hcmdpbjogNXB4IDAgMjBweDtcbiAgICBAbWVkaWEgKG1heC13aWR0aDogNzIwcHgpIHtcbiAgICAgIG1hcmdpbi1ib3R0b206MTBweDtcbiAgICB9XG4gIH1cbiAgaHIge1xuICAgIG1hcmdpbjozMHB4IDA7XG4gICAgQG1lZGlhIChtYXgtd2lkdGg6IDcyMHB4KSB7XG4gICAgICBtYXJnaW46MjVweCAwO1xuICAgIH1cbiAgfVxuICAuZmxhc2hNZXNzYWdlIHtcbiAgICBwb3NpdGlvbjpmaXhlZDtcbiAgICBtYXJnaW46IDAgYXV0bztcbiAgICB6LWluZGV4OiAyO1xuICAgIHRvcDogMTYwcHg7XG4gICAgd2lkdGg6IDEwMCU7XG4gIH1cbiB9XG5cbi5tYXAtYnV0dG9ucyB7XG4gIG1hcmdpbi10b3A6IC0xMHB4O1xuICAmIGJ1dHRvbixcbiAgJiAuaW5wdXQtZ3JvdXB7XG4gICAgd2lkdGg6MzAwcHg7XG4gIH1cbiAgLmlucHV0LWdyb3Vwe1xuICAgIG1hcmdpbi10b3A6IDE1cHg7XG4gICAgbWFyZ2luLWxlZnQ6IGF1dG87XG4gICAgbWFyZ2luLXJpZ2h0OiBhdXRvO1xuICB9XG59XG5cbiNtYXAtZmlsdGVyIHtcbiAgICBiYWNrZ3JvdW5kOiNmZmY7XG4gICAgYm9yZGVyLWNvbG9yOiBkYXJrZ3JlZW47XG59XG4uaW5wdXQtZ3JvdXAtYWRkb24ge1xuICB3aWR0aDo0MHB4O1xuICBjb2xvcjogZGFya2dyZWVuO1xuICBiYWNrZ3JvdW5kOiAjZmZmO1xuICBib3JkZXItY29sb3I6IGRhcmtncmVlbjtcbiAgJi5maWxsZWR7XG4gICAgYmFja2dyb3VuZDogZGFya2dyZWVuO1xuICAgIGJvcmRlci1jb2xvcjogIzAwMGQwMDtcbiAgICBjb2xvcjogI2ZmZjtcbiAgICBjdXJzb3I6IHBvaW50ZXI7XG4gIH1cbiAgLmZhIHtcbiAgICBwb3NpdGlvbjphYnNvbHV0ZTtcbiAgICB0b3A6NTAlO1xuICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC01MCUpO1xuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtNTAlKTtcbiAgICByaWdodDoxMHB4O1xuICB9XG59XG5cbi5tYXBXcmFwcGVyIHtcbiAgcG9zaXRpb246YWJzb2x1dGU7XG4gIGRpc3BsYXk6IGJsb2NrO1xuICBoZWlnaHQ6IDEwMCU7XG4gIHdpZHRoOiAxMDAlOyBcbn1cblxuLm1hcC1hY2NvcmRpb24ge1xuICB3aWR0aDo3MDBweDsgXG4gIG1hcmdpbjoxNTVweCBhdXRvIDA7IFxuICBwb3NpdGlvbjpyZWxhdGl2ZTtcbiAgI25lc3RlZCB7XG4gICAgbWFyZ2luOjAgMTBweDtcbiAgICBAbWVkaWEgKG1heC13aWR0aDogNDAwcHgpIHtcbiAgICBtYXJnaW46MDtcbiAgICB9XG4gIH1cbiAgYTpmb2N1cyB7XG4gICAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7XG4gICAgICBjb2xvcjpkYXJrZ3JlZW47XG4gIH1cbiAgYTpmb2N1czpob3ZlciB7XG4gICAgICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTtcbiAgICAgIGNvbG9yOiMwMDE4MDA7XG4gIH1cbiAgaDIgPiBhIHtcbiAgICAgIHdpZHRoOjEwMCU7XG4gICAgICBkaXNwbGF5OmJsb2NrO1xuICAgICAgYmFja2dyb3VuZDojZWZlZmVmO1xuICAgICAgcGFkZGluZzoxMHB4IDA7XG4gICAgICBwYWRkaW5nLWxlZnQ6NTBweDtcbiAgICAgIHBhZGRpbmctcmlnaHQ6MjBweDtcbiAgICB9XG5cbiAgaDMge1xuICAgIG1hcmdpbjoxNXB4IDA7XG4gICAgcGFkZGluZzowO1xuICAgICY6Zmlyc3QtY2hpbGQge1xuICAgICAgbWFyZ2luLXRvcDoyNXB4XG4gICAgfVxuICAgID4gYSB7XG4gICAgICBwYWRkaW5nLWxlZnQ6IDQwcHg7XG4gICAgICBwYWRkaW5nLWJvdHRvbTogMTBweDtcbiAgICAgIGRpc3BsYXk6YmxvY2s7XG4gICAgICBtYXgtd2lkdGg6IDUzNXB4O1xuICAgIH1cbiAgfVxuXG4gIGRpdi5jaGFwdGVyQmxvY2sge1xuICAgIDpiZWZvcmUge1xuICAgICAgbWFyZ2luLXJpZ2h0OiAxNXB4O1xuICAgIH1cbiAgICBwIHtcbiAgICAgIHRleHQtaW5kZW50OiAtMTVweDtcbiAgICAgIG1hcmdpbi1sZWZ0OiA2MHB4O1xuICAgICAgcGFkZGluZy1yaWdodDogMjBweDtcbiAgICAgIEBtZWRpYSAobWF4LXdpZHRoOiA0MDBweCkge1xuICAgICAgICAgIG1hcmdpbi1sZWZ0OjMwcHg7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLmNoYWxsZW5nZUJsb2NrRGVzY3JpcHRpb24ge1xuICAgICAgbWFyZ2luOjA7XG4gICAgICBtYXJnaW4tdG9wOi0xMHB4O1xuICAgICAgcGFkZGluZzowIDE1cHggMjNweCAzMHB4O1xuICAgIH1cblxuICBzcGFuLm5vLWxpbmstdW5kZXJsaW5lIHtcbiAgICBwb3NpdGlvbjphYnNvbHV0ZTtcbiAgICBtYXJnaW4tbGVmdDotMzBweDtcbiAgICBjb2xvcjogIzY2NjtcbiAgfVxuXG4gIGRpdiA+IGRpdjpsYXN0LWNoaWxkIHtcbiAgICBtYXJnaW4tYm90dG9tOjMwcHhcbiAgfVxufVxuLmNoYWxsZW5nZUJsb2NrVGltZSB7XG4gIGZvbnQtc2l6ZTogMThweDtcbiAgY29sb3I6ICNCQkJCQkI7XG4gIGRpc3BsYXk6YmxvY2s7XG4gIG1hcmdpbi1sZWZ0OiA0MHB4O1xuICBtYXJnaW4tYm90dG9tOiAyMHB4O1xuICBAbWVkaWEgKG1pbi13aWR0aDogNzIxcHgpIHtcbiAgICBtYXJnaW4tcmlnaHQ6IDIwcHg7XG4gICAgbWFyZ2luLXRvcDotMzBweDtcbiAgICBmbG9hdDpyaWdodDtcbiAgfVxufVxuXG5AbWVkaWEgKG1heC13aWR0aDogNzIwcHgpIHtcbiAgLm1hcC1hY2NvcmRpb24ge1xuICAgIGxlZnQ6MDtcbiAgICByaWdodDowO1xuICAgIHdpZHRoOjEwMCU7XG4gICAgdG9wOjE5NXB4O1xuICAgIGJvdHRvbTowO1xuICAgIG1hcmdpbjowO1xuICAgIHBvc2l0aW9uOmFic29sdXRlO1xuICAgIG92ZXJmbG93LXg6IGhpZGRlbjtcbiAgICBvdmVyZmxvdy15OiBhdXRvO1xuICAgIC13ZWJraXQtb3ZlcmZsb3ctc2Nyb2xsaW5nOiB0b3VjaDtcbiAgICBoMiB7XG4gICAgICBtYXJnaW46MTVweCAwO1xuICAgICAgcGFkZGluZzowO1xuICAgICAgJjpmaXJzdC1vZi10eXBlIHtcbiAgICAgICAgbWFyZ2luLXRvcDowO1xuICAgICAgfVxuICAgICAgPiBhIHtcbiAgICAgICAgcGFkZGluZzoxMHB4IDA7XG4gICAgICAgIHBhZGRpbmctbGVmdDo1MHB4O1xuICAgICAgICBwYWRkaW5nLXJpZ2h0OjIwcHg7XG4gICAgICAgIGZvbnQtc2l6ZToyMHB4O1xuICAgICAgfVxuICAgIH1cbiAgICBoMyB7XG4gICAgICBtYXJnaW46MTBweCAwO1xuICAgICAgcGFkZGluZzowO1xuICAgICAgPiBhIHtcbiAgICAgICAgY2xlYXI6Ym90aDtcbiAgICAgICAgZm9udC1zaXplOjIwcHg7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4gICAgXG4ubWFwLWFzaWRlLWFjdGlvbi1pdGVtIHtcbiAgICBkaXNwbGF5OiAtd2Via2l0LWZsZXg7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICAvKiBtYWluIGF4aXMgKi9cbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgICAvKiBjcm9zcyBheGlzICovXG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcblxuICAgIHdpZHRoOiA0MHB4O1xuICAgIGhlaWdodDogNDBweDtcblxuICAgIHBhZGRpbmctbGVmdDogMDtcbiAgICBwYWRkaW5nLXJpZ2h0OiAwO1xuXG4gICAgb3BhY2l0eTogMC42NTtcbiAgICBiYWNrZ3JvdW5kOiBub25lO1xuICAgIGJhY2tncm91bmQtcG9zaXRpb246IGNlbnRlciBjZW50ZXI7XG4gICAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDtcbiAgICBiYWNrZ3JvdW5kLXNpemU6IDIycHggMjJweDtcbiAgICBib3JkZXI6IDA7XG4gICAgb3V0bGluZTogbm9uZTtcblxuICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICBjdXJzb3I6IGhhbmQ7XG5cbiAgICB0cmFuc2l0aW9uOiBhbGwgMC4ycyBlYXNlO1xuXG4gICAgJjpob3ZlcixcbiAgICAmOmZvY3VzIHtcbiAgICAgIG9wYWNpdHk6IDE7XG4gICAgfVxuXG4gICAgJjphY3RpdmUge1xuICAgICAgZmlsdGVyOiBodWUtcm90YXRlKDgwZGVnKSBzYXR1cmF0ZSgxNTApO1xuICAgIH1cbn1cblxuI25vbmVGb3VuZCB7XG4gICAgZGlzcGxheTpub25lO1xuICAgIG1hcmdpbjo2MHB4IDMwcHggMDtcbiAgICBmb250LXNpemU6MzBweDtcbiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gICAgY29sb3I6ZGFya2dyZWVuO1xuICAgIC5mYSB7XG4gICAgICBkaXNwbGF5OmJsb2NrO1xuICAgICAgZm9udC1zaXplOjMwMHB4O1xuICAgIH1cbn1cblxuLm1hcC1hc2lkZS1hY3Rpb24tcG9wLW91dCB7XG4gICAgbWFyZ2luLXJpZ2h0OiAtNHB4O1xuICAgIGJhY2tncm91bmQtaW1hZ2U6IHVybChkYXRhOmltYWdlL3N2Zyt4bWw7YmFzZTY0LFBITjJaeUI0Yld4dWN6MGlhSFIwY0RvdkwzZDNkeTUzTXk1dmNtY3ZNakF3TUM5emRtY2lJSFpwWlhkQ2IzZzlJakFnTUNBeU1EQWdNVGN4TGpReU9TSWdabWxzYkQwaUl6TmhNekV6TXlJK1BIQmhkR2dnWkQwaVRURTFOeTR4TkRNc01UQXpMalUzTVhZek5TNDNNVFJqTUN3NExqZzFOQzB6TGpFME5Dd3hOaTQwTWpZdE9TNDBNekVzTWpJdU56RXpjeTB4TXk0NE5UZ3NPUzQwTXpFdE1qSXVOekV5TERrdU5ETXhTRE15TGpFME15QmpMVGd1T0RVMExEQXRNVFl1TkRJMUxUTXVNVFEwTFRJeUxqY3hNaTA1TGpRek1WTXdMREUwT0M0eE5Dd3dMREV6T1M0eU9EVldORFl1TkRJNVl6QXRPQzQ0TlRRc015NHhORFF0TVRZdU5ESTFMRGt1TkRNeExUSXlMamN4TWlCak5pNHlPRGN0Tmk0eU9EY3NNVE11T0RVNExUa3VORE14TERJeUxqY3hNaTA1TGpRek1XZzNPQzQxTnpKak1TNHdOREVzTUN3eExqZzVOaXd3TGpNek5Td3lMalUyTml3eExqQXdOR013TGpZM0xEQXVOamNzTVM0d01EUXNNUzQxTWpVc01TNHdNRFFzTWk0MU5qZFdNalVnWXpBc01TNHdOREl0TUM0ek16UXNNUzQ0T1RjdE1TNHdNRFFzTWk0MU5qZGpMVEF1Tmpjc01DNDJOeTB4TGpVeU5Td3hMakF3TkMweUxqVTJOaXd4TGpBd05FZ3pNaTR4TkROakxUUXVPVEV4TERBdE9TNHhNVFVzTVM0M05Ea3RNVEl1TmpFeUxEVXVNalEySUhNdE5TNHlORFlzTnk0M01ERXROUzR5TkRZc01USXVOakV5ZGpreUxqZzFObU13TERRdU9URXhMREV1TnpRNUxEa3VNVEUxTERVdU1qUTJMREV5TGpZeE1uTTNMamN3TVN3MUxqSTBOU3d4TWk0Mk1USXNOUzR5TkRWSU1USTFZelF1T1RFc01DdzVMakV4TlMweExqYzBPQ3d4TWk0Mk1URXROUzR5TkRVZ1l6TXVORGszTFRNdU5EazNMRFV1TWpRMkxUY3VOekF4TERVdU1qUTJMVEV5TGpZeE1uWXRNelV1TnpFMFl6QXRNUzR3TkRJc01DNHpNelF0TVM0NE9UY3NNUzR3TURRdE1pNDFOamRqTUM0Mk55MHdMalkyT1N3eExqVXlOUzB4TGpBd05Dd3lMalUyTnkweExqQXdOR2czTGpFME15QmpNUzR3TkRJc01Dd3hMamc1Tnl3d0xqTXpOU3d5TGpVMk55d3hMakF3TkVNeE5UWXVPREE1TERFd01TNDJOelFzTVRVM0xqRTBNeXd4TURJdU5USTVMREUxTnk0eE5ETXNNVEF6TGpVM01Yb2dUVEl3TUN3M0xqRTBNM1kxTnk0eE5ETWdZekFzTVM0NU16VXRNQzQzTURjc015NDJNRGt0TWk0eE1qRXNOUzR3TWpKakxURXVOREV6TERFdU5ERTBMVE11TURnNExESXVNVEl4TFRVdU1ESXhMREl1TVRJeFl5MHhMamt6TlN3d0xUTXVOakE1TFRBdU56QTNMVFV1TURJeUxUSXVNVEl4YkMweE9TNDJORFF0TVRrdU5qUXpJR3d0TnpJdU56WTNMRGN5TGpjMk9XTXRNQzQzTkRRc01DNDNORFF0TVM0MkxERXVNVEUxTFRJdU5UWTNMREV1TVRFMWN5MHhMamd5TXkwd0xqTTNNUzB5TGpVMk55MHhMakV4TlV3M055NDFOamNzTVRBNUxqY3hZeTB3TGpjME5DMHdMamMwTkMweExqRXhOaTB4TGpZdE1TNHhNVFl0TWk0MU5qY2dZekF0TUM0NU5qY3NNQzR6TnpJdE1TNDRNaklzTVM0eE1UWXRNaTQxTmpac056SXVOelk0TFRjeUxqYzJPR3d0TVRrdU5qUTBMVEU1TGpZME0yTXRNUzQwTVRNdE1TNDBNVFF0TWk0eE1pMHpMakE0T0MweUxqRXlMVFV1TURJeVl6QXRNUzQ1TXpVc01DNDNNRGN0TXk0Mk1Ea3NNaTR4TWkwMUxqQXlNaUJETVRNeUxqRXdOU3d3TGpjd055d3hNek11TnpjNUxEQXNNVE0xTGpjeE5Td3dhRFUzTGpFME0yTXhMamt6TkN3d0xETXVOakE0TERBdU56QTNMRFV1TURJeExESXVNVEl4UXpFNU9TNHlPVE1zTXk0MU16UXNNakF3TERVdU1qQTRMREl3TUN3M0xqRTBNM29pTHo0OEwzTjJaejQ9KVxufVxuXG4ubWFwLWFzaWRlLWFjdGlvbi1jb2xsYXBzZSB7XG4gICAgYmFja2dyb3VuZC1pbWFnZTogdXJsKGRhdGE6aW1hZ2Uvc3ZnK3htbDtiYXNlNjQsUEhOMlp5QjRiV3h1Y3owaWFIUjBjRG92TDNkM2R5NTNNeTV2Y21jdk1qQXdNQzl6ZG1jaUlIWnBaWGRDYjNnOUlqQWdNQ0F4TnpFdU5ESTVJREUzTVM0ME1qa2lJR1pwYkd3OUlpTXpZVE14TXpNaVBqeHdZWFJvSUdROUlrMHhNakl1TkRNekxERXdOaTR4TXpoc0xURTJMakk1TlN3eE5pNHlPVFZqTFRBdU56UTBMREF1TnpRMExURXVOaXd4TGpFeE5pMHlMalUyTml3eExqRXhObU10TUM0NU5qZ3NNQzB4TGpneU15MHdMak0zTWkweUxqVTJOeTB4TGpFeE5td3RNVFV1TWprdE1UVXVNamtnYkMweE5TNHlPU3d4TlM0eU9XTXRNQzQzTkRRc01DNDNORFF0TVM0MkxERXVNVEUyTFRJdU5UWTNMREV1TVRFMmN5MHhMamd5TXkwd0xqTTNNaTB5TGpVMk55MHhMakV4Tm13dE1UWXVNamswTFRFMkxqSTVOV010TUM0M05EUXRNQzQzTkRRdE1TNHhNVFl0TVM0MkxURXVNVEUyTFRJdU5UWTJJR013TFRBdU9UWTRMREF1TXpjeUxURXVPREl6TERFdU1URTJMVEl1TlRZM2JERTFMakk1TFRFMUxqSTViQzB4TlM0eU9TMHhOUzR5T1dNdE1DNDNORFF0TUM0M05EUXRNUzR4TVRZdE1TNDJMVEV1TVRFMkxUSXVOVFkzY3pBdU16Y3lMVEV1T0RJekxERXVNVEUyTFRJdU5UWTNJRXcyTlM0eU9TdzBPQzQ1T1Raak1DNDNORFF0TUM0M05EUXNNUzQyTFRFdU1URTJMREl1TlRZM0xURXVNVEUyY3pFdU9ESXpMREF1TXpjeUxESXVOVFkzTERFdU1URTJiREUxTGpJNUxERTFMakk1YkRFMUxqSTVMVEUxTGpJNUlHTXdMamMwTkMwd0xqYzBOQ3d4TGpZdE1TNHhNVFlzTWk0MU5qY3RNUzR4TVRaak1DNDVOamNzTUN3eExqZ3lNaXd3TGpNM01pd3lMalUyTml3eExqRXhObXd4Tmk0eU9UVXNNVFl1TWprMFl6QXVOelEwTERBdU56UTBMREV1TVRFMkxERXVOaXd4TGpFeE5pd3lMalUyTnlCekxUQXVNemN5TERFdU9ESXpMVEV1TVRFMkxESXVOVFkzYkMweE5TNHlPU3d4TlM0eU9Xd3hOUzR5T1N3eE5TNHlPV013TGpjME5Dd3dMamMwTkN3eExqRXhOaXd4TGpZc01TNHhNVFlzTWk0MU5qY2dRekV5TXk0MU5Ea3NNVEEwTGpVek9Td3hNak11TVRjM0xERXdOUzR6T1RRc01USXlMalF6TXl3eE1EWXVNVE00ZWlCTk1UUTJMalF5T1N3NE5TNDNNVFJqTUMweE1TNHdNVEl0TWk0M01UY3RNakV1TVRZNExUZ3VNVFE0TFRNd0xqUTJPU0J6TFRFeUxqYzVOeTB4Tmk0Mk5qY3RNakl1TURrNExUSXlMakE1T0ZNNU5pNDNNallzTWpVc09EVXVOekUwTERJMWN5MHlNUzR4Tmpnc01pNDNNVFl0TXpBdU5EWTVMRGd1TVRRM1V6TTRMalUzT1N3ME5TNDVORFVzTXpNdU1UUTNMRFUxTGpJME5sTXlOU3czTkM0M01ETXNNalVzT0RVdU56RTBJSE15TGpjeE5pd3lNUzR4Tmpnc09DNHhORGNzTXpBdU5EWTVjekV5TGpjNU55d3hOaTQyTmpZc01qSXVNRGs0TERJeUxqQTVPSE14T1M0ME5UY3NPQzR4TkRnc016QXVORFk1TERndU1UUTRjekl4TGpFMk9DMHlMamN4Tnl3ek1DNDBOamt0T0M0eE5EZ2djekUyTGpZMk5pMHhNaTQzT1Rjc01qSXVNRGs0TFRJeUxqQTVPRk14TkRZdU5ESTVMRGsyTGpjeU5pd3hORFl1TkRJNUxEZzFMamN4TkhvZ1RURTNNUzQwTWprc09EVXVOekUwWXpBc01UVXVOVFV4TFRNdU9ETXlMREk1TGpnNU15MHhNUzQwT1RZc05ETXVNREkwSUdNdE55NDJOalFzTVRNdU1UTXpMVEU0TGpBMk1pd3lNeTQxTXkwek1TNHhPVFFzTXpFdU1UazBZeTB4TXk0eE16SXNOeTQyTmpRdE1qY3VORGMwTERFeExqUTVOaTAwTXk0d01qUXNNVEV1TkRrMmN5MHlPUzQ0T1RJdE15NDRNekl0TkRNdU1ESTBMVEV4TGpRNU5pQmpMVEV6TGpFek15MDNMalkyTkMweU15NDFNekV0TVRndU1EWXlMVE14TGpFNU5DMHpNUzR4T1RSRE15NDRNeklzTVRFMUxqWXdOeXd3TERFd01TNHlOalVzTUN3NE5TNDNNVFJUTXk0NE16SXNOVFV1T0RJeUxERXhMalE1Tml3ME1pNDJPU0JqTnk0Mk5qUXRNVE11TVRNekxERTRMakEyTWkweU15NDFNekVzTXpFdU1UazBMVE14TGpFNU5FTTFOUzQ0TWpJc015NDRNeklzTnpBdU1UWTBMREFzT0RVdU56RTBMREJ6TWprdU9Ea3pMRE11T0RNeUxEUXpMakF5TkN3eE1TNDBPVFlnWXpFekxqRXpNeXczTGpZMk5Dd3lNeTQxTXl3eE9DNHdOaklzTXpFdU1UazBMRE14TGpFNU5FTXhOamN1TlRrM0xEVTFMamd5TWl3eE56RXVOREk1TERjd0xqRTJOQ3d4TnpFdU5ESTVMRGcxTGpjeE5Ib2lMejQ4TDNOMlp6ND0pXG59XG4iLCIvKlxuICogYmFzZWQgb2ZmIG9mIGh0dHBzOi8vZ2l0aHViLmNvbS9naXR0ZXJIUS9zaWRlY2FyXG4gKiBsaWNlbnNlOiBNSVRcbiAqL1xuXG4jd2lraUZyYW1lIHtcbiAgICB3aWR0aDogMTAwJTtcbiAgICBoZWlnaHQ6IDEwMCU7XG4gICAgdG9wOjA7XG4gICAgYm90dG9tOiAwO1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xufVxuXG4ud2lraS1hc2lkZSB7XG4gICAgd2lkdGg6NTAwcHg7XG5cbiAgICB6LWluZGV4OiAyMDAwMDtcbiAgICBwb3NpdGlvbjogZml4ZWQ7XG4gICAgdG9wOiAwO1xuICAgIGJvdHRvbTogMDtcbiAgICByaWdodDogMDtcblxuICAgIGRpc3BsYXk6IC13ZWJraXQtZmxleDtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIC13ZWJraXQtZmxleC1kaXJlY3Rpb246IHJvdztcbiAgICBmbGV4LWRpcmVjdGlvbjogcm93O1xuXG4gICAgYmFja2dyb3VuZC1jb2xvcjogQGJvZHktYmc7XG4gICAgYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjZGRkO1xuICAgIGJveC1zaGFkb3c6IC0xMnB4IDAgMThweCAwIHJnYmEoNTAsIDUwLCA1MCwgMC4xKTtcblxuICAgIHRyYW5zaXRpb246IHRyYW5zZm9ybSAwLjNzIGN1YmljLWJlemllcigwLjE2LCAwLjIyLCAwLjIyLCAxLjcpO1xuXG4gICAgJi5pcy1jb2xsYXBzZWQ6bm90KC5pcy1sb2FkaW5nKSB7XG4gICAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlWCgxMTAlKTtcbiAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgxMTAlKTtcbiAgICB9XG5cbiAgICAvKiBBZGQgc29tZSBcImV4dGVuc2lvblwiIHNvIHRoYXQgdGhlcmUgaXNuJ3QgYSBnYXBcbiAgICAgKiB3aGVuIHdlIHRyYW5zbGF0ZSh2aWEgYW5pbWF0aW9uKSBtb3JlIHRoYW4gMTAwJSAqL1xuICAgICY6YWZ0ZXIge1xuICAgICAgY29udGVudDogJyc7XG5cbiAgICAgIHotaW5kZXg6IC0xO1xuICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgICAgdG9wOiAwO1xuICAgICAgbGVmdDogMTAwJTtcbiAgICAgIGJvdHRvbTogMDtcbiAgICAgIHJpZ2h0OiAtMTAwJTtcblxuICAgICAgYmFja2dyb3VuZC1jb2xvcjogQGJvZHktYmc7XG4gICAgfVxuXG4gICAgaWZyYW1lIHtcbiAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgaGVpZ2h0OiAxMDAlO1xuICAgICAgdG9wOjA7XG4gICAgICBib3R0b206MDtcbiAgICAgIHBvc2l0aW9uOmFic29sdXRlO1xuICAgICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICB9XG59XG5cbi53aWtpLWFzaWRlIC53aWtpLWhlYWRlciB7XG4gIGRpc3BsYXk6IG5vbmU7XG59XG5cbi53aWtpLWFzaWRlIC53aWtpLWNvbnRhaW5lciB7XG4gIHBhZGRpbmctdG9wOiAxMHB4O1xufVxuXG4ud2lraS1hc2lkZSAud2lraVNlbGVjdG9yIHtcbiAgdG9wOiA1MHB4O1xufVxuXG4ud2lraS1hc2lkZS1hY3Rpb24tYmFyIHtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgdG9wOiAwO1xuICAgIHJpZ2h0OiAxNXB4O1xuXG4gICAgZGlzcGxheTogLXdlYmtpdC1mbGV4O1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAganVzdGlmeS1jb250ZW50OiBmbGV4LWVuZDtcblxuICAgIHBhZGRpbmctYm90dG9tOiA1cHg7XG4gICAgcGFkZGluZy1yaWdodDowcHg7XG4gICAgcGFkZGluZy10b3A6NXB4O1xuICAgIHotaW5kZXg6IDEwMDtcbn1cblxuLndpa2ktZml4ZWQtaGVhZGVyIHtcbiAgcG9zaXRpb246IGZpeGVkO1xuICBiYWNrZ3JvdW5kOiB3aGl0ZTtcbiAgcGFkZGluZy10b3A6IDVweDtcbiAgd2lkdGg6IDEwMCU7XG4gIHotaW5kZXg6IDE7XG4gIGxlZnQ6IDA7XG4gIHRvcDogMDtcbiAgQG1lZGlhIChtYXgtd2lkdGg6IDcyMHB4KSB7XG4gICAgcGFkZGluZy10b3A6MzBweDtcbiAgfVxuICBwIHtcbiAgbWFyZ2luOiA1cHggMCAyMHB4O1xuICAgIEBtZWRpYSAobWF4LXdpZHRoOiA3MjBweCkge1xuICAgICAgbWFyZ2luLWJvdHRvbToxMHB4O1xuICAgIH1cbiAgfVxuICBociB7XG4gICAgbWFyZ2luOjMwcHggMDtcbiAgICBAbWVkaWEgKG1heC13aWR0aDogNzIwcHgpIHtcbiAgICAgIG1hcmdpbjoyNXB4IDA7XG4gICAgfVxuICB9XG4gfVxuXG4ud2lraS1idXR0b25zIHtcbiAgbWFyZ2luLXRvcDogLTEwcHg7XG4gICYgYnV0dG9uLFxuICAmIC5pbnB1dC1ncm91cHtcbiAgICB3aWR0aDozMDBweDtcbiAgfVxuICAuaW5wdXQtZ3JvdXB7XG4gICAgbWFyZ2luLXRvcDogMTVweDtcbiAgICBtYXJnaW4tbGVmdDogYXV0bztcbiAgICBtYXJnaW4tcmlnaHQ6IGF1dG87XG4gIH1cbn1cblxuI3dpa2ktZmlsdGVyIHtcbiAgICBiYWNrZ3JvdW5kOiNmZmY7XG4gICAgYm9yZGVyLWNvbG9yOiBkYXJrZ3JlZW47XG59XG5cbi53aWtpLWFzaWRlLWFjdGlvbi1pdGVtIHtcbiAgICBkaXNwbGF5OiAtd2Via2l0LWZsZXg7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICAvKiBtYWluIGF4aXMgKi9cbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgICAvKiBjcm9zcyBheGlzICovXG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcblxuICAgIHdpZHRoOiA0MHB4O1xuICAgIGhlaWdodDogNDBweDtcblxuICAgIHBhZGRpbmctbGVmdDogMDtcbiAgICBwYWRkaW5nLXJpZ2h0OiAwO1xuXG4gICAgb3BhY2l0eTogMC42NTtcbiAgICBiYWNrZ3JvdW5kOiBub25lO1xuICAgIGJhY2tncm91bmQtcG9zaXRpb246IGNlbnRlciBjZW50ZXI7XG4gICAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDtcbiAgICBiYWNrZ3JvdW5kLXNpemU6IDIycHggMjJweDtcbiAgICBib3JkZXI6IDA7XG4gICAgb3V0bGluZTogbm9uZTtcblxuICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICBjdXJzb3I6IGhhbmQ7XG5cbiAgICB0cmFuc2l0aW9uOiBhbGwgMC4ycyBlYXNlO1xuXG4gICAgJjpob3ZlcixcbiAgICAmOmZvY3VzIHtcbiAgICAgIG9wYWNpdHk6IDE7XG4gICAgfVxuXG4gICAgJjphY3RpdmUge1xuICAgICAgZmlsdGVyOiBodWUtcm90YXRlKDgwZGVnKSBzYXR1cmF0ZSgxNTApO1xuICAgIH1cbn1cblxuLndpa2ktYXNpZGUtYWN0aW9uLXBvcC1vdXQge1xuICAgIG1hcmdpbi1yaWdodDogLTRweDtcbiAgICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoZGF0YTppbWFnZS9zdmcreG1sO2Jhc2U2NCxQSE4yWnlCNGJXeHVjejBpYUhSMGNEb3ZMM2QzZHk1M015NXZjbWN2TWpBd01DOXpkbWNpSUhacFpYZENiM2c5SWpBZ01DQXlNREFnTVRjeExqUXlPU0lnWm1sc2JEMGlJek5oTXpFek15SStQSEJoZEdnZ1pEMGlUVEUxTnk0eE5ETXNNVEF6TGpVM01YWXpOUzQzTVRSak1DdzRMamcxTkMwekxqRTBOQ3d4Tmk0ME1qWXRPUzQwTXpFc01qSXVOekV6Y3kweE15NDROVGdzT1M0ME16RXRNakl1TnpFeUxEa3VORE14U0RNeUxqRTBNeUJqTFRndU9EVTBMREF0TVRZdU5ESTFMVE11TVRRMExUSXlMamN4TWkwNUxqUXpNVk13TERFME9DNHhOQ3d3TERFek9TNHlPRFZXTkRZdU5ESTVZekF0T0M0NE5UUXNNeTR4TkRRdE1UWXVOREkxTERrdU5ETXhMVEl5TGpjeE1pQmpOaTR5T0RjdE5pNHlPRGNzTVRNdU9EVTRMVGt1TkRNeExESXlMamN4TWkwNUxqUXpNV2czT0M0MU56SmpNUzR3TkRFc01Dd3hMamc1Tml3d0xqTXpOU3d5TGpVMk5pd3hMakF3TkdNd0xqWTNMREF1Tmpjc01TNHdNRFFzTVM0MU1qVXNNUzR3TURRc01pNDFOamRXTWpVZ1l6QXNNUzR3TkRJdE1DNHpNelFzTVM0NE9UY3RNUzR3TURRc01pNDFOamRqTFRBdU5qY3NNQzQyTnkweExqVXlOU3d4TGpBd05DMHlMalUyTml3eExqQXdORWd6TWk0eE5ETmpMVFF1T1RFeExEQXRPUzR4TVRVc01TNDNORGt0TVRJdU5qRXlMRFV1TWpRMklITXROUzR5TkRZc055NDNNREV0TlM0eU5EWXNNVEl1TmpFeWRqa3lMamcxTm1Nd0xEUXVPVEV4TERFdU56UTVMRGt1TVRFMUxEVXVNalEyTERFeUxqWXhNbk0zTGpjd01TdzFMakkwTlN3eE1pNDJNVElzTlM0eU5EVklNVEkxWXpRdU9URXNNQ3c1TGpFeE5TMHhMamMwT0N3eE1pNDJNVEV0TlM0eU5EVWdZek11TkRrM0xUTXVORGszTERVdU1qUTJMVGN1TnpBeExEVXVNalEyTFRFeUxqWXhNbll0TXpVdU56RTBZekF0TVM0d05ESXNNQzR6TXpRdE1TNDRPVGNzTVM0d01EUXRNaTQxTmpkak1DNDJOeTB3TGpZMk9Td3hMalV5TlMweExqQXdOQ3d5TGpVMk55MHhMakF3TkdnM0xqRTBNeUJqTVM0d05ESXNNQ3d4TGpnNU55d3dMak16TlN3eUxqVTJOeXd4TGpBd05FTXhOVFl1T0RBNUxERXdNUzQyTnpRc01UVTNMakUwTXl3eE1ESXVOVEk1TERFMU55NHhORE1zTVRBekxqVTNNWG9nVFRJd01DdzNMakUwTTNZMU55NHhORE1nWXpBc01TNDVNelV0TUM0M01EY3NNeTQyTURrdE1pNHhNakVzTlM0d01qSmpMVEV1TkRFekxERXVOREUwTFRNdU1EZzRMREl1TVRJeExUVXVNREl4TERJdU1USXhZeTB4TGprek5Td3dMVE11TmpBNUxUQXVOekEzTFRVdU1ESXlMVEl1TVRJeGJDMHhPUzQyTkRRdE1Ua3VOalF6SUd3dE56SXVOelkzTERjeUxqYzJPV010TUM0M05EUXNNQzQzTkRRdE1TNDJMREV1TVRFMUxUSXVOVFkzTERFdU1URTFjeTB4TGpneU15MHdMak0zTVMweUxqVTJOeTB4TGpFeE5VdzNOeTQxTmpjc01UQTVMamN4WXkwd0xqYzBOQzB3TGpjME5DMHhMakV4TmkweExqWXRNUzR4TVRZdE1pNDFOamNnWXpBdE1DNDVOamNzTUM0ek56SXRNUzQ0TWpJc01TNHhNVFl0TWk0MU5qWnNOekl1TnpZNExUY3lMamMyT0d3dE1Ua3VOalEwTFRFNUxqWTBNMk10TVM0ME1UTXRNUzQwTVRRdE1pNHhNaTB6TGpBNE9DMHlMakV5TFRVdU1ESXlZekF0TVM0NU16VXNNQzQzTURjdE15NDJNRGtzTWk0eE1pMDFMakF5TWlCRE1UTXlMakV3TlN3d0xqY3dOeXd4TXpNdU56YzVMREFzTVRNMUxqY3hOU3d3YURVM0xqRTBNMk14TGprek5Dd3dMRE11TmpBNExEQXVOekEzTERVdU1ESXhMREl1TVRJeFF6RTVPUzR5T1RNc015NDFNelFzTWpBd0xEVXVNakE0TERJd01DdzNMakUwTTNvaUx6NDhMM04yWno0PSlcbn1cblxuLndpa2ktYXNpZGUtYWN0aW9uLWNvbGxhcHNlIHtcbiAgICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoZGF0YTppbWFnZS9zdmcreG1sO2Jhc2U2NCxQSE4yWnlCNGJXeHVjejBpYUhSMGNEb3ZMM2QzZHk1M015NXZjbWN2TWpBd01DOXpkbWNpSUhacFpYZENiM2c5SWpBZ01DQXhOekV1TkRJNUlERTNNUzQwTWpraUlHWnBiR3c5SWlNellUTXhNek1pUGp4d1lYUm9JR1E5SWsweE1qSXVORE16TERFd05pNHhNemhzTFRFMkxqSTVOU3d4Tmk0eU9UVmpMVEF1TnpRMExEQXVOelEwTFRFdU5pd3hMakV4TmkweUxqVTJOaXd4TGpFeE5tTXRNQzQ1Tmpnc01DMHhMamd5TXkwd0xqTTNNaTB5TGpVMk55MHhMakV4Tm13dE1UVXVNamt0TVRVdU1qa2diQzB4TlM0eU9Td3hOUzR5T1dNdE1DNDNORFFzTUM0M05EUXRNUzQyTERFdU1URTJMVEl1TlRZM0xERXVNVEUyY3kweExqZ3lNeTB3TGpNM01pMHlMalUyTnkweExqRXhObXd0TVRZdU1qazBMVEUyTGpJNU5XTXRNQzQzTkRRdE1DNDNORFF0TVM0eE1UWXRNUzQyTFRFdU1URTJMVEl1TlRZMklHTXdMVEF1T1RZNExEQXVNemN5TFRFdU9ESXpMREV1TVRFMkxUSXVOVFkzYkRFMUxqSTVMVEUxTGpJNWJDMHhOUzR5T1MweE5TNHlPV010TUM0M05EUXRNQzQzTkRRdE1TNHhNVFl0TVM0MkxURXVNVEUyTFRJdU5UWTNjekF1TXpjeUxURXVPREl6TERFdU1URTJMVEl1TlRZM0lFdzJOUzR5T1N3ME9DNDVPVFpqTUM0M05EUXRNQzQzTkRRc01TNDJMVEV1TVRFMkxESXVOVFkzTFRFdU1URTJjekV1T0RJekxEQXVNemN5TERJdU5UWTNMREV1TVRFMmJERTFMakk1TERFMUxqSTViREUxTGpJNUxURTFMakk1SUdNd0xqYzBOQzB3TGpjME5Dd3hMall0TVM0eE1UWXNNaTQxTmpjdE1TNHhNVFpqTUM0NU5qY3NNQ3d4TGpneU1pd3dMak0zTWl3eUxqVTJOaXd4TGpFeE5td3hOaTR5T1RVc01UWXVNamswWXpBdU56UTBMREF1TnpRMExERXVNVEUyTERFdU5pd3hMakV4Tml3eUxqVTJOeUJ6TFRBdU16Y3lMREV1T0RJekxURXVNVEUyTERJdU5UWTNiQzB4TlM0eU9Td3hOUzR5T1d3eE5TNHlPU3d4TlM0eU9XTXdMamMwTkN3d0xqYzBOQ3d4TGpFeE5pd3hMallzTVM0eE1UWXNNaTQxTmpjZ1F6RXlNeTQxTkRrc01UQTBMalV6T1N3eE1qTXVNVGMzTERFd05TNHpPVFFzTVRJeUxqUXpNeXd4TURZdU1UTTRlaUJOTVRRMkxqUXlPU3c0TlM0M01UUmpNQzB4TVM0d01USXRNaTQzTVRjdE1qRXVNVFk0TFRndU1UUTRMVE13TGpRMk9TQnpMVEV5TGpjNU55MHhOaTQyTmpjdE1qSXVNRGs0TFRJeUxqQTVPRk01Tmk0M01qWXNNalVzT0RVdU56RTBMREkxY3kweU1TNHhOamdzTWk0M01UWXRNekF1TkRZNUxEZ3VNVFEzVXpNNExqVTNPU3cwTlM0NU5EVXNNek11TVRRM0xEVTFMakkwTmxNeU5TdzNOQzQzTURNc01qVXNPRFV1TnpFMElITXlMamN4Tml3eU1TNHhOamdzT0M0eE5EY3NNekF1TkRZNWN6RXlMamM1Tnl3eE5pNDJOallzTWpJdU1EazRMREl5TGpBNU9ITXhPUzQwTlRjc09DNHhORGdzTXpBdU5EWTVMRGd1TVRRNGN6SXhMakUyT0MweUxqY3hOeXd6TUM0ME5qa3RPQzR4TkRnZ2N6RTJMalkyTmkweE1pNDNPVGNzTWpJdU1EazRMVEl5TGpBNU9GTXhORFl1TkRJNUxEazJMamN5Tml3eE5EWXVOREk1TERnMUxqY3hOSG9nVFRFM01TNDBNamtzT0RVdU56RTBZekFzTVRVdU5UVXhMVE11T0RNeUxESTVMamc1TXkweE1TNDBPVFlzTkRNdU1ESTBJR010Tnk0Mk5qUXNNVE11TVRNekxURTRMakEyTWl3eU15NDFNeTB6TVM0eE9UUXNNekV1TVRrMFl5MHhNeTR4TXpJc055NDJOalF0TWpjdU5EYzBMREV4TGpRNU5pMDBNeTR3TWpRc01URXVORGsyY3kweU9TNDRPVEl0TXk0NE16SXRORE11TURJMExURXhMalE1TmlCakxURXpMakV6TXkwM0xqWTJOQzB5TXk0MU16RXRNVGd1TURZeUxUTXhMakU1TkMwek1TNHhPVFJETXk0NE16SXNNVEUxTGpZd055d3dMREV3TVM0eU5qVXNNQ3c0TlM0M01UUlRNeTQ0TXpJc05UVXVPREl5TERFeExqUTVOaXcwTWk0Mk9TQmpOeTQyTmpRdE1UTXVNVE16TERFNExqQTJNaTB5TXk0MU16RXNNekV1TVRrMExUTXhMakU1TkVNMU5TNDRNaklzTXk0NE16SXNOekF1TVRZMExEQXNPRFV1TnpFMExEQnpNamt1T0RrekxETXVPRE15TERRekxqQXlOQ3d4TVM0ME9UWWdZekV6TGpFek15dzNMalkyTkN3eU15NDFNeXd4T0M0d05qSXNNekV1TVRrMExETXhMakU1TkVNeE5qY3VOVGszTERVMUxqZ3lNaXd4TnpFdU5ESTVMRGN3TGpFMk5Dd3hOekV1TkRJNUxEZzFMamN4TkhvaUx6NDhMM04yWno0PSlcbn1cbiIsIi5naXRodWItbG9naW4ge1xuXHRwb3NpdGlvbjogcmVsYXRpdmU7XG5cdHdpZHRoOiAzMDBweDtcblx0bWFyZ2luLWxlZnQ6IGF1dG87XG5cdG1hcmdpbi1yaWdodDogYXV0bztcblx0LmZpcnN0IHtcblx0cG9zaXRpb246IHJlbGF0aXZlO1xuXHRoZWlnaHQ6MDtcblx0dG9wOi0zMHB4O1xuXHRyaWdodDotMTgwcHg7XG5cdGNvbG9yOnJlZFxuXHR9XG59Il0sImZpbGUiOiJtYWluLmNzcyIsInNvdXJjZVJvb3QiOiIvbGVzcyJ9 */\n"
  },
  {
    "path": "public/css/main-f928abf444.css",
    "content": "@charset \"UTF-8\";\nhtml {\n  font-family: sans-serif;\n  -ms-text-size-adjust: 100%;\n  -webkit-text-size-adjust: 100%;\n}\nbody {\n  margin: 0;\n}\narticle,\naside,\ndetails,\nfigcaption,\nfigure,\nfooter,\nheader,\nhgroup,\nmain,\nmenu,\nnav,\nsection,\nsummary {\n  display: block;\n}\naudio,\ncanvas,\nprogress,\nvideo {\n  display: inline-block;\n  vertical-align: baseline;\n}\naudio:not([controls]) {\n  display: none;\n  height: 0;\n}\n[hidden],\ntemplate {\n  display: none;\n}\na {\n  background-color: transparent;\n}\na:active,\na:hover {\n  outline: 0;\n}\nabbr[title] {\n  border-bottom: 1px dotted;\n}\nb,\nstrong {\n  font-weight: bold;\n}\ndfn {\n  font-style: italic;\n}\nh1 {\n  font-size: 2em;\n  margin: 0.67em 0;\n}\nmark {\n  background: #ff0;\n  color: #000;\n}\nsmall {\n  font-size: 80%;\n}\nsub,\nsup {\n  font-size: 75%;\n  line-height: 0;\n  position: relative;\n  vertical-align: baseline;\n}\nsup {\n  top: -0.5em;\n}\nsub {\n  bottom: -0.25em;\n}\nimg {\n  border: 0;\n}\nsvg:not(:root) {\n  overflow: hidden;\n}\nfigure {\n  margin: 1em 40px;\n}\nhr {\n  -moz-box-sizing: content-box;\n  box-sizing: content-box;\n  height: 0;\n}\npre {\n  overflow: auto;\n}\ncode,\nkbd,\npre,\nsamp {\n  font-family: monospace, monospace;\n  font-size: 1em;\n}\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n  color: inherit;\n  font: inherit;\n  margin: 0;\n}\nbutton {\n  overflow: visible;\n}\nbutton,\nselect {\n  text-transform: none;\n}\nbutton,\nhtml input[type=\"button\"],\ninput[type=\"reset\"],\ninput[type=\"submit\"] {\n  -webkit-appearance: button;\n  cursor: pointer;\n}\nbutton[disabled],\nhtml input[disabled] {\n  cursor: default;\n}\nbutton::-moz-focus-inner,\ninput::-moz-focus-inner {\n  border: 0;\n  padding: 0;\n}\ninput {\n  line-height: normal;\n}\ninput[type=\"checkbox\"],\ninput[type=\"radio\"] {\n  box-sizing: border-box;\n  padding: 0;\n}\ninput[type=\"number\"]::-webkit-inner-spin-button,\ninput[type=\"number\"]::-webkit-outer-spin-button {\n  height: auto;\n}\ninput[type=\"search\"] {\n  -webkit-appearance: textfield;\n  -moz-box-sizing: content-box;\n  -webkit-box-sizing: content-box;\n  box-sizing: content-box;\n}\ninput[type=\"search\"]::-webkit-search-cancel-button,\ninput[type=\"search\"]::-webkit-search-decoration {\n  -webkit-appearance: none;\n}\nfieldset {\n  border: 1px solid #c0c0c0;\n  margin: 0 2px;\n  padding: 0.35em 0.625em 0.75em;\n}\nlegend {\n  border: 0;\n  padding: 0;\n}\ntextarea {\n  overflow: auto;\n}\noptgroup {\n  font-weight: bold;\n}\ntable {\n  border-collapse: collapse;\n  border-spacing: 0;\n}\ntd,\nth {\n  padding: 0;\n}\n/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */\n@media print {\n  *,\n  *:before,\n  *:after {\n    background: transparent !important;\n    color: #000 !important;\n    box-shadow: none !important;\n    text-shadow: none !important;\n  }\n  a,\n  a:visited {\n    text-decoration: underline;\n  }\n  a[href]:after {\n    content: \" (\" attr(href) \")\";\n  }\n  abbr[title]:after {\n    content: \" (\" attr(title) \")\";\n  }\n  a[href^=\"#\"]:after,\n  a[href^=\"javascript:\"]:after {\n    content: \"\";\n  }\n  pre,\n  blockquote {\n    border: 1px solid #999;\n    page-break-inside: avoid;\n  }\n  thead {\n    display: table-header-group;\n  }\n  tr,\n  img {\n    page-break-inside: avoid;\n  }\n  img {\n    max-width: 100% !important;\n  }\n  p,\n  h2,\n  h3 {\n    orphans: 3;\n    widows: 3;\n  }\n  h2,\n  h3 {\n    page-break-after: avoid;\n  }\n  select {\n    background: #fff !important;\n  }\n  .navbar {\n    display: none;\n  }\n  .btn > .caret,\n  .dropup > .btn > .caret {\n    border-top-color: #000 !important;\n  }\n  .label {\n    border: 1px solid #000;\n  }\n  .table {\n    border-collapse: collapse !important;\n  }\n  .table td,\n  .table th {\n    background-color: #fff !important;\n  }\n  .table-bordered th,\n  .table-bordered td {\n    border: 1px solid #ddd !important;\n  }\n}\n@font-face {\n  font-family: 'Glyphicons Halflings';\n  src: url('../fonts/glyphicons-halflings-regular.eot');\n  src: url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'), url('../fonts/glyphicons-halflings-regular.woff') format('woff'), url('../fonts/glyphicons-halflings-regular.ttf') format('truetype'), url('../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular') format('svg');\n}\n.glyphicon {\n  position: relative;\n  top: 1px;\n  display: inline-block;\n  font-family: 'Glyphicons Halflings';\n  font-style: normal;\n  font-weight: normal;\n  line-height: 1;\n  -webkit-font-smoothing: antialiased;\n  -moz-osx-font-smoothing: grayscale;\n}\n.glyphicon-asterisk:before {\n  content: \"\\2a\";\n}\n.glyphicon-plus:before {\n  content: \"\\2b\";\n}\n.glyphicon-euro:before,\n.glyphicon-eur:before {\n  content: \"\\20ac\";\n}\n.glyphicon-minus:before {\n  content: \"\\2212\";\n}\n.glyphicon-cloud:before {\n  content: \"\\2601\";\n}\n.glyphicon-envelope:before {\n  content: \"\\2709\";\n}\n.glyphicon-pencil:before {\n  content: \"\\270f\";\n}\n.glyphicon-glass:before {\n  content: \"\\e001\";\n}\n.glyphicon-music:before {\n  content: \"\\e002\";\n}\n.glyphicon-search:before {\n  content: \"\\e003\";\n}\n.glyphicon-heart:before {\n  content: \"\\e005\";\n}\n.glyphicon-star:before {\n  content: \"\\e006\";\n}\n.glyphicon-star-empty:before {\n  content: \"\\e007\";\n}\n.glyphicon-user:before {\n  content: \"\\e008\";\n}\n.glyphicon-film:before {\n  content: \"\\e009\";\n}\n.glyphicon-th-large:before {\n  content: \"\\e010\";\n}\n.glyphicon-th:before {\n  content: \"\\e011\";\n}\n.glyphicon-th-list:before {\n  content: \"\\e012\";\n}\n.glyphicon-ok:before {\n  content: \"\\e013\";\n}\n.glyphicon-remove:before {\n  content: \"\\e014\";\n}\n.glyphicon-zoom-in:before {\n  content: \"\\e015\";\n}\n.glyphicon-zoom-out:before {\n  content: \"\\e016\";\n}\n.glyphicon-off:before {\n  content: \"\\e017\";\n}\n.glyphicon-signal:before {\n  content: \"\\e018\";\n}\n.glyphicon-cog:before {\n  content: \"\\e019\";\n}\n.glyphicon-trash:before {\n  content: \"\\e020\";\n}\n.glyphicon-home:before {\n  content: \"\\e021\";\n}\n.glyphicon-file:before {\n  content: \"\\e022\";\n}\n.glyphicon-time:before {\n  content: \"\\e023\";\n}\n.glyphicon-road:before {\n  content: \"\\e024\";\n}\n.glyphicon-download-alt:before {\n  content: \"\\e025\";\n}\n.glyphicon-download:before {\n  content: \"\\e026\";\n}\n.glyphicon-upload:before {\n  content: \"\\e027\";\n}\n.glyphicon-inbox:before {\n  content: \"\\e028\";\n}\n.glyphicon-play-circle:before {\n  content: \"\\e029\";\n}\n.glyphicon-repeat:before {\n  content: \"\\e030\";\n}\n.glyphicon-refresh:before {\n  content: \"\\e031\";\n}\n.glyphicon-list-alt:before {\n  content: \"\\e032\";\n}\n.glyphicon-lock:before {\n  content: \"\\e033\";\n}\n.glyphicon-flag:before {\n  content: \"\\e034\";\n}\n.glyphicon-headphones:before {\n  content: \"\\e035\";\n}\n.glyphicon-volume-off:before {\n  content: \"\\e036\";\n}\n.glyphicon-volume-down:before {\n  content: \"\\e037\";\n}\n.glyphicon-volume-up:before {\n  content: \"\\e038\";\n}\n.glyphicon-qrcode:before {\n  content: \"\\e039\";\n}\n.glyphicon-barcode:before {\n  content: \"\\e040\";\n}\n.glyphicon-tag:before {\n  content: \"\\e041\";\n}\n.glyphicon-tags:before {\n  content: \"\\e042\";\n}\n.glyphicon-book:before {\n  content: \"\\e043\";\n}\n.glyphicon-bookmark:before {\n  content: \"\\e044\";\n}\n.glyphicon-print:before {\n  content: \"\\e045\";\n}\n.glyphicon-camera:before {\n  content: \"\\e046\";\n}\n.glyphicon-font:before {\n  content: \"\\e047\";\n}\n.glyphicon-bold:before {\n  content: \"\\e048\";\n}\n.glyphicon-italic:before {\n  content: \"\\e049\";\n}\n.glyphicon-text-height:before {\n  content: \"\\e050\";\n}\n.glyphicon-text-width:before {\n  content: \"\\e051\";\n}\n.glyphicon-align-left:before {\n  content: \"\\e052\";\n}\n.glyphicon-align-center:before {\n  content: \"\\e053\";\n}\n.glyphicon-align-right:before {\n  content: \"\\e054\";\n}\n.glyphicon-align-justify:before {\n  content: \"\\e055\";\n}\n.glyphicon-list:before {\n  content: \"\\e056\";\n}\n.glyphicon-indent-left:before {\n  content: \"\\e057\";\n}\n.glyphicon-indent-right:before {\n  content: \"\\e058\";\n}\n.glyphicon-facetime-video:before {\n  content: \"\\e059\";\n}\n.glyphicon-picture:before {\n  content: \"\\e060\";\n}\n.glyphicon-map-marker:before {\n  content: \"\\e062\";\n}\n.glyphicon-adjust:before {\n  content: \"\\e063\";\n}\n.glyphicon-tint:before {\n  content: \"\\e064\";\n}\n.glyphicon-edit:before {\n  content: \"\\e065\";\n}\n.glyphicon-share:before {\n  content: \"\\e066\";\n}\n.glyphicon-check:before {\n  content: \"\\e067\";\n}\n.glyphicon-move:before {\n  content: \"\\e068\";\n}\n.glyphicon-step-backward:before {\n  content: \"\\e069\";\n}\n.glyphicon-fast-backward:before {\n  content: \"\\e070\";\n}\n.glyphicon-backward:before {\n  content: \"\\e071\";\n}\n.glyphicon-play:before {\n  content: \"\\e072\";\n}\n.glyphicon-pause:before {\n  content: \"\\e073\";\n}\n.glyphicon-stop:before {\n  content: \"\\e074\";\n}\n.glyphicon-forward:before {\n  content: \"\\e075\";\n}\n.glyphicon-fast-forward:before {\n  content: \"\\e076\";\n}\n.glyphicon-step-forward:before {\n  content: \"\\e077\";\n}\n.glyphicon-eject:before {\n  content: \"\\e078\";\n}\n.glyphicon-chevron-left:before {\n  content: \"\\e079\";\n}\n.glyphicon-chevron-right:before {\n  content: \"\\e080\";\n}\n.glyphicon-plus-sign:before {\n  content: \"\\e081\";\n}\n.glyphicon-minus-sign:before {\n  content: \"\\e082\";\n}\n.glyphicon-remove-sign:before {\n  content: \"\\e083\";\n}\n.glyphicon-ok-sign:before {\n  content: \"\\e084\";\n}\n.glyphicon-question-sign:before {\n  content: \"\\e085\";\n}\n.glyphicon-info-sign:before {\n  content: \"\\e086\";\n}\n.glyphicon-screenshot:before {\n  content: \"\\e087\";\n}\n.glyphicon-remove-circle:before {\n  content: \"\\e088\";\n}\n.glyphicon-ok-circle:before {\n  content: \"\\e089\";\n}\n.glyphicon-ban-circle:before {\n  content: \"\\e090\";\n}\n.glyphicon-arrow-left:before {\n  content: \"\\e091\";\n}\n.glyphicon-arrow-right:before {\n  content: \"\\e092\";\n}\n.glyphicon-arrow-up:before {\n  content: \"\\e093\";\n}\n.glyphicon-arrow-down:before {\n  content: \"\\e094\";\n}\n.glyphicon-share-alt:before {\n  content: \"\\e095\";\n}\n.glyphicon-resize-full:before {\n  content: \"\\e096\";\n}\n.glyphicon-resize-small:before {\n  content: \"\\e097\";\n}\n.glyphicon-exclamation-sign:before {\n  content: \"\\e101\";\n}\n.glyphicon-gift:before {\n  content: \"\\e102\";\n}\n.glyphicon-leaf:before {\n  content: \"\\e103\";\n}\n.glyphicon-fire:before {\n  content: \"\\e104\";\n}\n.glyphicon-eye-open:before {\n  content: \"\\e105\";\n}\n.glyphicon-eye-close:before {\n  content: \"\\e106\";\n}\n.glyphicon-warning-sign:before {\n  content: \"\\e107\";\n}\n.glyphicon-plane:before {\n  content: \"\\e108\";\n}\n.glyphicon-calendar:before {\n  content: \"\\e109\";\n}\n.glyphicon-random:before {\n  content: \"\\e110\";\n}\n.glyphicon-comment:before {\n  content: \"\\e111\";\n}\n.glyphicon-magnet:before {\n  content: \"\\e112\";\n}\n.glyphicon-chevron-up:before {\n  content: \"\\e113\";\n}\n.glyphicon-chevron-down:before {\n  content: \"\\e114\";\n}\n.glyphicon-retweet:before {\n  content: \"\\e115\";\n}\n.glyphicon-shopping-cart:before {\n  content: \"\\e116\";\n}\n.glyphicon-folder-close:before {\n  content: \"\\e117\";\n}\n.glyphicon-folder-open:before {\n  content: \"\\e118\";\n}\n.glyphicon-resize-vertical:before {\n  content: \"\\e119\";\n}\n.glyphicon-resize-horizontal:before {\n  content: \"\\e120\";\n}\n.glyphicon-hdd:before {\n  content: \"\\e121\";\n}\n.glyphicon-bullhorn:before {\n  content: \"\\e122\";\n}\n.glyphicon-bell:before {\n  content: \"\\e123\";\n}\n.glyphicon-certificate:before {\n  content: \"\\e124\";\n}\n.glyphicon-thumbs-up:before {\n  content: \"\\e125\";\n}\n.glyphicon-thumbs-down:before {\n  content: \"\\e126\";\n}\n.glyphicon-hand-right:before {\n  content: \"\\e127\";\n}\n.glyphicon-hand-left:before {\n  content: \"\\e128\";\n}\n.glyphicon-hand-up:before {\n  content: \"\\e129\";\n}\n.glyphicon-hand-down:before {\n  content: \"\\e130\";\n}\n.glyphicon-circle-arrow-right:before {\n  content: \"\\e131\";\n}\n.glyphicon-circle-arrow-left:before {\n  content: \"\\e132\";\n}\n.glyphicon-circle-arrow-up:before {\n  content: \"\\e133\";\n}\n.glyphicon-circle-arrow-down:before {\n  content: \"\\e134\";\n}\n.glyphicon-globe:before {\n  content: \"\\e135\";\n}\n.glyphicon-wrench:before {\n  content: \"\\e136\";\n}\n.glyphicon-tasks:before {\n  content: \"\\e137\";\n}\n.glyphicon-filter:before {\n  content: \"\\e138\";\n}\n.glyphicon-briefcase:before {\n  content: \"\\e139\";\n}\n.glyphicon-fullscreen:before {\n  content: \"\\e140\";\n}\n.glyphicon-dashboard:before {\n  content: \"\\e141\";\n}\n.glyphicon-paperclip:before {\n  content: \"\\e142\";\n}\n.glyphicon-heart-empty:before {\n  content: \"\\e143\";\n}\n.glyphicon-link:before {\n  content: \"\\e144\";\n}\n.glyphicon-phone:before {\n  content: \"\\e145\";\n}\n.glyphicon-pushpin:before {\n  content: \"\\e146\";\n}\n.glyphicon-usd:before {\n  content: \"\\e148\";\n}\n.glyphicon-gbp:before {\n  content: \"\\e149\";\n}\n.glyphicon-sort:before {\n  content: \"\\e150\";\n}\n.glyphicon-sort-by-alphabet:before {\n  content: \"\\e151\";\n}\n.glyphicon-sort-by-alphabet-alt:before {\n  content: \"\\e152\";\n}\n.glyphicon-sort-by-order:before {\n  content: \"\\e153\";\n}\n.glyphicon-sort-by-order-alt:before {\n  content: \"\\e154\";\n}\n.glyphicon-sort-by-attributes:before {\n  content: \"\\e155\";\n}\n.glyphicon-sort-by-attributes-alt:before {\n  content: \"\\e156\";\n}\n.glyphicon-unchecked:before {\n  content: \"\\e157\";\n}\n.glyphicon-expand:before {\n  content: \"\\e158\";\n}\n.glyphicon-collapse-down:before {\n  content: \"\\e159\";\n}\n.glyphicon-collapse-up:before {\n  content: \"\\e160\";\n}\n.glyphicon-log-in:before {\n  content: \"\\e161\";\n}\n.glyphicon-flash:before {\n  content: \"\\e162\";\n}\n.glyphicon-log-out:before {\n  content: \"\\e163\";\n}\n.glyphicon-new-window:before {\n  content: \"\\e164\";\n}\n.glyphicon-record:before {\n  content: \"\\e165\";\n}\n.glyphicon-save:before {\n  content: \"\\e166\";\n}\n.glyphicon-open:before {\n  content: \"\\e167\";\n}\n.glyphicon-saved:before {\n  content: \"\\e168\";\n}\n.glyphicon-import:before {\n  content: \"\\e169\";\n}\n.glyphicon-export:before {\n  content: \"\\e170\";\n}\n.glyphicon-send:before {\n  content: \"\\e171\";\n}\n.glyphicon-floppy-disk:before {\n  content: \"\\e172\";\n}\n.glyphicon-floppy-saved:before {\n  content: \"\\e173\";\n}\n.glyphicon-floppy-remove:before {\n  content: \"\\e174\";\n}\n.glyphicon-floppy-save:before {\n  content: \"\\e175\";\n}\n.glyphicon-floppy-open:before {\n  content: \"\\e176\";\n}\n.glyphicon-credit-card:before {\n  content: \"\\e177\";\n}\n.glyphicon-transfer:before {\n  content: \"\\e178\";\n}\n.glyphicon-cutlery:before {\n  content: \"\\e179\";\n}\n.glyphicon-header:before {\n  content: \"\\e180\";\n}\n.glyphicon-compressed:before {\n  content: \"\\e181\";\n}\n.glyphicon-earphone:before {\n  content: \"\\e182\";\n}\n.glyphicon-phone-alt:before {\n  content: \"\\e183\";\n}\n.glyphicon-tower:before {\n  content: \"\\e184\";\n}\n.glyphicon-stats:before {\n  content: \"\\e185\";\n}\n.glyphicon-sd-video:before {\n  content: \"\\e186\";\n}\n.glyphicon-hd-video:before {\n  content: \"\\e187\";\n}\n.glyphicon-subtitles:before {\n  content: \"\\e188\";\n}\n.glyphicon-sound-stereo:before {\n  content: \"\\e189\";\n}\n.glyphicon-sound-dolby:before {\n  content: \"\\e190\";\n}\n.glyphicon-sound-5-1:before {\n  content: \"\\e191\";\n}\n.glyphicon-sound-6-1:before {\n  content: \"\\e192\";\n}\n.glyphicon-sound-7-1:before {\n  content: \"\\e193\";\n}\n.glyphicon-copyright-mark:before {\n  content: \"\\e194\";\n}\n.glyphicon-registration-mark:before {\n  content: \"\\e195\";\n}\n.glyphicon-cloud-download:before {\n  content: \"\\e197\";\n}\n.glyphicon-cloud-upload:before {\n  content: \"\\e198\";\n}\n.glyphicon-tree-conifer:before {\n  content: \"\\e199\";\n}\n.glyphicon-tree-deciduous:before {\n  content: \"\\e200\";\n}\n* {\n  -webkit-box-sizing: border-box;\n  -moz-box-sizing: border-box;\n  box-sizing: border-box;\n}\n*:before,\n*:after {\n  -webkit-box-sizing: border-box;\n  -moz-box-sizing: border-box;\n  box-sizing: border-box;\n}\nhtml {\n  font-size: 10px;\n  -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n}\nbody {\n  font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n  font-size: 14px;\n  line-height: 1.42857143;\n  color: #333333;\n  background-color: #ffffff;\n}\ninput,\nbutton,\nselect,\ntextarea {\n  font-family: inherit;\n  font-size: inherit;\n  line-height: inherit;\n}\na {\n  color: #4CAF50;\n  text-decoration: none;\n}\na:hover,\na:focus {\n  color: #357a38;\n  text-decoration: underline;\n}\na:focus {\n  outline: thin dotted;\n  outline: 5px auto -webkit-focus-ring-color;\n  outline-offset: -2px;\n}\nfigure {\n  margin: 0;\n}\nimg {\n  vertical-align: middle;\n}\n.img-responsive,\n.thumbnail > img,\n.thumbnail a > img,\n.carousel-inner > .item > img,\n.carousel-inner > .item > a > img {\n  display: block;\n  max-width: 100%;\n  height: auto;\n}\n.img-rounded {\n  border-radius: 6px;\n}\n.img-thumbnail {\n  padding: 4px;\n  line-height: 1.42857143;\n  background-color: #ffffff;\n  border: 1px solid #ddd;\n  border-radius: 4px;\n  -webkit-transition: all 0.2s ease-in-out;\n  -o-transition: all 0.2s ease-in-out;\n  transition: all 0.2s ease-in-out;\n  display: inline-block;\n  max-width: 100%;\n  height: auto;\n}\n.img-circle {\n  border-radius: 50%;\n}\nhr {\n  margin-top: 20px;\n  margin-bottom: 20px;\n  border: 0;\n  border-top: 1px solid #eeeeee;\n}\n.sr-only {\n  position: absolute;\n  width: 1px;\n  height: 1px;\n  margin: -1px;\n  padding: 0;\n  overflow: hidden;\n  clip: rect(0, 0, 0, 0);\n  border: 0;\n}\n.sr-only-focusable:active,\n.sr-only-focusable:focus {\n  position: static;\n  width: auto;\n  height: auto;\n  margin: 0;\n  overflow: visible;\n  clip: auto;\n}\nh1,\nh2,\nh3,\nh4,\nh5,\nh6,\n.h1,\n.h2,\n.h3,\n.h4,\n.h5,\n.h6 {\n  font-family: inherit;\n  font-weight: 500;\n  line-height: 1.1;\n  color: inherit;\n}\nh1 small,\nh2 small,\nh3 small,\nh4 small,\nh5 small,\nh6 small,\n.h1 small,\n.h2 small,\n.h3 small,\n.h4 small,\n.h5 small,\n.h6 small,\nh1 .small,\nh2 .small,\nh3 .small,\nh4 .small,\nh5 .small,\nh6 .small,\n.h1 .small,\n.h2 .small,\n.h3 .small,\n.h4 .small,\n.h5 .small,\n.h6 .small {\n  font-weight: normal;\n  line-height: 1;\n  color: #777777;\n}\nh1,\n.h1,\nh2,\n.h2,\nh3,\n.h3 {\n  margin-top: 20px;\n  margin-bottom: 10px;\n}\nh1 small,\n.h1 small,\nh2 small,\n.h2 small,\nh3 small,\n.h3 small,\nh1 .small,\n.h1 .small,\nh2 .small,\n.h2 .small,\nh3 .small,\n.h3 .small {\n  font-size: 65%;\n}\nh4,\n.h4,\nh5,\n.h5,\nh6,\n.h6 {\n  margin-top: 10px;\n  margin-bottom: 10px;\n}\nh4 small,\n.h4 small,\nh5 small,\n.h5 small,\nh6 small,\n.h6 small,\nh4 .small,\n.h4 .small,\nh5 .small,\n.h5 .small,\nh6 .small,\n.h6 .small {\n  font-size: 75%;\n}\nh1,\n.h1 {\n  font-size: 36px;\n}\nh2,\n.h2 {\n  font-size: 30px;\n}\nh3,\n.h3 {\n  font-size: 24px;\n}\nh4,\n.h4 {\n  font-size: 18px;\n}\nh5,\n.h5 {\n  font-size: 14px;\n}\nh6,\n.h6 {\n  font-size: 12px;\n}\np {\n  margin: 0 0 10px;\n}\n.lead {\n  margin-bottom: 20px;\n  font-size: 16px;\n  font-weight: 300;\n  line-height: 1.4;\n}\n@media (min-width: 768px) {\n  .lead {\n    font-size: 21px;\n  }\n}\nsmall,\n.small {\n  font-size: 85%;\n}\nmark,\n.mark {\n  background-color: #fcf8e3;\n  padding: .2em;\n}\n.text-left {\n  text-align: left;\n}\n.text-right {\n  text-align: right;\n}\n.text-center {\n  text-align: center;\n}\n.text-justify {\n  text-align: justify;\n}\n.text-nowrap {\n  white-space: nowrap;\n}\n.text-lowercase {\n  text-transform: lowercase;\n}\n.text-uppercase {\n  text-transform: uppercase;\n}\n.text-capitalize {\n  text-transform: capitalize;\n}\n.text-muted {\n  color: #777777;\n}\n.text-primary {\n  color: #4CAF50;\n}\na.text-primary:hover {\n  color: #3d8b40;\n}\n.text-success {\n  color: #215f1e;\n}\na.text-success:hover {\n  color: #143812;\n}\n.text-info {\n  color: #31708f;\n}\na.text-info:hover {\n  color: #245269;\n}\n.text-warning {\n  color: #8a6d3b;\n}\na.text-warning:hover {\n  color: #66512c;\n}\n.text-danger {\n  color: #a94442;\n}\na.text-danger:hover {\n  color: #843534;\n}\n.bg-primary {\n  color: #fff;\n  background-color: #4CAF50;\n}\na.bg-primary:hover {\n  background-color: #3d8b40;\n}\n.bg-success {\n  background-color: #dff0d8;\n}\na.bg-success:hover {\n  background-color: #c1e2b3;\n}\n.bg-info {\n  background-color: #d9edf7;\n}\na.bg-info:hover {\n  background-color: #afd9ee;\n}\n.bg-warning {\n  background-color: #fcf8e3;\n}\na.bg-warning:hover {\n  background-color: #f7ecb5;\n}\n.bg-danger {\n  background-color: #f2dede;\n}\na.bg-danger:hover {\n  background-color: #e4b9b9;\n}\n.page-header {\n  padding-bottom: 9px;\n  margin: 40px 0 20px;\n  border-bottom: 1px solid #eeeeee;\n}\nul,\nol {\n  margin-top: 0;\n  margin-bottom: 10px;\n}\nul ul,\nol ul,\nul ol,\nol ol {\n  margin-bottom: 0;\n}\n.list-unstyled {\n  padding-left: 0;\n  list-style: none;\n}\n.list-inline {\n  padding-left: 0;\n  list-style: none;\n  margin-left: -5px;\n}\n.list-inline > li {\n  display: inline-block;\n  padding-left: 5px;\n  padding-right: 5px;\n}\ndl {\n  margin-top: 0;\n  margin-bottom: 20px;\n}\ndt,\ndd {\n  line-height: 1.42857143;\n}\ndt {\n  font-weight: bold;\n}\ndd {\n  margin-left: 0;\n}\n@media (min-width: 768px) {\n  .dl-horizontal dt {\n    float: left;\n    width: 160px;\n    clear: left;\n    text-align: right;\n    overflow: hidden;\n    text-overflow: ellipsis;\n    white-space: nowrap;\n  }\n  .dl-horizontal dd {\n    margin-left: 180px;\n  }\n}\nabbr[title],\nabbr[data-original-title] {\n  cursor: help;\n  border-bottom: 1px dotted #777777;\n}\n.initialism {\n  font-size: 90%;\n  text-transform: uppercase;\n}\nblockquote {\n  padding: 10px 20px;\n  margin: 0 0 20px;\n  font-size: 17.5px;\n  border-left: 5px solid #eeeeee;\n}\nblockquote p:last-child,\nblockquote ul:last-child,\nblockquote ol:last-child {\n  margin-bottom: 0;\n}\nblockquote footer,\nblockquote small,\nblockquote .small {\n  display: block;\n  font-size: 80%;\n  line-height: 1.42857143;\n  color: #777777;\n}\nblockquote footer:before,\nblockquote small:before,\nblockquote .small:before {\n  content: '\\2014 \\00A0';\n}\n.blockquote-reverse,\nblockquote.pull-right {\n  padding-right: 15px;\n  padding-left: 0;\n  border-right: 5px solid #eeeeee;\n  border-left: 0;\n  text-align: right;\n}\n.blockquote-reverse footer:before,\nblockquote.pull-right footer:before,\n.blockquote-reverse small:before,\nblockquote.pull-right small:before,\n.blockquote-reverse .small:before,\nblockquote.pull-right .small:before {\n  content: '';\n}\n.blockquote-reverse footer:after,\nblockquote.pull-right footer:after,\n.blockquote-reverse small:after,\nblockquote.pull-right small:after,\n.blockquote-reverse .small:after,\nblockquote.pull-right .small:after {\n  content: '\\00A0 \\2014';\n}\naddress {\n  margin-bottom: 20px;\n  font-style: normal;\n  line-height: 1.42857143;\n}\ncode,\nkbd,\npre,\nsamp {\n  font-family: Menlo, Monaco, Consolas, \"Courier New\", monospace;\n}\ncode {\n  padding: 2px 4px;\n  font-size: 90%;\n  color: #c7254e;\n  background-color: #f9f2f4;\n  border-radius: 4px;\n}\nkbd {\n  padding: 2px 4px;\n  font-size: 90%;\n  color: #eeeeee;\n  background-color: #333;\n  border-radius: 3px;\n  box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.25);\n}\nkbd kbd {\n  padding: 0;\n  font-size: 100%;\n  font-weight: bold;\n  box-shadow: none;\n}\npre {\n  display: block;\n  padding: 9.5px;\n  margin: 0 0 10px;\n  font-size: 13px;\n  line-height: 1.42857143;\n  word-break: break-all;\n  word-wrap: break-word;\n  color: #333333;\n  background-color: #f5f5f5;\n  border: 1px solid #ccc;\n  border-radius: 4px;\n}\npre code {\n  padding: 0;\n  font-size: inherit;\n  color: inherit;\n  white-space: pre-wrap;\n  background-color: transparent;\n  border-radius: 0;\n}\n.pre-scrollable {\n  max-height: 340px;\n  overflow-y: scroll;\n}\n.container {\n  margin-right: auto;\n  margin-left: auto;\n  padding-left: 15px;\n  padding-right: 15px;\n}\n@media (min-width: 768px) {\n  .container {\n    width: 750px;\n  }\n}\n@media (min-width: 1031px) {\n  .container {\n    width: 970px;\n  }\n}\n@media (min-width: 1200px) {\n  .container {\n    width: 1170px;\n  }\n}\n.container-fluid {\n  margin-right: auto;\n  margin-left: auto;\n  padding-left: 15px;\n  padding-right: 15px;\n}\n.row {\n  margin-left: -15px;\n  margin-right: -15px;\n}\n.col-xs-1, .col-sm-1, .col-md-1, .col-lg-1, .col-xs-2, .col-sm-2, .col-md-2, .col-lg-2, .col-xs-3, .col-sm-3, .col-md-3, .col-lg-3, .col-xs-4, .col-sm-4, .col-md-4, .col-lg-4, .col-xs-5, .col-sm-5, .col-md-5, .col-lg-5, .col-xs-6, .col-sm-6, .col-md-6, .col-lg-6, .col-xs-7, .col-sm-7, .col-md-7, .col-lg-7, .col-xs-8, .col-sm-8, .col-md-8, .col-lg-8, .col-xs-9, .col-sm-9, .col-md-9, .col-lg-9, .col-xs-10, .col-sm-10, .col-md-10, .col-lg-10, .col-xs-11, .col-sm-11, .col-md-11, .col-lg-11, .col-xs-12, .col-sm-12, .col-md-12, .col-lg-12 {\n  position: relative;\n  min-height: 1px;\n  padding-left: 15px;\n  padding-right: 15px;\n}\n.col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12 {\n  float: left;\n}\n.col-xs-12 {\n  width: 100%;\n}\n.col-xs-11 {\n  width: 91.66666667%;\n}\n.col-xs-10 {\n  width: 83.33333333%;\n}\n.col-xs-9 {\n  width: 75%;\n}\n.col-xs-8 {\n  width: 66.66666667%;\n}\n.col-xs-7 {\n  width: 58.33333333%;\n}\n.col-xs-6 {\n  width: 50%;\n}\n.col-xs-5 {\n  width: 41.66666667%;\n}\n.col-xs-4 {\n  width: 33.33333333%;\n}\n.col-xs-3 {\n  width: 25%;\n}\n.col-xs-2 {\n  width: 16.66666667%;\n}\n.col-xs-1 {\n  width: 8.33333333%;\n}\n.col-xs-pull-12 {\n  right: 100%;\n}\n.col-xs-pull-11 {\n  right: 91.66666667%;\n}\n.col-xs-pull-10 {\n  right: 83.33333333%;\n}\n.col-xs-pull-9 {\n  right: 75%;\n}\n.col-xs-pull-8 {\n  right: 66.66666667%;\n}\n.col-xs-pull-7 {\n  right: 58.33333333%;\n}\n.col-xs-pull-6 {\n  right: 50%;\n}\n.col-xs-pull-5 {\n  right: 41.66666667%;\n}\n.col-xs-pull-4 {\n  right: 33.33333333%;\n}\n.col-xs-pull-3 {\n  right: 25%;\n}\n.col-xs-pull-2 {\n  right: 16.66666667%;\n}\n.col-xs-pull-1 {\n  right: 8.33333333%;\n}\n.col-xs-pull-0 {\n  right: auto;\n}\n.col-xs-push-12 {\n  left: 100%;\n}\n.col-xs-push-11 {\n  left: 91.66666667%;\n}\n.col-xs-push-10 {\n  left: 83.33333333%;\n}\n.col-xs-push-9 {\n  left: 75%;\n}\n.col-xs-push-8 {\n  left: 66.66666667%;\n}\n.col-xs-push-7 {\n  left: 58.33333333%;\n}\n.col-xs-push-6 {\n  left: 50%;\n}\n.col-xs-push-5 {\n  left: 41.66666667%;\n}\n.col-xs-push-4 {\n  left: 33.33333333%;\n}\n.col-xs-push-3 {\n  left: 25%;\n}\n.col-xs-push-2 {\n  left: 16.66666667%;\n}\n.col-xs-push-1 {\n  left: 8.33333333%;\n}\n.col-xs-push-0 {\n  left: auto;\n}\n.col-xs-offset-12 {\n  margin-left: 100%;\n}\n.col-xs-offset-11 {\n  margin-left: 91.66666667%;\n}\n.col-xs-offset-10 {\n  margin-left: 83.33333333%;\n}\n.col-xs-offset-9 {\n  margin-left: 75%;\n}\n.col-xs-offset-8 {\n  margin-left: 66.66666667%;\n}\n.col-xs-offset-7 {\n  margin-left: 58.33333333%;\n}\n.col-xs-offset-6 {\n  margin-left: 50%;\n}\n.col-xs-offset-5 {\n  margin-left: 41.66666667%;\n}\n.col-xs-offset-4 {\n  margin-left: 33.33333333%;\n}\n.col-xs-offset-3 {\n  margin-left: 25%;\n}\n.col-xs-offset-2 {\n  margin-left: 16.66666667%;\n}\n.col-xs-offset-1 {\n  margin-left: 8.33333333%;\n}\n.col-xs-offset-0 {\n  margin-left: 0%;\n}\n@media (min-width: 768px) {\n  .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12 {\n    float: left;\n  }\n  .col-sm-12 {\n    width: 100%;\n  }\n  .col-sm-11 {\n    width: 91.66666667%;\n  }\n  .col-sm-10 {\n    width: 83.33333333%;\n  }\n  .col-sm-9 {\n    width: 75%;\n  }\n  .col-sm-8 {\n    width: 66.66666667%;\n  }\n  .col-sm-7 {\n    width: 58.33333333%;\n  }\n  .col-sm-6 {\n    width: 50%;\n  }\n  .col-sm-5 {\n    width: 41.66666667%;\n  }\n  .col-sm-4 {\n    width: 33.33333333%;\n  }\n  .col-sm-3 {\n    width: 25%;\n  }\n  .col-sm-2 {\n    width: 16.66666667%;\n  }\n  .col-sm-1 {\n    width: 8.33333333%;\n  }\n  .col-sm-pull-12 {\n    right: 100%;\n  }\n  .col-sm-pull-11 {\n    right: 91.66666667%;\n  }\n  .col-sm-pull-10 {\n    right: 83.33333333%;\n  }\n  .col-sm-pull-9 {\n    right: 75%;\n  }\n  .col-sm-pull-8 {\n    right: 66.66666667%;\n  }\n  .col-sm-pull-7 {\n    right: 58.33333333%;\n  }\n  .col-sm-pull-6 {\n    right: 50%;\n  }\n  .col-sm-pull-5 {\n    right: 41.66666667%;\n  }\n  .col-sm-pull-4 {\n    right: 33.33333333%;\n  }\n  .col-sm-pull-3 {\n    right: 25%;\n  }\n  .col-sm-pull-2 {\n    right: 16.66666667%;\n  }\n  .col-sm-pull-1 {\n    right: 8.33333333%;\n  }\n  .col-sm-pull-0 {\n    right: auto;\n  }\n  .col-sm-push-12 {\n    left: 100%;\n  }\n  .col-sm-push-11 {\n    left: 91.66666667%;\n  }\n  .col-sm-push-10 {\n    left: 83.33333333%;\n  }\n  .col-sm-push-9 {\n    left: 75%;\n  }\n  .col-sm-push-8 {\n    left: 66.66666667%;\n  }\n  .col-sm-push-7 {\n    left: 58.33333333%;\n  }\n  .col-sm-push-6 {\n    left: 50%;\n  }\n  .col-sm-push-5 {\n    left: 41.66666667%;\n  }\n  .col-sm-push-4 {\n    left: 33.33333333%;\n  }\n  .col-sm-push-3 {\n    left: 25%;\n  }\n  .col-sm-push-2 {\n    left: 16.66666667%;\n  }\n  .col-sm-push-1 {\n    left: 8.33333333%;\n  }\n  .col-sm-push-0 {\n    left: auto;\n  }\n  .col-sm-offset-12 {\n    margin-left: 100%;\n  }\n  .col-sm-offset-11 {\n    margin-left: 91.66666667%;\n  }\n  .col-sm-offset-10 {\n    margin-left: 83.33333333%;\n  }\n  .col-sm-offset-9 {\n    margin-left: 75%;\n  }\n  .col-sm-offset-8 {\n    margin-left: 66.66666667%;\n  }\n  .col-sm-offset-7 {\n    margin-left: 58.33333333%;\n  }\n  .col-sm-offset-6 {\n    margin-left: 50%;\n  }\n  .col-sm-offset-5 {\n    margin-left: 41.66666667%;\n  }\n  .col-sm-offset-4 {\n    margin-left: 33.33333333%;\n  }\n  .col-sm-offset-3 {\n    margin-left: 25%;\n  }\n  .col-sm-offset-2 {\n    margin-left: 16.66666667%;\n  }\n  .col-sm-offset-1 {\n    margin-left: 8.33333333%;\n  }\n  .col-sm-offset-0 {\n    margin-left: 0%;\n  }\n}\n@media (min-width: 1031px) {\n  .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12 {\n    float: left;\n  }\n  .col-md-12 {\n    width: 100%;\n  }\n  .col-md-11 {\n    width: 91.66666667%;\n  }\n  .col-md-10 {\n    width: 83.33333333%;\n  }\n  .col-md-9 {\n    width: 75%;\n  }\n  .col-md-8 {\n    width: 66.66666667%;\n  }\n  .col-md-7 {\n    width: 58.33333333%;\n  }\n  .col-md-6 {\n    width: 50%;\n  }\n  .col-md-5 {\n    width: 41.66666667%;\n  }\n  .col-md-4 {\n    width: 33.33333333%;\n  }\n  .col-md-3 {\n    width: 25%;\n  }\n  .col-md-2 {\n    width: 16.66666667%;\n  }\n  .col-md-1 {\n    width: 8.33333333%;\n  }\n  .col-md-pull-12 {\n    right: 100%;\n  }\n  .col-md-pull-11 {\n    right: 91.66666667%;\n  }\n  .col-md-pull-10 {\n    right: 83.33333333%;\n  }\n  .col-md-pull-9 {\n    right: 75%;\n  }\n  .col-md-pull-8 {\n    right: 66.66666667%;\n  }\n  .col-md-pull-7 {\n    right: 58.33333333%;\n  }\n  .col-md-pull-6 {\n    right: 50%;\n  }\n  .col-md-pull-5 {\n    right: 41.66666667%;\n  }\n  .col-md-pull-4 {\n    right: 33.33333333%;\n  }\n  .col-md-pull-3 {\n    right: 25%;\n  }\n  .col-md-pull-2 {\n    right: 16.66666667%;\n  }\n  .col-md-pull-1 {\n    right: 8.33333333%;\n  }\n  .col-md-pull-0 {\n    right: auto;\n  }\n  .col-md-push-12 {\n    left: 100%;\n  }\n  .col-md-push-11 {\n    left: 91.66666667%;\n  }\n  .col-md-push-10 {\n    left: 83.33333333%;\n  }\n  .col-md-push-9 {\n    left: 75%;\n  }\n  .col-md-push-8 {\n    left: 66.66666667%;\n  }\n  .col-md-push-7 {\n    left: 58.33333333%;\n  }\n  .col-md-push-6 {\n    left: 50%;\n  }\n  .col-md-push-5 {\n    left: 41.66666667%;\n  }\n  .col-md-push-4 {\n    left: 33.33333333%;\n  }\n  .col-md-push-3 {\n    left: 25%;\n  }\n  .col-md-push-2 {\n    left: 16.66666667%;\n  }\n  .col-md-push-1 {\n    left: 8.33333333%;\n  }\n  .col-md-push-0 {\n    left: auto;\n  }\n  .col-md-offset-12 {\n    margin-left: 100%;\n  }\n  .col-md-offset-11 {\n    margin-left: 91.66666667%;\n  }\n  .col-md-offset-10 {\n    margin-left: 83.33333333%;\n  }\n  .col-md-offset-9 {\n    margin-left: 75%;\n  }\n  .col-md-offset-8 {\n    margin-left: 66.66666667%;\n  }\n  .col-md-offset-7 {\n    margin-left: 58.33333333%;\n  }\n  .col-md-offset-6 {\n    margin-left: 50%;\n  }\n  .col-md-offset-5 {\n    margin-left: 41.66666667%;\n  }\n  .col-md-offset-4 {\n    margin-left: 33.33333333%;\n  }\n  .col-md-offset-3 {\n    margin-left: 25%;\n  }\n  .col-md-offset-2 {\n    margin-left: 16.66666667%;\n  }\n  .col-md-offset-1 {\n    margin-left: 8.33333333%;\n  }\n  .col-md-offset-0 {\n    margin-left: 0%;\n  }\n}\n@media (min-width: 1200px) {\n  .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12 {\n    float: left;\n  }\n  .col-lg-12 {\n    width: 100%;\n  }\n  .col-lg-11 {\n    width: 91.66666667%;\n  }\n  .col-lg-10 {\n    width: 83.33333333%;\n  }\n  .col-lg-9 {\n    width: 75%;\n  }\n  .col-lg-8 {\n    width: 66.66666667%;\n  }\n  .col-lg-7 {\n    width: 58.33333333%;\n  }\n  .col-lg-6 {\n    width: 50%;\n  }\n  .col-lg-5 {\n    width: 41.66666667%;\n  }\n  .col-lg-4 {\n    width: 33.33333333%;\n  }\n  .col-lg-3 {\n    width: 25%;\n  }\n  .col-lg-2 {\n    width: 16.66666667%;\n  }\n  .col-lg-1 {\n    width: 8.33333333%;\n  }\n  .col-lg-pull-12 {\n    right: 100%;\n  }\n  .col-lg-pull-11 {\n    right: 91.66666667%;\n  }\n  .col-lg-pull-10 {\n    right: 83.33333333%;\n  }\n  .col-lg-pull-9 {\n    right: 75%;\n  }\n  .col-lg-pull-8 {\n    right: 66.66666667%;\n  }\n  .col-lg-pull-7 {\n    right: 58.33333333%;\n  }\n  .col-lg-pull-6 {\n    right: 50%;\n  }\n  .col-lg-pull-5 {\n    right: 41.66666667%;\n  }\n  .col-lg-pull-4 {\n    right: 33.33333333%;\n  }\n  .col-lg-pull-3 {\n    right: 25%;\n  }\n  .col-lg-pull-2 {\n    right: 16.66666667%;\n  }\n  .col-lg-pull-1 {\n    right: 8.33333333%;\n  }\n  .col-lg-pull-0 {\n    right: auto;\n  }\n  .col-lg-push-12 {\n    left: 100%;\n  }\n  .col-lg-push-11 {\n    left: 91.66666667%;\n  }\n  .col-lg-push-10 {\n    left: 83.33333333%;\n  }\n  .col-lg-push-9 {\n    left: 75%;\n  }\n  .col-lg-push-8 {\n    left: 66.66666667%;\n  }\n  .col-lg-push-7 {\n    left: 58.33333333%;\n  }\n  .col-lg-push-6 {\n    left: 50%;\n  }\n  .col-lg-push-5 {\n    left: 41.66666667%;\n  }\n  .col-lg-push-4 {\n    left: 33.33333333%;\n  }\n  .col-lg-push-3 {\n    left: 25%;\n  }\n  .col-lg-push-2 {\n    left: 16.66666667%;\n  }\n  .col-lg-push-1 {\n    left: 8.33333333%;\n  }\n  .col-lg-push-0 {\n    left: auto;\n  }\n  .col-lg-offset-12 {\n    margin-left: 100%;\n  }\n  .col-lg-offset-11 {\n    margin-left: 91.66666667%;\n  }\n  .col-lg-offset-10 {\n    margin-left: 83.33333333%;\n  }\n  .col-lg-offset-9 {\n    margin-left: 75%;\n  }\n  .col-lg-offset-8 {\n    margin-left: 66.66666667%;\n  }\n  .col-lg-offset-7 {\n    margin-left: 58.33333333%;\n  }\n  .col-lg-offset-6 {\n    margin-left: 50%;\n  }\n  .col-lg-offset-5 {\n    margin-left: 41.66666667%;\n  }\n  .col-lg-offset-4 {\n    margin-left: 33.33333333%;\n  }\n  .col-lg-offset-3 {\n    margin-left: 25%;\n  }\n  .col-lg-offset-2 {\n    margin-left: 16.66666667%;\n  }\n  .col-lg-offset-1 {\n    margin-left: 8.33333333%;\n  }\n  .col-lg-offset-0 {\n    margin-left: 0%;\n  }\n}\ntable {\n  background-color: transparent;\n}\ncaption {\n  padding-top: 8px;\n  padding-bottom: 8px;\n  color: #777777;\n  text-align: left;\n}\nth {\n  text-align: left;\n}\n.table {\n  width: 100%;\n  max-width: 100%;\n  margin-bottom: 20px;\n}\n.table > thead > tr > th,\n.table > tbody > tr > th,\n.table > tfoot > tr > th,\n.table > thead > tr > td,\n.table > tbody > tr > td,\n.table > tfoot > tr > td {\n  padding: 8px;\n  line-height: 1.42857143;\n  vertical-align: top;\n  border-top: 1px solid #ddd;\n}\n.table > thead > tr > th {\n  vertical-align: bottom;\n  border-bottom: 2px solid #ddd;\n}\n.table > caption + thead > tr:first-child > th,\n.table > colgroup + thead > tr:first-child > th,\n.table > thead:first-child > tr:first-child > th,\n.table > caption + thead > tr:first-child > td,\n.table > colgroup + thead > tr:first-child > td,\n.table > thead:first-child > tr:first-child > td {\n  border-top: 0;\n}\n.table > tbody + tbody {\n  border-top: 2px solid #ddd;\n}\n.table .table {\n  background-color: #ffffff;\n}\n.table-condensed > thead > tr > th,\n.table-condensed > tbody > tr > th,\n.table-condensed > tfoot > tr > th,\n.table-condensed > thead > tr > td,\n.table-condensed > tbody > tr > td,\n.table-condensed > tfoot > tr > td {\n  padding: 5px;\n}\n.table-bordered {\n  border: 1px solid #ddd;\n}\n.table-bordered > thead > tr > th,\n.table-bordered > tbody > tr > th,\n.table-bordered > tfoot > tr > th,\n.table-bordered > thead > tr > td,\n.table-bordered > tbody > tr > td,\n.table-bordered > tfoot > tr > td {\n  border: 1px solid #ddd;\n}\n.table-bordered > thead > tr > th,\n.table-bordered > thead > tr > td {\n  border-bottom-width: 2px;\n}\n.table-striped > tbody > tr:nth-child(odd) {\n  background-color: #f9f9f9;\n}\n.table-hover > tbody > tr:hover {\n  background-color: #f5f5f5;\n}\ntable col[class*=\"col-\"] {\n  position: static;\n  float: none;\n  display: table-column;\n}\ntable td[class*=\"col-\"],\ntable th[class*=\"col-\"] {\n  position: static;\n  float: none;\n  display: table-cell;\n}\n.table > thead > tr > td.active,\n.table > tbody > tr > td.active,\n.table > tfoot > tr > td.active,\n.table > thead > tr > th.active,\n.table > tbody > tr > th.active,\n.table > tfoot > tr > th.active,\n.table > thead > tr.active > td,\n.table > tbody > tr.active > td,\n.table > tfoot > tr.active > td,\n.table > thead > tr.active > th,\n.table > tbody > tr.active > th,\n.table > tfoot > tr.active > th {\n  background-color: #f5f5f5;\n}\n.table-hover > tbody > tr > td.active:hover,\n.table-hover > tbody > tr > th.active:hover,\n.table-hover > tbody > tr.active:hover > td,\n.table-hover > tbody > tr:hover > .active,\n.table-hover > tbody > tr.active:hover > th {\n  background-color: #e8e8e8;\n}\n.table > thead > tr > td.success,\n.table > tbody > tr > td.success,\n.table > tfoot > tr > td.success,\n.table > thead > tr > th.success,\n.table > tbody > tr > th.success,\n.table > tfoot > tr > th.success,\n.table > thead > tr.success > td,\n.table > tbody > tr.success > td,\n.table > tfoot > tr.success > td,\n.table > thead > tr.success > th,\n.table > tbody > tr.success > th,\n.table > tfoot > tr.success > th {\n  background-color: #dff0d8;\n}\n.table-hover > tbody > tr > td.success:hover,\n.table-hover > tbody > tr > th.success:hover,\n.table-hover > tbody > tr.success:hover > td,\n.table-hover > tbody > tr:hover > .success,\n.table-hover > tbody > tr.success:hover > th {\n  background-color: #d0e9c6;\n}\n.table > thead > tr > td.info,\n.table > tbody > tr > td.info,\n.table > tfoot > tr > td.info,\n.table > thead > tr > th.info,\n.table > tbody > tr > th.info,\n.table > tfoot > tr > th.info,\n.table > thead > tr.info > td,\n.table > tbody > tr.info > td,\n.table > tfoot > tr.info > td,\n.table > thead > tr.info > th,\n.table > tbody > tr.info > th,\n.table > tfoot > tr.info > th {\n  background-color: #d9edf7;\n}\n.table-hover > tbody > tr > td.info:hover,\n.table-hover > tbody > tr > th.info:hover,\n.table-hover > tbody > tr.info:hover > td,\n.table-hover > tbody > tr:hover > .info,\n.table-hover > tbody > tr.info:hover > th {\n  background-color: #c4e3f3;\n}\n.table > thead > tr > td.warning,\n.table > tbody > tr > td.warning,\n.table > tfoot > tr > td.warning,\n.table > thead > tr > th.warning,\n.table > tbody > tr > th.warning,\n.table > tfoot > tr > th.warning,\n.table > thead > tr.warning > td,\n.table > tbody > tr.warning > td,\n.table > tfoot > tr.warning > td,\n.table > thead > tr.warning > th,\n.table > tbody > tr.warning > th,\n.table > tfoot > tr.warning > th {\n  background-color: #fcf8e3;\n}\n.table-hover > tbody > tr > td.warning:hover,\n.table-hover > tbody > tr > th.warning:hover,\n.table-hover > tbody > tr.warning:hover > td,\n.table-hover > tbody > tr:hover > .warning,\n.table-hover > tbody > tr.warning:hover > th {\n  background-color: #faf2cc;\n}\n.table > thead > tr > td.danger,\n.table > tbody > tr > td.danger,\n.table > tfoot > tr > td.danger,\n.table > thead > tr > th.danger,\n.table > tbody > tr > th.danger,\n.table > tfoot > tr > th.danger,\n.table > thead > tr.danger > td,\n.table > tbody > tr.danger > td,\n.table > tfoot > tr.danger > td,\n.table > thead > tr.danger > th,\n.table > tbody > tr.danger > th,\n.table > tfoot > tr.danger > th {\n  background-color: #f2dede;\n}\n.table-hover > tbody > tr > td.danger:hover,\n.table-hover > tbody > tr > th.danger:hover,\n.table-hover > tbody > tr.danger:hover > td,\n.table-hover > tbody > tr:hover > .danger,\n.table-hover > tbody > tr.danger:hover > th {\n  background-color: #ebcccc;\n}\n.table-responsive {\n  overflow-x: auto;\n  min-height: 0.01%;\n}\n@media screen and (max-width: 767px) {\n  .table-responsive {\n    width: 100%;\n    margin-bottom: 15px;\n    overflow-y: hidden;\n    -ms-overflow-style: -ms-autohiding-scrollbar;\n    border: 1px solid #ddd;\n  }\n  .table-responsive > .table {\n    margin-bottom: 0;\n  }\n  .table-responsive > .table > thead > tr > th,\n  .table-responsive > .table > tbody > tr > th,\n  .table-responsive > .table > tfoot > tr > th,\n  .table-responsive > .table > thead > tr > td,\n  .table-responsive > .table > tbody > tr > td,\n  .table-responsive > .table > tfoot > tr > td {\n    white-space: nowrap;\n  }\n  .table-responsive > .table-bordered {\n    border: 0;\n  }\n  .table-responsive > .table-bordered > thead > tr > th:first-child,\n  .table-responsive > .table-bordered > tbody > tr > th:first-child,\n  .table-responsive > .table-bordered > tfoot > tr > th:first-child,\n  .table-responsive > .table-bordered > thead > tr > td:first-child,\n  .table-responsive > .table-bordered > tbody > tr > td:first-child,\n  .table-responsive > .table-bordered > tfoot > tr > td:first-child {\n    border-left: 0;\n  }\n  .table-responsive > .table-bordered > thead > tr > th:last-child,\n  .table-responsive > .table-bordered > tbody > tr > th:last-child,\n  .table-responsive > .table-bordered > tfoot > tr > th:last-child,\n  .table-responsive > .table-bordered > thead > tr > td:last-child,\n  .table-responsive > .table-bordered > tbody > tr > td:last-child,\n  .table-responsive > .table-bordered > tfoot > tr > td:last-child {\n    border-right: 0;\n  }\n  .table-responsive > .table-bordered > tbody > tr:last-child > th,\n  .table-responsive > .table-bordered > tfoot > tr:last-child > th,\n  .table-responsive > .table-bordered > tbody > tr:last-child > td,\n  .table-responsive > .table-bordered > tfoot > tr:last-child > td {\n    border-bottom: 0;\n  }\n}\nfieldset {\n  padding: 0;\n  margin: 0;\n  border: 0;\n  min-width: 0;\n}\nlegend {\n  display: block;\n  width: 100%;\n  padding: 0;\n  margin-bottom: 20px;\n  font-size: 21px;\n  line-height: inherit;\n  color: #333333;\n  border: 0;\n  border-bottom: 1px solid #e5e5e5;\n}\nlabel {\n  display: inline-block;\n  max-width: 100%;\n  margin-bottom: 5px;\n  font-weight: bold;\n}\ninput[type=\"search\"] {\n  -webkit-box-sizing: border-box;\n  -moz-box-sizing: border-box;\n  box-sizing: border-box;\n}\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n  margin: 4px 0 0;\n  margin-top: 1px \\9;\n  line-height: normal;\n}\ninput[type=\"file\"] {\n  display: block;\n}\ninput[type=\"range\"] {\n  display: block;\n  width: 100%;\n}\nselect[multiple],\nselect[size] {\n  height: auto;\n}\ninput[type=\"file\"]:focus,\ninput[type=\"radio\"]:focus,\ninput[type=\"checkbox\"]:focus {\n  outline: thin dotted;\n  outline: 5px auto -webkit-focus-ring-color;\n  outline-offset: -2px;\n}\noutput {\n  display: block;\n  padding-top: 7px;\n  font-size: 14px;\n  line-height: 1.42857143;\n  color: #555555;\n}\n.form-control {\n  display: block;\n  width: 100%;\n  height: 34px;\n  padding: 6px 12px;\n  font-size: 14px;\n  line-height: 1.42857143;\n  color: #555555;\n  background-image: none;\n  border: 1px solid #ccc;\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 .15s, box-shadow ease-in-out .15s;\n  -o-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;\n  transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;\n}\n.form-control:focus {\n  border-color: #66afe9;\n  outline: 0;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6);\n  box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6);\n}\n.form-control::-moz-placeholder {\n  color: #999;\n  opacity: 1;\n}\n.form-control:-ms-input-placeholder {\n  color: #999;\n}\n.form-control::-webkit-input-placeholder {\n  color: #999;\n}\n.form-control[disabled],\n.form-control[readonly],\nfieldset[disabled] .form-control {\n  cursor: not-allowed;\n  opacity: 1;\n}\ntextarea.form-control {\n  height: auto;\n}\ninput[type=\"search\"] {\n  -webkit-appearance: none;\n}\ninput[type=\"date\"],\ninput[type=\"time\"],\ninput[type=\"datetime-local\"],\ninput[type=\"month\"] {\n  line-height: 34px;\n  line-height: 1.42857143 \\0;\n}\ninput[type=\"date\"].input-sm,\ninput[type=\"time\"].input-sm,\ninput[type=\"datetime-local\"].input-sm,\ninput[type=\"month\"].input-sm {\n  line-height: 30px;\n  line-height: 1.5 \\0;\n}\ninput[type=\"date\"].input-lg,\ninput[type=\"time\"].input-lg,\ninput[type=\"datetime-local\"].input-lg,\ninput[type=\"month\"].input-lg {\n  line-height: 46px;\n  line-height: 1.33 \\0;\n}\n_:-ms-fullscreen,\n:root input[type=\"date\"],\n_:-ms-fullscreen,\n:root input[type=\"time\"],\n_:-ms-fullscreen,\n:root input[type=\"datetime-local\"],\n_:-ms-fullscreen,\n:root input[type=\"month\"] {\n  line-height: 1.42857143;\n}\n_:-ms-fullscreen.input-sm,\n:root input[type=\"date\"].input-sm,\n_:-ms-fullscreen.input-sm,\n:root input[type=\"time\"].input-sm,\n_:-ms-fullscreen.input-sm,\n:root input[type=\"datetime-local\"].input-sm,\n_:-ms-fullscreen.input-sm,\n:root input[type=\"month\"].input-sm {\n  line-height: 1.5;\n}\n_:-ms-fullscreen.input-lg,\n:root input[type=\"date\"].input-lg,\n_:-ms-fullscreen.input-lg,\n:root input[type=\"time\"].input-lg,\n_:-ms-fullscreen.input-lg,\n:root input[type=\"datetime-local\"].input-lg,\n_:-ms-fullscreen.input-lg,\n:root input[type=\"month\"].input-lg {\n  line-height: 1.33;\n}\n.form-group {\n  margin-bottom: 15px;\n}\n.radio,\n.checkbox {\n  position: relative;\n  display: block;\n  margin-top: 10px;\n  margin-bottom: 10px;\n}\n.radio label,\n.checkbox label {\n  min-height: 20px;\n  padding-left: 20px;\n  margin-bottom: 0;\n  font-weight: normal;\n  cursor: pointer;\n}\n.radio input[type=\"radio\"],\n.radio-inline input[type=\"radio\"],\n.checkbox input[type=\"checkbox\"],\n.checkbox-inline input[type=\"checkbox\"] {\n  position: absolute;\n  margin-left: -20px;\n  margin-top: 4px \\9;\n}\n.radio + .radio,\n.checkbox + .checkbox {\n  margin-top: -5px;\n}\n.radio-inline,\n.checkbox-inline {\n  display: inline-block;\n  padding-left: 20px;\n  margin-bottom: 0;\n  vertical-align: middle;\n  font-weight: normal;\n  cursor: pointer;\n}\n.radio-inline + .radio-inline,\n.checkbox-inline + .checkbox-inline {\n  margin-top: 0;\n  margin-left: 10px;\n}\ninput[type=\"radio\"][disabled],\ninput[type=\"checkbox\"][disabled],\ninput[type=\"radio\"].disabled,\ninput[type=\"checkbox\"].disabled,\nfieldset[disabled] input[type=\"radio\"],\nfieldset[disabled] input[type=\"checkbox\"] {\n  cursor: not-allowed;\n}\n.radio-inline.disabled,\n.checkbox-inline.disabled,\nfieldset[disabled] .radio-inline,\nfieldset[disabled] .checkbox-inline {\n  cursor: not-allowed;\n}\n.radio.disabled label,\n.checkbox.disabled label,\nfieldset[disabled] .radio label,\nfieldset[disabled] .checkbox label {\n  cursor: not-allowed;\n}\n.form-control-static {\n  padding-top: 7px;\n  padding-bottom: 7px;\n  margin-bottom: 0;\n}\n.form-control-static.input-lg,\n.form-control-static.input-sm {\n  padding-left: 0;\n  padding-right: 0;\n}\n.input-sm,\n.form-group-sm .form-control {\n  height: 30px;\n  padding: 5px 10px;\n  font-size: 12px;\n  line-height: 1.5;\n  border-radius: 3px;\n}\nselect.input-sm,\nselect.form-group-sm .form-control {\n  height: 30px;\n  line-height: 30px;\n}\ntextarea.input-sm,\ntextarea.form-group-sm .form-control,\nselect[multiple].input-sm,\nselect[multiple].form-group-sm .form-control {\n  height: auto;\n}\n.input-lg,\n.form-group-lg .form-control {\n  height: 46px;\n  padding: 10px 16px;\n  font-size: 18px;\n  line-height: 1.33;\n  border-radius: 6px;\n}\nselect.input-lg,\nselect.form-group-lg .form-control {\n  height: 46px;\n  line-height: 46px;\n}\ntextarea.input-lg,\ntextarea.form-group-lg .form-control,\nselect[multiple].input-lg,\nselect[multiple].form-group-lg .form-control {\n  height: auto;\n}\n.has-feedback {\n  position: relative;\n}\n.has-feedback .form-control {\n  padding-right: 42.5px;\n}\n.form-control-feedback {\n  position: absolute;\n  top: 0;\n  right: 0;\n  z-index: 2;\n  display: block;\n  width: 34px;\n  height: 34px;\n  line-height: 34px;\n  text-align: center;\n  pointer-events: none;\n}\n.input-lg + .form-control-feedback {\n  width: 46px;\n  height: 46px;\n  line-height: 46px;\n}\n.input-sm + .form-control-feedback {\n  width: 30px;\n  height: 30px;\n  line-height: 30px;\n}\n.has-success .help-block,\n.has-success .control-label,\n.has-success .radio,\n.has-success .checkbox,\n.has-success .radio-inline,\n.has-success .checkbox-inline,\n.has-success.radio label,\n.has-success.checkbox label,\n.has-success.radio-inline label,\n.has-success.checkbox-inline label {\n  color: #215f1e;\n}\n.has-success .form-control {\n  border-color: #215f1e;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n.has-success .form-control:focus {\n  border-color: #143812;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #3cad36;\n  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #3cad36;\n}\n.has-success .input-group-addon {\n  color: #215f1e;\n  border-color: #215f1e;\n  background-color: #dff0d8;\n}\n.has-success .form-control-feedback {\n  color: #215f1e;\n}\n.has-warning .help-block,\n.has-warning .control-label,\n.has-warning .radio,\n.has-warning .checkbox,\n.has-warning .radio-inline,\n.has-warning .checkbox-inline,\n.has-warning.radio label,\n.has-warning.checkbox label,\n.has-warning.radio-inline label,\n.has-warning.checkbox-inline label {\n  color: #8a6d3b;\n}\n.has-warning .form-control {\n  border-color: #8a6d3b;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n.has-warning .form-control:focus {\n  border-color: #66512c;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b;\n  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b;\n}\n.has-warning .input-group-addon {\n  color: #8a6d3b;\n  border-color: #8a6d3b;\n  background-color: #fcf8e3;\n}\n.has-warning .form-control-feedback {\n  color: #8a6d3b;\n}\n.has-error .help-block,\n.has-error .control-label,\n.has-error .radio,\n.has-error .checkbox,\n.has-error .radio-inline,\n.has-error .checkbox-inline,\n.has-error.radio label,\n.has-error.checkbox label,\n.has-error.radio-inline label,\n.has-error.checkbox-inline label {\n  color: #a94442;\n}\n.has-error .form-control {\n  border-color: #a94442;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n.has-error .form-control:focus {\n  border-color: #843534;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483;\n  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483;\n}\n.has-error .input-group-addon {\n  color: #a94442;\n  border-color: #a94442;\n  background-color: #f2dede;\n}\n.has-error .form-control-feedback {\n  color: #a94442;\n}\n.has-feedback label ~ .form-control-feedback {\n  top: 25px;\n}\n.has-feedback label.sr-only ~ .form-control-feedback {\n  top: 0;\n}\n.help-block {\n  display: block;\n  margin-top: 5px;\n  margin-bottom: 10px;\n  color: #737373;\n}\n@media (min-width: 768px) {\n  .form-inline .form-group {\n    display: inline-block;\n    margin-bottom: 0;\n    vertical-align: middle;\n  }\n  .form-inline .form-control {\n    display: inline-block;\n    width: auto;\n    vertical-align: middle;\n  }\n  .form-inline .form-control-static {\n    display: inline-block;\n  }\n  .form-inline .input-group {\n    display: inline-table;\n    vertical-align: middle;\n  }\n  .form-inline .input-group .input-group-addon,\n  .form-inline .input-group .input-group-btn,\n  .form-inline .input-group .form-control {\n    width: auto;\n  }\n  .form-inline .input-group > .form-control {\n    width: 100%;\n  }\n  .form-inline .control-label {\n    margin-bottom: 0;\n    vertical-align: middle;\n  }\n  .form-inline .radio,\n  .form-inline .checkbox {\n    display: inline-block;\n    margin-top: 0;\n    margin-bottom: 0;\n    vertical-align: middle;\n  }\n  .form-inline .radio label,\n  .form-inline .checkbox label {\n    padding-left: 0;\n  }\n  .form-inline .radio input[type=\"radio\"],\n  .form-inline .checkbox input[type=\"checkbox\"] {\n    position: relative;\n    margin-left: 0;\n  }\n  .form-inline .has-feedback .form-control-feedback {\n    top: 0;\n  }\n}\n.form-horizontal .radio,\n.form-horizontal .checkbox,\n.form-horizontal .radio-inline,\n.form-horizontal .checkbox-inline {\n  margin-top: 0;\n  margin-bottom: 0;\n  padding-top: 7px;\n}\n.form-horizontal .radio,\n.form-horizontal .checkbox {\n  min-height: 27px;\n}\n.form-horizontal .form-group {\n  margin-left: -15px;\n  margin-right: -15px;\n}\n@media (min-width: 768px) {\n  .form-horizontal .control-label {\n    text-align: right;\n    margin-bottom: 0;\n    padding-top: 7px;\n  }\n}\n.form-horizontal .has-feedback .form-control-feedback {\n  right: 15px;\n}\n@media (min-width: 768px) {\n  .form-horizontal .form-group-lg .control-label {\n    padding-top: 14.3px;\n  }\n}\n@media (min-width: 768px) {\n  .form-horizontal .form-group-sm .control-label {\n    padding-top: 6px;\n  }\n}\n.btn {\n  display: inline-block;\n  margin-bottom: 0;\n  font-weight: normal;\n  text-align: center;\n  vertical-align: middle;\n  touch-action: manipulation;\n  cursor: pointer;\n  background-image: none;\n  border: 1px solid transparent;\n  white-space: nowrap;\n  padding: 6px 12px;\n  font-size: 14px;\n  line-height: 1.42857143;\n  border-radius: 4px;\n  -webkit-user-select: none;\n  -moz-user-select: none;\n  -ms-user-select: none;\n  user-select: none;\n}\n.btn:focus,\n.btn:active:focus,\n.btn.active:focus,\n.btn.focus,\n.btn:active.focus,\n.btn.active.focus {\n  outline: thin dotted;\n  outline: 5px auto -webkit-focus-ring-color;\n  outline-offset: -2px;\n}\n.btn:hover,\n.btn:focus,\n.btn.focus {\n  color: #eeeeee;\n  text-decoration: none;\n}\n.btn:active,\n.btn.active {\n  outline: 0;\n  background-image: none;\n  -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n  box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n}\n.btn.disabled,\n.btn[disabled],\nfieldset[disabled] .btn {\n  cursor: not-allowed;\n  pointer-events: none;\n  opacity: 0.65;\n  -ms-filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=65);\n  filter: alpha(opacity=65);\n  -webkit-box-shadow: none;\n  box-shadow: none;\n}\n.btn-default {\n  color: #000000;\n  background-color: #ffffff;\n  border-color: #000000;\n}\n.btn-default:hover,\n.btn-default:focus,\n.btn-default.focus,\n.btn-default:active,\n.btn-default.active,\n.open > .dropdown-toggle.btn-default {\n  color: #eeeeee;\n  background-color: #ffffff;\n  border-color: #000000;\n}\n.btn-default:active,\n.btn-default.active,\n.open > .dropdown-toggle.btn-default {\n  background-image: none;\n}\n.btn-default.disabled,\n.btn-default[disabled],\nfieldset[disabled] .btn-default,\n.btn-default.disabled:hover,\n.btn-default[disabled]:hover,\nfieldset[disabled] .btn-default:hover,\n.btn-default.disabled:focus,\n.btn-default[disabled]:focus,\nfieldset[disabled] .btn-default:focus,\n.btn-default.disabled.focus,\n.btn-default[disabled].focus,\nfieldset[disabled] .btn-default.focus,\n.btn-default.disabled:active,\n.btn-default[disabled]:active,\nfieldset[disabled] .btn-default:active,\n.btn-default.disabled.active,\n.btn-default[disabled].active,\nfieldset[disabled] .btn-default.active {\n  background-color: #ffffff;\n  border-color: #000000;\n}\n.btn-default .badge {\n  color: #ffffff;\n  background-color: #000000;\n}\n.btn-primary {\n  color: #4CAF50;\n  background-color: #4CAF50;\n  border-color: #449d48;\n}\n.btn-primary:hover,\n.btn-primary:focus,\n.btn-primary.focus,\n.btn-primary:active,\n.btn-primary.active,\n.open > .dropdown-toggle.btn-primary {\n  color: #eeeeee;\n  background-color: #4CAF50;\n  border-color: #327334;\n}\n.btn-primary:active,\n.btn-primary.active,\n.open > .dropdown-toggle.btn-primary {\n  background-image: none;\n}\n.btn-primary.disabled,\n.btn-primary[disabled],\nfieldset[disabled] .btn-primary,\n.btn-primary.disabled:hover,\n.btn-primary[disabled]:hover,\nfieldset[disabled] .btn-primary:hover,\n.btn-primary.disabled:focus,\n.btn-primary[disabled]:focus,\nfieldset[disabled] .btn-primary:focus,\n.btn-primary.disabled.focus,\n.btn-primary[disabled].focus,\nfieldset[disabled] .btn-primary.focus,\n.btn-primary.disabled:active,\n.btn-primary[disabled]:active,\nfieldset[disabled] .btn-primary:active,\n.btn-primary.disabled.active,\n.btn-primary[disabled].active,\nfieldset[disabled] .btn-primary.active {\n  background-color: #4CAF50;\n  border-color: #449d48;\n}\n.btn-primary .badge {\n  color: #4CAF50;\n  background-color: #4CAF50;\n}\n.btn-success {\n  color: #457E86;\n  background-color: #457E86;\n  border-color: #3c6e75;\n}\n.btn-success:hover,\n.btn-success:focus,\n.btn-success.focus,\n.btn-success:active,\n.btn-success.active,\n.open > .dropdown-toggle.btn-success {\n  color: #eeeeee;\n  background-color: #457E86;\n  border-color: #28484d;\n}\n.btn-success:active,\n.btn-success.active,\n.open > .dropdown-toggle.btn-success {\n  background-image: none;\n}\n.btn-success.disabled,\n.btn-success[disabled],\nfieldset[disabled] .btn-success,\n.btn-success.disabled:hover,\n.btn-success[disabled]:hover,\nfieldset[disabled] .btn-success:hover,\n.btn-success.disabled:focus,\n.btn-success[disabled]:focus,\nfieldset[disabled] .btn-success:focus,\n.btn-success.disabled.focus,\n.btn-success[disabled].focus,\nfieldset[disabled] .btn-success.focus,\n.btn-success.disabled:active,\n.btn-success[disabled]:active,\nfieldset[disabled] .btn-success:active,\n.btn-success.disabled.active,\n.btn-success[disabled].active,\nfieldset[disabled] .btn-success.active {\n  background-color: #457E86;\n  border-color: #3c6e75;\n}\n.btn-success .badge {\n  color: #457E86;\n  background-color: #457E86;\n}\n.btn-info {\n  color: #4A2B0F;\n  background-color: #4A2B0F;\n  border-color: #351f0b;\n}\n.btn-info:hover,\n.btn-info:focus,\n.btn-info.focus,\n.btn-info:active,\n.btn-info.active,\n.open > .dropdown-toggle.btn-info {\n  color: #eeeeee;\n  background-color: #4A2B0F;\n  border-color: #020100;\n}\n.btn-info:active,\n.btn-info.active,\n.open > .dropdown-toggle.btn-info {\n  background-image: none;\n}\n.btn-info.disabled,\n.btn-info[disabled],\nfieldset[disabled] .btn-info,\n.btn-info.disabled:hover,\n.btn-info[disabled]:hover,\nfieldset[disabled] .btn-info:hover,\n.btn-info.disabled:focus,\n.btn-info[disabled]:focus,\nfieldset[disabled] .btn-info:focus,\n.btn-info.disabled.focus,\n.btn-info[disabled].focus,\nfieldset[disabled] .btn-info.focus,\n.btn-info.disabled:active,\n.btn-info[disabled]:active,\nfieldset[disabled] .btn-info:active,\n.btn-info.disabled.active,\n.btn-info[disabled].active,\nfieldset[disabled] .btn-info.active {\n  background-color: #4A2B0F;\n  border-color: #351f0b;\n}\n.btn-info .badge {\n  color: #4A2B0F;\n  background-color: #4A2B0F;\n}\n.btn-warning {\n  color: #f0ad4e;\n  background-color: #f0ad4e;\n  border-color: #eea236;\n}\n.btn-warning:hover,\n.btn-warning:focus,\n.btn-warning.focus,\n.btn-warning:active,\n.btn-warning.active,\n.open > .dropdown-toggle.btn-warning {\n  color: #eeeeee;\n  background-color: #f0ad4e;\n  border-color: #d58512;\n}\n.btn-warning:active,\n.btn-warning.active,\n.open > .dropdown-toggle.btn-warning {\n  background-image: none;\n}\n.btn-warning.disabled,\n.btn-warning[disabled],\nfieldset[disabled] .btn-warning,\n.btn-warning.disabled:hover,\n.btn-warning[disabled]:hover,\nfieldset[disabled] .btn-warning:hover,\n.btn-warning.disabled:focus,\n.btn-warning[disabled]:focus,\nfieldset[disabled] .btn-warning:focus,\n.btn-warning.disabled.focus,\n.btn-warning[disabled].focus,\nfieldset[disabled] .btn-warning.focus,\n.btn-warning.disabled:active,\n.btn-warning[disabled]:active,\nfieldset[disabled] .btn-warning:active,\n.btn-warning.disabled.active,\n.btn-warning[disabled].active,\nfieldset[disabled] .btn-warning.active {\n  background-color: #f0ad4e;\n  border-color: #eea236;\n}\n.btn-warning .badge {\n  color: #f0ad4e;\n  background-color: #f0ad4e;\n}\n.btn-danger {\n  color: #d9534f;\n  background-color: #d9534f;\n  border-color: #d43f3a;\n}\n.btn-danger:hover,\n.btn-danger:focus,\n.btn-danger.focus,\n.btn-danger:active,\n.btn-danger.active,\n.open > .dropdown-toggle.btn-danger {\n  color: #eeeeee;\n  background-color: #d9534f;\n  border-color: #ac2925;\n}\n.btn-danger:active,\n.btn-danger.active,\n.open > .dropdown-toggle.btn-danger {\n  background-image: none;\n}\n.btn-danger.disabled,\n.btn-danger[disabled],\nfieldset[disabled] .btn-danger,\n.btn-danger.disabled:hover,\n.btn-danger[disabled]:hover,\nfieldset[disabled] .btn-danger:hover,\n.btn-danger.disabled:focus,\n.btn-danger[disabled]:focus,\nfieldset[disabled] .btn-danger:focus,\n.btn-danger.disabled.focus,\n.btn-danger[disabled].focus,\nfieldset[disabled] .btn-danger.focus,\n.btn-danger.disabled:active,\n.btn-danger[disabled]:active,\nfieldset[disabled] .btn-danger:active,\n.btn-danger.disabled.active,\n.btn-danger[disabled].active,\nfieldset[disabled] .btn-danger.active {\n  background-color: #d9534f;\n  border-color: #d43f3a;\n}\n.btn-danger .badge {\n  color: #d9534f;\n  background-color: #d9534f;\n}\n.btn-link {\n  color: #4CAF50;\n  font-weight: normal;\n  border-radius: 0;\n}\n.btn-link,\n.btn-link:active,\n.btn-link.active,\n.btn-link[disabled],\nfieldset[disabled] .btn-link {\n  background-color: transparent;\n  -webkit-box-shadow: none;\n  box-shadow: none;\n}\n.btn-link,\n.btn-link:hover,\n.btn-link:focus,\n.btn-link:active {\n  border-color: transparent;\n}\n.btn-link:hover,\n.btn-link:focus {\n  color: #357a38;\n  text-decoration: underline;\n  background-color: transparent;\n}\n.btn-link[disabled]:hover,\nfieldset[disabled] .btn-link:hover,\n.btn-link[disabled]:focus,\nfieldset[disabled] .btn-link:focus {\n  color: #777777;\n  text-decoration: none;\n}\n.btn-lg,\n.btn-group-lg > .btn {\n  padding: 10px 16px;\n  font-size: 18px;\n  line-height: 1.33;\n  border-radius: 6px;\n}\n.btn-sm,\n.btn-group-sm > .btn {\n  padding: 5px 10px;\n  font-size: 12px;\n  line-height: 1.5;\n  border-radius: 3px;\n}\n.btn-xs,\n.btn-group-xs > .btn {\n  padding: 1px 5px;\n  font-size: 12px;\n  line-height: 1.5;\n  border-radius: 3px;\n}\n.btn-block {\n  display: block;\n  width: 100%;\n}\n.btn-block + .btn-block {\n  margin-top: 5px;\n}\ninput[type=\"submit\"].btn-block,\ninput[type=\"reset\"].btn-block,\ninput[type=\"button\"].btn-block {\n  width: 100%;\n}\n.fade {\n  opacity: 0;\n  -webkit-transition: opacity 0.15s linear;\n  -o-transition: opacity 0.15s linear;\n  transition: opacity 0.15s linear;\n}\n.fade.in {\n  opacity: 1;\n}\n.collapse {\n  display: none;\n  visibility: hidden;\n}\n.collapse.in {\n  display: block;\n  visibility: visible;\n}\ntr.collapse.in {\n  display: table-row;\n}\ntbody.collapse.in {\n  display: table-row-group;\n}\n.collapsing {\n  position: relative;\n  height: 0;\n  overflow: hidden;\n  -webkit-transition-property: height, visibility;\n  transition-property: height, visibility;\n  -webkit-transition-duration: 0.35s;\n  transition-duration: 0.35s;\n  -webkit-transition-timing-function: ease;\n  transition-timing-function: ease;\n}\n.caret {\n  display: inline-block;\n  width: 0;\n  height: 0;\n  margin-left: 2px;\n  vertical-align: middle;\n  border-top: 4px solid;\n  border-right: 4px solid transparent;\n  border-left: 4px solid transparent;\n}\n.dropdown {\n  position: relative;\n}\n.dropdown-toggle:focus {\n  outline: 0;\n}\n.dropdown-menu {\n  position: absolute;\n  top: 100%;\n  left: 0;\n  z-index: 1000;\n  display: none;\n  float: left;\n  min-width: 160px;\n  padding: 5px 0;\n  margin: 2px 0 0;\n  list-style: none;\n  font-size: 14px;\n  text-align: left;\n  border: 1px solid #ccc;\n  border: 1px solid rgba(0, 0, 0, 0.15);\n  border-radius: 4px;\n  -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);\n  box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);\n  background-clip: padding-box;\n}\n.dropdown-menu.pull-right {\n  right: 0;\n  left: auto;\n}\n.dropdown-menu .divider {\n  height: 1px;\n  margin: 9px 0;\n  overflow: hidden;\n  background-color: #e5e5e5;\n}\n.dropdown-menu > li > a {\n  display: block;\n  padding: 3px 20px;\n  clear: both;\n  font-weight: normal;\n  line-height: 1.42857143;\n  color: #333333;\n  white-space: nowrap;\n}\n.dropdown-menu > li > a:hover,\n.dropdown-menu > li > a:focus {\n  text-decoration: none;\n  color: #262626;\n  background-color: #f5f5f5;\n}\n.dropdown-menu > .active > a,\n.dropdown-menu > .active > a:hover,\n.dropdown-menu > .active > a:focus {\n  color: #eeeeee;\n  text-decoration: none;\n  outline: 0;\n  background-color: #4CAF50;\n}\n.dropdown-menu > .disabled > a,\n.dropdown-menu > .disabled > a:hover,\n.dropdown-menu > .disabled > a:focus {\n  color: #777777;\n}\n.dropdown-menu > .disabled > a:hover,\n.dropdown-menu > .disabled > a:focus {\n  text-decoration: none;\n  background-color: transparent;\n  background-image: none;\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n  cursor: not-allowed;\n}\n.open > .dropdown-menu {\n  display: block;\n}\n.open > a {\n  outline: 0;\n}\n.dropdown-menu-right {\n  left: auto;\n  right: 0;\n}\n.dropdown-menu-left {\n  left: 0;\n  right: auto;\n}\n.dropdown-header {\n  display: block;\n  padding: 3px 20px;\n  font-size: 12px;\n  line-height: 1.42857143;\n  color: #777777;\n  white-space: nowrap;\n}\n.dropdown-backdrop {\n  position: fixed;\n  left: 0;\n  right: 0;\n  bottom: 0;\n  top: 0;\n  z-index: 990;\n}\n.pull-right > .dropdown-menu {\n  right: 0;\n  left: auto;\n}\n.dropup .caret,\n.navbar-fixed-bottom .dropdown .caret {\n  border-top: 0;\n  border-bottom: 4px solid;\n  content: \"\";\n}\n.dropup .dropdown-menu,\n.navbar-fixed-bottom .dropdown .dropdown-menu {\n  top: auto;\n  bottom: 100%;\n  margin-bottom: 1px;\n}\n@media (min-width: 768px) {\n  .navbar-right .dropdown-menu {\n    left: auto;\n    right: 0;\n  }\n  .navbar-right .dropdown-menu-left {\n    left: 0;\n    right: auto;\n  }\n}\n.btn-group,\n.btn-group-vertical {\n  position: relative;\n  display: inline-block;\n  vertical-align: middle;\n}\n.btn-group > .btn,\n.btn-group-vertical > .btn {\n  position: relative;\n  float: left;\n}\n.btn-group > .btn:hover,\n.btn-group-vertical > .btn:hover,\n.btn-group > .btn:focus,\n.btn-group-vertical > .btn:focus,\n.btn-group > .btn:active,\n.btn-group-vertical > .btn:active,\n.btn-group > .btn.active,\n.btn-group-vertical > .btn.active {\n  z-index: 2;\n}\n.btn-group > .btn:focus,\n.btn-group-vertical > .btn:focus {\n  outline: 0;\n}\n.btn-group .btn + .btn,\n.btn-group .btn + .btn-group,\n.btn-group .btn-group + .btn,\n.btn-group .btn-group + .btn-group {\n  margin-left: -1px;\n}\n.btn-toolbar {\n  margin-left: -5px;\n}\n.btn-toolbar .btn-group,\n.btn-toolbar .input-group {\n  float: left;\n}\n.btn-toolbar > .btn,\n.btn-toolbar > .btn-group,\n.btn-toolbar > .input-group {\n  margin-left: 5px;\n}\n.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) {\n  border-radius: 0;\n}\n.btn-group > .btn:first-child {\n  margin-left: 0;\n}\n.btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) {\n  border-bottom-right-radius: 0;\n  border-top-right-radius: 0;\n}\n.btn-group > .btn:last-child:not(:first-child),\n.btn-group > .dropdown-toggle:not(:first-child) {\n  border-bottom-left-radius: 0;\n  border-top-left-radius: 0;\n}\n.btn-group > .btn-group {\n  float: left;\n}\n.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn {\n  border-radius: 0;\n}\n.btn-group > .btn-group:first-child > .btn:last-child,\n.btn-group > .btn-group:first-child > .dropdown-toggle {\n  border-bottom-right-radius: 0;\n  border-top-right-radius: 0;\n}\n.btn-group > .btn-group:last-child > .btn:first-child {\n  border-bottom-left-radius: 0;\n  border-top-left-radius: 0;\n}\n.btn-group .dropdown-toggle:active,\n.btn-group.open .dropdown-toggle {\n  outline: 0;\n}\n.btn-group > .btn + .dropdown-toggle {\n  padding-left: 8px;\n  padding-right: 8px;\n}\n.btn-group > .btn-lg + .dropdown-toggle {\n  padding-left: 12px;\n  padding-right: 12px;\n}\n.btn-group.open .dropdown-toggle {\n  -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n  box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n}\n.btn-group.open .dropdown-toggle.btn-link {\n  -webkit-box-shadow: none;\n  box-shadow: none;\n}\n.btn .caret {\n  margin-left: 0;\n}\n.btn-lg .caret {\n  border-width: 5px 5px 0;\n  border-bottom-width: 0;\n}\n.dropup .btn-lg .caret {\n  border-width: 0 5px 5px;\n}\n.btn-group-vertical > .btn,\n.btn-group-vertical > .btn-group,\n.btn-group-vertical > .btn-group > .btn {\n  display: block;\n  float: none;\n  width: 100%;\n  max-width: 100%;\n}\n.btn-group-vertical > .btn-group > .btn {\n  float: none;\n}\n.btn-group-vertical > .btn + .btn,\n.btn-group-vertical > .btn + .btn-group,\n.btn-group-vertical > .btn-group + .btn,\n.btn-group-vertical > .btn-group + .btn-group {\n  margin-top: -1px;\n  margin-left: 0;\n}\n.btn-group-vertical > .btn:not(:first-child):not(:last-child) {\n  border-radius: 0;\n}\n.btn-group-vertical > .btn:first-child:not(:last-child) {\n  border-top-right-radius: 4px;\n  border-bottom-right-radius: 0;\n  border-bottom-left-radius: 0;\n}\n.btn-group-vertical > .btn:last-child:not(:first-child) {\n  border-bottom-left-radius: 4px;\n  border-top-right-radius: 0;\n  border-top-left-radius: 0;\n}\n.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn {\n  border-radius: 0;\n}\n.btn-group-vertical > .btn-group:first-child:not(:last-child) > .btn:last-child,\n.btn-group-vertical > .btn-group:first-child:not(:last-child) > .dropdown-toggle {\n  border-bottom-right-radius: 0;\n  border-bottom-left-radius: 0;\n}\n.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child {\n  border-top-right-radius: 0;\n  border-top-left-radius: 0;\n}\n.btn-group-justified {\n  display: table;\n  width: 100%;\n  table-layout: fixed;\n  border-collapse: separate;\n}\n.btn-group-justified > .btn,\n.btn-group-justified > .btn-group {\n  float: none;\n  display: table-cell;\n  width: 1%;\n}\n.btn-group-justified > .btn-group .btn {\n  width: 100%;\n}\n.btn-group-justified > .btn-group .dropdown-menu {\n  left: auto;\n}\n[data-toggle=\"buttons\"] > .btn input[type=\"radio\"],\n[data-toggle=\"buttons\"] > .btn-group > .btn input[type=\"radio\"],\n[data-toggle=\"buttons\"] > .btn input[type=\"checkbox\"],\n[data-toggle=\"buttons\"] > .btn-group > .btn input[type=\"checkbox\"] {\n  position: absolute;\n  clip: rect(0, 0, 0, 0);\n  pointer-events: none;\n}\n.input-group {\n  position: relative;\n  display: table;\n  border-collapse: separate;\n}\n.input-group[class*=\"col-\"] {\n  float: none;\n  padding-left: 0;\n  padding-right: 0;\n}\n.input-group .form-control {\n  position: relative;\n  z-index: 2;\n  float: left;\n  width: 100%;\n  margin-bottom: 0;\n}\n.input-group-lg > .form-control,\n.input-group-lg > .input-group-addon,\n.input-group-lg > .input-group-btn > .btn {\n  height: 46px;\n  padding: 10px 16px;\n  font-size: 18px;\n  line-height: 1.33;\n  border-radius: 6px;\n}\nselect.input-group-lg > .form-control,\nselect.input-group-lg > .input-group-addon,\nselect.input-group-lg > .input-group-btn > .btn {\n  height: 46px;\n  line-height: 46px;\n}\ntextarea.input-group-lg > .form-control,\ntextarea.input-group-lg > .input-group-addon,\ntextarea.input-group-lg > .input-group-btn > .btn,\nselect[multiple].input-group-lg > .form-control,\nselect[multiple].input-group-lg > .input-group-addon,\nselect[multiple].input-group-lg > .input-group-btn > .btn {\n  height: auto;\n}\n.input-group-sm > .form-control,\n.input-group-sm > .input-group-addon,\n.input-group-sm > .input-group-btn > .btn {\n  height: 30px;\n  padding: 5px 10px;\n  font-size: 12px;\n  line-height: 1.5;\n  border-radius: 3px;\n}\nselect.input-group-sm > .form-control,\nselect.input-group-sm > .input-group-addon,\nselect.input-group-sm > .input-group-btn > .btn {\n  height: 30px;\n  line-height: 30px;\n}\ntextarea.input-group-sm > .form-control,\ntextarea.input-group-sm > .input-group-addon,\ntextarea.input-group-sm > .input-group-btn > .btn,\nselect[multiple].input-group-sm > .form-control,\nselect[multiple].input-group-sm > .input-group-addon,\nselect[multiple].input-group-sm > .input-group-btn > .btn {\n  height: auto;\n}\n.input-group-addon,\n.input-group-btn,\n.input-group .form-control {\n  display: table-cell;\n}\n.input-group-addon:not(:first-child):not(:last-child),\n.input-group-btn:not(:first-child):not(:last-child),\n.input-group .form-control:not(:first-child):not(:last-child) {\n  border-radius: 0;\n}\n.input-group-addon,\n.input-group-btn {\n  width: 1%;\n  white-space: nowrap;\n  vertical-align: middle;\n}\n.input-group-addon {\n  padding: 6px 12px;\n  font-size: 14px;\n  font-weight: normal;\n  line-height: 1;\n  color: #555555;\n  text-align: center;\n  border: 1px solid #ccc;\n  border-radius: 4px;\n}\n.input-group-addon.input-sm {\n  padding: 5px 10px;\n  font-size: 12px;\n  border-radius: 3px;\n}\n.input-group-addon.input-lg {\n  padding: 10px 16px;\n  font-size: 18px;\n  border-radius: 6px;\n}\n.input-group-addon input[type=\"radio\"],\n.input-group-addon input[type=\"checkbox\"] {\n  margin-top: 0;\n}\n.input-group .form-control:first-child,\n.input-group-addon:first-child,\n.input-group-btn:first-child > .btn,\n.input-group-btn:first-child > .btn-group > .btn,\n.input-group-btn:first-child > .dropdown-toggle,\n.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle),\n.input-group-btn:last-child > .btn-group:not(:last-child) > .btn {\n  border-bottom-right-radius: 0;\n  border-top-right-radius: 0;\n}\n.input-group-addon:first-child {\n  border-right: 0;\n}\n.input-group .form-control:last-child,\n.input-group-addon:last-child,\n.input-group-btn:last-child > .btn,\n.input-group-btn:last-child > .btn-group > .btn,\n.input-group-btn:last-child > .dropdown-toggle,\n.input-group-btn:first-child > .btn:not(:first-child),\n.input-group-btn:first-child > .btn-group:not(:first-child) > .btn {\n  border-bottom-left-radius: 0;\n  border-top-left-radius: 0;\n}\n.input-group-addon:last-child {\n  border-left: 0;\n}\n.input-group-btn {\n  position: relative;\n  font-size: 0;\n  white-space: nowrap;\n}\n.input-group-btn > .btn {\n  position: relative;\n}\n.input-group-btn > .btn + .btn {\n  margin-left: -1px;\n}\n.input-group-btn > .btn:hover,\n.input-group-btn > .btn:focus,\n.input-group-btn > .btn:active {\n  z-index: 2;\n}\n.input-group-btn:first-child > .btn,\n.input-group-btn:first-child > .btn-group {\n  margin-right: -1px;\n}\n.input-group-btn:last-child > .btn,\n.input-group-btn:last-child > .btn-group {\n  margin-left: -1px;\n}\n.nav {\n  margin-bottom: 0;\n  padding-left: 0;\n  list-style: none;\n}\n.nav > li {\n  position: relative;\n  display: block;\n}\n.nav > li > a {\n  position: relative;\n  display: block;\n  padding: 10px 15px;\n}\n.nav > li > a:hover,\n.nav > li > a:focus {\n  text-decoration: none;\n}\n.nav > li.disabled > a {\n  color: #777777;\n}\n.nav > li.disabled > a:hover,\n.nav > li.disabled > a:focus {\n  color: #777777;\n  text-decoration: none;\n  background-color: transparent;\n  cursor: not-allowed;\n}\n.nav .open > a,\n.nav .open > a:hover,\n.nav .open > a:focus {\n  border-color: #4CAF50;\n}\n.nav .nav-divider {\n  height: 1px;\n  margin: 9px 0;\n  overflow: hidden;\n  background-color: #e5e5e5;\n}\n.nav > li > a > img {\n  max-width: none;\n}\n.nav-tabs {\n  border-bottom: 1px solid #ddd;\n}\n.nav-tabs > li {\n  float: left;\n  margin-bottom: -1px;\n}\n.nav-tabs > li > a {\n  margin-right: 2px;\n  line-height: 1.42857143;\n  border: 1px solid transparent;\n  border-radius: 4px 4px 0 0;\n}\n.nav-tabs > li > a:hover {\n  border-color: #eeeeee #eeeeee #ddd;\n}\n.nav-tabs > li.active > a,\n.nav-tabs > li.active > a:hover,\n.nav-tabs > li.active > a:focus {\n  color: #555555;\n  background-color: #ffffff;\n  border: 1px solid #ddd;\n  border-bottom-color: transparent;\n  cursor: default;\n}\n.nav-tabs.nav-justified {\n  width: 100%;\n  border-bottom: 0;\n}\n.nav-tabs.nav-justified > li {\n  float: none;\n}\n.nav-tabs.nav-justified > li > a {\n  text-align: center;\n  margin-bottom: 5px;\n}\n.nav-tabs.nav-justified > .dropdown .dropdown-menu {\n  top: auto;\n  left: auto;\n}\n@media (min-width: 768px) {\n  .nav-tabs.nav-justified > li {\n    display: table-cell;\n    width: 1%;\n  }\n  .nav-tabs.nav-justified > li > a {\n    margin-bottom: 0;\n  }\n}\n.nav-tabs.nav-justified > li > a {\n  margin-right: 0;\n  border-radius: 4px;\n}\n.nav-tabs.nav-justified > .active > a,\n.nav-tabs.nav-justified > .active > a:hover,\n.nav-tabs.nav-justified > .active > a:focus {\n  border: 1px solid #ddd;\n}\n@media (min-width: 768px) {\n  .nav-tabs.nav-justified > li > a {\n    border-bottom: 1px solid #ddd;\n    border-radius: 4px 4px 0 0;\n  }\n  .nav-tabs.nav-justified > .active > a,\n  .nav-tabs.nav-justified > .active > a:hover,\n  .nav-tabs.nav-justified > .active > a:focus {\n    border-bottom-color: #ffffff;\n  }\n}\n.nav-pills > li {\n  float: left;\n}\n.nav-pills > li > a {\n  border-radius: 4px;\n}\n.nav-pills > li + li {\n  margin-left: 2px;\n}\n.nav-pills > li.active > a,\n.nav-pills > li.active > a:hover,\n.nav-pills > li.active > a:focus {\n  color: #eeeeee;\n  background-color: #4CAF50;\n}\n.nav-stacked > li {\n  float: none;\n}\n.nav-stacked > li + li {\n  margin-top: 2px;\n  margin-left: 0;\n}\n.nav-justified {\n  width: 100%;\n}\n.nav-justified > li {\n  float: none;\n}\n.nav-justified > li > a {\n  text-align: center;\n  margin-bottom: 5px;\n}\n.nav-justified > .dropdown .dropdown-menu {\n  top: auto;\n  left: auto;\n}\n@media (min-width: 768px) {\n  .nav-justified > li {\n    display: table-cell;\n    width: 1%;\n  }\n  .nav-justified > li > a {\n    margin-bottom: 0;\n  }\n}\n.nav-tabs-justified {\n  border-bottom: 0;\n}\n.nav-tabs-justified > li > a {\n  margin-right: 0;\n  border-radius: 4px;\n}\n.nav-tabs-justified > .active > a,\n.nav-tabs-justified > .active > a:hover,\n.nav-tabs-justified > .active > a:focus {\n  border: 1px solid #ddd;\n}\n@media (min-width: 768px) {\n  .nav-tabs-justified > li > a {\n    border-bottom: 1px solid #ddd;\n    border-radius: 4px 4px 0 0;\n  }\n  .nav-tabs-justified > .active > a,\n  .nav-tabs-justified > .active > a:hover,\n  .nav-tabs-justified > .active > a:focus {\n    border-bottom-color: #ffffff;\n  }\n}\n.tab-content > .tab-pane {\n  display: none;\n  visibility: hidden;\n}\n.tab-content > .active {\n  display: block;\n  visibility: visible;\n}\n.nav-tabs .dropdown-menu {\n  margin-top: -1px;\n  border-top-right-radius: 0;\n  border-top-left-radius: 0;\n}\n.navbar {\n  position: relative;\n  min-height: 50px;\n  margin-bottom: 30px;\n  border: 1px solid transparent;\n}\n@media (min-width: 768px) {\n  .navbar {\n    border-radius: 4px;\n  }\n}\n@media (min-width: 768px) {\n  .navbar-header {\n    float: left;\n  }\n}\n.navbar-collapse {\n  overflow-x: visible;\n  padding-right: 15px;\n  padding-left: 15px;\n  border-top: 1px solid transparent;\n  box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1);\n  -webkit-overflow-scrolling: touch;\n}\n.navbar-collapse.in {\n  overflow-y: auto;\n}\n@media (min-width: 768px) {\n  .navbar-collapse {\n    width: auto;\n    border-top: 0;\n    box-shadow: none;\n  }\n  .navbar-collapse.collapse {\n    display: block !important;\n    visibility: visible !important;\n    height: auto !important;\n    padding-bottom: 0;\n    overflow: visible !important;\n  }\n  .navbar-collapse.in {\n    overflow-y: visible;\n  }\n  .navbar-fixed-top .navbar-collapse,\n  .navbar-static-top .navbar-collapse,\n  .navbar-fixed-bottom .navbar-collapse {\n    padding-left: 0;\n    padding-right: 0;\n  }\n}\n.navbar-fixed-top .navbar-collapse,\n.navbar-fixed-bottom .navbar-collapse {\n  max-height: 340px;\n}\n@media (max-device-width: 480px) and (orientation: landscape) {\n  .navbar-fixed-top .navbar-collapse,\n  .navbar-fixed-bottom .navbar-collapse {\n    max-height: 200px;\n  }\n}\n.container > .navbar-header,\n.container-fluid > .navbar-header,\n.container > .navbar-collapse,\n.container-fluid > .navbar-collapse {\n  margin-right: -15px;\n  margin-left: -15px;\n}\n@media (min-width: 768px) {\n  .container > .navbar-header,\n  .container-fluid > .navbar-header,\n  .container > .navbar-collapse,\n  .container-fluid > .navbar-collapse {\n    margin-right: 0;\n    margin-left: 0;\n  }\n}\n.navbar-static-top {\n  z-index: 1000;\n  border-width: 0 0 1px;\n}\n@media (min-width: 768px) {\n  .navbar-static-top {\n    border-radius: 0;\n  }\n}\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n  position: fixed;\n  right: 0;\n  left: 0;\n  z-index: 1030;\n}\n@media (min-width: 768px) {\n  .navbar-fixed-top,\n  .navbar-fixed-bottom {\n    border-radius: 0;\n  }\n}\n.navbar-fixed-top {\n  top: 0;\n  border-width: 0 0 1px;\n}\n.navbar-fixed-bottom {\n  bottom: 0;\n  margin-bottom: 0;\n  border-width: 1px 0 0;\n}\n.navbar-brand {\n  float: left;\n  padding: 15px 15px;\n  font-size: 18px;\n  line-height: 20px;\n  height: 50px;\n}\n.navbar-brand:hover,\n.navbar-brand:focus {\n  text-decoration: none;\n}\n.navbar-brand > img {\n  display: inline;\n  height:20px;\n}\n@media (min-width: 768px) {\n  .navbar > .container .navbar-brand,\n  .navbar > .container-fluid .navbar-brand {\n    margin-left: -15px;\n  }\n}\n.navbar-toggle {\n  position: relative;\n  float: right;\n  margin-right: 15px;\n  padding: 9px 10px;\n  margin-top: 8px;\n  margin-bottom: 8px;\n  background-color: transparent;\n  background-image: none;\n  border: 1px solid transparent;\n  border-radius: 4px;\n}\n.navbar-toggle:focus {\n  outline: 0;\n}\n.navbar-toggle .icon-bar {\n  display: block;\n  width: 22px;\n  height: 2px;\n  border-radius: 1px;\n  background-color: #eeeeee !important;\n}\n.navbar-toggle .icon-bar + .icon-bar {\n  margin-top: 4px;\n}\n@media (min-width: 768px) {\n  .navbar-toggle {\n    display: none;\n  }\n}\n.navbar-nav {\n  margin: 7.5px -15px;\n}\n.navbar-nav > li > a {\n  padding-top: 10px;\n  padding-bottom: 10px;\n  line-height: 20px;\n}\n@media (max-width: 767px) {\n  .navbar-nav .open .dropdown-menu {\n    position: static;\n    float: none;\n    width: auto;\n    margin-top: 0;\n    background-color: transparent;\n    border: 0;\n    box-shadow: none;\n  }\n  .navbar-nav .open .dropdown-menu > li > a,\n  .navbar-nav .open .dropdown-menu .dropdown-header {\n    padding: 5px 15px 5px 25px;\n  }\n  .navbar-nav .open .dropdown-menu > li > a {\n    line-height: 20px;\n  }\n  .navbar-nav .open .dropdown-menu > li > a:hover,\n  .navbar-nav .open .dropdown-menu > li > a:focus {\n    background-image: none;\n  }\n}\n@media (min-width: 768px) {\n  .navbar-nav {\n    float: left;\n    margin: 0;\n  }\n  .navbar-nav > li {\n    float: left;\n  }\n  .navbar-nav > li > a {\n    padding-top: 15px;\n    padding-bottom: 15px;\n  }\n}\n.navbar-form {\n  margin-left: -15px;\n  margin-right: -15px;\n  padding: 10px 15px;\n  border-top: 1px solid transparent;\n  border-bottom: 1px solid transparent;\n  -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  margin-top: 8px;\n  margin-bottom: 8px;\n}\n@media (min-width: 768px) {\n  .navbar-form .form-group {\n    display: inline-block;\n    margin-bottom: 0;\n    vertical-align: middle;\n  }\n  .navbar-form .form-control {\n    display: inline-block;\n    width: auto;\n    vertical-align: middle;\n  }\n  .navbar-form .form-control-static {\n    display: inline-block;\n  }\n  .navbar-form .input-group {\n    display: inline-table;\n    vertical-align: middle;\n  }\n  .navbar-form .input-group .input-group-addon,\n  .navbar-form .input-group .input-group-btn,\n  .navbar-form .input-group .form-control {\n    width: auto;\n  }\n  .navbar-form .input-group > .form-control {\n    width: 100%;\n  }\n  .navbar-form .control-label {\n    margin-bottom: 0;\n    vertical-align: middle;\n  }\n  .navbar-form .radio,\n  .navbar-form .checkbox {\n    display: inline-block;\n    margin-top: 0;\n    margin-bottom: 0;\n    vertical-align: middle;\n  }\n  .navbar-form .radio label,\n  .navbar-form .checkbox label {\n    padding-left: 0;\n  }\n  .navbar-form .radio input[type=\"radio\"],\n  .navbar-form .checkbox input[type=\"checkbox\"] {\n    position: relative;\n    margin-left: 0;\n  }\n  .navbar-form .has-feedback .form-control-feedback {\n    top: 0;\n  }\n}\n@media (max-width: 767px) {\n  .navbar-form .form-group {\n    margin-bottom: 5px;\n  }\n  .navbar-form .form-group:last-child {\n    margin-bottom: 0;\n  }\n}\n@media (min-width: 768px) {\n  .navbar-form {\n    width: auto;\n    border: 0;\n    margin-left: 0;\n    margin-right: 0;\n    padding-top: 0;\n    padding-bottom: 0;\n    -webkit-box-shadow: none;\n    box-shadow: none;\n  }\n}\n.navbar-nav > li > .dropdown-menu {\n  margin-top: 0;\n  border-top-right-radius: 0;\n  border-top-left-radius: 0;\n}\n.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu {\n  border-bottom-right-radius: 0;\n  border-bottom-left-radius: 0;\n}\n.navbar-btn {\n  margin-top: 8px;\n  margin-bottom: 8px;\n}\n.navbar-btn.btn-sm {\n  margin-top: 10px;\n  margin-bottom: 10px;\n}\n.navbar-btn.btn-xs {\n  margin-top: 14px;\n  margin-bottom: 14px;\n}\n.navbar-text {\n  margin-top: 15px;\n  margin-bottom: 15px;\n}\n@media (min-width: 768px) {\n  .navbar-text {\n    float: left;\n    margin-left: 15px;\n    margin-right: 15px;\n  }\n}\n@media (min-width: 768px) {\n  .navbar-left {\n    float: left !important;\n  }\n  .navbar-right {\n    float: right !important;\n    margin-right: -15px;\n  }\n  .navbar-right ~ .navbar-right {\n    margin-right: 0;\n  }\n}\n.navbar-default {\n  background-color: #f8f8f8;\n  border-color: #e7e7e7;\n}\n.navbar-default .navbar-brand {\n  color: #eeeeee;\n}\n.navbar-default .navbar-brand:hover,\n.navbar-default .navbar-brand:focus {\n  color: #d5d5d5;\n  background-color: transparent;\n}\n.navbar-default .navbar-text {\n  color: #777;\n}\n.navbar-default .navbar-nav > li > a {\n  color: #777;\n  font-size:16px;\n}\n.navbar-default .navbar-nav > li > a:hover,\n.navbar-default .navbar-nav > li > a:focus {\n  color: #4CAF50;\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: #eeeeee;\n}\n.navbar-default .navbar-nav > .disabled > a,\n.navbar-default .navbar-nav > .disabled > a:hover,\n.navbar-default .navbar-nav > .disabled > a:focus {\n  color: #ccc;\n  background-color: transparent;\n}\n.navbar-default .navbar-toggle {\n  border-color: #ddd;\n}\n.navbar-default .navbar-toggle:hover,\n.navbar-default .navbar-toggle:focus {\n  background-color: #ddd;\n}\n.navbar-default .navbar-toggle .icon-bar {\n  background-color: #888;\n}\n.navbar-default .navbar-collapse,\n.navbar-default .navbar-form {\n  border-color: #e7e7e7;\n}\n.navbar-default .navbar-nav > .open > a,\n.navbar-default .navbar-nav > .open > a:hover,\n.navbar-default .navbar-nav > .open > a:focus {\n  background-color: #e7e7e7;\n  color: #eeeeee;\n}\n@media (max-width: 767px) {\n  .navbar-default .navbar-nav .open .dropdown-menu > li > a {\n    color: #eeeeee;\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: #4CAF50;\n\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: #eeeeee;\n    background-color: #e7e7e7;\n  }\n  .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a,\n  .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover,\n  .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus {\n    color: #ccc;\n    background-color: transparent;\n  }\n}\n.navbar-default .navbar-link {\n  color: #eeeeee;\n}\n.navbar-default .navbar-link:hover {\n  color: #4CAF50;\n}\n.navbar-default .btn-link {\n  color: #eeeeee;\n}\n.navbar-default .btn-link:hover,\n.navbar-default .btn-link:focus {\n  color: #4CAF50;\n}\n.navbar-default .btn-link[disabled]:hover,\nfieldset[disabled] .navbar-default .btn-link:hover,\n.navbar-default .btn-link[disabled]:focus,\nfieldset[disabled] .navbar-default .btn-link:focus {\n  color: #ccc;\n}\n.navbar-inverse {\n  background-color: #222;\n  border-color: #080808;\n}\n.navbar-inverse .navbar-brand {\n  color: #777777;\n}\n.navbar-inverse .navbar-brand:hover,\n.navbar-inverse .navbar-brand:focus {\n  color: #eeeeee;\n  background-color: transparent;\n}\n.navbar-inverse .navbar-text {\n  color: #9d9d9d;\n}\n.navbar-inverse .navbar-nav > li > a {\n  color: #777777;\n}\n.navbar-inverse .navbar-nav > li > a:hover,\n.navbar-inverse .navbar-nav > li > a:focus {\n  color: #eeeeee;\n  background-color: transparent;\n}\n.navbar-inverse .navbar-nav > .active > a,\n.navbar-inverse .navbar-nav > .active > a:hover,\n.navbar-inverse .navbar-nav > .active > a:focus {\n  color: #eeeeee;\n  background-color: #080808;\n}\n.navbar-inverse .navbar-nav > .disabled > a,\n.navbar-inverse .navbar-nav > .disabled > a:hover,\n.navbar-inverse .navbar-nav > .disabled > a:focus {\n  color: #444;\n  background-color: transparent;\n}\n.navbar-inverse .navbar-toggle {\n  border-color: #333;\n}\n.navbar-inverse .navbar-toggle:hover,\n.navbar-inverse .navbar-toggle:focus {\n  background-color: #333;\n}\n.navbar-inverse .navbar-toggle .icon-bar {\n}\n.navbar-inverse .navbar-collapse,\n.navbar-inverse .navbar-form {\n  border-color: #101010;\n}\n.navbar-inverse .navbar-nav > .open > a,\n.navbar-inverse .navbar-nav > .open > a:hover,\n.navbar-inverse .navbar-nav > .open > a:focus {\n  background-color: #080808;\n  color: #eeeeee;\n}\n@media (max-width: 767px) {\n  .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header {\n    border-color: #080808;\n  }\n  .navbar-inverse .navbar-nav .open .dropdown-menu .divider {\n    background-color: #080808;\n  }\n  .navbar-inverse .navbar-nav .open .dropdown-menu > li > a {\n    color: #777777;\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: #eeeeee;\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: #eeeeee;\n    background-color: #080808;\n  }\n  .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a,\n  .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover,\n  .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus {\n    color: #444;\n    background-color: transparent;\n  }\n}\n.navbar-inverse .navbar-link {\n  color: #777777;\n}\n.navbar-inverse .navbar-link:hover {\n  color: #eeeeee;\n}\n.navbar-inverse .btn-link {\n  color: #777777;\n}\n.navbar-inverse .btn-link:hover,\n.navbar-inverse .btn-link:focus {\n  color: #eeeeee;\n}\n.navbar-inverse .btn-link[disabled]:hover,\nfieldset[disabled] .navbar-inverse .btn-link:hover,\n.navbar-inverse .btn-link[disabled]:focus,\nfieldset[disabled] .navbar-inverse .btn-link:focus {\n  color: #444;\n}\n.breadcrumb {\n  padding: 8px 15px;\n  margin-bottom: 20px;\n  list-style: none;\n  background-color: #f5f5f5;\n  border-radius: 4px;\n}\n.breadcrumb > li {\n  display: inline-block;\n}\n.breadcrumb > li + li:before {\n  content: \"/\\00a0\";\n  padding: 0 5px;\n  color: #ccc;\n}\n.breadcrumb > .active {\n  color: #777777;\n}\n.pagination {\n  display: inline-block;\n  padding-left: 0;\n  margin: 20px 0;\n  border-radius: 4px;\n}\n.pagination > li {\n  display: inline;\n}\n.pagination > li > a,\n.pagination > li > span {\n  position: relative;\n  float: left;\n  padding: 6px 12px;\n  line-height: 1.42857143;\n  text-decoration: none;\n  color: #4CAF50;\n  border: 1px solid #ddd;\n  margin-left: -1px;\n}\n.pagination > li:first-child > a,\n.pagination > li:first-child > span {\n  margin-left: 0;\n  border-bottom-left-radius: 4px;\n  border-top-left-radius: 4px;\n}\n.pagination > li:last-child > a,\n.pagination > li:last-child > span {\n  border-bottom-right-radius: 4px;\n  border-top-right-radius: 4px;\n}\n.pagination > li > a:hover,\n.pagination > li > span:hover,\n.pagination > li > a:focus,\n.pagination > li > span:focus {\n  color: #357a38;\n  border-color: #ddd;\n}\n.pagination > .active > a,\n.pagination > .active > span,\n.pagination > .active > a:hover,\n.pagination > .active > span:hover,\n.pagination > .active > a:focus,\n.pagination > .active > span:focus {\n  z-index: 2;\n  color: #eeeeee;\n  background-color: #4CAF50;\n  border-color: #4CAF50;\n  cursor: default;\n}\n.pagination > .disabled > span,\n.pagination > .disabled > span:hover,\n.pagination > .disabled > span:focus,\n.pagination > .disabled > a,\n.pagination > .disabled > a:hover,\n.pagination > .disabled > a:focus {\n  color: #777777;\n  border-color: #ddd;\n  cursor: not-allowed;\n}\n.pagination-lg > li > a,\n.pagination-lg > li > span {\n  padding: 10px 16px;\n  font-size: 18px;\n}\n.pagination-lg > li:first-child > a,\n.pagination-lg > li:first-child > span {\n  border-bottom-left-radius: 6px;\n  border-top-left-radius: 6px;\n}\n.pagination-lg > li:last-child > a,\n.pagination-lg > li:last-child > span {\n  border-bottom-right-radius: 6px;\n  border-top-right-radius: 6px;\n}\n.pagination-sm > li > a,\n.pagination-sm > li > span {\n  padding: 5px 10px;\n  font-size: 12px;\n}\n.pagination-sm > li:first-child > a,\n.pagination-sm > li:first-child > span {\n  border-bottom-left-radius: 3px;\n  border-top-left-radius: 3px;\n}\n.pagination-sm > li:last-child > a,\n.pagination-sm > li:last-child > span {\n  border-bottom-right-radius: 3px;\n  border-top-right-radius: 3px;\n}\n.pager {\n  padding-left: 0;\n  margin: 20px 0;\n  list-style: none;\n  text-align: center;\n}\n.pager li {\n  display: inline;\n}\n.pager li > a,\n.pager li > span {\n  display: inline-block;\n  padding: 5px 14px;\n  border: 1px solid #ddd;\n  border-radius: 15px;\n}\n.pager li > a:hover,\n.pager li > a:focus {\n  text-decoration: none;\n}\n.pager .next > a,\n.pager .next > span {\n  float: right;\n}\n.pager .previous > a,\n.pager .previous > span {\n  float: left;\n}\n.pager .disabled > a,\n.pager .disabled > a:hover,\n.pager .disabled > a:focus,\n.pager .disabled > span {\n  color: #777777;\n  cursor: not-allowed;\n}\n.label {\n  display: inline;\n  padding: .2em .6em .3em;\n  font-size: 75%;\n  font-weight: bold;\n  line-height: 1;\n  color: #eeeeee;\n  text-align: center;\n  white-space: nowrap;\n  vertical-align: baseline;\n  border-radius: .25em;\n}\na.label:hover,\na.label:focus {\n  color: #eeeeee;\n  text-decoration: none;\n  cursor: pointer;\n}\n.label:empty {\n  display: none;\n}\n.btn .label {\n  position: relative;\n  top: -1px;\n}\n.label-default {\n  background-color: #777777;\n}\n.label-default[href]:hover,\n.label-default[href]:focus {\n  background-color: #5e5e5e;\n}\n.label-primary {\n  background-color: #4CAF50;\n}\n.label-primary[href]:hover,\n.label-primary[href]:focus {\n  background-color: #3d8b40;\n}\n.label-success {\n  background-color: #457E86;\n}\n.label-success[href]:hover,\n.label-success[href]:focus {\n  background-color: #345e64;\n}\n.label-info {\n  background-color: #4A2B0F;\n}\n.label-info[href]:hover,\n.label-info[href]:focus {\n  background-color: #201206;\n}\n.label-warning {\n  background-color: #f0ad4e;\n}\n.label-warning[href]:hover,\n.label-warning[href]:focus {\n  background-color: #ec971f;\n}\n.label-danger {\n  background-color: #d9534f;\n}\n.label-danger[href]:hover,\n.label-danger[href]:focus {\n  background-color: #c9302c;\n}\n.badge {\n  display: inline-block;\n  min-width: 10px;\n  padding: 3px 7px;\n  font-size: 12px;\n  font-weight: bold;\n  color: #eeeeee;\n  line-height: 1;\n  vertical-align: baseline;\n  white-space: nowrap;\n  text-align: center;\n  background-color: #777777;\n  border-radius: 10px;\n}\n.badge:empty {\n  display: none;\n}\n.btn .badge {\n  position: relative;\n  top: -1px;\n}\n.btn-xs .badge {\n  top: 0;\n  padding: 1px 5px;\n}\na.badge:hover,\na.badge:focus {\n  color: #eeeeee;\n  text-decoration: none;\n  cursor: pointer;\n}\na.list-group-item.active > .badge,\n.nav-pills > .active > a > .badge {\n  color: #4CAF50;\n}\n.nav-pills > li > a > .badge {\n  margin-left: 3px;\n}\n.jumbotron {\n  padding: 30px 15px;\n  margin-bottom: 30px;\n  color: inherit;\n}\n.jumbotron h1,\n.jumbotron .h1 {\n  color: inherit;\n}\n.jumbotron p {\n  margin-bottom: 15px;\n  font-size: 21px;\n  font-weight: 200;\n}\n.jumbotron > hr {\n  border-top-color: #d5d5d5;\n}\n.container .jumbotron,\n.container-fluid .jumbotron {\n  border-radius: 6px;\n}\n.jumbotron .container {\n  max-width: 100%;\n}\n@media screen and (min-width: 768px) {\n  .jumbotron {\n    padding: 48px 0;\n  }\n  .container .jumbotron {\n    padding-left: 60px;\n    padding-right: 60px;\n  }\n  .jumbotron h1,\n  .jumbotron .h1 {\n    font-size: 63px;\n  }\n}\n.thumbnail {\n  display: block;\n  padding: 4px;\n  margin-bottom: 20px;\n  line-height: 1.42857143;\n  background-color: #ffffff;\n  border: 1px solid #ddd;\n  border-radius: 4px;\n  -webkit-transition: border 0.2s ease-in-out;\n  -o-transition: border 0.2s ease-in-out;\n  transition: border 0.2s ease-in-out;\n}\n.thumbnail > img,\n.thumbnail a > img {\n  margin-left: auto;\n  margin-right: auto;\n}\na.thumbnail:hover,\na.thumbnail:focus,\na.thumbnail.active {\n  border-color: #4CAF50;\n}\n.thumbnail .caption {\n  padding: 9px;\n  color: #333333;\n}\n.alert {\n  padding: 15px;\n  margin-bottom: 20px;\n  border: 1px solid transparent;\n  border-radius: 4px;\n}\n.alert h4 {\n  margin-top: 0;\n  color: inherit;\n}\n.alert .alert-link {\n  font-weight: bold;\n}\n.alert > p,\n.alert > ul {\n  margin-bottom: 0;\n}\n.alert > p + p {\n  margin-top: 5px;\n}\n.alert-dismissable,\n.alert-dismissible {\n  padding-right: 35px;\n}\n.alert-dismissable .close,\n.alert-dismissible .close {\n  position: relative;\n  top: -2px;\n  right: -21px;\n  color: inherit;\n}\n.alert-success {\n  background-color: #dff0d8;\n  border-color: #d6e9c6;\n  color: #215f1e;\n}\n.alert-success hr {\n  border-top-color: #c9e2b3;\n}\n.alert-success .alert-link {\n  color: #143812;\n}\n.alert-info {\n  background-color: #d9edf7;\n  border-color: #bce8f1;\n  color: #31708f;\n}\n.alert-info hr {\n  border-top-color: #a6e1ec;\n}\n.alert-info .alert-link {\n  color: #245269;\n}\n.alert-warning {\n  background-color: #fcf8e3;\n  border-color: #faebcc;\n  color: #8a6d3b;\n}\n.alert-warning hr {\n  border-top-color: #f7e1b5;\n}\n.alert-warning .alert-link {\n  color: #66512c;\n}\n.alert-danger {\n  background-color: #f2dede;\n  border-color: #ebccd1;\n  color: #a94442;\n}\n.alert-danger hr {\n  border-top-color: #e4b9c0;\n}\n.alert-danger .alert-link {\n  color: #843534;\n}\n@-webkit-keyframes progress-bar-stripes {\n  from {\n    background-position: 40px 0;\n  }\n  to {\n    background-position: 0 0;\n  }\n}\n@keyframes progress-bar-stripes {\n  from {\n    background-position: 40px 0;\n  }\n  to {\n    background-position: 0 0;\n  }\n}\n.progress {\n  overflow: hidden;\n  height: 20px;\n  margin-bottom: 20px;\n  background-color: #f5f5f5;\n  border-radius: 4px;\n  -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);\n  box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);\n}\n.progress-bar {\n  float: left;\n  width: 0%;\n  height: 100%;\n  font-size: 12px;\n  line-height: 20px;\n  color: #eeeeee;\n  text-align: center;\n  background-color: #4CAF50;\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  -o-transition: width 0.6s ease;\n  transition: width 0.6s ease;\n}\n.progress-striped .progress-bar,\n.progress-bar-striped {\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: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-size: 40px 40px;\n}\n.progress.active .progress-bar,\n.progress-bar.active {\n  -webkit-animation: progress-bar-stripes 2s linear infinite;\n  -o-animation: progress-bar-stripes 2s linear infinite;\n  animation: progress-bar-stripes 2s linear infinite;\n}\n.progress-bar-success {\n  background-color: #457E86;\n}\n.progress-striped .progress-bar-success {\n  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.progress-bar-info {\n  background-color: #4A2B0F;\n}\n.progress-striped .progress-bar-info {\n  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.progress-bar-warning {\n  background-color: #f0ad4e;\n}\n.progress-striped .progress-bar-warning {\n  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.progress-bar-danger {\n  background-color: #d9534f;\n}\n.progress-striped .progress-bar-danger {\n  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.media {\n  margin-top: 15px;\n}\n.media:first-child {\n  margin-top: 0;\n}\n.media-right,\n.media > .pull-right {\n  padding-left: 10px;\n}\n.media-left,\n.media > .pull-left {\n  padding-right: 10px;\n}\n.media-left,\n.media-right,\n.media-body {\n  display: table-cell;\n  vertical-align: top;\n}\n.media-middle {\n  vertical-align: middle;\n}\n.media-bottom {\n  vertical-align: bottom;\n}\n.media-heading {\n  margin-top: 0;\n  margin-bottom: 5px;\n}\n.media-list {\n  padding-left: 0;\n  list-style: none;\n}\n.list-group {\n  margin-bottom: 20px;\n  padding-left: 0;\n}\n.list-group-item {\n  position: relative;\n  display: block;\n  padding: 10px 15px;\n  margin-bottom: -1px;\n  background-color: #ffffff;\n  border: 1px solid #ddd;\n}\n.list-group-item:first-child {\n  border-top-right-radius: 4px;\n  border-top-left-radius: 4px;\n}\n.list-group-item:last-child {\n  margin-bottom: 0;\n  border-bottom-right-radius: 4px;\n  border-bottom-left-radius: 4px;\n}\n.list-group-item > .badge {\n  float: right;\n}\n.list-group-item > .badge + .badge {\n  margin-right: 5px;\n}\na.list-group-item {\n  color: #555;\n}\na.list-group-item .list-group-item-heading {\n  color: #333;\n}\na.list-group-item:hover,\na.list-group-item:focus {\n  text-decoration: none;\n  color: #555;\n  background-color: #f5f5f5;\n}\n.list-group-item.disabled,\n.list-group-item.disabled:hover,\n.list-group-item.disabled:focus {\n  color: #777777;\n  cursor: not-allowed;\n}\n.list-group-item.disabled .list-group-item-heading,\n.list-group-item.disabled:hover .list-group-item-heading,\n.list-group-item.disabled:focus .list-group-item-heading {\n  color: inherit;\n}\n.list-group-item.disabled .list-group-item-text,\n.list-group-item.disabled:hover .list-group-item-text,\n.list-group-item.disabled:focus .list-group-item-text {\n  color: #777777;\n}\n.list-group-item.active,\n.list-group-item.active:hover,\n.list-group-item.active:focus {\n  z-index: 2;\n  color: #eeeeee;\n  background-color: #4CAF50;\n  border-color: #4CAF50;\n}\n.list-group-item.active .list-group-item-heading,\n.list-group-item.active:hover .list-group-item-heading,\n.list-group-item.active:focus .list-group-item-heading,\n.list-group-item.active .list-group-item-heading > small,\n.list-group-item.active:hover .list-group-item-heading > small,\n.list-group-item.active:focus .list-group-item-heading > small,\n.list-group-item.active .list-group-item-heading > .small,\n.list-group-item.active:hover .list-group-item-heading > .small,\n.list-group-item.active:focus .list-group-item-heading > .small {\n  color: inherit;\n}\n.list-group-item.active .list-group-item-text,\n.list-group-item.active:hover .list-group-item-text,\n.list-group-item.active:focus .list-group-item-text {\n  color: #d9eeda;\n}\n.list-group-item-success {\n  color: #215f1e;\n  background-color: #dff0d8;\n}\na.list-group-item-success {\n  color: #215f1e;\n}\na.list-group-item-success .list-group-item-heading {\n  color: inherit;\n}\na.list-group-item-success:hover,\na.list-group-item-success:focus {\n  color: #215f1e;\n  background-color: #d0e9c6;\n}\na.list-group-item-success.active,\na.list-group-item-success.active:hover,\na.list-group-item-success.active:focus {\n  color: #fff;\n  background-color: #215f1e;\n  border-color: #215f1e;\n}\n.list-group-item-info {\n  color: #31708f;\n  background-color: #d9edf7;\n}\na.list-group-item-info {\n  color: #31708f;\n}\na.list-group-item-info .list-group-item-heading {\n  color: inherit;\n}\na.list-group-item-info:hover,\na.list-group-item-info:focus {\n  color: #31708f;\n  background-color: #c4e3f3;\n}\na.list-group-item-info.active,\na.list-group-item-info.active:hover,\na.list-group-item-info.active:focus {\n  color: #fff;\n  background-color: #31708f;\n  border-color: #31708f;\n}\n.list-group-item-warning {\n  color: #8a6d3b;\n  background-color: #fcf8e3;\n}\na.list-group-item-warning {\n  color: #8a6d3b;\n}\na.list-group-item-warning .list-group-item-heading {\n  color: inherit;\n}\na.list-group-item-warning:hover,\na.list-group-item-warning:focus {\n  color: #8a6d3b;\n  background-color: #faf2cc;\n}\na.list-group-item-warning.active,\na.list-group-item-warning.active:hover,\na.list-group-item-warning.active:focus {\n  color: #fff;\n  background-color: #8a6d3b;\n  border-color: #8a6d3b;\n}\n.list-group-item-danger {\n  color: #a94442;\n  background-color: #f2dede;\n}\na.list-group-item-danger {\n  color: #a94442;\n}\na.list-group-item-danger .list-group-item-heading {\n  color: inherit;\n}\na.list-group-item-danger:hover,\na.list-group-item-danger:focus {\n  color: #a94442;\n  background-color: #ebcccc;\n}\na.list-group-item-danger.active,\na.list-group-item-danger.active:hover,\na.list-group-item-danger.active:focus {\n  color: #fff;\n  background-color: #a94442;\n  border-color: #a94442;\n}\n.list-group-item-heading {\n  margin-top: 0;\n  margin-bottom: 5px;\n}\n.list-group-item-text {\n  margin-bottom: 0;\n  line-height: 1.3;\n}\n.panel {\n  margin-bottom: 20px;\n  border: 1px solid transparent;\n  border-radius: 4px;\n  -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05);\n  box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05);\n}\n.panel-body {\n  padding: 15px;\n}\n.panel-heading {\n  padding: 10px 15px;\n  border-bottom: 1px solid transparent;\n  border-top-right-radius: 3px;\n  border-top-left-radius: 3px;\n}\n.panel-heading > .dropdown .dropdown-toggle {\n  color: inherit;\n}\n.panel-title {\n  margin-top: 0;\n  margin-bottom: 0;\n  font-size: 16px;\n  color: inherit;\n}\n.panel-title > a {\n  color: inherit;\n}\n.panel-footer {\n  padding: 10px 15px;\n  background-color: #dedede;\n  border-top: 1px solid #ccc;\n  border-bottom-right-radius: 3px;\n  border-bottom-left-radius: 3px;\n}\n.panel > .list-group,\n.panel > .panel-collapse > .list-group {\n  margin-bottom: 0;\n}\n.panel > .list-group .list-group-item,\n.panel > .panel-collapse > .list-group .list-group-item {\n  border-width: 1px 0;\n  border-radius: 0;\n}\n.panel > .list-group:first-child .list-group-item:first-child,\n.panel > .panel-collapse > .list-group:first-child .list-group-item:first-child {\n  border-top: 0;\n  border-top-right-radius: 3px;\n  border-top-left-radius: 3px;\n}\n.panel > .list-group:last-child .list-group-item:last-child,\n.panel > .panel-collapse > .list-group:last-child .list-group-item:last-child {\n  border-bottom: 0;\n  border-bottom-right-radius: 3px;\n  border-bottom-left-radius: 3px;\n}\n.panel-heading + .list-group .list-group-item:first-child {\n  border-top-width: 0;\n}\n.list-group + .panel-footer {\n  border-top-width: 0;\n}\n.panel > .table,\n.panel > .table-responsive > .table,\n.panel > .panel-collapse > .table {\n  margin-bottom: 0;\n}\n.panel > .table caption,\n.panel > .table-responsive > .table caption,\n.panel > .panel-collapse > .table caption {\n  padding-left: 15px;\n  padding-right: 15px;\n}\n.panel > .table:first-child,\n.panel > .table-responsive:first-child > .table:first-child {\n  border-top-right-radius: 3px;\n  border-top-left-radius: 3px;\n}\n.panel > .table:first-child > thead:first-child > tr:first-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child {\n  border-top-left-radius: 3px;\n  border-top-right-radius: 3px;\n}\n.panel > .table:first-child > thead:first-child > tr:first-child td:first-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:first-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child td:first-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:first-child,\n.panel > .table:first-child > thead:first-child > tr:first-child th:first-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:first-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child th:first-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:first-child {\n  border-top-left-radius: 3px;\n}\n.panel > .table:first-child > thead:first-child > tr:first-child td:last-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:last-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child td:last-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:last-child,\n.panel > .table:first-child > thead:first-child > tr:first-child th:last-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:last-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child th:last-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:last-child {\n  border-top-right-radius: 3px;\n}\n.panel > .table:last-child,\n.panel > .table-responsive:last-child > .table:last-child {\n  border-bottom-right-radius: 3px;\n  border-bottom-left-radius: 3px;\n}\n.panel > .table:last-child > tbody:last-child > tr:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child {\n  border-bottom-left-radius: 3px;\n  border-bottom-right-radius: 3px;\n}\n.panel > .table:last-child > tbody:last-child > tr:last-child td:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:first-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child td:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:first-child,\n.panel > .table:last-child > tbody:last-child > tr:last-child th:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:first-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child th:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:first-child {\n  border-bottom-left-radius: 3px;\n}\n.panel > .table:last-child > tbody:last-child > tr:last-child td:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:last-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child td:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:last-child,\n.panel > .table:last-child > tbody:last-child > tr:last-child th:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:last-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child th:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:last-child {\n  border-bottom-right-radius: 3px;\n}\n.panel > .panel-body + .table,\n.panel > .panel-body + .table-responsive,\n.panel > .table + .panel-body,\n.panel > .table-responsive + .panel-body {\n  border-top: 1px solid #ddd;\n}\n.panel > .table > tbody:first-child > tr:first-child th,\n.panel > .table > tbody:first-child > tr:first-child td {\n  border-top: 0;\n}\n.panel > .table-bordered,\n.panel > .table-responsive > .table-bordered {\n  border: 0;\n}\n.panel > .table-bordered > thead > tr > th:first-child,\n.panel > .table-responsive > .table-bordered > thead > tr > th:first-child,\n.panel > .table-bordered > tbody > tr > th:first-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > th:first-child,\n.panel > .table-bordered > tfoot > tr > th:first-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > th:first-child,\n.panel > .table-bordered > thead > tr > td:first-child,\n.panel > .table-responsive > .table-bordered > thead > tr > td:first-child,\n.panel > .table-bordered > tbody > tr > td:first-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > td:first-child,\n.panel > .table-bordered > tfoot > tr > td:first-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > td:first-child {\n  border-left: 0;\n}\n.panel > .table-bordered > thead > tr > th:last-child,\n.panel > .table-responsive > .table-bordered > thead > tr > th:last-child,\n.panel > .table-bordered > tbody > tr > th:last-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > th:last-child,\n.panel > .table-bordered > tfoot > tr > th:last-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > th:last-child,\n.panel > .table-bordered > thead > tr > td:last-child,\n.panel > .table-responsive > .table-bordered > thead > tr > td:last-child,\n.panel > .table-bordered > tbody > tr > td:last-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > td:last-child,\n.panel > .table-bordered > tfoot > tr > td:last-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > td:last-child {\n  border-right: 0;\n}\n.panel > .table-bordered > thead > tr:first-child > td,\n.panel > .table-responsive > .table-bordered > thead > tr:first-child > td,\n.panel > .table-bordered > tbody > tr:first-child > td,\n.panel > .table-responsive > .table-bordered > tbody > tr:first-child > td,\n.panel > .table-bordered > thead > tr:first-child > th,\n.panel > .table-responsive > .table-bordered > thead > tr:first-child > th,\n.panel > .table-bordered > tbody > tr:first-child > th,\n.panel > .table-responsive > .table-bordered > tbody > tr:first-child > th {\n  border-bottom: 0;\n}\n.panel > .table-bordered > tbody > tr:last-child > td,\n.panel > .table-responsive > .table-bordered > tbody > tr:last-child > td,\n.panel > .table-bordered > tfoot > tr:last-child > td,\n.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > td,\n.panel > .table-bordered > tbody > tr:last-child > th,\n.panel > .table-responsive > .table-bordered > tbody > tr:last-child > th,\n.panel > .table-bordered > tfoot > tr:last-child > th,\n.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > th {\n  border-bottom: 0;\n}\n.panel > .table-responsive {\n  border: 0;\n  margin-bottom: 0;\n}\n.panel-group {\n  margin-bottom: 20px;\n}\n.panel-group .panel {\n  margin-bottom: 0;\n  border-radius: 4px;\n}\n.panel-group .panel + .panel {\n  margin-top: 5px;\n}\n.panel-group .panel-heading {\n  border-bottom: 0;\n}\n.panel-group .panel-heading + .panel-collapse > .panel-body,\n.panel-group .panel-heading + .panel-collapse > .list-group {\n  border-top: 1px solid #ccc;\n}\n.panel-group .panel-footer {\n  border-top: 0;\n}\n.panel-group .panel-footer + .panel-collapse .panel-body {\n  border-bottom: 1px solid #ccc;\n}\n.panel-default {\n  border-color: #ddd;\n}\n.panel-default > .panel-heading {\n  color: #333333;\n  background-color: #f5f5f5;\n  border-color: #ddd;\n}\n.panel-default > .panel-heading + .panel-collapse > .panel-body {\n  border-top-color: #ddd;\n}\n.panel-default > .panel-heading .badge {\n  color: #f5f5f5;\n  background-color: #333333;\n}\n.panel-default > .panel-footer + .panel-collapse > .panel-body {\n  border-bottom-color: #ddd;\n}\n.panel-primary {\n  border-color: #4CAF50;\n}\n.panel-primary > .panel-heading {\n  color: #eeeeee;\n  background-color: #4CAF50;\n  border-color: #4CAF50;\n}\n.panel-primary > .panel-heading + .panel-collapse > .panel-body {\n  border-top-color: #4CAF50;\n}\n.panel-primary > .panel-heading .badge {\n  color: #4CAF50;\n}\n.panel-primary > .panel-footer + .panel-collapse > .panel-body {\n  border-bottom-color: #4CAF50;\n}\n.panel-success {\n  border-color: #d6e9c6;\n}\n.panel-success > .panel-heading {\n  color: #215f1e;\n  background-color: #dff0d8;\n  border-color: #d6e9c6;\n}\n.panel-success > .panel-heading + .panel-collapse > .panel-body {\n  border-top-color: #d6e9c6;\n}\n.panel-success > .panel-heading .badge {\n  color: #dff0d8;\n  background-color: #215f1e;\n}\n.panel-success > .panel-footer + .panel-collapse > .panel-body {\n  border-bottom-color: #d6e9c6;\n}\n.panel-info {\n  border-color: #449d48;\n}\n.panel-info > .panel-heading {\n  color: #eeeeee;\n  background-color: #4CAF50;\n  border-color: #449d48;\n}\n.panel-info > .panel-heading + .panel-collapse > .panel-body {\n  border-top-color: #449d48;\n}\n.panel-info > .panel-heading .badge {\n  color: #4CAF50;\n}\n.panel-info > .panel-footer + .panel-collapse > .panel-body {\n  border-bottom-color: #449d48;\n}\n.panel-warning {\n  border-color: #faebcc;\n}\n.panel-warning > .panel-heading {\n  color: #8a6d3b;\n  background-color: #fcf8e3;\n  border-color: #faebcc;\n}\n.panel-warning > .panel-heading + .panel-collapse > .panel-body {\n  border-top-color: #faebcc;\n}\n.panel-warning > .panel-heading .badge {\n  color: #fcf8e3;\n  background-color: #8a6d3b;\n}\n.panel-warning > .panel-footer + .panel-collapse > .panel-body {\n  border-bottom-color: #faebcc;\n}\n.panel-danger {\n  border-color: #ebccd1;\n}\n.panel-danger > .panel-heading {\n  color: #a94442;\n  background-color: #f2dede;\n  border-color: #ebccd1;\n}\n.panel-danger > .panel-heading + .panel-collapse > .panel-body {\n  border-top-color: #ebccd1;\n}\n.panel-danger > .panel-heading .badge {\n  color: #f2dede;\n  background-color: #a94442;\n}\n.panel-danger > .panel-footer + .panel-collapse > .panel-body {\n  border-bottom-color: #ebccd1;\n}\n.embed-responsive {\n  position: relative;\n  display: block;\n  height: 0;\n  padding: 0;\n  overflow: hidden;\n}\n.embed-responsive .embed-responsive-item,\n.embed-responsive iframe,\n.embed-responsive embed,\n.embed-responsive object,\n.embed-responsive video {\n  position: absolute;\n  top: 0;\n  left: 0;\n  bottom: 0;\n  height: 100%;\n  width: 100%;\n  border: 0;\n}\n.embed-responsive.embed-responsive-16by9 {\n  padding-bottom: 56.25%;\n}\n.embed-responsive.embed-responsive-4by3 {\n  padding-bottom: 75%;\n}\n.well {\n  min-height: 20px;\n  padding: 19px;\n  margin-bottom: 20px;\n  background-color: #f5f5f5;\n  border: 1px solid #e3e3e3;\n  border-radius: 4px;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);\n  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);\n}\n.well blockquote {\n  border-color: #ddd;\n  border-color: rgba(0, 0, 0, 0.15);\n}\n.well-lg {\n  padding: 24px;\n  border-radius: 6px;\n}\n.well-sm {\n  padding: 9px;\n  border-radius: 3px;\n}\n.close {\n  float: right;\n  font-size: 21px;\n  font-weight: bold;\n  line-height: 1;\n  color: #000;\n  text-shadow: 0 1px 0 #eeeeee;\n  opacity: 0.2;\n  -ms-filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=20);\n  filter: alpha(opacity=20);\n}\n.close:hover,\n.close:focus {\n  color: #000;\n  text-decoration: none;\n  cursor: pointer;\n  opacity: 0.5;\n  -ms-filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=50);\n  filter: alpha(opacity=50);\n}\nbutton.close {\n  padding: 0;\n  cursor: pointer;\n  background: transparent;\n  border: 0;\n  -webkit-appearance: none;\n}\n.modal-open {\n  overflow: hidden;\n}\n.modal {\n  display: none;\n  overflow: hidden;\n  position: fixed;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  z-index: 1040;\n  -webkit-overflow-scrolling: touch;\n  outline: 0;\n}\n.modal.fade .modal-dialog {\n  -webkit-transform: translate(0, -25%);\n  -ms-transform: translate(0, -25%);\n  -o-transform: translate(0, -25%);\n  transform: translate(0, -25%);\n  -webkit-transition: -webkit-transform 0.3s ease-out;\n  -moz-transition: -moz-transform 0.3s ease-out;\n  -o-transition: -o-transform 0.3s ease-out;\n  transition: transform 0.3s ease-out;\n}\n.modal.in .modal-dialog {\n  -webkit-transform: translate(0, 0);\n  -ms-transform: translate(0, 0);\n  -o-transform: translate(0, 0);\n  transform: translate(0, 0);\n}\n.modal-open .modal {\n  overflow-x: hidden;\n  overflow-y: auto;\n}\n.modal-dialog {\n  position: relative;\n  width: auto;\n  margin: 10px;\n}\n.modal-content {\n  position: relative;\n  border: 1px solid #999;\n  border: 1px solid rgba(0, 0, 0, 0.2);\n  border-radius: 6px;\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  outline: 0;\n}\n.modal-backdrop {\n  position: fixed;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  background-color: #000;\n}\n.modal-backdrop.fade {\n  opacity: 0;\n  -ms-filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=0);\n  filter: alpha(opacity=0);\n}\n.modal-backdrop.in {\n  opacity: 0.5;\n  -ms-filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=50);\n  filter: alpha(opacity=50);\n}\n.modal-header {\n  padding: 15px;\n  border-bottom: 1px solid #e5e5e5;\n  min-height: 16.42857143px;\n}\n.modal-header .close {\n  margin-top: -2px;\n}\n.modal-title {\n  margin: 0;\n  line-height: 1.42857143;\n}\n.modal-body {\n  position: relative;\n  background: white;\n  padding: 15px;\n}\n.modal-footer {\n  padding: 15px;\n  text-align: right;\n  border-top: 1px solid #e5e5e5;\n}\n.modal-footer .btn + .btn {\n  margin-left: 5px;\n  margin-bottom: 0;\n}\n.modal-footer .btn-group .btn + .btn {\n  margin-left: -1px;\n}\n.modal-footer .btn-block + .btn-block {\n  margin-left: 0;\n}\n.modal-scrollbar-measure {\n  position: absolute;\n  top: -9999px;\n  width: 50px;\n  height: 50px;\n  overflow: scroll;\n}\n@media (min-width: 768px) {\n  .modal-dialog {\n    width: 600px;\n    margin: 30px auto;\n  }\n  .modal-content {\n    -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  .modal-sm {\n    width: 300px;\n  }\n}\n@media (min-width: 1031px) {\n  .modal-lg {\n    width: 900px;\n  }\n}\n.tooltip {\n  position: absolute;\n  z-index: 1070;\n  display: block;\n  visibility: visible;\n  font-size: 12px;\n  line-height: 1.4;\n  opacity: 0;\n  -ms-filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=0);\n  filter: alpha(opacity=0);\n}\n.tooltip.in {\n  opacity: 0.9;\n  -ms-filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=90);\n  filter: alpha(opacity=90);\n}\n.tooltip.top {\n  margin-top: -3px;\n  padding: 5px 0;\n}\n.tooltip.right {\n  margin-left: 3px;\n  padding: 0 5px;\n}\n.tooltip.bottom {\n  margin-top: 3px;\n  padding: 5px 0;\n}\n.tooltip.left {\n  margin-left: -3px;\n  padding: 0 5px;\n}\n.tooltip-inner {\n  max-width: 200px;\n  padding: 3px 8px;\n  color: #eeeeee;\n  text-align: center;\n  text-decoration: none;\n  background-color: #000;\n  border-radius: 4px;\n}\n.tooltip-arrow {\n  position: absolute;\n  width: 0;\n  height: 0;\n  border-color: transparent;\n  border-style: solid;\n}\n.tooltip.top .tooltip-arrow {\n  bottom: 0;\n  left: 50%;\n  margin-left: -5px;\n  border-width: 5px 5px 0;\n  border-top-color: #000;\n}\n.tooltip.top-left .tooltip-arrow {\n  bottom: 0;\n  left: 5px;\n  border-width: 5px 5px 0;\n  border-top-color: #000;\n}\n.tooltip.top-right .tooltip-arrow {\n  bottom: 0;\n  right: 5px;\n  border-width: 5px 5px 0;\n  border-top-color: #000;\n}\n.tooltip.right .tooltip-arrow {\n  top: 50%;\n  left: 0;\n  margin-top: -5px;\n  border-width: 5px 5px 5px 0;\n  border-right-color: #000;\n}\n.tooltip.left .tooltip-arrow {\n  top: 50%;\n  right: 0;\n  margin-top: -5px;\n  border-width: 5px 0 5px 5px;\n  border-left-color: #000;\n}\n.tooltip.bottom .tooltip-arrow {\n  top: 0;\n  left: 50%;\n  margin-left: -5px;\n  border-width: 0 5px 5px;\n  border-bottom-color: #000;\n}\n.tooltip.bottom-left .tooltip-arrow {\n  top: 0;\n  left: 5px;\n  border-width: 0 5px 5px;\n  border-bottom-color: #000;\n}\n.tooltip.bottom-right .tooltip-arrow {\n  top: 0;\n  right: 5px;\n  border-width: 0 5px 5px;\n  border-bottom-color: #000;\n}\n.popover {\n  position: absolute;\n  top: 0;\n  left: 0;\n  z-index: 1060;\n  display: none;\n  max-width: 276px;\n  padding: 1px;\n  font-size: 14px;\n  font-weight: normal;\n  line-height: 1.42857143;\n  text-align: left;\n  background-clip: padding-box;\n  border: 1px solid #ccc;\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  white-space: normal;\n}\n.popover.top {\n  margin-top: -10px;\n}\n.popover.right {\n  margin-left: 10px;\n}\n.popover.bottom {\n  margin-top: 10px;\n}\n.popover.left {\n  margin-left: -10px;\n}\n.popover-title {\n  margin: 0;\n  padding: 8px 14px;\n  font-size: 14px;\n  background-color: #e7e7e7;\n  border-bottom: 1px solid #dadada;\n  border-radius: 5px 5px 0 0;\n}\n.popover-content {\n  padding: 9px 14px;\n}\n.popover > .arrow,\n.popover > .arrow:after {\n  position: absolute;\n  display: block;\n  width: 0;\n  height: 0;\n  border-color: transparent;\n  border-style: solid;\n}\n.popover > .arrow {\n  border-width: 11px;\n}\n.popover > .arrow:after {\n  border-width: 10px;\n  content: \"\";\n}\n.popover.top > .arrow {\n  left: 50%;\n  margin-left: -11px;\n  border-bottom-width: 0;\n  border-top-color: #999999;\n  border-top-color: rgba(0, 0, 0, 0.25);\n  bottom: -11px;\n}\n.popover.top > .arrow:after {\n  content: \" \";\n  bottom: 1px;\n  margin-left: -10px;\n  border-bottom-width: 0;\n  border-top-color: #eeeeee;\n}\n.popover.right > .arrow {\n  top: 50%;\n  left: -11px;\n  margin-top: -11px;\n  border-left-width: 0;\n  border-right-color: #999999;\n  border-right-color: rgba(0, 0, 0, 0.25);\n}\n.popover.right > .arrow:after {\n  content: \" \";\n  left: 1px;\n  bottom: -10px;\n  border-left-width: 0;\n  border-right-color: #eeeeee;\n}\n.popover.bottom > .arrow {\n  left: 50%;\n  margin-left: -11px;\n  border-top-width: 0;\n  border-bottom-color: #999999;\n  border-bottom-color: rgba(0, 0, 0, 0.25);\n  top: -11px;\n}\n.popover.bottom > .arrow:after {\n  content: \" \";\n  top: 1px;\n  margin-left: -10px;\n  border-top-width: 0;\n  border-bottom-color: #eeeeee;\n}\n.popover.left > .arrow {\n  top: 50%;\n  right: -11px;\n  margin-top: -11px;\n  border-right-width: 0;\n  border-left-color: #999999;\n  border-left-color: rgba(0, 0, 0, 0.25);\n}\n.popover.left > .arrow:after {\n  content: \" \";\n  right: 1px;\n  border-right-width: 0;\n  border-left-color: #eeeeee;\n  bottom: -10px;\n}\n.carousel {\n  position: relative;\n}\n.carousel-inner {\n  position: relative;\n  overflow: hidden;\n  width: 100%;\n}\n.carousel-inner > .item {\n  display: none;\n  position: relative;\n  -webkit-transition: 0.6s ease-in-out left;\n  -o-transition: 0.6s ease-in-out left;\n  transition: 0.6s ease-in-out left;\n}\n.carousel-inner > .item > img,\n.carousel-inner > .item > a > img {\n  line-height: 1;\n}\n@media all and (transform-3d), (-webkit-transform-3d) {\n  .carousel-inner > .item {\n    transition: transform 0.6s ease-in-out;\n    backface-visibility: hidden;\n    perspective: 1000;\n  }\n  .carousel-inner > .item.next,\n  .carousel-inner > .item.active.right {\n    transform: translate3d(100%, 0, 0);\n    left: 0;\n  }\n  .carousel-inner > .item.prev,\n  .carousel-inner > .item.active.left {\n    transform: translate3d(-100%, 0, 0);\n    left: 0;\n  }\n  .carousel-inner > .item.next.left,\n  .carousel-inner > .item.prev.right,\n  .carousel-inner > .item.active {\n    transform: translate3d(0, 0, 0);\n    left: 0;\n  }\n}\n.carousel-inner > .active,\n.carousel-inner > .next,\n.carousel-inner > .prev {\n  display: block;\n}\n.carousel-inner > .active {\n  left: 0;\n}\n.carousel-inner > .next,\n.carousel-inner > .prev {\n  position: absolute;\n  top: 0;\n  width: 100%;\n}\n.carousel-inner > .next {\n  left: 100%;\n}\n.carousel-inner > .prev {\n  left: -100%;\n}\n.carousel-inner > .next.left,\n.carousel-inner > .prev.right {\n  left: 0;\n}\n.carousel-inner > .active.left {\n  left: -100%;\n}\n.carousel-inner > .active.right {\n  left: 100%;\n}\n.carousel-control {\n  position: absolute;\n  top: 0;\n  left: 0;\n  bottom: 0;\n  width: 15%;\n  opacity: 0.5;\n  -ms-filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=50);\n  filter: alpha(opacity=50);\n  font-size: 20px;\n  color: #eeeeee;\n  text-align: center;\n  text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6);\n}\n.carousel-control.left {\n  background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%);\n  background-image: -o-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.carousel-control.right {\n  left: auto;\n  right: 0;\n  background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%);\n  background-image: -o-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.carousel-control:hover,\n.carousel-control:focus {\n  outline: 0;\n  color: #eeeeee;\n  text-decoration: none;\n  opacity: 0.9;\n  -ms-filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=90);\n  filter: alpha(opacity=90);\n}\n.carousel-control .icon-prev,\n.carousel-control .icon-next,\n.carousel-control .glyphicon-chevron-left,\n.carousel-control .glyphicon-chevron-right {\n  position: absolute;\n  top: 50%;\n  z-index: 5;\n  display: inline-block;\n}\n.carousel-control .icon-prev,\n.carousel-control .glyphicon-chevron-left {\n  left: 50%;\n  margin-left: -10px;\n}\n.carousel-control .icon-next,\n.carousel-control .glyphicon-chevron-right {\n  right: 50%;\n  margin-right: -10px;\n}\n.carousel-control .icon-prev,\n.carousel-control .icon-next {\n  width: 20px;\n  height: 20px;\n  margin-top: -10px;\n  font-family: serif;\n}\n.carousel-control .icon-prev:before {\n  content: '\\2039';\n}\n.carousel-control .icon-next:before {\n  content: '\\203a';\n}\n.carousel-indicators {\n  position: absolute;\n  bottom: 10px;\n  left: 50%;\n  z-index: 15;\n  width: 60%;\n  margin-left: -30%;\n  padding-left: 0;\n  list-style: none;\n  text-align: center;\n}\n.carousel-indicators li {\n  display: inline-block;\n  width: 10px;\n  height: 10px;\n  margin: 1px;\n  text-indent: -999px;\n  border: 1px solid #eeeeee;\n  border-radius: 10px;\n  cursor: pointer;\n  background-color: #000 \\9;\n  background-color: rgba(0, 0, 0, 0);\n}\n.carousel-indicators .active {\n  margin: 0;\n  width: 12px;\n  height: 12px;\n}\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: #eeeeee;\n  text-align: center;\n  text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6);\n}\n.carousel-caption .btn {\n  text-shadow: none;\n}\n@media screen and (min-width: 768px) {\n  .carousel-control .glyphicon-chevron-left,\n  .carousel-control .glyphicon-chevron-right,\n  .carousel-control .icon-prev,\n  .carousel-control .icon-next {\n    width: 30px;\n    height: 30px;\n    margin-top: -15px;\n    font-size: 30px;\n  }\n  .carousel-control .glyphicon-chevron-left,\n  .carousel-control .icon-prev {\n    margin-left: -15px;\n  }\n  .carousel-control .glyphicon-chevron-right,\n  .carousel-control .icon-next {\n    margin-right: -15px;\n  }\n  .carousel-caption {\n    left: 20%;\n    right: 20%;\n    padding-bottom: 30px;\n  }\n  .carousel-indicators {\n    bottom: 20px;\n  }\n}\n.clearfix:before,\n.clearfix:after,\n.dl-horizontal dd:before,\n.dl-horizontal dd:after,\n.container:before,\n.container:after,\n.container-fluid:before,\n.container-fluid:after,\n.row:before,\n.row:after,\n.form-horizontal .form-group:before,\n.form-horizontal .form-group:after,\n.btn-toolbar:before,\n.btn-toolbar:after,\n.btn-group-vertical > .btn-group:before,\n.btn-group-vertical > .btn-group:after,\n.nav:before,\n.nav:after,\n.navbar:before,\n.navbar:after,\n.navbar-header:before,\n.navbar-header:after,\n.navbar-collapse:before,\n.navbar-collapse:after,\n.pager:before,\n.pager:after,\n.panel-body:before,\n.panel-body:after,\n.modal-footer:before,\n.modal-footer:after {\n  content: \" \";\n  display: table;\n}\n.clearfix:after,\n.dl-horizontal dd:after,\n.container:after,\n.container-fluid:after,\n.row:after,\n.form-horizontal .form-group:after,\n.btn-toolbar:after,\n.btn-group-vertical > .btn-group:after,\n.nav:after,\n.navbar:after,\n.navbar-header:after,\n.navbar-collapse:after,\n.pager:after,\n.panel-body:after,\n.modal-footer:after {\n  clear: both;\n}\n.center-block {\n  display: block;\n  margin-left: auto;\n  margin-right: auto;\n}\n.pull-right {\n  float: right !important;\n}\n.pull-left {\n  float: left !important;\n}\n.hide {\n  display: none !important;\n}\n.show {\n  display: block !important;\n}\n.invisible {\n  visibility: hidden;\n}\n.text-hide {\n  font: 0/0 a;\n  color: transparent;\n  text-shadow: none;\n  background-color: transparent;\n  border: 0;\n}\n.hidden {\n  display: none !important;\n  visibility: hidden !important;\n}\n.affix {\n  position: fixed;\n}\n@-ms-viewport {\n  width: device-width;\n}\n.visible-xs,\n.visible-sm,\n.visible-md,\n.visible-lg {\n  display: none !important;\n}\n.visible-xs-block,\n.visible-xs-inline,\n.visible-xs-inline-block,\n.visible-sm-block,\n.visible-sm-inline,\n.visible-sm-inline-block,\n.visible-md-block,\n.visible-md-inline,\n.visible-md-inline-block,\n.visible-lg-block,\n.visible-lg-inline,\n.visible-lg-inline-block {\n  display: none !important;\n}\n@media (max-width: 767px) {\n  .visible-xs {\n    display: block !important;\n  }\n  table.visible-xs {\n    display: table;\n  }\n  tr.visible-xs {\n    display: table-row !important;\n  }\n  th.visible-xs,\n  td.visible-xs {\n    display: table-cell !important;\n  }\n}\n@media (max-width: 767px) {\n  .visible-xs-block {\n    display: block !important;\n  }\n}\n@media (max-width: 767px) {\n  .visible-xs-inline {\n    display: inline !important;\n  }\n}\n@media (max-width: 767px) {\n  .visible-xs-inline-block {\n    display: inline-block !important;\n  }\n}\n@media (min-width: 768px) and (max-width: 1030px) {\n  .visible-sm {\n    display: block !important;\n  }\n  table.visible-sm {\n    display: table;\n  }\n  tr.visible-sm {\n    display: table-row !important;\n  }\n  th.visible-sm,\n  td.visible-sm {\n    display: table-cell !important;\n  }\n}\n@media (min-width: 768px) and (max-width: 1030px) {\n  .visible-sm-block {\n    display: block !important;\n  }\n}\n@media (min-width: 768px) and (max-width: 1030px) {\n  .visible-sm-inline {\n    display: inline !important;\n  }\n}\n@media (min-width: 768px) and (max-width: 1030px) {\n  .visible-sm-inline-block {\n    display: inline-block !important;\n  }\n}\n@media (min-width: 1031px) and (max-width: 1199px) {\n  .visible-md {\n    display: block !important;\n  }\n  table.visible-md {\n    display: table;\n  }\n  tr.visible-md {\n    display: table-row !important;\n  }\n  th.visible-md,\n  td.visible-md {\n    display: table-cell !important;\n  }\n}\n@media (min-width: 1031px) and (max-width: 1199px) {\n  .visible-md-block {\n    display: block !important;\n  }\n}\n@media (min-width: 1031px) and (max-width: 1199px) {\n  .visible-md-inline {\n    display: inline !important;\n  }\n}\n@media (min-width: 1031px) and (max-width: 1199px) {\n  .visible-md-inline-block {\n    display: inline-block !important;\n  }\n}\n@media (min-width: 1200px) {\n  .visible-lg {\n    display: block !important;\n  }\n  table.visible-lg {\n    display: table;\n  }\n  tr.visible-lg {\n    display: table-row !important;\n  }\n  th.visible-lg,\n  td.visible-lg {\n    display: table-cell !important;\n  }\n}\n@media (min-width: 1200px) {\n  .visible-lg-block {\n    display: block !important;\n  }\n}\n@media (min-width: 1200px) {\n  .visible-lg-inline {\n    display: inline !important;\n  }\n}\n@media (min-width: 1200px) {\n  .visible-lg-inline-block {\n    display: inline-block !important;\n  }\n}\n@media (max-width: 767px) {\n  .hidden-xs {\n    display: none !important;\n  }\n}\n@media (min-width: 768px) and (max-width: 1030px) {\n  .hidden-sm {\n    display: none !important;\n  }\n}\n@media (min-width: 1031px) and (max-width: 1199px) {\n  .hidden-md {\n    display: none !important;\n  }\n}\n@media (min-width: 1200px) {\n  .hidden-lg {\n    display: none !important;\n  }\n}\n.visible-print {\n  display: none !important;\n}\n@media print {\n  .visible-print {\n    display: block !important;\n  }\n  table.visible-print {\n    display: table;\n  }\n  tr.visible-print {\n    display: table-row !important;\n  }\n  th.visible-print,\n  td.visible-print {\n    display: table-cell !important;\n  }\n}\n.visible-print-block {\n  display: none !important;\n}\n@media print {\n  .visible-print-block {\n    display: block !important;\n  }\n}\n.visible-print-inline {\n  display: none !important;\n}\n@media print {\n  .visible-print-inline {\n    display: inline !important;\n  }\n}\n.visible-print-inline-block {\n  display: none !important;\n}\n@media print {\n  .visible-print-inline-block {\n    display: inline-block !important;\n  }\n}\n@media print {\n  .hidden-print {\n    display: none !important;\n  }\n}\n/*\n * Social Buttons for Bootstrap\n *\n * Copyright 2013-2014 Panayiotis Lipiridis\n * Licensed under the MIT License\n *\n * https://github.com/lipis/bootstrap-social\n */\n.btn-social {\n  position: relative;\n  padding-left: 44px;\n  text-align: left;\n  white-space: nowrap;\n  overflow: hidden;\n  text-overflow: ellipsis;\n}\n.btn-social > :first-child {\n  position: absolute;\n  left: 0;\n  top: 0;\n  bottom: 0;\n  width: 32px;\n  line-height: 34px;\n  font-size: 1.6em;\n  text-align: center;\n  border-right: 1px solid rgba(0, 0, 0, 0.2);\n}\n.btn-social.btn-lg {\n  padding-left: 61px;\n}\n.btn-social.btn-lg :first-child {\n  line-height: 45px;\n  width: 45px;\n  font-size: 1.8em;\n}\n.btn-social.btn-sm {\n  padding-left: 38px;\n}\n.btn-social.btn-sm :first-child {\n  line-height: 28px;\n  width: 28px;\n  font-size: 1.4em;\n}\n.btn-social.btn-xs {\n  padding-left: 30px;\n}\n.btn-social.btn-xs :first-child {\n  line-height: 20px;\n  width: 20px;\n  font-size: 1.2em;\n}\n.btn-social-icon {\n  position: relative;\n  padding-left: 44px;\n  text-align: left;\n  white-space: nowrap;\n  overflow: hidden;\n  text-overflow: ellipsis;\n  width: 250px;\n  margin: auto;\n  height: 34px;\n  width: 34px;\n  padding: 0;\n}\n.btn-social-icon > :first-child {\n  position: absolute;\n  left: 0;\n  top: 0;\n  bottom: 0;\n  width: 32px;\n  line-height: 34px;\n  font-size: 1.6em;\n  text-align: center;\n  border-right: 1px solid rgba(0, 0, 0, 0.2);\n}\n.btn-social-icon.btn-lg {\n  padding-left: 61px;\n}\n.btn-social-icon.btn-lg :first-child {\n  line-height: 45px;\n  width: 45px;\n  font-size: 1.8em;\n}\n.btn-social-icon.btn-sm {\n  padding-left: 38px;\n}\n.btn-social-icon.btn-sm :first-child {\n  line-height: 28px;\n  width: 28px;\n  font-size: 1.4em;\n}\n.btn-social-icon.btn-xs {\n  padding-left: 30px;\n}\n.btn-social-icon.btn-xs :first-child {\n  line-height: 20px;\n  width: 20px;\n  font-size: 1.2em;\n}\n.btn-social-icon :first-child {\n  border: none;\n  text-align: center;\n  width: 100%!important;\n}\n.btn-social-icon.btn-lg {\n  height: 45px;\n  width: 45px;\n  padding-left: 0;\n  padding-right: 0;\n}\n.btn-social-icon.btn-sm {\n  height: 30px;\n  width: 30px;\n  padding-left: 0;\n  padding-right: 0;\n}\n.btn-social-icon.btn-xs {\n  height: 22px;\n  width: 22px;\n  padding-left: 0;\n  padding-right: 0;\n}\n.btn-adn {\n  color: #d87a68;\n  background-color: #d87a68;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-adn:hover,\n.btn-adn:focus,\n.btn-adn.focus,\n.btn-adn:active,\n.btn-adn.active,\n.open > .dropdown-toggle.btn-adn {\n  color: #eeeeee;\n  background-color: #d87a68;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-adn:active,\n.btn-adn.active,\n.open > .dropdown-toggle.btn-adn {\n  background-image: none;\n}\n.btn-adn.disabled,\n.btn-adn[disabled],\nfieldset[disabled] .btn-adn,\n.btn-adn.disabled:hover,\n.btn-adn[disabled]:hover,\nfieldset[disabled] .btn-adn:hover,\n.btn-adn.disabled:focus,\n.btn-adn[disabled]:focus,\nfieldset[disabled] .btn-adn:focus,\n.btn-adn.disabled.focus,\n.btn-adn[disabled].focus,\nfieldset[disabled] .btn-adn.focus,\n.btn-adn.disabled:active,\n.btn-adn[disabled]:active,\nfieldset[disabled] .btn-adn:active,\n.btn-adn.disabled.active,\n.btn-adn[disabled].active,\nfieldset[disabled] .btn-adn.active {\n  background-color: #d87a68;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-adn .badge {\n  color: #d87a68;\n  background-color: #d87a68;\n}\n.btn-bitbucket {\n  color: #205081;\n  background-color: #205081;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-bitbucket:hover,\n.btn-bitbucket:focus,\n.btn-bitbucket.focus,\n.btn-bitbucket:active,\n.btn-bitbucket.active,\n.open > .dropdown-toggle.btn-bitbucket {\n  color: #eeeeee;\n  background-color: #205081;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-bitbucket:active,\n.btn-bitbucket.active,\n.open > .dropdown-toggle.btn-bitbucket {\n  background-image: none;\n}\n.btn-bitbucket.disabled,\n.btn-bitbucket[disabled],\nfieldset[disabled] .btn-bitbucket,\n.btn-bitbucket.disabled:hover,\n.btn-bitbucket[disabled]:hover,\nfieldset[disabled] .btn-bitbucket:hover,\n.btn-bitbucket.disabled:focus,\n.btn-bitbucket[disabled]:focus,\nfieldset[disabled] .btn-bitbucket:focus,\n.btn-bitbucket.disabled.focus,\n.btn-bitbucket[disabled].focus,\nfieldset[disabled] .btn-bitbucket.focus,\n.btn-bitbucket.disabled:active,\n.btn-bitbucket[disabled]:active,\nfieldset[disabled] .btn-bitbucket:active,\n.btn-bitbucket.disabled.active,\n.btn-bitbucket[disabled].active,\nfieldset[disabled] .btn-bitbucket.active {\n  background-color: #205081;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-bitbucket .badge {\n  color: #205081;\n  background-color: #205081;\n}\n.btn-dropbox {\n  color: #1087dd;\n  background-color: #1087dd;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-dropbox:hover,\n.btn-dropbox:focus,\n.btn-dropbox.focus,\n.btn-dropbox:active,\n.btn-dropbox.active,\n.open > .dropdown-toggle.btn-dropbox {\n  color: #eeeeee;\n  background-color: #1087dd;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-dropbox:active,\n.btn-dropbox.active,\n.open > .dropdown-toggle.btn-dropbox {\n  background-image: none;\n}\n.btn-dropbox.disabled,\n.btn-dropbox[disabled],\nfieldset[disabled] .btn-dropbox,\n.btn-dropbox.disabled:hover,\n.btn-dropbox[disabled]:hover,\nfieldset[disabled] .btn-dropbox:hover,\n.btn-dropbox.disabled:focus,\n.btn-dropbox[disabled]:focus,\nfieldset[disabled] .btn-dropbox:focus,\n.btn-dropbox.disabled.focus,\n.btn-dropbox[disabled].focus,\nfieldset[disabled] .btn-dropbox.focus,\n.btn-dropbox.disabled:active,\n.btn-dropbox[disabled]:active,\nfieldset[disabled] .btn-dropbox:active,\n.btn-dropbox.disabled.active,\n.btn-dropbox[disabled].active,\nfieldset[disabled] .btn-dropbox.active {\n  background-color: #1087dd;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-dropbox .badge {\n  color: #1087dd;\n  background-color: #1087dd;\n}\n.btn-facebook {\n  color: #3b5998;\n  background-color: #3b5998;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-facebook:hover,\n.btn-facebook:focus,\n.btn-facebook.focus,\n.btn-facebook:active,\n.btn-facebook.active,\n.open > .dropdown-toggle.btn-facebook {\n  color: #eeeeee;\n  background-color: #3b5998;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-facebook:active,\n.btn-facebook.active,\n.open > .dropdown-toggle.btn-facebook {\n  background-image: none;\n}\n.btn-facebook.disabled,\n.btn-facebook[disabled],\nfieldset[disabled] .btn-facebook,\n.btn-facebook.disabled:hover,\n.btn-facebook[disabled]:hover,\nfieldset[disabled] .btn-facebook:hover,\n.btn-facebook.disabled:focus,\n.btn-facebook[disabled]:focus,\nfieldset[disabled] .btn-facebook:focus,\n.btn-facebook.disabled.focus,\n.btn-facebook[disabled].focus,\nfieldset[disabled] .btn-facebook.focus,\n.btn-facebook.disabled:active,\n.btn-facebook[disabled]:active,\nfieldset[disabled] .btn-facebook:active,\n.btn-facebook.disabled.active,\n.btn-facebook[disabled].active,\nfieldset[disabled] .btn-facebook.active {\n  background-color: #3b5998;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-facebook .badge {\n  color: #3b5998;\n  background-color: #3b5998;\n}\n.btn-flickr {\n  color: #ff0084;\n  background-color: #ff0084;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-flickr:hover,\n.btn-flickr:focus,\n.btn-flickr.focus,\n.btn-flickr:active,\n.btn-flickr.active,\n.open > .dropdown-toggle.btn-flickr {\n  color: #eeeeee;\n  background-color: #ff0084;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-flickr:active,\n.btn-flickr.active,\n.open > .dropdown-toggle.btn-flickr {\n  background-image: none;\n}\n.btn-flickr.disabled,\n.btn-flickr[disabled],\nfieldset[disabled] .btn-flickr,\n.btn-flickr.disabled:hover,\n.btn-flickr[disabled]:hover,\nfieldset[disabled] .btn-flickr:hover,\n.btn-flickr.disabled:focus,\n.btn-flickr[disabled]:focus,\nfieldset[disabled] .btn-flickr:focus,\n.btn-flickr.disabled.focus,\n.btn-flickr[disabled].focus,\nfieldset[disabled] .btn-flickr.focus,\n.btn-flickr.disabled:active,\n.btn-flickr[disabled]:active,\nfieldset[disabled] .btn-flickr:active,\n.btn-flickr.disabled.active,\n.btn-flickr[disabled].active,\nfieldset[disabled] .btn-flickr.active {\n  background-color: #ff0084;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-flickr .badge {\n  color: #ff0084;\n  background-color: #ff0084;\n}\n.btn-foursquare {\n  color: #f94877;\n  background-color: #f94877;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-foursquare:hover,\n.btn-foursquare:focus,\n.btn-foursquare.focus,\n.btn-foursquare:active,\n.btn-foursquare.active,\n.open > .dropdown-toggle.btn-foursquare {\n  color: #eeeeee;\n  background-color: #f94877;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-foursquare:active,\n.btn-foursquare.active,\n.open > .dropdown-toggle.btn-foursquare {\n  background-image: none;\n}\n.btn-foursquare.disabled,\n.btn-foursquare[disabled],\nfieldset[disabled] .btn-foursquare,\n.btn-foursquare.disabled:hover,\n.btn-foursquare[disabled]:hover,\nfieldset[disabled] .btn-foursquare:hover,\n.btn-foursquare.disabled:focus,\n.btn-foursquare[disabled]:focus,\nfieldset[disabled] .btn-foursquare:focus,\n.btn-foursquare.disabled.focus,\n.btn-foursquare[disabled].focus,\nfieldset[disabled] .btn-foursquare.focus,\n.btn-foursquare.disabled:active,\n.btn-foursquare[disabled]:active,\nfieldset[disabled] .btn-foursquare:active,\n.btn-foursquare.disabled.active,\n.btn-foursquare[disabled].active,\nfieldset[disabled] .btn-foursquare.active {\n  background-color: #f94877;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-foursquare .badge {\n  color: #f94877;\n  background-color: #f94877;\n}\n.btn-github {\n  color: #444444;\n  background-color: #444444;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-github:hover,\n.btn-github:focus,\n.btn-github.focus,\n.btn-github:active,\n.btn-github.active,\n.open > .dropdown-toggle.btn-github {\n  color: #eeeeee;\n  background-color: #444444;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-github:active,\n.btn-github.active,\n.open > .dropdown-toggle.btn-github {\n  background-image: none;\n}\n.btn-github.disabled,\n.btn-github[disabled],\nfieldset[disabled] .btn-github,\n.btn-github.disabled:hover,\n.btn-github[disabled]:hover,\nfieldset[disabled] .btn-github:hover,\n.btn-github.disabled:focus,\n.btn-github[disabled]:focus,\nfieldset[disabled] .btn-github:focus,\n.btn-github.disabled.focus,\n.btn-github[disabled].focus,\nfieldset[disabled] .btn-github.focus,\n.btn-github.disabled:active,\n.btn-github[disabled]:active,\nfieldset[disabled] .btn-github:active,\n.btn-github.disabled.active,\n.btn-github[disabled].active,\nfieldset[disabled] .btn-github.active {\n  background-color: #444444;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-github .badge {\n  color: #444444;\n  background-color: #444444;\n}\n.btn-google-plus {\n  color: #dd4b39;\n  background-color: #dd4b39;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-google-plus:hover,\n.btn-google-plus:focus,\n.btn-google-plus.focus,\n.btn-google-plus:active,\n.btn-google-plus.active,\n.open > .dropdown-toggle.btn-google-plus {\n  color: #eeeeee;\n  background-color: #dd4b39;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-google-plus:active,\n.btn-google-plus.active,\n.open > .dropdown-toggle.btn-google-plus {\n  background-image: none;\n}\n.btn-google-plus.disabled,\n.btn-google-plus[disabled],\nfieldset[disabled] .btn-google-plus,\n.btn-google-plus.disabled:hover,\n.btn-google-plus[disabled]:hover,\nfieldset[disabled] .btn-google-plus:hover,\n.btn-google-plus.disabled:focus,\n.btn-google-plus[disabled]:focus,\nfieldset[disabled] .btn-google-plus:focus,\n.btn-google-plus.disabled.focus,\n.btn-google-plus[disabled].focus,\nfieldset[disabled] .btn-google-plus.focus,\n.btn-google-plus.disabled:active,\n.btn-google-plus[disabled]:active,\nfieldset[disabled] .btn-google-plus:active,\n.btn-google-plus.disabled.active,\n.btn-google-plus[disabled].active,\nfieldset[disabled] .btn-google-plus.active {\n  background-color: #dd4b39;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-google-plus .badge {\n  color: #dd4b39;\n  background-color: #dd4b39;\n}\n.btn-instagram {\n  color: #3f729b;\n  background-color: #3f729b;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-instagram:hover,\n.btn-instagram:focus,\n.btn-instagram.focus,\n.btn-instagram:active,\n.btn-instagram.active,\n.open > .dropdown-toggle.btn-instagram {\n  color: #eeeeee;\n  background-color: #3f729b;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-instagram:active,\n.btn-instagram.active,\n.open > .dropdown-toggle.btn-instagram {\n  background-image: none;\n}\n.btn-instagram.disabled,\n.btn-instagram[disabled],\nfieldset[disabled] .btn-instagram,\n.btn-instagram.disabled:hover,\n.btn-instagram[disabled]:hover,\nfieldset[disabled] .btn-instagram:hover,\n.btn-instagram.disabled:focus,\n.btn-instagram[disabled]:focus,\nfieldset[disabled] .btn-instagram:focus,\n.btn-instagram.disabled.focus,\n.btn-instagram[disabled].focus,\nfieldset[disabled] .btn-instagram.focus,\n.btn-instagram.disabled:active,\n.btn-instagram[disabled]:active,\nfieldset[disabled] .btn-instagram:active,\n.btn-instagram.disabled.active,\n.btn-instagram[disabled].active,\nfieldset[disabled] .btn-instagram.active {\n  background-color: #3f729b;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-instagram .badge {\n  color: #3f729b;\n  background-color: #3f729b;\n}\n.btn-linkedin {\n  color: #007bb6;\n  background-color: #007bb6;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-linkedin:hover,\n.btn-linkedin:focus,\n.btn-linkedin.focus,\n.btn-linkedin:active,\n.btn-linkedin.active,\n.open > .dropdown-toggle.btn-linkedin {\n  color: #eeeeee;\n  background-color: #007bb6;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-linkedin:active,\n.btn-linkedin.active,\n.open > .dropdown-toggle.btn-linkedin {\n  background-image: none;\n}\n.btn-linkedin.disabled,\n.btn-linkedin[disabled],\nfieldset[disabled] .btn-linkedin,\n.btn-linkedin.disabled:hover,\n.btn-linkedin[disabled]:hover,\nfieldset[disabled] .btn-linkedin:hover,\n.btn-linkedin.disabled:focus,\n.btn-linkedin[disabled]:focus,\nfieldset[disabled] .btn-linkedin:focus,\n.btn-linkedin.disabled.focus,\n.btn-linkedin[disabled].focus,\nfieldset[disabled] .btn-linkedin.focus,\n.btn-linkedin.disabled:active,\n.btn-linkedin[disabled]:active,\nfieldset[disabled] .btn-linkedin:active,\n.btn-linkedin.disabled.active,\n.btn-linkedin[disabled].active,\nfieldset[disabled] .btn-linkedin.active {\n  background-color: #007bb6;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-linkedin .badge {\n  color: #007bb6;\n  background-color: #007bb6;\n}\n.btn-microsoft {\n  color: #2672ec;\n  background-color: #2672ec;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-microsoft:hover,\n.btn-microsoft:focus,\n.btn-microsoft.focus,\n.btn-microsoft:active,\n.btn-microsoft.active,\n.open > .dropdown-toggle.btn-microsoft {\n  color: #eeeeee;\n  background-color: #2672ec;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-microsoft:active,\n.btn-microsoft.active,\n.open > .dropdown-toggle.btn-microsoft {\n  background-image: none;\n}\n.btn-microsoft.disabled,\n.btn-microsoft[disabled],\nfieldset[disabled] .btn-microsoft,\n.btn-microsoft.disabled:hover,\n.btn-microsoft[disabled]:hover,\nfieldset[disabled] .btn-microsoft:hover,\n.btn-microsoft.disabled:focus,\n.btn-microsoft[disabled]:focus,\nfieldset[disabled] .btn-microsoft:focus,\n.btn-microsoft.disabled.focus,\n.btn-microsoft[disabled].focus,\nfieldset[disabled] .btn-microsoft.focus,\n.btn-microsoft.disabled:active,\n.btn-microsoft[disabled]:active,\nfieldset[disabled] .btn-microsoft:active,\n.btn-microsoft.disabled.active,\n.btn-microsoft[disabled].active,\nfieldset[disabled] .btn-microsoft.active {\n  background-color: #2672ec;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-microsoft .badge {\n  color: #2672ec;\n  background-color: #2672ec;\n}\n.btn-openid {\n  color: #f7931e;\n  background-color: #f7931e;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-openid:hover,\n.btn-openid:focus,\n.btn-openid.focus,\n.btn-openid:active,\n.btn-openid.active,\n.open > .dropdown-toggle.btn-openid {\n  color: #eeeeee;\n  background-color: #f7931e;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-openid:active,\n.btn-openid.active,\n.open > .dropdown-toggle.btn-openid {\n  background-image: none;\n}\n.btn-openid.disabled,\n.btn-openid[disabled],\nfieldset[disabled] .btn-openid,\n.btn-openid.disabled:hover,\n.btn-openid[disabled]:hover,\nfieldset[disabled] .btn-openid:hover,\n.btn-openid.disabled:focus,\n.btn-openid[disabled]:focus,\nfieldset[disabled] .btn-openid:focus,\n.btn-openid.disabled.focus,\n.btn-openid[disabled].focus,\nfieldset[disabled] .btn-openid.focus,\n.btn-openid.disabled:active,\n.btn-openid[disabled]:active,\nfieldset[disabled] .btn-openid:active,\n.btn-openid.disabled.active,\n.btn-openid[disabled].active,\nfieldset[disabled] .btn-openid.active {\n  background-color: #f7931e;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-openid .badge {\n  color: #f7931e;\n  background-color: #f7931e;\n}\n.btn-pinterest {\n  color: #cb2027;\n  background-color: #cb2027;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-pinterest:hover,\n.btn-pinterest:focus,\n.btn-pinterest.focus,\n.btn-pinterest:active,\n.btn-pinterest.active,\n.open > .dropdown-toggle.btn-pinterest {\n  color: #eeeeee;\n  background-color: #cb2027;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-pinterest:active,\n.btn-pinterest.active,\n.open > .dropdown-toggle.btn-pinterest {\n  background-image: none;\n}\n.btn-pinterest.disabled,\n.btn-pinterest[disabled],\nfieldset[disabled] .btn-pinterest,\n.btn-pinterest.disabled:hover,\n.btn-pinterest[disabled]:hover,\nfieldset[disabled] .btn-pinterest:hover,\n.btn-pinterest.disabled:focus,\n.btn-pinterest[disabled]:focus,\nfieldset[disabled] .btn-pinterest:focus,\n.btn-pinterest.disabled.focus,\n.btn-pinterest[disabled].focus,\nfieldset[disabled] .btn-pinterest.focus,\n.btn-pinterest.disabled:active,\n.btn-pinterest[disabled]:active,\nfieldset[disabled] .btn-pinterest:active,\n.btn-pinterest.disabled.active,\n.btn-pinterest[disabled].active,\nfieldset[disabled] .btn-pinterest.active {\n  background-color: #cb2027;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-pinterest .badge {\n  color: #cb2027;\n  background-color: #cb2027;\n}\n.btn-reddit {\n  color: #000;\n  background-color: #eff7ff;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-reddit:hover,\n.btn-reddit:focus,\n.btn-reddit.focus,\n.btn-reddit:active,\n.btn-reddit.active,\n.open > .dropdown-toggle.btn-reddit {\n  color: #eeeeee;\n  background-color: #eff7ff;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-reddit:active,\n.btn-reddit.active,\n.open > .dropdown-toggle.btn-reddit {\n  background-image: none;\n}\n.btn-reddit.disabled,\n.btn-reddit[disabled],\nfieldset[disabled] .btn-reddit,\n.btn-reddit.disabled:hover,\n.btn-reddit[disabled]:hover,\nfieldset[disabled] .btn-reddit:hover,\n.btn-reddit.disabled:focus,\n.btn-reddit[disabled]:focus,\nfieldset[disabled] .btn-reddit:focus,\n.btn-reddit.disabled.focus,\n.btn-reddit[disabled].focus,\nfieldset[disabled] .btn-reddit.focus,\n.btn-reddit.disabled:active,\n.btn-reddit[disabled]:active,\nfieldset[disabled] .btn-reddit:active,\n.btn-reddit.disabled.active,\n.btn-reddit[disabled].active,\nfieldset[disabled] .btn-reddit.active {\n  background-color: #eff7ff;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-reddit .badge {\n  color: #eff7ff;\n  background-color: #000;\n}\n.btn-soundcloud {\n  color: #ff5500;\n  background-color: #ff5500;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-soundcloud:hover,\n.btn-soundcloud:focus,\n.btn-soundcloud.focus,\n.btn-soundcloud:active,\n.btn-soundcloud.active,\n.open > .dropdown-toggle.btn-soundcloud {\n  color: #eeeeee;\n  background-color: #ff5500;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-soundcloud:active,\n.btn-soundcloud.active,\n.open > .dropdown-toggle.btn-soundcloud {\n  background-image: none;\n}\n.btn-soundcloud.disabled,\n.btn-soundcloud[disabled],\nfieldset[disabled] .btn-soundcloud,\n.btn-soundcloud.disabled:hover,\n.btn-soundcloud[disabled]:hover,\nfieldset[disabled] .btn-soundcloud:hover,\n.btn-soundcloud.disabled:focus,\n.btn-soundcloud[disabled]:focus,\nfieldset[disabled] .btn-soundcloud:focus,\n.btn-soundcloud.disabled.focus,\n.btn-soundcloud[disabled].focus,\nfieldset[disabled] .btn-soundcloud.focus,\n.btn-soundcloud.disabled:active,\n.btn-soundcloud[disabled]:active,\nfieldset[disabled] .btn-soundcloud:active,\n.btn-soundcloud.disabled.active,\n.btn-soundcloud[disabled].active,\nfieldset[disabled] .btn-soundcloud.active {\n  background-color: #ff5500;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-soundcloud .badge {\n  color: #ff5500;\n  background-color: #ff5500;\n}\n.btn-tumblr {\n  color: #2c4762;\n  background-color: #2c4762;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-tumblr:hover,\n.btn-tumblr:focus,\n.btn-tumblr.focus,\n.btn-tumblr:active,\n.btn-tumblr.active,\n.open > .dropdown-toggle.btn-tumblr {\n  color: #eeeeee;\n  background-color: #2c4762;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-tumblr:active,\n.btn-tumblr.active,\n.open > .dropdown-toggle.btn-tumblr {\n  background-image: none;\n}\n.btn-tumblr.disabled,\n.btn-tumblr[disabled],\nfieldset[disabled] .btn-tumblr,\n.btn-tumblr.disabled:hover,\n.btn-tumblr[disabled]:hover,\nfieldset[disabled] .btn-tumblr:hover,\n.btn-tumblr.disabled:focus,\n.btn-tumblr[disabled]:focus,\nfieldset[disabled] .btn-tumblr:focus,\n.btn-tumblr.disabled.focus,\n.btn-tumblr[disabled].focus,\nfieldset[disabled] .btn-tumblr.focus,\n.btn-tumblr.disabled:active,\n.btn-tumblr[disabled]:active,\nfieldset[disabled] .btn-tumblr:active,\n.btn-tumblr.disabled.active,\n.btn-tumblr[disabled].active,\nfieldset[disabled] .btn-tumblr.active {\n  background-color: #2c4762;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-tumblr .badge {\n  color: #2c4762;\n  background-color: #2c4762;\n}\n.btn-twitter {\n  color: #55acee;\n  background-color: #55acee;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-twitter:hover,\n.btn-twitter:focus,\n.btn-twitter.focus,\n.btn-twitter:active,\n.btn-twitter.active,\n.open > .dropdown-toggle.btn-twitter {\n  color: #eeeeee;\n  background-color: #55acee;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-twitter:active,\n.btn-twitter.active,\n.open > .dropdown-toggle.btn-twitter {\n  background-image: none;\n}\n.btn-twitter.disabled,\n.btn-twitter[disabled],\nfieldset[disabled] .btn-twitter,\n.btn-twitter.disabled:hover,\n.btn-twitter[disabled]:hover,\nfieldset[disabled] .btn-twitter:hover,\n.btn-twitter.disabled:focus,\n.btn-twitter[disabled]:focus,\nfieldset[disabled] .btn-twitter:focus,\n.btn-twitter.disabled.focus,\n.btn-twitter[disabled].focus,\nfieldset[disabled] .btn-twitter.focus,\n.btn-twitter.disabled:active,\n.btn-twitter[disabled]:active,\nfieldset[disabled] .btn-twitter:active,\n.btn-twitter.disabled.active,\n.btn-twitter[disabled].active,\nfieldset[disabled] .btn-twitter.active {\n  background-color: #55acee;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-twitter .badge {\n  color: #55acee;\n  background-color: #55acee;\n}\n.btn-vimeo {\n  color: #1ab7ea;\n  background-color: #1ab7ea;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-vimeo:hover,\n.btn-vimeo:focus,\n.btn-vimeo.focus,\n.btn-vimeo:active,\n.btn-vimeo.active,\n.open > .dropdown-toggle.btn-vimeo {\n  color: #eeeeee;\n  background-color: #1ab7ea;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-vimeo:active,\n.btn-vimeo.active,\n.open > .dropdown-toggle.btn-vimeo {\n  background-image: none;\n}\n.btn-vimeo.disabled,\n.btn-vimeo[disabled],\nfieldset[disabled] .btn-vimeo,\n.btn-vimeo.disabled:hover,\n.btn-vimeo[disabled]:hover,\nfieldset[disabled] .btn-vimeo:hover,\n.btn-vimeo.disabled:focus,\n.btn-vimeo[disabled]:focus,\nfieldset[disabled] .btn-vimeo:focus,\n.btn-vimeo.disabled.focus,\n.btn-vimeo[disabled].focus,\nfieldset[disabled] .btn-vimeo.focus,\n.btn-vimeo.disabled:active,\n.btn-vimeo[disabled]:active,\nfieldset[disabled] .btn-vimeo:active,\n.btn-vimeo.disabled.active,\n.btn-vimeo[disabled].active,\nfieldset[disabled] .btn-vimeo.active {\n  background-color: #1ab7ea;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-vimeo .badge {\n  color: #1ab7ea;\n  background-color: #1ab7ea;\n}\n.btn-vk {\n  color: #587ea3;\n  background-color: #587ea3;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-vk:hover,\n.btn-vk:focus,\n.btn-vk.focus,\n.btn-vk:active,\n.btn-vk.active,\n.open > .dropdown-toggle.btn-vk {\n  color: #eeeeee;\n  background-color: #587ea3;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-vk:active,\n.btn-vk.active,\n.open > .dropdown-toggle.btn-vk {\n  background-image: none;\n}\n.btn-vk.disabled,\n.btn-vk[disabled],\nfieldset[disabled] .btn-vk,\n.btn-vk.disabled:hover,\n.btn-vk[disabled]:hover,\nfieldset[disabled] .btn-vk:hover,\n.btn-vk.disabled:focus,\n.btn-vk[disabled]:focus,\nfieldset[disabled] .btn-vk:focus,\n.btn-vk.disabled.focus,\n.btn-vk[disabled].focus,\nfieldset[disabled] .btn-vk.focus,\n.btn-vk.disabled:active,\n.btn-vk[disabled]:active,\nfieldset[disabled] .btn-vk:active,\n.btn-vk.disabled.active,\n.btn-vk[disabled].active,\nfieldset[disabled] .btn-vk.active {\n  background-color: #587ea3;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-vk .badge {\n  color: #587ea3;\n  background-color: #587ea3;\n}\n.btn-yahoo {\n  color: #720e9e;\n  background-color: #720e9e;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-yahoo:hover,\n.btn-yahoo:focus,\n.btn-yahoo.focus,\n.btn-yahoo:active,\n.btn-yahoo.active,\n.open > .dropdown-toggle.btn-yahoo {\n  color: #eeeeee;\n  background-color: #720e9e;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-yahoo:active,\n.btn-yahoo.active,\n.open > .dropdown-toggle.btn-yahoo {\n  background-image: none;\n}\n.btn-yahoo.disabled,\n.btn-yahoo[disabled],\nfieldset[disabled] .btn-yahoo,\n.btn-yahoo.disabled:hover,\n.btn-yahoo[disabled]:hover,\nfieldset[disabled] .btn-yahoo:hover,\n.btn-yahoo.disabled:focus,\n.btn-yahoo[disabled]:focus,\nfieldset[disabled] .btn-yahoo:focus,\n.btn-yahoo.disabled.focus,\n.btn-yahoo[disabled].focus,\nfieldset[disabled] .btn-yahoo.focus,\n.btn-yahoo.disabled:active,\n.btn-yahoo[disabled]:active,\nfieldset[disabled] .btn-yahoo:active,\n.btn-yahoo.disabled.active,\n.btn-yahoo[disabled].active,\nfieldset[disabled] .btn-yahoo.active {\n  background-color: #720e9e;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-yahoo .badge {\n  color: #720e9e;\n  background-color: #720e9e;\n}\n/*!\nIonicons, v2.0.0\nCreated by Ben Sperry for the Ionic Framework, http://ionicons.com/\nhttps://twitter.com/benjsperry  https://twitter.com/ionicframework\nMIT License: https://github.com/driftyco/ionicons\n*/\n@font-face {\n  font-family: \"Ionicons\";\n  src: url(\"../fonts/ionicons.eot?v=2.0.0\");\n  src: url(\"../fonts/ionicons.eot?v=2.0.0#iefix\") format(\"embedded-opentype\"), url(\"../fonts/ionicons.ttf?v=2.0.0\") format(\"truetype\"), url(\"../fonts/ionicons.woff?v=2.0.0\") format(\"woff\"), url(\"../fonts/ionicons.svg?v=2.0.0#Ionicons\") format(\"svg\");\n  font-weight: normal;\n  font-style: normal;\n}\n.ion,\n.ion-loading-a,\n.ion-loading-b,\n.ion-loading-c,\n.ion-loading-d,\n.ion-looping,\n.ion-refreshing,\n.ion-ios7-reloading,\n.ionicons,\n.ion-alert:before,\n.ion-alert-circled:before,\n.ion-android-add:before,\n.ion-android-add-circle:before,\n.ion-android-alarm-clock:before,\n.ion-android-alert:before,\n.ion-android-apps:before,\n.ion-android-archive:before,\n.ion-android-arrow-back:before,\n.ion-android-arrow-down:before,\n.ion-android-arrow-dropdown:before,\n.ion-android-arrow-dropdown-circle:before,\n.ion-android-arrow-dropleft:before,\n.ion-android-arrow-dropleft-circle:before,\n.ion-android-arrow-dropright:before,\n.ion-android-arrow-dropright-circle:before,\n.ion-android-arrow-dropup:before,\n.ion-android-arrow-dropup-circle:before,\n.ion-android-arrow-forward:before,\n.ion-android-arrow-up:before,\n.ion-android-attach:before,\n.ion-android-bar:before,\n.ion-android-bicycle:before,\n.ion-android-boat:before,\n.ion-android-bookmark:before,\n.ion-android-bulb:before,\n.ion-android-bus:before,\n.ion-android-calendar:before,\n.ion-android-call:before,\n.ion-android-camera:before,\n.ion-android-cancel:before,\n.ion-android-car:before,\n.ion-android-cart:before,\n.ion-android-chat:before,\n.ion-android-checkbox:before,\n.ion-android-checkbox-blank:before,\n.ion-android-checkbox-outline:before,\n.ion-android-checkbox-outline-blank:before,\n.ion-android-checkmark-circle:before,\n.ion-android-clipboard:before,\n.ion-android-close:before,\n.ion-android-cloud:before,\n.ion-android-cloud-circle:before,\n.ion-android-cloud-done:before,\n.ion-android-cloud-outline:before,\n.ion-android-color-palette:before,\n.ion-android-compass:before,\n.ion-android-contact:before,\n.ion-android-contacts:before,\n.ion-android-contract:before,\n.ion-android-create:before,\n.ion-android-delete:before,\n.ion-android-desktop:before,\n.ion-android-document:before,\n.ion-android-done:before,\n.ion-android-done-all:before,\n.ion-android-download:before,\n.ion-android-drafts:before,\n.ion-android-exit:before,\n.ion-android-expand:before,\n.ion-android-favorite:before,\n.ion-android-favorite-outline:before,\n.ion-android-film:before,\n.ion-android-folder:before,\n.ion-android-folder-open:before,\n.ion-android-funnel:before,\n.ion-android-globe:before,\n.ion-android-hand:before,\n.ion-android-hangout:before,\n.ion-android-happy:before,\n.ion-android-home:before,\n.ion-android-image:before,\n.ion-android-laptop:before,\n.ion-android-list:before,\n.ion-android-locate:before,\n.ion-android-lock:before,\n.ion-android-mail:before,\n.ion-android-map:before,\n.ion-android-menu:before,\n.ion-android-microphone:before,\n.ion-android-microphone-off:before,\n.ion-android-more-horizontal:before,\n.ion-android-more-vertical:before,\n.ion-android-navigate:before,\n.ion-android-notifications:before,\n.ion-android-notifications-none:before,\n.ion-android-notifications-off:before,\n.ion-android-open:before,\n.ion-android-options:before,\n.ion-android-people:before,\n.ion-android-person:before,\n.ion-android-person-add:before,\n.ion-android-phone-landscape:before,\n.ion-android-phone-portrait:before,\n.ion-android-pin:before,\n.ion-android-plane:before,\n.ion-android-playstore:before,\n.ion-android-print:before,\n.ion-android-radio-button-off:before,\n.ion-android-radio-button-on:before,\n.ion-android-refresh:before,\n.ion-android-remove:before,\n.ion-android-remove-circle:before,\n.ion-android-restaurant:before,\n.ion-android-sad:before,\n.ion-android-search:before,\n.ion-android-send:before,\n.ion-android-settings:before,\n.ion-android-share:before,\n.ion-android-share-alt:before,\n.ion-android-star:before,\n.ion-android-star-half:before,\n.ion-android-star-outline:before,\n.ion-android-stopwatch:before,\n.ion-android-subway:before,\n.ion-android-sunny:before,\n.ion-android-sync:before,\n.ion-android-textsms:before,\n.ion-android-time:before,\n.ion-android-train:before,\n.ion-android-unlock:before,\n.ion-android-upload:before,\n.ion-android-volume-down:before,\n.ion-android-volume-mute:before,\n.ion-android-volume-off:before,\n.ion-android-volume-up:before,\n.ion-android-walk:before,\n.ion-android-warning:before,\n.ion-android-watch:before,\n.ion-android-wifi:before,\n.ion-aperture:before,\n.ion-archive:before,\n.ion-arrow-down-a:before,\n.ion-arrow-down-b:before,\n.ion-arrow-down-c:before,\n.ion-arrow-expand:before,\n.ion-arrow-graph-down-left:before,\n.ion-arrow-graph-down-right:before,\n.ion-arrow-graph-up-left:before,\n.ion-arrow-graph-up-right:before,\n.ion-arrow-left-a:before,\n.ion-arrow-left-b:before,\n.ion-arrow-left-c:before,\n.ion-arrow-move:before,\n.ion-arrow-resize:before,\n.ion-arrow-return-left:before,\n.ion-arrow-return-right:before,\n.ion-arrow-right-a:before,\n.ion-arrow-right-b:before,\n.ion-arrow-right-c:before,\n.ion-arrow-shrink:before,\n.ion-arrow-swap:before,\n.ion-arrow-up-a:before,\n.ion-arrow-up-b:before,\n.ion-arrow-up-c:before,\n.ion-asterisk:before,\n.ion-at:before,\n.ion-backspace:before,\n.ion-backspace-outline:before,\n.ion-bag:before,\n.ion-battery-charging:before,\n.ion-battery-empty:before,\n.ion-battery-full:before,\n.ion-battery-half:before,\n.ion-battery-low:before,\n.ion-beaker:before,\n.ion-beer:before,\n.ion-bluetooth:before,\n.ion-bonfire:before,\n.ion-bookmark:before,\n.ion-bowtie:before,\n.ion-briefcase:before,\n.ion-bug:before,\n.ion-calculator:before,\n.ion-calendar:before,\n.ion-camera:before,\n.ion-card:before,\n.ion-cash:before,\n.ion-chatbox:before,\n.ion-chatbox-working:before,\n.ion-chatboxes:before,\n.ion-chatbubble:before,\n.ion-chatbubble-working:before,\n.ion-chatbubbles:before,\n.ion-checkmark:before,\n.ion-checkmark-circled:before,\n.ion-checkmark-round:before,\n.ion-chevron-down:before,\n.ion-chevron-left:before,\n.ion-chevron-right:before,\n.ion-chevron-up:before,\n.ion-clipboard:before,\n.ion-clock:before,\n.ion-close:before,\n.ion-close-circled:before,\n.ion-close-round:before,\n.ion-closed-captioning:before,\n.ion-cloud:before,\n.ion-code:before,\n.ion-code-download:before,\n.ion-code-working:before,\n.ion-coffee:before,\n.ion-compass:before,\n.ion-compose:before,\n.ion-connection-bars:before,\n.ion-contrast:before,\n.ion-crop:before,\n.ion-cube:before,\n.ion-disc:before,\n.ion-document:before,\n.ion-document-text:before,\n.ion-drag:before,\n.ion-earth:before,\n.ion-easel:before,\n.ion-edit:before,\n.ion-egg:before,\n.ion-eject:before,\n.ion-email:before,\n.ion-email-unread:before,\n.ion-erlenmeyer-flask:before,\n.ion-erlenmeyer-flask-bubbles:before,\n.ion-eye:before,\n.ion-eye-disabled:before,\n.ion-female:before,\n.ion-filing:before,\n.ion-film-marker:before,\n.ion-fireball:before,\n.ion-flag:before,\n.ion-flame:before,\n.ion-flash:before,\n.ion-flash-off:before,\n.ion-folder:before,\n.ion-fork:before,\n.ion-fork-repo:before,\n.ion-forward:before,\n.ion-funnel:before,\n.ion-gear-a:before,\n.ion-gear-b:before,\n.ion-grid:before,\n.ion-hammer:before,\n.ion-happy:before,\n.ion-happy-outline:before,\n.ion-headphone:before,\n.ion-heart:before,\n.ion-heart-broken:before,\n.ion-help:before,\n.ion-help-buoy:before,\n.ion-help-circled:before,\n.ion-home:before,\n.ion-icecream:before,\n.ion-image:before,\n.ion-images:before,\n.ion-information:before,\n.ion-information-circled:before,\n.ion-ionic:before,\n.ion-ios-alarm:before,\n.ion-ios-alarm-outline:before,\n.ion-ios-albums:before,\n.ion-ios-albums-outline:before,\n.ion-ios-americanfootball:before,\n.ion-ios-americanfootball-outline:before,\n.ion-ios-analytics:before,\n.ion-ios-analytics-outline:before,\n.ion-ios-arrow-back:before,\n.ion-ios-arrow-down:before,\n.ion-ios-arrow-forward:before,\n.ion-ios-arrow-left:before,\n.ion-ios-arrow-right:before,\n.ion-ios-arrow-thin-down:before,\n.ion-ios-arrow-thin-left:before,\n.ion-ios-arrow-thin-right:before,\n.ion-ios-arrow-thin-up:before,\n.ion-ios-arrow-up:before,\n.ion-ios-at:before,\n.ion-ios-at-outline:before,\n.ion-ios-barcode:before,\n.ion-ios-barcode-outline:before,\n.ion-ios-baseball:before,\n.ion-ios-baseball-outline:before,\n.ion-ios-basketball:before,\n.ion-ios-basketball-outline:before,\n.ion-ios-bell:before,\n.ion-ios-bell-outline:before,\n.ion-ios-body:before,\n.ion-ios-body-outline:before,\n.ion-ios-bolt:before,\n.ion-ios-bolt-outline:before,\n.ion-ios-book:before,\n.ion-ios-book-outline:before,\n.ion-ios-bookmarks:before,\n.ion-ios-bookmarks-outline:before,\n.ion-ios-box:before,\n.ion-ios-box-outline:before,\n.ion-ios-briefcase:before,\n.ion-ios-briefcase-outline:before,\n.ion-ios-browsers:before,\n.ion-ios-browsers-outline:before,\n.ion-ios-calculator:before,\n.ion-ios-calculator-outline:before,\n.ion-ios-calendar:before,\n.ion-ios-calendar-outline:before,\n.ion-ios-camera:before,\n.ion-ios-camera-outline:before,\n.ion-ios-cart:before,\n.ion-ios-cart-outline:before,\n.ion-ios-chatboxes:before,\n.ion-ios-chatboxes-outline:before,\n.ion-ios-chatbubble:before,\n.ion-ios-chatbubble-outline:before,\n.ion-ios-checkmark:before,\n.ion-ios-checkmark-empty:before,\n.ion-ios-checkmark-outline:before,\n.ion-ios-circle-filled:before,\n.ion-ios-circle-outline:before,\n.ion-ios-clock:before,\n.ion-ios-clock-outline:before,\n.ion-ios-close:before,\n.ion-ios-close-empty:before,\n.ion-ios-close-outline:before,\n.ion-ios-cloud:before,\n.ion-ios-cloud-download:before,\n.ion-ios-cloud-download-outline:before,\n.ion-ios-cloud-outline:before,\n.ion-ios-cloud-upload:before,\n.ion-ios-cloud-upload-outline:before,\n.ion-ios-cloudy:before,\n.ion-ios-cloudy-night:before,\n.ion-ios-cloudy-night-outline:before,\n.ion-ios-cloudy-outline:before,\n.ion-ios-cog:before,\n.ion-ios-cog-outline:before,\n.ion-ios-color-filter:before,\n.ion-ios-color-filter-outline:before,\n.ion-ios-color-wand:before,\n.ion-ios-color-wand-outline:before,\n.ion-ios-compose:before,\n.ion-ios-compose-outline:before,\n.ion-ios-contact:before,\n.ion-ios-contact-outline:before,\n.ion-ios-copy:before,\n.ion-ios-copy-outline:before,\n.ion-ios-crop:before,\n.ion-ios-crop-strong:before,\n.ion-ios-download:before,\n.ion-ios-download-outline:before,\n.ion-ios-drag:before,\n.ion-ios-email:before,\n.ion-ios-email-outline:before,\n.ion-ios-eye:before,\n.ion-ios-eye-outline:before,\n.ion-ios-fastforward:before,\n.ion-ios-fastforward-outline:before,\n.ion-ios-filing:before,\n.ion-ios-filing-outline:before,\n.ion-ios-film:before,\n.ion-ios-film-outline:before,\n.ion-ios-flag:before,\n.ion-ios-flag-outline:before,\n.ion-ios-flame:before,\n.ion-ios-flame-outline:before,\n.ion-ios-flask:before,\n.ion-ios-flask-outline:before,\n.ion-ios-flower:before,\n.ion-ios-flower-outline:before,\n.ion-ios-folder:before,\n.ion-ios-folder-outline:before,\n.ion-ios-football:before,\n.ion-ios-football-outline:before,\n.ion-ios-game-controller-a:before,\n.ion-ios-game-controller-a-outline:before,\n.ion-ios-game-controller-b:before,\n.ion-ios-game-controller-b-outline:before,\n.ion-ios-gear:before,\n.ion-ios-gear-outline:before,\n.ion-ios-glasses:before,\n.ion-ios-glasses-outline:before,\n.ion-ios-grid-view:before,\n.ion-ios-grid-view-outline:before,\n.ion-ios-heart:before,\n.ion-ios-heart-outline:before,\n.ion-ios-help:before,\n.ion-ios-help-empty:before,\n.ion-ios-help-outline:before,\n.ion-ios-home:before,\n.ion-ios-home-outline:before,\n.ion-ios-infinite:before,\n.ion-ios-infinite-outline:before,\n.ion-ios-information:before,\n.ion-ios-information-empty:before,\n.ion-ios-information-outline:before,\n.ion-ios-ionic-outline:before,\n.ion-ios-keypad:before,\n.ion-ios-keypad-outline:before,\n.ion-ios-lightbulb:before,\n.ion-ios-lightbulb-outline:before,\n.ion-ios-list:before,\n.ion-ios-list-outline:before,\n.ion-ios-location:before,\n.ion-ios-location-outline:before,\n.ion-ios-locked:before,\n.ion-ios-locked-outline:before,\n.ion-ios-loop:before,\n.ion-ios-loop-strong:before,\n.ion-ios-medical:before,\n.ion-ios-medical-outline:before,\n.ion-ios-medkit:before,\n.ion-ios-medkit-outline:before,\n.ion-ios-mic:before,\n.ion-ios-mic-off:before,\n.ion-ios-mic-outline:before,\n.ion-ios-minus:before,\n.ion-ios-minus-empty:before,\n.ion-ios-minus-outline:before,\n.ion-ios-monitor:before,\n.ion-ios-monitor-outline:before,\n.ion-ios-moon:before,\n.ion-ios-moon-outline:before,\n.ion-ios-more:before,\n.ion-ios-more-outline:before,\n.ion-ios-musical-note:before,\n.ion-ios-musical-notes:before,\n.ion-ios-navigate:before,\n.ion-ios-navigate-outline:before,\n.ion-ios-nutrition:before,\n.ion-ios-nutrition-outline:before,\n.ion-ios-paper:before,\n.ion-ios-paper-outline:before,\n.ion-ios-paperplane:before,\n.ion-ios-paperplane-outline:before,\n.ion-ios-partlysunny:before,\n.ion-ios-partlysunny-outline:before,\n.ion-ios-pause:before,\n.ion-ios-pause-outline:before,\n.ion-ios-paw:before,\n.ion-ios-paw-outline:before,\n.ion-ios-people:before,\n.ion-ios-people-outline:before,\n.ion-ios-person:before,\n.ion-ios-person-outline:before,\n.ion-ios-personadd:before,\n.ion-ios-personadd-outline:before,\n.ion-ios-photos:before,\n.ion-ios-photos-outline:before,\n.ion-ios-pie:before,\n.ion-ios-pie-outline:before,\n.ion-ios-pint:before,\n.ion-ios-pint-outline:before,\n.ion-ios-play:before,\n.ion-ios-play-outline:before,\n.ion-ios-plus:before,\n.ion-ios-plus-empty:before,\n.ion-ios-plus-outline:before,\n.ion-ios-pricetag:before,\n.ion-ios-pricetag-outline:before,\n.ion-ios-pricetags:before,\n.ion-ios-pricetags-outline:before,\n.ion-ios-printer:before,\n.ion-ios-printer-outline:before,\n.ion-ios-pulse:before,\n.ion-ios-pulse-strong:before,\n.ion-ios-rainy:before,\n.ion-ios-rainy-outline:before,\n.ion-ios-recording:before,\n.ion-ios-recording-outline:before,\n.ion-ios-redo:before,\n.ion-ios-redo-outline:before,\n.ion-ios-refresh:before,\n.ion-ios-refresh-empty:before,\n.ion-ios-refresh-outline:before,\n.ion-ios-reload:before,\n.ion-ios-reverse-camera:before,\n.ion-ios-reverse-camera-outline:before,\n.ion-ios-rewind:before,\n.ion-ios-rewind-outline:before,\n.ion-ios-rose:before,\n.ion-ios-rose-outline:before,\n.ion-ios-search:before,\n.ion-ios-search-strong:before,\n.ion-ios-settings:before,\n.ion-ios-settings-strong:before,\n.ion-ios-shuffle:before,\n.ion-ios-shuffle-strong:before,\n.ion-ios-skipbackward:before,\n.ion-ios-skipbackward-outline:before,\n.ion-ios-skipforward:before,\n.ion-ios-skipforward-outline:before,\n.ion-ios-snowy:before,\n.ion-ios-speedometer:before,\n.ion-ios-speedometer-outline:before,\n.ion-ios-star:before,\n.ion-ios-star-half:before,\n.ion-ios-star-outline:before,\n.ion-ios-stopwatch:before,\n.ion-ios-stopwatch-outline:before,\n.ion-ios-sunny:before,\n.ion-ios-sunny-outline:before,\n.ion-ios-telephone:before,\n.ion-ios-telephone-outline:before,\n.ion-ios-tennisball:before,\n.ion-ios-tennisball-outline:before,\n.ion-ios-thunderstorm:before,\n.ion-ios-thunderstorm-outline:before,\n.ion-ios-time:before,\n.ion-ios-time-outline:before,\n.ion-ios-timer:before,\n.ion-ios-timer-outline:before,\n.ion-ios-toggle:before,\n.ion-ios-toggle-outline:before,\n.ion-ios-trash:before,\n.ion-ios-trash-outline:before,\n.ion-ios-undo:before,\n.ion-ios-undo-outline:before,\n.ion-ios-unlocked:before,\n.ion-ios-unlocked-outline:before,\n.ion-ios-upload:before,\n.ion-ios-upload-outline:before,\n.ion-ios-videocam:before,\n.ion-ios-videocam-outline:before,\n.ion-ios-volume-high:before,\n.ion-ios-volume-low:before,\n.ion-ios-wineglass:before,\n.ion-ios-wineglass-outline:before,\n.ion-ios-world:before,\n.ion-ios-world-outline:before,\n.ion-ipad:before,\n.ion-iphone:before,\n.ion-ipod:before,\n.ion-jet:before,\n.ion-key:before,\n.ion-knife:before,\n.ion-laptop:before,\n.ion-leaf:before,\n.ion-levels:before,\n.ion-lightbulb:before,\n.ion-link:before,\n.ion-load-a:before,\n.ion-load-b:before,\n.ion-load-c:before,\n.ion-load-d:before,\n.ion-location:before,\n.ion-lock-combination:before,\n.ion-locked:before,\n.ion-log-in:before,\n.ion-log-out:before,\n.ion-loop:before,\n.ion-magnet:before,\n.ion-male:before,\n.ion-man:before,\n.ion-map:before,\n.ion-medkit:before,\n.ion-merge:before,\n.ion-mic-a:before,\n.ion-mic-b:before,\n.ion-mic-c:before,\n.ion-minus:before,\n.ion-minus-circled:before,\n.ion-minus-round:before,\n.ion-model-s:before,\n.ion-monitor:before,\n.ion-more:before,\n.ion-mouse:before,\n.ion-music-note:before,\n.ion-navicon:before,\n.ion-navicon-round:before,\n.ion-navigate:before,\n.ion-network:before,\n.ion-no-smoking:before,\n.ion-nuclear:before,\n.ion-outlet:before,\n.ion-paintbrush:before,\n.ion-paintbucket:before,\n.ion-paper-airplane:before,\n.ion-paperclip:before,\n.ion-pause:before,\n.ion-person:before,\n.ion-person-add:before,\n.ion-person-stalker:before,\n.ion-pie-graph:before,\n.ion-pin:before,\n.ion-pinpoint:before,\n.ion-pizza:before,\n.ion-plane:before,\n.ion-planet:before,\n.ion-play:before,\n.ion-playstation:before,\n.ion-plus:before,\n.ion-plus-circled:before,\n.ion-plus-round:before,\n.ion-podium:before,\n.ion-pound:before,\n.ion-power:before,\n.ion-pricetag:before,\n.ion-pricetags:before,\n.ion-printer:before,\n.ion-pull-request:before,\n.ion-qr-scanner:before,\n.ion-quote:before,\n.ion-radio-waves:before,\n.ion-record:before,\n.ion-refresh:before,\n.ion-reply:before,\n.ion-reply-all:before,\n.ion-ribbon-a:before,\n.ion-ribbon-b:before,\n.ion-sad:before,\n.ion-sad-outline:before,\n.ion-scissors:before,\n.ion-search:before,\n.ion-settings:before,\n.ion-share:before,\n.ion-shuffle:before,\n.ion-skip-backward:before,\n.ion-skip-forward:before,\n.ion-social-android:before,\n.ion-social-android-outline:before,\n.ion-social-angular:before,\n.ion-social-angular-outline:before,\n.ion-social-apple:before,\n.ion-social-apple-outline:before,\n.ion-social-bitcoin:before,\n.ion-social-bitcoin-outline:before,\n.ion-social-buffer:before,\n.ion-social-buffer-outline:before,\n.ion-social-chrome:before,\n.ion-social-chrome-outline:before,\n.ion-social-codepen:before,\n.ion-social-codepen-outline:before,\n.ion-social-css3:before,\n.ion-social-css3-outline:before,\n.ion-social-designernews:before,\n.ion-social-designernews-outline:before,\n.ion-social-dribbble:before,\n.ion-social-dribbble-outline:before,\n.ion-social-dropbox:before,\n.ion-social-dropbox-outline:before,\n.ion-social-euro:before,\n.ion-social-euro-outline:before,\n.ion-social-facebook:before,\n.ion-social-facebook-outline:before,\n.ion-social-foursquare:before,\n.ion-social-foursquare-outline:before,\n.ion-social-freebsd-devil:before,\n.ion-social-github:before,\n.ion-social-github-outline:before,\n.ion-social-google:before,\n.ion-social-google-outline:before,\n.ion-social-googleplus:before,\n.ion-social-googleplus-outline:before,\n.ion-social-hackernews:before,\n.ion-social-hackernews-outline:before,\n.ion-social-html5:before,\n.ion-social-html5-outline:before,\n.ion-social-instagram:before,\n.ion-social-instagram-outline:before,\n.ion-social-javascript:before,\n.ion-social-javascript-outline:before,\n.ion-social-linkedin:before,\n.ion-social-linkedin-outline:before,\n.ion-social-markdown:before,\n.ion-social-nodejs:before,\n.ion-social-octocat:before,\n.ion-social-pinterest:before,\n.ion-social-pinterest-outline:before,\n.ion-social-python:before,\n.ion-social-reddit:before,\n.ion-social-reddit-outline:before,\n.ion-social-rss:before,\n.ion-social-rss-outline:before,\n.ion-social-sass:before,\n.ion-social-skype:before,\n.ion-social-skype-outline:before,\n.ion-social-snapchat:before,\n.ion-social-snapchat-outline:before,\n.ion-social-tumblr:before,\n.ion-social-tumblr-outline:before,\n.ion-social-tux:before,\n.ion-social-twitch:before,\n.ion-social-twitch-outline:before,\n.ion-social-twitter:before,\n.ion-social-twitter-outline:before,\n.ion-social-usd:before,\n.ion-social-usd-outline:before,\n.ion-social-vimeo:before,\n.ion-social-vimeo-outline:before,\n.ion-social-whatsapp:before,\n.ion-social-whatsapp-outline:before,\n.ion-social-windows:before,\n.ion-social-windows-outline:before,\n.ion-social-wordpress:before,\n.ion-social-wordpress-outline:before,\n.ion-social-yahoo:before,\n.ion-social-yahoo-outline:before,\n.ion-social-yen:before,\n.ion-social-yen-outline:before,\n.ion-social-youtube:before,\n.ion-social-youtube-outline:before,\n.ion-soup-can:before,\n.ion-soup-can-outline:before,\n.ion-speakerphone:before,\n.ion-speedometer:before,\n.ion-spoon:before,\n.ion-star:before,\n.ion-stats-bars:before,\n.ion-steam:before,\n.ion-stop:before,\n.ion-thermometer:before,\n.ion-thumbsdown:before,\n.ion-thumbsup:before,\n.ion-toggle:before,\n.ion-toggle-filled:before,\n.ion-transgender:before,\n.ion-trash-a:before,\n.ion-trash-b:before,\n.ion-trophy:before,\n.ion-tshirt:before,\n.ion-tshirt-outline:before,\n.ion-umbrella:before,\n.ion-university:before,\n.ion-unlocked:before,\n.ion-upload:before,\n.ion-usb:before,\n.ion-videocamera:before,\n.ion-volume-high:before,\n.ion-volume-low:before,\n.ion-volume-medium:before,\n.ion-volume-mute:before,\n.ion-wand:before,\n.ion-waterdrop:before,\n.ion-wifi:before,\n.ion-wineglass:before,\n.ion-woman:before,\n.ion-wrench:before,\n.ion-xbox:before {\n  display: inline-block;\n  font-family: \"Ionicons\";\n  speak: none;\n  font-style: normal;\n  font-weight: normal;\n  font-variant: normal;\n  text-transform: none;\n  text-rendering: auto;\n  line-height: 1;\n  -webkit-font-smoothing: antialiased;\n  -moz-osx-font-smoothing: grayscale;\n}\n.ion-spin,\n.ion-loading-a,\n.ion-loading-b,\n.ion-loading-c,\n.ion-loading-d,\n.ion-looping,\n.ion-refreshing,\n.ion-ios7-reloading {\n  -webkit-animation: spin 1s infinite linear;\n  -moz-animation: spin 1s infinite linear;\n  -o-animation: spin 1s infinite linear;\n  animation: spin 1s infinite linear;\n}\n@-moz-keyframes spin {\n  0% {\n    -moz-transform: rotate(0deg);\n  }\n  100% {\n    -moz-transform: rotate(359deg);\n  }\n}\n@-webkit-keyframes spin {\n  0% {\n    -webkit-transform: rotate(0deg);\n  }\n  100% {\n    -webkit-transform: rotate(359deg);\n  }\n}\n@-o-keyframes spin {\n  0% {\n    -o-transform: rotate(0deg);\n  }\n  100% {\n    -o-transform: rotate(359deg);\n  }\n}\n@-ms-keyframes spin {\n  0% {\n    -ms-transform: rotate(0deg);\n  }\n  100% {\n    -ms-transform: rotate(359deg);\n  }\n}\n@keyframes spin {\n  0% {\n    transform: rotate(0deg);\n  }\n  100% {\n    transform: rotate(359deg);\n  }\n}\n.ion-loading-a {\n  -webkit-animation-timing-function: steps(8, start);\n  -moz-animation-timing-function: steps(8, start);\n  animation-timing-function: steps(8, start);\n}\n.ion-alert:before {\n  content: \"\\f101\";\n}\n.ion-alert-circled:before {\n  content: \"\\f100\";\n}\n.ion-android-add:before {\n  content: \"\\f2c7\";\n}\n.ion-android-add-circle:before {\n  content: \"\\f359\";\n}\n.ion-android-alarm-clock:before {\n  content: \"\\f35a\";\n}\n.ion-android-alert:before {\n  content: \"\\f35b\";\n}\n.ion-android-apps:before {\n  content: \"\\f35c\";\n}\n.ion-android-archive:before {\n  content: \"\\f2c9\";\n}\n.ion-android-arrow-back:before {\n  content: \"\\f2ca\";\n}\n.ion-android-arrow-down:before {\n  content: \"\\f35d\";\n}\n.ion-android-arrow-dropdown:before {\n  content: \"\\f35f\";\n}\n.ion-android-arrow-dropdown-circle:before {\n  content: \"\\f35e\";\n}\n.ion-android-arrow-dropleft:before {\n  content: \"\\f361\";\n}\n.ion-android-arrow-dropleft-circle:before {\n  content: \"\\f360\";\n}\n.ion-android-arrow-dropright:before {\n  content: \"\\f363\";\n}\n.ion-android-arrow-dropright-circle:before {\n  content: \"\\f362\";\n}\n.ion-android-arrow-dropup:before {\n  content: \"\\f365\";\n}\n.ion-android-arrow-dropup-circle:before {\n  content: \"\\f364\";\n}\n.ion-android-arrow-forward:before {\n  content: \"\\f30f\";\n}\n.ion-android-arrow-up:before {\n  content: \"\\f366\";\n}\n.ion-android-attach:before {\n  content: \"\\f367\";\n}\n.ion-android-bar:before {\n  content: \"\\f368\";\n}\n.ion-android-bicycle:before {\n  content: \"\\f369\";\n}\n.ion-android-boat:before {\n  content: \"\\f36a\";\n}\n.ion-android-bookmark:before {\n  content: \"\\f36b\";\n}\n.ion-android-bulb:before {\n  content: \"\\f36c\";\n}\n.ion-android-bus:before {\n  content: \"\\f36d\";\n}\n.ion-android-calendar:before {\n  content: \"\\f2d1\";\n}\n.ion-android-call:before {\n  content: \"\\f2d2\";\n}\n.ion-android-camera:before {\n  content: \"\\f2d3\";\n}\n.ion-android-cancel:before {\n  content: \"\\f36e\";\n}\n.ion-android-car:before {\n  content: \"\\f36f\";\n}\n.ion-android-cart:before {\n  content: \"\\f370\";\n}\n.ion-android-chat:before {\n  content: \"\\f2d4\";\n}\n.ion-android-checkbox:before {\n  content: \"\\f374\";\n}\n.ion-android-checkbox-blank:before {\n  content: \"\\f371\";\n}\n.ion-android-checkbox-outline:before {\n  content: \"\\f373\";\n}\n.ion-android-checkbox-outline-blank:before {\n  content: \"\\f372\";\n}\n.ion-android-checkmark-circle:before {\n  content: \"\\f375\";\n}\n.ion-android-clipboard:before {\n  content: \"\\f376\";\n}\n.ion-android-close:before {\n  content: \"\\f2d7\";\n}\n.ion-android-cloud:before {\n  content: \"\\f37a\";\n}\n.ion-android-cloud-circle:before {\n  content: \"\\f377\";\n}\n.ion-android-cloud-done:before {\n  content: \"\\f378\";\n}\n.ion-android-cloud-outline:before {\n  content: \"\\f379\";\n}\n.ion-android-color-palette:before {\n  content: \"\\f37b\";\n}\n.ion-android-compass:before {\n  content: \"\\f37c\";\n}\n.ion-android-contact:before {\n  content: \"\\f2d8\";\n}\n.ion-android-contacts:before {\n  content: \"\\f2d9\";\n}\n.ion-android-contract:before {\n  content: \"\\f37d\";\n}\n.ion-android-create:before {\n  content: \"\\f37e\";\n}\n.ion-android-delete:before {\n  content: \"\\f37f\";\n}\n.ion-android-desktop:before {\n  content: \"\\f380\";\n}\n.ion-android-document:before {\n  content: \"\\f381\";\n}\n.ion-android-done:before {\n  content: \"\\f383\";\n}\n.ion-android-done-all:before {\n  content: \"\\f382\";\n}\n.ion-android-download:before {\n  content: \"\\f2dd\";\n}\n.ion-android-drafts:before {\n  content: \"\\f384\";\n}\n.ion-android-exit:before {\n  content: \"\\f385\";\n}\n.ion-android-expand:before {\n  content: \"\\f386\";\n}\n.ion-android-favorite:before {\n  content: \"\\f388\";\n}\n.ion-android-favorite-outline:before {\n  content: \"\\f387\";\n}\n.ion-android-film:before {\n  content: \"\\f389\";\n}\n.ion-android-folder:before {\n  content: \"\\f2e0\";\n}\n.ion-android-folder-open:before {\n  content: \"\\f38a\";\n}\n.ion-android-funnel:before {\n  content: \"\\f38b\";\n}\n.ion-android-globe:before {\n  content: \"\\f38c\";\n}\n.ion-android-hand:before {\n  content: \"\\f2e3\";\n}\n.ion-android-hangout:before {\n  content: \"\\f38d\";\n}\n.ion-android-happy:before {\n  content: \"\\f38e\";\n}\n.ion-android-home:before {\n  content: \"\\f38f\";\n}\n.ion-android-image:before {\n  content: \"\\f2e4\";\n}\n.ion-android-laptop:before {\n  content: \"\\f390\";\n}\n.ion-android-list:before {\n  content: \"\\f391\";\n}\n.ion-android-locate:before {\n  content: \"\\f2e9\";\n}\n.ion-android-lock:before {\n  content: \"\\f392\";\n}\n.ion-android-mail:before {\n  content: \"\\f2eb\";\n}\n.ion-android-map:before {\n  content: \"\\f393\";\n}\n.ion-android-menu:before {\n  content: \"\\f394\";\n}\n.ion-android-microphone:before {\n  content: \"\\f2ec\";\n}\n.ion-android-microphone-off:before {\n  content: \"\\f395\";\n}\n.ion-android-more-horizontal:before {\n  content: \"\\f396\";\n}\n.ion-android-more-vertical:before {\n  content: \"\\f397\";\n}\n.ion-android-navigate:before {\n  content: \"\\f398\";\n}\n.ion-android-notifications:before {\n  content: \"\\f39b\";\n}\n.ion-android-notifications-none:before {\n  content: \"\\f399\";\n}\n.ion-android-notifications-off:before {\n  content: \"\\f39a\";\n}\n.ion-android-open:before {\n  content: \"\\f39c\";\n}\n.ion-android-options:before {\n  content: \"\\f39d\";\n}\n.ion-android-people:before {\n  content: \"\\f39e\";\n}\n.ion-android-person:before {\n  content: \"\\f3a0\";\n}\n.ion-android-person-add:before {\n  content: \"\\f39f\";\n}\n.ion-android-phone-landscape:before {\n  content: \"\\f3a1\";\n}\n.ion-android-phone-portrait:before {\n  content: \"\\f3a2\";\n}\n.ion-android-pin:before {\n  content: \"\\f3a3\";\n}\n.ion-android-plane:before {\n  content: \"\\f3a4\";\n}\n.ion-android-playstore:before {\n  content: \"\\f2f0\";\n}\n.ion-android-print:before {\n  content: \"\\f3a5\";\n}\n.ion-android-radio-button-off:before {\n  content: \"\\f3a6\";\n}\n.ion-android-radio-button-on:before {\n  content: \"\\f3a7\";\n}\n.ion-android-refresh:before {\n  content: \"\\f3a8\";\n}\n.ion-android-remove:before {\n  content: \"\\f2f4\";\n}\n.ion-android-remove-circle:before {\n  content: \"\\f3a9\";\n}\n.ion-android-restaurant:before {\n  content: \"\\f3aa\";\n}\n.ion-android-sad:before {\n  content: \"\\f3ab\";\n}\n.ion-android-search:before {\n  content: \"\\f2f5\";\n}\n.ion-android-send:before {\n  content: \"\\f2f6\";\n}\n.ion-android-settings:before {\n  content: \"\\f2f7\";\n}\n.ion-android-share:before {\n  content: \"\\f2f8\";\n}\n.ion-android-share-alt:before {\n  content: \"\\f3ac\";\n}\n.ion-android-star:before {\n  content: \"\\f2fc\";\n}\n.ion-android-star-half:before {\n  content: \"\\f3ad\";\n}\n.ion-android-star-outline:before {\n  content: \"\\f3ae\";\n}\n.ion-android-stopwatch:before {\n  content: \"\\f2fd\";\n}\n.ion-android-subway:before {\n  content: \"\\f3af\";\n}\n.ion-android-sunny:before {\n  content: \"\\f3b0\";\n}\n.ion-android-sync:before {\n  content: \"\\f3b1\";\n}\n.ion-android-textsms:before {\n  content: \"\\f3b2\";\n}\n.ion-android-time:before {\n  content: \"\\f3b3\";\n}\n.ion-android-train:before {\n  content: \"\\f3b4\";\n}\n.ion-android-unlock:before {\n  content: \"\\f3b5\";\n}\n.ion-android-upload:before {\n  content: \"\\f3b6\";\n}\n.ion-android-volume-down:before {\n  content: \"\\f3b7\";\n}\n.ion-android-volume-mute:before {\n  content: \"\\f3b8\";\n}\n.ion-android-volume-off:before {\n  content: \"\\f3b9\";\n}\n.ion-android-volume-up:before {\n  content: \"\\f3ba\";\n}\n.ion-android-walk:before {\n  content: \"\\f3bb\";\n}\n.ion-android-warning:before {\n  content: \"\\f3bc\";\n}\n.ion-android-watch:before {\n  content: \"\\f3bd\";\n}\n.ion-android-wifi:before {\n  content: \"\\f305\";\n}\n.ion-aperture:before {\n  content: \"\\f313\";\n}\n.ion-archive:before {\n  content: \"\\f102\";\n}\n.ion-arrow-down-a:before {\n  content: \"\\f103\";\n}\n.ion-arrow-down-b:before {\n  content: \"\\f104\";\n}\n.ion-arrow-down-c:before {\n  content: \"\\f105\";\n}\n.ion-arrow-expand:before {\n  content: \"\\f25e\";\n}\n.ion-arrow-graph-down-left:before {\n  content: \"\\f25f\";\n}\n.ion-arrow-graph-down-right:before {\n  content: \"\\f260\";\n}\n.ion-arrow-graph-up-left:before {\n  content: \"\\f261\";\n}\n.ion-arrow-graph-up-right:before {\n  content: \"\\f262\";\n}\n.ion-arrow-left-a:before {\n  content: \"\\f106\";\n}\n.ion-arrow-left-b:before {\n  content: \"\\f107\";\n}\n.ion-arrow-left-c:before {\n  content: \"\\f108\";\n}\n.ion-arrow-move:before {\n  content: \"\\f263\";\n}\n.ion-arrow-resize:before {\n  content: \"\\f264\";\n}\n.ion-arrow-return-left:before {\n  content: \"\\f265\";\n}\n.ion-arrow-return-right:before {\n  content: \"\\f266\";\n}\n.ion-arrow-right-a:before {\n  content: \"\\f109\";\n}\n.ion-arrow-right-b:before {\n  content: \"\\f10a\";\n}\n.ion-arrow-right-c:before {\n  content: \"\\f10b\";\n}\n.ion-arrow-shrink:before {\n  content: \"\\f267\";\n}\n.ion-arrow-swap:before {\n  content: \"\\f268\";\n}\n.ion-arrow-up-a:before {\n  content: \"\\f10c\";\n}\n.ion-arrow-up-b:before {\n  content: \"\\f10d\";\n}\n.ion-arrow-up-c:before {\n  content: \"\\f10e\";\n}\n.ion-asterisk:before {\n  content: \"\\f314\";\n}\n.ion-at:before {\n  content: \"\\f10f\";\n}\n.ion-backspace:before {\n  content: \"\\f3bf\";\n}\n.ion-backspace-outline:before {\n  content: \"\\f3be\";\n}\n.ion-bag:before {\n  content: \"\\f110\";\n}\n.ion-battery-charging:before {\n  content: \"\\f111\";\n}\n.ion-battery-empty:before {\n  content: \"\\f112\";\n}\n.ion-battery-full:before {\n  content: \"\\f113\";\n}\n.ion-battery-half:before {\n  content: \"\\f114\";\n}\n.ion-battery-low:before {\n  content: \"\\f115\";\n}\n.ion-beaker:before {\n  content: \"\\f269\";\n}\n.ion-beer:before {\n  content: \"\\f26a\";\n}\n.ion-bluetooth:before {\n  content: \"\\f116\";\n}\n.ion-bonfire:before {\n  content: \"\\f315\";\n}\n.ion-bookmark:before {\n  content: \"\\f26b\";\n}\n.ion-bowtie:before {\n  content: \"\\f3c0\";\n}\n.ion-briefcase:before {\n  content: \"\\f26c\";\n}\n.ion-bug:before {\n  content: \"\\f2be\";\n}\n.ion-calculator:before {\n  content: \"\\f26d\";\n}\n.ion-calendar:before {\n  content: \"\\f117\";\n}\n.ion-camera:before {\n  content: \"\\f118\";\n}\n.ion-card:before {\n  content: \"\\f119\";\n}\n.ion-cash:before {\n  content: \"\\f316\";\n}\n.ion-chatbox:before {\n  content: \"\\f11b\";\n}\n.ion-chatbox-working:before {\n  content: \"\\f11a\";\n}\n.ion-chatboxes:before {\n  content: \"\\f11c\";\n}\n.ion-chatbubble:before {\n  content: \"\\f11e\";\n}\n.ion-chatbubble-working:before {\n  content: \"\\f11d\";\n}\n.ion-chatbubbles:before {\n  content: \"\\f11f\";\n}\n.ion-checkmark:before {\n  content: \"\\f122\";\n}\n.ion-checkmark-circled:before {\n  content: \"\\f120\";\n}\n.ion-checkmark-round:before {\n  content: \"\\f121\";\n}\n.ion-chevron-down:before {\n  content: \"\\f123\";\n}\n.ion-chevron-left:before {\n  content: \"\\f124\";\n}\n.ion-chevron-right:before {\n  content: \"\\f125\";\n}\n.ion-chevron-up:before {\n  content: \"\\f126\";\n}\n.ion-clipboard:before {\n  content: \"\\f127\";\n}\n.ion-clock:before {\n  content: \"\\f26e\";\n}\n.ion-close:before {\n  content: \"\\f12a\";\n}\n.ion-close-circled:before {\n  content: \"\\f128\";\n}\n.ion-close-round:before {\n  content: \"\\f129\";\n}\n.ion-closed-captioning:before {\n  content: \"\\f317\";\n}\n.ion-cloud:before {\n  content: \"\\f12b\";\n}\n.ion-code:before {\n  content: \"\\f271\";\n}\n.ion-code-download:before {\n  content: \"\\f26f\";\n}\n.ion-code-working:before {\n  content: \"\\f270\";\n}\n.ion-coffee:before {\n  content: \"\\f272\";\n}\n.ion-compass:before {\n  content: \"\\f273\";\n}\n.ion-compose:before {\n  content: \"\\f12c\";\n}\n.ion-connection-bars:before {\n  content: \"\\f274\";\n}\n.ion-contrast:before {\n  content: \"\\f275\";\n}\n.ion-crop:before {\n  content: \"\\f3c1\";\n}\n.ion-cube:before {\n  content: \"\\f318\";\n}\n.ion-disc:before {\n  content: \"\\f12d\";\n}\n.ion-document:before {\n  content: \"\\f12f\";\n}\n.ion-document-text:before {\n  content: \"\\f12e\";\n}\n.ion-drag:before {\n  content: \"\\f130\";\n}\n.ion-earth:before {\n  content: \"\\f276\";\n}\n.ion-easel:before {\n  content: \"\\f3c2\";\n}\n.ion-edit:before {\n  content: \"\\f2bf\";\n}\n.ion-egg:before {\n  content: \"\\f277\";\n}\n.ion-eject:before {\n  content: \"\\f131\";\n}\n.ion-email:before {\n  content: \"\\f132\";\n}\n.ion-email-unread:before {\n  content: \"\\f3c3\";\n}\n.ion-erlenmeyer-flask:before {\n  content: \"\\f3c5\";\n}\n.ion-erlenmeyer-flask-bubbles:before {\n  content: \"\\f3c4\";\n}\n.ion-eye:before {\n  content: \"\\f133\";\n}\n.ion-eye-disabled:before {\n  content: \"\\f306\";\n}\n.ion-female:before {\n  content: \"\\f278\";\n}\n.ion-filing:before {\n  content: \"\\f134\";\n}\n.ion-film-marker:before {\n  content: \"\\f135\";\n}\n.ion-fireball:before {\n  content: \"\\f319\";\n}\n.ion-flag:before {\n  content: \"\\f279\";\n}\n.ion-flame:before {\n  content: \"\\f31a\";\n}\n.ion-flash:before {\n  content: \"\\f137\";\n}\n.ion-flash-off:before {\n  content: \"\\f136\";\n}\n.ion-folder:before {\n  content: \"\\f139\";\n}\n.ion-fork:before {\n  content: \"\\f27a\";\n}\n.ion-fork-repo:before {\n  content: \"\\f2c0\";\n}\n.ion-forward:before {\n  content: \"\\f13a\";\n}\n.ion-funnel:before {\n  content: \"\\f31b\";\n}\n.ion-gear-a:before {\n  content: \"\\f13d\";\n}\n.ion-gear-b:before {\n  content: \"\\f13e\";\n}\n.ion-grid:before {\n  content: \"\\f13f\";\n}\n.ion-hammer:before {\n  content: \"\\f27b\";\n}\n.ion-happy:before {\n  content: \"\\f31c\";\n}\n.ion-happy-outline:before {\n  content: \"\\f3c6\";\n}\n.ion-headphone:before {\n  content: \"\\f140\";\n}\n.ion-heart:before {\n  content: \"\\f141\";\n}\n.ion-heart-broken:before {\n  content: \"\\f31d\";\n}\n.ion-help:before {\n  content: \"\\f143\";\n}\n.ion-help-buoy:before {\n  content: \"\\f27c\";\n}\n.ion-help-circled:before {\n  content: \"\\f142\";\n}\n.ion-home:before {\n  content: \"\\f144\";\n}\n.ion-icecream:before {\n  content: \"\\f27d\";\n}\n.ion-image:before {\n  content: \"\\f147\";\n}\n.ion-images:before {\n  content: \"\\f148\";\n}\n.ion-information:before {\n  content: \"\\f14a\";\n}\n.ion-information-circled:before {\n  content: \"\\f149\";\n}\n.ion-ionic:before {\n  content: \"\\f14b\";\n}\n.ion-ios-alarm:before {\n  content: \"\\f3c8\";\n}\n.ion-ios-alarm-outline:before {\n  content: \"\\f3c7\";\n}\n.ion-ios-albums:before {\n  content: \"\\f3ca\";\n}\n.ion-ios-albums-outline:before {\n  content: \"\\f3c9\";\n}\n.ion-ios-americanfootball:before {\n  content: \"\\f3cc\";\n}\n.ion-ios-americanfootball-outline:before {\n  content: \"\\f3cb\";\n}\n.ion-ios-analytics:before {\n  content: \"\\f3ce\";\n}\n.ion-ios-analytics-outline:before {\n  content: \"\\f3cd\";\n}\n.ion-ios-arrow-back:before {\n  content: \"\\f3cf\";\n}\n.ion-ios-arrow-down:before {\n  content: \"\\f3d0\";\n}\n.ion-ios-arrow-forward:before {\n  content: \"\\f3d1\";\n}\n.ion-ios-arrow-left:before {\n  content: \"\\f3d2\";\n}\n.ion-ios-arrow-right:before {\n  content: \"\\f3d3\";\n}\n.ion-ios-arrow-thin-down:before {\n  content: \"\\f3d4\";\n}\n.ion-ios-arrow-thin-left:before {\n  content: \"\\f3d5\";\n}\n.ion-ios-arrow-thin-right:before {\n  content: \"\\f3d6\";\n}\n.ion-ios-arrow-thin-up:before {\n  content: \"\\f3d7\";\n}\n.ion-ios-arrow-up:before {\n  content: \"\\f3d8\";\n}\n.ion-ios-at:before {\n  content: \"\\f3da\";\n}\n.ion-ios-at-outline:before {\n  content: \"\\f3d9\";\n}\n.ion-ios-barcode:before {\n  content: \"\\f3dc\";\n}\n.ion-ios-barcode-outline:before {\n  content: \"\\f3db\";\n}\n.ion-ios-baseball:before {\n  content: \"\\f3de\";\n}\n.ion-ios-baseball-outline:before {\n  content: \"\\f3dd\";\n}\n.ion-ios-basketball:before {\n  content: \"\\f3e0\";\n}\n.ion-ios-basketball-outline:before {\n  content: \"\\f3df\";\n}\n.ion-ios-bell:before {\n  content: \"\\f3e2\";\n}\n.ion-ios-bell-outline:before {\n  content: \"\\f3e1\";\n}\n.ion-ios-body:before {\n  content: \"\\f3e4\";\n}\n.ion-ios-body-outline:before {\n  content: \"\\f3e3\";\n}\n.ion-ios-bolt:before {\n  content: \"\\f3e6\";\n}\n.ion-ios-bolt-outline:before {\n  content: \"\\f3e5\";\n}\n.ion-ios-book:before {\n  content: \"\\f3e8\";\n}\n.ion-ios-book-outline:before {\n  content: \"\\f3e7\";\n}\n.ion-ios-bookmarks:before {\n  content: \"\\f3ea\";\n}\n.ion-ios-bookmarks-outline:before {\n  content: \"\\f3e9\";\n}\n.ion-ios-box:before {\n  content: \"\\f3ec\";\n}\n.ion-ios-box-outline:before {\n  content: \"\\f3eb\";\n}\n.ion-ios-briefcase:before {\n  content: \"\\f3ee\";\n}\n.ion-ios-briefcase-outline:before {\n  content: \"\\f3ed\";\n}\n.ion-ios-browsers:before {\n  content: \"\\f3f0\";\n}\n.ion-ios-browsers-outline:before {\n  content: \"\\f3ef\";\n}\n.ion-ios-calculator:before {\n  content: \"\\f3f2\";\n}\n.ion-ios-calculator-outline:before {\n  content: \"\\f3f1\";\n}\n.ion-ios-calendar:before {\n  content: \"\\f3f4\";\n}\n.ion-ios-calendar-outline:before {\n  content: \"\\f3f3\";\n}\n.ion-ios-camera:before {\n  content: \"\\f3f6\";\n}\n.ion-ios-camera-outline:before {\n  content: \"\\f3f5\";\n}\n.ion-ios-cart:before {\n  content: \"\\f3f8\";\n}\n.ion-ios-cart-outline:before {\n  content: \"\\f3f7\";\n}\n.ion-ios-chatboxes:before {\n  content: \"\\f3fa\";\n}\n.ion-ios-chatboxes-outline:before {\n  content: \"\\f3f9\";\n}\n.ion-ios-chatbubble:before {\n  content: \"\\f3fc\";\n}\n.ion-ios-chatbubble-outline:before {\n  content: \"\\f3fb\";\n}\n.ion-ios-checkmark:before {\n  content: \"\\f3ff\";\n}\n.ion-ios-checkmark-empty:before {\n  content: \"\\f3fd\";\n}\n.ion-ios-checkmark-outline:before {\n  content: \"\\f3fe\";\n}\n.ion-ios-circle-filled:before {\n  content: \"\\f400\";\n}\n.ion-ios-circle-outline:before {\n  content: \"\\f401\";\n}\n.ion-ios-clock:before {\n  content: \"\\f403\";\n}\n.ion-ios-clock-outline:before {\n  content: \"\\f402\";\n}\n.ion-ios-close:before {\n  content: \"\\f406\";\n}\n.ion-ios-close-empty:before {\n  content: \"\\f404\";\n}\n.ion-ios-close-outline:before {\n  content: \"\\f405\";\n}\n.ion-ios-cloud:before {\n  content: \"\\f40c\";\n}\n.ion-ios-cloud-download:before {\n  content: \"\\f408\";\n}\n.ion-ios-cloud-download-outline:before {\n  content: \"\\f407\";\n}\n.ion-ios-cloud-outline:before {\n  content: \"\\f409\";\n}\n.ion-ios-cloud-upload:before {\n  content: \"\\f40b\";\n}\n.ion-ios-cloud-upload-outline:before {\n  content: \"\\f40a\";\n}\n.ion-ios-cloudy:before {\n  content: \"\\f410\";\n}\n.ion-ios-cloudy-night:before {\n  content: \"\\f40e\";\n}\n.ion-ios-cloudy-night-outline:before {\n  content: \"\\f40d\";\n}\n.ion-ios-cloudy-outline:before {\n  content: \"\\f40f\";\n}\n.ion-ios-cog:before {\n  content: \"\\f412\";\n}\n.ion-ios-cog-outline:before {\n  content: \"\\f411\";\n}\n.ion-ios-color-filter:before {\n  content: \"\\f414\";\n}\n.ion-ios-color-filter-outline:before {\n  content: \"\\f413\";\n}\n.ion-ios-color-wand:before {\n  content: \"\\f416\";\n}\n.ion-ios-color-wand-outline:before {\n  content: \"\\f415\";\n}\n.ion-ios-compose:before {\n  content: \"\\f418\";\n}\n.ion-ios-compose-outline:before {\n  content: \"\\f417\";\n}\n.ion-ios-contact:before {\n  content: \"\\f41a\";\n}\n.ion-ios-contact-outline:before {\n  content: \"\\f419\";\n}\n.ion-ios-copy:before {\n  content: \"\\f41c\";\n}\n.ion-ios-copy-outline:before {\n  content: \"\\f41b\";\n}\n.ion-ios-crop:before {\n  content: \"\\f41e\";\n}\n.ion-ios-crop-strong:before {\n  content: \"\\f41d\";\n}\n.ion-ios-download:before {\n  content: \"\\f420\";\n}\n.ion-ios-download-outline:before {\n  content: \"\\f41f\";\n}\n.ion-ios-drag:before {\n  content: \"\\f421\";\n}\n.ion-ios-email:before {\n  content: \"\\f423\";\n}\n.ion-ios-email-outline:before {\n  content: \"\\f422\";\n}\n.ion-ios-eye:before {\n  content: \"\\f425\";\n}\n.ion-ios-eye-outline:before {\n  content: \"\\f424\";\n}\n.ion-ios-fastforward:before {\n  content: \"\\f427\";\n}\n.ion-ios-fastforward-outline:before {\n  content: \"\\f426\";\n}\n.ion-ios-filing:before {\n  content: \"\\f429\";\n}\n.ion-ios-filing-outline:before {\n  content: \"\\f428\";\n}\n.ion-ios-film:before {\n  content: \"\\f42b\";\n}\n.ion-ios-film-outline:before {\n  content: \"\\f42a\";\n}\n.ion-ios-flag:before {\n  content: \"\\f42d\";\n}\n.ion-ios-flag-outline:before {\n  content: \"\\f42c\";\n}\n.ion-ios-flame:before {\n  content: \"\\f42f\";\n}\n.ion-ios-flame-outline:before {\n  content: \"\\f42e\";\n}\n.ion-ios-flask:before {\n  content: \"\\f431\";\n}\n.ion-ios-flask-outline:before {\n  content: \"\\f430\";\n}\n.ion-ios-flower:before {\n  content: \"\\f433\";\n}\n.ion-ios-flower-outline:before {\n  content: \"\\f432\";\n}\n.ion-ios-folder:before {\n  content: \"\\f435\";\n}\n.ion-ios-folder-outline:before {\n  content: \"\\f434\";\n}\n.ion-ios-football:before {\n  content: \"\\f437\";\n}\n.ion-ios-football-outline:before {\n  content: \"\\f436\";\n}\n.ion-ios-game-controller-a:before {\n  content: \"\\f439\";\n}\n.ion-ios-game-controller-a-outline:before {\n  content: \"\\f438\";\n}\n.ion-ios-game-controller-b:before {\n  content: \"\\f43b\";\n}\n.ion-ios-game-controller-b-outline:before {\n  content: \"\\f43a\";\n}\n.ion-ios-gear:before {\n  content: \"\\f43d\";\n}\n.ion-ios-gear-outline:before {\n  content: \"\\f43c\";\n}\n.ion-ios-glasses:before {\n  content: \"\\f43f\";\n}\n.ion-ios-glasses-outline:before {\n  content: \"\\f43e\";\n}\n.ion-ios-grid-view:before {\n  content: \"\\f441\";\n}\n.ion-ios-grid-view-outline:before {\n  content: \"\\f440\";\n}\n.ion-ios-heart:before {\n  content: \"\\f443\";\n}\n.ion-ios-heart-outline:before {\n  content: \"\\f442\";\n}\n.ion-ios-help:before {\n  content: \"\\f446\";\n}\n.ion-ios-help-empty:before {\n  content: \"\\f444\";\n}\n.ion-ios-help-outline:before {\n  content: \"\\f445\";\n}\n.ion-ios-home:before {\n  content: \"\\f448\";\n}\n.ion-ios-home-outline:before {\n  content: \"\\f447\";\n}\n.ion-ios-infinite:before {\n  content: \"\\f44a\";\n}\n.ion-ios-infinite-outline:before {\n  content: \"\\f449\";\n}\n.ion-ios-information:before {\n  content: \"\\f44d\";\n}\n.ion-ios-information-empty:before {\n  content: \"\\f44b\";\n}\n.ion-ios-information-outline:before {\n  content: \"\\f44c\";\n}\n.ion-ios-ionic-outline:before {\n  content: \"\\f44e\";\n}\n.ion-ios-keypad:before {\n  content: \"\\f450\";\n}\n.ion-ios-keypad-outline:before {\n  content: \"\\f44f\";\n}\n.ion-ios-lightbulb:before {\n  content: \"\\f452\";\n}\n.ion-ios-lightbulb-outline:before {\n  content: \"\\f451\";\n}\n.ion-ios-list:before {\n  content: \"\\f454\";\n}\n.ion-ios-list-outline:before {\n  content: \"\\f453\";\n}\n.ion-ios-location:before {\n  content: \"\\f456\";\n}\n.ion-ios-location-outline:before {\n  content: \"\\f455\";\n}\n.ion-ios-locked:before {\n  content: \"\\f458\";\n}\n.ion-ios-locked-outline:before {\n  content: \"\\f457\";\n}\n.ion-ios-loop:before {\n  content: \"\\f45a\";\n}\n.ion-ios-loop-strong:before {\n  content: \"\\f459\";\n}\n.ion-ios-medical:before {\n  content: \"\\f45c\";\n}\n.ion-ios-medical-outline:before {\n  content: \"\\f45b\";\n}\n.ion-ios-medkit:before {\n  content: \"\\f45e\";\n}\n.ion-ios-medkit-outline:before {\n  content: \"\\f45d\";\n}\n.ion-ios-mic:before {\n  content: \"\\f461\";\n}\n.ion-ios-mic-off:before {\n  content: \"\\f45f\";\n}\n.ion-ios-mic-outline:before {\n  content: \"\\f460\";\n}\n.ion-ios-minus:before {\n  content: \"\\f464\";\n}\n.ion-ios-minus-empty:before {\n  content: \"\\f462\";\n}\n.ion-ios-minus-outline:before {\n  content: \"\\f463\";\n}\n.ion-ios-monitor:before {\n  content: \"\\f466\";\n}\n.ion-ios-monitor-outline:before {\n  content: \"\\f465\";\n}\n.ion-ios-moon:before {\n  content: \"\\f468\";\n}\n.ion-ios-moon-outline:before {\n  content: \"\\f467\";\n}\n.ion-ios-more:before {\n  content: \"\\f46a\";\n}\n.ion-ios-more-outline:before {\n  content: \"\\f469\";\n}\n.ion-ios-musical-note:before {\n  content: \"\\f46b\";\n}\n.ion-ios-musical-notes:before {\n  content: \"\\f46c\";\n}\n.ion-ios-navigate:before {\n  content: \"\\f46e\";\n}\n.ion-ios-navigate-outline:before {\n  content: \"\\f46d\";\n}\n.ion-ios-nutrition:before {\n  content: \"\\f470\";\n}\n.ion-ios-nutrition-outline:before {\n  content: \"\\f46f\";\n}\n.ion-ios-paper:before {\n  content: \"\\f472\";\n}\n.ion-ios-paper-outline:before {\n  content: \"\\f471\";\n}\n.ion-ios-paperplane:before {\n  content: \"\\f474\";\n}\n.ion-ios-paperplane-outline:before {\n  content: \"\\f473\";\n}\n.ion-ios-partlysunny:before {\n  content: \"\\f476\";\n}\n.ion-ios-partlysunny-outline:before {\n  content: \"\\f475\";\n}\n.ion-ios-pause:before {\n  content: \"\\f478\";\n}\n.ion-ios-pause-outline:before {\n  content: \"\\f477\";\n}\n.ion-ios-paw:before {\n  content: \"\\f47a\";\n}\n.ion-ios-paw-outline:before {\n  content: \"\\f479\";\n}\n.ion-ios-people:before {\n  content: \"\\f47c\";\n}\n.ion-ios-people-outline:before {\n  content: \"\\f47b\";\n}\n.ion-ios-person:before {\n  content: \"\\f47e\";\n}\n.ion-ios-person-outline:before {\n  content: \"\\f47d\";\n}\n.ion-ios-personadd:before {\n  content: \"\\f480\";\n}\n.ion-ios-personadd-outline:before {\n  content: \"\\f47f\";\n}\n.ion-ios-photos:before {\n  content: \"\\f482\";\n}\n.ion-ios-photos-outline:before {\n  content: \"\\f481\";\n}\n.ion-ios-pie:before {\n  content: \"\\f484\";\n}\n.ion-ios-pie-outline:before {\n  content: \"\\f483\";\n}\n.ion-ios-pint:before {\n  content: \"\\f486\";\n}\n.ion-ios-pint-outline:before {\n  content: \"\\f485\";\n}\n.ion-ios-play:before {\n  content: \"\\f488\";\n}\n.ion-ios-play-outline:before {\n  content: \"\\f487\";\n}\n.ion-ios-plus:before {\n  content: \"\\f48b\";\n}\n.ion-ios-plus-empty:before {\n  content: \"\\f489\";\n}\n.ion-ios-plus-outline:before {\n  content: \"\\f48a\";\n}\n.ion-ios-pricetag:before {\n  content: \"\\f48d\";\n}\n.ion-ios-pricetag-outline:before {\n  content: \"\\f48c\";\n}\n.ion-ios-pricetags:before {\n  content: \"\\f48f\";\n}\n.ion-ios-pricetags-outline:before {\n  content: \"\\f48e\";\n}\n.ion-ios-printer:before {\n  content: \"\\f491\";\n}\n.ion-ios-printer-outline:before {\n  content: \"\\f490\";\n}\n.ion-ios-pulse:before {\n  content: \"\\f493\";\n}\n.ion-ios-pulse-strong:before {\n  content: \"\\f492\";\n}\n.ion-ios-rainy:before {\n  content: \"\\f495\";\n}\n.ion-ios-rainy-outline:before {\n  content: \"\\f494\";\n}\n.ion-ios-recording:before {\n  content: \"\\f497\";\n}\n.ion-ios-recording-outline:before {\n  content: \"\\f496\";\n}\n.ion-ios-redo:before {\n  content: \"\\f499\";\n}\n.ion-ios-redo-outline:before {\n  content: \"\\f498\";\n}\n.ion-ios-refresh:before {\n  content: \"\\f49c\";\n}\n.ion-ios-refresh-empty:before {\n  content: \"\\f49a\";\n}\n.ion-ios-refresh-outline:before {\n  content: \"\\f49b\";\n}\n.ion-ios-reload:before {\n  content: \"\\f49d\";\n}\n.ion-ios-reverse-camera:before {\n  content: \"\\f49f\";\n}\n.ion-ios-reverse-camera-outline:before {\n  content: \"\\f49e\";\n}\n.ion-ios-rewind:before {\n  content: \"\\f4a1\";\n}\n.ion-ios-rewind-outline:before {\n  content: \"\\f4a0\";\n}\n.ion-ios-rose:before {\n  content: \"\\f4a3\";\n}\n.ion-ios-rose-outline:before {\n  content: \"\\f4a2\";\n}\n.ion-ios-search:before {\n  content: \"\\f4a5\";\n}\n.ion-ios-search-strong:before {\n  content: \"\\f4a4\";\n}\n.ion-ios-settings:before {\n  content: \"\\f4a7\";\n}\n.ion-ios-settings-strong:before {\n  content: \"\\f4a6\";\n}\n.ion-ios-shuffle:before {\n  content: \"\\f4a9\";\n}\n.ion-ios-shuffle-strong:before {\n  content: \"\\f4a8\";\n}\n.ion-ios-skipbackward:before {\n  content: \"\\f4ab\";\n}\n.ion-ios-skipbackward-outline:before {\n  content: \"\\f4aa\";\n}\n.ion-ios-skipforward:before {\n  content: \"\\f4ad\";\n}\n.ion-ios-skipforward-outline:before {\n  content: \"\\f4ac\";\n}\n.ion-ios-snowy:before {\n  content: \"\\f4ae\";\n}\n.ion-ios-speedometer:before {\n  content: \"\\f4b0\";\n}\n.ion-ios-speedometer-outline:before {\n  content: \"\\f4af\";\n}\n.ion-ios-star:before {\n  content: \"\\f4b3\";\n}\n.ion-ios-star-half:before {\n  content: \"\\f4b1\";\n}\n.ion-ios-star-outline:before {\n  content: \"\\f4b2\";\n}\n.ion-ios-stopwatch:before {\n  content: \"\\f4b5\";\n}\n.ion-ios-stopwatch-outline:before {\n  content: \"\\f4b4\";\n}\n.ion-ios-sunny:before {\n  content: \"\\f4b7\";\n}\n.ion-ios-sunny-outline:before {\n  content: \"\\f4b6\";\n}\n.ion-ios-telephone:before {\n  content: \"\\f4b9\";\n}\n.ion-ios-telephone-outline:before {\n  content: \"\\f4b8\";\n}\n.ion-ios-tennisball:before {\n  content: \"\\f4bb\";\n}\n.ion-ios-tennisball-outline:before {\n  content: \"\\f4ba\";\n}\n.ion-ios-thunderstorm:before {\n  content: \"\\f4bd\";\n}\n.ion-ios-thunderstorm-outline:before {\n  content: \"\\f4bc\";\n}\n.ion-ios-time:before {\n  content: \"\\f4bf\";\n}\n.ion-ios-time-outline:before {\n  content: \"\\f4be\";\n}\n.ion-ios-timer:before {\n  content: \"\\f4c1\";\n}\n.ion-ios-timer-outline:before {\n  content: \"\\f4c0\";\n}\n.ion-ios-toggle:before {\n  content: \"\\f4c3\";\n}\n.ion-ios-toggle-outline:before {\n  content: \"\\f4c2\";\n}\n.ion-ios-trash:before {\n  content: \"\\f4c5\";\n}\n.ion-ios-trash-outline:before {\n  content: \"\\f4c4\";\n}\n.ion-ios-undo:before {\n  content: \"\\f4c7\";\n}\n.ion-ios-undo-outline:before {\n  content: \"\\f4c6\";\n}\n.ion-ios-unlocked:before {\n  content: \"\\f4c9\";\n}\n.ion-ios-unlocked-outline:before {\n  content: \"\\f4c8\";\n}\n.ion-ios-upload:before {\n  content: \"\\f4cb\";\n}\n.ion-ios-upload-outline:before {\n  content: \"\\f4ca\";\n}\n.ion-ios-videocam:before {\n  content: \"\\f4cd\";\n}\n.ion-ios-videocam-outline:before {\n  content: \"\\f4cc\";\n}\n.ion-ios-volume-high:before {\n  content: \"\\f4ce\";\n}\n.ion-ios-volume-low:before {\n  content: \"\\f4cf\";\n}\n.ion-ios-wineglass:before {\n  content: \"\\f4d1\";\n}\n.ion-ios-wineglass-outline:before {\n  content: \"\\f4d0\";\n}\n.ion-ios-world:before {\n  content: \"\\f4d3\";\n}\n.ion-ios-world-outline:before {\n  content: \"\\f4d2\";\n}\n.ion-ipad:before {\n  content: \"\\f1f9\";\n}\n.ion-iphone:before {\n  content: \"\\f1fa\";\n}\n.ion-ipod:before {\n  content: \"\\f1fb\";\n}\n.ion-jet:before {\n  content: \"\\f295\";\n}\n.ion-key:before {\n  content: \"\\f296\";\n}\n.ion-knife:before {\n  content: \"\\f297\";\n}\n.ion-laptop:before {\n  content: \"\\f1fc\";\n}\n.ion-leaf:before {\n  content: \"\\f1fd\";\n}\n.ion-levels:before {\n  content: \"\\f298\";\n}\n.ion-lightbulb:before {\n  content: \"\\f299\";\n}\n.ion-link:before {\n  content: \"\\f1fe\";\n}\n.ion-load-a:before {\n  content: \"\\f29a\";\n}\n.ion-load-b:before {\n  content: \"\\f29b\";\n}\n.ion-load-c:before {\n  content: \"\\f29c\";\n}\n.ion-load-d:before {\n  content: \"\\f29d\";\n}\n.ion-location:before {\n  content: \"\\f1ff\";\n}\n.ion-lock-combination:before {\n  content: \"\\f4d4\";\n}\n.ion-locked:before {\n  content: \"\\f200\";\n}\n.ion-log-in:before {\n  content: \"\\f29e\";\n}\n.ion-log-out:before {\n  content: \"\\f29f\";\n}\n.ion-loop:before {\n  content: \"\\f201\";\n}\n.ion-magnet:before {\n  content: \"\\f2a0\";\n}\n.ion-male:before {\n  content: \"\\f2a1\";\n}\n.ion-man:before {\n  content: \"\\f202\";\n}\n.ion-map:before {\n  content: \"\\f203\";\n}\n.ion-medkit:before {\n  content: \"\\f2a2\";\n}\n.ion-merge:before {\n  content: \"\\f33f\";\n}\n.ion-mic-a:before {\n  content: \"\\f204\";\n}\n.ion-mic-b:before {\n  content: \"\\f205\";\n}\n.ion-mic-c:before {\n  content: \"\\f206\";\n}\n.ion-minus:before {\n  content: \"\\f209\";\n}\n.ion-minus-circled:before {\n  content: \"\\f207\";\n}\n.ion-minus-round:before {\n  content: \"\\f208\";\n}\n.ion-model-s:before {\n  content: \"\\f2c1\";\n}\n.ion-monitor:before {\n  content: \"\\f20a\";\n}\n.ion-more:before {\n  content: \"\\f20b\";\n}\n.ion-mouse:before {\n  content: \"\\f340\";\n}\n.ion-music-note:before {\n  content: \"\\f20c\";\n}\n.ion-navicon:before {\n  content: \"\\f20e\";\n}\n.ion-navicon-round:before {\n  content: \"\\f20d\";\n}\n.ion-navigate:before {\n  content: \"\\f2a3\";\n}\n.ion-network:before {\n  content: \"\\f341\";\n}\n.ion-no-smoking:before {\n  content: \"\\f2c2\";\n}\n.ion-nuclear:before {\n  content: \"\\f2a4\";\n}\n.ion-outlet:before {\n  content: \"\\f342\";\n}\n.ion-paintbrush:before {\n  content: \"\\f4d5\";\n}\n.ion-paintbucket:before {\n  content: \"\\f4d6\";\n}\n.ion-paper-airplane:before {\n  content: \"\\f2c3\";\n}\n.ion-paperclip:before {\n  content: \"\\f20f\";\n}\n.ion-pause:before {\n  content: \"\\f210\";\n}\n.ion-person:before {\n  content: \"\\f213\";\n}\n.ion-person-add:before {\n  content: \"\\f211\";\n}\n.ion-person-stalker:before {\n  content: \"\\f212\";\n}\n.ion-pie-graph:before {\n  content: \"\\f2a5\";\n}\n.ion-pin:before {\n  content: \"\\f2a6\";\n}\n.ion-pinpoint:before {\n  content: \"\\f2a7\";\n}\n.ion-pizza:before {\n  content: \"\\f2a8\";\n}\n.ion-plane:before {\n  content: \"\\f214\";\n}\n.ion-planet:before {\n  content: \"\\f343\";\n}\n.ion-play:before {\n  content: \"\\f215\";\n}\n.ion-playstation:before {\n  content: \"\\f30a\";\n}\n.ion-plus:before {\n  content: \"\\f218\";\n}\n.ion-plus-circled:before {\n  content: \"\\f216\";\n}\n.ion-plus-round:before {\n  content: \"\\f217\";\n}\n.ion-podium:before {\n  content: \"\\f344\";\n}\n.ion-pound:before {\n  content: \"\\f219\";\n}\n.ion-power:before {\n  content: \"\\f2a9\";\n}\n.ion-pricetag:before {\n  content: \"\\f2aa\";\n}\n.ion-pricetags:before {\n  content: \"\\f2ab\";\n}\n.ion-printer:before {\n  content: \"\\f21a\";\n}\n.ion-pull-request:before {\n  content: \"\\f345\";\n}\n.ion-qr-scanner:before {\n  content: \"\\f346\";\n}\n.ion-quote:before {\n  content: \"\\f347\";\n}\n.ion-radio-waves:before {\n  content: \"\\f2ac\";\n}\n.ion-record:before {\n  content: \"\\f21b\";\n}\n.ion-refresh:before {\n  content: \"\\f21c\";\n}\n.ion-reply:before {\n  content: \"\\f21e\";\n}\n.ion-reply-all:before {\n  content: \"\\f21d\";\n}\n.ion-ribbon-a:before {\n  content: \"\\f348\";\n}\n.ion-ribbon-b:before {\n  content: \"\\f349\";\n}\n.ion-sad:before {\n  content: \"\\f34a\";\n}\n.ion-sad-outline:before {\n  content: \"\\f4d7\";\n}\n.ion-scissors:before {\n  content: \"\\f34b\";\n}\n.ion-search:before {\n  content: \"\\f21f\";\n}\n.ion-settings:before {\n  content: \"\\f2ad\";\n}\n.ion-share:before {\n  content: \"\\f220\";\n}\n.ion-shuffle:before {\n  content: \"\\f221\";\n}\n.ion-skip-backward:before {\n  content: \"\\f222\";\n}\n.ion-skip-forward:before {\n  content: \"\\f223\";\n}\n.ion-social-android:before {\n  content: \"\\f225\";\n}\n.ion-social-android-outline:before {\n  content: \"\\f224\";\n}\n.ion-social-angular:before {\n  content: \"\\f4d9\";\n}\n.ion-social-angular-outline:before {\n  content: \"\\f4d8\";\n}\n.ion-social-apple:before {\n  content: \"\\f227\";\n}\n.ion-social-apple-outline:before {\n  content: \"\\f226\";\n}\n.ion-social-bitcoin:before {\n  content: \"\\f2af\";\n}\n.ion-social-bitcoin-outline:before {\n  content: \"\\f2ae\";\n}\n.ion-social-buffer:before {\n  content: \"\\f229\";\n}\n.ion-social-buffer-outline:before {\n  content: \"\\f228\";\n}\n.ion-social-chrome:before {\n  content: \"\\f4db\";\n}\n.ion-social-chrome-outline:before {\n  content: \"\\f4da\";\n}\n.ion-social-codepen:before {\n  content: \"\\f4dd\";\n}\n.ion-social-codepen-outline:before {\n  content: \"\\f4dc\";\n}\n.ion-social-css3:before {\n  content: \"\\f4df\";\n}\n.ion-social-css3-outline:before {\n  content: \"\\f4de\";\n}\n.ion-social-designernews:before {\n  content: \"\\f22b\";\n}\n.ion-social-designernews-outline:before {\n  content: \"\\f22a\";\n}\n.ion-social-dribbble:before {\n  content: \"\\f22d\";\n}\n.ion-social-dribbble-outline:before {\n  content: \"\\f22c\";\n}\n.ion-social-dropbox:before {\n  content: \"\\f22f\";\n}\n.ion-social-dropbox-outline:before {\n  content: \"\\f22e\";\n}\n.ion-social-euro:before {\n  content: \"\\f4e1\";\n}\n.ion-social-euro-outline:before {\n  content: \"\\f4e0\";\n}\n.ion-social-facebook:before {\n  content: \"\\f231\";\n}\n.ion-social-facebook-outline:before {\n  content: \"\\f230\";\n}\n.ion-social-foursquare:before {\n  content: \"\\f34d\";\n}\n.ion-social-foursquare-outline:before {\n  content: \"\\f34c\";\n}\n.ion-social-freebsd-devil:before {\n  content: \"\\f2c4\";\n}\n.ion-social-github:before {\n  content: \"\\f233\";\n}\n.ion-social-github-outline:before {\n  content: \"\\f232\";\n}\n.ion-social-google:before {\n  content: \"\\f34f\";\n}\n.ion-social-google-outline:before {\n  content: \"\\f34e\";\n}\n.ion-social-googleplus:before {\n  content: \"\\f235\";\n}\n.ion-social-googleplus-outline:before {\n  content: \"\\f234\";\n}\n.ion-social-hackernews:before {\n  content: \"\\f237\";\n}\n.ion-social-hackernews-outline:before {\n  content: \"\\f236\";\n}\n.ion-social-html5:before {\n  content: \"\\f4e3\";\n}\n.ion-social-html5-outline:before {\n  content: \"\\f4e2\";\n}\n.ion-social-instagram:before {\n  content: \"\\f351\";\n}\n.ion-social-instagram-outline:before {\n  content: \"\\f350\";\n}\n.ion-social-javascript:before {\n  content: \"\\f4e5\";\n}\n.ion-social-javascript-outline:before {\n  content: \"\\f4e4\";\n}\n.ion-social-linkedin:before {\n  content: \"\\f239\";\n}\n.ion-social-linkedin-outline:before {\n  content: \"\\f238\";\n}\n.ion-social-markdown:before {\n  content: \"\\f4e6\";\n}\n.ion-social-nodejs:before {\n  content: \"\\f4e7\";\n}\n.ion-social-octocat:before {\n  content: \"\\f4e8\";\n}\n.ion-social-pinterest:before {\n  content: \"\\f2b1\";\n}\n.ion-social-pinterest-outline:before {\n  content: \"\\f2b0\";\n}\n.ion-social-python:before {\n  content: \"\\f4e9\";\n}\n.ion-social-reddit:before {\n  content: \"\\f23b\";\n}\n.ion-social-reddit-outline:before {\n  content: \"\\f23a\";\n}\n.ion-social-rss:before {\n  content: \"\\f23d\";\n}\n.ion-social-rss-outline:before {\n  content: \"\\f23c\";\n}\n.ion-social-sass:before {\n  content: \"\\f4ea\";\n}\n.ion-social-skype:before {\n  content: \"\\f23f\";\n}\n.ion-social-skype-outline:before {\n  content: \"\\f23e\";\n}\n.ion-social-snapchat:before {\n  content: \"\\f4ec\";\n}\n.ion-social-snapchat-outline:before {\n  content: \"\\f4eb\";\n}\n.ion-social-tumblr:before {\n  content: \"\\f241\";\n}\n.ion-social-tumblr-outline:before {\n  content: \"\\f240\";\n}\n.ion-social-tux:before {\n  content: \"\\f2c5\";\n}\n.ion-social-twitch:before {\n  content: \"\\f4ee\";\n}\n.ion-social-twitch-outline:before {\n  content: \"\\f4ed\";\n}\n.ion-social-twitter:before {\n  content: \"\\f243\";\n}\n.ion-social-twitter-outline:before {\n  content: \"\\f242\";\n}\n.ion-social-usd:before {\n  content: \"\\f353\";\n}\n.ion-social-usd-outline:before {\n  content: \"\\f352\";\n}\n.ion-social-vimeo:before {\n  content: \"\\f245\";\n}\n.ion-social-vimeo-outline:before {\n  content: \"\\f244\";\n}\n.ion-social-whatsapp:before {\n  content: \"\\f4f0\";\n}\n.ion-social-whatsapp-outline:before {\n  content: \"\\f4ef\";\n}\n.ion-social-windows:before {\n  content: \"\\f247\";\n}\n.ion-social-windows-outline:before {\n  content: \"\\f246\";\n}\n.ion-social-wordpress:before {\n  content: \"\\f249\";\n}\n.ion-social-wordpress-outline:before {\n  content: \"\\f248\";\n}\n.ion-social-yahoo:before {\n  content: \"\\f24b\";\n}\n.ion-social-yahoo-outline:before {\n  content: \"\\f24a\";\n}\n.ion-social-yen:before {\n  content: \"\\f4f2\";\n}\n.ion-social-yen-outline:before {\n  content: \"\\f4f1\";\n}\n.ion-social-youtube:before {\n  content: \"\\f24d\";\n}\n.ion-social-youtube-outline:before {\n  content: \"\\f24c\";\n}\n.ion-soup-can:before {\n  content: \"\\f4f4\";\n}\n.ion-soup-can-outline:before {\n  content: \"\\f4f3\";\n}\n.ion-speakerphone:before {\n  content: \"\\f2b2\";\n}\n.ion-speedometer:before {\n  content: \"\\f2b3\";\n}\n.ion-spoon:before {\n  content: \"\\f2b4\";\n}\n.ion-star:before {\n  content: \"\\f24e\";\n}\n.ion-stats-bars:before {\n  content: \"\\f2b5\";\n}\n.ion-steam:before {\n  content: \"\\f30b\";\n}\n.ion-stop:before {\n  content: \"\\f24f\";\n}\n.ion-thermometer:before {\n  content: \"\\f2b6\";\n}\n.ion-thumbsdown:before {\n  content: \"\\f250\";\n}\n.ion-thumbsup:before {\n  content: \"\\f251\";\n}\n.ion-toggle:before {\n  content: \"\\f355\";\n}\n.ion-toggle-filled:before {\n  content: \"\\f354\";\n}\n.ion-transgender:before {\n  content: \"\\f4f5\";\n}\n.ion-trash-a:before {\n  content: \"\\f252\";\n}\n.ion-trash-b:before {\n  content: \"\\f253\";\n}\n.ion-trophy:before {\n  content: \"\\f356\";\n}\n.ion-tshirt:before {\n  content: \"\\f4f7\";\n}\n.ion-tshirt-outline:before {\n  content: \"\\f4f6\";\n}\n.ion-umbrella:before {\n  content: \"\\f2b7\";\n}\n.ion-university:before {\n  content: \"\\f357\";\n}\n.ion-unlocked:before {\n  content: \"\\f254\";\n}\n.ion-upload:before {\n  content: \"\\f255\";\n}\n.ion-usb:before {\n  content: \"\\f2b8\";\n}\n.ion-videocamera:before {\n  content: \"\\f256\";\n}\n.ion-volume-high:before {\n  content: \"\\f257\";\n}\n.ion-volume-low:before {\n  content: \"\\f258\";\n}\n.ion-volume-medium:before {\n  content: \"\\f259\";\n}\n.ion-volume-mute:before {\n  content: \"\\f25a\";\n}\n.ion-wand:before {\n  content: \"\\f358\";\n}\n.ion-waterdrop:before {\n  content: \"\\f25b\";\n}\n.ion-wifi:before {\n  content: \"\\f25c\";\n}\n.ion-wineglass:before {\n  content: \"\\f2b9\";\n}\n.ion-woman:before {\n  content: \"\\f25d\";\n}\n.ion-wrench:before {\n  content: \"\\f2ba\";\n}\n.ion-xbox:before {\n  content: \"\\f30c\";\n}\n/*!\nAnimate.css - http://daneden.me/animate\nLicensed under the MIT license - http://opensource.org/licenses/MIT\n\nCopyright (c) 2014 Daniel Eden\n*/\n.animated {\n  -webkit-animation-duration: 1s;\n  animation-duration: 1s;\n  -webkit-animation-fill-mode: both;\n  animation-fill-mode: both;\n}\n.animated.infinite {\n  -webkit-animation-iteration-count: infinite;\n  animation-iteration-count: infinite;\n}\n.animated.hinge {\n  -webkit-animation-duration: 2s;\n  animation-duration: 2s;\n}\n@-webkit-keyframes bounce {\n  0%,\n  100%,\n  20%,\n  53%,\n  80% {\n    -webkit-transition-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1);\n    transition-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1);\n    -webkit-transform: translate3d(0, 0, 0);\n    transform: translate3d(0, 0, 0);\n  }\n  40%,\n  43% {\n    -webkit-transition-timing-function: cubic-bezier(0.755, 0.05, 0.855, 0.06);\n    transition-timing-function: cubic-bezier(0.755, 0.05, 0.855, 0.06);\n    -webkit-transform: translate3d(0, -30px, 0);\n    transform: translate3d(0, -30px, 0);\n  }\n  70% {\n    -webkit-transition-timing-function: cubic-bezier(0.755, 0.05, 0.855, 0.06);\n    transition-timing-function: cubic-bezier(0.755, 0.05, 0.855, 0.06);\n    -webkit-transform: translate3d(0, -15px, 0);\n    transform: translate3d(0, -15px, 0);\n  }\n  90% {\n    -webkit-transform: translate3d(0, -4px, 0);\n    transform: translate3d(0, -4px, 0);\n  }\n}\n@keyframes bounce {\n  0%,\n  100%,\n  20%,\n  53%,\n  80% {\n    -webkit-transition-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1);\n    transition-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1);\n    -webkit-transform: translate3d(0, 0, 0);\n    transform: translate3d(0, 0, 0);\n  }\n  40%,\n  43% {\n    -webkit-transition-timing-function: cubic-bezier(0.755, 0.05, 0.855, 0.06);\n    transition-timing-function: cubic-bezier(0.755, 0.05, 0.855, 0.06);\n    -webkit-transform: translate3d(0, -30px, 0);\n    transform: translate3d(0, -30px, 0);\n  }\n  70% {\n    -webkit-transition-timing-function: cubic-bezier(0.755, 0.05, 0.855, 0.06);\n    transition-timing-function: cubic-bezier(0.755, 0.05, 0.855, 0.06);\n    -webkit-transform: translate3d(0, -15px, 0);\n    transform: translate3d(0, -15px, 0);\n  }\n  90% {\n    -webkit-transform: translate3d(0, -4px, 0);\n    transform: translate3d(0, -4px, 0);\n  }\n}\n.bounce {\n  -webkit-animation-name: bounce;\n  animation-name: bounce;\n  -webkit-transform-origin: center bottom;\n  -ms-transform-origin: center bottom;\n  transform-origin: center bottom;\n}\n@-webkit-keyframes flash {\n  0%,\n  100%,\n  50% {\n    opacity: 1;\n  }\n  25%,\n  75% {\n    opacity: 0;\n  }\n}\n@keyframes flash {\n  0%,\n  100%,\n  50% {\n    opacity: 1;\n  }\n  25%,\n  75% {\n    opacity: 0;\n  }\n}\n.flash {\n  -webkit-animation-name: flash;\n  animation-name: flash;\n}\n@-webkit-keyframes pulse {\n  0% {\n    -webkit-transform: scale3d(1, 1, 1);\n    transform: scale3d(1, 1, 1);\n  }\n  50% {\n    -webkit-transform: scale3d(1.05, 1.05, 1.05);\n    transform: scale3d(1.05, 1.05, 1.05);\n  }\n  100% {\n    -webkit-transform: scale3d(1, 1, 1);\n    transform: scale3d(1, 1, 1);\n  }\n}\n@keyframes pulse {\n  0% {\n    -webkit-transform: scale3d(1, 1, 1);\n    transform: scale3d(1, 1, 1);\n  }\n  50% {\n    -webkit-transform: scale3d(1.05, 1.05, 1.05);\n    transform: scale3d(1.05, 1.05, 1.05);\n  }\n  100% {\n    -webkit-transform: scale3d(1, 1, 1);\n    transform: scale3d(1, 1, 1);\n  }\n}\n.pulse {\n  -webkit-animation-name: pulse;\n  animation-name: pulse;\n}\n@-webkit-keyframes rubberBand {\n  0% {\n    -webkit-transform: scale3d(1, 1, 1);\n    transform: scale3d(1, 1, 1);\n  }\n  30% {\n    -webkit-transform: scale3d(1.25, 0.75, 1);\n    transform: scale3d(1.25, 0.75, 1);\n  }\n  40% {\n    -webkit-transform: scale3d(0.75, 1.25, 1);\n    transform: scale3d(0.75, 1.25, 1);\n  }\n  50% {\n    -webkit-transform: scale3d(1.15, 0.85, 1);\n    transform: scale3d(1.15, 0.85, 1);\n  }\n  65% {\n    -webkit-transform: scale3d(0.95, 1.05, 1);\n    transform: scale3d(0.95, 1.05, 1);\n  }\n  75% {\n    -webkit-transform: scale3d(1.05, 0.95, 1);\n    transform: scale3d(1.05, 0.95, 1);\n  }\n  100% {\n    -webkit-transform: scale3d(1, 1, 1);\n    transform: scale3d(1, 1, 1);\n  }\n}\n@keyframes rubberBand {\n  0% {\n    -webkit-transform: scale3d(1, 1, 1);\n    transform: scale3d(1, 1, 1);\n  }\n  30% {\n    -webkit-transform: scale3d(1.25, 0.75, 1);\n    transform: scale3d(1.25, 0.75, 1);\n  }\n  40% {\n    -webkit-transform: scale3d(0.75, 1.25, 1);\n    transform: scale3d(0.75, 1.25, 1);\n  }\n  50% {\n    -webkit-transform: scale3d(1.15, 0.85, 1);\n    transform: scale3d(1.15, 0.85, 1);\n  }\n  65% {\n    -webkit-transform: scale3d(0.95, 1.05, 1);\n    transform: scale3d(0.95, 1.05, 1);\n  }\n  75% {\n    -webkit-transform: scale3d(1.05, 0.95, 1);\n    transform: scale3d(1.05, 0.95, 1);\n  }\n  100% {\n    -webkit-transform: scale3d(1, 1, 1);\n    transform: scale3d(1, 1, 1);\n  }\n}\n.rubberBand {\n  -webkit-animation-name: rubberBand;\n  animation-name: rubberBand;\n}\n@-webkit-keyframes shake {\n  0%,\n  100% {\n    -webkit-transform: translate3d(0, 0, 0);\n    transform: translate3d(0, 0, 0);\n  }\n  10%,\n  30%,\n  50%,\n  70%,\n  90% {\n    -webkit-transform: translate3d(-10px, 0, 0);\n    transform: translate3d(-10px, 0, 0);\n  }\n  20%,\n  40%,\n  60%,\n  80% {\n    -webkit-transform: translate3d(10px, 0, 0);\n    transform: translate3d(10px, 0, 0);\n  }\n}\n@keyframes shake {\n  0%,\n  100% {\n    -webkit-transform: translate3d(0, 0, 0);\n    transform: translate3d(0, 0, 0);\n  }\n  10%,\n  30%,\n  50%,\n  70%,\n  90% {\n    -webkit-transform: translate3d(-10px, 0, 0);\n    transform: translate3d(-10px, 0, 0);\n  }\n  20%,\n  40%,\n  60%,\n  80% {\n    -webkit-transform: translate3d(10px, 0, 0);\n    transform: translate3d(10px, 0, 0);\n  }\n}\n.shake {\n  -webkit-animation-name: shake;\n  animation-name: shake;\n}\n@-webkit-keyframes swing {\n  20% {\n    -webkit-transform: rotate3d(0, 0, 1, 15deg);\n    transform: rotate3d(0, 0, 1, 15deg);\n  }\n  40% {\n    -webkit-transform: rotate3d(0, 0, 1, -10deg);\n    transform: rotate3d(0, 0, 1, -10deg);\n  }\n  60% {\n    -webkit-transform: rotate3d(0, 0, 1, 5deg);\n    transform: rotate3d(0, 0, 1, 5deg);\n  }\n  80% {\n    -webkit-transform: rotate3d(0, 0, 1, -5deg);\n    transform: rotate3d(0, 0, 1, -5deg);\n  }\n  100% {\n    -webkit-transform: rotate3d(0, 0, 1, 0deg);\n    transform: rotate3d(0, 0, 1, 0deg);\n  }\n}\n@keyframes swing {\n  20% {\n    -webkit-transform: rotate3d(0, 0, 1, 15deg);\n    transform: rotate3d(0, 0, 1, 15deg);\n  }\n  40% {\n    -webkit-transform: rotate3d(0, 0, 1, -10deg);\n    transform: rotate3d(0, 0, 1, -10deg);\n  }\n  60% {\n    -webkit-transform: rotate3d(0, 0, 1, 5deg);\n    transform: rotate3d(0, 0, 1, 5deg);\n  }\n  80% {\n    -webkit-transform: rotate3d(0, 0, 1, -5deg);\n    transform: rotate3d(0, 0, 1, -5deg);\n  }\n  100% {\n    -webkit-transform: rotate3d(0, 0, 1, 0deg);\n    transform: rotate3d(0, 0, 1, 0deg);\n  }\n}\n.swing {\n  -webkit-transform-origin: top center;\n  -ms-transform-origin: top center;\n  transform-origin: top center;\n  -webkit-animation-name: swing;\n  animation-name: swing;\n}\n@-webkit-keyframes tada {\n  0% {\n    -webkit-transform: scale3d(1, 1, 1);\n    transform: scale3d(1, 1, 1);\n  }\n  10%,\n  20% {\n    -webkit-transform: scale3d(0.9, 0.9, 0.9) rotate3d(0, 0, 1, -3deg);\n    transform: scale3d(0.9, 0.9, 0.9) rotate3d(0, 0, 1, -3deg);\n  }\n  30%,\n  50%,\n  70%,\n  90% {\n    -webkit-transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, 3deg);\n    transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, 3deg);\n  }\n  40%,\n  60%,\n  80% {\n    -webkit-transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, -3deg);\n    transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, -3deg);\n  }\n  100% {\n    -webkit-transform: scale3d(1, 1, 1);\n    transform: scale3d(1, 1, 1);\n  }\n}\n@keyframes tada {\n  0% {\n    -webkit-transform: scale3d(1, 1, 1);\n    transform: scale3d(1, 1, 1);\n  }\n  10%,\n  20% {\n    -webkit-transform: scale3d(0.9, 0.9, 0.9) rotate3d(0, 0, 1, -3deg);\n    transform: scale3d(0.9, 0.9, 0.9) rotate3d(0, 0, 1, -3deg);\n  }\n  30%,\n  50%,\n  70%,\n  90% {\n    -webkit-transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, 3deg);\n    transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, 3deg);\n  }\n  40%,\n  60%,\n  80% {\n    -webkit-transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, -3deg);\n    transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, -3deg);\n  }\n  100% {\n    -webkit-transform: scale3d(1, 1, 1);\n    transform: scale3d(1, 1, 1);\n  }\n}\n.tada {\n  -webkit-animation-name: tada;\n  animation-name: tada;\n}\n@-webkit-keyframes wobble {\n  0% {\n    -webkit-transform: none;\n    transform: none;\n  }\n  15% {\n    -webkit-transform: translate3d(-25%, 0, 0) rotate3d(0, 0, 1, -5deg);\n    transform: translate3d(-25%, 0, 0) rotate3d(0, 0, 1, -5deg);\n  }\n  30% {\n    -webkit-transform: translate3d(20%, 0, 0) rotate3d(0, 0, 1, 3deg);\n    transform: translate3d(20%, 0, 0) rotate3d(0, 0, 1, 3deg);\n  }\n  45% {\n    -webkit-transform: translate3d(-15%, 0, 0) rotate3d(0, 0, 1, -3deg);\n    transform: translate3d(-15%, 0, 0) rotate3d(0, 0, 1, -3deg);\n  }\n  60% {\n    -webkit-transform: translate3d(10%, 0, 0) rotate3d(0, 0, 1, 2deg);\n    transform: translate3d(10%, 0, 0) rotate3d(0, 0, 1, 2deg);\n  }\n  75% {\n    -webkit-transform: translate3d(-5%, 0, 0) rotate3d(0, 0, 1, -1deg);\n    transform: translate3d(-5%, 0, 0) rotate3d(0, 0, 1, -1deg);\n  }\n  100% {\n    -webkit-transform: none;\n    transform: none;\n  }\n}\n@keyframes wobble {\n  0% {\n    -webkit-transform: none;\n    transform: none;\n  }\n  15% {\n    -webkit-transform: translate3d(-25%, 0, 0) rotate3d(0, 0, 1, -5deg);\n    transform: translate3d(-25%, 0, 0) rotate3d(0, 0, 1, -5deg);\n  }\n  30% {\n    -webkit-transform: translate3d(20%, 0, 0) rotate3d(0, 0, 1, 3deg);\n    transform: translate3d(20%, 0, 0) rotate3d(0, 0, 1, 3deg);\n  }\n  45% {\n    -webkit-transform: translate3d(-15%, 0, 0) rotate3d(0, 0, 1, -3deg);\n    transform: translate3d(-15%, 0, 0) rotate3d(0, 0, 1, -3deg);\n  }\n  60% {\n    -webkit-transform: translate3d(10%, 0, 0) rotate3d(0, 0, 1, 2deg);\n    transform: translate3d(10%, 0, 0) rotate3d(0, 0, 1, 2deg);\n  }\n  75% {\n    -webkit-transform: translate3d(-5%, 0, 0) rotate3d(0, 0, 1, -1deg);\n    transform: translate3d(-5%, 0, 0) rotate3d(0, 0, 1, -1deg);\n  }\n  100% {\n    -webkit-transform: none;\n    transform: none;\n  }\n}\n.wobble {\n  -webkit-animation-name: wobble;\n  animation-name: wobble;\n}\n@-webkit-keyframes bounceIn {\n  0%,\n  100%,\n  20%,\n  40%,\n  60%,\n  80% {\n    -webkit-transition-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1);\n    transition-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1);\n  }\n  0% {\n    opacity: 0;\n    -webkit-transform: scale3d(0.3, 0.3, 0.3);\n    transform: scale3d(0.3, 0.3, 0.3);\n  }\n  20% {\n    -webkit-transform: scale3d(1.1, 1.1, 1.1);\n    transform: scale3d(1.1, 1.1, 1.1);\n  }\n  40% {\n    -webkit-transform: scale3d(0.9, 0.9, 0.9);\n    transform: scale3d(0.9, 0.9, 0.9);\n  }\n  60% {\n    opacity: 1;\n    -webkit-transform: scale3d(1.03, 1.03, 1.03);\n    transform: scale3d(1.03, 1.03, 1.03);\n  }\n  80% {\n    -webkit-transform: scale3d(0.97, 0.97, 0.97);\n    transform: scale3d(0.97, 0.97, 0.97);\n  }\n  100% {\n    opacity: 1;\n    -webkit-transform: scale3d(1, 1, 1);\n    transform: scale3d(1, 1, 1);\n  }\n}\n@keyframes bounceIn {\n  0%,\n  100%,\n  20%,\n  40%,\n  60%,\n  80% {\n    -webkit-transition-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1);\n    transition-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1);\n  }\n  0% {\n    opacity: 0;\n    -webkit-transform: scale3d(0.3, 0.3, 0.3);\n    transform: scale3d(0.3, 0.3, 0.3);\n  }\n  20% {\n    -webkit-transform: scale3d(1.1, 1.1, 1.1);\n    transform: scale3d(1.1, 1.1, 1.1);\n  }\n  40% {\n    -webkit-transform: scale3d(0.9, 0.9, 0.9);\n    transform: scale3d(0.9, 0.9, 0.9);\n  }\n  60% {\n    opacity: 1;\n    -webkit-transform: scale3d(1.03, 1.03, 1.03);\n    transform: scale3d(1.03, 1.03, 1.03);\n  }\n  80% {\n    -webkit-transform: scale3d(0.97, 0.97, 0.97);\n    transform: scale3d(0.97, 0.97, 0.97);\n  }\n  100% {\n    opacity: 1;\n    -webkit-transform: scale3d(1, 1, 1);\n    transform: scale3d(1, 1, 1);\n  }\n}\n.bounceIn {\n  -webkit-animation-name: bounceIn;\n  animation-name: bounceIn;\n  -webkit-animation-duration: .75s;\n  animation-duration: 0.75s;\n}\n@-webkit-keyframes bounceInDown {\n  0%,\n  100%,\n  60%,\n  75%,\n  90% {\n    -webkit-transition-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1);\n    transition-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1);\n  }\n  0% {\n    opacity: 0;\n    -webkit-transform: translate3d(0, -3000px, 0);\n    transform: translate3d(0, -3000px, 0);\n  }\n  60% {\n    opacity: 1;\n    -webkit-transform: translate3d(0, 25px, 0);\n    transform: translate3d(0, 25px, 0);\n  }\n  75% {\n    -webkit-transform: translate3d(0, -10px, 0);\n    transform: translate3d(0, -10px, 0);\n  }\n  90% {\n    -webkit-transform: translate3d(0, 5px, 0);\n    transform: translate3d(0, 5px, 0);\n  }\n  100% {\n    -webkit-transform: none;\n    transform: none;\n  }\n}\n@keyframes bounceInDown {\n  0%,\n  100%,\n  60%,\n  75%,\n  90% {\n    -webkit-transition-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1);\n    transition-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1);\n  }\n  0% {\n    opacity: 0;\n    -webkit-transform: translate3d(0, -3000px, 0);\n    transform: translate3d(0, -3000px, 0);\n  }\n  60% {\n    opacity: 1;\n    -webkit-transform: translate3d(0, 25px, 0);\n    transform: translate3d(0, 25px, 0);\n  }\n  75% {\n    -webkit-transform: translate3d(0, -10px, 0);\n    transform: translate3d(0, -10px, 0);\n  }\n  90% {\n    -webkit-transform: translate3d(0, 5px, 0);\n    transform: translate3d(0, 5px, 0);\n  }\n  100% {\n    -webkit-transform: none;\n    transform: none;\n  }\n}\n.bounceInDown {\n  -webkit-animation-name: bounceInDown;\n  animation-name: bounceInDown;\n}\n@-webkit-keyframes bounceInLeft {\n  0%,\n  100%,\n  60%,\n  75%,\n  90% {\n    -webkit-transition-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1);\n    transition-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1);\n  }\n  0% {\n    opacity: 0;\n    -webkit-transform: translate3d(-3000px, 0, 0);\n    transform: translate3d(-3000px, 0, 0);\n  }\n  60% {\n    opacity: 1;\n    -webkit-transform: translate3d(25px, 0, 0);\n    transform: translate3d(25px, 0, 0);\n  }\n  75% {\n    -webkit-transform: translate3d(-10px, 0, 0);\n    transform: translate3d(-10px, 0, 0);\n  }\n  90% {\n    -webkit-transform: translate3d(5px, 0, 0);\n    transform: translate3d(5px, 0, 0);\n  }\n  100% {\n    -webkit-transform: none;\n    transform: none;\n  }\n}\n@keyframes bounceInLeft {\n  0%,\n  100%,\n  60%,\n  75%,\n  90% {\n    -webkit-transition-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1);\n    transition-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1);\n  }\n  0% {\n    opacity: 0;\n    -webkit-transform: translate3d(-3000px, 0, 0);\n    transform: translate3d(-3000px, 0, 0);\n  }\n  60% {\n    opacity: 1;\n    -webkit-transform: translate3d(25px, 0, 0);\n    transform: translate3d(25px, 0, 0);\n  }\n  75% {\n    -webkit-transform: translate3d(-10px, 0, 0);\n    transform: translate3d(-10px, 0, 0);\n  }\n  90% {\n    -webkit-transform: translate3d(5px, 0, 0);\n    transform: translate3d(5px, 0, 0);\n  }\n  100% {\n    -webkit-transform: none;\n    transform: none;\n  }\n}\n.bounceInLeft {\n  -webkit-animation-name: bounceInLeft;\n  animation-name: bounceInLeft;\n}\n@-webkit-keyframes bounceInRight {\n  0%,\n  100%,\n  60%,\n  75%,\n  90% {\n    -webkit-transition-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1);\n    transition-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1);\n  }\n  0% {\n    opacity: 0;\n    -webkit-transform: translate3d(3000px, 0, 0);\n    transform: translate3d(3000px, 0, 0);\n  }\n  60% {\n    opacity: 1;\n    -webkit-transform: translate3d(-25px, 0, 0);\n    transform: translate3d(-25px, 0, 0);\n  }\n  75% {\n    -webkit-transform: translate3d(10px, 0, 0);\n    transform: translate3d(10px, 0, 0);\n  }\n  90% {\n    -webkit-transform: translate3d(-5px, 0, 0);\n    transform: translate3d(-5px, 0, 0);\n  }\n  100% {\n    -webkit-transform: none;\n    transform: none;\n  }\n}\n@keyframes bounceInRight {\n  0%,\n  100%,\n  60%,\n  75%,\n  90% {\n    -webkit-transition-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1);\n    transition-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1);\n  }\n  0% {\n    opacity: 0;\n    -webkit-transform: translate3d(3000px, 0, 0);\n    transform: translate3d(3000px, 0, 0);\n  }\n  60% {\n    opacity: 1;\n    -webkit-transform: translate3d(-25px, 0, 0);\n    transform: translate3d(-25px, 0, 0);\n  }\n  75% {\n    -webkit-transform: translate3d(10px, 0, 0);\n    transform: translate3d(10px, 0, 0);\n  }\n  90% {\n    -webkit-transform: translate3d(-5px, 0, 0);\n    transform: translate3d(-5px, 0, 0);\n  }\n  100% {\n    -webkit-transform: none;\n    transform: none;\n  }\n}\n.bounceInRight {\n  -webkit-animation-name: bounceInRight;\n  animation-name: bounceInRight;\n}\n@-webkit-keyframes bounceInUp {\n  0%,\n  100%,\n  60%,\n  75%,\n  90% {\n    -webkit-transition-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1);\n    transition-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1);\n  }\n  0% {\n    opacity: 0;\n    -webkit-transform: translate3d(0, 3000px, 0);\n    transform: translate3d(0, 3000px, 0);\n  }\n  60% {\n    opacity: 1;\n    -webkit-transform: translate3d(0, -20px, 0);\n    transform: translate3d(0, -20px, 0);\n  }\n  75% {\n    -webkit-transform: translate3d(0, 10px, 0);\n    transform: translate3d(0, 10px, 0);\n  }\n  90% {\n    -webkit-transform: translate3d(0, -5px, 0);\n    transform: translate3d(0, -5px, 0);\n  }\n  100% {\n    -webkit-transform: translate3d(0, 0, 0);\n    transform: translate3d(0, 0, 0);\n  }\n}\n@keyframes bounceInUp {\n  0%,\n  100%,\n  60%,\n  75%,\n  90% {\n    -webkit-transition-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1);\n    transition-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1);\n  }\n  0% {\n    opacity: 0;\n    -webkit-transform: translate3d(0, 3000px, 0);\n    transform: translate3d(0, 3000px, 0);\n  }\n  60% {\n    opacity: 1;\n    -webkit-transform: translate3d(0, -20px, 0);\n    transform: translate3d(0, -20px, 0);\n  }\n  75% {\n    -webkit-transform: translate3d(0, 10px, 0);\n    transform: translate3d(0, 10px, 0);\n  }\n  90% {\n    -webkit-transform: translate3d(0, -5px, 0);\n    transform: translate3d(0, -5px, 0);\n  }\n  100% {\n    -webkit-transform: translate3d(0, 0, 0);\n    transform: translate3d(0, 0, 0);\n  }\n}\n.bounceInUp {\n  -webkit-animation-name: bounceInUp;\n  animation-name: bounceInUp;\n}\n@-webkit-keyframes bounceOut {\n  20% {\n    -webkit-transform: scale3d(0.9, 0.9, 0.9);\n    transform: scale3d(0.9, 0.9, 0.9);\n  }\n  50%,\n  55% {\n    opacity: 1;\n    -webkit-transform: scale3d(1.1, 1.1, 1.1);\n    transform: scale3d(1.1, 1.1, 1.1);\n  }\n  100% {\n    opacity: 0;\n    -webkit-transform: scale3d(0.3, 0.3, 0.3);\n    transform: scale3d(0.3, 0.3, 0.3);\n  }\n}\n@keyframes bounceOut {\n  20% {\n    -webkit-transform: scale3d(0.9, 0.9, 0.9);\n    transform: scale3d(0.9, 0.9, 0.9);\n  }\n  50%,\n  55% {\n    opacity: 1;\n    -webkit-transform: scale3d(1.1, 1.1, 1.1);\n    transform: scale3d(1.1, 1.1, 1.1);\n  }\n  100% {\n    opacity: 0;\n    -webkit-transform: scale3d(0.3, 0.3, 0.3);\n    transform: scale3d(0.3, 0.3, 0.3);\n  }\n}\n.bounceOut {\n  -webkit-animation-name: bounceOut;\n  animation-name: bounceOut;\n  -webkit-animation-duration: .75s;\n  animation-duration: 0.75s;\n}\n@-webkit-keyframes bounceOutDown {\n  20% {\n    -webkit-transform: translate3d(0, 10px, 0);\n    transform: translate3d(0, 10px, 0);\n  }\n  40%,\n  45% {\n    opacity: 1;\n    -webkit-transform: translate3d(0, -20px, 0);\n    transform: translate3d(0, -20px, 0);\n  }\n  100% {\n    opacity: 0;\n    -webkit-transform: translate3d(0, 2000px, 0);\n    transform: translate3d(0, 2000px, 0);\n  }\n}\n@keyframes bounceOutDown {\n  20% {\n    -webkit-transform: translate3d(0, 10px, 0);\n    transform: translate3d(0, 10px, 0);\n  }\n  40%,\n  45% {\n    opacity: 1;\n    -webkit-transform: translate3d(0, -20px, 0);\n    transform: translate3d(0, -20px, 0);\n  }\n  100% {\n    opacity: 0;\n    -webkit-transform: translate3d(0, 2000px, 0);\n    transform: translate3d(0, 2000px, 0);\n  }\n}\n.bounceOutDown {\n  -webkit-animation-name: bounceOutDown;\n  animation-name: bounceOutDown;\n}\n@-webkit-keyframes bounceOutLeft {\n  20% {\n    opacity: 1;\n    -webkit-transform: translate3d(20px, 0, 0);\n    transform: translate3d(20px, 0, 0);\n  }\n  100% {\n    opacity: 0;\n    -webkit-transform: translate3d(-2000px, 0, 0);\n    transform: translate3d(-2000px, 0, 0);\n  }\n}\n@keyframes bounceOutLeft {\n  20% {\n    opacity: 1;\n    -webkit-transform: translate3d(20px, 0, 0);\n    transform: translate3d(20px, 0, 0);\n  }\n  100% {\n    opacity: 0;\n    -webkit-transform: translate3d(-2000px, 0, 0);\n    transform: translate3d(-2000px, 0, 0);\n  }\n}\n.bounceOutLeft {\n  -webkit-animation-name: bounceOutLeft;\n  animation-name: bounceOutLeft;\n}\n@-webkit-keyframes bounceOutRight {\n  20% {\n    opacity: 1;\n    -webkit-transform: translate3d(-20px, 0, 0);\n    transform: translate3d(-20px, 0, 0);\n  }\n  100% {\n    opacity: 0;\n    -webkit-transform: translate3d(2000px, 0, 0);\n    transform: translate3d(2000px, 0, 0);\n  }\n}\n@keyframes bounceOutRight {\n  20% {\n    opacity: 1;\n    -webkit-transform: translate3d(-20px, 0, 0);\n    transform: translate3d(-20px, 0, 0);\n  }\n  100% {\n    opacity: 0;\n    -webkit-transform: translate3d(2000px, 0, 0);\n    transform: translate3d(2000px, 0, 0);\n  }\n}\n.bounceOutRight {\n  -webkit-animation-name: bounceOutRight;\n  animation-name: bounceOutRight;\n}\n@-webkit-keyframes bounceOutUp {\n  20% {\n    -webkit-transform: translate3d(0, -10px, 0);\n    transform: translate3d(0, -10px, 0);\n  }\n  40%,\n  45% {\n    opacity: 1;\n    -webkit-transform: translate3d(0, 20px, 0);\n    transform: translate3d(0, 20px, 0);\n  }\n  100% {\n    opacity: 0;\n    -webkit-transform: translate3d(0, -2000px, 0);\n    transform: translate3d(0, -2000px, 0);\n  }\n}\n@keyframes bounceOutUp {\n  20% {\n    -webkit-transform: translate3d(0, -10px, 0);\n    transform: translate3d(0, -10px, 0);\n  }\n  40%,\n  45% {\n    opacity: 1;\n    -webkit-transform: translate3d(0, 20px, 0);\n    transform: translate3d(0, 20px, 0);\n  }\n  100% {\n    opacity: 0;\n    -webkit-transform: translate3d(0, -2000px, 0);\n    transform: translate3d(0, -2000px, 0);\n  }\n}\n.bounceOutUp {\n  -webkit-animation-name: bounceOutUp;\n  animation-name: bounceOutUp;\n}\n@-webkit-keyframes fadeIn {\n  0% {\n    opacity: 0;\n  }\n  100% {\n    opacity: 1;\n  }\n}\n@keyframes fadeIn {\n  0% {\n    opacity: 0;\n  }\n  100% {\n    opacity: 1;\n  }\n}\n.fadeIn {\n  -webkit-animation-name: fadeIn;\n  animation-name: fadeIn;\n}\n@-webkit-keyframes fadeInDown {\n  0% {\n    opacity: 0;\n    -webkit-transform: translate3d(0, -100%, 0);\n    transform: translate3d(0, -100%, 0);\n  }\n  100% {\n    opacity: 1;\n    -webkit-transform: none;\n    transform: none;\n  }\n}\n@keyframes fadeInDown {\n  0% {\n    opacity: 0;\n    -webkit-transform: translate3d(0, -100%, 0);\n    transform: translate3d(0, -100%, 0);\n  }\n  100% {\n    opacity: 1;\n    -webkit-transform: none;\n    transform: none;\n  }\n}\n.fadeInDown {\n  -webkit-animation-name: fadeInDown;\n  animation-name: fadeInDown;\n}\n@-webkit-keyframes fadeInDownBig {\n  0% {\n    opacity: 0;\n    -webkit-transform: translate3d(0, -2000px, 0);\n    transform: translate3d(0, -2000px, 0);\n  }\n  100% {\n    opacity: 1;\n    -webkit-transform: none;\n    transform: none;\n  }\n}\n@keyframes fadeInDownBig {\n  0% {\n    opacity: 0;\n    -webkit-transform: translate3d(0, -2000px, 0);\n    transform: translate3d(0, -2000px, 0);\n  }\n  100% {\n    opacity: 1;\n    -webkit-transform: none;\n    transform: none;\n  }\n}\n.fadeInDownBig {\n  -webkit-animation-name: fadeInDownBig;\n  animation-name: fadeInDownBig;\n}\n@-webkit-keyframes fadeInLeft {\n  0% {\n    opacity: 0;\n    -webkit-transform: translate3d(-100%, 0, 0);\n    transform: translate3d(-100%, 0, 0);\n  }\n  100% {\n    opacity: 1;\n    -webkit-transform: none;\n    transform: none;\n  }\n}\n@keyframes fadeInLeft {\n  0% {\n    opacity: 0;\n    -webkit-transform: translate3d(-100%, 0, 0);\n    transform: translate3d(-100%, 0, 0);\n  }\n  100% {\n    opacity: 1;\n    -webkit-transform: none;\n    transform: none;\n  }\n}\n.fadeInLeft {\n  -webkit-animation-name: fadeInLeft;\n  animation-name: fadeInLeft;\n}\n@-webkit-keyframes fadeInLeftBig {\n  0% {\n    opacity: 0;\n    -webkit-transform: translate3d(-2000px, 0, 0);\n    transform: translate3d(-2000px, 0, 0);\n  }\n  100% {\n    opacity: 1;\n    -webkit-transform: none;\n    transform: none;\n  }\n}\n@keyframes fadeInLeftBig {\n  0% {\n    opacity: 0;\n    -webkit-transform: translate3d(-2000px, 0, 0);\n    transform: translate3d(-2000px, 0, 0);\n  }\n  100% {\n    opacity: 1;\n    -webkit-transform: none;\n    transform: none;\n  }\n}\n.fadeInLeftBig {\n  -webkit-animation-name: fadeInLeftBig;\n  animation-name: fadeInLeftBig;\n}\n@-webkit-keyframes fadeInRight {\n  0% {\n    opacity: 0;\n    -webkit-transform: translate3d(100%, 0, 0);\n    transform: translate3d(100%, 0, 0);\n  }\n  100% {\n    opacity: 1;\n    -webkit-transform: none;\n    transform: none;\n  }\n}\n@keyframes fadeInRight {\n  0% {\n    opacity: 0;\n    -webkit-transform: translate3d(100%, 0, 0);\n    transform: translate3d(100%, 0, 0);\n  }\n  100% {\n    opacity: 1;\n    -webkit-transform: none;\n    transform: none;\n  }\n}\n.fadeInRight {\n  -webkit-animation-name: fadeInRight;\n  animation-name: fadeInRight;\n}\n@-webkit-keyframes fadeInRightBig {\n  0% {\n    opacity: 0;\n    -webkit-transform: translate3d(2000px, 0, 0);\n    transform: translate3d(2000px, 0, 0);\n  }\n  100% {\n    opacity: 1;\n    -webkit-transform: none;\n    transform: none;\n  }\n}\n@keyframes fadeInRightBig {\n  0% {\n    opacity: 0;\n    -webkit-transform: translate3d(2000px, 0, 0);\n    transform: translate3d(2000px, 0, 0);\n  }\n  100% {\n    opacity: 1;\n    -webkit-transform: none;\n    transform: none;\n  }\n}\n.fadeInRightBig {\n  -webkit-animation-name: fadeInRightBig;\n  animation-name: fadeInRightBig;\n}\n@-webkit-keyframes fadeInUp {\n  0% {\n    opacity: 0;\n    -webkit-transform: translate3d(0, 100%, 0);\n    transform: translate3d(0, 100%, 0);\n  }\n  100% {\n    opacity: 1;\n    -webkit-transform: none;\n    transform: none;\n  }\n}\n@keyframes fadeInUp {\n  0% {\n    opacity: 0;\n    -webkit-transform: translate3d(0, 100%, 0);\n    transform: translate3d(0, 100%, 0);\n  }\n  100% {\n    opacity: 1;\n    -webkit-transform: none;\n    transform: none;\n  }\n}\n.fadeInUp {\n  -webkit-animation-name: fadeInUp;\n  animation-name: fadeInUp;\n}\n@-webkit-keyframes fadeInUpBig {\n  0% {\n    opacity: 0;\n    -webkit-transform: translate3d(0, 2000px, 0);\n    transform: translate3d(0, 2000px, 0);\n  }\n  100% {\n    opacity: 1;\n    -webkit-transform: none;\n    transform: none;\n  }\n}\n@keyframes fadeInUpBig {\n  0% {\n    opacity: 0;\n    -webkit-transform: translate3d(0, 2000px, 0);\n    transform: translate3d(0, 2000px, 0);\n  }\n  100% {\n    opacity: 1;\n    -webkit-transform: none;\n    transform: none;\n  }\n}\n.fadeInUpBig {\n  -webkit-animation-name: fadeInUpBig;\n  animation-name: fadeInUpBig;\n}\n@-webkit-keyframes fadeOut {\n  0% {\n    opacity: 1;\n  }\n  100% {\n    opacity: 0;\n  }\n}\n@keyframes fadeOut {\n  0% {\n    opacity: 1;\n  }\n  100% {\n    opacity: 0;\n  }\n}\n.fadeOut {\n  -webkit-animation-name: fadeOut;\n  animation-name: fadeOut;\n}\n@-webkit-keyframes fadeOutDown {\n  0% {\n    opacity: 1;\n  }\n  100% {\n    opacity: 0;\n    -webkit-transform: translate3d(0, 100%, 0);\n    transform: translate3d(0, 100%, 0);\n  }\n}\n@keyframes fadeOutDown {\n  0% {\n    opacity: 1;\n  }\n  100% {\n    opacity: 0;\n    -webkit-transform: translate3d(0, 100%, 0);\n    transform: translate3d(0, 100%, 0);\n  }\n}\n.fadeOutDown {\n  -webkit-animation-name: fadeOutDown;\n  animation-name: fadeOutDown;\n}\n@-webkit-keyframes fadeOutDownBig {\n  0% {\n    opacity: 1;\n  }\n  100% {\n    opacity: 0;\n    -webkit-transform: translate3d(0, 2000px, 0);\n    transform: translate3d(0, 2000px, 0);\n  }\n}\n@keyframes fadeOutDownBig {\n  0% {\n    opacity: 1;\n  }\n  100% {\n    opacity: 0;\n    -webkit-transform: translate3d(0, 2000px, 0);\n    transform: translate3d(0, 2000px, 0);\n  }\n}\n.fadeOutDownBig {\n  -webkit-animation-name: fadeOutDownBig;\n  animation-name: fadeOutDownBig;\n}\n@-webkit-keyframes fadeOutLeft {\n  0% {\n    opacity: 1;\n  }\n  100% {\n    opacity: 0;\n    -webkit-transform: translate3d(-100%, 0, 0);\n    transform: translate3d(-100%, 0, 0);\n  }\n}\n@keyframes fadeOutLeft {\n  0% {\n    opacity: 1;\n  }\n  100% {\n    opacity: 0;\n    -webkit-transform: translate3d(-100%, 0, 0);\n    transform: translate3d(-100%, 0, 0);\n  }\n}\n.fadeOutLeft {\n  -webkit-animation-name: fadeOutLeft;\n  animation-name: fadeOutLeft;\n}\n@-webkit-keyframes fadeOutLeftBig {\n  0% {\n    opacity: 1;\n  }\n  100% {\n    opacity: 0;\n    -webkit-transform: translate3d(-2000px, 0, 0);\n    transform: translate3d(-2000px, 0, 0);\n  }\n}\n@keyframes fadeOutLeftBig {\n  0% {\n    opacity: 1;\n  }\n  100% {\n    opacity: 0;\n    -webkit-transform: translate3d(-2000px, 0, 0);\n    transform: translate3d(-2000px, 0, 0);\n  }\n}\n.fadeOutLeftBig {\n  -webkit-animation-name: fadeOutLeftBig;\n  animation-name: fadeOutLeftBig;\n}\n@-webkit-keyframes fadeOutRight {\n  0% {\n    opacity: 1;\n  }\n  100% {\n    opacity: 0;\n    -webkit-transform: translate3d(100%, 0, 0);\n    transform: translate3d(100%, 0, 0);\n  }\n}\n@keyframes fadeOutRight {\n  0% {\n    opacity: 1;\n  }\n  100% {\n    opacity: 0;\n    -webkit-transform: translate3d(100%, 0, 0);\n    transform: translate3d(100%, 0, 0);\n  }\n}\n.fadeOutRight {\n  -webkit-animation-name: fadeOutRight;\n  animation-name: fadeOutRight;\n}\n@-webkit-keyframes fadeOutRightBig {\n  0% {\n    opacity: 1;\n  }\n  100% {\n    opacity: 0;\n    -webkit-transform: translate3d(2000px, 0, 0);\n    transform: translate3d(2000px, 0, 0);\n  }\n}\n@keyframes fadeOutRightBig {\n  0% {\n    opacity: 1;\n  }\n  100% {\n    opacity: 0;\n    -webkit-transform: translate3d(2000px, 0, 0);\n    transform: translate3d(2000px, 0, 0);\n  }\n}\n.fadeOutRightBig {\n  -webkit-animation-name: fadeOutRightBig;\n  animation-name: fadeOutRightBig;\n}\n@-webkit-keyframes fadeOutUp {\n  0% {\n    opacity: 1;\n  }\n  100% {\n    opacity: 0;\n    -webkit-transform: translate3d(0, -100%, 0);\n    transform: translate3d(0, -100%, 0);\n  }\n}\n@keyframes fadeOutUp {\n  0% {\n    opacity: 1;\n  }\n  100% {\n    opacity: 0;\n    -webkit-transform: translate3d(0, -100%, 0);\n    transform: translate3d(0, -100%, 0);\n  }\n}\n.fadeOutUp {\n  -webkit-animation-name: fadeOutUp;\n  animation-name: fadeOutUp;\n}\n@-webkit-keyframes fadeOutUpBig {\n  0% {\n    opacity: 1;\n  }\n  100% {\n    opacity: 0;\n    -webkit-transform: translate3d(0, -2000px, 0);\n    transform: translate3d(0, -2000px, 0);\n  }\n}\n@keyframes fadeOutUpBig {\n  0% {\n    opacity: 1;\n  }\n  100% {\n    opacity: 0;\n    -webkit-transform: translate3d(0, -2000px, 0);\n    transform: translate3d(0, -2000px, 0);\n  }\n}\n.fadeOutUpBig {\n  -webkit-animation-name: fadeOutUpBig;\n  animation-name: fadeOutUpBig;\n}\n@-webkit-keyframes flip {\n  0% {\n    -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -360deg);\n    transform: perspective(400px) rotate3d(0, 1, 0, -360deg);\n    -webkit-animation-timing-function: ease-out;\n    animation-timing-function: ease-out;\n  }\n  40% {\n    -webkit-transform: perspective(400px) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -190deg);\n    transform: perspective(400px) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -190deg);\n    -webkit-animation-timing-function: ease-out;\n    animation-timing-function: ease-out;\n  }\n  50% {\n    -webkit-transform: perspective(400px) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -170deg);\n    transform: perspective(400px) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -170deg);\n    -webkit-animation-timing-function: ease-in;\n    animation-timing-function: ease-in;\n  }\n  80% {\n    -webkit-transform: perspective(400px) scale3d(0.95, 0.95, 0.95);\n    transform: perspective(400px) scale3d(0.95, 0.95, 0.95);\n    -webkit-animation-timing-function: ease-in;\n    animation-timing-function: ease-in;\n  }\n  100% {\n    -webkit-transform: perspective(400px);\n    transform: perspective(400px);\n    -webkit-animation-timing-function: ease-in;\n    animation-timing-function: ease-in;\n  }\n}\n@keyframes flip {\n  0% {\n    -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -360deg);\n    transform: perspective(400px) rotate3d(0, 1, 0, -360deg);\n    -webkit-animation-timing-function: ease-out;\n    animation-timing-function: ease-out;\n  }\n  40% {\n    -webkit-transform: perspective(400px) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -190deg);\n    transform: perspective(400px) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -190deg);\n    -webkit-animation-timing-function: ease-out;\n    animation-timing-function: ease-out;\n  }\n  50% {\n    -webkit-transform: perspective(400px) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -170deg);\n    transform: perspective(400px) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -170deg);\n    -webkit-animation-timing-function: ease-in;\n    animation-timing-function: ease-in;\n  }\n  80% {\n    -webkit-transform: perspective(400px) scale3d(0.95, 0.95, 0.95);\n    transform: perspective(400px) scale3d(0.95, 0.95, 0.95);\n    -webkit-animation-timing-function: ease-in;\n    animation-timing-function: ease-in;\n  }\n  100% {\n    -webkit-transform: perspective(400px);\n    transform: perspective(400px);\n    -webkit-animation-timing-function: ease-in;\n    animation-timing-function: ease-in;\n  }\n}\n.animated.flip {\n  -webkit-backface-visibility: visible;\n  backface-visibility: visible;\n  -webkit-animation-name: flip;\n  animation-name: flip;\n}\n@-webkit-keyframes flipInX {\n  0% {\n    -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 90deg);\n    transform: perspective(400px) rotate3d(1, 0, 0, 90deg);\n    -webkit-transition-timing-function: ease-in;\n    transition-timing-function: ease-in;\n    opacity: 0;\n  }\n  40% {\n    -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -20deg);\n    transform: perspective(400px) rotate3d(1, 0, 0, -20deg);\n    -webkit-transition-timing-function: ease-in;\n    transition-timing-function: ease-in;\n  }\n  60% {\n    -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 10deg);\n    transform: perspective(400px) rotate3d(1, 0, 0, 10deg);\n    opacity: 1;\n  }\n  80% {\n    -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -5deg);\n    transform: perspective(400px) rotate3d(1, 0, 0, -5deg);\n  }\n  100% {\n    -webkit-transform: perspective(400px);\n    transform: perspective(400px);\n  }\n}\n@keyframes flipInX {\n  0% {\n    -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 90deg);\n    transform: perspective(400px) rotate3d(1, 0, 0, 90deg);\n    -webkit-transition-timing-function: ease-in;\n    transition-timing-function: ease-in;\n    opacity: 0;\n  }\n  40% {\n    -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -20deg);\n    transform: perspective(400px) rotate3d(1, 0, 0, -20deg);\n    -webkit-transition-timing-function: ease-in;\n    transition-timing-function: ease-in;\n  }\n  60% {\n    -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 10deg);\n    transform: perspective(400px) rotate3d(1, 0, 0, 10deg);\n    opacity: 1;\n  }\n  80% {\n    -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -5deg);\n    transform: perspective(400px) rotate3d(1, 0, 0, -5deg);\n  }\n  100% {\n    -webkit-transform: perspective(400px);\n    transform: perspective(400px);\n  }\n}\n.flipInX {\n  -webkit-backface-visibility: visible!important;\n  backface-visibility: visible!important;\n  -webkit-animation-name: flipInX;\n  animation-name: flipInX;\n}\n@-webkit-keyframes flipInY {\n  0% {\n    -webkit-transform: perspective(400px) rotate3d(0, 1, 0, 90deg);\n    transform: perspective(400px) rotate3d(0, 1, 0, 90deg);\n    -webkit-transition-timing-function: ease-in;\n    transition-timing-function: ease-in;\n    opacity: 0;\n  }\n  40% {\n    -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -20deg);\n    transform: perspective(400px) rotate3d(0, 1, 0, -20deg);\n    -webkit-transition-timing-function: ease-in;\n    transition-timing-function: ease-in;\n  }\n  60% {\n    -webkit-transform: perspective(400px) rotate3d(0, 1, 0, 10deg);\n    transform: perspective(400px) rotate3d(0, 1, 0, 10deg);\n    opacity: 1;\n  }\n  80% {\n    -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -5deg);\n    transform: perspective(400px) rotate3d(0, 1, 0, -5deg);\n  }\n  100% {\n    -webkit-transform: perspective(400px);\n    transform: perspective(400px);\n  }\n}\n@keyframes flipInY {\n  0% {\n    -webkit-transform: perspective(400px) rotate3d(0, 1, 0, 90deg);\n    transform: perspective(400px) rotate3d(0, 1, 0, 90deg);\n    -webkit-transition-timing-function: ease-in;\n    transition-timing-function: ease-in;\n    opacity: 0;\n  }\n  40% {\n    -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -20deg);\n    transform: perspective(400px) rotate3d(0, 1, 0, -20deg);\n    -webkit-transition-timing-function: ease-in;\n    transition-timing-function: ease-in;\n  }\n  60% {\n    -webkit-transform: perspective(400px) rotate3d(0, 1, 0, 10deg);\n    transform: perspective(400px) rotate3d(0, 1, 0, 10deg);\n    opacity: 1;\n  }\n  80% {\n    -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -5deg);\n    transform: perspective(400px) rotate3d(0, 1, 0, -5deg);\n  }\n  100% {\n    -webkit-transform: perspective(400px);\n    transform: perspective(400px);\n  }\n}\n.flipInY {\n  -webkit-backface-visibility: visible!important;\n  backface-visibility: visible!important;\n  -webkit-animation-name: flipInY;\n  animation-name: flipInY;\n}\n@-webkit-keyframes flipOutX {\n  0% {\n    -webkit-transform: perspective(400px);\n    transform: perspective(400px);\n  }\n  30% {\n    -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -20deg);\n    transform: perspective(400px) rotate3d(1, 0, 0, -20deg);\n    opacity: 1;\n  }\n  100% {\n    -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 90deg);\n    transform: perspective(400px) rotate3d(1, 0, 0, 90deg);\n    opacity: 0;\n  }\n}\n@keyframes flipOutX {\n  0% {\n    -webkit-transform: perspective(400px);\n    transform: perspective(400px);\n  }\n  30% {\n    -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -20deg);\n    transform: perspective(400px) rotate3d(1, 0, 0, -20deg);\n    opacity: 1;\n  }\n  100% {\n    -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 90deg);\n    transform: perspective(400px) rotate3d(1, 0, 0, 90deg);\n    opacity: 0;\n  }\n}\n.flipOutX {\n  -webkit-animation-name: flipOutX;\n  animation-name: flipOutX;\n  -webkit-animation-duration: .75s;\n  animation-duration: .75s;\n  -webkit-backface-visibility: visible!important;\n  backface-visibility: visible !important;\n}\n@-webkit-keyframes flipOutY {\n  0% {\n    -webkit-transform: perspective(400px);\n    transform: perspective(400px);\n  }\n  30% {\n    -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -15deg);\n    transform: perspective(400px) rotate3d(0, 1, 0, -15deg);\n    opacity: 1;\n  }\n  100% {\n    -webkit-transform: perspective(400px) rotate3d(0, 1, 0, 90deg);\n    transform: perspective(400px) rotate3d(0, 1, 0, 90deg);\n    opacity: 0;\n  }\n}\n@keyframes flipOutY {\n  0% {\n    -webkit-transform: perspective(400px);\n    transform: perspective(400px);\n  }\n  30% {\n    -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -15deg);\n    transform: perspective(400px) rotate3d(0, 1, 0, -15deg);\n    opacity: 1;\n  }\n  100% {\n    -webkit-transform: perspective(400px) rotate3d(0, 1, 0, 90deg);\n    transform: perspective(400px) rotate3d(0, 1, 0, 90deg);\n    opacity: 0;\n  }\n}\n.flipOutY {\n  -webkit-backface-visibility: visible!important;\n  backface-visibility: visible!important;\n  -webkit-animation-name: flipOutY;\n  animation-name: flipOutY;\n  -webkit-animation-duration: .75s;\n  animation-duration: 0.75s;\n}\n@-webkit-keyframes lightSpeedIn {\n  0% {\n    -webkit-transform: translate3d(100%, 0, 0) skewX(-30deg);\n    transform: translate3d(100%, 0, 0) skewX(-30deg);\n    opacity: 0;\n  }\n  60% {\n    -webkit-transform: skewX(20deg);\n    transform: skewX(20deg);\n    opacity: 1;\n  }\n  80% {\n    -webkit-transform: skewX(-5deg);\n    transform: skewX(-5deg);\n    opacity: 1;\n  }\n  100% {\n    -webkit-transform: none;\n    transform: none;\n    opacity: 1;\n  }\n}\n@keyframes lightSpeedIn {\n  0% {\n    -webkit-transform: translate3d(100%, 0, 0) skewX(-30deg);\n    transform: translate3d(100%, 0, 0) skewX(-30deg);\n    opacity: 0;\n  }\n  60% {\n    -webkit-transform: skewX(20deg);\n    transform: skewX(20deg);\n    opacity: 1;\n  }\n  80% {\n    -webkit-transform: skewX(-5deg);\n    transform: skewX(-5deg);\n    opacity: 1;\n  }\n  100% {\n    -webkit-transform: none;\n    transform: none;\n    opacity: 1;\n  }\n}\n.lightSpeedIn {\n  -webkit-animation-name: lightSpeedIn;\n  animation-name: lightSpeedIn;\n  -webkit-animation-timing-function: ease-out;\n  animation-timing-function: ease-out;\n}\n@-webkit-keyframes lightSpeedOut {\n  0% {\n    opacity: 1;\n  }\n  100% {\n    -webkit-transform: translate3d(100%, 0, 0) skewX(30deg);\n    transform: translate3d(100%, 0, 0) skewX(30deg);\n    opacity: 0;\n  }\n}\n@keyframes lightSpeedOut {\n  0% {\n    opacity: 1;\n  }\n  100% {\n    -webkit-transform: translate3d(100%, 0, 0) skewX(30deg);\n    transform: translate3d(100%, 0, 0) skewX(30deg);\n    opacity: 0;\n  }\n}\n.lightSpeedOut {\n  -webkit-animation-name: lightSpeedOut;\n  animation-name: lightSpeedOut;\n  -webkit-animation-timing-function: ease-in;\n  animation-timing-function: ease-in;\n}\n@-webkit-keyframes rotateIn {\n  0% {\n    -webkit-transform-origin: center;\n    transform-origin: center;\n    -webkit-transform: rotate3d(0, 0, 1, -200deg);\n    transform: rotate3d(0, 0, 1, -200deg);\n    opacity: 0;\n  }\n  100% {\n    -webkit-transform-origin: center;\n    transform-origin: center;\n    -webkit-transform: none;\n    transform: none;\n    opacity: 1;\n  }\n}\n@keyframes rotateIn {\n  0% {\n    -webkit-transform-origin: center;\n    transform-origin: center;\n    -webkit-transform: rotate3d(0, 0, 1, -200deg);\n    transform: rotate3d(0, 0, 1, -200deg);\n    opacity: 0;\n  }\n  100% {\n    -webkit-transform-origin: center;\n    transform-origin: center;\n    -webkit-transform: none;\n    transform: none;\n    opacity: 1;\n  }\n}\n.rotateIn {\n  -webkit-animation-name: rotateIn;\n  animation-name: rotateIn;\n}\n@-webkit-keyframes rotateInDownLeft {\n  0% {\n    -webkit-transform-origin: left bottom;\n    transform-origin: left bottom;\n    -webkit-transform: rotate3d(0, 0, 1, -45deg);\n    transform: rotate3d(0, 0, 1, -45deg);\n    opacity: 0;\n  }\n  100% {\n    -webkit-transform-origin: left bottom;\n    transform-origin: left bottom;\n    -webkit-transform: none;\n    transform: none;\n    opacity: 1;\n  }\n}\n@keyframes rotateInDownLeft {\n  0% {\n    -webkit-transform-origin: left bottom;\n    transform-origin: left bottom;\n    -webkit-transform: rotate3d(0, 0, 1, -45deg);\n    transform: rotate3d(0, 0, 1, -45deg);\n    opacity: 0;\n  }\n  100% {\n    -webkit-transform-origin: left bottom;\n    transform-origin: left bottom;\n    -webkit-transform: none;\n    transform: none;\n    opacity: 1;\n  }\n}\n.rotateInDownLeft {\n  -webkit-animation-name: rotateInDownLeft;\n  animation-name: rotateInDownLeft;\n}\n@-webkit-keyframes rotateInDownRight {\n  0% {\n    -webkit-transform-origin: right bottom;\n    transform-origin: right bottom;\n    -webkit-transform: rotate3d(0, 0, 1, 45deg);\n    transform: rotate3d(0, 0, 1, 45deg);\n    opacity: 0;\n  }\n  100% {\n    -webkit-transform-origin: right bottom;\n    transform-origin: right bottom;\n    -webkit-transform: none;\n    transform: none;\n    opacity: 1;\n  }\n}\n@keyframes rotateInDownRight {\n  0% {\n    -webkit-transform-origin: right bottom;\n    transform-origin: right bottom;\n    -webkit-transform: rotate3d(0, 0, 1, 45deg);\n    transform: rotate3d(0, 0, 1, 45deg);\n    opacity: 0;\n  }\n  100% {\n    -webkit-transform-origin: right bottom;\n    transform-origin: right bottom;\n    -webkit-transform: none;\n    transform: none;\n    opacity: 1;\n  }\n}\n.rotateInDownRight {\n  -webkit-animation-name: rotateInDownRight;\n  animation-name: rotateInDownRight;\n}\n@-webkit-keyframes rotateInUpLeft {\n  0% {\n    -webkit-transform-origin: left bottom;\n    transform-origin: left bottom;\n    -webkit-transform: rotate3d(0, 0, 1, 45deg);\n    transform: rotate3d(0, 0, 1, 45deg);\n    opacity: 0;\n  }\n  100% {\n    -webkit-transform-origin: left bottom;\n    transform-origin: left bottom;\n    -webkit-transform: none;\n    transform: none;\n    opacity: 1;\n  }\n}\n@keyframes rotateInUpLeft {\n  0% {\n    -webkit-transform-origin: left bottom;\n    transform-origin: left bottom;\n    -webkit-transform: rotate3d(0, 0, 1, 45deg);\n    transform: rotate3d(0, 0, 1, 45deg);\n    opacity: 0;\n  }\n  100% {\n    -webkit-transform-origin: left bottom;\n    transform-origin: left bottom;\n    -webkit-transform: none;\n    transform: none;\n    opacity: 1;\n  }\n}\n.rotateInUpLeft {\n  -webkit-animation-name: rotateInUpLeft;\n  animation-name: rotateInUpLeft;\n}\n@-webkit-keyframes rotateInUpRight {\n  0% {\n    -webkit-transform-origin: right bottom;\n    transform-origin: right bottom;\n    -webkit-transform: rotate3d(0, 0, 1, -90deg);\n    transform: rotate3d(0, 0, 1, -90deg);\n    opacity: 0;\n  }\n  100% {\n    -webkit-transform-origin: right bottom;\n    transform-origin: right bottom;\n    -webkit-transform: none;\n    transform: none;\n    opacity: 1;\n  }\n}\n@keyframes rotateInUpRight {\n  0% {\n    -webkit-transform-origin: right bottom;\n    transform-origin: right bottom;\n    -webkit-transform: rotate3d(0, 0, 1, -90deg);\n    transform: rotate3d(0, 0, 1, -90deg);\n    opacity: 0;\n  }\n  100% {\n    -webkit-transform-origin: right bottom;\n    transform-origin: right bottom;\n    -webkit-transform: none;\n    transform: none;\n    opacity: 1;\n  }\n}\n.rotateInUpRight {\n  -webkit-animation-name: rotateInUpRight;\n  animation-name: rotateInUpRight;\n}\n@-webkit-keyframes rotateOut {\n  0% {\n    -webkit-transform-origin: center;\n    transform-origin: center;\n    opacity: 1;\n  }\n  100% {\n    -webkit-transform-origin: center;\n    transform-origin: center;\n    -webkit-transform: rotate3d(0, 0, 1, 200deg);\n    transform: rotate3d(0, 0, 1, 200deg);\n    opacity: 0;\n  }\n}\n@keyframes rotateOut {\n  0% {\n    -webkit-transform-origin: center;\n    transform-origin: center;\n    opacity: 1;\n  }\n  100% {\n    -webkit-transform-origin: center;\n    transform-origin: center;\n    -webkit-transform: rotate3d(0, 0, 1, 200deg);\n    transform: rotate3d(0, 0, 1, 200deg);\n    opacity: 0;\n  }\n}\n.rotateOut {\n  -webkit-animation-name: rotateOut;\n  animation-name: rotateOut;\n}\n@-webkit-keyframes rotateOutDownLeft {\n  0% {\n    -webkit-transform-origin: left bottom;\n    transform-origin: left bottom;\n    opacity: 1;\n  }\n  100% {\n    -webkit-transform-origin: left bottom;\n    transform-origin: left bottom;\n    -webkit-transform: rotate3d(0, 0, 1, 45deg);\n    transform: rotate3d(0, 0, 1, 45deg);\n    opacity: 0;\n  }\n}\n@keyframes rotateOutDownLeft {\n  0% {\n    -webkit-transform-origin: left bottom;\n    transform-origin: left bottom;\n    opacity: 1;\n  }\n  100% {\n    -webkit-transform-origin: left bottom;\n    transform-origin: left bottom;\n    -webkit-transform: rotate3d(0, 0, 1, 45deg);\n    transform: rotate3d(0, 0, 1, 45deg);\n    opacity: 0;\n  }\n}\n.rotateOutDownLeft {\n  -webkit-animation-name: rotateOutDownLeft;\n  animation-name: rotateOutDownLeft;\n}\n@-webkit-keyframes rotateOutDownRight {\n  0% {\n    -webkit-transform-origin: right bottom;\n    transform-origin: right bottom;\n    opacity: 1;\n  }\n  100% {\n    -webkit-transform-origin: right bottom;\n    transform-origin: right bottom;\n    -webkit-transform: rotate3d(0, 0, 1, -45deg);\n    transform: rotate3d(0, 0, 1, -45deg);\n    opacity: 0;\n  }\n}\n@keyframes rotateOutDownRight {\n  0% {\n    -webkit-transform-origin: right bottom;\n    transform-origin: right bottom;\n    opacity: 1;\n  }\n  100% {\n    -webkit-transform-origin: right bottom;\n    transform-origin: right bottom;\n    -webkit-transform: rotate3d(0, 0, 1, -45deg);\n    transform: rotate3d(0, 0, 1, -45deg);\n    opacity: 0;\n  }\n}\n.rotateOutDownRight {\n  -webkit-animation-name: rotateOutDownRight;\n  animation-name: rotateOutDownRight;\n}\n@-webkit-keyframes rotateOutUpLeft {\n  0% {\n    -webkit-transform-origin: left bottom;\n    transform-origin: left bottom;\n    opacity: 1;\n  }\n  100% {\n    -webkit-transform-origin: left bottom;\n    transform-origin: left bottom;\n    -webkit-transform: rotate3d(0, 0, 1, -45deg);\n    transform: rotate3d(0, 0, 1, -45deg);\n    opacity: 0;\n  }\n}\n@keyframes rotateOutUpLeft {\n  0% {\n    -webkit-transform-origin: left bottom;\n    transform-origin: left bottom;\n    opacity: 1;\n  }\n  100% {\n    -webkit-transform-origin: left bottom;\n    transform-origin: left bottom;\n    -webkit-transform: rotate3d(0, 0, 1, -45deg);\n    transform: rotate3d(0, 0, 1, -45deg);\n    opacity: 0;\n  }\n}\n.rotateOutUpLeft {\n  -webkit-animation-name: rotateOutUpLeft;\n  animation-name: rotateOutUpLeft;\n}\n@-webkit-keyframes rotateOutUpRight {\n  0% {\n    -webkit-transform-origin: right bottom;\n    transform-origin: right bottom;\n    opacity: 1;\n  }\n  100% {\n    -webkit-transform-origin: right bottom;\n    transform-origin: right bottom;\n    -webkit-transform: rotate3d(0, 0, 1, 90deg);\n    transform: rotate3d(0, 0, 1, 90deg);\n    opacity: 0;\n  }\n}\n@keyframes rotateOutUpRight {\n  0% {\n    -webkit-transform-origin: right bottom;\n    transform-origin: right bottom;\n    opacity: 1;\n  }\n  100% {\n    -webkit-transform-origin: right bottom;\n    transform-origin: right bottom;\n    -webkit-transform: rotate3d(0, 0, 1, 90deg);\n    transform: rotate3d(0, 0, 1, 90deg);\n    opacity: 0;\n  }\n}\n.rotateOutUpRight {\n  -webkit-animation-name: rotateOutUpRight;\n  animation-name: rotateOutUpRight;\n}\n@-webkit-keyframes hinge {\n  0% {\n    -webkit-transform-origin: top left;\n    transform-origin: top left;\n    -webkit-animation-timing-function: ease-in-out;\n    animation-timing-function: ease-in-out;\n  }\n  20%,\n  60% {\n    -webkit-transform: rotate3d(0, 0, 1, 80deg);\n    transform: rotate3d(0, 0, 1, 80deg);\n    -webkit-transform-origin: top left;\n    transform-origin: top left;\n    -webkit-animation-timing-function: ease-in-out;\n    animation-timing-function: ease-in-out;\n  }\n  40%,\n  80% {\n    -webkit-transform: rotate3d(0, 0, 1, 60deg);\n    transform: rotate3d(0, 0, 1, 60deg);\n    -webkit-transform-origin: top left;\n    transform-origin: top left;\n    -webkit-animation-timing-function: ease-in-out;\n    animation-timing-function: ease-in-out;\n    opacity: 1;\n  }\n  100% {\n    -webkit-transform: translate3d(0, 700px, 0);\n    transform: translate3d(0, 700px, 0);\n    opacity: 0;\n  }\n}\n@keyframes hinge {\n  0% {\n    -webkit-transform-origin: top left;\n    transform-origin: top left;\n    -webkit-animation-timing-function: ease-in-out;\n    animation-timing-function: ease-in-out;\n  }\n  20%,\n  60% {\n    -webkit-transform: rotate3d(0, 0, 1, 80deg);\n    transform: rotate3d(0, 0, 1, 80deg);\n    -webkit-transform-origin: top left;\n    transform-origin: top left;\n    -webkit-animation-timing-function: ease-in-out;\n    animation-timing-function: ease-in-out;\n  }\n  40%,\n  80% {\n    -webkit-transform: rotate3d(0, 0, 1, 60deg);\n    transform: rotate3d(0, 0, 1, 60deg);\n    -webkit-transform-origin: top left;\n    transform-origin: top left;\n    -webkit-animation-timing-function: ease-in-out;\n    animation-timing-function: ease-in-out;\n    opacity: 1;\n  }\n  100% {\n    -webkit-transform: translate3d(0, 700px, 0);\n    transform: translate3d(0, 700px, 0);\n    opacity: 0;\n  }\n}\n.hinge {\n  -webkit-animation-name: hinge;\n  animation-name: hinge;\n}\n@-webkit-keyframes rollIn {\n  0% {\n    opacity: 0;\n    -webkit-transform: translate3d(-100%, 0, 0) rotate3d(0, 0, 1, -120deg);\n    transform: translate3d(-100%, 0, 0) rotate3d(0, 0, 1, -120deg);\n  }\n  100% {\n    opacity: 1;\n    -webkit-transform: none;\n    transform: none;\n  }\n}\n@keyframes rollIn {\n  0% {\n    opacity: 0;\n    -webkit-transform: translate3d(-100%, 0, 0) rotate3d(0, 0, 1, -120deg);\n    transform: translate3d(-100%, 0, 0) rotate3d(0, 0, 1, -120deg);\n  }\n  100% {\n    opacity: 1;\n    -webkit-transform: none;\n    transform: none;\n  }\n}\n.rollIn {\n  -webkit-animation-name: rollIn;\n  animation-name: rollIn;\n}\n@-webkit-keyframes rollOut {\n  0% {\n    opacity: 1;\n  }\n  100% {\n    opacity: 0;\n    -webkit-transform: translate3d(100%, 0, 0) rotate3d(0, 0, 1, 120deg);\n    transform: translate3d(100%, 0, 0) rotate3d(0, 0, 1, 120deg);\n  }\n}\n@keyframes rollOut {\n  0% {\n    opacity: 1;\n  }\n  100% {\n    opacity: 0;\n    -webkit-transform: translate3d(100%, 0, 0) rotate3d(0, 0, 1, 120deg);\n    transform: translate3d(100%, 0, 0) rotate3d(0, 0, 1, 120deg);\n  }\n}\n.rollOut {\n  -webkit-animation-name: rollOut;\n  animation-name: rollOut;\n}\n@-webkit-keyframes zoomIn {\n  0% {\n    opacity: 0;\n    -webkit-transform: scale3d(0.3, 0.3, 0.3);\n    transform: scale3d(0.3, 0.3, 0.3);\n  }\n  50% {\n    opacity: 1;\n  }\n}\n@keyframes zoomIn {\n  0% {\n    opacity: 0;\n    -webkit-transform: scale3d(0.3, 0.3, 0.3);\n    transform: scale3d(0.3, 0.3, 0.3);\n  }\n  50% {\n    opacity: 1;\n  }\n}\n.zoomIn {\n  -webkit-animation-name: zoomIn;\n  animation-name: zoomIn;\n}\n@-webkit-keyframes zoomInDown {\n  0% {\n    opacity: 0;\n    -webkit-transform: scale3d(0.1, 0.1, 0.1) translate3d(0, -1000px, 0);\n    transform: scale3d(0.1, 0.1, 0.1) translate3d(0, -1000px, 0);\n    -webkit-animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19);\n    animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19);\n  }\n  60% {\n    opacity: 1;\n    -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(0, 60px, 0);\n    transform: scale3d(0.475, 0.475, 0.475) translate3d(0, 60px, 0);\n    -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1);\n    animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1);\n  }\n}\n@keyframes zoomInDown {\n  0% {\n    opacity: 0;\n    -webkit-transform: scale3d(0.1, 0.1, 0.1) translate3d(0, -1000px, 0);\n    transform: scale3d(0.1, 0.1, 0.1) translate3d(0, -1000px, 0);\n    -webkit-animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19);\n    animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19);\n  }\n  60% {\n    opacity: 1;\n    -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(0, 60px, 0);\n    transform: scale3d(0.475, 0.475, 0.475) translate3d(0, 60px, 0);\n    -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1);\n    animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1);\n  }\n}\n.zoomInDown {\n  -webkit-animation-name: zoomInDown;\n  animation-name: zoomInDown;\n}\n@-webkit-keyframes zoomInLeft {\n  0% {\n    opacity: 0;\n    -webkit-transform: scale3d(0.1, 0.1, 0.1) translate3d(-1000px, 0, 0);\n    transform: scale3d(0.1, 0.1, 0.1) translate3d(-1000px, 0, 0);\n    -webkit-animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19);\n    animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19);\n  }\n  60% {\n    opacity: 1;\n    -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(10px, 0, 0);\n    transform: scale3d(0.475, 0.475, 0.475) translate3d(10px, 0, 0);\n    -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1);\n    animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1);\n  }\n}\n@keyframes zoomInLeft {\n  0% {\n    opacity: 0;\n    -webkit-transform: scale3d(0.1, 0.1, 0.1) translate3d(-1000px, 0, 0);\n    transform: scale3d(0.1, 0.1, 0.1) translate3d(-1000px, 0, 0);\n    -webkit-animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19);\n    animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19);\n  }\n  60% {\n    opacity: 1;\n    -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(10px, 0, 0);\n    transform: scale3d(0.475, 0.475, 0.475) translate3d(10px, 0, 0);\n    -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1);\n    animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1);\n  }\n}\n.zoomInLeft {\n  -webkit-animation-name: zoomInLeft;\n  animation-name: zoomInLeft;\n}\n@-webkit-keyframes zoomInRight {\n  0% {\n    opacity: 0;\n    -webkit-transform: scale3d(0.1, 0.1, 0.1) translate3d(1000px, 0, 0);\n    transform: scale3d(0.1, 0.1, 0.1) translate3d(1000px, 0, 0);\n    -webkit-animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19);\n    animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19);\n  }\n  60% {\n    opacity: 1;\n    -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(-10px, 0, 0);\n    transform: scale3d(0.475, 0.475, 0.475) translate3d(-10px, 0, 0);\n    -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1);\n    animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1);\n  }\n}\n@keyframes zoomInRight {\n  0% {\n    opacity: 0;\n    -webkit-transform: scale3d(0.1, 0.1, 0.1) translate3d(1000px, 0, 0);\n    transform: scale3d(0.1, 0.1, 0.1) translate3d(1000px, 0, 0);\n    -webkit-animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19);\n    animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19);\n  }\n  60% {\n    opacity: 1;\n    -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(-10px, 0, 0);\n    transform: scale3d(0.475, 0.475, 0.475) translate3d(-10px, 0, 0);\n    -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1);\n    animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1);\n  }\n}\n.zoomInRight {\n  -webkit-animation-name: zoomInRight;\n  animation-name: zoomInRight;\n}\n@-webkit-keyframes zoomInUp {\n  0% {\n    opacity: 0;\n    -webkit-transform: scale3d(0.1, 0.1, 0.1) translate3d(0, 1000px, 0);\n    transform: scale3d(0.1, 0.1, 0.1) translate3d(0, 1000px, 0);\n    -webkit-animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19);\n    animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19);\n  }\n  60% {\n    opacity: 1;\n    -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(0, -60px, 0);\n    transform: scale3d(0.475, 0.475, 0.475) translate3d(0, -60px, 0);\n    -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1);\n    animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1);\n  }\n}\n@keyframes zoomInUp {\n  0% {\n    opacity: 0;\n    -webkit-transform: scale3d(0.1, 0.1, 0.1) translate3d(0, 1000px, 0);\n    transform: scale3d(0.1, 0.1, 0.1) translate3d(0, 1000px, 0);\n    -webkit-animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19);\n    animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19);\n  }\n  60% {\n    opacity: 1;\n    -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(0, -60px, 0);\n    transform: scale3d(0.475, 0.475, 0.475) translate3d(0, -60px, 0);\n    -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1);\n    animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1);\n  }\n}\n.zoomInUp {\n  -webkit-animation-name: zoomInUp;\n  animation-name: zoomInUp;\n}\n@-webkit-keyframes zoomOut {\n  0% {\n    opacity: 1;\n  }\n  50% {\n    opacity: 0;\n    -webkit-transform: scale3d(0.3, 0.3, 0.3);\n    transform: scale3d(0.3, 0.3, 0.3);\n  }\n  100% {\n    opacity: 0;\n  }\n}\n@keyframes zoomOut {\n  0% {\n    opacity: 1;\n  }\n  50% {\n    opacity: 0;\n    -webkit-transform: scale3d(0.3, 0.3, 0.3);\n    transform: scale3d(0.3, 0.3, 0.3);\n  }\n  100% {\n    opacity: 0;\n  }\n}\n.zoomOut {\n  -webkit-animation-name: zoomOut;\n  animation-name: zoomOut;\n}\n@-webkit-keyframes zoomOutDown {\n  40% {\n    opacity: 1;\n    -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(0, -60px, 0);\n    transform: scale3d(0.475, 0.475, 0.475) translate3d(0, -60px, 0);\n    -webkit-animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19);\n    animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19);\n  }\n  100% {\n    opacity: 0;\n    -webkit-transform: scale3d(0.1, 0.1, 0.1) translate3d(0, 2000px, 0);\n    transform: scale3d(0.1, 0.1, 0.1) translate3d(0, 2000px, 0);\n    -webkit-transform-origin: center bottom;\n    transform-origin: center bottom;\n    -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1);\n    animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1);\n  }\n}\n@keyframes zoomOutDown {\n  40% {\n    opacity: 1;\n    -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(0, -60px, 0);\n    transform: scale3d(0.475, 0.475, 0.475) translate3d(0, -60px, 0);\n    -webkit-animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19);\n    animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19);\n  }\n  100% {\n    opacity: 0;\n    -webkit-transform: scale3d(0.1, 0.1, 0.1) translate3d(0, 2000px, 0);\n    transform: scale3d(0.1, 0.1, 0.1) translate3d(0, 2000px, 0);\n    -webkit-transform-origin: center bottom;\n    transform-origin: center bottom;\n    -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1);\n    animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1);\n  }\n}\n.zoomOutDown {\n  -webkit-animation-name: zoomOutDown;\n  animation-name: zoomOutDown;\n}\n@-webkit-keyframes zoomOutLeft {\n  40% {\n    opacity: 1;\n    -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(42px, 0, 0);\n    transform: scale3d(0.475, 0.475, 0.475) translate3d(42px, 0, 0);\n  }\n  100% {\n    opacity: 0;\n    -webkit-transform: scale(0.1) translate3d(-2000px, 0, 0);\n    transform: scale(0.1) translate3d(-2000px, 0, 0);\n    -webkit-transform-origin: left center;\n    transform-origin: left center;\n  }\n}\n@keyframes zoomOutLeft {\n  40% {\n    opacity: 1;\n    -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(42px, 0, 0);\n    transform: scale3d(0.475, 0.475, 0.475) translate3d(42px, 0, 0);\n  }\n  100% {\n    opacity: 0;\n    -webkit-transform: scale(0.1) translate3d(-2000px, 0, 0);\n    transform: scale(0.1) translate3d(-2000px, 0, 0);\n    -webkit-transform-origin: left center;\n    transform-origin: left center;\n  }\n}\n.zoomOutLeft {\n  -webkit-animation-name: zoomOutLeft;\n  animation-name: zoomOutLeft;\n}\n@-webkit-keyframes zoomOutRight {\n  40% {\n    opacity: 1;\n    -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(-42px, 0, 0);\n    transform: scale3d(0.475, 0.475, 0.475) translate3d(-42px, 0, 0);\n  }\n  100% {\n    opacity: 0;\n    -webkit-transform: scale(0.1) translate3d(2000px, 0, 0);\n    transform: scale(0.1) translate3d(2000px, 0, 0);\n    -webkit-transform-origin: right center;\n    transform-origin: right center;\n  }\n}\n@keyframes zoomOutRight {\n  40% {\n    opacity: 1;\n    -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(-42px, 0, 0);\n    transform: scale3d(0.475, 0.475, 0.475) translate3d(-42px, 0, 0);\n  }\n  100% {\n    opacity: 0;\n    -webkit-transform: scale(0.1) translate3d(2000px, 0, 0);\n    transform: scale(0.1) translate3d(2000px, 0, 0);\n    -webkit-transform-origin: right center;\n    transform-origin: right center;\n  }\n}\n.zoomOutRight {\n  -webkit-animation-name: zoomOutRight;\n  animation-name: zoomOutRight;\n}\n@-webkit-keyframes zoomOutUp {\n  40% {\n    opacity: 1;\n    -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(0, 60px, 0);\n    transform: scale3d(0.475, 0.475, 0.475) translate3d(0, 60px, 0);\n    -webkit-animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19);\n    animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19);\n  }\n  100% {\n    opacity: 0;\n    -webkit-transform: scale3d(0.1, 0.1, 0.1) translate3d(0, -2000px, 0);\n    transform: scale3d(0.1, 0.1, 0.1) translate3d(0, -2000px, 0);\n    -webkit-transform-origin: center bottom;\n    transform-origin: center bottom;\n    -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1);\n    animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1);\n  }\n}\n@keyframes zoomOutUp {\n  40% {\n    opacity: 1;\n    -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(0, 60px, 0);\n    transform: scale3d(0.475, 0.475, 0.475) translate3d(0, 60px, 0);\n    -webkit-animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19);\n    animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19);\n  }\n  100% {\n    opacity: 0;\n    -webkit-transform: scale3d(0.1, 0.1, 0.1) translate3d(0, -2000px, 0);\n    transform: scale3d(0.1, 0.1, 0.1) translate3d(0, -2000px, 0);\n    -webkit-transform-origin: center bottom;\n    transform-origin: center bottom;\n    -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1);\n    animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1);\n  }\n}\n.zoomOutUp {\n  -webkit-animation-name: zoomOutUp;\n  animation-name: zoomOutUp;\n}\n@-webkit-keyframes slideInDown {\n  0% {\n    -webkit-transform: translateY(-100%);\n    transform: translateY(-100%);\n    visibility: visible;\n  }\n  100% {\n    -webkit-transform: translateY(0);\n    transform: translateY(0);\n  }\n}\n@keyframes slideInDown {\n  0% {\n    -webkit-transform: translateY(-100%);\n    transform: translateY(-100%);\n    visibility: visible;\n  }\n  100% {\n    -webkit-transform: translateY(0);\n    transform: translateY(0);\n  }\n}\n.slideInDown {\n  -webkit-animation-name: slideInDown;\n  animation-name: slideInDown;\n}\n@-webkit-keyframes slideInLeft {\n  0% {\n    -webkit-transform: translateX(-100%);\n    transform: translateX(-100%);\n    visibility: visible;\n  }\n  100% {\n    -webkit-transform: translateX(0);\n    transform: translateX(0);\n  }\n}\n@keyframes slideInLeft {\n  0% {\n    -webkit-transform: translateX(-100%);\n    transform: translateX(-100%);\n    visibility: visible;\n  }\n  100% {\n    -webkit-transform: translateX(0);\n    transform: translateX(0);\n  }\n}\n.slideInLeft {\n  -webkit-animation-name: slideInLeft;\n  animation-name: slideInLeft;\n}\n@-webkit-keyframes slideInRight {\n  0% {\n    -webkit-transform: translateX(100%);\n    transform: translateX(100%);\n    visibility: visible;\n  }\n  100% {\n    -webkit-transform: translateX(0);\n    transform: translateX(0);\n  }\n}\n@keyframes slideInRight {\n  0% {\n    -webkit-transform: translateX(100%);\n    transform: translateX(100%);\n    visibility: visible;\n  }\n  100% {\n    -webkit-transform: translateX(0);\n    transform: translateX(0);\n  }\n}\n.slideInRight {\n  -webkit-animation-name: slideInRight;\n  animation-name: slideInRight;\n}\n@-webkit-keyframes slideInUp {\n  0% {\n    -webkit-transform: translateY(100%);\n    transform: translateY(100%);\n    visibility: visible;\n  }\n  100% {\n    -webkit-transform: translateY(0);\n    transform: translateY(0);\n  }\n}\n@keyframes slideInUp {\n  0% {\n    -webkit-transform: translateY(100%);\n    transform: translateY(100%);\n    visibility: visible;\n  }\n  100% {\n    -webkit-transform: translateY(0);\n    transform: translateY(0);\n  }\n}\n.slideInUp {\n  -webkit-animation-name: slideInUp;\n  animation-name: slideInUp;\n}\n@-webkit-keyframes slideOutDown {\n  0% {\n    -webkit-transform: translateY(0);\n    transform: translateY(0);\n  }\n  100% {\n    visibility: hidden;\n    -webkit-transform: translateY(100%);\n    transform: translateY(100%);\n  }\n}\n@keyframes slideOutDown {\n  0% {\n    -webkit-transform: translateY(0);\n    transform: translateY(0);\n  }\n  100% {\n    visibility: hidden;\n    -webkit-transform: translateY(100%);\n    transform: translateY(100%);\n  }\n}\n.slideOutDown {\n  -webkit-animation-name: slideOutDown;\n  animation-name: slideOutDown;\n}\n@-webkit-keyframes slideOutLeft {\n  0% {\n    -webkit-transform: translateX(0);\n    transform: translateX(0);\n  }\n  100% {\n    visibility: hidden;\n    -webkit-transform: translateX(-100%);\n    transform: translateX(-100%);\n  }\n}\n@keyframes slideOutLeft {\n  0% {\n    -webkit-transform: translateX(0);\n    transform: translateX(0);\n  }\n  100% {\n    visibility: hidden;\n    -webkit-transform: translateX(-100%);\n    transform: translateX(-100%);\n  }\n}\n.slideOutLeft {\n  -webkit-animation-name: slideOutLeft;\n  animation-name: slideOutLeft;\n}\n@-webkit-keyframes slideOutRight {\n  0% {\n    -webkit-transform: translateX(0);\n    transform: translateX(0);\n  }\n  100% {\n    visibility: hidden;\n    -webkit-transform: translateX(100%);\n    transform: translateX(100%);\n  }\n}\n@keyframes slideOutRight {\n  0% {\n    -webkit-transform: translateX(0);\n    transform: translateX(0);\n  }\n  100% {\n    visibility: hidden;\n    -webkit-transform: translateX(100%);\n    transform: translateX(100%);\n  }\n}\n.slideOutRight {\n  -webkit-animation-name: slideOutRight;\n  animation-name: slideOutRight;\n}\n@-webkit-keyframes slideOutUp {\n  0% {\n    -webkit-transform: translateY(0);\n    transform: translateY(0);\n  }\n  100% {\n    visibility: hidden;\n    -webkit-transform: translateY(-100%);\n    transform: translateY(-100%);\n  }\n}\n@keyframes slideOutUp {\n  0% {\n    -webkit-transform: translateY(0);\n    transform: translateY(0);\n  }\n  100% {\n    visibility: hidden;\n    -webkit-transform: translateY(-100%);\n    transform: translateY(-100%);\n  }\n}\n.slideOutUp {\n  -webkit-animation-name: slideOutUp;\n  animation-name: slideOutUp;\n}\nhtml,\nbody,\ndiv,\nspan,\na,\nli,\ntd,\nth {\n  font-family: '微软雅黑', 'Lato', sans-serif;\n}\nbold {\n  font-family: 'Lato-Bold', sans-serif;\n  font-weight: Bold;\n}\nli,\n.wrappable {\n  white-space: pre;\n  /* CSS 2.0 */\n  white-space: pre-wrap;\n  /* CSS 2.1 */\n  white-space: pre-line;\n  /* CSS 3.0 */\n  white-space: -pre-wrap;\n  /* Opera 4-6 */\n  white-space: -o-pre-wrap;\n  /* Opera 7 */\n  white-space: -moz-pre-wrap;\n  /* Mozilla */\n  white-space: -hp-pre-wrap;\n  /* HP Printers */\n  word-wrap: break-word;\n  /* IE 5+ */\n}\npre.wrappable {\n  white-space: pre;\n  /* CSS 2.0 */\n  white-space: pre-wrap;\n  /* CSS 2.1 */\n  white-space: -pre-wrap;\n  /* Opera 4-6 */\n  white-space: -o-pre-wrap;\n  /* Opera 7 */\n  white-space: -moz-pre-wrap;\n  /* Mozilla */\n  white-space: -hp-pre-wrap;\n  /* HP Printers */\n  word-wrap: break-word;\n  /* IE 5+ */\n}\nhtml {\n  position: relative;\n  min-height: 100%;\n  overflow-x: hidden;\n}\n.btn-group {\n  border-color: #4CAF50;\n}\nbody.full-screen-body-background {\n  background-color: #ffffff;\n}\nbody.top-and-bottom-margins {\n  padding-top: 50px;\n}\nbody.no-top-and-bottom-margins {\n  margin: 75px 10px 0px 15px;\n}\nh1,\nh2 {\n  font-weight: 400;\n}\nh1,\nh2,\nh3,\nh4,\nh5,\nh6,\np,\nli {\n  padding-top: 5px;\n  padding-bottom: 5px;\n}\n.alert {\n  margin-top: 20px;\n}\n.thumbnail {\n  background-color: #EEEEEE;\n}\n.fa,\n[class^='ion-'] {\n  margin-right: 5px;\n}\n.fa:hover {\n  text-decoration: none;\n}\n.no-link-underline {\n  text-decoration: none;\n}\n.img-center {\n  margin: 0 auto;\n}\n.btn-cta {\n  font-size: 40px;\n}\n.shadow {\n  white-space: normal;\n  -webkit-box-shadow: 2px 4px 1px rgba(0, 0, 0, 0.3);\n  -moz-box-shadow: 2px 4px 1px rgba(0, 0, 0, 0.3);\n  box-shadow: 2px 4px 1px rgba(0, 0, 0, 0.3);\n}\n.btn-nav {\n  margin-top: 10px;\n}\nul {\n  list-style: none;\n}\n.panel-heading {\n  font-size: 25px;\n}\n.panel-heading > h1 {\n  font-size: 25px;\n  padding: 2px;\n  margin: 2px;\n}\n.navbar-brand {\n  font-size: 26px;\n}\n.navbar > .container {\n  width: auto;\n  padding-left: 0px;\n  padding-right: 0px;\n}\n.nav-height {\n  height: 50px;\n  border: none;\n}\n.landing-icon {\n  height: 200px;\n  width: 200px;\n}\n.completion-icon {\n  font-size: 150px;\n}\n.positive-15 {\n  margin-top: 15px;\n}\n.positive-20 {\n  margin-top: 20px;\n}\n.positive-15-bottom {\n  margin-bottom: 15px;\n}\n.positive-10 {\n  margin-top: 10px;\n}\n.positive-5 {\n  margin-top: 5px;\n}\n.negative-5 {\n  margin-top: -5px;\n}\n.negative-10 {\n  margin-top: -10px;\n}\n.negative-15 {\n  margin-top: -15px;\n}\n.negative-20 {\n  margin-top: -20px;\n}\n.negative-28 {\n  margin-top: -28px;\n}\n.negative-30 {\n  margin-top: -30px;\n}\n.negative-30-bottom {\n  margin-bottom: -30px;\n}\n.negative-35 {\n  margin-top: -35px;\n}\n.negative-55 {\n  margin-top: -55px;\n  margin-bottom: -55px;\n}\n.large-p {\n  font-size: 24px;\n}\n.small-p {\n  font-size: 14px;\n}\n.map-p {\n  font-size: 20px;\n}\n.map-row-numbers {\n  text-align: right;\n  padding-right: 5px;\n  padding-left: 5px;\n}\n.link-table td {\n  font-size: 16px;\n  border-top: none !important;\n}\n@media (min-width: 767px) {\n  .link-table td {\n    font-size: 24px;\n  }\n}\n.capitalize {\n  text-transform: capitalize;\n}\n.text-success {\n  color: #4CAF50;\n}\n.fast-animation {\n  -webkit-animation-duration: 0.5s;\n  animation-duration: 0.5s;\n}\n.disabled {\n  pointer-events: none;\n  cursor: default;\n  color: graytext !important;\n}\n.hidden-element {\n  display: none;\n}\n.nav-logo {\n  height: 40px;\n  margin-top: -10px;\n}\n@media (max-width: 397px) {\n  .nav-logo {\n    height: 30px;\n    margin-top: -5px;\n  }\n}\n@media (max-width: 335px) {\n  .nav-logo {\n    height: 25px;\n    margin-top: -2px;\n  }\n}\n.navbar-right {\n  background-color: white;\n  text-align: center;\n}\n@media (min-width: 767px) {\n  .navbar-right {\n    margin-right: 0;\n  }\n}\n@media (max-width: 991px) and (min-width: 767px) {\n  .navbar-right {\n    position: absolute;\n    left: 0;\n    right: 0;\n    margin-right: 0px;\n    white-space: nowrap;\n  }\n}\n.navbar {\n  white-space: nowrap;\n  border: none;\n  line-height: 1;\n  -webkit-box-shadow: 0 0 10px rgba(0,0,0,0.1);\n    -moz-box-shadow: 0 0 10px rgba(0,0,0,0.1);\n    box-shadow: 0 0 10px rgba(0,0,0,0.1);\n}\n@media (min-width: 767px) {\n  .navbar {\n    padding-left: 15px;\n    padding-right: 30px;\n  }\n}\nli.avatar,\nli.avatar > a {\n  padding: 0;\n  margin: 0;\n}\n.thin-progress-bar {\n  height: 8px;\n  margin-top: 3px;\n  margin-bottom: 0px;\n  width: 60%;\n  margin-right: auto;\n  margin-left: auto;\n}\n.panel-body {\n  margin-bottom: -6px;\n}\n.lb-container {\n  padding: 0px;\n}\n.btn-social {\n  width: 250px;\n  margin: auto;\n}\n.btn-link-social {\n  max-width: 400px;\n  margin: auto;\n  margin-bottom: 10px;\n}\n.navbar {\n  background-color: white;\n}\na {\n  font-weight: bold;\n}\n.map-aside-body p {\n  line-height: 1.8;\n}\n.navbar-nav > li > a {\n  color: #ffffff;\n}\n.navbar-nav > li > a:hover {\n  color: #4CAF50;\n}\n.hug-top {\n  margin-top: -35px;\n  margin-bottom: -10px;\n}\n.nonprofit-landing {\n  font-size: 50px;\n}\n.big-text {\n  font-size: 63px;\n}\n.signup-btn.btn {\n  background-color: #ffac33;\n  background-image: linear-gradient(#ffcc4d, #ffac33);\n  -ms-filter: \"progid:DXImageTransform.Microsoft.gradient(startColorstr=#ffcc4d,  endColorstr=#ffac33,  GradientType=0)\";\n  border-color: #f1a02a;\n  color: #292f33 !important;\n  text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5);\n}\n.signup-btn:hover,\n.signup-btn:focus {\n  background-color: #e99110;\n  background-image: linear-gradient(#ffcc4d, #e99110);\n  -ms-filter: \"progid:DXImageTransform.Microsoft.gradient(startColorstr=#ffcc4d,  endColorstr=#e99110,  GradientType=0)\";\n  border-color: #ec8b11;\n  color: #292f33 !important;\n}\n.signup-btn:active {\n  background-color: #f2a330;\n  background-image: none;\n  box-shadow: inset 0 1px 4px rgba(0, 0, 0, 0.3);\n}\n*,\n*:before,\n*:after {\n  box-sizing: border-box !important;\n}\n.btn-big {\n  font-size: 20px;\n  border-radius: 6px;\n}\n.btn-bigger {\n  font-size: 30px;\n}\n.big-text-field {\n  font-size: 30px;\n  height: 57px;\n  background-color: #ffffff !important;\n}\nh4 {\n  font-size: 22px;\n}\n.no-transition {\n  -webkit-transition: height 0.001s;\n  -moz-transition: height 0.001s;\n  -ms-transition: height 0.001s;\n  -o-transition: height 0.001s;\n  transition: height 0.001s;\n}\n.margin-left-10 {\n  margin-left: 10px;\n}\n@media (max-width: 768px) {\n  .btn-responsive {\n    font-size: 15px;\n    height: 26.5px;\n    padding-top: 1px;\n  }\n}\n@media (max-width: 768px) {\n  .field-responsive {\n    font-size: 15px;\n    height: 26.5px;\n  }\n}\nthead {\n  font-size: 150%;\n}\n.nowrap {\n  white-space: nowrap;\n}\n.big-break {\n  margin-top: 50px;\n  margin-bottom: 50px;\n}\n.profile-picture {\n  height: 50px;\n  width: 50px;\n}\n@media (min-width: 991px) and (max-width: 999px) {\n  .brownie-points-nav {\n    margin-right: -10px;\n  }\n}\n.navbar-nav a {\n  color: #ffffff;\n  font-size: 20px;\n  margin-top: -5px;\n  margin-bottom: -5px;\n}\n.navbar-toggle {\n  color: #ffffff;\n}\n.navbar-toggle:hover,\n.navbar-toggle:focus {\n  color: #4a2b0f;\n}\n.signup-btn-nav {\n  margin-top: -2px !important;\n  padding-top: 10px !important;\n  padding-bottom: 10px !important;\n  margin-right: -12px;\n}\n@media (min-width: 991px) and (max-width: 1010px) {\n  .signup-btn-nav {\n    margin-left: -10px;\n    margin-right: -5px;\n  }\n}\n.public-profile-img {\n  height: 200px;\n  width: 200px;\n  border-radius: 5px;\n}\n.ng-invalid.ng-dirty {\n  border-color: #FA787E;\n}\n.ng-valid.ng-dirty {\n  border-color: #78FA89;\n}\n.flat-top {\n  margin-top: -5px;\n}\n.negative-bottom {\n  margin-bottom: -20px;\n}\n.min-height-1000 {\n  min-height: 1000px;\n}\n.points-on-top {\n  color: #ffffff;\n  font-size: 35px;\n  z-index: 2;\n  width: 60%;\n  margin: 0 auto;\n  position: relative;\n  top: 50%;\n  -webkit-transform: translateY(-50%);\n  transform: translateY(-50%);\n}\n.landing-skill-icon {\n  color: #4CAF50;\n  font-size: 150px;\n}\n.custom-landing-skill-icon {\n  margin-top: -15px;\n  padding-bottom: 15px;\n}\n.black-text {\n  color: #333;\n  font-weight: 400;\n  font-size: 40px;\n}\n.font-awesome-padding {\n  margin-top: 45px;\n  margin-bottom: 20px;\n}\n.background-svg {\n  width: 220px;\n  height: 220px;\n  background-image: url(\"/images/certificate-icon.svg\");\n  background-size: 120%;\n  background-repeat: no-repeat;\n  background-position: center;\n}\n.testimonial-image {\n  border-radius: 5px;\n  height: 200px;\n  width: 200px;\n  color: #009900;\n}\n.testimonial-image-jobs {\n  border-radius: 5px;\n  color: #009900;\n}\n.default-border-radius {\n  border-radius: 5px;\n}\n.height-500 {\n  height: 500px;\n}\n.height-400 {\n  height: 400px;\n}\n.testimonial-copy {\n  text-align: justify;\n  font-size: 18px !important;\n  margin-left: 20px;\n  margin-right: 20px;\n}\n@media (min-width: 991px) and (max-width: 1199px) {\n  .testimonial-copy {\n    height: 150px;\n  }\n}\n@media (min-width: 1200px) {\n  .testimonial-copy {\n    height: 100px;\n  }\n}\n.nonprofit-testimonial-copy {\n  text-align: justify;\n  font-size: 18px !important;\n  margin-left: 20px;\n  margin-right: 20px;\n}\n@media (min-width: 991px) and (max-width: 1199px) {\n  .nonprofit-testimonial-copy {\n    height: 300px !important;\n  }\n}\n@media (min-width: 1200px) {\n  .nonprofit-testimonial-copy {\n    height: 200px !important;\n  }\n}\n.navbar-collapse {\n  border-top: 0;\n}\n.challenge-list-header {\n  background-color: #4CAF50;\n  color: #eeeeee;\n  font-size: 36px;\n  text-align: center;\n  border-radius: 5px 5px 0px 0px;\n  padding-left: 50px;\n}\n.closing-x {\n  color: #eeeeee;\n  font-size: 50px;\n  text-align: right;\n}\n.fcc-footer {\n  width: 100%;\n  height: 50px;\n  text-align: center;\n  background-color: #4CAF50;\n  padding: 12px;\n  bottom: 0;\n  left: 0;\n  position: absolute;\n}\n.fcc-footer a {\n  font-size: 20px;\n  color: #eeeeee;\n  margin-left: 0px;\n  margin-right: 0px;\n  padding-left: 10px;\n  padding-right: 10px;\n  padding-top: 14px;\n  padding-bottom: 12px;\n}\n.fcc-footer a:hover {\n  color: #4CAF50;\n  text-decoration: none;\n}\n.embed-responsive-twitch-chat {\n  padding-bottom: 117%;\n}\n#directions {\n  text-align: left;\n  font-size: 15px;\n}\n.graph-rect {\n  fill: #ddd !important;\n}\n/**\n * Bonfire styling\n */\nform.code span {\n  font-size: 18px;\n  font-family: \"Ubuntu Mono\";\n  padding-bottom: 0px;\n  margin-bottom: 0px;\n  height: 100%;\n}\n.CodeMirror {\n  line-height: 1 !important;\n}\n.CodeMirror-linenumber {\n  font-size: 18px;\n  font-family: \"Ubuntu Mono\";\n}\n#mainEditorPanel {\n  height: 100%;\n  width: 99%;\n}\n.scroll-locker {\n  overflow-x: hidden;\n  overflow-y: auto;\n}\n#mainEditorPanel .panel-body {\n  padding-bottom: 0px;\n}\ndiv.CodeMirror-scroll {\n  padding-bottom: 30px;\n}\n.test-vertical-center {\n  margin-top: 8px;\n}\n.cm-s-monokai.CodeMirror {\n  border-radius: 5px;\n}\n.courseware-height {\n  min-height: 650px;\n}\n.btn {\n  font-weight: 400;\n  white-space: normal;\n  background: transparent;\n  -webkit-transition: background 0.2s ease-in-out, border 0.2s ease-in-out;\n  -moz-transition: background 0.2s ease-in-out, border 0.2s ease-in-out;\n  -ms-transition: background 0.2s ease-in-out, border 0.2s ease-in-out;\n  -o-transition: background 0.2s ease-in-out, border 0.2s ease-in-out;\n  transition: background 0.2s ease-in-out, border 0.2s ease-in-out;\n}\n.population-table {\n  font-size: 30px;\n  width: 460px;\n  margin: 0 auto;\n  padding: 0;\n}\n.population-table h2 {\n  margin: 0;\n  text-align: left;\n}\n.population-table .tag {\n  width: 165px;\n  display: inline-block;\n}\n.population-table .text-primary {\n  margin-right: 5px;\n}\n@media (max-width: 767px) {\n  .population-table {\n    font-size: 16px;\n    width: 260px;\n  }\n  .population-table .tag {\n    width: 95px;\n  }\n}\n@media (max-width: 991px) {\n  .navbar-header {\n    float: none;\n  }\n  .navbar-toggle {\n    display: block;\n  }\n  .navbar-collapse.collapse {\n    display: none !important;\n  }\n  .navbar-nav {\n    margin-top: 0;\n  }\n  .navbar-nav > li {\n    float: none;\n  }\n  .navbar-nav > li > a {\n    padding-top: 10px;\n    padding-bottom: 10px;\n  }\n  .navbar-text {\n    float: none;\n    margin: 15px 0;\n  }\n  /* since 3.1.0 */\n  .navbar-collapse.collapse.in {\n    display: block !important;\n  }\n  .collapsing {\n    overflow: hidden !important;\n    position: absolute;\n    left: 0;\n    right: 0;\n  }\n}\n.navbar-toggle {\n  width: 80px;\n  padding-left: 0;\n  padding-right: 8px;\n  margin: 7px 2px 7px 0;\n  text-align: left;\n  font-size: 10px;\n}\n.hamburger-text {\n  line-height: 0.75em;\n  margin-top: 10px;\n  font-size: 18px;\n  color: #777;\n}\n.story-list {\n  padding-bottom: 30px;\n  margin-bottom: 30px;\n}\n.button-spacer {\n  padding: 5px 0;\n}\n.spacer {\n  padding: 15px 0 15px 0;\n}\n.img-news {\n  width: 50px;\n  height: 50px;\n}\n.url-preview {\n  max-width: 250px;\n  max-height: 250px;\n}\n@media (min-width: 768px) {\n  .news-box {\n    margin-top: -40px;\n  }\n}\n@media (max-width: 767px) {\n  .news-box {\n    padding: 5px;\n    border-color: #4A2B0F;\n    border-width: 1px;\n    border-style: solid;\n    border-radius: 5px;\n    width: 100%;\n    float: left;\n  }\n}\n@media (min-width: 768px) {\n  .news-box-search {\n    margin-top: -30px;\n    padding-bottom: 20px;\n  }\n}\n@media (max-width: 767px) {\n  .news-box-search {\n    padding: 5px;\n    border-color: #4A2B0F;\n    border-width: 1px;\n    border-style: solid;\n    border-radius: 5px;\n    width: 100%;\n    float: left;\n  }\n}\n.story-headline {\n  font-size: 20px;\n  margin-left: 14px;\n  margin-top: -5px;\n}\n.landing-heading {\n  font-size: 50px !important;\n  font-family: Georgia;\n}\n.mobile-story-headline {\n  font-size: 20px;\n}\n.story-byline {\n  margin-top: 5px;\n  font-size: 14px;\n}\n.media-stories {\n  margin-left: 20px;\n}\nhr {\n  border: 0;\n  height: 1px;\n  background-image: linear-gradient(to right, rgba(0, 0, 0, 0), rgba(0, 0, 0, 0.75), rgba(0, 0, 0, 0));\n}\n.big-spacer {\n  padding: 30px 0 30px 0;\n}\n#reply-to-main-post,\n#upvote {\n  cursor: pointer;\n}\n.btn-no-shadow {\n  -webkit-box-shadow: 0px 0px 0px rgba(0, 0, 0, 0);\n  -moz-box-shadow: 0px 0px 0px rgba(0, 0, 0, 0);\n  box-shadow: 0px 0px 0px rgba(0, 0, 0, 0);\n}\n.dotted-underline {\n  border-bottom: dashed 1px #457E86;\n}\n.d3-centered {\n  width: 771px;\n  margin: 0 auto;\n}\n.cal-heatmap-container {\n  background-color: #ffffff;\n}\n.interested-camper-image {\n  height: 50px;\n  width: 50px;\n  padding: 5px;\n}\n.mobile-story-image {\n  border-radius: 5px;\n  width: 100%;\n}\n@media (max-width: 768px) {\n  .mobile-story-image {\n    margin-right: 5px;\n  }\n}\n.alert a {\n  text-decoration: underline;\n}\n.step-text {\n  line-height: 120%;\n  padding-bottom: 10px;\n}\n.faded {\n  opacity: 0.5;\n}\n.slightly-faded {\n  opacity: 0.75;\n}\n.padded-ionic-icon {\n  padding-top: 5px;\n}\n.checklist-element {\n  margin-left: -60px;\n  margin-right: -20px;\n}\n.profile-social-icons {\n  margin-left: 8px;\n}\n.border-radius-5 {\n  border-radius: 5px;\n}\ncode {\n  padding: 0;\n}\n@media only screen and (min-width: 993px) {\n  .iframe-scroll {\n    z-index: 1;\n  }\n}\n@media only screen and (max-width: 992px) {\n  .iframe-scroll {\n    height: auto;\n    overflow: auto;\n  }\n}\n.chart rect {\n  fill: steelblue;\n}\n.chart text {\n  font-size: 14px;\n  text-anchor: end;\n}\n.axis path,\n.axis line {\n  fill: none;\n  stroke: #121401;\n  stroke-width: 2px;\n  shape-rendering: crispEdges;\n}\n.gitter-chat-embed {\n  z-index: 20000 !important;\n}\n/* :not(:required) hides this rule from IE9 and below */\n.inner-circles-loader:not(:required) {\n  -moz-transform: translate3d(0, 0, 0);\n  -ms-transform: translate3d(0, 0, 0);\n  -webkit-transform: translate3d(0, 0, 0);\n  transform: translate3d(0, 0, 0);\n  position: relative;\n  display: inline-block;\n  width: 125px;\n  height: 125px;\n  background: rgba(25, 165, 152, 0.5);\n  border-radius: 50%;\n  overflow: hidden;\n  text-indent: -9999px;\n  margin-top: 10%;\n  /* Hides inner circles outside base circle at safari */\n  -webkit-mask-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAIAAACQd1PeAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAA5JREFUeNpiYGBgAAgwAAAEAAGbA+oJAAAAAElFTkSuQmCC);\n}\n.inner-circles-loader:not(:required):before,\n.inner-circles-loader:not(:required):after {\n  content: '';\n  position: absolute;\n  top: 0;\n  display: inline-block;\n  width: 125px;\n  height: 125px;\n  border-radius: 50%;\n}\n.inner-circles-loader:not(:required):before {\n  -moz-animation: inner-circles-loader 3s infinite;\n  -webkit-animation: inner-circles-loader 3s infinite;\n  animation: inner-circles-loader 3s infinite;\n  -moz-transform-origin: 0 50%;\n  -ms-transform-origin: 0 50%;\n  -webkit-transform-origin: 0 50%;\n  transform-origin: 0 50%;\n  left: 0;\n  background: #c7efcf;\n}\n.inner-circles-loader:not(:required):after {\n  -moz-animation: inner-circles-loader 3s 0.2s reverse infinite;\n  -webkit-animation: inner-circles-loader 3s 0.2s reverse infinite;\n  animation: inner-circles-loader 3s 0.2s reverse infinite;\n  -moz-transform-origin: 100% 50%;\n  -ms-transform-origin: 100% 50%;\n  -webkit-transform-origin: 100% 50%;\n  transform-origin: 100% 50%;\n  right: 0;\n  background: #eef5db;\n}\n@-moz-keyframes inner-circles-loader {\n  0% {\n    -moz-transform: rotate(0deg);\n    transform: rotate(0deg);\n  }\n  50% {\n    -moz-transform: rotate(360deg);\n    transform: rotate(360deg);\n  }\n  100% {\n    -moz-transform: rotate(0deg);\n    transform: rotate(0deg);\n  }\n}\n@-webkit-keyframes inner-circles-loader {\n  0% {\n    -webkit-transform: rotate(0deg);\n    transform: rotate(0deg);\n  }\n  50% {\n    -webkit-transform: rotate(360deg);\n    transform: rotate(360deg);\n  }\n  100% {\n    -webkit-transform: rotate(0deg);\n    transform: rotate(0deg);\n  }\n}\n@keyframes inner-circles-loader {\n  0% {\n    -moz-transform: rotate(0deg);\n    -ms-transform: rotate(0deg);\n    -webkit-transform: rotate(0deg);\n    transform: rotate(0deg);\n  }\n  50% {\n    -moz-transform: rotate(360deg);\n    -ms-transform: rotate(360deg);\n    -webkit-transform: rotate(360deg);\n    transform: rotate(360deg);\n  }\n  100% {\n    -moz-transform: rotate(0deg);\n    -ms-transform: rotate(0deg);\n    -webkit-transform: rotate(0deg);\n    transform: rotate(0deg);\n  }\n}\n.chat-embed-main-title {\n  display: flex;\n  flex-grow: 1;\n  padding-left: 31px;\n  padding-top: 7px;\n}\n.gitter-chat-embed {\n  z-index: 100;\n  position: fixed;\n  top: 0;\n  left: 60%;\n  bottom: 0;\n  right: 0;\n  display: flex;\n  flex-direction: row;\n  transition: transform 0.3s cubic-bezier(0.16, 0.22, 0.22, 1.7);\n}\n.gitter-chat-embed.is-collapsed:not(.is-loading) {\n  transform: translateX(110%);\n}\n.jobs-list-highlight {\n  background-color: #ffc;\n}\na.jobs-list-highlight:hover {\n  background-color: #ffc;\n}\n.jobs-list {\n  cursor: pointer;\n  cursor: hand;\n}\n.jobs-checkbox-spacer input[type=\"checkbox\"] {\n  margin-left: -23px;\n}\n.challenge-step-description {\n  font-size: 1.5em;\n}\n.challenge-step-counter {\n  font-size: 20px;\n  line-height: 44px;\n}\n.challenge-instructions-title {\n  margin-top: 0;\n}\n.challenge-instructions-title i {\n  margin-left: 5px;\n  line-height: 20px;\n}\n.challenge-instructions {\n  margin-bottom: 5px;\n}\n.challenge-instructions h4 {\n  margin-bottom: 0;\n}\n.challenge-instructions blockquote {\n  font-size: 90%;\n  font-family: Menlo, Monaco, Consolas, \"Courier New\", monospace;\n  color: #c7254e;\n  background-color: #fffbe5;\n  border-radius: 4px;\n  border: 1px solid #ccc;\n  white-space: pre;\n  padding: 5px 10px;\n  margin-bottom: 10px;\n  margin-top: -10px;\n  overflow: auto;\n}\n.challenge-instructions dfn {\n  font-family: Menlo, Monaco, Consolas, \"Courier New\", monospace;\n  color: #c7254e;\n  background-color: #f9f2f4;\n  border-radius: 4px;\n}\n.challenge-instructions a,\n.challenge-instructions #MDN-links a {\n  color: #31708f;\n}\n.challenge-instructions a::after,\n.challenge-instructions #MDN-links a::after {\n  font-size: 70%;\n  font-family: FontAwesome;\n  content: \" \\f08e\";\n}\n.challenge-instructions ol {\n  font-size: 16px;\n}\n#testSuite {\n  margin-top: 10px;\n}\n#testSuite > div > .row {\n  margin: 0!important;\n}\n.test-output {\n  font-size: 15px;\n  font-family: \"Ubuntu Mono\";\n  margin-top: 8px;\n  line-height: 20px;\n}\n.grayed-out-test-output {\n  color: #777777;\n}\n.big-error-icon {\n  font-size: 30px;\n  color: #d9534f;\n  top: 50%;\n}\n.big-success-icon {\n  font-size: 30px;\n  color: #4CAF50;\n}\niframe.iphone {\n  border: none;\n}\n@media (min-width: 992px) {\n  iframe.iphone {\n    width: 280px;\n    height: 450px;\n    position: absolute;\n    top: 45px;\n    right: 35px;\n    overflow-y: scroll;\n  }\n}\n@media (max-width: 991px) {\n  iframe.iphone {\n    width: 100%;\n    border-radius: 5px;\n    overflow-y: visible;\n    height: 500px;\n  }\n}\n@media (min-width: 1200px) and (max-width: 1250px) {\n  iframe.iphone {\n    right: 22px;\n  }\n}\n.iphone-position {\n  position: absolute;\n  top: -50px;\n  z-index: -1;\n  right: -195px;\n  height: 660px;\n  width: 740px;\n}\n@media (min-width: 1200px) and (max-width: 1250px) {\n  .iphone-position {\n    right: -207px;\n  }\n}\n.cover {\n    background: url(../images/cover-green-brown.png) top left no-repeat;\n    background-size: cover;\n    display: table;\n    width: 100%;\n    height:608px;\n    box-shadow: inset 0 0 100px #000;\n}\n.cover-text {\n    text-align: center;\n    color: #fff;\n    display: table-cell;\n    vertical-align: middle;\n    padding: 20px;\n}\n.cover-text h1 {\n    margin: 0;\n    font-size: 78px;\n    letter-spacing: -3px;\n    text-transform: ;\n    font-weight: 700;\n    letter-spacing: 2px;\n    text-shadow: 1px 1px 1px rgba(0,0,0,0.5);\n}\n.cover-text-secondary {\n    margin-top: 20px;\n    margin-bottom: 50px;\n    font-size: 22px;\n    letter-spacing: 2px;\n    text-shadow: 1px 1px 1px rgba(0,0,0,0.5);\n}\n.btn-orange {\n    color: #fff;\n    background-color: #FF9900;\n    border-color: #cc7a00;\n}\n.btn-orange:hover {\n    color: #fff;\n    background-color: #e68a00;\n    border-color: #cc7a00;\n}\n.button-landing-page {\n    display: block;\n    width: 60%;\n    margin: 0 auto;\n    margin-bottom: 20px;\n}\n.btn-extra-padding {\n    padding-top: 15px;\n    padding-bottom: 15px;\n}\n.btn-inverse {\n    color: #fff;\n    background-color: rgba(204, 204, 204, 0.0);\n    border-color: #fff;\n}\n.btn-inverse:hover {\n    color: #fff;\n    background-color: rgba(204, 204, 204, 0.3);\n    border-color: #fff;\n}\nsection {\n    padding-bottom: 10px;\n}\n.col-howitworks {\n    margin-bottom: 30px;\n}\nh2 {\n    margin-bottom: 20px;\n}\n.howitworks h3 {\n    text-align: center;\n    font-size: 20px;\n}\n.howitworks img {\n    width: 65%;\n    display: block;\n    margin-left: auto;\n    margin-right: auto;\n    max-height: 200px;\n    max-width: 200px;\n}\n#curriculum {\n    background: #f5faf7;\n    border-top: 2px solid #ddeee3;\n    border-bottom: 2px solid #ddeee3;\n}\n#curriculum-hours {\n    font-size: 28px;\n    text-align: right;\n}\n#curriculum-explanation {\n    font-size: 16px;\n    text-align: justify;\n    max-width: 355px;\n    margin: 0 auto;\n    padding-top: 0px;\n}\n#press-coverage {\n    padding-top: 15px;\n    opacity: 0.5;\n}\n#press-coverage-title {\n    margin: 0 auto;\n    color: black;\n    font-weight: bold;\n}\n.btn-green-inverse {\n    color: #00AC72;\n    background-color: rgba(204, 204, 204, 0.0);\n    border-color: #00AC72;\n}\n.btn-green-inverse:hover {\n    color: #00AC72;\n    background-color: rgba(204, 204, 204, 0.15);\n    border-color: #00AC72;\n}\n.skills {\n    font-size: 20px;\n    text-align: center;\n    margin-bottom: 20px;\n}\n\n.fa {\n    display: inline-block;\n    font: normal normal normal 14px/1 FontAwesome;\n    font-size: inherit;\n    text-rendering: auto;\n    -webkit-font-smoothing: antialiased;\n    -moz-osx-font-smoothing: grayscale;\n}\n.ml5 {\n  margin-left:5px;\n}\n.skills img {\n    display: inline-block;\n    max-height: 90px;\n    max-width: 90px;\n}\n#infobox {\n    background: #1C5C46;\n}\n#infobox-inner {\n    border: none;\n    margin: 0;\n    font-style: italic;\n    font-size: 32px;\n    color: white;\n    padding-top: 10px;\n    display: block;\n    margin-top: 1em;\n    margin-bottom: 1em;\n    margin-left: 40px;\n    margin-right: 40px;\n}\nfooter {\n    background: #b6a57d;\n    padding-top: 20px;\n    margin-top: 30px;\n    font-size: 16px;\n    color: #7b6c45;\n}\n.mt-20 {margin-top:-20px;}\nfooter h2 {\n    margin: 0;\n    margin-bottom: 10px;\n}\nfooter img {\n    width: 50px;\n    color: white;\n}\nfooter a, footer a:active, footer a:visited {\n    text-decoration: none;\n    color: #7b6c45;\n}\nfooter ul {\n    list-style-type: none;\n    padding: 30px 0 0 0;\n}\nstrong {\n    font-weight: 700;\n}\n.footer-icon {\n    font-size: 35px;\n    padding: 10px;\n}\n.footer-logo {\n  width: 35px;\n  margin-left: 22px;\n  margin-top: -14px;\n}\n.toast-title {\n  font-weight: bold;\n}\n.toast-message {\n  -ms-word-wrap: break-word;\n  word-wrap: break-word;\n}\n.toast-message a,\n.toast-message label {\n  color: #FFFFFF;\n}\n.toast-message a:hover {\n  color: #CCCCCC;\n  text-decoration: none;\n}\n.toast-close-button {\n  position: relative;\n  right: -0.3em;\n  top: -0.3em;\n  float: right;\n  font-size: 20px;\n  font-weight: bold;\n  color: #FFFFFF;\n  -webkit-text-shadow: 0 1px 0 #ffffff;\n  text-shadow: 0 1px 0 #ffffff;\n  opacity: 0.8;\n  -ms-filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=80);\n  filter: alpha(opacity=80);\n}\n.toast-close-button:hover,\n.toast-close-button:focus {\n  color: #000000;\n  text-decoration: none;\n  cursor: pointer;\n  opacity: 0.4;\n  -ms-filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=40);\n  filter: alpha(opacity=40);\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=\"#\"`.*/\nbutton.toast-close-button {\n  padding: 0;\n  cursor: pointer;\n  background: transparent;\n  border: 0;\n  -webkit-appearance: none;\n}\n.toast-top-center {\n  top: 0;\n  right: 0;\n  width: 100%;\n}\n.toast-bottom-center {\n  bottom: 0;\n  right: 0;\n  width: 100%;\n}\n.toast-top-full-width {\n  top: 0;\n  right: 0;\n  width: 100%;\n}\n.toast-bottom-full-width {\n  bottom: 0;\n  right: 0;\n  width: 100%;\n}\n.toast-top-left {\n  top: 12px;\n  left: 12px;\n}\n.toast-top-right {\n  top: 12px;\n  right: 12px;\n}\n.toast-bottom-right {\n  right: 12px;\n  bottom: 12px;\n}\n.toast-bottom-left {\n  bottom: 12px;\n  left: 12px;\n}\n#toast-container {\n  position: fixed;\n  z-index: 999999;\n  pointer-events: none;\n  /*overrides*/\n}\n#toast-container * {\n  -moz-box-sizing: border-box;\n  -webkit-box-sizing: border-box;\n  box-sizing: border-box;\n}\n#toast-container > div {\n  position: relative;\n  pointer-events: auto;\n  overflow: hidden;\n  margin: 0 0 6px;\n  padding: 15px 15px 15px 50px;\n  width: 300px;\n  -moz-border-radius: 3px 3px 3px 3px;\n  -webkit-border-radius: 3px 3px 3px 3px;\n  border-radius: 3px 3px 3px 3px;\n  background-position: 15px center;\n  background-repeat: no-repeat;\n  -moz-box-shadow: 0 0 12px #999999;\n  -webkit-box-shadow: 0 0 12px #999999;\n  box-shadow: 0 0 12px #999999;\n  color: #FFFFFF;\n  opacity: 0.8;\n  -ms-filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=80);\n  filter: alpha(opacity=80);\n}\n#toast-container > :hover {\n  -moz-box-shadow: 0 0 12px #000000;\n  -webkit-box-shadow: 0 0 12px #000000;\n  box-shadow: 0 0 12px #000000;\n  opacity: 1;\n  -ms-filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=100);\n  filter: alpha(opacity=100);\n  cursor: pointer;\n}\n#toast-container > .toast-info {\n  background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAGwSURBVEhLtZa9SgNBEMc9sUxxRcoUKSzSWIhXpFMhhYWFhaBg4yPYiWCXZxBLERsLRS3EQkEfwCKdjWJAwSKCgoKCcudv4O5YLrt7EzgXhiU3/4+b2ckmwVjJSpKkQ6wAi4gwhT+z3wRBcEz0yjSseUTrcRyfsHsXmD0AmbHOC9Ii8VImnuXBPglHpQ5wwSVM7sNnTG7Za4JwDdCjxyAiH3nyA2mtaTJufiDZ5dCaqlItILh1NHatfN5skvjx9Z38m69CgzuXmZgVrPIGE763Jx9qKsRozWYw6xOHdER+nn2KkO+Bb+UV5CBN6WC6QtBgbRVozrahAbmm6HtUsgtPC19tFdxXZYBOfkbmFJ1VaHA1VAHjd0pp70oTZzvR+EVrx2Ygfdsq6eu55BHYR8hlcki+n+kERUFG8BrA0BwjeAv2M8WLQBtcy+SD6fNsmnB3AlBLrgTtVW1c2QN4bVWLATaIS60J2Du5y1TiJgjSBvFVZgTmwCU+dAZFoPxGEEs8nyHC9Bwe2GvEJv2WXZb0vjdyFT4Cxk3e/kIqlOGoVLwwPevpYHT+00T+hWwXDf4AJAOUqWcDhbwAAAAASUVORK5CYII=\") !important;\n}\n#toast-container > .toast-error {\n  background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAHOSURBVEhLrZa/SgNBEMZzh0WKCClSCKaIYOED+AAKeQQLG8HWztLCImBrYadgIdY+gIKNYkBFSwu7CAoqCgkkoGBI/E28PdbLZmeDLgzZzcx83/zZ2SSXC1j9fr+I1Hq93g2yxH4iwM1vkoBWAdxCmpzTxfkN2RcyZNaHFIkSo10+8kgxkXIURV5HGxTmFuc75B2RfQkpxHG8aAgaAFa0tAHqYFfQ7Iwe2yhODk8+J4C7yAoRTWI3w/4klGRgR4lO7Rpn9+gvMyWp+uxFh8+H+ARlgN1nJuJuQAYvNkEnwGFck18Er4q3egEc/oO+mhLdKgRyhdNFiacC0rlOCbhNVz4H9FnAYgDBvU3QIioZlJFLJtsoHYRDfiZoUyIxqCtRpVlANq0EU4dApjrtgezPFad5S19Wgjkc0hNVnuF4HjVA6C7QrSIbylB+oZe3aHgBsqlNqKYH48jXyJKMuAbiyVJ8KzaB3eRc0pg9VwQ4niFryI68qiOi3AbjwdsfnAtk0bCjTLJKr6mrD9g8iq/S/B81hguOMlQTnVyG40wAcjnmgsCNESDrjme7wfftP4P7SP4N3CJZdvzoNyGq2c/HWOXJGsvVg+RA/k2MC/wN6I2YA2Pt8GkAAAAASUVORK5CYII=\") !important;\n}\n#toast-container > .toast-success {\n  background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAADsSURBVEhLY2AYBfQMgf///3P8+/evAIgvA/FsIF+BavYDDWMBGroaSMMBiE8VC7AZDrIFaMFnii3AZTjUgsUUWUDA8OdAH6iQbQEhw4HyGsPEcKBXBIC4ARhex4G4BsjmweU1soIFaGg/WtoFZRIZdEvIMhxkCCjXIVsATV6gFGACs4Rsw0EGgIIH3QJYJgHSARQZDrWAB+jawzgs+Q2UO49D7jnRSRGoEFRILcdmEMWGI0cm0JJ2QpYA1RDvcmzJEWhABhD/pqrL0S0CWuABKgnRki9lLseS7g2AlqwHWQSKH4oKLrILpRGhEQCw2LiRUIa4lwAAAABJRU5ErkJggg==\") !important;\n}\n#toast-container > .toast-warning {\n  background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAGYSURBVEhL5ZSvTsNQFMbXZGICMYGYmJhAQIJAICYQPAACiSDB8AiICQQJT4CqQEwgJvYASAQCiZiYmJhAIBATCARJy+9rTsldd8sKu1M0+dLb057v6/lbq/2rK0mS/TRNj9cWNAKPYIJII7gIxCcQ51cvqID+GIEX8ASG4B1bK5gIZFeQfoJdEXOfgX4QAQg7kH2A65yQ87lyxb27sggkAzAuFhbbg1K2kgCkB1bVwyIR9m2L7PRPIhDUIXgGtyKw575yz3lTNs6X4JXnjV+LKM/m3MydnTbtOKIjtz6VhCBq4vSm3ncdrD2lk0VgUXSVKjVDJXJzijW1RQdsU7F77He8u68koNZTz8Oz5yGa6J3H3lZ0xYgXBK2QymlWWA+RWnYhskLBv2vmE+hBMCtbA7KX5drWyRT/2JsqZ2IvfB9Y4bWDNMFbJRFmC9E74SoS0CqulwjkC0+5bpcV1CZ8NMej4pjy0U+doDQsGyo1hzVJttIjhQ7GnBtRFN1UarUlH8F3xict+HY07rEzoUGPlWcjRFRr4/gChZgc3ZL2d8oAAAAASUVORK5CYII=\") !important;\n}\n#toast-container.toast-top-center > div,\n#toast-container.toast-bottom-center > div {\n  width: 300px;\n  margin-left: auto;\n  margin-right: auto;\n}\n#toast-container.toast-top-full-width > div,\n#toast-container.toast-bottom-full-width > div {\n  width: 96%;\n  margin-left: auto;\n  margin-right: auto;\n}\n.toast {\n  background-color: #030303;\n}\n.toast-success {\n  background-color: #51A351;\n}\n.toast-error {\n  background-color: #BD362F;\n}\n.toast-info {\n  background-color: #2F96B4;\n}\n.toast-warning {\n  background-color: #F89406;\n}\n.toast-progress {\n  position: absolute;\n  left: 0;\n  bottom: 0;\n  height: 4px;\n  background-color: #000000;\n  opacity: 0.4;\n  -ms-filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=40);\n  filter: alpha(opacity=40);\n}\n/*Responsive Design*/\n@media all and (max-width: 240px) {\n  #toast-container > div {\n    padding: 8px 8px 8px 50px;\n    width: 11em;\n  }\n  #toast-container .toast-close-button {\n    right: -0.2em;\n    top: -0.2em;\n  }\n}\n@media all and (min-width: 241px) and (max-width: 480px) {\n  #toast-container > div {\n    padding: 8px 8px 8px 50px;\n    width: 18em;\n  }\n  #toast-container .toast-close-button {\n    right: -0.2em;\n    top: -0.2em;\n  }\n}\n@media all and (min-width: 481px) and (max-width: 768px) {\n  #toast-container > div {\n    padding: 15px 15px 15px 50px;\n    width: 25em;\n  }\n}\n/*\n * based off of https://github.com/gitterHQ/sidecar\n * license: MIT\n */\n.map-aside {\n  width: 500px;\n  z-index: 20000;\n  position: fixed;\n  top: 0;\n  bottom: 0;\n  right: 0;\n  display: -webkit-flex;\n  display: flex;\n  -webkit-flex-direction: row;\n  flex-direction: row;\n  background-color: #ffffff;\n  border-left: 1px solid #ddd;\n  box-shadow: -12px 0 18px 0 rgba(50, 50, 50, 0.1);\n  transition: transform 0.3s cubic-bezier(0.16, 0.22, 0.22, 1.7);\n  /* Add some \"extension\" so that there isn't a gap\n     * when we translate(via animation) more than 100% */\n}\n.map-aside.is-collapsed:not(.is-loading) {\n  -webkit-transform: translateX(110%);\n  transform: translateX(110%);\n}\n.map-aside:after {\n  content: '';\n  z-index: -1;\n  position: absolute;\n  top: 0;\n  left: 100%;\n  bottom: 0;\n  right: -100%;\n  background-color: #ffffff;\n}\n.map-aside iframe {\n  width: 100%;\n  height: 100%;\n}\n.map-aside-action-bar {\n  position: absolute;\n  top: 0;\n  right: 0;\n  display: -webkit-flex;\n  display: flex;\n  justify-content: flex-end;\n  padding-bottom: 5px;\n  padding-right: 10px;\n  padding-top: 5px;\n  z-index: 100;\n}\n.map-fixed-header {\n  position: fixed;\n  background: white;\n  padding-top: 5px;\n  width: 100%;\n  z-index: 1;\n  left: 0;\n  top: 0;\n}\n@media (max-width: 720px) {\n  .map-fixed-header {\n    padding-top: 30px;\n  }\n}\n.map-fixed-header p {\n  margin: 5px 0 20px;\n}\n@media (max-width: 720px) {\n  .map-fixed-header p {\n    margin-bottom: 10px;\n  }\n}\n.map-fixed-header hr {\n  margin: 30px 0;\n}\n@media (max-width: 720px) {\n  .map-fixed-header hr {\n    margin: 25px 0;\n  }\n}\n.map-fixed-header .flashMessage {\n  position: fixed;\n  margin: 0 auto;\n  z-index: 2;\n  top: 160px;\n  width: 100%;\n}\n.map-buttons {\n  margin-top: -10px;\n}\n.map-buttons button,\n.map-buttons .input-group {\n  width: 300px;\n}\n.map-buttons .input-group {\n  margin-top: 15px;\n  margin-left: auto;\n  margin-right: auto;\n}\n#map-filter {\n  background: #fff;\n  border-color: darkgreen;\n}\n.input-group-addon {\n  width: 40px;\n  color: darkgreen;\n  background: #fff;\n  border-color: darkgreen;\n}\n.input-group-addon.filled {\n  background: darkgreen;\n  border-color: #000d00;\n  color: #fff;\n  cursor: pointer;\n}\n.input-group-addon .fa {\n  position: absolute;\n  top: 50%;\n  -webkit-transform: translateY(-50%);\n  transform: translateY(-50%);\n  right: 10px;\n}\n.mapWrapper {\n  /*position: absolute;*/\n  display: block;\n  height: 100%;\n  width: 100%;\n}\n.map-accordion {\n  width: 700px;\n  margin: 155px auto 0;\n  position: relative;\n}\n.map-accordion #nested {\n  margin: 0 10px;\n}\n@media (max-width: 400px) {\n  .map-accordion #nested {\n    margin: 0;\n  }\n}\n.map-accordion a:focus {\n  text-decoration: none;\n  color: darkgreen;\n}\n.map-accordion a:focus:hover {\n  text-decoration: underline;\n  color: #001800;\n}\n.map-accordion h2 > a {\n  width: 100%;\n  display: block;\n  background: #efefef;\n  padding: 10px 0;\n  padding-left: 50px;\n  padding-right: 20px;\n}\n.map-accordion h3 {\n  margin: 15px 0;\n  padding: 0;\n}\n.map-accordion h3:first-child {\n  margin-top: 25px;\n}\n.map-accordion h3 > a {\n  padding-left: 40px;\n  padding-bottom: 10px;\n  display: block;\n  max-width: 535px;\n}\n.map-accordion div.chapterBlock :before {\n  margin-right: 15px;\n}\n.map-accordion div.chapterBlock p {\n  text-indent: -15px;\n  margin-left: 60px;\n  padding-right: 20px;\n}\n@media (max-width: 400px) {\n  .map-accordion div.chapterBlock p {\n    margin-left: 30px;\n  }\n}\n.map-accordion .challengeBlockDescription {\n  margin: 0;\n  margin-top: -10px;\n  padding: 0 15px 23px 30px;\n}\n.map-accordion span.no-link-underline {\n  position: absolute;\n  margin-left: -30px;\n  color: #666;\n}\n.map-accordion div > div:last-child {\n  margin-bottom: 30px;\n}\n.challengeBlockTime {\n  font-size: 18px;\n  color: #BBBBBB;\n  display: block;\n  margin-left: 40px;\n  margin-bottom: 20px;\n}\n@media (min-width: 721px) {\n  .challengeBlockTime {\n    margin-right: 20px;\n    margin-top: -30px;\n    float: right;\n  }\n}\n@media (max-width: 720px) {\n  .map-accordion {\n    left: 0;\n    right: 0;\n    width: 100%;\n    top: 195px;\n    bottom: 0;\n    margin: 0;\n    position: absolute;\n    overflow-x: hidden;\n    overflow-y: auto;\n    -webkit-overflow-scrolling: touch;\n  }\n  .map-accordion h2 {\n    margin: 15px 0;\n    padding: 0;\n  }\n  .map-accordion h2:first-of-type {\n    margin-top: 0;\n  }\n  .map-accordion h2 > a {\n    padding: 10px 0;\n    padding-left: 50px;\n    padding-right: 20px;\n    font-size: 20px;\n  }\n  .map-accordion h3 {\n    margin: 10px 0;\n    padding: 0;\n  }\n  .map-accordion h3 > a {\n    clear: both;\n    font-size: 20px;\n  }\n}\n.map-aside-action-item {\n  display: -webkit-flex;\n  display: flex;\n  /* main axis */\n  justify-content: center;\n  /* cross axis */\n  align-items: center;\n  width: 40px;\n  height: 40px;\n  padding-left: 0;\n  padding-right: 0;\n  opacity: 0.65;\n  background: none;\n  background-position: center center;\n  background-repeat: no-repeat;\n  background-size: 22px 22px;\n  border: 0;\n  outline: none;\n  cursor: pointer;\n  cursor: hand;\n  transition: all 0.2s ease;\n}\n.map-aside-action-item:hover,\n.map-aside-action-item:focus {\n  opacity: 1;\n}\n.map-aside-action-item:active {\n  filter: hue-rotate(80deg) saturate(150);\n}\n#noneFound {\n  display: none;\n  margin: 60px 30px 0;\n  font-size: 30px;\n  text-align: center;\n  color: darkgreen;\n}\n#noneFound .fa {\n  display: block;\n  font-size: 300px;\n}\n.map-aside-action-pop-out {\n  margin-right: -4px;\n  background-image: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMDAgMTcxLjQyOSIgZmlsbD0iIzNhMzEzMyI+PHBhdGggZD0iTTE1Ny4xNDMsMTAzLjU3MXYzNS43MTRjMCw4Ljg1NC0zLjE0NCwxNi40MjYtOS40MzEsMjIuNzEzcy0xMy44NTgsOS40MzEtMjIuNzEyLDkuNDMxSDMyLjE0MyBjLTguODU0LDAtMTYuNDI1LTMuMTQ0LTIyLjcxMi05LjQzMVMwLDE0OC4xNCwwLDEzOS4yODVWNDYuNDI5YzAtOC44NTQsMy4xNDQtMTYuNDI1LDkuNDMxLTIyLjcxMiBjNi4yODctNi4yODcsMTMuODU4LTkuNDMxLDIyLjcxMi05LjQzMWg3OC41NzJjMS4wNDEsMCwxLjg5NiwwLjMzNSwyLjU2NiwxLjAwNGMwLjY3LDAuNjcsMS4wMDQsMS41MjUsMS4wMDQsMi41NjdWMjUgYzAsMS4wNDItMC4zMzQsMS44OTctMS4wMDQsMi41NjdjLTAuNjcsMC42Ny0xLjUyNSwxLjAwNC0yLjU2NiwxLjAwNEgzMi4xNDNjLTQuOTExLDAtOS4xMTUsMS43NDktMTIuNjEyLDUuMjQ2IHMtNS4yNDYsNy43MDEtNS4yNDYsMTIuNjEydjkyLjg1NmMwLDQuOTExLDEuNzQ5LDkuMTE1LDUuMjQ2LDEyLjYxMnM3LjcwMSw1LjI0NSwxMi42MTIsNS4yNDVIMTI1YzQuOTEsMCw5LjExNS0xLjc0OCwxMi42MTEtNS4yNDUgYzMuNDk3LTMuNDk3LDUuMjQ2LTcuNzAxLDUuMjQ2LTEyLjYxMnYtMzUuNzE0YzAtMS4wNDIsMC4zMzQtMS44OTcsMS4wMDQtMi41NjdjMC42Ny0wLjY2OSwxLjUyNS0xLjAwNCwyLjU2Ny0xLjAwNGg3LjE0MyBjMS4wNDIsMCwxLjg5NywwLjMzNSwyLjU2NywxLjAwNEMxNTYuODA5LDEwMS42NzQsMTU3LjE0MywxMDIuNTI5LDE1Ny4xNDMsMTAzLjU3MXogTTIwMCw3LjE0M3Y1Ny4xNDMgYzAsMS45MzUtMC43MDcsMy42MDktMi4xMjEsNS4wMjJjLTEuNDEzLDEuNDE0LTMuMDg4LDIuMTIxLTUuMDIxLDIuMTIxYy0xLjkzNSwwLTMuNjA5LTAuNzA3LTUuMDIyLTIuMTIxbC0xOS42NDQtMTkuNjQzIGwtNzIuNzY3LDcyLjc2OWMtMC43NDQsMC43NDQtMS42LDEuMTE1LTIuNTY3LDEuMTE1cy0xLjgyMy0wLjM3MS0yLjU2Ny0xLjExNUw3Ny41NjcsMTA5LjcxYy0wLjc0NC0wLjc0NC0xLjExNi0xLjYtMS4xMTYtMi41NjcgYzAtMC45NjcsMC4zNzItMS44MjIsMS4xMTYtMi41NjZsNzIuNzY4LTcyLjc2OGwtMTkuNjQ0LTE5LjY0M2MtMS40MTMtMS40MTQtMi4xMi0zLjA4OC0yLjEyLTUuMDIyYzAtMS45MzUsMC43MDctMy42MDksMi4xMi01LjAyMiBDMTMyLjEwNSwwLjcwNywxMzMuNzc5LDAsMTM1LjcxNSwwaDU3LjE0M2MxLjkzNCwwLDMuNjA4LDAuNzA3LDUuMDIxLDIuMTIxQzE5OS4yOTMsMy41MzQsMjAwLDUuMjA4LDIwMCw3LjE0M3oiLz48L3N2Zz4=);\n}\n.map-aside-action-collapse {\n  background-image: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAxNzEuNDI5IDE3MS40MjkiIGZpbGw9IiMzYTMxMzMiPjxwYXRoIGQ9Ik0xMjIuNDMzLDEwNi4xMzhsLTE2LjI5NSwxNi4yOTVjLTAuNzQ0LDAuNzQ0LTEuNiwxLjExNi0yLjU2NiwxLjExNmMtMC45NjgsMC0xLjgyMy0wLjM3Mi0yLjU2Ny0xLjExNmwtMTUuMjktMTUuMjkgbC0xNS4yOSwxNS4yOWMtMC43NDQsMC43NDQtMS42LDEuMTE2LTIuNTY3LDEuMTE2cy0xLjgyMy0wLjM3Mi0yLjU2Ny0xLjExNmwtMTYuMjk0LTE2LjI5NWMtMC43NDQtMC43NDQtMS4xMTYtMS42LTEuMTE2LTIuNTY2IGMwLTAuOTY4LDAuMzcyLTEuODIzLDEuMTE2LTIuNTY3bDE1LjI5LTE1LjI5bC0xNS4yOS0xNS4yOWMtMC43NDQtMC43NDQtMS4xMTYtMS42LTEuMTE2LTIuNTY3czAuMzcyLTEuODIzLDEuMTE2LTIuNTY3IEw2NS4yOSw0OC45OTZjMC43NDQtMC43NDQsMS42LTEuMTE2LDIuNTY3LTEuMTE2czEuODIzLDAuMzcyLDIuNTY3LDEuMTE2bDE1LjI5LDE1LjI5bDE1LjI5LTE1LjI5IGMwLjc0NC0wLjc0NCwxLjYtMS4xMTYsMi41NjctMS4xMTZjMC45NjcsMCwxLjgyMiwwLjM3MiwyLjU2NiwxLjExNmwxNi4yOTUsMTYuMjk0YzAuNzQ0LDAuNzQ0LDEuMTE2LDEuNiwxLjExNiwyLjU2NyBzLTAuMzcyLDEuODIzLTEuMTE2LDIuNTY3bC0xNS4yOSwxNS4yOWwxNS4yOSwxNS4yOWMwLjc0NCwwLjc0NCwxLjExNiwxLjYsMS4xMTYsMi41NjcgQzEyMy41NDksMTA0LjUzOSwxMjMuMTc3LDEwNS4zOTQsMTIyLjQzMywxMDYuMTM4eiBNMTQ2LjQyOSw4NS43MTRjMC0xMS4wMTItMi43MTctMjEuMTY4LTguMTQ4LTMwLjQ2OSBzLTEyLjc5Ny0xNi42NjctMjIuMDk4LTIyLjA5OFM5Ni43MjYsMjUsODUuNzE0LDI1cy0yMS4xNjgsMi43MTYtMzAuNDY5LDguMTQ3UzM4LjU3OSw0NS45NDUsMzMuMTQ3LDU1LjI0NlMyNSw3NC43MDMsMjUsODUuNzE0IHMyLjcxNiwyMS4xNjgsOC4xNDcsMzAuNDY5czEyLjc5NywxNi42NjYsMjIuMDk4LDIyLjA5OHMxOS40NTcsOC4xNDgsMzAuNDY5LDguMTQ4czIxLjE2OC0yLjcxNywzMC40NjktOC4xNDggczE2LjY2Ni0xMi43OTcsMjIuMDk4LTIyLjA5OFMxNDYuNDI5LDk2LjcyNiwxNDYuNDI5LDg1LjcxNHogTTE3MS40MjksODUuNzE0YzAsMTUuNTUxLTMuODMyLDI5Ljg5My0xMS40OTYsNDMuMDI0IGMtNy42NjQsMTMuMTMzLTE4LjA2MiwyMy41My0zMS4xOTQsMzEuMTk0Yy0xMy4xMzIsNy42NjQtMjcuNDc0LDExLjQ5Ni00My4wMjQsMTEuNDk2cy0yOS44OTItMy44MzItNDMuMDI0LTExLjQ5NiBjLTEzLjEzMy03LjY2NC0yMy41MzEtMTguMDYyLTMxLjE5NC0zMS4xOTRDMy44MzIsMTE1LjYwNywwLDEwMS4yNjUsMCw4NS43MTRTMy44MzIsNTUuODIyLDExLjQ5Niw0Mi42OSBjNy42NjQtMTMuMTMzLDE4LjA2Mi0yMy41MzEsMzEuMTk0LTMxLjE5NEM1NS44MjIsMy44MzIsNzAuMTY0LDAsODUuNzE0LDBzMjkuODkzLDMuODMyLDQzLjAyNCwxMS40OTYgYzEzLjEzMyw3LjY2NCwyMy41MywxOC4wNjIsMzEuMTk0LDMxLjE5NEMxNjcuNTk3LDU1LjgyMiwxNzEuNDI5LDcwLjE2NCwxNzEuNDI5LDg1LjcxNHoiLz48L3N2Zz4=);\n}\n/*\n * based off of https://github.com/gitterHQ/sidecar\n * license: MIT\n */\n#wikiFrame {\n  width: 100%;\n  height: 100%;\n  top: 0;\n  bottom: 0;\n  position: absolute;\n  overflow: hidden;\n}\n.wiki-aside {\n  width: 500px;\n  z-index: 20000;\n  position: fixed;\n  top: 0;\n  bottom: 0;\n  right: 0;\n  display: -webkit-flex;\n  display: flex;\n  -webkit-flex-direction: row;\n  flex-direction: row;\n  background-color: #ffffff;\n  border-left: 1px solid #ddd;\n  box-shadow: -12px 0 18px 0 rgba(50, 50, 50, 0.1);\n  transition: transform 0.3s cubic-bezier(0.16, 0.22, 0.22, 1.7);\n  /* Add some \"extension\" so that there isn't a gap\n     * when we translate(via animation) more than 100% */\n}\n.wiki-aside.is-collapsed:not(.is-loading) {\n  -webkit-transform: translateX(110%);\n  transform: translateX(110%);\n}\n.wiki-aside:after {\n  content: '';\n  z-index: -1;\n  position: absolute;\n  top: 0;\n  left: 100%;\n  bottom: 0;\n  right: -100%;\n  background-color: #ffffff;\n}\n.wiki-aside iframe {\n  width: 100%;\n  height: 100%;\n  top: 0;\n  bottom: 0;\n  position: absolute;\n  overflow: hidden;\n}\n.wiki-aside .wiki-header {\n  display: none;\n}\n.wiki-aside .wiki-container {\n  padding-top: 10px;\n}\n.wiki-aside .wikiSelector {\n  top: 50px;\n}\n.wiki-aside-action-bar {\n  position: absolute;\n  top: 0;\n  right: 15px;\n  display: -webkit-flex;\n  display: flex;\n  justify-content: flex-end;\n  padding-bottom: 5px;\n  padding-right: 0px;\n  padding-top: 5px;\n  z-index: 100;\n}\n.wiki-fixed-header {\n  position: fixed;\n  background: white;\n  padding-top: 5px;\n  width: 100%;\n  z-index: 1;\n  left: 0;\n  top: 0;\n}\n@media (max-width: 720px) {\n  .wiki-fixed-header {\n    padding-top: 30px;\n  }\n}\n.wiki-fixed-header p {\n  margin: 5px 0 20px;\n}\n@media (max-width: 720px) {\n  .wiki-fixed-header p {\n    margin-bottom: 10px;\n  }\n}\n.wiki-fixed-header hr {\n  margin: 30px 0;\n}\n@media (max-width: 720px) {\n  .wiki-fixed-header hr {\n    margin: 25px 0;\n  }\n}\n.wiki-buttons {\n  margin-top: -10px;\n}\n.wiki-buttons button,\n.wiki-buttons .input-group {\n  width: 300px;\n}\n.wiki-buttons .input-group {\n  margin-top: 15px;\n  margin-left: auto;\n  margin-right: auto;\n}\n#wiki-filter {\n  background: #fff;\n  border-color: darkgreen;\n}\n.wiki-aside-action-item {\n  display: -webkit-flex;\n  display: flex;\n  /* main axis */\n  justify-content: center;\n  /* cross axis */\n  align-items: center;\n  width: 40px;\n  height: 40px;\n  padding-left: 0;\n  padding-right: 0;\n  opacity: 0.65;\n  background: none;\n  background-position: center center;\n  background-repeat: no-repeat;\n  background-size: 22px 22px;\n  border: 0;\n  outline: none;\n  cursor: pointer;\n  cursor: hand;\n  transition: all 0.2s ease;\n}\n.wiki-aside-action-item:hover,\n.wiki-aside-action-item:focus {\n  opacity: 1;\n}\n.wiki-aside-action-item:active {\n  filter: hue-rotate(80deg) saturate(150);\n}\n.wiki-aside-action-pop-out {\n  margin-right: -4px;\n  background-image: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMDAgMTcxLjQyOSIgZmlsbD0iIzNhMzEzMyI+PHBhdGggZD0iTTE1Ny4xNDMsMTAzLjU3MXYzNS43MTRjMCw4Ljg1NC0zLjE0NCwxNi40MjYtOS40MzEsMjIuNzEzcy0xMy44NTgsOS40MzEtMjIuNzEyLDkuNDMxSDMyLjE0MyBjLTguODU0LDAtMTYuNDI1LTMuMTQ0LTIyLjcxMi05LjQzMVMwLDE0OC4xNCwwLDEzOS4yODVWNDYuNDI5YzAtOC44NTQsMy4xNDQtMTYuNDI1LDkuNDMxLTIyLjcxMiBjNi4yODctNi4yODcsMTMuODU4LTkuNDMxLDIyLjcxMi05LjQzMWg3OC41NzJjMS4wNDEsMCwxLjg5NiwwLjMzNSwyLjU2NiwxLjAwNGMwLjY3LDAuNjcsMS4wMDQsMS41MjUsMS4wMDQsMi41NjdWMjUgYzAsMS4wNDItMC4zMzQsMS44OTctMS4wMDQsMi41NjdjLTAuNjcsMC42Ny0xLjUyNSwxLjAwNC0yLjU2NiwxLjAwNEgzMi4xNDNjLTQuOTExLDAtOS4xMTUsMS43NDktMTIuNjEyLDUuMjQ2IHMtNS4yNDYsNy43MDEtNS4yNDYsMTIuNjEydjkyLjg1NmMwLDQuOTExLDEuNzQ5LDkuMTE1LDUuMjQ2LDEyLjYxMnM3LjcwMSw1LjI0NSwxMi42MTIsNS4yNDVIMTI1YzQuOTEsMCw5LjExNS0xLjc0OCwxMi42MTEtNS4yNDUgYzMuNDk3LTMuNDk3LDUuMjQ2LTcuNzAxLDUuMjQ2LTEyLjYxMnYtMzUuNzE0YzAtMS4wNDIsMC4zMzQtMS44OTcsMS4wMDQtMi41NjdjMC42Ny0wLjY2OSwxLjUyNS0xLjAwNCwyLjU2Ny0xLjAwNGg3LjE0MyBjMS4wNDIsMCwxLjg5NywwLjMzNSwyLjU2NywxLjAwNEMxNTYuODA5LDEwMS42NzQsMTU3LjE0MywxMDIuNTI5LDE1Ny4xNDMsMTAzLjU3MXogTTIwMCw3LjE0M3Y1Ny4xNDMgYzAsMS45MzUtMC43MDcsMy42MDktMi4xMjEsNS4wMjJjLTEuNDEzLDEuNDE0LTMuMDg4LDIuMTIxLTUuMDIxLDIuMTIxYy0xLjkzNSwwLTMuNjA5LTAuNzA3LTUuMDIyLTIuMTIxbC0xOS42NDQtMTkuNjQzIGwtNzIuNzY3LDcyLjc2OWMtMC43NDQsMC43NDQtMS42LDEuMTE1LTIuNTY3LDEuMTE1cy0xLjgyMy0wLjM3MS0yLjU2Ny0xLjExNUw3Ny41NjcsMTA5LjcxYy0wLjc0NC0wLjc0NC0xLjExNi0xLjYtMS4xMTYtMi41NjcgYzAtMC45NjcsMC4zNzItMS44MjIsMS4xMTYtMi41NjZsNzIuNzY4LTcyLjc2OGwtMTkuNjQ0LTE5LjY0M2MtMS40MTMtMS40MTQtMi4xMi0zLjA4OC0yLjEyLTUuMDIyYzAtMS45MzUsMC43MDctMy42MDksMi4xMi01LjAyMiBDMTMyLjEwNSwwLjcwNywxMzMuNzc5LDAsMTM1LjcxNSwwaDU3LjE0M2MxLjkzNCwwLDMuNjA4LDAuNzA3LDUuMDIxLDIuMTIxQzE5OS4yOTMsMy41MzQsMjAwLDUuMjA4LDIwMCw3LjE0M3oiLz48L3N2Zz4=);\n}\n.wiki-aside-action-collapse {\n  background-image: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAxNzEuNDI5IDE3MS40MjkiIGZpbGw9IiMzYTMxMzMiPjxwYXRoIGQ9Ik0xMjIuNDMzLDEwNi4xMzhsLTE2LjI5NSwxNi4yOTVjLTAuNzQ0LDAuNzQ0LTEuNiwxLjExNi0yLjU2NiwxLjExNmMtMC45NjgsMC0xLjgyMy0wLjM3Mi0yLjU2Ny0xLjExNmwtMTUuMjktMTUuMjkgbC0xNS4yOSwxNS4yOWMtMC43NDQsMC43NDQtMS42LDEuMTE2LTIuNTY3LDEuMTE2cy0xLjgyMy0wLjM3Mi0yLjU2Ny0xLjExNmwtMTYuMjk0LTE2LjI5NWMtMC43NDQtMC43NDQtMS4xMTYtMS42LTEuMTE2LTIuNTY2IGMwLTAuOTY4LDAuMzcyLTEuODIzLDEuMTE2LTIuNTY3bDE1LjI5LTE1LjI5bC0xNS4yOS0xNS4yOWMtMC43NDQtMC43NDQtMS4xMTYtMS42LTEuMTE2LTIuNTY3czAuMzcyLTEuODIzLDEuMTE2LTIuNTY3IEw2NS4yOSw0OC45OTZjMC43NDQtMC43NDQsMS42LTEuMTE2LDIuNTY3LTEuMTE2czEuODIzLDAuMzcyLDIuNTY3LDEuMTE2bDE1LjI5LDE1LjI5bDE1LjI5LTE1LjI5IGMwLjc0NC0wLjc0NCwxLjYtMS4xMTYsMi41NjctMS4xMTZjMC45NjcsMCwxLjgyMiwwLjM3MiwyLjU2NiwxLjExNmwxNi4yOTUsMTYuMjk0YzAuNzQ0LDAuNzQ0LDEuMTE2LDEuNiwxLjExNiwyLjU2NyBzLTAuMzcyLDEuODIzLTEuMTE2LDIuNTY3bC0xNS4yOSwxNS4yOWwxNS4yOSwxNS4yOWMwLjc0NCwwLjc0NCwxLjExNiwxLjYsMS4xMTYsMi41NjcgQzEyMy41NDksMTA0LjUzOSwxMjMuMTc3LDEwNS4zOTQsMTIyLjQzMywxMDYuMTM4eiBNMTQ2LjQyOSw4NS43MTRjMC0xMS4wMTItMi43MTctMjEuMTY4LTguMTQ4LTMwLjQ2OSBzLTEyLjc5Ny0xNi42NjctMjIuMDk4LTIyLjA5OFM5Ni43MjYsMjUsODUuNzE0LDI1cy0yMS4xNjgsMi43MTYtMzAuNDY5LDguMTQ3UzM4LjU3OSw0NS45NDUsMzMuMTQ3LDU1LjI0NlMyNSw3NC43MDMsMjUsODUuNzE0IHMyLjcxNiwyMS4xNjgsOC4xNDcsMzAuNDY5czEyLjc5NywxNi42NjYsMjIuMDk4LDIyLjA5OHMxOS40NTcsOC4xNDgsMzAuNDY5LDguMTQ4czIxLjE2OC0yLjcxNywzMC40NjktOC4xNDggczE2LjY2Ni0xMi43OTcsMjIuMDk4LTIyLjA5OFMxNDYuNDI5LDk2LjcyNiwxNDYuNDI5LDg1LjcxNHogTTE3MS40MjksODUuNzE0YzAsMTUuNTUxLTMuODMyLDI5Ljg5My0xMS40OTYsNDMuMDI0IGMtNy42NjQsMTMuMTMzLTE4LjA2MiwyMy41My0zMS4xOTQsMzEuMTk0Yy0xMy4xMzIsNy42NjQtMjcuNDc0LDExLjQ5Ni00My4wMjQsMTEuNDk2cy0yOS44OTItMy44MzItNDMuMDI0LTExLjQ5NiBjLTEzLjEzMy03LjY2NC0yMy41MzEtMTguMDYyLTMxLjE5NC0zMS4xOTRDMy44MzIsMTE1LjYwNywwLDEwMS4yNjUsMCw4NS43MTRTMy44MzIsNTUuODIyLDExLjQ5Niw0Mi42OSBjNy42NjQtMTMuMTMzLDE4LjA2Mi0yMy41MzEsMzEuMTk0LTMxLjE5NEM1NS44MjIsMy44MzIsNzAuMTY0LDAsODUuNzE0LDBzMjkuODkzLDMuODMyLDQzLjAyNCwxMS40OTYgYzEzLjEzMyw3LjY2NCwyMy41MywxOC4wNjIsMzEuMTk0LDMxLjE5NEMxNjcuNTk3LDU1LjgyMiwxNzEuNDI5LDcwLjE2NCwxNzEuNDI5LDg1LjcxNHoiLz48L3N2Zz4=);\n}\n.github-login {\n  position: relative;\n  width: 300px;\n  margin-left: auto;\n  margin-right: auto;\n}\n.github-login .first {\n  position: relative;\n  height: 0;\n  top: -30px;\n  right: -180px;\n  color: #63B760;\n}\n.stick-bottom {\n    position: absolute;\n    bottom: 0;\n    width: 100%;\n}\n.mapWrapper {\nmargin-bottom: 200px;\n    padding-top: 100px;\n}\nfooter {\nposition: absolute;\nwidth: 100%;\n}\n"
  },
  {
    "path": "public/css/main.css",
    "content": "@charset \"UTF-8\";\n/*! normalize.css v3.0.2 | MIT License | git.io/normalize */\nhtml {\n  font-family: sans-serif;\n  -ms-text-size-adjust: 100%;\n  -webkit-text-size-adjust: 100%;\n}\nbody {\n  margin: 0;\n}\narticle,\naside,\ndetails,\nfigcaption,\nfigure,\nfooter,\nheader,\nhgroup,\nmain,\nmenu,\nnav,\nsection,\nsummary {\n  display: block;\n}\naudio,\ncanvas,\nprogress,\nvideo {\n  display: inline-block;\n  vertical-align: baseline;\n}\naudio:not([controls]) {\n  display: none;\n  height: 0;\n}\n[hidden],\ntemplate {\n  display: none;\n}\na {\n  background-color: transparent;\n}\na:active,\na:hover {\n  outline: 0;\n}\nabbr[title] {\n  border-bottom: 1px dotted;\n}\nb,\nstrong {\n  font-weight: bold;\n}\ndfn {\n  font-style: italic;\n}\nh1 {\n  font-size: 2em;\n  margin: 0.67em 0;\n}\nmark {\n  background: #ff0;\n  color: #000;\n}\nsmall {\n  font-size: 80%;\n}\nsub,\nsup {\n  font-size: 75%;\n  line-height: 0;\n  position: relative;\n  vertical-align: baseline;\n}\nsup {\n  top: -0.5em;\n}\nsub {\n  bottom: -0.25em;\n}\nimg {\n  border: 0;\n}\nsvg:not(:root) {\n  overflow: hidden;\n}\nfigure {\n  margin: 1em 40px;\n}\nhr {\n  -moz-box-sizing: content-box;\n  box-sizing: content-box;\n  height: 0;\n}\npre {\n  overflow: auto;\n}\ncode,\nkbd,\npre,\nsamp {\n  font-family: monospace, monospace;\n  font-size: 1em;\n}\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n  color: inherit;\n  font: inherit;\n  margin: 0;\n}\nbutton {\n  overflow: visible;\n}\nbutton,\nselect {\n  text-transform: none;\n}\nbutton,\nhtml input[type=\"button\"],\ninput[type=\"reset\"],\ninput[type=\"submit\"] {\n  -webkit-appearance: button;\n  cursor: pointer;\n}\nbutton[disabled],\nhtml input[disabled] {\n  cursor: default;\n}\nbutton::-moz-focus-inner,\ninput::-moz-focus-inner {\n  border: 0;\n  padding: 0;\n}\ninput {\n  line-height: normal;\n}\ninput[type=\"checkbox\"],\ninput[type=\"radio\"] {\n  box-sizing: border-box;\n  padding: 0;\n}\ninput[type=\"number\"]::-webkit-inner-spin-button,\ninput[type=\"number\"]::-webkit-outer-spin-button {\n  height: auto;\n}\ninput[type=\"search\"] {\n  -webkit-appearance: textfield;\n  -moz-box-sizing: content-box;\n  -webkit-box-sizing: content-box;\n  box-sizing: content-box;\n}\ninput[type=\"search\"]::-webkit-search-cancel-button,\ninput[type=\"search\"]::-webkit-search-decoration {\n  -webkit-appearance: none;\n}\nfieldset {\n  border: 1px solid #c0c0c0;\n  margin: 0 2px;\n  padding: 0.35em 0.625em 0.75em;\n}\nlegend {\n  border: 0;\n  padding: 0;\n}\ntextarea {\n  overflow: auto;\n}\noptgroup {\n  font-weight: bold;\n}\ntable {\n  border-collapse: collapse;\n  border-spacing: 0;\n}\ntd,\nth {\n  padding: 0;\n}\n/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */\n@media print {\n  *,\n  *:before,\n  *:after {\n    background: transparent !important;\n    color: #000 !important;\n    box-shadow: none !important;\n    text-shadow: none !important;\n  }\n  a,\n  a:visited {\n    text-decoration: underline;\n  }\n  a[href]:after {\n    content: \" (\" attr(href) \")\";\n  }\n  abbr[title]:after {\n    content: \" (\" attr(title) \")\";\n  }\n  a[href^=\"#\"]:after,\n  a[href^=\"javascript:\"]:after {\n    content: \"\";\n  }\n  pre,\n  blockquote {\n    border: 1px solid #999;\n    page-break-inside: avoid;\n  }\n  thead {\n    display: table-header-group;\n  }\n  tr,\n  img {\n    page-break-inside: avoid;\n  }\n  img {\n    max-width: 100% !important;\n  }\n  p,\n  h2,\n  h3 {\n    orphans: 3;\n    widows: 3;\n  }\n  h2,\n  h3 {\n    page-break-after: avoid;\n  }\n  select {\n    background: #fff !important;\n  }\n  .navbar {\n    display: none;\n  }\n  .btn > .caret,\n  .dropup > .btn > .caret {\n    border-top-color: #000 !important;\n  }\n  .label {\n    border: 1px solid #000;\n  }\n  .table {\n    border-collapse: collapse !important;\n  }\n  .table td,\n  .table th {\n    background-color: #fff !important;\n  }\n  .table-bordered th,\n  .table-bordered td {\n    border: 1px solid #ddd !important;\n  }\n}\n@font-face {\n  font-family: 'Glyphicons Halflings';\n  src: url('../fonts/glyphicons-halflings-regular.eot');\n  src: url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'), url('../fonts/glyphicons-halflings-regular.woff') format('woff'), url('../fonts/glyphicons-halflings-regular.ttf') format('truetype'), url('../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular') format('svg');\n}\n.glyphicon {\n  position: relative;\n  top: 1px;\n  display: inline-block;\n  font-family: 'Glyphicons Halflings';\n  font-style: normal;\n  font-weight: normal;\n  line-height: 1;\n  -webkit-font-smoothing: antialiased;\n  -moz-osx-font-smoothing: grayscale;\n}\n.glyphicon-asterisk:before {\n  content: \"\\2a\";\n}\n.glyphicon-plus:before {\n  content: \"\\2b\";\n}\n.glyphicon-euro:before,\n.glyphicon-eur:before {\n  content: \"\\20ac\";\n}\n.glyphicon-minus:before {\n  content: \"\\2212\";\n}\n.glyphicon-cloud:before {\n  content: \"\\2601\";\n}\n.glyphicon-envelope:before {\n  content: \"\\2709\";\n}\n.glyphicon-pencil:before {\n  content: \"\\270f\";\n}\n.glyphicon-glass:before {\n  content: \"\\e001\";\n}\n.glyphicon-music:before {\n  content: \"\\e002\";\n}\n.glyphicon-search:before {\n  content: \"\\e003\";\n}\n.glyphicon-heart:before {\n  content: \"\\e005\";\n}\n.glyphicon-star:before {\n  content: \"\\e006\";\n}\n.glyphicon-star-empty:before {\n  content: \"\\e007\";\n}\n.glyphicon-user:before {\n  content: \"\\e008\";\n}\n.glyphicon-film:before {\n  content: \"\\e009\";\n}\n.glyphicon-th-large:before {\n  content: \"\\e010\";\n}\n.glyphicon-th:before {\n  content: \"\\e011\";\n}\n.glyphicon-th-list:before {\n  content: \"\\e012\";\n}\n.glyphicon-ok:before {\n  content: \"\\e013\";\n}\n.glyphicon-remove:before {\n  content: \"\\e014\";\n}\n.glyphicon-zoom-in:before {\n  content: \"\\e015\";\n}\n.glyphicon-zoom-out:before {\n  content: \"\\e016\";\n}\n.glyphicon-off:before {\n  content: \"\\e017\";\n}\n.glyphicon-signal:before {\n  content: \"\\e018\";\n}\n.glyphicon-cog:before {\n  content: \"\\e019\";\n}\n.glyphicon-trash:before {\n  content: \"\\e020\";\n}\n.glyphicon-home:before {\n  content: \"\\e021\";\n}\n.glyphicon-file:before {\n  content: \"\\e022\";\n}\n.glyphicon-time:before {\n  content: \"\\e023\";\n}\n.glyphicon-road:before {\n  content: \"\\e024\";\n}\n.glyphicon-download-alt:before {\n  content: \"\\e025\";\n}\n.glyphicon-download:before {\n  content: \"\\e026\";\n}\n.glyphicon-upload:before {\n  content: \"\\e027\";\n}\n.glyphicon-inbox:before {\n  content: \"\\e028\";\n}\n.glyphicon-play-circle:before {\n  content: \"\\e029\";\n}\n.glyphicon-repeat:before {\n  content: \"\\e030\";\n}\n.glyphicon-refresh:before {\n  content: \"\\e031\";\n}\n.glyphicon-list-alt:before {\n  content: \"\\e032\";\n}\n.glyphicon-lock:before {\n  content: \"\\e033\";\n}\n.glyphicon-flag:before {\n  content: \"\\e034\";\n}\n.glyphicon-headphones:before {\n  content: \"\\e035\";\n}\n.glyphicon-volume-off:before {\n  content: \"\\e036\";\n}\n.glyphicon-volume-down:before {\n  content: \"\\e037\";\n}\n.glyphicon-volume-up:before {\n  content: \"\\e038\";\n}\n.glyphicon-qrcode:before {\n  content: \"\\e039\";\n}\n.glyphicon-barcode:before {\n  content: \"\\e040\";\n}\n.glyphicon-tag:before {\n  content: \"\\e041\";\n}\n.glyphicon-tags:before {\n  content: \"\\e042\";\n}\n.glyphicon-book:before {\n  content: \"\\e043\";\n}\n.glyphicon-bookmark:before {\n  content: \"\\e044\";\n}\n.glyphicon-print:before {\n  content: \"\\e045\";\n}\n.glyphicon-camera:before {\n  content: \"\\e046\";\n}\n.glyphicon-font:before {\n  content: \"\\e047\";\n}\n.glyphicon-bold:before {\n  content: \"\\e048\";\n}\n.glyphicon-italic:before {\n  content: \"\\e049\";\n}\n.glyphicon-text-height:before {\n  content: \"\\e050\";\n}\n.glyphicon-text-width:before {\n  content: \"\\e051\";\n}\n.glyphicon-align-left:before {\n  content: \"\\e052\";\n}\n.glyphicon-align-center:before {\n  content: \"\\e053\";\n}\n.glyphicon-align-right:before {\n  content: \"\\e054\";\n}\n.glyphicon-align-justify:before {\n  content: \"\\e055\";\n}\n.glyphicon-list:before {\n  content: \"\\e056\";\n}\n.glyphicon-indent-left:before {\n  content: \"\\e057\";\n}\n.glyphicon-indent-right:before {\n  content: \"\\e058\";\n}\n.glyphicon-facetime-video:before {\n  content: \"\\e059\";\n}\n.glyphicon-picture:before {\n  content: \"\\e060\";\n}\n.glyphicon-map-marker:before {\n  content: \"\\e062\";\n}\n.glyphicon-adjust:before {\n  content: \"\\e063\";\n}\n.glyphicon-tint:before {\n  content: \"\\e064\";\n}\n.glyphicon-edit:before {\n  content: \"\\e065\";\n}\n.glyphicon-share:before {\n  content: \"\\e066\";\n}\n.glyphicon-check:before {\n  content: \"\\e067\";\n}\n.glyphicon-move:before {\n  content: \"\\e068\";\n}\n.glyphicon-step-backward:before {\n  content: \"\\e069\";\n}\n.glyphicon-fast-backward:before {\n  content: \"\\e070\";\n}\n.glyphicon-backward:before {\n  content: \"\\e071\";\n}\n.glyphicon-play:before {\n  content: \"\\e072\";\n}\n.glyphicon-pause:before {\n  content: \"\\e073\";\n}\n.glyphicon-stop:before {\n  content: \"\\e074\";\n}\n.glyphicon-forward:before {\n  content: \"\\e075\";\n}\n.glyphicon-fast-forward:before {\n  content: \"\\e076\";\n}\n.glyphicon-step-forward:before {\n  content: \"\\e077\";\n}\n.glyphicon-eject:before {\n  content: \"\\e078\";\n}\n.glyphicon-chevron-left:before {\n  content: \"\\e079\";\n}\n.glyphicon-chevron-right:before {\n  content: \"\\e080\";\n}\n.glyphicon-plus-sign:before {\n  content: \"\\e081\";\n}\n.glyphicon-minus-sign:before {\n  content: \"\\e082\";\n}\n.glyphicon-remove-sign:before {\n  content: \"\\e083\";\n}\n.glyphicon-ok-sign:before {\n  content: \"\\e084\";\n}\n.glyphicon-question-sign:before {\n  content: \"\\e085\";\n}\n.glyphicon-info-sign:before {\n  content: \"\\e086\";\n}\n.glyphicon-screenshot:before {\n  content: \"\\e087\";\n}\n.glyphicon-remove-circle:before {\n  content: \"\\e088\";\n}\n.glyphicon-ok-circle:before {\n  content: \"\\e089\";\n}\n.glyphicon-ban-circle:before {\n  content: \"\\e090\";\n}\n.glyphicon-arrow-left:before {\n  content: \"\\e091\";\n}\n.glyphicon-arrow-right:before {\n  content: \"\\e092\";\n}\n.glyphicon-arrow-up:before {\n  content: \"\\e093\";\n}\n.glyphicon-arrow-down:before {\n  content: \"\\e094\";\n}\n.glyphicon-share-alt:before {\n  content: \"\\e095\";\n}\n.glyphicon-resize-full:before {\n  content: \"\\e096\";\n}\n.glyphicon-resize-small:before {\n  content: \"\\e097\";\n}\n.glyphicon-exclamation-sign:before {\n  content: \"\\e101\";\n}\n.glyphicon-gift:before {\n  content: \"\\e102\";\n}\n.glyphicon-leaf:before {\n  content: \"\\e103\";\n}\n.glyphicon-fire:before {\n  content: \"\\e104\";\n}\n.glyphicon-eye-open:before {\n  content: \"\\e105\";\n}\n.glyphicon-eye-close:before {\n  content: \"\\e106\";\n}\n.glyphicon-warning-sign:before {\n  content: \"\\e107\";\n}\n.glyphicon-plane:before {\n  content: \"\\e108\";\n}\n.glyphicon-calendar:before {\n  content: \"\\e109\";\n}\n.glyphicon-random:before {\n  content: \"\\e110\";\n}\n.glyphicon-comment:before {\n  content: \"\\e111\";\n}\n.glyphicon-magnet:before {\n  content: \"\\e112\";\n}\n.glyphicon-chevron-up:before {\n  content: \"\\e113\";\n}\n.glyphicon-chevron-down:before {\n  content: \"\\e114\";\n}\n.glyphicon-retweet:before {\n  content: \"\\e115\";\n}\n.glyphicon-shopping-cart:before {\n  content: \"\\e116\";\n}\n.glyphicon-folder-close:before {\n  content: \"\\e117\";\n}\n.glyphicon-folder-open:before {\n  content: \"\\e118\";\n}\n.glyphicon-resize-vertical:before {\n  content: \"\\e119\";\n}\n.glyphicon-resize-horizontal:before {\n  content: \"\\e120\";\n}\n.glyphicon-hdd:before {\n  content: \"\\e121\";\n}\n.glyphicon-bullhorn:before {\n  content: \"\\e122\";\n}\n.glyphicon-bell:before {\n  content: \"\\e123\";\n}\n.glyphicon-certificate:before {\n  content: \"\\e124\";\n}\n.glyphicon-thumbs-up:before {\n  content: \"\\e125\";\n}\n.glyphicon-thumbs-down:before {\n  content: \"\\e126\";\n}\n.glyphicon-hand-right:before {\n  content: \"\\e127\";\n}\n.glyphicon-hand-left:before {\n  content: \"\\e128\";\n}\n.glyphicon-hand-up:before {\n  content: \"\\e129\";\n}\n.glyphicon-hand-down:before {\n  content: \"\\e130\";\n}\n.glyphicon-circle-arrow-right:before {\n  content: \"\\e131\";\n}\n.glyphicon-circle-arrow-left:before {\n  content: \"\\e132\";\n}\n.glyphicon-circle-arrow-up:before {\n  content: \"\\e133\";\n}\n.glyphicon-circle-arrow-down:before {\n  content: \"\\e134\";\n}\n.glyphicon-globe:before {\n  content: \"\\e135\";\n}\n.glyphicon-wrench:before {\n  content: \"\\e136\";\n}\n.glyphicon-tasks:before {\n  content: \"\\e137\";\n}\n.glyphicon-filter:before {\n  content: \"\\e138\";\n}\n.glyphicon-briefcase:before {\n  content: \"\\e139\";\n}\n.glyphicon-fullscreen:before {\n  content: \"\\e140\";\n}\n.glyphicon-dashboard:before {\n  content: \"\\e141\";\n}\n.glyphicon-paperclip:before {\n  content: \"\\e142\";\n}\n.glyphicon-heart-empty:before {\n  content: \"\\e143\";\n}\n.glyphicon-link:before {\n  content: \"\\e144\";\n}\n.glyphicon-phone:before {\n  content: \"\\e145\";\n}\n.glyphicon-pushpin:before {\n  content: \"\\e146\";\n}\n.glyphicon-usd:before {\n  content: \"\\e148\";\n}\n.glyphicon-gbp:before {\n  content: \"\\e149\";\n}\n.glyphicon-sort:before {\n  content: \"\\e150\";\n}\n.glyphicon-sort-by-alphabet:before {\n  content: \"\\e151\";\n}\n.glyphicon-sort-by-alphabet-alt:before {\n  content: \"\\e152\";\n}\n.glyphicon-sort-by-order:before {\n  content: \"\\e153\";\n}\n.glyphicon-sort-by-order-alt:before {\n  content: \"\\e154\";\n}\n.glyphicon-sort-by-attributes:before {\n  content: \"\\e155\";\n}\n.glyphicon-sort-by-attributes-alt:before {\n  content: \"\\e156\";\n}\n.glyphicon-unchecked:before {\n  content: \"\\e157\";\n}\n.glyphicon-expand:before {\n  content: \"\\e158\";\n}\n.glyphicon-collapse-down:before {\n  content: \"\\e159\";\n}\n.glyphicon-collapse-up:before {\n  content: \"\\e160\";\n}\n.glyphicon-log-in:before {\n  content: \"\\e161\";\n}\n.glyphicon-flash:before {\n  content: \"\\e162\";\n}\n.glyphicon-log-out:before {\n  content: \"\\e163\";\n}\n.glyphicon-new-window:before {\n  content: \"\\e164\";\n}\n.glyphicon-record:before {\n  content: \"\\e165\";\n}\n.glyphicon-save:before {\n  content: \"\\e166\";\n}\n.glyphicon-open:before {\n  content: \"\\e167\";\n}\n.glyphicon-saved:before {\n  content: \"\\e168\";\n}\n.glyphicon-import:before {\n  content: \"\\e169\";\n}\n.glyphicon-export:before {\n  content: \"\\e170\";\n}\n.glyphicon-send:before {\n  content: \"\\e171\";\n}\n.glyphicon-floppy-disk:before {\n  content: \"\\e172\";\n}\n.glyphicon-floppy-saved:before {\n  content: \"\\e173\";\n}\n.glyphicon-floppy-remove:before {\n  content: \"\\e174\";\n}\n.glyphicon-floppy-save:before {\n  content: \"\\e175\";\n}\n.glyphicon-floppy-open:before {\n  content: \"\\e176\";\n}\n.glyphicon-credit-card:before {\n  content: \"\\e177\";\n}\n.glyphicon-transfer:before {\n  content: \"\\e178\";\n}\n.glyphicon-cutlery:before {\n  content: \"\\e179\";\n}\n.glyphicon-header:before {\n  content: \"\\e180\";\n}\n.glyphicon-compressed:before {\n  content: \"\\e181\";\n}\n.glyphicon-earphone:before {\n  content: \"\\e182\";\n}\n.glyphicon-phone-alt:before {\n  content: \"\\e183\";\n}\n.glyphicon-tower:before {\n  content: \"\\e184\";\n}\n.glyphicon-stats:before {\n  content: \"\\e185\";\n}\n.glyphicon-sd-video:before {\n  content: \"\\e186\";\n}\n.glyphicon-hd-video:before {\n  content: \"\\e187\";\n}\n.glyphicon-subtitles:before {\n  content: \"\\e188\";\n}\n.glyphicon-sound-stereo:before {\n  content: \"\\e189\";\n}\n.glyphicon-sound-dolby:before {\n  content: \"\\e190\";\n}\n.glyphicon-sound-5-1:before {\n  content: \"\\e191\";\n}\n.glyphicon-sound-6-1:before {\n  content: \"\\e192\";\n}\n.glyphicon-sound-7-1:before {\n  content: \"\\e193\";\n}\n.glyphicon-copyright-mark:before {\n  content: \"\\e194\";\n}\n.glyphicon-registration-mark:before {\n  content: \"\\e195\";\n}\n.glyphicon-cloud-download:before {\n  content: \"\\e197\";\n}\n.glyphicon-cloud-upload:before {\n  content: \"\\e198\";\n}\n.glyphicon-tree-conifer:before {\n  content: \"\\e199\";\n}\n.glyphicon-tree-deciduous:before {\n  content: \"\\e200\";\n}\n* {\n  -webkit-box-sizing: border-box;\n  -moz-box-sizing: border-box;\n  box-sizing: border-box;\n}\n*:before,\n*:after {\n  -webkit-box-sizing: border-box;\n  -moz-box-sizing: border-box;\n  box-sizing: border-box;\n}\nhtml {\n  font-size: 10px;\n  -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n}\nbody {\n  font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n  font-size: 14px;\n  line-height: 1.42857143;\n  color: #333333;\n  background-color: #ffffff;\n}\ninput,\nbutton,\nselect,\ntextarea {\n  font-family: inherit;\n  font-size: inherit;\n  line-height: inherit;\n}\na {\n  color: #4CAF50;\n  text-decoration: none;\n}\na:hover,\na:focus {\n  color: #357a38;\n  text-decoration: underline;\n}\na:focus {\n  outline: thin dotted;\n  outline: 5px auto -webkit-focus-ring-color;\n  outline-offset: -2px;\n}\nfigure {\n  margin: 0;\n}\nimg {\n  vertical-align: middle;\n}\n.img-responsive,\n.thumbnail > img,\n.thumbnail a > img,\n.carousel-inner > .item > img,\n.carousel-inner > .item > a > img {\n  display: block;\n  max-width: 100%;\n  height: auto;\n}\n.img-rounded {\n  border-radius: 6px;\n}\n.img-thumbnail {\n  padding: 4px;\n  line-height: 1.42857143;\n  background-color: #ffffff;\n  border: 1px solid #ddd;\n  border-radius: 4px;\n  -webkit-transition: all 0.2s ease-in-out;\n  -o-transition: all 0.2s ease-in-out;\n  transition: all 0.2s ease-in-out;\n  display: inline-block;\n  max-width: 100%;\n  height: auto;\n}\n.img-circle {\n  border-radius: 50%;\n}\nhr {\n  margin-top: 20px;\n  margin-bottom: 20px;\n  border: 0;\n  border-top: 1px solid #eeeeee;\n}\n.sr-only {\n  position: absolute;\n  width: 1px;\n  height: 1px;\n  margin: -1px;\n  padding: 0;\n  overflow: hidden;\n  clip: rect(0, 0, 0, 0);\n  border: 0;\n}\n.sr-only-focusable:active,\n.sr-only-focusable:focus {\n  position: static;\n  width: auto;\n  height: auto;\n  margin: 0;\n  overflow: visible;\n  clip: auto;\n}\nh1,\nh2,\nh3,\nh4,\nh5,\nh6,\n.h1,\n.h2,\n.h3,\n.h4,\n.h5,\n.h6 {\n  font-family: inherit;\n  font-weight: 500;\n  line-height: 1.1;\n  color: inherit;\n}\nh1 small,\nh2 small,\nh3 small,\nh4 small,\nh5 small,\nh6 small,\n.h1 small,\n.h2 small,\n.h3 small,\n.h4 small,\n.h5 small,\n.h6 small,\nh1 .small,\nh2 .small,\nh3 .small,\nh4 .small,\nh5 .small,\nh6 .small,\n.h1 .small,\n.h2 .small,\n.h3 .small,\n.h4 .small,\n.h5 .small,\n.h6 .small {\n  font-weight: normal;\n  line-height: 1;\n  color: #777777;\n}\nh1,\n.h1,\nh2,\n.h2,\nh3,\n.h3 {\n  margin-top: 20px;\n  margin-bottom: 10px;\n}\nh1 small,\n.h1 small,\nh2 small,\n.h2 small,\nh3 small,\n.h3 small,\nh1 .small,\n.h1 .small,\nh2 .small,\n.h2 .small,\nh3 .small,\n.h3 .small {\n  font-size: 65%;\n}\nh4,\n.h4,\nh5,\n.h5,\nh6,\n.h6 {\n  margin-top: 10px;\n  margin-bottom: 10px;\n}\nh4 small,\n.h4 small,\nh5 small,\n.h5 small,\nh6 small,\n.h6 small,\nh4 .small,\n.h4 .small,\nh5 .small,\n.h5 .small,\nh6 .small,\n.h6 .small {\n  font-size: 75%;\n}\nh1,\n.h1 {\n  font-size: 36px;\n}\nh2,\n.h2 {\n  font-size: 30px;\n}\nh3,\n.h3 {\n  font-size: 24px;\n}\nh4,\n.h4 {\n  font-size: 18px;\n}\nh5,\n.h5 {\n  font-size: 14px;\n}\nh6,\n.h6 {\n  font-size: 12px;\n}\np {\n  margin: 0 0 10px;\n}\n.lead {\n  margin-bottom: 20px;\n  font-size: 16px;\n  font-weight: 300;\n  line-height: 1.4;\n}\n@media (min-width: 768px) {\n  .lead {\n    font-size: 21px;\n  }\n}\nsmall,\n.small {\n  font-size: 85%;\n}\nmark,\n.mark {\n  background-color: #fcf8e3;\n  padding: .2em;\n}\n.text-left {\n  text-align: left;\n}\n.text-right {\n  text-align: right;\n}\n.text-center {\n  text-align: center;\n}\n.text-justify {\n  text-align: justify;\n}\n.text-nowrap {\n  white-space: nowrap;\n}\n.text-lowercase {\n  text-transform: lowercase;\n}\n.text-uppercase {\n  text-transform: uppercase;\n}\n.text-capitalize {\n  text-transform: capitalize;\n}\n.text-muted {\n  color: #777777;\n}\n.text-primary {\n  color: #4CAF50;\n}\na.text-primary:hover {\n  color: #3d8b40;\n}\n.text-success {\n  color: #215f1e;\n}\na.text-success:hover {\n  color: #143812;\n}\n.text-info {\n  color: #31708f;\n}\na.text-info:hover {\n  color: #245269;\n}\n.text-warning {\n  color: #8a6d3b;\n}\na.text-warning:hover {\n  color: #66512c;\n}\n.text-danger {\n  color: #a94442;\n}\na.text-danger:hover {\n  color: #843534;\n}\n.bg-primary {\n  color: #fff;\n  background-color: #4CAF50;\n}\na.bg-primary:hover {\n  background-color: #3d8b40;\n}\n.bg-success {\n  background-color: #dff0d8;\n}\na.bg-success:hover {\n  background-color: #c1e2b3;\n}\n.bg-info {\n  background-color: #d9edf7;\n}\na.bg-info:hover {\n  background-color: #afd9ee;\n}\n.bg-warning {\n  background-color: #fcf8e3;\n}\na.bg-warning:hover {\n  background-color: #f7ecb5;\n}\n.bg-danger {\n  background-color: #f2dede;\n}\na.bg-danger:hover {\n  background-color: #e4b9b9;\n}\n.page-header {\n  padding-bottom: 9px;\n  margin: 40px 0 20px;\n  border-bottom: 1px solid #eeeeee;\n}\nul,\nol {\n  margin-top: 0;\n  margin-bottom: 10px;\n}\nul ul,\nol ul,\nul ol,\nol ol {\n  margin-bottom: 0;\n}\n.list-unstyled {\n  padding-left: 0;\n  list-style: none;\n}\n.list-inline {\n  padding-left: 0;\n  list-style: none;\n  margin-left: -5px;\n}\n.list-inline > li {\n  display: inline-block;\n  padding-left: 5px;\n  padding-right: 5px;\n}\ndl {\n  margin-top: 0;\n  margin-bottom: 20px;\n}\ndt,\ndd {\n  line-height: 1.42857143;\n}\ndt {\n  font-weight: bold;\n}\ndd {\n  margin-left: 0;\n}\n@media (min-width: 768px) {\n  .dl-horizontal dt {\n    float: left;\n    width: 160px;\n    clear: left;\n    text-align: right;\n    overflow: hidden;\n    text-overflow: ellipsis;\n    white-space: nowrap;\n  }\n  .dl-horizontal dd {\n    margin-left: 180px;\n  }\n}\nabbr[title],\nabbr[data-original-title] {\n  cursor: help;\n  border-bottom: 1px dotted #777777;\n}\n.initialism {\n  font-size: 90%;\n  text-transform: uppercase;\n}\nblockquote {\n  padding: 10px 20px;\n  margin: 0 0 20px;\n  font-size: 17.5px;\n  border-left: 5px solid #eeeeee;\n}\nblockquote p:last-child,\nblockquote ul:last-child,\nblockquote ol:last-child {\n  margin-bottom: 0;\n}\nblockquote footer,\nblockquote small,\nblockquote .small {\n  display: block;\n  font-size: 80%;\n  line-height: 1.42857143;\n  color: #777777;\n}\nblockquote footer:before,\nblockquote small:before,\nblockquote .small:before {\n  content: '\\2014 \\00A0';\n}\n.blockquote-reverse,\nblockquote.pull-right {\n  padding-right: 15px;\n  padding-left: 0;\n  border-right: 5px solid #eeeeee;\n  border-left: 0;\n  text-align: right;\n}\n.blockquote-reverse footer:before,\nblockquote.pull-right footer:before,\n.blockquote-reverse small:before,\nblockquote.pull-right small:before,\n.blockquote-reverse .small:before,\nblockquote.pull-right .small:before {\n  content: '';\n}\n.blockquote-reverse footer:after,\nblockquote.pull-right footer:after,\n.blockquote-reverse small:after,\nblockquote.pull-right small:after,\n.blockquote-reverse .small:after,\nblockquote.pull-right .small:after {\n  content: '\\00A0 \\2014';\n}\naddress {\n  margin-bottom: 20px;\n  font-style: normal;\n  line-height: 1.42857143;\n}\ncode,\nkbd,\npre,\nsamp {\n  font-family: Menlo, Monaco, Consolas, \"Courier New\", monospace;\n}\ncode {\n  padding: 2px 4px;\n  font-size: 90%;\n  color: #c7254e;\n  background-color: #f9f2f4;\n  border-radius: 4px;\n}\nkbd {\n  padding: 2px 4px;\n  font-size: 90%;\n  color: #eeeeee;\n  background-color: #333;\n  border-radius: 3px;\n  box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.25);\n}\nkbd kbd {\n  padding: 0;\n  font-size: 100%;\n  font-weight: bold;\n  box-shadow: none;\n}\npre {\n  display: block;\n  padding: 9.5px;\n  margin: 0 0 10px;\n  font-size: 13px;\n  line-height: 1.42857143;\n  word-break: break-all;\n  word-wrap: break-word;\n  color: #333333;\n  background-color: #f5f5f5;\n  border: 1px solid #ccc;\n  border-radius: 4px;\n}\npre code {\n  padding: 0;\n  font-size: inherit;\n  color: inherit;\n  white-space: pre-wrap;\n  background-color: transparent;\n  border-radius: 0;\n}\n.pre-scrollable {\n  max-height: 340px;\n  overflow-y: scroll;\n}\n.container {\n  margin-right: auto;\n  margin-left: auto;\n  padding-left: 15px;\n  padding-right: 15px;\n}\n@media (min-width: 768px) {\n  .container {\n    width: 750px;\n  }\n}\n@media (min-width: 1031px) {\n  .container {\n    width: 970px;\n  }\n}\n@media (min-width: 1200px) {\n  .container {\n    width: 1170px;\n  }\n}\n.container-fluid {\n  margin-right: auto;\n  margin-left: auto;\n  padding-left: 15px;\n  padding-right: 15px;\n}\n.row {\n  margin-left: -15px;\n  margin-right: -15px;\n}\n.col-xs-1, .col-sm-1, .col-md-1, .col-lg-1, .col-xs-2, .col-sm-2, .col-md-2, .col-lg-2, .col-xs-3, .col-sm-3, .col-md-3, .col-lg-3, .col-xs-4, .col-sm-4, .col-md-4, .col-lg-4, .col-xs-5, .col-sm-5, .col-md-5, .col-lg-5, .col-xs-6, .col-sm-6, .col-md-6, .col-lg-6, .col-xs-7, .col-sm-7, .col-md-7, .col-lg-7, .col-xs-8, .col-sm-8, .col-md-8, .col-lg-8, .col-xs-9, .col-sm-9, .col-md-9, .col-lg-9, .col-xs-10, .col-sm-10, .col-md-10, .col-lg-10, .col-xs-11, .col-sm-11, .col-md-11, .col-lg-11, .col-xs-12, .col-sm-12, .col-md-12, .col-lg-12 {\n  position: relative;\n  min-height: 1px;\n  padding-left: 15px;\n  padding-right: 15px;\n}\n.col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12 {\n  float: left;\n}\n.col-xs-12 {\n  width: 100%;\n}\n.col-xs-11 {\n  width: 91.66666667%;\n}\n.col-xs-10 {\n  width: 83.33333333%;\n}\n.col-xs-9 {\n  width: 75%;\n}\n.col-xs-8 {\n  width: 66.66666667%;\n}\n.col-xs-7 {\n  width: 58.33333333%;\n}\n.col-xs-6 {\n  width: 50%;\n}\n.col-xs-5 {\n  width: 41.66666667%;\n}\n.col-xs-4 {\n  width: 33.33333333%;\n}\n.col-xs-3 {\n  width: 25%;\n}\n.col-xs-2 {\n  width: 16.66666667%;\n}\n.col-xs-1 {\n  width: 8.33333333%;\n}\n.col-xs-pull-12 {\n  right: 100%;\n}\n.col-xs-pull-11 {\n  right: 91.66666667%;\n}\n.col-xs-pull-10 {\n  right: 83.33333333%;\n}\n.col-xs-pull-9 {\n  right: 75%;\n}\n.col-xs-pull-8 {\n  right: 66.66666667%;\n}\n.col-xs-pull-7 {\n  right: 58.33333333%;\n}\n.col-xs-pull-6 {\n  right: 50%;\n}\n.col-xs-pull-5 {\n  right: 41.66666667%;\n}\n.col-xs-pull-4 {\n  right: 33.33333333%;\n}\n.col-xs-pull-3 {\n  right: 25%;\n}\n.col-xs-pull-2 {\n  right: 16.66666667%;\n}\n.col-xs-pull-1 {\n  right: 8.33333333%;\n}\n.col-xs-pull-0 {\n  right: auto;\n}\n.col-xs-push-12 {\n  left: 100%;\n}\n.col-xs-push-11 {\n  left: 91.66666667%;\n}\n.col-xs-push-10 {\n  left: 83.33333333%;\n}\n.col-xs-push-9 {\n  left: 75%;\n}\n.col-xs-push-8 {\n  left: 66.66666667%;\n}\n.col-xs-push-7 {\n  left: 58.33333333%;\n}\n.col-xs-push-6 {\n  left: 50%;\n}\n.col-xs-push-5 {\n  left: 41.66666667%;\n}\n.col-xs-push-4 {\n  left: 33.33333333%;\n}\n.col-xs-push-3 {\n  left: 25%;\n}\n.col-xs-push-2 {\n  left: 16.66666667%;\n}\n.col-xs-push-1 {\n  left: 8.33333333%;\n}\n.col-xs-push-0 {\n  left: auto;\n}\n.col-xs-offset-12 {\n  margin-left: 100%;\n}\n.col-xs-offset-11 {\n  margin-left: 91.66666667%;\n}\n.col-xs-offset-10 {\n  margin-left: 83.33333333%;\n}\n.col-xs-offset-9 {\n  margin-left: 75%;\n}\n.col-xs-offset-8 {\n  margin-left: 66.66666667%;\n}\n.col-xs-offset-7 {\n  margin-left: 58.33333333%;\n}\n.col-xs-offset-6 {\n  margin-left: 50%;\n}\n.col-xs-offset-5 {\n  margin-left: 41.66666667%;\n}\n.col-xs-offset-4 {\n  margin-left: 33.33333333%;\n}\n.col-xs-offset-3 {\n  margin-left: 25%;\n}\n.col-xs-offset-2 {\n  margin-left: 16.66666667%;\n}\n.col-xs-offset-1 {\n  margin-left: 8.33333333%;\n}\n.col-xs-offset-0 {\n  margin-left: 0%;\n}\n@media (min-width: 768px) {\n  .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12 {\n    float: left;\n  }\n  .col-sm-12 {\n    width: 100%;\n  }\n  .col-sm-11 {\n    width: 91.66666667%;\n  }\n  .col-sm-10 {\n    width: 83.33333333%;\n  }\n  .col-sm-9 {\n    width: 75%;\n  }\n  .col-sm-8 {\n    width: 66.66666667%;\n  }\n  .col-sm-7 {\n    width: 58.33333333%;\n  }\n  .col-sm-6 {\n    width: 50%;\n  }\n  .col-sm-5 {\n    width: 41.66666667%;\n  }\n  .col-sm-4 {\n    width: 33.33333333%;\n  }\n  .col-sm-3 {\n    width: 25%;\n  }\n  .col-sm-2 {\n    width: 16.66666667%;\n  }\n  .col-sm-1 {\n    width: 8.33333333%;\n  }\n  .col-sm-pull-12 {\n    right: 100%;\n  }\n  .col-sm-pull-11 {\n    right: 91.66666667%;\n  }\n  .col-sm-pull-10 {\n    right: 83.33333333%;\n  }\n  .col-sm-pull-9 {\n    right: 75%;\n  }\n  .col-sm-pull-8 {\n    right: 66.66666667%;\n  }\n  .col-sm-pull-7 {\n    right: 58.33333333%;\n  }\n  .col-sm-pull-6 {\n    right: 50%;\n  }\n  .col-sm-pull-5 {\n    right: 41.66666667%;\n  }\n  .col-sm-pull-4 {\n    right: 33.33333333%;\n  }\n  .col-sm-pull-3 {\n    right: 25%;\n  }\n  .col-sm-pull-2 {\n    right: 16.66666667%;\n  }\n  .col-sm-pull-1 {\n    right: 8.33333333%;\n  }\n  .col-sm-pull-0 {\n    right: auto;\n  }\n  .col-sm-push-12 {\n    left: 100%;\n  }\n  .col-sm-push-11 {\n    left: 91.66666667%;\n  }\n  .col-sm-push-10 {\n    left: 83.33333333%;\n  }\n  .col-sm-push-9 {\n    left: 75%;\n  }\n  .col-sm-push-8 {\n    left: 66.66666667%;\n  }\n  .col-sm-push-7 {\n    left: 58.33333333%;\n  }\n  .col-sm-push-6 {\n    left: 50%;\n  }\n  .col-sm-push-5 {\n    left: 41.66666667%;\n  }\n  .col-sm-push-4 {\n    left: 33.33333333%;\n  }\n  .col-sm-push-3 {\n    left: 25%;\n  }\n  .col-sm-push-2 {\n    left: 16.66666667%;\n  }\n  .col-sm-push-1 {\n    left: 8.33333333%;\n  }\n  .col-sm-push-0 {\n    left: auto;\n  }\n  .col-sm-offset-12 {\n    margin-left: 100%;\n  }\n  .col-sm-offset-11 {\n    margin-left: 91.66666667%;\n  }\n  .col-sm-offset-10 {\n    margin-left: 83.33333333%;\n  }\n  .col-sm-offset-9 {\n    margin-left: 75%;\n  }\n  .col-sm-offset-8 {\n    margin-left: 66.66666667%;\n  }\n  .col-sm-offset-7 {\n    margin-left: 58.33333333%;\n  }\n  .col-sm-offset-6 {\n    margin-left: 50%;\n  }\n  .col-sm-offset-5 {\n    margin-left: 41.66666667%;\n  }\n  .col-sm-offset-4 {\n    margin-left: 33.33333333%;\n  }\n  .col-sm-offset-3 {\n    margin-left: 25%;\n  }\n  .col-sm-offset-2 {\n    margin-left: 16.66666667%;\n  }\n  .col-sm-offset-1 {\n    margin-left: 8.33333333%;\n  }\n  .col-sm-offset-0 {\n    margin-left: 0%;\n  }\n}\n@media (min-width: 1031px) {\n  .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12 {\n    float: left;\n  }\n  .col-md-12 {\n    width: 100%;\n  }\n  .col-md-11 {\n    width: 91.66666667%;\n  }\n  .col-md-10 {\n    width: 83.33333333%;\n  }\n  .col-md-9 {\n    width: 75%;\n  }\n  .col-md-8 {\n    width: 66.66666667%;\n  }\n  .col-md-7 {\n    width: 58.33333333%;\n  }\n  .col-md-6 {\n    width: 50%;\n  }\n  .col-md-5 {\n    width: 41.66666667%;\n  }\n  .col-md-4 {\n    width: 33.33333333%;\n  }\n  .col-md-3 {\n    width: 25%;\n  }\n  .col-md-2 {\n    width: 16.66666667%;\n  }\n  .col-md-1 {\n    width: 8.33333333%;\n  }\n  .col-md-pull-12 {\n    right: 100%;\n  }\n  .col-md-pull-11 {\n    right: 91.66666667%;\n  }\n  .col-md-pull-10 {\n    right: 83.33333333%;\n  }\n  .col-md-pull-9 {\n    right: 75%;\n  }\n  .col-md-pull-8 {\n    right: 66.66666667%;\n  }\n  .col-md-pull-7 {\n    right: 58.33333333%;\n  }\n  .col-md-pull-6 {\n    right: 50%;\n  }\n  .col-md-pull-5 {\n    right: 41.66666667%;\n  }\n  .col-md-pull-4 {\n    right: 33.33333333%;\n  }\n  .col-md-pull-3 {\n    right: 25%;\n  }\n  .col-md-pull-2 {\n    right: 16.66666667%;\n  }\n  .col-md-pull-1 {\n    right: 8.33333333%;\n  }\n  .col-md-pull-0 {\n    right: auto;\n  }\n  .col-md-push-12 {\n    left: 100%;\n  }\n  .col-md-push-11 {\n    left: 91.66666667%;\n  }\n  .col-md-push-10 {\n    left: 83.33333333%;\n  }\n  .col-md-push-9 {\n    left: 75%;\n  }\n  .col-md-push-8 {\n    left: 66.66666667%;\n  }\n  .col-md-push-7 {\n    left: 58.33333333%;\n  }\n  .col-md-push-6 {\n    left: 50%;\n  }\n  .col-md-push-5 {\n    left: 41.66666667%;\n  }\n  .col-md-push-4 {\n    left: 33.33333333%;\n  }\n  .col-md-push-3 {\n    left: 25%;\n  }\n  .col-md-push-2 {\n    left: 16.66666667%;\n  }\n  .col-md-push-1 {\n    left: 8.33333333%;\n  }\n  .col-md-push-0 {\n    left: auto;\n  }\n  .col-md-offset-12 {\n    margin-left: 100%;\n  }\n  .col-md-offset-11 {\n    margin-left: 91.66666667%;\n  }\n  .col-md-offset-10 {\n    margin-left: 83.33333333%;\n  }\n  .col-md-offset-9 {\n    margin-left: 75%;\n  }\n  .col-md-offset-8 {\n    margin-left: 66.66666667%;\n  }\n  .col-md-offset-7 {\n    margin-left: 58.33333333%;\n  }\n  .col-md-offset-6 {\n    margin-left: 50%;\n  }\n  .col-md-offset-5 {\n    margin-left: 41.66666667%;\n  }\n  .col-md-offset-4 {\n    margin-left: 33.33333333%;\n  }\n  .col-md-offset-3 {\n    margin-left: 25%;\n  }\n  .col-md-offset-2 {\n    margin-left: 16.66666667%;\n  }\n  .col-md-offset-1 {\n    margin-left: 8.33333333%;\n  }\n  .col-md-offset-0 {\n    margin-left: 0%;\n  }\n}\n@media (min-width: 1200px) {\n  .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12 {\n    float: left;\n  }\n  .col-lg-12 {\n    width: 100%;\n  }\n  .col-lg-11 {\n    width: 91.66666667%;\n  }\n  .col-lg-10 {\n    width: 83.33333333%;\n  }\n  .col-lg-9 {\n    width: 75%;\n  }\n  .col-lg-8 {\n    width: 66.66666667%;\n  }\n  .col-lg-7 {\n    width: 58.33333333%;\n  }\n  .col-lg-6 {\n    width: 50%;\n  }\n  .col-lg-5 {\n    width: 41.66666667%;\n  }\n  .col-lg-4 {\n    width: 33.33333333%;\n  }\n  .col-lg-3 {\n    width: 25%;\n  }\n  .col-lg-2 {\n    width: 16.66666667%;\n  }\n  .col-lg-1 {\n    width: 8.33333333%;\n  }\n  .col-lg-pull-12 {\n    right: 100%;\n  }\n  .col-lg-pull-11 {\n    right: 91.66666667%;\n  }\n  .col-lg-pull-10 {\n    right: 83.33333333%;\n  }\n  .col-lg-pull-9 {\n    right: 75%;\n  }\n  .col-lg-pull-8 {\n    right: 66.66666667%;\n  }\n  .col-lg-pull-7 {\n    right: 58.33333333%;\n  }\n  .col-lg-pull-6 {\n    right: 50%;\n  }\n  .col-lg-pull-5 {\n    right: 41.66666667%;\n  }\n  .col-lg-pull-4 {\n    right: 33.33333333%;\n  }\n  .col-lg-pull-3 {\n    right: 25%;\n  }\n  .col-lg-pull-2 {\n    right: 16.66666667%;\n  }\n  .col-lg-pull-1 {\n    right: 8.33333333%;\n  }\n  .col-lg-pull-0 {\n    right: auto;\n  }\n  .col-lg-push-12 {\n    left: 100%;\n  }\n  .col-lg-push-11 {\n    left: 91.66666667%;\n  }\n  .col-lg-push-10 {\n    left: 83.33333333%;\n  }\n  .col-lg-push-9 {\n    left: 75%;\n  }\n  .col-lg-push-8 {\n    left: 66.66666667%;\n  }\n  .col-lg-push-7 {\n    left: 58.33333333%;\n  }\n  .col-lg-push-6 {\n    left: 50%;\n  }\n  .col-lg-push-5 {\n    left: 41.66666667%;\n  }\n  .col-lg-push-4 {\n    left: 33.33333333%;\n  }\n  .col-lg-push-3 {\n    left: 25%;\n  }\n  .col-lg-push-2 {\n    left: 16.66666667%;\n  }\n  .col-lg-push-1 {\n    left: 8.33333333%;\n  }\n  .col-lg-push-0 {\n    left: auto;\n  }\n  .col-lg-offset-12 {\n    margin-left: 100%;\n  }\n  .col-lg-offset-11 {\n    margin-left: 91.66666667%;\n  }\n  .col-lg-offset-10 {\n    margin-left: 83.33333333%;\n  }\n  .col-lg-offset-9 {\n    margin-left: 75%;\n  }\n  .col-lg-offset-8 {\n    margin-left: 66.66666667%;\n  }\n  .col-lg-offset-7 {\n    margin-left: 58.33333333%;\n  }\n  .col-lg-offset-6 {\n    margin-left: 50%;\n  }\n  .col-lg-offset-5 {\n    margin-left: 41.66666667%;\n  }\n  .col-lg-offset-4 {\n    margin-left: 33.33333333%;\n  }\n  .col-lg-offset-3 {\n    margin-left: 25%;\n  }\n  .col-lg-offset-2 {\n    margin-left: 16.66666667%;\n  }\n  .col-lg-offset-1 {\n    margin-left: 8.33333333%;\n  }\n  .col-lg-offset-0 {\n    margin-left: 0%;\n  }\n}\ntable {\n  background-color: transparent;\n}\ncaption {\n  padding-top: 8px;\n  padding-bottom: 8px;\n  color: #777777;\n  text-align: left;\n}\nth {\n  text-align: left;\n}\n.table {\n  width: 100%;\n  max-width: 100%;\n  margin-bottom: 20px;\n}\n.table > thead > tr > th,\n.table > tbody > tr > th,\n.table > tfoot > tr > th,\n.table > thead > tr > td,\n.table > tbody > tr > td,\n.table > tfoot > tr > td {\n  padding: 8px;\n  line-height: 1.42857143;\n  vertical-align: top;\n  border-top: 1px solid #ddd;\n}\n.table > thead > tr > th {\n  vertical-align: bottom;\n  border-bottom: 2px solid #ddd;\n}\n.table > caption + thead > tr:first-child > th,\n.table > colgroup + thead > tr:first-child > th,\n.table > thead:first-child > tr:first-child > th,\n.table > caption + thead > tr:first-child > td,\n.table > colgroup + thead > tr:first-child > td,\n.table > thead:first-child > tr:first-child > td {\n  border-top: 0;\n}\n.table > tbody + tbody {\n  border-top: 2px solid #ddd;\n}\n.table .table {\n  background-color: #ffffff;\n}\n.table-condensed > thead > tr > th,\n.table-condensed > tbody > tr > th,\n.table-condensed > tfoot > tr > th,\n.table-condensed > thead > tr > td,\n.table-condensed > tbody > tr > td,\n.table-condensed > tfoot > tr > td {\n  padding: 5px;\n}\n.table-bordered {\n  border: 1px solid #ddd;\n}\n.table-bordered > thead > tr > th,\n.table-bordered > tbody > tr > th,\n.table-bordered > tfoot > tr > th,\n.table-bordered > thead > tr > td,\n.table-bordered > tbody > tr > td,\n.table-bordered > tfoot > tr > td {\n  border: 1px solid #ddd;\n}\n.table-bordered > thead > tr > th,\n.table-bordered > thead > tr > td {\n  border-bottom-width: 2px;\n}\n.table-striped > tbody > tr:nth-child(odd) {\n  background-color: #f9f9f9;\n}\n.table-hover > tbody > tr:hover {\n  background-color: #f5f5f5;\n}\ntable col[class*=\"col-\"] {\n  position: static;\n  float: none;\n  display: table-column;\n}\ntable td[class*=\"col-\"],\ntable th[class*=\"col-\"] {\n  position: static;\n  float: none;\n  display: table-cell;\n}\n.table > thead > tr > td.active,\n.table > tbody > tr > td.active,\n.table > tfoot > tr > td.active,\n.table > thead > tr > th.active,\n.table > tbody > tr > th.active,\n.table > tfoot > tr > th.active,\n.table > thead > tr.active > td,\n.table > tbody > tr.active > td,\n.table > tfoot > tr.active > td,\n.table > thead > tr.active > th,\n.table > tbody > tr.active > th,\n.table > tfoot > tr.active > th {\n  background-color: #f5f5f5;\n}\n.table-hover > tbody > tr > td.active:hover,\n.table-hover > tbody > tr > th.active:hover,\n.table-hover > tbody > tr.active:hover > td,\n.table-hover > tbody > tr:hover > .active,\n.table-hover > tbody > tr.active:hover > th {\n  background-color: #e8e8e8;\n}\n.table > thead > tr > td.success,\n.table > tbody > tr > td.success,\n.table > tfoot > tr > td.success,\n.table > thead > tr > th.success,\n.table > tbody > tr > th.success,\n.table > tfoot > tr > th.success,\n.table > thead > tr.success > td,\n.table > tbody > tr.success > td,\n.table > tfoot > tr.success > td,\n.table > thead > tr.success > th,\n.table > tbody > tr.success > th,\n.table > tfoot > tr.success > th {\n  background-color: #dff0d8;\n}\n.table-hover > tbody > tr > td.success:hover,\n.table-hover > tbody > tr > th.success:hover,\n.table-hover > tbody > tr.success:hover > td,\n.table-hover > tbody > tr:hover > .success,\n.table-hover > tbody > tr.success:hover > th {\n  background-color: #d0e9c6;\n}\n.table > thead > tr > td.info,\n.table > tbody > tr > td.info,\n.table > tfoot > tr > td.info,\n.table > thead > tr > th.info,\n.table > tbody > tr > th.info,\n.table > tfoot > tr > th.info,\n.table > thead > tr.info > td,\n.table > tbody > tr.info > td,\n.table > tfoot > tr.info > td,\n.table > thead > tr.info > th,\n.table > tbody > tr.info > th,\n.table > tfoot > tr.info > th {\n  background-color: #d9edf7;\n}\n.table-hover > tbody > tr > td.info:hover,\n.table-hover > tbody > tr > th.info:hover,\n.table-hover > tbody > tr.info:hover > td,\n.table-hover > tbody > tr:hover > .info,\n.table-hover > tbody > tr.info:hover > th {\n  background-color: #c4e3f3;\n}\n.table > thead > tr > td.warning,\n.table > tbody > tr > td.warning,\n.table > tfoot > tr > td.warning,\n.table > thead > tr > th.warning,\n.table > tbody > tr > th.warning,\n.table > tfoot > tr > th.warning,\n.table > thead > tr.warning > td,\n.table > tbody > tr.warning > td,\n.table > tfoot > tr.warning > td,\n.table > thead > tr.warning > th,\n.table > tbody > tr.warning > th,\n.table > tfoot > tr.warning > th {\n  background-color: #fcf8e3;\n}\n.table-hover > tbody > tr > td.warning:hover,\n.table-hover > tbody > tr > th.warning:hover,\n.table-hover > tbody > tr.warning:hover > td,\n.table-hover > tbody > tr:hover > .warning,\n.table-hover > tbody > tr.warning:hover > th {\n  background-color: #faf2cc;\n}\n.table > thead > tr > td.danger,\n.table > tbody > tr > td.danger,\n.table > tfoot > tr > td.danger,\n.table > thead > tr > th.danger,\n.table > tbody > tr > th.danger,\n.table > tfoot > tr > th.danger,\n.table > thead > tr.danger > td,\n.table > tbody > tr.danger > td,\n.table > tfoot > tr.danger > td,\n.table > thead > tr.danger > th,\n.table > tbody > tr.danger > th,\n.table > tfoot > tr.danger > th {\n  background-color: #f2dede;\n}\n.table-hover > tbody > tr > td.danger:hover,\n.table-hover > tbody > tr > th.danger:hover,\n.table-hover > tbody > tr.danger:hover > td,\n.table-hover > tbody > tr:hover > .danger,\n.table-hover > tbody > tr.danger:hover > th {\n  background-color: #ebcccc;\n}\n.table-responsive {\n  overflow-x: auto;\n  min-height: 0.01%;\n}\n@media screen and (max-width: 767px) {\n  .table-responsive {\n    width: 100%;\n    margin-bottom: 15px;\n    overflow-y: hidden;\n    -ms-overflow-style: -ms-autohiding-scrollbar;\n    border: 1px solid #ddd;\n  }\n  .table-responsive > .table {\n    margin-bottom: 0;\n  }\n  .table-responsive > .table > thead > tr > th,\n  .table-responsive > .table > tbody > tr > th,\n  .table-responsive > .table > tfoot > tr > th,\n  .table-responsive > .table > thead > tr > td,\n  .table-responsive > .table > tbody > tr > td,\n  .table-responsive > .table > tfoot > tr > td {\n    white-space: nowrap;\n  }\n  .table-responsive > .table-bordered {\n    border: 0;\n  }\n  .table-responsive > .table-bordered > thead > tr > th:first-child,\n  .table-responsive > .table-bordered > tbody > tr > th:first-child,\n  .table-responsive > .table-bordered > tfoot > tr > th:first-child,\n  .table-responsive > .table-bordered > thead > tr > td:first-child,\n  .table-responsive > .table-bordered > tbody > tr > td:first-child,\n  .table-responsive > .table-bordered > tfoot > tr > td:first-child {\n    border-left: 0;\n  }\n  .table-responsive > .table-bordered > thead > tr > th:last-child,\n  .table-responsive > .table-bordered > tbody > tr > th:last-child,\n  .table-responsive > .table-bordered > tfoot > tr > th:last-child,\n  .table-responsive > .table-bordered > thead > tr > td:last-child,\n  .table-responsive > .table-bordered > tbody > tr > td:last-child,\n  .table-responsive > .table-bordered > tfoot > tr > td:last-child {\n    border-right: 0;\n  }\n  .table-responsive > .table-bordered > tbody > tr:last-child > th,\n  .table-responsive > .table-bordered > tfoot > tr:last-child > th,\n  .table-responsive > .table-bordered > tbody > tr:last-child > td,\n  .table-responsive > .table-bordered > tfoot > tr:last-child > td {\n    border-bottom: 0;\n  }\n}\nfieldset {\n  padding: 0;\n  margin: 0;\n  border: 0;\n  min-width: 0;\n}\nlegend {\n  display: block;\n  width: 100%;\n  padding: 0;\n  margin-bottom: 20px;\n  font-size: 21px;\n  line-height: inherit;\n  color: #333333;\n  border: 0;\n  border-bottom: 1px solid #e5e5e5;\n}\nlabel {\n  display: inline-block;\n  max-width: 100%;\n  margin-bottom: 5px;\n  font-weight: bold;\n}\ninput[type=\"search\"] {\n  -webkit-box-sizing: border-box;\n  -moz-box-sizing: border-box;\n  box-sizing: border-box;\n}\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n  margin: 4px 0 0;\n  margin-top: 1px \\9;\n  line-height: normal;\n}\ninput[type=\"file\"] {\n  display: block;\n}\ninput[type=\"range\"] {\n  display: block;\n  width: 100%;\n}\nselect[multiple],\nselect[size] {\n  height: auto;\n}\ninput[type=\"file\"]:focus,\ninput[type=\"radio\"]:focus,\ninput[type=\"checkbox\"]:focus {\n  outline: thin dotted;\n  outline: 5px auto -webkit-focus-ring-color;\n  outline-offset: -2px;\n}\noutput {\n  display: block;\n  padding-top: 7px;\n  font-size: 14px;\n  line-height: 1.42857143;\n  color: #555555;\n}\n.form-control {\n  display: block;\n  width: 100%;\n  height: 34px;\n  padding: 6px 12px;\n  font-size: 14px;\n  line-height: 1.42857143;\n  color: #555555;\n  background-color: #eeeeee;\n  background-image: none;\n  border: 1px solid #ccc;\n  border-radius: 4px;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n  -webkit-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;\n  -o-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;\n  transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;\n}\n.form-control:focus {\n  border-color: #66afe9;\n  outline: 0;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6);\n  box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6);\n}\n.form-control::-moz-placeholder {\n  color: #999;\n  opacity: 1;\n}\n.form-control:-ms-input-placeholder {\n  color: #999;\n}\n.form-control::-webkit-input-placeholder {\n  color: #999;\n}\n.form-control[disabled],\n.form-control[readonly],\nfieldset[disabled] .form-control {\n  cursor: not-allowed;\n  background-color: #eeeeee;\n  opacity: 1;\n}\ntextarea.form-control {\n  height: auto;\n}\ninput[type=\"search\"] {\n  -webkit-appearance: none;\n}\ninput[type=\"date\"],\ninput[type=\"time\"],\ninput[type=\"datetime-local\"],\ninput[type=\"month\"] {\n  line-height: 34px;\n  line-height: 1.42857143 \\0;\n}\ninput[type=\"date\"].input-sm,\ninput[type=\"time\"].input-sm,\ninput[type=\"datetime-local\"].input-sm,\ninput[type=\"month\"].input-sm {\n  line-height: 30px;\n  line-height: 1.5 \\0;\n}\ninput[type=\"date\"].input-lg,\ninput[type=\"time\"].input-lg,\ninput[type=\"datetime-local\"].input-lg,\ninput[type=\"month\"].input-lg {\n  line-height: 46px;\n  line-height: 1.33 \\0;\n}\n_:-ms-fullscreen,\n:root input[type=\"date\"],\n_:-ms-fullscreen,\n:root input[type=\"time\"],\n_:-ms-fullscreen,\n:root input[type=\"datetime-local\"],\n_:-ms-fullscreen,\n:root input[type=\"month\"] {\n  line-height: 1.42857143;\n}\n_:-ms-fullscreen.input-sm,\n:root input[type=\"date\"].input-sm,\n_:-ms-fullscreen.input-sm,\n:root input[type=\"time\"].input-sm,\n_:-ms-fullscreen.input-sm,\n:root input[type=\"datetime-local\"].input-sm,\n_:-ms-fullscreen.input-sm,\n:root input[type=\"month\"].input-sm {\n  line-height: 1.5;\n}\n_:-ms-fullscreen.input-lg,\n:root input[type=\"date\"].input-lg,\n_:-ms-fullscreen.input-lg,\n:root input[type=\"time\"].input-lg,\n_:-ms-fullscreen.input-lg,\n:root input[type=\"datetime-local\"].input-lg,\n_:-ms-fullscreen.input-lg,\n:root input[type=\"month\"].input-lg {\n  line-height: 1.33;\n}\n.form-group {\n  margin-bottom: 15px;\n}\n.radio,\n.checkbox {\n  position: relative;\n  display: block;\n  margin-top: 10px;\n  margin-bottom: 10px;\n}\n.radio label,\n.checkbox label {\n  min-height: 20px;\n  padding-left: 20px;\n  margin-bottom: 0;\n  font-weight: normal;\n  cursor: pointer;\n}\n.radio input[type=\"radio\"],\n.radio-inline input[type=\"radio\"],\n.checkbox input[type=\"checkbox\"],\n.checkbox-inline input[type=\"checkbox\"] {\n  position: absolute;\n  margin-left: -20px;\n  margin-top: 4px \\9;\n}\n.radio + .radio,\n.checkbox + .checkbox {\n  margin-top: -5px;\n}\n.radio-inline,\n.checkbox-inline {\n  display: inline-block;\n  padding-left: 20px;\n  margin-bottom: 0;\n  vertical-align: middle;\n  font-weight: normal;\n  cursor: pointer;\n}\n.radio-inline + .radio-inline,\n.checkbox-inline + .checkbox-inline {\n  margin-top: 0;\n  margin-left: 10px;\n}\ninput[type=\"radio\"][disabled],\ninput[type=\"checkbox\"][disabled],\ninput[type=\"radio\"].disabled,\ninput[type=\"checkbox\"].disabled,\nfieldset[disabled] input[type=\"radio\"],\nfieldset[disabled] input[type=\"checkbox\"] {\n  cursor: not-allowed;\n}\n.radio-inline.disabled,\n.checkbox-inline.disabled,\nfieldset[disabled] .radio-inline,\nfieldset[disabled] .checkbox-inline {\n  cursor: not-allowed;\n}\n.radio.disabled label,\n.checkbox.disabled label,\nfieldset[disabled] .radio label,\nfieldset[disabled] .checkbox label {\n  cursor: not-allowed;\n}\n.form-control-static {\n  padding-top: 7px;\n  padding-bottom: 7px;\n  margin-bottom: 0;\n}\n.form-control-static.input-lg,\n.form-control-static.input-sm {\n  padding-left: 0;\n  padding-right: 0;\n}\n.input-sm,\n.form-group-sm .form-control {\n  height: 30px;\n  padding: 5px 10px;\n  font-size: 12px;\n  line-height: 1.5;\n  border-radius: 3px;\n}\nselect.input-sm,\nselect.form-group-sm .form-control {\n  height: 30px;\n  line-height: 30px;\n}\ntextarea.input-sm,\ntextarea.form-group-sm .form-control,\nselect[multiple].input-sm,\nselect[multiple].form-group-sm .form-control {\n  height: auto;\n}\n.input-lg,\n.form-group-lg .form-control {\n  height: 46px;\n  padding: 10px 16px;\n  font-size: 18px;\n  line-height: 1.33;\n  border-radius: 6px;\n}\nselect.input-lg,\nselect.form-group-lg .form-control {\n  height: 46px;\n  line-height: 46px;\n}\ntextarea.input-lg,\ntextarea.form-group-lg .form-control,\nselect[multiple].input-lg,\nselect[multiple].form-group-lg .form-control {\n  height: auto;\n}\n.has-feedback {\n  position: relative;\n}\n.has-feedback .form-control {\n  padding-right: 42.5px;\n}\n.form-control-feedback {\n  position: absolute;\n  top: 0;\n  right: 0;\n  z-index: 2;\n  display: block;\n  width: 34px;\n  height: 34px;\n  line-height: 34px;\n  text-align: center;\n  pointer-events: none;\n}\n.input-lg + .form-control-feedback {\n  width: 46px;\n  height: 46px;\n  line-height: 46px;\n}\n.input-sm + .form-control-feedback {\n  width: 30px;\n  height: 30px;\n  line-height: 30px;\n}\n.has-success .help-block,\n.has-success .control-label,\n.has-success .radio,\n.has-success .checkbox,\n.has-success .radio-inline,\n.has-success .checkbox-inline,\n.has-success.radio label,\n.has-success.checkbox label,\n.has-success.radio-inline label,\n.has-success.checkbox-inline label {\n  color: #215f1e;\n}\n.has-success .form-control {\n  border-color: #215f1e;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n.has-success .form-control:focus {\n  border-color: #143812;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #3cad36;\n  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #3cad36;\n}\n.has-success .input-group-addon {\n  color: #215f1e;\n  border-color: #215f1e;\n  background-color: #dff0d8;\n}\n.has-success .form-control-feedback {\n  color: #215f1e;\n}\n.has-warning .help-block,\n.has-warning .control-label,\n.has-warning .radio,\n.has-warning .checkbox,\n.has-warning .radio-inline,\n.has-warning .checkbox-inline,\n.has-warning.radio label,\n.has-warning.checkbox label,\n.has-warning.radio-inline label,\n.has-warning.checkbox-inline label {\n  color: #8a6d3b;\n}\n.has-warning .form-control {\n  border-color: #8a6d3b;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n.has-warning .form-control:focus {\n  border-color: #66512c;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b;\n  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b;\n}\n.has-warning .input-group-addon {\n  color: #8a6d3b;\n  border-color: #8a6d3b;\n  background-color: #fcf8e3;\n}\n.has-warning .form-control-feedback {\n  color: #8a6d3b;\n}\n.has-error .help-block,\n.has-error .control-label,\n.has-error .radio,\n.has-error .checkbox,\n.has-error .radio-inline,\n.has-error .checkbox-inline,\n.has-error.radio label,\n.has-error.checkbox label,\n.has-error.radio-inline label,\n.has-error.checkbox-inline label {\n  color: #a94442;\n}\n.has-error .form-control {\n  border-color: #a94442;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n.has-error .form-control:focus {\n  border-color: #843534;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483;\n  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483;\n}\n.has-error .input-group-addon {\n  color: #a94442;\n  border-color: #a94442;\n  background-color: #f2dede;\n}\n.has-error .form-control-feedback {\n  color: #a94442;\n}\n.has-feedback label ~ .form-control-feedback {\n  top: 25px;\n}\n.has-feedback label.sr-only ~ .form-control-feedback {\n  top: 0;\n}\n.help-block {\n  display: block;\n  margin-top: 5px;\n  margin-bottom: 10px;\n  color: #737373;\n}\n@media (min-width: 768px) {\n  .form-inline .form-group {\n    display: inline-block;\n    margin-bottom: 0;\n    vertical-align: middle;\n  }\n  .form-inline .form-control {\n    display: inline-block;\n    width: auto;\n    vertical-align: middle;\n  }\n  .form-inline .form-control-static {\n    display: inline-block;\n  }\n  .form-inline .input-group {\n    display: inline-table;\n    vertical-align: middle;\n  }\n  .form-inline .input-group .input-group-addon,\n  .form-inline .input-group .input-group-btn,\n  .form-inline .input-group .form-control {\n    width: auto;\n  }\n  .form-inline .input-group > .form-control {\n    width: 100%;\n  }\n  .form-inline .control-label {\n    margin-bottom: 0;\n    vertical-align: middle;\n  }\n  .form-inline .radio,\n  .form-inline .checkbox {\n    display: inline-block;\n    margin-top: 0;\n    margin-bottom: 0;\n    vertical-align: middle;\n  }\n  .form-inline .radio label,\n  .form-inline .checkbox label {\n    padding-left: 0;\n  }\n  .form-inline .radio input[type=\"radio\"],\n  .form-inline .checkbox input[type=\"checkbox\"] {\n    position: relative;\n    margin-left: 0;\n  }\n  .form-inline .has-feedback .form-control-feedback {\n    top: 0;\n  }\n}\n.form-horizontal .radio,\n.form-horizontal .checkbox,\n.form-horizontal .radio-inline,\n.form-horizontal .checkbox-inline {\n  margin-top: 0;\n  margin-bottom: 0;\n  padding-top: 7px;\n}\n.form-horizontal .radio,\n.form-horizontal .checkbox {\n  min-height: 27px;\n}\n.form-horizontal .form-group {\n  margin-left: -15px;\n  margin-right: -15px;\n}\n@media (min-width: 768px) {\n  .form-horizontal .control-label {\n    text-align: right;\n    margin-bottom: 0;\n    padding-top: 7px;\n  }\n}\n.form-horizontal .has-feedback .form-control-feedback {\n  right: 15px;\n}\n@media (min-width: 768px) {\n  .form-horizontal .form-group-lg .control-label {\n    padding-top: 14.3px;\n  }\n}\n@media (min-width: 768px) {\n  .form-horizontal .form-group-sm .control-label {\n    padding-top: 6px;\n  }\n}\n.btn {\n  display: inline-block;\n  margin-bottom: 0;\n  font-weight: normal;\n  text-align: center;\n  vertical-align: middle;\n  touch-action: manipulation;\n  cursor: pointer;\n  background-image: none;\n  border: 1px solid transparent;\n  white-space: nowrap;\n  padding: 6px 12px;\n  font-size: 14px;\n  line-height: 1.42857143;\n  border-radius: 4px;\n  -webkit-user-select: none;\n  -moz-user-select: none;\n  -ms-user-select: none;\n  user-select: none;\n}\n.btn:focus,\n.btn:active:focus,\n.btn.active:focus,\n.btn.focus,\n.btn:active.focus,\n.btn.active.focus {\n  outline: thin dotted;\n  outline: 5px auto -webkit-focus-ring-color;\n  outline-offset: -2px;\n}\n.btn:hover,\n.btn:focus,\n.btn.focus {\n  color: #eeeeee;\n  text-decoration: none;\n}\n.btn:active,\n.btn.active {\n  outline: 0;\n  background-image: none;\n  -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n  box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n}\n.btn.disabled,\n.btn[disabled],\nfieldset[disabled] .btn {\n  cursor: not-allowed;\n  pointer-events: none;\n  opacity: 0.65;\n  -ms-filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=65);\n  filter: alpha(opacity=65);\n  -webkit-box-shadow: none;\n  box-shadow: none;\n}\n.btn-default {\n  color: #000000;\n  background-color: #ffffff;\n  border-color: #000000;\n}\n.btn-default:hover,\n.btn-default:focus,\n.btn-default.focus,\n.btn-default:active,\n.btn-default.active,\n.open > .dropdown-toggle.btn-default {\n  color: #eeeeee;\n  background-color: #ffffff;\n  border-color: #000000;\n}\n.btn-default:active,\n.btn-default.active,\n.open > .dropdown-toggle.btn-default {\n  background-image: none;\n}\n.btn-default.disabled,\n.btn-default[disabled],\nfieldset[disabled] .btn-default,\n.btn-default.disabled:hover,\n.btn-default[disabled]:hover,\nfieldset[disabled] .btn-default:hover,\n.btn-default.disabled:focus,\n.btn-default[disabled]:focus,\nfieldset[disabled] .btn-default:focus,\n.btn-default.disabled.focus,\n.btn-default[disabled].focus,\nfieldset[disabled] .btn-default.focus,\n.btn-default.disabled:active,\n.btn-default[disabled]:active,\nfieldset[disabled] .btn-default:active,\n.btn-default.disabled.active,\n.btn-default[disabled].active,\nfieldset[disabled] .btn-default.active {\n  background-color: #ffffff;\n  border-color: #000000;\n}\n.btn-default .badge {\n  color: #ffffff;\n  background-color: #000000;\n}\n.btn-primary {\n  color: #4CAF50;\n  background-color: #4CAF50;\n  border-color: #449d48;\n}\n.btn-primary:hover,\n.btn-primary:focus,\n.btn-primary.focus,\n.btn-primary:active,\n.btn-primary.active,\n.open > .dropdown-toggle.btn-primary {\n  color: #eeeeee;\n  background-color: #4CAF50;\n  border-color: #327334;\n}\n.btn-primary:active,\n.btn-primary.active,\n.open > .dropdown-toggle.btn-primary {\n  background-image: none;\n}\n.btn-primary.disabled,\n.btn-primary[disabled],\nfieldset[disabled] .btn-primary,\n.btn-primary.disabled:hover,\n.btn-primary[disabled]:hover,\nfieldset[disabled] .btn-primary:hover,\n.btn-primary.disabled:focus,\n.btn-primary[disabled]:focus,\nfieldset[disabled] .btn-primary:focus,\n.btn-primary.disabled.focus,\n.btn-primary[disabled].focus,\nfieldset[disabled] .btn-primary.focus,\n.btn-primary.disabled:active,\n.btn-primary[disabled]:active,\nfieldset[disabled] .btn-primary:active,\n.btn-primary.disabled.active,\n.btn-primary[disabled].active,\nfieldset[disabled] .btn-primary.active {\n  background-color: #4CAF50;\n  border-color: #449d48;\n}\n.btn-primary .badge {\n  color: #4CAF50;\n  background-color: #4CAF50;\n}\n.btn-success {\n  color: #457E86;\n  background-color: #457E86;\n  border-color: #3c6e75;\n}\n.btn-success:hover,\n.btn-success:focus,\n.btn-success.focus,\n.btn-success:active,\n.btn-success.active,\n.open > .dropdown-toggle.btn-success {\n  color: #eeeeee;\n  background-color: #457E86;\n  border-color: #28484d;\n}\n.btn-success:active,\n.btn-success.active,\n.open > .dropdown-toggle.btn-success {\n  background-image: none;\n}\n.btn-success.disabled,\n.btn-success[disabled],\nfieldset[disabled] .btn-success,\n.btn-success.disabled:hover,\n.btn-success[disabled]:hover,\nfieldset[disabled] .btn-success:hover,\n.btn-success.disabled:focus,\n.btn-success[disabled]:focus,\nfieldset[disabled] .btn-success:focus,\n.btn-success.disabled.focus,\n.btn-success[disabled].focus,\nfieldset[disabled] .btn-success.focus,\n.btn-success.disabled:active,\n.btn-success[disabled]:active,\nfieldset[disabled] .btn-success:active,\n.btn-success.disabled.active,\n.btn-success[disabled].active,\nfieldset[disabled] .btn-success.active {\n  background-color: #457E86;\n  border-color: #3c6e75;\n}\n.btn-success .badge {\n  color: #457E86;\n  background-color: #457E86;\n}\n.btn-info {\n  color: #4A2B0F;\n  background-color: #4A2B0F;\n  border-color: #351f0b;\n}\n.btn-info:hover,\n.btn-info:focus,\n.btn-info.focus,\n.btn-info:active,\n.btn-info.active,\n.open > .dropdown-toggle.btn-info {\n  color: #eeeeee;\n  background-color: #4A2B0F;\n  border-color: #020100;\n}\n.btn-info:active,\n.btn-info.active,\n.open > .dropdown-toggle.btn-info {\n  background-image: none;\n}\n.btn-info.disabled,\n.btn-info[disabled],\nfieldset[disabled] .btn-info,\n.btn-info.disabled:hover,\n.btn-info[disabled]:hover,\nfieldset[disabled] .btn-info:hover,\n.btn-info.disabled:focus,\n.btn-info[disabled]:focus,\nfieldset[disabled] .btn-info:focus,\n.btn-info.disabled.focus,\n.btn-info[disabled].focus,\nfieldset[disabled] .btn-info.focus,\n.btn-info.disabled:active,\n.btn-info[disabled]:active,\nfieldset[disabled] .btn-info:active,\n.btn-info.disabled.active,\n.btn-info[disabled].active,\nfieldset[disabled] .btn-info.active {\n  background-color: #4A2B0F;\n  border-color: #351f0b;\n}\n.btn-info .badge {\n  color: #4A2B0F;\n  background-color: #4A2B0F;\n}\n.btn-warning {\n  color: #f0ad4e;\n  background-color: #f0ad4e;\n  border-color: #eea236;\n}\n.btn-warning:hover,\n.btn-warning:focus,\n.btn-warning.focus,\n.btn-warning:active,\n.btn-warning.active,\n.open > .dropdown-toggle.btn-warning {\n  color: #eeeeee;\n  background-color: #f0ad4e;\n  border-color: #d58512;\n}\n.btn-warning:active,\n.btn-warning.active,\n.open > .dropdown-toggle.btn-warning {\n  background-image: none;\n}\n.btn-warning.disabled,\n.btn-warning[disabled],\nfieldset[disabled] .btn-warning,\n.btn-warning.disabled:hover,\n.btn-warning[disabled]:hover,\nfieldset[disabled] .btn-warning:hover,\n.btn-warning.disabled:focus,\n.btn-warning[disabled]:focus,\nfieldset[disabled] .btn-warning:focus,\n.btn-warning.disabled.focus,\n.btn-warning[disabled].focus,\nfieldset[disabled] .btn-warning.focus,\n.btn-warning.disabled:active,\n.btn-warning[disabled]:active,\nfieldset[disabled] .btn-warning:active,\n.btn-warning.disabled.active,\n.btn-warning[disabled].active,\nfieldset[disabled] .btn-warning.active {\n  background-color: #f0ad4e;\n  border-color: #eea236;\n}\n.btn-warning .badge {\n  color: #f0ad4e;\n  background-color: #f0ad4e;\n}\n.btn-danger {\n  color: #d9534f;\n  background-color: #d9534f;\n  border-color: #d43f3a;\n}\n.btn-danger:hover,\n.btn-danger:focus,\n.btn-danger.focus,\n.btn-danger:active,\n.btn-danger.active,\n.open > .dropdown-toggle.btn-danger {\n  color: #eeeeee;\n  background-color: #d9534f;\n  border-color: #ac2925;\n}\n.btn-danger:active,\n.btn-danger.active,\n.open > .dropdown-toggle.btn-danger {\n  background-image: none;\n}\n.btn-danger.disabled,\n.btn-danger[disabled],\nfieldset[disabled] .btn-danger,\n.btn-danger.disabled:hover,\n.btn-danger[disabled]:hover,\nfieldset[disabled] .btn-danger:hover,\n.btn-danger.disabled:focus,\n.btn-danger[disabled]:focus,\nfieldset[disabled] .btn-danger:focus,\n.btn-danger.disabled.focus,\n.btn-danger[disabled].focus,\nfieldset[disabled] .btn-danger.focus,\n.btn-danger.disabled:active,\n.btn-danger[disabled]:active,\nfieldset[disabled] .btn-danger:active,\n.btn-danger.disabled.active,\n.btn-danger[disabled].active,\nfieldset[disabled] .btn-danger.active {\n  background-color: #d9534f;\n  border-color: #d43f3a;\n}\n.btn-danger .badge {\n  color: #d9534f;\n  background-color: #d9534f;\n}\n.btn-link {\n  color: #4CAF50;\n  font-weight: normal;\n  border-radius: 0;\n}\n.btn-link,\n.btn-link:active,\n.btn-link.active,\n.btn-link[disabled],\nfieldset[disabled] .btn-link {\n  background-color: transparent;\n  -webkit-box-shadow: none;\n  box-shadow: none;\n}\n.btn-link,\n.btn-link:hover,\n.btn-link:focus,\n.btn-link:active {\n  border-color: transparent;\n}\n.btn-link:hover,\n.btn-link:focus {\n  color: #357a38;\n  text-decoration: underline;\n  background-color: transparent;\n}\n.btn-link[disabled]:hover,\nfieldset[disabled] .btn-link:hover,\n.btn-link[disabled]:focus,\nfieldset[disabled] .btn-link:focus {\n  color: #777777;\n  text-decoration: none;\n}\n.btn-lg,\n.btn-group-lg > .btn {\n  padding: 10px 16px;\n  font-size: 18px;\n  line-height: 1.33;\n  border-radius: 6px;\n}\n.btn-sm,\n.btn-group-sm > .btn {\n  padding: 5px 10px;\n  font-size: 12px;\n  line-height: 1.5;\n  border-radius: 3px;\n}\n.btn-xs,\n.btn-group-xs > .btn {\n  padding: 1px 5px;\n  font-size: 12px;\n  line-height: 1.5;\n  border-radius: 3px;\n}\n.btn-block {\n  display: block;\n  width: 100%;\n}\n.btn-block + .btn-block {\n  margin-top: 5px;\n}\ninput[type=\"submit\"].btn-block,\ninput[type=\"reset\"].btn-block,\ninput[type=\"button\"].btn-block {\n  width: 100%;\n}\n.fade {\n  opacity: 0;\n  -webkit-transition: opacity 0.15s linear;\n  -o-transition: opacity 0.15s linear;\n  transition: opacity 0.15s linear;\n}\n.fade.in {\n  opacity: 1;\n}\n.collapse {\n  display: none;\n  visibility: hidden;\n}\n.collapse.in {\n  display: block;\n  visibility: visible;\n}\ntr.collapse.in {\n  display: table-row;\n}\ntbody.collapse.in {\n  display: table-row-group;\n}\n.collapsing {\n  position: relative;\n  height: 0;\n  overflow: hidden;\n  -webkit-transition-property: height, visibility;\n  transition-property: height, visibility;\n  -webkit-transition-duration: 0.35s;\n  transition-duration: 0.35s;\n  -webkit-transition-timing-function: ease;\n  transition-timing-function: ease;\n}\n.caret {\n  display: inline-block;\n  width: 0;\n  height: 0;\n  margin-left: 2px;\n  vertical-align: middle;\n  border-top: 4px solid;\n  border-right: 4px solid transparent;\n  border-left: 4px solid transparent;\n}\n.dropdown {\n  position: relative;\n}\n.dropdown-toggle:focus {\n  outline: 0;\n}\n.dropdown-menu {\n  position: absolute;\n  top: 100%;\n  left: 0;\n  z-index: 1000;\n  display: none;\n  float: left;\n  min-width: 160px;\n  padding: 5px 0;\n  margin: 2px 0 0;\n  list-style: none;\n  font-size: 14px;\n  text-align: left;\n  background-color: #eeeeee;\n  border: 1px solid #ccc;\n  border: 1px solid rgba(0, 0, 0, 0.15);\n  border-radius: 4px;\n  -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);\n  box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);\n  background-clip: padding-box;\n}\n.dropdown-menu.pull-right {\n  right: 0;\n  left: auto;\n}\n.dropdown-menu .divider {\n  height: 1px;\n  margin: 9px 0;\n  overflow: hidden;\n  background-color: #e5e5e5;\n}\n.dropdown-menu > li > a {\n  display: block;\n  padding: 3px 20px;\n  clear: both;\n  font-weight: normal;\n  line-height: 1.42857143;\n  color: #333333;\n  white-space: nowrap;\n}\n.dropdown-menu > li > a:hover,\n.dropdown-menu > li > a:focus {\n  text-decoration: none;\n  color: #262626;\n  background-color: #f5f5f5;\n}\n.dropdown-menu > .active > a,\n.dropdown-menu > .active > a:hover,\n.dropdown-menu > .active > a:focus {\n  color: #eeeeee;\n  text-decoration: none;\n  outline: 0;\n  background-color: #4CAF50;\n}\n.dropdown-menu > .disabled > a,\n.dropdown-menu > .disabled > a:hover,\n.dropdown-menu > .disabled > a:focus {\n  color: #777777;\n}\n.dropdown-menu > .disabled > a:hover,\n.dropdown-menu > .disabled > a:focus {\n  text-decoration: none;\n  background-color: transparent;\n  background-image: none;\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n  cursor: not-allowed;\n}\n.open > .dropdown-menu {\n  display: block;\n}\n.open > a {\n  outline: 0;\n}\n.dropdown-menu-right {\n  left: auto;\n  right: 0;\n}\n.dropdown-menu-left {\n  left: 0;\n  right: auto;\n}\n.dropdown-header {\n  display: block;\n  padding: 3px 20px;\n  font-size: 12px;\n  line-height: 1.42857143;\n  color: #777777;\n  white-space: nowrap;\n}\n.dropdown-backdrop {\n  position: fixed;\n  left: 0;\n  right: 0;\n  bottom: 0;\n  top: 0;\n  z-index: 990;\n}\n.pull-right > .dropdown-menu {\n  right: 0;\n  left: auto;\n}\n.dropup .caret,\n.navbar-fixed-bottom .dropdown .caret {\n  border-top: 0;\n  border-bottom: 4px solid;\n  content: \"\";\n}\n.dropup .dropdown-menu,\n.navbar-fixed-bottom .dropdown .dropdown-menu {\n  top: auto;\n  bottom: 100%;\n  margin-bottom: 1px;\n}\n@media (min-width: 768px) {\n  .navbar-right .dropdown-menu {\n    left: auto;\n    right: 0;\n  }\n  .navbar-right .dropdown-menu-left {\n    left: 0;\n    right: auto;\n  }\n}\n.btn-group,\n.btn-group-vertical {\n  position: relative;\n  display: inline-block;\n  vertical-align: middle;\n}\n.btn-group > .btn,\n.btn-group-vertical > .btn {\n  position: relative;\n  float: left;\n}\n.btn-group > .btn:hover,\n.btn-group-vertical > .btn:hover,\n.btn-group > .btn:focus,\n.btn-group-vertical > .btn:focus,\n.btn-group > .btn:active,\n.btn-group-vertical > .btn:active,\n.btn-group > .btn.active,\n.btn-group-vertical > .btn.active {\n  z-index: 2;\n}\n.btn-group > .btn:focus,\n.btn-group-vertical > .btn:focus {\n  outline: 0;\n}\n.btn-group .btn + .btn,\n.btn-group .btn + .btn-group,\n.btn-group .btn-group + .btn,\n.btn-group .btn-group + .btn-group {\n  margin-left: -1px;\n}\n.btn-toolbar {\n  margin-left: -5px;\n}\n.btn-toolbar .btn-group,\n.btn-toolbar .input-group {\n  float: left;\n}\n.btn-toolbar > .btn,\n.btn-toolbar > .btn-group,\n.btn-toolbar > .input-group {\n  margin-left: 5px;\n}\n.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) {\n  border-radius: 0;\n}\n.btn-group > .btn:first-child {\n  margin-left: 0;\n}\n.btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) {\n  border-bottom-right-radius: 0;\n  border-top-right-radius: 0;\n}\n.btn-group > .btn:last-child:not(:first-child),\n.btn-group > .dropdown-toggle:not(:first-child) {\n  border-bottom-left-radius: 0;\n  border-top-left-radius: 0;\n}\n.btn-group > .btn-group {\n  float: left;\n}\n.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn {\n  border-radius: 0;\n}\n.btn-group > .btn-group:first-child > .btn:last-child,\n.btn-group > .btn-group:first-child > .dropdown-toggle {\n  border-bottom-right-radius: 0;\n  border-top-right-radius: 0;\n}\n.btn-group > .btn-group:last-child > .btn:first-child {\n  border-bottom-left-radius: 0;\n  border-top-left-radius: 0;\n}\n.btn-group .dropdown-toggle:active,\n.btn-group.open .dropdown-toggle {\n  outline: 0;\n}\n.btn-group > .btn + .dropdown-toggle {\n  padding-left: 8px;\n  padding-right: 8px;\n}\n.btn-group > .btn-lg + .dropdown-toggle {\n  padding-left: 12px;\n  padding-right: 12px;\n}\n.btn-group.open .dropdown-toggle {\n  -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n  box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n}\n.btn-group.open .dropdown-toggle.btn-link {\n  -webkit-box-shadow: none;\n  box-shadow: none;\n}\n.btn .caret {\n  margin-left: 0;\n}\n.btn-lg .caret {\n  border-width: 5px 5px 0;\n  border-bottom-width: 0;\n}\n.dropup .btn-lg .caret {\n  border-width: 0 5px 5px;\n}\n.btn-group-vertical > .btn,\n.btn-group-vertical > .btn-group,\n.btn-group-vertical > .btn-group > .btn {\n  display: block;\n  float: none;\n  width: 100%;\n  max-width: 100%;\n}\n.btn-group-vertical > .btn-group > .btn {\n  float: none;\n}\n.btn-group-vertical > .btn + .btn,\n.btn-group-vertical > .btn + .btn-group,\n.btn-group-vertical > .btn-group + .btn,\n.btn-group-vertical > .btn-group + .btn-group {\n  margin-top: -1px;\n  margin-left: 0;\n}\n.btn-group-vertical > .btn:not(:first-child):not(:last-child) {\n  border-radius: 0;\n}\n.btn-group-vertical > .btn:first-child:not(:last-child) {\n  border-top-right-radius: 4px;\n  border-bottom-right-radius: 0;\n  border-bottom-left-radius: 0;\n}\n.btn-group-vertical > .btn:last-child:not(:first-child) {\n  border-bottom-left-radius: 4px;\n  border-top-right-radius: 0;\n  border-top-left-radius: 0;\n}\n.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn {\n  border-radius: 0;\n}\n.btn-group-vertical > .btn-group:first-child:not(:last-child) > .btn:last-child,\n.btn-group-vertical > .btn-group:first-child:not(:last-child) > .dropdown-toggle {\n  border-bottom-right-radius: 0;\n  border-bottom-left-radius: 0;\n}\n.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child {\n  border-top-right-radius: 0;\n  border-top-left-radius: 0;\n}\n.btn-group-justified {\n  display: table;\n  width: 100%;\n  table-layout: fixed;\n  border-collapse: separate;\n}\n.btn-group-justified > .btn,\n.btn-group-justified > .btn-group {\n  float: none;\n  display: table-cell;\n  width: 1%;\n}\n.btn-group-justified > .btn-group .btn {\n  width: 100%;\n}\n.btn-group-justified > .btn-group .dropdown-menu {\n  left: auto;\n}\n[data-toggle=\"buttons\"] > .btn input[type=\"radio\"],\n[data-toggle=\"buttons\"] > .btn-group > .btn input[type=\"radio\"],\n[data-toggle=\"buttons\"] > .btn input[type=\"checkbox\"],\n[data-toggle=\"buttons\"] > .btn-group > .btn input[type=\"checkbox\"] {\n  position: absolute;\n  clip: rect(0, 0, 0, 0);\n  pointer-events: none;\n}\n.input-group {\n  position: relative;\n  display: table;\n  border-collapse: separate;\n}\n.input-group[class*=\"col-\"] {\n  float: none;\n  padding-left: 0;\n  padding-right: 0;\n}\n.input-group .form-control {\n  position: relative;\n  z-index: 2;\n  float: left;\n  width: 100%;\n  margin-bottom: 0;\n}\n.input-group-lg > .form-control,\n.input-group-lg > .input-group-addon,\n.input-group-lg > .input-group-btn > .btn {\n  height: 46px;\n  padding: 10px 16px;\n  font-size: 18px;\n  line-height: 1.33;\n  border-radius: 6px;\n}\nselect.input-group-lg > .form-control,\nselect.input-group-lg > .input-group-addon,\nselect.input-group-lg > .input-group-btn > .btn {\n  height: 46px;\n  line-height: 46px;\n}\ntextarea.input-group-lg > .form-control,\ntextarea.input-group-lg > .input-group-addon,\ntextarea.input-group-lg > .input-group-btn > .btn,\nselect[multiple].input-group-lg > .form-control,\nselect[multiple].input-group-lg > .input-group-addon,\nselect[multiple].input-group-lg > .input-group-btn > .btn {\n  height: auto;\n}\n.input-group-sm > .form-control,\n.input-group-sm > .input-group-addon,\n.input-group-sm > .input-group-btn > .btn {\n  height: 30px;\n  padding: 5px 10px;\n  font-size: 12px;\n  line-height: 1.5;\n  border-radius: 3px;\n}\nselect.input-group-sm > .form-control,\nselect.input-group-sm > .input-group-addon,\nselect.input-group-sm > .input-group-btn > .btn {\n  height: 30px;\n  line-height: 30px;\n}\ntextarea.input-group-sm > .form-control,\ntextarea.input-group-sm > .input-group-addon,\ntextarea.input-group-sm > .input-group-btn > .btn,\nselect[multiple].input-group-sm > .form-control,\nselect[multiple].input-group-sm > .input-group-addon,\nselect[multiple].input-group-sm > .input-group-btn > .btn {\n  height: auto;\n}\n.input-group-addon,\n.input-group-btn,\n.input-group .form-control {\n  display: table-cell;\n}\n.input-group-addon:not(:first-child):not(:last-child),\n.input-group-btn:not(:first-child):not(:last-child),\n.input-group .form-control:not(:first-child):not(:last-child) {\n  border-radius: 0;\n}\n.input-group-addon,\n.input-group-btn {\n  width: 1%;\n  white-space: nowrap;\n  vertical-align: middle;\n}\n.input-group-addon {\n  padding: 6px 12px;\n  font-size: 14px;\n  font-weight: normal;\n  line-height: 1;\n  color: #555555;\n  text-align: center;\n  background-color: #eeeeee;\n  border: 1px solid #ccc;\n  border-radius: 4px;\n}\n.input-group-addon.input-sm {\n  padding: 5px 10px;\n  font-size: 12px;\n  border-radius: 3px;\n}\n.input-group-addon.input-lg {\n  padding: 10px 16px;\n  font-size: 18px;\n  border-radius: 6px;\n}\n.input-group-addon input[type=\"radio\"],\n.input-group-addon input[type=\"checkbox\"] {\n  margin-top: 0;\n}\n.input-group .form-control:first-child,\n.input-group-addon:first-child,\n.input-group-btn:first-child > .btn,\n.input-group-btn:first-child > .btn-group > .btn,\n.input-group-btn:first-child > .dropdown-toggle,\n.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle),\n.input-group-btn:last-child > .btn-group:not(:last-child) > .btn {\n  border-bottom-right-radius: 0;\n  border-top-right-radius: 0;\n}\n.input-group-addon:first-child {\n  border-right: 0;\n}\n.input-group .form-control:last-child,\n.input-group-addon:last-child,\n.input-group-btn:last-child > .btn,\n.input-group-btn:last-child > .btn-group > .btn,\n.input-group-btn:last-child > .dropdown-toggle,\n.input-group-btn:first-child > .btn:not(:first-child),\n.input-group-btn:first-child > .btn-group:not(:first-child) > .btn {\n  border-bottom-left-radius: 0;\n  border-top-left-radius: 0;\n}\n.input-group-addon:last-child {\n  border-left: 0;\n}\n.input-group-btn {\n  position: relative;\n  font-size: 0;\n  white-space: nowrap;\n}\n.input-group-btn > .btn {\n  position: relative;\n}\n.input-group-btn > .btn + .btn {\n  margin-left: -1px;\n}\n.input-group-btn > .btn:hover,\n.input-group-btn > .btn:focus,\n.input-group-btn > .btn:active {\n  z-index: 2;\n}\n.input-group-btn:first-child > .btn,\n.input-group-btn:first-child > .btn-group {\n  margin-right: -1px;\n}\n.input-group-btn:last-child > .btn,\n.input-group-btn:last-child > .btn-group {\n  margin-left: -1px;\n}\n.nav {\n  margin-bottom: 0;\n  padding-left: 0;\n  list-style: none;\n}\n.nav > li {\n  position: relative;\n  display: block;\n}\n.nav > li > a {\n  position: relative;\n  display: block;\n  padding: 10px 15px;\n}\n.nav > li > a:hover,\n.nav > li > a:focus {\n  text-decoration: none;\n  background-color: #eeeeee;\n}\n.nav > li.disabled > a {\n  color: #777777;\n}\n.nav > li.disabled > a:hover,\n.nav > li.disabled > a:focus {\n  color: #777777;\n  text-decoration: none;\n  background-color: transparent;\n  cursor: not-allowed;\n}\n.nav .open > a,\n.nav .open > a:hover,\n.nav .open > a:focus {\n  background-color: #eeeeee;\n  border-color: #4CAF50;\n}\n.nav .nav-divider {\n  height: 1px;\n  margin: 9px 0;\n  overflow: hidden;\n  background-color: #e5e5e5;\n}\n.nav > li > a > img {\n  max-width: none;\n}\n.nav-tabs {\n  border-bottom: 1px solid #ddd;\n}\n.nav-tabs > li {\n  float: left;\n  margin-bottom: -1px;\n}\n.nav-tabs > li > a {\n  margin-right: 2px;\n  line-height: 1.42857143;\n  border: 1px solid transparent;\n  border-radius: 4px 4px 0 0;\n}\n.nav-tabs > li > a:hover {\n  border-color: #eeeeee #eeeeee #ddd;\n}\n.nav-tabs > li.active > a,\n.nav-tabs > li.active > a:hover,\n.nav-tabs > li.active > a:focus {\n  color: #555555;\n  background-color: #ffffff;\n  border: 1px solid #ddd;\n  border-bottom-color: transparent;\n  cursor: default;\n}\n.nav-tabs.nav-justified {\n  width: 100%;\n  border-bottom: 0;\n}\n.nav-tabs.nav-justified > li {\n  float: none;\n}\n.nav-tabs.nav-justified > li > a {\n  text-align: center;\n  margin-bottom: 5px;\n}\n.nav-tabs.nav-justified > .dropdown .dropdown-menu {\n  top: auto;\n  left: auto;\n}\n@media (min-width: 768px) {\n  .nav-tabs.nav-justified > li {\n    display: table-cell;\n    width: 1%;\n  }\n  .nav-tabs.nav-justified > li > a {\n    margin-bottom: 0;\n  }\n}\n.nav-tabs.nav-justified > li > a {\n  margin-right: 0;\n  border-radius: 4px;\n}\n.nav-tabs.nav-justified > .active > a,\n.nav-tabs.nav-justified > .active > a:hover,\n.nav-tabs.nav-justified > .active > a:focus {\n  border: 1px solid #ddd;\n}\n@media (min-width: 768px) {\n  .nav-tabs.nav-justified > li > a {\n    border-bottom: 1px solid #ddd;\n    border-radius: 4px 4px 0 0;\n  }\n  .nav-tabs.nav-justified > .active > a,\n  .nav-tabs.nav-justified > .active > a:hover,\n  .nav-tabs.nav-justified > .active > a:focus {\n    border-bottom-color: #ffffff;\n  }\n}\n.nav-pills > li {\n  float: left;\n}\n.nav-pills > li > a {\n  border-radius: 4px;\n}\n.nav-pills > li + li {\n  margin-left: 2px;\n}\n.nav-pills > li.active > a,\n.nav-pills > li.active > a:hover,\n.nav-pills > li.active > a:focus {\n  color: #eeeeee;\n  background-color: #4CAF50;\n}\n.nav-stacked > li {\n  float: none;\n}\n.nav-stacked > li + li {\n  margin-top: 2px;\n  margin-left: 0;\n}\n.nav-justified {\n  width: 100%;\n}\n.nav-justified > li {\n  float: none;\n}\n.nav-justified > li > a {\n  text-align: center;\n  margin-bottom: 5px;\n}\n.nav-justified > .dropdown .dropdown-menu {\n  top: auto;\n  left: auto;\n}\n@media (min-width: 768px) {\n  .nav-justified > li {\n    display: table-cell;\n    width: 1%;\n  }\n  .nav-justified > li > a {\n    margin-bottom: 0;\n  }\n}\n.nav-tabs-justified {\n  border-bottom: 0;\n}\n.nav-tabs-justified > li > a {\n  margin-right: 0;\n  border-radius: 4px;\n}\n.nav-tabs-justified > .active > a,\n.nav-tabs-justified > .active > a:hover,\n.nav-tabs-justified > .active > a:focus {\n  border: 1px solid #ddd;\n}\n@media (min-width: 768px) {\n  .nav-tabs-justified > li > a {\n    border-bottom: 1px solid #ddd;\n    border-radius: 4px 4px 0 0;\n  }\n  .nav-tabs-justified > .active > a,\n  .nav-tabs-justified > .active > a:hover,\n  .nav-tabs-justified > .active > a:focus {\n    border-bottom-color: #ffffff;\n  }\n}\n.tab-content > .tab-pane {\n  display: none;\n  visibility: hidden;\n}\n.tab-content > .active {\n  display: block;\n  visibility: visible;\n}\n.nav-tabs .dropdown-menu {\n  margin-top: -1px;\n  border-top-right-radius: 0;\n  border-top-left-radius: 0;\n}\n.navbar {\n  position: relative;\n  min-height: 50px;\n  margin-bottom: 30px;\n  border: 1px solid transparent;\n}\n@media (min-width: 768px) {\n  .navbar {\n    border-radius: 4px;\n  }\n}\n@media (min-width: 768px) {\n  .navbar-header {\n    float: left;\n  }\n}\n.navbar-collapse {\n  overflow-x: visible;\n  padding-right: 15px;\n  padding-left: 15px;\n  border-top: 1px solid transparent;\n  box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1);\n  -webkit-overflow-scrolling: touch;\n}\n.navbar-collapse.in {\n  overflow-y: auto;\n}\n@media (min-width: 768px) {\n  .navbar-collapse {\n    width: auto;\n    border-top: 0;\n    box-shadow: none;\n  }\n  .navbar-collapse.collapse {\n    display: block !important;\n    visibility: visible !important;\n    height: auto !important;\n    padding-bottom: 0;\n    overflow: visible !important;\n  }\n  .navbar-collapse.in {\n    overflow-y: visible;\n  }\n  .navbar-fixed-top .navbar-collapse,\n  .navbar-static-top .navbar-collapse,\n  .navbar-fixed-bottom .navbar-collapse {\n    padding-left: 0;\n    padding-right: 0;\n  }\n}\n.navbar-fixed-top .navbar-collapse,\n.navbar-fixed-bottom .navbar-collapse {\n  max-height: 340px;\n}\n@media (max-device-width: 480px) and (orientation: landscape) {\n  .navbar-fixed-top .navbar-collapse,\n  .navbar-fixed-bottom .navbar-collapse {\n    max-height: 200px;\n  }\n}\n.container > .navbar-header,\n.container-fluid > .navbar-header,\n.container > .navbar-collapse,\n.container-fluid > .navbar-collapse {\n  margin-right: -15px;\n  margin-left: -15px;\n}\n@media (min-width: 768px) {\n  .container > .navbar-header,\n  .container-fluid > .navbar-header,\n  .container > .navbar-collapse,\n  .container-fluid > .navbar-collapse {\n    margin-right: 0;\n    margin-left: 0;\n  }\n}\n.navbar-static-top {\n  z-index: 1000;\n  border-width: 0 0 1px;\n}\n@media (min-width: 768px) {\n  .navbar-static-top {\n    border-radius: 0;\n  }\n}\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n  position: fixed;\n  right: 0;\n  left: 0;\n  z-index: 1030;\n}\n@media (min-width: 768px) {\n  .navbar-fixed-top,\n  .navbar-fixed-bottom {\n    border-radius: 0;\n  }\n}\n.navbar-fixed-top {\n  top: 0;\n  border-width: 0 0 1px;\n}\n.navbar-fixed-bottom {\n  bottom: 0;\n  margin-bottom: 0;\n  border-width: 1px 0 0;\n}\n.navbar-brand {\n  float: left;\n  padding: 15px 15px;\n  font-size: 18px;\n  line-height: 20px;\n  height: 50px;\n}\n.navbar-brand:hover,\n.navbar-brand:focus {\n  text-decoration: none;\n}\n.navbar-brand > img {\n  display: block;\n}\n@media (min-width: 768px) {\n  .navbar > .container .navbar-brand,\n  .navbar > .container-fluid .navbar-brand {\n    margin-left: -15px;\n  }\n}\n.navbar-toggle {\n  position: relative;\n  float: right;\n  margin-right: 15px;\n  padding: 9px 10px;\n  margin-top: 8px;\n  margin-bottom: 8px;\n  background-color: transparent;\n  background-image: none;\n  border: 1px solid transparent;\n  border-radius: 4px;\n}\n.navbar-toggle:focus {\n  outline: 0;\n}\n.navbar-toggle .icon-bar {\n  display: block;\n  width: 22px;\n  height: 2px;\n  border-radius: 1px;\n  background-color: #eeeeee !important;\n}\n.navbar-toggle .icon-bar + .icon-bar {\n  margin-top: 4px;\n}\n@media (min-width: 768px) {\n  .navbar-toggle {\n    display: none;\n  }\n}\n.navbar-nav {\n  margin: 7.5px -15px;\n}\n.navbar-nav > li > a {\n  padding-top: 10px;\n  padding-bottom: 10px;\n  line-height: 20px;\n}\n@media (max-width: 767px) {\n  .navbar-nav .open .dropdown-menu {\n    position: static;\n    float: none;\n    width: auto;\n    margin-top: 0;\n    background-color: transparent;\n    border: 0;\n    box-shadow: none;\n  }\n  .navbar-nav .open .dropdown-menu > li > a,\n  .navbar-nav .open .dropdown-menu .dropdown-header {\n    padding: 5px 15px 5px 25px;\n  }\n  .navbar-nav .open .dropdown-menu > li > a {\n    line-height: 20px;\n  }\n  .navbar-nav .open .dropdown-menu > li > a:hover,\n  .navbar-nav .open .dropdown-menu > li > a:focus {\n    background-image: none;\n  }\n}\n@media (min-width: 768px) {\n  .navbar-nav {\n    float: left;\n    margin: 0;\n  }\n  .navbar-nav > li {\n    float: left;\n  }\n  .navbar-nav > li > a {\n    padding-top: 15px;\n    padding-bottom: 15px;\n  }\n}\n.navbar-form {\n  margin-left: -15px;\n  margin-right: -15px;\n  padding: 10px 15px;\n  border-top: 1px solid transparent;\n  border-bottom: 1px solid transparent;\n  -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  margin-top: 8px;\n  margin-bottom: 8px;\n}\n@media (min-width: 768px) {\n  .navbar-form .form-group {\n    display: inline-block;\n    margin-bottom: 0;\n    vertical-align: middle;\n  }\n  .navbar-form .form-control {\n    display: inline-block;\n    width: auto;\n    vertical-align: middle;\n  }\n  .navbar-form .form-control-static {\n    display: inline-block;\n  }\n  .navbar-form .input-group {\n    display: inline-table;\n    vertical-align: middle;\n  }\n  .navbar-form .input-group .input-group-addon,\n  .navbar-form .input-group .input-group-btn,\n  .navbar-form .input-group .form-control {\n    width: auto;\n  }\n  .navbar-form .input-group > .form-control {\n    width: 100%;\n  }\n  .navbar-form .control-label {\n    margin-bottom: 0;\n    vertical-align: middle;\n  }\n  .navbar-form .radio,\n  .navbar-form .checkbox {\n    display: inline-block;\n    margin-top: 0;\n    margin-bottom: 0;\n    vertical-align: middle;\n  }\n  .navbar-form .radio label,\n  .navbar-form .checkbox label {\n    padding-left: 0;\n  }\n  .navbar-form .radio input[type=\"radio\"],\n  .navbar-form .checkbox input[type=\"checkbox\"] {\n    position: relative;\n    margin-left: 0;\n  }\n  .navbar-form .has-feedback .form-control-feedback {\n    top: 0;\n  }\n}\n@media (max-width: 767px) {\n  .navbar-form .form-group {\n    margin-bottom: 5px;\n  }\n  .navbar-form .form-group:last-child {\n    margin-bottom: 0;\n  }\n}\n@media (min-width: 768px) {\n  .navbar-form {\n    width: auto;\n    border: 0;\n    margin-left: 0;\n    margin-right: 0;\n    padding-top: 0;\n    padding-bottom: 0;\n    -webkit-box-shadow: none;\n    box-shadow: none;\n  }\n}\n.navbar-nav > li > .dropdown-menu {\n  margin-top: 0;\n  border-top-right-radius: 0;\n  border-top-left-radius: 0;\n}\n.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu {\n  border-bottom-right-radius: 0;\n  border-bottom-left-radius: 0;\n}\n.navbar-btn {\n  margin-top: 8px;\n  margin-bottom: 8px;\n}\n.navbar-btn.btn-sm {\n  margin-top: 10px;\n  margin-bottom: 10px;\n}\n.navbar-btn.btn-xs {\n  margin-top: 14px;\n  margin-bottom: 14px;\n}\n.navbar-text {\n  margin-top: 15px;\n  margin-bottom: 15px;\n}\n@media (min-width: 768px) {\n  .navbar-text {\n    float: left;\n    margin-left: 15px;\n    margin-right: 15px;\n  }\n}\n@media (min-width: 768px) {\n  .navbar-left {\n    float: left !important;\n  }\n  .navbar-right {\n    float: right !important;\n    margin-right: -15px;\n  }\n  .navbar-right ~ .navbar-right {\n    margin-right: 0;\n  }\n}\n.navbar-default {\n  background-color: #f8f8f8;\n  border-color: #e7e7e7;\n}\n.navbar-default .navbar-brand {\n  color: #eeeeee;\n}\n.navbar-default .navbar-brand:hover,\n.navbar-default .navbar-brand:focus {\n  color: #d5d5d5;\n  background-color: transparent;\n}\n.navbar-default .navbar-text {\n  color: #777;\n}\n.navbar-default .navbar-nav > li > a {\n  color: #eeeeee;\n}\n.navbar-default .navbar-nav > li > a:hover,\n.navbar-default .navbar-nav > li > a:focus {\n  color: #4CAF50;\n  background-color: #eeeeee;\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: #eeeeee;\n}\n.navbar-default .navbar-nav > .disabled > a,\n.navbar-default .navbar-nav > .disabled > a:hover,\n.navbar-default .navbar-nav > .disabled > a:focus {\n  color: #ccc;\n  background-color: transparent;\n}\n.navbar-default .navbar-toggle {\n  border-color: #ddd;\n}\n.navbar-default .navbar-toggle:hover,\n.navbar-default .navbar-toggle:focus {\n  background-color: #ddd;\n}\n.navbar-default .navbar-toggle .icon-bar {\n  background-color: #888;\n}\n.navbar-default .navbar-collapse,\n.navbar-default .navbar-form {\n  border-color: #e7e7e7;\n}\n.navbar-default .navbar-nav > .open > a,\n.navbar-default .navbar-nav > .open > a:hover,\n.navbar-default .navbar-nav > .open > a:focus {\n  background-color: #e7e7e7;\n  color: #eeeeee;\n}\n@media (max-width: 767px) {\n  .navbar-default .navbar-nav .open .dropdown-menu > li > a {\n    color: #eeeeee;\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: #4CAF50;\n    background-color: #eeeeee;\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: #eeeeee;\n    background-color: #e7e7e7;\n  }\n  .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a,\n  .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover,\n  .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus {\n    color: #ccc;\n    background-color: transparent;\n  }\n}\n.navbar-default .navbar-link {\n  color: #eeeeee;\n}\n.navbar-default .navbar-link:hover {\n  color: #4CAF50;\n}\n.navbar-default .btn-link {\n  color: #eeeeee;\n}\n.navbar-default .btn-link:hover,\n.navbar-default .btn-link:focus {\n  color: #4CAF50;\n}\n.navbar-default .btn-link[disabled]:hover,\nfieldset[disabled] .navbar-default .btn-link:hover,\n.navbar-default .btn-link[disabled]:focus,\nfieldset[disabled] .navbar-default .btn-link:focus {\n  color: #ccc;\n}\n.navbar-inverse {\n  background-color: #222;\n  border-color: #080808;\n}\n.navbar-inverse .navbar-brand {\n  color: #777777;\n}\n.navbar-inverse .navbar-brand:hover,\n.navbar-inverse .navbar-brand:focus {\n  color: #eeeeee;\n  background-color: transparent;\n}\n.navbar-inverse .navbar-text {\n  color: #9d9d9d;\n}\n.navbar-inverse .navbar-nav > li > a {\n  color: #777777;\n}\n.navbar-inverse .navbar-nav > li > a:hover,\n.navbar-inverse .navbar-nav > li > a:focus {\n  color: #eeeeee;\n  background-color: transparent;\n}\n.navbar-inverse .navbar-nav > .active > a,\n.navbar-inverse .navbar-nav > .active > a:hover,\n.navbar-inverse .navbar-nav > .active > a:focus {\n  color: #eeeeee;\n  background-color: #080808;\n}\n.navbar-inverse .navbar-nav > .disabled > a,\n.navbar-inverse .navbar-nav > .disabled > a:hover,\n.navbar-inverse .navbar-nav > .disabled > a:focus {\n  color: #444;\n  background-color: transparent;\n}\n.navbar-inverse .navbar-toggle {\n  border-color: #333;\n}\n.navbar-inverse .navbar-toggle:hover,\n.navbar-inverse .navbar-toggle:focus {\n  background-color: #333;\n}\n.navbar-inverse .navbar-toggle .icon-bar {\n  background-color: #eeeeee;\n}\n.navbar-inverse .navbar-collapse,\n.navbar-inverse .navbar-form {\n  border-color: #101010;\n}\n.navbar-inverse .navbar-nav > .open > a,\n.navbar-inverse .navbar-nav > .open > a:hover,\n.navbar-inverse .navbar-nav > .open > a:focus {\n  background-color: #080808;\n  color: #eeeeee;\n}\n@media (max-width: 767px) {\n  .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header {\n    border-color: #080808;\n  }\n  .navbar-inverse .navbar-nav .open .dropdown-menu .divider {\n    background-color: #080808;\n  }\n  .navbar-inverse .navbar-nav .open .dropdown-menu > li > a {\n    color: #777777;\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: #eeeeee;\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: #eeeeee;\n    background-color: #080808;\n  }\n  .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a,\n  .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover,\n  .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus {\n    color: #444;\n    background-color: transparent;\n  }\n}\n.navbar-inverse .navbar-link {\n  color: #777777;\n}\n.navbar-inverse .navbar-link:hover {\n  color: #eeeeee;\n}\n.navbar-inverse .btn-link {\n  color: #777777;\n}\n.navbar-inverse .btn-link:hover,\n.navbar-inverse .btn-link:focus {\n  color: #eeeeee;\n}\n.navbar-inverse .btn-link[disabled]:hover,\nfieldset[disabled] .navbar-inverse .btn-link:hover,\n.navbar-inverse .btn-link[disabled]:focus,\nfieldset[disabled] .navbar-inverse .btn-link:focus {\n  color: #444;\n}\n.breadcrumb {\n  padding: 8px 15px;\n  margin-bottom: 20px;\n  list-style: none;\n  background-color: #f5f5f5;\n  border-radius: 4px;\n}\n.breadcrumb > li {\n  display: inline-block;\n}\n.breadcrumb > li + li:before {\n  content: \"/\\00a0\";\n  padding: 0 5px;\n  color: #ccc;\n}\n.breadcrumb > .active {\n  color: #777777;\n}\n.pagination {\n  display: inline-block;\n  padding-left: 0;\n  margin: 20px 0;\n  border-radius: 4px;\n}\n.pagination > li {\n  display: inline;\n}\n.pagination > li > a,\n.pagination > li > span {\n  position: relative;\n  float: left;\n  padding: 6px 12px;\n  line-height: 1.42857143;\n  text-decoration: none;\n  color: #4CAF50;\n  background-color: #eeeeee;\n  border: 1px solid #ddd;\n  margin-left: -1px;\n}\n.pagination > li:first-child > a,\n.pagination > li:first-child > span {\n  margin-left: 0;\n  border-bottom-left-radius: 4px;\n  border-top-left-radius: 4px;\n}\n.pagination > li:last-child > a,\n.pagination > li:last-child > span {\n  border-bottom-right-radius: 4px;\n  border-top-right-radius: 4px;\n}\n.pagination > li > a:hover,\n.pagination > li > span:hover,\n.pagination > li > a:focus,\n.pagination > li > span:focus {\n  color: #357a38;\n  background-color: #eeeeee;\n  border-color: #ddd;\n}\n.pagination > .active > a,\n.pagination > .active > span,\n.pagination > .active > a:hover,\n.pagination > .active > span:hover,\n.pagination > .active > a:focus,\n.pagination > .active > span:focus {\n  z-index: 2;\n  color: #eeeeee;\n  background-color: #4CAF50;\n  border-color: #4CAF50;\n  cursor: default;\n}\n.pagination > .disabled > span,\n.pagination > .disabled > span:hover,\n.pagination > .disabled > span:focus,\n.pagination > .disabled > a,\n.pagination > .disabled > a:hover,\n.pagination > .disabled > a:focus {\n  color: #777777;\n  background-color: #eeeeee;\n  border-color: #ddd;\n  cursor: not-allowed;\n}\n.pagination-lg > li > a,\n.pagination-lg > li > span {\n  padding: 10px 16px;\n  font-size: 18px;\n}\n.pagination-lg > li:first-child > a,\n.pagination-lg > li:first-child > span {\n  border-bottom-left-radius: 6px;\n  border-top-left-radius: 6px;\n}\n.pagination-lg > li:last-child > a,\n.pagination-lg > li:last-child > span {\n  border-bottom-right-radius: 6px;\n  border-top-right-radius: 6px;\n}\n.pagination-sm > li > a,\n.pagination-sm > li > span {\n  padding: 5px 10px;\n  font-size: 12px;\n}\n.pagination-sm > li:first-child > a,\n.pagination-sm > li:first-child > span {\n  border-bottom-left-radius: 3px;\n  border-top-left-radius: 3px;\n}\n.pagination-sm > li:last-child > a,\n.pagination-sm > li:last-child > span {\n  border-bottom-right-radius: 3px;\n  border-top-right-radius: 3px;\n}\n.pager {\n  padding-left: 0;\n  margin: 20px 0;\n  list-style: none;\n  text-align: center;\n}\n.pager li {\n  display: inline;\n}\n.pager li > a,\n.pager li > span {\n  display: inline-block;\n  padding: 5px 14px;\n  background-color: #eeeeee;\n  border: 1px solid #ddd;\n  border-radius: 15px;\n}\n.pager li > a:hover,\n.pager li > a:focus {\n  text-decoration: none;\n  background-color: #eeeeee;\n}\n.pager .next > a,\n.pager .next > span {\n  float: right;\n}\n.pager .previous > a,\n.pager .previous > span {\n  float: left;\n}\n.pager .disabled > a,\n.pager .disabled > a:hover,\n.pager .disabled > a:focus,\n.pager .disabled > span {\n  color: #777777;\n  background-color: #eeeeee;\n  cursor: not-allowed;\n}\n.label {\n  display: inline;\n  padding: .2em .6em .3em;\n  font-size: 75%;\n  font-weight: bold;\n  line-height: 1;\n  color: #eeeeee;\n  text-align: center;\n  white-space: nowrap;\n  vertical-align: baseline;\n  border-radius: .25em;\n}\na.label:hover,\na.label:focus {\n  color: #eeeeee;\n  text-decoration: none;\n  cursor: pointer;\n}\n.label:empty {\n  display: none;\n}\n.btn .label {\n  position: relative;\n  top: -1px;\n}\n.label-default {\n  background-color: #777777;\n}\n.label-default[href]:hover,\n.label-default[href]:focus {\n  background-color: #5e5e5e;\n}\n.label-primary {\n  background-color: #4CAF50;\n}\n.label-primary[href]:hover,\n.label-primary[href]:focus {\n  background-color: #3d8b40;\n}\n.label-success {\n  background-color: #457E86;\n}\n.label-success[href]:hover,\n.label-success[href]:focus {\n  background-color: #345e64;\n}\n.label-info {\n  background-color: #4A2B0F;\n}\n.label-info[href]:hover,\n.label-info[href]:focus {\n  background-color: #201206;\n}\n.label-warning {\n  background-color: #f0ad4e;\n}\n.label-warning[href]:hover,\n.label-warning[href]:focus {\n  background-color: #ec971f;\n}\n.label-danger {\n  background-color: #d9534f;\n}\n.label-danger[href]:hover,\n.label-danger[href]:focus {\n  background-color: #c9302c;\n}\n.badge {\n  display: inline-block;\n  min-width: 10px;\n  padding: 3px 7px;\n  font-size: 12px;\n  font-weight: bold;\n  color: #eeeeee;\n  line-height: 1;\n  vertical-align: baseline;\n  white-space: nowrap;\n  text-align: center;\n  background-color: #777777;\n  border-radius: 10px;\n}\n.badge:empty {\n  display: none;\n}\n.btn .badge {\n  position: relative;\n  top: -1px;\n}\n.btn-xs .badge {\n  top: 0;\n  padding: 1px 5px;\n}\na.badge:hover,\na.badge:focus {\n  color: #eeeeee;\n  text-decoration: none;\n  cursor: pointer;\n}\na.list-group-item.active > .badge,\n.nav-pills > .active > a > .badge {\n  color: #4CAF50;\n  background-color: #eeeeee;\n}\n.nav-pills > li > a > .badge {\n  margin-left: 3px;\n}\n.jumbotron {\n  padding: 30px 15px;\n  margin-bottom: 30px;\n  color: inherit;\n  background-color: #eeeeee;\n}\n.jumbotron h1,\n.jumbotron .h1 {\n  color: inherit;\n}\n.jumbotron p {\n  margin-bottom: 15px;\n  font-size: 21px;\n  font-weight: 200;\n}\n.jumbotron > hr {\n  border-top-color: #d5d5d5;\n}\n.container .jumbotron,\n.container-fluid .jumbotron {\n  border-radius: 6px;\n}\n.jumbotron .container {\n  max-width: 100%;\n}\n@media screen and (min-width: 768px) {\n  .jumbotron {\n    padding: 48px 0;\n  }\n  .container .jumbotron {\n    padding-left: 60px;\n    padding-right: 60px;\n  }\n  .jumbotron h1,\n  .jumbotron .h1 {\n    font-size: 63px;\n  }\n}\n.thumbnail {\n  display: block;\n  padding: 4px;\n  margin-bottom: 20px;\n  line-height: 1.42857143;\n  background-color: #ffffff;\n  border: 1px solid #ddd;\n  border-radius: 4px;\n  -webkit-transition: border 0.2s ease-in-out;\n  -o-transition: border 0.2s ease-in-out;\n  transition: border 0.2s ease-in-out;\n}\n.thumbnail > img,\n.thumbnail a > img {\n  margin-left: auto;\n  margin-right: auto;\n}\na.thumbnail:hover,\na.thumbnail:focus,\na.thumbnail.active {\n  border-color: #4CAF50;\n}\n.thumbnail .caption {\n  padding: 9px;\n  color: #333333;\n}\n.alert {\n  padding: 15px;\n  margin-bottom: 20px;\n  border: 1px solid transparent;\n  border-radius: 4px;\n}\n.alert h4 {\n  margin-top: 0;\n  color: inherit;\n}\n.alert .alert-link {\n  font-weight: bold;\n}\n.alert > p,\n.alert > ul {\n  margin-bottom: 0;\n}\n.alert > p + p {\n  margin-top: 5px;\n}\n.alert-dismissable,\n.alert-dismissible {\n  padding-right: 35px;\n}\n.alert-dismissable .close,\n.alert-dismissible .close {\n  position: relative;\n  top: -2px;\n  right: -21px;\n  color: inherit;\n}\n.alert-success {\n  background-color: #dff0d8;\n  border-color: #d6e9c6;\n  color: #215f1e;\n}\n.alert-success hr {\n  border-top-color: #c9e2b3;\n}\n.alert-success .alert-link {\n  color: #143812;\n}\n.alert-info {\n  background-color: #d9edf7;\n  border-color: #bce8f1;\n  color: #31708f;\n}\n.alert-info hr {\n  border-top-color: #a6e1ec;\n}\n.alert-info .alert-link {\n  color: #245269;\n}\n.alert-warning {\n  background-color: #fcf8e3;\n  border-color: #faebcc;\n  color: #8a6d3b;\n}\n.alert-warning hr {\n  border-top-color: #f7e1b5;\n}\n.alert-warning .alert-link {\n  color: #66512c;\n}\n.alert-danger {\n  background-color: #f2dede;\n  border-color: #ebccd1;\n  color: #a94442;\n}\n.alert-danger hr {\n  border-top-color: #e4b9c0;\n}\n.alert-danger .alert-link {\n  color: #843534;\n}\n@-webkit-keyframes progress-bar-stripes {\n  from {\n    background-position: 40px 0;\n  }\n  to {\n    background-position: 0 0;\n  }\n}\n@keyframes progress-bar-stripes {\n  from {\n    background-position: 40px 0;\n  }\n  to {\n    background-position: 0 0;\n  }\n}\n.progress {\n  overflow: hidden;\n  height: 20px;\n  margin-bottom: 20px;\n  background-color: #f5f5f5;\n  border-radius: 4px;\n  -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);\n  box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);\n}\n.progress-bar {\n  float: left;\n  width: 0%;\n  height: 100%;\n  font-size: 12px;\n  line-height: 20px;\n  color: #eeeeee;\n  text-align: center;\n  background-color: #4CAF50;\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  -o-transition: width 0.6s ease;\n  transition: width 0.6s ease;\n}\n.progress-striped .progress-bar,\n.progress-bar-striped {\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: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-size: 40px 40px;\n}\n.progress.active .progress-bar,\n.progress-bar.active {\n  -webkit-animation: progress-bar-stripes 2s linear infinite;\n  -o-animation: progress-bar-stripes 2s linear infinite;\n  animation: progress-bar-stripes 2s linear infinite;\n}\n.progress-bar-success {\n  background-color: #457E86;\n}\n.progress-striped .progress-bar-success {\n  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.progress-bar-info {\n  background-color: #4A2B0F;\n}\n.progress-striped .progress-bar-info {\n  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.progress-bar-warning {\n  background-color: #f0ad4e;\n}\n.progress-striped .progress-bar-warning {\n  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.progress-bar-danger {\n  background-color: #d9534f;\n}\n.progress-striped .progress-bar-danger {\n  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.media {\n  margin-top: 15px;\n}\n.media:first-child {\n  margin-top: 0;\n}\n.media-right,\n.media > .pull-right {\n  padding-left: 10px;\n}\n.media-left,\n.media > .pull-left {\n  padding-right: 10px;\n}\n.media-left,\n.media-right,\n.media-body {\n  display: table-cell;\n  vertical-align: top;\n}\n.media-middle {\n  vertical-align: middle;\n}\n.media-bottom {\n  vertical-align: bottom;\n}\n.media-heading {\n  margin-top: 0;\n  margin-bottom: 5px;\n}\n.media-list {\n  padding-left: 0;\n  list-style: none;\n}\n.list-group {\n  margin-bottom: 20px;\n  padding-left: 0;\n}\n.list-group-item {\n  position: relative;\n  display: block;\n  padding: 10px 15px;\n  margin-bottom: -1px;\n  background-color: #ffffff;\n  border: 1px solid #ddd;\n}\n.list-group-item:first-child {\n  border-top-right-radius: 4px;\n  border-top-left-radius: 4px;\n}\n.list-group-item:last-child {\n  margin-bottom: 0;\n  border-bottom-right-radius: 4px;\n  border-bottom-left-radius: 4px;\n}\n.list-group-item > .badge {\n  float: right;\n}\n.list-group-item > .badge + .badge {\n  margin-right: 5px;\n}\na.list-group-item {\n  color: #555;\n}\na.list-group-item .list-group-item-heading {\n  color: #333;\n}\na.list-group-item:hover,\na.list-group-item:focus {\n  text-decoration: none;\n  color: #555;\n  background-color: #f5f5f5;\n}\n.list-group-item.disabled,\n.list-group-item.disabled:hover,\n.list-group-item.disabled:focus {\n  background-color: #eeeeee;\n  color: #777777;\n  cursor: not-allowed;\n}\n.list-group-item.disabled .list-group-item-heading,\n.list-group-item.disabled:hover .list-group-item-heading,\n.list-group-item.disabled:focus .list-group-item-heading {\n  color: inherit;\n}\n.list-group-item.disabled .list-group-item-text,\n.list-group-item.disabled:hover .list-group-item-text,\n.list-group-item.disabled:focus .list-group-item-text {\n  color: #777777;\n}\n.list-group-item.active,\n.list-group-item.active:hover,\n.list-group-item.active:focus {\n  z-index: 2;\n  color: #eeeeee;\n  background-color: #4CAF50;\n  border-color: #4CAF50;\n}\n.list-group-item.active .list-group-item-heading,\n.list-group-item.active:hover .list-group-item-heading,\n.list-group-item.active:focus .list-group-item-heading,\n.list-group-item.active .list-group-item-heading > small,\n.list-group-item.active:hover .list-group-item-heading > small,\n.list-group-item.active:focus .list-group-item-heading > small,\n.list-group-item.active .list-group-item-heading > .small,\n.list-group-item.active:hover .list-group-item-heading > .small,\n.list-group-item.active:focus .list-group-item-heading > .small {\n  color: inherit;\n}\n.list-group-item.active .list-group-item-text,\n.list-group-item.active:hover .list-group-item-text,\n.list-group-item.active:focus .list-group-item-text {\n  color: #d9eeda;\n}\n.list-group-item-success {\n  color: #215f1e;\n  background-color: #dff0d8;\n}\na.list-group-item-success {\n  color: #215f1e;\n}\na.list-group-item-success .list-group-item-heading {\n  color: inherit;\n}\na.list-group-item-success:hover,\na.list-group-item-success:focus {\n  color: #215f1e;\n  background-color: #d0e9c6;\n}\na.list-group-item-success.active,\na.list-group-item-success.active:hover,\na.list-group-item-success.active:focus {\n  color: #fff;\n  background-color: #215f1e;\n  border-color: #215f1e;\n}\n.list-group-item-info {\n  color: #31708f;\n  background-color: #d9edf7;\n}\na.list-group-item-info {\n  color: #31708f;\n}\na.list-group-item-info .list-group-item-heading {\n  color: inherit;\n}\na.list-group-item-info:hover,\na.list-group-item-info:focus {\n  color: #31708f;\n  background-color: #c4e3f3;\n}\na.list-group-item-info.active,\na.list-group-item-info.active:hover,\na.list-group-item-info.active:focus {\n  color: #fff;\n  background-color: #31708f;\n  border-color: #31708f;\n}\n.list-group-item-warning {\n  color: #8a6d3b;\n  background-color: #fcf8e3;\n}\na.list-group-item-warning {\n  color: #8a6d3b;\n}\na.list-group-item-warning .list-group-item-heading {\n  color: inherit;\n}\na.list-group-item-warning:hover,\na.list-group-item-warning:focus {\n  color: #8a6d3b;\n  background-color: #faf2cc;\n}\na.list-group-item-warning.active,\na.list-group-item-warning.active:hover,\na.list-group-item-warning.active:focus {\n  color: #fff;\n  background-color: #8a6d3b;\n  border-color: #8a6d3b;\n}\n.list-group-item-danger {\n  color: #a94442;\n  background-color: #f2dede;\n}\na.list-group-item-danger {\n  color: #a94442;\n}\na.list-group-item-danger .list-group-item-heading {\n  color: inherit;\n}\na.list-group-item-danger:hover,\na.list-group-item-danger:focus {\n  color: #a94442;\n  background-color: #ebcccc;\n}\na.list-group-item-danger.active,\na.list-group-item-danger.active:hover,\na.list-group-item-danger.active:focus {\n  color: #fff;\n  background-color: #a94442;\n  border-color: #a94442;\n}\n.list-group-item-heading {\n  margin-top: 0;\n  margin-bottom: 5px;\n}\n.list-group-item-text {\n  margin-bottom: 0;\n  line-height: 1.3;\n}\n.panel {\n  margin-bottom: 20px;\n  background-color: #eeeeee;\n  border: 1px solid transparent;\n  border-radius: 4px;\n  -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05);\n  box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05);\n}\n.panel-body {\n  padding: 15px;\n}\n.panel-heading {\n  padding: 10px 15px;\n  border-bottom: 1px solid transparent;\n  border-top-right-radius: 3px;\n  border-top-left-radius: 3px;\n}\n.panel-heading > .dropdown .dropdown-toggle {\n  color: inherit;\n}\n.panel-title {\n  margin-top: 0;\n  margin-bottom: 0;\n  font-size: 16px;\n  color: inherit;\n}\n.panel-title > a {\n  color: inherit;\n}\n.panel-footer {\n  padding: 10px 15px;\n  background-color: #dedede;\n  border-top: 1px solid #ccc;\n  border-bottom-right-radius: 3px;\n  border-bottom-left-radius: 3px;\n}\n.panel > .list-group,\n.panel > .panel-collapse > .list-group {\n  margin-bottom: 0;\n}\n.panel > .list-group .list-group-item,\n.panel > .panel-collapse > .list-group .list-group-item {\n  border-width: 1px 0;\n  border-radius: 0;\n}\n.panel > .list-group:first-child .list-group-item:first-child,\n.panel > .panel-collapse > .list-group:first-child .list-group-item:first-child {\n  border-top: 0;\n  border-top-right-radius: 3px;\n  border-top-left-radius: 3px;\n}\n.panel > .list-group:last-child .list-group-item:last-child,\n.panel > .panel-collapse > .list-group:last-child .list-group-item:last-child {\n  border-bottom: 0;\n  border-bottom-right-radius: 3px;\n  border-bottom-left-radius: 3px;\n}\n.panel-heading + .list-group .list-group-item:first-child {\n  border-top-width: 0;\n}\n.list-group + .panel-footer {\n  border-top-width: 0;\n}\n.panel > .table,\n.panel > .table-responsive > .table,\n.panel > .panel-collapse > .table {\n  margin-bottom: 0;\n}\n.panel > .table caption,\n.panel > .table-responsive > .table caption,\n.panel > .panel-collapse > .table caption {\n  padding-left: 15px;\n  padding-right: 15px;\n}\n.panel > .table:first-child,\n.panel > .table-responsive:first-child > .table:first-child {\n  border-top-right-radius: 3px;\n  border-top-left-radius: 3px;\n}\n.panel > .table:first-child > thead:first-child > tr:first-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child {\n  border-top-left-radius: 3px;\n  border-top-right-radius: 3px;\n}\n.panel > .table:first-child > thead:first-child > tr:first-child td:first-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:first-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child td:first-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:first-child,\n.panel > .table:first-child > thead:first-child > tr:first-child th:first-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:first-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child th:first-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:first-child {\n  border-top-left-radius: 3px;\n}\n.panel > .table:first-child > thead:first-child > tr:first-child td:last-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:last-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child td:last-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:last-child,\n.panel > .table:first-child > thead:first-child > tr:first-child th:last-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:last-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child th:last-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:last-child {\n  border-top-right-radius: 3px;\n}\n.panel > .table:last-child,\n.panel > .table-responsive:last-child > .table:last-child {\n  border-bottom-right-radius: 3px;\n  border-bottom-left-radius: 3px;\n}\n.panel > .table:last-child > tbody:last-child > tr:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child {\n  border-bottom-left-radius: 3px;\n  border-bottom-right-radius: 3px;\n}\n.panel > .table:last-child > tbody:last-child > tr:last-child td:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:first-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child td:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:first-child,\n.panel > .table:last-child > tbody:last-child > tr:last-child th:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:first-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child th:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:first-child {\n  border-bottom-left-radius: 3px;\n}\n.panel > .table:last-child > tbody:last-child > tr:last-child td:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:last-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child td:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:last-child,\n.panel > .table:last-child > tbody:last-child > tr:last-child th:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:last-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child th:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:last-child {\n  border-bottom-right-radius: 3px;\n}\n.panel > .panel-body + .table,\n.panel > .panel-body + .table-responsive,\n.panel > .table + .panel-body,\n.panel > .table-responsive + .panel-body {\n  border-top: 1px solid #ddd;\n}\n.panel > .table > tbody:first-child > tr:first-child th,\n.panel > .table > tbody:first-child > tr:first-child td {\n  border-top: 0;\n}\n.panel > .table-bordered,\n.panel > .table-responsive > .table-bordered {\n  border: 0;\n}\n.panel > .table-bordered > thead > tr > th:first-child,\n.panel > .table-responsive > .table-bordered > thead > tr > th:first-child,\n.panel > .table-bordered > tbody > tr > th:first-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > th:first-child,\n.panel > .table-bordered > tfoot > tr > th:first-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > th:first-child,\n.panel > .table-bordered > thead > tr > td:first-child,\n.panel > .table-responsive > .table-bordered > thead > tr > td:first-child,\n.panel > .table-bordered > tbody > tr > td:first-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > td:first-child,\n.panel > .table-bordered > tfoot > tr > td:first-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > td:first-child {\n  border-left: 0;\n}\n.panel > .table-bordered > thead > tr > th:last-child,\n.panel > .table-responsive > .table-bordered > thead > tr > th:last-child,\n.panel > .table-bordered > tbody > tr > th:last-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > th:last-child,\n.panel > .table-bordered > tfoot > tr > th:last-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > th:last-child,\n.panel > .table-bordered > thead > tr > td:last-child,\n.panel > .table-responsive > .table-bordered > thead > tr > td:last-child,\n.panel > .table-bordered > tbody > tr > td:last-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > td:last-child,\n.panel > .table-bordered > tfoot > tr > td:last-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > td:last-child {\n  border-right: 0;\n}\n.panel > .table-bordered > thead > tr:first-child > td,\n.panel > .table-responsive > .table-bordered > thead > tr:first-child > td,\n.panel > .table-bordered > tbody > tr:first-child > td,\n.panel > .table-responsive > .table-bordered > tbody > tr:first-child > td,\n.panel > .table-bordered > thead > tr:first-child > th,\n.panel > .table-responsive > .table-bordered > thead > tr:first-child > th,\n.panel > .table-bordered > tbody > tr:first-child > th,\n.panel > .table-responsive > .table-bordered > tbody > tr:first-child > th {\n  border-bottom: 0;\n}\n.panel > .table-bordered > tbody > tr:last-child > td,\n.panel > .table-responsive > .table-bordered > tbody > tr:last-child > td,\n.panel > .table-bordered > tfoot > tr:last-child > td,\n.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > td,\n.panel > .table-bordered > tbody > tr:last-child > th,\n.panel > .table-responsive > .table-bordered > tbody > tr:last-child > th,\n.panel > .table-bordered > tfoot > tr:last-child > th,\n.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > th {\n  border-bottom: 0;\n}\n.panel > .table-responsive {\n  border: 0;\n  margin-bottom: 0;\n}\n.panel-group {\n  margin-bottom: 20px;\n}\n.panel-group .panel {\n  margin-bottom: 0;\n  border-radius: 4px;\n}\n.panel-group .panel + .panel {\n  margin-top: 5px;\n}\n.panel-group .panel-heading {\n  border-bottom: 0;\n}\n.panel-group .panel-heading + .panel-collapse > .panel-body,\n.panel-group .panel-heading + .panel-collapse > .list-group {\n  border-top: 1px solid #ccc;\n}\n.panel-group .panel-footer {\n  border-top: 0;\n}\n.panel-group .panel-footer + .panel-collapse .panel-body {\n  border-bottom: 1px solid #ccc;\n}\n.panel-default {\n  border-color: #ddd;\n}\n.panel-default > .panel-heading {\n  color: #333333;\n  background-color: #f5f5f5;\n  border-color: #ddd;\n}\n.panel-default > .panel-heading + .panel-collapse > .panel-body {\n  border-top-color: #ddd;\n}\n.panel-default > .panel-heading .badge {\n  color: #f5f5f5;\n  background-color: #333333;\n}\n.panel-default > .panel-footer + .panel-collapse > .panel-body {\n  border-bottom-color: #ddd;\n}\n.panel-primary {\n  border-color: #4CAF50;\n}\n.panel-primary > .panel-heading {\n  color: #eeeeee;\n  background-color: #4CAF50;\n  border-color: #4CAF50;\n}\n.panel-primary > .panel-heading + .panel-collapse > .panel-body {\n  border-top-color: #4CAF50;\n}\n.panel-primary > .panel-heading .badge {\n  color: #4CAF50;\n  background-color: #eeeeee;\n}\n.panel-primary > .panel-footer + .panel-collapse > .panel-body {\n  border-bottom-color: #4CAF50;\n}\n.panel-success {\n  border-color: #d6e9c6;\n}\n.panel-success > .panel-heading {\n  color: #215f1e;\n  background-color: #dff0d8;\n  border-color: #d6e9c6;\n}\n.panel-success > .panel-heading + .panel-collapse > .panel-body {\n  border-top-color: #d6e9c6;\n}\n.panel-success > .panel-heading .badge {\n  color: #dff0d8;\n  background-color: #215f1e;\n}\n.panel-success > .panel-footer + .panel-collapse > .panel-body {\n  border-bottom-color: #d6e9c6;\n}\n.panel-info {\n  border-color: #449d48;\n}\n.panel-info > .panel-heading {\n  color: #eeeeee;\n  background-color: #4CAF50;\n  border-color: #449d48;\n}\n.panel-info > .panel-heading + .panel-collapse > .panel-body {\n  border-top-color: #449d48;\n}\n.panel-info > .panel-heading .badge {\n  color: #4CAF50;\n  background-color: #eeeeee;\n}\n.panel-info > .panel-footer + .panel-collapse > .panel-body {\n  border-bottom-color: #449d48;\n}\n.panel-warning {\n  border-color: #faebcc;\n}\n.panel-warning > .panel-heading {\n  color: #8a6d3b;\n  background-color: #fcf8e3;\n  border-color: #faebcc;\n}\n.panel-warning > .panel-heading + .panel-collapse > .panel-body {\n  border-top-color: #faebcc;\n}\n.panel-warning > .panel-heading .badge {\n  color: #fcf8e3;\n  background-color: #8a6d3b;\n}\n.panel-warning > .panel-footer + .panel-collapse > .panel-body {\n  border-bottom-color: #faebcc;\n}\n.panel-danger {\n  border-color: #ebccd1;\n}\n.panel-danger > .panel-heading {\n  color: #a94442;\n  background-color: #f2dede;\n  border-color: #ebccd1;\n}\n.panel-danger > .panel-heading + .panel-collapse > .panel-body {\n  border-top-color: #ebccd1;\n}\n.panel-danger > .panel-heading .badge {\n  color: #f2dede;\n  background-color: #a94442;\n}\n.panel-danger > .panel-footer + .panel-collapse > .panel-body {\n  border-bottom-color: #ebccd1;\n}\n.embed-responsive {\n  position: relative;\n  display: block;\n  height: 0;\n  padding: 0;\n  overflow: hidden;\n}\n.embed-responsive .embed-responsive-item,\n.embed-responsive iframe,\n.embed-responsive embed,\n.embed-responsive object,\n.embed-responsive video {\n  position: absolute;\n  top: 0;\n  left: 0;\n  bottom: 0;\n  height: 100%;\n  width: 100%;\n  border: 0;\n}\n.embed-responsive.embed-responsive-16by9 {\n  padding-bottom: 56.25%;\n}\n.embed-responsive.embed-responsive-4by3 {\n  padding-bottom: 75%;\n}\n.well {\n  min-height: 20px;\n  padding: 19px;\n  margin-bottom: 20px;\n  background-color: #f5f5f5;\n  border: 1px solid #e3e3e3;\n  border-radius: 4px;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);\n  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);\n}\n.well blockquote {\n  border-color: #ddd;\n  border-color: rgba(0, 0, 0, 0.15);\n}\n.well-lg {\n  padding: 24px;\n  border-radius: 6px;\n}\n.well-sm {\n  padding: 9px;\n  border-radius: 3px;\n}\n.close {\n  float: right;\n  font-size: 21px;\n  font-weight: bold;\n  line-height: 1;\n  color: #000;\n  text-shadow: 0 1px 0 #eeeeee;\n  opacity: 0.2;\n  -ms-filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=20);\n  filter: alpha(opacity=20);\n}\n.close:hover,\n.close:focus {\n  color: #000;\n  text-decoration: none;\n  cursor: pointer;\n  opacity: 0.5;\n  -ms-filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=50);\n  filter: alpha(opacity=50);\n}\nbutton.close {\n  padding: 0;\n  cursor: pointer;\n  background: transparent;\n  border: 0;\n  -webkit-appearance: none;\n}\n.modal-open {\n  overflow: hidden;\n}\n.modal {\n  display: none;\n  overflow: hidden;\n  position: fixed;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  z-index: 1040;\n  -webkit-overflow-scrolling: touch;\n  outline: 0;\n}\n.modal.fade .modal-dialog {\n  -webkit-transform: translate(0, -25%);\n  -ms-transform: translate(0, -25%);\n  -o-transform: translate(0, -25%);\n  transform: translate(0, -25%);\n  -webkit-transition: -webkit-transform 0.3s ease-out;\n  -moz-transition: -moz-transform 0.3s ease-out;\n  -o-transition: -o-transform 0.3s ease-out;\n  transition: transform 0.3s ease-out;\n}\n.modal.in .modal-dialog {\n  -webkit-transform: translate(0, 0);\n  -ms-transform: translate(0, 0);\n  -o-transform: translate(0, 0);\n  transform: translate(0, 0);\n}\n.modal-open .modal {\n  overflow-x: hidden;\n  overflow-y: auto;\n}\n.modal-dialog {\n  position: relative;\n  width: auto;\n  margin: 10px;\n}\n.modal-content {\n  position: relative;\n  background-color: #eeeeee;\n  border: 1px solid #999;\n  border: 1px solid rgba(0, 0, 0, 0.2);\n  border-radius: 6px;\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  outline: 0;\n}\n.modal-backdrop {\n  position: fixed;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  background-color: #000;\n}\n.modal-backdrop.fade {\n  opacity: 0;\n  -ms-filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=0);\n  filter: alpha(opacity=0);\n}\n.modal-backdrop.in {\n  opacity: 0.5;\n  -ms-filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=50);\n  filter: alpha(opacity=50);\n}\n.modal-header {\n  padding: 15px;\n  border-bottom: 1px solid #e5e5e5;\n  min-height: 16.42857143px;\n}\n.modal-header .close {\n  margin-top: -2px;\n}\n.modal-title {\n  margin: 0;\n  line-height: 1.42857143;\n}\n.modal-body {\n  position: relative;\n  padding: 15px;\n}\n.modal-footer {\n  padding: 15px;\n  text-align: right;\n  border-top: 1px solid #e5e5e5;\n}\n.modal-footer .btn + .btn {\n  margin-left: 5px;\n  margin-bottom: 0;\n}\n.modal-footer .btn-group .btn + .btn {\n  margin-left: -1px;\n}\n.modal-footer .btn-block + .btn-block {\n  margin-left: 0;\n}\n.modal-scrollbar-measure {\n  position: absolute;\n  top: -9999px;\n  width: 50px;\n  height: 50px;\n  overflow: scroll;\n}\n@media (min-width: 768px) {\n  .modal-dialog {\n    width: 600px;\n    margin: 30px auto;\n  }\n  .modal-content {\n    -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  .modal-sm {\n    width: 300px;\n  }\n}\n@media (min-width: 1031px) {\n  .modal-lg {\n    width: 900px;\n  }\n}\n.tooltip {\n  position: absolute;\n  z-index: 1070;\n  display: block;\n  visibility: visible;\n  font-size: 12px;\n  line-height: 1.4;\n  opacity: 0;\n  -ms-filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=0);\n  filter: alpha(opacity=0);\n}\n.tooltip.in {\n  opacity: 0.9;\n  -ms-filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=90);\n  filter: alpha(opacity=90);\n}\n.tooltip.top {\n  margin-top: -3px;\n  padding: 5px 0;\n}\n.tooltip.right {\n  margin-left: 3px;\n  padding: 0 5px;\n}\n.tooltip.bottom {\n  margin-top: 3px;\n  padding: 5px 0;\n}\n.tooltip.left {\n  margin-left: -3px;\n  padding: 0 5px;\n}\n.tooltip-inner {\n  max-width: 200px;\n  padding: 3px 8px;\n  color: #eeeeee;\n  text-align: center;\n  text-decoration: none;\n  background-color: #000;\n  border-radius: 4px;\n}\n.tooltip-arrow {\n  position: absolute;\n  width: 0;\n  height: 0;\n  border-color: transparent;\n  border-style: solid;\n}\n.tooltip.top .tooltip-arrow {\n  bottom: 0;\n  left: 50%;\n  margin-left: -5px;\n  border-width: 5px 5px 0;\n  border-top-color: #000;\n}\n.tooltip.top-left .tooltip-arrow {\n  bottom: 0;\n  left: 5px;\n  border-width: 5px 5px 0;\n  border-top-color: #000;\n}\n.tooltip.top-right .tooltip-arrow {\n  bottom: 0;\n  right: 5px;\n  border-width: 5px 5px 0;\n  border-top-color: #000;\n}\n.tooltip.right .tooltip-arrow {\n  top: 50%;\n  left: 0;\n  margin-top: -5px;\n  border-width: 5px 5px 5px 0;\n  border-right-color: #000;\n}\n.tooltip.left .tooltip-arrow {\n  top: 50%;\n  right: 0;\n  margin-top: -5px;\n  border-width: 5px 0 5px 5px;\n  border-left-color: #000;\n}\n.tooltip.bottom .tooltip-arrow {\n  top: 0;\n  left: 50%;\n  margin-left: -5px;\n  border-width: 0 5px 5px;\n  border-bottom-color: #000;\n}\n.tooltip.bottom-left .tooltip-arrow {\n  top: 0;\n  left: 5px;\n  border-width: 0 5px 5px;\n  border-bottom-color: #000;\n}\n.tooltip.bottom-right .tooltip-arrow {\n  top: 0;\n  right: 5px;\n  border-width: 0 5px 5px;\n  border-bottom-color: #000;\n}\n.popover {\n  position: absolute;\n  top: 0;\n  left: 0;\n  z-index: 1060;\n  display: none;\n  max-width: 276px;\n  padding: 1px;\n  font-size: 14px;\n  font-weight: normal;\n  line-height: 1.42857143;\n  text-align: left;\n  background-color: #eeeeee;\n  background-clip: padding-box;\n  border: 1px solid #ccc;\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  white-space: normal;\n}\n.popover.top {\n  margin-top: -10px;\n}\n.popover.right {\n  margin-left: 10px;\n}\n.popover.bottom {\n  margin-top: 10px;\n}\n.popover.left {\n  margin-left: -10px;\n}\n.popover-title {\n  margin: 0;\n  padding: 8px 14px;\n  font-size: 14px;\n  background-color: #e7e7e7;\n  border-bottom: 1px solid #dadada;\n  border-radius: 5px 5px 0 0;\n}\n.popover-content {\n  padding: 9px 14px;\n}\n.popover > .arrow,\n.popover > .arrow:after {\n  position: absolute;\n  display: block;\n  width: 0;\n  height: 0;\n  border-color: transparent;\n  border-style: solid;\n}\n.popover > .arrow {\n  border-width: 11px;\n}\n.popover > .arrow:after {\n  border-width: 10px;\n  content: \"\";\n}\n.popover.top > .arrow {\n  left: 50%;\n  margin-left: -11px;\n  border-bottom-width: 0;\n  border-top-color: #999999;\n  border-top-color: rgba(0, 0, 0, 0.25);\n  bottom: -11px;\n}\n.popover.top > .arrow:after {\n  content: \" \";\n  bottom: 1px;\n  margin-left: -10px;\n  border-bottom-width: 0;\n  border-top-color: #eeeeee;\n}\n.popover.right > .arrow {\n  top: 50%;\n  left: -11px;\n  margin-top: -11px;\n  border-left-width: 0;\n  border-right-color: #999999;\n  border-right-color: rgba(0, 0, 0, 0.25);\n}\n.popover.right > .arrow:after {\n  content: \" \";\n  left: 1px;\n  bottom: -10px;\n  border-left-width: 0;\n  border-right-color: #eeeeee;\n}\n.popover.bottom > .arrow {\n  left: 50%;\n  margin-left: -11px;\n  border-top-width: 0;\n  border-bottom-color: #999999;\n  border-bottom-color: rgba(0, 0, 0, 0.25);\n  top: -11px;\n}\n.popover.bottom > .arrow:after {\n  content: \" \";\n  top: 1px;\n  margin-left: -10px;\n  border-top-width: 0;\n  border-bottom-color: #eeeeee;\n}\n.popover.left > .arrow {\n  top: 50%;\n  right: -11px;\n  margin-top: -11px;\n  border-right-width: 0;\n  border-left-color: #999999;\n  border-left-color: rgba(0, 0, 0, 0.25);\n}\n.popover.left > .arrow:after {\n  content: \" \";\n  right: 1px;\n  border-right-width: 0;\n  border-left-color: #eeeeee;\n  bottom: -10px;\n}\n.carousel {\n  position: relative;\n}\n.carousel-inner {\n  position: relative;\n  overflow: hidden;\n  width: 100%;\n}\n.carousel-inner > .item {\n  display: none;\n  position: relative;\n  -webkit-transition: 0.6s ease-in-out left;\n  -o-transition: 0.6s ease-in-out left;\n  transition: 0.6s ease-in-out left;\n}\n.carousel-inner > .item > img,\n.carousel-inner > .item > a > img {\n  line-height: 1;\n}\n@media all and (transform-3d), (-webkit-transform-3d) {\n  .carousel-inner > .item {\n    transition: transform 0.6s ease-in-out;\n    backface-visibility: hidden;\n    perspective: 1000;\n  }\n  .carousel-inner > .item.next,\n  .carousel-inner > .item.active.right {\n    transform: translate3d(100%, 0, 0);\n    left: 0;\n  }\n  .carousel-inner > .item.prev,\n  .carousel-inner > .item.active.left {\n    transform: translate3d(-100%, 0, 0);\n    left: 0;\n  }\n  .carousel-inner > .item.next.left,\n  .carousel-inner > .item.prev.right,\n  .carousel-inner > .item.active {\n    transform: translate3d(0, 0, 0);\n    left: 0;\n  }\n}\n.carousel-inner > .active,\n.carousel-inner > .next,\n.carousel-inner > .prev {\n  display: block;\n}\n.carousel-inner > .active {\n  left: 0;\n}\n.carousel-inner > .next,\n.carousel-inner > .prev {\n  position: absolute;\n  top: 0;\n  width: 100%;\n}\n.carousel-inner > .next {\n  left: 100%;\n}\n.carousel-inner > .prev {\n  left: -100%;\n}\n.carousel-inner > .next.left,\n.carousel-inner > .prev.right {\n  left: 0;\n}\n.carousel-inner > .active.left {\n  left: -100%;\n}\n.carousel-inner > .active.right {\n  left: 100%;\n}\n.carousel-control {\n  position: absolute;\n  top: 0;\n  left: 0;\n  bottom: 0;\n  width: 15%;\n  opacity: 0.5;\n  -ms-filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=50);\n  filter: alpha(opacity=50);\n  font-size: 20px;\n  color: #eeeeee;\n  text-align: center;\n  text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6);\n}\n.carousel-control.left {\n  background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%);\n  background-image: -o-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.carousel-control.right {\n  left: auto;\n  right: 0;\n  background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%);\n  background-image: -o-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.carousel-control:hover,\n.carousel-control:focus {\n  outline: 0;\n  color: #eeeeee;\n  text-decoration: none;\n  opacity: 0.9;\n  -ms-filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=90);\n  filter: alpha(opacity=90);\n}\n.carousel-control .icon-prev,\n.carousel-control .icon-next,\n.carousel-control .glyphicon-chevron-left,\n.carousel-control .glyphicon-chevron-right {\n  position: absolute;\n  top: 50%;\n  z-index: 5;\n  display: inline-block;\n}\n.carousel-control .icon-prev,\n.carousel-control .glyphicon-chevron-left {\n  left: 50%;\n  margin-left: -10px;\n}\n.carousel-control .icon-next,\n.carousel-control .glyphicon-chevron-right {\n  right: 50%;\n  margin-right: -10px;\n}\n.carousel-control .icon-prev,\n.carousel-control .icon-next {\n  width: 20px;\n  height: 20px;\n  margin-top: -10px;\n  font-family: serif;\n}\n.carousel-control .icon-prev:before {\n  content: '\\2039';\n}\n.carousel-control .icon-next:before {\n  content: '\\203a';\n}\n.carousel-indicators {\n  position: absolute;\n  bottom: 10px;\n  left: 50%;\n  z-index: 15;\n  width: 60%;\n  margin-left: -30%;\n  padding-left: 0;\n  list-style: none;\n  text-align: center;\n}\n.carousel-indicators li {\n  display: inline-block;\n  width: 10px;\n  height: 10px;\n  margin: 1px;\n  text-indent: -999px;\n  border: 1px solid #eeeeee;\n  border-radius: 10px;\n  cursor: pointer;\n  background-color: #000 \\9;\n  background-color: rgba(0, 0, 0, 0);\n}\n.carousel-indicators .active {\n  margin: 0;\n  width: 12px;\n  height: 12px;\n  background-color: #eeeeee;\n}\n.carousel-caption {\n  position: absolute;\n  left: 15%;\n  right: 15%;\n  bottom: 20px;\n  z-index: 10;\n  padding-top: 20px;\n  padding-bottom: 20px;\n  color: #eeeeee;\n  text-align: center;\n  text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6);\n}\n.carousel-caption .btn {\n  text-shadow: none;\n}\n@media screen and (min-width: 768px) {\n  .carousel-control .glyphicon-chevron-left,\n  .carousel-control .glyphicon-chevron-right,\n  .carousel-control .icon-prev,\n  .carousel-control .icon-next {\n    width: 30px;\n    height: 30px;\n    margin-top: -15px;\n    font-size: 30px;\n  }\n  .carousel-control .glyphicon-chevron-left,\n  .carousel-control .icon-prev {\n    margin-left: -15px;\n  }\n  .carousel-control .glyphicon-chevron-right,\n  .carousel-control .icon-next {\n    margin-right: -15px;\n  }\n  .carousel-caption {\n    left: 20%;\n    right: 20%;\n    padding-bottom: 30px;\n  }\n  .carousel-indicators {\n    bottom: 20px;\n  }\n}\n.clearfix:before,\n.clearfix:after,\n.dl-horizontal dd:before,\n.dl-horizontal dd:after,\n.container:before,\n.container:after,\n.container-fluid:before,\n.container-fluid:after,\n.row:before,\n.row:after,\n.form-horizontal .form-group:before,\n.form-horizontal .form-group:after,\n.btn-toolbar:before,\n.btn-toolbar:after,\n.btn-group-vertical > .btn-group:before,\n.btn-group-vertical > .btn-group:after,\n.nav:before,\n.nav:after,\n.navbar:before,\n.navbar:after,\n.navbar-header:before,\n.navbar-header:after,\n.navbar-collapse:before,\n.navbar-collapse:after,\n.pager:before,\n.pager:after,\n.panel-body:before,\n.panel-body:after,\n.modal-footer:before,\n.modal-footer:after {\n  content: \" \";\n  display: table;\n}\n.clearfix:after,\n.dl-horizontal dd:after,\n.container:after,\n.container-fluid:after,\n.row:after,\n.form-horizontal .form-group:after,\n.btn-toolbar:after,\n.btn-group-vertical > .btn-group:after,\n.nav:after,\n.navbar:after,\n.navbar-header:after,\n.navbar-collapse:after,\n.pager:after,\n.panel-body:after,\n.modal-footer:after {\n  clear: both;\n}\n.center-block {\n  display: block;\n  margin-left: auto;\n  margin-right: auto;\n}\n.pull-right {\n  float: right !important;\n}\n.pull-left {\n  float: left !important;\n}\n.hide {\n  display: none !important;\n}\n.show {\n  display: block !important;\n}\n.invisible {\n  visibility: hidden;\n}\n.text-hide {\n  font: 0/0 a;\n  color: transparent;\n  text-shadow: none;\n  background-color: transparent;\n  border: 0;\n}\n.hidden {\n  display: none !important;\n  visibility: hidden !important;\n}\n.affix {\n  position: fixed;\n}\n@-ms-viewport {\n  width: device-width;\n}\n.visible-xs,\n.visible-sm,\n.visible-md,\n.visible-lg {\n  display: none !important;\n}\n.visible-xs-block,\n.visible-xs-inline,\n.visible-xs-inline-block,\n.visible-sm-block,\n.visible-sm-inline,\n.visible-sm-inline-block,\n.visible-md-block,\n.visible-md-inline,\n.visible-md-inline-block,\n.visible-lg-block,\n.visible-lg-inline,\n.visible-lg-inline-block {\n  display: none !important;\n}\n@media (max-width: 767px) {\n  .visible-xs {\n    display: block !important;\n  }\n  table.visible-xs {\n    display: table;\n  }\n  tr.visible-xs {\n    display: table-row !important;\n  }\n  th.visible-xs,\n  td.visible-xs {\n    display: table-cell !important;\n  }\n}\n@media (max-width: 767px) {\n  .visible-xs-block {\n    display: block !important;\n  }\n}\n@media (max-width: 767px) {\n  .visible-xs-inline {\n    display: inline !important;\n  }\n}\n@media (max-width: 767px) {\n  .visible-xs-inline-block {\n    display: inline-block !important;\n  }\n}\n@media (min-width: 768px) and (max-width: 1030px) {\n  .visible-sm {\n    display: block !important;\n  }\n  table.visible-sm {\n    display: table;\n  }\n  tr.visible-sm {\n    display: table-row !important;\n  }\n  th.visible-sm,\n  td.visible-sm {\n    display: table-cell !important;\n  }\n}\n@media (min-width: 768px) and (max-width: 1030px) {\n  .visible-sm-block {\n    display: block !important;\n  }\n}\n@media (min-width: 768px) and (max-width: 1030px) {\n  .visible-sm-inline {\n    display: inline !important;\n  }\n}\n@media (min-width: 768px) and (max-width: 1030px) {\n  .visible-sm-inline-block {\n    display: inline-block !important;\n  }\n}\n@media (min-width: 1031px) and (max-width: 1199px) {\n  .visible-md {\n    display: block !important;\n  }\n  table.visible-md {\n    display: table;\n  }\n  tr.visible-md {\n    display: table-row !important;\n  }\n  th.visible-md,\n  td.visible-md {\n    display: table-cell !important;\n  }\n}\n@media (min-width: 1031px) and (max-width: 1199px) {\n  .visible-md-block {\n    display: block !important;\n  }\n}\n@media (min-width: 1031px) and (max-width: 1199px) {\n  .visible-md-inline {\n    display: inline !important;\n  }\n}\n@media (min-width: 1031px) and (max-width: 1199px) {\n  .visible-md-inline-block {\n    display: inline-block !important;\n  }\n}\n@media (min-width: 1200px) {\n  .visible-lg {\n    display: block !important;\n  }\n  table.visible-lg {\n    display: table;\n  }\n  tr.visible-lg {\n    display: table-row !important;\n  }\n  th.visible-lg,\n  td.visible-lg {\n    display: table-cell !important;\n  }\n}\n@media (min-width: 1200px) {\n  .visible-lg-block {\n    display: block !important;\n  }\n}\n@media (min-width: 1200px) {\n  .visible-lg-inline {\n    display: inline !important;\n  }\n}\n@media (min-width: 1200px) {\n  .visible-lg-inline-block {\n    display: inline-block !important;\n  }\n}\n@media (max-width: 767px) {\n  .hidden-xs {\n    display: none !important;\n  }\n}\n@media (min-width: 768px) and (max-width: 1030px) {\n  .hidden-sm {\n    display: none !important;\n  }\n}\n@media (min-width: 1031px) and (max-width: 1199px) {\n  .hidden-md {\n    display: none !important;\n  }\n}\n@media (min-width: 1200px) {\n  .hidden-lg {\n    display: none !important;\n  }\n}\n.visible-print {\n  display: none !important;\n}\n@media print {\n  .visible-print {\n    display: block !important;\n  }\n  table.visible-print {\n    display: table;\n  }\n  tr.visible-print {\n    display: table-row !important;\n  }\n  th.visible-print,\n  td.visible-print {\n    display: table-cell !important;\n  }\n}\n.visible-print-block {\n  display: none !important;\n}\n@media print {\n  .visible-print-block {\n    display: block !important;\n  }\n}\n.visible-print-inline {\n  display: none !important;\n}\n@media print {\n  .visible-print-inline {\n    display: inline !important;\n  }\n}\n.visible-print-inline-block {\n  display: none !important;\n}\n@media print {\n  .visible-print-inline-block {\n    display: inline-block !important;\n  }\n}\n@media print {\n  .hidden-print {\n    display: none !important;\n  }\n}\n/*\n * Social Buttons for Bootstrap\n *\n * Copyright 2013-2014 Panayiotis Lipiridis\n * Licensed under the MIT License\n *\n * https://github.com/lipis/bootstrap-social\n */\n.btn-social {\n  position: relative;\n  padding-left: 44px;\n  text-align: left;\n  white-space: nowrap;\n  overflow: hidden;\n  text-overflow: ellipsis;\n}\n.btn-social > :first-child {\n  position: absolute;\n  left: 0;\n  top: 0;\n  bottom: 0;\n  width: 32px;\n  line-height: 34px;\n  font-size: 1.6em;\n  text-align: center;\n  border-right: 1px solid rgba(0, 0, 0, 0.2);\n}\n.btn-social.btn-lg {\n  padding-left: 61px;\n}\n.btn-social.btn-lg :first-child {\n  line-height: 45px;\n  width: 45px;\n  font-size: 1.8em;\n}\n.btn-social.btn-sm {\n  padding-left: 38px;\n}\n.btn-social.btn-sm :first-child {\n  line-height: 28px;\n  width: 28px;\n  font-size: 1.4em;\n}\n.btn-social.btn-xs {\n  padding-left: 30px;\n}\n.btn-social.btn-xs :first-child {\n  line-height: 20px;\n  width: 20px;\n  font-size: 1.2em;\n}\n.btn-social-icon {\n  position: relative;\n  padding-left: 44px;\n  text-align: left;\n  white-space: nowrap;\n  overflow: hidden;\n  text-overflow: ellipsis;\n  width: 250px;\n  margin: auto;\n  height: 34px;\n  width: 34px;\n  padding: 0;\n}\n.btn-social-icon > :first-child {\n  position: absolute;\n  left: 0;\n  top: 0;\n  bottom: 0;\n  width: 32px;\n  line-height: 34px;\n  font-size: 1.6em;\n  text-align: center;\n  border-right: 1px solid rgba(0, 0, 0, 0.2);\n}\n.btn-social-icon.btn-lg {\n  padding-left: 61px;\n}\n.btn-social-icon.btn-lg :first-child {\n  line-height: 45px;\n  width: 45px;\n  font-size: 1.8em;\n}\n.btn-social-icon.btn-sm {\n  padding-left: 38px;\n}\n.btn-social-icon.btn-sm :first-child {\n  line-height: 28px;\n  width: 28px;\n  font-size: 1.4em;\n}\n.btn-social-icon.btn-xs {\n  padding-left: 30px;\n}\n.btn-social-icon.btn-xs :first-child {\n  line-height: 20px;\n  width: 20px;\n  font-size: 1.2em;\n}\n.btn-social-icon :first-child {\n  border: none;\n  text-align: center;\n  width: 100%!important;\n}\n.btn-social-icon.btn-lg {\n  height: 45px;\n  width: 45px;\n  padding-left: 0;\n  padding-right: 0;\n}\n.btn-social-icon.btn-sm {\n  height: 30px;\n  width: 30px;\n  padding-left: 0;\n  padding-right: 0;\n}\n.btn-social-icon.btn-xs {\n  height: 22px;\n  width: 22px;\n  padding-left: 0;\n  padding-right: 0;\n}\n.btn-adn {\n  color: #d87a68;\n  background-color: #d87a68;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-adn:hover,\n.btn-adn:focus,\n.btn-adn.focus,\n.btn-adn:active,\n.btn-adn.active,\n.open > .dropdown-toggle.btn-adn {\n  color: #eeeeee;\n  background-color: #d87a68;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-adn:active,\n.btn-adn.active,\n.open > .dropdown-toggle.btn-adn {\n  background-image: none;\n}\n.btn-adn.disabled,\n.btn-adn[disabled],\nfieldset[disabled] .btn-adn,\n.btn-adn.disabled:hover,\n.btn-adn[disabled]:hover,\nfieldset[disabled] .btn-adn:hover,\n.btn-adn.disabled:focus,\n.btn-adn[disabled]:focus,\nfieldset[disabled] .btn-adn:focus,\n.btn-adn.disabled.focus,\n.btn-adn[disabled].focus,\nfieldset[disabled] .btn-adn.focus,\n.btn-adn.disabled:active,\n.btn-adn[disabled]:active,\nfieldset[disabled] .btn-adn:active,\n.btn-adn.disabled.active,\n.btn-adn[disabled].active,\nfieldset[disabled] .btn-adn.active {\n  background-color: #d87a68;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-adn .badge {\n  color: #d87a68;\n  background-color: #d87a68;\n}\n.btn-bitbucket {\n  color: #205081;\n  background-color: #205081;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-bitbucket:hover,\n.btn-bitbucket:focus,\n.btn-bitbucket.focus,\n.btn-bitbucket:active,\n.btn-bitbucket.active,\n.open > .dropdown-toggle.btn-bitbucket {\n  color: #eeeeee;\n  background-color: #205081;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-bitbucket:active,\n.btn-bitbucket.active,\n.open > .dropdown-toggle.btn-bitbucket {\n  background-image: none;\n}\n.btn-bitbucket.disabled,\n.btn-bitbucket[disabled],\nfieldset[disabled] .btn-bitbucket,\n.btn-bitbucket.disabled:hover,\n.btn-bitbucket[disabled]:hover,\nfieldset[disabled] .btn-bitbucket:hover,\n.btn-bitbucket.disabled:focus,\n.btn-bitbucket[disabled]:focus,\nfieldset[disabled] .btn-bitbucket:focus,\n.btn-bitbucket.disabled.focus,\n.btn-bitbucket[disabled].focus,\nfieldset[disabled] .btn-bitbucket.focus,\n.btn-bitbucket.disabled:active,\n.btn-bitbucket[disabled]:active,\nfieldset[disabled] .btn-bitbucket:active,\n.btn-bitbucket.disabled.active,\n.btn-bitbucket[disabled].active,\nfieldset[disabled] .btn-bitbucket.active {\n  background-color: #205081;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-bitbucket .badge {\n  color: #205081;\n  background-color: #205081;\n}\n.btn-dropbox {\n  color: #1087dd;\n  background-color: #1087dd;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-dropbox:hover,\n.btn-dropbox:focus,\n.btn-dropbox.focus,\n.btn-dropbox:active,\n.btn-dropbox.active,\n.open > .dropdown-toggle.btn-dropbox {\n  color: #eeeeee;\n  background-color: #1087dd;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-dropbox:active,\n.btn-dropbox.active,\n.open > .dropdown-toggle.btn-dropbox {\n  background-image: none;\n}\n.btn-dropbox.disabled,\n.btn-dropbox[disabled],\nfieldset[disabled] .btn-dropbox,\n.btn-dropbox.disabled:hover,\n.btn-dropbox[disabled]:hover,\nfieldset[disabled] .btn-dropbox:hover,\n.btn-dropbox.disabled:focus,\n.btn-dropbox[disabled]:focus,\nfieldset[disabled] .btn-dropbox:focus,\n.btn-dropbox.disabled.focus,\n.btn-dropbox[disabled].focus,\nfieldset[disabled] .btn-dropbox.focus,\n.btn-dropbox.disabled:active,\n.btn-dropbox[disabled]:active,\nfieldset[disabled] .btn-dropbox:active,\n.btn-dropbox.disabled.active,\n.btn-dropbox[disabled].active,\nfieldset[disabled] .btn-dropbox.active {\n  background-color: #1087dd;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-dropbox .badge {\n  color: #1087dd;\n  background-color: #1087dd;\n}\n.btn-facebook {\n  color: #3b5998;\n  background-color: #3b5998;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-facebook:hover,\n.btn-facebook:focus,\n.btn-facebook.focus,\n.btn-facebook:active,\n.btn-facebook.active,\n.open > .dropdown-toggle.btn-facebook {\n  color: #eeeeee;\n  background-color: #3b5998;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-facebook:active,\n.btn-facebook.active,\n.open > .dropdown-toggle.btn-facebook {\n  background-image: none;\n}\n.btn-facebook.disabled,\n.btn-facebook[disabled],\nfieldset[disabled] .btn-facebook,\n.btn-facebook.disabled:hover,\n.btn-facebook[disabled]:hover,\nfieldset[disabled] .btn-facebook:hover,\n.btn-facebook.disabled:focus,\n.btn-facebook[disabled]:focus,\nfieldset[disabled] .btn-facebook:focus,\n.btn-facebook.disabled.focus,\n.btn-facebook[disabled].focus,\nfieldset[disabled] .btn-facebook.focus,\n.btn-facebook.disabled:active,\n.btn-facebook[disabled]:active,\nfieldset[disabled] .btn-facebook:active,\n.btn-facebook.disabled.active,\n.btn-facebook[disabled].active,\nfieldset[disabled] .btn-facebook.active {\n  background-color: #3b5998;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-facebook .badge {\n  color: #3b5998;\n  background-color: #3b5998;\n}\n.btn-flickr {\n  color: #ff0084;\n  background-color: #ff0084;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-flickr:hover,\n.btn-flickr:focus,\n.btn-flickr.focus,\n.btn-flickr:active,\n.btn-flickr.active,\n.open > .dropdown-toggle.btn-flickr {\n  color: #eeeeee;\n  background-color: #ff0084;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-flickr:active,\n.btn-flickr.active,\n.open > .dropdown-toggle.btn-flickr {\n  background-image: none;\n}\n.btn-flickr.disabled,\n.btn-flickr[disabled],\nfieldset[disabled] .btn-flickr,\n.btn-flickr.disabled:hover,\n.btn-flickr[disabled]:hover,\nfieldset[disabled] .btn-flickr:hover,\n.btn-flickr.disabled:focus,\n.btn-flickr[disabled]:focus,\nfieldset[disabled] .btn-flickr:focus,\n.btn-flickr.disabled.focus,\n.btn-flickr[disabled].focus,\nfieldset[disabled] .btn-flickr.focus,\n.btn-flickr.disabled:active,\n.btn-flickr[disabled]:active,\nfieldset[disabled] .btn-flickr:active,\n.btn-flickr.disabled.active,\n.btn-flickr[disabled].active,\nfieldset[disabled] .btn-flickr.active {\n  background-color: #ff0084;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-flickr .badge {\n  color: #ff0084;\n  background-color: #ff0084;\n}\n.btn-foursquare {\n  color: #f94877;\n  background-color: #f94877;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-foursquare:hover,\n.btn-foursquare:focus,\n.btn-foursquare.focus,\n.btn-foursquare:active,\n.btn-foursquare.active,\n.open > .dropdown-toggle.btn-foursquare {\n  color: #eeeeee;\n  background-color: #f94877;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-foursquare:active,\n.btn-foursquare.active,\n.open > .dropdown-toggle.btn-foursquare {\n  background-image: none;\n}\n.btn-foursquare.disabled,\n.btn-foursquare[disabled],\nfieldset[disabled] .btn-foursquare,\n.btn-foursquare.disabled:hover,\n.btn-foursquare[disabled]:hover,\nfieldset[disabled] .btn-foursquare:hover,\n.btn-foursquare.disabled:focus,\n.btn-foursquare[disabled]:focus,\nfieldset[disabled] .btn-foursquare:focus,\n.btn-foursquare.disabled.focus,\n.btn-foursquare[disabled].focus,\nfieldset[disabled] .btn-foursquare.focus,\n.btn-foursquare.disabled:active,\n.btn-foursquare[disabled]:active,\nfieldset[disabled] .btn-foursquare:active,\n.btn-foursquare.disabled.active,\n.btn-foursquare[disabled].active,\nfieldset[disabled] .btn-foursquare.active {\n  background-color: #f94877;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-foursquare .badge {\n  color: #f94877;\n  background-color: #f94877;\n}\n.btn-github {\n  color: #444444;\n  background-color: #444444;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-github:hover,\n.btn-github:focus,\n.btn-github.focus,\n.btn-github:active,\n.btn-github.active,\n.open > .dropdown-toggle.btn-github {\n  color: #eeeeee;\n  background-color: #444444;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-github:active,\n.btn-github.active,\n.open > .dropdown-toggle.btn-github {\n  background-image: none;\n}\n.btn-github.disabled,\n.btn-github[disabled],\nfieldset[disabled] .btn-github,\n.btn-github.disabled:hover,\n.btn-github[disabled]:hover,\nfieldset[disabled] .btn-github:hover,\n.btn-github.disabled:focus,\n.btn-github[disabled]:focus,\nfieldset[disabled] .btn-github:focus,\n.btn-github.disabled.focus,\n.btn-github[disabled].focus,\nfieldset[disabled] .btn-github.focus,\n.btn-github.disabled:active,\n.btn-github[disabled]:active,\nfieldset[disabled] .btn-github:active,\n.btn-github.disabled.active,\n.btn-github[disabled].active,\nfieldset[disabled] .btn-github.active {\n  background-color: #444444;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-github .badge {\n  color: #444444;\n  background-color: #444444;\n}\n.btn-google-plus {\n  color: #dd4b39;\n  background-color: #dd4b39;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-google-plus:hover,\n.btn-google-plus:focus,\n.btn-google-plus.focus,\n.btn-google-plus:active,\n.btn-google-plus.active,\n.open > .dropdown-toggle.btn-google-plus {\n  color: #eeeeee;\n  background-color: #dd4b39;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-google-plus:active,\n.btn-google-plus.active,\n.open > .dropdown-toggle.btn-google-plus {\n  background-image: none;\n}\n.btn-google-plus.disabled,\n.btn-google-plus[disabled],\nfieldset[disabled] .btn-google-plus,\n.btn-google-plus.disabled:hover,\n.btn-google-plus[disabled]:hover,\nfieldset[disabled] .btn-google-plus:hover,\n.btn-google-plus.disabled:focus,\n.btn-google-plus[disabled]:focus,\nfieldset[disabled] .btn-google-plus:focus,\n.btn-google-plus.disabled.focus,\n.btn-google-plus[disabled].focus,\nfieldset[disabled] .btn-google-plus.focus,\n.btn-google-plus.disabled:active,\n.btn-google-plus[disabled]:active,\nfieldset[disabled] .btn-google-plus:active,\n.btn-google-plus.disabled.active,\n.btn-google-plus[disabled].active,\nfieldset[disabled] .btn-google-plus.active {\n  background-color: #dd4b39;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-google-plus .badge {\n  color: #dd4b39;\n  background-color: #dd4b39;\n}\n.btn-instagram {\n  color: #3f729b;\n  background-color: #3f729b;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-instagram:hover,\n.btn-instagram:focus,\n.btn-instagram.focus,\n.btn-instagram:active,\n.btn-instagram.active,\n.open > .dropdown-toggle.btn-instagram {\n  color: #eeeeee;\n  background-color: #3f729b;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-instagram:active,\n.btn-instagram.active,\n.open > .dropdown-toggle.btn-instagram {\n  background-image: none;\n}\n.btn-instagram.disabled,\n.btn-instagram[disabled],\nfieldset[disabled] .btn-instagram,\n.btn-instagram.disabled:hover,\n.btn-instagram[disabled]:hover,\nfieldset[disabled] .btn-instagram:hover,\n.btn-instagram.disabled:focus,\n.btn-instagram[disabled]:focus,\nfieldset[disabled] .btn-instagram:focus,\n.btn-instagram.disabled.focus,\n.btn-instagram[disabled].focus,\nfieldset[disabled] .btn-instagram.focus,\n.btn-instagram.disabled:active,\n.btn-instagram[disabled]:active,\nfieldset[disabled] .btn-instagram:active,\n.btn-instagram.disabled.active,\n.btn-instagram[disabled].active,\nfieldset[disabled] .btn-instagram.active {\n  background-color: #3f729b;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-instagram .badge {\n  color: #3f729b;\n  background-color: #3f729b;\n}\n.btn-linkedin {\n  color: #007bb6;\n  background-color: #007bb6;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-linkedin:hover,\n.btn-linkedin:focus,\n.btn-linkedin.focus,\n.btn-linkedin:active,\n.btn-linkedin.active,\n.open > .dropdown-toggle.btn-linkedin {\n  color: #eeeeee;\n  background-color: #007bb6;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-linkedin:active,\n.btn-linkedin.active,\n.open > .dropdown-toggle.btn-linkedin {\n  background-image: none;\n}\n.btn-linkedin.disabled,\n.btn-linkedin[disabled],\nfieldset[disabled] .btn-linkedin,\n.btn-linkedin.disabled:hover,\n.btn-linkedin[disabled]:hover,\nfieldset[disabled] .btn-linkedin:hover,\n.btn-linkedin.disabled:focus,\n.btn-linkedin[disabled]:focus,\nfieldset[disabled] .btn-linkedin:focus,\n.btn-linkedin.disabled.focus,\n.btn-linkedin[disabled].focus,\nfieldset[disabled] .btn-linkedin.focus,\n.btn-linkedin.disabled:active,\n.btn-linkedin[disabled]:active,\nfieldset[disabled] .btn-linkedin:active,\n.btn-linkedin.disabled.active,\n.btn-linkedin[disabled].active,\nfieldset[disabled] .btn-linkedin.active {\n  background-color: #007bb6;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-linkedin .badge {\n  color: #007bb6;\n  background-color: #007bb6;\n}\n.btn-microsoft {\n  color: #2672ec;\n  background-color: #2672ec;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-microsoft:hover,\n.btn-microsoft:focus,\n.btn-microsoft.focus,\n.btn-microsoft:active,\n.btn-microsoft.active,\n.open > .dropdown-toggle.btn-microsoft {\n  color: #eeeeee;\n  background-color: #2672ec;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-microsoft:active,\n.btn-microsoft.active,\n.open > .dropdown-toggle.btn-microsoft {\n  background-image: none;\n}\n.btn-microsoft.disabled,\n.btn-microsoft[disabled],\nfieldset[disabled] .btn-microsoft,\n.btn-microsoft.disabled:hover,\n.btn-microsoft[disabled]:hover,\nfieldset[disabled] .btn-microsoft:hover,\n.btn-microsoft.disabled:focus,\n.btn-microsoft[disabled]:focus,\nfieldset[disabled] .btn-microsoft:focus,\n.btn-microsoft.disabled.focus,\n.btn-microsoft[disabled].focus,\nfieldset[disabled] .btn-microsoft.focus,\n.btn-microsoft.disabled:active,\n.btn-microsoft[disabled]:active,\nfieldset[disabled] .btn-microsoft:active,\n.btn-microsoft.disabled.active,\n.btn-microsoft[disabled].active,\nfieldset[disabled] .btn-microsoft.active {\n  background-color: #2672ec;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-microsoft .badge {\n  color: #2672ec;\n  background-color: #2672ec;\n}\n.btn-openid {\n  color: #f7931e;\n  background-color: #f7931e;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-openid:hover,\n.btn-openid:focus,\n.btn-openid.focus,\n.btn-openid:active,\n.btn-openid.active,\n.open > .dropdown-toggle.btn-openid {\n  color: #eeeeee;\n  background-color: #f7931e;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-openid:active,\n.btn-openid.active,\n.open > .dropdown-toggle.btn-openid {\n  background-image: none;\n}\n.btn-openid.disabled,\n.btn-openid[disabled],\nfieldset[disabled] .btn-openid,\n.btn-openid.disabled:hover,\n.btn-openid[disabled]:hover,\nfieldset[disabled] .btn-openid:hover,\n.btn-openid.disabled:focus,\n.btn-openid[disabled]:focus,\nfieldset[disabled] .btn-openid:focus,\n.btn-openid.disabled.focus,\n.btn-openid[disabled].focus,\nfieldset[disabled] .btn-openid.focus,\n.btn-openid.disabled:active,\n.btn-openid[disabled]:active,\nfieldset[disabled] .btn-openid:active,\n.btn-openid.disabled.active,\n.btn-openid[disabled].active,\nfieldset[disabled] .btn-openid.active {\n  background-color: #f7931e;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-openid .badge {\n  color: #f7931e;\n  background-color: #f7931e;\n}\n.btn-pinterest {\n  color: #cb2027;\n  background-color: #cb2027;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-pinterest:hover,\n.btn-pinterest:focus,\n.btn-pinterest.focus,\n.btn-pinterest:active,\n.btn-pinterest.active,\n.open > .dropdown-toggle.btn-pinterest {\n  color: #eeeeee;\n  background-color: #cb2027;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-pinterest:active,\n.btn-pinterest.active,\n.open > .dropdown-toggle.btn-pinterest {\n  background-image: none;\n}\n.btn-pinterest.disabled,\n.btn-pinterest[disabled],\nfieldset[disabled] .btn-pinterest,\n.btn-pinterest.disabled:hover,\n.btn-pinterest[disabled]:hover,\nfieldset[disabled] .btn-pinterest:hover,\n.btn-pinterest.disabled:focus,\n.btn-pinterest[disabled]:focus,\nfieldset[disabled] .btn-pinterest:focus,\n.btn-pinterest.disabled.focus,\n.btn-pinterest[disabled].focus,\nfieldset[disabled] .btn-pinterest.focus,\n.btn-pinterest.disabled:active,\n.btn-pinterest[disabled]:active,\nfieldset[disabled] .btn-pinterest:active,\n.btn-pinterest.disabled.active,\n.btn-pinterest[disabled].active,\nfieldset[disabled] .btn-pinterest.active {\n  background-color: #cb2027;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-pinterest .badge {\n  color: #cb2027;\n  background-color: #cb2027;\n}\n.btn-reddit {\n  color: #000;\n  background-color: #eff7ff;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-reddit:hover,\n.btn-reddit:focus,\n.btn-reddit.focus,\n.btn-reddit:active,\n.btn-reddit.active,\n.open > .dropdown-toggle.btn-reddit {\n  color: #eeeeee;\n  background-color: #eff7ff;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-reddit:active,\n.btn-reddit.active,\n.open > .dropdown-toggle.btn-reddit {\n  background-image: none;\n}\n.btn-reddit.disabled,\n.btn-reddit[disabled],\nfieldset[disabled] .btn-reddit,\n.btn-reddit.disabled:hover,\n.btn-reddit[disabled]:hover,\nfieldset[disabled] .btn-reddit:hover,\n.btn-reddit.disabled:focus,\n.btn-reddit[disabled]:focus,\nfieldset[disabled] .btn-reddit:focus,\n.btn-reddit.disabled.focus,\n.btn-reddit[disabled].focus,\nfieldset[disabled] .btn-reddit.focus,\n.btn-reddit.disabled:active,\n.btn-reddit[disabled]:active,\nfieldset[disabled] .btn-reddit:active,\n.btn-reddit.disabled.active,\n.btn-reddit[disabled].active,\nfieldset[disabled] .btn-reddit.active {\n  background-color: #eff7ff;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-reddit .badge {\n  color: #eff7ff;\n  background-color: #000;\n}\n.btn-soundcloud {\n  color: #ff5500;\n  background-color: #ff5500;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-soundcloud:hover,\n.btn-soundcloud:focus,\n.btn-soundcloud.focus,\n.btn-soundcloud:active,\n.btn-soundcloud.active,\n.open > .dropdown-toggle.btn-soundcloud {\n  color: #eeeeee;\n  background-color: #ff5500;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-soundcloud:active,\n.btn-soundcloud.active,\n.open > .dropdown-toggle.btn-soundcloud {\n  background-image: none;\n}\n.btn-soundcloud.disabled,\n.btn-soundcloud[disabled],\nfieldset[disabled] .btn-soundcloud,\n.btn-soundcloud.disabled:hover,\n.btn-soundcloud[disabled]:hover,\nfieldset[disabled] .btn-soundcloud:hover,\n.btn-soundcloud.disabled:focus,\n.btn-soundcloud[disabled]:focus,\nfieldset[disabled] .btn-soundcloud:focus,\n.btn-soundcloud.disabled.focus,\n.btn-soundcloud[disabled].focus,\nfieldset[disabled] .btn-soundcloud.focus,\n.btn-soundcloud.disabled:active,\n.btn-soundcloud[disabled]:active,\nfieldset[disabled] .btn-soundcloud:active,\n.btn-soundcloud.disabled.active,\n.btn-soundcloud[disabled].active,\nfieldset[disabled] .btn-soundcloud.active {\n  background-color: #ff5500;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-soundcloud .badge {\n  color: #ff5500;\n  background-color: #ff5500;\n}\n.btn-tumblr {\n  color: #2c4762;\n  background-color: #2c4762;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-tumblr:hover,\n.btn-tumblr:focus,\n.btn-tumblr.focus,\n.btn-tumblr:active,\n.btn-tumblr.active,\n.open > .dropdown-toggle.btn-tumblr {\n  color: #eeeeee;\n  background-color: #2c4762;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-tumblr:active,\n.btn-tumblr.active,\n.open > .dropdown-toggle.btn-tumblr {\n  background-image: none;\n}\n.btn-tumblr.disabled,\n.btn-tumblr[disabled],\nfieldset[disabled] .btn-tumblr,\n.btn-tumblr.disabled:hover,\n.btn-tumblr[disabled]:hover,\nfieldset[disabled] .btn-tumblr:hover,\n.btn-tumblr.disabled:focus,\n.btn-tumblr[disabled]:focus,\nfieldset[disabled] .btn-tumblr:focus,\n.btn-tumblr.disabled.focus,\n.btn-tumblr[disabled].focus,\nfieldset[disabled] .btn-tumblr.focus,\n.btn-tumblr.disabled:active,\n.btn-tumblr[disabled]:active,\nfieldset[disabled] .btn-tumblr:active,\n.btn-tumblr.disabled.active,\n.btn-tumblr[disabled].active,\nfieldset[disabled] .btn-tumblr.active {\n  background-color: #2c4762;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-tumblr .badge {\n  color: #2c4762;\n  background-color: #2c4762;\n}\n.btn-twitter {\n  color: #55acee;\n  background-color: #55acee;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-twitter:hover,\n.btn-twitter:focus,\n.btn-twitter.focus,\n.btn-twitter:active,\n.btn-twitter.active,\n.open > .dropdown-toggle.btn-twitter {\n  color: #eeeeee;\n  background-color: #55acee;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-twitter:active,\n.btn-twitter.active,\n.open > .dropdown-toggle.btn-twitter {\n  background-image: none;\n}\n.btn-twitter.disabled,\n.btn-twitter[disabled],\nfieldset[disabled] .btn-twitter,\n.btn-twitter.disabled:hover,\n.btn-twitter[disabled]:hover,\nfieldset[disabled] .btn-twitter:hover,\n.btn-twitter.disabled:focus,\n.btn-twitter[disabled]:focus,\nfieldset[disabled] .btn-twitter:focus,\n.btn-twitter.disabled.focus,\n.btn-twitter[disabled].focus,\nfieldset[disabled] .btn-twitter.focus,\n.btn-twitter.disabled:active,\n.btn-twitter[disabled]:active,\nfieldset[disabled] .btn-twitter:active,\n.btn-twitter.disabled.active,\n.btn-twitter[disabled].active,\nfieldset[disabled] .btn-twitter.active {\n  background-color: #55acee;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-twitter .badge {\n  color: #55acee;\n  background-color: #55acee;\n}\n.btn-vimeo {\n  color: #1ab7ea;\n  background-color: #1ab7ea;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-vimeo:hover,\n.btn-vimeo:focus,\n.btn-vimeo.focus,\n.btn-vimeo:active,\n.btn-vimeo.active,\n.open > .dropdown-toggle.btn-vimeo {\n  color: #eeeeee;\n  background-color: #1ab7ea;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-vimeo:active,\n.btn-vimeo.active,\n.open > .dropdown-toggle.btn-vimeo {\n  background-image: none;\n}\n.btn-vimeo.disabled,\n.btn-vimeo[disabled],\nfieldset[disabled] .btn-vimeo,\n.btn-vimeo.disabled:hover,\n.btn-vimeo[disabled]:hover,\nfieldset[disabled] .btn-vimeo:hover,\n.btn-vimeo.disabled:focus,\n.btn-vimeo[disabled]:focus,\nfieldset[disabled] .btn-vimeo:focus,\n.btn-vimeo.disabled.focus,\n.btn-vimeo[disabled].focus,\nfieldset[disabled] .btn-vimeo.focus,\n.btn-vimeo.disabled:active,\n.btn-vimeo[disabled]:active,\nfieldset[disabled] .btn-vimeo:active,\n.btn-vimeo.disabled.active,\n.btn-vimeo[disabled].active,\nfieldset[disabled] .btn-vimeo.active {\n  background-color: #1ab7ea;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-vimeo .badge {\n  color: #1ab7ea;\n  background-color: #1ab7ea;\n}\n.btn-vk {\n  color: #587ea3;\n  background-color: #587ea3;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-vk:hover,\n.btn-vk:focus,\n.btn-vk.focus,\n.btn-vk:active,\n.btn-vk.active,\n.open > .dropdown-toggle.btn-vk {\n  color: #eeeeee;\n  background-color: #587ea3;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-vk:active,\n.btn-vk.active,\n.open > .dropdown-toggle.btn-vk {\n  background-image: none;\n}\n.btn-vk.disabled,\n.btn-vk[disabled],\nfieldset[disabled] .btn-vk,\n.btn-vk.disabled:hover,\n.btn-vk[disabled]:hover,\nfieldset[disabled] .btn-vk:hover,\n.btn-vk.disabled:focus,\n.btn-vk[disabled]:focus,\nfieldset[disabled] .btn-vk:focus,\n.btn-vk.disabled.focus,\n.btn-vk[disabled].focus,\nfieldset[disabled] .btn-vk.focus,\n.btn-vk.disabled:active,\n.btn-vk[disabled]:active,\nfieldset[disabled] .btn-vk:active,\n.btn-vk.disabled.active,\n.btn-vk[disabled].active,\nfieldset[disabled] .btn-vk.active {\n  background-color: #587ea3;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-vk .badge {\n  color: #587ea3;\n  background-color: #587ea3;\n}\n.btn-yahoo {\n  color: #720e9e;\n  background-color: #720e9e;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-yahoo:hover,\n.btn-yahoo:focus,\n.btn-yahoo.focus,\n.btn-yahoo:active,\n.btn-yahoo.active,\n.open > .dropdown-toggle.btn-yahoo {\n  color: #eeeeee;\n  background-color: #720e9e;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-yahoo:active,\n.btn-yahoo.active,\n.open > .dropdown-toggle.btn-yahoo {\n  background-image: none;\n}\n.btn-yahoo.disabled,\n.btn-yahoo[disabled],\nfieldset[disabled] .btn-yahoo,\n.btn-yahoo.disabled:hover,\n.btn-yahoo[disabled]:hover,\nfieldset[disabled] .btn-yahoo:hover,\n.btn-yahoo.disabled:focus,\n.btn-yahoo[disabled]:focus,\nfieldset[disabled] .btn-yahoo:focus,\n.btn-yahoo.disabled.focus,\n.btn-yahoo[disabled].focus,\nfieldset[disabled] .btn-yahoo.focus,\n.btn-yahoo.disabled:active,\n.btn-yahoo[disabled]:active,\nfieldset[disabled] .btn-yahoo:active,\n.btn-yahoo.disabled.active,\n.btn-yahoo[disabled].active,\nfieldset[disabled] .btn-yahoo.active {\n  background-color: #720e9e;\n  border-color: rgba(0, 0, 0, 0.2);\n}\n.btn-yahoo .badge {\n  color: #720e9e;\n  background-color: #720e9e;\n}\n/*!\nIonicons, v2.0.0\nCreated by Ben Sperry for the Ionic Framework, http://ionicons.com/\nhttps://twitter.com/benjsperry  https://twitter.com/ionicframework\nMIT License: https://github.com/driftyco/ionicons\n*/\n@font-face {\n  font-family: \"Ionicons\";\n  src: url(\"../fonts/ionicons.eot?v=2.0.0\");\n  src: url(\"../fonts/ionicons.eot?v=2.0.0#iefix\") format(\"embedded-opentype\"), url(\"../fonts/ionicons.ttf?v=2.0.0\") format(\"truetype\"), url(\"../fonts/ionicons.woff?v=2.0.0\") format(\"woff\"), url(\"../fonts/ionicons.svg?v=2.0.0#Ionicons\") format(\"svg\");\n  font-weight: normal;\n  font-style: normal;\n}\n.ion,\n.ion-loading-a,\n.ion-loading-b,\n.ion-loading-c,\n.ion-loading-d,\n.ion-looping,\n.ion-refreshing,\n.ion-ios7-reloading,\n.ionicons,\n.ion-alert:before,\n.ion-alert-circled:before,\n.ion-android-add:before,\n.ion-android-add-circle:before,\n.ion-android-alarm-clock:before,\n.ion-android-alert:before,\n.ion-android-apps:before,\n.ion-android-archive:before,\n.ion-android-arrow-back:before,\n.ion-android-arrow-down:before,\n.ion-android-arrow-dropdown:before,\n.ion-android-arrow-dropdown-circle:before,\n.ion-android-arrow-dropleft:before,\n.ion-android-arrow-dropleft-circle:before,\n.ion-android-arrow-dropright:before,\n.ion-android-arrow-dropright-circle:before,\n.ion-android-arrow-dropup:before,\n.ion-android-arrow-dropup-circle:before,\n.ion-android-arrow-forward:before,\n.ion-android-arrow-up:before,\n.ion-android-attach:before,\n.ion-android-bar:before,\n.ion-android-bicycle:before,\n.ion-android-boat:before,\n.ion-android-bookmark:before,\n.ion-android-bulb:before,\n.ion-android-bus:before,\n.ion-android-calendar:before,\n.ion-android-call:before,\n.ion-android-camera:before,\n.ion-android-cancel:before,\n.ion-android-car:before,\n.ion-android-cart:before,\n.ion-android-chat:before,\n.ion-android-checkbox:before,\n.ion-android-checkbox-blank:before,\n.ion-android-checkbox-outline:before,\n.ion-android-checkbox-outline-blank:before,\n.ion-android-checkmark-circle:before,\n.ion-android-clipboard:before,\n.ion-android-close:before,\n.ion-android-cloud:before,\n.ion-android-cloud-circle:before,\n.ion-android-cloud-done:before,\n.ion-android-cloud-outline:before,\n.ion-android-color-palette:before,\n.ion-android-compass:before,\n.ion-android-contact:before,\n.ion-android-contacts:before,\n.ion-android-contract:before,\n.ion-android-create:before,\n.ion-android-delete:before,\n.ion-android-desktop:before,\n.ion-android-document:before,\n.ion-android-done:before,\n.ion-android-done-all:before,\n.ion-android-download:before,\n.ion-android-drafts:before,\n.ion-android-exit:before,\n.ion-android-expand:before,\n.ion-android-favorite:before,\n.ion-android-favorite-outline:before,\n.ion-android-film:before,\n.ion-android-folder:before,\n.ion-android-folder-open:before,\n.ion-android-funnel:before,\n.ion-android-globe:before,\n.ion-android-hand:before,\n.ion-android-hangout:before,\n.ion-android-happy:before,\n.ion-android-home:before,\n.ion-android-image:before,\n.ion-android-laptop:before,\n.ion-android-list:before,\n.ion-android-locate:before,\n.ion-android-lock:before,\n.ion-android-mail:before,\n.ion-android-map:before,\n.ion-android-menu:before,\n.ion-android-microphone:before,\n.ion-android-microphone-off:before,\n.ion-android-more-horizontal:before,\n.ion-android-more-vertical:before,\n.ion-android-navigate:before,\n.ion-android-notifications:before,\n.ion-android-notifications-none:before,\n.ion-android-notifications-off:before,\n.ion-android-open:before,\n.ion-android-options:before,\n.ion-android-people:before,\n.ion-android-person:before,\n.ion-android-person-add:before,\n.ion-android-phone-landscape:before,\n.ion-android-phone-portrait:before,\n.ion-android-pin:before,\n.ion-android-plane:before,\n.ion-android-playstore:before,\n.ion-android-print:before,\n.ion-android-radio-button-off:before,\n.ion-android-radio-button-on:before,\n.ion-android-refresh:before,\n.ion-android-remove:before,\n.ion-android-remove-circle:before,\n.ion-android-restaurant:before,\n.ion-android-sad:before,\n.ion-android-search:before,\n.ion-android-send:before,\n.ion-android-settings:before,\n.ion-android-share:before,\n.ion-android-share-alt:before,\n.ion-android-star:before,\n.ion-android-star-half:before,\n.ion-android-star-outline:before,\n.ion-android-stopwatch:before,\n.ion-android-subway:before,\n.ion-android-sunny:before,\n.ion-android-sync:before,\n.ion-android-textsms:before,\n.ion-android-time:before,\n.ion-android-train:before,\n.ion-android-unlock:before,\n.ion-android-upload:before,\n.ion-android-volume-down:before,\n.ion-android-volume-mute:before,\n.ion-android-volume-off:before,\n.ion-android-volume-up:before,\n.ion-android-walk:before,\n.ion-android-warning:before,\n.ion-android-watch:before,\n.ion-android-wifi:before,\n.ion-aperture:before,\n.ion-archive:before,\n.ion-arrow-down-a:before,\n.ion-arrow-down-b:before,\n.ion-arrow-down-c:before,\n.ion-arrow-expand:before,\n.ion-arrow-graph-down-left:before,\n.ion-arrow-graph-down-right:before,\n.ion-arrow-graph-up-left:before,\n.ion-arrow-graph-up-right:before,\n.ion-arrow-left-a:before,\n.ion-arrow-left-b:before,\n.ion-arrow-left-c:before,\n.ion-arrow-move:before,\n.ion-arrow-resize:before,\n.ion-arrow-return-left:before,\n.ion-arrow-return-right:before,\n.ion-arrow-right-a:before,\n.ion-arrow-right-b:before,\n.ion-arrow-right-c:before,\n.ion-arrow-shrink:before,\n.ion-arrow-swap:before,\n.ion-arrow-up-a:before,\n.ion-arrow-up-b:before,\n.ion-arrow-up-c:before,\n.ion-asterisk:before,\n.ion-at:before,\n.ion-backspace:before,\n.ion-backspace-outline:before,\n.ion-bag:before,\n.ion-battery-charging:before,\n.ion-battery-empty:before,\n.ion-battery-full:before,\n.ion-battery-half:before,\n.ion-battery-low:before,\n.ion-beaker:before,\n.ion-beer:before,\n.ion-bluetooth:before,\n.ion-bonfire:before,\n.ion-bookmark:before,\n.ion-bowtie:before,\n.ion-briefcase:before,\n.ion-bug:before,\n.ion-calculator:before,\n.ion-calendar:before,\n.ion-camera:before,\n.ion-card:before,\n.ion-cash:before,\n.ion-chatbox:before,\n.ion-chatbox-working:before,\n.ion-chatboxes:before,\n.ion-chatbubble:before,\n.ion-chatbubble-working:before,\n.ion-chatbubbles:before,\n.ion-checkmark:before,\n.ion-checkmark-circled:before,\n.ion-checkmark-round:before,\n.ion-chevron-down:before,\n.ion-chevron-left:before,\n.ion-chevron-right:before,\n.ion-chevron-up:before,\n.ion-clipboard:before,\n.ion-clock:before,\n.ion-close:before,\n.ion-close-circled:before,\n.ion-close-round:before,\n.ion-closed-captioning:before,\n.ion-cloud:before,\n.ion-code:before,\n.ion-code-download:before,\n.ion-code-working:before,\n.ion-coffee:before,\n.ion-compass:before,\n.ion-compose:before,\n.ion-connection-bars:before,\n.ion-contrast:before,\n.ion-crop:before,\n.ion-cube:before,\n.ion-disc:before,\n.ion-document:before,\n.ion-document-text:before,\n.ion-drag:before,\n.ion-earth:before,\n.ion-easel:before,\n.ion-edit:before,\n.ion-egg:before,\n.ion-eject:before,\n.ion-email:before,\n.ion-email-unread:before,\n.ion-erlenmeyer-flask:before,\n.ion-erlenmeyer-flask-bubbles:before,\n.ion-eye:before,\n.ion-eye-disabled:before,\n.ion-female:before,\n.ion-filing:before,\n.ion-film-marker:before,\n.ion-fireball:before,\n.ion-flag:before,\n.ion-flame:before,\n.ion-flash:before,\n.ion-flash-off:before,\n.ion-folder:before,\n.ion-fork:before,\n.ion-fork-repo:before,\n.ion-forward:before,\n.ion-funnel:before,\n.ion-gear-a:before,\n.ion-gear-b:before,\n.ion-grid:before,\n.ion-hammer:before,\n.ion-happy:before,\n.ion-happy-outline:before,\n.ion-headphone:before,\n.ion-heart:before,\n.ion-heart-broken:before,\n.ion-help:before,\n.ion-help-buoy:before,\n.ion-help-circled:before,\n.ion-home:before,\n.ion-icecream:before,\n.ion-image:before,\n.ion-images:before,\n.ion-information:before,\n.ion-information-circled:before,\n.ion-ionic:before,\n.ion-ios-alarm:before,\n.ion-ios-alarm-outline:before,\n.ion-ios-albums:before,\n.ion-ios-albums-outline:before,\n.ion-ios-americanfootball:before,\n.ion-ios-americanfootball-outline:before,\n.ion-ios-analytics:before,\n.ion-ios-analytics-outline:before,\n.ion-ios-arrow-back:before,\n.ion-ios-arrow-down:before,\n.ion-ios-arrow-forward:before,\n.ion-ios-arrow-left:before,\n.ion-ios-arrow-right:before,\n.ion-ios-arrow-thin-down:before,\n.ion-ios-arrow-thin-left:before,\n.ion-ios-arrow-thin-right:before,\n.ion-ios-arrow-thin-up:before,\n.ion-ios-arrow-up:before,\n.ion-ios-at:before,\n.ion-ios-at-outline:before,\n.ion-ios-barcode:before,\n.ion-ios-barcode-outline:before,\n.ion-ios-baseball:before,\n.ion-ios-baseball-outline:before,\n.ion-ios-basketball:before,\n.ion-ios-basketball-outline:before,\n.ion-ios-bell:before,\n.ion-ios-bell-outline:before,\n.ion-ios-body:before,\n.ion-ios-body-outline:before,\n.ion-ios-bolt:before,\n.ion-ios-bolt-outline:before,\n.ion-ios-book:before,\n.ion-ios-book-outline:before,\n.ion-ios-bookmarks:before,\n.ion-ios-bookmarks-outline:before,\n.ion-ios-box:before,\n.ion-ios-box-outline:before,\n.ion-ios-briefcase:before,\n.ion-ios-briefcase-outline:before,\n.ion-ios-browsers:before,\n.ion-ios-browsers-outline:before,\n.ion-ios-calculator:before,\n.ion-ios-calculator-outline:before,\n.ion-ios-calendar:before,\n.ion-ios-calendar-outline:before,\n.ion-ios-camera:before,\n.ion-ios-camera-outline:before,\n.ion-ios-cart:before,\n.ion-ios-cart-outline:before,\n.ion-ios-chatboxes:before,\n.ion-ios-chatboxes-outline:before,\n.ion-ios-chatbubble:before,\n.ion-ios-chatbubble-outline:before,\n.ion-ios-checkmark:before,\n.ion-ios-checkmark-empty:before,\n.ion-ios-checkmark-outline:before,\n.ion-ios-circle-filled:before,\n.ion-ios-circle-outline:before,\n.ion-ios-clock:before,\n.ion-ios-clock-outline:before,\n.ion-ios-close:before,\n.ion-ios-close-empty:before,\n.ion-ios-close-outline:before,\n.ion-ios-cloud:before,\n.ion-ios-cloud-download:before,\n.ion-ios-cloud-download-outline:before,\n.ion-ios-cloud-outline:before,\n.ion-ios-cloud-upload:before,\n.ion-ios-cloud-upload-outline:before,\n.ion-ios-cloudy:before,\n.ion-ios-cloudy-night:before,\n.ion-ios-cloudy-night-outline:before,\n.ion-ios-cloudy-outline:before,\n.ion-ios-cog:before,\n.ion-ios-cog-outline:before,\n.ion-ios-color-filter:before,\n.ion-ios-color-filter-outline:before,\n.ion-ios-color-wand:before,\n.ion-ios-color-wand-outline:before,\n.ion-ios-compose:before,\n.ion-ios-compose-outline:before,\n.ion-ios-contact:before,\n.ion-ios-contact-outline:before,\n.ion-ios-copy:before,\n.ion-ios-copy-outline:before,\n.ion-ios-crop:before,\n.ion-ios-crop-strong:before,\n.ion-ios-download:before,\n.ion-ios-download-outline:before,\n.ion-ios-drag:before,\n.ion-ios-email:before,\n.ion-ios-email-outline:before,\n.ion-ios-eye:before,\n.ion-ios-eye-outline:before,\n.ion-ios-fastforward:before,\n.ion-ios-fastforward-outline:before,\n.ion-ios-filing:before,\n.ion-ios-filing-outline:before,\n.ion-ios-film:before,\n.ion-ios-film-outline:before,\n.ion-ios-flag:before,\n.ion-ios-flag-outline:before,\n.ion-ios-flame:before,\n.ion-ios-flame-outline:before,\n.ion-ios-flask:before,\n.ion-ios-flask-outline:before,\n.ion-ios-flower:before,\n.ion-ios-flower-outline:before,\n.ion-ios-folder:before,\n.ion-ios-folder-outline:before,\n.ion-ios-football:before,\n.ion-ios-football-outline:before,\n.ion-ios-game-controller-a:before,\n.ion-ios-game-controller-a-outline:before,\n.ion-ios-game-controller-b:before,\n.ion-ios-game-controller-b-outline:before,\n.ion-ios-gear:before,\n.ion-ios-gear-outline:before,\n.ion-ios-glasses:before,\n.ion-ios-glasses-outline:before,\n.ion-ios-grid-view:before,\n.ion-ios-grid-view-outline:before,\n.ion-ios-heart:before,\n.ion-ios-heart-outline:before,\n.ion-ios-help:before,\n.ion-ios-help-empty:before,\n.ion-ios-help-outline:before,\n.ion-ios-home:before,\n.ion-ios-home-outline:before,\n.ion-ios-infinite:before,\n.ion-ios-infinite-outline:before,\n.ion-ios-information:before,\n.ion-ios-information-empty:before,\n.ion-ios-information-outline:before,\n.ion-ios-ionic-outline:before,\n.ion-ios-keypad:before,\n.ion-ios-keypad-outline:before,\n.ion-ios-lightbulb:before,\n.ion-ios-lightbulb-outline:before,\n.ion-ios-list:before,\n.ion-ios-list-outline:before,\n.ion-ios-location:before,\n.ion-ios-location-outline:before,\n.ion-ios-locked:before,\n.ion-ios-locked-outline:before,\n.ion-ios-loop:before,\n.ion-ios-loop-strong:before,\n.ion-ios-medical:before,\n.ion-ios-medical-outline:before,\n.ion-ios-medkit:before,\n.ion-ios-medkit-outline:before,\n.ion-ios-mic:before,\n.ion-ios-mic-off:before,\n.ion-ios-mic-outline:before,\n.ion-ios-minus:before,\n.ion-ios-minus-empty:before,\n.ion-ios-minus-outline:before,\n.ion-ios-monitor:before,\n.ion-ios-monitor-outline:before,\n.ion-ios-moon:before,\n.ion-ios-moon-outline:before,\n.ion-ios-more:before,\n.ion-ios-more-outline:before,\n.ion-ios-musical-note:before,\n.ion-ios-musical-notes:before,\n.ion-ios-navigate:before,\n.ion-ios-navigate-outline:before,\n.ion-ios-nutrition:before,\n.ion-ios-nutrition-outline:before,\n.ion-ios-paper:before,\n.ion-ios-paper-outline:before,\n.ion-ios-paperplane:before,\n.ion-ios-paperplane-outline:before,\n.ion-ios-partlysunny:before,\n.ion-ios-partlysunny-outline:before,\n.ion-ios-pause:before,\n.ion-ios-pause-outline:before,\n.ion-ios-paw:before,\n.ion-ios-paw-outline:before,\n.ion-ios-people:before,\n.ion-ios-people-outline:before,\n.ion-ios-person:before,\n.ion-ios-person-outline:before,\n.ion-ios-personadd:before,\n.ion-ios-personadd-outline:before,\n.ion-ios-photos:before,\n.ion-ios-photos-outline:before,\n.ion-ios-pie:before,\n.ion-ios-pie-outline:before,\n.ion-ios-pint:before,\n.ion-ios-pint-outline:before,\n.ion-ios-play:before,\n.ion-ios-play-outline:before,\n.ion-ios-plus:before,\n.ion-ios-plus-empty:before,\n.ion-ios-plus-outline:before,\n.ion-ios-pricetag:before,\n.ion-ios-pricetag-outline:before,\n.ion-ios-pricetags:before,\n.ion-ios-pricetags-outline:before,\n.ion-ios-printer:before,\n.ion-ios-printer-outline:before,\n.ion-ios-pulse:before,\n.ion-ios-pulse-strong:before,\n.ion-ios-rainy:before,\n.ion-ios-rainy-outline:before,\n.ion-ios-recording:before,\n.ion-ios-recording-outline:before,\n.ion-ios-redo:before,\n.ion-ios-redo-outline:before,\n.ion-ios-refresh:before,\n.ion-ios-refresh-empty:before,\n.ion-ios-refresh-outline:before,\n.ion-ios-reload:before,\n.ion-ios-reverse-camera:before,\n.ion-ios-reverse-camera-outline:before,\n.ion-ios-rewind:before,\n.ion-ios-rewind-outline:before,\n.ion-ios-rose:before,\n.ion-ios-rose-outline:before,\n.ion-ios-search:before,\n.ion-ios-search-strong:before,\n.ion-ios-settings:before,\n.ion-ios-settings-strong:before,\n.ion-ios-shuffle:before,\n.ion-ios-shuffle-strong:before,\n.ion-ios-skipbackward:before,\n.ion-ios-skipbackward-outline:before,\n.ion-ios-skipforward:before,\n.ion-ios-skipforward-outline:before,\n.ion-ios-snowy:before,\n.ion-ios-speedometer:before,\n.ion-ios-speedometer-outline:before,\n.ion-ios-star:before,\n.ion-ios-star-half:before,\n.ion-ios-star-outline:before,\n.ion-ios-stopwatch:before,\n.ion-ios-stopwatch-outline:before,\n.ion-ios-sunny:before,\n.ion-ios-sunny-outline:before,\n.ion-ios-telephone:before,\n.ion-ios-telephone-outline:before,\n.ion-ios-tennisball:before,\n.ion-ios-tennisball-outline:before,\n.ion-ios-thunderstorm:before,\n.ion-ios-thunderstorm-outline:before,\n.ion-ios-time:before,\n.ion-ios-time-outline:before,\n.ion-ios-timer:before,\n.ion-ios-timer-outline:before,\n.ion-ios-toggle:before,\n.ion-ios-toggle-outline:before,\n.ion-ios-trash:before,\n.ion-ios-trash-outline:before,\n.ion-ios-undo:before,\n.ion-ios-undo-outline:before,\n.ion-ios-unlocked:before,\n.ion-ios-unlocked-outline:before,\n.ion-ios-upload:before,\n.ion-ios-upload-outline:before,\n.ion-ios-videocam:before,\n.ion-ios-videocam-outline:before,\n.ion-ios-volume-high:before,\n.ion-ios-volume-low:before,\n.ion-ios-wineglass:before,\n.ion-ios-wineglass-outline:before,\n.ion-ios-world:before,\n.ion-ios-world-outline:before,\n.ion-ipad:before,\n.ion-iphone:before,\n.ion-ipod:before,\n.ion-jet:before,\n.ion-key:before,\n.ion-knife:before,\n.ion-laptop:before,\n.ion-leaf:before,\n.ion-levels:before,\n.ion-lightbulb:before,\n.ion-link:before,\n.ion-load-a:before,\n.ion-load-b:before,\n.ion-load-c:before,\n.ion-load-d:before,\n.ion-location:before,\n.ion-lock-combination:before,\n.ion-locked:before,\n.ion-log-in:before,\n.ion-log-out:before,\n.ion-loop:before,\n.ion-magnet:before,\n.ion-male:before,\n.ion-man:before,\n.ion-map:before,\n.ion-medkit:before,\n.ion-merge:before,\n.ion-mic-a:before,\n.ion-mic-b:before,\n.ion-mic-c:before,\n.ion-minus:before,\n.ion-minus-circled:before,\n.ion-minus-round:before,\n.ion-model-s:before,\n.ion-monitor:before,\n.ion-more:before,\n.ion-mouse:before,\n.ion-music-note:before,\n.ion-navicon:before,\n.ion-navicon-round:before,\n.ion-navigate:before,\n.ion-network:before,\n.ion-no-smoking:before,\n.ion-nuclear:before,\n.ion-outlet:before,\n.ion-paintbrush:before,\n.ion-paintbucket:before,\n.ion-paper-airplane:before,\n.ion-paperclip:before,\n.ion-pause:before,\n.ion-person:before,\n.ion-person-add:before,\n.ion-person-stalker:before,\n.ion-pie-graph:before,\n.ion-pin:before,\n.ion-pinpoint:before,\n.ion-pizza:before,\n.ion-plane:before,\n.ion-planet:before,\n.ion-play:before,\n.ion-playstation:before,\n.ion-plus:before,\n.ion-plus-circled:before,\n.ion-plus-round:before,\n.ion-podium:before,\n.ion-pound:before,\n.ion-power:before,\n.ion-pricetag:before,\n.ion-pricetags:before,\n.ion-printer:before,\n.ion-pull-request:before,\n.ion-qr-scanner:before,\n.ion-quote:before,\n.ion-radio-waves:before,\n.ion-record:before,\n.ion-refresh:before,\n.ion-reply:before,\n.ion-reply-all:before,\n.ion-ribbon-a:before,\n.ion-ribbon-b:before,\n.ion-sad:before,\n.ion-sad-outline:before,\n.ion-scissors:before,\n.ion-search:before,\n.ion-settings:before,\n.ion-share:before,\n.ion-shuffle:before,\n.ion-skip-backward:before,\n.ion-skip-forward:before,\n.ion-social-android:before,\n.ion-social-android-outline:before,\n.ion-social-angular:before,\n.ion-social-angular-outline:before,\n.ion-social-apple:before,\n.ion-social-apple-outline:before,\n.ion-social-bitcoin:before,\n.ion-social-bitcoin-outline:before,\n.ion-social-buffer:before,\n.ion-social-buffer-outline:before,\n.ion-social-chrome:before,\n.ion-social-chrome-outline:before,\n.ion-social-codepen:before,\n.ion-social-codepen-outline:before,\n.ion-social-css3:before,\n.ion-social-css3-outline:before,\n.ion-social-designernews:before,\n.ion-social-designernews-outline:before,\n.ion-social-dribbble:before,\n.ion-social-dribbble-outline:before,\n.ion-social-dropbox:before,\n.ion-social-dropbox-outline:before,\n.ion-social-euro:before,\n.ion-social-euro-outline:before,\n.ion-social-facebook:before,\n.ion-social-facebook-outline:before,\n.ion-social-foursquare:before,\n.ion-social-foursquare-outline:before,\n.ion-social-freebsd-devil:before,\n.ion-social-github:before,\n.ion-social-github-outline:before,\n.ion-social-google:before,\n.ion-social-google-outline:before,\n.ion-social-googleplus:before,\n.ion-social-googleplus-outline:before,\n.ion-social-hackernews:before,\n.ion-social-hackernews-outline:before,\n.ion-social-html5:before,\n.ion-social-html5-outline:before,\n.ion-social-instagram:before,\n.ion-social-instagram-outline:before,\n.ion-social-javascript:before,\n.ion-social-javascript-outline:before,\n.ion-social-linkedin:before,\n.ion-social-linkedin-outline:before,\n.ion-social-markdown:before,\n.ion-social-nodejs:before,\n.ion-social-octocat:before,\n.ion-social-pinterest:before,\n.ion-social-pinterest-outline:before,\n.ion-social-python:before,\n.ion-social-reddit:before,\n.ion-social-reddit-outline:before,\n.ion-social-rss:before,\n.ion-social-rss-outline:before,\n.ion-social-sass:before,\n.ion-social-skype:before,\n.ion-social-skype-outline:before,\n.ion-social-snapchat:before,\n.ion-social-snapchat-outline:before,\n.ion-social-tumblr:before,\n.ion-social-tumblr-outline:before,\n.ion-social-tux:before,\n.ion-social-twitch:before,\n.ion-social-twitch-outline:before,\n.ion-social-twitter:before,\n.ion-social-twitter-outline:before,\n.ion-social-usd:before,\n.ion-social-usd-outline:before,\n.ion-social-vimeo:before,\n.ion-social-vimeo-outline:before,\n.ion-social-whatsapp:before,\n.ion-social-whatsapp-outline:before,\n.ion-social-windows:before,\n.ion-social-windows-outline:before,\n.ion-social-wordpress:before,\n.ion-social-wordpress-outline:before,\n.ion-social-yahoo:before,\n.ion-social-yahoo-outline:before,\n.ion-social-yen:before,\n.ion-social-yen-outline:before,\n.ion-social-youtube:before,\n.ion-social-youtube-outline:before,\n.ion-soup-can:before,\n.ion-soup-can-outline:before,\n.ion-speakerphone:before,\n.ion-speedometer:before,\n.ion-spoon:before,\n.ion-star:before,\n.ion-stats-bars:before,\n.ion-steam:before,\n.ion-stop:before,\n.ion-thermometer:before,\n.ion-thumbsdown:before,\n.ion-thumbsup:before,\n.ion-toggle:before,\n.ion-toggle-filled:before,\n.ion-transgender:before,\n.ion-trash-a:before,\n.ion-trash-b:before,\n.ion-trophy:before,\n.ion-tshirt:before,\n.ion-tshirt-outline:before,\n.ion-umbrella:before,\n.ion-university:before,\n.ion-unlocked:before,\n.ion-upload:before,\n.ion-usb:before,\n.ion-videocamera:before,\n.ion-volume-high:before,\n.ion-volume-low:before,\n.ion-volume-medium:before,\n.ion-volume-mute:before,\n.ion-wand:before,\n.ion-waterdrop:before,\n.ion-wifi:before,\n.ion-wineglass:before,\n.ion-woman:before,\n.ion-wrench:before,\n.ion-xbox:before {\n  display: inline-block;\n  font-family: \"Ionicons\";\n  speak: none;\n  font-style: normal;\n  font-weight: normal;\n  font-variant: normal;\n  text-transform: none;\n  text-rendering: auto;\n  line-height: 1;\n  -webkit-font-smoothing: antialiased;\n  -moz-osx-font-smoothing: grayscale;\n}\n.ion-spin,\n.ion-loading-a,\n.ion-loading-b,\n.ion-loading-c,\n.ion-loading-d,\n.ion-looping,\n.ion-refreshing,\n.ion-ios7-reloading {\n  -webkit-animation: spin 1s infinite linear;\n  -moz-animation: spin 1s infinite linear;\n  -o-animation: spin 1s infinite linear;\n  animation: spin 1s infinite linear;\n}\n@-moz-keyframes spin {\n  0% {\n    -moz-transform: rotate(0deg);\n  }\n  100% {\n    -moz-transform: rotate(359deg);\n  }\n}\n@-webkit-keyframes spin {\n  0% {\n    -webkit-transform: rotate(0deg);\n  }\n  100% {\n    -webkit-transform: rotate(359deg);\n  }\n}\n@-o-keyframes spin {\n  0% {\n    -o-transform: rotate(0deg);\n  }\n  100% {\n    -o-transform: rotate(359deg);\n  }\n}\n@-ms-keyframes spin {\n  0% {\n    -ms-transform: rotate(0deg);\n  }\n  100% {\n    -ms-transform: rotate(359deg);\n  }\n}\n@keyframes spin {\n  0% {\n    transform: rotate(0deg);\n  }\n  100% {\n    transform: rotate(359deg);\n  }\n}\n.ion-loading-a {\n  -webkit-animation-timing-function: steps(8, start);\n  -moz-animation-timing-function: steps(8, start);\n  animation-timing-function: steps(8, start);\n}\n.ion-alert:before {\n  content: \"\\f101\";\n}\n.ion-alert-circled:before {\n  content: \"\\f100\";\n}\n.ion-android-add:before {\n  content: \"\\f2c7\";\n}\n.ion-android-add-circle:before {\n  content: \"\\f359\";\n}\n.ion-android-alarm-clock:before {\n  content: \"\\f35a\";\n}\n.ion-android-alert:before {\n  content: \"\\f35b\";\n}\n.ion-android-apps:before {\n  content: \"\\f35c\";\n}\n.ion-android-archive:before {\n  content: \"\\f2c9\";\n}\n.ion-android-arrow-back:before {\n  content: \"\\f2ca\";\n}\n.ion-android-arrow-down:before {\n  content: \"\\f35d\";\n}\n.ion-android-arrow-dropdown:before {\n  content: \"\\f35f\";\n}\n.ion-android-arrow-dropdown-circle:before {\n  content: \"\\f35e\";\n}\n.ion-android-arrow-dropleft:before {\n  content: \"\\f361\";\n}\n.ion-android-arrow-dropleft-circle:before {\n  content: \"\\f360\";\n}\n.ion-android-arrow-dropright:before {\n  content: \"\\f363\";\n}\n.ion-android-arrow-dropright-circle:before {\n  content: \"\\f362\";\n}\n.ion-android-arrow-dropup:before {\n  content: \"\\f365\";\n}\n.ion-android-arrow-dropup-circle:before {\n  content: \"\\f364\";\n}\n.ion-android-arrow-forward:before {\n  content: \"\\f30f\";\n}\n.ion-android-arrow-up:before {\n  content: \"\\f366\";\n}\n.ion-android-attach:before {\n  content: \"\\f367\";\n}\n.ion-android-bar:before {\n  content: \"\\f368\";\n}\n.ion-android-bicycle:before {\n  content: \"\\f369\";\n}\n.ion-android-boat:before {\n  content: \"\\f36a\";\n}\n.ion-android-bookmark:before {\n  content: \"\\f36b\";\n}\n.ion-android-bulb:before {\n  content: \"\\f36c\";\n}\n.ion-android-bus:before {\n  content: \"\\f36d\";\n}\n.ion-android-calendar:before {\n  content: \"\\f2d1\";\n}\n.ion-android-call:before {\n  content: \"\\f2d2\";\n}\n.ion-android-camera:before {\n  content: \"\\f2d3\";\n}\n.ion-android-cancel:before {\n  content: \"\\f36e\";\n}\n.ion-android-car:before {\n  content: \"\\f36f\";\n}\n.ion-android-cart:before {\n  content: \"\\f370\";\n}\n.ion-android-chat:before {\n  content: \"\\f2d4\";\n}\n.ion-android-checkbox:before {\n  content: \"\\f374\";\n}\n.ion-android-checkbox-blank:before {\n  content: \"\\f371\";\n}\n.ion-android-checkbox-outline:before {\n  content: \"\\f373\";\n}\n.ion-android-checkbox-outline-blank:before {\n  content: \"\\f372\";\n}\n.ion-android-checkmark-circle:before {\n  content: \"\\f375\";\n}\n.ion-android-clipboard:before {\n  content: \"\\f376\";\n}\n.ion-android-close:before {\n  content: \"\\f2d7\";\n}\n.ion-android-cloud:before {\n  content: \"\\f37a\";\n}\n.ion-android-cloud-circle:before {\n  content: \"\\f377\";\n}\n.ion-android-cloud-done:before {\n  content: \"\\f378\";\n}\n.ion-android-cloud-outline:before {\n  content: \"\\f379\";\n}\n.ion-android-color-palette:before {\n  content: \"\\f37b\";\n}\n.ion-android-compass:before {\n  content: \"\\f37c\";\n}\n.ion-android-contact:before {\n  content: \"\\f2d8\";\n}\n.ion-android-contacts:before {\n  content: \"\\f2d9\";\n}\n.ion-android-contract:before {\n  content: \"\\f37d\";\n}\n.ion-android-create:before {\n  content: \"\\f37e\";\n}\n.ion-android-delete:before {\n  content: \"\\f37f\";\n}\n.ion-android-desktop:before {\n  content: \"\\f380\";\n}\n.ion-android-document:before {\n  content: \"\\f381\";\n}\n.ion-android-done:before {\n  content: \"\\f383\";\n}\n.ion-android-done-all:before {\n  content: \"\\f382\";\n}\n.ion-android-download:before {\n  content: \"\\f2dd\";\n}\n.ion-android-drafts:before {\n  content: \"\\f384\";\n}\n.ion-android-exit:before {\n  content: \"\\f385\";\n}\n.ion-android-expand:before {\n  content: \"\\f386\";\n}\n.ion-android-favorite:before {\n  content: \"\\f388\";\n}\n.ion-android-favorite-outline:before {\n  content: \"\\f387\";\n}\n.ion-android-film:before {\n  content: \"\\f389\";\n}\n.ion-android-folder:before {\n  content: \"\\f2e0\";\n}\n.ion-android-folder-open:before {\n  content: \"\\f38a\";\n}\n.ion-android-funnel:before {\n  content: \"\\f38b\";\n}\n.ion-android-globe:before {\n  content: \"\\f38c\";\n}\n.ion-android-hand:before {\n  content: \"\\f2e3\";\n}\n.ion-android-hangout:before {\n  content: \"\\f38d\";\n}\n.ion-android-happy:before {\n  content: \"\\f38e\";\n}\n.ion-android-home:before {\n  content: \"\\f38f\";\n}\n.ion-android-image:before {\n  content: \"\\f2e4\";\n}\n.ion-android-laptop:before {\n  content: \"\\f390\";\n}\n.ion-android-list:before {\n  content: \"\\f391\";\n}\n.ion-android-locate:before {\n  content: \"\\f2e9\";\n}\n.ion-android-lock:before {\n  content: \"\\f392\";\n}\n.ion-android-mail:before {\n  content: \"\\f2eb\";\n}\n.ion-android-map:before {\n  content: \"\\f393\";\n}\n.ion-android-menu:before {\n  content: \"\\f394\";\n}\n.ion-android-microphone:before {\n  content: \"\\f2ec\";\n}\n.ion-android-microphone-off:before {\n  content: \"\\f395\";\n}\n.ion-android-more-horizontal:before {\n  content: \"\\f396\";\n}\n.ion-android-more-vertical:before {\n  content: \"\\f397\";\n}\n.ion-android-navigate:before {\n  content: \"\\f398\";\n}\n.ion-android-notifications:before {\n  content: \"\\f39b\";\n}\n.ion-android-notifications-none:before {\n  content: \"\\f399\";\n}\n.ion-android-notifications-off:before {\n  content: \"\\f39a\";\n}\n.ion-android-open:before {\n  content: \"\\f39c\";\n}\n.ion-android-options:before {\n  content: \"\\f39d\";\n}\n.ion-android-people:before {\n  content: \"\\f39e\";\n}\n.ion-android-person:before {\n  content: \"\\f3a0\";\n}\n.ion-android-person-add:before {\n  content: \"\\f39f\";\n}\n.ion-android-phone-landscape:before {\n  content: \"\\f3a1\";\n}\n.ion-android-phone-portrait:before {\n  content: \"\\f3a2\";\n}\n.ion-android-pin:before {\n  content: \"\\f3a3\";\n}\n.ion-android-plane:before {\n  content: \"\\f3a4\";\n}\n.ion-android-playstore:before {\n  content: \"\\f2f0\";\n}\n.ion-android-print:before {\n  content: \"\\f3a5\";\n}\n.ion-android-radio-button-off:before {\n  content: \"\\f3a6\";\n}\n.ion-android-radio-button-on:before {\n  content: \"\\f3a7\";\n}\n.ion-android-refresh:before {\n  content: \"\\f3a8\";\n}\n.ion-android-remove:before {\n  content: \"\\f2f4\";\n}\n.ion-android-remove-circle:before {\n  content: \"\\f3a9\";\n}\n.ion-android-restaurant:before {\n  content: \"\\f3aa\";\n}\n.ion-android-sad:before {\n  content: \"\\f3ab\";\n}\n.ion-android-search:before {\n  content: \"\\f2f5\";\n}\n.ion-android-send:before {\n  content: \"\\f2f6\";\n}\n.ion-android-settings:before {\n  content: \"\\f2f7\";\n}\n.ion-android-share:before {\n  content: \"\\f2f8\";\n}\n.ion-android-share-alt:before {\n  content: \"\\f3ac\";\n}\n.ion-android-star:before {\n  content: \"\\f2fc\";\n}\n.ion-android-star-half:before {\n  content: \"\\f3ad\";\n}\n.ion-android-star-outline:before {\n  content: \"\\f3ae\";\n}\n.ion-android-stopwatch:before {\n  content: \"\\f2fd\";\n}\n.ion-android-subway:before {\n  content: \"\\f3af\";\n}\n.ion-android-sunny:before {\n  content: \"\\f3b0\";\n}\n.ion-android-sync:before {\n  content: \"\\f3b1\";\n}\n.ion-android-textsms:before {\n  content: \"\\f3b2\";\n}\n.ion-android-time:before {\n  content: \"\\f3b3\";\n}\n.ion-android-train:before {\n  content: \"\\f3b4\";\n}\n.ion-android-unlock:before {\n  content: \"\\f3b5\";\n}\n.ion-android-upload:before {\n  content: \"\\f3b6\";\n}\n.ion-android-volume-down:before {\n  content: \"\\f3b7\";\n}\n.ion-android-volume-mute:before {\n  content: \"\\f3b8\";\n}\n.ion-android-volume-off:before {\n  content: \"\\f3b9\";\n}\n.ion-android-volume-up:before {\n  content: \"\\f3ba\";\n}\n.ion-android-walk:before {\n  content: \"\\f3bb\";\n}\n.ion-android-warning:before {\n  content: \"\\f3bc\";\n}\n.ion-android-watch:before {\n  content: \"\\f3bd\";\n}\n.ion-android-wifi:before {\n  content: \"\\f305\";\n}\n.ion-aperture:before {\n  content: \"\\f313\";\n}\n.ion-archive:before {\n  content: \"\\f102\";\n}\n.ion-arrow-down-a:before {\n  content: \"\\f103\";\n}\n.ion-arrow-down-b:before {\n  content: \"\\f104\";\n}\n.ion-arrow-down-c:before {\n  content: \"\\f105\";\n}\n.ion-arrow-expand:before {\n  content: \"\\f25e\";\n}\n.ion-arrow-graph-down-left:before {\n  content: \"\\f25f\";\n}\n.ion-arrow-graph-down-right:before {\n  content: \"\\f260\";\n}\n.ion-arrow-graph-up-left:before {\n  content: \"\\f261\";\n}\n.ion-arrow-graph-up-right:before {\n  content: \"\\f262\";\n}\n.ion-arrow-left-a:before {\n  content: \"\\f106\";\n}\n.ion-arrow-left-b:before {\n  content: \"\\f107\";\n}\n.ion-arrow-left-c:before {\n  content: \"\\f108\";\n}\n.ion-arrow-move:before {\n  content: \"\\f263\";\n}\n.ion-arrow-resize:before {\n  content: \"\\f264\";\n}\n.ion-arrow-return-left:before {\n  content: \"\\f265\";\n}\n.ion-arrow-return-right:before {\n  content: \"\\f266\";\n}\n.ion-arrow-right-a:before {\n  content: \"\\f109\";\n}\n.ion-arrow-right-b:before {\n  content: \"\\f10a\";\n}\n.ion-arrow-right-c:before {\n  content: \"\\f10b\";\n}\n.ion-arrow-shrink:before {\n  content: \"\\f267\";\n}\n.ion-arrow-swap:before {\n  content: \"\\f268\";\n}\n.ion-arrow-up-a:before {\n  content: \"\\f10c\";\n}\n.ion-arrow-up-b:before {\n  content: \"\\f10d\";\n}\n.ion-arrow-up-c:before {\n  content: \"\\f10e\";\n}\n.ion-asterisk:before {\n  content: \"\\f314\";\n}\n.ion-at:before {\n  content: \"\\f10f\";\n}\n.ion-backspace:before {\n  content: \"\\f3bf\";\n}\n.ion-backspace-outline:before {\n  content: \"\\f3be\";\n}\n.ion-bag:before {\n  content: \"\\f110\";\n}\n.ion-battery-charging:before {\n  content: \"\\f111\";\n}\n.ion-battery-empty:before {\n  content: \"\\f112\";\n}\n.ion-battery-full:before {\n  content: \"\\f113\";\n}\n.ion-battery-half:before {\n  content: \"\\f114\";\n}\n.ion-battery-low:before {\n  content: \"\\f115\";\n}\n.ion-beaker:before {\n  content: \"\\f269\";\n}\n.ion-beer:before {\n  content: \"\\f26a\";\n}\n.ion-bluetooth:before {\n  content: \"\\f116\";\n}\n.ion-bonfire:before {\n  content: \"\\f315\";\n}\n.ion-bookmark:before {\n  content: \"\\f26b\";\n}\n.ion-bowtie:before {\n  content: \"\\f3c0\";\n}\n.ion-briefcase:before {\n  content: \"\\f26c\";\n}\n.ion-bug:before {\n  content: \"\\f2be\";\n}\n.ion-calculator:before {\n  content: \"\\f26d\";\n}\n.ion-calendar:before {\n  content: \"\\f117\";\n}\n.ion-camera:before {\n  content: \"\\f118\";\n}\n.ion-card:before {\n  content: \"\\f119\";\n}\n.ion-cash:before {\n  content: \"\\f316\";\n}\n.ion-chatbox:before {\n  content: \"\\f11b\";\n}\n.ion-chatbox-working:before {\n  content: \"\\f11a\";\n}\n.ion-chatboxes:before {\n  content: \"\\f11c\";\n}\n.ion-chatbubble:before {\n  content: \"\\f11e\";\n}\n.ion-chatbubble-working:before {\n  content: \"\\f11d\";\n}\n.ion-chatbubbles:before {\n  content: \"\\f11f\";\n}\n.ion-checkmark:before {\n  content: \"\\f122\";\n}\n.ion-checkmark-circled:before {\n  content: \"\\f120\";\n}\n.ion-checkmark-round:before {\n  content: \"\\f121\";\n}\n.ion-chevron-down:before {\n  content: \"\\f123\";\n}\n.ion-chevron-left:before {\n  content: \"\\f124\";\n}\n.ion-chevron-right:before {\n  content: \"\\f125\";\n}\n.ion-chevron-up:before {\n  content: \"\\f126\";\n}\n.ion-clipboard:before {\n  content: \"\\f127\";\n}\n.ion-clock:before {\n  content: \"\\f26e\";\n}\n.ion-close:before {\n  content: \"\\f12a\";\n}\n.ion-close-circled:before {\n  content: \"\\f128\";\n}\n.ion-close-round:before {\n  content: \"\\f129\";\n}\n.ion-closed-captioning:before {\n  content: \"\\f317\";\n}\n.ion-cloud:before {\n  content: \"\\f12b\";\n}\n.ion-code:before {\n  content: \"\\f271\";\n}\n.ion-code-download:before {\n  content: \"\\f26f\";\n}\n.ion-code-working:before {\n  content: \"\\f270\";\n}\n.ion-coffee:before {\n  content: \"\\f272\";\n}\n.ion-compass:before {\n  content: \"\\f273\";\n}\n.ion-compose:before {\n  content: \"\\f12c\";\n}\n.ion-connection-bars:before {\n  content: \"\\f274\";\n}\n.ion-contrast:before {\n  content: \"\\f275\";\n}\n.ion-crop:before {\n  content: \"\\f3c1\";\n}\n.ion-cube:before {\n  content: \"\\f318\";\n}\n.ion-disc:before {\n  content: \"\\f12d\";\n}\n.ion-document:before {\n  content: \"\\f12f\";\n}\n.ion-document-text:before {\n  content: \"\\f12e\";\n}\n.ion-drag:before {\n  content: \"\\f130\";\n}\n.ion-earth:before {\n  content: \"\\f276\";\n}\n.ion-easel:before {\n  content: \"\\f3c2\";\n}\n.ion-edit:before {\n  content: \"\\f2bf\";\n}\n.ion-egg:before {\n  content: \"\\f277\";\n}\n.ion-eject:before {\n  content: \"\\f131\";\n}\n.ion-email:before {\n  content: \"\\f132\";\n}\n.ion-email-unread:before {\n  content: \"\\f3c3\";\n}\n.ion-erlenmeyer-flask:before {\n  content: \"\\f3c5\";\n}\n.ion-erlenmeyer-flask-bubbles:before {\n  content: \"\\f3c4\";\n}\n.ion-eye:before {\n  content: \"\\f133\";\n}\n.ion-eye-disabled:before {\n  content: \"\\f306\";\n}\n.ion-female:before {\n  content: \"\\f278\";\n}\n.ion-filing:before {\n  content: \"\\f134\";\n}\n.ion-film-marker:before {\n  content: \"\\f135\";\n}\n.ion-fireball:before {\n  content: \"\\f319\";\n}\n.ion-flag:before {\n  content: \"\\f279\";\n}\n.ion-flame:before {\n  content: \"\\f31a\";\n}\n.ion-flash:before {\n  content: \"\\f137\";\n}\n.ion-flash-off:before {\n  content: \"\\f136\";\n}\n.ion-folder:before {\n  content: \"\\f139\";\n}\n.ion-fork:before {\n  content: \"\\f27a\";\n}\n.ion-fork-repo:before {\n  content: \"\\f2c0\";\n}\n.ion-forward:before {\n  content: \"\\f13a\";\n}\n.ion-funnel:before {\n  content: \"\\f31b\";\n}\n.ion-gear-a:before {\n  content: \"\\f13d\";\n}\n.ion-gear-b:before {\n  content: \"\\f13e\";\n}\n.ion-grid:before {\n  content: \"\\f13f\";\n}\n.ion-hammer:before {\n  content: \"\\f27b\";\n}\n.ion-happy:before {\n  content: \"\\f31c\";\n}\n.ion-happy-outline:before {\n  content: \"\\f3c6\";\n}\n.ion-headphone:before {\n  content: \"\\f140\";\n}\n.ion-heart:before {\n  content: \"\\f141\";\n}\n.ion-heart-broken:before {\n  content: \"\\f31d\";\n}\n.ion-help:before {\n  content: \"\\f143\";\n}\n.ion-help-buoy:before {\n  content: \"\\f27c\";\n}\n.ion-help-circled:before {\n  content: \"\\f142\";\n}\n.ion-home:before {\n  content: \"\\f144\";\n}\n.ion-icecream:before {\n  content: \"\\f27d\";\n}\n.ion-image:before {\n  content: \"\\f147\";\n}\n.ion-images:before {\n  content: \"\\f148\";\n}\n.ion-information:before {\n  content: \"\\f14a\";\n}\n.ion-information-circled:before {\n  content: \"\\f149\";\n}\n.ion-ionic:before {\n  content: \"\\f14b\";\n}\n.ion-ios-alarm:before {\n  content: \"\\f3c8\";\n}\n.ion-ios-alarm-outline:before {\n  content: \"\\f3c7\";\n}\n.ion-ios-albums:before {\n  content: \"\\f3ca\";\n}\n.ion-ios-albums-outline:before {\n  content: \"\\f3c9\";\n}\n.ion-ios-americanfootball:before {\n  content: \"\\f3cc\";\n}\n.ion-ios-americanfootball-outline:before {\n  content: \"\\f3cb\";\n}\n.ion-ios-analytics:before {\n  content: \"\\f3ce\";\n}\n.ion-ios-analytics-outline:before {\n  content: \"\\f3cd\";\n}\n.ion-ios-arrow-back:before {\n  content: \"\\f3cf\";\n}\n.ion-ios-arrow-down:before {\n  content: \"\\f3d0\";\n}\n.ion-ios-arrow-forward:before {\n  content: \"\\f3d1\";\n}\n.ion-ios-arrow-left:before {\n  content: \"\\f3d2\";\n}\n.ion-ios-arrow-right:before {\n  content: \"\\f3d3\";\n}\n.ion-ios-arrow-thin-down:before {\n  content: \"\\f3d4\";\n}\n.ion-ios-arrow-thin-left:before {\n  content: \"\\f3d5\";\n}\n.ion-ios-arrow-thin-right:before {\n  content: \"\\f3d6\";\n}\n.ion-ios-arrow-thin-up:before {\n  content: \"\\f3d7\";\n}\n.ion-ios-arrow-up:before {\n  content: \"\\f3d8\";\n}\n.ion-ios-at:before {\n  content: \"\\f3da\";\n}\n.ion-ios-at-outline:before {\n  content: \"\\f3d9\";\n}\n.ion-ios-barcode:before {\n  content: \"\\f3dc\";\n}\n.ion-ios-barcode-outline:before {\n  content: \"\\f3db\";\n}\n.ion-ios-baseball:before {\n  content: \"\\f3de\";\n}\n.ion-ios-baseball-outline:before {\n  content: \"\\f3dd\";\n}\n.ion-ios-basketball:before {\n  content: \"\\f3e0\";\n}\n.ion-ios-basketball-outline:before {\n  content: \"\\f3df\";\n}\n.ion-ios-bell:before {\n  content: \"\\f3e2\";\n}\n.ion-ios-bell-outline:before {\n  content: \"\\f3e1\";\n}\n.ion-ios-body:before {\n  content: \"\\f3e4\";\n}\n.ion-ios-body-outline:before {\n  content: \"\\f3e3\";\n}\n.ion-ios-bolt:before {\n  content: \"\\f3e6\";\n}\n.ion-ios-bolt-outline:before {\n  content: \"\\f3e5\";\n}\n.ion-ios-book:before {\n  content: \"\\f3e8\";\n}\n.ion-ios-book-outline:before {\n  content: \"\\f3e7\";\n}\n.ion-ios-bookmarks:before {\n  content: \"\\f3ea\";\n}\n.ion-ios-bookmarks-outline:before {\n  content: \"\\f3e9\";\n}\n.ion-ios-box:before {\n  content: \"\\f3ec\";\n}\n.ion-ios-box-outline:before {\n  content: \"\\f3eb\";\n}\n.ion-ios-briefcase:before {\n  content: \"\\f3ee\";\n}\n.ion-ios-briefcase-outline:before {\n  content: \"\\f3ed\";\n}\n.ion-ios-browsers:before {\n  content: \"\\f3f0\";\n}\n.ion-ios-browsers-outline:before {\n  content: \"\\f3ef\";\n}\n.ion-ios-calculator:before {\n  content: \"\\f3f2\";\n}\n.ion-ios-calculator-outline:before {\n  content: \"\\f3f1\";\n}\n.ion-ios-calendar:before {\n  content: \"\\f3f4\";\n}\n.ion-ios-calendar-outline:before {\n  content: \"\\f3f3\";\n}\n.ion-ios-camera:before {\n  content: \"\\f3f6\";\n}\n.ion-ios-camera-outline:before {\n  content: \"\\f3f5\";\n}\n.ion-ios-cart:before {\n  content: \"\\f3f8\";\n}\n.ion-ios-cart-outline:before {\n  content: \"\\f3f7\";\n}\n.ion-ios-chatboxes:before {\n  content: \"\\f3fa\";\n}\n.ion-ios-chatboxes-outline:before {\n  content: \"\\f3f9\";\n}\n.ion-ios-chatbubble:before {\n  content: \"\\f3fc\";\n}\n.ion-ios-chatbubble-outline:before {\n  content: \"\\f3fb\";\n}\n.ion-ios-checkmark:before {\n  content: \"\\f3ff\";\n}\n.ion-ios-checkmark-empty:before {\n  content: \"\\f3fd\";\n}\n.ion-ios-checkmark-outline:before {\n  content: \"\\f3fe\";\n}\n.ion-ios-circle-filled:before {\n  content: \"\\f400\";\n}\n.ion-ios-circle-outline:before {\n  content: \"\\f401\";\n}\n.ion-ios-clock:before {\n  content: \"\\f403\";\n}\n.ion-ios-clock-outline:before {\n  content: \"\\f402\";\n}\n.ion-ios-close:before {\n  content: \"\\f406\";\n}\n.ion-ios-close-empty:before {\n  content: \"\\f404\";\n}\n.ion-ios-close-outline:before {\n  content: \"\\f405\";\n}\n.ion-ios-cloud:before {\n  content: \"\\f40c\";\n}\n.ion-ios-cloud-download:before {\n  content: \"\\f408\";\n}\n.ion-ios-cloud-download-outline:before {\n  content: \"\\f407\";\n}\n.ion-ios-cloud-outline:before {\n  content: \"\\f409\";\n}\n.ion-ios-cloud-upload:before {\n  content: \"\\f40b\";\n}\n.ion-ios-cloud-upload-outline:before {\n  content: \"\\f40a\";\n}\n.ion-ios-cloudy:before {\n  content: \"\\f410\";\n}\n.ion-ios-cloudy-night:before {\n  content: \"\\f40e\";\n}\n.ion-ios-cloudy-night-outline:before {\n  content: \"\\f40d\";\n}\n.ion-ios-cloudy-outline:before {\n  content: \"\\f40f\";\n}\n.ion-ios-cog:before {\n  content: \"\\f412\";\n}\n.ion-ios-cog-outline:before {\n  content: \"\\f411\";\n}\n.ion-ios-color-filter:before {\n  content: \"\\f414\";\n}\n.ion-ios-color-filter-outline:before {\n  content: \"\\f413\";\n}\n.ion-ios-color-wand:before {\n  content: \"\\f416\";\n}\n.ion-ios-color-wand-outline:before {\n  content: \"\\f415\";\n}\n.ion-ios-compose:before {\n  content: \"\\f418\";\n}\n.ion-ios-compose-outline:before {\n  content: \"\\f417\";\n}\n.ion-ios-contact:before {\n  content: \"\\f41a\";\n}\n.ion-ios-contact-outline:before {\n  content: \"\\f419\";\n}\n.ion-ios-copy:before {\n  content: \"\\f41c\";\n}\n.ion-ios-copy-outline:before {\n  content: \"\\f41b\";\n}\n.ion-ios-crop:before {\n  content: \"\\f41e\";\n}\n.ion-ios-crop-strong:before {\n  content: \"\\f41d\";\n}\n.ion-ios-download:before {\n  content: \"\\f420\";\n}\n.ion-ios-download-outline:before {\n  content: \"\\f41f\";\n}\n.ion-ios-drag:before {\n  content: \"\\f421\";\n}\n.ion-ios-email:before {\n  content: \"\\f423\";\n}\n.ion-ios-email-outline:before {\n  content: \"\\f422\";\n}\n.ion-ios-eye:before {\n  content: \"\\f425\";\n}\n.ion-ios-eye-outline:before {\n  content: \"\\f424\";\n}\n.ion-ios-fastforward:before {\n  content: \"\\f427\";\n}\n.ion-ios-fastforward-outline:before {\n  content: \"\\f426\";\n}\n.ion-ios-filing:before {\n  content: \"\\f429\";\n}\n.ion-ios-filing-outline:before {\n  content: \"\\f428\";\n}\n.ion-ios-film:before {\n  content: \"\\f42b\";\n}\n.ion-ios-film-outline:before {\n  content: \"\\f42a\";\n}\n.ion-ios-flag:before {\n  content: \"\\f42d\";\n}\n.ion-ios-flag-outline:before {\n  content: \"\\f42c\";\n}\n.ion-ios-flame:before {\n  content: \"\\f42f\";\n}\n.ion-ios-flame-outline:before {\n  content: \"\\f42e\";\n}\n.ion-ios-flask:before {\n  content: \"\\f431\";\n}\n.ion-ios-flask-outline:before {\n  content: \"\\f430\";\n}\n.ion-ios-flower:before {\n  content: \"\\f433\";\n}\n.ion-ios-flower-outline:before {\n  content: \"\\f432\";\n}\n.ion-ios-folder:before {\n  content: \"\\f435\";\n}\n.ion-ios-folder-outline:before {\n  content: \"\\f434\";\n}\n.ion-ios-football:before {\n  content: \"\\f437\";\n}\n.ion-ios-football-outline:before {\n  content: \"\\f436\";\n}\n.ion-ios-game-controller-a:before {\n  content: \"\\f439\";\n}\n.ion-ios-game-controller-a-outline:before {\n  content: \"\\f438\";\n}\n.ion-ios-game-controller-b:before {\n  content: \"\\f43b\";\n}\n.ion-ios-game-controller-b-outline:before {\n  content: \"\\f43a\";\n}\n.ion-ios-gear:before {\n  content: \"\\f43d\";\n}\n.ion-ios-gear-outline:before {\n  content: \"\\f43c\";\n}\n.ion-ios-glasses:before {\n  content: \"\\f43f\";\n}\n.ion-ios-glasses-outline:before {\n  content: \"\\f43e\";\n}\n.ion-ios-grid-view:before {\n  content: \"\\f441\";\n}\n.ion-ios-grid-view-outline:before {\n  content: \"\\f440\";\n}\n.ion-ios-heart:before {\n  content: \"\\f443\";\n}\n.ion-ios-heart-outline:before {\n  content: \"\\f442\";\n}\n.ion-ios-help:before {\n  content: \"\\f446\";\n}\n.ion-ios-help-empty:before {\n  content: \"\\f444\";\n}\n.ion-ios-help-outline:before {\n  content: \"\\f445\";\n}\n.ion-ios-home:before {\n  content: \"\\f448\";\n}\n.ion-ios-home-outline:before {\n  content: \"\\f447\";\n}\n.ion-ios-infinite:before {\n  content: \"\\f44a\";\n}\n.ion-ios-infinite-outline:before {\n  content: \"\\f449\";\n}\n.ion-ios-information:before {\n  content: \"\\f44d\";\n}\n.ion-ios-information-empty:before {\n  content: \"\\f44b\";\n}\n.ion-ios-information-outline:before {\n  content: \"\\f44c\";\n}\n.ion-ios-ionic-outline:before {\n  content: \"\\f44e\";\n}\n.ion-ios-keypad:before {\n  content: \"\\f450\";\n}\n.ion-ios-keypad-outline:before {\n  content: \"\\f44f\";\n}\n.ion-ios-lightbulb:before {\n  content: \"\\f452\";\n}\n.ion-ios-lightbulb-outline:before {\n  content: \"\\f451\";\n}\n.ion-ios-list:before {\n  content: \"\\f454\";\n}\n.ion-ios-list-outline:before {\n  content: \"\\f453\";\n}\n.ion-ios-location:before {\n  content: \"\\f456\";\n}\n.ion-ios-location-outline:before {\n  content: \"\\f455\";\n}\n.ion-ios-locked:before {\n  content: \"\\f458\";\n}\n.ion-ios-locked-outline:before {\n  content: \"\\f457\";\n}\n.ion-ios-loop:before {\n  content: \"\\f45a\";\n}\n.ion-ios-loop-strong:before {\n  content: \"\\f459\";\n}\n.ion-ios-medical:before {\n  content: \"\\f45c\";\n}\n.ion-ios-medical-outline:before {\n  content: \"\\f45b\";\n}\n.ion-ios-medkit:before {\n  content: \"\\f45e\";\n}\n.ion-ios-medkit-outline:before {\n  content: \"\\f45d\";\n}\n.ion-ios-mic:before {\n  content: \"\\f461\";\n}\n.ion-ios-mic-off:before {\n  content: \"\\f45f\";\n}\n.ion-ios-mic-outline:before {\n  content: \"\\f460\";\n}\n.ion-ios-minus:before {\n  content: \"\\f464\";\n}\n.ion-ios-minus-empty:before {\n  content: \"\\f462\";\n}\n.ion-ios-minus-outline:before {\n  content: \"\\f463\";\n}\n.ion-ios-monitor:before {\n  content: \"\\f466\";\n}\n.ion-ios-monitor-outline:before {\n  content: \"\\f465\";\n}\n.ion-ios-moon:before {\n  content: \"\\f468\";\n}\n.ion-ios-moon-outline:before {\n  content: \"\\f467\";\n}\n.ion-ios-more:before {\n  content: \"\\f46a\";\n}\n.ion-ios-more-outline:before {\n  content: \"\\f469\";\n}\n.ion-ios-musical-note:before {\n  content: \"\\f46b\";\n}\n.ion-ios-musical-notes:before {\n  content: \"\\f46c\";\n}\n.ion-ios-navigate:before {\n  content: \"\\f46e\";\n}\n.ion-ios-navigate-outline:before {\n  content: \"\\f46d\";\n}\n.ion-ios-nutrition:before {\n  content: \"\\f470\";\n}\n.ion-ios-nutrition-outline:before {\n  content: \"\\f46f\";\n}\n.ion-ios-paper:before {\n  content: \"\\f472\";\n}\n.ion-ios-paper-outline:before {\n  content: \"\\f471\";\n}\n.ion-ios-paperplane:before {\n  content: \"\\f474\";\n}\n.ion-ios-paperplane-outline:before {\n  content: \"\\f473\";\n}\n.ion-ios-partlysunny:before {\n  content: \"\\f476\";\n}\n.ion-ios-partlysunny-outline:before {\n  content: \"\\f475\";\n}\n.ion-ios-pause:before {\n  content: \"\\f478\";\n}\n.ion-ios-pause-outline:before {\n  content: \"\\f477\";\n}\n.ion-ios-paw:before {\n  content: \"\\f47a\";\n}\n.ion-ios-paw-outline:before {\n  content: \"\\f479\";\n}\n.ion-ios-people:before {\n  content: \"\\f47c\";\n}\n.ion-ios-people-outline:before {\n  content: \"\\f47b\";\n}\n.ion-ios-person:before {\n  content: \"\\f47e\";\n}\n.ion-ios-person-outline:before {\n  content: \"\\f47d\";\n}\n.ion-ios-personadd:before {\n  content: \"\\f480\";\n}\n.ion-ios-personadd-outline:before {\n  content: \"\\f47f\";\n}\n.ion-ios-photos:before {\n  content: \"\\f482\";\n}\n.ion-ios-photos-outline:before {\n  content: \"\\f481\";\n}\n.ion-ios-pie:before {\n  content: \"\\f484\";\n}\n.ion-ios-pie-outline:before {\n  content: \"\\f483\";\n}\n.ion-ios-pint:before {\n  content: \"\\f486\";\n}\n.ion-ios-pint-outline:before {\n  content: \"\\f485\";\n}\n.ion-ios-play:before {\n  content: \"\\f488\";\n}\n.ion-ios-play-outline:before {\n  content: \"\\f487\";\n}\n.ion-ios-plus:before {\n  content: \"\\f48b\";\n}\n.ion-ios-plus-empty:before {\n  content: \"\\f489\";\n}\n.ion-ios-plus-outline:before {\n  content: \"\\f48a\";\n}\n.ion-ios-pricetag:before {\n  content: \"\\f48d\";\n}\n.ion-ios-pricetag-outline:before {\n  content: \"\\f48c\";\n}\n.ion-ios-pricetags:before {\n  content: \"\\f48f\";\n}\n.ion-ios-pricetags-outline:before {\n  content: \"\\f48e\";\n}\n.ion-ios-printer:before {\n  content: \"\\f491\";\n}\n.ion-ios-printer-outline:before {\n  content: \"\\f490\";\n}\n.ion-ios-pulse:before {\n  content: \"\\f493\";\n}\n.ion-ios-pulse-strong:before {\n  content: \"\\f492\";\n}\n.ion-ios-rainy:before {\n  content: \"\\f495\";\n}\n.ion-ios-rainy-outline:before {\n  content: \"\\f494\";\n}\n.ion-ios-recording:before {\n  content: \"\\f497\";\n}\n.ion-ios-recording-outline:before {\n  content: \"\\f496\";\n}\n.ion-ios-redo:before {\n  content: \"\\f499\";\n}\n.ion-ios-redo-outline:before {\n  content: \"\\f498\";\n}\n.ion-ios-refresh:before {\n  content: \"\\f49c\";\n}\n.ion-ios-refresh-empty:before {\n  content: \"\\f49a\";\n}\n.ion-ios-refresh-outline:before {\n  content: \"\\f49b\";\n}\n.ion-ios-reload:before {\n  content: \"\\f49d\";\n}\n.ion-ios-reverse-camera:before {\n  content: \"\\f49f\";\n}\n.ion-ios-reverse-camera-outline:before {\n  content: \"\\f49e\";\n}\n.ion-ios-rewind:before {\n  content: \"\\f4a1\";\n}\n.ion-ios-rewind-outline:before {\n  content: \"\\f4a0\";\n}\n.ion-ios-rose:before {\n  content: \"\\f4a3\";\n}\n.ion-ios-rose-outline:before {\n  content: \"\\f4a2\";\n}\n.ion-ios-search:before {\n  content: \"\\f4a5\";\n}\n.ion-ios-search-strong:before {\n  content: \"\\f4a4\";\n}\n.ion-ios-settings:before {\n  content: \"\\f4a7\";\n}\n.ion-ios-settings-strong:before {\n  content: \"\\f4a6\";\n}\n.ion-ios-shuffle:before {\n  content: \"\\f4a9\";\n}\n.ion-ios-shuffle-strong:before {\n  content: \"\\f4a8\";\n}\n.ion-ios-skipbackward:before {\n  content: \"\\f4ab\";\n}\n.ion-ios-skipbackward-outline:before {\n  content: \"\\f4aa\";\n}\n.ion-ios-skipforward:before {\n  content: \"\\f4ad\";\n}\n.ion-ios-skipforward-outline:before {\n  content: \"\\f4ac\";\n}\n.ion-ios-snowy:before {\n  content: \"\\f4ae\";\n}\n.ion-ios-speedometer:before {\n  content: \"\\f4b0\";\n}\n.ion-ios-speedometer-outline:before {\n  content: \"\\f4af\";\n}\n.ion-ios-star:before {\n  content: \"\\f4b3\";\n}\n.ion-ios-star-half:before {\n  content: \"\\f4b1\";\n}\n.ion-ios-star-outline:before {\n  content: \"\\f4b2\";\n}\n.ion-ios-stopwatch:before {\n  content: \"\\f4b5\";\n}\n.ion-ios-stopwatch-outline:before {\n  content: \"\\f4b4\";\n}\n.ion-ios-sunny:before {\n  content: \"\\f4b7\";\n}\n.ion-ios-sunny-outline:before {\n  content: \"\\f4b6\";\n}\n.ion-ios-telephone:before {\n  content: \"\\f4b9\";\n}\n.ion-ios-telephone-outline:before {\n  content: \"\\f4b8\";\n}\n.ion-ios-tennisball:before {\n  content: \"\\f4bb\";\n}\n.ion-ios-tennisball-outline:before {\n  content: \"\\f4ba\";\n}\n.ion-ios-thunderstorm:before {\n  content: \"\\f4bd\";\n}\n.ion-ios-thunderstorm-outline:before {\n  content: \"\\f4bc\";\n}\n.ion-ios-time:before {\n  content: \"\\f4bf\";\n}\n.ion-ios-time-outline:before {\n  content: \"\\f4be\";\n}\n.ion-ios-timer:before {\n  content: \"\\f4c1\";\n}\n.ion-ios-timer-outline:before {\n  content: \"\\f4c0\";\n}\n.ion-ios-toggle:before {\n  content: \"\\f4c3\";\n}\n.ion-ios-toggle-outline:before {\n  content: \"\\f4c2\";\n}\n.ion-ios-trash:before {\n  content: \"\\f4c5\";\n}\n.ion-ios-trash-outline:before {\n  content: \"\\f4c4\";\n}\n.ion-ios-undo:before {\n  content: \"\\f4c7\";\n}\n.ion-ios-undo-outline:before {\n  content: \"\\f4c6\";\n}\n.ion-ios-unlocked:before {\n  content: \"\\f4c9\";\n}\n.ion-ios-unlocked-outline:before {\n  content: \"\\f4c8\";\n}\n.ion-ios-upload:before {\n  content: \"\\f4cb\";\n}\n.ion-ios-upload-outline:before {\n  content: \"\\f4ca\";\n}\n.ion-ios-videocam:before {\n  content: \"\\f4cd\";\n}\n.ion-ios-videocam-outline:before {\n  content: \"\\f4cc\";\n}\n.ion-ios-volume-high:before {\n  content: \"\\f4ce\";\n}\n.ion-ios-volume-low:before {\n  content: \"\\f4cf\";\n}\n.ion-ios-wineglass:before {\n  content: \"\\f4d1\";\n}\n.ion-ios-wineglass-outline:before {\n  content: \"\\f4d0\";\n}\n.ion-ios-world:before {\n  content: \"\\f4d3\";\n}\n.ion-ios-world-outline:before {\n  content: \"\\f4d2\";\n}\n.ion-ipad:before {\n  content: \"\\f1f9\";\n}\n.ion-iphone:before {\n  content: \"\\f1fa\";\n}\n.ion-ipod:before {\n  content: \"\\f1fb\";\n}\n.ion-jet:before {\n  content: \"\\f295\";\n}\n.ion-key:before {\n  content: \"\\f296\";\n}\n.ion-knife:before {\n  content: \"\\f297\";\n}\n.ion-laptop:before {\n  content: \"\\f1fc\";\n}\n.ion-leaf:before {\n  content: \"\\f1fd\";\n}\n.ion-levels:before {\n  content: \"\\f298\";\n}\n.ion-lightbulb:before {\n  content: \"\\f299\";\n}\n.ion-link:before {\n  content: \"\\f1fe\";\n}\n.ion-load-a:before {\n  content: \"\\f29a\";\n}\n.ion-load-b:before {\n  content: \"\\f29b\";\n}\n.ion-load-c:before {\n  content: \"\\f29c\";\n}\n.ion-load-d:before {\n  content: \"\\f29d\";\n}\n.ion-location:before {\n  content: \"\\f1ff\";\n}\n.ion-lock-combination:before {\n  content: \"\\f4d4\";\n}\n.ion-locked:before {\n  content: \"\\f200\";\n}\n.ion-log-in:before {\n  content: \"\\f29e\";\n}\n.ion-log-out:before {\n  content: \"\\f29f\";\n}\n.ion-loop:before {\n  content: \"\\f201\";\n}\n.ion-magnet:before {\n  content: \"\\f2a0\";\n}\n.ion-male:before {\n  content: \"\\f2a1\";\n}\n.ion-man:before {\n  content: \"\\f202\";\n}\n.ion-map:before {\n  content: \"\\f203\";\n}\n.ion-medkit:before {\n  content: \"\\f2a2\";\n}\n.ion-merge:before {\n  content: \"\\f33f\";\n}\n.ion-mic-a:before {\n  content: \"\\f204\";\n}\n.ion-mic-b:before {\n  content: \"\\f205\";\n}\n.ion-mic-c:before {\n  content: \"\\f206\";\n}\n.ion-minus:before {\n  content: \"\\f209\";\n}\n.ion-minus-circled:before {\n  content: \"\\f207\";\n}\n.ion-minus-round:before {\n  content: \"\\f208\";\n}\n.ion-model-s:before {\n  content: \"\\f2c1\";\n}\n.ion-monitor:before {\n  content: \"\\f20a\";\n}\n.ion-more:before {\n  content: \"\\f20b\";\n}\n.ion-mouse:before {\n  content: \"\\f340\";\n}\n.ion-music-note:before {\n  content: \"\\f20c\";\n}\n.ion-navicon:before {\n  content: \"\\f20e\";\n}\n.ion-navicon-round:before {\n  content: \"\\f20d\";\n}\n.ion-navigate:before {\n  content: \"\\f2a3\";\n}\n.ion-network:before {\n  content: \"\\f341\";\n}\n.ion-no-smoking:before {\n  content: \"\\f2c2\";\n}\n.ion-nuclear:before {\n  content: \"\\f2a4\";\n}\n.ion-outlet:before {\n  content: \"\\f342\";\n}\n.ion-paintbrush:before {\n  content: \"\\f4d5\";\n}\n.ion-paintbucket:before {\n  content: \"\\f4d6\";\n}\n.ion-paper-airplane:before {\n  content: \"\\f2c3\";\n}\n.ion-paperclip:before {\n  content: \"\\f20f\";\n}\n.ion-pause:before {\n  content: \"\\f210\";\n}\n.ion-person:before {\n  content: \"\\f213\";\n}\n.ion-person-add:before {\n  content: \"\\f211\";\n}\n.ion-person-stalker:before {\n  content: \"\\f212\";\n}\n.ion-pie-graph:before {\n  content: \"\\f2a5\";\n}\n.ion-pin:before {\n  content: \"\\f2a6\";\n}\n.ion-pinpoint:before {\n  content: \"\\f2a7\";\n}\n.ion-pizza:before {\n  content: \"\\f2a8\";\n}\n.ion-plane:before {\n  content: \"\\f214\";\n}\n.ion-planet:before {\n  content: \"\\f343\";\n}\n.ion-play:before {\n  content: \"\\f215\";\n}\n.ion-playstation:before {\n  content: \"\\f30a\";\n}\n.ion-plus:before {\n  content: \"\\f218\";\n}\n.ion-plus-circled:before {\n  content: \"\\f216\";\n}\n.ion-plus-round:before {\n  content: \"\\f217\";\n}\n.ion-podium:before {\n  content: \"\\f344\";\n}\n.ion-pound:before {\n  content: \"\\f219\";\n}\n.ion-power:before {\n  content: \"\\f2a9\";\n}\n.ion-pricetag:before {\n  content: \"\\f2aa\";\n}\n.ion-pricetags:before {\n  content: \"\\f2ab\";\n}\n.ion-printer:before {\n  content: \"\\f21a\";\n}\n.ion-pull-request:before {\n  content: \"\\f345\";\n}\n.ion-qr-scanner:before {\n  content: \"\\f346\";\n}\n.ion-quote:before {\n  content: \"\\f347\";\n}\n.ion-radio-waves:before {\n  content: \"\\f2ac\";\n}\n.ion-record:before {\n  content: \"\\f21b\";\n}\n.ion-refresh:before {\n  content: \"\\f21c\";\n}\n.ion-reply:before {\n  content: \"\\f21e\";\n}\n.ion-reply-all:before {\n  content: \"\\f21d\";\n}\n.ion-ribbon-a:before {\n  content: \"\\f348\";\n}\n.ion-ribbon-b:before {\n  content: \"\\f349\";\n}\n.ion-sad:before {\n  content: \"\\f34a\";\n}\n.ion-sad-outline:before {\n  content: \"\\f4d7\";\n}\n.ion-scissors:before {\n  content: \"\\f34b\";\n}\n.ion-search:before {\n  content: \"\\f21f\";\n}\n.ion-settings:before {\n  content: \"\\f2ad\";\n}\n.ion-share:before {\n  content: \"\\f220\";\n}\n.ion-shuffle:before {\n  content: \"\\f221\";\n}\n.ion-skip-backward:before {\n  content: \"\\f222\";\n}\n.ion-skip-forward:before {\n  content: \"\\f223\";\n}\n.ion-social-android:before {\n  content: \"\\f225\";\n}\n.ion-social-android-outline:before {\n  content: \"\\f224\";\n}\n.ion-social-angular:before {\n  content: \"\\f4d9\";\n}\n.ion-social-angular-outline:before {\n  content: \"\\f4d8\";\n}\n.ion-social-apple:before {\n  content: \"\\f227\";\n}\n.ion-social-apple-outline:before {\n  content: \"\\f226\";\n}\n.ion-social-bitcoin:before {\n  content: \"\\f2af\";\n}\n.ion-social-bitcoin-outline:before {\n  content: \"\\f2ae\";\n}\n.ion-social-buffer:before {\n  content: \"\\f229\";\n}\n.ion-social-buffer-outline:before {\n  content: \"\\f228\";\n}\n.ion-social-chrome:before {\n  content: \"\\f4db\";\n}\n.ion-social-chrome-outline:before {\n  content: \"\\f4da\";\n}\n.ion-social-codepen:before {\n  content: \"\\f4dd\";\n}\n.ion-social-codepen-outline:before {\n  content: \"\\f4dc\";\n}\n.ion-social-css3:before {\n  content: \"\\f4df\";\n}\n.ion-social-css3-outline:before {\n  content: \"\\f4de\";\n}\n.ion-social-designernews:before {\n  content: \"\\f22b\";\n}\n.ion-social-designernews-outline:before {\n  content: \"\\f22a\";\n}\n.ion-social-dribbble:before {\n  content: \"\\f22d\";\n}\n.ion-social-dribbble-outline:before {\n  content: \"\\f22c\";\n}\n.ion-social-dropbox:before {\n  content: \"\\f22f\";\n}\n.ion-social-dropbox-outline:before {\n  content: \"\\f22e\";\n}\n.ion-social-euro:before {\n  content: \"\\f4e1\";\n}\n.ion-social-euro-outline:before {\n  content: \"\\f4e0\";\n}\n.ion-social-facebook:before {\n  content: \"\\f231\";\n}\n.ion-social-facebook-outline:before {\n  content: \"\\f230\";\n}\n.ion-social-foursquare:before {\n  content: \"\\f34d\";\n}\n.ion-social-foursquare-outline:before {\n  content: \"\\f34c\";\n}\n.ion-social-freebsd-devil:before {\n  content: \"\\f2c4\";\n}\n.ion-social-github:before {\n  content: \"\\f233\";\n}\n.ion-social-github-outline:before {\n  content: \"\\f232\";\n}\n.ion-social-google:before {\n  content: \"\\f34f\";\n}\n.ion-social-google-outline:before {\n  content: \"\\f34e\";\n}\n.ion-social-googleplus:before {\n  content: \"\\f235\";\n}\n.ion-social-googleplus-outline:before {\n  content: \"\\f234\";\n}\n.ion-social-hackernews:before {\n  content: \"\\f237\";\n}\n.ion-social-hackernews-outline:before {\n  content: \"\\f236\";\n}\n.ion-social-html5:before {\n  content: \"\\f4e3\";\n}\n.ion-social-html5-outline:before {\n  content: \"\\f4e2\";\n}\n.ion-social-instagram:before {\n  content: \"\\f351\";\n}\n.ion-social-instagram-outline:before {\n  content: \"\\f350\";\n}\n.ion-social-javascript:before {\n  content: \"\\f4e5\";\n}\n.ion-social-javascript-outline:before {\n  content: \"\\f4e4\";\n}\n.ion-social-linkedin:before {\n  content: \"\\f239\";\n}\n.ion-social-linkedin-outline:before {\n  content: \"\\f238\";\n}\n.ion-social-markdown:before {\n  content: \"\\f4e6\";\n}\n.ion-social-nodejs:before {\n  content: \"\\f4e7\";\n}\n.ion-social-octocat:before {\n  content: \"\\f4e8\";\n}\n.ion-social-pinterest:before {\n  content: \"\\f2b1\";\n}\n.ion-social-pinterest-outline:before {\n  content: \"\\f2b0\";\n}\n.ion-social-python:before {\n  content: \"\\f4e9\";\n}\n.ion-social-reddit:before {\n  content: \"\\f23b\";\n}\n.ion-social-reddit-outline:before {\n  content: \"\\f23a\";\n}\n.ion-social-rss:before {\n  content: \"\\f23d\";\n}\n.ion-social-rss-outline:before {\n  content: \"\\f23c\";\n}\n.ion-social-sass:before {\n  content: \"\\f4ea\";\n}\n.ion-social-skype:before {\n  content: \"\\f23f\";\n}\n.ion-social-skype-outline:before {\n  content: \"\\f23e\";\n}\n.ion-social-snapchat:before {\n  content: \"\\f4ec\";\n}\n.ion-social-snapchat-outline:before {\n  content: \"\\f4eb\";\n}\n.ion-social-tumblr:before {\n  content: \"\\f241\";\n}\n.ion-social-tumblr-outline:before {\n  content: \"\\f240\";\n}\n.ion-social-tux:before {\n  content: \"\\f2c5\";\n}\n.ion-social-twitch:before {\n  content: \"\\f4ee\";\n}\n.ion-social-twitch-outline:before {\n  content: \"\\f4ed\";\n}\n.ion-social-twitter:before {\n  content: \"\\f243\";\n}\n.ion-social-twitter-outline:before {\n  content: \"\\f242\";\n}\n.ion-social-usd:before {\n  content: \"\\f353\";\n}\n.ion-social-usd-outline:before {\n  content: \"\\f352\";\n}\n.ion-social-vimeo:before {\n  content: \"\\f245\";\n}\n.ion-social-vimeo-outline:before {\n  content: \"\\f244\";\n}\n.ion-social-whatsapp:before {\n  content: \"\\f4f0\";\n}\n.ion-social-whatsapp-outline:before {\n  content: \"\\f4ef\";\n}\n.ion-social-windows:before {\n  content: \"\\f247\";\n}\n.ion-social-windows-outline:before {\n  content: \"\\f246\";\n}\n.ion-social-wordpress:before {\n  content: \"\\f249\";\n}\n.ion-social-wordpress-outline:before {\n  content: \"\\f248\";\n}\n.ion-social-yahoo:before {\n  content: \"\\f24b\";\n}\n.ion-social-yahoo-outline:before {\n  content: \"\\f24a\";\n}\n.ion-social-yen:before {\n  content: \"\\f4f2\";\n}\n.ion-social-yen-outline:before {\n  content: \"\\f4f1\";\n}\n.ion-social-youtube:before {\n  content: \"\\f24d\";\n}\n.ion-social-youtube-outline:before {\n  content: \"\\f24c\";\n}\n.ion-soup-can:before {\n  content: \"\\f4f4\";\n}\n.ion-soup-can-outline:before {\n  content: \"\\f4f3\";\n}\n.ion-speakerphone:before {\n  content: \"\\f2b2\";\n}\n.ion-speedometer:before {\n  content: \"\\f2b3\";\n}\n.ion-spoon:before {\n  content: \"\\f2b4\";\n}\n.ion-star:before {\n  content: \"\\f24e\";\n}\n.ion-stats-bars:before {\n  content: \"\\f2b5\";\n}\n.ion-steam:before {\n  content: \"\\f30b\";\n}\n.ion-stop:before {\n  content: \"\\f24f\";\n}\n.ion-thermometer:before {\n  content: \"\\f2b6\";\n}\n.ion-thumbsdown:before {\n  content: \"\\f250\";\n}\n.ion-thumbsup:before {\n  content: \"\\f251\";\n}\n.ion-toggle:before {\n  content: \"\\f355\";\n}\n.ion-toggle-filled:before {\n  content: \"\\f354\";\n}\n.ion-transgender:before {\n  content: \"\\f4f5\";\n}\n.ion-trash-a:before {\n  content: \"\\f252\";\n}\n.ion-trash-b:before {\n  content: \"\\f253\";\n}\n.ion-trophy:before {\n  content: \"\\f356\";\n}\n.ion-tshirt:before {\n  content: \"\\f4f7\";\n}\n.ion-tshirt-outline:before {\n  content: \"\\f4f6\";\n}\n.ion-umbrella:before {\n  content: \"\\f2b7\";\n}\n.ion-university:before {\n  content: \"\\f357\";\n}\n.ion-unlocked:before {\n  content: \"\\f254\";\n}\n.ion-upload:before {\n  content: \"\\f255\";\n}\n.ion-usb:before {\n  content: \"\\f2b8\";\n}\n.ion-videocamera:before {\n  content: \"\\f256\";\n}\n.ion-volume-high:before {\n  content: \"\\f257\";\n}\n.ion-volume-low:before {\n  content: \"\\f258\";\n}\n.ion-volume-medium:before {\n  content: \"\\f259\";\n}\n.ion-volume-mute:before {\n  content: \"\\f25a\";\n}\n.ion-wand:before {\n  content: \"\\f358\";\n}\n.ion-waterdrop:before {\n  content: \"\\f25b\";\n}\n.ion-wifi:before {\n  content: \"\\f25c\";\n}\n.ion-wineglass:before {\n  content: \"\\f2b9\";\n}\n.ion-woman:before {\n  content: \"\\f25d\";\n}\n.ion-wrench:before {\n  content: \"\\f2ba\";\n}\n.ion-xbox:before {\n  content: \"\\f30c\";\n}\n/*!\nAnimate.css - http://daneden.me/animate\nLicensed under the MIT license - http://opensource.org/licenses/MIT\n\nCopyright (c) 2014 Daniel Eden\n*/\n.animated {\n  -webkit-animation-duration: 1s;\n  animation-duration: 1s;\n  -webkit-animation-fill-mode: both;\n  animation-fill-mode: both;\n}\n.animated.infinite {\n  -webkit-animation-iteration-count: infinite;\n  animation-iteration-count: infinite;\n}\n.animated.hinge {\n  -webkit-animation-duration: 2s;\n  animation-duration: 2s;\n}\n@-webkit-keyframes bounce {\n  0%,\n  100%,\n  20%,\n  53%,\n  80% {\n    -webkit-transition-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1);\n    transition-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1);\n    -webkit-transform: translate3d(0, 0, 0);\n    transform: translate3d(0, 0, 0);\n  }\n  40%,\n  43% {\n    -webkit-transition-timing-function: cubic-bezier(0.755, 0.05, 0.855, 0.06);\n    transition-timing-function: cubic-bezier(0.755, 0.05, 0.855, 0.06);\n    -webkit-transform: translate3d(0, -30px, 0);\n    transform: translate3d(0, -30px, 0);\n  }\n  70% {\n    -webkit-transition-timing-function: cubic-bezier(0.755, 0.05, 0.855, 0.06);\n    transition-timing-function: cubic-bezier(0.755, 0.05, 0.855, 0.06);\n    -webkit-transform: translate3d(0, -15px, 0);\n    transform: translate3d(0, -15px, 0);\n  }\n  90% {\n    -webkit-transform: translate3d(0, -4px, 0);\n    transform: translate3d(0, -4px, 0);\n  }\n}\n@keyframes bounce {\n  0%,\n  100%,\n  20%,\n  53%,\n  80% {\n    -webkit-transition-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1);\n    transition-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1);\n    -webkit-transform: translate3d(0, 0, 0);\n    transform: translate3d(0, 0, 0);\n  }\n  40%,\n  43% {\n    -webkit-transition-timing-function: cubic-bezier(0.755, 0.05, 0.855, 0.06);\n    transition-timing-function: cubic-bezier(0.755, 0.05, 0.855, 0.06);\n    -webkit-transform: translate3d(0, -30px, 0);\n    transform: translate3d(0, -30px, 0);\n  }\n  70% {\n    -webkit-transition-timing-function: cubic-bezier(0.755, 0.05, 0.855, 0.06);\n    transition-timing-function: cubic-bezier(0.755, 0.05, 0.855, 0.06);\n    -webkit-transform: translate3d(0, -15px, 0);\n    transform: translate3d(0, -15px, 0);\n  }\n  90% {\n    -webkit-transform: translate3d(0, -4px, 0);\n    transform: translate3d(0, -4px, 0);\n  }\n}\n.bounce {\n  -webkit-animation-name: bounce;\n  animation-name: bounce;\n  -webkit-transform-origin: center bottom;\n  -ms-transform-origin: center bottom;\n  transform-origin: center bottom;\n}\n@-webkit-keyframes flash {\n  0%,\n  100%,\n  50% {\n    opacity: 1;\n  }\n  25%,\n  75% {\n    opacity: 0;\n  }\n}\n@keyframes flash {\n  0%,\n  100%,\n  50% {\n    opacity: 1;\n  }\n  25%,\n  75% {\n    opacity: 0;\n  }\n}\n.flash {\n  -webkit-animation-name: flash;\n  animation-name: flash;\n}\n@-webkit-keyframes pulse {\n  0% {\n    -webkit-transform: scale3d(1, 1, 1);\n    transform: scale3d(1, 1, 1);\n  }\n  50% {\n    -webkit-transform: scale3d(1.05, 1.05, 1.05);\n    transform: scale3d(1.05, 1.05, 1.05);\n  }\n  100% {\n    -webkit-transform: scale3d(1, 1, 1);\n    transform: scale3d(1, 1, 1);\n  }\n}\n@keyframes pulse {\n  0% {\n    -webkit-transform: scale3d(1, 1, 1);\n    transform: scale3d(1, 1, 1);\n  }\n  50% {\n    -webkit-transform: scale3d(1.05, 1.05, 1.05);\n    transform: scale3d(1.05, 1.05, 1.05);\n  }\n  100% {\n    -webkit-transform: scale3d(1, 1, 1);\n    transform: scale3d(1, 1, 1);\n  }\n}\n.pulse {\n  -webkit-animation-name: pulse;\n  animation-name: pulse;\n}\n@-webkit-keyframes rubberBand {\n  0% {\n    -webkit-transform: scale3d(1, 1, 1);\n    transform: scale3d(1, 1, 1);\n  }\n  30% {\n    -webkit-transform: scale3d(1.25, 0.75, 1);\n    transform: scale3d(1.25, 0.75, 1);\n  }\n  40% {\n    -webkit-transform: scale3d(0.75, 1.25, 1);\n    transform: scale3d(0.75, 1.25, 1);\n  }\n  50% {\n    -webkit-transform: scale3d(1.15, 0.85, 1);\n    transform: scale3d(1.15, 0.85, 1);\n  }\n  65% {\n    -webkit-transform: scale3d(0.95, 1.05, 1);\n    transform: scale3d(0.95, 1.05, 1);\n  }\n  75% {\n    -webkit-transform: scale3d(1.05, 0.95, 1);\n    transform: scale3d(1.05, 0.95, 1);\n  }\n  100% {\n    -webkit-transform: scale3d(1, 1, 1);\n    transform: scale3d(1, 1, 1);\n  }\n}\n@keyframes rubberBand {\n  0% {\n    -webkit-transform: scale3d(1, 1, 1);\n    transform: scale3d(1, 1, 1);\n  }\n  30% {\n    -webkit-transform: scale3d(1.25, 0.75, 1);\n    transform: scale3d(1.25, 0.75, 1);\n  }\n  40% {\n    -webkit-transform: scale3d(0.75, 1.25, 1);\n    transform: scale3d(0.75, 1.25, 1);\n  }\n  50% {\n    -webkit-transform: scale3d(1.15, 0.85, 1);\n    transform: scale3d(1.15, 0.85, 1);\n  }\n  65% {\n    -webkit-transform: scale3d(0.95, 1.05, 1);\n    transform: scale3d(0.95, 1.05, 1);\n  }\n  75% {\n    -webkit-transform: scale3d(1.05, 0.95, 1);\n    transform: scale3d(1.05, 0.95, 1);\n  }\n  100% {\n    -webkit-transform: scale3d(1, 1, 1);\n    transform: scale3d(1, 1, 1);\n  }\n}\n.rubberBand {\n  -webkit-animation-name: rubberBand;\n  animation-name: rubberBand;\n}\n@-webkit-keyframes shake {\n  0%,\n  100% {\n    -webkit-transform: translate3d(0, 0, 0);\n    transform: translate3d(0, 0, 0);\n  }\n  10%,\n  30%,\n  50%,\n  70%,\n  90% {\n    -webkit-transform: translate3d(-10px, 0, 0);\n    transform: translate3d(-10px, 0, 0);\n  }\n  20%,\n  40%,\n  60%,\n  80% {\n    -webkit-transform: translate3d(10px, 0, 0);\n    transform: translate3d(10px, 0, 0);\n  }\n}\n@keyframes shake {\n  0%,\n  100% {\n    -webkit-transform: translate3d(0, 0, 0);\n    transform: translate3d(0, 0, 0);\n  }\n  10%,\n  30%,\n  50%,\n  70%,\n  90% {\n    -webkit-transform: translate3d(-10px, 0, 0);\n    transform: translate3d(-10px, 0, 0);\n  }\n  20%,\n  40%,\n  60%,\n  80% {\n    -webkit-transform: translate3d(10px, 0, 0);\n    transform: translate3d(10px, 0, 0);\n  }\n}\n.shake {\n  -webkit-animation-name: shake;\n  animation-name: shake;\n}\n@-webkit-keyframes swing {\n  20% {\n    -webkit-transform: rotate3d(0, 0, 1, 15deg);\n    transform: rotate3d(0, 0, 1, 15deg);\n  }\n  40% {\n    -webkit-transform: rotate3d(0, 0, 1, -10deg);\n    transform: rotate3d(0, 0, 1, -10deg);\n  }\n  60% {\n    -webkit-transform: rotate3d(0, 0, 1, 5deg);\n    transform: rotate3d(0, 0, 1, 5deg);\n  }\n  80% {\n    -webkit-transform: rotate3d(0, 0, 1, -5deg);\n    transform: rotate3d(0, 0, 1, -5deg);\n  }\n  100% {\n    -webkit-transform: rotate3d(0, 0, 1, 0deg);\n    transform: rotate3d(0, 0, 1, 0deg);\n  }\n}\n@keyframes swing {\n  20% {\n    -webkit-transform: rotate3d(0, 0, 1, 15deg);\n    transform: rotate3d(0, 0, 1, 15deg);\n  }\n  40% {\n    -webkit-transform: rotate3d(0, 0, 1, -10deg);\n    transform: rotate3d(0, 0, 1, -10deg);\n  }\n  60% {\n    -webkit-transform: rotate3d(0, 0, 1, 5deg);\n    transform: rotate3d(0, 0, 1, 5deg);\n  }\n  80% {\n    -webkit-transform: rotate3d(0, 0, 1, -5deg);\n    transform: rotate3d(0, 0, 1, -5deg);\n  }\n  100% {\n    -webkit-transform: rotate3d(0, 0, 1, 0deg);\n    transform: rotate3d(0, 0, 1, 0deg);\n  }\n}\n.swing {\n  -webkit-transform-origin: top center;\n  -ms-transform-origin: top center;\n  transform-origin: top center;\n  -webkit-animation-name: swing;\n  animation-name: swing;\n}\n@-webkit-keyframes tada {\n  0% {\n    -webkit-transform: scale3d(1, 1, 1);\n    transform: scale3d(1, 1, 1);\n  }\n  10%,\n  20% {\n    -webkit-transform: scale3d(0.9, 0.9, 0.9) rotate3d(0, 0, 1, -3deg);\n    transform: scale3d(0.9, 0.9, 0.9) rotate3d(0, 0, 1, -3deg);\n  }\n  30%,\n  50%,\n  70%,\n  90% {\n    -webkit-transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, 3deg);\n    transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, 3deg);\n  }\n  40%,\n  60%,\n  80% {\n    -webkit-transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, -3deg);\n    transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, -3deg);\n  }\n  100% {\n    -webkit-transform: scale3d(1, 1, 1);\n    transform: scale3d(1, 1, 1);\n  }\n}\n@keyframes tada {\n  0% {\n    -webkit-transform: scale3d(1, 1, 1);\n    transform: scale3d(1, 1, 1);\n  }\n  10%,\n  20% {\n    -webkit-transform: scale3d(0.9, 0.9, 0.9) rotate3d(0, 0, 1, -3deg);\n    transform: scale3d(0.9, 0.9, 0.9) rotate3d(0, 0, 1, -3deg);\n  }\n  30%,\n  50%,\n  70%,\n  90% {\n    -webkit-transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, 3deg);\n    transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, 3deg);\n  }\n  40%,\n  60%,\n  80% {\n    -webkit-transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, -3deg);\n    transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, -3deg);\n  }\n  100% {\n    -webkit-transform: scale3d(1, 1, 1);\n    transform: scale3d(1, 1, 1);\n  }\n}\n.tada {\n  -webkit-animation-name: tada;\n  animation-name: tada;\n}\n@-webkit-keyframes wobble {\n  0% {\n    -webkit-transform: none;\n    transform: none;\n  }\n  15% {\n    -webkit-transform: translate3d(-25%, 0, 0) rotate3d(0, 0, 1, -5deg);\n    transform: translate3d(-25%, 0, 0) rotate3d(0, 0, 1, -5deg);\n  }\n  30% {\n    -webkit-transform: translate3d(20%, 0, 0) rotate3d(0, 0, 1, 3deg);\n    transform: translate3d(20%, 0, 0) rotate3d(0, 0, 1, 3deg);\n  }\n  45% {\n    -webkit-transform: translate3d(-15%, 0, 0) rotate3d(0, 0, 1, -3deg);\n    transform: translate3d(-15%, 0, 0) rotate3d(0, 0, 1, -3deg);\n  }\n  60% {\n    -webkit-transform: translate3d(10%, 0, 0) rotate3d(0, 0, 1, 2deg);\n    transform: translate3d(10%, 0, 0) rotate3d(0, 0, 1, 2deg);\n  }\n  75% {\n    -webkit-transform: translate3d(-5%, 0, 0) rotate3d(0, 0, 1, -1deg);\n    transform: translate3d(-5%, 0, 0) rotate3d(0, 0, 1, -1deg);\n  }\n  100% {\n    -webkit-transform: none;\n    transform: none;\n  }\n}\n@keyframes wobble {\n  0% {\n    -webkit-transform: none;\n    transform: none;\n  }\n  15% {\n    -webkit-transform: translate3d(-25%, 0, 0) rotate3d(0, 0, 1, -5deg);\n    transform: translate3d(-25%, 0, 0) rotate3d(0, 0, 1, -5deg);\n  }\n  30% {\n    -webkit-transform: translate3d(20%, 0, 0) rotate3d(0, 0, 1, 3deg);\n    transform: translate3d(20%, 0, 0) rotate3d(0, 0, 1, 3deg);\n  }\n  45% {\n    -webkit-transform: translate3d(-15%, 0, 0) rotate3d(0, 0, 1, -3deg);\n    transform: translate3d(-15%, 0, 0) rotate3d(0, 0, 1, -3deg);\n  }\n  60% {\n    -webkit-transform: translate3d(10%, 0, 0) rotate3d(0, 0, 1, 2deg);\n    transform: translate3d(10%, 0, 0) rotate3d(0, 0, 1, 2deg);\n  }\n  75% {\n    -webkit-transform: translate3d(-5%, 0, 0) rotate3d(0, 0, 1, -1deg);\n    transform: translate3d(-5%, 0, 0) rotate3d(0, 0, 1, -1deg);\n  }\n  100% {\n    -webkit-transform: none;\n    transform: none;\n  }\n}\n.wobble {\n  -webkit-animation-name: wobble;\n  animation-name: wobble;\n}\n@-webkit-keyframes bounceIn {\n  0%,\n  100%,\n  20%,\n  40%,\n  60%,\n  80% {\n    -webkit-transition-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1);\n    transition-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1);\n  }\n  0% {\n    opacity: 0;\n    -webkit-transform: scale3d(0.3, 0.3, 0.3);\n    transform: scale3d(0.3, 0.3, 0.3);\n  }\n  20% {\n    -webkit-transform: scale3d(1.1, 1.1, 1.1);\n    transform: scale3d(1.1, 1.1, 1.1);\n  }\n  40% {\n    -webkit-transform: scale3d(0.9, 0.9, 0.9);\n    transform: scale3d(0.9, 0.9, 0.9);\n  }\n  60% {\n    opacity: 1;\n    -webkit-transform: scale3d(1.03, 1.03, 1.03);\n    transform: scale3d(1.03, 1.03, 1.03);\n  }\n  80% {\n    -webkit-transform: scale3d(0.97, 0.97, 0.97);\n    transform: scale3d(0.97, 0.97, 0.97);\n  }\n  100% {\n    opacity: 1;\n    -webkit-transform: scale3d(1, 1, 1);\n    transform: scale3d(1, 1, 1);\n  }\n}\n@keyframes bounceIn {\n  0%,\n  100%,\n  20%,\n  40%,\n  60%,\n  80% {\n    -webkit-transition-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1);\n    transition-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1);\n  }\n  0% {\n    opacity: 0;\n    -webkit-transform: scale3d(0.3, 0.3, 0.3);\n    transform: scale3d(0.3, 0.3, 0.3);\n  }\n  20% {\n    -webkit-transform: scale3d(1.1, 1.1, 1.1);\n    transform: scale3d(1.1, 1.1, 1.1);\n  }\n  40% {\n    -webkit-transform: scale3d(0.9, 0.9, 0.9);\n    transform: scale3d(0.9, 0.9, 0.9);\n  }\n  60% {\n    opacity: 1;\n    -webkit-transform: scale3d(1.03, 1.03, 1.03);\n    transform: scale3d(1.03, 1.03, 1.03);\n  }\n  80% {\n    -webkit-transform: scale3d(0.97, 0.97, 0.97);\n    transform: scale3d(0.97, 0.97, 0.97);\n  }\n  100% {\n    opacity: 1;\n    -webkit-transform: scale3d(1, 1, 1);\n    transform: scale3d(1, 1, 1);\n  }\n}\n.bounceIn {\n  -webkit-animation-name: bounceIn;\n  animation-name: bounceIn;\n  -webkit-animation-duration: .75s;\n  animation-duration: 0.75s;\n}\n@-webkit-keyframes bounceInDown {\n  0%,\n  100%,\n  60%,\n  75%,\n  90% {\n    -webkit-transition-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1);\n    transition-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1);\n  }\n  0% {\n    opacity: 0;\n    -webkit-transform: translate3d(0, -3000px, 0);\n    transform: translate3d(0, -3000px, 0);\n  }\n  60% {\n    opacity: 1;\n    -webkit-transform: translate3d(0, 25px, 0);\n    transform: translate3d(0, 25px, 0);\n  }\n  75% {\n    -webkit-transform: translate3d(0, -10px, 0);\n    transform: translate3d(0, -10px, 0);\n  }\n  90% {\n    -webkit-transform: translate3d(0, 5px, 0);\n    transform: translate3d(0, 5px, 0);\n  }\n  100% {\n    -webkit-transform: none;\n    transform: none;\n  }\n}\n@keyframes bounceInDown {\n  0%,\n  100%,\n  60%,\n  75%,\n  90% {\n    -webkit-transition-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1);\n    transition-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1);\n  }\n  0% {\n    opacity: 0;\n    -webkit-transform: translate3d(0, -3000px, 0);\n    transform: translate3d(0, -3000px, 0);\n  }\n  60% {\n    opacity: 1;\n    -webkit-transform: translate3d(0, 25px, 0);\n    transform: translate3d(0, 25px, 0);\n  }\n  75% {\n    -webkit-transform: translate3d(0, -10px, 0);\n    transform: translate3d(0, -10px, 0);\n  }\n  90% {\n    -webkit-transform: translate3d(0, 5px, 0);\n    transform: translate3d(0, 5px, 0);\n  }\n  100% {\n    -webkit-transform: none;\n    transform: none;\n  }\n}\n.bounceInDown {\n  -webkit-animation-name: bounceInDown;\n  animation-name: bounceInDown;\n}\n@-webkit-keyframes bounceInLeft {\n  0%,\n  100%,\n  60%,\n  75%,\n  90% {\n    -webkit-transition-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1);\n    transition-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1);\n  }\n  0% {\n    opacity: 0;\n    -webkit-transform: translate3d(-3000px, 0, 0);\n    transform: translate3d(-3000px, 0, 0);\n  }\n  60% {\n    opacity: 1;\n    -webkit-transform: translate3d(25px, 0, 0);\n    transform: translate3d(25px, 0, 0);\n  }\n  75% {\n    -webkit-transform: translate3d(-10px, 0, 0);\n    transform: translate3d(-10px, 0, 0);\n  }\n  90% {\n    -webkit-transform: translate3d(5px, 0, 0);\n    transform: translate3d(5px, 0, 0);\n  }\n  100% {\n    -webkit-transform: none;\n    transform: none;\n  }\n}\n@keyframes bounceInLeft {\n  0%,\n  100%,\n  60%,\n  75%,\n  90% {\n    -webkit-transition-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1);\n    transition-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1);\n  }\n  0% {\n    opacity: 0;\n    -webkit-transform: translate3d(-3000px, 0, 0);\n    transform: translate3d(-3000px, 0, 0);\n  }\n  60% {\n    opacity: 1;\n    -webkit-transform: translate3d(25px, 0, 0);\n    transform: translate3d(25px, 0, 0);\n  }\n  75% {\n    -webkit-transform: translate3d(-10px, 0, 0);\n    transform: translate3d(-10px, 0, 0);\n  }\n  90% {\n    -webkit-transform: translate3d(5px, 0, 0);\n    transform: translate3d(5px, 0, 0);\n  }\n  100% {\n    -webkit-transform: none;\n    transform: none;\n  }\n}\n.bounceInLeft {\n  -webkit-animation-name: bounceInLeft;\n  animation-name: bounceInLeft;\n}\n@-webkit-keyframes bounceInRight {\n  0%,\n  100%,\n  60%,\n  75%,\n  90% {\n    -webkit-transition-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1);\n    transition-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1);\n  }\n  0% {\n    opacity: 0;\n    -webkit-transform: translate3d(3000px, 0, 0);\n    transform: translate3d(3000px, 0, 0);\n  }\n  60% {\n    opacity: 1;\n    -webkit-transform: translate3d(-25px, 0, 0);\n    transform: translate3d(-25px, 0, 0);\n  }\n  75% {\n    -webkit-transform: translate3d(10px, 0, 0);\n    transform: translate3d(10px, 0, 0);\n  }\n  90% {\n    -webkit-transform: translate3d(-5px, 0, 0);\n    transform: translate3d(-5px, 0, 0);\n  }\n  100% {\n    -webkit-transform: none;\n    transform: none;\n  }\n}\n@keyframes bounceInRight {\n  0%,\n  100%,\n  60%,\n  75%,\n  90% {\n    -webkit-transition-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1);\n    transition-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1);\n  }\n  0% {\n    opacity: 0;\n    -webkit-transform: translate3d(3000px, 0, 0);\n    transform: translate3d(3000px, 0, 0);\n  }\n  60% {\n    opacity: 1;\n    -webkit-transform: translate3d(-25px, 0, 0);\n    transform: translate3d(-25px, 0, 0);\n  }\n  75% {\n    -webkit-transform: translate3d(10px, 0, 0);\n    transform: translate3d(10px, 0, 0);\n  }\n  90% {\n    -webkit-transform: translate3d(-5px, 0, 0);\n    transform: translate3d(-5px, 0, 0);\n  }\n  100% {\n    -webkit-transform: none;\n    transform: none;\n  }\n}\n.bounceInRight {\n  -webkit-animation-name: bounceInRight;\n  animation-name: bounceInRight;\n}\n@-webkit-keyframes bounceInUp {\n  0%,\n  100%,\n  60%,\n  75%,\n  90% {\n    -webkit-transition-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1);\n    transition-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1);\n  }\n  0% {\n    opacity: 0;\n    -webkit-transform: translate3d(0, 3000px, 0);\n    transform: translate3d(0, 3000px, 0);\n  }\n  60% {\n    opacity: 1;\n    -webkit-transform: translate3d(0, -20px, 0);\n    transform: translate3d(0, -20px, 0);\n  }\n  75% {\n    -webkit-transform: translate3d(0, 10px, 0);\n    transform: translate3d(0, 10px, 0);\n  }\n  90% {\n    -webkit-transform: translate3d(0, -5px, 0);\n    transform: translate3d(0, -5px, 0);\n  }\n  100% {\n    -webkit-transform: translate3d(0, 0, 0);\n    transform: translate3d(0, 0, 0);\n  }\n}\n@keyframes bounceInUp {\n  0%,\n  100%,\n  60%,\n  75%,\n  90% {\n    -webkit-transition-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1);\n    transition-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1);\n  }\n  0% {\n    opacity: 0;\n    -webkit-transform: translate3d(0, 3000px, 0);\n    transform: translate3d(0, 3000px, 0);\n  }\n  60% {\n    opacity: 1;\n    -webkit-transform: translate3d(0, -20px, 0);\n    transform: translate3d(0, -20px, 0);\n  }\n  75% {\n    -webkit-transform: translate3d(0, 10px, 0);\n    transform: translate3d(0, 10px, 0);\n  }\n  90% {\n    -webkit-transform: translate3d(0, -5px, 0);\n    transform: translate3d(0, -5px, 0);\n  }\n  100% {\n    -webkit-transform: translate3d(0, 0, 0);\n    transform: translate3d(0, 0, 0);\n  }\n}\n.bounceInUp {\n  -webkit-animation-name: bounceInUp;\n  animation-name: bounceInUp;\n}\n@-webkit-keyframes bounceOut {\n  20% {\n    -webkit-transform: scale3d(0.9, 0.9, 0.9);\n    transform: scale3d(0.9, 0.9, 0.9);\n  }\n  50%,\n  55% {\n    opacity: 1;\n    -webkit-transform: scale3d(1.1, 1.1, 1.1);\n    transform: scale3d(1.1, 1.1, 1.1);\n  }\n  100% {\n    opacity: 0;\n    -webkit-transform: scale3d(0.3, 0.3, 0.3);\n    transform: scale3d(0.3, 0.3, 0.3);\n  }\n}\n@keyframes bounceOut {\n  20% {\n    -webkit-transform: scale3d(0.9, 0.9, 0.9);\n    transform: scale3d(0.9, 0.9, 0.9);\n  }\n  50%,\n  55% {\n    opacity: 1;\n    -webkit-transform: scale3d(1.1, 1.1, 1.1);\n    transform: scale3d(1.1, 1.1, 1.1);\n  }\n  100% {\n    opacity: 0;\n    -webkit-transform: scale3d(0.3, 0.3, 0.3);\n    transform: scale3d(0.3, 0.3, 0.3);\n  }\n}\n.bounceOut {\n  -webkit-animation-name: bounceOut;\n  animation-name: bounceOut;\n  -webkit-animation-duration: .75s;\n  animation-duration: 0.75s;\n}\n@-webkit-keyframes bounceOutDown {\n  20% {\n    -webkit-transform: translate3d(0, 10px, 0);\n    transform: translate3d(0, 10px, 0);\n  }\n  40%,\n  45% {\n    opacity: 1;\n    -webkit-transform: translate3d(0, -20px, 0);\n    transform: translate3d(0, -20px, 0);\n  }\n  100% {\n    opacity: 0;\n    -webkit-transform: translate3d(0, 2000px, 0);\n    transform: translate3d(0, 2000px, 0);\n  }\n}\n@keyframes bounceOutDown {\n  20% {\n    -webkit-transform: translate3d(0, 10px, 0);\n    transform: translate3d(0, 10px, 0);\n  }\n  40%,\n  45% {\n    opacity: 1;\n    -webkit-transform: translate3d(0, -20px, 0);\n    transform: translate3d(0, -20px, 0);\n  }\n  100% {\n    opacity: 0;\n    -webkit-transform: translate3d(0, 2000px, 0);\n    transform: translate3d(0, 2000px, 0);\n  }\n}\n.bounceOutDown {\n  -webkit-animation-name: bounceOutDown;\n  animation-name: bounceOutDown;\n}\n@-webkit-keyframes bounceOutLeft {\n  20% {\n    opacity: 1;\n    -webkit-transform: translate3d(20px, 0, 0);\n    transform: translate3d(20px, 0, 0);\n  }\n  100% {\n    opacity: 0;\n    -webkit-transform: translate3d(-2000px, 0, 0);\n    transform: translate3d(-2000px, 0, 0);\n  }\n}\n@keyframes bounceOutLeft {\n  20% {\n    opacity: 1;\n    -webkit-transform: translate3d(20px, 0, 0);\n    transform: translate3d(20px, 0, 0);\n  }\n  100% {\n    opacity: 0;\n    -webkit-transform: translate3d(-2000px, 0, 0);\n    transform: translate3d(-2000px, 0, 0);\n  }\n}\n.bounceOutLeft {\n  -webkit-animation-name: bounceOutLeft;\n  animation-name: bounceOutLeft;\n}\n@-webkit-keyframes bounceOutRight {\n  20% {\n    opacity: 1;\n    -webkit-transform: translate3d(-20px, 0, 0);\n    transform: translate3d(-20px, 0, 0);\n  }\n  100% {\n    opacity: 0;\n    -webkit-transform: translate3d(2000px, 0, 0);\n    transform: translate3d(2000px, 0, 0);\n  }\n}\n@keyframes bounceOutRight {\n  20% {\n    opacity: 1;\n    -webkit-transform: translate3d(-20px, 0, 0);\n    transform: translate3d(-20px, 0, 0);\n  }\n  100% {\n    opacity: 0;\n    -webkit-transform: translate3d(2000px, 0, 0);\n    transform: translate3d(2000px, 0, 0);\n  }\n}\n.bounceOutRight {\n  -webkit-animation-name: bounceOutRight;\n  animation-name: bounceOutRight;\n}\n@-webkit-keyframes bounceOutUp {\n  20% {\n    -webkit-transform: translate3d(0, -10px, 0);\n    transform: translate3d(0, -10px, 0);\n  }\n  40%,\n  45% {\n    opacity: 1;\n    -webkit-transform: translate3d(0, 20px, 0);\n    transform: translate3d(0, 20px, 0);\n  }\n  100% {\n    opacity: 0;\n    -webkit-transform: translate3d(0, -2000px, 0);\n    transform: translate3d(0, -2000px, 0);\n  }\n}\n@keyframes bounceOutUp {\n  20% {\n    -webkit-transform: translate3d(0, -10px, 0);\n    transform: translate3d(0, -10px, 0);\n  }\n  40%,\n  45% {\n    opacity: 1;\n    -webkit-transform: translate3d(0, 20px, 0);\n    transform: translate3d(0, 20px, 0);\n  }\n  100% {\n    opacity: 0;\n    -webkit-transform: translate3d(0, -2000px, 0);\n    transform: translate3d(0, -2000px, 0);\n  }\n}\n.bounceOutUp {\n  -webkit-animation-name: bounceOutUp;\n  animation-name: bounceOutUp;\n}\n@-webkit-keyframes fadeIn {\n  0% {\n    opacity: 0;\n  }\n  100% {\n    opacity: 1;\n  }\n}\n@keyframes fadeIn {\n  0% {\n    opacity: 0;\n  }\n  100% {\n    opacity: 1;\n  }\n}\n.fadeIn {\n  -webkit-animation-name: fadeIn;\n  animation-name: fadeIn;\n}\n@-webkit-keyframes fadeInDown {\n  0% {\n    opacity: 0;\n    -webkit-transform: translate3d(0, -100%, 0);\n    transform: translate3d(0, -100%, 0);\n  }\n  100% {\n    opacity: 1;\n    -webkit-transform: none;\n    transform: none;\n  }\n}\n@keyframes fadeInDown {\n  0% {\n    opacity: 0;\n    -webkit-transform: translate3d(0, -100%, 0);\n    transform: translate3d(0, -100%, 0);\n  }\n  100% {\n    opacity: 1;\n    -webkit-transform: none;\n    transform: none;\n  }\n}\n.fadeInDown {\n  -webkit-animation-name: fadeInDown;\n  animation-name: fadeInDown;\n}\n@-webkit-keyframes fadeInDownBig {\n  0% {\n    opacity: 0;\n    -webkit-transform: translate3d(0, -2000px, 0);\n    transform: translate3d(0, -2000px, 0);\n  }\n  100% {\n    opacity: 1;\n    -webkit-transform: none;\n    transform: none;\n  }\n}\n@keyframes fadeInDownBig {\n  0% {\n    opacity: 0;\n    -webkit-transform: translate3d(0, -2000px, 0);\n    transform: translate3d(0, -2000px, 0);\n  }\n  100% {\n    opacity: 1;\n    -webkit-transform: none;\n    transform: none;\n  }\n}\n.fadeInDownBig {\n  -webkit-animation-name: fadeInDownBig;\n  animation-name: fadeInDownBig;\n}\n@-webkit-keyframes fadeInLeft {\n  0% {\n    opacity: 0;\n    -webkit-transform: translate3d(-100%, 0, 0);\n    transform: translate3d(-100%, 0, 0);\n  }\n  100% {\n    opacity: 1;\n    -webkit-transform: none;\n    transform: none;\n  }\n}\n@keyframes fadeInLeft {\n  0% {\n    opacity: 0;\n    -webkit-transform: translate3d(-100%, 0, 0);\n    transform: translate3d(-100%, 0, 0);\n  }\n  100% {\n    opacity: 1;\n    -webkit-transform: none;\n    transform: none;\n  }\n}\n.fadeInLeft {\n  -webkit-animation-name: fadeInLeft;\n  animation-name: fadeInLeft;\n}\n@-webkit-keyframes fadeInLeftBig {\n  0% {\n    opacity: 0;\n    -webkit-transform: translate3d(-2000px, 0, 0);\n    transform: translate3d(-2000px, 0, 0);\n  }\n  100% {\n    opacity: 1;\n    -webkit-transform: none;\n    transform: none;\n  }\n}\n@keyframes fadeInLeftBig {\n  0% {\n    opacity: 0;\n    -webkit-transform: translate3d(-2000px, 0, 0);\n    transform: translate3d(-2000px, 0, 0);\n  }\n  100% {\n    opacity: 1;\n    -webkit-transform: none;\n    transform: none;\n  }\n}\n.fadeInLeftBig {\n  -webkit-animation-name: fadeInLeftBig;\n  animation-name: fadeInLeftBig;\n}\n@-webkit-keyframes fadeInRight {\n  0% {\n    opacity: 0;\n    -webkit-transform: translate3d(100%, 0, 0);\n    transform: translate3d(100%, 0, 0);\n  }\n  100% {\n    opacity: 1;\n    -webkit-transform: none;\n    transform: none;\n  }\n}\n@keyframes fadeInRight {\n  0% {\n    opacity: 0;\n    -webkit-transform: translate3d(100%, 0, 0);\n    transform: translate3d(100%, 0, 0);\n  }\n  100% {\n    opacity: 1;\n    -webkit-transform: none;\n    transform: none;\n  }\n}\n.fadeInRight {\n  -webkit-animation-name: fadeInRight;\n  animation-name: fadeInRight;\n}\n@-webkit-keyframes fadeInRightBig {\n  0% {\n    opacity: 0;\n    -webkit-transform: translate3d(2000px, 0, 0);\n    transform: translate3d(2000px, 0, 0);\n  }\n  100% {\n    opacity: 1;\n    -webkit-transform: none;\n    transform: none;\n  }\n}\n@keyframes fadeInRightBig {\n  0% {\n    opacity: 0;\n    -webkit-transform: translate3d(2000px, 0, 0);\n    transform: translate3d(2000px, 0, 0);\n  }\n  100% {\n    opacity: 1;\n    -webkit-transform: none;\n    transform: none;\n  }\n}\n.fadeInRightBig {\n  -webkit-animation-name: fadeInRightBig;\n  animation-name: fadeInRightBig;\n}\n@-webkit-keyframes fadeInUp {\n  0% {\n    opacity: 0;\n    -webkit-transform: translate3d(0, 100%, 0);\n    transform: translate3d(0, 100%, 0);\n  }\n  100% {\n    opacity: 1;\n    -webkit-transform: none;\n    transform: none;\n  }\n}\n@keyframes fadeInUp {\n  0% {\n    opacity: 0;\n    -webkit-transform: translate3d(0, 100%, 0);\n    transform: translate3d(0, 100%, 0);\n  }\n  100% {\n    opacity: 1;\n    -webkit-transform: none;\n    transform: none;\n  }\n}\n.fadeInUp {\n  -webkit-animation-name: fadeInUp;\n  animation-name: fadeInUp;\n}\n@-webkit-keyframes fadeInUpBig {\n  0% {\n    opacity: 0;\n    -webkit-transform: translate3d(0, 2000px, 0);\n    transform: translate3d(0, 2000px, 0);\n  }\n  100% {\n    opacity: 1;\n    -webkit-transform: none;\n    transform: none;\n  }\n}\n@keyframes fadeInUpBig {\n  0% {\n    opacity: 0;\n    -webkit-transform: translate3d(0, 2000px, 0);\n    transform: translate3d(0, 2000px, 0);\n  }\n  100% {\n    opacity: 1;\n    -webkit-transform: none;\n    transform: none;\n  }\n}\n.fadeInUpBig {\n  -webkit-animation-name: fadeInUpBig;\n  animation-name: fadeInUpBig;\n}\n@-webkit-keyframes fadeOut {\n  0% {\n    opacity: 1;\n  }\n  100% {\n    opacity: 0;\n  }\n}\n@keyframes fadeOut {\n  0% {\n    opacity: 1;\n  }\n  100% {\n    opacity: 0;\n  }\n}\n.fadeOut {\n  -webkit-animation-name: fadeOut;\n  animation-name: fadeOut;\n}\n@-webkit-keyframes fadeOutDown {\n  0% {\n    opacity: 1;\n  }\n  100% {\n    opacity: 0;\n    -webkit-transform: translate3d(0, 100%, 0);\n    transform: translate3d(0, 100%, 0);\n  }\n}\n@keyframes fadeOutDown {\n  0% {\n    opacity: 1;\n  }\n  100% {\n    opacity: 0;\n    -webkit-transform: translate3d(0, 100%, 0);\n    transform: translate3d(0, 100%, 0);\n  }\n}\n.fadeOutDown {\n  -webkit-animation-name: fadeOutDown;\n  animation-name: fadeOutDown;\n}\n@-webkit-keyframes fadeOutDownBig {\n  0% {\n    opacity: 1;\n  }\n  100% {\n    opacity: 0;\n    -webkit-transform: translate3d(0, 2000px, 0);\n    transform: translate3d(0, 2000px, 0);\n  }\n}\n@keyframes fadeOutDownBig {\n  0% {\n    opacity: 1;\n  }\n  100% {\n    opacity: 0;\n    -webkit-transform: translate3d(0, 2000px, 0);\n    transform: translate3d(0, 2000px, 0);\n  }\n}\n.fadeOutDownBig {\n  -webkit-animation-name: fadeOutDownBig;\n  animation-name: fadeOutDownBig;\n}\n@-webkit-keyframes fadeOutLeft {\n  0% {\n    opacity: 1;\n  }\n  100% {\n    opacity: 0;\n    -webkit-transform: translate3d(-100%, 0, 0);\n    transform: translate3d(-100%, 0, 0);\n  }\n}\n@keyframes fadeOutLeft {\n  0% {\n    opacity: 1;\n  }\n  100% {\n    opacity: 0;\n    -webkit-transform: translate3d(-100%, 0, 0);\n    transform: translate3d(-100%, 0, 0);\n  }\n}\n.fadeOutLeft {\n  -webkit-animation-name: fadeOutLeft;\n  animation-name: fadeOutLeft;\n}\n@-webkit-keyframes fadeOutLeftBig {\n  0% {\n    opacity: 1;\n  }\n  100% {\n    opacity: 0;\n    -webkit-transform: translate3d(-2000px, 0, 0);\n    transform: translate3d(-2000px, 0, 0);\n  }\n}\n@keyframes fadeOutLeftBig {\n  0% {\n    opacity: 1;\n  }\n  100% {\n    opacity: 0;\n    -webkit-transform: translate3d(-2000px, 0, 0);\n    transform: translate3d(-2000px, 0, 0);\n  }\n}\n.fadeOutLeftBig {\n  -webkit-animation-name: fadeOutLeftBig;\n  animation-name: fadeOutLeftBig;\n}\n@-webkit-keyframes fadeOutRight {\n  0% {\n    opacity: 1;\n  }\n  100% {\n    opacity: 0;\n    -webkit-transform: translate3d(100%, 0, 0);\n    transform: translate3d(100%, 0, 0);\n  }\n}\n@keyframes fadeOutRight {\n  0% {\n    opacity: 1;\n  }\n  100% {\n    opacity: 0;\n    -webkit-transform: translate3d(100%, 0, 0);\n    transform: translate3d(100%, 0, 0);\n  }\n}\n.fadeOutRight {\n  -webkit-animation-name: fadeOutRight;\n  animation-name: fadeOutRight;\n}\n@-webkit-keyframes fadeOutRightBig {\n  0% {\n    opacity: 1;\n  }\n  100% {\n    opacity: 0;\n    -webkit-transform: translate3d(2000px, 0, 0);\n    transform: translate3d(2000px, 0, 0);\n  }\n}\n@keyframes fadeOutRightBig {\n  0% {\n    opacity: 1;\n  }\n  100% {\n    opacity: 0;\n    -webkit-transform: translate3d(2000px, 0, 0);\n    transform: translate3d(2000px, 0, 0);\n  }\n}\n.fadeOutRightBig {\n  -webkit-animation-name: fadeOutRightBig;\n  animation-name: fadeOutRightBig;\n}\n@-webkit-keyframes fadeOutUp {\n  0% {\n    opacity: 1;\n  }\n  100% {\n    opacity: 0;\n    -webkit-transform: translate3d(0, -100%, 0);\n    transform: translate3d(0, -100%, 0);\n  }\n}\n@keyframes fadeOutUp {\n  0% {\n    opacity: 1;\n  }\n  100% {\n    opacity: 0;\n    -webkit-transform: translate3d(0, -100%, 0);\n    transform: translate3d(0, -100%, 0);\n  }\n}\n.fadeOutUp {\n  -webkit-animation-name: fadeOutUp;\n  animation-name: fadeOutUp;\n}\n@-webkit-keyframes fadeOutUpBig {\n  0% {\n    opacity: 1;\n  }\n  100% {\n    opacity: 0;\n    -webkit-transform: translate3d(0, -2000px, 0);\n    transform: translate3d(0, -2000px, 0);\n  }\n}\n@keyframes fadeOutUpBig {\n  0% {\n    opacity: 1;\n  }\n  100% {\n    opacity: 0;\n    -webkit-transform: translate3d(0, -2000px, 0);\n    transform: translate3d(0, -2000px, 0);\n  }\n}\n.fadeOutUpBig {\n  -webkit-animation-name: fadeOutUpBig;\n  animation-name: fadeOutUpBig;\n}\n@-webkit-keyframes flip {\n  0% {\n    -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -360deg);\n    transform: perspective(400px) rotate3d(0, 1, 0, -360deg);\n    -webkit-animation-timing-function: ease-out;\n    animation-timing-function: ease-out;\n  }\n  40% {\n    -webkit-transform: perspective(400px) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -190deg);\n    transform: perspective(400px) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -190deg);\n    -webkit-animation-timing-function: ease-out;\n    animation-timing-function: ease-out;\n  }\n  50% {\n    -webkit-transform: perspective(400px) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -170deg);\n    transform: perspective(400px) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -170deg);\n    -webkit-animation-timing-function: ease-in;\n    animation-timing-function: ease-in;\n  }\n  80% {\n    -webkit-transform: perspective(400px) scale3d(0.95, 0.95, 0.95);\n    transform: perspective(400px) scale3d(0.95, 0.95, 0.95);\n    -webkit-animation-timing-function: ease-in;\n    animation-timing-function: ease-in;\n  }\n  100% {\n    -webkit-transform: perspective(400px);\n    transform: perspective(400px);\n    -webkit-animation-timing-function: ease-in;\n    animation-timing-function: ease-in;\n  }\n}\n@keyframes flip {\n  0% {\n    -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -360deg);\n    transform: perspective(400px) rotate3d(0, 1, 0, -360deg);\n    -webkit-animation-timing-function: ease-out;\n    animation-timing-function: ease-out;\n  }\n  40% {\n    -webkit-transform: perspective(400px) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -190deg);\n    transform: perspective(400px) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -190deg);\n    -webkit-animation-timing-function: ease-out;\n    animation-timing-function: ease-out;\n  }\n  50% {\n    -webkit-transform: perspective(400px) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -170deg);\n    transform: perspective(400px) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -170deg);\n    -webkit-animation-timing-function: ease-in;\n    animation-timing-function: ease-in;\n  }\n  80% {\n    -webkit-transform: perspective(400px) scale3d(0.95, 0.95, 0.95);\n    transform: perspective(400px) scale3d(0.95, 0.95, 0.95);\n    -webkit-animation-timing-function: ease-in;\n    animation-timing-function: ease-in;\n  }\n  100% {\n    -webkit-transform: perspective(400px);\n    transform: perspective(400px);\n    -webkit-animation-timing-function: ease-in;\n    animation-timing-function: ease-in;\n  }\n}\n.animated.flip {\n  -webkit-backface-visibility: visible;\n  backface-visibility: visible;\n  -webkit-animation-name: flip;\n  animation-name: flip;\n}\n@-webkit-keyframes flipInX {\n  0% {\n    -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 90deg);\n    transform: perspective(400px) rotate3d(1, 0, 0, 90deg);\n    -webkit-transition-timing-function: ease-in;\n    transition-timing-function: ease-in;\n    opacity: 0;\n  }\n  40% {\n    -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -20deg);\n    transform: perspective(400px) rotate3d(1, 0, 0, -20deg);\n    -webkit-transition-timing-function: ease-in;\n    transition-timing-function: ease-in;\n  }\n  60% {\n    -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 10deg);\n    transform: perspective(400px) rotate3d(1, 0, 0, 10deg);\n    opacity: 1;\n  }\n  80% {\n    -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -5deg);\n    transform: perspective(400px) rotate3d(1, 0, 0, -5deg);\n  }\n  100% {\n    -webkit-transform: perspective(400px);\n    transform: perspective(400px);\n  }\n}\n@keyframes flipInX {\n  0% {\n    -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 90deg);\n    transform: perspective(400px) rotate3d(1, 0, 0, 90deg);\n    -webkit-transition-timing-function: ease-in;\n    transition-timing-function: ease-in;\n    opacity: 0;\n  }\n  40% {\n    -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -20deg);\n    transform: perspective(400px) rotate3d(1, 0, 0, -20deg);\n    -webkit-transition-timing-function: ease-in;\n    transition-timing-function: ease-in;\n  }\n  60% {\n    -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 10deg);\n    transform: perspective(400px) rotate3d(1, 0, 0, 10deg);\n    opacity: 1;\n  }\n  80% {\n    -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -5deg);\n    transform: perspective(400px) rotate3d(1, 0, 0, -5deg);\n  }\n  100% {\n    -webkit-transform: perspective(400px);\n    transform: perspective(400px);\n  }\n}\n.flipInX {\n  -webkit-backface-visibility: visible!important;\n  backface-visibility: visible!important;\n  -webkit-animation-name: flipInX;\n  animation-name: flipInX;\n}\n@-webkit-keyframes flipInY {\n  0% {\n    -webkit-transform: perspective(400px) rotate3d(0, 1, 0, 90deg);\n    transform: perspective(400px) rotate3d(0, 1, 0, 90deg);\n    -webkit-transition-timing-function: ease-in;\n    transition-timing-function: ease-in;\n    opacity: 0;\n  }\n  40% {\n    -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -20deg);\n    transform: perspective(400px) rotate3d(0, 1, 0, -20deg);\n    -webkit-transition-timing-function: ease-in;\n    transition-timing-function: ease-in;\n  }\n  60% {\n    -webkit-transform: perspective(400px) rotate3d(0, 1, 0, 10deg);\n    transform: perspective(400px) rotate3d(0, 1, 0, 10deg);\n    opacity: 1;\n  }\n  80% {\n    -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -5deg);\n    transform: perspective(400px) rotate3d(0, 1, 0, -5deg);\n  }\n  100% {\n    -webkit-transform: perspective(400px);\n    transform: perspective(400px);\n  }\n}\n@keyframes flipInY {\n  0% {\n    -webkit-transform: perspective(400px) rotate3d(0, 1, 0, 90deg);\n    transform: perspective(400px) rotate3d(0, 1, 0, 90deg);\n    -webkit-transition-timing-function: ease-in;\n    transition-timing-function: ease-in;\n    opacity: 0;\n  }\n  40% {\n    -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -20deg);\n    transform: perspective(400px) rotate3d(0, 1, 0, -20deg);\n    -webkit-transition-timing-function: ease-in;\n    transition-timing-function: ease-in;\n  }\n  60% {\n    -webkit-transform: perspective(400px) rotate3d(0, 1, 0, 10deg);\n    transform: perspective(400px) rotate3d(0, 1, 0, 10deg);\n    opacity: 1;\n  }\n  80% {\n    -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -5deg);\n    transform: perspective(400px) rotate3d(0, 1, 0, -5deg);\n  }\n  100% {\n    -webkit-transform: perspective(400px);\n    transform: perspective(400px);\n  }\n}\n.flipInY {\n  -webkit-backface-visibility: visible!important;\n  backface-visibility: visible!important;\n  -webkit-animation-name: flipInY;\n  animation-name: flipInY;\n}\n@-webkit-keyframes flipOutX {\n  0% {\n    -webkit-transform: perspective(400px);\n    transform: perspective(400px);\n  }\n  30% {\n    -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -20deg);\n    transform: perspective(400px) rotate3d(1, 0, 0, -20deg);\n    opacity: 1;\n  }\n  100% {\n    -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 90deg);\n    transform: perspective(400px) rotate3d(1, 0, 0, 90deg);\n    opacity: 0;\n  }\n}\n@keyframes flipOutX {\n  0% {\n    -webkit-transform: perspective(400px);\n    transform: perspective(400px);\n  }\n  30% {\n    -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -20deg);\n    transform: perspective(400px) rotate3d(1, 0, 0, -20deg);\n    opacity: 1;\n  }\n  100% {\n    -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 90deg);\n    transform: perspective(400px) rotate3d(1, 0, 0, 90deg);\n    opacity: 0;\n  }\n}\n.flipOutX {\n  -webkit-animation-name: flipOutX;\n  animation-name: flipOutX;\n  -webkit-animation-duration: .75s;\n  animation-duration: .75s;\n  -webkit-backface-visibility: visible!important;\n  backface-visibility: visible !important;\n}\n@-webkit-keyframes flipOutY {\n  0% {\n    -webkit-transform: perspective(400px);\n    transform: perspective(400px);\n  }\n  30% {\n    -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -15deg);\n    transform: perspective(400px) rotate3d(0, 1, 0, -15deg);\n    opacity: 1;\n  }\n  100% {\n    -webkit-transform: perspective(400px) rotate3d(0, 1, 0, 90deg);\n    transform: perspective(400px) rotate3d(0, 1, 0, 90deg);\n    opacity: 0;\n  }\n}\n@keyframes flipOutY {\n  0% {\n    -webkit-transform: perspective(400px);\n    transform: perspective(400px);\n  }\n  30% {\n    -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -15deg);\n    transform: perspective(400px) rotate3d(0, 1, 0, -15deg);\n    opacity: 1;\n  }\n  100% {\n    -webkit-transform: perspective(400px) rotate3d(0, 1, 0, 90deg);\n    transform: perspective(400px) rotate3d(0, 1, 0, 90deg);\n    opacity: 0;\n  }\n}\n.flipOutY {\n  -webkit-backface-visibility: visible!important;\n  backface-visibility: visible!important;\n  -webkit-animation-name: flipOutY;\n  animation-name: flipOutY;\n  -webkit-animation-duration: .75s;\n  animation-duration: 0.75s;\n}\n@-webkit-keyframes lightSpeedIn {\n  0% {\n    -webkit-transform: translate3d(100%, 0, 0) skewX(-30deg);\n    transform: translate3d(100%, 0, 0) skewX(-30deg);\n    opacity: 0;\n  }\n  60% {\n    -webkit-transform: skewX(20deg);\n    transform: skewX(20deg);\n    opacity: 1;\n  }\n  80% {\n    -webkit-transform: skewX(-5deg);\n    transform: skewX(-5deg);\n    opacity: 1;\n  }\n  100% {\n    -webkit-transform: none;\n    transform: none;\n    opacity: 1;\n  }\n}\n@keyframes lightSpeedIn {\n  0% {\n    -webkit-transform: translate3d(100%, 0, 0) skewX(-30deg);\n    transform: translate3d(100%, 0, 0) skewX(-30deg);\n    opacity: 0;\n  }\n  60% {\n    -webkit-transform: skewX(20deg);\n    transform: skewX(20deg);\n    opacity: 1;\n  }\n  80% {\n    -webkit-transform: skewX(-5deg);\n    transform: skewX(-5deg);\n    opacity: 1;\n  }\n  100% {\n    -webkit-transform: none;\n    transform: none;\n    opacity: 1;\n  }\n}\n.lightSpeedIn {\n  -webkit-animation-name: lightSpeedIn;\n  animation-name: lightSpeedIn;\n  -webkit-animation-timing-function: ease-out;\n  animation-timing-function: ease-out;\n}\n@-webkit-keyframes lightSpeedOut {\n  0% {\n    opacity: 1;\n  }\n  100% {\n    -webkit-transform: translate3d(100%, 0, 0) skewX(30deg);\n    transform: translate3d(100%, 0, 0) skewX(30deg);\n    opacity: 0;\n  }\n}\n@keyframes lightSpeedOut {\n  0% {\n    opacity: 1;\n  }\n  100% {\n    -webkit-transform: translate3d(100%, 0, 0) skewX(30deg);\n    transform: translate3d(100%, 0, 0) skewX(30deg);\n    opacity: 0;\n  }\n}\n.lightSpeedOut {\n  -webkit-animation-name: lightSpeedOut;\n  animation-name: lightSpeedOut;\n  -webkit-animation-timing-function: ease-in;\n  animation-timing-function: ease-in;\n}\n@-webkit-keyframes rotateIn {\n  0% {\n    -webkit-transform-origin: center;\n    transform-origin: center;\n    -webkit-transform: rotate3d(0, 0, 1, -200deg);\n    transform: rotate3d(0, 0, 1, -200deg);\n    opacity: 0;\n  }\n  100% {\n    -webkit-transform-origin: center;\n    transform-origin: center;\n    -webkit-transform: none;\n    transform: none;\n    opacity: 1;\n  }\n}\n@keyframes rotateIn {\n  0% {\n    -webkit-transform-origin: center;\n    transform-origin: center;\n    -webkit-transform: rotate3d(0, 0, 1, -200deg);\n    transform: rotate3d(0, 0, 1, -200deg);\n    opacity: 0;\n  }\n  100% {\n    -webkit-transform-origin: center;\n    transform-origin: center;\n    -webkit-transform: none;\n    transform: none;\n    opacity: 1;\n  }\n}\n.rotateIn {\n  -webkit-animation-name: rotateIn;\n  animation-name: rotateIn;\n}\n@-webkit-keyframes rotateInDownLeft {\n  0% {\n    -webkit-transform-origin: left bottom;\n    transform-origin: left bottom;\n    -webkit-transform: rotate3d(0, 0, 1, -45deg);\n    transform: rotate3d(0, 0, 1, -45deg);\n    opacity: 0;\n  }\n  100% {\n    -webkit-transform-origin: left bottom;\n    transform-origin: left bottom;\n    -webkit-transform: none;\n    transform: none;\n    opacity: 1;\n  }\n}\n@keyframes rotateInDownLeft {\n  0% {\n    -webkit-transform-origin: left bottom;\n    transform-origin: left bottom;\n    -webkit-transform: rotate3d(0, 0, 1, -45deg);\n    transform: rotate3d(0, 0, 1, -45deg);\n    opacity: 0;\n  }\n  100% {\n    -webkit-transform-origin: left bottom;\n    transform-origin: left bottom;\n    -webkit-transform: none;\n    transform: none;\n    opacity: 1;\n  }\n}\n.rotateInDownLeft {\n  -webkit-animation-name: rotateInDownLeft;\n  animation-name: rotateInDownLeft;\n}\n@-webkit-keyframes rotateInDownRight {\n  0% {\n    -webkit-transform-origin: right bottom;\n    transform-origin: right bottom;\n    -webkit-transform: rotate3d(0, 0, 1, 45deg);\n    transform: rotate3d(0, 0, 1, 45deg);\n    opacity: 0;\n  }\n  100% {\n    -webkit-transform-origin: right bottom;\n    transform-origin: right bottom;\n    -webkit-transform: none;\n    transform: none;\n    opacity: 1;\n  }\n}\n@keyframes rotateInDownRight {\n  0% {\n    -webkit-transform-origin: right bottom;\n    transform-origin: right bottom;\n    -webkit-transform: rotate3d(0, 0, 1, 45deg);\n    transform: rotate3d(0, 0, 1, 45deg);\n    opacity: 0;\n  }\n  100% {\n    -webkit-transform-origin: right bottom;\n    transform-origin: right bottom;\n    -webkit-transform: none;\n    transform: none;\n    opacity: 1;\n  }\n}\n.rotateInDownRight {\n  -webkit-animation-name: rotateInDownRight;\n  animation-name: rotateInDownRight;\n}\n@-webkit-keyframes rotateInUpLeft {\n  0% {\n    -webkit-transform-origin: left bottom;\n    transform-origin: left bottom;\n    -webkit-transform: rotate3d(0, 0, 1, 45deg);\n    transform: rotate3d(0, 0, 1, 45deg);\n    opacity: 0;\n  }\n  100% {\n    -webkit-transform-origin: left bottom;\n    transform-origin: left bottom;\n    -webkit-transform: none;\n    transform: none;\n    opacity: 1;\n  }\n}\n@keyframes rotateInUpLeft {\n  0% {\n    -webkit-transform-origin: left bottom;\n    transform-origin: left bottom;\n    -webkit-transform: rotate3d(0, 0, 1, 45deg);\n    transform: rotate3d(0, 0, 1, 45deg);\n    opacity: 0;\n  }\n  100% {\n    -webkit-transform-origin: left bottom;\n    transform-origin: left bottom;\n    -webkit-transform: none;\n    transform: none;\n    opacity: 1;\n  }\n}\n.rotateInUpLeft {\n  -webkit-animation-name: rotateInUpLeft;\n  animation-name: rotateInUpLeft;\n}\n@-webkit-keyframes rotateInUpRight {\n  0% {\n    -webkit-transform-origin: right bottom;\n    transform-origin: right bottom;\n    -webkit-transform: rotate3d(0, 0, 1, -90deg);\n    transform: rotate3d(0, 0, 1, -90deg);\n    opacity: 0;\n  }\n  100% {\n    -webkit-transform-origin: right bottom;\n    transform-origin: right bottom;\n    -webkit-transform: none;\n    transform: none;\n    opacity: 1;\n  }\n}\n@keyframes rotateInUpRight {\n  0% {\n    -webkit-transform-origin: right bottom;\n    transform-origin: right bottom;\n    -webkit-transform: rotate3d(0, 0, 1, -90deg);\n    transform: rotate3d(0, 0, 1, -90deg);\n    opacity: 0;\n  }\n  100% {\n    -webkit-transform-origin: right bottom;\n    transform-origin: right bottom;\n    -webkit-transform: none;\n    transform: none;\n    opacity: 1;\n  }\n}\n.rotateInUpRight {\n  -webkit-animation-name: rotateInUpRight;\n  animation-name: rotateInUpRight;\n}\n@-webkit-keyframes rotateOut {\n  0% {\n    -webkit-transform-origin: center;\n    transform-origin: center;\n    opacity: 1;\n  }\n  100% {\n    -webkit-transform-origin: center;\n    transform-origin: center;\n    -webkit-transform: rotate3d(0, 0, 1, 200deg);\n    transform: rotate3d(0, 0, 1, 200deg);\n    opacity: 0;\n  }\n}\n@keyframes rotateOut {\n  0% {\n    -webkit-transform-origin: center;\n    transform-origin: center;\n    opacity: 1;\n  }\n  100% {\n    -webkit-transform-origin: center;\n    transform-origin: center;\n    -webkit-transform: rotate3d(0, 0, 1, 200deg);\n    transform: rotate3d(0, 0, 1, 200deg);\n    opacity: 0;\n  }\n}\n.rotateOut {\n  -webkit-animation-name: rotateOut;\n  animation-name: rotateOut;\n}\n@-webkit-keyframes rotateOutDownLeft {\n  0% {\n    -webkit-transform-origin: left bottom;\n    transform-origin: left bottom;\n    opacity: 1;\n  }\n  100% {\n    -webkit-transform-origin: left bottom;\n    transform-origin: left bottom;\n    -webkit-transform: rotate3d(0, 0, 1, 45deg);\n    transform: rotate3d(0, 0, 1, 45deg);\n    opacity: 0;\n  }\n}\n@keyframes rotateOutDownLeft {\n  0% {\n    -webkit-transform-origin: left bottom;\n    transform-origin: left bottom;\n    opacity: 1;\n  }\n  100% {\n    -webkit-transform-origin: left bottom;\n    transform-origin: left bottom;\n    -webkit-transform: rotate3d(0, 0, 1, 45deg);\n    transform: rotate3d(0, 0, 1, 45deg);\n    opacity: 0;\n  }\n}\n.rotateOutDownLeft {\n  -webkit-animation-name: rotateOutDownLeft;\n  animation-name: rotateOutDownLeft;\n}\n@-webkit-keyframes rotateOutDownRight {\n  0% {\n    -webkit-transform-origin: right bottom;\n    transform-origin: right bottom;\n    opacity: 1;\n  }\n  100% {\n    -webkit-transform-origin: right bottom;\n    transform-origin: right bottom;\n    -webkit-transform: rotate3d(0, 0, 1, -45deg);\n    transform: rotate3d(0, 0, 1, -45deg);\n    opacity: 0;\n  }\n}\n@keyframes rotateOutDownRight {\n  0% {\n    -webkit-transform-origin: right bottom;\n    transform-origin: right bottom;\n    opacity: 1;\n  }\n  100% {\n    -webkit-transform-origin: right bottom;\n    transform-origin: right bottom;\n    -webkit-transform: rotate3d(0, 0, 1, -45deg);\n    transform: rotate3d(0, 0, 1, -45deg);\n    opacity: 0;\n  }\n}\n.rotateOutDownRight {\n  -webkit-animation-name: rotateOutDownRight;\n  animation-name: rotateOutDownRight;\n}\n@-webkit-keyframes rotateOutUpLeft {\n  0% {\n    -webkit-transform-origin: left bottom;\n    transform-origin: left bottom;\n    opacity: 1;\n  }\n  100% {\n    -webkit-transform-origin: left bottom;\n    transform-origin: left bottom;\n    -webkit-transform: rotate3d(0, 0, 1, -45deg);\n    transform: rotate3d(0, 0, 1, -45deg);\n    opacity: 0;\n  }\n}\n@keyframes rotateOutUpLeft {\n  0% {\n    -webkit-transform-origin: left bottom;\n    transform-origin: left bottom;\n    opacity: 1;\n  }\n  100% {\n    -webkit-transform-origin: left bottom;\n    transform-origin: left bottom;\n    -webkit-transform: rotate3d(0, 0, 1, -45deg);\n    transform: rotate3d(0, 0, 1, -45deg);\n    opacity: 0;\n  }\n}\n.rotateOutUpLeft {\n  -webkit-animation-name: rotateOutUpLeft;\n  animation-name: rotateOutUpLeft;\n}\n@-webkit-keyframes rotateOutUpRight {\n  0% {\n    -webkit-transform-origin: right bottom;\n    transform-origin: right bottom;\n    opacity: 1;\n  }\n  100% {\n    -webkit-transform-origin: right bottom;\n    transform-origin: right bottom;\n    -webkit-transform: rotate3d(0, 0, 1, 90deg);\n    transform: rotate3d(0, 0, 1, 90deg);\n    opacity: 0;\n  }\n}\n@keyframes rotateOutUpRight {\n  0% {\n    -webkit-transform-origin: right bottom;\n    transform-origin: right bottom;\n    opacity: 1;\n  }\n  100% {\n    -webkit-transform-origin: right bottom;\n    transform-origin: right bottom;\n    -webkit-transform: rotate3d(0, 0, 1, 90deg);\n    transform: rotate3d(0, 0, 1, 90deg);\n    opacity: 0;\n  }\n}\n.rotateOutUpRight {\n  -webkit-animation-name: rotateOutUpRight;\n  animation-name: rotateOutUpRight;\n}\n@-webkit-keyframes hinge {\n  0% {\n    -webkit-transform-origin: top left;\n    transform-origin: top left;\n    -webkit-animation-timing-function: ease-in-out;\n    animation-timing-function: ease-in-out;\n  }\n  20%,\n  60% {\n    -webkit-transform: rotate3d(0, 0, 1, 80deg);\n    transform: rotate3d(0, 0, 1, 80deg);\n    -webkit-transform-origin: top left;\n    transform-origin: top left;\n    -webkit-animation-timing-function: ease-in-out;\n    animation-timing-function: ease-in-out;\n  }\n  40%,\n  80% {\n    -webkit-transform: rotate3d(0, 0, 1, 60deg);\n    transform: rotate3d(0, 0, 1, 60deg);\n    -webkit-transform-origin: top left;\n    transform-origin: top left;\n    -webkit-animation-timing-function: ease-in-out;\n    animation-timing-function: ease-in-out;\n    opacity: 1;\n  }\n  100% {\n    -webkit-transform: translate3d(0, 700px, 0);\n    transform: translate3d(0, 700px, 0);\n    opacity: 0;\n  }\n}\n@keyframes hinge {\n  0% {\n    -webkit-transform-origin: top left;\n    transform-origin: top left;\n    -webkit-animation-timing-function: ease-in-out;\n    animation-timing-function: ease-in-out;\n  }\n  20%,\n  60% {\n    -webkit-transform: rotate3d(0, 0, 1, 80deg);\n    transform: rotate3d(0, 0, 1, 80deg);\n    -webkit-transform-origin: top left;\n    transform-origin: top left;\n    -webkit-animation-timing-function: ease-in-out;\n    animation-timing-function: ease-in-out;\n  }\n  40%,\n  80% {\n    -webkit-transform: rotate3d(0, 0, 1, 60deg);\n    transform: rotate3d(0, 0, 1, 60deg);\n    -webkit-transform-origin: top left;\n    transform-origin: top left;\n    -webkit-animation-timing-function: ease-in-out;\n    animation-timing-function: ease-in-out;\n    opacity: 1;\n  }\n  100% {\n    -webkit-transform: translate3d(0, 700px, 0);\n    transform: translate3d(0, 700px, 0);\n    opacity: 0;\n  }\n}\n.hinge {\n  -webkit-animation-name: hinge;\n  animation-name: hinge;\n}\n@-webkit-keyframes rollIn {\n  0% {\n    opacity: 0;\n    -webkit-transform: translate3d(-100%, 0, 0) rotate3d(0, 0, 1, -120deg);\n    transform: translate3d(-100%, 0, 0) rotate3d(0, 0, 1, -120deg);\n  }\n  100% {\n    opacity: 1;\n    -webkit-transform: none;\n    transform: none;\n  }\n}\n@keyframes rollIn {\n  0% {\n    opacity: 0;\n    -webkit-transform: translate3d(-100%, 0, 0) rotate3d(0, 0, 1, -120deg);\n    transform: translate3d(-100%, 0, 0) rotate3d(0, 0, 1, -120deg);\n  }\n  100% {\n    opacity: 1;\n    -webkit-transform: none;\n    transform: none;\n  }\n}\n.rollIn {\n  -webkit-animation-name: rollIn;\n  animation-name: rollIn;\n}\n@-webkit-keyframes rollOut {\n  0% {\n    opacity: 1;\n  }\n  100% {\n    opacity: 0;\n    -webkit-transform: translate3d(100%, 0, 0) rotate3d(0, 0, 1, 120deg);\n    transform: translate3d(100%, 0, 0) rotate3d(0, 0, 1, 120deg);\n  }\n}\n@keyframes rollOut {\n  0% {\n    opacity: 1;\n  }\n  100% {\n    opacity: 0;\n    -webkit-transform: translate3d(100%, 0, 0) rotate3d(0, 0, 1, 120deg);\n    transform: translate3d(100%, 0, 0) rotate3d(0, 0, 1, 120deg);\n  }\n}\n.rollOut {\n  -webkit-animation-name: rollOut;\n  animation-name: rollOut;\n}\n@-webkit-keyframes zoomIn {\n  0% {\n    opacity: 0;\n    -webkit-transform: scale3d(0.3, 0.3, 0.3);\n    transform: scale3d(0.3, 0.3, 0.3);\n  }\n  50% {\n    opacity: 1;\n  }\n}\n@keyframes zoomIn {\n  0% {\n    opacity: 0;\n    -webkit-transform: scale3d(0.3, 0.3, 0.3);\n    transform: scale3d(0.3, 0.3, 0.3);\n  }\n  50% {\n    opacity: 1;\n  }\n}\n.zoomIn {\n  -webkit-animation-name: zoomIn;\n  animation-name: zoomIn;\n}\n@-webkit-keyframes zoomInDown {\n  0% {\n    opacity: 0;\n    -webkit-transform: scale3d(0.1, 0.1, 0.1) translate3d(0, -1000px, 0);\n    transform: scale3d(0.1, 0.1, 0.1) translate3d(0, -1000px, 0);\n    -webkit-animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19);\n    animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19);\n  }\n  60% {\n    opacity: 1;\n    -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(0, 60px, 0);\n    transform: scale3d(0.475, 0.475, 0.475) translate3d(0, 60px, 0);\n    -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1);\n    animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1);\n  }\n}\n@keyframes zoomInDown {\n  0% {\n    opacity: 0;\n    -webkit-transform: scale3d(0.1, 0.1, 0.1) translate3d(0, -1000px, 0);\n    transform: scale3d(0.1, 0.1, 0.1) translate3d(0, -1000px, 0);\n    -webkit-animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19);\n    animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19);\n  }\n  60% {\n    opacity: 1;\n    -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(0, 60px, 0);\n    transform: scale3d(0.475, 0.475, 0.475) translate3d(0, 60px, 0);\n    -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1);\n    animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1);\n  }\n}\n.zoomInDown {\n  -webkit-animation-name: zoomInDown;\n  animation-name: zoomInDown;\n}\n@-webkit-keyframes zoomInLeft {\n  0% {\n    opacity: 0;\n    -webkit-transform: scale3d(0.1, 0.1, 0.1) translate3d(-1000px, 0, 0);\n    transform: scale3d(0.1, 0.1, 0.1) translate3d(-1000px, 0, 0);\n    -webkit-animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19);\n    animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19);\n  }\n  60% {\n    opacity: 1;\n    -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(10px, 0, 0);\n    transform: scale3d(0.475, 0.475, 0.475) translate3d(10px, 0, 0);\n    -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1);\n    animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1);\n  }\n}\n@keyframes zoomInLeft {\n  0% {\n    opacity: 0;\n    -webkit-transform: scale3d(0.1, 0.1, 0.1) translate3d(-1000px, 0, 0);\n    transform: scale3d(0.1, 0.1, 0.1) translate3d(-1000px, 0, 0);\n    -webkit-animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19);\n    animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19);\n  }\n  60% {\n    opacity: 1;\n    -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(10px, 0, 0);\n    transform: scale3d(0.475, 0.475, 0.475) translate3d(10px, 0, 0);\n    -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1);\n    animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1);\n  }\n}\n.zoomInLeft {\n  -webkit-animation-name: zoomInLeft;\n  animation-name: zoomInLeft;\n}\n@-webkit-keyframes zoomInRight {\n  0% {\n    opacity: 0;\n    -webkit-transform: scale3d(0.1, 0.1, 0.1) translate3d(1000px, 0, 0);\n    transform: scale3d(0.1, 0.1, 0.1) translate3d(1000px, 0, 0);\n    -webkit-animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19);\n    animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19);\n  }\n  60% {\n    opacity: 1;\n    -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(-10px, 0, 0);\n    transform: scale3d(0.475, 0.475, 0.475) translate3d(-10px, 0, 0);\n    -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1);\n    animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1);\n  }\n}\n@keyframes zoomInRight {\n  0% {\n    opacity: 0;\n    -webkit-transform: scale3d(0.1, 0.1, 0.1) translate3d(1000px, 0, 0);\n    transform: scale3d(0.1, 0.1, 0.1) translate3d(1000px, 0, 0);\n    -webkit-animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19);\n    animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19);\n  }\n  60% {\n    opacity: 1;\n    -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(-10px, 0, 0);\n    transform: scale3d(0.475, 0.475, 0.475) translate3d(-10px, 0, 0);\n    -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1);\n    animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1);\n  }\n}\n.zoomInRight {\n  -webkit-animation-name: zoomInRight;\n  animation-name: zoomInRight;\n}\n@-webkit-keyframes zoomInUp {\n  0% {\n    opacity: 0;\n    -webkit-transform: scale3d(0.1, 0.1, 0.1) translate3d(0, 1000px, 0);\n    transform: scale3d(0.1, 0.1, 0.1) translate3d(0, 1000px, 0);\n    -webkit-animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19);\n    animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19);\n  }\n  60% {\n    opacity: 1;\n    -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(0, -60px, 0);\n    transform: scale3d(0.475, 0.475, 0.475) translate3d(0, -60px, 0);\n    -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1);\n    animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1);\n  }\n}\n@keyframes zoomInUp {\n  0% {\n    opacity: 0;\n    -webkit-transform: scale3d(0.1, 0.1, 0.1) translate3d(0, 1000px, 0);\n    transform: scale3d(0.1, 0.1, 0.1) translate3d(0, 1000px, 0);\n    -webkit-animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19);\n    animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19);\n  }\n  60% {\n    opacity: 1;\n    -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(0, -60px, 0);\n    transform: scale3d(0.475, 0.475, 0.475) translate3d(0, -60px, 0);\n    -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1);\n    animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1);\n  }\n}\n.zoomInUp {\n  -webkit-animation-name: zoomInUp;\n  animation-name: zoomInUp;\n}\n@-webkit-keyframes zoomOut {\n  0% {\n    opacity: 1;\n  }\n  50% {\n    opacity: 0;\n    -webkit-transform: scale3d(0.3, 0.3, 0.3);\n    transform: scale3d(0.3, 0.3, 0.3);\n  }\n  100% {\n    opacity: 0;\n  }\n}\n@keyframes zoomOut {\n  0% {\n    opacity: 1;\n  }\n  50% {\n    opacity: 0;\n    -webkit-transform: scale3d(0.3, 0.3, 0.3);\n    transform: scale3d(0.3, 0.3, 0.3);\n  }\n  100% {\n    opacity: 0;\n  }\n}\n.zoomOut {\n  -webkit-animation-name: zoomOut;\n  animation-name: zoomOut;\n}\n@-webkit-keyframes zoomOutDown {\n  40% {\n    opacity: 1;\n    -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(0, -60px, 0);\n    transform: scale3d(0.475, 0.475, 0.475) translate3d(0, -60px, 0);\n    -webkit-animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19);\n    animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19);\n  }\n  100% {\n    opacity: 0;\n    -webkit-transform: scale3d(0.1, 0.1, 0.1) translate3d(0, 2000px, 0);\n    transform: scale3d(0.1, 0.1, 0.1) translate3d(0, 2000px, 0);\n    -webkit-transform-origin: center bottom;\n    transform-origin: center bottom;\n    -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1);\n    animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1);\n  }\n}\n@keyframes zoomOutDown {\n  40% {\n    opacity: 1;\n    -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(0, -60px, 0);\n    transform: scale3d(0.475, 0.475, 0.475) translate3d(0, -60px, 0);\n    -webkit-animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19);\n    animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19);\n  }\n  100% {\n    opacity: 0;\n    -webkit-transform: scale3d(0.1, 0.1, 0.1) translate3d(0, 2000px, 0);\n    transform: scale3d(0.1, 0.1, 0.1) translate3d(0, 2000px, 0);\n    -webkit-transform-origin: center bottom;\n    transform-origin: center bottom;\n    -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1);\n    animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1);\n  }\n}\n.zoomOutDown {\n  -webkit-animation-name: zoomOutDown;\n  animation-name: zoomOutDown;\n}\n@-webkit-keyframes zoomOutLeft {\n  40% {\n    opacity: 1;\n    -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(42px, 0, 0);\n    transform: scale3d(0.475, 0.475, 0.475) translate3d(42px, 0, 0);\n  }\n  100% {\n    opacity: 0;\n    -webkit-transform: scale(0.1) translate3d(-2000px, 0, 0);\n    transform: scale(0.1) translate3d(-2000px, 0, 0);\n    -webkit-transform-origin: left center;\n    transform-origin: left center;\n  }\n}\n@keyframes zoomOutLeft {\n  40% {\n    opacity: 1;\n    -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(42px, 0, 0);\n    transform: scale3d(0.475, 0.475, 0.475) translate3d(42px, 0, 0);\n  }\n  100% {\n    opacity: 0;\n    -webkit-transform: scale(0.1) translate3d(-2000px, 0, 0);\n    transform: scale(0.1) translate3d(-2000px, 0, 0);\n    -webkit-transform-origin: left center;\n    transform-origin: left center;\n  }\n}\n.zoomOutLeft {\n  -webkit-animation-name: zoomOutLeft;\n  animation-name: zoomOutLeft;\n}\n@-webkit-keyframes zoomOutRight {\n  40% {\n    opacity: 1;\n    -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(-42px, 0, 0);\n    transform: scale3d(0.475, 0.475, 0.475) translate3d(-42px, 0, 0);\n  }\n  100% {\n    opacity: 0;\n    -webkit-transform: scale(0.1) translate3d(2000px, 0, 0);\n    transform: scale(0.1) translate3d(2000px, 0, 0);\n    -webkit-transform-origin: right center;\n    transform-origin: right center;\n  }\n}\n@keyframes zoomOutRight {\n  40% {\n    opacity: 1;\n    -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(-42px, 0, 0);\n    transform: scale3d(0.475, 0.475, 0.475) translate3d(-42px, 0, 0);\n  }\n  100% {\n    opacity: 0;\n    -webkit-transform: scale(0.1) translate3d(2000px, 0, 0);\n    transform: scale(0.1) translate3d(2000px, 0, 0);\n    -webkit-transform-origin: right center;\n    transform-origin: right center;\n  }\n}\n.zoomOutRight {\n  -webkit-animation-name: zoomOutRight;\n  animation-name: zoomOutRight;\n}\n@-webkit-keyframes zoomOutUp {\n  40% {\n    opacity: 1;\n    -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(0, 60px, 0);\n    transform: scale3d(0.475, 0.475, 0.475) translate3d(0, 60px, 0);\n    -webkit-animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19);\n    animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19);\n  }\n  100% {\n    opacity: 0;\n    -webkit-transform: scale3d(0.1, 0.1, 0.1) translate3d(0, -2000px, 0);\n    transform: scale3d(0.1, 0.1, 0.1) translate3d(0, -2000px, 0);\n    -webkit-transform-origin: center bottom;\n    transform-origin: center bottom;\n    -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1);\n    animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1);\n  }\n}\n@keyframes zoomOutUp {\n  40% {\n    opacity: 1;\n    -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(0, 60px, 0);\n    transform: scale3d(0.475, 0.475, 0.475) translate3d(0, 60px, 0);\n    -webkit-animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19);\n    animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19);\n  }\n  100% {\n    opacity: 0;\n    -webkit-transform: scale3d(0.1, 0.1, 0.1) translate3d(0, -2000px, 0);\n    transform: scale3d(0.1, 0.1, 0.1) translate3d(0, -2000px, 0);\n    -webkit-transform-origin: center bottom;\n    transform-origin: center bottom;\n    -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1);\n    animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1);\n  }\n}\n.zoomOutUp {\n  -webkit-animation-name: zoomOutUp;\n  animation-name: zoomOutUp;\n}\n@-webkit-keyframes slideInDown {\n  0% {\n    -webkit-transform: translateY(-100%);\n    transform: translateY(-100%);\n    visibility: visible;\n  }\n  100% {\n    -webkit-transform: translateY(0);\n    transform: translateY(0);\n  }\n}\n@keyframes slideInDown {\n  0% {\n    -webkit-transform: translateY(-100%);\n    transform: translateY(-100%);\n    visibility: visible;\n  }\n  100% {\n    -webkit-transform: translateY(0);\n    transform: translateY(0);\n  }\n}\n.slideInDown {\n  -webkit-animation-name: slideInDown;\n  animation-name: slideInDown;\n}\n@-webkit-keyframes slideInLeft {\n  0% {\n    -webkit-transform: translateX(-100%);\n    transform: translateX(-100%);\n    visibility: visible;\n  }\n  100% {\n    -webkit-transform: translateX(0);\n    transform: translateX(0);\n  }\n}\n@keyframes slideInLeft {\n  0% {\n    -webkit-transform: translateX(-100%);\n    transform: translateX(-100%);\n    visibility: visible;\n  }\n  100% {\n    -webkit-transform: translateX(0);\n    transform: translateX(0);\n  }\n}\n.slideInLeft {\n  -webkit-animation-name: slideInLeft;\n  animation-name: slideInLeft;\n}\n@-webkit-keyframes slideInRight {\n  0% {\n    -webkit-transform: translateX(100%);\n    transform: translateX(100%);\n    visibility: visible;\n  }\n  100% {\n    -webkit-transform: translateX(0);\n    transform: translateX(0);\n  }\n}\n@keyframes slideInRight {\n  0% {\n    -webkit-transform: translateX(100%);\n    transform: translateX(100%);\n    visibility: visible;\n  }\n  100% {\n    -webkit-transform: translateX(0);\n    transform: translateX(0);\n  }\n}\n.slideInRight {\n  -webkit-animation-name: slideInRight;\n  animation-name: slideInRight;\n}\n@-webkit-keyframes slideInUp {\n  0% {\n    -webkit-transform: translateY(100%);\n    transform: translateY(100%);\n    visibility: visible;\n  }\n  100% {\n    -webkit-transform: translateY(0);\n    transform: translateY(0);\n  }\n}\n@keyframes slideInUp {\n  0% {\n    -webkit-transform: translateY(100%);\n    transform: translateY(100%);\n    visibility: visible;\n  }\n  100% {\n    -webkit-transform: translateY(0);\n    transform: translateY(0);\n  }\n}\n.slideInUp {\n  -webkit-animation-name: slideInUp;\n  animation-name: slideInUp;\n}\n@-webkit-keyframes slideOutDown {\n  0% {\n    -webkit-transform: translateY(0);\n    transform: translateY(0);\n  }\n  100% {\n    visibility: hidden;\n    -webkit-transform: translateY(100%);\n    transform: translateY(100%);\n  }\n}\n@keyframes slideOutDown {\n  0% {\n    -webkit-transform: translateY(0);\n    transform: translateY(0);\n  }\n  100% {\n    visibility: hidden;\n    -webkit-transform: translateY(100%);\n    transform: translateY(100%);\n  }\n}\n.slideOutDown {\n  -webkit-animation-name: slideOutDown;\n  animation-name: slideOutDown;\n}\n@-webkit-keyframes slideOutLeft {\n  0% {\n    -webkit-transform: translateX(0);\n    transform: translateX(0);\n  }\n  100% {\n    visibility: hidden;\n    -webkit-transform: translateX(-100%);\n    transform: translateX(-100%);\n  }\n}\n@keyframes slideOutLeft {\n  0% {\n    -webkit-transform: translateX(0);\n    transform: translateX(0);\n  }\n  100% {\n    visibility: hidden;\n    -webkit-transform: translateX(-100%);\n    transform: translateX(-100%);\n  }\n}\n.slideOutLeft {\n  -webkit-animation-name: slideOutLeft;\n  animation-name: slideOutLeft;\n}\n@-webkit-keyframes slideOutRight {\n  0% {\n    -webkit-transform: translateX(0);\n    transform: translateX(0);\n  }\n  100% {\n    visibility: hidden;\n    -webkit-transform: translateX(100%);\n    transform: translateX(100%);\n  }\n}\n@keyframes slideOutRight {\n  0% {\n    -webkit-transform: translateX(0);\n    transform: translateX(0);\n  }\n  100% {\n    visibility: hidden;\n    -webkit-transform: translateX(100%);\n    transform: translateX(100%);\n  }\n}\n.slideOutRight {\n  -webkit-animation-name: slideOutRight;\n  animation-name: slideOutRight;\n}\n@-webkit-keyframes slideOutUp {\n  0% {\n    -webkit-transform: translateY(0);\n    transform: translateY(0);\n  }\n  100% {\n    visibility: hidden;\n    -webkit-transform: translateY(-100%);\n    transform: translateY(-100%);\n  }\n}\n@keyframes slideOutUp {\n  0% {\n    -webkit-transform: translateY(0);\n    transform: translateY(0);\n  }\n  100% {\n    visibility: hidden;\n    -webkit-transform: translateY(-100%);\n    transform: translateY(-100%);\n  }\n}\n.slideOutUp {\n  -webkit-animation-name: slideOutUp;\n  animation-name: slideOutUp;\n}\nhtml,\nbody,\ndiv,\nspan,\na,\nli,\ntd,\nth {\n  font-family: '微软雅黑', 'Lato', sans-serif;\n}\nbold {\n  font-family: 'Lato-Bold', sans-serif;\n  font-weight: Bold;\n}\nli,\n.wrappable {\n  white-space: pre;\n  /* CSS 2.0 */\n  white-space: pre-wrap;\n  /* CSS 2.1 */\n  white-space: pre-line;\n  /* CSS 3.0 */\n  white-space: -pre-wrap;\n  /* Opera 4-6 */\n  white-space: -o-pre-wrap;\n  /* Opera 7 */\n  white-space: -moz-pre-wrap;\n  /* Mozilla */\n  white-space: -hp-pre-wrap;\n  /* HP Printers */\n  word-wrap: break-word;\n  /* IE 5+ */\n}\npre.wrappable {\n  white-space: pre;\n  /* CSS 2.0 */\n  white-space: pre-wrap;\n  /* CSS 2.1 */\n  white-space: -pre-wrap;\n  /* Opera 4-6 */\n  white-space: -o-pre-wrap;\n  /* Opera 7 */\n  white-space: -moz-pre-wrap;\n  /* Mozilla */\n  white-space: -hp-pre-wrap;\n  /* HP Printers */\n  word-wrap: break-word;\n  /* IE 5+ */\n}\nhtml {\n  position: relative;\n  min-height: 100%;\n  overflow-x: hidden;\n}\n.btn-group {\n  border-color: #4CAF50;\n}\nbody.full-screen-body-background {\n  background-color: #ffffff;\n}\nbody.top-and-bottom-margins {\n  padding-top: 80px;\n  margin-bottom: 60px;\n}\nbody.no-top-and-bottom-margins {\n  margin: 75px 10px 0px 20px;\n}\nh1,\nh2 {\n  font-weight: 400;\n}\nh1,\nh2,\nh3,\nh4,\nh5,\nh6,\np,\nli {\n  padding-top: 5px;\n  padding-bottom: 5px;\n}\n.alert {\n  margin-top: 20px;\n}\n.thumbnail {\n  background-color: #EEEEEE;\n}\n.fa,\n[class^='ion-'] {\n  margin-right: 5px;\n}\n.fa:hover {\n  text-decoration: none;\n}\n.no-link-underline {\n  text-decoration: none;\n}\n.img-center {\n  margin: 0 auto;\n}\n.btn-cta {\n  font-size: 40px;\n}\n.shadow {\n  white-space: normal;\n  -webkit-box-shadow: 2px 4px 1px rgba(0, 0, 0, 0.3);\n  -moz-box-shadow: 2px 4px 1px rgba(0, 0, 0, 0.3);\n  box-shadow: 2px 4px 1px rgba(0, 0, 0, 0.3);\n}\n.btn-nav {\n  margin-top: 10px;\n}\nul {\n  list-style: none;\n}\n.panel-heading {\n  font-size: 25px;\n}\n.panel-heading > h1 {\n  font-size: 25px;\n  padding: 2px;\n  margin: 2px;\n}\n.navbar-brand {\n  font-size: 26px;\n}\n.navbar > .container {\n  width: auto;\n  padding-left: 0px;\n  padding-right: 0px;\n}\n.nav-height {\n  height: 50px;\n  border: none;\n}\n.landing-icon {\n  height: 200px;\n  width: 200px;\n}\n.completion-icon {\n  font-size: 150px;\n}\n.positive-15 {\n  margin-top: 15px;\n}\n.positive-20 {\n  margin-top: 20px;\n}\n.positive-15-bottom {\n  margin-bottom: 15px;\n}\n.positive-10 {\n  margin-top: 10px;\n}\n.positive-5 {\n  margin-top: 5px;\n}\n.negative-5 {\n  margin-top: -5px;\n}\n.negative-10 {\n  margin-top: -10px;\n}\n.negative-15 {\n  margin-top: -15px;\n}\n.negative-20 {\n  margin-top: -20px;\n}\n.negative-28 {\n  margin-top: -28px;\n}\n.negative-30 {\n  margin-top: -30px;\n}\n.negative-30-bottom {\n  margin-bottom: -30px;\n}\n.negative-35 {\n  margin-top: -35px;\n}\n.negative-55 {\n  margin-top: -55px;\n  margin-bottom: -55px;\n}\n.large-p {\n  font-size: 24px;\n}\n.small-p {\n  font-size: 14px;\n}\n.map-p {\n  font-size: 20px;\n}\n.map-row-numbers {\n  text-align: right;\n  padding-right: 5px;\n  padding-left: 5px;\n}\n.link-table td {\n  font-size: 16px;\n  border-top: none !important;\n}\n@media (min-width: 767px) {\n  .link-table td {\n    font-size: 24px;\n  }\n}\n.capitalize {\n  text-transform: capitalize;\n}\n.text-success {\n  color: #4CAF50;\n}\n.fast-animation {\n  -webkit-animation-duration: 0.5s;\n  animation-duration: 0.5s;\n}\n.disabled {\n  pointer-events: none;\n  cursor: default;\n  color: graytext !important;\n}\n.hidden-element {\n  display: none;\n}\n.nav-logo {\n  height: 40px;\n  margin-top: -10px;\n}\n@media (max-width: 397px) {\n  .nav-logo {\n    height: 30px;\n    margin-top: -5px;\n  }\n}\n@media (max-width: 335px) {\n  .nav-logo {\n    height: 25px;\n    margin-top: -2px;\n  }\n}\n.navbar-right {\n  background-color: #4CAF50;\n  text-align: center;\n}\n@media (min-width: 767px) {\n  .navbar-right {\n    margin-right: 0;\n  }\n}\n@media (max-width: 991px) and (min-width: 767px) {\n  .navbar-right {\n    position: absolute;\n    left: 0;\n    right: 0;\n    margin-right: 0px;\n    white-space: nowrap;\n  }\n}\n.navbar {\n  white-space: nowrap;\n  border: none;\n  line-height: 1;\n}\n@media (min-width: 767px) {\n  .navbar {\n    padding-left: 15px;\n    padding-right: 30px;\n  }\n}\nli.avatar,\nli.avatar > a {\n  padding: 0;\n  margin: 0;\n}\n.thin-progress-bar {\n  height: 8px;\n  margin-top: 3px;\n  margin-bottom: 0px;\n  width: 60%;\n  margin-right: auto;\n  margin-left: auto;\n}\n.panel-body {\n  margin-bottom: -6px;\n}\n.lb-container {\n  padding: 0px;\n}\n.btn-social {\n  width: 250px;\n  margin: auto;\n}\n.btn-link-social {\n  max-width: 400px;\n  margin: auto;\n  margin-bottom: 10px;\n}\n.navbar {\n  background-color: #4CAF50;\n}\na {\n  font-weight: bold;\n}\np {\n  font-size: 14px;\n}\n.map-aside-body p {\n  line-height: 1.8;\n}\n.navbar-nav > li > a {\n  color: #ffffff;\n}\n.navbar-nav > li > a:hover {\n  color: #4CAF50;\n}\n.hug-top {\n  margin-top: -35px;\n  margin-bottom: -10px;\n}\n.nonprofit-landing {\n  font-size: 50px;\n}\n.big-text {\n  font-size: 63px;\n}\n.signup-btn.btn {\n  background-color: #ffac33;\n  background-image: linear-gradient(#ffcc4d, #ffac33);\n  -ms-filter: \"progid:DXImageTransform.Microsoft.gradient(startColorstr=#ffcc4d,  endColorstr=#ffac33,  GradientType=0)\";\n  border-color: #f1a02a;\n  color: #292f33 !important;\n  text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5);\n}\n.signup-btn:hover,\n.signup-btn:focus {\n  background-color: #e99110;\n  background-image: linear-gradient(#ffcc4d, #e99110);\n  -ms-filter: \"progid:DXImageTransform.Microsoft.gradient(startColorstr=#ffcc4d,  endColorstr=#e99110,  GradientType=0)\";\n  border-color: #ec8b11;\n  color: #292f33 !important;\n}\n.signup-btn:active {\n  background-color: #f2a330;\n  background-image: none;\n  box-shadow: inset 0 1px 4px rgba(0, 0, 0, 0.3);\n}\n*,\n*:before,\n*:after {\n  box-sizing: border-box !important;\n}\n.btn-big {\n  font-size: 20px;\n  border-radius: 6px;\n}\n.btn-bigger {\n  font-size: 30px;\n}\n.big-text-field {\n  font-size: 30px;\n  height: 57px;\n  background-color: #ffffff !important;\n}\nh4 {\n  font-size: 22px;\n}\n.no-transition {\n  -webkit-transition: height 0.001s;\n  -moz-transition: height 0.001s;\n  -ms-transition: height 0.001s;\n  -o-transition: height 0.001s;\n  transition: height 0.001s;\n}\n.margin-left-10 {\n  margin-left: 10px;\n}\n@media (max-width: 768px) {\n  .btn-responsive {\n    font-size: 15px;\n    height: 26.5px;\n    padding-top: 1px;\n  }\n}\n@media (max-width: 768px) {\n  .field-responsive {\n    font-size: 15px;\n    height: 26.5px;\n  }\n}\nthead {\n  font-size: 150%;\n}\n.nowrap {\n  white-space: nowrap;\n}\n.big-break {\n  margin-top: 50px;\n  margin-bottom: 50px;\n}\n.profile-picture {\n  height: 50px;\n  width: 50px;\n}\n@media (min-width: 991px) and (max-width: 999px) {\n  .brownie-points-nav {\n    margin-right: -10px;\n  }\n}\n.navbar-nav a {\n  color: #ffffff;\n  font-size: 20px;\n  margin-top: -5px;\n  margin-bottom: -5px;\n}\n.navbar-toggle {\n  color: #ffffff;\n}\n.navbar-toggle:hover,\n.navbar-toggle:focus {\n  color: #4a2b0f;\n}\n.signup-btn-nav {\n  margin-top: -2px !important;\n  padding-top: 10px !important;\n  padding-bottom: 10px !important;\n  margin-right: -12px;\n}\n@media (min-width: 991px) and (max-width: 1010px) {\n  .signup-btn-nav {\n    margin-left: -10px;\n    margin-right: -5px;\n  }\n}\n.public-profile-img {\n  height: 200px;\n  width: 200px;\n  border-radius: 5px;\n}\n.ng-invalid.ng-dirty {\n  border-color: #FA787E;\n}\n.ng-valid.ng-dirty {\n  border-color: #78FA89;\n}\n.flat-top {\n  margin-top: -5px;\n}\n.negative-bottom {\n  margin-bottom: -20px;\n}\n.min-height-1000 {\n  min-height: 1000px;\n}\n.points-on-top {\n  color: #ffffff;\n  font-size: 35px;\n  z-index: 2;\n  width: 60%;\n  margin: 0 auto;\n  position: relative;\n  top: 50%;\n  -webkit-transform: translateY(-50%);\n  transform: translateY(-50%);\n}\n.landing-skill-icon {\n  color: #4CAF50;\n  font-size: 150px;\n}\n.custom-landing-skill-icon {\n  margin-top: -15px;\n  padding-bottom: 15px;\n}\n.black-text {\n  color: #333;\n  font-weight: 400;\n  font-size: 40px;\n}\n.font-awesome-padding {\n  margin-top: 45px;\n  margin-bottom: 20px;\n}\n.background-svg {\n  width: 220px;\n  height: 220px;\n  background-image: url(\"/images/certificate-icon.svg\");\n  background-size: 120%;\n  background-repeat: no-repeat;\n  background-position: center;\n}\n.testimonial-image {\n  border-radius: 5px;\n  height: 200px;\n  width: 200px;\n  color: #009900;\n}\n.testimonial-image-jobs {\n  border-radius: 5px;\n  color: #009900;\n}\n.default-border-radius {\n  border-radius: 5px;\n}\n.height-500 {\n  height: 500px;\n}\n.height-400 {\n  height: 400px;\n}\n.testimonial-copy {\n  text-align: justify;\n  font-size: 18px !important;\n  margin-left: 20px;\n  margin-right: 20px;\n}\n@media (min-width: 991px) and (max-width: 1199px) {\n  .testimonial-copy {\n    height: 150px;\n  }\n}\n@media (min-width: 1200px) {\n  .testimonial-copy {\n    height: 100px;\n  }\n}\n.nonprofit-testimonial-copy {\n  text-align: justify;\n  font-size: 18px !important;\n  margin-left: 20px;\n  margin-right: 20px;\n}\n@media (min-width: 991px) and (max-width: 1199px) {\n  .nonprofit-testimonial-copy {\n    height: 300px !important;\n  }\n}\n@media (min-width: 1200px) {\n  .nonprofit-testimonial-copy {\n    height: 200px !important;\n  }\n}\n.navbar-collapse {\n  border-top: 0;\n}\n.challenge-list-header {\n  background-color: #4CAF50;\n  color: #eeeeee;\n  font-size: 36px;\n  text-align: center;\n  margin-bottom: -30px;\n  border-radius: 5px 5px 0px 0px;\n  padding-left: 50px;\n}\n.closing-x {\n  color: #eeeeee;\n  font-size: 50px;\n  text-align: right;\n}\n.fcc-footer {\n  width: 100%;\n  height: 50px;\n  text-align: center;\n  background-color: #4CAF50;\n  padding: 12px;\n  bottom: 0;\n  left: 0;\n  position: absolute;\n}\n.fcc-footer a {\n  font-size: 20px;\n  color: #eeeeee;\n  margin-left: 0px;\n  margin-right: 0px;\n  padding-left: 10px;\n  padding-right: 10px;\n  padding-top: 14px;\n  padding-bottom: 12px;\n}\n.fcc-footer a:hover {\n  color: #4CAF50;\n  background-color: #eeeeee;\n  text-decoration: none;\n}\n.embed-responsive-twitch-chat {\n  padding-bottom: 117%;\n}\n#directions {\n  text-align: left;\n  font-size: 15px;\n}\n.graph-rect {\n  fill: #ddd !important;\n}\n/**\n * Bonfire styling\n */\nform.code span {\n  font-size: 18px;\n  font-family: \"Ubuntu Mono\";\n  padding-bottom: 0px;\n  margin-bottom: 0px;\n  height: 100%;\n}\n.CodeMirror {\n  line-height: 1 !important;\n}\n.CodeMirror-linenumber {\n  font-size: 18px;\n  font-family: \"Ubuntu Mono\";\n}\n#mainEditorPanel {\n  height: 100%;\n  width: 99%;\n}\n.scroll-locker {\n  overflow-x: hidden;\n  overflow-y: auto;\n}\n#mainEditorPanel .panel-body {\n  padding-bottom: 0px;\n}\ndiv.CodeMirror-scroll {\n  padding-bottom: 30px;\n}\n.test-vertical-center {\n  margin-top: 8px;\n}\n.cm-s-monokai.CodeMirror {\n  border-radius: 5px;\n}\n.courseware-height {\n  min-height: 650px;\n}\n.btn {\n  font-weight: 400;\n  white-space: normal;\n  background: transparent;\n  -webkit-transition: background 0.2s ease-in-out, border 0.2s ease-in-out;\n  -moz-transition: background 0.2s ease-in-out, border 0.2s ease-in-out;\n  -ms-transition: background 0.2s ease-in-out, border 0.2s ease-in-out;\n  -o-transition: background 0.2s ease-in-out, border 0.2s ease-in-out;\n  transition: background 0.2s ease-in-out, border 0.2s ease-in-out;\n}\n.population-table {\n  font-size: 30px;\n  width: 460px;\n  margin: 0 auto;\n  padding: 0;\n}\n.population-table h2 {\n  margin: 0;\n  text-align: left;\n}\n.population-table .tag {\n  width: 165px;\n  display: inline-block;\n}\n.population-table .text-primary {\n  margin-right: 5px;\n}\n@media (max-width: 767px) {\n  .population-table {\n    font-size: 16px;\n    width: 260px;\n  }\n  .population-table .tag {\n    width: 95px;\n  }\n}\n@media (max-width: 991px) {\n  .navbar-header {\n    float: none;\n  }\n  .navbar-toggle {\n    display: block;\n  }\n  .navbar-collapse.collapse {\n    display: none !important;\n  }\n  .navbar-nav {\n    margin-top: 0;\n  }\n  .navbar-nav > li {\n    float: none;\n  }\n  .navbar-nav > li > a {\n    padding-top: 10px;\n    padding-bottom: 10px;\n  }\n  .navbar-text {\n    float: none;\n    margin: 15px 0;\n  }\n  /* since 3.1.0 */\n  .navbar-collapse.collapse.in {\n    display: block !important;\n  }\n  .collapsing {\n    overflow: hidden !important;\n    position: absolute;\n    left: 0;\n    right: 0;\n  }\n}\n.navbar-toggle {\n  width: 80px;\n  padding-left: 0;\n  padding-right: 8px;\n  margin: 7px 2px 7px 0;\n  text-align: left;\n  font-size: 10px;\n}\n.hamburger-text {\n  line-height: 0.75em;\n  margin-top: 10px;\n  font-size: 18px;\n}\n.story-list {\n  padding-bottom: 30px;\n  margin-bottom: 30px;\n}\n.button-spacer {\n  padding: 5px 0;\n}\n.spacer {\n  padding: 15px 0 15px 0;\n}\n.img-news {\n  width: 50px;\n  height: 50px;\n}\n.url-preview {\n  max-width: 250px;\n  max-height: 250px;\n}\n@media (min-width: 768px) {\n  .news-box {\n    margin-top: -40px;\n  }\n}\n@media (max-width: 767px) {\n  .news-box {\n    padding: 5px;\n    border-color: #4A2B0F;\n    border-width: 1px;\n    border-style: solid;\n    border-radius: 5px;\n    width: 100%;\n    float: left;\n  }\n}\n@media (min-width: 768px) {\n  .news-box-search {\n    margin-top: -30px;\n    padding-bottom: 20px;\n  }\n}\n@media (max-width: 767px) {\n  .news-box-search {\n    padding: 5px;\n    border-color: #4A2B0F;\n    border-width: 1px;\n    border-style: solid;\n    border-radius: 5px;\n    width: 100%;\n    float: left;\n  }\n}\n.story-headline {\n  font-size: 20px;\n  margin-left: 14px;\n  margin-top: -5px;\n}\n.landing-heading {\n  font-size: 50px !important;\n  font-family: Georgia;\n}\n.mobile-story-headline {\n  font-size: 20px;\n}\n.story-byline {\n  margin-top: 5px;\n  font-size: 14px;\n}\n.media-stories {\n  margin-left: 20px;\n}\nhr {\n  border: 0;\n  height: 1px;\n  background-image: linear-gradient(to right, rgba(0, 0, 0, 0), rgba(0, 0, 0, 0.75), rgba(0, 0, 0, 0));\n}\n.big-spacer {\n  padding: 30px 0 30px 0;\n}\n#reply-to-main-post,\n#upvote {\n  cursor: pointer;\n}\n.btn-no-shadow {\n  -webkit-box-shadow: 0px 0px 0px rgba(0, 0, 0, 0);\n  -moz-box-shadow: 0px 0px 0px rgba(0, 0, 0, 0);\n  box-shadow: 0px 0px 0px rgba(0, 0, 0, 0);\n}\n.dotted-underline {\n  border-bottom: dashed 1px #457E86;\n}\n.d3-centered {\n  width: 771px;\n  margin: 0 auto;\n}\n.cal-heatmap-container {\n  background-color: #ffffff;\n}\n.interested-camper-image {\n  height: 50px;\n  width: 50px;\n  padding: 5px;\n}\n.mobile-story-image {\n  border-radius: 5px;\n  width: 100%;\n}\n@media (max-width: 768px) {\n  .mobile-story-image {\n    margin-right: 5px;\n  }\n}\n.alert a {\n  text-decoration: underline;\n}\n.step-text {\n  line-height: 120%;\n  padding-bottom: 10px;\n}\n.faded {\n  opacity: 0.5;\n}\n.slightly-faded {\n  opacity: 0.75;\n}\n.padded-ionic-icon {\n  padding-top: 5px;\n}\n.checklist-element {\n  margin-left: -60px;\n  margin-right: -20px;\n}\n.profile-social-icons {\n  margin-left: 8px;\n}\n.border-radius-5 {\n  border-radius: 5px;\n}\ncode {\n  padding: 0;\n}\n@media only screen and (min-width: 993px) {\n  .iframe-scroll {\n    z-index: 1;\n  }\n}\n@media only screen and (max-width: 992px) {\n  .iframe-scroll {\n    height: auto;\n    overflow: auto;\n  }\n}\n.chart rect {\n  fill: steelblue;\n}\n.chart text {\n  font-size: 14px;\n  text-anchor: end;\n}\n.axis path,\n.axis line {\n  fill: none;\n  stroke: #121401;\n  stroke-width: 2px;\n  shape-rendering: crispEdges;\n}\n.gitter-chat-embed {\n  z-index: 20000 !important;\n}\n/* :not(:required) hides this rule from IE9 and below */\n.inner-circles-loader:not(:required) {\n  -moz-transform: translate3d(0, 0, 0);\n  -ms-transform: translate3d(0, 0, 0);\n  -webkit-transform: translate3d(0, 0, 0);\n  transform: translate3d(0, 0, 0);\n  position: relative;\n  display: inline-block;\n  width: 125px;\n  height: 125px;\n  background: rgba(25, 165, 152, 0.5);\n  border-radius: 50%;\n  overflow: hidden;\n  text-indent: -9999px;\n  margin-top: 10%;\n  /* Hides inner circles outside base circle at safari */\n  -webkit-mask-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAIAAACQd1PeAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAA5JREFUeNpiYGBgAAgwAAAEAAGbA+oJAAAAAElFTkSuQmCC);\n}\n.inner-circles-loader:not(:required):before,\n.inner-circles-loader:not(:required):after {\n  content: '';\n  position: absolute;\n  top: 0;\n  display: inline-block;\n  width: 125px;\n  height: 125px;\n  border-radius: 50%;\n}\n.inner-circles-loader:not(:required):before {\n  -moz-animation: inner-circles-loader 3s infinite;\n  -webkit-animation: inner-circles-loader 3s infinite;\n  animation: inner-circles-loader 3s infinite;\n  -moz-transform-origin: 0 50%;\n  -ms-transform-origin: 0 50%;\n  -webkit-transform-origin: 0 50%;\n  transform-origin: 0 50%;\n  left: 0;\n  background: #c7efcf;\n}\n.inner-circles-loader:not(:required):after {\n  -moz-animation: inner-circles-loader 3s 0.2s reverse infinite;\n  -webkit-animation: inner-circles-loader 3s 0.2s reverse infinite;\n  animation: inner-circles-loader 3s 0.2s reverse infinite;\n  -moz-transform-origin: 100% 50%;\n  -ms-transform-origin: 100% 50%;\n  -webkit-transform-origin: 100% 50%;\n  transform-origin: 100% 50%;\n  right: 0;\n  background: #eef5db;\n}\n@-moz-keyframes inner-circles-loader {\n  0% {\n    -moz-transform: rotate(0deg);\n    transform: rotate(0deg);\n  }\n  50% {\n    -moz-transform: rotate(360deg);\n    transform: rotate(360deg);\n  }\n  100% {\n    -moz-transform: rotate(0deg);\n    transform: rotate(0deg);\n  }\n}\n@-webkit-keyframes inner-circles-loader {\n  0% {\n    -webkit-transform: rotate(0deg);\n    transform: rotate(0deg);\n  }\n  50% {\n    -webkit-transform: rotate(360deg);\n    transform: rotate(360deg);\n  }\n  100% {\n    -webkit-transform: rotate(0deg);\n    transform: rotate(0deg);\n  }\n}\n@keyframes inner-circles-loader {\n  0% {\n    -moz-transform: rotate(0deg);\n    -ms-transform: rotate(0deg);\n    -webkit-transform: rotate(0deg);\n    transform: rotate(0deg);\n  }\n  50% {\n    -moz-transform: rotate(360deg);\n    -ms-transform: rotate(360deg);\n    -webkit-transform: rotate(360deg);\n    transform: rotate(360deg);\n  }\n  100% {\n    -moz-transform: rotate(0deg);\n    -ms-transform: rotate(0deg);\n    -webkit-transform: rotate(0deg);\n    transform: rotate(0deg);\n  }\n}\n.chat-embed-main-title {\n  display: flex;\n  flex-grow: 1;\n  padding-left: 31px;\n  padding-top: 7px;\n}\n.gitter-chat-embed {\n  z-index: 100;\n  position: fixed;\n  top: 0;\n  left: 60%;\n  bottom: 0;\n  right: 0;\n  display: flex;\n  flex-direction: row;\n  transition: transform 0.3s cubic-bezier(0.16, 0.22, 0.22, 1.7);\n}\n.gitter-chat-embed.is-collapsed:not(.is-loading) {\n  transform: translateX(110%);\n}\n.jobs-list-highlight {\n  background-color: #ffc;\n}\na.jobs-list-highlight:hover {\n  background-color: #ffc;\n}\n.jobs-list {\n  cursor: pointer;\n  cursor: hand;\n}\n.jobs-checkbox-spacer input[type=\"checkbox\"] {\n  margin-left: -23px;\n}\n.challenge-step-description {\n  font-size: 1.5em;\n}\n.challenge-step-counter {\n  font-size: 20px;\n  line-height: 44px;\n}\n.challenge-instructions-title {\n  margin-top: 0;\n}\n.challenge-instructions-title i {\n  margin-left: 5px;\n  line-height: 20px;\n}\n.challenge-instructions {\n  margin-bottom: 5px;\n}\n.challenge-instructions h4 {\n  margin-bottom: 0;\n}\n.challenge-instructions blockquote {\n  font-size: 90%;\n  font-family: Menlo, Monaco, Consolas, \"Courier New\", monospace;\n  color: #c7254e;\n  background-color: #fffbe5;\n  border-radius: 4px;\n  border: 1px solid #ccc;\n  white-space: pre;\n  padding: 5px 10px;\n  margin-bottom: 10px;\n  margin-top: -10px;\n  overflow: auto;\n}\n.challenge-instructions dfn {\n  font-family: Menlo, Monaco, Consolas, \"Courier New\", monospace;\n  color: #c7254e;\n  background-color: #f9f2f4;\n  border-radius: 4px;\n}\n.challenge-instructions a,\n.challenge-instructions #MDN-links a {\n  color: #31708f;\n}\n.challenge-instructions a::after,\n.challenge-instructions #MDN-links a::after {\n  font-size: 70%;\n  font-family: FontAwesome;\n  content: \" \\f08e\";\n}\n.challenge-instructions ol {\n  font-size: 16px;\n}\n#testSuite {\n  margin-top: 10px;\n}\n#testSuite > div > .row {\n  margin: 0!important;\n}\n.test-output {\n  font-size: 15px;\n  font-family: \"Ubuntu Mono\";\n  margin-top: 8px;\n  line-height: 20px;\n}\n.grayed-out-test-output {\n  color: #777777;\n}\n.big-error-icon {\n  font-size: 30px;\n  color: #d9534f;\n  top: 50%;\n}\n.big-success-icon {\n  font-size: 30px;\n  color: #4CAF50;\n}\niframe.iphone {\n  border: none;\n}\n@media (min-width: 992px) {\n  iframe.iphone {\n    width: 280px;\n    height: 500px;\n    position: absolute;\n    top: 70px;\n    right: 35px;\n    overflow-y: scroll;\n  }\n}\n@media (max-width: 991px) {\n  iframe.iphone {\n    width: 100%;\n    border-radius: 5px;\n    overflow-y: visible;\n    height: 500px;\n  }\n}\n@media (min-width: 1200px) and (max-width: 1250px) {\n  iframe.iphone {\n    right: 22px;\n  }\n}\n.iphone-position {\n  position: absolute;\n  top: -50px;\n  z-index: -1;\n  right: -195px;\n}\n@media (min-width: 1200px) and (max-width: 1250px) {\n  .iphone-position {\n    right: -207px;\n  }\n}\n.toast-title {\n  font-weight: bold;\n}\n.toast-message {\n  -ms-word-wrap: break-word;\n  word-wrap: break-word;\n}\n.toast-message a,\n.toast-message label {\n  color: #FFFFFF;\n}\n.toast-message a:hover {\n  color: #CCCCCC;\n  text-decoration: none;\n}\n.toast-close-button {\n  position: relative;\n  right: -0.3em;\n  top: -0.3em;\n  float: right;\n  font-size: 20px;\n  font-weight: bold;\n  color: #FFFFFF;\n  -webkit-text-shadow: 0 1px 0 #ffffff;\n  text-shadow: 0 1px 0 #ffffff;\n  opacity: 0.8;\n  -ms-filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=80);\n  filter: alpha(opacity=80);\n}\n.toast-close-button:hover,\n.toast-close-button:focus {\n  color: #000000;\n  text-decoration: none;\n  cursor: pointer;\n  opacity: 0.4;\n  -ms-filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=40);\n  filter: alpha(opacity=40);\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=\"#\"`.*/\nbutton.toast-close-button {\n  padding: 0;\n  cursor: pointer;\n  background: transparent;\n  border: 0;\n  -webkit-appearance: none;\n}\n.toast-top-center {\n  top: 0;\n  right: 0;\n  width: 100%;\n}\n.toast-bottom-center {\n  bottom: 0;\n  right: 0;\n  width: 100%;\n}\n.toast-top-full-width {\n  top: 0;\n  right: 0;\n  width: 100%;\n}\n.toast-bottom-full-width {\n  bottom: 0;\n  right: 0;\n  width: 100%;\n}\n.toast-top-left {\n  top: 12px;\n  left: 12px;\n}\n.toast-top-right {\n  top: 12px;\n  right: 12px;\n}\n.toast-bottom-right {\n  right: 12px;\n  bottom: 12px;\n}\n.toast-bottom-left {\n  bottom: 12px;\n  left: 12px;\n}\n#toast-container {\n  position: fixed;\n  z-index: 999999;\n  pointer-events: none;\n  /*overrides*/\n}\n#toast-container * {\n  -moz-box-sizing: border-box;\n  -webkit-box-sizing: border-box;\n  box-sizing: border-box;\n}\n#toast-container > div {\n  position: relative;\n  pointer-events: auto;\n  overflow: hidden;\n  margin: 0 0 6px;\n  padding: 15px 15px 15px 50px;\n  width: 300px;\n  -moz-border-radius: 3px 3px 3px 3px;\n  -webkit-border-radius: 3px 3px 3px 3px;\n  border-radius: 3px 3px 3px 3px;\n  background-position: 15px center;\n  background-repeat: no-repeat;\n  -moz-box-shadow: 0 0 12px #999999;\n  -webkit-box-shadow: 0 0 12px #999999;\n  box-shadow: 0 0 12px #999999;\n  color: #FFFFFF;\n  opacity: 0.8;\n  -ms-filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=80);\n  filter: alpha(opacity=80);\n}\n#toast-container > :hover {\n  -moz-box-shadow: 0 0 12px #000000;\n  -webkit-box-shadow: 0 0 12px #000000;\n  box-shadow: 0 0 12px #000000;\n  opacity: 1;\n  -ms-filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=100);\n  filter: alpha(opacity=100);\n  cursor: pointer;\n}\n#toast-container > .toast-info {\n  background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAGwSURBVEhLtZa9SgNBEMc9sUxxRcoUKSzSWIhXpFMhhYWFhaBg4yPYiWCXZxBLERsLRS3EQkEfwCKdjWJAwSKCgoKCcudv4O5YLrt7EzgXhiU3/4+b2ckmwVjJSpKkQ6wAi4gwhT+z3wRBcEz0yjSseUTrcRyfsHsXmD0AmbHOC9Ii8VImnuXBPglHpQ5wwSVM7sNnTG7Za4JwDdCjxyAiH3nyA2mtaTJufiDZ5dCaqlItILh1NHatfN5skvjx9Z38m69CgzuXmZgVrPIGE763Jx9qKsRozWYw6xOHdER+nn2KkO+Bb+UV5CBN6WC6QtBgbRVozrahAbmm6HtUsgtPC19tFdxXZYBOfkbmFJ1VaHA1VAHjd0pp70oTZzvR+EVrx2Ygfdsq6eu55BHYR8hlcki+n+kERUFG8BrA0BwjeAv2M8WLQBtcy+SD6fNsmnB3AlBLrgTtVW1c2QN4bVWLATaIS60J2Du5y1TiJgjSBvFVZgTmwCU+dAZFoPxGEEs8nyHC9Bwe2GvEJv2WXZb0vjdyFT4Cxk3e/kIqlOGoVLwwPevpYHT+00T+hWwXDf4AJAOUqWcDhbwAAAAASUVORK5CYII=\") !important;\n}\n#toast-container > .toast-error {\n  background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAHOSURBVEhLrZa/SgNBEMZzh0WKCClSCKaIYOED+AAKeQQLG8HWztLCImBrYadgIdY+gIKNYkBFSwu7CAoqCgkkoGBI/E28PdbLZmeDLgzZzcx83/zZ2SSXC1j9fr+I1Hq93g2yxH4iwM1vkoBWAdxCmpzTxfkN2RcyZNaHFIkSo10+8kgxkXIURV5HGxTmFuc75B2RfQkpxHG8aAgaAFa0tAHqYFfQ7Iwe2yhODk8+J4C7yAoRTWI3w/4klGRgR4lO7Rpn9+gvMyWp+uxFh8+H+ARlgN1nJuJuQAYvNkEnwGFck18Er4q3egEc/oO+mhLdKgRyhdNFiacC0rlOCbhNVz4H9FnAYgDBvU3QIioZlJFLJtsoHYRDfiZoUyIxqCtRpVlANq0EU4dApjrtgezPFad5S19Wgjkc0hNVnuF4HjVA6C7QrSIbylB+oZe3aHgBsqlNqKYH48jXyJKMuAbiyVJ8KzaB3eRc0pg9VwQ4niFryI68qiOi3AbjwdsfnAtk0bCjTLJKr6mrD9g8iq/S/B81hguOMlQTnVyG40wAcjnmgsCNESDrjme7wfftP4P7SP4N3CJZdvzoNyGq2c/HWOXJGsvVg+RA/k2MC/wN6I2YA2Pt8GkAAAAASUVORK5CYII=\") !important;\n}\n#toast-container > .toast-success {\n  background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAADsSURBVEhLY2AYBfQMgf///3P8+/evAIgvA/FsIF+BavYDDWMBGroaSMMBiE8VC7AZDrIFaMFnii3AZTjUgsUUWUDA8OdAH6iQbQEhw4HyGsPEcKBXBIC4ARhex4G4BsjmweU1soIFaGg/WtoFZRIZdEvIMhxkCCjXIVsATV6gFGACs4Rsw0EGgIIH3QJYJgHSARQZDrWAB+jawzgs+Q2UO49D7jnRSRGoEFRILcdmEMWGI0cm0JJ2QpYA1RDvcmzJEWhABhD/pqrL0S0CWuABKgnRki9lLseS7g2AlqwHWQSKH4oKLrILpRGhEQCw2LiRUIa4lwAAAABJRU5ErkJggg==\") !important;\n}\n#toast-container > .toast-warning {\n  background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAGYSURBVEhL5ZSvTsNQFMbXZGICMYGYmJhAQIJAICYQPAACiSDB8AiICQQJT4CqQEwgJvYASAQCiZiYmJhAIBATCARJy+9rTsldd8sKu1M0+dLb057v6/lbq/2rK0mS/TRNj9cWNAKPYIJII7gIxCcQ51cvqID+GIEX8ASG4B1bK5gIZFeQfoJdEXOfgX4QAQg7kH2A65yQ87lyxb27sggkAzAuFhbbg1K2kgCkB1bVwyIR9m2L7PRPIhDUIXgGtyKw575yz3lTNs6X4JXnjV+LKM/m3MydnTbtOKIjtz6VhCBq4vSm3ncdrD2lk0VgUXSVKjVDJXJzijW1RQdsU7F77He8u68koNZTz8Oz5yGa6J3H3lZ0xYgXBK2QymlWWA+RWnYhskLBv2vmE+hBMCtbA7KX5drWyRT/2JsqZ2IvfB9Y4bWDNMFbJRFmC9E74SoS0CqulwjkC0+5bpcV1CZ8NMej4pjy0U+doDQsGyo1hzVJttIjhQ7GnBtRFN1UarUlH8F3xict+HY07rEzoUGPlWcjRFRr4/gChZgc3ZL2d8oAAAAASUVORK5CYII=\") !important;\n}\n#toast-container.toast-top-center > div,\n#toast-container.toast-bottom-center > div {\n  width: 300px;\n  margin-left: auto;\n  margin-right: auto;\n}\n#toast-container.toast-top-full-width > div,\n#toast-container.toast-bottom-full-width > div {\n  width: 96%;\n  margin-left: auto;\n  margin-right: auto;\n}\n.toast {\n  background-color: #030303;\n}\n.toast-success {\n  background-color: #51A351;\n}\n.toast-error {\n  background-color: #BD362F;\n}\n.toast-info {\n  background-color: #2F96B4;\n}\n.toast-warning {\n  background-color: #F89406;\n}\n.toast-progress {\n  position: absolute;\n  left: 0;\n  bottom: 0;\n  height: 4px;\n  background-color: #000000;\n  opacity: 0.4;\n  -ms-filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=40);\n  filter: alpha(opacity=40);\n}\n/*Responsive Design*/\n@media all and (max-width: 240px) {\n  #toast-container > div {\n    padding: 8px 8px 8px 50px;\n    width: 11em;\n  }\n  #toast-container .toast-close-button {\n    right: -0.2em;\n    top: -0.2em;\n  }\n}\n@media all and (min-width: 241px) and (max-width: 480px) {\n  #toast-container > div {\n    padding: 8px 8px 8px 50px;\n    width: 18em;\n  }\n  #toast-container .toast-close-button {\n    right: -0.2em;\n    top: -0.2em;\n  }\n}\n@media all and (min-width: 481px) and (max-width: 768px) {\n  #toast-container > div {\n    padding: 15px 15px 15px 50px;\n    width: 25em;\n  }\n}\n/*\n * based off of https://github.com/gitterHQ/sidecar\n * license: MIT\n */\n.map-aside {\n  width: 500px;\n  z-index: 20000;\n  position: fixed;\n  top: 0;\n  bottom: 0;\n  right: 0;\n  display: -webkit-flex;\n  display: flex;\n  -webkit-flex-direction: row;\n  flex-direction: row;\n  background-color: #ffffff;\n  border-left: 1px solid #ddd;\n  box-shadow: -12px 0 18px 0 rgba(50, 50, 50, 0.1);\n  transition: transform 0.3s cubic-bezier(0.16, 0.22, 0.22, 1.7);\n  /* Add some \"extension\" so that there isn't a gap\n     * when we translate(via animation) more than 100% */\n}\n.map-aside.is-collapsed:not(.is-loading) {\n  -webkit-transform: translateX(110%);\n  transform: translateX(110%);\n}\n.map-aside:after {\n  content: '';\n  z-index: -1;\n  position: absolute;\n  top: 0;\n  left: 100%;\n  bottom: 0;\n  right: -100%;\n  background-color: #ffffff;\n}\n.map-aside iframe {\n  width: 100%;\n  height: 100%;\n}\n.map-aside-action-bar {\n  position: absolute;\n  top: 0;\n  right: 0;\n  display: -webkit-flex;\n  display: flex;\n  justify-content: flex-end;\n  padding-bottom: 5px;\n  padding-right: 10px;\n  padding-top: 5px;\n  z-index: 100;\n}\n.map-fixed-header {\n  position: fixed;\n  background: white;\n  padding-top: 5px;\n  width: 100%;\n  z-index: 1;\n  left: 0;\n  top: 0;\n}\n@media (max-width: 720px) {\n  .map-fixed-header {\n    padding-top: 30px;\n  }\n}\n.map-fixed-header p {\n  margin: 5px 0 20px;\n}\n@media (max-width: 720px) {\n  .map-fixed-header p {\n    margin-bottom: 10px;\n  }\n}\n.map-fixed-header hr {\n  margin: 30px 0;\n}\n@media (max-width: 720px) {\n  .map-fixed-header hr {\n    margin: 25px 0;\n  }\n}\n.map-fixed-header .flashMessage {\n  position: fixed;\n  margin: 0 auto;\n  z-index: 2;\n  top: 160px;\n  width: 100%;\n}\n.map-buttons {\n  margin-top: -10px;\n}\n.map-buttons button,\n.map-buttons .input-group {\n  width: 300px;\n}\n.map-buttons .input-group {\n  margin-top: 15px;\n  margin-left: auto;\n  margin-right: auto;\n}\n#map-filter {\n  background: #fff;\n  border-color: darkgreen;\n}\n.input-group-addon {\n  width: 40px;\n  color: darkgreen;\n  background: #fff;\n  border-color: darkgreen;\n}\n.input-group-addon.filled {\n  background: darkgreen;\n  border-color: #000d00;\n  color: #fff;\n  cursor: pointer;\n}\n.input-group-addon .fa {\n  position: absolute;\n  top: 50%;\n  -webkit-transform: translateY(-50%);\n  transform: translateY(-50%);\n  right: 10px;\n}\n.mapWrapper {\n  position: absolute;\n  display: block;\n  height: 100%;\n  width: 100%;\n}\n.map-accordion {\n  width: 700px;\n  margin: 155px auto 0;\n  position: relative;\n}\n.map-accordion #nested {\n  margin: 0 10px;\n}\n@media (max-width: 400px) {\n  .map-accordion #nested {\n    margin: 0;\n  }\n}\n.map-accordion a:focus {\n  text-decoration: none;\n  color: darkgreen;\n}\n.map-accordion a:focus:hover {\n  text-decoration: underline;\n  color: #001800;\n}\n.map-accordion h2 > a {\n  width: 100%;\n  display: block;\n  background: #efefef;\n  padding: 10px 0;\n  padding-left: 50px;\n  padding-right: 20px;\n}\n.map-accordion h3 {\n  margin: 15px 0;\n  padding: 0;\n}\n.map-accordion h3:first-child {\n  margin-top: 25px;\n}\n.map-accordion h3 > a {\n  padding-left: 40px;\n  padding-bottom: 10px;\n  display: block;\n  max-width: 535px;\n}\n.map-accordion div.chapterBlock :before {\n  margin-right: 15px;\n}\n.map-accordion div.chapterBlock p {\n  text-indent: -15px;\n  margin-left: 60px;\n  padding-right: 20px;\n}\n@media (max-width: 400px) {\n  .map-accordion div.chapterBlock p {\n    margin-left: 30px;\n  }\n}\n.map-accordion .challengeBlockDescription {\n  margin: 0;\n  margin-top: -10px;\n  padding: 0 15px 23px 30px;\n}\n.map-accordion span.no-link-underline {\n  position: absolute;\n  margin-left: -30px;\n  color: #666;\n}\n.map-accordion div > div:last-child {\n  margin-bottom: 30px;\n}\n.challengeBlockTime {\n  font-size: 18px;\n  color: #BBBBBB;\n  display: block;\n  margin-left: 40px;\n  margin-bottom: 20px;\n}\n@media (min-width: 721px) {\n  .challengeBlockTime {\n    margin-right: 20px;\n    margin-top: -30px;\n    float: right;\n  }\n}\n@media (max-width: 720px) {\n  .map-accordion {\n    left: 0;\n    right: 0;\n    width: 100%;\n    top: 195px;\n    bottom: 0;\n    margin: 0;\n    position: absolute;\n    overflow-x: hidden;\n    overflow-y: auto;\n    -webkit-overflow-scrolling: touch;\n  }\n  .map-accordion h2 {\n    margin: 15px 0;\n    padding: 0;\n  }\n  .map-accordion h2:first-of-type {\n    margin-top: 0;\n  }\n  .map-accordion h2 > a {\n    padding: 10px 0;\n    padding-left: 50px;\n    padding-right: 20px;\n    font-size: 20px;\n  }\n  .map-accordion h3 {\n    margin: 10px 0;\n    padding: 0;\n  }\n  .map-accordion h3 > a {\n    clear: both;\n    font-size: 20px;\n  }\n}\n.map-aside-action-item {\n  display: -webkit-flex;\n  display: flex;\n  /* main axis */\n  justify-content: center;\n  /* cross axis */\n  align-items: center;\n  width: 40px;\n  height: 40px;\n  padding-left: 0;\n  padding-right: 0;\n  opacity: 0.65;\n  background: none;\n  background-position: center center;\n  background-repeat: no-repeat;\n  background-size: 22px 22px;\n  border: 0;\n  outline: none;\n  cursor: pointer;\n  cursor: hand;\n  transition: all 0.2s ease;\n}\n.map-aside-action-item:hover,\n.map-aside-action-item:focus {\n  opacity: 1;\n}\n.map-aside-action-item:active {\n  filter: hue-rotate(80deg) saturate(150);\n}\n#noneFound {\n  display: none;\n  margin: 60px 30px 0;\n  font-size: 30px;\n  text-align: center;\n  color: darkgreen;\n}\n#noneFound .fa {\n  display: block;\n  font-size: 300px;\n}\n.map-aside-action-pop-out {\n  margin-right: -4px;\n  background-image: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMDAgMTcxLjQyOSIgZmlsbD0iIzNhMzEzMyI+PHBhdGggZD0iTTE1Ny4xNDMsMTAzLjU3MXYzNS43MTRjMCw4Ljg1NC0zLjE0NCwxNi40MjYtOS40MzEsMjIuNzEzcy0xMy44NTgsOS40MzEtMjIuNzEyLDkuNDMxSDMyLjE0MyBjLTguODU0LDAtMTYuNDI1LTMuMTQ0LTIyLjcxMi05LjQzMVMwLDE0OC4xNCwwLDEzOS4yODVWNDYuNDI5YzAtOC44NTQsMy4xNDQtMTYuNDI1LDkuNDMxLTIyLjcxMiBjNi4yODctNi4yODcsMTMuODU4LTkuNDMxLDIyLjcxMi05LjQzMWg3OC41NzJjMS4wNDEsMCwxLjg5NiwwLjMzNSwyLjU2NiwxLjAwNGMwLjY3LDAuNjcsMS4wMDQsMS41MjUsMS4wMDQsMi41NjdWMjUgYzAsMS4wNDItMC4zMzQsMS44OTctMS4wMDQsMi41NjdjLTAuNjcsMC42Ny0xLjUyNSwxLjAwNC0yLjU2NiwxLjAwNEgzMi4xNDNjLTQuOTExLDAtOS4xMTUsMS43NDktMTIuNjEyLDUuMjQ2IHMtNS4yNDYsNy43MDEtNS4yNDYsMTIuNjEydjkyLjg1NmMwLDQuOTExLDEuNzQ5LDkuMTE1LDUuMjQ2LDEyLjYxMnM3LjcwMSw1LjI0NSwxMi42MTIsNS4yNDVIMTI1YzQuOTEsMCw5LjExNS0xLjc0OCwxMi42MTEtNS4yNDUgYzMuNDk3LTMuNDk3LDUuMjQ2LTcuNzAxLDUuMjQ2LTEyLjYxMnYtMzUuNzE0YzAtMS4wNDIsMC4zMzQtMS44OTcsMS4wMDQtMi41NjdjMC42Ny0wLjY2OSwxLjUyNS0xLjAwNCwyLjU2Ny0xLjAwNGg3LjE0MyBjMS4wNDIsMCwxLjg5NywwLjMzNSwyLjU2NywxLjAwNEMxNTYuODA5LDEwMS42NzQsMTU3LjE0MywxMDIuNTI5LDE1Ny4xNDMsMTAzLjU3MXogTTIwMCw3LjE0M3Y1Ny4xNDMgYzAsMS45MzUtMC43MDcsMy42MDktMi4xMjEsNS4wMjJjLTEuNDEzLDEuNDE0LTMuMDg4LDIuMTIxLTUuMDIxLDIuMTIxYy0xLjkzNSwwLTMuNjA5LTAuNzA3LTUuMDIyLTIuMTIxbC0xOS42NDQtMTkuNjQzIGwtNzIuNzY3LDcyLjc2OWMtMC43NDQsMC43NDQtMS42LDEuMTE1LTIuNTY3LDEuMTE1cy0xLjgyMy0wLjM3MS0yLjU2Ny0xLjExNUw3Ny41NjcsMTA5LjcxYy0wLjc0NC0wLjc0NC0xLjExNi0xLjYtMS4xMTYtMi41NjcgYzAtMC45NjcsMC4zNzItMS44MjIsMS4xMTYtMi41NjZsNzIuNzY4LTcyLjc2OGwtMTkuNjQ0LTE5LjY0M2MtMS40MTMtMS40MTQtMi4xMi0zLjA4OC0yLjEyLTUuMDIyYzAtMS45MzUsMC43MDctMy42MDksMi4xMi01LjAyMiBDMTMyLjEwNSwwLjcwNywxMzMuNzc5LDAsMTM1LjcxNSwwaDU3LjE0M2MxLjkzNCwwLDMuNjA4LDAuNzA3LDUuMDIxLDIuMTIxQzE5OS4yOTMsMy41MzQsMjAwLDUuMjA4LDIwMCw3LjE0M3oiLz48L3N2Zz4=);\n}\n.map-aside-action-collapse {\n  background-image: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAxNzEuNDI5IDE3MS40MjkiIGZpbGw9IiMzYTMxMzMiPjxwYXRoIGQ9Ik0xMjIuNDMzLDEwNi4xMzhsLTE2LjI5NSwxNi4yOTVjLTAuNzQ0LDAuNzQ0LTEuNiwxLjExNi0yLjU2NiwxLjExNmMtMC45NjgsMC0xLjgyMy0wLjM3Mi0yLjU2Ny0xLjExNmwtMTUuMjktMTUuMjkgbC0xNS4yOSwxNS4yOWMtMC43NDQsMC43NDQtMS42LDEuMTE2LTIuNTY3LDEuMTE2cy0xLjgyMy0wLjM3Mi0yLjU2Ny0xLjExNmwtMTYuMjk0LTE2LjI5NWMtMC43NDQtMC43NDQtMS4xMTYtMS42LTEuMTE2LTIuNTY2IGMwLTAuOTY4LDAuMzcyLTEuODIzLDEuMTE2LTIuNTY3bDE1LjI5LTE1LjI5bC0xNS4yOS0xNS4yOWMtMC43NDQtMC43NDQtMS4xMTYtMS42LTEuMTE2LTIuNTY3czAuMzcyLTEuODIzLDEuMTE2LTIuNTY3IEw2NS4yOSw0OC45OTZjMC43NDQtMC43NDQsMS42LTEuMTE2LDIuNTY3LTEuMTE2czEuODIzLDAuMzcyLDIuNTY3LDEuMTE2bDE1LjI5LDE1LjI5bDE1LjI5LTE1LjI5IGMwLjc0NC0wLjc0NCwxLjYtMS4xMTYsMi41NjctMS4xMTZjMC45NjcsMCwxLjgyMiwwLjM3MiwyLjU2NiwxLjExNmwxNi4yOTUsMTYuMjk0YzAuNzQ0LDAuNzQ0LDEuMTE2LDEuNiwxLjExNiwyLjU2NyBzLTAuMzcyLDEuODIzLTEuMTE2LDIuNTY3bC0xNS4yOSwxNS4yOWwxNS4yOSwxNS4yOWMwLjc0NCwwLjc0NCwxLjExNiwxLjYsMS4xMTYsMi41NjcgQzEyMy41NDksMTA0LjUzOSwxMjMuMTc3LDEwNS4zOTQsMTIyLjQzMywxMDYuMTM4eiBNMTQ2LjQyOSw4NS43MTRjMC0xMS4wMTItMi43MTctMjEuMTY4LTguMTQ4LTMwLjQ2OSBzLTEyLjc5Ny0xNi42NjctMjIuMDk4LTIyLjA5OFM5Ni43MjYsMjUsODUuNzE0LDI1cy0yMS4xNjgsMi43MTYtMzAuNDY5LDguMTQ3UzM4LjU3OSw0NS45NDUsMzMuMTQ3LDU1LjI0NlMyNSw3NC43MDMsMjUsODUuNzE0IHMyLjcxNiwyMS4xNjgsOC4xNDcsMzAuNDY5czEyLjc5NywxNi42NjYsMjIuMDk4LDIyLjA5OHMxOS40NTcsOC4xNDgsMzAuNDY5LDguMTQ4czIxLjE2OC0yLjcxNywzMC40NjktOC4xNDggczE2LjY2Ni0xMi43OTcsMjIuMDk4LTIyLjA5OFMxNDYuNDI5LDk2LjcyNiwxNDYuNDI5LDg1LjcxNHogTTE3MS40MjksODUuNzE0YzAsMTUuNTUxLTMuODMyLDI5Ljg5My0xMS40OTYsNDMuMDI0IGMtNy42NjQsMTMuMTMzLTE4LjA2MiwyMy41My0zMS4xOTQsMzEuMTk0Yy0xMy4xMzIsNy42NjQtMjcuNDc0LDExLjQ5Ni00My4wMjQsMTEuNDk2cy0yOS44OTItMy44MzItNDMuMDI0LTExLjQ5NiBjLTEzLjEzMy03LjY2NC0yMy41MzEtMTguMDYyLTMxLjE5NC0zMS4xOTRDMy44MzIsMTE1LjYwNywwLDEwMS4yNjUsMCw4NS43MTRTMy44MzIsNTUuODIyLDExLjQ5Niw0Mi42OSBjNy42NjQtMTMuMTMzLDE4LjA2Mi0yMy41MzEsMzEuMTk0LTMxLjE5NEM1NS44MjIsMy44MzIsNzAuMTY0LDAsODUuNzE0LDBzMjkuODkzLDMuODMyLDQzLjAyNCwxMS40OTYgYzEzLjEzMyw3LjY2NCwyMy41MywxOC4wNjIsMzEuMTk0LDMxLjE5NEMxNjcuNTk3LDU1LjgyMiwxNzEuNDI5LDcwLjE2NCwxNzEuNDI5LDg1LjcxNHoiLz48L3N2Zz4=);\n}\n/*\n * based off of https://github.com/gitterHQ/sidecar\n * license: MIT\n */\n#wikiFrame {\n  width: 100%;\n  height: 100%;\n  top: 0;\n  bottom: 0;\n  position: absolute;\n  overflow: hidden;\n}\n.wiki-aside {\n  width: 500px;\n  z-index: 20000;\n  position: fixed;\n  top: 0;\n  bottom: 0;\n  right: 0;\n  display: -webkit-flex;\n  display: flex;\n  -webkit-flex-direction: row;\n  flex-direction: row;\n  background-color: #ffffff;\n  border-left: 1px solid #ddd;\n  box-shadow: -12px 0 18px 0 rgba(50, 50, 50, 0.1);\n  transition: transform 0.3s cubic-bezier(0.16, 0.22, 0.22, 1.7);\n  /* Add some \"extension\" so that there isn't a gap\n     * when we translate(via animation) more than 100% */\n}\n.wiki-aside.is-collapsed:not(.is-loading) {\n  -webkit-transform: translateX(110%);\n  transform: translateX(110%);\n}\n.wiki-aside:after {\n  content: '';\n  z-index: -1;\n  position: absolute;\n  top: 0;\n  left: 100%;\n  bottom: 0;\n  right: -100%;\n  background-color: #ffffff;\n}\n.wiki-aside iframe {\n  width: 100%;\n  height: 100%;\n  top: 0;\n  bottom: 0;\n  position: absolute;\n  overflow: hidden;\n}\n.wiki-aside .wiki-header {\n  display: none;\n}\n.wiki-aside .wiki-container {\n  padding-top: 10px;\n}\n.wiki-aside .wikiSelector {\n  top: 50px;\n}\n.wiki-aside-action-bar {\n  position: absolute;\n  top: 0;\n  right: 15px;\n  display: -webkit-flex;\n  display: flex;\n  justify-content: flex-end;\n  padding-bottom: 5px;\n  padding-right: 0px;\n  padding-top: 5px;\n  z-index: 100;\n}\n.wiki-fixed-header {\n  position: fixed;\n  background: white;\n  padding-top: 5px;\n  width: 100%;\n  z-index: 1;\n  left: 0;\n  top: 0;\n}\n@media (max-width: 720px) {\n  .wiki-fixed-header {\n    padding-top: 30px;\n  }\n}\n.wiki-fixed-header p {\n  margin: 5px 0 20px;\n}\n@media (max-width: 720px) {\n  .wiki-fixed-header p {\n    margin-bottom: 10px;\n  }\n}\n.wiki-fixed-header hr {\n  margin: 30px 0;\n}\n@media (max-width: 720px) {\n  .wiki-fixed-header hr {\n    margin: 25px 0;\n  }\n}\n.wiki-buttons {\n  margin-top: -10px;\n}\n.wiki-buttons button,\n.wiki-buttons .input-group {\n  width: 300px;\n}\n.wiki-buttons .input-group {\n  margin-top: 15px;\n  margin-left: auto;\n  margin-right: auto;\n}\n#wiki-filter {\n  background: #fff;\n  border-color: darkgreen;\n}\n.wiki-aside-action-item {\n  display: -webkit-flex;\n  display: flex;\n  /* main axis */\n  justify-content: center;\n  /* cross axis */\n  align-items: center;\n  width: 40px;\n  height: 40px;\n  padding-left: 0;\n  padding-right: 0;\n  opacity: 0.65;\n  background: none;\n  background-position: center center;\n  background-repeat: no-repeat;\n  background-size: 22px 22px;\n  border: 0;\n  outline: none;\n  cursor: pointer;\n  cursor: hand;\n  transition: all 0.2s ease;\n}\n.wiki-aside-action-item:hover,\n.wiki-aside-action-item:focus {\n  opacity: 1;\n}\n.wiki-aside-action-item:active {\n  filter: hue-rotate(80deg) saturate(150);\n}\n.wiki-aside-action-pop-out {\n  margin-right: -4px;\n  background-image: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMDAgMTcxLjQyOSIgZmlsbD0iIzNhMzEzMyI+PHBhdGggZD0iTTE1Ny4xNDMsMTAzLjU3MXYzNS43MTRjMCw4Ljg1NC0zLjE0NCwxNi40MjYtOS40MzEsMjIuNzEzcy0xMy44NTgsOS40MzEtMjIuNzEyLDkuNDMxSDMyLjE0MyBjLTguODU0LDAtMTYuNDI1LTMuMTQ0LTIyLjcxMi05LjQzMVMwLDE0OC4xNCwwLDEzOS4yODVWNDYuNDI5YzAtOC44NTQsMy4xNDQtMTYuNDI1LDkuNDMxLTIyLjcxMiBjNi4yODctNi4yODcsMTMuODU4LTkuNDMxLDIyLjcxMi05LjQzMWg3OC41NzJjMS4wNDEsMCwxLjg5NiwwLjMzNSwyLjU2NiwxLjAwNGMwLjY3LDAuNjcsMS4wMDQsMS41MjUsMS4wMDQsMi41NjdWMjUgYzAsMS4wNDItMC4zMzQsMS44OTctMS4wMDQsMi41NjdjLTAuNjcsMC42Ny0xLjUyNSwxLjAwNC0yLjU2NiwxLjAwNEgzMi4xNDNjLTQuOTExLDAtOS4xMTUsMS43NDktMTIuNjEyLDUuMjQ2IHMtNS4yNDYsNy43MDEtNS4yNDYsMTIuNjEydjkyLjg1NmMwLDQuOTExLDEuNzQ5LDkuMTE1LDUuMjQ2LDEyLjYxMnM3LjcwMSw1LjI0NSwxMi42MTIsNS4yNDVIMTI1YzQuOTEsMCw5LjExNS0xLjc0OCwxMi42MTEtNS4yNDUgYzMuNDk3LTMuNDk3LDUuMjQ2LTcuNzAxLDUuMjQ2LTEyLjYxMnYtMzUuNzE0YzAtMS4wNDIsMC4zMzQtMS44OTcsMS4wMDQtMi41NjdjMC42Ny0wLjY2OSwxLjUyNS0xLjAwNCwyLjU2Ny0xLjAwNGg3LjE0MyBjMS4wNDIsMCwxLjg5NywwLjMzNSwyLjU2NywxLjAwNEMxNTYuODA5LDEwMS42NzQsMTU3LjE0MywxMDIuNTI5LDE1Ny4xNDMsMTAzLjU3MXogTTIwMCw3LjE0M3Y1Ny4xNDMgYzAsMS45MzUtMC43MDcsMy42MDktMi4xMjEsNS4wMjJjLTEuNDEzLDEuNDE0LTMuMDg4LDIuMTIxLTUuMDIxLDIuMTIxYy0xLjkzNSwwLTMuNjA5LTAuNzA3LTUuMDIyLTIuMTIxbC0xOS42NDQtMTkuNjQzIGwtNzIuNzY3LDcyLjc2OWMtMC43NDQsMC43NDQtMS42LDEuMTE1LTIuNTY3LDEuMTE1cy0xLjgyMy0wLjM3MS0yLjU2Ny0xLjExNUw3Ny41NjcsMTA5LjcxYy0wLjc0NC0wLjc0NC0xLjExNi0xLjYtMS4xMTYtMi41NjcgYzAtMC45NjcsMC4zNzItMS44MjIsMS4xMTYtMi41NjZsNzIuNzY4LTcyLjc2OGwtMTkuNjQ0LTE5LjY0M2MtMS40MTMtMS40MTQtMi4xMi0zLjA4OC0yLjEyLTUuMDIyYzAtMS45MzUsMC43MDctMy42MDksMi4xMi01LjAyMiBDMTMyLjEwNSwwLjcwNywxMzMuNzc5LDAsMTM1LjcxNSwwaDU3LjE0M2MxLjkzNCwwLDMuNjA4LDAuNzA3LDUuMDIxLDIuMTIxQzE5OS4yOTMsMy41MzQsMjAwLDUuMjA4LDIwMCw3LjE0M3oiLz48L3N2Zz4=);\n}\n.wiki-aside-action-collapse {\n  background-image: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAxNzEuNDI5IDE3MS40MjkiIGZpbGw9IiMzYTMxMzMiPjxwYXRoIGQ9Ik0xMjIuNDMzLDEwNi4xMzhsLTE2LjI5NSwxNi4yOTVjLTAuNzQ0LDAuNzQ0LTEuNiwxLjExNi0yLjU2NiwxLjExNmMtMC45NjgsMC0xLjgyMy0wLjM3Mi0yLjU2Ny0xLjExNmwtMTUuMjktMTUuMjkgbC0xNS4yOSwxNS4yOWMtMC43NDQsMC43NDQtMS42LDEuMTE2LTIuNTY3LDEuMTE2cy0xLjgyMy0wLjM3Mi0yLjU2Ny0xLjExNmwtMTYuMjk0LTE2LjI5NWMtMC43NDQtMC43NDQtMS4xMTYtMS42LTEuMTE2LTIuNTY2IGMwLTAuOTY4LDAuMzcyLTEuODIzLDEuMTE2LTIuNTY3bDE1LjI5LTE1LjI5bC0xNS4yOS0xNS4yOWMtMC43NDQtMC43NDQtMS4xMTYtMS42LTEuMTE2LTIuNTY3czAuMzcyLTEuODIzLDEuMTE2LTIuNTY3IEw2NS4yOSw0OC45OTZjMC43NDQtMC43NDQsMS42LTEuMTE2LDIuNTY3LTEuMTE2czEuODIzLDAuMzcyLDIuNTY3LDEuMTE2bDE1LjI5LDE1LjI5bDE1LjI5LTE1LjI5IGMwLjc0NC0wLjc0NCwxLjYtMS4xMTYsMi41NjctMS4xMTZjMC45NjcsMCwxLjgyMiwwLjM3MiwyLjU2NiwxLjExNmwxNi4yOTUsMTYuMjk0YzAuNzQ0LDAuNzQ0LDEuMTE2LDEuNiwxLjExNiwyLjU2NyBzLTAuMzcyLDEuODIzLTEuMTE2LDIuNTY3bC0xNS4yOSwxNS4yOWwxNS4yOSwxNS4yOWMwLjc0NCwwLjc0NCwxLjExNiwxLjYsMS4xMTYsMi41NjcgQzEyMy41NDksMTA0LjUzOSwxMjMuMTc3LDEwNS4zOTQsMTIyLjQzMywxMDYuMTM4eiBNMTQ2LjQyOSw4NS43MTRjMC0xMS4wMTItMi43MTctMjEuMTY4LTguMTQ4LTMwLjQ2OSBzLTEyLjc5Ny0xNi42NjctMjIuMDk4LTIyLjA5OFM5Ni43MjYsMjUsODUuNzE0LDI1cy0yMS4xNjgsMi43MTYtMzAuNDY5LDguMTQ3UzM4LjU3OSw0NS45NDUsMzMuMTQ3LDU1LjI0NlMyNSw3NC43MDMsMjUsODUuNzE0IHMyLjcxNiwyMS4xNjgsOC4xNDcsMzAuNDY5czEyLjc5NywxNi42NjYsMjIuMDk4LDIyLjA5OHMxOS40NTcsOC4xNDgsMzAuNDY5LDguMTQ4czIxLjE2OC0yLjcxNywzMC40NjktOC4xNDggczE2LjY2Ni0xMi43OTcsMjIuMDk4LTIyLjA5OFMxNDYuNDI5LDk2LjcyNiwxNDYuNDI5LDg1LjcxNHogTTE3MS40MjksODUuNzE0YzAsMTUuNTUxLTMuODMyLDI5Ljg5My0xMS40OTYsNDMuMDI0IGMtNy42NjQsMTMuMTMzLTE4LjA2MiwyMy41My0zMS4xOTQsMzEuMTk0Yy0xMy4xMzIsNy42NjQtMjcuNDc0LDExLjQ5Ni00My4wMjQsMTEuNDk2cy0yOS44OTItMy44MzItNDMuMDI0LTExLjQ5NiBjLTEzLjEzMy03LjY2NC0yMy41MzEtMTguMDYyLTMxLjE5NC0zMS4xOTRDMy44MzIsMTE1LjYwNywwLDEwMS4yNjUsMCw4NS43MTRTMy44MzIsNTUuODIyLDExLjQ5Niw0Mi42OSBjNy42NjQtMTMuMTMzLDE4LjA2Mi0yMy41MzEsMzEuMTk0LTMxLjE5NEM1NS44MjIsMy44MzIsNzAuMTY0LDAsODUuNzE0LDBzMjkuODkzLDMuODMyLDQzLjAyNCwxMS40OTYgYzEzLjEzMyw3LjY2NCwyMy41MywxOC4wNjIsMzEuMTk0LDMxLjE5NEMxNjcuNTk3LDU1LjgyMiwxNzEuNDI5LDcwLjE2NCwxNzEuNDI5LDg1LjcxNHoiLz48L3N2Zz4=);\n}\n.github-login {\n  position: relative;\n  width: 300px;\n  margin-left: auto;\n  margin-right: auto;\n}\n.github-login .first {\n  position: relative;\n  height: 0;\n  top: -30px;\n  right: -180px;\n  color: red;\n}\n\n/*# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9hbmltYXRlLm1pbi5sZXNzIiwibGliL2Jvb3RzdHJhcC9ub3JtYWxpemUubGVzcyIsImxpYi9ib290c3RyYXAvcHJpbnQubGVzcyIsImxpYi9ib290c3RyYXAvZ2x5cGhpY29ucy5sZXNzIiwibGliL2Jvb3RzdHJhcC9zY2FmZm9sZGluZy5sZXNzIiwibGliL2Jvb3RzdHJhcC9taXhpbnMvdmVuZG9yLXByZWZpeGVzLmxlc3MiLCJsaWIvYm9vdHN0cmFwL3ZhcmlhYmxlcy5sZXNzIiwibGliL2Jvb3RzdHJhcC9taXhpbnMvdGFiLWZvY3VzLmxlc3MiLCJsaWIvYm9vdHN0cmFwL3RodW1ibmFpbHMubGVzcyIsImxpYi9ib290c3RyYXAvY2Fyb3VzZWwubGVzcyIsImxpYi9ib290c3RyYXAvbWl4aW5zL2ltYWdlLmxlc3MiLCJsaWIvYm9vdHN0cmFwL3R5cGUubGVzcyIsImxpYi9ib290c3RyYXAvbWl4aW5zL3RleHQtZW1waGFzaXMubGVzcyIsImxpYi9ib290c3RyYXAvbWl4aW5zL2JhY2tncm91bmQtdmFyaWFudC5sZXNzIiwibGliL2Jvb3RzdHJhcC9taXhpbnMvdGV4dC1vdmVyZmxvdy5sZXNzIiwibGliL2Jvb3RzdHJhcC9jb2RlLmxlc3MiLCJsaWIvYm9vdHN0cmFwL2dyaWQubGVzcyIsImxpYi9ib290c3RyYXAvbWl4aW5zL2dyaWQubGVzcyIsImxpYi9ib290c3RyYXAvbWl4aW5zL2dyaWQtZnJhbWV3b3JrLmxlc3MiLCJsaWIvYm9vdHN0cmFwL3RhYmxlcy5sZXNzIiwibGliL2Jvb3RzdHJhcC9taXhpbnMvdGFibGUtcm93Lmxlc3MiLCJsaWIvYm9vdHN0cmFwL2Zvcm1zLmxlc3MiLCJsaWIvYm9vdHN0cmFwL21peGlucy9mb3Jtcy5sZXNzIiwibGliL2Jvb3RzdHJhcC9idXR0b25zLmxlc3MiLCJsaWIvYm9vdHN0cmFwL21peGlucy9idXR0b25zLmxlc3MiLCJ0b2FzdHIubGVzcyIsImxpYi9ib290c3RyYXAvYnV0dG9uLWdyb3Vwcy5sZXNzIiwibGliL2Jvb3RzdHJhcC9jb21wb25lbnQtYW5pbWF0aW9ucy5sZXNzIiwibGliL2Jvb3RzdHJhcC9kcm9wZG93bnMubGVzcyIsImxpYi9ib290c3RyYXAvbWl4aW5zL25hdi1kaXZpZGVyLmxlc3MiLCJsaWIvYm9vdHN0cmFwL21peGlucy9yZXNldC1maWx0ZXIubGVzcyIsImxpYi9ib290c3RyYXAvbWl4aW5zL2JvcmRlci1yYWRpdXMubGVzcyIsImxpYi9ib290c3RyYXAvaW5wdXQtZ3JvdXBzLmxlc3MiLCJsaWIvYm9vdHN0cmFwL25hdnMubGVzcyIsImxpYi9ib290c3RyYXAvbmF2YmFyLmxlc3MiLCJsaWIvYm9vdHN0cmFwL21peGlucy9uYXYtdmVydGljYWwtYWxpZ24ubGVzcyIsImxpYi9ib290c3RyYXAvdXRpbGl0aWVzLmxlc3MiLCJsaWIvYm9vdHN0cmFwL2JyZWFkY3J1bWJzLmxlc3MiLCJsaWIvYm9vdHN0cmFwL3BhZ2luYXRpb24ubGVzcyIsImxpYi9ib290c3RyYXAvbWl4aW5zL3BhZ2luYXRpb24ubGVzcyIsImxpYi9ib290c3RyYXAvcGFnZXIubGVzcyIsImxpYi9ib290c3RyYXAvbGFiZWxzLmxlc3MiLCJsaWIvYm9vdHN0cmFwL21peGlucy9sYWJlbHMubGVzcyIsImxpYi9ib290c3RyYXAvYmFkZ2VzLmxlc3MiLCJsaWIvYm9vdHN0cmFwL2p1bWJvdHJvbi5sZXNzIiwibGliL2Jvb3RzdHJhcC9hbGVydHMubGVzcyIsImxpYi9ib290c3RyYXAvbWl4aW5zL2FsZXJ0cy5sZXNzIiwibGliL2Jvb3RzdHJhcC9wcm9ncmVzcy1iYXJzLmxlc3MiLCJsaWIvYm9vdHN0cmFwL21peGlucy9ncmFkaWVudHMubGVzcyIsImxpYi9ib290c3RyYXAvbWl4aW5zL3Byb2dyZXNzLWJhci5sZXNzIiwibGliL2Jvb3RzdHJhcC9tZWRpYS5sZXNzIiwibGliL2Jvb3RzdHJhcC9saXN0LWdyb3VwLmxlc3MiLCJsaWIvYm9vdHN0cmFwL21peGlucy9saXN0LWdyb3VwLmxlc3MiLCJsaWIvYm9vdHN0cmFwL3BhbmVscy5sZXNzIiwibGliL2Jvb3RzdHJhcC9taXhpbnMvcGFuZWxzLmxlc3MiLCJsaWIvYm9vdHN0cmFwL3Jlc3BvbnNpdmUtZW1iZWQubGVzcyIsImxpYi9ib290c3RyYXAvd2VsbHMubGVzcyIsImxpYi9ib290c3RyYXAvY2xvc2UubGVzcyIsImxpYi9ib290c3RyYXAvbW9kYWxzLmxlc3MiLCJsaWIvYm9vdHN0cmFwL3Rvb2x0aXAubGVzcyIsImxpYi9ib290c3RyYXAvcG9wb3ZlcnMubGVzcyIsImxpYi9ib290c3RyYXAvbWl4aW5zL2NsZWFyZml4Lmxlc3MiLCJsaWIvYm9vdHN0cmFwL21peGlucy9jZW50ZXItYmxvY2subGVzcyIsImxpYi9ib290c3RyYXAvbWl4aW5zL2hpZGUtdGV4dC5sZXNzIiwibGliL2Jvb3RzdHJhcC9yZXNwb25zaXZlLXV0aWxpdGllcy5sZXNzIiwibGliL2Jvb3RzdHJhcC9taXhpbnMvcmVzcG9uc2l2ZS12aXNpYmlsaXR5Lmxlc3MiLCJsaWIvYm9vdHN0cmFwLXNvY2lhbC9ib290c3RyYXAtc29jaWFsLmxlc3MiLCJtYWluLmxlc3MiLCJsaWIvaW9uaWNvbnMvX2lvbmljb25zLWZvbnQubGVzcyIsImxpYi9pb25pY29ucy9faW9uaWNvbnMtdmFyaWFibGVzLmxlc3MiLCJsaWIvaW9uaWNvbnMvX2lvbmljb25zLWFuaW1hdGlvbi5sZXNzIiwibGliL2lvbmljb25zL19pb25pY29ucy1pY29ucy5sZXNzIiwiY2hhdC5sZXNzIiwiam9icy5sZXNzIiwiY2hhbGxlbmdlLmxlc3MiLCJtYXAubGVzcyIsIndpa2kubGVzcyIsInNpZ25pbi5sZXNzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFNBQVM7O0FDUVQ7RUFDRSx1QkFBQTtFQUNBLDBCQUFBO0VBQ0EsOEJBQUE7O0FBT0Y7RUFDRSxTQUFBOztBQWFGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBQ0UsY0FBQTs7QUFR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QVUsU0FBUyxPQUFUOztBQUNYLHFCQUFDO0VBQVUsU0FBUyxPQUFUOztBQUNYLG9CQUFDO0VBQVUsU0FBUyxPQUFUOztBQUNYLHNCQUFDO0VBQVUsU0FBUyxPQUFUOztBQUNYLHVCQUFDO0VBQVUsU0FBUyxPQUFUOztBQUNYLDJCQUFDO0VBQVUsU0FBUyxPQUFUOztBQUNYLGVBQUM7RUFBVSxTQUFTLE9BQVQ7O0FBQ1gsZUFBQztFQUFVLFNBQVMsT0FBVDs7QUFDWCxlQUFDO0VBQVUsU0FBUyxPQUFUOztBQUNYLG1CQUFDO0VBQVUsU0FBUyxPQUFUOztBQUNYLG9CQUFDO0VBQVUsU0FBUyxPQUFUOztBQUNYLHVCQUFDO0VBQVUsU0FBUyxPQUFUOztBQUNYLGdCQUFDO0VBQVUsU0FBUyxPQUFUOztBQUNYLG1CQUFDO0VBQVUsU0FBUyxPQUFUOztBQUNYLGlCQUFDO0VBQVUsU0FBUyxPQUFUOztBQUNYLGtCQUFDO0VBQVUsU0FBUyxPQUFUOztBQUNYLGlCQUFDO0VBQVUsU0FBUyxPQUFUOztBQUNYLHFCQUFDO0VBQVUsU0FBUyxPQUFUOztBQUNYLHVCQUFDO0VBQVUsU0FBUyxPQUFUOztBQUNYLGtCQUFDO0VBQVUsU0FBUyxPQUFUOztBQUNYLHdCQUFDO0VBQVUsU0FBUyxPQUFUOztBQUNYLHVCQUFDO0VBQVUsU0FBUyxPQUFUOztBQUNYLHNCQUFDO0VBQVUsU0FBUyxPQUFUOztBQUNYLDBCQUFDO0VBQVUsU0FBUyxPQUFUOztBQUNYLDRCQUFDO0VBQVUsU0FBUyxPQUFUOztBQUNYLGNBQUM7RUFBVSxTQUFTLE9BQVQ7O0FBQ1gsbUJBQUM7RUFBVSxTQUFTLE9BQVQ7O0FBQ1gsZUFBQztFQUFVLFNBQVMsT0FBVDs7QUFDWCxzQkFBQztFQUFVLFNBQVMsT0FBVDs7QUFDWCxvQkFBQztFQUFVLFNBQVMsT0FBVDs7QUFDWCxzQkFBQztFQUFVLFNBQVMsT0FBVDs7QUFDWCxxQkFBQztFQUFVLFNBQVMsT0FBVDs7QUFDWCxvQkFBQztFQUFVLFNBQVMsT0FBVDs7QUFDWCxrQkFBQztFQUFVLFNBQVMsT0FBVDs7QUFDWCxvQkFBQztFQUFVLFNBQVMsT0FBVDs7QUFDWCw2QkFBQztFQUFVLFNBQVMsT0FBVDs7QUFDWCw0QkFBQztFQUFVLFNBQVMsT0FBVDs7QUFDWCwwQkFBQztFQUFVLFNBQVMsT0FBVDs7QUFDWCw0QkFBQztFQUFVLFNBQVMsT0FBVDs7QUFDWCxnQkFBQztFQUFVLFNBQVMsT0FBVDs7QUFDWCxpQkFBQztFQUFVLFNBQVMsT0FBVDs7QUFDWCxnQkFBQztFQUFVLFNBQVMsT0FBVDs7QUFDWCxpQkFBQztFQUFVLFNBQVMsT0FBVDs7QUFDWCxvQkFBQztFQUFVLFNBQVMsT0FBVDs7QUFDWCxxQkFBQztFQUFVLFNBQVMsT0FBVDs7QUFDWCxvQkFBQztFQUFVLFNBQVMsT0FBVDs7QUFDWCxvQkFBQztFQUFVLFNBQVMsT0FBVDs7QUFDWCxzQkFBQztFQUFVLFNBQVMsT0FBVDs7QUFDWCxlQUFDO0VBQVUsU0FBUyxPQUFUOztBQUNYLGdCQUFDO0VBQVUsU0FBUyxPQUFUOztBQUNYLGtCQUFDO0VBQVUsU0FBUyxPQUFUOztBQUNYLGNBQUM7RUFBVSxTQUFTLE9BQVQ7O0FBQ1gsY0FBQztFQUFVLFNBQVMsT0FBVDs7QUFDWCxlQUFDO0VBQVUsU0FBUyxPQUFUOztBQUNYLDJCQUFDO0VBQVUsU0FBUyxPQUFUOztBQUNYLCtCQUFDO0VBQVUsU0FBUyxPQUFUOztBQUNYLHdCQUFDO0VBQVUsU0FBUyxPQUFUOztBQUNYLDRCQUFDO0VBQVUsU0FBUyxPQUFUOztBQUNYLDZCQUFDO0VBQVUsU0FBUyxPQUFUOztBQUNYLGlDQUFDO0VBQVUsU0FBUyxPQUFUOztBQUNYLG9CQUFDO0VBQVUsU0FBUyxPQUFUOztBQUNYLGlCQUFDO0VBQVUsU0FBUyxPQUFUOztBQUNYLHdCQUFDO0VBQVUsU0FBUyxPQUFUOztBQUNYLHNCQUFDO0VBQVUsU0FBUyxPQUFUOztBQUNYLGlCQUFDO0VBQVUsU0FBUyxPQUFUOztBQUNYLGdCQUFDO0VBQVUsU0FBUyxPQUFUOztBQUNYLGtCQUFDO0VBQVUsU0FBUyxPQUFUOztBQUNYLHFCQUFDO0VBQVUsU0FBUyxPQUFUOztBQUNYLGlCQUFDO0VBQVUsU0FBUyxPQUFUOztBQUNYLGVBQUM7RUFBVSxTQUFTLE9BQVQ7O0FBQ1gsZUFBQztFQUFVLFNBQVMsT0FBVDs7QUFDWCxnQkFBQztFQUFVLFNBQVMsT0FBVDs7QUFDWCxpQkFBQztFQUFVLFNBQVMsT0FBVDs7QUFDWCxpQkFBQztFQUFVLFNBQVMsT0FBVDs7QUFDWCxlQUFDO0VBQVUsU0FBUyxPQUFUOztBQUNYLHNCQUFDO0VBQVUsU0FBUyxPQUFUOztBQUNYLHVCQUFDO0VBQVUsU0FBUyxPQUFUOztBQUNYLHdCQUFDO0VBQVUsU0FBUyxPQUFUOztBQUNYLHNCQUFDO0VBQVUsU0FBUyxPQUFUOztBQUNYLHNCQUFDO0VBQVUsU0FBUyxPQUFUOztBQUNYLHNCQUFDO0VBQVUsU0FBUyxPQUFUOztBQUNYLG1CQUFDO0VBQVUsU0FBUyxPQUFUOztBQUNYLGtCQUFDO0VBQVUsU0FBUyxPQUFUOztBQUNYLGlCQUFDO0VBQVUsU0FBUyxPQUFUOztBQUNYLHFCQUFDO0VBQVUsU0FBUyxPQUFUOztBQUNYLG1CQUFDO0VBQVUsU0FBUyxPQUFUOztBQUNYLG9CQUFDO0VBQVUsU0FBUyxPQUFUOztBQUNYLGdCQUFDO0VBQVUsU0FBUyxPQUFUOztBQUNYLGdCQUFDO0VBQVUsU0FBUyxPQUFUOztBQUNYLG1CQUFDO0VBQVUsU0FBUyxPQUFUOztBQUNYLG1CQUFDO0VBQVUsU0FBUyxPQUFUOztBQUNYLG9CQUFDO0VBQVUsU0FBUyxPQUFUOztBQUNYLHVCQUFDO0VBQVUsU0FBUyxPQUFUOztBQUNYLHNCQUFDO0VBQVUsU0FBUyxPQUFUOztBQUNYLG9CQUFDO0VBQVUsU0FBUyxPQUFUOztBQUNYLG9CQUFDO0VBQVUsU0FBUyxPQUFUOztBQUNYLG9CQUFDO0VBQVUsU0FBUyxPQUFUOztBQUNYLHlCQUFDO0VBQVUsU0FBUyxPQUFUOztBQUNYLDRCQUFDO0VBQVUsU0FBUyxPQUFUOztBQUNYLHlCQUFDO0VBQVUsU0FBUyxPQUFUOztBQUNYLHVCQUFDO0VBQVUsU0FBUyxPQUFUOztBQUNYLHVCQUFDO0VBQVUsU0FBUyxPQUFUOztBQUNYLHlCQUFDO0VBQVUsU0FBUyxPQUFUOztBQy9OL0M7RUNnRUUsOEJBQUE7RUFDRywyQkFBQTtFQUNLLHNCQUFBOztBRC9EVixDQUFDO0FBQ0QsQ0FBQztFQzREQyw4QkFBQTtFQUNHLDJCQUFBO0VBQ0ssc0JBQUE7O0FEdkRWO0VBQ0UsZUFBQTtFQUNBLDZDQUFBOztBQUdGO0VBQ0UsYUVpQndCLDhDRmpCeEI7RUFDQSxlQUFBO0VBQ0EsdUJBQUE7RUFDQSxjQUFBO0VBQ0EseUJBQUE7O0FBSUY7QUFDQTtBQUNBO0FBQ0E7RUFDRSxvQkFBQTtFQUNBLGtCQUFBO0VBQ0Esb0JBQUE7O0FBTUY7RUFDRSxjQUFBO0VBQ0EscUJBQUE7O0FBRUEsQ0FBQztBQUNELENBQUM7RUFDQyxjQUFBO0VBQ0EsMEJBQUE7O0FBR0YsQ0FBQztFR3JERCxvQkFBQTtFQUVBLDBDQUFBO0VBQ0Esb0JBQUE7O0FINkRGO0VBQ0UsU0FBQTs7QUFNRjtFQUNFLHNCQUFBOztBQUlGO0FJMUVBLFVBVUU7QUFWRixVQVdFLEVBQUU7QUNQSixlQUtFLFFBTUU7QUFYSixlQUtFLFFBT0UsSUFBSTtFQ2JOLGNBQUE7RUFDQSxlQUFBO0VBQ0EsWUFBQTs7QU4wRUY7RUFDRSxrQkFBQTs7QUFNRjtFQUNFLFlBQUE7RUFDQSx1QkFBQTtFQUNBLHlCQUFBO0VBQ0Esc0JBQUE7RUFDQSxrQkFBQTtFQzZGQSx3Q0FBQTtFQUNLLG1DQUFBO0VBQ0csZ0NBQUE7RUt2TFIscUJBQUE7RUFDQSxlQUFBO0VBQ0EsWUFBQTs7QU44RkY7RUFDRSxrQkFBQTs7QUFNRjtFQUNFLGdCQUFBO0VBQ0EsbUJBQUE7RUFDQSxTQUFBO0VBQ0EsNkJBQUE7O0FBUUY7RUFDRSxrQkFBQTtFQUNBLFVBQUE7RUFDQSxXQUFBO0VBQ0EsWUFBQTtFQUNBLFVBQUE7RUFDQSxnQkFBQTtFQUNBLE1BQU0sZ0JBQU47RUFDQSxTQUFBOztBQVFBLGtCQUFDO0FBQ0Qsa0JBQUM7RUFDQyxnQkFBQTtFQUNBLFdBQUE7RUFDQSxZQUFBO0VBQ0EsU0FBQTtFQUNBLGlCQUFBO0VBQ0EsVUFBQTs7QU8zSUo7QUFBSTtBQUFJO0FBQUk7QUFBSTtBQUFJO0FBQ3BCO0FBQUs7QUFBSztBQUFLO0FBQUs7QUFBSztFQUN2QixvQkFBQTtFQUNBLGdCQUFBO0VBQ0EsZ0JBQUE7RUFDQSxjQUFBOztBQUxGLEVBT0U7QUFQRSxFQU9GO0FBUE0sRUFPTjtBQVBVLEVBT1Y7QUFQYyxFQU9kO0FBUGtCLEVBT2xCO0FBTkYsR0FNRTtBQU5HLEdBTUg7QUFOUSxHQU1SO0FBTmEsR0FNYjtBQU5rQixHQU1sQjtBQU51QixHQU12QjtBQVBGLEVBUUU7QUFSRSxFQVFGO0FBUk0sRUFRTjtBQVJVLEVBUVY7QUFSYyxFQVFkO0FBUmtCLEVBUWxCO0FBUEYsR0FPRTtBQVBHLEdBT0g7QUFQUSxHQU9SO0FBUGEsR0FPYjtBQVBrQixHQU9sQjtBQVB1QixHQU92QjtFQUNFLG1CQUFBO0VBQ0EsY0FBQTtFQUNBLGNBQUE7O0FBSUo7QUFBSTtBQUNKO0FBQUk7QUFDSjtBQUFJO0VBQ0YsZ0JBQUE7RUFDQSxtQkFBQTs7QUFKRixFQU1FO0FBTkUsR0FNRjtBQUxGLEVBS0U7QUFMRSxHQUtGO0FBSkYsRUFJRTtBQUpFLEdBSUY7QUFORixFQU9FO0FBUEUsR0FPRjtBQU5GLEVBTUU7QUFORSxHQU1GO0FBTEYsRUFLRTtBQUxFLEdBS0Y7RUFDRSxjQUFBOztBQUdKO0FBQUk7QUFDSjtBQUFJO0FBQ0o7QUFBSTtFQUNGLGdCQUFBO0VBQ0EsbUJBQUE7O0FBSkYsRUFNRTtBQU5FLEdBTUY7QUFMRixFQUtFO0FBTEUsR0FLRjtBQUpGLEVBSUU7QUFKRSxHQUlGO0FBTkYsRUFPRTtBQVBFLEdBT0Y7QUFORixFQU1FO0FBTkUsR0FNRjtBQUxGLEVBS0U7QUFMRSxHQUtGO0VBQ0UsY0FBQTs7QUFJSjtBQUFJO0VBQU0sZUFBQTs7QUFDVjtBQUFJO0VBQU0sZUFBQTs7QUFDVjtBQUFJO0VBQU0sZUFBQTs7QUFDVjtBQUFJO0VBQU0sZUFBQTs7QUFDVjtBQUFJO0VBQU0sZUFBQTs7QUFDVjtBQUFJO0VBQU0sZUFBQTs7QUFNVjtFQUNFLGdCQUFBOztBQUdGO0VBQ0UsbUJBQUE7RUFDQSxlQUFBO0VBQ0EsZ0JBQUE7RUFDQSxnQkFBQTs7QUFFQSxRQUFtQztFQTJPckM7SUExT0ksZUFBQTs7O0FBU0o7QUFDQTtFQUNFLGNBQUE7O0FBR0Y7QUFDQTtFQUNFLHlCQUFBO0VBQ0EsYUFBQTs7QUFJRjtFQUF1QixnQkFBQTs7QUFDdkI7RUFBdUIsaUJBQUE7O0FBQ3ZCO0VBQXVCLGtCQUFBOztBQUN2QjtFQUF1QixtQkFBQTs7QUFDdkI7RUFBdUIsbUJBQUE7O0FBR3ZCO0VBQXVCLHlCQUFBOztBQUN2QjtFQUF1Qix5QkFBQTs7QUFDdkI7RUFBdUIsMEJBQUE7O0FBR3ZCO0VBQ0UsY0FBQTs7QUFFRjtFQ3JHRSxjQUFBOztBQUNBLENBQUMsYUFBQztFQUNBLGNBQUE7O0FEc0dKO0VDeEdFLGNBQUE7O0FBQ0EsQ0FBQyxhQUFDO0VBQ0EsY0FBQTs7QUR5R0o7RUMzR0UsY0FBQTs7QUFDQSxDQUFDLFVBQUM7RUFDQSxjQUFBOztBRDRHSjtFQzlHRSxjQUFBOztBQUNBLENBQUMsYUFBQztFQUNBLGNBQUE7O0FEK0dKO0VDakhFLGNBQUE7O0FBQ0EsQ0FBQyxZQUFDO0VBQ0EsY0FBQTs7QURzSEo7RUFHRSxXQUFBO0VFM0hBLHlCQUFBOztBQUNBLENBQUMsV0FBQztFQUNBLHlCQUFBOztBRjRISjtFRTlIRSx5QkFBQTs7QUFDQSxDQUFDLFdBQUM7RUFDQSx5QkFBQTs7QUYrSEo7RUVqSUUseUJBQUE7O0FBQ0EsQ0FBQyxRQUFDO0VBQ0EseUJBQUE7O0FGa0lKO0VFcElFLHlCQUFBOztBQUNBLENBQUMsV0FBQztFQUNBLHlCQUFBOztBRnFJSjtFRXZJRSx5QkFBQTs7QUFDQSxDQUFDLFVBQUM7RUFDQSx5QkFBQTs7QUY2SUo7RUFDRSxtQkFBQTtFQUNBLG1CQUFBO0VBQ0EsZ0NBQUE7O0FBUUY7QUFDQTtFQUNFLGFBQUE7RUFDQSxtQkFBQTs7QUFIRixFQUlFO0FBSEYsRUFHRTtBQUpGLEVBS0U7QUFKRixFQUlFO0VBQ0UsZ0JBQUE7O0FBT0o7RUFDRSxlQUFBO0VBQ0EsZ0JBQUE7O0FBSUY7RUFMRSxlQUFBO0VBQ0EsZ0JBQUE7RUFNQSxpQkFBQTs7QUFGRixZQUlFO0VBQ0UscUJBQUE7RUFDQSxpQkFBQTtFQUNBLGtCQUFBOztBQUtKO0VBQ0UsYUFBQTtFQUNBLG1CQUFBOztBQUVGO0FBQ0E7RUFDRSx1QkFBQTs7QUFFRjtFQUNFLGlCQUFBOztBQUVGO0VBQ0UsY0FBQTs7QUFhQSxRQUEyQztFQXlGN0MsY0F4Rkk7SUFDRSxXQUFBO0lBQ0EsWUFBQTtJQUNBLFdBQUE7SUFDQSxpQkFBQTtJR3ROSixnQkFBQTtJQUNBLHVCQUFBO0lBQ0EsbUJBQUE7O0VId1NGLGNBakZJO0lBQ0Usa0JBQUE7OztBQVVOLElBQUk7QUFFSixJQUFJO0VBQ0YsWUFBQTtFQUNBLGlDQUFBOztBQUVGO0VBQ0UsY0FBQTtFQUNBLHlCQUFBOztBQUlGO0VBQ0Usa0JBQUE7RUFDQSxnQkFBQTtFQUNBLGlCQUFBO0VBQ0EsOEJBQUE7O0FBS0UsVUFIRixFQUdHO0FBQUQsVUFGRixHQUVHO0FBQUQsVUFERixHQUNHO0VBQ0MsZ0JBQUE7O0FBVk4sVUFnQkU7QUFoQkYsVUFpQkU7QUFqQkYsVUFrQkU7RUFDRSxjQUFBO0VBQ0EsY0FBQTtFQUNBLHVCQUFBO0VBQ0EsY0FBQTs7QUFFQSxVQVJGLE9BUUc7QUFBRCxVQVBGLE1BT0c7QUFBRCxVQU5GLE9BTUc7RUFDQyxTQUFTLGFBQVQ7O0FBUU47QUFDQSxVQUFVO0VBQ1IsbUJBQUE7RUFDQSxlQUFBO0VBQ0EsK0JBQUE7RUFDQSxjQUFBO0VBQ0EsaUJBQUE7O0FBTUUsbUJBSEYsT0FHRztBQUFELFVBWE0sV0FRUixPQUdHO0FBQUQsbUJBRkYsTUFFRztBQUFELFVBWE0sV0FTUixNQUVHO0FBQUQsbUJBREYsT0FDRztBQUFELFVBWE0sV0FVUixPQUNHO0VBQVUsU0FBUyxFQUFUOztBQUNYLG1CQUpGLE9BSUc7QUFBRCxVQVpNLFdBUVIsT0FJRztBQUFELG1CQUhGLE1BR0c7QUFBRCxVQVpNLFdBU1IsTUFHRztBQUFELG1CQUZGLE9BRUc7QUFBRCxVQVpNLFdBVVIsT0FFRztFQUNDLFNBQVMsYUFBVDs7QUFNTjtFQUNFLG1CQUFBO0VBQ0Esa0JBQUE7RUFDQSx1QkFBQTs7QUl0U0Y7QUFDQTtBQUNBO0FBQ0E7RUFDRSxzQ1RxQ2lELHdCU3JDakQ7O0FBSUY7RUFDRSxnQkFBQTtFQUNBLGNBQUE7RUFDQSxjQUFBO0VBQ0EseUJBQUE7RUFDQSxrQkFBQTs7QUFJRjtFQUNFLGdCQUFBO0VBQ0EsY0FBQTtFQUNBLGNBQUE7RUFDQSxzQkFBQTtFQUNBLGtCQUFBO0VBQ0EsOENBQUE7O0FBTkYsR0FRRTtFQUNFLFVBQUE7RUFDQSxlQUFBO0VBQ0EsaUJBQUE7RUFDQSxnQkFBQTs7QUFLSjtFQUNFLGNBQUE7RUFDQSxjQUFBO0VBQ0EsZ0JBQUE7RUFDQSxlQUFBO0VBQ0EsdUJBQUE7RUFDQSxxQkFBQTtFQUNBLHFCQUFBO0VBQ0EsY0FBQTtFQUNBLHlCQUFBO0VBQ0Esc0JBQUE7RUFDQSxrQkFBQTs7QUFYRixHQWNFO0VBQ0UsVUFBQTtFQUNBLGtCQUFBO0VBQ0EsY0FBQTtFQUNBLHFCQUFBO0VBQ0EsNkJBQUE7RUFDQSxnQkFBQTs7QUFLSjtFQUNFLGlCQUFBO0VBQ0Esa0JBQUE7O0FDMURGO0VDSEUsa0JBQUE7RUFDQSxpQkFBQTtFQUNBLGtCQUFBO0VBQ0EsbUJBQUE7O0FER0EsUUFBbUM7RUF3RXJDO0lBdkVJLFlBQUE7OztBQUVGLFFBQW1DO0VBcUVyQztJQXBFSSxZQUFBOzs7QUFFRixRQUFtQztFQWtFckM7SUFqRUksYUFBQTs7O0FBVUo7RUN2QkUsa0JBQUE7RUFDQSxpQkFBQTtFQUNBLGtCQUFBO0VBQ0EsbUJBQUE7O0FENkJGO0VDdkJFLGtCQUFBO0VBQ0EsbUJBQUE7O0FDQUU7RUFDRSxrQkFBQTtFQUVBLGVBQUE7RUFFQSxrQkFBQTtFQUNBLG1CQUFBOztBQWdCRjtFQUNFLFdBQUE7O0FBT0osS0FBSyxFQUFRLENBQUM7RUFDWixXQUFBOztBQURGLEtBQUssRUFBUSxDQUFDO0VBQ1osbUJBQUE7O0FBREYsS0FBSyxFQUFRLENBQUM7RUFDWixtQkFBQTs7QUFERixLQUFLLEVBQVEsQ0FBQztFQUNaLFVBQUE7O0FBREYsS0FBSyxFQUFRLENBQUM7RUFDWixtQkFBQTs7QUFERixLQUFLLEVBQVEsQ0FBQztFQUNaLG1CQUFBOztBQURGLEtBQUssRUFBUSxDQUFDO0VBQ1osVUFBQTs7QUFERixLQUFLLEVBQVEsQ0FBQztFQUNaLG1CQUFBOztBQURGLEtBQUssRUFBUSxDQUFDO0VBQ1osbUJBQUE7O0FBREYsS0FBSyxFQUFRLENBQUM7RUFDWixVQUFBOztBQURGLEtBQUssRUFBUSxDQUFDO0VBQ1osbUJBQUE7O0FBREYsS0FBSyxFQUFRLENBQUM7RUFDWixrQkFBQTs7QUFjRixLQUFLLEVBQVEsTUFBTTtFQUNqQixXQUFBOztBQURGLEtBQUssRUFBUSxNQUFNO0VBQ2pCLG1CQUFBOztBQURGLEtBQUssRUFBUSxNQUFNO0VBQ2pCLG1CQUFBOztBQURGLEtBQUssRUFBUSxNQUFNO0VBQ2pCLFVBQUE7O0FBREYsS0FBSyxFQUFRLE1BQU07RUFDakIsbUJBQUE7O0FBREYsS0FBSyxFQUFRLE1BQU07RUFDakIsbUJBQUE7O0FBREYsS0FBSyxFQUFRLE1BQU07RUFDakIsVUFBQTs7QUFERixLQUFLLEVBQVEsTUFBTTtFQUNqQixtQkFBQTs7QUFERixLQUFLLEVBQVEsTUFBTTtFQUNqQixtQkFBQTs7QUFERixLQUFLLEVBQVEsTUFBTTtFQUNqQixVQUFBOztBQURGLEtBQUssRUFBUSxNQUFNO0VBQ2pCLG1CQUFBOztBQURGLEtBQUssRUFBUSxNQUFNO0VBQ2pCLGtCQUFBOztBQUlGLEtBQUssRUFBUTtFQUNYLFdBQUE7O0FBaEJGLEtBQUssRUFBUSxNQUFNO0VBQ2pCLFVBQUE7O0FBREYsS0FBSyxFQUFRLE1BQU07RUFDakIsa0JBQUE7O0FBREYsS0FBSyxFQUFRLE1BQU07RUFDakIsa0JBQUE7O0FBREYsS0FBSyxFQUFRLE1BQU07RUFDakIsU0FBQTs7QUFERixLQUFLLEVBQVEsTUFBTTtFQUNqQixrQkFBQTs7QUFERixLQUFLLEVBQVEsTUFBTTtFQUNqQixrQkFBQTs7QUFERixLQUFLLEVBQVEsTUFBTTtFQUNqQixTQUFBOztBQURGLEtBQUssRUFBUSxNQUFNO0VBQ2pCLGtCQUFBOztBQURGLEtBQUssRUFBUSxNQUFNO0VBQ2pCLGtCQUFBOztBQURGLEtBQUssRUFBUSxNQUFNO0VBQ2pCLFNBQUE7O0FBREYsS0FBSyxFQUFRLE1BQU07RUFDakIsa0JBQUE7O0FBREYsS0FBSyxFQUFRLE1BQU07RUFDakIsaUJBQUE7O0FBSUYsS0FBSyxFQUFRO0VBQ1gsVUFBQTs7QUFjRixLQUFLLEVBQVEsUUFBUTtFQUNuQixpQkFBQTs7QUFERixLQUFLLEVBQVEsUUFBUTtFQUNuQix5QkFBQTs7QUFERixLQUFLLEVBQVEsUUFBUTtFQUNuQix5QkFBQTs7QUFERixLQUFLLEVBQVEsUUFBUTtFQUNuQixnQkFBQTs7QUFERixLQUFLLEVBQVEsUUFBUTtFQUNuQix5QkFBQTs7QUFERixLQUFLLEVBQVEsUUFBUTtFQUNuQix5QkFBQTs7QUFERixLQUFLLEVBQVEsUUFBUTtFQUNuQixnQkFBQTs7QUFERixLQUFLLEVBQVEsUUFBUTtFQUNuQix5QkFBQTs7QUFERixLQUFLLEVBQVEsUUFBUTtFQUNuQix5QkFBQTs7QUFERixLQUFLLEVBQVEsUUFBUTtFQUNuQixnQkFBQTs7QUFERixLQUFLLEVBQVEsUUFBUTtFQUNuQix5QkFBQTs7QUFERixLQUFLLEVBQVEsUUFBUTtFQUNuQix3QkFBQTs7QUFERixLQUFLLEVBQVEsUUFBUTtFQUNuQixlQUFBOztBRlRKLFFBQW1DO0VFekIvQjtJQUNFLFdBQUE7O0VBT0osS0FBSyxFQUFRLENBQUM7SUFDWixXQUFBOztFQURGLEtBQUssRUFBUSxDQUFDO0lBQ1osbUJBQUE7O0VBREYsS0FBSyxFQUFRLENBQUM7SUFDWixtQkFBQTs7RUFERixLQUFLLEVBQVEsQ0FBQztJQUNaLFVBQUE7O0VBREYsS0FBSyxFQUFRLENBQUM7SUFDWixtQkFBQTs7RUFERixLQUFLLEVBQVEsQ0FBQztJQUNaLG1CQUFBOztFQURGLEtBQUssRUFBUSxDQUFDO0lBQ1osVUFBQTs7RUFERixLQUFLLEVBQVEsQ0FBQztJQUNaLG1CQUFBOztFQURGLEtBQUssRUFBUSxDQUFDO0lBQ1osbUJBQUE7O0VBREYsS0FBSyxFQUFRLENBQUM7SUFDWixVQUFBOztFQURGLEtBQUssRUFBUSxDQUFDO0lBQ1osbUJBQUE7O0VBREYsS0FBSyxFQUFRLENBQUM7SUFDWixrQkFBQTs7RUFjRixLQUFLLEVBQVEsTUFBTTtJQUNqQixXQUFBOztFQURGLEtBQUssRUFBUSxNQUFNO0lBQ2pCLG1CQUFBOztFQURGLEtBQUssRUFBUSxNQUFNO0lBQ2pCLG1CQUFBOztFQURGLEtBQUssRUFBUSxNQUFNO0lBQ2pCLFVBQUE7O0VBREYsS0FBSyxFQUFRLE1BQU07SUFDakIsbUJBQUE7O0VBREYsS0FBSyxFQUFRLE1BQU07SUFDakIsbUJBQUE7O0VBREYsS0FBSyxFQUFRLE1BQU07SUFDakIsVUFBQTs7RUFERixLQUFLLEVBQVEsTUFBTTtJQUNqQixtQkFBQTs7RUFERixLQUFLLEVBQVEsTUFBTTtJQUNqQixtQkFBQTs7RUFERixLQUFLLEVBQVEsTUFBTTtJQUNqQixVQUFBOztFQURGLEtBQUssRUFBUSxNQUFNO0lBQ2pCLG1CQUFBOztFQURGLEtBQUssRUFBUSxNQUFNO0lBQ2pCLGtCQUFBOztFQUlGLEtBQUssRUFBUTtJQUNYLFdBQUE7O0VBaEJGLEtBQUssRUFBUSxNQUFNO0lBQ2pCLFVBQUE7O0VBREYsS0FBSyxFQUFRLE1BQU07SUFDakIsa0JBQUE7O0VBREYsS0FBSyxFQUFRLE1BQU07SUFDakIsa0JBQUE7O0VBREYsS0FBSyxFQUFRLE1BQU07SUFDakIsU0FBQTs7RUFERixLQUFLLEVBQVEsTUFBTTtJQUNqQixrQkFBQTs7RUFERixLQUFLLEVBQVEsTUFBTTtJQUNqQixrQkFBQTs7RUFERixLQUFLLEVBQVEsTUFBTTtJQUNqQixTQUFBOztFQURGLEtBQUssRUFBUSxNQUFNO0lBQ2pCLGtCQUFBOztFQURGLEtBQUssRUFBUSxNQUFNO0lBQ2pCLGtCQUFBOztFQURGLEtBQUssRUFBUSxNQUFNO0lBQ2pCLFNBQUE7O0VBREYsS0FBSyxFQUFRLE1BQU07SUFDakIsa0JBQUE7O0VBREYsS0FBSyxFQUFRLE1BQU07SUFDakIsaUJBQUE7O0VBSUYsS0FBSyxFQUFRO0lBQ1gsVUFBQTs7RUFjRixLQUFLLEVBQVEsUUFBUTtJQUNuQixpQkFBQTs7RUFERixLQUFLLEVBQVEsUUFBUTtJQUNuQix5QkFBQTs7RUFERixLQUFLLEVBQVEsUUFBUTtJQUNuQix5QkFBQTs7RUFERixLQUFLLEVBQVEsUUFBUTtJQUNuQixnQkFBQTs7RUFERixLQUFLLEVBQVEsUUFBUTtJQUNuQix5QkFBQTs7RUFERixLQUFLLEVBQVEsUUFBUTtJQUNuQix5QkFBQTs7RUFERixLQUFLLEVBQVEsUUFBUTtJQUNuQixnQkFBQTs7RUFERixLQUFLLEVBQVEsUUFBUTtJQUNuQix5QkFBQTs7RUFERixLQUFLLEVBQVEsUUFBUTtJQUNuQix5QkFBQTs7RUFERixLQUFLLEVBQVEsUUFBUTtJQUNuQixnQkFBQTs7RUFERixLQUFLLEVBQVEsUUFBUTtJQUNuQix5QkFBQTs7RUFERixLQUFLLEVBQVEsUUFBUTtJQUNuQix3QkFBQTs7RUFERixLQUFLLEVBQVEsUUFBUTtJQUNuQixlQUFBOzs7QUZBSixRQUFtQztFRWxDL0I7SUFDRSxXQUFBOztFQU9KLEtBQUssRUFBUSxDQUFDO0lBQ1osV0FBQTs7RUFERixLQUFLLEVBQVEsQ0FBQztJQUNaLG1CQUFBOztFQURGLEtBQUssRUFBUSxDQUFDO0lBQ1osbUJBQUE7O0VBREYsS0FBSyxFQUFRLENBQUM7SUFDWixVQUFBOztFQURGLEtBQUssRUFBUSxDQUFDO0lBQ1osbUJBQUE7O0VBREYsS0FBSyxFQUFRLENBQUM7SUFDWixtQkFBQTs7RUFERixLQUFLLEVBQVEsQ0FBQztJQUNaLFVBQUE7O0VBREYsS0FBSyxFQUFRLENBQUM7SUFDWixtQkFBQTs7RUFERixLQUFLLEVBQVEsQ0FBQztJQUNaLG1CQUFBOztFQURGLEtBQUssRUFBUSxDQUFDO0lBQ1osVUFBQTs7RUFERixLQUFLLEVBQVEsQ0FBQztJQUNaLG1CQUFBOztFQURGLEtBQUssRUFBUSxDQUFDO0lBQ1osa0JBQUE7O0VBY0YsS0FBSyxFQUFRLE1BQU07SUFDakIsV0FBQTs7RUFERixLQUFLLEVBQVEsTUFBTTtJQUNqQixtQkFBQTs7RUFERixLQUFLLEVBQVEsTUFBTTtJQUNqQixtQkFBQTs7RUFERixLQUFLLEVBQVEsTUFBTTtJQUNqQixVQUFBOztFQURGLEtBQUssRUFBUSxNQUFNO0lBQ2pCLG1CQUFBOztFQURGLEtBQUssRUFBUSxNQUFNO0lBQ2pCLG1CQUFBOztFQURGLEtBQUssRUFBUSxNQUFNO0lBQ2pCLFVBQUE7O0VBREYsS0FBSyxFQUFRLE1BQU07SUFDakIsbUJBQUE7O0VBREYsS0FBSyxFQUFRLE1BQU07SUFDakIsbUJBQUE7O0VBREYsS0FBSyxFQUFRLE1BQU07SUFDakIsVUFBQTs7RUFERixLQUFLLEVBQVEsTUFBTTtJQUNqQixtQkFBQTs7RUFERixLQUFLLEVBQVEsTUFBTTtJQUNqQixrQkFBQTs7RUFJRixLQUFLLEVBQVE7SUFDWCxXQUFBOztFQWhCRixLQUFLLEVBQVEsTUFBTTtJQUNqQixVQUFBOztFQURGLEtBQUssRUFBUSxNQUFNO0lBQ2pCLGtCQUFBOztFQURGLEtBQUssRUFBUSxNQUFNO0lBQ2pCLGtCQUFBOztFQURGLEtBQUssRUFBUSxNQUFNO0lBQ2pCLFNBQUE7O0VBREYsS0FBSyxFQUFRLE1BQU07SUFDakIsa0JBQUE7O0VBREYsS0FBSyxFQUFRLE1BQU07SUFDakIsa0JBQUE7O0VBREYsS0FBSyxFQUFRLE1BQU07SUFDakIsU0FBQTs7RUFERixLQUFLLEVBQVEsTUFBTTtJQUNqQixrQkFBQTs7RUFERixLQUFLLEVBQVEsTUFBTTtJQUNqQixrQkFBQTs7RUFERixLQUFLLEVBQVEsTUFBTTtJQUNqQixTQUFBOztFQURGLEtBQUssRUFBUSxNQUFNO0lBQ2pCLGtCQUFBOztFQURGLEtBQUssRUFBUSxNQUFNO0lBQ2pCLGlCQUFBOztFQUlGLEtB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QU07RUFBVSxTRnR0QmQsT0VzdEJjOztBQUNuQyxDQUFDLElBQWtCLElBQUk7RUFBVSxTRnR0QmQsT0VzdEJjOztBQUNqQyxDQUFDLElBQWtCLFNBQVM7RUFBVSxTRnR0QmQsT0VzdEJjOztBQUN0QyxDQUFDLElBQWtCLE9BQU87RUFBVSxTRnR0QmQsT0VzdEJjOztBQUNwQyxDQUFDLElBQWtCLE1BQU07RUFBVSxTRnR0QmQsT0VzdEJjOztBQUNuQyxDQUFDLElBQWtCLE1BQU07RUFBVSxTRnR0QmQsT0VzdEJjOztBQUNuQyxDQUFDLElBQWtCLE1BQU07RUFBVSxTRnR0QmQsT0VzdEJjOztBQUNuQyxDQUFDLElBQWtCLElBQUk7RUFBVSxTRnR0QmQsT0VzdEJjOztBQUNqQyxDQUFDLElBQWtCLE1BQU07RUFBVSxTRnR0QmQsT0VzdEJjOztBQUNuQyxDQUFDLElBQWtCLEtBQUs7RUFBVSxTRnR0QmQsT0VzdEJjOztBQUNsQyxDQUFDLElBQWtCLGFBQWE7RUFBVSxTRnR0QmQsT0VzdEJjOztBQUMxQyxDQUFDLElBQWtCLFNBQVM7RUFBVSxTRnR0QmQsT0VzdEJjOztBQUN0QyxDQUFDLElBQWtCLEtBQUs7RUFBVSxTRnR0QmQsT0VzdEJjOztBQUNsQyxDQUFDLElBQWtCLFlBQVk7RUFBVSxTRnR0QmQsT0VzdEJjOztBQUN6QyxDQUFDLElBQWtCLElBQUk7RUFBVSxTRnR0QmQsT0VzdEJjOztBQUNqQyxDQUFDLElBQWtCLFNBQVM7RUFBVSxTRnR0QmQsT0VzdEJjOztBQUN0QyxDQUFDLElBQWtCLFlBQVk7RUFBVSxTRnR0QmQsT0VzdEJjOztBQUN6QyxDQUFDLElBQWtCLElBQUk7RUFBVSxTRnR0QmQsT0VzdEJjOztBQUNqQyxDQUFDLElBQWtCLFFBQVE7RUFBVSxTRnR0QmQsT0VzdEJjOztBQUNyQyxDQUFDLElBQWtCLEtBQUs7RUFBVSxTRnR0QmQsT0VzdEJjOztBQUNsQyxDQUFDLElBQWtCLE1BQU07RUFBVSxTRnR0QmQsT0VzdEJjOztBQUNuQyxDQUFDLElBQWtCLFdBQVc7RUFBVSxTRnR0QmQsT0Vz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SUFBSTtFQUFVLFNGdHRCZCxPRXN0QmM7O0FBQ2pDLENBQUMsSUFBa0IsR0FBRztFQUFVLFNGdHRCZCxPRXN0QmM7O0FBQ2hDLENBQUMsSUFBa0IsR0FBRztFQUFVLFNGdHRCZCxPRXN0QmM7O0FBQ2hDLENBQUMsSUFBa0IsTUFBTTtFQUFVLFNGdHRCZCxPRXN0QmM7O0FBQ25DLENBQUMsSUFBa0IsS0FBSztFQUFVLFNGdHRCZCxPRXN0QmM7O0FBQ2xDLENBQUMsSUFBa0IsS0FBSztFQUFVLFNGdHRCZCxPRXN0QmM7O0FBQ2xDLENBQUMsSUFBa0IsS0FBSztFQUFVLFNGdHRCZCxPRXN0QmM7O0FBQ2xDLENBQUMsSUFBa0IsS0FBSztFQUFVLFNGdHRCZCxPRXN0QmM7O0FBQ2xDLENBQUMsSUFBa0IsS0FBSztFQUFVLFNGdHRCZCxPRXN0QmM7O0FBQ2xDLENBQUMsSUFBa0IsYUFBYTtFQUFVLFNGdHRCZCxPRXN0QmM7O0FBQzFDLENBQUMsSUFBa0IsV0FBVztFQUFVLFNGdHRCZCxPRXN0QmM7O0FBQ3hDLENBQUMsSUFBa0IsT0FBTztFQUFVLFNGdHRCZCxPRXN0QmM7O0FBQ3BDLENBQUMsSUFBa0IsT0FBTztFQUFVLFNGdHRCZCxPRXN0QmM7O0FBQ3BDLENBQUMsSUFBa0IsSUFBSTtFQUFVLFNGdHRCZCxPRXN0QmM7O0FBQ2pDLENBQUMsSUFBa0IsS0FBSztFQUFVLFNGdHRCZCxPRXN0QmM7O0FBQ2xDLENBQUMsSUFBa0IsVUFBVTtFQUFVLFNGdHRCZCxPRXN0QmM7O0FBQ3ZDLENBQUMsSUFBa0IsT0FBTztFQUFVLFNGdHRCZCxPRXN0QmM7O0FBQ3BDLENBQUMsSUFBa0IsYUFBYTtFQUFVLFNGdHRCZCxPRXN0QmM7O0FBQzFDLENBQUMsSUFBa0IsUUFBUTtFQUFVLFNGdHRCZCxPRXN0QmM7O0FBQ3JDLENBQUMsSUFBa0IsT0FBTztFQUFVLFNGdHRCZCxPRXN0QmM7O0FBQ3BDLENBQUMsSUFBa0IsVUFBVTtFQUFVLFNGdHRCZCxPRXN0QmM7O0FBQ3ZDLENBQUMsSUFBa0IsT0FBTztFQUFVLFNGdHRCZCxPRXN0QmM7O0FBQ3BDLENBQUMsSUFBa0IsTUFBTTtFQUFVLFNGdHRCZCxPRXN0QmM7O0FBQ25DLENBQUMsSUFBa0IsVUFBVTtFQUFVLFNGdHRCZCxPRXN0QmM7O0FBQ3ZDLENBQUMsSUFBa0IsV0FBVztFQUFVLFNGdHRCZCxPRXN0QmM7O0FBQ3hDLENBQUMsSUFBa0IsY0FBYztFQUFVLFNGdHRCZCxPRXN0QmM7O0FBQzNDLENBQUMsSUFBa0IsU0FBUztFQUFVLFNGdHRCZCxPRXN0QmM7O0FBQ3RDLENBQUMsSUFBa0IsS0FBSztFQUFVLFNGdHRCZCxPRXN0QmM7O0FBQ2xDLENBQUMsSUFBa0IsTUFBTTtFQUFVLFNGdHRCZCxPRXN0QmM7O0FBQ25DLENBQUMsSUFBa0IsVUFBVTtFQUFVLFNGdHRCZCxPRXN0QmM7O0FBQ3ZDLENBQUMsSUFBa0IsY0FBYztFQUFVLFNGdHRCZCxPRXN0QmM7O0FBQzNDLENBQUMsSUFBa0IsU0FBUztFQUFVLFNGdHRCZCxPRXN0QmM7O0FBQ3RDLENBQUMsSUFBa0IsR0FBRztFQUFVLFNGdHRCZCxPRXN0QmM7O0FBQ2hDLENBQUMsSUFBa0IsUUFBUTtFQUFVLFNGdHRCZCxPRXN0QmM7O0FBQ3JDLENBQUMsSUFBa0IsS0FBSztFQUFVLFNGdHRCZCxPRXN0QmM7O0FBQ2xDLENBQUMsSUFBa0IsS0FBSztFQUFVLFNGdHRCZCxPRXN0QmM7O0FBQ2xDLENBQUMsSUFBa0IsTUFBTTtFQUFVLFNGdHRCZCxPRXN0QmM7O0FBQ25DLENBQUMsSUFBa0IsSUFBSTtFQUFVLFNGdHRCZCxPRXN0QmM7O0FBQ2pDLENBQUMsSUFBa0IsV0FBVztFQUFVLFNGdHRCZCxPRXN0QmM7O0FBQ3hDLENBQUMsSUFBa0IsSUFBSTtFQUFVLFNGdHRCZCxPRXN0QmM7O0FBQ2pDLENBQUMsSUFBa0IsWUFBWTtFQUFVLFNGdHRCZCxPRXN0QmM7O0FBQ3pDLENBQUMsSUFBa0IsVUFBVTtFQUFVLFNGdHRCZCxPRXN0QmM7O0FBQ3ZDLENBQUMsSUFBa0IsTUFBTTtFQUFVLFNGdHRCZCxPRXN0QmM7O0FBQ25DLENBQUMsSUFBa0IsS0FBSztFQUFVLFNGdHRCZCxPRXN0QmM7O0FBQ2xDLENBQUMsSUFBa0IsS0FBSztFQUFVLFNGdHRCZCxPRXN0QmM7O0FBQ2xDLENBQUMsSUFBa0IsUUFBUTtFQUFVLFNGdHRCZCxPRXN0QmM7O0FBQ3JDLENBQUMsSUFBa0IsU0FBUztFQUFVLFNGdHRCZCxPRXN0QmM7O0FBQ3RDLENBQUMsSUFBa0IsT0FBTztFQUFVLFNGdHRCZCxPRXN0QmM7O0FBQ3BDLENBQUMsSUFBa0IsWUFBWTtFQUFVLFNGdHRCZCxPRXN0QmM7O0FBQ3pDLENBQUMsSUFBa0IsVUFBVTtFQUFVLFNGdHRCZCxPRXN0QmM7O0FBQ3ZDLENBQUMsSUFBa0IsS0FBSztFQUFVLFNGdHRCZCxPRXN0QmM7O0FBQ2xDLENBQUMsSUFBa0IsV0FBVztFQUFVLFNGdHRCZCxPRXN0QmM7O0FBQ3hDLENBQUMsSUFBa0IsTUFBTTtFQUFVLFNGdHRCZCxPRXN0QmM7O0FBQ25DLENBQUMsSUFBa0IsT0FBTztFQUFVLFNGdHRCZCxPRXN0QmM7O0FBQ3BDLENBQUMsSUFBa0IsS0FBSztFQUFVLFNGdHRCZCxPRXN0QmM7O0FBQ2xDLENBQUMsSUFBa0IsU0FBUztFQUFVLFNGdHRCZCxPRXN0QmM7O0FBQ3RDLENBQUMsSUFBa0IsUUFBUTtFQUFVLFNGdHRCZCxPRXN0QmM7O0FBQ3JDLENBQUMsSUFBa0IsUUFBUTtFQUFVLFNGdHRCZCxPRXN0QmM7O0FBQ3JDLENBQUMsSUFBa0IsR0FBRztFQUFVLFNGdHRCZCxPRXN0QmM7O0FBQ2hDLENBQUMsSUFBa0IsV0FBVztFQUFVLFNGdHRCZCxPRXN0QmM7O0FBQ3hDLENBQUMsSUFBa0IsUUFBUTtFQUFVLFNGdHRCZCxPRXN0QmM7O0FBQ3JDLENBQUMsSUFBa0IsTUFBTTtFQUFVLFNGdHRCZCxPRXN0QmM7O0FBQ25DLENBQUMsSUFBa0IsUUFBUTtFQUFVLFNGdHRCZCxPRXN0QmM7O0FBQ3JDLENBQUMsSUFBa0IsS0FBSztFQUFVLFNGdHRCZCxPRXN0QmM7O0FBQ2xDLENBQUMsSUFBa0IsT0FBTztFQUFVLFNG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Q0EsYUFBQTs7RUFFQSx1QkFBQTs7RUFFQSxtQkFBQTtFQUVBLFdBQUE7RUFDQSxZQUFBO0VBRUEsZUFBQTtFQUNBLGdCQUFBO0VBRUEsYUFBQTtFQUNBLGdCQUFBO0VBQ0Esa0NBQUE7RUFDQSw0QkFBQTtFQUNBLDBCQUFBO0VBQ0EsU0FBQTtFQUNBLGFBQUE7RUFFQSxlQUFBO0VBQ0EsWUFBQTtFQUVBLHlCQUFBOztBQUVBLHVCQUFDO0FBQ0QsdUJBQUM7RUFDQyxVQUFBOztBQUdGLHVCQUFDO0VBQ0MsUUFBUSxrQkFBa0IsYUFBMUI7O0FBSU47RUFDSSxrQkFBQTtFQUNBLHl5REFBQTs7QUFHSjtFQUNJLHFvRUFBQTs7QUNqTEo7RUFDQyxrQkFBQTtFQUNBLFlBQUE7RUFDQSxpQkFBQTtFQUNBLGtCQUFBOztBQUpELGFBS0M7RUFDQSxrQkFBQTtFQUNBLFNBQUE7RUFDQSxVQUFBO0VBQ0EsYUFBQTtFQUNBLFVBQUEiLCJzb3VyY2VzQ29udGVudCI6WyJAY2hhcnNldCBcIlVURi04XCI7LyohXG5BbmltYXRlLmNzcyAtIGh0dHA6Ly9kYW5lZGVuLm1lL2FuaW1hdGVcbkxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSAtIGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVRcblxuQ29weXJpZ2h0IChjKSAyMDE0IERhbmllbCBFZGVuXG4qLy5hbmltYXRlZHstd2Via2l0LWFuaW1hdGlvbi1kdXJhdGlvbjoxczthbmltYXRpb24tZHVyYXRpb246MXM7LXdlYmtpdC1hbmltYXRpb24tZmlsbC1tb2RlOmJvdGg7YW5pbWF0aW9uLWZpbGwtbW9kZTpib3RofS5hbmltYXRlZC5pbmZpbml0ZXstd2Via2l0LWFuaW1hdGlvbi1pdGVyYXRpb24tY291bnQ6aW5maW5pdGU7YW5pbWF0aW9uLWl0ZXJhdGlvbi1jb3VudDppbmZpbml0ZX0uYW5pbWF0ZWQuaGluZ2V7LXdlYmtpdC1hbmltYXRpb24tZHVyYXRpb246MnM7YW5pbWF0aW9uLWR1cmF0aW9uOjJzfUAtd2Via2l0LWtleWZyYW1lcyBib3VuY2V7MCUsMTAwJSwyMCUsNTMlLDgwJXstd2Via2l0LXRyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uOmN1YmljLWJlemllcigwLjIxNSwuNjEsLjM1NSwxKTt0cmFuc2l0aW9uLXRpbWluZy1mdW5jdGlvbjpjdWJpYy1iZXppZXIoMC4yMTUsLjYxLC4zNTUsMSk7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwwLDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLDAsMCl9NDAlLDQzJXstd2Via2l0LXRyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uOmN1YmljLWJlemllcigwLjc1NSwuMDUwLC44NTUsLjA2MCk7dHJhbnNpdGlvbi10aW1pbmctZnVuY3Rpb246Y3ViaWMtYmV6aWVyKDAuNzU1LC4wNTAsLjg1NSwuMDYwKTstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLC0zMHB4LDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLC0zMHB4LDApfTcwJXstd2Via2l0LXRyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uOmN1YmljLWJlemllcigwLjc1NSwuMDUwLC44NTUsLjA2MCk7dHJhbnNpdGlvbi10aW1pbmctZnVuY3Rpb246Y3ViaWMtYmV6aWVyKDAuNzU1LC4wNTAsLjg1NSwuMDYwKTstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLC0xNXB4LDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLC0xNXB4LDApfTkwJXstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLC00cHgsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsLTRweCwwKX19QGtleWZyYW1lcyBib3VuY2V7MCUsMTAwJSwyMCUsNTMlLDgwJXstd2Via2l0LXRyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uOmN1YmljLWJlemllcigwLjIxNSwuNjEsLjM1NSwxKTt0cmFuc2l0aW9uLXRpbWluZy1mdW5jdGlvbjpjdWJpYy1iZXppZXIoMC4yMTUsLjYxLC4zNTUsMSk7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwwLDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLDAsMCl9NDAlLDQzJXstd2Via2l0LXRyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uOmN1YmljLWJlemllcigwLjc1NSwuMDUwLC44NTUsLjA2MCk7dHJhbnNpdGlvbi10aW1pbmctZnVuY3Rpb246Y3ViaWMtYmV6aWVyKDAuNzU1LC4wNTAsLjg1NSwuMDYwKTstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLC0zMHB4LDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLC0zMHB4LDApfTcwJXstd2Via2l0LXRyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uOmN1YmljLWJlemllcigwLjc1NSwuMDUwLC44NTUsLjA2MCk7dHJhbnNpdGlvbi10aW1pbmctZnVuY3Rpb246Y3ViaWMtYmV6aWVyKDAuNzU1LC4wNTAsLjg1NSwuMDYwKTstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLC0xNXB4LDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLC0xNXB4LDApfTkwJXstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLC00cHgsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsLTRweCwwKX19LmJvdW5jZXstd2Via2l0LWFuaW1hdGlvbi1uYW1lOmJvdW5jZTthbmltYXRpb24tbmFtZTpib3VuY2U7LXdlYmtpdC10cmFuc2Zvcm0tb3JpZ2luOmNlbnRlciBib3R0b207LW1zLXRyYW5zZm9ybS1vcmlnaW46Y2VudGVyIGJvdHRvbTt0cmFuc2Zvcm0tb3JpZ2luOmNlbnRlciBib3R0b219QC13ZWJraXQta2V5ZnJhbWVzIGZsYXNoezAlLDEwMCUsNTAle29wYWNpdHk6MX0yNSUsNzUle29wYWNpdHk6MH19QGtleWZyYW1lcyBmbGFzaHswJSwxMDAlLDUwJXtvcGFjaXR5OjF9MjUlLDc1JXtvcGFjaXR5OjB9fS5mbGFzaHstd2Via2l0LWFuaW1hdGlvbi1uYW1lOmZsYXNoO2FuaW1hdGlvbi1uYW1lOmZsYXNofUAtd2Via2l0LWtleWZyYW1lcyBwdWxzZXswJXstd2Via2l0LXRyYW5zZm9ybTpzY2FsZTNkKDEsMSwxKTt0cmFuc2Zvcm06c2NhbGUzZCgxLDEsMSl9NTAley13ZWJraXQtdHJhbnNmb3JtOnNjYWxlM2QoMS4wNSwxLjA1LDEuMDUpO3RyYW5zZm9ybTpzY2FsZTNkKDEuMDUsMS4wNSwxLjA1KX0xMDAley13ZWJraXQtdHJhbnNmb3JtOnNjYWxlM2QoMSwxLDEpO3RyYW5zZm9ybTpzY2FsZTNkKDEsMSwxKX19QGtleWZyYW1lcyBwdWxzZXswJXstd2Via2l0LXRyYW5zZm9ybTpzY2FsZTNkKDEsMSwxKTt0cmFuc2Zvcm06c2NhbGUzZCgxLDEsMSl9NTAley13ZWJraXQtdHJhbnNmb3JtOnNjYWxlM2QoMS4wNSwxLjA1LDEuMDUpO3RyYW5zZm9ybTpzY2FsZTNkKDEuMDUsMS4wNSwxLjA1KX0xMDAley13ZWJraXQtdHJhbnNmb3JtOnNjYWxlM2QoMSwxLDEpO3RyYW5zZm9ybTpzY2FsZTNkKDEsMSwxKX19LnB1bHNley13ZWJraXQtYW5pbWF0aW9uLW5hbWU6cHVsc2U7YW5pbWF0aW9uLW5hbWU6cHVsc2V9QC13ZWJraXQta2V5ZnJhbWVzIHJ1YmJlckJhbmR7MCV7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGUzZCgxLDEsMSk7dHJhbnNmb3JtOnNjYWxlM2QoMSwxLDEpfTMwJXstd2Via2l0LXRyYW5zZm9ybTpzY2FsZTNkKDEuMjUsLjc1LDEpO3RyYW5zZm9ybTpzY2FsZTNkKDEuMjUsLjc1LDEpfTQwJXstd2Via2l0LXRyYW5zZm9ybTpzY2FsZTNkKDAuNzUsMS4yNSwxKTt0cmFuc2Zvcm06c2NhbGUzZCgwLjc1LDEuMjUsMSl9NTAley13ZWJraXQtdHJhbnNmb3JtOnNjYWxlM2QoMS4xNSwuODUsMSk7dHJhbnNmb3JtOnNjYWxlM2QoMS4xNSwuODUsMSl9NjUley13ZWJraXQtdHJhbnNmb3JtOnNjYWxlM2QoLjk1LDEuMDUsMSk7dHJhbnNmb3JtOnNjYWxlM2QoLjk1LDEuMDUsMSl9NzUley13ZWJraXQtdHJhbnNmb3JtOnNjYWxlM2QoMS4wNSwuOTUsMSk7dHJhbnNmb3JtOnNjYWxlM2QoMS4wNSwuOTUsMSl9MTAwJXstd2Via2l0LXRyYW5zZm9ybTpzY2FsZTNkKDEsMSwxKTt0cmFuc2Zvcm06c2NhbGUzZCgxLDEsMSl9fUBrZXlmcmFtZXMgcnViYmVyQmFuZHswJXstd2Via2l0LXRyYW5zZm9ybTpzY2FsZTNkKDEsMSwxKTt0cmFuc2Zvcm06c2NhbGUzZCgxLDEsMSl9MzAley13ZWJraXQtdHJhbnNmb3JtOnNjYWxlM2QoMS4yNSwuNzUsMSk7dHJhbnNmb3JtOnNjYWxlM2QoMS4yNSwuNzUsMSl9NDAley13ZWJraXQtdHJhbnNmb3JtOnNjYWxlM2QoMC43NSwxLjI1LDEpO3RyYW5zZm9ybTpzY2FsZTNkKDAuNzUsMS4yNSwxKX01MCV7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGUzZCgxLjE1LC44NSwxKTt0cmFuc2Zvcm06c2NhbGUzZCgxLjE1LC44NSwxKX02NSV7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGUzZCguOTUsMS4wNSwxKTt0cmFuc2Zvcm06c2NhbGUzZCguOTUsMS4wNSwxKX03NSV7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGUzZCgxLjA1LC45NSwxKTt0cmFuc2Zvcm06c2NhbGUzZCgxLjA1LC45NSwxKX0xMDAley13ZWJraXQtdHJhbnNmb3JtOnNjYWxlM2QoMSwxLDEpO3RyYW5zZm9ybTpzY2FsZTNkKDEsMSwxKX19LnJ1YmJlckJhbmR7LXdlYmtpdC1hbmltYXRpb24tbmFtZTpydWJiZXJCYW5kO2FuaW1hdGlvbi1uYW1lOnJ1YmJlckJhbmR9QC13ZWJraXQta2V5ZnJhbWVzIHNoYWtlezAlLDEwMCV7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwwLDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLDAsMCl9MTAlLDMwJSw1MCUsNzAlLDkwJXstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgtMTBweCwwLDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgtMTBweCwwLDApfTIwJSw0MCUsNjAlLDgwJXstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgxMHB4LDAsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDEwcHgsMCwwKX19QGtleWZyYW1lcyBzaGFrZXswJSwxMDAley13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsMCwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwwLDApfTEwJSwzMCUsNTAlLDcwJSw5MCV7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoLTEwcHgsMCwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoLTEwcHgsMCwwKX0yMCUsNDAlLDYwJSw4MCV7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoMTBweCwwLDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgxMHB4LDAsMCl9fS5zaGFrZXstd2Via2l0LWFuaW1hdGlvbi1uYW1lOnNoYWtlO2FuaW1hdGlvbi1uYW1lOnNoYWtlfUAtd2Via2l0LWtleWZyYW1lcyBzd2luZ3syMCV7LXdlYmtpdC10cmFuc2Zvcm06cm90YXRlM2QoMCwwLDEsMTVkZWcpO3RyYW5zZm9ybTpyb3RhdGUzZCgwLDAsMSwxNWRlZyl9NDAley13ZWJraXQtdHJhbnNmb3JtOnJvdGF0ZTNkKDAsMCwxLC0xMGRlZyk7dHJhbnNmb3JtOnJvdGF0ZTNkKDAsMCwxLC0xMGRlZyl9NjAley13ZWJraXQtdHJhbnNmb3JtOnJvdGF0ZTNkKDAsMCwxLDVkZWcpO3RyYW5zZm9ybTpyb3RhdGUzZCgwLDAsMSw1ZGVnKX04MCV7LXdlYmtpdC10cmFuc2Zvcm06cm90YXRlM2QoMCwwLDEsLTVkZWcpO3RyYW5zZm9ybTpyb3RhdGUzZCgwLDAsMSwtNWRlZyl9MTAwJXstd2Via2l0LXRyYW5zZm9ybTpyb3RhdGUzZCgwLDAsMSwwZGVnKTt0cmFuc2Zvcm06cm90YXRlM2QoMCwwLDEsMGRlZyl9fUBrZXlmcmFtZXMgc3dpbmd7MjAley13ZWJraXQtdHJhbnNmb3JtOnJvdGF0ZTNkKDAsMCwxLDE1ZGVnKTt0cmFuc2Zvcm06cm90YXRlM2QoMCwwLDEsMTVkZWcpfTQwJXstd2Via2l0LXRyYW5zZm9ybTpyb3RhdGUzZCgwLDAsMSwtMTBkZWcpO3RyYW5zZm9ybTpyb3RhdGUzZCgwLDAsMSwtMTBkZWcpfTYwJXstd2Via2l0LXRyYW5zZm9ybTpyb3RhdGUzZCgwLDAsMSw1ZGVnKTt0cmFuc2Zvcm06cm90YXRlM2QoMCwwLDEsNWRlZyl9ODAley13ZWJraXQtdHJhbnNmb3JtOnJvdGF0ZTNkKDAsMCwxLC01ZGVnKTt0cmFuc2Zvcm06cm90YXRlM2QoMCwwLDEsLTVkZWcpfTEwMCV7LXdlYmtpdC10cmFuc2Zvcm06cm90YXRlM2QoMCwwLDEsMGRlZyk7dHJhbnNmb3JtOnJvdGF0ZTNkKDAsMCwxLDBkZWcpfX0uc3dpbmd7LXdlYmtpdC10cmFuc2Zvcm0tb3JpZ2luOnRvcCBjZW50ZXI7LW1zLXRyYW5zZm9ybS1vcmlnaW46dG9wIGNlbnRlcjt0cmFuc2Zvcm0tb3JpZ2luOnRvcCBjZW50ZXI7LXdlYmtpdC1hbmltYXRpb24tbmFtZTpzd2luZzthbmltYXRpb24tbmFtZTpzd2luZ31ALXdlYmtpdC1rZXlmcmFtZXMgdGFkYXswJXstd2Via2l0LXRyYW5zZm9ybTpzY2FsZTNkKDEsMSwxKTt0cmFuc2Zvcm06c2NhbGUzZCgxLDEsMSl9MTAlLDIwJXstd2Via2l0LXRyYW5zZm9ybTpzY2FsZTNkKC45LC45LC45KSByb3RhdGUzZCgwLDAsMSwtM2RlZyk7dHJhbnNmb3JtOnNjYWxlM2QoLjksLjksLjkpIHJvdGF0ZTNkKDAsMCwxLC0zZGVnKX0zMCUsNTAlLDcwJSw5MCV7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGUzZCgxLjEsMS4xLDEuMSkgcm90YXRlM2QoMCwwLDEsM2RlZyk7dHJhbnNmb3JtOnNjYWxlM2QoMS4xLDEuMSwxLjEpIHJvdGF0ZTNkKDAsMCwxLDNkZWcpfTQwJSw2MCUsODAley13ZWJraXQtdHJhbnNmb3JtOnNjYWxlM2QoMS4xLDEuMSwxLjEpIHJvdGF0ZTNkKDAsMCwxLC0zZGVnKTt0cmFuc2Zvcm06c2NhbGUzZCgxLjEsMS4xLDEuMSkgcm90YXRlM2QoMCwwLDEsLTNkZWcpfTEwMCV7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGUzZCgxLDEsMSk7dHJhbnNmb3JtOnNjYWxlM2QoMSwxLDEpfX1Aa2V5ZnJhbWVzIHRhZGF7MCV7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGUzZCgxLDEsMSk7dHJhbnNmb3JtOnNjYWxlM2QoMSwxLDEpfTEwJSwyMCV7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGUzZCguOSwuOSwuOSkgcm90YXRlM2QoMCwwLDEsLTNkZWcpO3RyYW5zZm9ybTpzY2FsZTNkKC45LC45LC45KSByb3RhdGUzZCgwLDAsMSwtM2RlZyl9MzAlLDUwJSw3MCUsOTAley13ZWJraXQtdHJhbnNmb3JtOnNjYWxlM2QoMS4xLDEuMSwxLjEpIHJvdGF0ZTNkKDAsMCwxLDNkZWcpO3RyYW5zZm9ybTpzY2FsZTNkKDEuMSwxLjEsMS4xKSByb3RhdGUzZCgwLDAsMSwzZGVnKX00MCUsNjAlLDgwJXstd2Via2l0LXRyYW5zZm9ybTpzY2FsZTNkKDEuMSwxLjEsMS4xKSByb3RhdGUzZCgwLDAsMSwtM2RlZyk7dHJhbnNmb3JtOnNjYWxlM2QoMS4xLDEuMSwxLjEpIHJvdGF0ZTNkKDAsMCwxLC0zZGVnKX0xMDAley13ZWJraXQtdHJhbnNmb3JtOnNjYWxlM2QoMSwxLDEpO3RyYW5zZm9ybTpzY2FsZTNkKDEsMSwxKX19LnRhZGF7LXdlYmtpdC1hbmltYXRpb24tbmFtZTp0YWRhO2FuaW1hdGlvbi1uYW1lOnRhZGF9QC13ZWJraXQta2V5ZnJhbWVzIHdvYmJsZXswJXstd2Via2l0LXRyYW5zZm9ybTpub25lO3RyYW5zZm9ybTpub25lfTE1JXstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgtMjUlLDAsMCkgcm90YXRlM2QoMCwwLDEsLTVkZWcpO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgtMjUlLDAsMCkgcm90YXRlM2QoMCwwLDEsLTVkZWcpfTMwJXstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgyMCUsMCwwKSByb3RhdGUzZCgwLDAsMSwzZGVnKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoMjAlLDAsMCkgcm90YXRlM2QoMCwwLDEsM2RlZyl9NDUley13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKC0xNSUsMCwwKSByb3RhdGUzZCgwLDAsMSwtM2RlZyk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKC0xNSUsMCwwKSByb3RhdGUzZCgwLDAsMSwtM2RlZyl9NjAley13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDEwJSwwLDApIHJvdGF0ZTNkKDAsMCwxLDJkZWcpO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgxMCUsMCwwKSByb3RhdGUzZCgwLDAsMSwyZGVnKX03NSV7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoLTUlLDAsMCkgcm90YXRlM2QoMCwwLDEsLTFkZWcpO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgtNSUsMCwwKSByb3RhdGUzZCgwLDAsMSwtMWRlZyl9MTAwJXstd2Via2l0LXRyYW5zZm9ybTpub25lO3RyYW5zZm9ybTpub25lfX1Aa2V5ZnJhbWVzIHdvYmJsZXswJXstd2Via2l0LXRyYW5zZm9ybTpub25lO3RyYW5zZm9ybTpub25lfTE1JXstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgtMjUlLDAsMCkgcm90YXRlM2QoMCwwLDEsLTVkZWcpO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgtMjUlLDAsMCkgcm90YXRlM2QoMCwwLDEsLTVkZWcpfTMwJXstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgyMCUsMCwwKSByb3RhdGUzZCgwLDAsMSwzZGVnKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoMjAlLDAsMCkgcm90YXRlM2QoMCwwLDEsM2RlZyl9NDUley13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKC0xNSUsMCwwKSByb3RhdGUzZCgwLDAsMSwtM2RlZyk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKC0xNSUsMCwwKSByb3RhdGUzZCgwLDAsMSwtM2RlZyl9NjAley13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDEwJSwwLDApIHJvdGF0ZTNkKDAsMCwxLDJkZWcpO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgxMCUsMCwwKSByb3RhdGUzZCgwLDAsMSwyZGVnKX03NSV7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoLTUlLDAsMCkgcm90YXRlM2QoMCwwLDEsLTFkZWcpO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgtNSUsMCwwKSByb3RhdGUzZCgwLDAsMSwtMWRlZyl9MTAwJXstd2Via2l0LXRyYW5zZm9ybTpub25lO3RyYW5zZm9ybTpub25lfX0ud29iYmxley13ZWJraXQtYW5pbWF0aW9uLW5hbWU6d29iYmxlO2FuaW1hdGlvbi1uYW1lOndvYmJsZX1ALXdlYmtpdC1rZXlmcmFtZXMgYm91bmNlSW57MCUsMTAwJSwyMCUsNDAlLDYwJSw4MCV7LXdlYmtpdC10cmFuc2l0aW9uLXRpbWluZy1mdW5jdGlvbjpjdWJpYy1iZXppZXIoMC4yMTUsLjYxLC4zNTUsMSk7dHJhbnNpdGlvbi10aW1pbmctZnVuY3Rpb246Y3ViaWMtYmV6aWVyKDAuMjE1LC42MSwuMzU1LDEpfTAle29wYWNpdHk6MDstd2Via2l0LXRyYW5zZm9ybTpzY2FsZTNkKC4zLC4zLC4zKTt0cmFuc2Zvcm06c2NhbGUzZCguMywuMywuMyl9MjAley13ZWJraXQtdHJhbnNmb3JtOnNjYWxlM2QoMS4xLDEuMSwxLjEpO3RyYW5zZm9ybTpzY2FsZTNkKDEuMSwxLjEsMS4xKX00MCV7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGUzZCguOSwuOSwuOSk7dHJhbnNmb3JtOnNjYWxlM2QoLjksLjksLjkpfTYwJXtvcGFjaXR5OjE7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGUzZCgxLjAzLDEuMDMsMS4wMyk7dHJhbnNmb3JtOnNjYWxlM2QoMS4wMywxLjAzLDEuMDMpfTgwJXstd2Via2l0LXRyYW5zZm9ybTpzY2FsZTNkKC45NywuOTcsLjk3KTt0cmFuc2Zvcm06c2NhbGUzZCguOTcsLjk3LC45Nyl9MTAwJXtvcGFjaXR5OjE7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGUzZCgxLDEsMSk7dHJhbnNmb3JtOnNjYWxlM2QoMSwxLDEpfX1Aa2V5ZnJhbWVzIGJvdW5jZUluezAlLDEwMCUsMjAlLDQwJSw2MCUsODAley13ZWJraXQtdHJhbnNpdGlvbi10aW1pbmctZnVuY3Rpb246Y3ViaWMtYmV6aWVyKDAuMjE1LC42MSwuMzU1LDEpO3RyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uOmN1YmljLWJlemllcigwLjIxNSwuNjEsLjM1NSwxKX0wJXtvcGFjaXR5OjA7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGUzZCguMywuMywuMyk7dHJhbnNmb3JtOnNjYWxlM2QoLjMsLjMsLjMpfTIwJXstd2Via2l0LXRyYW5zZm9ybTpzY2FsZTNkKDEuMSwxLjEsMS4xKTt0cmFuc2Zvcm06c2NhbGUzZCgxLjEsMS4xLDEuMSl9NDAley13ZWJraXQtdHJhbnNmb3JtOnNjYWxlM2QoLjksLjksLjkpO3RyYW5zZm9ybTpzY2FsZTNkKC45LC45LC45KX02MCV7b3BhY2l0eToxOy13ZWJraXQtdHJhbnNmb3JtOnNjYWxlM2QoMS4wMywxLjAzLDEuMDMpO3RyYW5zZm9ybTpzY2FsZTNkKDEuMDMsMS4wMywxLjAzKX04MCV7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGUzZCguOTcsLjk3LC45Nyk7dHJhbnNmb3JtOnNjYWxlM2QoLjk3LC45NywuOTcpfTEwMCV7b3BhY2l0eToxOy13ZWJraXQtdHJhbnNmb3JtOnNjYWxlM2QoMSwxLDEpO3RyYW5zZm9ybTpzY2FsZTNkKDEsMSwxKX19LmJvdW5jZUluey13ZWJraXQtYW5pbWF0aW9uLW5hbWU6Ym91bmNlSW47YW5pbWF0aW9uLW5hbWU6Ym91bmNlSW47LXdlYmtpdC1hbmltYXRpb24tZHVyYXRpb246Ljc1czthbmltYXRpb24tZHVyYXRpb246Ljc1c31ALXdlYmtpdC1rZXlmcmFtZXMgYm91bmNlSW5Eb3duezAlLDEwMCUsNjAlLDc1JSw5MCV7LXdlYmtpdC10cmFuc2l0aW9uLXRpbWluZy1mdW5jdGlvbjpjdWJpYy1iZXppZXIoMC4yMTUsLjYxLC4zNTUsMSk7dHJhbnNpdGlvbi10aW1pbmctZnVuY3Rpb246Y3ViaWMtYmV6aWVyKDAuMjE1LC42MSwuMzU1LDEpfTAle29wYWNpdHk6MDstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLC0zMDAwcHgsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsLTMwMDBweCwwKX02MCV7b3BhY2l0eToxOy13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsMjVweCwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwyNXB4LDApfTc1JXstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLC0xMHB4LDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLC0xMHB4LDApfTkwJXstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLDVweCwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCw1cHgsMCl9MTAwJXstd2Via2l0LXRyYW5zZm9ybTpub25lO3RyYW5zZm9ybTpub25lfX1Aa2V5ZnJhbWVzIGJvdW5jZUluRG93bnswJSwxMDAlLDYwJSw3NSUsOTAley13ZWJraXQtdHJhbnNpdGlvbi10aW1pbmctZnVuY3Rpb246Y3ViaWMtYmV6aWVyKDAuMjE1LC42MSwuMzU1LDEpO3RyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uOmN1YmljLWJlemllcigwLjIxNSwuNjEsLjM1NSwxKX0wJXtvcGFjaXR5OjA7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwtMzAwMHB4LDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLC0zMDAwcHgsMCl9NjAle29wYWNpdHk6MTstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLDI1cHgsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsMjVweCwwKX03NSV7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwtMTBweCwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwtMTBweCwwKX05MCV7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCw1cHgsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsNXB4LDApfTEwMCV7LXdlYmtpdC10cmFuc2Zvcm06bm9uZTt0cmFuc2Zvcm06bm9uZX19LmJvdW5jZUluRG93bnstd2Via2l0LWFuaW1hdGlvbi1uYW1lOmJvdW5jZUluRG93bjthbmltYXRpb24tbmFtZTpib3VuY2VJbkRvd259QC13ZWJraXQta2V5ZnJhbWVzIGJvdW5jZUluTGVmdHswJSwxMDAlLDYwJSw3NSUsOTAley13ZWJraXQtdHJhbnNpdGlvbi10aW1pbmctZnVuY3Rpb246Y3ViaWMtYmV6aWVyKDAuMjE1LC42MSwuMzU1LDEpO3RyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uOmN1YmljLWJlemllcigwLjIxNSwuNjEsLjM1NSwxKX0wJXtvcGFjaXR5OjA7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoLTMwMDBweCwwLDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgtMzAwMHB4LDAsMCl9NjAle29wYWNpdHk6MTstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgyNXB4LDAsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDI1cHgsMCwwKX03NSV7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoLTEwcHgsMCwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoLTEwcHgsMCwwKX05MCV7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoNXB4LDAsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDVweCwwLDApfTEwMCV7LXdlYmtpdC10cmFuc2Zvcm06bm9uZTt0cmFuc2Zvcm06bm9uZX19QGtleWZyYW1lcyBib3VuY2VJbkxlZnR7MCUsMTAwJSw2MCUsNzUlLDkwJXstd2Via2l0LXRyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uOmN1YmljLWJlemllcigwLjIxNSwuNjEsLjM1NSwxKTt0cmFuc2l0aW9uLXRpbWluZy1mdW5jdGlvbjpjdWJpYy1iZXppZXIoMC4yMTUsLjYxLC4zNTUsMSl9MCV7b3BhY2l0eTowOy13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKC0zMDAwcHgsMCwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoLTMwMDBweCwwLDApfTYwJXtvcGFjaXR5OjE7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoMjVweCwwLDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgyNXB4LDAsMCl9NzUley13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKC0xMHB4LDAsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKC0xMHB4LDAsMCl9OTAley13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDVweCwwLDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCg1cHgsMCwwKX0xMDAley13ZWJraXQtdHJhbnNmb3JtOm5vbmU7dHJhbnNmb3JtOm5vbmV9fS5ib3VuY2VJbkxlZnR7LXdlYmtpdC1hbmltYXRpb24tbmFtZTpib3VuY2VJbkxlZnQ7YW5pbWF0aW9uLW5hbWU6Ym91bmNlSW5MZWZ0fUAtd2Via2l0LWtleWZyYW1lcyBib3VuY2VJblJpZ2h0ezAlLDEwMCUsNjAlLDc1JSw5MCV7LXdlYmtpdC10cmFuc2l0aW9uLXRpbWluZy1mdW5jdGlvbjpjdWJpYy1iZXppZXIoMC4yMTUsLjYxLC4zNTUsMSk7dHJhbnNpdGlvbi10aW1pbmctZnVuY3Rpb246Y3ViaWMtYmV6aWVyKDAuMjE1LC42MSwuMzU1LDEpfTAle29wYWNpdHk6MDstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgzMDAwcHgsMCwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoMzAwMHB4LDAsMCl9NjAle29wYWNpdHk6MTstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgtMjVweCwwLDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgtMjVweCwwLDApfTc1JXstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgxMHB4LDAsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDEwcHgsMCwwKX05MCV7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoLTVweCwwLDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgtNXB4LDAsMCl9MTAwJXstd2Via2l0LXRyYW5zZm9ybTpub25lO3RyYW5zZm9ybTpub25lfX1Aa2V5ZnJhbWVzIGJvdW5jZUluUmlnaHR7MCUsMTAwJSw2MCUsNzUlLDkwJXstd2Via2l0LXRyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uOmN1YmljLWJlemllcigwLjIxNSwuNjEsLjM1NSwxKTt0cmFuc2l0aW9uLXRpbWluZy1mdW5jdGlvbjpjdWJpYy1iZXppZXIoMC4yMTUsLjYxLC4zNTUsMSl9MCV7b3BhY2l0eTowOy13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDMwMDBweCwwLDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgzMDAwcHgsMCwwKX02MCV7b3BhY2l0eToxOy13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKC0yNXB4LDAsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKC0yNXB4LDAsMCl9NzUley13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDEwcHgsMCwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoMTBweCwwLDApfTkwJXstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgtNXB4LDAsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKC01cHgsMCwwKX0xMDAley13ZWJraXQtdHJhbnNmb3JtOm5vbmU7dHJhbnNmb3JtOm5vbmV9fS5ib3VuY2VJblJpZ2h0ey13ZWJraXQtYW5pbWF0aW9uLW5hbWU6Ym91bmNlSW5SaWdodDthbmltYXRpb24tbmFtZTpib3VuY2VJblJpZ2h0fUAtd2Via2l0LWtleWZyYW1lcyBib3VuY2VJblVwezAlLDEwMCUsNjAlLDc1JSw5MCV7LXdlYmtpdC10cmFuc2l0aW9uLXRpbWluZy1mdW5jdGlvbjpjdWJpYy1iZXppZXIoMC4yMTUsLjYxLC4zNTUsMSk7dHJhbnNpdGlvbi10aW1pbmctZnVuY3Rpb246Y3ViaWMtYmV6aWVyKDAuMjE1LC42MSwuMzU1LDEpfTAle29wYWNpdHk6MDstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLDMwMDBweCwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwzMDAwcHgsMCl9NjAle29wYWNpdHk6MTstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLC0yMHB4LDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLC0yMHB4LDApfTc1JXstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLDEwcHgsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsMTBweCwwKX05MCV7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwtNXB4LDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLC01cHgsMCl9MTAwJXstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLDAsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsMCwwKX19QGtleWZyYW1lcyBib3VuY2VJblVwezAlLDEwMCUsNjAlLDc1JSw5MCV7LXdlYmtpdC10cmFuc2l0aW9uLXRpbWluZy1mdW5jdGlvbjpjdWJpYy1iZXppZXIoMC4yMTUsLjYxLC4zNTUsMSk7dHJhbnNpdGlvbi10aW1pbmctZnVuY3Rpb246Y3ViaWMtYmV6aWVyKDAuMjE1LC42MSwuMzU1LDEpfTAle29wYWNpdHk6MDstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLDMwMDBweCwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwzMDAwcHgsMCl9NjAle29wYWNpdHk6MTstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLC0yMHB4LDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLC0yMHB4LDApfTc1JXstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLDEwcHgsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsMTBweCwwKX05MCV7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwtNXB4LDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLC01cHgsMCl9MTAwJXstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLDAsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsMCwwKX19LmJvdW5jZUluVXB7LXdlYmtpdC1hbmltYXRpb24tbmFtZTpib3VuY2VJblVwO2FuaW1hdGlvbi1uYW1lOmJvdW5jZUluVXB9QC13ZWJraXQta2V5ZnJhbWVzIGJvdW5jZU91dHsyMCV7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGUzZCguOSwuOSwuOSk7dHJhbnNmb3JtOnNjYWxlM2QoLjksLjksLjkpfTUwJSw1NSV7b3BhY2l0eToxOy13ZWJraXQtdHJhbnNmb3JtOnNjYWxlM2QoMS4xLDEuMSwxLjEpO3RyYW5zZm9ybTpzY2FsZTNkKDEuMSwxLjEsMS4xKX0xMDAle29wYWNpdHk6MDstd2Via2l0LXRyYW5zZm9ybTpzY2FsZTNkKC4zLC4zLC4zKTt0cmFuc2Zvcm06c2NhbGUzZCguMywuMywuMyl9fUBrZXlmcmFtZXMgYm91bmNlT3V0ezIwJXstd2Via2l0LXRyYW5zZm9ybTpzY2FsZTNkKC45LC45LC45KTt0cmFuc2Zvcm06c2NhbGUzZCguOSwuOSwuOSl9NTAlLDU1JXtvcGFjaXR5OjE7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGUzZCgxLjEsMS4xLDEuMSk7dHJhbnNmb3JtOnNjYWxlM2QoMS4xLDEuMSwxLjEpfTEwMCV7b3BhY2l0eTowOy13ZWJraXQtdHJhbnNmb3JtOnNjYWxlM2QoLjMsLjMsLjMpO3RyYW5zZm9ybTpzY2FsZTNkKC4zLC4zLC4zKX19LmJvdW5jZU91dHstd2Via2l0LWFuaW1hdGlvbi1uYW1lOmJvdW5jZU91dDthbmltYXRpb24tbmFtZTpib3VuY2VPdXQ7LXdlYmtpdC1hbmltYXRpb24tZHVyYXRpb246Ljc1czthbmltYXRpb24tZHVyYXRpb246Ljc1c31ALXdlYmtpdC1rZXlmcmFtZXMgYm91bmNlT3V0RG93bnsyMCV7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwxMHB4LDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLDEwcHgsMCl9NDAlLDQ1JXtvcGFjaXR5OjE7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwtMjBweCwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwtMjBweCwwKX0xMDAle29wYWNpdHk6MDstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLDIwMDBweCwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwyMDAwcHgsMCl9fUBrZXlmcmFtZXMgYm91bmNlT3V0RG93bnsyMCV7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwxMHB4LDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLDEwcHgsMCl9NDAlLDQ1JXtvcGFjaXR5OjE7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwtMjBweCwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwtMjBweCwwKX0xMDAle29wYWNpdHk6MDstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLDIwMDBweCwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwyMDAwcHgsMCl9fS5ib3VuY2VPdXREb3duey13ZWJraXQtYW5pbWF0aW9uLW5hbWU6Ym91bmNlT3V0RG93bjthbmltYXRpb24tbmFtZTpib3VuY2VPdXREb3dufUAtd2Via2l0LWtleWZyYW1lcyBib3VuY2VPdXRMZWZ0ezIwJXtvcGFjaXR5OjE7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoMjBweCwwLDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgyMHB4LDAsMCl9MTAwJXtvcGFjaXR5OjA7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoLTIwMDBweCwwLDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgtMjAwMHB4LDAsMCl9fUBrZXlmcmFtZXMgYm91bmNlT3V0TGVmdHsyMCV7b3BhY2l0eToxOy13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDIwcHgsMCwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoMjBweCwwLDApfTEwMCV7b3BhY2l0eTowOy13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKC0yMDAwcHgsMCwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoLTIwMDBweCwwLDApfX0uYm91bmNlT3V0TGVmdHstd2Via2l0LWFuaW1hdGlvbi1uYW1lOmJvdW5jZU91dExlZnQ7YW5pbWF0aW9uLW5hbWU6Ym91bmNlT3V0TGVmdH1ALXdlYmtpdC1rZXlmcmFtZXMgYm91bmNlT3V0UmlnaHR7MjAle29wYWNpdHk6MTstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgtMjBweCwwLDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgtMjBweCwwLDApfTEwMCV7b3BhY2l0eTowOy13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDIwMDBweCwwLDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgyMDAwcHgsMCwwKX19QGtleWZyYW1lcyBib3VuY2VPdXRSaWdodHsyMCV7b3BhY2l0eToxOy13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKC0yMHB4LDAsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKC0yMHB4LDAsMCl9MTAwJXtvcGFjaXR5OjA7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoMjAwMHB4LDAsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDIwMDBweCwwLDApfX0uYm91bmNlT3V0UmlnaHR7LXdlYmtpdC1hbmltYXRpb24tbmFtZTpib3VuY2VPdXRSaWdodDthbmltYXRpb24tbmFtZTpib3VuY2VPdXRSaWdodH1ALXdlYmtpdC1rZXlmcmFtZXMgYm91bmNlT3V0VXB7MjAley13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsLTEwcHgsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsLTEwcHgsMCl9NDAlLDQ1JXtvcGFjaXR5OjE7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwyMHB4LDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLDIwcHgsMCl9MTAwJXtvcGFjaXR5OjA7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwtMjAwMHB4LDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLC0yMDAwcHgsMCl9fUBrZXlmcmFtZXMgYm91bmNlT3V0VXB7MjAley13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsLTEwcHgsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsLTEwcHgsMCl9NDAlLDQ1JXtvcGFjaXR5OjE7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwyMHB4LDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLDIwcHgsMCl9MTAwJXtvcGFjaXR5OjA7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwtMjAwMHB4LDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLC0yMDAwcHgsMCl9fS5ib3VuY2VPdXRVcHstd2Via2l0LWFuaW1hdGlvbi1uYW1lOmJvdW5jZU91dFVwO2FuaW1hdGlvbi1uYW1lOmJvdW5jZU91dFVwfUAtd2Via2l0LWtleWZyYW1lcyBmYWRlSW57MCV7b3BhY2l0eTowfTEwMCV7b3BhY2l0eToxfX1Aa2V5ZnJhbWVzIGZhZGVJbnswJXtvcGFjaXR5OjB9MTAwJXtvcGFjaXR5OjF9fS5mYWRlSW57LXdlYmtpdC1hbmltYXRpb24tbmFtZTpmYWRlSW47YW5pbWF0aW9uLW5hbWU6ZmFkZUlufUAtd2Via2l0LWtleWZyYW1lcyBmYWRlSW5Eb3duezAle29wYWNpdHk6MDstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLC0xMDAlLDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLC0xMDAlLDApfTEwMCV7b3BhY2l0eToxOy13ZWJraXQtdHJhbnNmb3JtOm5vbmU7dHJhbnNmb3JtOm5vbmV9fUBrZXlmcmFtZXMgZmFkZUluRG93bnswJXtvcGFjaXR5OjA7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwtMTAwJSwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwtMTAwJSwwKX0xMDAle29wYWNpdHk6MTstd2Via2l0LXRyYW5zZm9ybTpub25lO3RyYW5zZm9ybTpub25lfX0uZmFkZUluRG93bnstd2Via2l0LWFuaW1hdGlvbi1uYW1lOmZhZGVJbkRvd247YW5pbWF0aW9uLW5hbWU6ZmFkZUluRG93bn1ALXdlYmtpdC1rZXlmcmFtZXMgZmFkZUluRG93bkJpZ3swJXtvcGFjaXR5OjA7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwtMjAwMHB4LDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLC0yMDAwcHgsMCl9MTAwJXtvcGFjaXR5OjE7LXdlYmtpdC10cmFuc2Zvcm06bm9uZTt0cmFuc2Zvcm06bm9uZX19QGtleWZyYW1lcyBmYWRlSW5Eb3duQmlnezAle29wYWNpdHk6MDstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLC0yMDAwcHgsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsLTIwMDBweCwwKX0xMDAle29wYWNpdHk6MTstd2Via2l0LXRyYW5zZm9ybTpub25lO3RyYW5zZm9ybTpub25lfX0uZmFkZUluRG93bkJpZ3std2Via2l0LWFuaW1hdGlvbi1uYW1lOmZhZGVJbkRvd25CaWc7YW5pbWF0aW9uLW5hbWU6ZmFkZUluRG93bkJpZ31ALXdlYmtpdC1rZXlmcmFtZXMgZmFkZUluTGVmdHswJXtvcGFjaXR5OjA7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoLTEwMCUsMCwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoLTEwMCUsMCwwKX0xMDAle29wYWNpdHk6MTstd2Via2l0LXRyYW5zZm9ybTpub25lO3RyYW5zZm9ybTpub25lfX1Aa2V5ZnJhbWVzIGZhZGVJbkxlZnR7MCV7b3BhY2l0eTowOy13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKC0xMDAlLDAsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKC0xMDAlLDAsMCl9MTAwJXtvcGFjaXR5OjE7LXdlYmtpdC10cmFuc2Zvcm06bm9uZTt0cmFuc2Zvcm06bm9uZX19LmZhZGVJbkxlZnR7LXdlYmtpdC1hbmltYXRpb24tbmFtZTpmYWRlSW5MZWZ0O2FuaW1hdGlvbi1uYW1lOmZhZGVJbkxlZnR9QC13ZWJraXQta2V5ZnJhbWVzIGZhZGVJbkxlZnRCaWd7MCV7b3BhY2l0eTowOy13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKC0yMDAwcHgsMCwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoLTIwMDBweCwwLDApfTEwMCV7b3BhY2l0eToxOy13ZWJraXQtdHJhbnNmb3JtOm5vbmU7dHJhbnNmb3JtOm5vbmV9fUBrZXlmcmFtZXMgZmFkZUluTGVmdEJpZ3swJXtvcGFjaXR5OjA7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoLTIwMDBweCwwLDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgtMjAwMHB4LDAsMCl9MTAwJXtvcGFjaXR5OjE7LXdlYmtpdC10cmFuc2Zvcm06bm9uZTt0cmFuc2Zvcm06bm9uZX19LmZhZGVJbkxlZnRCaWd7LXdlYmtpdC1hbmltYXRpb24tbmFtZTpmYWRlSW5MZWZ0QmlnO2FuaW1hdGlvbi1uYW1lOmZhZGVJbkxlZnRCaWd9QC13ZWJraXQta2V5ZnJhbWVzIGZhZGVJblJpZ2h0ezAle29wYWNpdHk6MDstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgxMDAlLDAsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDEwMCUsMCwwKX0xMDAle29wYWNpdHk6MTstd2Via2l0LXRyYW5zZm9ybTpub25lO3RyYW5zZm9ybTpub25lfX1Aa2V5ZnJhbWVzIGZhZGVJblJpZ2h0ezAle29wYWNpdHk6MDstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgxMDAlLDAsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDEwMCUsMCwwKX0xMDAle29wYWNpdHk6MTstd2Via2l0LXRyYW5zZm9ybTpub25lO3RyYW5zZm9ybTpub25lfX0uZmFkZUluUmlnaHR7LXdlYmtpdC1hbmltYXRpb24tbmFtZTpmYWRlSW5SaWdodDthbmltYXRpb24tbmFtZTpmYWRlSW5SaWdodH1ALXdlYmtpdC1rZXlmcmFtZXMgZmFkZUluUmlnaHRCaWd7MCV7b3BhY2l0eTowOy13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDIwMDBweCwwLDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgyMDAwcHgsMCwwKX0xMDAle29wYWNpdHk6MTstd2Via2l0LXRyYW5zZm9ybTpub25lO3RyYW5zZm9ybTpub25lfX1Aa2V5ZnJhbWVzIGZhZGVJblJpZ2h0QmlnezAle29wYWNpdHk6MDstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgyMDAwcHgsMCwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoMjAwMHB4LDAsMCl9MTAwJXtvcGFjaXR5OjE7LXdlYmtpdC10cmFuc2Zvcm06bm9uZTt0cmFuc2Zvcm06bm9uZX19LmZhZGVJblJpZ2h0Qmlney13ZWJraXQtYW5pbWF0aW9uLW5hbWU6ZmFkZUluUmlnaHRCaWc7YW5pbWF0aW9uLW5hbWU6ZmFkZUluUmlnaHRCaWd9QC13ZWJraXQta2V5ZnJhbWVzIGZhZGVJblVwezAle29wYWNpdHk6MDstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLDEwMCUsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsMTAwJSwwKX0xMDAle29wYWNpdHk6MTstd2Via2l0LXRyYW5zZm9ybTpub25lO3RyYW5zZm9ybTpub25lfX1Aa2V5ZnJhbWVzIGZhZGVJblVwezAle29wYWNpdHk6MDstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLDEwMCUsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsMTAwJSwwKX0xMDAle29wYWNpdHk6MTstd2Via2l0LXRyYW5zZm9ybTpub25lO3RyYW5zZm9ybTpub25lfX0uZmFkZUluVXB7LXdlYmtpdC1hbmltYXRpb24tbmFtZTpmYWRlSW5VcDthbmltYXRpb24tbmFtZTpmYWRlSW5VcH1ALXdlYmtpdC1rZXlmcmFtZXMgZmFkZUluVXBCaWd7MCV7b3BhY2l0eTowOy13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsMjAwMHB4LDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLDIwMDBweCwwKX0xMDAle29wYWNpdHk6MTstd2Via2l0LXRyYW5zZm9ybTpub25lO3RyYW5zZm9ybTpub25lfX1Aa2V5ZnJhbWVzIGZhZGVJblVwQmlnezAle29wYWNpdHk6MDstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLDIwMDBweCwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwyMDAwcHgsMCl9MTAwJXtvcGFjaXR5OjE7LXdlYmtpdC10cmFuc2Zvcm06bm9uZTt0cmFuc2Zvcm06bm9uZX19LmZhZGVJblVwQmlney13ZWJraXQtYW5pbWF0aW9uLW5hbWU6ZmFkZUluVXBCaWc7YW5pbWF0aW9uLW5hbWU6ZmFkZUluVXBCaWd9QC13ZWJraXQta2V5ZnJhbWVzIGZhZGVPdXR7MCV7b3BhY2l0eToxfTEwMCV7b3BhY2l0eTowfX1Aa2V5ZnJhbWVzIGZhZGVPdXR7MCV7b3BhY2l0eToxfTEwMCV7b3BhY2l0eTowfX0uZmFkZU91dHstd2Via2l0LWFuaW1hdGlvbi1uYW1lOmZhZGVPdXQ7YW5pbWF0aW9uLW5hbWU6ZmFkZU91dH1ALXdlYmtpdC1rZXlmcmFtZXMgZmFkZU91dERvd257MCV7b3BhY2l0eToxfTEwMCV7b3BhY2l0eTowOy13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsMTAwJSwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwxMDAlLDApfX1Aa2V5ZnJhbWVzIGZhZGVPdXREb3duezAle29wYWNpdHk6MX0xMDAle29wYWNpdHk6MDstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLDEwMCUsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsMTAwJSwwKX19LmZhZGVPdXREb3duey13ZWJraXQtYW5pbWF0aW9uLW5hbWU6ZmFkZU91dERvd247YW5pbWF0aW9uLW5hbWU6ZmFkZU91dERvd259QC13ZWJraXQta2V5ZnJhbWVzIGZhZGVPdXREb3duQmlnezAle29wYWNpdHk6MX0xMDAle29wYWNpdHk6MDstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLDIwMDBweCwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwyMDAwcHgsMCl9fUBrZXlmcmFtZXMgZmFkZU91dERvd25CaWd7MCV7b3BhY2l0eToxfTEwMCV7b3BhY2l0eTowOy13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsMjAwMHB4LDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLDIwMDBweCwwKX19LmZhZGVPdXREb3duQmlney13ZWJraXQtYW5pbWF0aW9uLW5hbWU6ZmFkZU91dERvd25CaWc7YW5pbWF0aW9uLW5hbWU6ZmFkZU91dERvd25CaWd9QC13ZWJraXQta2V5ZnJhbWVzIGZhZGVPdXRMZWZ0ezAle29wYWNpdHk6MX0xMDAle29wYWNpdHk6MDstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgtMTAwJSwwLDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgtMTAwJSwwLDApfX1Aa2V5ZnJhbWVzIGZhZGVPdXRMZWZ0ezAle29wYWNpdHk6MX0xMDAle29wYWNpdHk6MDstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgtMTAwJSwwLDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgtMTAwJSwwLDApfX0uZmFkZU91dExlZnR7LXdlYmtpdC1hbmltYXRpb24tbmFtZTpmYWRlT3V0TGVmdDthbmltYXRpb24tbmFtZTpmYWRlT3V0TGVmdH1ALXdlYmtpdC1rZXlmcmFtZXMgZmFkZU91dExlZnRCaWd7MCV7b3BhY2l0eToxfTEwMCV7b3BhY2l0eTowOy13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKC0yMDAwcHgsMCwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoLTIwMDBweCwwLDApfX1Aa2V5ZnJhbWVzIGZhZGVPdXRMZWZ0QmlnezAle29wYWNpdHk6MX0xMDAle29wYWNpdHk6MDstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgtMjAwMHB4LDAsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKC0yMDAwcHgsMCwwKX19LmZhZGVPdXRMZWZ0Qmlney13ZWJraXQtYW5pbWF0aW9uLW5hbWU6ZmFkZU91dExlZnRCaWc7YW5pbWF0aW9uLW5hbWU6ZmFkZU91dExlZnRCaWd9QC13ZWJraXQta2V5ZnJhbWVzIGZhZGVPdXRSaWdodHswJXtvcGFjaXR5OjF9MTAwJXtvcGFjaXR5OjA7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoMTAwJSwwLDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgxMDAlLDAsMCl9fUBrZXlmcmFtZXMgZmFkZU91dFJpZ2h0ezAle29wYWNpdHk6MX0xMDAle29wYWNpdHk6MDstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgxMDAlLDAsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDEwMCUsMCwwKX19LmZhZGVPdXRSaWdodHstd2Via2l0LWFuaW1hdGlvbi1uYW1lOmZhZGVPdXRSaWdodDthbmltYXRpb24tbmFtZTpmYWRlT3V0UmlnaHR9QC13ZWJraXQta2V5ZnJhbWVzIGZhZGVPdXRSaWdodEJpZ3swJXtvcGFjaXR5OjF9MTAwJXtvcGFjaXR5OjA7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoMjAwMHB4LDAsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDIwMDBweCwwLDApfX1Aa2V5ZnJhbWVzIGZhZGVPdXRSaWdodEJpZ3swJXtvcGFjaXR5OjF9MTAwJXtvcGFjaXR5OjA7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoMjAwMHB4LDAsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDIwMDBweCwwLDApfX0uZmFkZU91dFJpZ2h0Qmlney13ZWJraXQtYW5pbWF0aW9uLW5hbWU6ZmFkZU91dFJpZ2h0QmlnO2FuaW1hdGlvbi1uYW1lOmZhZGVPdXRSaWdodEJpZ31ALXdlYmtpdC1rZXlmcmFtZXMgZmFkZU91dFVwezAle29wYWNpdHk6MX0xMDAle29wYWNpdHk6MDstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLC0xMDAlLDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLC0xMDAlLDApfX1Aa2V5ZnJhbWVzIGZhZGVPdXRVcHswJXtvcGFjaXR5OjF9MTAwJXtvcGFjaXR5OjA7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwtMTAwJSwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwtMTAwJSwwKX19LmZhZGVPdXRVcHstd2Via2l0LWFuaW1hdGlvbi1uYW1lOmZhZGVPdXRVcDthbmltYXRpb24tbmFtZTpmYWRlT3V0VXB9QC13ZWJraXQta2V5ZnJhbWVzIGZhZGVPdXRVcEJpZ3swJXtvcGFjaXR5OjF9MTAwJXtvcGFjaXR5OjA7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwtMjAwMHB4LDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLC0yMDAwcHgsMCl9fUBrZXlmcmFtZXMgZmFkZU91dFVwQmlnezAle29wYWNpdHk6MX0xMDAle29wYWNpdHk6MDstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLC0yMDAwcHgsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsLTIwMDBweCwwKX19LmZhZGVPdXRVcEJpZ3std2Via2l0LWFuaW1hdGlvbi1uYW1lOmZhZGVPdXRVcEJpZzthbmltYXRpb24tbmFtZTpmYWRlT3V0VXBCaWd9QC13ZWJraXQta2V5ZnJhbWVzIGZsaXB7MCV7LXdlYmtpdC10cmFuc2Zvcm06cGVyc3BlY3RpdmUoNDAwcHgpIHJvdGF0ZTNkKDAsMSwwLC0zNjBkZWcpO3RyYW5zZm9ybTpwZXJzcGVjdGl2ZSg0MDBweCkgcm90YXRlM2QoMCwxLDAsLTM2MGRlZyk7LXdlYmtpdC1hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOmVhc2Utb3V0O2FuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246ZWFzZS1vdXR9NDAley13ZWJraXQtdHJhbnNmb3JtOnBlcnNwZWN0aXZlKDQwMHB4KSB0cmFuc2xhdGUzZCgwLDAsMTUwcHgpIHJvdGF0ZTNkKDAsMSwwLC0xOTBkZWcpO3RyYW5zZm9ybTpwZXJzcGVjdGl2ZSg0MDBweCkgdHJhbnNsYXRlM2QoMCwwLDE1MHB4KSByb3RhdGUzZCgwLDEsMCwtMTkwZGVnKTstd2Via2l0LWFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246ZWFzZS1vdXQ7YW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjplYXNlLW91dH01MCV7LXdlYmtpdC10cmFuc2Zvcm06cGVyc3BlY3RpdmUoNDAwcHgpIHRyYW5zbGF0ZTNkKDAsMCwxNTBweCkgcm90YXRlM2QoMCwxLDAsLTE3MGRlZyk7dHJhbnNmb3JtOnBlcnNwZWN0aXZlKDQwMHB4KSB0cmFuc2xhdGUzZCgwLDAsMTUwcHgpIHJvdGF0ZTNkKDAsMSwwLC0xNzBkZWcpOy13ZWJraXQtYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjplYXNlLWluO2FuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246ZWFzZS1pbn04MCV7LXdlYmtpdC10cmFuc2Zvcm06cGVyc3BlY3RpdmUoNDAwcHgpIHNjYWxlM2QoLjk1LC45NSwuOTUpO3RyYW5zZm9ybTpwZXJzcGVjdGl2ZSg0MDBweCkgc2NhbGUzZCguOTUsLjk1LC45NSk7LXdlYmtpdC1hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOmVhc2UtaW47YW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjplYXNlLWlufTEwMCV7LXdlYmtpdC10cmFuc2Zvcm06cGVyc3BlY3RpdmUoNDAwcHgpO3RyYW5zZm9ybTpwZXJzcGVjdGl2ZSg0MDBweCk7LXdlYmtpdC1hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOmVhc2UtaW47YW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjplYXNlLWlufX1Aa2V5ZnJhbWVzIGZsaXB7MCV7LXdlYmtpdC10cmFuc2Zvcm06cGVyc3BlY3RpdmUoNDAwcHgpIHJvdGF0ZTNkKDAsMSwwLC0zNjBkZWcpO3RyYW5zZm9ybTpwZXJzcGVjdGl2ZSg0MDBweCkgcm90YXRlM2QoMCwxLDAsLTM2MGRlZyk7LXdlYmtpdC1hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOmVhc2Utb3V0O2FuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246ZWFzZS1vdXR9NDAley13ZWJraXQtdHJhbnNmb3JtOnBlcnNwZWN0aXZlKDQwMHB4KSB0cmFuc2xhdGUzZCgwLDAsMTUwcHgpIHJvdGF0ZTNkKDAsMSwwLC0xOTBkZWcpO3RyYW5zZm9ybTpwZXJzcGVjdGl2ZSg0MDBweCkgdHJhbnNsYXRlM2QoMCwwLDE1MHB4KSByb3RhdGUzZCgwLDEsMCwtMTkwZGVnKTstd2Via2l0LWFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246ZWFzZS1vdXQ7YW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjplYXNlLW91dH01MCV7LXdlYmtpdC10cmFuc2Zvcm06cGVyc3BlY3RpdmUoNDAwcHgpIHRyYW5zbGF0ZTNkKDAsMCwxNTBweCkgcm90YXRlM2QoMCwxLDAsLTE3MGRlZyk7dHJhbnNmb3JtOnBlcnNwZWN0aXZlKDQwMHB4KSB0cmFuc2xhdGUzZCgwLDAsMTUwcHgpIHJvdGF0ZTNkKDAsMSwwLC0xNzBkZWcpOy13ZWJraXQtYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjplYXNlLWluO2FuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246ZWFzZS1pbn04MCV7LXdlYmtpdC10cmFuc2Zvcm06cGVyc3BlY3RpdmUoNDAwcHgpIHNjYWxlM2QoLjk1LC45NSwuOTUpO3RyYW5zZm9ybTpwZXJzcGVjdGl2ZSg0MDBweCkgc2NhbGUzZCguOTUsLjk1LC45NSk7LXdlYmtpdC1hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOmVhc2UtaW47YW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjplYXNlLWlufTEwMCV7LXdlYmtpdC10cmFuc2Zvcm06cGVyc3BlY3RpdmUoNDAwcHgpO3RyYW5zZm9ybTpwZXJzcGVjdGl2ZSg0MDBweCk7LXdlYmtpdC1hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOmVhc2UtaW47YW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjplYXNlLWlufX0uYW5pbWF0ZWQuZmxpcHstd2Via2l0LWJhY2tmYWNlLXZpc2liaWxpdHk6dmlzaWJsZTtiYWNrZmFjZS12aXNpYmlsaXR5OnZpc2libGU7LXdlYmtpdC1hbmltYXRpb24tbmFtZTpmbGlwO2FuaW1hdGlvbi1uYW1lOmZsaXB9QC13ZWJraXQta2V5ZnJhbWVzIGZsaXBJblh7MCV7LXdlYmtpdC10cmFuc2Zvcm06cGVyc3BlY3RpdmUoNDAwcHgpIHJvdGF0ZTNkKDEsMCwwLDkwZGVnKTt0cmFuc2Zvcm06cGVyc3BlY3RpdmUoNDAwcHgpIHJvdGF0ZTNkKDEsMCwwLDkwZGVnKTstd2Via2l0LXRyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uOmVhc2UtaW47dHJhbnNpdGlvbi10aW1pbmctZnVuY3Rpb246ZWFzZS1pbjtvcGFjaXR5OjB9NDAley13ZWJraXQtdHJhbnNmb3JtOnBlcnNwZWN0aXZlKDQwMHB4KSByb3RhdGUzZCgxLDAsMCwtMjBkZWcpO3RyYW5zZm9ybTpwZXJzcGVjdGl2ZSg0MDBweCkgcm90YXRlM2QoMSwwLDAsLTIwZGVnKTstd2Via2l0LXRyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uOmVhc2UtaW47dHJhbnNpdGlvbi10aW1pbmctZnVuY3Rpb246ZWFzZS1pbn02MCV7LXdlYmtpdC10cmFuc2Zvcm06cGVyc3BlY3RpdmUoNDAwcHgpIHJvdGF0ZTNkKDEsMCwwLDEwZGVnKTt0cmFuc2Zvcm06cGVyc3BlY3RpdmUoNDAwcHgpIHJvdGF0ZTNkKDEsMCwwLDEwZGVnKTtvcGFjaXR5OjF9ODAley13ZWJraXQtdHJhbnNmb3JtOnBlcnNwZWN0aXZlKDQwMHB4KSByb3RhdGUzZCgxLDAsMCwtNWRlZyk7dHJhbnNmb3JtOnBlcnNwZWN0aXZlKDQwMHB4KSByb3RhdGUzZCgxLDAsMCwtNWRlZyl9MTAwJXstd2Via2l0LXRyYW5zZm9ybTpwZXJzcGVjdGl2ZSg0MDBweCk7dHJhbnNmb3JtOnBlcnNwZWN0aXZlKDQwMHB4KX19QGtleWZyYW1lcyBmbGlwSW5YezAley13ZWJraXQtdHJhbnNmb3JtOnBlcnNwZWN0aXZlKDQwMHB4KSByb3RhdGUzZCgxLDAsMCw5MGRlZyk7dHJhbnNmb3JtOnBlcnNwZWN0aXZlKDQwMHB4KSByb3RhdGUzZCgxLDAsMCw5MGRlZyk7LXdlYmtpdC10cmFuc2l0aW9uLXRpbWluZy1mdW5jdGlvbjplYXNlLWluO3RyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uOmVhc2UtaW47b3BhY2l0eTowfTQwJXstd2Via2l0LXRyYW5zZm9ybTpwZXJzcGVjdGl2ZSg0MDBweCkgcm90YXRlM2QoMSwwLDAsLTIwZGVnKTt0cmFuc2Zvcm06cGVyc3BlY3RpdmUoNDAwcHgpIHJvdGF0ZTNkKDEsMCwwLC0yMGRlZyk7LXdlYmtpdC10cmFuc2l0aW9uLXRpbWluZy1mdW5jdGlvbjplYXNlLWluO3RyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uOmVhc2UtaW59NjAley13ZWJraXQtdHJhbnNmb3JtOnBlcnNwZWN0aXZlKDQwMHB4KSByb3RhdGUzZCgxLDAsMCwxMGRlZyk7dHJhbnNmb3JtOnBlcnNwZWN0aXZlKDQwMHB4KSByb3RhdGUzZCgxLDAsMCwxMGRlZyk7b3BhY2l0eToxfTgwJXstd2Via2l0LXRyYW5zZm9ybTpwZXJzcGVjdGl2ZSg0MDBweCkgcm90YXRlM2QoMSwwLDAsLTVkZWcpO3RyYW5zZm9ybTpwZXJzcGVjdGl2ZSg0MDBweCkgcm90YXRlM2QoMSwwLDAsLTVkZWcpfTEwMCV7LXdlYmtpdC10cmFuc2Zvcm06cGVyc3BlY3RpdmUoNDAwcHgpO3RyYW5zZm9ybTpwZXJzcGVjdGl2ZSg0MDBweCl9fS5mbGlwSW5Yey13ZWJraXQtYmFja2ZhY2UtdmlzaWJpbGl0eTp2aXNpYmxlIWltcG9ydGFudDtiYWNrZmFjZS12aXNpYmlsaXR5OnZpc2libGUhaW1wb3J0YW50Oy13ZWJraXQtYW5pbWF0aW9uLW5hbWU6ZmxpcEluWDthbmltYXRpb24tbmFtZTpmbGlwSW5YfUAtd2Via2l0LWtleWZyYW1lcyBmbGlwSW5ZezAley13ZWJraXQtdHJhbnNmb3JtOnBlcnNwZWN0aXZlKDQwMHB4KSByb3RhdGUzZCgwLDEsMCw5MGRlZyk7dHJhbnNmb3JtOnBlcnNwZWN0aXZlKDQwMHB4KSByb3RhdGUzZCgwLDEsMCw5MGRlZyk7LXdlYmtpdC10cmFuc2l0aW9uLXRpbWluZy1mdW5jdGlvbjplYXNlLWluO3RyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uOmVhc2UtaW47b3BhY2l0eTowfTQwJXstd2Via2l0LXRyYW5zZm9ybTpwZXJzcGVjdGl2ZSg0MDBweCkgcm90YXRlM2QoMCwxLDAsLTIwZGVnKTt0cmFuc2Zvcm06cGVyc3BlY3RpdmUoNDAwcHgpIHJvdGF0ZTNkKDAsMSwwLC0yMGRlZyk7LXdlYmtpdC10cmFuc2l0aW9uLXRpbWluZy1mdW5jdGlvbjplYXNlLWluO3RyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uOmVhc2UtaW59NjAley13ZWJraXQtdHJhbnNmb3JtOnBlcnNwZWN0aXZlKDQwMHB4KSByb3RhdGUzZCgwLDEsMCwxMGRlZyk7dHJhbnNmb3JtOnBlcnNwZWN0aXZlKDQwMHB4KSByb3RhdGUzZCgwLDEsMCwxMGRlZyk7b3BhY2l0eToxfTgwJXstd2Via2l0LXRyYW5zZm9ybTpwZXJzcGVjdGl2ZSg0MDBweCkgcm90YXRlM2QoMCwxLDAsLTVkZWcpO3RyYW5zZm9ybTpwZXJzcGVjdGl2ZSg0MDBweCkgcm90YXRlM2QoMCwxLDAsLTVkZWcpfTEwMCV7LXdlYmtpdC10cmFuc2Zvcm06cGVyc3BlY3RpdmUoNDAwcHgpO3RyYW5zZm9ybTpwZXJzcGVjdGl2ZSg0MDBweCl9fUBrZXlmcmFtZXMgZmxpcEluWXswJXstd2Via2l0LXRyYW5zZm9ybTpwZXJzcGVjdGl2ZSg0MDBweCkgcm90YXRlM2QoMCwxLDAsOTBkZWcpO3RyYW5zZm9ybTpwZXJzcGVjdGl2ZSg0MDBweCkgcm90YXRlM2QoMCwxLDAsOTBkZWcpOy13ZWJraXQtdHJhbnNpdGlvbi10aW1pbmctZnVuY3Rpb246ZWFzZS1pbjt0cmFuc2l0aW9uLXRpbWluZy1mdW5jdGlvbjplYXNlLWluO29wYWNpdHk6MH00MCV7LXdlYmtpdC10cmFuc2Zvcm06cGVyc3BlY3RpdmUoNDAwcHgpIHJvdGF0ZTNkKDAsMSwwLC0yMGRlZyk7dHJhbnNmb3JtOnBlcnNwZWN0aXZlKDQwMHB4KSByb3RhdGUzZCgwLDEsMCwtMjBkZWcpOy13ZWJraXQtdHJhbnNpdGlvbi10aW1pbmctZnVuY3Rpb246ZWFzZS1pbjt0cmFuc2l0aW9uLXRpbWluZy1mdW5jdGlvbjplYXNlLWlufTYwJXstd2Via2l0LXRyYW5zZm9ybTpwZXJzcGVjdGl2ZSg0MDBweCkgcm90YXRlM2QoMCwxLDAsMTBkZWcpO3RyYW5zZm9ybTpwZXJzcGVjdGl2ZSg0MDBweCkgcm90YXRlM2QoMCwxLDAsMTBkZWcpO29wYWNpdHk6MX04MCV7LXdlYmtpdC10cmFuc2Zvcm06cGVyc3BlY3RpdmUoNDAwcHgpIHJvdGF0ZTNkKDAsMSwwLC01ZGVnKTt0cmFuc2Zvcm06cGVyc3BlY3RpdmUoNDAwcHgpIHJvdGF0ZTNkKDAsMSwwLC01ZGVnKX0xMDAley13ZWJraXQtdHJhbnNmb3JtOnBlcnNwZWN0aXZlKDQwMHB4KTt0cmFuc2Zvcm06cGVyc3BlY3RpdmUoNDAwcHgpfX0uZmxpcEluWXstd2Via2l0LWJhY2tmYWNlLXZpc2liaWxpdHk6dmlzaWJsZSFpbXBvcnRhbnQ7YmFja2ZhY2UtdmlzaWJpbGl0eTp2aXNpYmxlIWltcG9ydGFudDstd2Via2l0LWFuaW1hdGlvbi1uYW1lOmZsaXBJblk7YW5pbWF0aW9uLW5hbWU6ZmxpcEluWX1ALXdlYmtpdC1rZXlmcmFtZXMgZmxpcE91dFh7MCV7LXdlYmtpdC10cmFuc2Zvcm06cGVyc3BlY3RpdmUoNDAwcHgpO3RyYW5zZm9ybTpwZXJzcGVjdGl2ZSg0MDBweCl9MzAley13ZWJraXQtdHJhbnNmb3JtOnBlcnNwZWN0aXZlKDQwMHB4KSByb3RhdGUzZCgxLDAsMCwtMjBkZWcpO3RyYW5zZm9ybTpwZXJzcGVjdGl2ZSg0MDBweCkgcm90YXRlM2QoMSwwLDAsLTIwZGVnKTtvcGFjaXR5OjF9MTAwJXstd2Via2l0LXRyYW5zZm9ybTpwZXJzcGVjdGl2ZSg0MDBweCkgcm90YXRlM2QoMSwwLDAsOTBkZWcpO3RyYW5zZm9ybTpwZXJzcGVjdGl2ZSg0MDBweCkgcm90YXRlM2QoMSwwLDAsOTBkZWcpO29wYWNpdHk6MH19QGtleWZyYW1lcyBmbGlwT3V0WHswJXstd2Via2l0LXRyYW5zZm9ybTpwZXJzcGVjdGl2ZSg0MDBweCk7dHJhbnNmb3JtOnBlcnNwZWN0aXZlKDQwMHB4KX0zMCV7LXdlYmtpdC10cmFuc2Zvcm06cGVyc3BlY3RpdmUoNDAwcHgpIHJvdGF0ZTNkKDEsMCwwLC0yMGRlZyk7dHJhbnNmb3JtOnBlcnNwZWN0aXZlKDQwMHB4KSByb3RhdGUzZCgxLDAsMCwtMjBkZWcpO29wYWNpdHk6MX0xMDAley13ZWJraXQtdHJhbnNmb3JtOnBlcnNwZWN0aXZlKDQwMHB4KSByb3RhdGUzZCgxLDAsMCw5MGRlZyk7dHJhbnNmb3JtOnBlcnNwZWN0aXZlKDQwMHB4KSByb3RhdGUzZCgxLDAsMCw5MGRlZyk7b3BhY2l0eTowfX0uZmxpcE91dFh7LXdlYmtpdC1hbmltYXRpb24tbmFtZTpmbGlwT3V0WDthbmltYXRpb24tbmFtZTpmbGlwT3V0WDstd2Via2l0LWFuaW1hdGlvbi1kdXJhdGlvbjouNzVzO2FuaW1hdGlvbi1kdXJhdGlvbjouNzVzOy13ZWJraXQtYmFja2ZhY2UtdmlzaWJpbGl0eTp2aXNpYmxlIWltcG9ydGFudDtiYWNrZmFjZS12aXNpYmlsaXR5OnZpc2libGUhaW1wb3J0YW50fUAtd2Via2l0LWtleWZyYW1lcyBmbGlwT3V0WXswJXstd2Via2l0LXRyYW5zZm9ybTpwZXJzcGVjdGl2ZSg0MDBweCk7dHJhbnNmb3JtOnBlcnNwZWN0aXZlKDQwMHB4KX0zMCV7LXdlYmtpdC10cmFuc2Zvcm06cGVyc3BlY3RpdmUoNDAwcHgpIHJvdGF0ZTNkKDAsMSwwLC0xNWRlZyk7dHJhbnNmb3JtOnBlcnNwZWN0aXZlKDQwMHB4KSByb3RhdGUzZCgwLDEsMCwtMTVkZWcpO29wYWNpdHk6MX0xMDAley13ZWJraXQtdHJhbnNmb3JtOnBlcnNwZWN0aXZlKDQwMHB4KSByb3RhdGUzZCgwLDEsMCw5MGRlZyk7dHJhbnNmb3JtOnBlcnNwZWN0aXZlKDQwMHB4KSByb3RhdGUzZCgwLDEsMCw5MGRlZyk7b3BhY2l0eTowfX1Aa2V5ZnJhbWVzIGZsaXBPdXRZezAley13ZWJraXQtdHJhbnNmb3JtOnBlcnNwZWN0aXZlKDQwMHB4KTt0cmFuc2Zvcm06cGVyc3BlY3RpdmUoNDAwcHgpfTMwJXstd2Via2l0LXRyYW5zZm9ybTpwZXJzcGVjdGl2ZSg0MDBweCkgcm90YXRlM2QoMCwxLDAsLTE1ZGVnKTt0cmFuc2Zvcm06cGVyc3BlY3RpdmUoNDAwcHgpIHJvdGF0ZTNkKDAsMSwwLC0xNWRlZyk7b3BhY2l0eToxfTEwMCV7LXdlYmtpdC10cmFuc2Zvcm06cGVyc3BlY3RpdmUoNDAwcHgpIHJvdGF0ZTNkKDAsMSwwLDkwZGVnKTt0cmFuc2Zvcm06cGVyc3BlY3RpdmUoNDAwcHgpIHJvdGF0ZTNkKDAsMSwwLDkwZGVnKTtvcGFjaXR5OjB9fS5mbGlwT3V0WXstd2Via2l0LWJhY2tmYWNlLXZpc2liaWxpdHk6dmlzaWJsZSFpbXBvcnRhbnQ7YmFja2ZhY2UtdmlzaWJpbGl0eTp2aXNpYmxlIWltcG9ydGFudDstd2Via2l0LWFuaW1hdGlvbi1uYW1lOmZsaXBPdXRZO2FuaW1hdGlvbi1uYW1lOmZsaXBPdXRZOy13ZWJraXQtYW5pbWF0aW9uLWR1cmF0aW9uOi43NXM7YW5pbWF0aW9uLWR1cmF0aW9uOi43NXN9QC13ZWJraXQta2V5ZnJhbWVzIGxpZ2h0U3BlZWRJbnswJXstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgxMDAlLDAsMCkgc2tld1goLTMwZGVnKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoMTAwJSwwLDApIHNrZXdYKC0zMGRlZyk7b3BhY2l0eTowfTYwJXstd2Via2l0LXRyYW5zZm9ybTpza2V3WCgyMGRlZyk7dHJhbnNmb3JtOnNrZXdYKDIwZGVnKTtvcGFjaXR5OjF9ODAley13ZWJraXQtdHJhbnNmb3JtOnNrZXdYKC01ZGVnKTt0cmFuc2Zvcm06c2tld1goLTVkZWcpO29wYWNpdHk6MX0xMDAley13ZWJraXQtdHJhbnNmb3JtOm5vbmU7dHJhbnNmb3JtOm5vbmU7b3BhY2l0eToxfX1Aa2V5ZnJhbWVzIGxpZ2h0U3BlZWRJbnswJXstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgxMDAlLDAsMCkgc2tld1goLTMwZGVnKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoMTAwJSwwLDApIHNrZXdYKC0zMGRlZyk7b3BhY2l0eTowfTYwJXstd2Via2l0LXRyYW5zZm9ybTpza2V3WCgyMGRlZyk7dHJhbnNmb3JtOnNrZXdYKDIwZGVnKTtvcGFjaXR5OjF9ODAley13ZWJraXQtdHJhbnNmb3JtOnNrZXdYKC01ZGVnKTt0cmFuc2Zvcm06c2tld1goLTVkZWcpO29wYWNpdHk6MX0xMDAley13ZWJraXQtdHJhbnNmb3JtOm5vbmU7dHJhbnNmb3JtOm5vbmU7b3BhY2l0eToxfX0ubGlnaHRTcGVlZEluey13ZWJraXQtYW5pbWF0aW9uLW5hbWU6bGlnaHRTcGVlZEluO2FuaW1hdGlvbi1uYW1lOmxpZ2h0U3BlZWRJbjstd2Via2l0LWFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246ZWFzZS1vdXQ7YW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjplYXNlLW91dH1ALXdlYmtpdC1rZXlmcmFtZXMgbGlnaHRTcGVlZE91dHswJXtvcGFjaXR5OjF9MTAwJXstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgxMDAlLDAsMCkgc2tld1goMzBkZWcpO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgxMDAlLDAsMCkgc2tld1goMzBkZWcpO29wYWNpdHk6MH19QGtleWZyYW1lcyBsaWdodFNwZWVkT3V0ezAle29wYWNpdHk6MX0xMDAley13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDEwMCUsMCwwKSBza2V3WCgzMGRlZyk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDEwMCUsMCwwKSBza2V3WCgzMGRlZyk7b3BhY2l0eTowfX0ubGlnaHRTcGVlZE91dHstd2Via2l0LWFuaW1hdGlvbi1uYW1lOmxpZ2h0U3BlZWRPdXQ7YW5pbWF0aW9uLW5hbWU6bGlnaHRTcGVlZE91dDstd2Via2l0LWFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246ZWFzZS1pbjthbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOmVhc2UtaW59QC13ZWJraXQta2V5ZnJhbWVzIHJvdGF0ZUluezAley13ZWJraXQtdHJhbnNmb3JtLW9yaWdpbjpjZW50ZXI7dHJhbnNmb3JtLW9yaWdpbjpjZW50ZXI7LXdlYmtpdC10cmFuc2Zvcm06cm90YXRlM2QoMCwwLDEsLTIwMGRlZyk7dHJhbnNmb3JtOnJvdGF0ZTNkKDAsMCwxLC0yMDBkZWcpO29wYWNpdHk6MH0xMDAley13ZWJraXQtdHJhbnNmb3JtLW9yaWdpbjpjZW50ZXI7dHJhbnNmb3JtLW9yaWdpbjpjZW50ZXI7LXdlYmtpdC10cmFuc2Zvcm06bm9uZTt0cmFuc2Zvcm06bm9uZTtvcGFjaXR5OjF9fUBrZXlmcmFtZXMgcm90YXRlSW57MCV7LXdlYmtpdC10cmFuc2Zvcm0tb3JpZ2luOmNlbnRlcjt0cmFuc2Zvcm0tb3JpZ2luOmNlbnRlcjstd2Via2l0LXRyYW5zZm9ybTpyb3RhdGUzZCgwLDAsMSwtMjAwZGVnKTt0cmFuc2Zvcm06cm90YXRlM2QoMCwwLDEsLTIwMGRlZyk7b3BhY2l0eTowfTEwMCV7LXdlYmtpdC10cmFuc2Zvcm0tb3JpZ2luOmNlbnRlcjt0cmFuc2Zvcm0tb3JpZ2luOmNlbnRlcjstd2Via2l0LXRyYW5zZm9ybTpub25lO3RyYW5zZm9ybTpub25lO29wYWNpdHk6MX19LnJvdGF0ZUluey13ZWJraXQtYW5pbWF0aW9uLW5hbWU6cm90YXRlSW47YW5pbWF0aW9uLW5hbWU6cm90YXRlSW59QC13ZWJraXQta2V5ZnJhbWVzIHJvdGF0ZUluRG93bkxlZnR7MCV7LXdlYmtpdC10cmFuc2Zvcm0tb3JpZ2luOmxlZnQgYm90dG9tO3RyYW5zZm9ybS1vcmlnaW46bGVmdCBib3R0b207LXdlYmtpdC10cmFuc2Zvcm06cm90YXRlM2QoMCwwLDEsLTQ1ZGVnKTt0cmFuc2Zvcm06cm90YXRlM2QoMCwwLDEsLTQ1ZGVnKTtvcGFjaXR5OjB9MTAwJXstd2Via2l0LXRyYW5zZm9ybS1vcmlnaW46bGVmdCBib3R0b207dHJhbnNmb3JtLW9yaWdpbjpsZWZ0IGJvdHRvbTstd2Via2l0LXRyYW5zZm9ybTpub25lO3RyYW5zZm9ybTpub25lO29wYWNpdHk6MX19QGtleWZyYW1lcyByb3RhdGVJbkRvd25MZWZ0ezAley13ZWJraXQtdHJhbnNmb3JtLW9yaWdpbjpsZWZ0IGJvdHRvbTt0cmFuc2Zvcm0tb3JpZ2luOmxlZnQgYm90dG9tOy13ZWJraXQtdHJhbnNmb3JtOnJvdGF0ZTNkKDAsMCwxLC00NWRlZyk7dHJhbnNmb3JtOnJvdGF0ZTNkKDAsMCwxLC00NWRlZyk7b3BhY2l0eTowfTEwMCV7LXdlYmtpdC10cmFuc2Zvcm0tb3JpZ2luOmxlZnQgYm90dG9tO3RyYW5zZm9ybS1vcmlnaW46bGVmdCBib3R0b207LXdlYmtpdC10cmFuc2Zvcm06bm9uZTt0cmFuc2Zvcm06bm9uZTtvcGFjaXR5OjF9fS5yb3RhdGVJbkRvd25MZWZ0ey13ZWJraXQtYW5pbWF0aW9uLW5hbWU6cm90YXRlSW5Eb3duTGVmdDthbmltYXRpb24tbmFtZTpyb3RhdGVJbkRvd25MZWZ0fUAtd2Via2l0LWtleWZyYW1lcyByb3RhdGVJbkRvd25SaWdodHswJXstd2Via2l0LXRyYW5zZm9ybS1vcmlnaW46cmlnaHQgYm90dG9tO3RyYW5zZm9ybS1vcmlnaW46cmlnaHQgYm90dG9tOy13ZWJraXQtdHJhbnNmb3JtOnJvdGF0ZTNkKDAsMCwxLDQ1ZGVnKTt0cmFuc2Zvcm06cm90YXRlM2QoMCwwLDEsNDVkZWcpO29wYWNpdHk6MH0xMDAley13ZWJraXQtdHJhbnNmb3JtLW9yaWdpbjpyaWdodCBib3R0b207dHJhbnNmb3JtLW9yaWdpbjpyaWdodCBib3R0b207LXdlYmtpdC10cmFuc2Zvcm06bm9uZTt0cmFuc2Zvcm06bm9uZTtvcGFjaXR5OjF9fUBrZXlmcmFtZXMgcm90YXRlSW5Eb3duUmlnaHR7MCV7LXdlYmtpdC10cmFuc2Zvcm0tb3JpZ2luOnJpZ2h0IGJvdHRvbTt0cmFuc2Zvcm0tb3JpZ2luOnJpZ2h0IGJvdHRvbTstd2Via2l0LXRyYW5zZm9ybTpyb3RhdGUzZCgwLDAsMSw0NWRlZyk7dHJhbnNmb3JtOnJvdGF0ZTNkKDAsMCwxLDQ1ZGVnKTtvcGFjaXR5OjB9MTAwJXstd2Via2l0LXRyYW5zZm9ybS1vcmlnaW46cmlnaHQgYm90dG9tO3RyYW5zZm9ybS1vcmlnaW46cmlnaHQgYm90dG9tOy13ZWJraXQtdHJhbnNmb3JtOm5vbmU7dHJhbnNmb3JtOm5vbmU7b3BhY2l0eToxfX0ucm90YXRlSW5Eb3duUmlnaHR7LXdlYmtpdC1hbmltYXRpb24tbmFtZTpyb3RhdGVJbkRvd25SaWdodDthbmltYXRpb24tbmFtZTpyb3RhdGVJbkRvd25SaWdodH1ALXdlYmtpdC1rZXlmcmFtZXMgcm90YXRlSW5VcExlZnR7MCV7LXdlYmtpdC10cmFuc2Zvcm0tb3JpZ2luOmxlZnQgYm90dG9tO3RyYW5zZm9ybS1vcmlnaW46bGVmdCBib3R0b207LXdlYmtpdC10cmFuc2Zvcm06cm90YXRlM2QoMCwwLDEsNDVkZWcpO3RyYW5zZm9ybTpyb3RhdGUzZCgwLDAsMSw0NWRlZyk7b3BhY2l0eTowfTEwMCV7LXdlYmtpdC10cmFuc2Zvcm0tb3JpZ2luOmxlZnQgYm90dG9tO3RyYW5zZm9ybS1vcmlnaW46bGVmdCBib3R0b207LXdlYmtpdC10cmFuc2Zvcm06bm9uZTt0cmFuc2Zvcm06bm9uZTtvcGFjaXR5OjF9fUBrZXlmcmFtZXMgcm90YXRlSW5VcExlZnR7MCV7LXdlYmtpdC10cmFuc2Zvcm0tb3JpZ2luOmxlZnQgYm90dG9tO3RyYW5zZm9ybS1vcmlnaW46bGVmdCBib3R0b207LXdlYmtpdC10cmFuc2Zvcm06cm90YXRlM2QoMCwwLDEsNDVkZWcpO3RyYW5zZm9ybTpyb3RhdGUzZCgwLDAsMSw0NWRlZyk7b3BhY2l0eTowfTEwMCV7LXdlYmtpdC10cmFuc2Zvcm0tb3JpZ2luOmxlZnQgYm90dG9tO3RyYW5zZm9ybS1vcmlnaW46bGVmdCBib3R0b207LXdlYmtpdC10cmFuc2Zvcm06bm9uZTt0cmFuc2Zvcm06bm9uZTtvcGFjaXR5OjF9fS5yb3RhdGVJblVwTGVmdHstd2Via2l0LWFuaW1hdGlvbi1uYW1lOnJvdGF0ZUluVXBMZWZ0O2FuaW1hdGlvbi1uYW1lOnJvdGF0ZUluVXBMZWZ0fUAtd2Via2l0LWtleWZyYW1lcyByb3RhdGVJblVwUmlnaHR7MCV7LXdlYmtpdC10cmFuc2Zvcm0tb3JpZ2luOnJpZ2h0IGJvdHRvbTt0cmFuc2Zvcm0tb3JpZ2luOnJpZ2h0IGJvdHRvbTstd2Via2l0LXRyYW5zZm9ybTpyb3RhdGUzZCgwLDAsMSwtOTBkZWcpO3RyYW5zZm9ybTpyb3RhdGUzZCgwLDAsMSwtOTBkZWcpO29wYWNpdHk6MH0xMDAley13ZWJraXQtdHJhbnNmb3JtLW9yaWdpbjpyaWdodCBib3R0b207dHJhbnNmb3JtLW9yaWdpbjpyaWdodCBib3R0b207LXdlYmtpdC10cmFuc2Zvcm06bm9uZTt0cmFuc2Zvcm06bm9uZTtvcGFjaXR5OjF9fUBrZXlmcmFtZXMgcm90YXRlSW5VcFJpZ2h0ezAley13ZWJraXQtdHJhbnNmb3JtLW9yaWdpbjpyaWdodCBib3R0b207dHJhbnNmb3JtLW9yaWdpbjpyaWdodCBib3R0b207LXdlYmtpdC10cmFuc2Zvcm06cm90YXRlM2QoMCwwLDEsLTkwZGVnKTt0cmFuc2Zvcm06cm90YXRlM2QoMCwwLDEsLTkwZGVnKTtvcGFjaXR5OjB9MTAwJXstd2Via2l0LXRyYW5zZm9ybS1vcmlnaW46cmlnaHQgYm90dG9tO3RyYW5zZm9ybS1vcmlnaW46cmlnaHQgYm90dG9tOy13ZWJraXQtdHJhbnNmb3JtOm5vbmU7dHJhbnNmb3JtOm5vbmU7b3BhY2l0eToxfX0ucm90YXRlSW5VcFJpZ2h0ey13ZWJraXQtYW5pbWF0aW9uLW5hbWU6cm90YXRlSW5VcFJpZ2h0O2FuaW1hdGlvbi1uYW1lOnJvdGF0ZUluVXBSaWdodH1ALXdlYmtpdC1rZXlmcmFtZXMgcm90YXRlT3V0ezAley13ZWJraXQtdHJhbnNmb3JtLW9yaWdpbjpjZW50ZXI7dHJhbnNmb3JtLW9yaWdpbjpjZW50ZXI7b3BhY2l0eToxfTEwMCV7LXdlYmtpdC10cmFuc2Zvcm0tb3JpZ2luOmNlbnRlcjt0cmFuc2Zvcm0tb3JpZ2luOmNlbnRlcjstd2Via2l0LXRyYW5zZm9ybTpyb3RhdGUzZCgwLDAsMSwyMDBkZWcpO3RyYW5zZm9ybTpyb3RhdGUzZCgwLDAsMSwyMDBkZWcpO29wYWNpdHk6MH19QGtleWZyYW1lcyByb3RhdGVPdXR7MCV7LXdlYmtpdC10cmFuc2Zvcm0tb3JpZ2luOmNlbnRlcjt0cmFuc2Zvcm0tb3JpZ2luOmNlbnRlcjtvcGFjaXR5OjF9MTAwJXstd2Via2l0LXRyYW5zZm9ybS1vcmlnaW46Y2VudGVyO3RyYW5zZm9ybS1vcmlnaW46Y2VudGVyOy13ZWJraXQtdHJhbnNmb3JtOnJvdGF0ZTNkKDAsMCwxLDIwMGRlZyk7dHJhbnNmb3JtOnJvdGF0ZTNkKDAsMCwxLDIwMGRlZyk7b3BhY2l0eTowfX0ucm90YXRlT3V0ey13ZWJraXQtYW5pbWF0aW9uLW5hbWU6cm90YXRlT3V0O2FuaW1hdGlvbi1uYW1lOnJvdGF0ZU91dH1ALXdlYmtpdC1rZXlmcmFtZXMgcm90YXRlT3V0RG93bkxlZnR7MCV7LXdlYmtpdC10cmFuc2Zvcm0tb3JpZ2luOmxlZnQgYm90dG9tO3RyYW5zZm9ybS1vcmlnaW46bGVmdCBib3R0b207b3BhY2l0eToxfTEwMCV7LXdlYmtpdC10cmFuc2Zvcm0tb3JpZ2luOmxlZnQgYm90dG9tO3RyYW5zZm9ybS1vcmlnaW46bGVmdCBib3R0b207LXdlYmtpdC10cmFuc2Zvcm06cm90YXRlM2QoMCwwLDEsNDVkZWcpO3RyYW5zZm9ybTpyb3RhdGUzZCgwLDAsMSw0NWRlZyk7b3BhY2l0eTowfX1Aa2V5ZnJhbWVzIHJvdGF0ZU91dERvd25MZWZ0ezAley13ZWJraXQtdHJhbnNmb3JtLW9yaWdpbjpsZWZ0IGJvdHRvbTt0cmFuc2Zvcm0tb3JpZ2luOmxlZnQgYm90dG9tO29wYWNpdHk6MX0xMDAley13ZWJraXQtdHJhbnNmb3JtLW9yaWdpbjpsZWZ0IGJvdHRvbTt0cmFuc2Zvcm0tb3JpZ2luOmxlZnQgYm90dG9tOy13ZWJraXQtdHJhbnNmb3JtOnJvdGF0ZTNkKDAsMCwxLDQ1ZGVnKTt0cmFuc2Zvcm06cm90YXRlM2QoMCwwLDEsNDVkZWcpO29wYWNpdHk6MH19LnJvdGF0ZU91dERvd25MZWZ0ey13ZWJraXQtYW5pbWF0aW9uLW5hbWU6cm90YXRlT3V0RG93bkxlZnQ7YW5pbWF0aW9uLW5hbWU6cm90YXRlT3V0RG93bkxlZnR9QC13ZWJraXQta2V5ZnJhbWVzIHJvdGF0ZU91dERvd25SaWdodHswJXstd2Via2l0LXRyYW5zZm9ybS1vcmlnaW46cmlnaHQgYm90dG9tO3RyYW5zZm9ybS1vcmlnaW46cmlnaHQgYm90dG9tO29wYWNpdHk6MX0xMDAley13ZWJraXQtdHJhbnNmb3JtLW9yaWdpbjpyaWdodCBib3R0b207dHJhbnNmb3JtLW9yaWdpbjpyaWdodCBib3R0b207LXdlYmtpdC10cmFuc2Zvcm06cm90YXRlM2QoMCwwLDEsLTQ1ZGVnKTt0cmFuc2Zvcm06cm90YXRlM2QoMCwwLDEsLTQ1ZGVnKTtvcGFjaXR5OjB9fUBrZXlmcmFtZXMgcm90YXRlT3V0RG93blJpZ2h0ezAley13ZWJraXQtdHJhbnNmb3JtLW9yaWdpbjpyaWdodCBib3R0b207dHJhbnNmb3JtLW9yaWdpbjpyaWdodCBib3R0b207b3BhY2l0eToxfTEwMCV7LXdlYmtpdC10cmFuc2Zvcm0tb3JpZ2luOnJpZ2h0IGJvdHRvbTt0cmFuc2Zvcm0tb3JpZ2luOnJpZ2h0IGJvdHRvbTstd2Via2l0LXRyYW5zZm9ybTpyb3RhdGUzZCgwLDAsMSwtNDVkZWcpO3RyYW5zZm9ybTpyb3RhdGUzZCgwLDAsMSwtNDVkZWcpO29wYWNpdHk6MH19LnJvdGF0ZU91dERvd25SaWdodHstd2Via2l0LWFuaW1hdGlvbi1uYW1lOnJvdGF0ZU91dERvd25SaWdodDthbmltYXRpb24tbmFtZTpyb3RhdGVPdXREb3duUmlnaHR9QC13ZWJraXQta2V5ZnJhbWVzIHJvdGF0ZU91dFVwTGVmdHswJXstd2Via2l0LXRyYW5zZm9ybS1vcmlnaW46bGVmdCBib3R0b207dHJhbnNmb3JtLW9yaWdpbjpsZWZ0IGJvdHRvbTtvcGFjaXR5OjF9MTAwJXstd2Via2l0LXRyYW5zZm9ybS1vcmlnaW46bGVmdCBib3R0b207dHJhbnNmb3JtLW9yaWdpbjpsZWZ0IGJvdHRvbTstd2Via2l0LXRyYW5zZm9ybTpyb3RhdGUzZCgwLDAsMSwtNDVkZWcpO3RyYW5zZm9ybTpyb3RhdGUzZCgwLDAsMSwtNDVkZWcpO29wYWNpdHk6MH19QGtleWZyYW1lcyByb3RhdGVPdXRVcExlZnR7MCV7LXdlYmtpdC10cmFuc2Zvcm0tb3JpZ2luOmxlZnQgYm90dG9tO3RyYW5zZm9ybS1vcmlnaW46bGVmdCBib3R0b207b3BhY2l0eToxfTEwMCV7LXdlYmtpdC10cmFuc2Zvcm0tb3JpZ2luOmxlZnQgYm90dG9tO3RyYW5zZm9ybS1vcmlnaW46bGVmdCBib3R0b207LXdlYmtpdC10cmFuc2Zvcm06cm90YXRlM2QoMCwwLDEsLTQ1ZGVnKTt0cmFuc2Zvcm06cm90YXRlM2QoMCwwLDEsLTQ1ZGVnKTtvcGFjaXR5OjB9fS5yb3RhdGVPdXRVcExlZnR7LXdlYmtpdC1hbmltYXRpb24tbmFtZTpyb3RhdGVPdXRVcExlZnQ7YW5pbWF0aW9uLW5hbWU6cm90YXRlT3V0VXBMZWZ0fUAtd2Via2l0LWtleWZyYW1lcyByb3RhdGVPdXRVcFJpZ2h0ezAley13ZWJraXQtdHJhbnNmb3JtLW9yaWdpbjpyaWdodCBib3R0b207dHJhbnNmb3JtLW9yaWdpbjpyaWdodCBib3R0b207b3BhY2l0eToxfTEwMCV7LXdlYmtpdC10cmFuc2Zvcm0tb3JpZ2luOnJpZ2h0IGJvdHRvbTt0cmFuc2Zvcm0tb3JpZ2luOnJpZ2h0IGJvdHRvbTstd2Via2l0LXRyYW5zZm9ybTpyb3RhdGUzZCgwLDAsMSw5MGRlZyk7dHJhbnNmb3JtOnJvdGF0ZTNkKDAsMCwxLDkwZGVnKTtvcGFjaXR5OjB9fUBrZXlmcmFtZXMgcm90YXRlT3V0VXBSaWdodHswJXstd2Via2l0LXRyYW5zZm9ybS1vcmlnaW46cmlnaHQgYm90dG9tO3RyYW5zZm9ybS1vcmlnaW46cmlnaHQgYm90dG9tO29wYWNpdHk6MX0xMDAley13ZWJraXQtdHJhbnNmb3JtLW9yaWdpbjpyaWdodCBib3R0b207dHJhbnNmb3JtLW9yaWdpbjpyaWdodCBib3R0b207LXdlYmtpdC10cmFuc2Zvcm06cm90YXRlM2QoMCwwLDEsOTBkZWcpO3RyYW5zZm9ybTpyb3RhdGUzZCgwLDAsMSw5MGRlZyk7b3BhY2l0eTowfX0ucm90YXRlT3V0VXBSaWdodHstd2Via2l0LWFuaW1hdGlvbi1uYW1lOnJvdGF0ZU91dFVwUmlnaHQ7YW5pbWF0aW9uLW5hbWU6cm90YXRlT3V0VXBSaWdodH1ALXdlYmtpdC1rZXlmcmFtZXMgaGluZ2V7MCV7LXdlYmtpdC10cmFuc2Zvcm0tb3JpZ2luOnRvcCBsZWZ0O3RyYW5zZm9ybS1vcmlnaW46dG9wIGxlZnQ7LXdlYmtpdC1hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOmVhc2UtaW4tb3V0O2FuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246ZWFzZS1pbi1vdXR9MjAlLDYwJXstd2Via2l0LXRyYW5zZm9ybTpyb3RhdGUzZCgwLDAsMSw4MGRlZyk7dHJhbnNmb3JtOnJvdGF0ZTNkKDAsMCwxLDgwZGVnKTstd2Via2l0LXRyYW5zZm9ybS1vcmlnaW46dG9wIGxlZnQ7dHJhbnNmb3JtLW9yaWdpbjp0b3AgbGVmdDstd2Via2l0LWFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246ZWFzZS1pbi1vdXQ7YW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjplYXNlLWluLW91dH00MCUsODAley13ZWJraXQtdHJhbnNmb3JtOnJvdGF0ZTNkKDAsMCwxLDYwZGVnKTt0cmFuc2Zvcm06cm90YXRlM2QoMCwwLDEsNjBkZWcpOy13ZWJraXQtdHJhbnNmb3JtLW9yaWdpbjp0b3AgbGVmdDt0cmFuc2Zvcm0tb3JpZ2luOnRvcCBsZWZ0Oy13ZWJraXQtYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjplYXNlLWluLW91dDthbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOmVhc2UtaW4tb3V0O29wYWNpdHk6MX0xMDAley13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsNzAwcHgsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsNzAwcHgsMCk7b3BhY2l0eTowfX1Aa2V5ZnJhbWVzIGhpbmdlezAley13ZWJraXQtdHJhbnNmb3JtLW9yaWdpbjp0b3AgbGVmdDt0cmFuc2Zvcm0tb3JpZ2luOnRvcCBsZWZ0Oy13ZWJraXQtYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjplYXNlLWluLW91dDthbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOmVhc2UtaW4tb3V0fTIwJSw2MCV7LXdlYmtpdC10cmFuc2Zvcm06cm90YXRlM2QoMCwwLDEsODBkZWcpO3RyYW5zZm9ybTpyb3RhdGUzZCgwLDAsMSw4MGRlZyk7LXdlYmtpdC10cmFuc2Zvcm0tb3JpZ2luOnRvcCBsZWZ0O3RyYW5zZm9ybS1vcmlnaW46dG9wIGxlZnQ7LXdlYmtpdC1hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOmVhc2UtaW4tb3V0O2FuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246ZWFzZS1pbi1vdXR9NDAlLDgwJXstd2Via2l0LXRyYW5zZm9ybTpyb3RhdGUzZCgwLDAsMSw2MGRlZyk7dHJhbnNmb3JtOnJvdGF0ZTNkKDAsMCwxLDYwZGVnKTstd2Via2l0LXRyYW5zZm9ybS1vcmlnaW46dG9wIGxlZnQ7dHJhbnNmb3JtLW9yaWdpbjp0b3AgbGVmdDstd2Via2l0LWFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246ZWFzZS1pbi1vdXQ7YW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjplYXNlLWluLW91dDtvcGFjaXR5OjF9MTAwJXstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLDcwMHB4LDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLDcwMHB4LDApO29wYWNpdHk6MH19Lmhpbmdley13ZWJraXQtYW5pbWF0aW9uLW5hbWU6aGluZ2U7YW5pbWF0aW9uLW5hbWU6aGluZ2V9QC13ZWJraXQta2V5ZnJhbWVzIHJvbGxJbnswJXtvcGFjaXR5OjA7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoLTEwMCUsMCwwKSByb3RhdGUzZCgwLDAsMSwtMTIwZGVnKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoLTEwMCUsMCwwKSByb3RhdGUzZCgwLDAsMSwtMTIwZGVnKX0xMDAle29wYWNpdHk6MTstd2Via2l0LXRyYW5zZm9ybTpub25lO3RyYW5zZm9ybTpub25lfX1Aa2V5ZnJhbWVzIHJvbGxJbnswJXtvcGFjaXR5OjA7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoLTEwMCUsMCwwKSByb3RhdGUzZCgwLDAsMSwtMTIwZGVnKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoLTEwMCUsMCwwKSByb3RhdGUzZCgwLDAsMSwtMTIwZGVnKX0xMDAle29wYWNpdHk6MTstd2Via2l0LXRyYW5zZm9ybTpub25lO3RyYW5zZm9ybTpub25lfX0ucm9sbEluey13ZWJraXQtYW5pbWF0aW9uLW5hbWU6cm9sbEluO2FuaW1hdGlvbi1uYW1lOnJvbGxJbn1ALXdlYmtpdC1rZXlmcmFtZXMgcm9sbE91dHswJXtvcGFjaXR5OjF9MTAwJXtvcGFjaXR5OjA7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoMTAwJSwwLDApIHJvdGF0ZTNkKDAsMCwxLDEyMGRlZyk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDEwMCUsMCwwKSByb3RhdGUzZCgwLDAsMSwxMjBkZWcpfX1Aa2V5ZnJhbWVzIHJvbGxPdXR7MCV7b3BhY2l0eToxfTEwMCV7b3BhY2l0eTowOy13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDEwMCUsMCwwKSByb3RhdGUzZCgwLDAsMSwxMjBkZWcpO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgxMDAlLDAsMCkgcm90YXRlM2QoMCwwLDEsMTIwZGVnKX19LnJvbGxPdXR7LXdlYmtpdC1hbmltYXRpb24tbmFtZTpyb2xsT3V0O2FuaW1hdGlvbi1uYW1lOnJvbGxPdXR9QC13ZWJraXQta2V5ZnJhbWVzIHpvb21JbnswJXtvcGFjaXR5OjA7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGUzZCguMywuMywuMyk7dHJhbnNmb3JtOnNjYWxlM2QoLjMsLjMsLjMpfTUwJXtvcGFjaXR5OjF9fUBrZXlmcmFtZXMgem9vbUluezAle29wYWNpdHk6MDstd2Via2l0LXRyYW5zZm9ybTpzY2FsZTNkKC4zLC4zLC4zKTt0cmFuc2Zvcm06c2NhbGUzZCguMywuMywuMyl9NTAle29wYWNpdHk6MX19Lnpvb21Jbnstd2Via2l0LWFuaW1hdGlvbi1uYW1lOnpvb21JbjthbmltYXRpb24tbmFtZTp6b29tSW59QC13ZWJraXQta2V5ZnJhbWVzIHpvb21JbkRvd257MCV7b3BhY2l0eTowOy13ZWJraXQtdHJhbnNmb3JtOnNjYWxlM2QoLjEsLjEsLjEpIHRyYW5zbGF0ZTNkKDAsLTEwMDBweCwwKTt0cmFuc2Zvcm06c2NhbGUzZCguMSwuMSwuMSkgdHJhbnNsYXRlM2QoMCwtMTAwMHB4LDApOy13ZWJraXQtYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjpjdWJpYy1iZXppZXIoMC41NSwuMDU1LC42NzUsLjE5KTthbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOmN1YmljLWJlemllcigwLjU1LC4wNTUsLjY3NSwuMTkpfTYwJXtvcGFjaXR5OjE7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGUzZCguNDc1LC40NzUsLjQ3NSkgdHJhbnNsYXRlM2QoMCw2MHB4LDApO3RyYW5zZm9ybTpzY2FsZTNkKC40NzUsLjQ3NSwuNDc1KSB0cmFuc2xhdGUzZCgwLDYwcHgsMCk7LXdlYmtpdC1hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOmN1YmljLWJlemllcigwLjE3NSwuODg1LC4zMiwxKTthbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOmN1YmljLWJlemllcigwLjE3NSwuODg1LC4zMiwxKX19QGtleWZyYW1lcyB6b29tSW5Eb3duezAle29wYWNpdHk6MDstd2Via2l0LXRyYW5zZm9ybTpzY2FsZTNkKC4xLC4xLC4xKSB0cmFuc2xhdGUzZCgwLC0xMDAwcHgsMCk7dHJhbnNmb3JtOnNjYWxlM2QoLjEsLjEsLjEpIHRyYW5zbGF0ZTNkKDAsLTEwMDBweCwwKTstd2Via2l0LWFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246Y3ViaWMtYmV6aWVyKDAuNTUsLjA1NSwuNjc1LC4xOSk7YW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjpjdWJpYy1iZXppZXIoMC41NSwuMDU1LC42NzUsLjE5KX02MCV7b3BhY2l0eToxOy13ZWJraXQtdHJhbnNmb3JtOnNjYWxlM2QoLjQ3NSwuNDc1LC40NzUpIHRyYW5zbGF0ZTNkKDAsNjBweCwwKTt0cmFuc2Zvcm06c2NhbGUzZCguNDc1LC40NzUsLjQ3NSkgdHJhbnNsYXRlM2QoMCw2MHB4LDApOy13ZWJraXQtYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjpjdWJpYy1iZXppZXIoMC4xNzUsLjg4NSwuMzIsMSk7YW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjpjdWJpYy1iZXppZXIoMC4xNzUsLjg4NSwuMzIsMSl9fS56b29tSW5Eb3duey13ZWJraXQtYW5pbWF0aW9uLW5hbWU6em9vbUluRG93bjthbmltYXRpb24tbmFtZTp6b29tSW5Eb3dufUAtd2Via2l0LWtleWZyYW1lcyB6b29tSW5MZWZ0ezAle29wYWNpdHk6MDstd2Via2l0LXRyYW5zZm9ybTpzY2FsZTNkKC4xLC4xLC4xKSB0cmFuc2xhdGUzZCgtMTAwMHB4LDAsMCk7dHJhbnNmb3JtOnNjYWxlM2QoLjEsLjEsLjEpIHRyYW5zbGF0ZTNkKC0xMDAwcHgsMCwwKTstd2Via2l0LWFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246Y3ViaWMtYmV6aWVyKDAuNTUsLjA1NSwuNjc1LC4xOSk7YW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjpjdWJpYy1iZXppZXIoMC41NSwuMDU1LC42NzUsLjE5KX02MCV7b3BhY2l0eToxOy13ZWJraXQtdHJhbnNmb3JtOnNjYWxlM2QoLjQ3NSwuNDc1LC40NzUpIHRyYW5zbGF0ZTNkKDEwcHgsMCwwKTt0cmFuc2Zvcm06c2NhbGUzZCguNDc1LC40NzUsLjQ3NSkgdHJhbnNsYXRlM2QoMTBweCwwLDApOy13ZWJraXQtYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjpjdWJpYy1iZXppZXIoMC4xNzUsLjg4NSwuMzIsMSk7YW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjpjdWJpYy1iZXppZXIoMC4xNzUsLjg4NSwuMzIsMSl9fUBrZXlmcmFtZXMgem9vbUluTGVmdHswJXtvcGFjaXR5OjA7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGUzZCguMSwuMSwuMSkgdHJhbnNsYXRlM2QoLTEwMDBweCwwLDApO3RyYW5zZm9ybTpzY2FsZTNkKC4xLC4xLC4xKSB0cmFuc2xhdGUzZCgtMTAwMHB4LDAsMCk7LXdlYmtpdC1hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOmN1YmljLWJlemllcigwLjU1LC4wNTUsLjY3NSwuMTkpO2FuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246Y3ViaWMtYmV6aWVyKDAuNTUsLjA1NSwuNjc1LC4xOSl9NjAle29wYWNpdHk6MTstd2Via2l0LXRyYW5zZm9ybTpzY2FsZTNkKC40NzUsLjQ3NSwuNDc1KSB0cmFuc2xhdGUzZCgxMHB4LDAsMCk7dHJhbnNmb3JtOnNjYWxlM2QoLjQ3NSwuNDc1LC40NzUpIHRyYW5zbGF0ZTNkKDEwcHgsMCwwKTstd2Via2l0LWFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246Y3ViaWMtYmV6aWVyKDAuMTc1LC44ODUsLjMyLDEpO2FuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246Y3ViaWMtYmV6aWVyKDAuMTc1LC44ODUsLjMyLDEpfX0uem9vbUluTGVmdHstd2Via2l0LWFuaW1hdGlvbi1uYW1lOnpvb21JbkxlZnQ7YW5pbWF0aW9uLW5hbWU6em9vbUluTGVmdH1ALXdlYmtpdC1rZXlmcmFtZXMgem9vbUluUmlnaHR7MCV7b3BhY2l0eTowOy13ZWJraXQtdHJhbnNmb3JtOnNjYWxlM2QoLjEsLjEsLjEpIHRyYW5zbGF0ZTNkKDEwMDBweCwwLDApO3RyYW5zZm9ybTpzY2FsZTNkKC4xLC4xLC4xKSB0cmFuc2xhdGUzZCgxMDAwcHgsMCwwKTstd2Via2l0LWFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246Y3ViaWMtYmV6aWVyKDAuNTUsLjA1NSwuNjc1LC4xOSk7YW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjpjdWJpYy1iZXppZXIoMC41NSwuMDU1LC42NzUsLjE5KX02MCV7b3BhY2l0eToxOy13ZWJraXQtdHJhbnNmb3JtOnNjYWxlM2QoLjQ3NSwuNDc1LC40NzUpIHRyYW5zbGF0ZTNkKC0xMHB4LDAsMCk7dHJhbnNmb3JtOnNjYWxlM2QoLjQ3NSwuNDc1LC40NzUpIHRyYW5zbGF0ZTNkKC0xMHB4LDAsMCk7LXdlYmtpdC1hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOmN1YmljLWJlemllcigwLjE3NSwuODg1LC4zMiwxKTthbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOmN1YmljLWJlemllcigwLjE3NSwuODg1LC4zMiwxKX19QGtleWZyYW1lcyB6b29tSW5SaWdodHswJXtvcGFjaXR5OjA7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGUzZCguMSwuMSwuMSkgdHJhbnNsYXRlM2QoMTAwMHB4LDAsMCk7dHJhbnNmb3JtOnNjYWxlM2QoLjEsLjEsLjEpIHRyYW5zbGF0ZTNkKDEwMDBweCwwLDApOy13ZWJraXQtYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjpjdWJpYy1iZXppZXIoMC41NSwuMDU1LC42NzUsLjE5KTthbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOmN1YmljLWJlemllcigwLjU1LC4wNTUsLjY3NSwuMTkpfTYwJXtvcGFjaXR5OjE7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGUzZCguNDc1LC40NzUsLjQ3NSkgdHJhbnNsYXRlM2QoLTEwcHgsMCwwKTt0cmFuc2Zvcm06c2NhbGUzZCguNDc1LC40NzUsLjQ3NSkgdHJhbnNsYXRlM2QoLTEwcHgsMCwwKTstd2Via2l0LWFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246Y3ViaWMtYmV6aWVyKDAuMTc1LC44ODUsLjMyLDEpO2FuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246Y3ViaWMtYmV6aWVyKDAuMTc1LC44ODUsLjMyLDEpfX0uem9vbUluUmlnaHR7LXdlYmtpdC1hbmltYXRpb24tbmFtZTp6b29tSW5SaWdodDthbmltYXRpb24tbmFtZTp6b29tSW5SaWdodH1ALXdlYmtpdC1rZXlmcmFtZXMgem9vbUluVXB7MCV7b3BhY2l0eTowOy13ZWJraXQtdHJhbnNmb3JtOnNjYWxlM2QoLjEsLjEsLjEpIHRyYW5zbGF0ZTNkKDAsMTAwMHB4LDApO3RyYW5zZm9ybTpzY2FsZTNkKC4xLC4xLC4xKSB0cmFuc2xhdGUzZCgwLDEwMDBweCwwKTstd2Via2l0LWFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246Y3ViaWMtYmV6aWVyKDAuNTUsLjA1NSwuNjc1LC4xOSk7YW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjpjdWJpYy1iZXppZXIoMC41NSwuMDU1LC42NzUsLjE5KX02MCV7b3BhY2l0eToxOy13ZWJraXQtdHJhbnNmb3JtOnNjYWxlM2QoLjQ3NSwuNDc1LC40NzUpIHRyYW5zbGF0ZTNkKDAsLTYwcHgsMCk7dHJhbnNmb3JtOnNjYWxlM2QoLjQ3NSwuNDc1LC40NzUpIHRyYW5zbGF0ZTNkKDAsLTYwcHgsMCk7LXdlYmtpdC1hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOmN1YmljLWJlemllcigwLjE3NSwuODg1LC4zMiwxKTthbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOmN1YmljLWJlemllcigwLjE3NSwuODg1LC4zMiwxKX19QGtleWZyYW1lcyB6b29tSW5VcHswJXtvcGFjaXR5OjA7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGUzZCguMSwuMSwuMSkgdHJhbnNsYXRlM2QoMCwxMDAwcHgsMCk7dHJhbnNmb3JtOnNjYWxlM2QoLjEsLjEsLjEpIHRyYW5zbGF0ZTNkKDAsMTAwMHB4LDApOy13ZWJraXQtYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjpjdWJpYy1iZXppZXIoMC41NSwuMDU1LC42NzUsLjE5KTthbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOmN1YmljLWJlemllcigwLjU1LC4wNTUsLjY3NSwuMTkpfTYwJXtvcGFjaXR5OjE7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGUzZCguNDc1LC40NzUsLjQ3NSkgdHJhbnNsYXRlM2QoMCwtNjBweCwwKTt0cmFuc2Zvcm06c2NhbGUzZCguNDc1LC40NzUsLjQ3NSkgdHJhbnNsYXRlM2QoMCwtNjBweCwwKTstd2Via2l0LWFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246Y3ViaWMtYmV6aWVyKDAuMTc1LC44ODUsLjMyLDEpO2FuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246Y3ViaWMtYmV6aWVyKDAuMTc1LC44ODUsLjMyLDEpfX0uem9vbUluVXB7LXdlYmtpdC1hbmltYXRpb24tbmFtZTp6b29tSW5VcDthbmltYXRpb24tbmFtZTp6b29tSW5VcH1ALXdlYmtpdC1rZXlmcmFtZXMgem9vbU91dHswJXtvcGFjaXR5OjF9NTAle29wYWNpdHk6MDstd2Via2l0LXRyYW5zZm9ybTpzY2FsZTNkKC4zLC4zLC4zKTt0cmFuc2Zvcm06c2NhbGUzZCguMywuMywuMyl9MTAwJXtvcGFjaXR5OjB9fUBrZXlmcmFtZXMgem9vbU91dHswJXtvcGFjaXR5OjF9NTAle29wYWNpdHk6MDstd2Via2l0LXRyYW5zZm9ybTpzY2FsZTNkKC4zLC4zLC4zKTt0cmFuc2Zvcm06c2NhbGUzZCguMywuMywuMyl9MTAwJXtvcGFjaXR5OjB9fS56b29tT3V0ey13ZWJraXQtYW5pbWF0aW9uLW5hbWU6em9vbU91dDthbmltYXRpb24tbmFtZTp6b29tT3V0fUAtd2Via2l0LWtleWZyYW1lcyB6b29tT3V0RG93bns0MCV7b3BhY2l0eToxOy13ZWJraXQtdHJhbnNmb3JtOnNjYWxlM2QoLjQ3NSwuNDc1LC40NzUpIHRyYW5zbGF0ZTNkKDAsLTYwcHgsMCk7dHJhbnNmb3JtOnNjYWxlM2QoLjQ3NSwuNDc1LC40NzUpIHRyYW5zbGF0ZTNkKDAsLTYwcHgsMCk7LXdlYmtpdC1hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOmN1YmljLWJlemllcigwLjU1LC4wNTUsLjY3NSwuMTkpO2FuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246Y3ViaWMtYmV6aWVyKDAuNTUsLjA1NSwuNjc1LC4xOSl9MTAwJXtvcGFjaXR5OjA7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGUzZCguMSwuMSwuMSkgdHJhbnNsYXRlM2QoMCwyMDAwcHgsMCk7dHJhbnNmb3JtOnNjYWxlM2QoLjEsLjEsLjEpIHRyYW5zbGF0ZTNkKDAsMjAwMHB4LDApOy13ZWJraXQtdHJhbnNmb3JtLW9yaWdpbjpjZW50ZXIgYm90dG9tO3RyYW5zZm9ybS1vcmlnaW46Y2VudGVyIGJvdHRvbTstd2Via2l0LWFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246Y3ViaWMtYmV6aWVyKDAuMTc1LC44ODUsLjMyLDEpO2FuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246Y3ViaWMtYmV6aWVyKDAuMTc1LC44ODUsLjMyLDEpfX1Aa2V5ZnJhbWVzIHpvb21PdXREb3duezQwJXtvcGFjaXR5OjE7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGUzZCguNDc1LC40NzUsLjQ3NSkgdHJhbnNsYXRlM2QoMCwtNjBweCwwKTt0cmFuc2Zvcm06c2NhbGUzZCguNDc1LC40NzUsLjQ3NSkgdHJhbnNsYXRlM2QoMCwtNjBweCwwKTstd2Via2l0LWFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246Y3ViaWMtYmV6aWVyKDAuNTUsLjA1NSwuNjc1LC4xOSk7YW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjpjdWJpYy1iZXppZXIoMC41NSwuMDU1LC42NzUsLjE5KX0xMDAle29wYWNpdHk6MDstd2Via2l0LXRyYW5zZm9ybTpzY2FsZTNkKC4xLC4xLC4xKSB0cmFuc2xhdGUzZCgwLDIwMDBweCwwKTt0cmFuc2Zvcm06c2NhbGUzZCguMSwuMSwuMSkgdHJhbnNsYXRlM2QoMCwyMDAwcHgsMCk7LXdlYmtpdC10cmFuc2Zvcm0tb3JpZ2luOmNlbnRlciBib3R0b207dHJhbnNmb3JtLW9yaWdpbjpjZW50ZXIgYm90dG9tOy13ZWJraXQtYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjpjdWJpYy1iZXppZXIoMC4xNzUsLjg4NSwuMzIsMSk7YW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjpjdWJpYy1iZXppZXIoMC4xNzUsLjg4NSwuMzIsMSl9fS56b29tT3V0RG93bnstd2Via2l0LWFuaW1hdGlvbi1uYW1lOnpvb21PdXREb3duO2FuaW1hdGlvbi1uYW1lOnpvb21PdXREb3dufUAtd2Via2l0LWtleWZyYW1lcyB6b29tT3V0TGVmdHs0MCV7b3BhY2l0eToxOy13ZWJraXQtdHJhbnNmb3JtOnNjYWxlM2QoLjQ3NSwuNDc1LC40NzUpIHRyYW5zbGF0ZTNkKDQycHgsMCwwKTt0cmFuc2Zvcm06c2NhbGUzZCguNDc1LC40NzUsLjQ3NSkgdHJhbnNsYXRlM2QoNDJweCwwLDApfTEwMCV7b3BhY2l0eTowOy13ZWJraXQtdHJhbnNmb3JtOnNjYWxlKC4xKSB0cmFuc2xhdGUzZCgtMjAwMHB4LDAsMCk7dHJhbnNmb3JtOnNjYWxlKC4xKSB0cmFuc2xhdGUzZCgtMjAwMHB4LDAsMCk7LXdlYmtpdC10cmFuc2Zvcm0tb3JpZ2luOmxlZnQgY2VudGVyO3RyYW5zZm9ybS1vcmlnaW46bGVmdCBjZW50ZXJ9fUBrZXlmcmFtZXMgem9vbU91dExlZnR7NDAle29wYWNpdHk6MTstd2Via2l0LXRyYW5zZm9ybTpzY2FsZTNkKC40NzUsLjQ3NSwuNDc1KSB0cmFuc2xhdGUzZCg0MnB4LDAsMCk7dHJhbnNmb3JtOnNjYWxlM2QoLjQ3NSwuNDc1LC40NzUpIHRyYW5zbGF0ZTNkKDQycHgsMCwwKX0xMDAle29wYWNpdHk6MDstd2Via2l0LXRyYW5zZm9ybTpzY2FsZSguMSkgdHJhbnNsYXRlM2QoLTIwMDBweCwwLDApO3RyYW5zZm9ybTpzY2FsZSguMSkgdHJhbnNsYXRlM2QoLTIwMDBweCwwLDApOy13ZWJraXQtdHJhbnNmb3JtLW9yaWdpbjpsZWZ0IGNlbnRlcjt0cmFuc2Zvcm0tb3JpZ2luOmxlZnQgY2VudGVyfX0uem9vbU91dExlZnR7LXdlYmtpdC1hbmltYXRpb24tbmFtZTp6b29tT3V0TGVmdDthbmltYXRpb24tbmFtZTp6b29tT3V0TGVmdH1ALXdlYmtpdC1rZXlmcmFtZXMgem9vbU91dFJpZ2h0ezQwJXtvcGFjaXR5OjE7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGUzZCguNDc1LC40NzUsLjQ3NSkgdHJhbnNsYXRlM2QoLTQycHgsMCwwKTt0cmFuc2Zvcm06c2NhbGUzZCguNDc1LC40NzUsLjQ3NSkgdHJhbnNsYXRlM2QoLTQycHgsMCwwKX0xMDAle29wYWNpdHk6MDstd2Via2l0LXRyYW5zZm9ybTpzY2FsZSguMSkgdHJhbnNsYXRlM2QoMjAwMHB4LDAsMCk7dHJhbnNmb3JtOnNjYWxlKC4xKSB0cmFuc2xhdGUzZCgyMDAwcHgsMCwwKTstd2Via2l0LXRyYW5zZm9ybS1vcmlnaW46cmlnaHQgY2VudGVyO3RyYW5zZm9ybS1vcmlnaW46cmlnaHQgY2VudGVyfX1Aa2V5ZnJhbWVzIHpvb21PdXRSaWdodHs0MCV7b3BhY2l0eToxOy13ZWJraXQtdHJhbnNmb3JtOnNjYWxlM2QoLjQ3NSwuNDc1LC40NzUpIHRyYW5zbGF0ZTNkKC00MnB4LDAsMCk7dHJhbnNmb3JtOnNjYWxlM2QoLjQ3NSwuNDc1LC40NzUpIHRyYW5zbGF0ZTNkKC00MnB4LDAsMCl9MTAwJXtvcGFjaXR5OjA7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGUoLjEpIHRyYW5zbGF0ZTNkKDIwMDBweCwwLDApO3RyYW5zZm9ybTpzY2FsZSguMSkgdHJhbnNsYXRlM2QoMjAwMHB4LDAsMCk7LXdlYmtpdC10cmFuc2Zvcm0tb3JpZ2luOnJpZ2h0IGNlbnRlcjt0cmFuc2Zvcm0tb3JpZ2luOnJpZ2h0IGNlbnRlcn19Lnpvb21PdXRSaWdodHstd2Via2l0LWFuaW1hdGlvbi1uYW1lOnpvb21PdXRSaWdodDthbmltYXRpb24tbmFtZTp6b29tT3V0UmlnaHR9QC13ZWJraXQta2V5ZnJhbWVzIHpvb21PdXRVcHs0MCV7b3BhY2l0eToxOy13ZWJraXQtdHJhbnNmb3JtOnNjYWxlM2QoLjQ3NSwuNDc1LC40NzUpIHRyYW5zbGF0ZTNkKDAsNjBweCwwKTt0cmFuc2Zvcm06c2NhbGUzZCguNDc1LC40NzUsLjQ3NSkgdHJhbnNsYXRlM2QoMCw2MHB4LDApOy13ZWJraXQtYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjpjdWJpYy1iZXppZXIoMC41NSwuMDU1LC42NzUsLjE5KTthbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOmN1YmljLWJlemllcigwLjU1LC4wNTUsLjY3NSwuMTkpfTEwMCV7b3BhY2l0eTowOy13ZWJraXQtdHJhbnNmb3JtOnNjYWxlM2QoLjEsLjEsLjEpIHRyYW5zbGF0ZTNkKDAsLTIwMDBweCwwKTt0cmFuc2Zvcm06c2NhbGUzZCguMSwuMSwuMSkgdHJhbnNsYXRlM2QoMCwtMjAwMHB4LDApOy13ZWJraXQtdHJhbnNmb3JtLW9yaWdpbjpjZW50ZXIgYm90dG9tO3RyYW5zZm9ybS1vcmlnaW46Y2VudGVyIGJvdHRvbTstd2Via2l0LWFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246Y3ViaWMtYmV6aWVyKDAuMTc1LC44ODUsLjMyLDEpO2FuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246Y3ViaWMtYmV6aWVyKDAuMTc1LC44ODUsLjMyLDEpfX1Aa2V5ZnJhbWVzIHpvb21PdXRVcHs0MCV7b3BhY2l0eToxOy13ZWJraXQtdHJhbnNmb3JtOnNjYWxlM2QoLjQ3NSwuNDc1LC40NzUpIHRyYW5zbGF0ZTNkKDAsNjBweCwwKTt0cmFuc2Zvcm06c2NhbGUzZCguNDc1LC40NzUsLjQ3NSkgdHJhbnNsYXRlM2QoMCw2MHB4LDApOy13ZWJraXQtYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjpjdWJpYy1iZXppZXIoMC41NSwuMDU1LC42NzUsLjE5KTthbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOmN1YmljLWJlemllcigwLjU1LC4wNTUsLjY3NSwuMTkpfTEwMCV7b3BhY2l0eTowOy13ZWJraXQtdHJhbnNmb3JtOnNjYWxlM2QoLjEsLjEsLjEpIHRyYW5zbGF0ZTNkKDAsLTIwMDBweCwwKTt0cmFuc2Zvcm06c2NhbGUzZCguMSwuMSwuMSkgdHJhbnNsYXRlM2QoMCwtMjAwMHB4LDApOy13ZWJraXQtdHJhbnNmb3JtLW9yaWdpbjpjZW50ZXIgYm90dG9tO3RyYW5zZm9ybS1vcmlnaW46Y2VudGVyIGJvdHRvbTstd2Via2l0LWFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246Y3ViaWMtYmV6aWVyKDAuMTc1LC44ODUsLjMyLDEpO2FuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246Y3ViaWMtYmV6aWVyKDAuMTc1LC44ODUsLjMyLDEpfX0uem9vbU91dFVwey13ZWJraXQtYW5pbWF0aW9uLW5hbWU6em9vbU91dFVwO2FuaW1hdGlvbi1uYW1lOnpvb21PdXRVcH1ALXdlYmtpdC1rZXlmcmFtZXMgc2xpZGVJbkRvd257MCV7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlWSgtMTAwJSk7dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEwMCUpO3Zpc2liaWxpdHk6dmlzaWJsZX0xMDAley13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZVkoMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZVkoMCl9fUBrZXlmcmFtZXMgc2xpZGVJbkRvd257MCV7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlWSgtMTAwJSk7dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEwMCUpO3Zpc2liaWxpdHk6dmlzaWJsZX0xMDAley13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZVkoMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZVkoMCl9fS5zbGlkZUluRG93bnstd2Via2l0LWFuaW1hdGlvbi1uYW1lOnNsaWRlSW5Eb3duO2FuaW1hdGlvbi1uYW1lOnNsaWRlSW5Eb3dufUAtd2Via2l0LWtleWZyYW1lcyBzbGlkZUluTGVmdHswJXstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGVYKC0xMDAlKTt0cmFuc2Zvcm06dHJhbnNsYXRlWCgtMTAwJSk7dmlzaWJpbGl0eTp2aXNpYmxlfTEwMCV7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlWCgwKTt0cmFuc2Zvcm06dHJhbnNsYXRlWCgwKX19QGtleWZyYW1lcyBzbGlkZUluTGVmdHswJXstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGVYKC0xMDAlKTt0cmFuc2Zvcm06dHJhbnNsYXRlWCgtMTAwJSk7dmlzaWJpbGl0eTp2aXNpYmxlfTEwMCV7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlWCgwKTt0cmFuc2Zvcm06dHJhbnNsYXRlWCgwKX19LnNsaWRlSW5MZWZ0ey13ZWJraXQtYW5pbWF0aW9uLW5hbWU6c2xpZGVJbkxlZnQ7YW5pbWF0aW9uLW5hbWU6c2xpZGVJbkxlZnR9QC13ZWJraXQta2V5ZnJhbWVzIHNsaWRlSW5SaWdodHswJXstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGVYKDEwMCUpO3RyYW5zZm9ybTp0cmFuc2xhdGVYKDEwMCUpO3Zpc2liaWxpdHk6dmlzaWJsZX0xMDAley13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZVgoMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZVgoMCl9fUBrZXlmcmFtZXMgc2xpZGVJblJpZ2h0ezAley13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZVgoMTAwJSk7dHJhbnNmb3JtOnRyYW5zbGF0ZVgoMTAwJSk7dmlzaWJpbGl0eTp2aXNpYmxlfTEwMCV7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlWCgwKTt0cmFuc2Zvcm06dHJhbnNsYXRlWCgwKX19LnNsaWRlSW5SaWdodHstd2Via2l0LWFuaW1hdGlvbi1uYW1lOnNsaWRlSW5SaWdodDthbmltYXRpb24tbmFtZTpzbGlkZUluUmlnaHR9QC13ZWJraXQta2V5ZnJhbWVzIHNsaWRlSW5VcHswJXstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGVZKDEwMCUpO3RyYW5zZm9ybTp0cmFuc2xhdGVZKDEwMCUpO3Zpc2liaWxpdHk6dmlzaWJsZX0xMDAley13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZVkoMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZVkoMCl9fUBrZXlmcmFtZXMgc2xpZGVJblVwezAley13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZVkoMTAwJSk7dHJhbnNmb3JtOnRyYW5zbGF0ZVkoMTAwJSk7dmlzaWJpbGl0eTp2aXNpYmxlfTEwMCV7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlWSgwKTt0cmFuc2Zvcm06dHJhbnNsYXRlWSgwKX19LnNsaWRlSW5VcHstd2Via2l0LWFuaW1hdGlvbi1uYW1lOnNsaWRlSW5VcDthbmltYXRpb24tbmFtZTpzbGlkZUluVXB9QC13ZWJraXQta2V5ZnJhbWVzIHNsaWRlT3V0RG93bnswJXstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGVZKDApO3RyYW5zZm9ybTp0cmFuc2xhdGVZKDApfTEwMCV7dmlzaWJpbGl0eTpoaWRkZW47LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlWSgxMDAlKTt0cmFuc2Zvcm06dHJhbnNsYXRlWSgxMDAlKX19QGtleWZyYW1lcyBzbGlkZU91dERvd257MCV7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlWSgwKTt0cmFuc2Zvcm06dHJhbnNsYXRlWSgwKX0xMDAle3Zpc2liaWxpdHk6aGlkZGVuOy13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZVkoMTAwJSk7dHJhbnNmb3JtOnRyYW5zbGF0ZVkoMTAwJSl9fS5zbGlkZU91dERvd257LXdlYmtpdC1hbmltYXRpb24tbmFtZTpzbGlkZU91dERvd247YW5pbWF0aW9uLW5hbWU6c2xpZGVPdXREb3dufUAtd2Via2l0LWtleWZyYW1lcyBzbGlkZU91dExlZnR7MCV7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlWCgwKTt0cmFuc2Zvcm06dHJhbnNsYXRlWCgwKX0xMDAle3Zpc2liaWxpdHk6aGlkZGVuOy13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZVgoLTEwMCUpO3RyYW5zZm9ybTp0cmFuc2xhdGVYKC0xMDAlKX19QGtleWZyYW1lcyBzbGlkZU91dExlZnR7MCV7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlWCgwKTt0cmFuc2Zvcm06dHJhbnNsYXRlWCgwKX0xMDAle3Zpc2liaWxpdHk6aGlkZGVuOy13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZVgoLTEwMCUpO3RyYW5zZm9ybTp0cmFuc2xhdGVYKC0xMDAlKX19LnNsaWRlT3V0TGVmdHstd2Via2l0LWFuaW1hdGlvbi1uYW1lOnNsaWRlT3V0TGVmdDthbmltYXRpb24tbmFtZTpzbGlkZU91dExlZnR9QC13ZWJraXQta2V5ZnJhbWVzIHNsaWRlT3V0UmlnaHR7MCV7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlWCgwKTt0cmFuc2Zvcm06dHJhbnNsYXRlWCgwKX0xMDAle3Zpc2liaWxpdHk6aGlkZGVuOy13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZVgoMTAwJSk7dHJhbnNmb3JtOnRyYW5zbGF0ZVgoMTAwJSl9fUBrZXlmcmFtZXMgc2xpZGVPdXRSaWdodHswJXstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGVYKDApO3RyYW5zZm9ybTp0cmFuc2xhdGVYKDApfTEwMCV7dmlzaWJpbGl0eTpoaWRkZW47LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlWCgxMDAlKTt0cmFuc2Zvcm06dHJhbnNsYXRlWCgxMDAlKX19LnNsaWRlT3V0UmlnaHR7LXdlYmtpdC1hbmltYXRpb24tbmFtZTpzbGlkZU91dFJpZ2h0O2FuaW1hdGlvbi1uYW1lOnNsaWRlT3V0UmlnaHR9QC13ZWJraXQta2V5ZnJhbWVzIHNsaWRlT3V0VXB7MCV7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlWSgwKTt0cmFuc2Zvcm06dHJhbnNsYXRlWSgwKX0xMDAle3Zpc2liaWxpdHk6aGlkZGVuOy13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEwMCUpO3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xMDAlKX19QGtleWZyYW1lcyBzbGlkZU91dFVwezAley13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZVkoMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZVkoMCl9MTAwJXt2aXNpYmlsaXR5OmhpZGRlbjstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGVZKC0xMDAlKTt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMTAwJSl9fS5zbGlkZU91dFVwey13ZWJraXQtYW5pbWF0aW9uLW5hbWU6c2xpZGVPdXRVcDthbmltYXRpb24tbmFtZTpzbGlkZU91dFVwfSIsIi8qISBub3JtYWxpemUuY3NzIHYzLjAuMiB8IE1JVCBMaWNlbnNlIHwgZ2l0LmlvL25vcm1hbGl6ZSAqL1xuXG4vL1xuLy8gMS4gU2V0IGRlZmF1bHQgZm9udCBmYW1pbHkgdG8gc2Fucy1zZXJpZi5cbi8vIDIuIFByZXZlbnQgaU9TIHRleHQgc2l6ZSBhZGp1c3QgYWZ0ZXIgb3JpZW50YXRpb24gY2hhbmdlLCB3aXRob3V0IGRpc2FibGluZ1xuLy8gICAgdXNlciB6b29tLlxuLy9cblxuaHRtbCB7XG4gIGZvbnQtZmFtaWx5OiBzYW5zLXNlcmlmOyAvLyAxXG4gIC1tcy10ZXh0LXNpemUtYWRqdXN0OiAxMDAlOyAvLyAyXG4gIC13ZWJraXQtdGV4dC1zaXplLWFkanVzdDogMTAwJTsgLy8gMlxufVxuXG4vL1xuLy8gUmVtb3ZlIGRlZmF1bHQgbWFyZ2luLlxuLy9cblxuYm9keSB7XG4gIG1hcmdpbjogMDtcbn1cblxuLy8gSFRNTDUgZGlzcGxheSBkZWZpbml0aW9uc1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLy9cbi8vIENvcnJlY3QgYGJsb2NrYCBkaXNwbGF5IG5vdCBkZWZpbmVkIGZvciBhbnkgSFRNTDUgZWxlbWVudCBpbiBJRSA4LzkuXG4vLyBDb3JyZWN0IGBibG9ja2AgZGlzcGxheSBub3QgZGVmaW5lZCBmb3IgYGRldGFpbHNgIG9yIGBzdW1tYXJ5YCBpbiBJRSAxMC8xMVxuLy8gYW5kIEZpcmVmb3guXG4vLyBDb3JyZWN0IGBibG9ja2AgZGlzcGxheSBub3QgZGVmaW5lZCBmb3IgYG1haW5gIGluIElFIDExLlxuLy9cblxuYXJ0aWNsZSxcbmFzaWRlLFxuZGV0YWlscyxcbmZpZ2NhcHRpb24sXG5maWd1cmUsXG5mb290ZXIsXG5oZWFkZXIsXG5oZ3JvdXAsXG5tYWluLFxubWVudSxcbm5hdixcbnNlY3Rpb24sXG5zdW1tYXJ5IHtcbiAgZGlzcGxheTogYmxvY2s7XG59XG5cbi8vXG4vLyAxLiBDb3JyZWN0IGBpbmxpbmUtYmxvY2tgIGRpc3BsYXkgbm90IGRlZmluZWQgaW4gSUUgOC85LlxuLy8gMi4gTm9ybWFsaXplIHZlcnRpY2FsIGFsaWdubWVudCBvZiBgcHJvZ3Jlc3NgIGluIENocm9tZSwgRmlyZWZveCwgYW5kIE9wZXJhLlxuLy9cblxuYXVkaW8sXG5jYW52YXMsXG5wcm9ncmVzcyxcbnZpZGVvIHtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrOyAvLyAxXG4gIHZlcnRpY2FsLWFsaWduOiBiYXNlbGluZTsgLy8gMlxufVxuXG4vL1xuLy8gUHJldmVudCBtb2Rlcm4gYnJvd3NlcnMgZnJvbSBkaXNwbGF5aW5nIGBhdWRpb2Agd2l0aG91dCBjb250cm9scy5cbi8vIFJlbW92ZSBleGNlc3MgaGVpZ2h0IGluIGlPUyA1IGRldmljZXMuXG4vL1xuXG5hdWRpbzpub3QoW2NvbnRyb2xzXSkge1xuICBkaXNwbGF5OiBub25lO1xuICBoZWlnaHQ6IDA7XG59XG5cbi8vXG4vLyBBZGRyZXNzIGBbaGlkZGVuXWAgc3R5bGluZyBub3QgcHJlc2VudCBpbiBJRSA4LzkvMTAuXG4vLyBIaWRlIHRoZSBgdGVtcGxhdGVgIGVsZW1lbnQgaW4gSUUgOC85LzExLCBTYWZhcmksIGFuZCBGaXJlZm94IDwgMjIuXG4vL1xuXG5baGlkZGVuXSxcbnRlbXBsYXRlIHtcbiAgZGlzcGxheTogbm9uZTtcbn1cblxuLy8gTGlua3Ncbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8vXG4vLyBSZW1vdmUgdGhlIGdyYXkgYmFja2dyb3VuZCBjb2xvciBmcm9tIGFjdGl2ZSBsaW5rcyBpbiBJRSAxMC5cbi8vXG5cbmEge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDtcbn1cblxuLy9cbi8vIEltcHJvdmUgcmVhZGFiaWxpdHkgd2hlbiBmb2N1c2VkIGFuZCBhbHNvIG1vdXNlIGhvdmVyZWQgaW4gYWxsIGJyb3dzZXJzLlxuLy9cblxuYTphY3RpdmUsXG5hOmhvdmVyIHtcbiAgb3V0bGluZTogMDtcbn1cblxuLy8gVGV4dC1sZXZlbCBzZW1hbnRpY3Ncbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8vXG4vLyBBZGRyZXNzIHN0eWxpbmcgbm90IHByZXNlbnQgaW4gSUUgOC85LzEwLzExLCBTYWZhcmksIGFuZCBDaHJvbWUuXG4vL1xuXG5hYmJyW3RpdGxlXSB7XG4gIGJvcmRlci1ib3R0b206IDFweCBkb3R0ZWQ7XG59XG5cbi8vXG4vLyBBZGRyZXNzIHN0eWxlIHNldCB0byBgYm9sZGVyYCBpbiBGaXJlZm94IDQrLCBTYWZhcmksIGFuZCBDaHJvbWUuXG4vL1xuXG5iLFxuc3Ryb25nIHtcbiAgZm9udC13ZWlnaHQ6IGJvbGQ7XG59XG5cbi8vXG4vLyBBZGRyZXNzIHN0eWxpbmcgbm90IHByZXNlbnQgaW4gU2FmYXJpIGFuZCBDaHJvbWUuXG4vL1xuXG5kZm4ge1xuICBmb250LXN0eWxlOiBpdGFsaWM7XG59XG5cbi8vXG4vLyBBZGRyZXNzIHZhcmlhYmxlIGBoMWAgZm9udC1zaXplIGFuZCBtYXJnaW4gd2l0aGluIGBzZWN0aW9uYCBhbmQgYGFydGljbGVgXG4vLyBjb250ZXh0cyBpbiBGaXJlZm94IDQrLCBTYWZhcmksIGFuZCBDaHJvbWUuXG4vL1xuXG5oMSB7XG4gIGZvbnQtc2l6ZTogMmVtO1xuICBtYXJnaW46IDAuNjdlbSAwO1xufVxuXG4vL1xuLy8gQWRkcmVzcyBzdHlsaW5nIG5vdCBwcmVzZW50IGluIElFIDgvOS5cbi8vXG5cbm1hcmsge1xuICBiYWNrZ3JvdW5kOiAjZmYwO1xuICBjb2xvcjogIzAwMDtcbn1cblxuLy9cbi8vIEFkZHJlc3MgaW5jb25zaXN0ZW50IGFuZCB2YXJpYWJsZSBmb250IHNpemUgaW4gYWxsIGJyb3dzZXJzLlxuLy9cblxuc21hbGwge1xuICBmb250LXNpemU6IDgwJTtcbn1cblxuLy9cbi8vIFByZXZlbnQgYHN1YmAgYW5kIGBzdXBgIGFmZmVjdGluZyBgbGluZS1oZWlnaHRgIGluIGFsbCBicm93c2Vycy5cbi8vXG5cbnN1YixcbnN1cCB7XG4gIGZvbnQtc2l6ZTogNzUlO1xuICBsaW5lLWhlaWdodDogMDtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICB2ZXJ0aWNhbC1hbGlnbjogYmFzZWxpbmU7XG59XG5cbnN1cCB7XG4gIHRvcDogLTAuNWVtO1xufVxuXG5zdWIge1xuICBib3R0b206IC0wLjI1ZW07XG59XG5cbi8vIEVtYmVkZGVkIGNvbnRlbnRcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8vXG4vLyBSZW1vdmUgYm9yZGVyIHdoZW4gaW5zaWRlIGBhYCBlbGVtZW50IGluIElFIDgvOS8xMC5cbi8vXG5cbmltZyB7XG4gIGJvcmRlcjogMDtcbn1cblxuLy9cbi8vIENvcnJlY3Qgb3ZlcmZsb3cgbm90IGhpZGRlbiBpbiBJRSA5LzEwLzExLlxuLy9cblxuc3ZnOm5vdCg6cm9vdCkge1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuXG4vLyBHcm91cGluZyBjb250ZW50XG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vL1xuLy8gQWRkcmVzcyBtYXJnaW4gbm90IHByZXNlbnQgaW4gSUUgOC85IGFuZCBTYWZhcmkuXG4vL1xuXG5maWd1cmUge1xuICBtYXJnaW46IDFlbSA0MHB4O1xufVxuXG4vL1xuLy8gQWRkcmVzcyBkaWZmZXJlbmNlcyBiZXR3ZWVuIEZpcmVmb3ggYW5kIG90aGVyIGJyb3dzZXJzLlxuLy9cblxuaHIge1xuICAtbW96LWJveC1zaXppbmc6IGNvbnRlbnQtYm94O1xuICBib3gtc2l6aW5nOiBjb250ZW50LWJveDtcbiAgaGVpZ2h0OiAwO1xufVxuXG4vL1xuLy8gQ29udGFpbiBvdmVyZmxvdyBpbiBhbGwgYnJvd3NlcnMuXG4vL1xuXG5wcmUge1xuICBvdmVyZmxvdzogYXV0bztcbn1cblxuLy9cbi8vIEFkZHJlc3Mgb2RkIGBlbWAtdW5pdCBmb250IHNpemUgcmVuZGVyaW5nIGluIGFsbCBicm93c2Vycy5cbi8vXG5cbmNvZGUsXG5rYmQsXG5wcmUsXG5zYW1wIHtcbiAgZm9udC1mYW1pbHk6IG1vbm9zcGFjZSwgbW9ub3NwYWNlO1xuICBmb250LXNpemU6IDFlbTtcbn1cblxuLy8gRm9ybXNcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8vXG4vLyBLbm93biBsaW1pdGF0aW9uOiBieSBkZWZhdWx0LCBDaHJvbWUgYW5kIFNhZmFyaSBvbiBPUyBYIGFsbG93IHZlcnkgbGltaXRlZFxuLy8gc3R5bGluZyBvZiBgc2VsZWN0YCwgdW5sZXNzIGEgYGJvcmRlcmAgcHJvcGVydHkgaXMgc2V0LlxuLy9cblxuLy9cbi8vIDEuIENvcnJlY3QgY29sb3Igbm90IGJlaW5nIGluaGVyaXRlZC5cbi8vICAgIEtub3duIGlzc3VlOiBhZmZlY3RzIGNvbG9yIG9mIGRpc2FibGVkIGVsZW1lbnRzLlxuLy8gMi4gQ29ycmVjdCBmb250IHByb3BlcnRpZXMgbm90IGJlaW5nIGluaGVyaXRlZC5cbi8vIDMuIEFkZHJlc3MgbWFyZ2lucyBzZXQgZGlmZmVyZW50bHkgaW4gRmlyZWZveCA0KywgU2FmYXJpLCBhbmQgQ2hyb21lLlxuLy9cblxuYnV0dG9uLFxuaW5wdXQsXG5vcHRncm91cCxcbnNlbGVjdCxcbnRleHRhcmVhIHtcbiAgY29sb3I6IGluaGVyaXQ7IC8vIDFcbiAgZm9udDogaW5oZXJpdDsgLy8gMlxuICBtYXJnaW46IDA7IC8vIDNcbn1cblxuLy9cbi8vIEFkZHJlc3MgYG92ZXJmbG93YCBzZXQgdG8gYGhpZGRlbmAgaW4gSUUgOC85LzEwLzExLlxuLy9cblxuYnV0dG9uIHtcbiAgb3ZlcmZsb3c6IHZpc2libGU7XG59XG5cbi8vXG4vLyBBZGRyZXNzIGluY29uc2lzdGVudCBgdGV4dC10cmFuc2Zvcm1gIGluaGVyaXRhbmNlIGZvciBgYnV0dG9uYCBhbmQgYHNlbGVjdGAuXG4vLyBBbGwgb3RoZXIgZm9ybSBjb250cm9sIGVsZW1lbnRzIGRvIG5vdCBpbmhlcml0IGB0ZXh0LXRyYW5zZm9ybWAgdmFsdWVzLlxuLy8gQ29ycmVjdCBgYnV0dG9uYCBzdHlsZSBpbmhlcml0YW5jZSBpbiBGaXJlZm94LCBJRSA4LzkvMTAvMTEsIGFuZCBPcGVyYS5cbi8vIENvcnJlY3QgYHNlbGVjdGAgc3R5bGUgaW5oZXJpdGFuY2UgaW4gRmlyZWZveC5cbi8vXG5cbmJ1dHRvbixcbnNlbGVjdCB7XG4gIHRleHQtdHJhbnNmb3JtOiBub25lO1xufVxuXG4vL1xuLy8gMS4gQXZvaWQgdGhlIFdlYktpdCBidWcgaW4gQW5kcm9pZCA0LjAuKiB3aGVyZSAoMikgZGVzdHJveXMgbmF0aXZlIGBhdWRpb2Bcbi8vICAgIGFuZCBgdmlkZW9gIGNvbnRyb2xzLlxuLy8gMi4gQ29ycmVjdCBpbmFiaWxpdHkgdG8gc3R5bGUgY2xpY2thYmxlIGBpbnB1dGAgdHlwZXMgaW4gaU9TLlxuLy8gMy4gSW1wcm92ZSB1c2FiaWxpdHkgYW5kIGNvbnNpc3RlbmN5IG9mIGN1cnNvciBzdHlsZSBiZXR3ZWVuIGltYWdlLXR5cGVcbi8vICAgIGBpbnB1dGAgYW5kIG90aGVycy5cbi8vXG5cbmJ1dHRvbixcbmh0bWwgaW5wdXRbdHlwZT1cImJ1dHRvblwiXSwgLy8gMVxuaW5wdXRbdHlwZT1cInJlc2V0XCJdLFxuaW5wdXRbdHlwZT1cInN1Ym1pdFwiXSB7XG4gIC13ZWJraXQtYXBwZWFyYW5jZTogYnV0dG9uOyAvLyAyXG4gIGN1cnNvcjogcG9pbnRlcjsgLy8gM1xufVxuXG4vL1xuLy8gUmUtc2V0IGRlZmF1bHQgY3Vyc29yIGZvciBkaXNhYmxlZCBlbGVtZW50cy5cbi8vXG5cbmJ1dHRvbltkaXNhYmxlZF0sXG5odG1sIGlucHV0W2Rpc2FibGVkXSB7XG4gIGN1cnNvcjogZGVmYXVsdDtcbn1cblxuLy9cbi8vIFJlbW92ZSBpbm5lciBwYWRkaW5nIGFuZCBib3JkZXIgaW4gRmlyZWZveCA0Ky5cbi8vXG5cbmJ1dHRvbjo6LW1vei1mb2N1cy1pbm5lcixcbmlucHV0OjotbW96LWZvY3VzLWlubmVyIHtcbiAgYm9yZGVyOiAwO1xuICBwYWRkaW5nOiAwO1xufVxuXG4vL1xuLy8gQWRkcmVzcyBGaXJlZm94IDQrIHNldHRpbmcgYGxpbmUtaGVpZ2h0YCBvbiBgaW5wdXRgIHVzaW5nIGAhaW1wb3J0YW50YCBpblxuLy8gdGhlIFVBIHN0eWxlc2hlZXQuXG4vL1xuXG5pbnB1dCB7XG4gIGxpbmUtaGVpZ2h0OiBub3JtYWw7XG59XG5cbi8vXG4vLyBJdCdzIHJlY29tbWVuZGVkIHRoYXQgeW91IGRvbid0IGF0dGVtcHQgdG8gc3R5bGUgdGhlc2UgZWxlbWVudHMuXG4vLyBGaXJlZm94J3MgaW1wbGVtZW50YXRpb24gZG9lc24ndCByZXNwZWN0IGJveC1zaXppbmcsIHBhZGRpbmcsIG9yIHdpZHRoLlxuLy9cbi8vIDEuIEFkZHJlc3MgYm94IHNpemluZyBzZXQgdG8gYGNvbnRlbnQtYm94YCBpbiBJRSA4LzkvMTAuXG4vLyAyLiBSZW1vdmUgZXhjZXNzIHBhZGRpbmcgaW4gSUUgOC85LzEwLlxuLy9cblxuaW5wdXRbdHlwZT1cImNoZWNrYm94XCJdLFxuaW5wdXRbdHlwZT1cInJhZGlvXCJdIHtcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDsgLy8gMVxuICBwYWRkaW5nOiAwOyAvLyAyXG59XG5cbi8vXG4vLyBGaXggdGhlIGN1cnNvciBzdHlsZSBmb3IgQ2hyb21lJ3MgaW5jcmVtZW50L2RlY3JlbWVudCBidXR0b25zLiBGb3IgY2VydGFpblxuLy8gYGZvbnQtc2l6ZWAgdmFsdWVzIG9mIHRoZSBgaW5wdXRgLCBpdCBjYXVzZXMgdGhlIGN1cnNvciBzdHlsZSBvZiB0aGVcbi8vIGRlY3JlbWVudCBidXR0b24gdG8gY2hhbmdlIGZyb20gYGRlZmF1bHRgIHRvIGB0ZXh0YC5cbi8vXG5cbmlucHV0W3R5cGU9XCJudW1iZXJcIl06Oi13ZWJraXQtaW5uZXItc3Bpbi1idXR0b24sXG5pbnB1dFt0eXBlPVwibnVtYmVyXCJdOjotd2Via2l0LW91dGVyLXNwaW4tYnV0dG9uIHtcbiAgaGVpZ2h0OiBhdXRvO1xufVxuXG4vL1xuLy8gMS4gQWRkcmVzcyBgYXBwZWFyYW5jZWAgc2V0IHRvIGBzZWFyY2hmaWVsZGAgaW4gU2FmYXJpIGFuZCBDaHJvbWUuXG4vLyAyLiBBZGRyZXNzIGBib3gtc2l6aW5nYCBzZXQgdG8gYGJvcmRlci1ib3hgIGluIFNhZmFyaSBhbmQgQ2hyb21lXG4vLyAgICAoaW5jbHVkZSBgLW1vemAgdG8gZnV0dXJlLXByb29mKS5cbi8vXG5cbmlucHV0W3R5cGU9XCJzZWFyY2hcIl0ge1xuICAtd2Via2l0LWFwcGVhcmFuY2U6IHRleHRmaWVsZDsgLy8gMVxuICAtbW96LWJveC1zaXppbmc6IGNvbnRlbnQtYm94O1xuICAtd2Via2l0LWJveC1zaXppbmc6IGNvbnRlbnQtYm94OyAvLyAyXG4gIGJveC1zaXppbmc6IGNvbnRlbnQtYm94O1xufVxuXG4vL1xuLy8gUmVtb3ZlIGlubmVyIHBhZGRpbmcgYW5kIHNlYXJjaCBjYW5jZWwgYnV0dG9uIGluIFNhZmFyaSBhbmQgQ2hyb21lIG9uIE9TIFguXG4vLyBTYWZhcmkgKGJ1dCBub3QgQ2hyb21lKSBjbGlwcyB0aGUgY2FuY2VsIGJ1dHRvbiB3aGVuIHRoZSBzZWFyY2ggaW5wdXQgaGFzXG4vLyBwYWRkaW5nIChhbmQgYHRleHRmaWVsZGAgYXBwZWFyYW5jZSkuXG4vL1xuXG5pbnB1dFt0eXBlPVwic2VhcmNoXCJdOjotd2Via2l0LXNlYXJjaC1jYW5jZWwtYnV0dG9uLFxuaW5wdXRbdHlwZT1cInNlYXJjaFwiXTo6LXdlYmtpdC1zZWFyY2gtZGVjb3JhdGlvbiB7XG4gIC13ZWJraXQtYXBwZWFyYW5jZTogbm9uZTtcbn1cblxuLy9cbi8vIERlZmluZSBjb25zaXN0ZW50IGJvcmRlciwgbWFyZ2luLCBhbmQgcGFkZGluZy5cbi8vXG5cbmZpZWxkc2V0IHtcbiAgYm9yZGVyOiAxcHggc29saWQgI2MwYzBjMDtcbiAgbWFyZ2luOiAwIDJweDtcbiAgcGFkZGluZzogMC4zNWVtIDAuNjI1ZW0gMC43NWVtO1xufVxuXG4vL1xuLy8gMS4gQ29ycmVjdCBgY29sb3JgIG5vdCBiZWluZyBpbmhlcml0ZWQgaW4gSUUgOC85LzEwLzExLlxuLy8gMi4gUmVtb3ZlIHBhZGRpbmcgc28gcGVvcGxlIGFyZW4ndCBjYXVnaHQgb3V0IGlmIHRoZXkgemVybyBvdXQgZmllbGRzZXRzLlxuLy9cblxubGVnZW5kIHtcbiAgYm9yZGVyOiAwOyAvLyAxXG4gIHBhZGRpbmc6IDA7IC8vIDJcbn1cblxuLy9cbi8vIFJlbW92ZSBkZWZhdWx0IHZlcnRpY2FsIHNjcm9sbGJhciBpbiBJRSA4LzkvMTAvMTEuXG4vL1xuXG50ZXh0YXJlYSB7XG4gIG92ZXJmbG93OiBhdXRvO1xufVxuXG4vL1xuLy8gRG9uJ3QgaW5oZXJpdCB0aGUgYGZvbnQtd2VpZ2h0YCAoYXBwbGllZCBieSBhIHJ1bGUgYWJvdmUpLlxuLy8gTk9URTogdGhlIGRlZmF1bHQgY2Fubm90IHNhZmVseSBiZSBjaGFuZ2VkIGluIENocm9tZSBhbmQgU2FmYXJpIG9uIE9TIFguXG4vL1xuXG5vcHRncm91cCB7XG4gIGZvbnQtd2VpZ2h0OiBib2xkO1xufVxuXG4vLyBUYWJsZXNcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8vXG4vLyBSZW1vdmUgbW9zdCBzcGFjaW5nIGJldHdlZW4gdGFibGUgY2VsbHMuXG4vL1xuXG50YWJsZSB7XG4gIGJvcmRlci1jb2xsYXBzZTogY29sbGFwc2U7XG4gIGJvcmRlci1zcGFjaW5nOiAwO1xufVxuXG50ZCxcbnRoIHtcbiAgcGFkZGluZzogMDtcbn1cbiIsIi8qISBTb3VyY2U6IGh0dHBzOi8vZ2l0aHViLmNvbS9oNWJwL2h0bWw1LWJvaWxlcnBsYXRlL2Jsb2IvbWFzdGVyL3NyYy9jc3MvbWFpbi5jc3MgKi9cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFByaW50IHN0eWxlcy5cbi8vIElubGluZWQgdG8gYXZvaWQgdGhlIGFkZGl0aW9uYWwgSFRUUCByZXF1ZXN0OiBoNWJwLmNvbS9yXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5AbWVkaWEgcHJpbnQge1xuICAgICosXG4gICAgKjpiZWZvcmUsXG4gICAgKjphZnRlciB7XG4gICAgICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50ICFpbXBvcnRhbnQ7XG4gICAgICAgIGNvbG9yOiAjMDAwICFpbXBvcnRhbnQ7IC8vIEJsYWNrIHByaW50cyBmYXN0ZXI6IGg1YnAuY29tL3NcbiAgICAgICAgYm94LXNoYWRvdzogbm9uZSAhaW1wb3J0YW50O1xuICAgICAgICB0ZXh0LXNoYWRvdzogbm9uZSAhaW1wb3J0YW50O1xuICAgIH1cblxuICAgIGEsXG4gICAgYTp2aXNpdGVkIHtcbiAgICAgICAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7XG4gICAgfVxuXG4gICAgYVtocmVmXTphZnRlciB7XG4gICAgICAgIGNvbnRlbnQ6IFwiIChcIiBhdHRyKGhyZWYpIFwiKVwiO1xuICAgIH1cblxuICAgIGFiYnJbdGl0bGVdOmFmdGVyIHtcbiAgICAgICAgY29udGVudDogXCIgKFwiIGF0dHIodGl0bGUpIFwiKVwiO1xuICAgIH1cblxuICAgIC8vIERvbid0IHNob3cgbGlua3MgdGhhdCBhcmUgZnJhZ21lbnQgaWRlbnRpZmllcnMsXG4gICAgLy8gb3IgdXNlIHRoZSBgamF2YXNjcmlwdDpgIHBzZXVkbyBwcm90b2NvbFxuICAgIGFbaHJlZl49XCIjXCJdOmFmdGVyLFxuICAgIGFbaHJlZl49XCJqYXZhc2NyaXB0OlwiXTphZnRlciB7XG4gICAgICAgIGNvbnRlbnQ6IFwiXCI7XG4gICAgfVxuXG4gICAgcHJlLFxuICAgIGJsb2NrcXVvdGUge1xuICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAjOTk5O1xuICAgICAgICBwYWdlLWJyZWFrLWluc2lkZTogYXZvaWQ7XG4gICAgfVxuXG4gICAgdGhlYWQge1xuICAgICAgICBkaXNwbGF5OiB0YWJsZS1oZWFkZXItZ3JvdXA7IC8vIGg1YnAuY29tL3RcbiAgICB9XG5cbiAgICB0cixcbiAgICBpbWcge1xuICAgICAgICBwYWdlLWJyZWFrLWluc2lkZTogYXZvaWQ7XG4gICAgfVxuXG4gICAgaW1nIHtcbiAgICAgICAgbWF4LXdpZHRoOiAxMDAlICFpbXBvcnRhbnQ7XG4gICAgfVxuXG4gICAgcCxcbiAgICBoMixcbiAgICBoMyB7XG4gICAgICAgIG9ycGhhbnM6IDM7XG4gICAgICAgIHdpZG93czogMztcbiAgICB9XG5cbiAgICBoMixcbiAgICBoMyB7XG4gICAgICAgIHBhZ2UtYnJlYWstYWZ0ZXI6IGF2b2lkO1xuICAgIH1cblxuICAgIC8vIEJvb3RzdHJhcCBzcGVjaWZpYyBjaGFuZ2VzIHN0YXJ0XG4gICAgLy9cbiAgICAvLyBDaHJvbWUgKE9TWCkgZml4IGZvciBodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvaXNzdWVzLzExMjQ1XG4gICAgLy8gT25jZSBmaXhlZCwgd2UgY2FuIGp1c3Qgc3RyYWlnaHQgdXAgcmVtb3ZlIHRoaXMuXG4gICAgc2VsZWN0IHtcbiAgICAgICAgYmFja2dyb3VuZDogI2ZmZiAhaW1wb3J0YW50O1xuICAgIH1cblxuICAgIC8vIEJvb3RzdHJhcCBjb21wb25lbnRzXG4gICAgLm5hdmJhciB7XG4gICAgICAgIGRpc3BsYXk6IG5vbmU7XG4gICAgfVxuICAgIC5idG4sXG4gICAgLmRyb3B1cCA+IC5idG4ge1xuICAgICAgICA+IC5jYXJldCB7XG4gICAgICAgICAgICBib3JkZXItdG9wLWNvbG9yOiAjMDAwICFpbXBvcnRhbnQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLmxhYmVsIHtcbiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgIzAwMDtcbiAgICB9XG5cbiAgICAudGFibGUge1xuICAgICAgICBib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlICFpbXBvcnRhbnQ7XG5cbiAgICAgICAgdGQsXG4gICAgICAgIHRoIHtcbiAgICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmYgIWltcG9ydGFudDtcbiAgICAgICAgfVxuICAgIH1cbiAgICAudGFibGUtYm9yZGVyZWQge1xuICAgICAgICB0aCxcbiAgICAgICAgdGQge1xuICAgICAgICAgICAgYm9yZGVyOiAxcHggc29saWQgI2RkZCAhaW1wb3J0YW50O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gQm9vdHN0cmFwIHNwZWNpZmljIGNoYW5nZXMgZW5kXG59XG4iLCIvL1xuLy8gR2x5cGhpY29ucyBmb3IgQm9vdHN0cmFwXG4vL1xuLy8gU2luY2UgaWNvbnMgYXJlIGZvbnRzLCB0aGV5IGNhbiBiZSBwbGFjZWQgYW55d2hlcmUgdGV4dCBpcyBwbGFjZWQgYW5kIGFyZVxuLy8gdGh1cyBhdXRvbWF0aWNhbGx5IHNpemVkIHRvIG1hdGNoIHRoZSBzdXJyb3VuZGluZyBjaGlsZC4gVG8gdXNlLCBjcmVhdGUgYW5cbi8vIGlubGluZSBlbGVtZW50IHdpdGggdGhlIGFwcHJvcHJpYXRlIGNsYXNzZXMsIGxpa2Ugc286XG4vL1xuLy8gPGEgaHJlZj1cIiNcIj48c3BhbiBjbGFzcz1cImdseXBoaWNvbiBnbHlwaGljb24tc3RhclwiPjwvc3Bhbj4gU3RhcjwvYT5cblxuLy8gSW1wb3J0IHRoZSBmb250c1xuQGZvbnQtZmFjZSB7XG4gIGZvbnQtZmFtaWx5OiAnR2x5cGhpY29ucyBIYWxmbGluZ3MnO1xuICBzcmM6IHVybCgnQHtpY29uLWZvbnQtcGF0aH1Ae2ljb24tZm9udC1uYW1lfS5lb3QnKTtcbiAgc3JjOiB1cmwoJ0B7aWNvbi1mb250LXBhdGh9QHtpY29uLWZvbnQtbmFtZX0uZW90PyNpZWZpeCcpIGZvcm1hdCgnZW1iZWRkZWQtb3BlbnR5cGUnKSxcbiAgICAgICB1cmwoJ0B7aWNvbi1mb250LXBhdGh9QHtpY29uLWZvbnQtbmFtZX0ud29mZicpIGZvcm1hdCgnd29mZicpLFxuICAgICAgIHVybCgnQHtpY29uLWZvbnQtcGF0aH1Ae2ljb24tZm9udC1uYW1lfS50dGYnKSBmb3JtYXQoJ3RydWV0eXBlJyksXG4gICAgICAgdXJsKCdAe2ljb24tZm9udC1wYXRofUB7aWNvbi1mb250LW5hbWV9LnN2ZyNAe2ljb24tZm9udC1zdmctaWR9JykgZm9ybWF0KCdzdmcnKTtcbn1cblxuLy8gQ2F0Y2hhbGwgYmFzZWNsYXNzXG4uZ2x5cGhpY29uIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICB0b3A6IDFweDtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICBmb250LWZhbWlseTogJ0dseXBoaWNvbnMgSGFsZmxpbmdzJztcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xuICBmb250LXdlaWdodDogbm9ybWFsO1xuICBsaW5lLWhlaWdodDogMTtcbiAgLXdlYmtpdC1mb250LXNtb290aGluZzogYW50aWFsaWFzZWQ7XG4gIC1tb3otb3N4LWZvbnQtc21vb3RoaW5nOiBncmF5c2NhbGU7XG59XG5cbi8vIEluZGl2aWR1YWwgaWNvbnNcbi5nbHlwaGljb24tYXN0ZXJpc2sgICAgICAgICAgICAgICB7ICY6YmVmb3JlIHsgY29udGVudDogXCJcXDJhXCI7IH0gfVxuLmdseXBoaWNvbi1wbHVzICAgICAgICAgICAgICAgICAgIHsgJjpiZWZvcmUgeyBjb250ZW50OiBcIlxcMmJcIjsgfSB9XG4uZ2x5cGhpY29uLWV1cm8sXG4uZ2x5cGhpY29uLWV1ciAgICAgICAgICAgICAgICAgICAgeyAmOmJlZm9yZSB7IGNvbnRlbnQ6IFwiXFwyMGFjXCI7IH0gfVxuLmdseXBoaWNvbi1taW51cyAgICAgICAgICAgICAgICAgIHsgJjpiZWZvcmUgeyBjb250ZW50OiBcIlxcMjIxMlwiOyB9IH1cbi5nbHlwaGljb24tY2xvdWQgICAgICAgICAgICAgICAgICB7ICY6YmVmb3JlIHsgY29udGVudDogXCJcXDI2MDFcIjsgfSB9XG4uZ2x5cGhpY29uLWVudmVsb3BlICAgICAgICAgICAgICAgeyAmOmJlZm9yZSB7IGNvbnRlbnQ6IFwiXFwyNzA5XCI7IH0gfVxuLmdseXBoaWNvbi1wZW5jaWwgICAgICAgICAgICAgICAgIHsgJjpiZWZvcmUgeyBjb250ZW50OiBcIlxcMjcwZlwiOyB9IH1cbi5nbHlwaGljb24tZ2xhc3MgICAgICAgICAgICAgICAgICB7ICY6YmVmb3JlIHsgY29udGVudDogXCJcXGUwMDFcIjsgfSB9XG4uZ2x5cGhpY29uLW11c2ljICAgICAgICAgICAgICAgICAgeyAmOmJlZm9yZSB7IGNvbnRlbnQ6IFwiXFxlMDAyXCI7IH0gfVxuLmdseXBoaWNvbi1zZWFyY2ggICAgICAgICAgICAgICAgIHsgJjpiZWZvcmUgeyBjb250ZW50OiBcIlxcZTAwM1wiOyB9IH1cbi5nbHlwaGljb24taGVhcnQgICAgICAgICAgICAgICAgICB7ICY6YmVmb3JlIHsgY29udGVudDogXCJcXGUwMDVcIjsgfSB9XG4uZ2x5cGhpY29uLXN0YXIgICAgICAgICAgICAgICAgICAgeyAmOmJlZm9yZSB7IGNvbnRlbnQ6IFwiXFxlMDA2XCI7IH0gfVxuLmdseXBoaWNvbi1zdGFyLWVtcHR5ICAgICAgICAgICAgIHsgJjpiZWZvcmUgeyBjb250ZW50OiBcIlxcZTAwN1wiOyB9IH1cbi5nbHlwaGljb24tdXNlciAgICAgICAgICAgICAgICAgICB7ICY6YmVmb3JlIHsgY29udGVudDogXCJcXGUwMDhcIjsgfSB9XG4uZ2x5cGhpY29uLWZpbG0gICAgICAgICAgICAgICAgICAgeyAmOmJlZm9yZSB7IGNvbnRlbnQ6IFwiXFxlMDA5XCI7IH0gfVxuLmdseXBoaWNvbi10aC1sYXJnZSAgICAgICAgICAgICAgIHsgJjpiZWZvcmUgeyBjb250ZW50OiBcIlxcZTAxMFwiOyB9IH1cbi5nbHlwaGljb24tdGggICAgICAgICAgICAgICAgICAgICB7ICY6YmVmb3JlIHsgY29udGVudDogXCJcXGUwMTFcIjsgfSB9XG4uZ2x5cGhpY29uLXRoLWxpc3QgICAgICAgICAgICAgICAgeyAmOmJlZm9yZSB7IGNvbnRlbnQ6IFwiXFxlMDEyXCI7IH0gfVxuLmdseXBoaWNvbi1vayAgICAgICAgICAgICAgICAgICAgIHsgJjpiZWZvcmUgeyBjb250ZW50OiBcIlxcZTAxM1wiOyB9IH1cbi5nbHlwaGljb24tcmVtb3ZlICAgICAgICAgICAgICAgICB7ICY6YmVmb3JlIHsgY29udGVudDogXCJcXGUwMTRcIjsgfSB9XG4uZ2x5cGhpY29uLXpvb20taW4gICAgICAgICAgICAgICAgeyAmOmJlZm9yZSB7IGNvbnRlbnQ6IFwiXFxlMDE1XCI7IH0gfVxuLmdseXBoaWNvbi16b29tLW91dCAgICAgICAgICAgICAgIHsgJjpiZWZvcmUgeyBjb250ZW50OiBcIlxcZTAxNlwiOyB9IH1cbi5nbHlwaGljb24tb2ZmICAgICAgICAgICAgICAgICAgICB7ICY6YmVmb3JlIHsgY29udGVudDogXCJcXGUwMTdcIjsgfSB9XG4uZ2x5cGhpY29uLXNpZ25hbCAgICAgICAgICAgICAgICAgeyAmOmJlZm9yZSB7IGNvbnRlbnQ6IFwiXFxlMDE4XCI7IH0gfVxuLmdseXBoaWNvbi1jb2cgICAgICAgICAgICAgICAgICAgIHsgJjpiZWZvcmUgeyBjb250ZW50OiBcIlxcZTAxOVwiOyB9IH1cbi5nbHlwaGljb24tdHJhc2ggICAgICAgICAgICAgICAgICB7ICY6YmVmb3JlIHsgY29udGVudDogXCJcXGUwMjBcIjsgfSB9XG4uZ2x5cGhpY29uLWhvbWUgICAgICAgICAgICAgICAgICAgeyAmOmJlZm9yZSB7IGNvbnRlbnQ6IFwiXFxlMDIxXCI7IH0gfVxuLmdseXBoaWNvbi1maWxlICAgICAgICAgICAgICAgICAgIHsgJjpiZWZvcmUgeyBjb250ZW50OiBcIlxcZTAyMlwiOyB9IH1cbi5nbHlwaGljb24tdGltZSAgICAgICAgICAgICAgICAgICB7ICY6YmVmb3JlIHsgY29udGVudDogXCJcXGUwMjNcIjsgfSB9XG4uZ2x5cGhpY29uLXJvYWQgICAgICAgICAgICAgICAgICAgeyAmOmJlZm9yZSB7IGNvbnRlbnQ6IFwiXFxlMDI0XCI7IH0gfVxuLmdseXBoaWNvbi1kb3dubG9hZC1hbHQgICAgICAgICAgIHsgJjpiZWZvcmUgeyBjb250ZW50OiBcIlxcZTAyNVwiOyB9IH1cbi5nbHlwaGljb24tZG93bmxvYWQgICAgICAgICAgICAgICB7ICY6YmVmb3JlIHsgY29udGVudDogXCJcXGUwMjZcIjsgfSB9XG4uZ2x5cGhpY29uLXVwbG9hZCAgICAgICAgICAgICAgICAgeyAmOmJlZm9yZSB7IGNvbnRlbnQ6IFwiXFxlMDI3XCI7IH0gfVxuLmdseXBoaWNvbi1pbmJveCAgICAgICAgICAgICAgICAgIHsgJjpiZWZvcmUgeyBjb250ZW50OiBcIlxcZTAyOFwiOyB9IH1cbi5nbHlwaGljb24tcGxheS1jaXJjbGUgICAgICAgICAgICB7ICY6YmVmb3JlIHsgY29udGVudDogXCJcXGUwMjlcIjsgfSB9XG4uZ2x5cGhpY29uLXJlcGVhdCAgICAgICAgICAgICAgICAgeyAmOmJlZm9yZSB7IGNvbnRlbnQ6IFwiXFxlMDMwXCI7IH0gfVxuLmdseXBoaWNvbi1yZWZyZXNoICAgICAgICAgICAgICAgIHsgJjpiZWZvcmUgeyBjb250ZW50OiBcIlxcZTAzMVwiOyB9IH1cbi5nbHlwaGljb24tbGlzdC1hbHQgICAgICAgICAgICAgICB7ICY6YmVmb3JlIHsgY29udGVudDogXCJcXGUwMzJcIjsgfSB9XG4uZ2x5cGhpY29uLWxvY2sgICAgICAgICAgICAgICAgICAgeyAmOmJlZm9yZSB7IGNvbnRlbnQ6IFwiXFxlMDMzXCI7IH0gfVxuLmdseXBoaWNvbi1mbGFnICAgICAgICAgICAgICAgICAgIHsgJjpiZWZvcmUgeyBjb250ZW50OiBcIlxcZTAzNFwiOyB9IH1cbi5nbHlwaGljb24taGVhZHBob25lcyAgICAgICAgICAgICB7ICY6YmVmb3JlIHsgY29udGVudDogXCJcXGUwMzVcIjsgfSB9XG4uZ2x5cGhpY29uLXZvbHVtZS1vZmYgICAgICAgICAgICAgeyAmOmJlZm9yZSB7IGNvbnRlbnQ6IFwiXFxlMDM2XCI7IH0gfVxuLmdseXBoaWNvbi12b2x1bWUtZG93biAgICAgICAgICAgIHsgJjpiZWZvcmUgeyBjb250ZW50OiBcIlxcZTAzN1wiOyB9IH1cbi5nbHlwaGljb24tdm9sdW1lLXVwICAgICAgICAgICAgICB7ICY6YmVmb3JlIHsgY29udGVudDogXCJcXGUwMzhcIjsgfSB9XG4uZ2x5cGhpY29uLXFyY29kZSAgICAgICAgICAgICAgICAgeyAmOmJlZm9yZSB7IGNvbnRlbnQ6IFwiXFxlMDM5XCI7IH0gfVxuLmdseXBoaWNvbi1iYXJjb2RlICAgICAgICAgICAgICAgIHsgJjpiZWZvcmUgeyBjb250ZW50OiBcIlxcZTA0MFwiOyB9IH1cbi5nbHlwaGljb24tdGFnICAgICAgICAgICAgICAgICAgICB7ICY6YmVmb3JlIHsgY29udGVudDogXCJcXGUwNDFcIjsgfSB9XG4uZ2x5cGhpY29uLXRhZ3MgICAgICAgICAgICAgICAgICAgeyAmOmJlZm9yZSB7IGNvbnRlbnQ6IFwiXFxlMDQyXCI7IH0gfVxuLmdseXBoaWNvbi1ib29rICAgICAgICAgICAgICAgICAgIHsgJjpiZWZvcmUgeyBjb250ZW50OiBcIlxcZTA0M1wiOyB9IH1cbi5nbHlwaGljb24tYm9va21hcmsgICAgICAgICAgICAgICB7ICY6YmVmb3JlIHsgY29udGVudDogXCJcXGUwNDRcIjsgfSB9XG4uZ2x5cGhpY29uLXByaW50ICAgICAgICAgICAgICAgICAgeyAmOmJlZm9yZSB7IGNvbnRlbnQ6IFwiXFxlMDQ1XCI7IH0gfVxuLmdseXBoaWNvbi1jYW1lcmEgICAgICAgICAgICAgICAgIHsgJjpiZWZvcmUgeyBjb250ZW50OiBcIlxcZTA0NlwiOyB9IH1cbi5nbHlwaGljb24tZm9udCAgICAgICAgICAgICAgICAgICB7ICY6YmVmb3JlIHsgY29udGVudDogXCJcXGUwNDdcIjsgfSB9XG4uZ2x5cGhpY29uLWJvbGQgICAgICAgICAgICAgICAgICAgeyAmOmJlZm9yZSB7IGNvbnRlbnQ6IFwiXFxlMDQ4XCI7IH0gfVxuLmdseXBoaWNvbi1pdGFsaWMgICAgICAgICAgICAgICAgIHsgJjpiZWZvcmUgeyBjb250ZW50OiBcIlxcZTA0OVwiOyB9IH1cbi5nbHlwaGljb24tdGV4dC1oZWlnaHQgICAgICAgICAgICB7ICY6YmVmb3JlIHsgY29udGVudDogXCJcXGUwNTBcIjsgfSB9XG4uZ2x5cGhpY29uLXRleHQtd2lkdGggICAgICAgICAgICAgeyAmOmJlZm9yZSB7IGNvbnRlbnQ6IFwiXFxlMDUxXCI7IH0gfVxuLmdseXBoaWNvbi1hbGlnbi1sZWZ0ICAgICAgICAgICAgIHsgJjpiZWZvcmUgeyBjb250ZW50OiBcIlxcZTA1MlwiOyB9IH1cbi5nbHlwaGljb24tYWxpZ24tY2VudGVyICAgICAgICAgICB7ICY6YmVmb3JlIHsgY29udGVudDogXCJcXGUwNTNcIjsgfSB9XG4uZ2x5cGhpY29uLWFsaWduLXJpZ2h0ICAgICAgICAgICAgeyAmOmJlZm9yZSB7IGNvbnRlbnQ6IFwiXFxlMDU0XCI7IH0gfVxuLmdseXBoaWNvbi1hbGlnbi1qdXN0aWZ5ICAgICAgICAgIHsgJjpiZWZvcmUgeyBjb250ZW50OiBcIlxcZTA1NVwiOyB9IH1cbi5nbHlwaGljb24tbGlzdCAgICAgICAgICAgICAgICAgICB7ICY6YmVmb3JlIHsgY29udGVudDogXCJcXGUwNTZcIjsgfSB9XG4uZ2x5cGhpY29uLWluZGVudC1sZWZ0ICAgICAgICAgICAgeyAmOmJlZm9yZSB7IGNvbnRlbnQ6IFwiXFxlMDU3XCI7IH0gfVxuLmdseXBoaWNvbi1pbmRlbnQtcmlnaHQgICAgICAgICAgIHsgJjpiZWZvcmUgeyBjb250ZW50OiBcIlxcZTA1OFwiOyB9IH1cbi5nbHlwaGljb24tZmFjZXRpbWUtdmlkZW8gICAgICAgICB7ICY6YmVmb3JlIHsgY29udGVudDogXCJcXGUwNTlcIjsgfSB9XG4uZ2x5cGhpY29uLXBpY3R1cmUgICAgICAgICAgICAgICAgeyAmOmJlZm9yZSB7IGNvbnRlbnQ6IFwiXFxlMDYwXCI7IH0gfVxuLmdseXBoaWNvbi1tYXAtbWFya2VyICAgICAgICAgICAgIHsgJjpiZWZvcmUgeyBjb250ZW50OiBcIlxcZTA2MlwiOyB9IH1cbi5nbHlwaGljb24tYWRqdXN0ICAgICAgICAgICAgICAgICB7ICY6YmVmb3JlIHsgY29udGVudDogXCJcXGUwNjNcIjsgfSB9XG4uZ2x5cGhpY29uLXRpbnQgICAgICAgICAgICAgICAgICAgeyAmOmJlZm9yZSB7IGNvbnRlbnQ6IFwiXFxlMDY0XCI7IH0gfVxuLmdseXBoaWNvbi1lZGl0ICAgICAgICAgICAgICAgICAgIHsgJjpiZWZvcmUgeyBjb250ZW50OiBcIlxcZTA2NVwiOyB9IH1cbi5nbHlwaGljb24tc2hhcmUgICAgICAgICAgICAgICAgICB7ICY6YmVmb3JlIHsgY29udGVudDogXCJcXGUwNjZcIjsgfSB9XG4uZ2x5cGhpY29uLWNoZWNrICAgICAgICAgICAgICAgICAgeyAmOmJlZm9yZSB7IGNvbnRlbnQ6IFwiXFxlMDY3XCI7IH0gfVxuLmdseXBoaWNvbi1tb3ZlICAgICAgICAgICAgICAgICAgIHsgJjpiZWZvcmUgeyBjb250ZW50OiBcIlxcZTA2OFwiOyB9IH1cbi5nbHlwaGljb24tc3RlcC1iYWNrd2FyZCAgICAgICAgICB7ICY6YmVmb3JlIHsgY29udGVudDogXCJcXGUwNjlcIjsgfSB9XG4uZ2x5cGhpY29uLWZhc3QtYmFja3dhcmQgICAgICAgICAgeyAmOmJlZm9yZSB7IGNvbnRlbnQ6IFwiXFxlMDcwXCI7IH0gfVxuLmdseXBoaWNvbi1iYWNrd2FyZCAgICAgICAgICAgICAgIHsgJjpiZWZvcmUgeyBjb250ZW50OiBcIlxcZTA3MVwiOyB9IH1cbi5nbHlwaGljb24tcGxheSAgICAgICAgICAgICAgICAgICB7ICY6YmVmb3JlIHsgY29udGVudDogXCJcXGUwNzJcIjsgfSB9XG4uZ2x5cGhpY29uLXBhdXNlICAgICAgICAgICAgICAgICAgeyAmOmJlZm9yZSB7IGNvbnRlbnQ6IFwiXFxlMDczXCI7IH0gfVxuLmdseXBoaWNvbi1zdG9wICAgICAgICAgICAgICAgICAgIHsgJjpiZWZvcmUgeyBjb250ZW50OiBcIlxcZTA3NFwiOyB9IH1cbi5nbHlwaGljb24tZm9yd2FyZCAgICAgICAgICAgICAgICB7ICY6YmVmb3JlIHsgY29udGVudDogXCJcXGUwNzVcIjsgfSB9XG4uZ2x5cGhpY29uLWZhc3QtZm9yd2FyZCAgICAgICAgICAgeyAmOmJlZm9yZSB7IGNvbnRlbnQ6IFwiXFxlMDc2XCI7IH0gfVxuLmdseXBoaWNvbi1zdGVwLWZvcndhcmQgICAgICAgICAgIHsgJjpiZWZvcmUgeyBjb250ZW50OiBcIlxcZTA3N1wiOyB9IH1cbi5nbHlwaGljb24tZWplY3QgICAgICAgICAgICAgICAgICB7ICY6YmVmb3JlIHsgY29udGVudDogXCJcXGUwNzhcIjsgfSB9XG4uZ2x5cGhpY29uLWNoZXZyb24tbGVmdCAgICAgICAgICAgeyAmOmJlZm9yZSB7IGNvbnRlbnQ6IFwiXFxlMDc5XCI7IH0gfVxuLmdseXBoaWNvbi1jaGV2cm9uLXJpZ2h0ICAgICAgICAgIHsgJjpiZWZvcmUgeyBjb250ZW50OiBcIlxcZTA4MFwiOyB9IH1cbi5nbHlwaGljb24tcGx1cy1zaWduICAgICAgICAgICAgICB7ICY6YmVmb3JlIHsgY29udGVudDogXCJcXGUwODFcIjsgfSB9XG4uZ2x5cGhpY29uLW1pbnVzLXNpZ24gICAgICAgICAgICAgeyAmOmJlZm9yZSB7IGNvbnRlbnQ6IFwiXFxlMDgyXCI7IH0gfVxuLmdseXBoaWNvbi1yZW1vdmUtc2lnbiAgICAgICAgICAgIHsgJjpiZWZvcmUgeyBjb250ZW50OiBcIlxcZTA4M1wiOyB9IH1cbi5nbHlwaGljb24tb2stc2lnbiAgICAgICAgICAgICAgICB7ICY6YmVmb3JlIHsgY29udGVudDogXCJcXGUwODRcIjsgfSB9XG4uZ2x5cGhpY29uLXF1ZXN0aW9uLXNpZ24gICAgICAgICAgeyAmOmJlZm9yZSB7IGNvbnRlbnQ6IFwiXFxlMDg1XCI7IH0gfVxuLmdseXBoaWNvbi1pbmZvLXNpZ24gICAgICAgICAgICAgIHsgJjpiZWZvcmUgeyBjb250ZW50OiBcIlxcZTA4NlwiOyB9IH1cbi5nbHlwaGljb24tc2NyZWVuc2hvdCAgICAgICAgICAgICB7ICY6YmVmb3JlIHsgY29udGVudDogXCJcXGUwODdcIjsgfSB9XG4uZ2x5cGhpY29uLXJlbW92ZS1jaXJjbGUgICAgICAgICAgeyAmOmJlZm9yZSB7IGNvbnRlbnQ6IFwiXFxlMDg4XCI7IH0gfVxuLmdseXBoaWNvbi1vay1jaXJjbGUgICAgICAgICAgICAgIHsgJjpiZWZvcmUgeyBjb250ZW50OiBcIlxcZTA4OVwiOyB9IH1cbi5nbHlwaGljb24tYmFuLWNpcmNsZSAgICAgICAgICAgICB7ICY6YmVmb3JlIHsgY29udGVudDogXCJcXGUwOTBcIjsgfSB9XG4uZ2x5cGhpY29uLWFycm93LWxlZnQgICAgICAgICAgICAgeyAmOmJlZm9yZSB7IGNvbnRlbnQ6IFwiXFxlMDkxXCI7IH0gfVxuLmdseXBoaWNvbi1hcnJvdy1yaWdodCAgICAgICAgICAgIHsgJjpiZWZvcmUgeyBjb250ZW50OiBcIlxcZTA5MlwiOyB9IH1cbi5nbHlwaGljb24tYXJyb3ctdXAgICAgICAgICAgICAgICB7ICY6YmVmb3JlIHsgY29udGVudDogXCJcXGUwOTNcIjsgfSB9XG4uZ2x5cGhpY29uLWFycm93LWRvd24gICAgICAgICAgICAgeyAmOmJlZm9yZSB7IGNvbnRlbnQ6IFwiXFxlMDk0XCI7IH0gfVxuLmdseXBoaWNvbi1zaGFyZS1hbHQgICAgICAgICAgICAgIHsgJjpiZWZvcmUgeyBjb250ZW50OiBcIlxcZTA5NVwiOyB9IH1cbi5nbHlwaGljb24tcmVzaXplLWZ1bGwgICAgICAgICAgICB7ICY6YmVmb3JlIHsgY29udGVudDogXCJcXGUwOTZcIjsgfSB9XG4uZ2x5cGhpY29uLXJlc2l6ZS1zbWFsbCAgICAgICAgICAgeyAmOmJlZm9yZSB7IGNvbnRlbnQ6IFwiXFxlMDk3XCI7IH0gfVxuLmdseXBoaWNvbi1leGNsYW1hdGlvbi1zaWduICAgICAgIHsgJjpiZWZvcmUgeyBjb250ZW50OiBcIlxcZTEwMVwiOyB9IH1cbi5nbHlwaGljb24tZ2lmdCAgICAgICAgICAgICAgICAgICB7ICY6YmVmb3JlIHsgY29udGVudDogXCJcXGUxMDJcIjsgfSB9XG4uZ2x5cGhpY29uLWxlYWYgICAgICAgICAgICAgICAgICAgeyAmOmJlZm9yZSB7IGNvbnRlbnQ6IFwiXFxlMTAzXCI7IH0gfVxuLmdseXBoaWNvbi1maXJlICAgICAgICAgICAgICAgICAgIHsgJjpiZWZvcmUgeyBjb250ZW50OiBcIlxcZTEwNFwiOyB9IH1cbi5nbHlwaGljb24tZXllLW9wZW4gICAgICAgICAgICAgICB7ICY6YmVmb3JlIHsgY29udGVudDogXCJcXGUxMDVcIjsgfSB9XG4uZ2x5cGhpY29uLWV5ZS1jbG9zZSAgICAgICAgICAgICAgeyAmOmJlZm9yZSB7IGNvbnRlbnQ6IFwiXFxlMTA2XCI7IH0gfVxuLmdseXBoaWNvbi13YXJuaW5nLXNpZ24gICAgICAgICAgIHsgJjpiZWZvcmUgeyBjb250ZW50OiBcIlxcZTEwN1wiOyB9IH1cbi5nbHlwaGljb24tcGxhbmUgICAgICAgICAgICAgICAgICB7ICY6YmVmb3JlIHsgY29udGVudDogXCJcXGUxMDhcIjsgfSB9XG4uZ2x5cGhpY29uLWNhbGVuZGFyICAgICAgICAgICAgICAgeyAmOmJlZm9yZSB7IGNvbnRlbnQ6IFwiXFxlMTA5XCI7IH0gfVxuLmdseXBoaWNvbi1yYW5kb20gICAgICAgICAgICAgICAgIHsgJjpiZWZvcmUgeyBjb250ZW50OiBcIlxcZTExMFwiOyB9IH1cbi5nbHlwaGljb24tY29tbWVudCAgICAgICAgICAgICAgICB7ICY6YmVmb3JlIHsgY29udGVudDogXCJcXGUxMTFcIjsgfSB9XG4uZ2x5cGhpY29uLW1hZ25ldCAgICAgICAgICAgICAgICAgeyAmOmJlZm9yZSB7IGNvbnRlbnQ6IFwiXFxlMTEyXCI7IH0gfVxuLmdseXBoaWNvbi1jaGV2cm9uLXVwICAgICAgICAgICAgIHsgJjpiZWZvcmUgeyBjb250ZW50OiBcIlxcZTExM1wiOyB9IH1cbi5nbHlwaGljb24tY2hldnJvbi1kb3duICAgICAgICAgICB7ICY6YmVmb3JlIHsgY29udGVudDogXCJcXGUxMTRcIjsgfSB9XG4uZ2x5cGhpY29uLXJldHdlZXQgICAgICAgICAgICAgICAgeyAmOmJlZm9yZSB7IGNvbnRlbnQ6IFwiXFxlMTE1XCI7IH0gfVxuLmdseXBoaWNvbi1zaG9wcGluZy1jYXJ0ICAgICAgICAgIHsgJjpiZWZvcmUgeyBjb250ZW50OiBcIlxcZTExNlwiOyB9IH1cbi5nbHlwaGljb24tZm9sZGVyLWNsb3NlICAgICAgICAgICB7ICY6YmVmb3JlIHsgY29udGVudDogXCJcXGUxMTdcIjsgfSB9XG4uZ2x5cGhpY29uLWZvbGRlci1vcGVuICAgICAgICAgICAgeyAmOmJlZm9yZSB7IGNvbnRlbnQ6IFwiXFxlMTE4XCI7IH0gfVxuLmdseXBoaWNvbi1yZXNpemUtdmVydGljYWwgICAgICAgIHsgJjpiZWZvcmUgeyBjb250ZW50OiBcIlxcZTExOVwiOyB9IH1cbi5nbHlwaGljb24tcmVzaXplLWhvcml6b250YWwgICAgICB7ICY6YmVmb3JlIHsgY29udGVudDogXCJcXGUxMjBcIjsgfSB9XG4uZ2x5cGhpY29uLWhkZCAgICAgICAgICAgICAgICAgICAgeyAmOmJlZm9yZSB7IGNvbnRlbnQ6IFwiXFxlMTIxXCI7IH0gfVxuLmdseXBoaWNvbi1idWxsaG9ybiAgICAgICAgICAgICAgIHsgJjpiZWZvcmUgeyBjb250ZW50OiBcIlxcZTEyMlwiOyB9IH1cbi5nbHlwaGljb24tYmVsbCAgICAgICAgICAgICAgICAgICB7ICY6YmVmb3JlIHsgY29udGVudDogXCJcXGUxMjNcIjsgfSB9XG4uZ2x5cGhpY29uLWNlcnRpZmljYXRlICAgICAgICAgICAgeyAmOmJlZm9yZSB7IGNvbnRlbnQ6IFwiXFxlMTI0XCI7IH0gfVxuLmdseXBoaWNvbi10aHVtYnMtdXAgICAgICAgICAgICAgIHsgJjpiZWZvcmUgeyBjb250ZW50OiBcIlxcZTEyNVwiOyB9IH1cbi5nbHlwaGljb24tdGh1bWJzLWRvd24gICAgICAgICAgICB7ICY6YmVmb3JlIHsgY29udGVudDogXCJcXGUxMjZcIjsgfSB9XG4uZ2x5cGhpY29uLWhhbmQtcmlnaHQgICAgICAgICAgICAgeyAmOmJlZm9yZSB7IGNvbnRlbnQ6IFwiXFxlMTI3XCI7IH0gfVxuLmdseXBoaWNvbi1oYW5kLWxlZnQgICAgICAgICAgICAgIHsgJjpiZWZvcmUgeyBjb250ZW50OiBcIlxcZTEyOFwiOyB9IH1cbi5nbHlwaGljb24taGFuZC11cCAgICAgICAgICAgICAgICB7ICY6YmVmb3JlIHsgY29udGVudDogXCJcXGUxMjlcIjsgfSB9XG4uZ2x5cGhpY29uLWhhbmQtZG93biAgICAgICAgICAgICAgeyAmOmJlZm9yZSB7IGNvbnRlbnQ6IFwiXFxlMTMwXCI7IH0gfVxuLmdseXBoaWNvbi1jaXJjbGUtYXJyb3ctcmlnaHQgICAgIHsgJjpiZWZvcmUgeyBjb250ZW50OiBcIlxcZTEzMVwiOyB9IH1cbi5nbHlwaGljb24tY2lyY2xlLWFycm93LWxlZnQgICAgICB7ICY6YmVmb3JlIHsgY29udGVudDogXCJcXGUxMzJcIjsgfSB9XG4uZ2x5cGhpY29uLWNpcmNsZS1hcnJvdy11cCAgICAgICAgeyAmOmJlZm9yZSB7IGNvbnRlbnQ6IFwiXFxlMTMzXCI7IH0gfVxuLmdseXBoaWNvbi1jaXJjbGUtYXJyb3ctZG93biAgICAgIHsgJjpiZWZvcmUgeyBjb250ZW50OiBcIlxcZTEzNFwiOyB9IH1cbi5nbHlwaGljb24tZ2xvYmUgICAgICAgICAgICAgICAgICB7ICY6YmVmb3JlIHsgY29udGVudDogXCJcXGUxMzVcIjsgfSB9XG4uZ2x5cGhpY29uLXdyZW5jaCAgICAgICAgICAgICAgICAgeyAmOmJlZm9yZSB7IGNvbnRlbnQ6IFwiXFxlMTM2XCI7IH0gfVxuLmdseXBoaWNvbi10YXNrcyAgICAgICAgICAgICAgICAgIHsgJjpiZWZvcmUgeyBjb250ZW50OiBcIlxcZTEzN1wiOyB9IH1cbi5nbHlwaGljb24tZmlsdGVyICAgICAgICAgICAgICAgICB7ICY6YmVmb3JlIHsgY29udGVudDogXCJcXGUxMzhcIjsgfSB9XG4uZ2x5cGhpY29uLWJyaWVmY2FzZSAgICAgICAgICAgICAgeyAmOmJlZm9yZSB7IGNvbnRlbnQ6IFwiXFxlMTM5XCI7IH0gfVxuLmdseXBoaWNvbi1mdWxsc2NyZWVuICAgICAgICAgICAgIHsgJjpiZWZvcmUgeyBjb250ZW50OiBcIlxcZTE0MFwiOyB9IH1cbi5nbHlwaGljb24tZGFzaGJvYXJkICAgICAgICAgICAgICB7ICY6YmVmb3JlIHsgY29udGVudDogXCJcXGUxNDFcIjsgfSB9XG4uZ2x5cGhpY29uLXBhcGVyY2xpcCAgICAgICAgICAgICAgeyAmOmJlZm9yZSB7IGNvbnRlbnQ6IFwiXFxlMTQyXCI7IH0gfVxuLmdseXBoaWNvbi1oZWFydC1lbXB0eSAgICAgICAgICAgIHsgJjpiZWZvcmUgeyBjb250ZW50OiBcIlxcZTE0M1wiOyB9IH1cbi5nbHlwaGljb24tbGluayAgICAgICAgICAgICAgICAgICB7ICY6YmVmb3JlIHsgY29udGVudDogXCJcXGUxNDRcIjsgfSB9XG4uZ2x5cGhpY29uLXBob25lICAgICAgICAgICAgICAgICAgeyAmOmJlZm9yZSB7IGNvbnRlbnQ6IFwiXFxlMTQ1XCI7IH0gfVxuLmdseXBoaWNvbi1wdXNocGluICAgICAgICAgICAgICAgIHsgJjpiZWZvcmUgeyBjb250ZW50OiBcIlxcZTE0NlwiOyB9IH1cbi5nbHlwaGljb24tdXNkICAgICAgICAgICAgICAgICAgICB7ICY6YmVmb3JlIHsgY29udGVudDogXCJcXGUxNDhcIjsgfSB9XG4uZ2x5cGhpY29uLWdicCAgICAgICAgICAgICAgICAgICAgeyAmOmJlZm9yZSB7IGNvbnRlbnQ6IFwiXFxlMTQ5XCI7IH0gfVxuLmdseXBoaWNvbi1zb3J0ICAgICAgICAgICAgICAgICAgIHsgJjpiZWZvcmUgeyBjb250ZW50OiBcIlxcZTE1MFwiOyB9IH1cbi5nbHlwaGljb24tc29ydC1ieS1hbHBoYWJldCAgICAgICB7ICY6YmVmb3JlIHsgY29udGVudDogXCJcXGUxNTFcIjsgfSB9XG4uZ2x5cGhpY29uLXNvcnQtYnktYWxwaGFiZXQtYWx0ICAgeyAmOmJlZm9yZSB7IGNvbnRlbnQ6IFwiXFxlMTUyXCI7IH0gfVxuLmdseXBoaWNvbi1zb3J0LWJ5LW9yZGVyICAgICAgICAgIHsgJjpiZWZvcmUgeyBjb250ZW50OiBcIlxcZTE1M1wiOyB9IH1cbi5nbHlwaGljb24tc29ydC1ieS1vcmRlci1hbHQgICAgICB7ICY6YmVmb3JlIHsgY29udGVudDogXCJcXGUxNTRcIjsgfSB9XG4uZ2x5cGhpY29uLXNvcnQtYnktYXR0cmlidXRlcyAgICAgeyAmOmJlZm9yZSB7IGNvbnRlbnQ6IFwiXFxlMTU1XCI7IH0gfVxuLmdseXBoaWNvbi1zb3J0LWJ5LWF0dHJpYnV0ZXMtYWx0IHsgJjpiZWZvcmUgeyBjb250ZW50OiBcIlxcZTE1NlwiOyB9IH1cbi5nbHlwaGljb24tdW5jaGVja2VkICAgICAgICAgICAgICB7ICY6YmVmb3JlIHsgY29udGVudDogXCJcXGUxNTdcIjsgfSB9XG4uZ2x5cGhpY29uLWV4cGFuZCAgICAgICAgICAgICAgICAgeyAmOmJlZm9yZSB7IGNvbnRlbnQ6IFwiXFxlMTU4XCI7IH0gfVxuLmdseXBoaWNvbi1jb2xsYXBzZS1kb3duICAgICAgICAgIHsgJjpiZWZvcmUgeyBjb250ZW50OiBcIlxcZTE1OVwiOyB9IH1cbi5nbHlwaGljb24tY29sbGFwc2UtdXAgICAgICAgICAgICB7ICY6YmVmb3JlIHsgY29udGVudDogXCJcXGUxNjBcIjsgfSB9XG4uZ2x5cGhpY29uLWxvZy1pbiAgICAgICAgICAgICAgICAgeyAmOmJlZm9yZSB7IGNvbnRlbnQ6IFwiXFxlMTYxXCI7IH0gfVxuLmdseXBoaWNvbi1mbGFzaCAgICAgICAgICAgICAgICAgIHsgJjpiZWZvcmUgeyBjb250ZW50OiBcIlxcZTE2MlwiOyB9IH1cbi5nbHlwaGljb24tbG9nLW91dCAgICAgICAgICAgICAgICB7ICY6YmVmb3JlIHsgY29udGVudDogXCJcXGUxNjNcIjsgfSB9XG4uZ2x5cGhpY29uLW5ldy13aW5kb3cgICAgICAgICAgICAgeyAmOmJlZm9yZSB7IGNvbnRlbnQ6IFwiXFxlMTY0XCI7IH0gfVxuLmdseXBoaWNvbi1yZWNvcmQgICAgICAgICAgICAgICAgIHsgJjpiZWZvcmUgeyBjb250ZW50OiBcIlxcZTE2NVwiOyB9IH1cbi5nbHlwaGljb24tc2F2ZSAgICAgICAgICAgICAgICAgICB7ICY6YmVmb3JlIHsgY29udGVudDogXCJcXGUxNjZcIjsgfSB9XG4uZ2x5cGhpY29uLW9wZW4gICAgICAgICAgICAgICAgICAgeyAmOmJlZm9yZSB7IGNvbnRlbnQ6IFwiXFxlMTY3XCI7IH0gfVxuLmdseXBoaWNvbi1zYXZlZCAgICAgICAgICAgICAgICAgIHsgJjpiZWZvcmUgeyBjb250ZW50OiBcIlxcZTE2OFwiOyB9IH1cbi5nbHlwaGljb24taW1wb3J0ICAgICAgICAgICAgICAgICB7ICY6YmVmb3JlIHsgY29udGVudDogXCJcXGUxNjlcIjsgfSB9XG4uZ2x5cGhpY29uLWV4cG9ydCAgICAgICAgICAgICAgICAgeyAmOmJlZm9yZSB7IGNvbnRlbnQ6IFwiXFxlMTcwXCI7IH0gfVxuLmdseXBoaWNvbi1zZW5kICAgICAgICAgICAgICAgICAgIHsgJjpiZWZvcmUgeyBjb250ZW50OiBcIlxcZTE3MVwiOyB9IH1cbi5nbHlwaGljb24tZmxvcHB5LWRpc2sgICAgICAgICAgICB7ICY6YmVmb3JlIHsgY29udGVudDogXCJcXGUxNzJcIjsgfSB9XG4uZ2x5cGhpY29uLWZsb3BweS1zYXZlZCAgICAgICAgICAgeyAmOmJlZm9yZSB7IGNvbnRlbnQ6IFwiXFxlMTczXCI7IH0gfVxuLmdseXBoaWNvbi1mbG9wcHktcmVtb3ZlICAgICAgICAgIHsgJjpiZWZvcmUgeyBjb250ZW50OiBcIlxcZTE3NFwiOyB9IH1cbi5nbHlwaGljb24tZmxvcHB5LXNhdmUgICAgICAgICAgICB7ICY6YmVmb3JlIHsgY29udGVudDogXCJcXGUxNzVcIjsgfSB9XG4uZ2x5cGhpY29uLWZsb3BweS1vcGVuICAgICAgICAgICAgeyAmOmJlZm9yZSB7IGNvbnRlbnQ6IFwiXFxlMTc2XCI7IH0gfVxuLmdseXBoaWNvbi1jcmVkaXQtY2FyZCAgICAgICAgICAgIHsgJjpiZWZvcmUgeyBjb250ZW50OiBcIlxcZTE3N1wiOyB9IH1cbi5nbHlwaGljb24tdHJhbnNmZXIgICAgICAgICAgICAgICB7ICY6YmVmb3JlIHsgY29udGVudDogXCJcXGUxNzhcIjsgfSB9XG4uZ2x5cGhpY29uLWN1dGxlcnkgICAgICAgICAgICAgICAgeyAmOmJlZm9yZSB7IGNvbnRlbnQ6IFwiXFxlMTc5XCI7IH0gfVxuLmdseXBoaWNvbi1oZWFkZXIgICAgICAgICAgICAgICAgIHsgJjpiZWZvcmUgeyBjb250ZW50OiBcIlxcZTE4MFwiOyB9IH1cbi5nbHlwaGljb24tY29tcHJlc3NlZCAgICAgICAgICAgICB7ICY6YmVmb3JlIHsgY29udGVudDogXCJcXGUxODFcIjsgfSB9XG4uZ2x5cGhpY29uLWVhcnBob25lICAgICAgICAgICAgICAgeyAmOmJlZm9yZSB7IGNvbnRlbnQ6IFwiXFxlMTgyXCI7IH0gfVxuLmdseXBoaWNvbi1waG9uZS1hbHQgICAgICAgICAgICAgIHsgJjpiZWZvcmUgeyBjb250ZW50OiBcIlxcZTE4M1wiOyB9IH1cbi5nbHlwaGljb24tdG93ZXIgICAgICAgICAgICAgICAgICB7ICY6YmVmb3JlIHsgY29udGVudDogXCJcXGUxODRcIjsgfSB9XG4uZ2x5cGhpY29uLXN0YXRzICAgICAgICAgICAgICAgICAgeyAmOmJlZm9yZSB7IGNvbnRlbnQ6IFwiXFxlMTg1XCI7IH0gfVxuLmdseXBoaWNvbi1zZC12aWRlbyAgICAgICAgICAgICAgIHsgJjpiZWZvcmUgeyBjb250ZW50OiBcIlxcZTE4NlwiOyB9IH1cbi5nbHlwaGljb24taGQtdmlkZW8gICAgICAgICAgICAgICB7ICY6YmVmb3JlIHsgY29udGVudDogXCJcXGUxODdcIjsgfSB9XG4uZ2x5cGhpY29uLXN1YnRpdGxlcyAgICAgICAgICAgICAgeyAmOmJlZm9yZSB7IGNvbnRlbnQ6IFwiXFxlMTg4XCI7IH0gfVxuLmdseXBoaWNvbi1zb3VuZC1zdGVyZW8gICAgICAgICAgIHsgJjpiZWZvcmUgeyBjb250ZW50OiBcIlxcZTE4OVwiOyB9IH1cbi5nbHlwaGljb24tc291bmQtZG9sYnkgICAgICAgICAgICB7ICY6YmVmb3JlIHsgY29udGVudDogXCJcXGUxOTBcIjsgfSB9XG4uZ2x5cGhpY29uLXNvdW5kLTUtMSAgICAgICAgICAgICAgeyAmOmJlZm9yZSB7IGNvbnRlbnQ6IFwiXFxlMTkxXCI7IH0gfVxuLmdseXBoaWNvbi1zb3VuZC02LTEgICAgICAgICAgICAgIHsgJjpiZWZvcmUgeyBjb250ZW50OiBcIlxcZTE5MlwiOyB9IH1cbi5nbHlwaGljb24tc291bmQtNy0xICAgICAgICAgICAgICB7ICY6YmVmb3JlIHsgY29udGVudDogXCJcXGUxOTNcIjsgfSB9XG4uZ2x5cGhpY29uLWNvcHlyaWdodC1tYXJrICAgICAgICAgeyAmOmJlZm9yZSB7IGNvbnRlbnQ6IFwiXFxlMTk0XCI7IH0gfVxuLmdseXBoaWNvbi1yZWdpc3RyYXRpb24tbWFyayAgICAgIHsgJjpiZWZvcmUgeyBjb250ZW50OiBcIlxcZTE5NVwiOyB9IH1cbi5nbHlwaGljb24tY2xvdWQtZG93bmxvYWQgICAgICAgICB7ICY6YmVmb3JlIHsgY29udGVudDogXCJcXGUxOTdcIjsgfSB9XG4uZ2x5cGhpY29uLWNsb3VkLXVwbG9hZCAgICAgICAgICAgeyAmOmJlZm9yZSB7IGNvbnRlbnQ6IFwiXFxlMTk4XCI7IH0gfVxuLmdseXBoaWNvbi10cmVlLWNvbmlmZXIgICAgICAgICAgIHsgJjpiZWZvcmUgeyBjb250ZW50OiBcIlxcZTE5OVwiOyB9IH1cbi5nbHlwaGljb24tdHJlZS1kZWNpZHVvdXMgICAgICAgICB7ICY6YmVmb3JlIHsgY29udGVudDogXCJcXGUyMDBcIjsgfSB9XG4iLCIvL1xuLy8gU2NhZmZvbGRpbmdcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cblxuLy8gUmVzZXQgdGhlIGJveC1zaXppbmdcbi8vXG4vLyBIZWFkcyB1cCEgVGhpcyByZXNldCBtYXkgY2F1c2UgY29uZmxpY3RzIHdpdGggc29tZSB0aGlyZC1wYXJ0eSB3aWRnZXRzLlxuLy8gRm9yIHJlY29tbWVuZGF0aW9ucyBvbiByZXNvbHZpbmcgc3VjaCBjb25mbGljdHMsIHNlZVxuLy8gaHR0cDovL2dldGJvb3RzdHJhcC5jb20vZ2V0dGluZy1zdGFydGVkLyN0aGlyZC1ib3gtc2l6aW5nXG4qIHtcbiAgLmJveC1zaXppbmcoYm9yZGVyLWJveCk7XG59XG4qOmJlZm9yZSxcbio6YWZ0ZXIge1xuICAuYm94LXNpemluZyhib3JkZXItYm94KTtcbn1cblxuXG4vLyBCb2R5IHJlc2V0XG5cbmh0bWwge1xuICBmb250LXNpemU6IDEwcHg7XG4gIC13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvcjogcmdiYSgwLDAsMCwwKTtcbn1cblxuYm9keSB7XG4gIGZvbnQtZmFtaWx5OiBAZm9udC1mYW1pbHktYmFzZTtcbiAgZm9udC1zaXplOiBAZm9udC1zaXplLWJhc2U7XG4gIGxpbmUtaGVpZ2h0OiBAbGluZS1oZWlnaHQtYmFzZTtcbiAgY29sb3I6IEB0ZXh0LWNvbG9yO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiBAYm9keS1iZztcbn1cblxuLy8gUmVzZXQgZm9udHMgZm9yIHJlbGV2YW50IGVsZW1lbnRzXG5pbnB1dCxcbmJ1dHRvbixcbnNlbGVjdCxcbnRleHRhcmVhIHtcbiAgZm9udC1mYW1pbHk6IGluaGVyaXQ7XG4gIGZvbnQtc2l6ZTogaW5oZXJpdDtcbiAgbGluZS1oZWlnaHQ6IGluaGVyaXQ7XG59XG5cblxuLy8gTGlua3NcblxuYSB7XG4gIGNvbG9yOiBAbGluay1jb2xvcjtcbiAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xuXG4gICY6aG92ZXIsXG4gICY6Zm9jdXMge1xuICAgIGNvbG9yOiBAbGluay1ob3Zlci1jb2xvcjtcbiAgICB0ZXh0LWRlY29yYXRpb246IEBsaW5rLWhvdmVyLWRlY29yYXRpb247XG4gIH1cblxuICAmOmZvY3VzIHtcbiAgICAudGFiLWZvY3VzKCk7XG4gIH1cbn1cblxuXG4vLyBGaWd1cmVzXG4vL1xuLy8gV2UgcmVzZXQgdGhpcyBoZXJlIGJlY2F1c2UgcHJldmlvdXNseSBOb3JtYWxpemUgaGFkIG5vIGBmaWd1cmVgIG1hcmdpbnMuIFRoaXNcbi8vIGVuc3VyZXMgd2UgZG9uJ3QgYnJlYWsgYW55b25lJ3MgdXNlIG9mIHRoZSBlbGVtZW50LlxuXG5maWd1cmUge1xuICBtYXJnaW46IDA7XG59XG5cblxuLy8gSW1hZ2VzXG5cbmltZyB7XG4gIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XG59XG5cbi8vIFJlc3BvbnNpdmUgaW1hZ2VzIChlbnN1cmUgaW1hZ2VzIGRvbid0IHNjYWxlIGJleW9uZCB0aGVpciBwYXJlbnRzKVxuLmltZy1yZXNwb25zaXZlIHtcbiAgLmltZy1yZXNwb25zaXZlKCk7XG59XG5cbi8vIFJvdW5kZWQgY29ybmVyc1xuLmltZy1yb3VuZGVkIHtcbiAgYm9yZGVyLXJhZGl1czogQGJvcmRlci1yYWRpdXMtbGFyZ2U7XG59XG5cbi8vIEltYWdlIHRodW1ibmFpbHNcbi8vXG4vLyBIZWFkcyB1cCEgVGhpcyBpcyBtaXhpbi1lZCBpbnRvIHRodW1ibmFpbHMubGVzcyBmb3IgYC50aHVtYm5haWxgLlxuLmltZy10aHVtYm5haWwge1xuICBwYWRkaW5nOiBAdGh1bWJuYWlsLXBhZGRpbmc7XG4gIGxpbmUtaGVpZ2h0OiBAbGluZS1oZWlnaHQtYmFzZTtcbiAgYmFja2dyb3VuZC1jb2xvcjogQHRodW1ibmFpbC1iZztcbiAgYm9yZGVyOiAxcHggc29saWQgQHRodW1ibmFpbC1ib3JkZXI7XG4gIGJvcmRlci1yYWRpdXM6IEB0aHVtYm5haWwtYm9yZGVyLXJhZGl1cztcbiAgLnRyYW5zaXRpb24oYWxsIC4ycyBlYXNlLWluLW91dCk7XG5cbiAgLy8gS2VlcCB0aGVtIGF0IG1vc3QgMTAwJSB3aWRlXG4gIC5pbWctcmVzcG9uc2l2ZShpbmxpbmUtYmxvY2spO1xufVxuXG4vLyBQZXJmZWN0IGNpcmNsZVxuLmltZy1jaXJjbGUge1xuICBib3JkZXItcmFkaXVzOiA1MCU7IC8vIHNldCByYWRpdXMgaW4gcGVyY2VudHNcbn1cblxuXG4vLyBIb3Jpem9udGFsIHJ1bGVzXG5cbmhyIHtcbiAgbWFyZ2luLXRvcDogICAgQGxpbmUtaGVpZ2h0LWNvbXB1dGVkO1xuICBtYXJnaW4tYm90dG9tOiBAbGluZS1oZWlnaHQtY29tcHV0ZWQ7XG4gIGJvcmRlcjogMDtcbiAgYm9yZGVyLXRvcDogMXB4IHNvbGlkIEBoci1ib3JkZXI7XG59XG5cblxuLy8gT25seSBkaXNwbGF5IGNvbnRlbnQgdG8gc2NyZWVuIHJlYWRlcnNcbi8vXG4vLyBTZWU6IGh0dHA6Ly9hMTF5cHJvamVjdC5jb20vcG9zdHMvaG93LXRvLWhpZGUtY29udGVudC9cblxuLnNyLW9ubHkge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHdpZHRoOiAxcHg7XG4gIGhlaWdodDogMXB4O1xuICBtYXJnaW46IC0xcHg7XG4gIHBhZGRpbmc6IDA7XG4gIG92ZXJmbG93OiBoaWRkZW47XG4gIGNsaXA6IHJlY3QoMCwwLDAsMCk7XG4gIGJvcmRlcjogMDtcbn1cblxuLy8gVXNlIGluIGNvbmp1bmN0aW9uIHdpdGggLnNyLW9ubHkgdG8gb25seSBkaXNwbGF5IGNvbnRlbnQgd2hlbiBpdCdzIGZvY3VzZWQuXG4vLyBVc2VmdWwgZm9yIFwiU2tpcCB0byBtYWluIGNvbnRlbnRcIiBsaW5rczsgc2VlIGh0dHA6Ly93d3cudzMub3JnL1RSLzIwMTMvTk9URS1XQ0FHMjAtVEVDSFMtMjAxMzA5MDUvRzFcbi8vIENyZWRpdDogSFRNTDUgQm9pbGVycGxhdGVcblxuLnNyLW9ubHktZm9jdXNhYmxlIHtcbiAgJjphY3RpdmUsXG4gICY6Zm9jdXMge1xuICAgIHBvc2l0aW9uOiBzdGF0aWM7XG4gICAgd2lkdGg6IGF1dG87XG4gICAgaGVpZ2h0OiBhdXRvO1xuICAgIG1hcmdpbjogMDtcbiAgICBvdmVyZmxvdzogdmlzaWJsZTtcbiAgICBjbGlwOiBhdXRvO1xuICB9XG59XG4iLCIvLyBWZW5kb3IgUHJlZml4ZXNcbi8vXG4vLyBBbGwgdmVuZG9yIG1peGlucyBhcmUgZGVwcmVjYXRlZCBhcyBvZiB2My4yLjAgZHVlIHRvIHRoZSBpbnRyb2R1Y3Rpb24gb2Zcbi8vIEF1dG9wcmVmaXhlciBpbiBvdXIgR3J1bnRmaWxlLiBUaGV5IHdpbGwgYmUgcmVtb3ZlZCBpbiB2NC5cblxuLy8gLSBBbmltYXRpb25zXG4vLyAtIEJhY2tmYWNlIHZpc2liaWxpdHlcbi8vIC0gQm94IHNoYWRvd1xuLy8gLSBCb3ggc2l6aW5nXG4vLyAtIENvbnRlbnQgY29sdW1uc1xuLy8gLSBIeXBoZW5zXG4vLyAtIFBsYWNlaG9sZGVyIHRleHRcbi8vIC0gVHJhbnNmb3JtYXRpb25zXG4vLyAtIFRyYW5zaXRpb25zXG4vLyAtIFVzZXIgU2VsZWN0XG5cblxuLy8gQW5pbWF0aW9uc1xuLmFuaW1hdGlvbihAYW5pbWF0aW9uKSB7XG4gIC13ZWJraXQtYW5pbWF0aW9uOiBAYW5pbWF0aW9uO1xuICAgICAgIC1vLWFuaW1hdGlvbjogQGFuaW1hdGlvbjtcbiAgICAgICAgICBhbmltYXRpb246IEBhbmltYXRpb247XG59XG4uYW5pbWF0aW9uLW5hbWUoQG5hbWUpIHtcbiAgLXdlYmtpdC1hbmltYXRpb24tbmFtZTogQG5hbWU7XG4gICAgICAgICAgYW5pbWF0aW9uLW5hbWU6IEBuYW1lO1xufVxuLmFuaW1hdGlvbi1kdXJhdGlvbihAZHVyYXRpb24pIHtcbiAgLXdlYmtpdC1hbmltYXRpb24tZHVyYXRpb246IEBkdXJhdGlvbjtcbiAgICAgICAgICBhbmltYXRpb24tZHVyYXRpb246IEBkdXJhdGlvbjtcbn1cbi5hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uKEB0aW1pbmctZnVuY3Rpb24pIHtcbiAgLXdlYmtpdC1hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBAdGltaW5nLWZ1bmN0aW9uO1xuICAgICAgICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IEB0aW1pbmctZnVuY3Rpb247XG59XG4uYW5pbWF0aW9uLWRlbGF5KEBkZWxheSkge1xuICAtd2Via2l0LWFuaW1hdGlvbi1kZWxheTogQGRlbGF5O1xuICAgICAgICAgIGFuaW1hdGlvbi1kZWxheTogQGRlbGF5O1xufVxuLmFuaW1hdGlvbi1pdGVyYXRpb24tY291bnQoQGl0ZXJhdGlvbi1jb3VudCkge1xuICAtd2Via2l0LWFuaW1hdGlvbi1pdGVyYXRpb24tY291bnQ6IEBpdGVyYXRpb24tY291bnQ7XG4gICAgICAgICAgYW5pbWF0aW9uLWl0ZXJhdGlvbi1jb3VudDogQGl0ZXJhdGlvbi1jb3VudDtcbn1cbi5hbmltYXRpb24tZGlyZWN0aW9uKEBkaXJlY3Rpb24pIHtcbiAgLXdlYmtpdC1hbmltYXRpb24tZGlyZWN0aW9uOiBAZGlyZWN0aW9uO1xuICAgICAgICAgIGFuaW1hdGlvbi1kaXJlY3Rpb246IEBkaXJlY3Rpb247XG59XG4uYW5pbWF0aW9uLWZpbGwtbW9kZShAZmlsbC1tb2RlKSB7XG4gIC13ZWJraXQtYW5pbWF0aW9uLWZpbGwtbW9kZTogQGZpbGwtbW9kZTtcbiAgICAgICAgICBhbmltYXRpb24tZmlsbC1tb2RlOiBAZmlsbC1tb2RlO1xufVxuXG4vLyBCYWNrZmFjZSB2aXNpYmlsaXR5XG4vLyBQcmV2ZW50IGJyb3dzZXJzIGZyb20gZmxpY2tlcmluZyB3aGVuIHVzaW5nIENTUyAzRCB0cmFuc2Zvcm1zLlxuLy8gRGVmYXVsdCB2YWx1ZSBpcyBgdmlzaWJsZWAsIGJ1dCBjYW4gYmUgY2hhbmdlZCB0byBgaGlkZGVuYFxuXG4uYmFja2ZhY2UtdmlzaWJpbGl0eShAdmlzaWJpbGl0eSl7XG4gIC13ZWJraXQtYmFja2ZhY2UtdmlzaWJpbGl0eTogQHZpc2liaWxpdHk7XG4gICAgIC1tb3otYmFja2ZhY2UtdmlzaWJpbGl0eTogQHZpc2liaWxpdHk7XG4gICAgICAgICAgYmFja2ZhY2UtdmlzaWJpbGl0eTogQHZpc2liaWxpdHk7XG59XG5cbi8vIERyb3Agc2hhZG93c1xuLy9cbi8vIE5vdGU6IERlcHJlY2F0ZWQgYC5ib3gtc2hhZG93KClgIGFzIG9mIHYzLjEuMCBzaW5jZSBhbGwgb2YgQm9vdHN0cmFwJ3Ncbi8vIHN1cHBvcnRlZCBicm93c2VycyB0aGF0IGhhdmUgYm94IHNoYWRvdyBjYXBhYmlsaXRpZXMgbm93IHN1cHBvcnQgaXQuXG5cbi5ib3gtc2hhZG93KEBzaGFkb3cpIHtcbiAgLXdlYmtpdC1ib3gtc2hhZG93OiBAc2hhZG93OyAvLyBpT1MgPDQuMyAmIEFuZHJvaWQgPDQuMVxuICAgICAgICAgIGJveC1zaGFkb3c6IEBzaGFkb3c7XG59XG5cbi8vIEJveCBzaXppbmdcbi5ib3gtc2l6aW5nKEBib3htb2RlbCkge1xuICAtd2Via2l0LWJveC1zaXppbmc6IEBib3htb2RlbDtcbiAgICAgLW1vei1ib3gtc2l6aW5nOiBAYm94bW9kZWw7XG4gICAgICAgICAgYm94LXNpemluZzogQGJveG1vZGVsO1xufVxuXG4vLyBDU1MzIENvbnRlbnQgQ29sdW1uc1xuLmNvbnRlbnQtY29sdW1ucyhAY29sdW1uLWNvdW50OyBAY29sdW1uLWdhcDogQGdyaWQtZ3V0dGVyLXdpZHRoKSB7XG4gIC13ZWJraXQtY29sdW1uLWNvdW50OiBAY29sdW1uLWNvdW50O1xuICAgICAtbW96LWNvbHVtbi1jb3VudDogQGNvbHVtbi1jb3VudDtcbiAgICAgICAgICBjb2x1bW4tY291bnQ6IEBjb2x1bW4tY291bnQ7XG4gIC13ZWJraXQtY29sdW1uLWdhcDogQGNvbHVtbi1nYXA7XG4gICAgIC1tb3otY29sdW1uLWdhcDogQGNvbHVtbi1nYXA7XG4gICAgICAgICAgY29sdW1uLWdhcDogQGNvbHVtbi1nYXA7XG59XG5cbi8vIE9wdGlvbmFsIGh5cGhlbmF0aW9uXG4uaHlwaGVucyhAbW9kZTogYXV0bykge1xuICB3b3JkLXdyYXA6IGJyZWFrLXdvcmQ7XG4gIC13ZWJraXQtaHlwaGVuczogQG1vZGU7XG4gICAgIC1tb3otaHlwaGVuczogQG1vZGU7XG4gICAgICAtbXMtaHlwaGVuczogQG1vZGU7IC8vIElFMTArXG4gICAgICAgLW8taHlwaGVuczogQG1vZGU7XG4gICAgICAgICAgaHlwaGVuczogQG1vZGU7XG59XG5cbi8vIFBsYWNlaG9sZGVyIHRleHRcbi5wbGFjZWhvbGRlcihAY29sb3I6IEBpbnB1dC1jb2xvci1wbGFjZWhvbGRlcikge1xuICAvLyBGaXJlZm94XG4gICY6Oi1tb3otcGxhY2Vob2xkZXIge1xuICAgIGNvbG9yOiBAY29sb3I7XG4gICAgb3BhY2l0eTogMTsgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9wdWxsLzExNTI2XG4gIH1cbiAgJjotbXMtaW5wdXQtcGxhY2Vob2xkZXIgeyBjb2xvcjogQGNvbG9yOyB9IC8vIEludGVybmV0IEV4cGxvcmVyIDEwK1xuICAmOjotd2Via2l0LWlucHV0LXBsYWNlaG9sZGVyICB7IGNvbG9yOiBAY29sb3I7IH0gLy8gU2FmYXJpIGFuZCBDaHJvbWVcbn1cblxuLy8gVHJhbnNmb3JtYXRpb25zXG4uc2NhbGUoQHJhdGlvKSB7XG4gIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZShAcmF0aW8pO1xuICAgICAgLW1zLXRyYW5zZm9ybTogc2NhbGUoQHJhdGlvKTsgLy8gSUU5IG9ubHlcbiAgICAgICAtby10cmFuc2Zvcm06IHNjYWxlKEByYXRpbyk7XG4gICAgICAgICAgdHJhbnNmb3JtOiBzY2FsZShAcmF0aW8pO1xufVxuLnNjYWxlKEByYXRpb1g7IEByYXRpb1kpIHtcbiAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlKEByYXRpb1gsIEByYXRpb1kpO1xuICAgICAgLW1zLXRyYW5zZm9ybTogc2NhbGUoQHJhdGlvWCwgQHJhdGlvWSk7IC8vIElFOSBvbmx5XG4gICAgICAgLW8tdHJhbnNmb3JtOiBzY2FsZShAcmF0aW9YLCBAcmF0aW9ZKTtcbiAgICAgICAgICB0cmFuc2Zvcm06IHNjYWxlKEByYXRpb1gsIEByYXRpb1kpO1xufVxuLnNjYWxlWChAcmF0aW8pIHtcbiAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlWChAcmF0aW8pO1xuICAgICAgLW1zLXRyYW5zZm9ybTogc2NhbGVYKEByYXRpbyk7IC8vIElFOSBvbmx5XG4gICAgICAgLW8tdHJhbnNmb3JtOiBzY2FsZVgoQHJhdGlvKTtcbiAgICAgICAgICB0cmFuc2Zvcm06IHNjYWxlWChAcmF0aW8pO1xufVxuLnNjYWxlWShAcmF0aW8pIHtcbiAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlWShAcmF0aW8pO1xuICAgICAgLW1zLXRyYW5zZm9ybTogc2NhbGVZKEByYXRpbyk7IC8vIElFOSBvbmx5XG4gICAgICAgLW8tdHJhbnNmb3JtOiBzY2FsZVkoQHJhdGlvKTtcbiAgICAgICAgICB0cmFuc2Zvcm06IHNjYWxlWShAcmF0aW8pO1xufVxuLnNrZXcoQHg7IEB5KSB7XG4gIC13ZWJraXQtdHJhbnNmb3JtOiBza2V3WChAeCkgc2tld1koQHkpO1xuICAgICAgLW1zLXRyYW5zZm9ybTogc2tld1goQHgpIHNrZXdZKEB5KTsgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9pc3N1ZXMvNDg4NTsgSUU5K1xuICAgICAgIC1vLXRyYW5zZm9ybTogc2tld1goQHgpIHNrZXdZKEB5KTtcbiAgICAgICAgICB0cmFuc2Zvcm06IHNrZXdYKEB4KSBza2V3WShAeSk7XG59XG4udHJhbnNsYXRlKEB4OyBAeSkge1xuICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlKEB4LCBAeSk7XG4gICAgICAtbXMtdHJhbnNmb3JtOiB0cmFuc2xhdGUoQHgsIEB5KTsgLy8gSUU5IG9ubHlcbiAgICAgICAtby10cmFuc2Zvcm06IHRyYW5zbGF0ZShAeCwgQHkpO1xuICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlKEB4LCBAeSk7XG59XG4udHJhbnNsYXRlM2QoQHg7IEB5OyBAeikge1xuICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlM2QoQHgsIEB5LCBAeik7XG4gICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUzZChAeCwgQHksIEB6KTtcbn1cbi5yb3RhdGUoQGRlZ3JlZXMpIHtcbiAgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZShAZGVncmVlcyk7XG4gICAgICAtbXMtdHJhbnNmb3JtOiByb3RhdGUoQGRlZ3JlZXMpOyAvLyBJRTkgb25seVxuICAgICAgIC1vLXRyYW5zZm9ybTogcm90YXRlKEBkZWdyZWVzKTtcbiAgICAgICAgICB0cmFuc2Zvcm06IHJvdGF0ZShAZGVncmVlcyk7XG59XG4ucm90YXRlWChAZGVncmVlcykge1xuICAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlWChAZGVncmVlcyk7XG4gICAgICAtbXMtdHJhbnNmb3JtOiByb3RhdGVYKEBkZWdyZWVzKTsgLy8gSUU5IG9ubHlcbiAgICAgICAtby10cmFuc2Zvcm06IHJvdGF0ZVgoQGRlZ3JlZXMpO1xuICAgICAgICAgIHRyYW5zZm9ybTogcm90YXRlWChAZGVncmVlcyk7XG59XG4ucm90YXRlWShAZGVncmVlcykge1xuICAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlWShAZGVncmVlcyk7XG4gICAgICAtbXMtdHJhbnNmb3JtOiByb3RhdGVZKEBkZWdyZWVzKTsgLy8gSUU5IG9ubHlcbiAgICAgICAtby10cmFuc2Zvcm06IHJvdGF0ZVkoQGRlZ3JlZXMpO1xuICAgICAgICAgIHRyYW5zZm9ybTogcm90YXRlWShAZGVncmVlcyk7XG59XG4ucGVyc3BlY3RpdmUoQHBlcnNwZWN0aXZlKSB7XG4gIC13ZWJraXQtcGVyc3BlY3RpdmU6IEBwZXJzcGVjdGl2ZTtcbiAgICAgLW1vei1wZXJzcGVjdGl2ZTogQHBlcnNwZWN0aXZlO1xuICAgICAgICAgIHBlcnNwZWN0aXZlOiBAcGVyc3BlY3RpdmU7XG59XG4ucGVyc3BlY3RpdmUtb3JpZ2luKEBwZXJzcGVjdGl2ZSkge1xuICAtd2Via2l0LXBlcnNwZWN0aXZlLW9yaWdpbjogQHBlcnNwZWN0aXZlO1xuICAgICAtbW96LXBlcnNwZWN0aXZlLW9yaWdpbjogQHBlcnNwZWN0aXZlO1xuICAgICAgICAgIHBlcnNwZWN0aXZlLW9yaWdpbjogQHBlcnNwZWN0aXZlO1xufVxuLnRyYW5zZm9ybS1vcmlnaW4oQG9yaWdpbikge1xuICAtd2Via2l0LXRyYW5zZm9ybS1vcmlnaW46IEBvcmlnaW47XG4gICAgIC1tb3otdHJhbnNmb3JtLW9yaWdpbjogQG9yaWdpbjtcbiAgICAgIC1tcy10cmFuc2Zvcm0tb3JpZ2luOiBAb3JpZ2luOyAvLyBJRTkgb25seVxuICAgICAgICAgIHRyYW5zZm9ybS1vcmlnaW46IEBvcmlnaW47XG59XG5cblxuLy8gVHJhbnNpdGlvbnNcblxuLnRyYW5zaXRpb24oQHRyYW5zaXRpb24pIHtcbiAgLXdlYmtpdC10cmFuc2l0aW9uOiBAdHJhbnNpdGlvbjtcbiAgICAgICAtby10cmFuc2l0aW9uOiBAdHJhbnNpdGlvbjtcbiAgICAgICAgICB0cmFuc2l0aW9uOiBAdHJhbnNpdGlvbjtcbn1cbi50cmFuc2l0aW9uLXByb3BlcnR5KEB0cmFuc2l0aW9uLXByb3BlcnR5KSB7XG4gIC13ZWJraXQtdHJhbnNpdGlvbi1wcm9wZXJ0eTogQHRyYW5zaXRpb24tcHJvcGVydHk7XG4gICAgICAgICAgdHJhbnNpdGlvbi1wcm9wZXJ0eTogQHRyYW5zaXRpb24tcHJvcGVydHk7XG59XG4udHJhbnNpdGlvbi1kZWxheShAdHJhbnNpdGlvbi1kZWxheSkge1xuICAtd2Via2l0LXRyYW5zaXRpb24tZGVsYXk6IEB0cmFuc2l0aW9uLWRlbGF5O1xuICAgICAgICAgIHRyYW5zaXRpb24tZGVsYXk6IEB0cmFuc2l0aW9uLWRlbGF5O1xufVxuLnRyYW5zaXRpb24tZHVyYXRpb24oQHRyYW5zaXRpb24tZHVyYXRpb24pIHtcbiAgLXdlYmtpdC10cmFuc2l0aW9uLWR1cmF0aW9uOiBAdHJhbnNpdGlvbi1kdXJhdGlvbjtcbiAgICAgICAgICB0cmFuc2l0aW9uLWR1cmF0aW9uOiBAdHJhbnNpdGlvbi1kdXJhdGlvbjtcbn1cbi50cmFuc2l0aW9uLXRpbWluZy1mdW5jdGlvbihAdGltaW5nLWZ1bmN0aW9uKSB7XG4gIC13ZWJraXQtdHJhbnNpdGlvbi10aW1pbmctZnVuY3Rpb246IEB0aW1pbmctZnVuY3Rpb247XG4gICAgICAgICAgdHJhbnNpdGlvbi10aW1pbmctZnVuY3Rpb246IEB0aW1pbmctZnVuY3Rpb247XG59XG4udHJhbnNpdGlvbi10cmFuc2Zvcm0oQHRyYW5zaXRpb24pIHtcbiAgLXdlYmtpdC10cmFuc2l0aW9uOiAtd2Via2l0LXRyYW5zZm9ybSBAdHJhbnNpdGlvbjtcbiAgICAgLW1vei10cmFuc2l0aW9uOiAtbW96LXRyYW5zZm9ybSBAdHJhbnNpdGlvbjtcbiAgICAgICAtby10cmFuc2l0aW9uOiAtby10cmFuc2Zvcm0gQHRyYW5zaXRpb247XG4gICAgICAgICAgdHJhbnNpdGlvbjogdHJhbnNmb3JtIEB0cmFuc2l0aW9uO1xufVxuXG5cbi8vIFVzZXIgc2VsZWN0XG4vLyBGb3Igc2VsZWN0aW5nIHRleHQgb24gdGhlIHBhZ2VcblxuLnVzZXItc2VsZWN0KEBzZWxlY3QpIHtcbiAgLXdlYmtpdC11c2VyLXNlbGVjdDogQHNlbGVjdDtcbiAgICAgLW1vei11c2VyLXNlbGVjdDogQHNlbGVjdDtcbiAgICAgIC1tcy11c2VyLXNlbGVjdDogQHNlbGVjdDsgLy8gSUUxMCtcbiAgICAgICAgICB1c2VyLXNlbGVjdDogQHNlbGVjdDtcbn1cbiIsIi8vXG4vLyBWYXJpYWJsZXNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cblxuLy89PSBDb2xvcnNcbi8vXG4vLyMjIEdyYXkgYW5kIGJyYW5kIGNvbG9ycyBmb3IgdXNlIGFjcm9zcyBCb290c3RyYXAuXG5cbkBncmF5LWJhc2U6ICAgICAgICAgICAgICAjMDAwO1xuQGdyYXktZGFya2VyOiAgICAgICAgICAgIGxpZ2h0ZW4oQGdyYXktYmFzZSwgMTMuNSUpOyAvLyAjMjIyXG5AZ3JheS1kYXJrOiAgICAgICAgICAgICAgbGlnaHRlbihAZ3JheS1iYXNlLCAyMCUpOyAgIC8vICMzMzNcbkBncmF5OiAgICAgICAgICAgICAgICAgICBsaWdodGVuKEBncmF5LWJhc2UsIDMzLjUlKTsgLy8gIzU1NVxuQGdyYXktbGlnaHQ6ICAgICAgICAgICAgIGxpZ2h0ZW4oQGdyYXktYmFzZSwgNDYuNyUpOyAvLyAjNzc3XG5AZ3JheS1saWdodGVyOiAgICAgICAgICAgbGlnaHRlbihAZ3JheS1iYXNlLCA5My41JSk7IC8vICNlZWVcblxuQGJyYW5kLXByaW1hcnk6ICAgICAgICAgIzRDQUY1MDtcbkBicmFuZC1zdWNjZXNzOiAgICAgICAgICM0NTdFODY7XG5AYnJhbmQtaW5mbzogICAgICAgICAgICAjNEEyQjBGO1xuQGJyYW5kLXdhcm5pbmc6ICAgICAgICAgI2YwYWQ0ZTtcbkBicmFuZC1kYW5nZXI6ICAgICAgICAgICNkOTUzNGY7XG5cblxuLy89PSBTY2FmZm9sZGluZ1xuLy9cbi8vIyMgU2V0dGluZ3MgZm9yIHNvbWUgb2YgdGhlIG1vc3QgZ2xvYmFsIHN0eWxlcy5cblxuLy8qKiBCYWNrZ3JvdW5kIGNvbG9yIGZvciBgPGJvZHk+YC5cbkBib2R5LWJnOiAgICAgICAgICAgICAgICNmZmZmZmY7XG4vLyoqIEdsb2JhbCB0ZXh0IGNvbG9yIG9uIGA8Ym9keT5gLlxuQHRleHQtY29sb3I6ICAgICAgICAgICAgQGdyYXktZGFyaztcblxuLy8qKiBHbG9iYWwgdGV4dHVhbCBsaW5rIGNvbG9yLlxuQGxpbmstY29sb3I6ICAgICAgICAgICAgQGJyYW5kLXByaW1hcnk7XG4vLyoqIExpbmsgaG92ZXIgY29sb3Igc2V0IHZpYSBgZGFya2VuKClgIGZ1bmN0aW9uLlxuQGxpbmstaG92ZXItY29sb3I6ICAgICAgZGFya2VuKEBsaW5rLWNvbG9yLCAxNSUpO1xuLy8qKiBMaW5rIGhvdmVyIGRlY29yYXRpb24uXG5AbGluay1ob3Zlci1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7XG5cblxuLy89PSBUeXBvZ3JhcGh5XG4vL1xuLy8jIyBGb250LCBsaW5lLWhlaWdodCwgYW5kIGNvbG9yIGZvciBib2R5IHRleHQsIGhlYWRpbmdzLCBhbmQgbW9yZS5cblxuQGZvbnQtZmFtaWx5LXNhbnMtc2VyaWY6ICBcIkhlbHZldGljYSBOZXVlXCIsIEhlbHZldGljYSwgQXJpYWwsIHNhbnMtc2VyaWY7XG5AZm9udC1mYW1pbHktc2VyaWY6ICAgICAgIEdlb3JnaWEsIFwiVGltZXMgTmV3IFJvbWFuXCIsIFRpbWVzLCBzZXJpZjtcbi8vKiogRGVmYXVsdCBtb25vc3BhY2UgZm9udHMgZm9yIGA8Y29kZT5gLCBgPGtiZD5gLCBhbmQgYDxwcmU+YC5cbkBmb250LWZhbWlseS1tb25vc3BhY2U6ICAgTWVubG8sIE1vbmFjbywgQ29uc29sYXMsIFwiQ291cmllciBOZXdcIiwgbW9ub3NwYWNlO1xuQGZvbnQtZmFtaWx5LWJhc2U6ICAgICAgICBAZm9udC1mYW1pbHktc2Fucy1zZXJpZjtcblxuQGZvbnQtc2l6ZS1iYXNlOiAgICAgICAgICAxNHB4O1xuQGZvbnQtc2l6ZS1sYXJnZTogICAgICAgICBjZWlsKChAZm9udC1zaXplLWJhc2UgKiAxLjI1KSk7IC8vIH4xOHB4XG5AZm9udC1zaXplLXNtYWxsOiAgICAgICAgIGNlaWwoKEBmb250LXNpemUtYmFzZSAqIDAuODUpKTsgLy8gfjEycHhcblxuQGZvbnQtc2l6ZS1oMTogICAgICAgICAgICBmbG9vcigoQGZvbnQtc2l6ZS1iYXNlICogMi42KSk7IC8vIH4zNnB4XG5AZm9udC1zaXplLWgyOiAgICAgICAgICAgIGZsb29yKChAZm9udC1zaXplLWJhc2UgKiAyLjE1KSk7IC8vIH4zMHB4XG5AZm9udC1zaXplLWgzOiAgICAgICAgICAgIGNlaWwoKEBmb250LXNpemUtYmFzZSAqIDEuNykpOyAvLyB+MjRweFxuQGZvbnQtc2l6ZS1oNDogICAgICAgICAgICBjZWlsKChAZm9udC1zaXplLWJhc2UgKiAxLjI1KSk7IC8vIH4xOHB4XG5AZm9udC1zaXplLWg1OiAgICAgICAgICAgIEBmb250LXNpemUtYmFzZTtcbkBmb250LXNpemUtaDY6ICAgICAgICAgICAgY2VpbCgoQGZvbnQtc2l6ZS1iYXNlICogMC44NSkpOyAvLyB+MTJweFxuXG4vLyoqIFVuaXQtbGVzcyBgbGluZS1oZWlnaHRgIGZvciB1c2UgaW4gY29tcG9uZW50cyBsaWtlIGJ1dHRvbnMuXG5AbGluZS1oZWlnaHQtYmFzZTogICAgICAgIDEuNDI4NTcxNDI5OyAvLyAyMC8xNFxuLy8qKiBDb21wdXRlZCBcImxpbmUtaGVpZ2h0XCIgKGBmb250LXNpemVgICogYGxpbmUtaGVpZ2h0YCkgZm9yIHVzZSB3aXRoIGBtYXJnaW5gLCBgcGFkZGluZ2AsIGV0Yy5cbkBsaW5lLWhlaWdodC1jb21wdXRlZDogICAgZmxvb3IoKEBmb250LXNpemUtYmFzZSAqIEBsaW5lLWhlaWdodC1iYXNlKSk7IC8vIH4yMHB4XG5cbi8vKiogQnkgZGVmYXVsdCwgdGhpcyBpbmhlcml0cyBmcm9tIHRoZSBgPGJvZHk+YC5cbkBoZWFkaW5ncy1mb250LWZhbWlseTogICAgaW5oZXJpdDtcbkBoZWFkaW5ncy1mb250LXdlaWdodDogICAgNTAwO1xuQGhlYWRpbmdzLWxpbmUtaGVpZ2h0OiAgICAxLjE7XG5AaGVhZGluZ3MtY29sb3I6ICAgICAgICAgIGluaGVyaXQ7XG5cblxuLy89PSBJY29ub2dyYXBoeVxuLy9cbi8vIyMgU3BlY2lmeSBjdXN0b20gbG9jYXRpb24gYW5kIGZpbGVuYW1lIG9mIHRoZSBpbmNsdWRlZCBHbHlwaGljb25zIGljb24gZm9udC4gVXNlZnVsIGZvciB0aG9zZSBpbmNsdWRpbmcgQm9vdHN0cmFwIHZpYSBCb3dlci5cblxuLy8qKiBMb2FkIGZvbnRzIGZyb20gdGhpcyBkaXJlY3RvcnkuXG5AaWNvbi1mb250LXBhdGg6ICAgICAgICAgIFwiLi4vZm9udHMvXCI7XG4vLyoqIEZpbGUgbmFtZSBmb3IgYWxsIGZvbnQgZmlsZXMuXG5AaWNvbi1mb250LW5hbWU6ICAgICAgICAgIFwiZ2x5cGhpY29ucy1oYWxmbGluZ3MtcmVndWxhclwiO1xuLy8qKiBFbGVtZW50IElEIHdpdGhpbiBTVkcgaWNvbiBmaWxlLlxuQGljb24tZm9udC1zdmctaWQ6ICAgICAgICBcImdseXBoaWNvbnNfaGFsZmxpbmdzcmVndWxhclwiO1xuXG5cbi8vPT0gQ29tcG9uZW50c1xuLy9cbi8vIyMgRGVmaW5lIGNvbW1vbiBwYWRkaW5nIGFuZCBib3JkZXIgcmFkaXVzIHNpemVzIGFuZCBtb3JlLiBWYWx1ZXMgYmFzZWQgb24gMTRweCB0ZXh0IGFuZCAxLjQyOCBsaW5lLWhlaWdodCAofjIwcHggdG8gc3RhcnQpLlxuXG5AcGFkZGluZy1iYXNlLXZlcnRpY2FsOiAgICAgNnB4O1xuQHBhZGRpbmctYmFzZS1ob3Jpem9udGFsOiAgIDEycHg7XG5cbkBwYWRkaW5nLWxhcmdlLXZlcnRpY2FsOiAgICAxMHB4O1xuQHBhZGRpbmctbGFyZ2UtaG9yaXpvbnRhbDogIDE2cHg7XG5cbkBwYWRkaW5nLXNtYWxsLXZlcnRpY2FsOiAgICA1cHg7XG5AcGFkZGluZy1zbWFsbC1ob3Jpem9udGFsOiAgMTBweDtcblxuQHBhZGRpbmcteHMtdmVydGljYWw6ICAgICAgIDFweDtcbkBwYWRkaW5nLXhzLWhvcml6b250YWw6ICAgICA1cHg7XG5cbkBsaW5lLWhlaWdodC1sYXJnZTogICAgICAgICAxLjMzO1xuQGxpbmUtaGVpZ2h0LXNtYWxsOiAgICAgICAgIDEuNTtcblxuQGJvcmRlci1yYWRpdXMtYmFzZTogICAgICAgIDRweDtcbkBib3JkZXItcmFkaXVzLWxhcmdlOiAgICAgICA2cHg7XG5AYm9yZGVyLXJhZGl1cy1zbWFsbDogICAgICAgM3B4O1xuXG4vLyoqIEdsb2JhbCBjb2xvciBmb3IgYWN0aXZlIGl0ZW1zIChlLmcuLCBuYXZzIG9yIGRyb3Bkb3ducykuXG5AY29tcG9uZW50LWFjdGl2ZS1jb2xvcjogICAgQGdyYXktbGlnaHRlcjtcbi8vKiogR2xvYmFsIGJhY2tncm91bmQgY29sb3IgZm9yIGFjdGl2ZSBpdGVtcyAoZS5nLiwgbmF2cyBvciBkcm9wZG93bnMpLlxuQGNvbXBvbmVudC1hY3RpdmUtYmc6ICAgICAgIEBicmFuZC1wcmltYXJ5O1xuXG4vLyoqIFdpZHRoIG9mIHRoZSBgYm9yZGVyYCBmb3IgZ2VuZXJhdGluZyBjYXJldHMgdGhhdCBpbmRpY2F0b3IgZHJvcGRvd25zLlxuQGNhcmV0LXdpZHRoLWJhc2U6ICAgICAgICAgIDRweDtcbi8vKiogQ2FyZXRzIGluY3JlYXNlIHNsaWdodGx5IGluIHNpemUgZm9yIGxhcmdlciBjb21wb25lbnRzLlxuQGNhcmV0LXdpZHRoLWxhcmdlOiAgICAgICAgIDVweDtcblxuXG4vLz09IFRhYmxlc1xuLy9cbi8vIyMgQ3VzdG9taXplcyB0aGUgYC50YWJsZWAgY29tcG9uZW50IHdpdGggYmFzaWMgdmFsdWVzLCBlYWNoIHVzZWQgYWNyb3NzIGFsbCB0YWJsZSB2YXJpYXRpb25zLlxuXG4vLyoqIFBhZGRpbmcgZm9yIGA8dGg+YHMgYW5kIGA8dGQ+YHMuXG5AdGFibGUtY2VsbC1wYWRkaW5nOiAgICAgICAgICAgIDhweDtcbi8vKiogUGFkZGluZyBmb3IgY2VsbHMgaW4gYC50YWJsZS1jb25kZW5zZWRgLlxuQHRhYmxlLWNvbmRlbnNlZC1jZWxsLXBhZGRpbmc6ICA1cHg7XG5cbi8vKiogRGVmYXVsdCBiYWNrZ3JvdW5kIGNvbG9yIHVzZWQgZm9yIGFsbCB0YWJsZXMuXG5AdGFibGUtYmc6ICAgICAgICAgICAgICAgICAgICAgIHRyYW5zcGFyZW50O1xuLy8qKiBCYWNrZ3JvdW5kIGNvbG9yIHVzZWQgZm9yIGAudGFibGUtc3RyaXBlZGAuXG5AdGFibGUtYmctYWNjZW50OiAgICAgICAgICAgICAgICNmOWY5Zjk7XG4vLyoqIEJhY2tncm91bmQgY29sb3IgdXNlZCBmb3IgYC50YWJsZS1ob3ZlcmAuXG5AdGFibGUtYmctaG92ZXI6ICAgICAgICAgICAgICAgICNmNWY1ZjU7XG5AdGFibGUtYmctYWN0aXZlOiAgICAgICAgICAgICAgIEB0YWJsZS1iZy1ob3ZlcjtcblxuLy8qKiBCb3JkZXIgY29sb3IgZm9yIHRhYmxlIGFuZCBjZWxsIGJvcmRlcnMuXG5AdGFibGUtYm9yZGVyLWNvbG9yOiAgICAgICAgICAgICNkZGQ7XG5cblxuLy89PSBCdXR0b25zXG4vL1xuLy8jIyBGb3IgZWFjaCBvZiBCb290c3RyYXAncyBidXR0b25zLCBkZWZpbmUgdGV4dCwgYmFja2dyb3VuZCBhbmQgYm9yZGVyIGNvbG9yLlxuXG5AYnRuLWZvbnQtd2VpZ2h0OiAgICAgICAgICAgICAgICBub3JtYWw7XG5cbkBidG4tZGVmYXVsdC1jb2xvcjogICAgICAgICAgICAgICMwMDAwMDA7XG5AYnRuLWRlZmF1bHQtYmc6ICAgICAgICAgICAgICAgICBAYm9keS1iZztcbkBidG4tZGVmYXVsdC1ib3JkZXI6ICAgICAgICAgICAgICMwMDAwMDA7XG5cbkBidG4tcHJpbWFyeS1jb2xvcjogICAgICAgICAgICAgIEBicmFuZC1wcmltYXJ5O1xuQGJ0bi1wcmltYXJ5LWJnOiAgICAgICAgICAgICAgICAgQGJyYW5kLXByaW1hcnk7XG5AYnRuLXByaW1hcnktYm9yZGVyOiAgICAgICAgICAgICBkYXJrZW4oQGJ0bi1wcmltYXJ5LWJnLCA1JSk7XG5cbkBidG4tc3VjY2Vzcy1jb2xvcjogICAgICAgICAgICAgIEBicmFuZC1zdWNjZXNzO1xuQGJ0bi1zdWNjZXNzLWJnOiAgICAgICAgICAgICAgICAgQGJyYW5kLXN1Y2Nlc3M7XG5AYnRuLXN1Y2Nlc3MtYm9yZGVyOiAgICAgICAgICAgICBkYXJrZW4oQGJ0bi1zdWNjZXNzLWJnLCA1JSk7XG5cbkBidG4taW5mby1jb2xvcjogICAgICAgICAgICAgICAgIEBicmFuZC1pbmZvO1xuQGJ0bi1pbmZvLWJnOiAgICAgICAgICAgICAgICAgICAgQGJyYW5kLWluZm87XG5AYnRuLWluZm8tYm9yZGVyOiAgICAgICAgICAgICAgICBkYXJrZW4oQGJ0bi1pbmZvLWJnLCA1JSk7XG5cbkBidG4td2FybmluZy1jb2xvcjogICAgICAgICAgICAgIEBicmFuZC13YXJuaW5nO1xuQGJ0bi13YXJuaW5nLWJnOiAgICAgICAgICAgICAgICAgQGJyYW5kLXdhcm5pbmc7XG5AYnRuLXdhcm5pbmctYm9yZGVyOiAgICAgICAgICAgICBkYXJrZW4oQGJ0bi13YXJuaW5nLWJnLCA1JSk7XG5cbkBidG4tZGFuZ2VyLWNvbG9yOiAgICAgICAgICAgICAgIEBicmFuZC1kYW5nZXI7XG5AYnRuLWRhbmdlci1iZzogICAgICAgICAgICAgICAgICBAYnJhbmQtZGFuZ2VyO1xuQGJ0bi1kYW5nZXItYm9yZGVyOiAgICAgICAgICAgICAgZGFya2VuKEBidG4tZGFuZ2VyLWJnLCA1JSk7XG5cbkBidG4tbGluay1kaXNhYmxlZC1jb2xvcjogICAgICAgIEBncmF5LWxpZ2h0O1xuXG5cbi8vPT0gRm9ybXNcbi8vXG4vLyMjXG5cbi8vKiogYDxpbnB1dD5gIGJhY2tncm91bmQgY29sb3JcbkBpbnB1dC1iZzogICAgICAgICAgICAgICAgICAgICAgIEBncmF5LWxpZ2h0ZXI7XG4vLyoqIGA8aW5wdXQgZGlzYWJsZWQ+YCBiYWNrZ3JvdW5kIGNvbG9yXG5AaW5wdXQtYmctZGlzYWJsZWQ6ICAgICAgICAgICAgICBAZ3JheS1saWdodGVyO1xuXG4vLyoqIFRleHQgY29sb3IgZm9yIGA8aW5wdXQ+YHNcbkBpbnB1dC1jb2xvcjogICAgICAgICAgICAgICAgICAgIEBncmF5O1xuLy8qKiBgPGlucHV0PmAgYm9yZGVyIGNvbG9yXG5AaW5wdXQtYm9yZGVyOiAgICAgICAgICAgICAgICAgICAjY2NjO1xuXG4vLyBUT0RPOiBSZW5hbWUgYEBpbnB1dC1ib3JkZXItcmFkaXVzYCB0byBgQGlucHV0LWJvcmRlci1yYWRpdXMtYmFzZWAgaW4gdjRcbi8vKiogRGVmYXVsdCBgLmZvcm0tY29udHJvbGAgYm9yZGVyIHJhZGl1c1xuQGlucHV0LWJvcmRlci1yYWRpdXM6ICAgICAgICAgICAgQGJvcmRlci1yYWRpdXMtYmFzZTtcbi8vKiogTGFyZ2UgYC5mb3JtLWNvbnRyb2xgIGJvcmRlciByYWRpdXNcbkBpbnB1dC1ib3JkZXItcmFkaXVzLWxhcmdlOiAgICAgIEBib3JkZXItcmFkaXVzLWxhcmdlO1xuLy8qKiBTbWFsbCBgLmZvcm0tY29udHJvbGAgYm9yZGVyIHJhZGl1c1xuQGlucHV0LWJvcmRlci1yYWRpdXMtc21hbGw6ICAgICAgQGJvcmRlci1yYWRpdXMtc21hbGw7XG5cbi8vKiogQm9yZGVyIGNvbG9yIGZvciBpbnB1dHMgb24gZm9jdXNcbkBpbnB1dC1ib3JkZXItZm9jdXM6ICAgICAgICAgICAgICM2NmFmZTk7XG5cbi8vKiogUGxhY2Vob2xkZXIgdGV4dCBjb2xvclxuQGlucHV0LWNvbG9yLXBsYWNlaG9sZGVyOiAgICAgICAgIzk5OTtcblxuLy8qKiBEZWZhdWx0IGAuZm9ybS1jb250cm9sYCBoZWlnaHRcbkBpbnB1dC1oZWlnaHQtYmFzZTogICAgICAgICAgICAgIChAbGluZS1oZWlnaHQtY29tcHV0ZWQgKyAoQHBhZGRpbmctYmFzZS12ZXJ0aWNhbCAqIDIpICsgMik7XG4vLyoqIExhcmdlIGAuZm9ybS1jb250cm9sYCBoZWlnaHRcbkBpbnB1dC1oZWlnaHQtbGFyZ2U6ICAgICAgICAgICAgIChjZWlsKEBmb250LXNpemUtbGFyZ2UgKiBAbGluZS1oZWlnaHQtbGFyZ2UpICsgKEBwYWRkaW5nLWxhcmdlLXZlcnRpY2FsICogMikgKyAyKTtcbi8vKiogU21hbGwgYC5mb3JtLWNvbnRyb2xgIGhlaWdodFxuQGlucHV0LWhlaWdodC1zbWFsbDogICAgICAgICAgICAgKGZsb29yKEBmb250LXNpemUtc21hbGwgKiBAbGluZS1oZWlnaHQtc21hbGwpICsgKEBwYWRkaW5nLXNtYWxsLXZlcnRpY2FsICogMikgKyAyKTtcblxuQGxlZ2VuZC1jb2xvcjogICAgICAgICAgICAgICAgICAgQGdyYXktZGFyaztcbkBsZWdlbmQtYm9yZGVyLWNvbG9yOiAgICAgICAgICAgICNlNWU1ZTU7XG5cbi8vKiogQmFja2dyb3VuZCBjb2xvciBmb3IgdGV4dHVhbCBpbnB1dCBhZGRvbnNcbkBpbnB1dC1ncm91cC1hZGRvbi1iZzogICAgICAgICAgIEBncmF5LWxpZ2h0ZXI7XG4vLyoqIEJvcmRlciBjb2xvciBmb3IgdGV4dHVhbCBpbnB1dCBhZGRvbnNcbkBpbnB1dC1ncm91cC1hZGRvbi1ib3JkZXItY29sb3I6IEBpbnB1dC1ib3JkZXI7XG5cbi8vKiogRGlzYWJsZWQgY3Vyc29yIGZvciBmb3JtIGNvbnRyb2xzIGFuZCBidXR0b25zLlxuQGN1cnNvci1kaXNhYmxlZDogICAgICAgICAgICAgICAgbm90LWFsbG93ZWQ7XG5cblxuLy89PSBEcm9wZG93bnNcbi8vXG4vLyMjIERyb3Bkb3duIG1lbnUgY29udGFpbmVyIGFuZCBjb250ZW50cy5cblxuLy8qKiBCYWNrZ3JvdW5kIGZvciB0aGUgZHJvcGRvd24gbWVudS5cbkBkcm9wZG93bi1iZzogICAgICAgICAgICAgICAgICAgIEBncmF5LWxpZ2h0ZXI7XG4vLyoqIERyb3Bkb3duIG1lbnUgYGJvcmRlci1jb2xvcmAuXG5AZHJvcGRvd24tYm9yZGVyOiAgICAgICAgICAgICAgICByZ2JhKDAsMCwwLC4xNSk7XG4vLyoqIERyb3Bkb3duIG1lbnUgYGJvcmRlci1jb2xvcmAgKipmb3IgSUU4KiouXG5AZHJvcGRvd24tZmFsbGJhY2stYm9yZGVyOiAgICAgICAjY2NjO1xuLy8qKiBEaXZpZGVyIGNvbG9yIGZvciBiZXR3ZWVuIGRyb3Bkb3duIGl0ZW1zLlxuQGRyb3Bkb3duLWRpdmlkZXItYmc6ICAgICAgICAgICAgI2U1ZTVlNTtcblxuLy8qKiBEcm9wZG93biBsaW5rIHRleHQgY29sb3IuXG5AZHJvcGRvd24tbGluay1jb2xvcjogICAgICAgICAgICBAZ3JheS1kYXJrO1xuLy8qKiBIb3ZlciBjb2xvciBmb3IgZHJvcGRvd24gbGlua3MuXG5AZHJvcGRvd24tbGluay1ob3Zlci1jb2xvcjogICAgICBkYXJrZW4oQGdyYXktZGFyaywgNSUpO1xuLy8qKiBIb3ZlciBiYWNrZ3JvdW5kIGZvciBkcm9wZG93biBsaW5rcy5cbkBkcm9wZG93bi1saW5rLWhvdmVyLWJnOiAgICAgICAgICNmNWY1ZjU7XG5cbi8vKiogQWN0aXZlIGRyb3Bkb3duIG1lbnUgaXRlbSB0ZXh0IGNvbG9yLlxuQGRyb3Bkb3duLWxpbmstYWN0aXZlLWNvbG9yOiAgICAgQGNvbXBvbmVudC1hY3RpdmUtY29sb3I7XG4vLyoqIEFjdGl2ZSBkcm9wZG93biBtZW51IGl0ZW0gYmFja2dyb3VuZCBjb2xvci5cbkBkcm9wZG93bi1saW5rLWFjdGl2ZS1iZzogICAgICAgIEBjb21wb25lbnQtYWN0aXZlLWJnO1xuXG4vLyoqIERpc2FibGVkIGRyb3Bkb3duIG1lbnUgaXRlbSBiYWNrZ3JvdW5kIGNvbG9yLlxuQGRyb3Bkb3duLWxpbmstZGlzYWJsZWQtY29sb3I6ICAgQGdyYXktbGlnaHQ7XG5cbi8vKiogVGV4dCBjb2xvciBmb3IgaGVhZGVycyB3aXRoaW4gZHJvcGRvd24gbWVudXMuXG5AZHJvcGRvd24taGVhZGVyLWNvbG9yOiAgICAgICAgICBAZ3JheS1saWdodDtcblxuLy8qKiBEZXByZWNhdGVkIGBAZHJvcGRvd24tY2FyZXQtY29sb3JgIGFzIG9mIHYzLjEuMFxuQGRyb3Bkb3duLWNhcmV0LWNvbG9yOiAgICAgICAgICAgIzAwMDtcblxuXG4vLy0tIFotaW5kZXggbWFzdGVyIGxpc3Rcbi8vXG4vLyBXYXJuaW5nOiBBdm9pZCBjdXN0b21pemluZyB0aGVzZSB2YWx1ZXMuIFRoZXkncmUgdXNlZCBmb3IgYSBiaXJkJ3MgZXllIHZpZXdcbi8vIG9mIGNvbXBvbmVudHMgZGVwZW5kZW50IG9uIHRoZSB6LWF4aXMgYW5kIGFyZSBkZXNpZ25lZCB0byBhbGwgd29yayB0b2dldGhlci5cbi8vXG4vLyBOb3RlOiBUaGVzZSB2YXJpYWJsZXMgYXJlIG5vdCBnZW5lcmF0ZWQgaW50byB0aGUgQ3VzdG9taXplci5cblxuQHppbmRleC1uYXZiYXI6ICAgICAgICAgICAgMTAwMDtcbkB6aW5kZXgtZHJvcGRvd246ICAgICAgICAgIDEwMDA7XG5AemluZGV4LXBvcG92ZXI6ICAgICAgICAgICAxMDYwO1xuQHppbmRleC10b29sdGlwOiAgICAgICAgICAgMTA3MDtcbkB6aW5kZXgtbmF2YmFyLWZpeGVkOiAgICAgIDEwMzA7XG5AemluZGV4LW1vZGFsOiAgICAgICAgICAgICAxMDQwO1xuXG5cbi8vPT0gTWVkaWEgcXVlcmllcyBicmVha3BvaW50c1xuLy9cbi8vIyMgRGVmaW5lIHRoZSBicmVha3BvaW50cyBhdCB3aGljaCB5b3VyIGxheW91dCB3aWxsIGNoYW5nZSwgYWRhcHRpbmcgdG8gZGlmZmVyZW50IHNjcmVlbiBzaXplcy5cblxuLy8gRXh0cmEgc21hbGwgc2NyZWVuIC8gcGhvbmVcbi8vKiogRGVwcmVjYXRlZCBgQHNjcmVlbi14c2AgYXMgb2YgdjMuMC4xXG5Ac2NyZWVuLXhzOiAgICAgICAgICAgICAgICAgIDQ4MHB4O1xuLy8qKiBEZXByZWNhdGVkIGBAc2NyZWVuLXhzLW1pbmAgYXMgb2YgdjMuMi4wXG5Ac2NyZWVuLXhzLW1pbjogICAgICAgICAgICAgIEBzY3JlZW4teHM7XG4vLyoqIERlcHJlY2F0ZWQgYEBzY3JlZW4tcGhvbmVgIGFzIG9mIHYzLjAuMVxuQHNjcmVlbi1waG9uZTogICAgICAgICAgICAgICBAc2NyZWVuLXhzLW1pbjtcblxuLy8gU21hbGwgc2NyZWVuIC8gdGFibGV0XG4vLyoqIERlcHJlY2F0ZWQgYEBzY3JlZW4tc21gIGFzIG9mIHYzLjAuMVxuQHNjcmVlbi1zbTogICAgICAgICAgICAgICAgICA3NjhweDtcbkBzY3JlZW4tc20tbWluOiAgICAgICAgICAgICAgQHNjcmVlbi1zbTtcbi8vKiogRGVwcmVjYXRlZCBgQHNjcmVlbi10YWJsZXRgIGFzIG9mIHYzLjAuMVxuQHNjcmVlbi10YWJsZXQ6ICAgICAgICAgICAgICBAc2NyZWVuLXNtLW1pbjtcblxuLy8gTWVkaXVtIHNjcmVlbiAvIGRlc2t0b3Bcbi8vKiogRGVwcmVjYXRlZCBgQHNjcmVlbi1tZGAgYXMgb2YgdjMuMC4xXG5Ac2NyZWVuLW1kOiAgICAgICAgICAgICAgICAgIDEwMzFweDtcbkBzY3JlZW4tbWQtbWluOiAgICAgICAgICAgICAgQHNjcmVlbi1tZDtcbi8vKiogRGVwcmVjYXRlZCBgQHNjcmVlbi1kZXNrdG9wYCBhcyBvZiB2My4wLjFcbkBzY3JlZW4tZGVza3RvcDogICAgICAgICAgICAgQHNjcmVlbi1tZC1taW47XG5cbi8vIExhcmdlIHNjcmVlbiAvIHdpZGUgZGVza3RvcFxuLy8qKiBEZXByZWNhdGVkIGBAc2NyZWVuLWxnYCBhcyBvZiB2My4wLjFcbkBzY3JlZW4tbGc6ICAgICAgICAgICAgICAgICAgMTIwMHB4O1xuQHNjcmVlbi1sZy1taW46ICAgICAgICAgICAgICBAc2NyZWVuLWxnO1xuLy8qKiBEZXByZWNhdGVkIGBAc2NyZWVuLWxnLWRlc2t0b3BgIGFzIG9mIHYzLjAuMVxuQHNjcmVlbi1sZy1kZXNrdG9wOiAgICAgICAgICBAc2NyZWVuLWxnLW1pbjtcblxuLy8gU28gbWVkaWEgcXVlcmllcyBkb24ndCBvdmVybGFwIHdoZW4gcmVxdWlyZWQsIHByb3ZpZGUgYSBtYXhpbXVtXG5Ac2NyZWVuLXhzLW1heDogICAgICAgICAgICAgIChAc2NyZWVuLXNtLW1pbiAtIDEpO1xuQHNjcmVlbi1zbS1tYXg6ICAgICAgICAgICAgICAoQHNjcmVlbi1tZC1taW4gLSAxKTtcbkBzY3JlZW4tbWQtbWF4OiAgICAgICAgICAgICAgKEBzY3JlZW4tbGctbWluIC0gMSk7XG5cblxuLy89PSBHcmlkIHN5c3RlbVxuLy9cbi8vIyMgRGVmaW5lIHlvdXIgY3VzdG9tIHJlc3BvbnNpdmUgZ3JpZC5cblxuLy8qKiBOdW1iZXIgb2YgY29sdW1ucyBpbiB0aGUgZ3JpZC5cbkBncmlkLWNvbHVtbnM6ICAgICAgICAgICAgICAxMjtcbi8vKiogUGFkZGluZyBiZXR3ZWVuIGNvbHVtbnMuIEdldHMgZGl2aWRlZCBpbiBoYWxmIGZvciB0aGUgbGVmdCBhbmQgcmlnaHQuXG5AZ3JpZC1ndXR0ZXItd2lkdGg6ICAgICAgICAgMzBweDtcbi8vIE5hdmJhciBjb2xsYXBzZVxuLy8qKiBQb2ludCBhdCB3aGljaCB0aGUgbmF2YmFyIGJlY29tZXMgdW5jb2xsYXBzZWQuXG5AZ3JpZC1mbG9hdC1icmVha3BvaW50OiAgICAgQHNjcmVlbi1zbS1taW47XG4vLyoqIFBvaW50IGF0IHdoaWNoIHRoZSBuYXZiYXIgYmVnaW5zIGNvbGxhcHNpbmcuXG5AZ3JpZC1mbG9hdC1icmVha3BvaW50LW1heDogKEBncmlkLWZsb2F0LWJyZWFrcG9pbnQgLSAxKTtcblxuXG4vLz09IENvbnRhaW5lciBzaXplc1xuLy9cbi8vIyMgRGVmaW5lIHRoZSBtYXhpbXVtIHdpZHRoIG9mIGAuY29udGFpbmVyYCBmb3IgZGlmZmVyZW50IHNjcmVlbiBzaXplcy5cblxuLy8gU21hbGwgc2NyZWVuIC8gdGFibGV0XG5AY29udGFpbmVyLXRhYmxldDogICAgICAgICAgICAgKDcyMHB4ICsgQGdyaWQtZ3V0dGVyLXdpZHRoKTtcbi8vKiogRm9yIGBAc2NyZWVuLXNtLW1pbmAgYW5kIHVwLlxuQGNvbnRhaW5lci1zbTogICAgICAgICAgICAgICAgIEBjb250YWluZXItdGFibGV0O1xuXG4vLyBNZWRpdW0gc2NyZWVuIC8gZGVza3RvcFxuQGNvbnRhaW5lci1kZXNrdG9wOiAgICAgICAgICAgICg5NDBweCArIEBncmlkLWd1dHRlci13aWR0aCk7XG4vLyoqIEZvciBgQHNjcmVlbi1tZC1taW5gIGFuZCB1cC5cbkBjb250YWluZXItbWQ6ICAgICAgICAgICAgICAgICBAY29udGFpbmVyLWRlc2t0b3A7XG5cbi8vIExhcmdlIHNjcmVlbiAvIHdpZGUgZGVza3RvcFxuQGNvbnRhaW5lci1sYXJnZS1kZXNrdG9wOiAgICAgICgxMTQwcHggKyBAZ3JpZC1ndXR0ZXItd2lkdGgpO1xuLy8qKiBGb3IgYEBzY3JlZW4tbGctbWluYCBhbmQgdXAuXG5AY29udGFpbmVyLWxnOiAgICAgICAgICAgICAgICAgQGNvbnRhaW5lci1sYXJnZS1kZXNrdG9wO1xuXG5cbi8vPT0gTmF2YmFyXG4vL1xuLy8jI1xuXG4vLyBCYXNpY3Mgb2YgYSBuYXZiYXJcbkBuYXZiYXItaGVpZ2h0OiAgICAgICAgICAgICAgICAgICAgNTBweDtcbkBuYXZiYXItbWFyZ2luLWJvdHRvbTogICAgICAgICAgICAgQGxpbmUtaGVpZ2h0LWNvbXB1dGVkKzEwcHg7XG5AbmF2YmFyLWJvcmRlci1yYWRpdXM6ICAgICAgICAgICAgIEBib3JkZXItcmFkaXVzLWJhc2U7XG5AbmF2YmFyLXBhZGRpbmctaG9yaXpvbnRhbDogICAgICAgIGZsb29yKChAZ3JpZC1ndXR0ZXItd2lkdGggLyAyKSk7XG5AbmF2YmFyLXBhZGRpbmctdmVydGljYWw6ICAgICAgICAgICgoQG5hdmJhci1oZWlnaHQgLSBAbGluZS1oZWlnaHQtY29tcHV0ZWQpIC8gMik7XG5AbmF2YmFyLWNvbGxhcHNlLW1heC1oZWlnaHQ6ICAgICAgIDM0MHB4O1xuXG5AbmF2YmFyLWRlZmF1bHQtY29sb3I6ICAgICAgICAgICAgICM3Nzc7XG5AbmF2YmFyLWRlZmF1bHQtYmc6ICAgICAgICAgICAgICAgICNmOGY4Zjg7XG5AbmF2YmFyLWRlZmF1bHQtYm9yZGVyOiAgICAgICAgICAgIGRhcmtlbihAbmF2YmFyLWRlZmF1bHQtYmcsIDYuNSUpO1xuXG4vLyBOYXZiYXIgbGlua3NcbkBuYXZiYXItZGVmYXVsdC1saW5rLWNvbG9yOiAgICAgICAgICAgICAgICBAZ3JheS1saWdodGVyO1xuQG5hdmJhci1kZWZhdWx0LWxpbmstaG92ZXItY29sb3I6ICAgICAgICAgICM0Q0FGNTA7XG5AbmF2YmFyLWRlZmF1bHQtbGluay1ob3Zlci1iZzogICAgICAgICAgICAgQGdyYXktbGlnaHRlcjtcbkBuYXZiYXItZGVmYXVsdC1saW5rLWFjdGl2ZS1jb2xvcjogICAgICAgICBAZ3JheS1saWdodGVyO1xuQG5hdmJhci1kZWZhdWx0LWxpbmstYWN0aXZlLWJnOiAgICAgICAgICAgIGRhcmtlbihAbmF2YmFyLWRlZmF1bHQtYmcsIDYuNSUpO1xuQG5hdmJhci1kZWZhdWx0LWxpbmstZGlzYWJsZWQtY29sb3I6ICAgICAgICNjY2M7XG5AbmF2YmFyLWRlZmF1bHQtbGluay1kaXNhYmxlZC1iZzogICAgICAgICAgdHJhbnNwYXJlbnQ7XG5cbi8vIE5hdmJhciBicmFuZCBsYWJlbFxuQG5hdmJhci1kZWZhdWx0LWJyYW5kLWNvbG9yOiAgICAgICAgICAgICAgIEBuYXZiYXItZGVmYXVsdC1saW5rLWNvbG9yO1xuQG5hdmJhci1kZWZhdWx0LWJyYW5kLWhvdmVyLWNvbG9yOiAgICAgICAgIGRhcmtlbihAbmF2YmFyLWRlZmF1bHQtYnJhbmQtY29sb3IsIDEwJSk7XG5AbmF2YmFyLWRlZmF1bHQtYnJhbmQtaG92ZXItYmc6ICAgICAgICAgICAgdHJhbnNwYXJlbnQ7XG5cbi8vIE5hdmJhciB0b2dnbGVcbkBuYXZiYXItZGVmYXVsdC10b2dnbGUtaG92ZXItYmc6ICAgICAgICAgICAjZGRkO1xuQG5hdmJhci1kZWZhdWx0LXRvZ2dsZS1pY29uLWJhci1iZzogICAgICAgICM4ODg7XG5AbmF2YmFyLWRlZmF1bHQtdG9nZ2xlLWJvcmRlci1jb2xvcjogICAgICAgI2RkZDtcblxuXG4vLyBJbnZlcnRlZCBuYXZiYXJcbi8vIFJlc2V0IGludmVydGVkIG5hdmJhciBiYXNpY3NcbkBuYXZiYXItaW52ZXJzZS1jb2xvcjogICAgICAgICAgICAgICAgICAgICAgbGlnaHRlbihAZ3JheS1saWdodCwgMTUlKTtcbkBuYXZiYXItaW52ZXJzZS1iZzogICAgICAgICAgICAgICAgICAgICAgICAgIzIyMjtcbkBuYXZiYXItaW52ZXJzZS1ib3JkZXI6ICAgICAgICAgICAgICAgICAgICAgZGFya2VuKEBuYXZiYXItaW52ZXJzZS1iZywgMTAlKTtcblxuLy8gSW52ZXJ0ZWQgbmF2YmFyIGxpbmtzXG5AbmF2YmFyLWludmVyc2UtbGluay1jb2xvcjogICAgICAgICAgICAgICAgIEBncmF5LWxpZ2h0O1xuQG5hdmJhci1pbnZlcnNlLWxpbmstaG92ZXItY29sb3I6ICAgICAgICAgICBAZ3JheS1saWdodGVyO1xuQG5hdmJhci1pbnZlcnNlLWxpbmstaG92ZXItYmc6ICAgICAgICAgICAgICB0cmFuc3BhcmVudDtcbkBuYXZiYXItaW52ZXJzZS1saW5rLWFjdGl2ZS1jb2xvcjogICAgICAgICAgQG5hdmJhci1pbnZlcnNlLWxpbmstaG92ZXItY29sb3I7XG5AbmF2YmFyLWludmVyc2UtbGluay1hY3RpdmUtYmc6ICAgICAgICAgICAgIGRhcmtlbihAbmF2YmFyLWludmVyc2UtYmcsIDEwJSk7XG5AbmF2YmFyLWludmVyc2UtbGluay1kaXNhYmxlZC1jb2xvcjogICAgICAgICM0NDQ7XG5AbmF2YmFyLWludmVyc2UtbGluay1kaXNhYmxlZC1iZzogICAgICAgICAgIHRyYW5zcGFyZW50O1xuXG4vLyBJbnZlcnRlZCBuYXZiYXIgYnJhbmQgbGFiZWxcbkBuYXZiYXItaW52ZXJzZS1icmFuZC1jb2xvcjogICAgICAgICAgICAgICAgQG5hdmJhci1pbnZlcnNlLWxpbmstY29sb3I7XG5AbmF2YmFyLWludmVyc2UtYnJhbmQtaG92ZXItY29sb3I6ICAgICAgICAgIEBncmF5LWxpZ2h0ZXI7XG5AbmF2YmFyLWludmVyc2UtYnJhbmQtaG92ZXItYmc6ICAgICAgICAgICAgIHRyYW5zcGFyZW50O1xuXG4vLyBJbnZlcnRlZCBuYXZiYXIgdG9nZ2xlXG5AbmF2YmFyLWludmVyc2UtdG9nZ2xlLWhvdmVyLWJnOiAgICAgICAgICAgICMzMzM7XG5AbmF2YmFyLWludmVyc2UtdG9nZ2xlLWljb24tYmFyLWJnOiAgICAgICAgIEBncmF5LWxpZ2h0ZXI7XG5AbmF2YmFyLWludmVyc2UtdG9nZ2xlLWJvcmRlci1jb2xvcjogICAgICAgICMzMzM7XG5cblxuLy89PSBOYXZzXG4vL1xuLy8jI1xuXG4vLz09PSBTaGFyZWQgbmF2IHN0eWxlc1xuQG5hdi1saW5rLXBhZGRpbmc6ICAgICAgICAgICAgICAgICAgICAgICAgICAxMHB4IDE1cHg7XG5AbmF2LWxpbmstaG92ZXItYmc6ICAgICAgICAgICAgICAgICAgICAgICAgIEBncmF5LWxpZ2h0ZXI7XG5cbkBuYXYtZGlzYWJsZWQtbGluay1jb2xvcjogICAgICAgICAgICAgICAgICAgQGdyYXktbGlnaHQ7XG5AbmF2LWRpc2FibGVkLWxpbmstaG92ZXItY29sb3I6ICAgICAgICAgICAgIEBncmF5LWxpZ2h0O1xuXG5AbmF2LW9wZW4tbGluay1ob3Zlci1jb2xvcjogICAgICAgICAgICAgICAgIEBncmF5LWxpZ2h0ZXI7XG5cbi8vPT0gVGFic1xuQG5hdi10YWJzLWJvcmRlci1jb2xvcjogICAgICAgICAgICAgICAgICAgICAjZGRkO1xuXG5AbmF2LXRhYnMtbGluay1ob3Zlci1ib3JkZXItY29sb3I6ICAgICAgICAgIEBncmF5LWxpZ2h0ZXI7XG5cbkBuYXYtdGFicy1hY3RpdmUtbGluay1ob3Zlci1iZzogICAgICAgICAgICAgQGJvZHktYmc7XG5AbmF2LXRhYnMtYWN0aXZlLWxpbmstaG92ZXItY29sb3I6ICAgICAgICAgIEBncmF5O1xuQG5hdi10YWJzLWFjdGl2ZS1saW5rLWhvdmVyLWJvcmRlci1jb2xvcjogICAjZGRkO1xuXG5AbmF2LXRhYnMtanVzdGlmaWVkLWxpbmstYm9yZGVyLWNvbG9yOiAgICAgICAgICAgICNkZGQ7XG5AbmF2LXRhYnMtanVzdGlmaWVkLWFjdGl2ZS1saW5rLWJvcmRlci1jb2xvcjogICAgIEBib2R5LWJnO1xuXG4vLz09IFBpbGxzXG5AbmF2LXBpbGxzLWJvcmRlci1yYWRpdXM6ICAgICAgICAgICAgICAgICAgIEBib3JkZXItcmFkaXVzLWJhc2U7XG5AbmF2LXBpbGxzLWFjdGl2ZS1saW5rLWhvdmVyLWJnOiAgICAgICAgICAgIEBjb21wb25lbnQtYWN0aXZlLWJnO1xuQG5hdi1waWxscy1hY3RpdmUtbGluay1ob3Zlci1jb2xvcjogICAgICAgICBAY29tcG9uZW50LWFjdGl2ZS1jb2xvcjtcblxuXG4vLz09IFBhZ2luYXRpb25cbi8vXG4vLyMjXG5cbkBwYWdpbmF0aW9uLWNvbG9yOiAgICAgICAgICAgICAgICAgICAgIEBsaW5rLWNvbG9yO1xuQHBhZ2luYXRpb24tYmc6ICAgICAgICAgICAgICAgICAgICAgICAgQGdyYXktbGlnaHRlcjtcbkBwYWdpbmF0aW9uLWJvcmRlcjogICAgICAgICAgICAgICAgICAgICNkZGQ7XG5cbkBwYWdpbmF0aW9uLWhvdmVyLWNvbG9yOiAgICAgICAgICAgICAgIEBsaW5rLWhvdmVyLWNvbG9yO1xuQHBhZ2luYXRpb24taG92ZXItYmc6ICAgICAgICAgICAgICAgICAgQGdyYXktbGlnaHRlcjtcbkBwYWdpbmF0aW9uLWhvdmVyLWJvcmRlcjogICAgICAgICAgICAgICNkZGQ7XG5cbkBwYWdpbmF0aW9uLWFjdGl2ZS1jb2xvcjogICAgICAgICAgICAgIEBncmF5LWxpZ2h0ZXI7XG5AcGFnaW5hdGlvbi1hY3RpdmUtYmc6ICAgICAgICAgICAgICAgICBAYnJhbmQtcHJpbWFyeTtcbkBwYWdpbmF0aW9uLWFjdGl2ZS1ib3JkZXI6ICAgICAgICAgICAgIEBicmFuZC1wcmltYXJ5O1xuXG5AcGFnaW5hdGlvbi1kaXNhYmxlZC1jb2xvcjogICAgICAgICAgICBAZ3JheS1saWdodDtcbkBwYWdpbmF0aW9uLWRpc2FibGVkLWJnOiAgICAgICAgICAgICAgIEBncmF5LWxpZ2h0ZXI7XG5AcGFnaW5hdGlvbi1kaXNhYmxlZC1ib3JkZXI6ICAgICAgICAgICAjZGRkO1xuXG5cbi8vPT0gUGFnZXJcbi8vXG4vLyMjXG5cbkBwYWdlci1iZzogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBwYWdpbmF0aW9uLWJnO1xuQHBhZ2VyLWJvcmRlcjogICAgICAgICAgICAgICAgICAgICAgICAgQHBhZ2luYXRpb24tYm9yZGVyO1xuQHBhZ2VyLWJvcmRlci1yYWRpdXM6ICAgICAgICAgICAgICAgICAgMTVweDtcblxuQHBhZ2VyLWhvdmVyLWJnOiAgICAgICAgICAgICAgICAgICAgICAgQHBhZ2luYXRpb24taG92ZXItYmc7XG5cbkBwYWdlci1hY3RpdmUtYmc6ICAgICAgICAgICAgICAgICAgICAgIEBwYWdpbmF0aW9uLWFjdGl2ZS1iZztcbkBwYWdlci1hY3RpdmUtY29sb3I6ICAgICAgICAgICAgICAgICAgIEBwYWdpbmF0aW9uLWFjdGl2ZS1jb2xvcjtcblxuQHBhZ2VyLWRpc2FibGVkLWNvbG9yOiAgICAgICAgICAgICAgICAgQHBhZ2luYXRpb24tZGlzYWJsZWQtY29sb3I7XG5cblxuLy89PSBKdW1ib3Ryb25cbi8vXG4vLyMjXG5cbkBqdW1ib3Ryb24tcGFkZGluZzogICAgICAgICAgICAgIDMwcHg7XG5AanVtYm90cm9uLWNvbG9yOiAgICAgICAgICAgICAgICBpbmhlcml0O1xuQGp1bWJvdHJvbi1iZzogICAgICAgICAgICAgICAgICAgQGdyYXktbGlnaHRlcjtcbkBqdW1ib3Ryb24taGVhZGluZy1jb2xvcjogICAgICAgIGluaGVyaXQ7XG5AanVtYm90cm9uLWZvbnQtc2l6ZTogICAgICAgICAgICBjZWlsKChAZm9udC1zaXplLWJhc2UgKiAxLjUpKTtcblxuXG4vLz09IEZvcm0gc3RhdGVzIGFuZCBhbGVydHNcbi8vXG4vLyMjIERlZmluZSBjb2xvcnMgZm9yIGZvcm0gZmVlZGJhY2sgc3RhdGVzIGFuZCwgYnkgZGVmYXVsdCwgYWxlcnRzLlxuXG5Ac3RhdGUtc3VjY2Vzcy10ZXh0OiAgICAgICAgICAgICAjMjE1ZjFlO1xuQHN0YXRlLXN1Y2Nlc3MtYmc6ICAgICAgICAgICAgICAgI2RmZjBkODtcbkBzdGF0ZS1zdWNjZXNzLWJvcmRlcjogICAgICAgICAgIGRhcmtlbihzcGluKEBzdGF0ZS1zdWNjZXNzLWJnLCAtMTApLCA1JSk7XG5cbkBzdGF0ZS1pbmZvLXRleHQ6ICAgICAgICAgICAgICAgICMzMTcwOGY7XG5Ac3RhdGUtaW5mby1iZzogICAgICAgICAgICAgICAgICAjZDllZGY3O1xuQHN0YXRlLWluZm8tYm9yZGVyOiAgICAgICAgICAgICAgZGFya2VuKHNwaW4oQHN0YXRlLWluZm8tYmcsIC0xMCksIDclKTtcblxuQHN0YXRlLXdhcm5pbmctdGV4dDogICAgICAgICAgICAgIzhhNmQzYjtcbkBzdGF0ZS13YXJuaW5nLWJnOiAgICAgICAgICAgICAgICNmY2Y4ZTM7XG5Ac3RhdGUtd2FybmluZy1ib3JkZXI6ICAgICAgICAgICBkYXJrZW4oc3BpbihAc3RhdGUtd2FybmluZy1iZywgLTEwKSwgNSUpO1xuXG5Ac3RhdGUtZGFuZ2VyLXRleHQ6ICAgICAgICAgICAgICAjYTk0NDQyO1xuQHN0YXRlLWRhbmdlci1iZzogICAgICAgICAgICAgICAgI2YyZGVkZTtcbkBzdGF0ZS1kYW5nZXItYm9yZGVyOiAgICAgICAgICAgIGRhcmtlbihzcGluKEBzdGF0ZS1kYW5nZXItYmcsIC0xMCksIDUlKTtcblxuXG4vLz09IFRvb2x0aXBzXG4vL1xuLy8jI1xuXG4vLyoqIFRvb2x0aXAgbWF4IHdpZHRoXG5AdG9vbHRpcC1tYXgtd2lkdGg6ICAgICAgICAgICAyMDBweDtcbi8vKiogVG9vbHRpcCB0ZXh0IGNvbG9yXG5AdG9vbHRpcC1jb2xvcjogICAgICAgICAgICAgICBAZ3JheS1saWdodGVyO1xuLy8qKiBUb29sdGlwIGJhY2tncm91bmQgY29sb3JcbkB0b29sdGlwLWJnOiAgICAgICAgICAgICAgICAgICMwMDA7XG5AdG9vbHRpcC1vcGFjaXR5OiAgICAgICAgICAgICAuOTtcblxuLy8qKiBUb29sdGlwIGFycm93IHdpZHRoXG5AdG9vbHRpcC1hcnJvdy13aWR0aDogICAgICAgICA1cHg7XG4vLyoqIFRvb2x0aXAgYXJyb3cgY29sb3JcbkB0b29sdGlwLWFycm93LWNvbG9yOiAgICAgICAgIEB0b29sdGlwLWJnO1xuXG5cbi8vPT0gUG9wb3ZlcnNcbi8vXG4vLyMjXG5cbi8vKiogUG9wb3ZlciBib2R5IGJhY2tncm91bmQgY29sb3JcbkBwb3BvdmVyLWJnOiAgICAgICAgICAgICAgICAgICAgICAgICAgQGdyYXktbGlnaHRlcjtcbi8vKiogUG9wb3ZlciBtYXhpbXVtIHdpZHRoXG5AcG9wb3Zlci1tYXgtd2lkdGg6ICAgICAgICAgICAgICAgICAgIDI3NnB4O1xuLy8qKiBQb3BvdmVyIGJvcmRlciBjb2xvclxuQHBvcG92ZXItYm9yZGVyLWNvbG9yOiAgICAgICAgICAgICAgICByZ2JhKDAsMCwwLC4yKTtcbi8vKiogUG9wb3ZlciBmYWxsYmFjayBib3JkZXIgY29sb3JcbkBwb3BvdmVyLWZhbGxiYWNrLWJvcmRlci1jb2xvcjogICAgICAgI2NjYztcblxuLy8qKiBQb3BvdmVyIHRpdGxlIGJhY2tncm91bmQgY29sb3JcbkBwb3BvdmVyLXRpdGxlLWJnOiAgICAgICAgICAgICAgICAgICAgZGFya2VuKEBwb3BvdmVyLWJnLCAzJSk7XG5cbi8vKiogUG9wb3ZlciBhcnJvdyB3aWR0aFxuQHBvcG92ZXItYXJyb3ctd2lkdGg6ICAgICAgICAgICAgICAgICAxMHB4O1xuLy8qKiBQb3BvdmVyIGFycm93IGNvbG9yXG5AcG9wb3Zlci1hcnJvdy1jb2xvcjogICAgICAgICAgICAgICAgIEBncmF5LWxpZ2h0ZXI7XG5AcG9wb3Zlci1hcnJvdy1jb2xvcjogICAgICAgICAgICAgICAgIEBwb3BvdmVyLWJnO1xuXG4vLyoqIFBvcG92ZXIgb3V0ZXIgYXJyb3cgd2lkdGhcbkBwb3BvdmVyLWFycm93LW91dGVyLXdpZHRoOiAgICAgICAgICAgKEBwb3BvdmVyLWFycm93LXdpZHRoICsgMSk7XG4vLyoqIFBvcG92ZXIgb3V0ZXIgYXJyb3cgY29sb3JcbkBwb3BvdmVyLWFycm93LW91dGVyLWNvbG9yOiAgICAgICAgICAgZmFkZWluKEBwb3BvdmVyLWJvcmRlci1jb2xvciwgNSUpO1xuLy8qKiBQb3BvdmVyIG91dGVyIGFycm93IGZhbGxiYWNrIGNvbG9yXG5AcG9wb3Zlci1hcnJvdy1vdXRlci1mYWxsYmFjay1jb2xvcjogIGRhcmtlbihAcG9wb3Zlci1mYWxsYmFjay1ib3JkZXItY29sb3IsIDIwJSk7XG5cblxuLy89PSBMYWJlbHNcbi8vXG4vLyMjXG5cbi8vKiogRGVmYXVsdCBsYWJlbCBiYWNrZ3JvdW5kIGNvbG9yXG5AbGFiZWwtZGVmYXVsdC1iZzogICAgICAgICAgICBAZ3JheS1saWdodDtcbi8vKiogUHJpbWFyeSBsYWJlbCBiYWNrZ3JvdW5kIGNvbG9yXG5AbGFiZWwtcHJpbWFyeS1iZzogICAgICAgICAgICBAYnJhbmQtcHJpbWFyeTtcbi8vKiogU3VjY2VzcyBsYWJlbCBiYWNrZ3JvdW5kIGNvbG9yXG5AbGFiZWwtc3VjY2Vzcy1iZzogICAgICAgICAgICBAYnJhbmQtc3VjY2Vzcztcbi8vKiogSW5mbyBsYWJlbCBiYWNrZ3JvdW5kIGNvbG9yXG5AbGFiZWwtaW5mby1iZzogICAgICAgICAgICAgICBAYnJhbmQtaW5mbztcbi8vKiogV2FybmluZyBsYWJlbCBiYWNrZ3JvdW5kIGNvbG9yXG5AbGFiZWwtd2FybmluZy1iZzogICAgICAgICAgICBAYnJhbmQtd2FybmluZztcbi8vKiogRGFuZ2VyIGxhYmVsIGJhY2tncm91bmQgY29sb3JcbkBsYWJlbC1kYW5nZXItYmc6ICAgICAgICAgICAgIEBicmFuZC1kYW5nZXI7XG5cbi8vKiogRGVmYXVsdCBsYWJlbCB0ZXh0IGNvbG9yXG5AbGFiZWwtY29sb3I6ICAgICAgICAgICAgICAgICBAZ3JheS1saWdodGVyO1xuLy8qKiBEZWZhdWx0IHRleHQgY29sb3Igb2YgYSBsaW5rZWQgbGFiZWxcbkBsYWJlbC1saW5rLWhvdmVyLWNvbG9yOiAgICAgIEBncmF5LWxpZ2h0ZXI7XG5cblxuLy89PSBNb2RhbHNcbi8vXG4vLyMjXG5cbi8vKiogUGFkZGluZyBhcHBsaWVkIHRvIHRoZSBtb2RhbCBib2R5XG5AbW9kYWwtaW5uZXItcGFkZGluZzogICAgICAgICAxNXB4O1xuXG4vLyoqIFBhZGRpbmcgYXBwbGllZCB0byB0aGUgbW9kYWwgdGl0bGVcbkBtb2RhbC10aXRsZS1wYWRkaW5nOiAgICAgICAgIDE1cHg7XG4vLyoqIE1vZGFsIHRpdGxlIGxpbmUtaGVpZ2h0XG5AbW9kYWwtdGl0bGUtbGluZS1oZWlnaHQ6ICAgICBAbGluZS1oZWlnaHQtYmFzZTtcblxuLy8qKiBCYWNrZ3JvdW5kIGNvbG9yIG9mIG1vZGFsIGNvbnRlbnQgYXJlYVxuQG1vZGFsLWNvbnRlbnQtYmc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAZ3JheS1saWdodGVyO1xuLy8qKiBNb2RhbCBjb250ZW50IGJvcmRlciBjb2xvclxuQG1vZGFsLWNvbnRlbnQtYm9yZGVyLWNvbG9yOiAgICAgICAgICAgICAgICAgICByZ2JhKDAsMCwwLC4yKTtcbi8vKiogTW9kYWwgY29udGVudCBib3JkZXIgY29sb3IgKipmb3IgSUU4KipcbkBtb2RhbC1jb250ZW50LWZhbGxiYWNrLWJvcmRlci1jb2xvcjogICAgICAgICAgIzk5OTtcblxuLy8qKiBNb2RhbCBiYWNrZHJvcCBiYWNrZ3JvdW5kIGNvbG9yXG5AbW9kYWwtYmFja2Ryb3AtYmc6ICAgICAgICAgICAjMDAwO1xuLy8qKiBNb2RhbCBiYWNrZHJvcCBvcGFjaXR5XG5AbW9kYWwtYmFja2Ryb3Atb3BhY2l0eTogICAgICAuNTtcbi8vKiogTW9kYWwgaGVhZGVyIGJvcmRlciBjb2xvclxuQG1vZGFsLWhlYWRlci1ib3JkZXItY29sb3I6ICAgI2U1ZTVlNTtcbi8vKiogTW9kYWwgZm9vdGVyIGJvcmRlciBjb2xvclxuQG1vZGFsLWZvb3Rlci1ib3JkZXItY29sb3I6ICAgQG1vZGFsLWhlYWRlci1ib3JkZXItY29sb3I7XG5cbkBtb2RhbC1sZzogICAgICAgICAgICAgICAgICAgIDkwMHB4O1xuQG1vZGFsLW1kOiAgICAgICAgICAgICAgICAgICAgNjAwcHg7XG5AbW9kYWwtc206ICAgICAgICAgICAgICAgICAgICAzMDBweDtcblxuXG4vLz09IEFsZXJ0c1xuLy9cbi8vIyMgRGVmaW5lIGFsZXJ0IGNvbG9ycywgYm9yZGVyIHJhZGl1cywgYW5kIHBhZGRpbmcuXG5cbkBhbGVydC1wYWRkaW5nOiAgICAgICAgICAgICAgIDE1cHg7XG5AYWxlcnQtYm9yZGVyLXJhZGl1czogICAgICAgICBAYm9yZGVyLXJhZGl1cy1iYXNlO1xuQGFsZXJ0LWxpbmstZm9udC13ZWlnaHQ6ICAgICAgYm9sZDtcblxuQGFsZXJ0LXN1Y2Nlc3MtYmc6ICAgICAgICAgICAgQHN0YXRlLXN1Y2Nlc3MtYmc7XG5AYWxlcnQtc3VjY2Vzcy10ZXh0OiAgICAgICAgICBAc3RhdGUtc3VjY2Vzcy10ZXh0O1xuQGFsZXJ0LXN1Y2Nlc3MtYm9yZGVyOiAgICAgICAgQHN0YXRlLXN1Y2Nlc3MtYm9yZGVyO1xuXG5AYWxlcnQtaW5mby1iZzogICAgICAgICAgICAgICBAc3RhdGUtaW5mby1iZztcbkBhbGVydC1pbmZvLXRleHQ6ICAgICAgICAgICAgIEBzdGF0ZS1pbmZvLXRleHQ7XG5AYWxlcnQtaW5mby1ib3JkZXI6ICAgICAgICAgICBAc3RhdGUtaW5mby1ib3JkZXI7XG5cbkBhbGVydC13YXJuaW5nLWJnOiAgICAgICAgICAgIEBzdGF0ZS13YXJuaW5nLWJnO1xuQGFsZXJ0LXdhcm5pbmctdGV4dDogICAgICAgICAgQHN0YXRlLXdhcm5pbmctdGV4dDtcbkBhbGVydC13YXJuaW5nLWJvcmRlcjogICAgICAgIEBzdGF0ZS13YXJuaW5nLWJvcmRlcjtcblxuQGFsZXJ0LWRhbmdlci1iZzogICAgICAgICAgICAgQHN0YXRlLWRhbmdlci1iZztcbkBhbGVydC1kYW5nZXItdGV4dDogICAgICAgICAgIEBzdGF0ZS1kYW5nZXItdGV4dDtcbkBhbGVydC1kYW5nZXItYm9yZGVyOiAgICAgICAgIEBzdGF0ZS1kYW5nZXItYm9yZGVyO1xuXG5cbi8vPT0gUHJvZ3Jlc3MgYmFyc1xuLy9cbi8vIyNcblxuLy8qKiBCYWNrZ3JvdW5kIGNvbG9yIG9mIHRoZSB3aG9sZSBwcm9ncmVzcyBjb21wb25lbnRcbkBwcm9ncmVzcy1iZzogICAgICAgICAgICAgICAgICNmNWY1ZjU7XG4vLyoqIFByb2dyZXNzIGJhciB0ZXh0IGNvbG9yXG5AcHJvZ3Jlc3MtYmFyLWNvbG9yOiAgICAgICAgICBAZ3JheS1saWdodGVyO1xuXG4vLyoqIFZhcmlhYmxlIGZvciBzZXR0aW5nIHJvdW5kZWQgY29ybmVycyBvbiBwcm9ncmVzcyBiYXIuXG5AcHJvZ3Jlc3MtYm9yZGVyLXJhZGl1czogICAgICBAYm9yZGVyLXJhZGl1cy1iYXNlO1xuXG4vLyoqIERlZmF1bHQgcHJvZ3Jlc3MgYmFyIGNvbG9yXG5AcHJvZ3Jlc3MtYmFyLWJnOiAgICAgICAgICAgICBAYnJhbmQtcHJpbWFyeTtcbi8vKiogU3VjY2VzcyBwcm9ncmVzcyBiYXIgY29sb3JcbkBwcm9ncmVzcy1iYXItc3VjY2Vzcy1iZzogICAgIEBicmFuZC1zdWNjZXNzO1xuLy8qKiBXYXJuaW5nIHByb2dyZXNzIGJhciBjb2xvclxuQHByb2dyZXNzLWJhci13YXJuaW5nLWJnOiAgICAgQGJyYW5kLXdhcm5pbmc7XG4vLyoqIERhbmdlciBwcm9ncmVzcyBiYXIgY29sb3JcbkBwcm9ncmVzcy1iYXItZGFuZ2VyLWJnOiAgICAgIEBicmFuZC1kYW5nZXI7XG4vLyoqIEluZm8gcHJvZ3Jlc3MgYmFyIGNvbG9yXG5AcHJvZ3Jlc3MtYmFyLWluZm8tYmc6ICAgICAgICBAYnJhbmQtaW5mbztcblxuXG4vLz09IExpc3QgZ3JvdXBcbi8vXG4vLyMjXG5cbi8vKiogQmFja2dyb3VuZCBjb2xvciBvbiBgLmxpc3QtZ3JvdXAtaXRlbWBcbkBsaXN0LWdyb3VwLWJnOiAgICAgICAgICAgICAgICAgQGJvZHktYmc7XG4vLyoqIGAubGlzdC1ncm91cC1pdGVtYCBib3JkZXIgY29sb3JcbkBsaXN0LWdyb3VwLWJvcmRlcjogICAgICAgICAgICAgI2RkZDtcbi8vKiogTGlzdCBncm91cCBib3JkZXIgcmFkaXVzXG5AbGlzdC1ncm91cC1ib3JkZXItcmFkaXVzOiAgICAgIEBib3JkZXItcmFkaXVzLWJhc2U7XG5cbi8vKiogQmFja2dyb3VuZCBjb2xvciBvZiBzaW5nbGUgbGlzdCBpdGVtcyBvbiBob3ZlclxuQGxpc3QtZ3JvdXAtaG92ZXItYmc6ICAgICAgICAgICAjZjVmNWY1O1xuLy8qKiBUZXh0IGNvbG9yIG9mIGFjdGl2ZSBsaXN0IGl0ZW1zXG5AbGlzdC1ncm91cC1hY3RpdmUtY29sb3I6ICAgICAgIEBjb21wb25lbnQtYWN0aXZlLWNvbG9yO1xuLy8qKiBCYWNrZ3JvdW5kIGNvbG9yIG9mIGFjdGl2ZSBsaXN0IGl0ZW1zXG5AbGlzdC1ncm91cC1hY3RpdmUtYmc6ICAgICAgICAgIEBjb21wb25lbnQtYWN0aXZlLWJnO1xuLy8qKiBCb3JkZXIgY29sb3Igb2YgYWN0aXZlIGxpc3QgZWxlbWVudHNcbkBsaXN0LWdyb3VwLWFjdGl2ZS1ib3JkZXI6ICAgICAgQGxpc3QtZ3JvdXAtYWN0aXZlLWJnO1xuLy8qKiBUZXh0IGNvbG9yIGZvciBjb250ZW50IHdpdGhpbiBhY3RpdmUgbGlzdCBpdGVtc1xuQGxpc3QtZ3JvdXAtYWN0aXZlLXRleHQtY29sb3I6ICBsaWdodGVuKEBsaXN0LWdyb3VwLWFjdGl2ZS1iZywgNDAlKTtcblxuLy8qKiBUZXh0IGNvbG9yIG9mIGRpc2FibGVkIGxpc3QgaXRlbXNcbkBsaXN0LWdyb3VwLWRpc2FibGVkLWNvbG9yOiAgICAgIEBncmF5LWxpZ2h0O1xuLy8qKiBCYWNrZ3JvdW5kIGNvbG9yIG9mIGRpc2FibGVkIGxpc3QgaXRlbXNcbkBsaXN0LWdyb3VwLWRpc2FibGVkLWJnOiAgICAgICAgIEBncmF5LWxpZ2h0ZXI7XG4vLyoqIFRleHQgY29sb3IgZm9yIGNvbnRlbnQgd2l0aGluIGRpc2FibGVkIGxpc3QgaXRlbXNcbkBsaXN0LWdyb3VwLWRpc2FibGVkLXRleHQtY29sb3I6IEBsaXN0LWdyb3VwLWRpc2FibGVkLWNvbG9yO1xuXG5AbGlzdC1ncm91cC1saW5rLWNvbG9yOiAgICAgICAgICM1NTU7XG5AbGlzdC1ncm91cC1saW5rLWhvdmVyLWNvbG9yOiAgIEBsaXN0LWdyb3VwLWxpbmstY29sb3I7XG5AbGlzdC1ncm91cC1saW5rLWhlYWRpbmctY29sb3I6ICMzMzM7XG5cblxuLy89PSBQYW5lbHNcbi8vXG4vLyMjXG5cbkBwYW5lbC1iZzogICAgICAgICAgICAgICAgICAgIEBncmF5LWxpZ2h0ZXI7XG5AcGFuZWwtYm9keS1wYWRkaW5nOiAgICAgICAgICAxNXB4O1xuQHBhbmVsLWhlYWRpbmctcGFkZGluZzogICAgICAgMTBweCAxNXB4O1xuQHBhbmVsLWZvb3Rlci1wYWRkaW5nOiAgICAgICAgQHBhbmVsLWhlYWRpbmctcGFkZGluZztcbkBwYW5lbC1ib3JkZXItcmFkaXVzOiAgICAgICAgIEBib3JkZXItcmFkaXVzLWJhc2U7XG5cbi8vKiogQm9yZGVyIGNvbG9yIGZvciBlbGVtZW50cyB3aXRoaW4gcGFuZWxzXG5AcGFuZWwtaW5uZXItYm9yZGVyOiAgICAgICAgICAjY2NjO1xuQHBhbmVsLWZvb3Rlci1iZzogICAgICAgICAgICAgI2RlZGVkZTtcblxuQHBhbmVsLWRlZmF1bHQtdGV4dDogICAgICAgICAgQGdyYXktZGFyaztcbkBwYW5lbC1kZWZhdWx0LWJvcmRlcjogICAgICAgICNkZGQ7XG5AcGFuZWwtZGVmYXVsdC1oZWFkaW5nLWJnOiAgICAjZjVmNWY1O1xuXG5AcGFuZWwtcHJpbWFyeS10ZXh0OiAgICAgICAgICBAZ3JheS1saWdodGVyO1xuQHBhbmVsLXByaW1hcnktYm9yZGVyOiAgICAgICAgQGJyYW5kLXByaW1hcnk7XG5AcGFuZWwtcHJpbWFyeS1oZWFkaW5nLWJnOiAgICBAYnJhbmQtcHJpbWFyeTtcblxuQHBhbmVsLXN1Y2Nlc3MtdGV4dDogICAgICAgICAgQHN0YXRlLXN1Y2Nlc3MtdGV4dDtcbkBwYW5lbC1zdWNjZXNzLWJvcmRlcjogICAgICAgIEBzdGF0ZS1zdWNjZXNzLWJvcmRlcjtcbkBwYW5lbC1zdWNjZXNzLWhlYWRpbmctYmc6ICAgIEBzdGF0ZS1zdWNjZXNzLWJnO1xuXG5AcGFuZWwtaW5mby10ZXh0OiAgICAgICAgICAgICBAZ3JheS1saWdodGVyO1xuQHBhbmVsLWluZm8tYm9yZGVyOiAgICAgICAgICAgZGFya2VuKEBicmFuZC1wcmltYXJ5LCA1JSk7XG5AcGFuZWwtaW5mby1oZWFkaW5nLWJnOiAgICAgICBAYnJhbmQtcHJpbWFyeTtcblxuQHBhbmVsLXdhcm5pbmctdGV4dDogICAgICAgICAgQHN0YXRlLXdhcm5pbmctdGV4dDtcbkBwYW5lbC13YXJuaW5nLWJvcmRlcjogICAgICAgIEBzdGF0ZS13YXJuaW5nLWJvcmRlcjtcbkBwYW5lbC13YXJuaW5nLWhlYWRpbmctYmc6ICAgIEBzdGF0ZS13YXJuaW5nLWJnO1xuXG5AcGFuZWwtZGFuZ2VyLXRleHQ6ICAgICAgICAgICBAc3RhdGUtZGFuZ2VyLXRleHQ7XG5AcGFuZWwtZGFuZ2VyLWJvcmRlcjogICAgICAgICBAc3RhdGUtZGFuZ2VyLWJvcmRlcjtcbkBwYW5lbC1kYW5nZXItaGVhZGluZy1iZzogICAgIEBzdGF0ZS1kYW5nZXItYmc7XG5cblxuLy89PSBUaHVtYm5haWxzXG4vL1xuLy8jI1xuXG4vLyoqIFBhZGRpbmcgYXJvdW5kIHRoZSB0aHVtYm5haWwgaW1hZ2VcbkB0aHVtYm5haWwtcGFkZGluZzogICAgICAgICAgIDRweDtcbi8vKiogVGh1bWJuYWlsIGJhY2tncm91bmQgY29sb3JcbkB0aHVtYm5haWwtYmc6ICAgICAgICAgICAgICAgIEBib2R5LWJnO1xuLy8qKiBUaHVtYm5haWwgYm9yZGVyIGNvbG9yXG5AdGh1bWJuYWlsLWJvcmRlcjogICAgICAgICAgICAjZGRkO1xuLy8qKiBUaHVtYm5haWwgYm9yZGVyIHJhZGl1c1xuQHRodW1ibmFpbC1ib3JkZXItcmFkaXVzOiAgICAgQGJvcmRlci1yYWRpdXMtYmFzZTtcblxuLy8qKiBDdXN0b20gdGV4dCBjb2xvciBmb3IgdGh1bWJuYWlsIGNhcHRpb25zXG5AdGh1bWJuYWlsLWNhcHRpb24tY29sb3I6ICAgICBAdGV4dC1jb2xvcjtcbi8vKiogUGFkZGluZyBhcm91bmQgdGhlIHRodW1ibmFpbCBjYXB0aW9uXG5AdGh1bWJuYWlsLWNhcHRpb24tcGFkZGluZzogICA5cHg7XG5cblxuLy89PSBXZWxsc1xuLy9cbi8vIyNcblxuQHdlbGwtYmc6ICAgICAgICAgICAgICAgICAgICAgI2Y1ZjVmNTtcbkB3ZWxsLWJvcmRlcjogICAgICAgICAgICAgICAgIGRhcmtlbihAd2VsbC1iZywgNyUpO1xuXG5cbi8vPT0gQmFkZ2VzXG4vL1xuLy8jI1xuXG5AYmFkZ2UtY29sb3I6ICAgICAgICAgICAgICAgICBAZ3JheS1saWdodGVyO1xuLy8qKiBMaW5rZWQgYmFkZ2UgdGV4dCBjb2xvciBvbiBob3ZlclxuQGJhZGdlLWxpbmstaG92ZXItY29sb3I6ICAgICAgQGdyYXktbGlnaHRlcjtcbkBiYWRnZS1iZzogICAgICAgICAgICAgICAgICAgIEBncmF5LWxpZ2h0O1xuXG4vLyoqIEJhZGdlIHRleHQgY29sb3IgaW4gYWN0aXZlIG5hdiBsaW5rXG5AYmFkZ2UtYWN0aXZlLWNvbG9yOiAgICAgICAgICBAbGluay1jb2xvcjtcbi8vKiogQmFkZ2UgYmFja2dyb3VuZCBjb2xvciBpbiBhY3RpdmUgbmF2IGxpbmtcbkBiYWRnZS1hY3RpdmUtYmc6ICAgICAgICAgICAgIEBncmF5LWxpZ2h0ZXI7XG5cbkBiYWRnZS1mb250LXdlaWdodDogICAgICAgICAgIGJvbGQ7XG5AYmFkZ2UtbGluZS1oZWlnaHQ6ICAgICAgICAgICAxO1xuQGJhZGdlLWJvcmRlci1yYWRpdXM6ICAgICAgICAgMTBweDtcblxuXG4vLz09IEJyZWFkY3J1bWJzXG4vL1xuLy8jI1xuXG5AYnJlYWRjcnVtYi1wYWRkaW5nLXZlcnRpY2FsOiAgIDhweDtcbkBicmVhZGNydW1iLXBhZGRpbmctaG9yaXpvbnRhbDogMTVweDtcbi8vKiogQnJlYWRjcnVtYiBiYWNrZ3JvdW5kIGNvbG9yXG5AYnJlYWRjcnVtYi1iZzogICAgICAgICAgICAgICAgICNmNWY1ZjU7XG4vLyoqIEJyZWFkY3J1bWIgdGV4dCBjb2xvclxuQGJyZWFkY3J1bWItY29sb3I6ICAgICAgICAgICAgICAjY2NjO1xuLy8qKiBUZXh0IGNvbG9yIG9mIGN1cnJlbnQgcGFnZSBpbiB0aGUgYnJlYWRjcnVtYlxuQGJyZWFkY3J1bWItYWN0aXZlLWNvbG9yOiAgICAgICBAZ3JheS1saWdodDtcbi8vKiogVGV4dHVhbCBzZXBhcmF0b3IgZm9yIGJldHdlZW4gYnJlYWRjcnVtYiBlbGVtZW50c1xuQGJyZWFkY3J1bWItc2VwYXJhdG9yOiAgICAgICAgICBcIi9cIjtcblxuXG4vLz09IENhcm91c2VsXG4vL1xuLy8jI1xuXG5AY2Fyb3VzZWwtdGV4dC1zaGFkb3c6ICAgICAgICAgICAgICAgICAgICAgICAgMCAxcHggMnB4IHJnYmEoMCwwLDAsLjYpO1xuXG5AY2Fyb3VzZWwtY29udHJvbC1jb2xvcjogICAgICAgICAgICAgICAgICAgICAgQGdyYXktbGlnaHRlcjtcbkBjYXJvdXNlbC1jb250cm9sLXdpZHRoOiAgICAgICAgICAgICAgICAgICAgICAxNSU7XG5AY2Fyb3VzZWwtY29udHJvbC1vcGFjaXR5OiAgICAgICAgICAgICAgICAgICAgLjU7XG5AY2Fyb3VzZWwtY29udHJvbC1mb250LXNpemU6ICAgICAgICAgICAgICAgICAgMjBweDtcblxuQGNhcm91c2VsLWluZGljYXRvci1hY3RpdmUtYmc6ICAgICAgICAgICAgICAgIEBncmF5LWxpZ2h0ZXI7XG5AY2Fyb3VzZWwtaW5kaWNhdG9yLWJvcmRlci1jb2xvcjogICAgICAgICAgICAgQGdyYXktbGlnaHRlcjtcblxuQGNhcm91c2VsLWNhcHRpb24tY29sb3I6ICAgICAgICAgICAgICAgICAgICAgIEBncmF5LWxpZ2h0ZXI7XG5cblxuLy89PSBDbG9zZVxuLy9cbi8vIyNcblxuQGNsb3NlLWZvbnQtd2VpZ2h0OiAgICAgICAgICAgYm9sZDtcbkBjbG9zZS1jb2xvcjogICAgICAgICAgICAgICAgICMwMDA7XG5AY2xvc2UtdGV4dC1zaGFkb3c6ICAgICAgICAgICAwIDFweCAwIEBncmF5LWxpZ2h0ZXI7XG5cblxuLy89PSBDb2RlXG4vL1xuLy8jI1xuXG5AY29kZS1jb2xvcjogICAgICAgICAgICAgICAgICAjYzcyNTRlO1xuQGNvZGUtYmc6ICAgICAgICAgICAgICAgICAgICAgI2Y5ZjJmNDtcblxuQGtiZC1jb2xvcjogICAgICAgICAgICAgICAgICAgQGdyYXktbGlnaHRlcjtcbkBrYmQtYmc6ICAgICAgICAgICAgICAgICAgICAgICMzMzM7XG5cbkBwcmUtYmc6ICAgICAgICAgICAgICAgICAgICAgICNmNWY1ZjU7XG5AcHJlLWNvbG9yOiAgICAgICAgICAgICAgICAgICBAZ3JheS1kYXJrO1xuQHByZS1ib3JkZXItY29sb3I6ICAgICAgICAgICAgI2NjYztcbkBwcmUtc2Nyb2xsYWJsZS1tYXgtaGVpZ2h0OiAgIDM0MHB4O1xuXG5cbi8vPT0gVHlwZVxuLy9cbi8vIyNcblxuLy8qKiBIb3Jpem9udGFsIG9mZnNldCBmb3IgZm9ybXMgYW5kIGxpc3RzLlxuQGNvbXBvbmVudC1vZmZzZXQtaG9yaXpvbnRhbDogMTgwcHg7XG4vLyoqIFRleHQgbXV0ZWQgY29sb3JcbkB0ZXh0LW11dGVkOiAgICAgICAgICAgICAgICAgIEBncmF5LWxpZ2h0O1xuLy8qKiBBYmJyZXZpYXRpb25zIGFuZCBhY3JvbnltcyBib3JkZXIgY29sb3JcbkBhYmJyLWJvcmRlci1jb2xvcjogICAgICAgICAgIEBncmF5LWxpZ2h0O1xuLy8qKiBIZWFkaW5ncyBzbWFsbCBjb2xvclxuQGhlYWRpbmdzLXNtYWxsLWNvbG9yOiAgICAgICAgQGdyYXktbGlnaHQ7XG4vLyoqIEJsb2NrcXVvdGUgc21hbGwgY29sb3JcbkBibG9ja3F1b3RlLXNtYWxsLWNvbG9yOiAgICAgIEBncmF5LWxpZ2h0O1xuLy8qKiBCbG9ja3F1b3RlIGZvbnQgc2l6ZVxuQGJsb2NrcXVvdGUtZm9udC1zaXplOiAgICAgICAgKEBmb250LXNpemUtYmFzZSAqIDEuMjUpO1xuLy8qKiBCbG9ja3F1b3RlIGJvcmRlciBjb2xvclxuQGJsb2NrcXVvdGUtYm9yZGVyLWNvbG9yOiAgICAgQGdyYXktbGlnaHRlcjtcbi8vKiogUGFnZSBoZWFkZXIgYm9yZGVyIGNvbG9yXG5AcGFnZS1oZWFkZXItYm9yZGVyLWNvbG9yOiAgICBAZ3JheS1saWdodGVyO1xuLy8qKiBXaWR0aCBvZiBob3Jpem9udGFsIGRlc2NyaXB0aW9uIGxpc3QgdGl0bGVzXG5AZGwtaG9yaXpvbnRhbC1vZmZzZXQ6ICAgICAgICBAY29tcG9uZW50LW9mZnNldC1ob3Jpem9udGFsO1xuLy8qKiBIb3Jpem9udGFsIGxpbmUgY29sb3IuXG5AaHItYm9yZGVyOiAgICAgICAgICAgICAgICAgICBAZ3JheS1saWdodGVyO1xuIiwiLy8gV2ViS2l0LXN0eWxlIGZvY3VzXG5cbi50YWItZm9jdXMoKSB7XG4gIC8vIERlZmF1bHRcbiAgb3V0bGluZTogdGhpbiBkb3R0ZWQ7XG4gIC8vIFdlYktpdFxuICBvdXRsaW5lOiA1cHggYXV0byAtd2Via2l0LWZvY3VzLXJpbmctY29sb3I7XG4gIG91dGxpbmUtb2Zmc2V0OiAtMnB4O1xufVxuIiwiLy9cbi8vIFRodW1ibmFpbHNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cblxuLy8gTWl4aW4gYW5kIGFkanVzdCB0aGUgcmVndWxhciBpbWFnZSBjbGFzc1xuLnRodW1ibmFpbCB7XG4gIGRpc3BsYXk6IGJsb2NrO1xuICBwYWRkaW5nOiBAdGh1bWJuYWlsLXBhZGRpbmc7XG4gIG1hcmdpbi1ib3R0b206IEBsaW5lLWhlaWdodC1jb21wdXRlZDtcbiAgbGluZS1oZWlnaHQ6IEBsaW5lLWhlaWdodC1iYXNlO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiBAdGh1bWJuYWlsLWJnO1xuICBib3JkZXI6IDFweCBzb2xpZCBAdGh1bWJuYWlsLWJvcmRlcjtcbiAgYm9yZGVyLXJhZGl1czogQHRodW1ibmFpbC1ib3JkZXItcmFkaXVzO1xuICAudHJhbnNpdGlvbihib3JkZXIgLjJzIGVhc2UtaW4tb3V0KTtcblxuICA+IGltZyxcbiAgYSA+IGltZyB7XG4gICAgJjpleHRlbmQoLmltZy1yZXNwb25zaXZlKTtcbiAgICBtYXJnaW4tbGVmdDogYXV0bztcbiAgICBtYXJnaW4tcmlnaHQ6IGF1dG87XG4gIH1cblxuICAvLyBBZGQgYSBob3ZlciBzdGF0ZSBmb3IgbGlua2VkIHZlcnNpb25zIG9ubHlcbiAgYSY6aG92ZXIsXG4gIGEmOmZvY3VzLFxuICBhJi5hY3RpdmUge1xuICAgIGJvcmRlci1jb2xvcjogQGxpbmstY29sb3I7XG4gIH1cblxuICAvLyBJbWFnZSBjYXB0aW9uc1xuICAuY2FwdGlvbiB7XG4gICAgcGFkZGluZzogQHRodW1ibmFpbC1jYXB0aW9uLXBhZGRpbmc7XG4gICAgY29sb3I6IEB0aHVtYm5haWwtY2FwdGlvbi1jb2xvcjtcbiAgfVxufVxuIiwiLy9cbi8vIENhcm91c2VsXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5cbi8vIFdyYXBwZXIgZm9yIHRoZSBzbGlkZSBjb250YWluZXIgYW5kIGluZGljYXRvcnNcbi5jYXJvdXNlbCB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbn1cblxuLmNhcm91c2VsLWlubmVyIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICBvdmVyZmxvdzogaGlkZGVuO1xuICB3aWR0aDogMTAwJTtcblxuICA+IC5pdGVtIHtcbiAgICBkaXNwbGF5OiBub25lO1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICAudHJhbnNpdGlvbiguNnMgZWFzZS1pbi1vdXQgbGVmdCk7XG5cbiAgICAvLyBBY2NvdW50IGZvciBqYW5raXR1ZGUgb24gaW1hZ2VzXG4gICAgPiBpbWcsXG4gICAgPiBhID4gaW1nIHtcbiAgICAgICY6ZXh0ZW5kKC5pbWctcmVzcG9uc2l2ZSk7XG4gICAgICBsaW5lLWhlaWdodDogMTtcbiAgICB9XG5cbiAgICAvLyBXZWJLaXQgQ1NTMyB0cmFuc2Zvcm1zIGZvciBzdXBwb3J0ZWQgZGV2aWNlc1xuICAgIEBtZWRpYSBhbGwgYW5kICh0cmFuc2Zvcm0tM2QpLCAoLXdlYmtpdC10cmFuc2Zvcm0tM2QpIHtcbiAgICAgIHRyYW5zaXRpb246IHRyYW5zZm9ybSAuNnMgZWFzZS1pbi1vdXQ7XG4gICAgICBiYWNrZmFjZS12aXNpYmlsaXR5OiBoaWRkZW47XG4gICAgICBwZXJzcGVjdGl2ZTogMTAwMDtcblxuICAgICAgJi5uZXh0LFxuICAgICAgJi5hY3RpdmUucmlnaHQge1xuICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDEwMCUsIDAsIDApO1xuICAgICAgICBsZWZ0OiAwO1xuICAgICAgfVxuICAgICAgJi5wcmV2LFxuICAgICAgJi5hY3RpdmUubGVmdCB7XG4gICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlM2QoLTEwMCUsIDAsIDApO1xuICAgICAgICBsZWZ0OiAwO1xuICAgICAgfVxuICAgICAgJi5uZXh0LmxlZnQsXG4gICAgICAmLnByZXYucmlnaHQsXG4gICAgICAmLmFjdGl2ZSB7XG4gICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlM2QoMCwgMCwgMCk7XG4gICAgICAgIGxlZnQ6IDA7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgPiAuYWN0aXZlLFxuICA+IC5uZXh0LFxuICA+IC5wcmV2IHtcbiAgICBkaXNwbGF5OiBibG9jaztcbiAgfVxuXG4gID4gLmFjdGl2ZSB7XG4gICAgbGVmdDogMDtcbiAgfVxuXG4gID4gLm5leHQsXG4gID4gLnByZXYge1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICB0b3A6IDA7XG4gICAgd2lkdGg6IDEwMCU7XG4gIH1cblxuICA+IC5uZXh0IHtcbiAgICBsZWZ0OiAxMDAlO1xuICB9XG4gID4gLnByZXYge1xuICAgIGxlZnQ6IC0xMDAlO1xuICB9XG4gID4gLm5leHQubGVmdCxcbiAgPiAucHJldi5yaWdodCB7XG4gICAgbGVmdDogMDtcbiAgfVxuXG4gID4gLmFjdGl2ZS5sZWZ0IHtcbiAgICBsZWZ0OiAtMTAwJTtcbiAgfVxuICA+IC5hY3RpdmUucmlnaHQge1xuICAgIGxlZnQ6IDEwMCU7XG4gIH1cblxufVxuXG4vLyBMZWZ0L3JpZ2h0IGNvbnRyb2xzIGZvciBuYXZcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4uY2Fyb3VzZWwtY29udHJvbCB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgdG9wOiAwO1xuICBsZWZ0OiAwO1xuICBib3R0b206IDA7XG4gIHdpZHRoOiBAY2Fyb3VzZWwtY29udHJvbC13aWR0aDtcbiAgLm9wYWNpdHkoQGNhcm91c2VsLWNvbnRyb2wtb3BhY2l0eSk7XG4gIGZvbnQtc2l6ZTogQGNhcm91c2VsLWNvbnRyb2wtZm9udC1zaXplO1xuICBjb2xvcjogQGNhcm91c2VsLWNvbnRyb2wtY29sb3I7XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgdGV4dC1zaGFkb3c6IEBjYXJvdXNlbC10ZXh0LXNoYWRvdztcbiAgLy8gV2UgY2FuJ3QgaGF2ZSB0aGlzIHRyYW5zaXRpb24gaGVyZSBiZWNhdXNlIFdlYktpdCBjYW5jZWxzIHRoZSBjYXJvdXNlbFxuICAvLyBhbmltYXRpb24gaWYgeW91IHRyaXAgdGhpcyB3aGlsZSBpbiB0aGUgbWlkZGxlIG9mIGFub3RoZXIgYW5pbWF0aW9uLlxuXG4gIC8vIFNldCBncmFkaWVudHMgZm9yIGJhY2tncm91bmRzXG4gICYubGVmdCB7XG4gICAgI2dyYWRpZW50ID4gLmhvcml6b250YWwoQHN0YXJ0LWNvbG9yOiByZ2JhKDAsMCwwLC41KTsgQGVuZC1jb2xvcjogcmdiYSgwLDAsMCwuMDAwMSkpO1xuICB9XG4gICYucmlnaHQge1xuICAgIGxlZnQ6IGF1dG87XG4gICAgcmlnaHQ6IDA7XG4gICAgI2dyYWRpZW50ID4gLmhvcml6b250YWwoQHN0YXJ0LWNvbG9yOiByZ2JhKDAsMCwwLC4wMDAxKTsgQGVuZC1jb2xvcjogcmdiYSgwLDAsMCwuNSkpO1xuICB9XG5cbiAgLy8gSG92ZXIvZm9jdXMgc3RhdGVcbiAgJjpob3ZlcixcbiAgJjpmb2N1cyB7XG4gICAgb3V0bGluZTogMDtcbiAgICBjb2xvcjogQGNhcm91c2VsLWNvbnRyb2wtY29sb3I7XG4gICAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xuICAgIC5vcGFjaXR5KC45KTtcbiAgfVxuXG4gIC8vIFRvZ2dsZXNcbiAgLmljb24tcHJldixcbiAgLmljb24tbmV4dCxcbiAgLmdseXBoaWNvbi1jaGV2cm9uLWxlZnQsXG4gIC5nbHlwaGljb24tY2hldnJvbi1yaWdodCB7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIHRvcDogNTAlO1xuICAgIHotaW5kZXg6IDU7XG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICB9XG4gIC5pY29uLXByZXYsXG4gIC5nbHlwaGljb24tY2hldnJvbi1sZWZ0IHtcbiAgICBsZWZ0OiA1MCU7XG4gICAgbWFyZ2luLWxlZnQ6IC0xMHB4O1xuICB9XG4gIC5pY29uLW5leHQsXG4gIC5nbHlwaGljb24tY2hldnJvbi1yaWdodCB7XG4gICAgcmlnaHQ6IDUwJTtcbiAgICBtYXJnaW4tcmlnaHQ6IC0xMHB4O1xuICB9XG4gIC5pY29uLXByZXYsXG4gIC5pY29uLW5leHQge1xuICAgIHdpZHRoOiAgMjBweDtcbiAgICBoZWlnaHQ6IDIwcHg7XG4gICAgbWFyZ2luLXRvcDogLTEwcHg7XG4gICAgZm9udC1mYW1pbHk6IHNlcmlmO1xuICB9XG5cblxuICAuaWNvbi1wcmV2IHtcbiAgICAmOmJlZm9yZSB7XG4gICAgICBjb250ZW50OiAnXFwyMDM5JzsvLyBTSU5HTEUgTEVGVC1QT0lOVElORyBBTkdMRSBRVU9UQVRJT04gTUFSSyAoVSsyMDM5KVxuICAgIH1cbiAgfVxuICAuaWNvbi1uZXh0IHtcbiAgICAmOmJlZm9yZSB7XG4gICAgICBjb250ZW50OiAnXFwyMDNhJzsvLyBTSU5HTEUgUklHSFQtUE9JTlRJTkcgQU5HTEUgUVVPVEFUSU9OIE1BUksgKFUrMjAzQSlcbiAgICB9XG4gIH1cbn1cblxuLy8gT3B0aW9uYWwgaW5kaWNhdG9yIHBpcHNcbi8vXG4vLyBBZGQgYW4gdW5vcmRlcmVkIGxpc3Qgd2l0aCB0aGUgZm9sbG93aW5nIGNsYXNzIGFuZCBhZGQgYSBsaXN0IGl0ZW0gZm9yIGVhY2hcbi8vIHNsaWRlIHlvdXIgY2Fyb3VzZWwgaG9sZHMuXG5cbi5jYXJvdXNlbC1pbmRpY2F0b3JzIHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICBib3R0b206IDEwcHg7XG4gIGxlZnQ6IDUwJTtcbiAgei1pbmRleDogMTU7XG4gIHdpZHRoOiA2MCU7XG4gIG1hcmdpbi1sZWZ0OiAtMzAlO1xuICBwYWRkaW5nLWxlZnQ6IDA7XG4gIGxpc3Qtc3R5bGU6IG5vbmU7XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcblxuICBsaSB7XG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgIHdpZHRoOiAgMTBweDtcbiAgICBoZWlnaHQ6IDEwcHg7XG4gICAgbWFyZ2luOiAxcHg7XG4gICAgdGV4dC1pbmRlbnQ6IC05OTlweDtcbiAgICBib3JkZXI6IDFweCBzb2xpZCBAY2Fyb3VzZWwtaW5kaWNhdG9yLWJvcmRlci1jb2xvcjtcbiAgICBib3JkZXItcmFkaXVzOiAxMHB4O1xuICAgIGN1cnNvcjogcG9pbnRlcjtcblxuICAgIC8vIElFOC05IGhhY2sgZm9yIGV2ZW50IGhhbmRsaW5nXG4gICAgLy9cbiAgICAvLyBJbnRlcm5ldCBFeHBsb3JlciA4LTkgZG9lcyBub3Qgc3VwcG9ydCBjbGlja3Mgb24gZWxlbWVudHMgd2l0aG91dCBhIHNldFxuICAgIC8vIGBiYWNrZ3JvdW5kLWNvbG9yYC4gV2UgY2Fubm90IHVzZSBgZmlsdGVyYCBzaW5jZSB0aGF0J3Mgbm90IHZpZXdlZCBhcyBhXG4gICAgLy8gYmFja2dyb3VuZCBjb2xvciBieSB0aGUgYnJvd3Nlci4gVGh1cywgYSBoYWNrIGlzIG5lZWRlZC5cbiAgICAvL1xuICAgIC8vIEZvciBJRTgsIHdlIHNldCBzb2xpZCBibGFjayBhcyBpdCBkb2Vzbid0IHN1cHBvcnQgYHJnYmEoKWAuIEZvciBJRTksIHdlXG4gICAgLy8gc2V0IGFscGhhIHRyYW5zcGFyZW5jeSBmb3IgdGhlIGJlc3QgcmVzdWx0cyBwb3NzaWJsZS5cbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjMDAwIFxcOTsgLy8gSUU4XG4gICAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgwLDAsMCwwKTsgLy8gSUU5XG4gIH1cbiAgLmFjdGl2ZSB7XG4gICAgbWFyZ2luOiAwO1xuICAgIHdpZHRoOiAgMTJweDtcbiAgICBoZWlnaHQ6IDEycHg7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogQGNhcm91c2VsLWluZGljYXRvci1hY3RpdmUtYmc7XG4gIH1cbn1cblxuLy8gT3B0aW9uYWwgY2FwdGlvbnNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBIaWRkZW4gYnkgZGVmYXVsdCBmb3Igc21hbGxlciB2aWV3cG9ydHNcbi5jYXJvdXNlbC1jYXB0aW9uIHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICBsZWZ0OiAxNSU7XG4gIHJpZ2h0OiAxNSU7XG4gIGJvdHRvbTogMjBweDtcbiAgei1pbmRleDogMTA7XG4gIHBhZGRpbmctdG9wOiAyMHB4O1xuICBwYWRkaW5nLWJvdHRvbTogMjBweDtcbiAgY29sb3I6IEBjYXJvdXNlbC1jYXB0aW9uLWNvbG9yO1xuICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gIHRleHQtc2hhZG93OiBAY2Fyb3VzZWwtdGV4dC1zaGFkb3c7XG4gICYgLmJ0biB7XG4gICAgdGV4dC1zaGFkb3c6IG5vbmU7IC8vIE5vIHNoYWRvdyBmb3IgYnV0dG9uIGVsZW1lbnRzIGluIGNhcm91c2VsLWNhcHRpb25cbiAgfVxufVxuXG5cbi8vIFNjYWxlIHVwIGNvbnRyb2xzIGZvciB0YWJsZXRzIGFuZCB1cFxuQG1lZGlhIHNjcmVlbiBhbmQgKG1pbi13aWR0aDogQHNjcmVlbi1zbS1taW4pIHtcblxuICAvLyBTY2FsZSB1cCB0aGUgY29udHJvbHMgYSBzbWlkZ2VcbiAgLmNhcm91c2VsLWNvbnRyb2wge1xuICAgIC5nbHlwaGljb24tY2hldnJvbi1sZWZ0LFxuICAgIC5nbHlwaGljb24tY2hldnJvbi1yaWdodCxcbiAgICAuaWNvbi1wcmV2LFxuICAgIC5pY29uLW5leHQge1xuICAgICAgd2lkdGg6IDMwcHg7XG4gICAgICBoZWlnaHQ6IDMwcHg7XG4gICAgICBtYXJnaW4tdG9wOiAtMTVweDtcbiAgICAgIGZvbnQtc2l6ZTogMzBweDtcbiAgICB9XG4gICAgLmdseXBoaWNvbi1jaGV2cm9uLWxlZnQsXG4gICAgLmljb24tcHJldiB7XG4gICAgICBtYXJnaW4tbGVmdDogLTE1cHg7XG4gICAgfVxuICAgIC5nbHlwaGljb24tY2hldnJvbi1yaWdodCxcbiAgICAuaWNvbi1uZXh0IHtcbiAgICAgIG1hcmdpbi1yaWdodDogLTE1cHg7XG4gICAgfVxuICB9XG5cbiAgLy8gU2hvdyBhbmQgbGVmdCBhbGlnbiB0aGUgY2FwdGlvbnNcbiAgLmNhcm91c2VsLWNhcHRpb24ge1xuICAgIGxlZnQ6IDIwJTtcbiAgICByaWdodDogMjAlO1xuICAgIHBhZGRpbmctYm90dG9tOiAzMHB4O1xuICB9XG5cbiAgLy8gTW92ZSB1cCB0aGUgaW5kaWNhdG9yc1xuICAuY2Fyb3VzZWwtaW5kaWNhdG9ycyB7XG4gICAgYm90dG9tOiAyMHB4O1xuICB9XG59XG4iLCIvLyBJbWFnZSBNaXhpbnNcbi8vIC0gUmVzcG9uc2l2ZSBpbWFnZVxuLy8gLSBSZXRpbmEgaW1hZ2VcblxuXG4vLyBSZXNwb25zaXZlIGltYWdlXG4vL1xuLy8gS2VlcCBpbWFnZXMgZnJvbSBzY2FsaW5nIGJleW9uZCB0aGUgd2lkdGggb2YgdGhlaXIgcGFyZW50cy5cbi5pbWctcmVzcG9uc2l2ZShAZGlzcGxheTogYmxvY2spIHtcbiAgZGlzcGxheTogQGRpc3BsYXk7XG4gIG1heC13aWR0aDogMTAwJTsgLy8gUGFydCAxOiBTZXQgYSBtYXhpbXVtIHJlbGF0aXZlIHRvIHRoZSBwYXJlbnRcbiAgaGVpZ2h0OiBhdXRvOyAvLyBQYXJ0IDI6IFNjYWxlIHRoZSBoZWlnaHQgYWNjb3JkaW5nIHRvIHRoZSB3aWR0aCwgb3RoZXJ3aXNlIHlvdSBnZXQgc3RyZXRjaGluZ1xufVxuXG5cbi8vIFJldGluYSBpbWFnZVxuLy9cbi8vIFNob3J0IHJldGluYSBtaXhpbiBmb3Igc2V0dGluZyBiYWNrZ3JvdW5kLWltYWdlIGFuZCAtc2l6ZS4gTm90ZSB0aGF0IHRoZVxuLy8gc3BlbGxpbmcgb2YgYG1pbi0tbW96LWRldmljZS1waXhlbC1yYXRpb2AgaXMgaW50ZW50aW9uYWwuXG4uaW1nLXJldGluYShAZmlsZS0xeDsgQGZpbGUtMng7IEB3aWR0aC0xeDsgQGhlaWdodC0xeCkge1xuICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoXCJAe2ZpbGUtMXh9XCIpO1xuXG4gIEBtZWRpYVxuICBvbmx5IHNjcmVlbiBhbmQgKC13ZWJraXQtbWluLWRldmljZS1waXhlbC1yYXRpbzogMiksXG4gIG9ubHkgc2NyZWVuIGFuZCAoICAgbWluLS1tb3otZGV2aWNlLXBpeGVsLXJhdGlvOiAyKSxcbiAgb25seSBzY3JlZW4gYW5kICggICAgIC1vLW1pbi1kZXZpY2UtcGl4ZWwtcmF0aW86IDIvMSksXG4gIG9ubHkgc2NyZWVuIGFuZCAoICAgICAgICBtaW4tZGV2aWNlLXBpeGVsLXJhdGlvOiAyKSxcbiAgb25seSBzY3JlZW4gYW5kICggICAgICAgICAgICAgICAgbWluLXJlc29sdXRpb246IDE5MmRwaSksXG4gIG9ubHkgc2NyZWVuIGFuZCAoICAgICAgICAgICAgICAgIG1pbi1yZXNvbHV0aW9uOiAyZHBweCkge1xuICAgIGJhY2tncm91bmQtaW1hZ2U6IHVybChcIkB7ZmlsZS0yeH1cIik7XG4gICAgYmFja2dyb3VuZC1zaXplOiBAd2lkdGgtMXggQGhlaWdodC0xeDtcbiAgfVxufVxuIiwiLy9cbi8vIFR5cG9ncmFwaHlcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cblxuLy8gSGVhZGluZ3Ncbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuaDEsIGgyLCBoMywgaDQsIGg1LCBoNixcbi5oMSwgLmgyLCAuaDMsIC5oNCwgLmg1LCAuaDYge1xuICBmb250LWZhbWlseTogQGhlYWRpbmdzLWZvbnQtZmFtaWx5O1xuICBmb250LXdlaWdodDogQGhlYWRpbmdzLWZvbnQtd2VpZ2h0O1xuICBsaW5lLWhlaWdodDogQGhlYWRpbmdzLWxpbmUtaGVpZ2h0O1xuICBjb2xvcjogQGhlYWRpbmdzLWNvbG9yO1xuXG4gIHNtYWxsLFxuICAuc21hbGwge1xuICAgIGZvbnQtd2VpZ2h0OiBub3JtYWw7XG4gICAgbGluZS1oZWlnaHQ6IDE7XG4gICAgY29sb3I6IEBoZWFkaW5ncy1zbWFsbC1jb2xvcjtcbiAgfVxufVxuXG5oMSwgLmgxLFxuaDIsIC5oMixcbmgzLCAuaDMge1xuICBtYXJnaW4tdG9wOiBAbGluZS1oZWlnaHQtY29tcHV0ZWQ7XG4gIG1hcmdpbi1ib3R0b206IChAbGluZS1oZWlnaHQtY29tcHV0ZWQgLyAyKTtcblxuICBzbWFsbCxcbiAgLnNtYWxsIHtcbiAgICBmb250LXNpemU6IDY1JTtcbiAgfVxufVxuaDQsIC5oNCxcbmg1LCAuaDUsXG5oNiwgLmg2IHtcbiAgbWFyZ2luLXRvcDogKEBsaW5lLWhlaWdodC1jb21wdXRlZCAvIDIpO1xuICBtYXJnaW4tYm90dG9tOiAoQGxpbmUtaGVpZ2h0LWNvbXB1dGVkIC8gMik7XG5cbiAgc21hbGwsXG4gIC5zbWFsbCB7XG4gICAgZm9udC1zaXplOiA3NSU7XG4gIH1cbn1cblxuaDEsIC5oMSB7IGZvbnQtc2l6ZTogQGZvbnQtc2l6ZS1oMTsgfVxuaDIsIC5oMiB7IGZvbnQtc2l6ZTogQGZvbnQtc2l6ZS1oMjsgfVxuaDMsIC5oMyB7IGZvbnQtc2l6ZTogQGZvbnQtc2l6ZS1oMzsgfVxuaDQsIC5oNCB7IGZvbnQtc2l6ZTogQGZvbnQtc2l6ZS1oNDsgfVxuaDUsIC5oNSB7IGZvbnQtc2l6ZTogQGZvbnQtc2l6ZS1oNTsgfVxuaDYsIC5oNiB7IGZvbnQtc2l6ZTogQGZvbnQtc2l6ZS1oNjsgfVxuXG5cbi8vIEJvZHkgdGV4dFxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5wIHtcbiAgbWFyZ2luOiAwIDAgKEBsaW5lLWhlaWdodC1jb21wdXRlZCAvIDIpO1xufVxuXG4ubGVhZCB7XG4gIG1hcmdpbi1ib3R0b206IEBsaW5lLWhlaWdodC1jb21wdXRlZDtcbiAgZm9udC1zaXplOiBmbG9vcigoQGZvbnQtc2l6ZS1iYXNlICogMS4xNSkpO1xuICBmb250LXdlaWdodDogMzAwO1xuICBsaW5lLWhlaWdodDogMS40O1xuXG4gIEBtZWRpYSAobWluLXdpZHRoOiBAc2NyZWVuLXNtLW1pbikge1xuICAgIGZvbnQtc2l6ZTogKEBmb250LXNpemUtYmFzZSAqIDEuNSk7XG4gIH1cbn1cblxuXG4vLyBFbXBoYXNpcyAmIG1pc2Ncbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLy8gRXg6ICgxMnB4IHNtYWxsIGZvbnQgLyAxNHB4IGJhc2UgZm9udCkgKiAxMDAlID0gYWJvdXQgODUlXG5zbWFsbCxcbi5zbWFsbCB7XG4gIGZvbnQtc2l6ZTogZmxvb3IoKDEwMCUgKiBAZm9udC1zaXplLXNtYWxsIC8gQGZvbnQtc2l6ZS1iYXNlKSk7XG59XG5cbm1hcmssXG4ubWFyayB7XG4gIGJhY2tncm91bmQtY29sb3I6IEBzdGF0ZS13YXJuaW5nLWJnO1xuICBwYWRkaW5nOiAuMmVtO1xufVxuXG4vLyBBbGlnbm1lbnRcbi50ZXh0LWxlZnQgICAgICAgICAgIHsgdGV4dC1hbGlnbjogbGVmdDsgfVxuLnRleHQtcmlnaHQgICAgICAgICAgeyB0ZXh0LWFsaWduOiByaWdodDsgfVxuLnRleHQtY2VudGVyICAgICAgICAgeyB0ZXh0LWFsaWduOiBjZW50ZXI7IH1cbi50ZXh0LWp1c3RpZnkgICAgICAgIHsgdGV4dC1hbGlnbjoganVzdGlmeTsgfVxuLnRleHQtbm93cmFwICAgICAgICAgeyB3aGl0ZS1zcGFjZTogbm93cmFwOyB9XG5cbi8vIFRyYW5zZm9ybWF0aW9uXG4udGV4dC1sb3dlcmNhc2UgICAgICB7IHRleHQtdHJhbnNmb3JtOiBsb3dlcmNhc2U7IH1cbi50ZXh0LXVwcGVyY2FzZSAgICAgIHsgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsgfVxuLnRleHQtY2FwaXRhbGl6ZSAgICAgeyB0ZXh0LXRyYW5zZm9ybTogY2FwaXRhbGl6ZTsgfVxuXG4vLyBDb250ZXh0dWFsIGNvbG9yc1xuLnRleHQtbXV0ZWQge1xuICBjb2xvcjogQHRleHQtbXV0ZWQ7XG59XG4udGV4dC1wcmltYXJ5IHtcbiAgLnRleHQtZW1waGFzaXMtdmFyaWFudChAYnJhbmQtcHJpbWFyeSk7XG59XG4udGV4dC1zdWNjZXNzIHtcbiAgLnRleHQtZW1waGFzaXMtdmFyaWFudChAc3RhdGUtc3VjY2Vzcy10ZXh0KTtcbn1cbi50ZXh0LWluZm8ge1xuICAudGV4dC1lbXBoYXNpcy12YXJpYW50KEBzdGF0ZS1pbmZvLXRleHQpO1xufVxuLnRleHQtd2FybmluZyB7XG4gIC50ZXh0LWVtcGhhc2lzLXZhcmlhbnQoQHN0YXRlLXdhcm5pbmctdGV4dCk7XG59XG4udGV4dC1kYW5nZXIge1xuICAudGV4dC1lbXBoYXNpcy12YXJpYW50KEBzdGF0ZS1kYW5nZXItdGV4dCk7XG59XG5cbi8vIENvbnRleHR1YWwgYmFja2dyb3VuZHNcbi8vIEZvciBub3cgd2UnbGwgbGVhdmUgdGhlc2UgYWxvbmdzaWRlIHRoZSB0ZXh0IGNsYXNzZXMgdW50aWwgdjQgd2hlbiB3ZSBjYW5cbi8vIHNhZmVseSBzaGlmdCB0aGluZ3MgYXJvdW5kIChwZXIgU2VtVmVyIHJ1bGVzKS5cbi5iZy1wcmltYXJ5IHtcbiAgLy8gR2l2ZW4gdGhlIGNvbnRyYXN0IGhlcmUsIHRoaXMgaXMgdGhlIG9ubHkgY2xhc3MgdG8gaGF2ZSBpdHMgY29sb3IgaW52ZXJ0ZWRcbiAgLy8gYXV0b21hdGljYWxseS5cbiAgY29sb3I6ICNmZmY7XG4gIC5iZy12YXJpYW50KEBicmFuZC1wcmltYXJ5KTtcbn1cbi5iZy1zdWNjZXNzIHtcbiAgLmJnLXZhcmlhbnQoQHN0YXRlLXN1Y2Nlc3MtYmcpO1xufVxuLmJnLWluZm8ge1xuICAuYmctdmFyaWFudChAc3RhdGUtaW5mby1iZyk7XG59XG4uYmctd2FybmluZyB7XG4gIC5iZy12YXJpYW50KEBzdGF0ZS13YXJuaW5nLWJnKTtcbn1cbi5iZy1kYW5nZXIge1xuICAuYmctdmFyaWFudChAc3RhdGUtZGFuZ2VyLWJnKTtcbn1cblxuXG4vLyBQYWdlIGhlYWRlclxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4ucGFnZS1oZWFkZXIge1xuICBwYWRkaW5nLWJvdHRvbTogKChAbGluZS1oZWlnaHQtY29tcHV0ZWQgLyAyKSAtIDEpO1xuICBtYXJnaW46IChAbGluZS1oZWlnaHQtY29tcHV0ZWQgKiAyKSAwIEBsaW5lLWhlaWdodC1jb21wdXRlZDtcbiAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIEBwYWdlLWhlYWRlci1ib3JkZXItY29sb3I7XG59XG5cblxuLy8gTGlzdHNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLy8gVW5vcmRlcmVkIGFuZCBPcmRlcmVkIGxpc3RzXG51bCxcbm9sIHtcbiAgbWFyZ2luLXRvcDogMDtcbiAgbWFyZ2luLWJvdHRvbTogKEBsaW5lLWhlaWdodC1jb21wdXRlZCAvIDIpO1xuICB1bCxcbiAgb2wge1xuICAgIG1hcmdpbi1ib3R0b206IDA7XG4gIH1cbn1cblxuLy8gTGlzdCBvcHRpb25zXG5cbi8vIFVuc3R5bGVkIGtlZXBzIGxpc3QgaXRlbXMgYmxvY2sgbGV2ZWwsIGp1c3QgcmVtb3ZlcyBkZWZhdWx0IGJyb3dzZXIgcGFkZGluZyBhbmQgbGlzdC1zdHlsZVxuLmxpc3QtdW5zdHlsZWQge1xuICBwYWRkaW5nLWxlZnQ6IDA7XG4gIGxpc3Qtc3R5bGU6IG5vbmU7XG59XG5cbi8vIElubGluZSB0dXJucyBsaXN0IGl0ZW1zIGludG8gaW5saW5lLWJsb2NrXG4ubGlzdC1pbmxpbmUge1xuICAubGlzdC11bnN0eWxlZCgpO1xuICBtYXJnaW4tbGVmdDogLTVweDtcblxuICA+IGxpIHtcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gICAgcGFkZGluZy1sZWZ0OiA1cHg7XG4gICAgcGFkZGluZy1yaWdodDogNXB4O1xuICB9XG59XG5cbi8vIERlc2NyaXB0aW9uIExpc3RzXG5kbCB7XG4gIG1hcmdpbi10b3A6IDA7IC8vIFJlbW92ZSBicm93c2VyIGRlZmF1bHRcbiAgbWFyZ2luLWJvdHRvbTogQGxpbmUtaGVpZ2h0LWNvbXB1dGVkO1xufVxuZHQsXG5kZCB7XG4gIGxpbmUtaGVpZ2h0OiBAbGluZS1oZWlnaHQtYmFzZTtcbn1cbmR0IHtcbiAgZm9udC13ZWlnaHQ6IGJvbGQ7XG59XG5kZCB7XG4gIG1hcmdpbi1sZWZ0OiAwOyAvLyBVbmRvIGJyb3dzZXIgZGVmYXVsdFxufVxuXG4vLyBIb3Jpem9udGFsIGRlc2NyaXB0aW9uIGxpc3RzXG4vL1xuLy8gRGVmYXVsdHMgdG8gYmVpbmcgc3RhY2tlZCB3aXRob3V0IGFueSBvZiB0aGUgYmVsb3cgc3R5bGVzIGFwcGxpZWQsIHVudGlsIHRoZVxuLy8gZ3JpZCBicmVha3BvaW50IGlzIHJlYWNoZWQgKGRlZmF1bHQgb2Ygfjc2OHB4KS5cblxuLmRsLWhvcml6b250YWwge1xuICBkZCB7XG4gICAgJjpleHRlbmQoLmNsZWFyZml4IGFsbCk7IC8vIENsZWFyIHRoZSBmbG9hdGVkIGBkdGAgaWYgYW4gZW1wdHkgYGRkYCBpcyBwcmVzZW50XG4gIH1cblxuICBAbWVkaWEgKG1pbi13aWR0aDogQGdyaWQtZmxvYXQtYnJlYWtwb2ludCkge1xuICAgIGR0IHtcbiAgICAgIGZsb2F0OiBsZWZ0O1xuICAgICAgd2lkdGg6IChAZGwtaG9yaXpvbnRhbC1vZmZzZXQgLSAyMCk7XG4gICAgICBjbGVhcjogbGVmdDtcbiAgICAgIHRleHQtYWxpZ246IHJpZ2h0O1xuICAgICAgLnRleHQtb3ZlcmZsb3coKTtcbiAgICB9XG4gICAgZGQge1xuICAgICAgbWFyZ2luLWxlZnQ6IEBkbC1ob3Jpem9udGFsLW9mZnNldDtcbiAgICB9XG4gIH1cbn1cblxuXG4vLyBNaXNjXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8vIEFiYnJldmlhdGlvbnMgYW5kIGFjcm9ueW1zXG5hYmJyW3RpdGxlXSxcbi8vIEFkZCBkYXRhLSogYXR0cmlidXRlIHRvIGhlbHAgb3V0IG91ciB0b29sdGlwIHBsdWdpbiwgcGVyIGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9pc3N1ZXMvNTI1N1xuYWJicltkYXRhLW9yaWdpbmFsLXRpdGxlXSB7XG4gIGN1cnNvcjogaGVscDtcbiAgYm9yZGVyLWJvdHRvbTogMXB4IGRvdHRlZCBAYWJici1ib3JkZXItY29sb3I7XG59XG4uaW5pdGlhbGlzbSB7XG4gIGZvbnQtc2l6ZTogOTAlO1xuICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlO1xufVxuXG4vLyBCbG9ja3F1b3Rlc1xuYmxvY2txdW90ZSB7XG4gIHBhZGRpbmc6IChAbGluZS1oZWlnaHQtY29tcHV0ZWQgLyAyKSBAbGluZS1oZWlnaHQtY29tcHV0ZWQ7XG4gIG1hcmdpbjogMCAwIEBsaW5lLWhlaWdodC1jb21wdXRlZDtcbiAgZm9udC1zaXplOiBAYmxvY2txdW90ZS1mb250LXNpemU7XG4gIGJvcmRlci1sZWZ0OiA1cHggc29saWQgQGJsb2NrcXVvdGUtYm9yZGVyLWNvbG9yO1xuXG4gIHAsXG4gIHVsLFxuICBvbCB7XG4gICAgJjpsYXN0LWNoaWxkIHtcbiAgICAgIG1hcmdpbi1ib3R0b206IDA7XG4gICAgfVxuICB9XG5cbiAgLy8gTm90ZTogRGVwcmVjYXRlZCBzbWFsbCBhbmQgLnNtYWxsIGFzIG9mIHYzLjEuMFxuICAvLyBDb250ZXh0OiBodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvaXNzdWVzLzExNjYwXG4gIGZvb3RlcixcbiAgc21hbGwsXG4gIC5zbWFsbCB7XG4gICAgZGlzcGxheTogYmxvY2s7XG4gICAgZm9udC1zaXplOiA4MCU7IC8vIGJhY2sgdG8gZGVmYXVsdCBmb250LXNpemVcbiAgICBsaW5lLWhlaWdodDogQGxpbmUtaGVpZ2h0LWJhc2U7XG4gICAgY29sb3I6IEBibG9ja3F1b3RlLXNtYWxsLWNvbG9yO1xuXG4gICAgJjpiZWZvcmUge1xuICAgICAgY29udGVudDogJ1xcMjAxNCBcXDAwQTAnOyAvLyBlbSBkYXNoLCBuYnNwXG4gICAgfVxuICB9XG59XG5cbi8vIE9wcG9zaXRlIGFsaWdubWVudCBvZiBibG9ja3F1b3RlXG4vL1xuLy8gSGVhZHMgdXA6IGBibG9ja3F1b3RlLnB1bGwtcmlnaHRgIGhhcyBiZWVuIGRlcHJlY2F0ZWQgYXMgb2YgdjMuMS4wLlxuLmJsb2NrcXVvdGUtcmV2ZXJzZSxcbmJsb2NrcXVvdGUucHVsbC1yaWdodCB7XG4gIHBhZGRpbmctcmlnaHQ6IDE1cHg7XG4gIHBhZGRpbmctbGVmdDogMDtcbiAgYm9yZGVyLXJpZ2h0OiA1cHggc29saWQgQGJsb2NrcXVvdGUtYm9yZGVyLWNvbG9yO1xuICBib3JkZXItbGVmdDogMDtcbiAgdGV4dC1hbGlnbjogcmlnaHQ7XG5cbiAgLy8gQWNjb3VudCBmb3IgY2l0YXRpb25cbiAgZm9vdGVyLFxuICBzbWFsbCxcbiAgLnNtYWxsIHtcbiAgICAmOmJlZm9yZSB7IGNvbnRlbnQ6ICcnOyB9XG4gICAgJjphZnRlciB7XG4gICAgICBjb250ZW50OiAnXFwwMEEwIFxcMjAxNCc7IC8vIG5ic3AsIGVtIGRhc2hcbiAgICB9XG4gIH1cbn1cblxuLy8gQWRkcmVzc2VzXG5hZGRyZXNzIHtcbiAgbWFyZ2luLWJvdHRvbTogQGxpbmUtaGVpZ2h0LWNvbXB1dGVkO1xuICBmb250LXN0eWxlOiBub3JtYWw7XG4gIGxpbmUtaGVpZ2h0OiBAbGluZS1oZWlnaHQtYmFzZTtcbn1cbiIsIi8vIFR5cG9ncmFwaHlcblxuLnRleHQtZW1waGFzaXMtdmFyaWFudChAY29sb3IpIHtcbiAgY29sb3I6IEBjb2xvcjtcbiAgYSY6aG92ZXIge1xuICAgIGNvbG9yOiBkYXJrZW4oQGNvbG9yLCAxMCUpO1xuICB9XG59XG4iLCIvLyBDb250ZXh0dWFsIGJhY2tncm91bmRzXG5cbi5iZy12YXJpYW50KEBjb2xvcikge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiBAY29sb3I7XG4gIGEmOmhvdmVyIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiBkYXJrZW4oQGNvbG9yLCAxMCUpO1xuICB9XG59XG4iLCIvLyBUZXh0IG92ZXJmbG93XG4vLyBSZXF1aXJlcyBpbmxpbmUtYmxvY2sgb3IgYmxvY2sgZm9yIHByb3BlciBzdHlsaW5nXG5cbi50ZXh0LW92ZXJmbG93KCkge1xuICBvdmVyZmxvdzogaGlkZGVuO1xuICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpcztcbiAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbn1cbiIsIi8vXG4vLyBDb2RlIChpbmxpbmUgYW5kIGJsb2NrKVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuXG4vLyBJbmxpbmUgYW5kIGJsb2NrIGNvZGUgc3R5bGVzXG5jb2RlLFxua2JkLFxucHJlLFxuc2FtcCB7XG4gIGZvbnQtZmFtaWx5OiBAZm9udC1mYW1pbHktbW9ub3NwYWNlO1xufVxuXG4vLyBJbmxpbmUgY29kZVxuY29kZSB7XG4gIHBhZGRpbmc6IDJweCA0cHg7XG4gIGZvbnQtc2l6ZTogOTAlO1xuICBjb2xvcjogQGNvZGUtY29sb3I7XG4gIGJhY2tncm91bmQtY29sb3I6IEBjb2RlLWJnO1xuICBib3JkZXItcmFkaXVzOiBAYm9yZGVyLXJhZGl1cy1iYXNlO1xufVxuXG4vLyBVc2VyIGlucHV0IHR5cGljYWxseSBlbnRlcmVkIHZpYSBrZXlib2FyZFxua2JkIHtcbiAgcGFkZGluZzogMnB4IDRweDtcbiAgZm9udC1zaXplOiA5MCU7XG4gIGNvbG9yOiBAa2JkLWNvbG9yO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiBAa2JkLWJnO1xuICBib3JkZXItcmFkaXVzOiBAYm9yZGVyLXJhZGl1cy1zbWFsbDtcbiAgYm94LXNoYWRvdzogaW5zZXQgMCAtMXB4IDAgcmdiYSgwLDAsMCwuMjUpO1xuXG4gIGtiZCB7XG4gICAgcGFkZGluZzogMDtcbiAgICBmb250LXNpemU6IDEwMCU7XG4gICAgZm9udC13ZWlnaHQ6IGJvbGQ7XG4gICAgYm94LXNoYWRvdzogbm9uZTtcbiAgfVxufVxuXG4vLyBCbG9ja3Mgb2YgY29kZVxucHJlIHtcbiAgZGlzcGxheTogYmxvY2s7XG4gIHBhZGRpbmc6ICgoQGxpbmUtaGVpZ2h0LWNvbXB1dGVkIC0gMSkgLyAyKTtcbiAgbWFyZ2luOiAwIDAgKEBsaW5lLWhlaWdodC1jb21wdXRlZCAvIDIpO1xuICBmb250LXNpemU6IChAZm9udC1zaXplLWJhc2UgLSAxKTsgLy8gMTRweCB0byAxM3B4XG4gIGxpbmUtaGVpZ2h0OiBAbGluZS1oZWlnaHQtYmFzZTtcbiAgd29yZC1icmVhazogYnJlYWstYWxsO1xuICB3b3JkLXdyYXA6IGJyZWFrLXdvcmQ7XG4gIGNvbG9yOiBAcHJlLWNvbG9yO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiBAcHJlLWJnO1xuICBib3JkZXI6IDFweCBzb2xpZCBAcHJlLWJvcmRlci1jb2xvcjtcbiAgYm9yZGVyLXJhZGl1czogQGJvcmRlci1yYWRpdXMtYmFzZTtcblxuICAvLyBBY2NvdW50IGZvciBzb21lIGNvZGUgb3V0cHV0cyB0aGF0IHBsYWNlIGNvZGUgdGFncyBpbiBwcmUgdGFnc1xuICBjb2RlIHtcbiAgICBwYWRkaW5nOiAwO1xuICAgIGZvbnQtc2l6ZTogaW5oZXJpdDtcbiAgICBjb2xvcjogaW5oZXJpdDtcbiAgICB3aGl0ZS1zcGFjZTogcHJlLXdyYXA7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7XG4gICAgYm9yZGVyLXJhZGl1czogMDtcbiAgfVxufVxuXG4vLyBFbmFibGUgc2Nyb2xsYWJsZSBibG9ja3Mgb2YgY29kZVxuLnByZS1zY3JvbGxhYmxlIHtcbiAgbWF4LWhlaWdodDogQHByZS1zY3JvbGxhYmxlLW1heC1oZWlnaHQ7XG4gIG92ZXJmbG93LXk6IHNjcm9sbDtcbn1cbiIsIi8vXG4vLyBHcmlkIHN5c3RlbVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuXG4vLyBDb250YWluZXIgd2lkdGhzXG4vL1xuLy8gU2V0IHRoZSBjb250YWluZXIgd2lkdGgsIGFuZCBvdmVycmlkZSBpdCBmb3IgZml4ZWQgbmF2YmFycyBpbiBtZWRpYSBxdWVyaWVzLlxuXG4uY29udGFpbmVyIHtcbiAgLmNvbnRhaW5lci1maXhlZCgpO1xuXG4gIEBtZWRpYSAobWluLXdpZHRoOiBAc2NyZWVuLXNtLW1pbikge1xuICAgIHdpZHRoOiBAY29udGFpbmVyLXNtO1xuICB9XG4gIEBtZWRpYSAobWluLXdpZHRoOiBAc2NyZWVuLW1kLW1pbikge1xuICAgIHdpZHRoOiBAY29udGFpbmVyLW1kO1xuICB9XG4gIEBtZWRpYSAobWluLXdpZHRoOiBAc2NyZWVuLWxnLW1pbikge1xuICAgIHdpZHRoOiBAY29udGFpbmVyLWxnO1xuICB9XG59XG5cblxuLy8gRmx1aWQgY29udGFpbmVyXG4vL1xuLy8gVXRpbGl6ZXMgdGhlIG1peGluIG1lYW50IGZvciBmaXhlZCB3aWR0aCBjb250YWluZXJzLCBidXQgd2l0aG91dCBhbnkgZGVmaW5lZFxuLy8gd2lkdGggZm9yIGZsdWlkLCBmdWxsIHdpZHRoIGxheW91dHMuXG5cbi5jb250YWluZXItZmx1aWQge1xuICAuY29udGFpbmVyLWZpeGVkKCk7XG59XG5cblxuLy8gUm93XG4vL1xuLy8gUm93cyBjb250YWluIGFuZCBjbGVhciB0aGUgZmxvYXRzIG9mIHlvdXIgY29sdW1ucy5cblxuLnJvdyB7XG4gIC5tYWtlLXJvdygpO1xufVxuXG5cbi8vIENvbHVtbnNcbi8vXG4vLyBDb21tb24gc3R5bGVzIGZvciBzbWFsbCBhbmQgbGFyZ2UgZ3JpZCBjb2x1bW5zXG5cbi5tYWtlLWdyaWQtY29sdW1ucygpO1xuXG5cbi8vIEV4dHJhIHNtYWxsIGdyaWRcbi8vXG4vLyBDb2x1bW5zLCBvZmZzZXRzLCBwdXNoZXMsIGFuZCBwdWxscyBmb3IgZXh0cmEgc21hbGwgZGV2aWNlcyBsaWtlXG4vLyBzbWFydHBob25lcy5cblxuLm1ha2UtZ3JpZCh4cyk7XG5cblxuLy8gU21hbGwgZ3JpZFxuLy9cbi8vIENvbHVtbnMsIG9mZnNldHMsIHB1c2hlcywgYW5kIHB1bGxzIGZvciB0aGUgc21hbGwgZGV2aWNlIHJhbmdlLCBmcm9tIHBob25lc1xuLy8gdG8gdGFibGV0cy5cblxuQG1lZGlhIChtaW4td2lkdGg6IEBzY3JlZW4tc20tbWluKSB7XG4gIC5tYWtlLWdyaWQoc20pO1xufVxuXG5cbi8vIE1lZGl1bSBncmlkXG4vL1xuLy8gQ29sdW1ucywgb2Zmc2V0cywgcHVzaGVzLCBhbmQgcHVsbHMgZm9yIHRoZSBkZXNrdG9wIGRldmljZSByYW5nZS5cblxuQG1lZGlhIChtaW4td2lkdGg6IEBzY3JlZW4tbWQtbWluKSB7XG4gIC5tYWtlLWdyaWQobWQpO1xufVxuXG5cbi8vIExhcmdlIGdyaWRcbi8vXG4vLyBDb2x1bW5zLCBvZmZzZXRzLCBwdXNoZXMsIGFuZCBwdWxscyBmb3IgdGhlIGxhcmdlIGRlc2t0b3AgZGV2aWNlIHJhbmdlLlxuXG5AbWVkaWEgKG1pbi13aWR0aDogQHNjcmVlbi1sZy1taW4pIHtcbiAgLm1ha2UtZ3JpZChsZyk7XG59XG4iLCIvLyBHcmlkIHN5c3RlbVxuLy9cbi8vIEdlbmVyYXRlIHNlbWFudGljIGdyaWQgY29sdW1ucyB3aXRoIHRoZXNlIG1peGlucy5cblxuLy8gQ2VudGVyZWQgY29udGFpbmVyIGVsZW1lbnRcbi5jb250YWluZXItZml4ZWQoQGd1dHRlcjogQGdyaWQtZ3V0dGVyLXdpZHRoKSB7XG4gIG1hcmdpbi1yaWdodDogYXV0bztcbiAgbWFyZ2luLWxlZnQ6IGF1dG87XG4gIHBhZGRpbmctbGVmdDogIChAZ3V0dGVyIC8gMik7XG4gIHBhZGRpbmctcmlnaHQ6IChAZ3V0dGVyIC8gMik7XG4gICY6ZXh0ZW5kKC5jbGVhcmZpeCBhbGwpO1xufVxuXG4vLyBDcmVhdGVzIGEgd3JhcHBlciBmb3IgYSBzZXJpZXMgb2YgY29sdW1uc1xuLm1ha2Utcm93KEBndXR0ZXI6IEBncmlkLWd1dHRlci13aWR0aCkge1xuICBtYXJnaW4tbGVmdDogIChAZ3V0dGVyIC8gLTIpO1xuICBtYXJnaW4tcmlnaHQ6IChAZ3V0dGVyIC8gLTIpO1xuICAmOmV4dGVuZCguY2xlYXJmaXggYWxsKTtcbn1cblxuLy8gR2VuZXJhdGUgdGhlIGV4dHJhIHNtYWxsIGNvbHVtbnNcbi5tYWtlLXhzLWNvbHVtbihAY29sdW1uczsgQGd1dHRlcjogQGdyaWQtZ3V0dGVyLXdpZHRoKSB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgZmxvYXQ6IGxlZnQ7XG4gIHdpZHRoOiBwZXJjZW50YWdlKChAY29sdW1ucyAvIEBncmlkLWNvbHVtbnMpKTtcbiAgbWluLWhlaWdodDogMXB4O1xuICBwYWRkaW5nLWxlZnQ6ICAoQGd1dHRlciAvIDIpO1xuICBwYWRkaW5nLXJpZ2h0OiAoQGd1dHRlciAvIDIpO1xufVxuLm1ha2UteHMtY29sdW1uLW9mZnNldChAY29sdW1ucykge1xuICBtYXJnaW4tbGVmdDogcGVyY2VudGFnZSgoQGNvbHVtbnMgLyBAZ3JpZC1jb2x1bW5zKSk7XG59XG4ubWFrZS14cy1jb2x1bW4tcHVzaChAY29sdW1ucykge1xuICBsZWZ0OiBwZXJjZW50YWdlKChAY29sdW1ucyAvIEBncmlkLWNvbHVtbnMpKTtcbn1cbi5tYWtlLXhzLWNvbHVtbi1wdWxsKEBjb2x1bW5zKSB7XG4gIHJpZ2h0OiBwZXJjZW50YWdlKChAY29sdW1ucyAvIEBncmlkLWNvbHVtbnMpKTtcbn1cblxuLy8gR2VuZXJhdGUgdGhlIHNtYWxsIGNvbHVtbnNcbi5tYWtlLXNtLWNvbHVtbihAY29sdW1uczsgQGd1dHRlcjogQGdyaWQtZ3V0dGVyLXdpZHRoKSB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgbWluLWhlaWdodDogMXB4O1xuICBwYWRkaW5nLWxlZnQ6ICAoQGd1dHRlciAvIDIpO1xuICBwYWRkaW5nLXJpZ2h0OiAoQGd1dHRlciAvIDIpO1xuXG4gIEBtZWRpYSAobWluLXdpZHRoOiBAc2NyZWVuLXNtLW1pbikge1xuICAgIGZsb2F0OiBsZWZ0O1xuICAgIHdpZHRoOiBwZXJjZW50YWdlKChAY29sdW1ucyAvIEBncmlkLWNvbHVtbnMpKTtcbiAgfVxufVxuLm1ha2Utc20tY29sdW1uLW9mZnNldChAY29sdW1ucykge1xuICBAbWVkaWEgKG1pbi13aWR0aDogQHNjcmVlbi1zbS1taW4pIHtcbiAgICBtYXJnaW4tbGVmdDogcGVyY2VudGFnZSgoQGNvbHVtbnMgLyBAZ3JpZC1jb2x1bW5zKSk7XG4gIH1cbn1cbi5tYWtlLXNtLWNvbHVtbi1wdXNoKEBjb2x1bW5zKSB7XG4gIEBtZWRpYSAobWluLXdpZHRoOiBAc2NyZWVuLXNtLW1pbikge1xuICAgIGxlZnQ6IHBlcmNlbnRhZ2UoKEBjb2x1bW5zIC8gQGdyaWQtY29sdW1ucykpO1xuICB9XG59XG4ubWFrZS1zbS1jb2x1bW4tcHVsbChAY29sdW1ucykge1xuICBAbWVkaWEgKG1pbi13aWR0aDogQHNjcmVlbi1zbS1taW4pIHtcbiAgICByaWdodDogcGVyY2VudGFnZSgoQGNvbHVtbnMgLyBAZ3JpZC1jb2x1bW5zKSk7XG4gIH1cbn1cblxuLy8gR2VuZXJhdGUgdGhlIG1lZGl1bSBjb2x1bW5zXG4ubWFrZS1tZC1jb2x1bW4oQGNvbHVtbnM7IEBndXR0ZXI6IEBncmlkLWd1dHRlci13aWR0aCkge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIG1pbi1oZWlnaHQ6IDFweDtcbiAgcGFkZGluZy1sZWZ0OiAgKEBndXR0ZXIgLyAyKTtcbiAgcGFkZGluZy1yaWdodDogKEBndXR0ZXIgLyAyKTtcblxuICBAbWVkaWEgKG1pbi13aWR0aDogQHNjcmVlbi1tZC1taW4pIHtcbiAgICBmbG9hdDogbGVmdDtcbiAgICB3aWR0aDogcGVyY2VudGFnZSgoQGNvbHVtbnMgLyBAZ3JpZC1jb2x1bW5zKSk7XG4gIH1cbn1cbi5tYWtlLW1kLWNvbHVtbi1vZmZzZXQoQGNvbHVtbnMpIHtcbiAgQG1lZGlhIChtaW4td2lkdGg6IEBzY3JlZW4tbWQtbWluKSB7XG4gICAgbWFyZ2luLWxlZnQ6IHBlcmNlbnRhZ2UoKEBjb2x1bW5zIC8gQGdyaWQtY29sdW1ucykpO1xuICB9XG59XG4ubWFrZS1tZC1jb2x1bW4tcHVzaChAY29sdW1ucykge1xuICBAbWVkaWEgKG1pbi13aWR0aDogQHNjcmVlbi1tZC1taW4pIHtcbiAgICBsZWZ0OiBwZXJjZW50YWdlKChAY29sdW1ucyAvIEBncmlkLWNvbHVtbnMpKTtcbiAgfVxufVxuLm1ha2UtbWQtY29sdW1uLXB1bGwoQGNvbHVtbnMpIHtcbiAgQG1lZGlhIChtaW4td2lkdGg6IEBzY3JlZW4tbWQtbWluKSB7XG4gICAgcmlnaHQ6IHBlcmNlbnRhZ2UoKEBjb2x1bW5zIC8gQGdyaWQtY29sdW1ucykpO1xuICB9XG59XG5cbi8vIEdlbmVyYXRlIHRoZSBsYXJnZSBjb2x1bW5zXG4ubWFrZS1sZy1jb2x1bW4oQGNvbHVtbnM7IEBndXR0ZXI6IEBncmlkLWd1dHRlci13aWR0aCkge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIG1pbi1oZWlnaHQ6IDFweDtcbiAgcGFkZGluZy1sZWZ0OiAgKEBndXR0ZXIgLyAyKTtcbiAgcGFkZGluZy1yaWdodDogKEBndXR0ZXIgLyAyKTtcblxuICBAbWVkaWEgKG1pbi13aWR0aDogQHNjcmVlbi1sZy1taW4pIHtcbiAgICBmbG9hdDogbGVmdDtcbiAgICB3aWR0aDogcGVyY2VudGFnZSgoQGNvbHVtbnMgLyBAZ3JpZC1jb2x1bW5zKSk7XG4gIH1cbn1cbi5tYWtlLWxnLWNvbHVtbi1vZmZzZXQoQGNvbHVtbnMpIHtcbiAgQG1lZGlhIChtaW4td2lkdGg6IEBzY3JlZW4tbGctbWluKSB7XG4gICAgbWFyZ2luLWxlZnQ6IHBlcmNlbnRhZ2UoKEBjb2x1bW5zIC8gQGdyaWQtY29sdW1ucykpO1xuICB9XG59XG4ubWFrZS1sZy1jb2x1bW4tcHVzaChAY29sdW1ucykge1xuICBAbWVkaWEgKG1pbi13aWR0aDogQHNjcmVlbi1sZy1taW4pIHtcbiAgICBsZWZ0OiBwZXJjZW50YWdlKChAY29sdW1ucyAvIEBncmlkLWNvbHVtbnMpKTtcbiAgfVxufVxuLm1ha2UtbGctY29sdW1uLXB1bGwoQGNvbHVtbnMpIHtcbiAgQG1lZGlhIChtaW4td2lkdGg6IEBzY3JlZW4tbGctbWluKSB7XG4gICAgcmlnaHQ6IHBlcmNlbnRhZ2UoKEBjb2x1bW5zIC8gQGdyaWQtY29sdW1ucykpO1xuICB9XG59XG4iLCIvLyBGcmFtZXdvcmsgZ3JpZCBnZW5lcmF0aW9uXG4vL1xuLy8gVXNlZCBvbmx5IGJ5IEJvb3RzdHJhcCB0byBnZW5lcmF0ZSB0aGUgY29ycmVjdCBudW1iZXIgb2YgZ3JpZCBjbGFzc2VzIGdpdmVuXG4vLyBhbnkgdmFsdWUgb2YgYEBncmlkLWNvbHVtbnNgLlxuXG4ubWFrZS1ncmlkLWNvbHVtbnMoKSB7XG4gIC8vIENvbW1vbiBzdHlsZXMgZm9yIGFsbCBzaXplcyBvZiBncmlkIGNvbHVtbnMsIHdpZHRocyAxLTEyXG4gIC5jb2woQGluZGV4KSB3aGVuIChAaW5kZXggPSAxKSB7IC8vIGluaXRpYWxcbiAgICBAaXRlbTogflwiLmNvbC14cy1Ae2luZGV4fSwgLmNvbC1zbS1Ae2luZGV4fSwgLmNvbC1tZC1Ae2luZGV4fSwgLmNvbC1sZy1Ae2luZGV4fVwiO1xuICAgIC5jb2woKEBpbmRleCArIDEpLCBAaXRlbSk7XG4gIH1cbiAgLmNvbChAaW5kZXgsIEBsaXN0KSB3aGVuIChAaW5kZXggPTwgQGdyaWQtY29sdW1ucykgeyAvLyBnZW5lcmFsOyBcIj08XCIgaXNuJ3QgYSB0eXBvXG4gICAgQGl0ZW06IH5cIi5jb2wteHMtQHtpbmRleH0sIC5jb2wtc20tQHtpbmRleH0sIC5jb2wtbWQtQHtpbmRleH0sIC5jb2wtbGctQHtpbmRleH1cIjtcbiAgICAuY29sKChAaW5kZXggKyAxKSwgflwiQHtsaXN0fSwgQHtpdGVtfVwiKTtcbiAgfVxuICAuY29sKEBpbmRleCwgQGxpc3QpIHdoZW4gKEBpbmRleCA+IEBncmlkLWNvbHVtbnMpIHsgLy8gdGVybWluYWxcbiAgICBAe2xpc3R9IHtcbiAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICAgIC8vIFByZXZlbnQgY29sdW1ucyBmcm9tIGNvbGxhcHNpbmcgd2hlbiBlbXB0eVxuICAgICAgbWluLWhlaWdodDogMXB4O1xuICAgICAgLy8gSW5uZXIgZ3V0dGVyIHZpYSBwYWRkaW5nXG4gICAgICBwYWRkaW5nLWxlZnQ6ICAoQGdyaWQtZ3V0dGVyLXdpZHRoIC8gMik7XG4gICAgICBwYWRkaW5nLXJpZ2h0OiAoQGdyaWQtZ3V0dGVyLXdpZHRoIC8gMik7XG4gICAgfVxuICB9XG4gIC5jb2woMSk7IC8vIGtpY2tzdGFydCBpdFxufVxuXG4uZmxvYXQtZ3JpZC1jb2x1bW5zKEBjbGFzcykge1xuICAuY29sKEBpbmRleCkgd2hlbiAoQGluZGV4ID0gMSkgeyAvLyBpbml0aWFsXG4gICAgQGl0ZW06IH5cIi5jb2wtQHtjbGFzc30tQHtpbmRleH1cIjtcbiAgICAuY29sKChAaW5kZXggKyAxKSwgQGl0ZW0pO1xuICB9XG4gIC5jb2woQGluZGV4LCBAbGlzdCkgd2hlbiAoQGluZGV4ID08IEBncmlkLWNvbHVtbnMpIHsgLy8gZ2VuZXJhbFxuICAgIEBpdGVtOiB+XCIuY29sLUB7Y2xhc3N9LUB7aW5kZXh9XCI7XG4gICAgLmNvbCgoQGluZGV4ICsgMSksIH5cIkB7bGlzdH0sIEB7aXRlbX1cIik7XG4gIH1cbiAgLmNvbChAaW5kZXgsIEBsaXN0KSB3aGVuIChAaW5kZXggPiBAZ3JpZC1jb2x1bW5zKSB7IC8vIHRlcm1pbmFsXG4gICAgQHtsaXN0fSB7XG4gICAgICBmbG9hdDogbGVmdDtcbiAgICB9XG4gIH1cbiAgLmNvbCgxKTsgLy8ga2lja3N0YXJ0IGl0XG59XG5cbi5jYWxjLWdyaWQtY29sdW1uKEBpbmRleCwgQGNsYXNzLCBAdHlwZSkgd2hlbiAoQHR5cGUgPSB3aWR0aCkgYW5kIChAaW5kZXggPiAwKSB7XG4gIC5jb2wtQHtjbGFzc30tQHtpbmRleH0ge1xuICAgIHdpZHRoOiBwZXJjZW50YWdlKChAaW5kZXggLyBAZ3JpZC1jb2x1bW5zKSk7XG4gIH1cbn1cbi5jYWxjLWdyaWQtY29sdW1uKEBpbmRleCwgQGNsYXNzLCBAdHlwZSkgd2hlbiAoQHR5cGUgPSBwdXNoKSBhbmQgKEBpbmRleCA+IDApIHtcbiAgLmNvbC1Ae2NsYXNzfS1wdXNoLUB7aW5kZXh9IHtcbiAgICBsZWZ0OiBwZXJjZW50YWdlKChAaW5kZXggLyBAZ3JpZC1jb2x1bW5zKSk7XG4gIH1cbn1cbi5jYWxjLWdyaWQtY29sdW1uKEBpbmRleCwgQGNsYXNzLCBAdHlwZSkgd2hlbiAoQHR5cGUgPSBwdXNoKSBhbmQgKEBpbmRleCA9IDApIHtcbiAgLmNvbC1Ae2NsYXNzfS1wdXNoLTAge1xuICAgIGxlZnQ6IGF1dG87XG4gIH1cbn1cbi5jYWxjLWdyaWQtY29sdW1uKEBpbmRleCwgQGNsYXNzLCBAdHlwZSkgd2hlbiAoQHR5cGUgPSBwdWxsKSBhbmQgKEBpbmRleCA+IDApIHtcbiAgLmNvbC1Ae2NsYXNzfS1wdWxsLUB7aW5kZXh9IHtcbiAgICByaWdodDogcGVyY2VudGFnZSgoQGluZGV4IC8gQGdyaWQtY29sdW1ucykpO1xuICB9XG59XG4uY2FsYy1ncmlkLWNvbHVtbihAaW5kZXgsIEBjbGFzcywgQHR5cGUpIHdoZW4gKEB0eXBlID0gcHVsbCkgYW5kIChAaW5kZXggPSAwKSB7XG4gIC5jb2wtQHtjbGFzc30tcHVsbC0wIHtcbiAgICByaWdodDogYXV0bztcbiAgfVxufVxuLmNhbGMtZ3JpZC1jb2x1bW4oQGluZGV4LCBAY2xhc3MsIEB0eXBlKSB3aGVuIChAdHlwZSA9IG9mZnNldCkge1xuICAuY29sLUB7Y2xhc3N9LW9mZnNldC1Ae2luZGV4fSB7XG4gICAgbWFyZ2luLWxlZnQ6IHBlcmNlbnRhZ2UoKEBpbmRleCAvIEBncmlkLWNvbHVtbnMpKTtcbiAgfVxufVxuXG4vLyBCYXNpYyBsb29waW5nIGluIExFU1Ncbi5sb29wLWdyaWQtY29sdW1ucyhAaW5kZXgsIEBjbGFzcywgQHR5cGUpIHdoZW4gKEBpbmRleCA+PSAwKSB7XG4gIC5jYWxjLWdyaWQtY29sdW1uKEBpbmRleCwgQGNsYXNzLCBAdHlwZSk7XG4gIC8vIG5leHQgaXRlcmF0aW9uXG4gIC5sb29wLWdyaWQtY29sdW1ucygoQGluZGV4IC0gMSksIEBjbGFzcywgQHR5cGUpO1xufVxuXG4vLyBDcmVhdGUgZ3JpZCBmb3Igc3BlY2lmaWMgY2xhc3Ncbi5tYWtlLWdyaWQoQGNsYXNzKSB7XG4gIC5mbG9hdC1ncmlkLWNvbHVtbnMoQGNsYXNzKTtcbiAgLmxvb3AtZ3JpZC1jb2x1bW5zKEBncmlkLWNvbHVtbnMsIEBjbGFzcywgd2lkdGgpO1xuICAubG9vcC1ncmlkLWNvbHVtbnMoQGdyaWQtY29sdW1ucywgQGNsYXNzLCBwdWxsKTtcbiAgLmxvb3AtZ3JpZC1jb2x1bW5zKEBncmlkLWNvbHVtbnMsIEBjbGFzcywgcHVzaCk7XG4gIC5sb29wLWdyaWQtY29sdW1ucyhAZ3JpZC1jb2x1bW5zLCBAY2xhc3MsIG9mZnNldCk7XG59XG4iLCIvL1xuLy8gVGFibGVzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5cbnRhYmxlIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogQHRhYmxlLWJnO1xufVxuY2FwdGlvbiB7XG4gIHBhZGRpbmctdG9wOiBAdGFibGUtY2VsbC1wYWRkaW5nO1xuICBwYWRkaW5nLWJvdHRvbTogQHRhYmxlLWNlbGwtcGFkZGluZztcbiAgY29sb3I6IEB0ZXh0LW11dGVkO1xuICB0ZXh0LWFsaWduOiBsZWZ0O1xufVxudGgge1xuICB0ZXh0LWFsaWduOiBsZWZ0O1xufVxuXG5cbi8vIEJhc2VsaW5lIHN0eWxlc1xuXG4udGFibGUge1xuICB3aWR0aDogMTAwJTtcbiAgbWF4LXdpZHRoOiAxMDAlO1xuICBtYXJnaW4tYm90dG9tOiBAbGluZS1oZWlnaHQtY29tcHV0ZWQ7XG4gIC8vIENlbGxzXG4gID4gdGhlYWQsXG4gID4gdGJvZHksXG4gID4gdGZvb3Qge1xuICAgID4gdHIge1xuICAgICAgPiB0aCxcbiAgICAgID4gdGQge1xuICAgICAgICBwYWRkaW5nOiBAdGFibGUtY2VsbC1wYWRkaW5nO1xuICAgICAgICBsaW5lLWhlaWdodDogQGxpbmUtaGVpZ2h0LWJhc2U7XG4gICAgICAgIHZlcnRpY2FsLWFsaWduOiB0b3A7XG4gICAgICAgIGJvcmRlci10b3A6IDFweCBzb2xpZCBAdGFibGUtYm9yZGVyLWNvbG9yO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICAvLyBCb3R0b20gYWxpZ24gZm9yIGNvbHVtbiBoZWFkaW5nc1xuICA+IHRoZWFkID4gdHIgPiB0aCB7XG4gICAgdmVydGljYWwtYWxpZ246IGJvdHRvbTtcbiAgICBib3JkZXItYm90dG9tOiAycHggc29saWQgQHRhYmxlLWJvcmRlci1jb2xvcjtcbiAgfVxuICAvLyBSZW1vdmUgdG9wIGJvcmRlciBmcm9tIHRoZWFkIGJ5IGRlZmF1bHRcbiAgPiBjYXB0aW9uICsgdGhlYWQsXG4gID4gY29sZ3JvdXAgKyB0aGVhZCxcbiAgPiB0aGVhZDpmaXJzdC1jaGlsZCB7XG4gICAgPiB0cjpmaXJzdC1jaGlsZCB7XG4gICAgICA+IHRoLFxuICAgICAgPiB0ZCB7XG4gICAgICAgIGJvcmRlci10b3A6IDA7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIC8vIEFjY291bnQgZm9yIG11bHRpcGxlIHRib2R5IGluc3RhbmNlc1xuICA+IHRib2R5ICsgdGJvZHkge1xuICAgIGJvcmRlci10b3A6IDJweCBzb2xpZCBAdGFibGUtYm9yZGVyLWNvbG9yO1xuICB9XG5cbiAgLy8gTmVzdGluZ1xuICAudGFibGUge1xuICAgIGJhY2tncm91bmQtY29sb3I6IEBib2R5LWJnO1xuICB9XG59XG5cblxuLy8gQ29uZGVuc2VkIHRhYmxlIHcvIGhhbGYgcGFkZGluZ1xuXG4udGFibGUtY29uZGVuc2VkIHtcbiAgPiB0aGVhZCxcbiAgPiB0Ym9keSxcbiAgPiB0Zm9vdCB7XG4gICAgPiB0ciB7XG4gICAgICA+IHRoLFxuICAgICAgPiB0ZCB7XG4gICAgICAgIHBhZGRpbmc6IEB0YWJsZS1jb25kZW5zZWQtY2VsbC1wYWRkaW5nO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5cbi8vIEJvcmRlcmVkIHZlcnNpb25cbi8vXG4vLyBBZGQgYm9yZGVycyBhbGwgYXJvdW5kIHRoZSB0YWJsZSBhbmQgYmV0d2VlbiBhbGwgdGhlIGNvbHVtbnMuXG5cbi50YWJsZS1ib3JkZXJlZCB7XG4gIGJvcmRlcjogMXB4IHNvbGlkIEB0YWJsZS1ib3JkZXItY29sb3I7XG4gID4gdGhlYWQsXG4gID4gdGJvZHksXG4gID4gdGZvb3Qge1xuICAgID4gdHIge1xuICAgICAgPiB0aCxcbiAgICAgID4gdGQge1xuICAgICAgICBib3JkZXI6IDFweCBzb2xpZCBAdGFibGUtYm9yZGVyLWNvbG9yO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICA+IHRoZWFkID4gdHIge1xuICAgID4gdGgsXG4gICAgPiB0ZCB7XG4gICAgICBib3JkZXItYm90dG9tLXdpZHRoOiAycHg7XG4gICAgfVxuICB9XG59XG5cblxuLy8gWmVicmEtc3RyaXBpbmdcbi8vXG4vLyBEZWZhdWx0IHplYnJhLXN0cmlwZSBzdHlsZXMgKGFsdGVybmF0aW5nIGdyYXkgYW5kIHRyYW5zcGFyZW50IGJhY2tncm91bmRzKVxuXG4udGFibGUtc3RyaXBlZCB7XG4gID4gdGJvZHkgPiB0cjpudGgtY2hpbGQob2RkKSB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogQHRhYmxlLWJnLWFjY2VudDtcbiAgfVxufVxuXG5cbi8vIEhvdmVyIGVmZmVjdFxuLy9cbi8vIFBsYWNlZCBoZXJlIHNpbmNlIGl0IGhhcyB0byBjb21lIGFmdGVyIHRoZSBwb3RlbnRpYWwgemVicmEgc3RyaXBpbmdcblxuLnRhYmxlLWhvdmVyIHtcbiAgPiB0Ym9keSA+IHRyOmhvdmVyIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAdGFibGUtYmctaG92ZXI7XG4gIH1cbn1cblxuXG4vLyBUYWJsZSBjZWxsIHNpemluZ1xuLy9cbi8vIFJlc2V0IGRlZmF1bHQgdGFibGUgYmVoYXZpb3JcblxudGFibGUgY29sW2NsYXNzKj1cImNvbC1cIl0ge1xuICBwb3NpdGlvbjogc3RhdGljOyAvLyBQcmV2ZW50IGJvcmRlciBoaWRpbmcgaW4gRmlyZWZveCBhbmQgSUU5LzEwIChzZWUgaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2lzc3Vlcy8xMTYyMylcbiAgZmxvYXQ6IG5vbmU7XG4gIGRpc3BsYXk6IHRhYmxlLWNvbHVtbjtcbn1cbnRhYmxlIHtcbiAgdGQsXG4gIHRoIHtcbiAgICAmW2NsYXNzKj1cImNvbC1cIl0ge1xuICAgICAgcG9zaXRpb246IHN0YXRpYzsgLy8gUHJldmVudCBib3JkZXIgaGlkaW5nIGluIEZpcmVmb3ggYW5kIElFOS8xMCAoc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9pc3N1ZXMvMTE2MjMpXG4gICAgICBmbG9hdDogbm9uZTtcbiAgICAgIGRpc3BsYXk6IHRhYmxlLWNlbGw7XG4gICAgfVxuICB9XG59XG5cblxuLy8gVGFibGUgYmFja2dyb3VuZHNcbi8vXG4vLyBFeGFjdCBzZWxlY3RvcnMgYmVsb3cgcmVxdWlyZWQgdG8gb3ZlcnJpZGUgYC50YWJsZS1zdHJpcGVkYCBhbmQgcHJldmVudFxuLy8gaW5oZXJpdGFuY2UgdG8gbmVzdGVkIHRhYmxlcy5cblxuLy8gR2VuZXJhdGUgdGhlIGNvbnRleHR1YWwgdmFyaWFudHNcbi50YWJsZS1yb3ctdmFyaWFudChhY3RpdmU7IEB0YWJsZS1iZy1hY3RpdmUpO1xuLnRhYmxlLXJvdy12YXJpYW50KHN1Y2Nlc3M7IEBzdGF0ZS1zdWNjZXNzLWJnKTtcbi50YWJsZS1yb3ctdmFyaWFudChpbmZvOyBAc3RhdGUtaW5mby1iZyk7XG4udGFibGUtcm93LXZhcmlhbnQod2FybmluZzsgQHN0YXRlLXdhcm5pbmctYmcpO1xuLnRhYmxlLXJvdy12YXJpYW50KGRhbmdlcjsgQHN0YXRlLWRhbmdlci1iZyk7XG5cblxuLy8gUmVzcG9uc2l2ZSB0YWJsZXNcbi8vXG4vLyBXcmFwIHlvdXIgdGFibGVzIGluIGAudGFibGUtcmVzcG9uc2l2ZWAgYW5kIHdlJ2xsIG1ha2UgdGhlbSBtb2JpbGUgZnJpZW5kbHlcbi8vIGJ5IGVuYWJsaW5nIGhvcml6b250YWwgc2Nyb2xsaW5nLiBPbmx5IGFwcGxpZXMgPDc2OHB4LiBFdmVyeXRoaW5nIGFib3ZlIHRoYXRcbi8vIHdpbGwgZGlzcGxheSBub3JtYWxseS5cblxuLnRhYmxlLXJlc3BvbnNpdmUge1xuICBvdmVyZmxvdy14OiBhdXRvO1xuICBtaW4taGVpZ2h0OiAwLjAxJTsgLy8gV29ya2Fyb3VuZCBmb3IgSUU5IGJ1ZyAoc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9pc3N1ZXMvMTQ4MzcpXG5cbiAgQG1lZGlhIHNjcmVlbiBhbmQgKG1heC13aWR0aDogQHNjcmVlbi14cy1tYXgpIHtcbiAgICB3aWR0aDogMTAwJTtcbiAgICBtYXJnaW4tYm90dG9tOiAoQGxpbmUtaGVpZ2h0LWNvbXB1dGVkICogMC43NSk7XG4gICAgb3ZlcmZsb3cteTogaGlkZGVuO1xuICAgIC1tcy1vdmVyZmxvdy1zdHlsZTogLW1zLWF1dG9oaWRpbmctc2Nyb2xsYmFyO1xuICAgIGJvcmRlcjogMXB4IHNvbGlkIEB0YWJsZS1ib3JkZXItY29sb3I7XG5cbiAgICAvLyBUaWdodGVuIHVwIHNwYWNpbmdcbiAgICA+IC50YWJsZSB7XG4gICAgICBtYXJnaW4tYm90dG9tOiAwO1xuXG4gICAgICAvLyBFbnN1cmUgdGhlIGNvbnRlbnQgZG9lc24ndCB3cmFwXG4gICAgICA+IHRoZWFkLFxuICAgICAgPiB0Ym9keSxcbiAgICAgID4gdGZvb3Qge1xuICAgICAgICA+IHRyIHtcbiAgICAgICAgICA+IHRoLFxuICAgICAgICAgID4gdGQge1xuICAgICAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBTcGVjaWFsIG92ZXJyaWRlcyBmb3IgdGhlIGJvcmRlcmVkIHRhYmxlc1xuICAgID4gLnRhYmxlLWJvcmRlcmVkIHtcbiAgICAgIGJvcmRlcjogMDtcblxuICAgICAgLy8gTnVrZSB0aGUgYXBwcm9wcmlhdGUgYm9yZGVycyBzbyB0aGF0IHRoZSBwYXJlbnQgY2FuIGhhbmRsZSB0aGVtXG4gICAgICA+IHRoZWFkLFxuICAgICAgPiB0Ym9keSxcbiAgICAgID4gdGZvb3Qge1xuICAgICAgICA+IHRyIHtcbiAgICAgICAgICA+IHRoOmZpcnN0LWNoaWxkLFxuICAgICAgICAgID4gdGQ6Zmlyc3QtY2hpbGQge1xuICAgICAgICAgICAgYm9yZGVyLWxlZnQ6IDA7XG4gICAgICAgICAgfVxuICAgICAgICAgID4gdGg6bGFzdC1jaGlsZCxcbiAgICAgICAgICA+IHRkOmxhc3QtY2hpbGQge1xuICAgICAgICAgICAgYm9yZGVyLXJpZ2h0OiAwO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBPbmx5IG51a2UgdGhlIGxhc3Qgcm93J3MgYm90dG9tLWJvcmRlciBpbiBgdGJvZHlgIGFuZCBgdGZvb3RgIHNpbmNlXG4gICAgICAvLyBjaGFuY2VzIGFyZSB0aGVyZSB3aWxsIGJlIG9ubHkgb25lIGB0cmAgaW4gYSBgdGhlYWRgIGFuZCB0aGF0IHdvdWxkXG4gICAgICAvLyByZW1vdmUgdGhlIGJvcmRlciBhbHRvZ2V0aGVyLlxuICAgICAgPiB0Ym9keSxcbiAgICAgID4gdGZvb3Qge1xuICAgICAgICA+IHRyOmxhc3QtY2hpbGQge1xuICAgICAgICAgID4gdGgsXG4gICAgICAgICAgPiB0ZCB7XG4gICAgICAgICAgICBib3JkZXItYm90dG9tOiAwO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgfVxuICB9XG59XG4iLCIvLyBUYWJsZXNcblxuLnRhYmxlLXJvdy12YXJpYW50KEBzdGF0ZTsgQGJhY2tncm91bmQpIHtcbiAgLy8gRXhhY3Qgc2VsZWN0b3JzIGJlbG93IHJlcXVpcmVkIHRvIG92ZXJyaWRlIGAudGFibGUtc3RyaXBlZGAgYW5kIHByZXZlbnRcbiAgLy8gaW5oZXJpdGFuY2UgdG8gbmVzdGVkIHRhYmxlcy5cbiAgLnRhYmxlID4gdGhlYWQgPiB0cixcbiAgLnRhYmxlID4gdGJvZHkgPiB0cixcbiAgLnRhYmxlID4gdGZvb3QgPiB0ciB7XG4gICAgPiB0ZC5Ae3N0YXRlfSxcbiAgICA+IHRoLkB7c3RhdGV9LFxuICAgICYuQHtzdGF0ZX0gPiB0ZCxcbiAgICAmLkB7c3RhdGV9ID4gdGgge1xuICAgICAgYmFja2dyb3VuZC1jb2xvcjogQGJhY2tncm91bmQ7XG4gICAgfVxuICB9XG5cbiAgLy8gSG92ZXIgc3RhdGVzIGZvciBgLnRhYmxlLWhvdmVyYFxuICAvLyBOb3RlOiB0aGlzIGlzIG5vdCBhdmFpbGFibGUgZm9yIGNlbGxzIG9yIHJvd3Mgd2l0aGluIGB0aGVhZGAgb3IgYHRmb290YC5cbiAgLnRhYmxlLWhvdmVyID4gdGJvZHkgPiB0ciB7XG4gICAgPiB0ZC5Ae3N0YXRlfTpob3ZlcixcbiAgICA+IHRoLkB7c3RhdGV9OmhvdmVyLFxuICAgICYuQHtzdGF0ZX06aG92ZXIgPiB0ZCxcbiAgICAmOmhvdmVyID4gLkB7c3RhdGV9LFxuICAgICYuQHtzdGF0ZX06aG92ZXIgPiB0aCB7XG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBkYXJrZW4oQGJhY2tncm91bmQsIDUlKTtcbiAgICB9XG4gIH1cbn1cbiIsIi8vXG4vLyBGb3Jtc1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuXG4vLyBOb3JtYWxpemUgbm9uLWNvbnRyb2xzXG4vL1xuLy8gUmVzdHlsZSBhbmQgYmFzZWxpbmUgbm9uLWNvbnRyb2wgZm9ybSBlbGVtZW50cy5cblxuZmllbGRzZXQge1xuICBwYWRkaW5nOiAwO1xuICBtYXJnaW46IDA7XG4gIGJvcmRlcjogMDtcbiAgLy8gQ2hyb21lIGFuZCBGaXJlZm94IHNldCBhIGBtaW4td2lkdGg6IG1pbi1jb250ZW50O2Agb24gZmllbGRzZXRzLFxuICAvLyBzbyB3ZSByZXNldCB0aGF0IHRvIGVuc3VyZSBpdCBiZWhhdmVzIG1vcmUgbGlrZSBhIHN0YW5kYXJkIGJsb2NrIGVsZW1lbnQuXG4gIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvaXNzdWVzLzEyMzU5LlxuICBtaW4td2lkdGg6IDA7XG59XG5cbmxlZ2VuZCB7XG4gIGRpc3BsYXk6IGJsb2NrO1xuICB3aWR0aDogMTAwJTtcbiAgcGFkZGluZzogMDtcbiAgbWFyZ2luLWJvdHRvbTogQGxpbmUtaGVpZ2h0LWNvbXB1dGVkO1xuICBmb250LXNpemU6IChAZm9udC1zaXplLWJhc2UgKiAxLjUpO1xuICBsaW5lLWhlaWdodDogaW5oZXJpdDtcbiAgY29sb3I6IEBsZWdlbmQtY29sb3I7XG4gIGJvcmRlcjogMDtcbiAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIEBsZWdlbmQtYm9yZGVyLWNvbG9yO1xufVxuXG5sYWJlbCB7XG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgbWF4LXdpZHRoOiAxMDAlOyAvLyBGb3JjZSBJRTggdG8gd3JhcCBsb25nIGNvbnRlbnQgKHNlZSBodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvaXNzdWVzLzEzMTQxKVxuICBtYXJnaW4tYm90dG9tOiA1cHg7XG4gIGZvbnQtd2VpZ2h0OiBib2xkO1xufVxuXG5cbi8vIE5vcm1hbGl6ZSBmb3JtIGNvbnRyb2xzXG4vL1xuLy8gV2hpbGUgbW9zdCBvZiBvdXIgZm9ybSBzdHlsZXMgcmVxdWlyZSBleHRyYSBjbGFzc2VzLCBzb21lIGJhc2ljIG5vcm1hbGl6YXRpb25cbi8vIGlzIHJlcXVpcmVkIHRvIGVuc3VyZSBvcHRpbXVtIGRpc3BsYXkgd2l0aCBvciB3aXRob3V0IHRob3NlIGNsYXNzZXMgdG8gYmV0dGVyXG4vLyBhZGRyZXNzIGJyb3dzZXIgaW5jb25zaXN0ZW5jaWVzLlxuXG4vLyBPdmVycmlkZSBjb250ZW50LWJveCBpbiBOb3JtYWxpemUgKCogaXNuJ3Qgc3BlY2lmaWMgZW5vdWdoKVxuaW5wdXRbdHlwZT1cInNlYXJjaFwiXSB7XG4gIC5ib3gtc2l6aW5nKGJvcmRlci1ib3gpO1xufVxuXG4vLyBQb3NpdGlvbiByYWRpb3MgYW5kIGNoZWNrYm94ZXMgYmV0dGVyXG5pbnB1dFt0eXBlPVwicmFkaW9cIl0sXG5pbnB1dFt0eXBlPVwiY2hlY2tib3hcIl0ge1xuICBtYXJnaW46IDRweCAwIDA7XG4gIG1hcmdpbi10b3A6IDFweCBcXDk7IC8vIElFOC05XG4gIGxpbmUtaGVpZ2h0OiBub3JtYWw7XG59XG5cbi8vIFNldCB0aGUgaGVpZ2h0IG9mIGZpbGUgY29udHJvbHMgdG8gbWF0Y2ggdGV4dCBpbnB1dHNcbmlucHV0W3R5cGU9XCJmaWxlXCJdIHtcbiAgZGlzcGxheTogYmxvY2s7XG59XG5cbi8vIE1ha2UgcmFuZ2UgaW5wdXRzIGJlaGF2ZSBsaWtlIHRleHR1YWwgZm9ybSBjb250cm9sc1xuaW5wdXRbdHlwZT1cInJhbmdlXCJdIHtcbiAgZGlzcGxheTogYmxvY2s7XG4gIHdpZHRoOiAxMDAlO1xufVxuXG4vLyBNYWtlIG11bHRpcGxlIHNlbGVjdCBlbGVtZW50cyBoZWlnaHQgbm90IGZpeGVkXG5zZWxlY3RbbXVsdGlwbGVdLFxuc2VsZWN0W3NpemVdIHtcbiAgaGVpZ2h0OiBhdXRvO1xufVxuXG4vLyBGb2N1cyBmb3IgZmlsZSwgcmFkaW8sIGFuZCBjaGVja2JveFxuaW5wdXRbdHlwZT1cImZpbGVcIl06Zm9jdXMsXG5pbnB1dFt0eXBlPVwicmFkaW9cIl06Zm9jdXMsXG5pbnB1dFt0eXBlPVwiY2hlY2tib3hcIl06Zm9jdXMge1xuICAudGFiLWZvY3VzKCk7XG59XG5cbi8vIEFkanVzdCBvdXRwdXQgZWxlbWVudFxub3V0cHV0IHtcbiAgZGlzcGxheTogYmxvY2s7XG4gIHBhZGRpbmctdG9wOiAoQHBhZGRpbmctYmFzZS12ZXJ0aWNhbCArIDEpO1xuICBmb250LXNpemU6IEBmb250LXNpemUtYmFzZTtcbiAgbGluZS1oZWlnaHQ6IEBsaW5lLWhlaWdodC1iYXNlO1xuICBjb2xvcjogQGlucHV0LWNvbG9yO1xufVxuXG5cbi8vIENvbW1vbiBmb3JtIGNvbnRyb2xzXG4vL1xuLy8gU2hhcmVkIHNpemUgYW5kIHR5cGUgcmVzZXRzIGZvciBmb3JtIGNvbnRyb2xzLiBBcHBseSBgLmZvcm0tY29udHJvbGAgdG8gYW55XG4vLyBvZiB0aGUgZm9sbG93aW5nIGZvcm0gY29udHJvbHM6XG4vL1xuLy8gc2VsZWN0XG4vLyB0ZXh0YXJlYVxuLy8gaW5wdXRbdHlwZT1cInRleHRcIl1cbi8vIGlucHV0W3R5cGU9XCJwYXNzd29yZFwiXVxuLy8gaW5wdXRbdHlwZT1cImRhdGV0aW1lXCJdXG4vLyBpbnB1dFt0eXBlPVwiZGF0ZXRpbWUtbG9jYWxcIl1cbi8vIGlucHV0W3R5cGU9XCJkYXRlXCJdXG4vLyBpbnB1dFt0eXBlPVwibW9udGhcIl1cbi8vIGlucHV0W3R5cGU9XCJ0aW1lXCJdXG4vLyBpbnB1dFt0eXBlPVwid2Vla1wiXVxuLy8gaW5wdXRbdHlwZT1cIm51bWJlclwiXVxuLy8gaW5wdXRbdHlwZT1cImVtYWlsXCJdXG4vLyBpbnB1dFt0eXBlPVwidXJsXCJdXG4vLyBpbnB1dFt0eXBlPVwic2VhcmNoXCJdXG4vLyBpbnB1dFt0eXBlPVwidGVsXCJdXG4vLyBpbnB1dFt0eXBlPVwiY29sb3JcIl1cblxuLmZvcm0tY29udHJvbCB7XG4gIGRpc3BsYXk6IGJsb2NrO1xuICB3aWR0aDogMTAwJTtcbiAgaGVpZ2h0OiBAaW5wdXQtaGVpZ2h0LWJhc2U7IC8vIE1ha2UgaW5wdXRzIGF0IGxlYXN0IHRoZSBoZWlnaHQgb2YgdGhlaXIgYnV0dG9uIGNvdW50ZXJwYXJ0IChiYXNlIGxpbmUtaGVpZ2h0ICsgcGFkZGluZyArIGJvcmRlcilcbiAgcGFkZGluZzogQHBhZGRpbmctYmFzZS12ZXJ0aWNhbCBAcGFkZGluZy1iYXNlLWhvcml6b250YWw7XG4gIGZvbnQtc2l6ZTogQGZvbnQtc2l6ZS1iYXNlO1xuICBsaW5lLWhlaWdodDogQGxpbmUtaGVpZ2h0LWJhc2U7XG4gIGNvbG9yOiBAaW5wdXQtY29sb3I7XG4gIGJhY2tncm91bmQtY29sb3I6IEBpbnB1dC1iZztcbiAgYmFja2dyb3VuZC1pbWFnZTogbm9uZTsgLy8gUmVzZXQgdW51c3VhbCBGaXJlZm94LW9uLUFuZHJvaWQgZGVmYXVsdCBzdHlsZTsgc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9uZWNvbGFzL25vcm1hbGl6ZS5jc3MvaXNzdWVzLzIxNFxuICBib3JkZXI6IDFweCBzb2xpZCBAaW5wdXQtYm9yZGVyO1xuICBib3JkZXItcmFkaXVzOiBAaW5wdXQtYm9yZGVyLXJhZGl1cztcbiAgLmJveC1zaGFkb3coaW5zZXQgMCAxcHggMXB4IHJnYmEoMCwwLDAsLjA3NSkpO1xuICAudHJhbnNpdGlvbih+XCJib3JkZXItY29sb3IgZWFzZS1pbi1vdXQgLjE1cywgYm94LXNoYWRvdyBlYXNlLWluLW91dCAuMTVzXCIpO1xuXG4gIC8vIEN1c3RvbWl6ZSB0aGUgYDpmb2N1c2Agc3RhdGUgdG8gaW1pdGF0ZSBuYXRpdmUgV2ViS2l0IHN0eWxlcy5cbiAgLmZvcm0tY29udHJvbC1mb2N1cygpO1xuXG4gIC8vIFBsYWNlaG9sZGVyXG4gIC5wbGFjZWhvbGRlcigpO1xuXG4gIC8vIERpc2FibGVkIGFuZCByZWFkLW9ubHkgaW5wdXRzXG4gIC8vXG4gIC8vIEhUTUw1IHNheXMgdGhhdCBjb250cm9scyB1bmRlciBhIGZpZWxkc2V0ID4gbGVnZW5kOmZpcnN0LWNoaWxkIHdvbid0IGJlXG4gIC8vIGRpc2FibGVkIGlmIHRoZSBmaWVsZHNldCBpcyBkaXNhYmxlZC4gRHVlIHRvIGltcGxlbWVudGF0aW9uIGRpZmZpY3VsdHksIHdlXG4gIC8vIGRvbid0IGhvbm9yIHRoYXQgZWRnZSBjYXNlOyB3ZSBzdHlsZSB0aGVtIGFzIGRpc2FibGVkIGFueXdheS5cbiAgJltkaXNhYmxlZF0sXG4gICZbcmVhZG9ubHldLFxuICBmaWVsZHNldFtkaXNhYmxlZF0gJiB7XG4gICAgY3Vyc29yOiBAY3Vyc29yLWRpc2FibGVkO1xuICAgIGJhY2tncm91bmQtY29sb3I6IEBpbnB1dC1iZy1kaXNhYmxlZDtcbiAgICBvcGFjaXR5OiAxOyAvLyBpT1MgZml4IGZvciB1bnJlYWRhYmxlIGRpc2FibGVkIGNvbnRlbnRcbiAgfVxuXG4gIC8vIFJlc2V0IGhlaWdodCBmb3IgYHRleHRhcmVhYHNcbiAgdGV4dGFyZWEmIHtcbiAgICBoZWlnaHQ6IGF1dG87XG4gIH1cbn1cblxuXG4vLyBTZWFyY2ggaW5wdXRzIGluIGlPU1xuLy9cbi8vIFRoaXMgb3ZlcnJpZGVzIHRoZSBleHRyYSByb3VuZGVkIGNvcm5lcnMgb24gc2VhcmNoIGlucHV0cyBpbiBpT1Mgc28gdGhhdCBvdXJcbi8vIGAuZm9ybS1jb250cm9sYCBjbGFzcyBjYW4gcHJvcGVybHkgc3R5bGUgdGhlbS4gTm90ZSB0aGF0IHRoaXMgY2Fubm90IHNpbXBseVxuLy8gYmUgYWRkZWQgdG8gYC5mb3JtLWNvbnRyb2xgIGFzIGl0J3Mgbm90IHNwZWNpZmljIGVub3VnaC4gRm9yIGRldGFpbHMsIHNlZVxuLy8gaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2lzc3Vlcy8xMTU4Ni5cblxuaW5wdXRbdHlwZT1cInNlYXJjaFwiXSB7XG4gIC13ZWJraXQtYXBwZWFyYW5jZTogbm9uZTtcbn1cblxuXG4vLyBTcGVjaWFsIHN0eWxlcyBmb3IgaU9TIHRlbXBvcmFsIGlucHV0c1xuLy9cbi8vIEluIE1vYmlsZSBTYWZhcmksIHNldHRpbmcgYGRpc3BsYXk6IGJsb2NrYCBvbiB0ZW1wb3JhbCBpbnB1dHMgY2F1c2VzIHRoZVxuLy8gdGV4dCB3aXRoaW4gdGhlIGlucHV0IHRvIGJlY29tZSB2ZXJ0aWNhbGx5IG1pc2FsaWduZWQuXG4vLyBBcyBhIHdvcmthcm91bmQsIHdlIHNldCBhIHBpeGVsIGxpbmUtaGVpZ2h0IHRoYXQgbWF0Y2hlcyB0aGVcbi8vIGdpdmVuIGhlaWdodCBvZiB0aGUgaW5wdXQuIFNpbmNlIHRoaXMgZnVja3MgdXAgZXZlcnl0aGluZyBlbHNlLCB3ZSBoYXZlIHRvXG4vLyBhcHByb3ByaWF0ZWx5IHJlc2V0IGl0IGZvciBJbnRlcm5ldCBFeHBsb3JlciBhbmQgdGhlIHNpemUgdmFyaWF0aW9ucy5cblxuaW5wdXRbdHlwZT1cImRhdGVcIl0sXG5pbnB1dFt0eXBlPVwidGltZVwiXSxcbmlucHV0W3R5cGU9XCJkYXRldGltZS1sb2NhbFwiXSxcbmlucHV0W3R5cGU9XCJtb250aFwiXSB7XG4gIGxpbmUtaGVpZ2h0OiBAaW5wdXQtaGVpZ2h0LWJhc2U7XG4gIC8vIElFOCsgbWlzYWxpZ25zIHRoZSB0ZXh0IHdpdGhpbiBkYXRlIGlucHV0cywgc28gd2UgcmVzZXRcbiAgbGluZS1oZWlnaHQ6IEBsaW5lLWhlaWdodC1iYXNlIH5cIlxcMFwiO1xuXG4gICYuaW5wdXQtc20ge1xuICAgIGxpbmUtaGVpZ2h0OiBAaW5wdXQtaGVpZ2h0LXNtYWxsO1xuICAgIGxpbmUtaGVpZ2h0OiBAbGluZS1oZWlnaHQtc21hbGwgflwiXFwwXCI7XG4gIH1cbiAgJi5pbnB1dC1sZyB7XG4gICAgbGluZS1oZWlnaHQ6IEBpbnB1dC1oZWlnaHQtbGFyZ2U7XG4gICAgbGluZS1oZWlnaHQ6IEBsaW5lLWhlaWdodC1sYXJnZSB+XCJcXDBcIjtcbiAgfVxufVxuXG4vLyBJRSAxMSBoYWNrIHRvIHJldmVyc2UgdGhlIGlPUyB0ZW1wb3JhbCBpbnB1dCBoYWNrLlxuXzotbXMtZnVsbHNjcmVlbiwgOnJvb3QgaW5wdXRbdHlwZT1cImRhdGVcIl0sXG5fOi1tcy1mdWxsc2NyZWVuLCA6cm9vdCBpbnB1dFt0eXBlPVwidGltZVwiXSxcbl86LW1zLWZ1bGxzY3JlZW4sIDpyb290IGlucHV0W3R5cGU9XCJkYXRldGltZS1sb2NhbFwiXSxcbl86LW1zLWZ1bGxzY3JlZW4sIDpyb290IGlucHV0W3R5cGU9XCJtb250aFwiXSB7XG4gIGxpbmUtaGVpZ2h0OiBAbGluZS1oZWlnaHQtYmFzZTtcblxuICAmLmlucHV0LXNtIHtcbiAgICBsaW5lLWhlaWdodDogQGxpbmUtaGVpZ2h0LXNtYWxsO1xuICB9XG4gICYuaW5wdXQtbGcge1xuICAgIGxpbmUtaGVpZ2h0OiBAbGluZS1oZWlnaHQtbGFyZ2U7XG4gIH1cbn1cblxuXG4vLyBGb3JtIGdyb3Vwc1xuLy9cbi8vIERlc2lnbmVkIHRvIGhlbHAgd2l0aCB0aGUgb3JnYW5pemF0aW9uIGFuZCBzcGFjaW5nIG9mIHZlcnRpY2FsIGZvcm1zLiBGb3Jcbi8vIGhvcml6b250YWwgZm9ybXMsIHVzZSB0aGUgcHJlZGVmaW5lZCBncmlkIGNsYXNzZXMuXG5cbi5mb3JtLWdyb3VwIHtcbiAgbWFyZ2luLWJvdHRvbTogMTVweDtcbn1cblxuXG4vLyBDaGVja2JveGVzIGFuZCByYWRpb3Ncbi8vXG4vLyBJbmRlbnQgdGhlIGxhYmVscyB0byBwb3NpdGlvbiByYWRpb3MvY2hlY2tib3hlcyBhcyBoYW5naW5nIGNvbnRyb2xzLlxuXG4ucmFkaW8sXG4uY2hlY2tib3gge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIGRpc3BsYXk6IGJsb2NrO1xuICBtYXJnaW4tdG9wOiAxMHB4O1xuICBtYXJnaW4tYm90dG9tOiAxMHB4O1xuXG4gIGxhYmVsIHtcbiAgICBtaW4taGVpZ2h0OiBAbGluZS1oZWlnaHQtY29tcHV0ZWQ7IC8vIEVuc3VyZSB0aGUgaW5wdXQgZG9lc24ndCBqdW1wIHdoZW4gdGhlcmUgaXMgbm8gdGV4dFxuICAgIHBhZGRpbmctbGVmdDogMjBweDtcbiAgICBtYXJnaW4tYm90dG9tOiAwO1xuICAgIGZvbnQtd2VpZ2h0OiBub3JtYWw7XG4gICAgY3Vyc29yOiBwb2ludGVyO1xuICB9XG59XG4ucmFkaW8gaW5wdXRbdHlwZT1cInJhZGlvXCJdLFxuLnJhZGlvLWlubGluZSBpbnB1dFt0eXBlPVwicmFkaW9cIl0sXG4uY2hlY2tib3ggaW5wdXRbdHlwZT1cImNoZWNrYm94XCJdLFxuLmNoZWNrYm94LWlubGluZSBpbnB1dFt0eXBlPVwiY2hlY2tib3hcIl0ge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIG1hcmdpbi1sZWZ0OiAtMjBweDtcbiAgbWFyZ2luLXRvcDogNHB4IFxcOTtcbn1cblxuLnJhZGlvICsgLnJhZGlvLFxuLmNoZWNrYm94ICsgLmNoZWNrYm94IHtcbiAgbWFyZ2luLXRvcDogLTVweDsgLy8gTW92ZSB1cCBzaWJsaW5nIHJhZGlvcyBvciBjaGVja2JveGVzIGZvciB0aWdodGVyIHNwYWNpbmdcbn1cblxuLy8gUmFkaW9zIGFuZCBjaGVja2JveGVzIG9uIHNhbWUgbGluZVxuLnJhZGlvLWlubGluZSxcbi5jaGVja2JveC1pbmxpbmUge1xuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gIHBhZGRpbmctbGVmdDogMjBweDtcbiAgbWFyZ2luLWJvdHRvbTogMDtcbiAgdmVydGljYWwtYWxpZ246IG1pZGRsZTtcbiAgZm9udC13ZWlnaHQ6IG5vcm1hbDtcbiAgY3Vyc29yOiBwb2ludGVyO1xufVxuLnJhZGlvLWlubGluZSArIC5yYWRpby1pbmxpbmUsXG4uY2hlY2tib3gtaW5saW5lICsgLmNoZWNrYm94LWlubGluZSB7XG4gIG1hcmdpbi10b3A6IDA7XG4gIG1hcmdpbi1sZWZ0OiAxMHB4OyAvLyBzcGFjZSBvdXQgY29uc2VjdXRpdmUgaW5saW5lIGNvbnRyb2xzXG59XG5cbi8vIEFwcGx5IHNhbWUgZGlzYWJsZWQgY3Vyc29yIHR3ZWFrIGFzIGZvciBpbnB1dHNcbi8vIFNvbWUgc3BlY2lhbCBjYXJlIGlzIG5lZWRlZCBiZWNhdXNlIDxsYWJlbD5zIGRvbid0IGluaGVyaXQgdGhlaXIgcGFyZW50J3MgYGN1cnNvcmAuXG4vL1xuLy8gTm90ZTogTmVpdGhlciByYWRpb3Mgbm9yIGNoZWNrYm94ZXMgY2FuIGJlIHJlYWRvbmx5LlxuaW5wdXRbdHlwZT1cInJhZGlvXCJdLFxuaW5wdXRbdHlwZT1cImNoZWNrYm94XCJdIHtcbiAgJltkaXNhYmxlZF0sXG4gICYuZGlzYWJsZWQsXG4gIGZpZWxkc2V0W2Rpc2FibGVkXSAmIHtcbiAgICBjdXJzb3I6IEBjdXJzb3ItZGlzYWJsZWQ7XG4gIH1cbn1cbi8vIFRoZXNlIGNsYXNzZXMgYXJlIHVzZWQgZGlyZWN0bHkgb24gPGxhYmVsPnNcbi5yYWRpby1pbmxpbmUsXG4uY2hlY2tib3gtaW5saW5lIHtcbiAgJi5kaXNhYmxlZCxcbiAgZmllbGRzZXRbZGlzYWJsZWRdICYge1xuICAgIGN1cnNvcjogQGN1cnNvci1kaXNhYmxlZDtcbiAgfVxufVxuLy8gVGhlc2UgY2xhc3NlcyBhcmUgdXNlZCBvbiBlbGVtZW50cyB3aXRoIDxsYWJlbD4gZGVzY2VuZGFudHNcbi5yYWRpbyxcbi5jaGVja2JveCB7XG4gICYuZGlzYWJsZWQsXG4gIGZpZWxkc2V0W2Rpc2FibGVkXSAmIHtcbiAgICBsYWJlbCB7XG4gICAgICBjdXJzb3I6IEBjdXJzb3ItZGlzYWJsZWQ7XG4gICAgfVxuICB9XG59XG5cblxuLy8gU3RhdGljIGZvcm0gY29udHJvbCB0ZXh0XG4vL1xuLy8gQXBwbHkgY2xhc3MgdG8gYSBgcGAgZWxlbWVudCB0byBtYWtlIGFueSBzdHJpbmcgb2YgdGV4dCBhbGlnbiB3aXRoIGxhYmVscyBpblxuLy8gYSBob3Jpem9udGFsIGZvcm0gbGF5b3V0LlxuXG4uZm9ybS1jb250cm9sLXN0YXRpYyB7XG4gIC8vIFNpemUgaXQgYXBwcm9wcmlhdGVseSBuZXh0IHRvIHJlYWwgZm9ybSBjb250cm9sc1xuICBwYWRkaW5nLXRvcDogKEBwYWRkaW5nLWJhc2UtdmVydGljYWwgKyAxKTtcbiAgcGFkZGluZy1ib3R0b206IChAcGFkZGluZy1iYXNlLXZlcnRpY2FsICsgMSk7XG4gIC8vIFJlbW92ZSBkZWZhdWx0IG1hcmdpbiBmcm9tIGBwYFxuICBtYXJnaW4tYm90dG9tOiAwO1xuXG4gICYuaW5wdXQtbGcsXG4gICYuaW5wdXQtc20ge1xuICAgIHBhZGRpbmctbGVmdDogMDtcbiAgICBwYWRkaW5nLXJpZ2h0OiAwO1xuICB9XG59XG5cblxuLy8gRm9ybSBjb250cm9sIHNpemluZ1xuLy9cbi8vIEJ1aWxkIG9uIGAuZm9ybS1jb250cm9sYCB3aXRoIG1vZGlmaWVyIGNsYXNzZXMgdG8gZGVjcmVhc2Ugb3IgaW5jcmVhc2UgdGhlXG4vLyBoZWlnaHQgYW5kIGZvbnQtc2l6ZSBvZiBmb3JtIGNvbnRyb2xzLlxuXG4uaW5wdXQtc20sXG4uZm9ybS1ncm91cC1zbSAuZm9ybS1jb250cm9sIHtcbiAgLmlucHV0LXNpemUoQGlucHV0LWhlaWdodC1zbWFsbDsgQHBhZGRpbmctc21hbGwtdmVydGljYWw7IEBwYWRkaW5nLXNtYWxsLWhvcml6b250YWw7IEBmb250LXNpemUtc21hbGw7IEBsaW5lLWhlaWdodC1zbWFsbDsgQGlucHV0LWJvcmRlci1yYWRpdXMtc21hbGwpO1xufVxuXG4uaW5wdXQtbGcsXG4uZm9ybS1ncm91cC1sZyAuZm9ybS1jb250cm9sIHtcbiAgLmlucHV0LXNpemUoQGlucHV0LWhlaWdodC1sYXJnZTsgQHBhZGRpbmctbGFyZ2UtdmVydGljYWw7IEBwYWRkaW5nLWxhcmdlLWhvcml6b250YWw7IEBmb250LXNpemUtbGFyZ2U7IEBsaW5lLWhlaWdodC1sYXJnZTsgQGlucHV0LWJvcmRlci1yYWRpdXMtbGFyZ2UpO1xufVxuXG5cbi8vIEZvcm0gY29udHJvbCBmZWVkYmFjayBzdGF0ZXNcbi8vXG4vLyBBcHBseSBjb250ZXh0dWFsIGFuZCBzZW1hbnRpYyBzdGF0ZXMgdG8gaW5kaXZpZHVhbCBmb3JtIGNvbnRyb2xzLlxuXG4uaGFzLWZlZWRiYWNrIHtcbiAgLy8gRW5hYmxlIGFic29sdXRlIHBvc2l0aW9uaW5nXG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcblxuICAvLyBFbnN1cmUgaWNvbnMgZG9uJ3Qgb3ZlcmxhcCB0ZXh0XG4gIC5mb3JtLWNvbnRyb2wge1xuICAgIHBhZGRpbmctcmlnaHQ6IChAaW5wdXQtaGVpZ2h0LWJhc2UgKiAxLjI1KTtcbiAgfVxufVxuLy8gRmVlZGJhY2sgaWNvbiAocmVxdWlyZXMgLmdseXBoaWNvbiBjbGFzc2VzKVxuLmZvcm0tY29udHJvbC1mZWVkYmFjayB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgdG9wOiAwO1xuICByaWdodDogMDtcbiAgei1pbmRleDogMjsgLy8gRW5zdXJlIGljb24gaXMgYWJvdmUgaW5wdXQgZ3JvdXBzXG4gIGRpc3BsYXk6IGJsb2NrO1xuICB3aWR0aDogQGlucHV0LWhlaWdodC1iYXNlO1xuICBoZWlnaHQ6IEBpbnB1dC1oZWlnaHQtYmFzZTtcbiAgbGluZS1oZWlnaHQ6IEBpbnB1dC1oZWlnaHQtYmFzZTtcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xuICBwb2ludGVyLWV2ZW50czogbm9uZTtcbn1cbi5pbnB1dC1sZyArIC5mb3JtLWNvbnRyb2wtZmVlZGJhY2sge1xuICB3aWR0aDogQGlucHV0LWhlaWdodC1sYXJnZTtcbiAgaGVpZ2h0OiBAaW5wdXQtaGVpZ2h0LWxhcmdlO1xuICBsaW5lLWhlaWdodDogQGlucHV0LWhlaWdodC1sYXJnZTtcbn1cbi5pbnB1dC1zbSArIC5mb3JtLWNvbnRyb2wtZmVlZGJhY2sge1xuICB3aWR0aDogQGlucHV0LWhlaWdodC1zbWFsbDtcbiAgaGVpZ2h0OiBAaW5wdXQtaGVpZ2h0LXNtYWxsO1xuICBsaW5lLWhlaWdodDogQGlucHV0LWhlaWdodC1zbWFsbDtcbn1cblxuLy8gRmVlZGJhY2sgc3RhdGVzXG4uaGFzLXN1Y2Nlc3Mge1xuICAuZm9ybS1jb250cm9sLXZhbGlkYXRpb24oQHN0YXRlLXN1Y2Nlc3MtdGV4dDsgQHN0YXRlLXN1Y2Nlc3MtdGV4dDsgQHN0YXRlLXN1Y2Nlc3MtYmcpO1xufVxuLmhhcy13YXJuaW5nIHtcbiAgLmZvcm0tY29udHJvbC12YWxpZGF0aW9uKEBzdGF0ZS13YXJuaW5nLXRleHQ7IEBzdGF0ZS13YXJuaW5nLXRleHQ7IEBzdGF0ZS13YXJuaW5nLWJnKTtcbn1cbi5oYXMtZXJyb3Ige1xuICAuZm9ybS1jb250cm9sLXZhbGlkYXRpb24oQHN0YXRlLWRhbmdlci10ZXh0OyBAc3RhdGUtZGFuZ2VyLXRleHQ7IEBzdGF0ZS1kYW5nZXItYmcpO1xufVxuXG4vLyBSZXBvc2l0aW9uIGZlZWRiYWNrIGljb24gaWYgaW5wdXQgaGFzIHZpc2libGUgbGFiZWwgYWJvdmVcbi5oYXMtZmVlZGJhY2sgbGFiZWwge1xuXG4gICYgfiAuZm9ybS1jb250cm9sLWZlZWRiYWNrIHtcbiAgICAgdG9wOiAoQGxpbmUtaGVpZ2h0LWNvbXB1dGVkICsgNSk7IC8vIEhlaWdodCBvZiB0aGUgYGxhYmVsYCBhbmQgaXRzIG1hcmdpblxuICB9XG4gICYuc3Itb25seSB+IC5mb3JtLWNvbnRyb2wtZmVlZGJhY2sge1xuICAgICB0b3A6IDA7XG4gIH1cbn1cblxuXG4vLyBIZWxwIHRleHRcbi8vXG4vLyBBcHBseSB0byBhbnkgZWxlbWVudCB5b3Ugd2lzaCB0byBjcmVhdGUgbGlnaHQgdGV4dCBmb3IgcGxhY2VtZW50IGltbWVkaWF0ZWx5XG4vLyBiZWxvdyBhIGZvcm0gY29udHJvbC4gVXNlIGZvciBnZW5lcmFsIGhlbHAsIGZvcm1hdHRpbmcsIG9yIGluc3RydWN0aW9uYWwgdGV4dC5cblxuLmhlbHAtYmxvY2sge1xuICBkaXNwbGF5OiBibG9jazsgLy8gYWNjb3VudCBmb3IgYW55IGVsZW1lbnQgdXNpbmcgaGVscC1ibG9ja1xuICBtYXJnaW4tdG9wOiA1cHg7XG4gIG1hcmdpbi1ib3R0b206IDEwcHg7XG4gIGNvbG9yOiBsaWdodGVuKEB0ZXh0LWNvbG9yLCAyNSUpOyAvLyBsaWdodGVuIHRoZSB0ZXh0IHNvbWUgZm9yIGNvbnRyYXN0XG59XG5cblxuLy8gSW5saW5lIGZvcm1zXG4vL1xuLy8gTWFrZSBmb3JtcyBhcHBlYXIgaW5saW5lKC1ibG9jaykgYnkgYWRkaW5nIHRoZSBgLmZvcm0taW5saW5lYCBjbGFzcy4gSW5saW5lXG4vLyBmb3JtcyBiZWdpbiBzdGFja2VkIG9uIGV4dHJhIHNtYWxsIChtb2JpbGUpIGRldmljZXMgYW5kIHRoZW4gZ28gaW5saW5lIHdoZW5cbi8vIHZpZXdwb3J0cyByZWFjaCA8NzY4cHguXG4vL1xuLy8gUmVxdWlyZXMgd3JhcHBpbmcgaW5wdXRzIGFuZCBsYWJlbHMgd2l0aCBgLmZvcm0tZ3JvdXBgIGZvciBwcm9wZXIgZGlzcGxheSBvZlxuLy8gZGVmYXVsdCBIVE1MIGZvcm0gY29udHJvbHMgYW5kIG91ciBjdXN0b20gZm9ybSBjb250cm9scyAoZS5nLiwgaW5wdXQgZ3JvdXBzKS5cbi8vXG4vLyBIZWFkcyB1cCEgVGhpcyBpcyBtaXhpbi1lZCBpbnRvIGAubmF2YmFyLWZvcm1gIGluIG5hdmJhcnMubGVzcy5cblxuLmZvcm0taW5saW5lIHtcblxuICAvLyBLaWNrIGluIHRoZSBpbmxpbmVcbiAgQG1lZGlhIChtaW4td2lkdGg6IEBzY3JlZW4tc20tbWluKSB7XG4gICAgLy8gSW5saW5lLWJsb2NrIGFsbCB0aGUgdGhpbmdzIGZvciBcImlubGluZVwiXG4gICAgLmZvcm0tZ3JvdXAge1xuICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgICAgbWFyZ2luLWJvdHRvbTogMDtcbiAgICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XG4gICAgfVxuXG4gICAgLy8gSW4gbmF2YmFyLWZvcm0sIGFsbG93IGZvbGtzIHRvICpub3QqIHVzZSBgLmZvcm0tZ3JvdXBgXG4gICAgLmZvcm0tY29udHJvbCB7XG4gICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gICAgICB3aWR0aDogYXV0bzsgLy8gUHJldmVudCBsYWJlbHMgZnJvbSBzdGFja2luZyBhYm92ZSBpbnB1dHMgaW4gYC5mb3JtLWdyb3VwYFxuICAgICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTtcbiAgICB9XG5cbiAgICAvLyBNYWtlIHN0YXRpYyBjb250cm9scyBiZWhhdmUgbGlrZSByZWd1bGFyIG9uZXNcbiAgICAuZm9ybS1jb250cm9sLXN0YXRpYyB7XG4gICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gICAgfVxuXG4gICAgLmlucHV0LWdyb3VwIHtcbiAgICAgIGRpc3BsYXk6IGlubGluZS10YWJsZTtcbiAgICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XG5cbiAgICAgIC5pbnB1dC1ncm91cC1hZGRvbixcbiAgICAgIC5pbnB1dC1ncm91cC1idG4sXG4gICAgICAuZm9ybS1jb250cm9sIHtcbiAgICAgICAgd2lkdGg6IGF1dG87XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gSW5wdXQgZ3JvdXBzIG5lZWQgdGhhdCAxMDAlIHdpZHRoIHRob3VnaFxuICAgIC5pbnB1dC1ncm91cCA+IC5mb3JtLWNvbnRyb2wge1xuICAgICAgd2lkdGg6IDEwMCU7XG4gICAgfVxuXG4gICAgLmNvbnRyb2wtbGFiZWwge1xuICAgICAgbWFyZ2luLWJvdHRvbTogMDtcbiAgICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XG4gICAgfVxuXG4gICAgLy8gUmVtb3ZlIGRlZmF1bHQgbWFyZ2luIG9uIHJhZGlvcy9jaGVja2JveGVzIHRoYXQgd2VyZSB1c2VkIGZvciBzdGFja2luZywgYW5kXG4gICAgLy8gdGhlbiB1bmRvIHRoZSBmbG9hdGluZyBvZiByYWRpb3MgYW5kIGNoZWNrYm94ZXMgdG8gbWF0Y2ggKHdoaWNoIGFsc28gYXZvaWRzXG4gICAgLy8gYSBidWcgaW4gV2ViS2l0OiBodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvaXNzdWVzLzE5NjkpLlxuICAgIC5yYWRpbyxcbiAgICAuY2hlY2tib3gge1xuICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgICAgbWFyZ2luLXRvcDogMDtcbiAgICAgIG1hcmdpbi1ib3R0b206IDA7XG4gICAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1xuXG4gICAgICBsYWJlbCB7XG4gICAgICAgIHBhZGRpbmctbGVmdDogMDtcbiAgICAgIH1cbiAgICB9XG4gICAgLnJhZGlvIGlucHV0W3R5cGU9XCJyYWRpb1wiXSxcbiAgICAuY2hlY2tib3ggaW5wdXRbdHlwZT1cImNoZWNrYm94XCJdIHtcbiAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICAgIG1hcmdpbi1sZWZ0OiAwO1xuICAgIH1cblxuICAgIC8vIFJlLW92ZXJyaWRlIHRoZSBmZWVkYmFjayBpY29uLlxuICAgIC5oYXMtZmVlZGJhY2sgLmZvcm0tY29udHJvbC1mZWVkYmFjayB7XG4gICAgICB0b3A6IDA7XG4gICAgfVxuICB9XG59XG5cblxuLy8gSG9yaXpvbnRhbCBmb3Jtc1xuLy9cbi8vIEhvcml6b250YWwgZm9ybXMgYXJlIGJ1aWx0IG9uIGdyaWQgY2xhc3NlcyBhbmQgYWxsb3cgeW91IHRvIGNyZWF0ZSBmb3JtcyB3aXRoXG4vLyBsYWJlbHMgb24gdGhlIGxlZnQgYW5kIGlucHV0cyBvbiB0aGUgcmlnaHQuXG5cbi5mb3JtLWhvcml6b250YWwge1xuXG4gIC8vIENvbnNpc3RlbnQgdmVydGljYWwgYWxpZ25tZW50IG9mIHJhZGlvcyBhbmQgY2hlY2tib3hlc1xuICAvL1xuICAvLyBMYWJlbHMgYWxzbyBnZXQgc29tZSByZXNldCBzdHlsZXMsIGJ1dCB0aGF0IGlzIHNjb3BlZCB0byBhIG1lZGlhIHF1ZXJ5IGJlbG93LlxuICAucmFkaW8sXG4gIC5jaGVja2JveCxcbiAgLnJhZGlvLWlubGluZSxcbiAgLmNoZWNrYm94LWlubGluZSB7XG4gICAgbWFyZ2luLXRvcDogMDtcbiAgICBtYXJnaW4tYm90dG9tOiAwO1xuICAgIHBhZGRpbmctdG9wOiAoQHBhZGRpbmctYmFzZS12ZXJ0aWNhbCArIDEpOyAvLyBEZWZhdWx0IHBhZGRpbmcgcGx1cyBhIGJvcmRlclxuICB9XG4gIC8vIEFjY291bnQgZm9yIHBhZGRpbmcgd2UncmUgYWRkaW5nIHRvIGVuc3VyZSB0aGUgYWxpZ25tZW50IGFuZCBvZiBoZWxwIHRleHRcbiAgLy8gYW5kIG90aGVyIGNvbnRlbnQgYmVsb3cgaXRlbXNcbiAgLnJhZGlvLFxuICAuY2hlY2tib3gge1xuICAgIG1pbi1oZWlnaHQ6IChAbGluZS1oZWlnaHQtY29tcHV0ZWQgKyAoQHBhZGRpbmctYmFzZS12ZXJ0aWNhbCArIDEpKTtcbiAgfVxuXG4gIC8vIE1ha2UgZm9ybSBncm91cHMgYmVoYXZlIGxpa2Ugcm93c1xuICAuZm9ybS1ncm91cCB7XG4gICAgLm1ha2Utcm93KCk7XG4gIH1cblxuICAvLyBSZXNldCBzcGFjaW5nIGFuZCByaWdodCBhbGlnbiBsYWJlbHMsIGJ1dCBzY29wZSB0byBtZWRpYSBxdWVyaWVzIHNvIHRoYXRcbiAgLy8gbGFiZWxzIG9uIG5hcnJvdyB2aWV3cG9ydHMgc3RhY2sgdGhlIHNhbWUgYXMgYSBkZWZhdWx0IGZvcm0gZXhhbXBsZS5cbiAgQG1lZGlhIChtaW4td2lkdGg6IEBzY3JlZW4tc20tbWluKSB7XG4gICAgLmNvbnRyb2wtbGFiZWwge1xuICAgICAgdGV4dC1hbGlnbjogcmlnaHQ7XG4gICAgICBtYXJnaW4tYm90dG9tOiAwO1xuICAgICAgcGFkZGluZy10b3A6IChAcGFkZGluZy1iYXNlLXZlcnRpY2FsICsgMSk7IC8vIERlZmF1bHQgcGFkZGluZyBwbHVzIGEgYm9yZGVyXG4gICAgfVxuICB9XG5cbiAgLy8gVmFsaWRhdGlvbiBzdGF0ZXNcbiAgLy9cbiAgLy8gUmVwb3NpdGlvbiB0aGUgaWNvbiBiZWNhdXNlIGl0J3Mgbm93IHdpdGhpbiBhIGdyaWQgY29sdW1uIGFuZCBjb2x1bW5zIGhhdmVcbiAgLy8gYHBvc2l0aW9uOiByZWxhdGl2ZTtgIG9uIHRoZW0uIEFsc28gYWNjb3VudHMgZm9yIHRoZSBncmlkIGd1dHRlciBwYWRkaW5nLlxuICAuaGFzLWZlZWRiYWNrIC5mb3JtLWNvbnRyb2wtZmVlZGJhY2sge1xuICAgIHJpZ2h0OiAoQGdyaWQtZ3V0dGVyLXdpZHRoIC8gMik7XG4gIH1cblxuICAvLyBGb3JtIGdyb3VwIHNpemVzXG4gIC8vXG4gIC8vIFF1aWNrIHV0aWxpdHkgY2xhc3MgZm9yIGFwcGx5aW5nIGAuaW5wdXQtbGdgIGFuZCBgLmlucHV0LXNtYCBzdHlsZXMgdG8gdGhlXG4gIC8vIGlucHV0cyBhbmQgbGFiZWxzIHdpdGhpbiBhIGAuZm9ybS1ncm91cGAuXG4gIC5mb3JtLWdyb3VwLWxnIHtcbiAgICBAbWVkaWEgKG1pbi13aWR0aDogQHNjcmVlbi1zbS1taW4pIHtcbiAgICAgIC5jb250cm9sLWxhYmVsIHtcbiAgICAgICAgcGFkZGluZy10b3A6ICgoQHBhZGRpbmctbGFyZ2UtdmVydGljYWwgKiBAbGluZS1oZWlnaHQtbGFyZ2UpICsgMSk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIC5mb3JtLWdyb3VwLXNtIHtcbiAgICBAbWVkaWEgKG1pbi13aWR0aDogQHNjcmVlbi1zbS1taW4pIHtcbiAgICAgIC5jb250cm9sLWxhYmVsIHtcbiAgICAgICAgcGFkZGluZy10b3A6IChAcGFkZGluZy1zbWFsbC12ZXJ0aWNhbCArIDEpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIiwiLy8gRm9ybSB2YWxpZGF0aW9uIHN0YXRlc1xuLy9cbi8vIFVzZWQgaW4gZm9ybXMubGVzcyB0byBnZW5lcmF0ZSB0aGUgZm9ybSB2YWxpZGF0aW9uIENTUyBmb3Igd2FybmluZ3MsIGVycm9ycyxcbi8vIGFuZCBzdWNjZXNzZXMuXG5cbi5mb3JtLWNvbnRyb2wtdmFsaWRhdGlvbihAdGV4dC1jb2xvcjogIzU1NTsgQGJvcmRlci1jb2xvcjogI2NjYzsgQGJhY2tncm91bmQtY29sb3I6ICNmNWY1ZjUpIHtcbiAgLy8gQ29sb3IgdGhlIGxhYmVsIGFuZCBoZWxwIHRleHRcbiAgLmhlbHAtYmxvY2ssXG4gIC5jb250cm9sLWxhYmVsLFxuICAucmFkaW8sXG4gIC5jaGVja2JveCxcbiAgLnJhZGlvLWlubGluZSxcbiAgLmNoZWNrYm94LWlubGluZSxcbiAgJi5yYWRpbyBsYWJlbCxcbiAgJi5jaGVja2JveCBsYWJlbCxcbiAgJi5yYWRpby1pbmxpbmUgbGFiZWwsXG4gICYuY2hlY2tib3gtaW5saW5lIGxhYmVsICB7XG4gICAgY29sb3I6IEB0ZXh0LWNvbG9yO1xuICB9XG4gIC8vIFNldCB0aGUgYm9yZGVyIGFuZCBib3ggc2hhZG93IG9uIHNwZWNpZmljIGlucHV0cyB0byBtYXRjaFxuICAuZm9ybS1jb250cm9sIHtcbiAgICBib3JkZXItY29sb3I6IEBib3JkZXItY29sb3I7XG4gICAgLmJveC1zaGFkb3coaW5zZXQgMCAxcHggMXB4IHJnYmEoMCwwLDAsLjA3NSkpOyAvLyBSZWRlY2xhcmUgc28gdHJhbnNpdGlvbnMgd29ya1xuICAgICY6Zm9jdXMge1xuICAgICAgYm9yZGVyLWNvbG9yOiBkYXJrZW4oQGJvcmRlci1jb2xvciwgMTAlKTtcbiAgICAgIEBzaGFkb3c6IGluc2V0IDAgMXB4IDFweCByZ2JhKDAsMCwwLC4wNzUpLCAwIDAgNnB4IGxpZ2h0ZW4oQGJvcmRlci1jb2xvciwgMjAlKTtcbiAgICAgIC5ib3gtc2hhZG93KEBzaGFkb3cpO1xuICAgIH1cbiAgfVxuICAvLyBTZXQgdmFsaWRhdGlvbiBzdGF0ZXMgYWxzbyBmb3IgYWRkb25zXG4gIC5pbnB1dC1ncm91cC1hZGRvbiB7XG4gICAgY29sb3I6IEB0ZXh0LWNvbG9yO1xuICAgIGJvcmRlci1jb2xvcjogQGJvcmRlci1jb2xvcjtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAYmFja2dyb3VuZC1jb2xvcjtcbiAgfVxuICAvLyBPcHRpb25hbCBmZWVkYmFjayBpY29uXG4gIC5mb3JtLWNvbnRyb2wtZmVlZGJhY2sge1xuICAgIGNvbG9yOiBAdGV4dC1jb2xvcjtcbiAgfVxufVxuXG5cbi8vIEZvcm0gY29udHJvbCBmb2N1cyBzdGF0ZVxuLy9cbi8vIEdlbmVyYXRlIGEgY3VzdG9taXplZCBmb2N1cyBzdGF0ZSBhbmQgZm9yIGFueSBpbnB1dCB3aXRoIHRoZSBzcGVjaWZpZWQgY29sb3IsXG4vLyB3aGljaCBkZWZhdWx0cyB0byB0aGUgYEBpbnB1dC1ib3JkZXItZm9jdXNgIHZhcmlhYmxlLlxuLy9cbi8vIFdlIGhpZ2hseSBlbmNvdXJhZ2UgeW91IHRvIG5vdCBjdXN0b21pemUgdGhlIGRlZmF1bHQgdmFsdWUsIGJ1dCBpbnN0ZWFkIHVzZVxuLy8gdGhpcyB0byB0d2VhayBjb2xvcnMgb24gYW4gYXMtbmVlZGVkIGJhc2lzLiBUaGlzIGFlc3RoZXRpYyBjaGFuZ2UgaXMgYmFzZWQgb25cbi8vIFdlYktpdCdzIGRlZmF1bHQgc3R5bGVzLCBidXQgYXBwbGljYWJsZSB0byBhIHdpZGVyIHJhbmdlIG9mIGJyb3dzZXJzLiBJdHNcbi8vIHVzYWJpbGl0eSBhbmQgYWNjZXNzaWJpbGl0eSBzaG91bGQgYmUgdGFrZW4gaW50byBhY2NvdW50IHdpdGggYW55IGNoYW5nZS5cbi8vXG4vLyBFeGFtcGxlIHVzYWdlOiBjaGFuZ2UgdGhlIGRlZmF1bHQgYmx1ZSBib3JkZXIgYW5kIHNoYWRvdyB0byB3aGl0ZSBmb3IgYmV0dGVyXG4vLyBjb250cmFzdCBhZ2FpbnN0IGEgZGFyayBncmF5IGJhY2tncm91bmQuXG4uZm9ybS1jb250cm9sLWZvY3VzKEBjb2xvcjogQGlucHV0LWJvcmRlci1mb2N1cykge1xuICBAY29sb3ItcmdiYTogcmdiYShyZWQoQGNvbG9yKSwgZ3JlZW4oQGNvbG9yKSwgYmx1ZShAY29sb3IpLCAuNik7XG4gICY6Zm9jdXMge1xuICAgIGJvcmRlci1jb2xvcjogQGNvbG9yO1xuICAgIG91dGxpbmU6IDA7XG4gICAgLmJveC1zaGFkb3coflwiaW5zZXQgMCAxcHggMXB4IHJnYmEoMCwwLDAsLjA3NSksIDAgMCA4cHggQHtjb2xvci1yZ2JhfVwiKTtcbiAgfVxufVxuXG4vLyBGb3JtIGNvbnRyb2wgc2l6aW5nXG4vL1xuLy8gUmVsYXRpdmUgdGV4dCBzaXplLCBwYWRkaW5nLCBhbmQgYm9yZGVyLXJhZGlpIGNoYW5nZXMgZm9yIGZvcm0gY29udHJvbHMuIEZvclxuLy8gaG9yaXpvbnRhbCBzaXppbmcsIHdyYXAgY29udHJvbHMgaW4gdGhlIHByZWRlZmluZWQgZ3JpZCBjbGFzc2VzLiBgPHNlbGVjdD5gXG4vLyBlbGVtZW50IGdldHMgc3BlY2lhbCBsb3ZlIGJlY2F1c2UgaXQncyBzcGVjaWFsLCBhbmQgdGhhdCdzIGEgZmFjdCFcbi5pbnB1dC1zaXplKEBpbnB1dC1oZWlnaHQ7IEBwYWRkaW5nLXZlcnRpY2FsOyBAcGFkZGluZy1ob3Jpem9udGFsOyBAZm9udC1zaXplOyBAbGluZS1oZWlnaHQ7IEBib3JkZXItcmFkaXVzKSB7XG4gIGhlaWdodDogQGlucHV0LWhlaWdodDtcbiAgcGFkZGluZzogQHBhZGRpbmctdmVydGljYWwgQHBhZGRpbmctaG9yaXpvbnRhbDtcbiAgZm9udC1zaXplOiBAZm9udC1zaXplO1xuICBsaW5lLWhlaWdodDogQGxpbmUtaGVpZ2h0O1xuICBib3JkZXItcmFkaXVzOiBAYm9yZGVyLXJhZGl1cztcblxuICBzZWxlY3QmIHtcbiAgICBoZWlnaHQ6IEBpbnB1dC1oZWlnaHQ7XG4gICAgbGluZS1oZWlnaHQ6IEBpbnB1dC1oZWlnaHQ7XG4gIH1cblxuICB0ZXh0YXJlYSYsXG4gIHNlbGVjdFttdWx0aXBsZV0mIHtcbiAgICBoZWlnaHQ6IGF1dG87XG4gIH1cbn1cbiIsIi8vXG4vLyBCdXR0b25zXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5cbi8vIEJhc2Ugc3R5bGVzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4uYnRuIHtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICBtYXJnaW4tYm90dG9tOiAwOyAvLyBGb3IgaW5wdXQuYnRuXG4gIGZvbnQtd2VpZ2h0OiBAYnRuLWZvbnQtd2VpZ2h0O1xuICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XG4gIHRvdWNoLWFjdGlvbjogbWFuaXB1bGF0aW9uO1xuICBjdXJzb3I6IHBvaW50ZXI7XG4gIGJhY2tncm91bmQtaW1hZ2U6IG5vbmU7IC8vIFJlc2V0IHVudXN1YWwgRmlyZWZveC1vbi1BbmRyb2lkIGRlZmF1bHQgc3R5bGU7IHNlZSBodHRwczovL2dpdGh1Yi5jb20vbmVjb2xhcy9ub3JtYWxpemUuY3NzL2lzc3Vlcy8yMTRcbiAgYm9yZGVyOiAxcHggc29saWQgdHJhbnNwYXJlbnQ7XG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gIC5idXR0b24tc2l6ZShAcGFkZGluZy1iYXNlLXZlcnRpY2FsOyBAcGFkZGluZy1iYXNlLWhvcml6b250YWw7IEBmb250LXNpemUtYmFzZTsgQGxpbmUtaGVpZ2h0LWJhc2U7IEBib3JkZXItcmFkaXVzLWJhc2UpO1xuICAudXNlci1zZWxlY3Qobm9uZSk7XG5cbiAgJixcbiAgJjphY3RpdmUsXG4gICYuYWN0aXZlIHtcbiAgICAmOmZvY3VzLFxuICAgICYuZm9jdXMge1xuICAgICAgLnRhYi1mb2N1cygpO1xuICAgIH1cbiAgfVxuXG4gICY6aG92ZXIsXG4gICY6Zm9jdXMsXG4gICYuZm9jdXMge1xuICAgIGNvbG9yOiBAZ3JheS1saWdodGVyO1xuICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTtcbiAgfVxuXG4gICY6YWN0aXZlLFxuICAmLmFjdGl2ZSB7XG4gICAgb3V0bGluZTogMDtcbiAgICBiYWNrZ3JvdW5kLWltYWdlOiBub25lO1xuICAgIC5ib3gtc2hhZG93KGluc2V0IDAgM3B4IDVweCByZ2JhKDAsMCwwLC4xMjUpKTtcbiAgfVxuXG4gICYuZGlzYWJsZWQsXG4gICZbZGlzYWJsZWRdLFxuICBmaWVsZHNldFtkaXNhYmxlZF0gJiB7XG4gICAgY3Vyc29yOiBAY3Vyc29yLWRpc2FibGVkO1xuICAgIHBvaW50ZXItZXZlbnRzOiBub25lOyAvLyBGdXR1cmUtcHJvb2YgZGlzYWJsaW5nIG9mIGNsaWNrc1xuICAgIC5vcGFjaXR5KC42NSk7XG4gICAgLmJveC1zaGFkb3cobm9uZSk7XG4gIH1cbn1cblxuXG4vLyBBbHRlcm5hdGUgYnV0dG9uc1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLmJ0bi1kZWZhdWx0IHtcbiAgLmJ1dHRvbi12YXJpYW50KEBidG4tZGVmYXVsdC1jb2xvcjsgQGJ0bi1kZWZhdWx0LWJnOyBAYnRuLWRlZmF1bHQtYm9yZGVyKTtcbn1cbi5idG4tcHJpbWFyeSB7XG4gIC5idXR0b24tdmFyaWFudChAYnRuLXByaW1hcnktY29sb3I7IEBidG4tcHJpbWFyeS1iZzsgQGJ0bi1wcmltYXJ5LWJvcmRlcik7XG59XG4vLyBTdWNjZXNzIGFwcGVhcnMgYXMgZ3JlZW5cbi5idG4tc3VjY2VzcyB7XG4gIC5idXR0b24tdmFyaWFudChAYnRuLXN1Y2Nlc3MtY29sb3I7IEBidG4tc3VjY2Vzcy1iZzsgQGJ0bi1zdWNjZXNzLWJvcmRlcik7XG59XG4vLyBJbmZvIGFwcGVhcnMgYXMgYmx1ZS1ncmVlblxuLmJ0bi1pbmZvIHtcbiAgLmJ1dHRvbi12YXJpYW50KEBidG4taW5mby1jb2xvcjsgQGJ0bi1pbmZvLWJnOyBAYnRuLWluZm8tYm9yZGVyKTtcbn1cbi8vIFdhcm5pbmcgYXBwZWFycyBhcyBvcmFuZ2Vcbi5idG4td2FybmluZyB7XG4gIC5idXR0b24tdmFyaWFudChAYnRuLXdhcm5pbmctY29sb3I7IEBidG4td2FybmluZy1iZzsgQGJ0bi13YXJuaW5nLWJvcmRlcik7XG59XG4vLyBEYW5nZXIgYW5kIGVycm9yIGFwcGVhciBhcyByZWRcbi5idG4tZGFuZ2VyIHtcbiAgLmJ1dHRvbi12YXJpYW50KEBidG4tZGFuZ2VyLWNvbG9yOyBAYnRuLWRhbmdlci1iZzsgQGJ0bi1kYW5nZXItYm9yZGVyKTtcbn1cblxuXG4vLyBMaW5rIGJ1dHRvbnNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLy8gTWFrZSBhIGJ1dHRvbiBsb29rIGFuZCBiZWhhdmUgbGlrZSBhIGxpbmtcbi5idG4tbGluayB7XG4gIGNvbG9yOiBAbGluay1jb2xvcjtcbiAgZm9udC13ZWlnaHQ6IG5vcm1hbDtcbiAgYm9yZGVyLXJhZGl1czogMDtcblxuICAmLFxuICAmOmFjdGl2ZSxcbiAgJi5hY3RpdmUsXG4gICZbZGlzYWJsZWRdLFxuICBmaWVsZHNldFtkaXNhYmxlZF0gJiB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7XG4gICAgLmJveC1zaGFkb3cobm9uZSk7XG4gIH1cbiAgJixcbiAgJjpob3ZlcixcbiAgJjpmb2N1cyxcbiAgJjphY3RpdmUge1xuICAgIGJvcmRlci1jb2xvcjogdHJhbnNwYXJlbnQ7XG4gIH1cbiAgJjpob3ZlcixcbiAgJjpmb2N1cyB7XG4gICAgY29sb3I6IEBsaW5rLWhvdmVyLWNvbG9yO1xuICAgIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lO1xuICAgIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50O1xuICB9XG4gICZbZGlzYWJsZWRdLFxuICBmaWVsZHNldFtkaXNhYmxlZF0gJiB7XG4gICAgJjpob3ZlcixcbiAgICAmOmZvY3VzIHtcbiAgICAgIGNvbG9yOiBAYnRuLWxpbmstZGlzYWJsZWQtY29sb3I7XG4gICAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7XG4gICAgfVxuICB9XG59XG5cblxuLy8gQnV0dG9uIFNpemVzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4uYnRuLWxnIHtcbiAgLy8gbGluZS1oZWlnaHQ6IGVuc3VyZSBldmVuLW51bWJlcmVkIGhlaWdodCBvZiBidXR0b24gbmV4dCB0byBsYXJnZSBpbnB1dFxuICAuYnV0dG9uLXNpemUoQHBhZGRpbmctbGFyZ2UtdmVydGljYWw7IEBwYWRkaW5nLWxhcmdlLWhvcml6b250YWw7IEBmb250LXNpemUtbGFyZ2U7IEBsaW5lLWhlaWdodC1sYXJnZTsgQGJvcmRlci1yYWRpdXMtbGFyZ2UpO1xufVxuLmJ0bi1zbSB7XG4gIC8vIGxpbmUtaGVpZ2h0OiBlbnN1cmUgcHJvcGVyIGhlaWdodCBvZiBidXR0b24gbmV4dCB0byBzbWFsbCBpbnB1dFxuICAuYnV0dG9uLXNpemUoQHBhZGRpbmctc21hbGwtdmVydGljYWw7IEBwYWRkaW5nLXNtYWxsLWhvcml6b250YWw7IEBmb250LXNpemUtc21hbGw7IEBsaW5lLWhlaWdodC1zbWFsbDsgQGJvcmRlci1yYWRpdXMtc21hbGwpO1xufVxuLmJ0bi14cyB7XG4gIC5idXR0b24tc2l6ZShAcGFkZGluZy14cy12ZXJ0aWNhbDsgQHBhZGRpbmcteHMtaG9yaXpvbnRhbDsgQGZvbnQtc2l6ZS1zbWFsbDsgQGxpbmUtaGVpZ2h0LXNtYWxsOyBAYm9yZGVyLXJhZGl1cy1zbWFsbCk7XG59XG5cblxuLy8gQmxvY2sgYnV0dG9uXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4uYnRuLWJsb2NrIHtcbiAgZGlzcGxheTogYmxvY2s7XG4gIHdpZHRoOiAxMDAlO1xufVxuXG4vLyBWZXJ0aWNhbGx5IHNwYWNlIG91dCBtdWx0aXBsZSBibG9jayBidXR0b25zXG4uYnRuLWJsb2NrICsgLmJ0bi1ibG9jayB7XG4gIG1hcmdpbi10b3A6IDVweDtcbn1cblxuLy8gU3BlY2lmaWNpdHkgb3ZlcnJpZGVzXG5pbnB1dFt0eXBlPVwic3VibWl0XCJdLFxuaW5wdXRbdHlwZT1cInJlc2V0XCJdLFxuaW5wdXRbdHlwZT1cImJ1dHRvblwiXSB7XG4gICYuYnRuLWJsb2NrIHtcbiAgICB3aWR0aDogMTAwJTtcbiAgfVxufVxuIiwiLy8gQnV0dG9uIHZhcmlhbnRzXG4vL1xuLy8gRWFzaWx5IHB1bXAgb3V0IGRlZmF1bHQgc3R5bGVzLCBhcyB3ZWxsIGFzIDpob3ZlciwgOmZvY3VzLCA6YWN0aXZlLFxuLy8gYW5kIGRpc2FibGVkIG9wdGlvbnMgZm9yIGFsbCBidXR0b25zXG5cbi5idXR0b24tdmFyaWFudChAY29sb3I7IEBiYWNrZ3JvdW5kOyBAYm9yZGVyKSB7XG4gIGNvbG9yOiBAY29sb3I7XG4gIGJhY2tncm91bmQtY29sb3I6IEBiYWNrZ3JvdW5kO1xuICBib3JkZXItY29sb3I6IEBib3JkZXI7XG5cbiAgJjpob3ZlcixcbiAgJjpmb2N1cyxcbiAgJi5mb2N1cyxcbiAgJjphY3RpdmUsXG4gICYuYWN0aXZlLFxuICAub3BlbiA+IC5kcm9wZG93bi10b2dnbGUmIHtcbiAgICBjb2xvcjogQGdyYXktbGlnaHRlcjtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAYmFja2dyb3VuZDtcbiAgICAgICAgYm9yZGVyLWNvbG9yOiBkYXJrZW4oQGJvcmRlciwgMTIlKTtcbiAgfVxuICAmOmFjdGl2ZSxcbiAgJi5hY3RpdmUsXG4gIC5vcGVuID4gLmRyb3Bkb3duLXRvZ2dsZSYge1xuICAgIGJhY2tncm91bmQtaW1hZ2U6IG5vbmU7XG4gIH1cbiAgJi5kaXNhYmxlZCxcbiAgJltkaXNhYmxlZF0sXG4gIGZpZWxkc2V0W2Rpc2FibGVkXSAmIHtcbiAgICAmLFxuICAgICY6aG92ZXIsXG4gICAgJjpmb2N1cyxcbiAgICAmLmZvY3VzLFxuICAgICY6YWN0aXZlLFxuICAgICYuYWN0aXZlIHtcbiAgICAgIGJhY2tncm91bmQtY29sb3I6IEBiYWNrZ3JvdW5kO1xuICAgICAgICAgIGJvcmRlci1jb2xvcjogQGJvcmRlcjtcbiAgICB9XG4gIH1cblxuICAuYmFkZ2Uge1xuICAgIGNvbG9yOiBAYmFja2dyb3VuZDtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAY29sb3I7XG4gIH1cbn1cblxuLy8gQnV0dG9uIHNpemVzXG4uYnV0dG9uLXNpemUoQHBhZGRpbmctdmVydGljYWw7IEBwYWRkaW5nLWhvcml6b250YWw7IEBmb250LXNpemU7IEBsaW5lLWhlaWdodDsgQGJvcmRlci1yYWRpdXMpIHtcbiAgcGFkZGluZzogQHBhZGRpbmctdmVydGljYWwgQHBhZGRpbmctaG9yaXpvbnRhbDtcbiAgZm9udC1zaXplOiBAZm9udC1zaXplO1xuICBsaW5lLWhlaWdodDogQGxpbmUtaGVpZ2h0O1xuICBib3JkZXItcmFkaXVzOiBAYm9yZGVyLXJhZGl1cztcbn1cbiIsIi8vIHNvdXJjZWQgZnJvbSBodHRwczovL2dpdGh1Yi5jb20vQ29kZVNldmVuL3RvYXN0clxuLy8gTUlUIGxpY2Vuc2Vcbi8vIE1peC1pbnNcbi5ib3JkZXJSYWRpdXMoQHJhZGl1cykge1xuICAgIC1tb3otYm9yZGVyLXJhZGl1czogQHJhZGl1cztcbiAgICAtd2Via2l0LWJvcmRlci1yYWRpdXM6IEByYWRpdXM7XG4gICAgYm9yZGVyLXJhZGl1czogQHJhZGl1cztcbn1cblxuLmJveFNoYWRvdyhAYm94U2hhZG93KSB7XG4gICAgLW1vei1ib3gtc2hhZG93OiBAYm94U2hhZG93O1xuICAgIC13ZWJraXQtYm94LXNoYWRvdzogQGJveFNoYWRvdztcbiAgICBib3gtc2hhZG93OiBAYm94U2hhZG93O1xufVxuXG4ub3BhY2l0eShAb3BhY2l0eSkge1xuICAgIEBvcGFjaXR5UGVyY2VudDogQG9wYWNpdHkgKiAxMDA7XG4gICAgb3BhY2l0eTogQG9wYWNpdHk7XG4gICAgLW1zLWZpbHRlcjogflwicHJvZ2lkOkRYSW1hZ2VUcmFuc2Zvcm0uTWljcm9zb2Z0LkFscGhhKE9wYWNpdHk9QHtvcGFjaXR5UGVyY2VudH0pXCI7XG4gICAgZmlsdGVyOiB+XCJhbHBoYShvcGFjaXR5PUB7b3BhY2l0eVBlcmNlbnR9KVwiO1xufVxuXG4ud29yZFdyYXAoQHdvcmRXcmFwOiBicmVhay13b3JkKSB7XG4gICAgLW1zLXdvcmQtd3JhcDogQHdvcmRXcmFwO1xuICAgIHdvcmQtd3JhcDogQHdvcmRXcmFwO1xufVxuXG4vLyBWYXJpYWJsZXNcbkBibGFjazogIzAwMDAwMDtcbkBncmV5OiAjOTk5OTk5O1xuQGxpZ2h0LWdyZXk6ICNDQ0NDQ0M7XG5Ad2hpdGU6ICNGRkZGRkY7XG5AbmVhci1ibGFjazogIzAzMDMwMztcbkBncmVlbjogIzUxQTM1MTtcbkByZWQ6ICNCRDM2MkY7XG5AYmx1ZTogIzJGOTZCNDtcbkBvcmFuZ2U6ICNGODk0MDY7XG5AZGVmYXVsdC1jb250YWluZXItb3BhY2l0eTogLjg7XG5cbi8vIFN0eWxlc1xuLnRvYXN0LXRpdGxlIHtcbiAgICBmb250LXdlaWdodDogYm9sZDtcbn1cblxuLnRvYXN0LW1lc3NhZ2Uge1xuICAgIC53b3JkV3JhcCgpO1xuXG4gICAgYSxcbiAgICBsYWJlbCB7XG4gICAgICAgIGNvbG9yOiBAd2hpdGU7XG4gICAgfVxuXG4gICAgICAgIGE6aG92ZXIge1xuICAgICAgICAgICAgY29sb3I6IEBsaWdodC1ncmV5O1xuICAgICAgICAgICAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xuICAgICAgICB9XG59XG5cbi50b2FzdC1jbG9zZS1idXR0b24ge1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICByaWdodDogLTAuM2VtO1xuICAgIHRvcDogLTAuM2VtO1xuICAgIGZsb2F0OiByaWdodDtcbiAgICBmb250LXNpemU6IDIwcHg7XG4gICAgZm9udC13ZWlnaHQ6IGJvbGQ7XG4gICAgY29sb3I6IEB3aGl0ZTtcbiAgICAtd2Via2l0LXRleHQtc2hhZG93OiAwIDFweCAwIHJnYmEoMjU1LDI1NSwyNTUsMSk7XG4gICAgdGV4dC1zaGFkb3c6IDAgMXB4IDAgcmdiYSgyNTUsMjU1LDI1NSwxKTtcbiAgICAub3BhY2l0eSgwLjgpO1xuXG4gICAgJjpob3ZlcixcbiAgICAmOmZvY3VzIHtcbiAgICAgICAgY29sb3I6IEBibGFjaztcbiAgICAgICAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xuICAgICAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgICAgIC5vcGFjaXR5KDAuNCk7XG4gICAgfVxufVxuXG4vKkFkZGl0aW9uYWwgcHJvcGVydGllcyBmb3IgYnV0dG9uIHZlcnNpb25cbiBpT1MgcmVxdWlyZXMgdGhlIGJ1dHRvbiBlbGVtZW50IGluc3RlYWQgb2YgYW4gYW5jaG9yIHRhZy5cbiBJZiB5b3Ugd2FudCB0aGUgYW5jaG9yIHZlcnNpb24sIGl0IHJlcXVpcmVzIGBocmVmPVwiI1wiYC4qL1xuYnV0dG9uLnRvYXN0LWNsb3NlLWJ1dHRvbiB7XG4gICAgcGFkZGluZzogMDtcbiAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG4gICAgYm9yZGVyOiAwO1xuICAgIC13ZWJraXQtYXBwZWFyYW5jZTogbm9uZTtcbn1cblxuLy8jZW5kcmVnaW9uXG5cbi50b2FzdC10b3AtY2VudGVyIHtcbiAgICB0b3A6IDA7XG4gICAgcmlnaHQ6IDA7XG4gICAgd2lkdGg6IDEwMCU7XG59XG5cbi50b2FzdC1ib3R0b20tY2VudGVyIHtcbiAgICBib3R0b206IDA7XG4gICAgcmlnaHQ6IDA7XG4gICAgd2lkdGg6IDEwMCU7XG59XG5cbi50b2FzdC10b3AtZnVsbC13aWR0aCB7XG4gICAgdG9wOiAwO1xuICAgIHJpZ2h0OiAwO1xuICAgIHdpZHRoOiAxMDAlO1xufVxuXG4udG9hc3QtYm90dG9tLWZ1bGwtd2lkdGgge1xuICAgIGJvdHRvbTogMDtcbiAgICByaWdodDogMDtcbiAgICB3aWR0aDogMTAwJTtcbn1cblxuLnRvYXN0LXRvcC1sZWZ0IHtcbiAgICB0b3A6IDEycHg7XG4gICAgbGVmdDogMTJweDtcbn1cblxuLnRvYXN0LXRvcC1yaWdodCB7XG4gICAgdG9wOiAxMnB4O1xuICAgIHJpZ2h0OiAxMnB4O1xufVxuXG4udG9hc3QtYm90dG9tLXJpZ2h0IHtcbiAgICByaWdodDogMTJweDtcbiAgICBib3R0b206IDEycHg7XG59XG5cbi50b2FzdC1ib3R0b20tbGVmdCB7XG4gICAgYm90dG9tOiAxMnB4O1xuICAgIGxlZnQ6IDEycHg7XG59XG5cbiN0b2FzdC1jb250YWluZXIge1xuICAgIHBvc2l0aW9uOiBmaXhlZDtcbiAgICB6LWluZGV4OiA5OTk5OTk7XG4gICAgLy8gVGhlIGNvbnRhaW5lciBzaG91bGQgbm90IGJlIGNsaWNrYWJsZS5cbiAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcbiAgICAqIHtcbiAgICAgICAgLW1vei1ib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgICAgICAtd2Via2l0LWJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgfVxuXG4gICAgPiBkaXYge1xuICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgICAgIC8vIFRoZSB0b2FzdCBpdHNlbGYgc2hvdWxkIGJlIGNsaWNrYWJsZS5cbiAgICAgICAgcG9pbnRlci1ldmVudHM6IGF1dG87XG4gICAgICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgICAgIG1hcmdpbjogMCAwIDZweDtcbiAgICAgICAgcGFkZGluZzogMTVweCAxNXB4IDE1cHggNTBweDtcbiAgICAgICAgd2lkdGg6IDMwMHB4O1xuICAgICAgICAuYm9yZGVyUmFkaXVzKDNweCAzcHggM3B4IDNweCk7XG4gICAgICAgIGJhY2tncm91bmQtcG9zaXRpb246IDE1cHggY2VudGVyO1xuICAgICAgICBiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0O1xuICAgICAgICAuYm94U2hhZG93KDAgMCAxMnB4IEBncmV5KTtcbiAgICAgICAgY29sb3I6IEB3aGl0ZTtcbiAgICAgICAgLm9wYWNpdHkoQGRlZmF1bHQtY29udGFpbmVyLW9wYWNpdHkpO1xuICAgIH1cblxuICAgID4gOmhvdmVyIHtcbiAgICAgICAgLmJveFNoYWRvdygwIDAgMTJweCBAYmxhY2spO1xuICAgICAgICAub3BhY2l0eSgxKTtcbiAgICAgICAgY3Vyc29yOiBwb2ludGVyO1xuICAgIH1cblxuICAgID4gLnRvYXN0LWluZm8ge1xuICAgICAgICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoXCJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUJnQUFBQVlDQVlBQUFEZ2R6MzRBQUFBQVhOU1IwSUFyczRjNlFBQUFBUm5RVTFCQUFDeGp3djhZUVVBQUFBSmNFaFpjd0FBRHNNQUFBN0RBY2R2cUdRQUFBR3dTVVJCVkVoTHRaYTlTZ05CRU1jOXNVeHhSY29VS1N6U1dJaFhwRk1oaFlXRmhhQmc0eVBZaVdDWFp4QkxFUnNMUlMzRVFrRWZ3Q0tkaldKQXdTS0Nnb0tDY3VkdjRPNVlMcnQ3RXpnWGhpVTMvNCtiMmNrbXdWakpTcEtrUTZ3QWk0Z3doVCt6M3dSQmNFejB5alNzZVVUcmNSeWZzSHNYbUQwQW1iSE9DOUlpOFZJbW51WEJQZ2xIcFE1d3dTVk03c05uVEc3WmE0SndEZENqeHlBaUgzbnlBMm10YVRKdWZpRFo1ZENhcWxJdElMaDFOSGF0Zk41c2t2ang5WjM4bTY5Q2d6dVhtWmdWclBJR0U3NjNKeDlxS3NSb3pXWXc2eE9IZEVSK25uMktrTytCYitVVjVDQk42V0M2UXRCZ2JSVm96cmFoQWJtbTZIdFVzZ3RQQzE5dEZkeFhaWUJPZmtibUZKMVZhSEExVkFIamQwcHA3MG9UWnp2UitFVnJ4MllnZmRzcTZldTU1QkhZUjhobGNraStuK2tFUlVGRzhCckEwQndqZUF2Mk04V0xRQnRjeStTRDZmTnNtbkIzQWxCTHJnVHRWVzFjMlFONGJWV0xBVGFJUzYwSjJEdTV5MVRpSmdqU0J2RlZaZ1Rtd0NVK2RBWkZvUHhHRUVzOG55SEM5QndlMkd2RUp2MldYWmIwdmpkeUZUNEN4azNlL2tJcWxPR29WTHd3UGV2cFlIVCswMFQraFd3WERmNEFKQU9VcVdjRGhid0FBQUFBU1VWT1JLNUNZSUk9XCIpICFpbXBvcnRhbnQ7XG4gICAgfVxuXG4gICAgPiAudG9hc3QtZXJyb3Ige1xuICAgICAgICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoXCJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUJnQUFBQVlDQVlBQUFEZ2R6MzRBQUFBQVhOU1IwSUFyczRjNlFBQUFBUm5RVTFCQUFDeGp3djhZUVVBQUFBSmNFaFpjd0FBRHNNQUFBN0RBY2R2cUdRQUFBSE9TVVJCVkVoTHJaYS9TZ05CRU1aemgwV0tDQ2xTQ0thSVlPRUQrQUFLZVFRTEc4SFd6dExDSW1CcllhZGdJZFkrZ0lLTllrQkZTd3U3Q0FvcUNna2tvR0JJL0UyOFBkYkxabWVETGd6WnpjeDgzL3paMlNTWEMxajlmcitJMUhxOTNnMnl4SDRpd00xdmtvQldBZHhDbXB6VHhma04yUmN5Wk5hSEZJa1NvMTArOGtneGtYSVVSVjVIR3hUbUZ1Yzc1QjJSZlFrcHhIRzhhQWdhQUZhMHRBSHFZRmZRN0l3ZTJ5aE9EazgrSjRDN3lBb1JUV0kzdy80a2xHUmdSNGxPN1JwbjkrZ3ZNeVdwK3V4Rmg4K0grQVJsZ04xbkp1SnVRQVl2TmtFbndHRmNrMThFcjRxM2VnRWMvb08rbWhMZEtnUnloZE5GaWFjQzBybE9DYmhOVno0SDlGbkFZZ0RCdlUzUUlpb1psSkZMSnRzb0hZUkRmaVpvVXlJeHFDdFJwVmxBTnEwRVU0ZEFwanJ0Z2V6UEZhZDVTMTlXZ2prYzBoTlZudUY0SGpWQTZDN1FyU0lieWxCK29aZTNhSGdCc3FsTnFLWUg0OGpYeUpLTXVBYml5Vko4S3phQjNlUmMwcGc5VndRNG5pRnJ5STY4cWlPaTNBYmp3ZHNmbkF0azBiQ2pUTEpLcjZtckQ5ZzhpcS9TL0I4MWhndU9NbFFUblZ5RzQwd0Fjam5tZ3NDTkVTRHJqbWU3d2ZmdFA0UDdTUDROM0NKWmR2em9OeUdxMmMvSFdPWEpHc3ZWZytSQS9rMk1DL3dONkkyWUEyUHQ4R2tBQUFBQVNVVk9SSzVDWUlJPVwiKSAhaW1wb3J0YW50O1xuICAgIH1cblxuICAgID4gLnRvYXN0LXN1Y2Nlc3Mge1xuICAgICAgICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoXCJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUJnQUFBQVlDQVlBQUFEZ2R6MzRBQUFBQVhOU1IwSUFyczRjNlFBQUFBUm5RVTFCQUFDeGp3djhZUVVBQUFBSmNFaFpjd0FBRHNNQUFBN0RBY2R2cUdRQUFBRHNTVVJCVkVoTFkyQVlCZlFNZ2YvLy8zUDgrL2V2QUlndkEvRnNJRitCYXZZRERXTUJHcm9hU01NQmlFOFZDN0FaRHJJRmFNRm5paTNBWlRqVWdzVVVXVURBOE9kQUg2aVFiUUVodzRIeUdzUEVjS0JYQklDNEFSaGV4NEc0QnNqbXdlVTFzb0lGYUdnL1d0b0ZaUklaZEV2SU1oeGtDQ2pYSVZzQVRWNmdGR0FDczRSc3cwRUdnSUlIM1FKWUpnSFNBUlFaRHJXQUIramF3emdzK1EyVU80OUQ3am5SU1JHb0VGUklMY2RtRU1XR0kwY20wSkoyUXBZQTFSRHZjbXpKRVdoQUJoRC9wcXJMMFMwQ1d1QUJLZ25Sa2k5bExzZVM3ZzJBbHF3SFdRU0tING9LTHJJTHBSR2hFUUN3MkxpUlVJYTRsd0FBQUFCSlJVNUVya0pnZ2c9PVwiKSAhaW1wb3J0YW50O1xuICAgIH1cblxuICAgID4gLnRvYXN0LXdhcm5pbmcge1xuICAgICAgICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoXCJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUJnQUFBQVlDQVlBQUFEZ2R6MzRBQUFBQVhOU1IwSUFyczRjNlFBQUFBUm5RVTFCQUFDeGp3djhZUVVBQUFBSmNFaFpjd0FBRHNNQUFBN0RBY2R2cUdRQUFBR1lTVVJCVkVoTDVaU3ZUc05RRk1iWFpHSUNNWUdZbUpoQVFJSkFJQ1lRUEFBQ2lTREI4QWlJQ1FRSlQ0Q3FRRXdnSnZZQVNBUUNpWmlZbUpoQUlCQVRDQVJKeSs5clRzbGRkOHNLdTFNMCtkTGIwNTd2Ni9sYnEvMnJLMG1TL1RSTmo5Y1dOQUtQWUlKSUk3Z0l4Q2NRNTFjdnFJRCtHSUVYOEFTRzRCMWJLNWdJWkZlUWZvSmRFWE9mZ1g0UUFRZzdrSDJBNjV5UTg3bHl4YjI3c2dna0F6QXVGaGJiZzFLMmtnQ2tCMWJWd3lJUjltMkw3UFJQSWhEVUlYZ0d0eUt3NTc1eXozbFROczZYNEpYbmpWK0xLTS9tM015ZG5UYnRPS0lqdHo2VmhDQnE0dlNtM25jZHJEMmxrMFZnVVhTVktqVkRKWEp6aWpXMVJRZHNVN0Y3N0hlOHU2OGtvTlpUejhPejV5R2E2SjNIM2xaMHhZZ1hCSzJReW1sV1dBK1JXblloc2tMQnYydm1FK2hCTUN0YkE3S1g1ZHJXeVJULzJKc3FaMkl2ZkI5WTRiV0ROTUZiSlJGbUM5RTc0U29TMENxdWx3amtDMCs1YnBjVjFDWjhOTWVqNHBqeTBVK2RvRFFzR3lvMWh6Vkp0dElqaFE3R25CdFJGTjFVYXJVbEg4RjN4aWN0K0hZMDdyRXpvVUdQbFdjalJGUnI0L2dDaFpnYzNaTDJkOG9BQUFBQVNVVk9SSzVDWUlJPVwiKSAhaW1wb3J0YW50O1xuICAgIH1cblxuICAgIC8qb3ZlcnJpZGVzKi9cbiAgICAmLnRvYXN0LXRvcC1jZW50ZXIgPiBkaXYsXG4gICAgJi50b2FzdC1ib3R0b20tY2VudGVyID4gZGl2IHtcbiAgICAgICAgd2lkdGg6IDMwMHB4O1xuICAgICAgICBtYXJnaW4tbGVmdDogYXV0bztcbiAgICAgICAgbWFyZ2luLXJpZ2h0OiBhdXRvO1xuICAgIH1cblxuICAgICYudG9hc3QtdG9wLWZ1bGwtd2lkdGggPiBkaXYsXG4gICAgJi50b2FzdC1ib3R0b20tZnVsbC13aWR0aCA+IGRpdiB7XG4gICAgICAgIHdpZHRoOiA5NiU7XG4gICAgICAgIG1hcmdpbi1sZWZ0OiBhdXRvO1xuICAgICAgICBtYXJnaW4tcmlnaHQ6IGF1dG87XG4gICAgfVxufVxuXG4udG9hc3Qge1xuICAgIGJhY2tncm91bmQtY29sb3I6IEBuZWFyLWJsYWNrO1xufVxuXG4udG9hc3Qtc3VjY2VzcyB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogQGdyZWVuO1xufVxuXG4udG9hc3QtZXJyb3Ige1xuICAgIGJhY2tncm91bmQtY29sb3I6IEByZWQ7XG59XG5cbi50b2FzdC1pbmZvIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAYmx1ZTtcbn1cblxuLnRvYXN0LXdhcm5pbmcge1xuICAgIGJhY2tncm91bmQtY29sb3I6IEBvcmFuZ2U7XG59XG5cbi50b2FzdC1wcm9ncmVzcyB7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIGxlZnQ6IDA7XG4gICAgYm90dG9tOiAwO1xuICAgIGhlaWdodDogNHB4O1xuICAgIGJhY2tncm91bmQtY29sb3I6IEBibGFjaztcbiAgICAub3BhY2l0eSgwLjQpO1xufVxuXG4vKlJlc3BvbnNpdmUgRGVzaWduKi9cblxuQG1lZGlhIGFsbCBhbmQgKG1heC13aWR0aDogMjQwcHgpIHtcbiAgICAjdG9hc3QtY29udGFpbmVyIHtcblxuICAgICAgICA+IGRpdiB7XG4gICAgICAgICAgICBwYWRkaW5nOiA4cHggOHB4IDhweCA1MHB4O1xuICAgICAgICAgICAgd2lkdGg6IDExZW07XG4gICAgICAgIH1cblxuICAgICAgICAmIC50b2FzdC1jbG9zZS1idXR0b24ge1xuICAgICAgICAgICAgcmlnaHQ6IC0wLjJlbTtcbiAgICAgICAgICAgIHRvcDogLTAuMmVtO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5AbWVkaWEgYWxsIGFuZCAobWluLXdpZHRoOiAyNDFweCkgYW5kIChtYXgtd2lkdGg6IDQ4MHB4KSB7XG4gICAgI3RvYXN0LWNvbnRhaW5lciB7XG4gICAgICAgID4gZGl2IHtcbiAgICAgICAgICAgIHBhZGRpbmc6IDhweCA4cHggOHB4IDUwcHg7XG4gICAgICAgICAgICB3aWR0aDogMThlbTtcbiAgICAgICAgfVxuXG4gICAgICAgICYgLnRvYXN0LWNsb3NlLWJ1dHRvbiB7XG4gICAgICAgICAgICByaWdodDogLTAuMmVtO1xuICAgICAgICAgICAgdG9wOiAtMC4yZW07XG4gICAgICAgIH1cbiAgICB9XG59XG5cbkBtZWRpYSBhbGwgYW5kIChtaW4td2lkdGg6IDQ4MXB4KSBhbmQgKG1heC13aWR0aDogNzY4cHgpIHtcbiAgICAjdG9hc3QtY29udGFpbmVyIHtcbiAgICAgICAgPiBkaXYge1xuICAgICAgICAgICAgcGFkZGluZzogMTVweCAxNXB4IDE1cHggNTBweDtcbiAgICAgICAgICAgIHdpZHRoOiAyNWVtO1xuICAgICAgICB9XG4gICAgfVxufVxuIiwiLy9cbi8vIEJ1dHRvbiBncm91cHNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8vIE1ha2UgdGhlIGRpdiBiZWhhdmUgbGlrZSBhIGJ1dHRvblxuLmJ0bi1ncm91cCxcbi5idG4tZ3JvdXAtdmVydGljYWwge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsgLy8gbWF0Y2ggLmJ0biBhbGlnbm1lbnQgZ2l2ZW4gZm9udC1zaXplIGhhY2sgYWJvdmVcbiAgPiAuYnRuIHtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgZmxvYXQ6IGxlZnQ7XG4gICAgLy8gQnJpbmcgdGhlIFwiYWN0aXZlXCIgYnV0dG9uIHRvIHRoZSBmcm9udFxuICAgICY6aG92ZXIsXG4gICAgJjpmb2N1cyxcbiAgICAmOmFjdGl2ZSxcbiAgICAmLmFjdGl2ZSB7XG4gICAgICB6LWluZGV4OiAyO1xuICAgIH1cbiAgICAmOmZvY3VzIHtcbiAgICAgIC8vIFJlbW92ZSBmb2N1cyBvdXRsaW5lIHdoZW4gZHJvcGRvd24gSlMgYWRkcyBpdCBhZnRlciBjbG9zaW5nIHRoZSBtZW51XG4gICAgICBvdXRsaW5lOiAwO1xuICAgIH1cbiAgfVxufVxuXG4vLyBQcmV2ZW50IGRvdWJsZSBib3JkZXJzIHdoZW4gYnV0dG9ucyBhcmUgbmV4dCB0byBlYWNoIG90aGVyXG4uYnRuLWdyb3VwIHtcbiAgLmJ0biArIC5idG4sXG4gIC5idG4gKyAuYnRuLWdyb3VwLFxuICAuYnRuLWdyb3VwICsgLmJ0bixcbiAgLmJ0bi1ncm91cCArIC5idG4tZ3JvdXAge1xuICAgIG1hcmdpbi1sZWZ0OiAtMXB4O1xuICB9XG59XG5cbi8vIE9wdGlvbmFsOiBHcm91cCBtdWx0aXBsZSBidXR0b24gZ3JvdXBzIHRvZ2V0aGVyIGZvciBhIHRvb2xiYXJcbi5idG4tdG9vbGJhciB7XG4gIG1hcmdpbi1sZWZ0OiAtNXB4OyAvLyBPZmZzZXQgdGhlIGZpcnN0IGNoaWxkJ3MgbWFyZ2luXG4gICY6ZXh0ZW5kKC5jbGVhcmZpeCBhbGwpO1xuXG4gIC5idG4tZ3JvdXAsXG4gIC5pbnB1dC1ncm91cCB7XG4gICAgZmxvYXQ6IGxlZnQ7XG4gIH1cbiAgPiAuYnRuLFxuICA+IC5idG4tZ3JvdXAsXG4gID4gLmlucHV0LWdyb3VwIHtcbiAgICBtYXJnaW4tbGVmdDogNXB4O1xuICB9XG59XG5cbi5idG4tZ3JvdXAgPiAuYnRuOm5vdCg6Zmlyc3QtY2hpbGQpOm5vdCg6bGFzdC1jaGlsZCk6bm90KC5kcm9wZG93bi10b2dnbGUpIHtcbiAgYm9yZGVyLXJhZGl1czogMDtcbn1cblxuLy8gU2V0IGNvcm5lcnMgaW5kaXZpZHVhbCBiZWNhdXNlIHNvbWV0aW1lcyBhIHNpbmdsZSBidXR0b24gY2FuIGJlIGluIGEgLmJ0bi1ncm91cCBhbmQgd2UgbmVlZCA6Zmlyc3QtY2hpbGQgYW5kIDpsYXN0LWNoaWxkIHRvIGJvdGggbWF0Y2hcbi5idG4tZ3JvdXAgPiAuYnRuOmZpcnN0LWNoaWxkIHtcbiAgbWFyZ2luLWxlZnQ6IDA7XG4gICY6bm90KDpsYXN0LWNoaWxkKTpub3QoLmRyb3Bkb3duLXRvZ2dsZSkge1xuICAgIC5ib3JkZXItcmlnaHQtcmFkaXVzKDApO1xuICB9XG59XG4vLyBOZWVkIC5kcm9wZG93bi10b2dnbGUgc2luY2UgOmxhc3QtY2hpbGQgZG9lc24ndCBhcHBseSBnaXZlbiBhIC5kcm9wZG93bi1tZW51IGltbWVkaWF0ZWx5IGFmdGVyIGl0XG4uYnRuLWdyb3VwID4gLmJ0bjpsYXN0LWNoaWxkOm5vdCg6Zmlyc3QtY2hpbGQpLFxuLmJ0bi1ncm91cCA+IC5kcm9wZG93bi10b2dnbGU6bm90KDpmaXJzdC1jaGlsZCkge1xuICAuYm9yZGVyLWxlZnQtcmFkaXVzKDApO1xufVxuXG4vLyBDdXN0b20gZWRpdHMgZm9yIGluY2x1ZGluZyBidG4tZ3JvdXBzIHdpdGhpbiBidG4tZ3JvdXBzICh1c2VmdWwgZm9yIGluY2x1ZGluZyBkcm9wZG93biBidXR0b25zIHdpdGhpbiBhIGJ0bi1ncm91cClcbi5idG4tZ3JvdXAgPiAuYnRuLWdyb3VwIHtcbiAgZmxvYXQ6IGxlZnQ7XG59XG4uYnRuLWdyb3VwID4gLmJ0bi1ncm91cDpub3QoOmZpcnN0LWNoaWxkKTpub3QoOmxhc3QtY2hpbGQpID4gLmJ0biB7XG4gIGJvcmRlci1yYWRpdXM6IDA7XG59XG4uYnRuLWdyb3VwID4gLmJ0bi1ncm91cDpmaXJzdC1jaGlsZCB7XG4gID4gLmJ0bjpsYXN0LWNoaWxkLFxuICA+IC5kcm9wZG93bi10b2dnbGUge1xuICAgIC5ib3JkZXItcmlnaHQtcmFkaXVzKDApO1xuICB9XG59XG4uYnRuLWdyb3VwID4gLmJ0bi1ncm91cDpsYXN0LWNoaWxkID4gLmJ0bjpmaXJzdC1jaGlsZCB7XG4gIC5ib3JkZXItbGVmdC1yYWRpdXMoMCk7XG59XG5cbi8vIE9uIGFjdGl2ZSBhbmQgb3BlbiwgZG9uJ3Qgc2hvdyBvdXRsaW5lXG4uYnRuLWdyb3VwIC5kcm9wZG93bi10b2dnbGU6YWN0aXZlLFxuLmJ0bi1ncm91cC5vcGVuIC5kcm9wZG93bi10b2dnbGUge1xuICBvdXRsaW5lOiAwO1xufVxuXG5cbi8vIFNpemluZ1xuLy9cbi8vIFJlbWl4IHRoZSBkZWZhdWx0IGJ1dHRvbiBzaXppbmcgY2xhc3NlcyBpbnRvIG5ldyBvbmVzIGZvciBlYXNpZXIgbWFuaXB1bGF0aW9uLlxuXG4uYnRuLWdyb3VwLXhzID4gLmJ0biB7ICY6ZXh0ZW5kKC5idG4teHMpOyB9XG4uYnRuLWdyb3VwLXNtID4gLmJ0biB7ICY6ZXh0ZW5kKC5idG4tc20pOyB9XG4uYnRuLWdyb3VwLWxnID4gLmJ0biB7ICY6ZXh0ZW5kKC5idG4tbGcpOyB9XG5cblxuLy8gU3BsaXQgYnV0dG9uIGRyb3Bkb3duc1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vLyBHaXZlIHRoZSBsaW5lIGJldHdlZW4gYnV0dG9ucyBzb21lIGRlcHRoXG4uYnRuLWdyb3VwID4gLmJ0biArIC5kcm9wZG93bi10b2dnbGUge1xuICBwYWRkaW5nLWxlZnQ6IDhweDtcbiAgcGFkZGluZy1yaWdodDogOHB4O1xufVxuLmJ0bi1ncm91cCA+IC5idG4tbGcgKyAuZHJvcGRvd24tdG9nZ2xlIHtcbiAgcGFkZGluZy1sZWZ0OiAxMnB4O1xuICBwYWRkaW5nLXJpZ2h0OiAxMnB4O1xufVxuXG4vLyBUaGUgY2xpY2thYmxlIGJ1dHRvbiBmb3IgdG9nZ2xpbmcgdGhlIG1lbnVcbi8vIFJlbW92ZSB0aGUgZ3JhZGllbnQgYW5kIHNldCB0aGUgc2FtZSBpbnNldCBzaGFkb3cgYXMgdGhlIDphY3RpdmUgc3RhdGVcbi5idG4tZ3JvdXAub3BlbiAuZHJvcGRvd24tdG9nZ2xlIHtcbiAgLmJveC1zaGFkb3coaW5zZXQgMCAzcHggNXB4IHJnYmEoMCwwLDAsLjEyNSkpO1xuXG4gIC8vIFNob3cgbm8gc2hhZG93IGZvciBgLmJ0bi1saW5rYCBzaW5jZSBpdCBoYXMgbm8gb3RoZXIgYnV0dG9uIHN0eWxlcy5cbiAgJi5idG4tbGluayB7XG4gICAgLmJveC1zaGFkb3cobm9uZSk7XG4gIH1cbn1cblxuXG4vLyBSZXBvc2l0aW9uIHRoZSBjYXJldFxuLmJ0biAuY2FyZXQge1xuICBtYXJnaW4tbGVmdDogMDtcbn1cbi8vIENhcmV0cyBpbiBvdGhlciBidXR0b24gc2l6ZXNcbi5idG4tbGcgLmNhcmV0IHtcbiAgYm9yZGVyLXdpZHRoOiBAY2FyZXQtd2lkdGgtbGFyZ2UgQGNhcmV0LXdpZHRoLWxhcmdlIDA7XG4gIGJvcmRlci1ib3R0b20td2lkdGg6IDA7XG59XG4vLyBVcHNpZGUgZG93biBjYXJldHMgZm9yIC5kcm9wdXBcbi5kcm9wdXAgLmJ0bi1sZyAuY2FyZXQge1xuICBib3JkZXItd2lkdGg6IDAgQGNhcmV0LXdpZHRoLWxhcmdlIEBjYXJldC13aWR0aC1sYXJnZTtcbn1cblxuXG4vLyBWZXJ0aWNhbCBidXR0b24gZ3JvdXBzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi5idG4tZ3JvdXAtdmVydGljYWwge1xuICA+IC5idG4sXG4gID4gLmJ0bi1ncm91cCxcbiAgPiAuYnRuLWdyb3VwID4gLmJ0biB7XG4gICAgZGlzcGxheTogYmxvY2s7XG4gICAgZmxvYXQ6IG5vbmU7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgbWF4LXdpZHRoOiAxMDAlO1xuICB9XG5cbiAgLy8gQ2xlYXIgZmxvYXRzIHNvIGRyb3Bkb3duIG1lbnVzIGNhbiBiZSBwcm9wZXJseSBwbGFjZWRcbiAgPiAuYnRuLWdyb3VwIHtcbiAgICAmOmV4dGVuZCguY2xlYXJmaXggYWxsKTtcbiAgICA+IC5idG4ge1xuICAgICAgZmxvYXQ6IG5vbmU7XG4gICAgfVxuICB9XG5cbiAgPiAuYnRuICsgLmJ0bixcbiAgPiAuYnRuICsgLmJ0bi1ncm91cCxcbiAgPiAuYnRuLWdyb3VwICsgLmJ0bixcbiAgPiAuYnRuLWdyb3VwICsgLmJ0bi1ncm91cCB7XG4gICAgbWFyZ2luLXRvcDogLTFweDtcbiAgICBtYXJnaW4tbGVmdDogMDtcbiAgfVxufVxuXG4uYnRuLWdyb3VwLXZlcnRpY2FsID4gLmJ0biB7XG4gICY6bm90KDpmaXJzdC1jaGlsZCk6bm90KDpsYXN0LWNoaWxkKSB7XG4gICAgYm9yZGVyLXJhZGl1czogMDtcbiAgfVxuICAmOmZpcnN0LWNoaWxkOm5vdCg6bGFzdC1jaGlsZCkge1xuICAgIGJvcmRlci10b3AtcmlnaHQtcmFkaXVzOiBAYm9yZGVyLXJhZGl1cy1iYXNlO1xuICAgIC5ib3JkZXItYm90dG9tLXJhZGl1cygwKTtcbiAgfVxuICAmOmxhc3QtY2hpbGQ6bm90KDpmaXJzdC1jaGlsZCkge1xuICAgIGJvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6IEBib3JkZXItcmFkaXVzLWJhc2U7XG4gICAgLmJvcmRlci10b3AtcmFkaXVzKDApO1xuICB9XG59XG4uYnRuLWdyb3VwLXZlcnRpY2FsID4gLmJ0bi1ncm91cDpub3QoOmZpcnN0LWNoaWxkKTpub3QoOmxhc3QtY2hpbGQpID4gLmJ0biB7XG4gIGJvcmRlci1yYWRpdXM6IDA7XG59XG4uYnRuLWdyb3VwLXZlcnRpY2FsID4gLmJ0bi1ncm91cDpmaXJzdC1jaGlsZDpub3QoOmxhc3QtY2hpbGQpIHtcbiAgPiAuYnRuOmxhc3QtY2hpbGQsXG4gID4gLmRyb3Bkb3duLXRvZ2dsZSB7XG4gICAgLmJvcmRlci1ib3R0b20tcmFkaXVzKDApO1xuICB9XG59XG4uYnRuLWdyb3VwLXZlcnRpY2FsID4gLmJ0bi1ncm91cDpsYXN0LWNoaWxkOm5vdCg6Zmlyc3QtY2hpbGQpID4gLmJ0bjpmaXJzdC1jaGlsZCB7XG4gIC5ib3JkZXItdG9wLXJhZGl1cygwKTtcbn1cblxuXG4vLyBKdXN0aWZpZWQgYnV0dG9uIGdyb3Vwc1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4uYnRuLWdyb3VwLWp1c3RpZmllZCB7XG4gIGRpc3BsYXk6IHRhYmxlO1xuICB3aWR0aDogMTAwJTtcbiAgdGFibGUtbGF5b3V0OiBmaXhlZDtcbiAgYm9yZGVyLWNvbGxhcHNlOiBzZXBhcmF0ZTtcbiAgPiAuYnRuLFxuICA+IC5idG4tZ3JvdXAge1xuICAgIGZsb2F0OiBub25lO1xuICAgIGRpc3BsYXk6IHRhYmxlLWNlbGw7XG4gICAgd2lkdGg6IDElO1xuICB9XG4gID4gLmJ0bi1ncm91cCAuYnRuIHtcbiAgICB3aWR0aDogMTAwJTtcbiAgfVxuXG4gID4gLmJ0bi1ncm91cCAuZHJvcGRvd24tbWVudSB7XG4gICAgbGVmdDogYXV0bztcbiAgfVxufVxuXG5cbi8vIENoZWNrYm94IGFuZCByYWRpbyBvcHRpb25zXG4vL1xuLy8gSW4gb3JkZXIgdG8gc3VwcG9ydCB0aGUgYnJvd3NlcidzIGZvcm0gdmFsaWRhdGlvbiBmZWVkYmFjaywgcG93ZXJlZCBieSB0aGVcbi8vIGByZXF1aXJlZGAgYXR0cmlidXRlLCB3ZSBoYXZlIHRvIFwiaGlkZVwiIHRoZSBpbnB1dHMgdmlhIGBjbGlwYC4gV2UgY2Fubm90IHVzZVxuLy8gYGRpc3BsYXk6IG5vbmU7YCBvciBgdmlzaWJpbGl0eTogaGlkZGVuO2AgYXMgdGhhdCBhbHNvIGhpZGVzIHRoZSBwb3BvdmVyLlxuLy8gU2ltcGx5IHZpc3VhbGx5IGhpZGluZyB0aGUgaW5wdXRzIHZpYSBgb3BhY2l0eWAgd291bGQgbGVhdmUgdGhlbSBjbGlja2FibGUgaW5cbi8vIGNlcnRhaW4gY2FzZXMgd2hpY2ggaXMgcHJldmVudGVkIGJ5IHVzaW5nIGBjbGlwYCBhbmQgYHBvaW50ZXItZXZlbnRzYC5cbi8vIFRoaXMgd2F5LCB3ZSBlbnN1cmUgYSBET00gZWxlbWVudCBpcyB2aXNpYmxlIHRvIHBvc2l0aW9uIHRoZSBwb3BvdmVyIGZyb20uXG4vL1xuLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9wdWxsLzEyNzk0IGFuZFxuLy8gaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL3B1bGwvMTQ1NTkgZm9yIG1vcmUgaW5mb3JtYXRpb24uXG5cbltkYXRhLXRvZ2dsZT1cImJ1dHRvbnNcIl0ge1xuICA+IC5idG4sXG4gID4gLmJ0bi1ncm91cCA+IC5idG4ge1xuICAgIGlucHV0W3R5cGU9XCJyYWRpb1wiXSxcbiAgICBpbnB1dFt0eXBlPVwiY2hlY2tib3hcIl0ge1xuICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgICAgY2xpcDogcmVjdCgwLDAsMCwwKTtcbiAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lO1xuICAgIH1cbiAgfVxufVxuIiwiLy9cbi8vIENvbXBvbmVudCBhbmltYXRpb25zXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vLyBIZWFkcyB1cCFcbi8vXG4vLyBXZSBkb24ndCB1c2UgdGhlIGAub3BhY2l0eSgpYCBtaXhpbiBoZXJlIHNpbmNlIGl0IGNhdXNlcyBhIGJ1ZyB3aXRoIHRleHRcbi8vIGZpZWxkcyBpbiBJRTctOC4gU291cmNlOiBodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvcHVsbC8zNTUyLlxuXG4uZmFkZSB7XG4gIG9wYWNpdHk6IDA7XG4gIC50cmFuc2l0aW9uKG9wYWNpdHkgLjE1cyBsaW5lYXIpO1xuICAmLmluIHtcbiAgICBvcGFjaXR5OiAxO1xuICB9XG59XG5cbi5jb2xsYXBzZSB7XG4gIGRpc3BsYXk6IG5vbmU7XG4gIHZpc2liaWxpdHk6IGhpZGRlbjtcblxuICAmLmluICAgICAgeyBkaXNwbGF5OiBibG9jazsgdmlzaWJpbGl0eTogdmlzaWJsZTsgfVxuICB0ciYuaW4gICAgeyBkaXNwbGF5OiB0YWJsZS1yb3c7IH1cbiAgdGJvZHkmLmluIHsgZGlzcGxheTogdGFibGUtcm93LWdyb3VwOyB9XG59XG5cbi5jb2xsYXBzaW5nIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICBoZWlnaHQ6IDA7XG4gIG92ZXJmbG93OiBoaWRkZW47XG4gIC50cmFuc2l0aW9uLXByb3BlcnR5KH5cImhlaWdodCwgdmlzaWJpbGl0eVwiKTtcbiAgLnRyYW5zaXRpb24tZHVyYXRpb24oLjM1cyk7XG4gIC50cmFuc2l0aW9uLXRpbWluZy1mdW5jdGlvbihlYXNlKTtcbn1cbiIsIi8vXG4vLyBEcm9wZG93biBtZW51c1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuXG4vLyBEcm9wZG93biBhcnJvdy9jYXJldFxuLmNhcmV0IHtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICB3aWR0aDogMDtcbiAgaGVpZ2h0OiAwO1xuICBtYXJnaW4tbGVmdDogMnB4O1xuICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1xuICBib3JkZXItdG9wOiAgIEBjYXJldC13aWR0aC1iYXNlIHNvbGlkO1xuICBib3JkZXItcmlnaHQ6IEBjYXJldC13aWR0aC1iYXNlIHNvbGlkIHRyYW5zcGFyZW50O1xuICBib3JkZXItbGVmdDogIEBjYXJldC13aWR0aC1iYXNlIHNvbGlkIHRyYW5zcGFyZW50O1xufVxuXG4vLyBUaGUgZHJvcGRvd24gd3JhcHBlciAoZGl2KVxuLmRyb3Bkb3duIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xufVxuXG4vLyBQcmV2ZW50IHRoZSBmb2N1cyBvbiB0aGUgZHJvcGRvd24gdG9nZ2xlIHdoZW4gY2xvc2luZyBkcm9wZG93bnNcbi5kcm9wZG93bi10b2dnbGU6Zm9jdXMge1xuICBvdXRsaW5lOiAwO1xufVxuXG4vLyBUaGUgZHJvcGRvd24gbWVudSAodWwpXG4uZHJvcGRvd24tbWVudSB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgdG9wOiAxMDAlO1xuICBsZWZ0OiAwO1xuICB6LWluZGV4OiBAemluZGV4LWRyb3Bkb3duO1xuICBkaXNwbGF5OiBub25lOyAvLyBub25lIGJ5IGRlZmF1bHQsIGJ1dCBibG9jayBvbiBcIm9wZW5cIiBvZiB0aGUgbWVudVxuICBmbG9hdDogbGVmdDtcbiAgbWluLXdpZHRoOiAxNjBweDtcbiAgcGFkZGluZzogNXB4IDA7XG4gIG1hcmdpbjogMnB4IDAgMDsgLy8gb3ZlcnJpZGUgZGVmYXVsdCB1bFxuICBsaXN0LXN0eWxlOiBub25lO1xuICBmb250LXNpemU6IEBmb250LXNpemUtYmFzZTtcbiAgdGV4dC1hbGlnbjogbGVmdDsgLy8gRW5zdXJlcyBwcm9wZXIgYWxpZ25tZW50IGlmIHBhcmVudCBoYXMgaXQgY2hhbmdlZCAoZS5nLiwgbW9kYWwgZm9vdGVyKVxuICBiYWNrZ3JvdW5kLWNvbG9yOiBAZHJvcGRvd24tYmc7XG4gIGJvcmRlcjogMXB4IHNvbGlkIEBkcm9wZG93bi1mYWxsYmFjay1ib3JkZXI7IC8vIElFOCBmYWxsYmFja1xuICBib3JkZXI6IDFweCBzb2xpZCBAZHJvcGRvd24tYm9yZGVyO1xuICBib3JkZXItcmFkaXVzOiBAYm9yZGVyLXJhZGl1cy1iYXNlO1xuICAuYm94LXNoYWRvdygwIDZweCAxMnB4IHJnYmEoMCwwLDAsLjE3NSkpO1xuICBiYWNrZ3JvdW5kLWNsaXA6IHBhZGRpbmctYm94O1xuXG4gIC8vIEFsaWducyB0aGUgZHJvcGRvd24gbWVudSB0byByaWdodFxuICAvL1xuICAvLyBEZXByZWNhdGVkIGFzIG9mIDMuMS4wIGluIGZhdm9yIG9mIGAuZHJvcGRvd24tbWVudS1bZGlyXWBcbiAgJi5wdWxsLXJpZ2h0IHtcbiAgICByaWdodDogMDtcbiAgICBsZWZ0OiBhdXRvO1xuICB9XG5cbiAgLy8gRGl2aWRlcnMgKGJhc2ljYWxseSBhbiBocikgd2l0aGluIHRoZSBkcm9wZG93blxuICAuZGl2aWRlciB7XG4gICAgLm5hdi1kaXZpZGVyKEBkcm9wZG93bi1kaXZpZGVyLWJnKTtcbiAgfVxuXG4gIC8vIExpbmtzIHdpdGhpbiB0aGUgZHJvcGRvd24gbWVudVxuICA+IGxpID4gYSB7XG4gICAgZGlzcGxheTogYmxvY2s7XG4gICAgcGFkZGluZzogM3B4IDIwcHg7XG4gICAgY2xlYXI6IGJvdGg7XG4gICAgZm9udC13ZWlnaHQ6IG5vcm1hbDtcbiAgICBsaW5lLWhlaWdodDogQGxpbmUtaGVpZ2h0LWJhc2U7XG4gICAgY29sb3I6IEBkcm9wZG93bi1saW5rLWNvbG9yO1xuICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7IC8vIHByZXZlbnQgbGlua3MgZnJvbSByYW5kb21seSBicmVha2luZyBvbnRvIG5ldyBsaW5lc1xuICB9XG59XG5cbi8vIEhvdmVyL0ZvY3VzIHN0YXRlXG4uZHJvcGRvd24tbWVudSA+IGxpID4gYSB7XG4gICY6aG92ZXIsXG4gICY6Zm9jdXMge1xuICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTtcbiAgICBjb2xvcjogQGRyb3Bkb3duLWxpbmstaG92ZXItY29sb3I7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogQGRyb3Bkb3duLWxpbmstaG92ZXItYmc7XG4gIH1cbn1cblxuLy8gQWN0aXZlIHN0YXRlXG4uZHJvcGRvd24tbWVudSA+IC5hY3RpdmUgPiBhIHtcbiAgJixcbiAgJjpob3ZlcixcbiAgJjpmb2N1cyB7XG4gICAgY29sb3I6IEBkcm9wZG93bi1saW5rLWFjdGl2ZS1jb2xvcjtcbiAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7XG4gICAgb3V0bGluZTogMDtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAZHJvcGRvd24tbGluay1hY3RpdmUtYmc7XG4gIH1cbn1cblxuLy8gRGlzYWJsZWQgc3RhdGVcbi8vXG4vLyBHcmF5IG91dCB0ZXh0IGFuZCBlbnN1cmUgdGhlIGhvdmVyL2ZvY3VzIHN0YXRlIHJlbWFpbnMgZ3JheVxuXG4uZHJvcGRvd24tbWVudSA+IC5kaXNhYmxlZCA+IGEge1xuICAmLFxuICAmOmhvdmVyLFxuICAmOmZvY3VzIHtcbiAgICBjb2xvcjogQGRyb3Bkb3duLWxpbmstZGlzYWJsZWQtY29sb3I7XG4gIH1cblxuICAvLyBOdWtlIGhvdmVyL2ZvY3VzIGVmZmVjdHNcbiAgJjpob3ZlcixcbiAgJjpmb2N1cyB7XG4gICAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xuICAgIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50O1xuICAgIGJhY2tncm91bmQtaW1hZ2U6IG5vbmU7IC8vIFJlbW92ZSBDU1MgZ3JhZGllbnRcbiAgICAucmVzZXQtZmlsdGVyKCk7XG4gICAgY3Vyc29yOiBAY3Vyc29yLWRpc2FibGVkO1xuICB9XG59XG5cbi8vIE9wZW4gc3RhdGUgZm9yIHRoZSBkcm9wZG93blxuLm9wZW4ge1xuICAvLyBTaG93IHRoZSBtZW51XG4gID4gLmRyb3Bkb3duLW1lbnUge1xuICAgIGRpc3BsYXk6IGJsb2NrO1xuICB9XG5cbiAgLy8gUmVtb3ZlIHRoZSBvdXRsaW5lIHdoZW4gOmZvY3VzIGlzIHRyaWdnZXJlZFxuICA+IGEge1xuICAgIG91dGxpbmU6IDA7XG4gIH1cbn1cblxuLy8gTWVudSBwb3NpdGlvbmluZ1xuLy9cbi8vIEFkZCBleHRyYSBjbGFzcyB0byBgLmRyb3Bkb3duLW1lbnVgIHRvIGZsaXAgdGhlIGFsaWdubWVudCBvZiB0aGUgZHJvcGRvd25cbi8vIG1lbnUgd2l0aCB0aGUgcGFyZW50LlxuLmRyb3Bkb3duLW1lbnUtcmlnaHQge1xuICBsZWZ0OiBhdXRvOyAvLyBSZXNldCB0aGUgZGVmYXVsdCBmcm9tIGAuZHJvcGRvd24tbWVudWBcbiAgcmlnaHQ6IDA7XG59XG4vLyBXaXRoIHYzLCB3ZSBlbmFibGVkIGF1dG8tZmxpcHBpbmcgaWYgeW91IGhhdmUgYSBkcm9wZG93biB3aXRoaW4gYSByaWdodFxuLy8gYWxpZ25lZCBuYXYgY29tcG9uZW50LiBUbyBlbmFibGUgdGhlIHVuZG9pbmcgb2YgdGhhdCwgd2UgcHJvdmlkZSBhbiBvdmVycmlkZVxuLy8gdG8gcmVzdG9yZSB0aGUgZGVmYXVsdCBkcm9wZG93biBtZW51IGFsaWdubWVudC5cbi8vXG4vLyBUaGlzIGlzIG9ubHkgZm9yIGxlZnQtYWxpZ25pbmcgYSBkcm9wZG93biBtZW51IHdpdGhpbiBhIGAubmF2YmFyLXJpZ2h0YCBvclxuLy8gYC5wdWxsLXJpZ2h0YCBuYXYgY29tcG9uZW50LlxuLmRyb3Bkb3duLW1lbnUtbGVmdCB7XG4gIGxlZnQ6IDA7XG4gIHJpZ2h0OiBhdXRvO1xufVxuXG4vLyBEcm9wZG93biBzZWN0aW9uIGhlYWRlcnNcbi5kcm9wZG93bi1oZWFkZXIge1xuICBkaXNwbGF5OiBibG9jaztcbiAgcGFkZGluZzogM3B4IDIwcHg7XG4gIGZvbnQtc2l6ZTogQGZvbnQtc2l6ZS1zbWFsbDtcbiAgbGluZS1oZWlnaHQ6IEBsaW5lLWhlaWdodC1iYXNlO1xuICBjb2xvcjogQGRyb3Bkb3duLWhlYWRlci1jb2xvcjtcbiAgd2hpdGUtc3BhY2U6IG5vd3JhcDsgLy8gYXMgd2l0aCA+IGxpID4gYVxufVxuXG4vLyBCYWNrZHJvcCB0byBjYXRjaCBib2R5IGNsaWNrcyBvbiBtb2JpbGUsIGV0Yy5cbi5kcm9wZG93bi1iYWNrZHJvcCB7XG4gIHBvc2l0aW9uOiBmaXhlZDtcbiAgbGVmdDogMDtcbiAgcmlnaHQ6IDA7XG4gIGJvdHRvbTogMDtcbiAgdG9wOiAwO1xuICB6LWluZGV4OiAoQHppbmRleC1kcm9wZG93biAtIDEwKTtcbn1cblxuLy8gUmlnaHQgYWxpZ25lZCBkcm9wZG93bnNcbi5wdWxsLXJpZ2h0ID4gLmRyb3Bkb3duLW1lbnUge1xuICByaWdodDogMDtcbiAgbGVmdDogYXV0bztcbn1cblxuLy8gQWxsb3cgZm9yIGRyb3Bkb3ducyB0byBnbyBib3R0b20gdXAgKGFrYSwgZHJvcHVwLW1lbnUpXG4vL1xuLy8gSnVzdCBhZGQgLmRyb3B1cCBhZnRlciB0aGUgc3RhbmRhcmQgLmRyb3Bkb3duIGNsYXNzIGFuZCB5b3UncmUgc2V0LCBicm8uXG4vLyBUT0RPOiBhYnN0cmFjdCB0aGlzIHNvIHRoYXQgdGhlIG5hdmJhciBmaXhlZCBzdHlsZXMgYXJlIG5vdCBwbGFjZWQgaGVyZT9cblxuLmRyb3B1cCxcbi5uYXZiYXItZml4ZWQtYm90dG9tIC5kcm9wZG93biB7XG4gIC8vIFJldmVyc2UgdGhlIGNhcmV0XG4gIC5jYXJldCB7XG4gICAgYm9yZGVyLXRvcDogMDtcbiAgICBib3JkZXItYm90dG9tOiBAY2FyZXQtd2lkdGgtYmFzZSBzb2xpZDtcbiAgICBjb250ZW50OiBcIlwiO1xuICB9XG4gIC8vIERpZmZlcmVudCBwb3NpdGlvbmluZyBmb3IgYm90dG9tIHVwIG1lbnVcbiAgLmRyb3Bkb3duLW1lbnUge1xuICAgIHRvcDogYXV0bztcbiAgICBib3R0b206IDEwMCU7XG4gICAgbWFyZ2luLWJvdHRvbTogMXB4O1xuICB9XG59XG5cblxuLy8gQ29tcG9uZW50IGFsaWdubWVudFxuLy9cbi8vIFJlaXRlcmF0ZSBwZXIgbmF2YmFyLmxlc3MgYW5kIHRoZSBtb2RpZmllZCBjb21wb25lbnQgYWxpZ25tZW50IHRoZXJlLlxuXG5AbWVkaWEgKG1pbi13aWR0aDogQGdyaWQtZmxvYXQtYnJlYWtwb2ludCkge1xuICAubmF2YmFyLXJpZ2h0IHtcbiAgICAuZHJvcGRvd24tbWVudSB7XG4gICAgICAuZHJvcGRvd24tbWVudS1yaWdodCgpO1xuICAgIH1cbiAgICAvLyBOZWNlc3NhcnkgZm9yIG92ZXJyaWRlcyBvZiB0aGUgZGVmYXVsdCByaWdodCBhbGlnbmVkIG1lbnUuXG4gICAgLy8gV2lsbCByZW1vdmUgY29tZSB2NCBpbiBhbGwgbGlrZWxpaG9vZC5cbiAgICAuZHJvcGRvd24tbWVudS1sZWZ0IHtcbiAgICAgIC5kcm9wZG93bi1tZW51LWxlZnQoKTtcbiAgICB9XG4gIH1cbn1cbiIsIi8vIEhvcml6b250YWwgZGl2aWRlcnNcbi8vXG4vLyBEaXZpZGVycyAoYmFzaWNhbGx5IGFuIGhyKSB3aXRoaW4gZHJvcGRvd25zIGFuZCBuYXYgbGlzdHNcblxuLm5hdi1kaXZpZGVyKEBjb2xvcjogI2U1ZTVlNSkge1xuICBoZWlnaHQ6IDFweDtcbiAgbWFyZ2luOiAoKEBsaW5lLWhlaWdodC1jb21wdXRlZCAvIDIpIC0gMSkgMDtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgYmFja2dyb3VuZC1jb2xvcjogQGNvbG9yO1xufVxuIiwiLy8gUmVzZXQgZmlsdGVycyBmb3IgSUVcbi8vXG4vLyBXaGVuIHlvdSBuZWVkIHRvIHJlbW92ZSBhIGdyYWRpZW50IGJhY2tncm91bmQsIGRvIG5vdCBmb3JnZXQgdG8gdXNlIHRoaXMgdG8gcmVzZXRcbi8vIHRoZSBJRSBmaWx0ZXIgZm9yIElFOSBhbmQgYmVsb3cuXG5cbi5yZXNldC1maWx0ZXIoKSB7XG4gIGZpbHRlcjogZSglKFwicHJvZ2lkOkRYSW1hZ2VUcmFuc2Zvcm0uTWljcm9zb2Z0LmdyYWRpZW50KGVuYWJsZWQgPSBmYWxzZSlcIikpO1xufVxuIiwiLy8gU2luZ2xlIHNpZGUgYm9yZGVyLXJhZGl1c1xuXG4uYm9yZGVyLXRvcC1yYWRpdXMoQHJhZGl1cykge1xuICBib3JkZXItdG9wLXJpZ2h0LXJhZGl1czogQHJhZGl1cztcbiAgIGJvcmRlci10b3AtbGVmdC1yYWRpdXM6IEByYWRpdXM7XG59XG4uYm9yZGVyLXJpZ2h0LXJhZGl1cyhAcmFkaXVzKSB7XG4gIGJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOiBAcmFkaXVzO1xuICAgICBib3JkZXItdG9wLXJpZ2h0LXJhZGl1czogQHJhZGl1cztcbn1cbi5ib3JkZXItYm90dG9tLXJhZGl1cyhAcmFkaXVzKSB7XG4gIGJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOiBAcmFkaXVzO1xuICAgYm9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czogQHJhZGl1cztcbn1cbi5ib3JkZXItbGVmdC1yYWRpdXMoQHJhZGl1cykge1xuICBib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOiBAcmFkaXVzO1xuICAgICBib3JkZXItdG9wLWxlZnQtcmFkaXVzOiBAcmFkaXVzO1xufVxuIiwiLy9cbi8vIElucHV0IGdyb3Vwc1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLy8gQmFzZSBzdHlsZXNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi5pbnB1dC1ncm91cCB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTsgLy8gRm9yIGRyb3Bkb3duc1xuICBkaXNwbGF5OiB0YWJsZTtcbiAgYm9yZGVyLWNvbGxhcHNlOiBzZXBhcmF0ZTsgLy8gcHJldmVudCBpbnB1dCBncm91cHMgZnJvbSBpbmhlcml0aW5nIGJvcmRlciBzdHlsZXMgZnJvbSB0YWJsZSBjZWxscyB3aGVuIHBsYWNlZCB3aXRoaW4gYSB0YWJsZVxuXG4gIC8vIFVuZG8gcGFkZGluZyBhbmQgZmxvYXQgb2YgZ3JpZCBjbGFzc2VzXG4gICZbY2xhc3MqPVwiY29sLVwiXSB7XG4gICAgZmxvYXQ6IG5vbmU7XG4gICAgcGFkZGluZy1sZWZ0OiAwO1xuICAgIHBhZGRpbmctcmlnaHQ6IDA7XG4gIH1cblxuICAuZm9ybS1jb250cm9sIHtcbiAgICAvLyBFbnN1cmUgdGhhdCB0aGUgaW5wdXQgaXMgYWx3YXlzIGFib3ZlIHRoZSAqYXBwZW5kZWQqIGFkZG9uIGJ1dHRvbiBmb3JcbiAgICAvLyBwcm9wZXIgYm9yZGVyIGNvbG9ycy5cbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgei1pbmRleDogMjtcblxuICAgIC8vIElFOSBmdWJhcnMgdGhlIHBsYWNlaG9sZGVyIGF0dHJpYnV0ZSBpbiB0ZXh0IGlucHV0cyBhbmQgdGhlIGFycm93cyBvblxuICAgIC8vIHNlbGVjdCBlbGVtZW50cyBpbiBpbnB1dCBncm91cHMuIFRvIGZpeCBpdCwgd2UgZmxvYXQgdGhlIGlucHV0LiBEZXRhaWxzOlxuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9pc3N1ZXMvMTE1NjEjaXNzdWVjb21tZW50LTI4OTM2ODU1XG4gICAgZmxvYXQ6IGxlZnQ7XG5cbiAgICB3aWR0aDogMTAwJTtcbiAgICBtYXJnaW4tYm90dG9tOiAwO1xuICB9XG59XG5cbi8vIFNpemluZyBvcHRpb25zXG4vL1xuLy8gUmVtaXggdGhlIGRlZmF1bHQgZm9ybSBjb250cm9sIHNpemluZyBjbGFzc2VzIGludG8gbmV3IG9uZXMgZm9yIGVhc2llclxuLy8gbWFuaXB1bGF0aW9uLlxuXG4uaW5wdXQtZ3JvdXAtbGcgPiAuZm9ybS1jb250cm9sLFxuLmlucHV0LWdyb3VwLWxnID4gLmlucHV0LWdyb3VwLWFkZG9uLFxuLmlucHV0LWdyb3VwLWxnID4gLmlucHV0LWdyb3VwLWJ0biA+IC5idG4ge1xuICAuaW5wdXQtbGcoKTtcbn1cbi5pbnB1dC1ncm91cC1zbSA+IC5mb3JtLWNvbnRyb2wsXG4uaW5wdXQtZ3JvdXAtc20gPiAuaW5wdXQtZ3JvdXAtYWRkb24sXG4uaW5wdXQtZ3JvdXAtc20gPiAuaW5wdXQtZ3JvdXAtYnRuID4gLmJ0biB7XG4gIC5pbnB1dC1zbSgpO1xufVxuXG5cbi8vIERpc3BsYXkgYXMgdGFibGUtY2VsbFxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLmlucHV0LWdyb3VwLWFkZG9uLFxuLmlucHV0LWdyb3VwLWJ0bixcbi5pbnB1dC1ncm91cCAuZm9ybS1jb250cm9sIHtcbiAgZGlzcGxheTogdGFibGUtY2VsbDtcblxuICAmOm5vdCg6Zmlyc3QtY2hpbGQpOm5vdCg6bGFzdC1jaGlsZCkge1xuICAgIGJvcmRlci1yYWRpdXM6IDA7XG4gIH1cbn1cbi8vIEFkZG9uIGFuZCBhZGRvbiB3cmFwcGVyIGZvciBidXR0b25zXG4uaW5wdXQtZ3JvdXAtYWRkb24sXG4uaW5wdXQtZ3JvdXAtYnRuIHtcbiAgd2lkdGg6IDElO1xuICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOyAvLyBNYXRjaCB0aGUgaW5wdXRzXG59XG5cbi8vIFRleHQgaW5wdXQgZ3JvdXBzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4uaW5wdXQtZ3JvdXAtYWRkb24ge1xuICBwYWRkaW5nOiBAcGFkZGluZy1iYXNlLXZlcnRpY2FsIEBwYWRkaW5nLWJhc2UtaG9yaXpvbnRhbDtcbiAgZm9udC1zaXplOiBAZm9udC1zaXplLWJhc2U7XG4gIGZvbnQtd2VpZ2h0OiBub3JtYWw7XG4gIGxpbmUtaGVpZ2h0OiAxO1xuICBjb2xvcjogQGlucHV0LWNvbG9yO1xuICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gIGJhY2tncm91bmQtY29sb3I6IEBpbnB1dC1ncm91cC1hZGRvbi1iZztcbiAgYm9yZGVyOiAxcHggc29saWQgQGlucHV0LWdyb3VwLWFkZG9uLWJvcmRlci1jb2xvcjtcbiAgYm9yZGVyLXJhZGl1czogQGJvcmRlci1yYWRpdXMtYmFzZTtcblxuICAvLyBTaXppbmdcbiAgJi5pbnB1dC1zbSB7XG4gICAgcGFkZGluZzogQHBhZGRpbmctc21hbGwtdmVydGljYWwgQHBhZGRpbmctc21hbGwtaG9yaXpvbnRhbDtcbiAgICBmb250LXNpemU6IEBmb250LXNpemUtc21hbGw7XG4gICAgYm9yZGVyLXJhZGl1czogQGJvcmRlci1yYWRpdXMtc21hbGw7XG4gIH1cbiAgJi5pbnB1dC1sZyB7XG4gICAgcGFkZGluZzogQHBhZGRpbmctbGFyZ2UtdmVydGljYWwgQHBhZGRpbmctbGFyZ2UtaG9yaXpvbnRhbDtcbiAgICBmb250LXNpemU6IEBmb250LXNpemUtbGFyZ2U7XG4gICAgYm9yZGVyLXJhZGl1czogQGJvcmRlci1yYWRpdXMtbGFyZ2U7XG4gIH1cblxuICAvLyBOdWtlIGRlZmF1bHQgbWFyZ2lucyBmcm9tIGNoZWNrYm94ZXMgYW5kIHJhZGlvcyB0byB2ZXJ0aWNhbGx5IGNlbnRlciB3aXRoaW4uXG4gIGlucHV0W3R5cGU9XCJyYWRpb1wiXSxcbiAgaW5wdXRbdHlwZT1cImNoZWNrYm94XCJdIHtcbiAgICBtYXJnaW4tdG9wOiAwO1xuICB9XG59XG5cbi8vIFJlc2V0IHJvdW5kZWQgY29ybmVyc1xuLmlucHV0LWdyb3VwIC5mb3JtLWNvbnRyb2w6Zmlyc3QtY2hpbGQsXG4uaW5wdXQtZ3JvdXAtYWRkb246Zmlyc3QtY2hpbGQsXG4uaW5wdXQtZ3JvdXAtYnRuOmZpcnN0LWNoaWxkID4gLmJ0bixcbi5pbnB1dC1ncm91cC1idG46Zmlyc3QtY2hpbGQgPiAuYnRuLWdyb3VwID4gLmJ0bixcbi5pbnB1dC1ncm91cC1idG46Zmlyc3QtY2hpbGQgPiAuZHJvcGRvd24tdG9nZ2xlLFxuLmlucHV0LWdyb3VwLWJ0bjpsYXN0LWNoaWxkID4gLmJ0bjpub3QoOmxhc3QtY2hpbGQpOm5vdCguZHJvcGRvd24tdG9nZ2xlKSxcbi5pbnB1dC1ncm91cC1idG46bGFzdC1jaGlsZCA+IC5idG4tZ3JvdXA6bm90KDpsYXN0LWNoaWxkKSA+IC5idG4ge1xuICAuYm9yZGVyLXJpZ2h0LXJhZGl1cygwKTtcbn1cbi5pbnB1dC1ncm91cC1hZGRvbjpmaXJzdC1jaGlsZCB7XG4gIGJvcmRlci1yaWdodDogMDtcbn1cbi5pbnB1dC1ncm91cCAuZm9ybS1jb250cm9sOmxhc3QtY2hpbGQsXG4uaW5wdXQtZ3JvdXAtYWRkb246bGFzdC1jaGlsZCxcbi5pbnB1dC1ncm91cC1idG46bGFzdC1jaGlsZCA+IC5idG4sXG4uaW5wdXQtZ3JvdXAtYnRuOmxhc3QtY2hpbGQgPiAuYnRuLWdyb3VwID4gLmJ0bixcbi5pbnB1dC1ncm91cC1idG46bGFzdC1jaGlsZCA+IC5kcm9wZG93bi10b2dnbGUsXG4uaW5wdXQtZ3JvdXAtYnRuOmZpcnN0LWNoaWxkID4gLmJ0bjpub3QoOmZpcnN0LWNoaWxkKSxcbi5pbnB1dC1ncm91cC1idG46Zmlyc3QtY2hpbGQgPiAuYnRuLWdyb3VwOm5vdCg6Zmlyc3QtY2hpbGQpID4gLmJ0biB7XG4gIC5ib3JkZXItbGVmdC1yYWRpdXMoMCk7XG59XG4uaW5wdXQtZ3JvdXAtYWRkb246bGFzdC1jaGlsZCB7XG4gIGJvcmRlci1sZWZ0OiAwO1xufVxuXG4vLyBCdXR0b24gaW5wdXQgZ3JvdXBzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4uaW5wdXQtZ3JvdXAtYnRuIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAvLyBKYW5raWx5IHByZXZlbnQgaW5wdXQgYnV0dG9uIGdyb3VwcyBmcm9tIHdyYXBwaW5nIHdpdGggYHdoaXRlLXNwYWNlYCBhbmRcbiAgLy8gYGZvbnQtc2l6ZWAgaW4gY29tYmluYXRpb24gd2l0aCBgaW5saW5lLWJsb2NrYCBvbiBidXR0b25zLlxuICBmb250LXNpemU6IDA7XG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XG5cbiAgLy8gTmVnYXRpdmUgbWFyZ2luIGZvciBzcGFjaW5nLCBwb3NpdGlvbiBmb3IgYnJpbmdpbmcgaG92ZXJlZC9mb2N1c2VkL2FjdGl2ZWRcbiAgLy8gZWxlbWVudCBhYm92ZSB0aGUgc2libGluZ3MuXG4gID4gLmJ0biB7XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgICsgLmJ0biB7XG4gICAgICBtYXJnaW4tbGVmdDogLTFweDtcbiAgICB9XG4gICAgLy8gQnJpbmcgdGhlIFwiYWN0aXZlXCIgYnV0dG9uIHRvIHRoZSBmcm9udFxuICAgICY6aG92ZXIsXG4gICAgJjpmb2N1cyxcbiAgICAmOmFjdGl2ZSB7XG4gICAgICB6LWluZGV4OiAyO1xuICAgIH1cbiAgfVxuXG4gIC8vIE5lZ2F0aXZlIG1hcmdpbiB0byBvbmx5IGhhdmUgYSAxcHggYm9yZGVyIGJldHdlZW4gdGhlIHR3b1xuICAmOmZpcnN0LWNoaWxkIHtcbiAgICA+IC5idG4sXG4gICAgPiAuYnRuLWdyb3VwIHtcbiAgICAgIG1hcmdpbi1yaWdodDogLTFweDtcbiAgICB9XG4gIH1cbiAgJjpsYXN0LWNoaWxkIHtcbiAgICA+IC5idG4sXG4gICAgPiAuYnRuLWdyb3VwIHtcbiAgICAgIG1hcmdpbi1sZWZ0OiAtMXB4O1xuICAgIH1cbiAgfVxufVxuIiwiLy9cbi8vIE5hdnNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cblxuLy8gQmFzZSBjbGFzc1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLm5hdiB7XG4gIG1hcmdpbi1ib3R0b206IDA7XG4gIHBhZGRpbmctbGVmdDogMDsgLy8gT3ZlcnJpZGUgZGVmYXVsdCB1bC9vbFxuICBsaXN0LXN0eWxlOiBub25lO1xuICAmOmV4dGVuZCguY2xlYXJmaXggYWxsKTtcblxuICA+IGxpIHtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgZGlzcGxheTogYmxvY2s7XG5cbiAgICA+IGEge1xuICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICBwYWRkaW5nOiBAbmF2LWxpbmstcGFkZGluZztcbiAgICAgICY6aG92ZXIsXG4gICAgICAmOmZvY3VzIHtcbiAgICAgICAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xuICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAbmF2LWxpbmstaG92ZXItYmc7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gRGlzYWJsZWQgc3RhdGUgc2V0cyB0ZXh0IHRvIGdyYXkgYW5kIG51a2VzIGhvdmVyL3RhYiBlZmZlY3RzXG4gICAgJi5kaXNhYmxlZCA+IGEge1xuICAgICAgY29sb3I6IEBuYXYtZGlzYWJsZWQtbGluay1jb2xvcjtcblxuICAgICAgJjpob3ZlcixcbiAgICAgICY6Zm9jdXMge1xuICAgICAgICBjb2xvcjogQG5hdi1kaXNhYmxlZC1saW5rLWhvdmVyLWNvbG9yO1xuICAgICAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7XG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50O1xuICAgICAgICBjdXJzb3I6IEBjdXJzb3ItZGlzYWJsZWQ7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gT3BlbiBkcm9wZG93bnNcbiAgLm9wZW4gPiBhIHtcbiAgICAmLFxuICAgICY6aG92ZXIsXG4gICAgJjpmb2N1cyB7XG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAbmF2LWxpbmstaG92ZXItYmc7XG4gICAgICBib3JkZXItY29sb3I6IEBsaW5rLWNvbG9yO1xuICAgIH1cbiAgfVxuXG4gIC8vIE5hdiBkaXZpZGVycyAoZGVwcmVjYXRlZCB3aXRoIHYzLjAuMSlcbiAgLy9cbiAgLy8gVGhpcyBzaG91bGQgaGF2ZSBiZWVuIHJlbW92ZWQgaW4gdjMgd2l0aCB0aGUgZHJvcHBpbmcgb2YgYC5uYXYtbGlzdGAsIGJ1dFxuICAvLyB3ZSBtaXNzZWQgaXQuIFdlIGRvbid0IGN1cnJlbnRseSBzdXBwb3J0IHRoaXMgYW55d2hlcmUsIGJ1dCBpbiB0aGUgaW50ZXJlc3RcbiAgLy8gb2YgbWFpbnRhaW5pbmcgYmFja3dhcmQgY29tcGF0aWJpbGl0eSBpbiBjYXNlIHlvdSB1c2UgaXQsIGl0J3MgZGVwcmVjYXRlZC5cbiAgLm5hdi1kaXZpZGVyIHtcbiAgICAubmF2LWRpdmlkZXIoKTtcbiAgfVxuXG4gIC8vIFByZXZlbnQgSUU4IGZyb20gbWlzcGxhY2luZyBpbWdzXG4gIC8vXG4gIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vaDVicC9odG1sNS1ib2lsZXJwbGF0ZS9pc3N1ZXMvOTg0I2lzc3VlY29tbWVudC0zOTg1OTg5XG4gID4gbGkgPiBhID4gaW1nIHtcbiAgICBtYXgtd2lkdGg6IG5vbmU7XG4gIH1cbn1cblxuXG4vLyBUYWJzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8vIEdpdmUgdGhlIHRhYnMgc29tZXRoaW5nIHRvIHNpdCBvblxuLm5hdi10YWJzIHtcbiAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIEBuYXYtdGFicy1ib3JkZXItY29sb3I7XG4gID4gbGkge1xuICAgIGZsb2F0OiBsZWZ0O1xuICAgIC8vIE1ha2UgdGhlIGxpc3QtaXRlbXMgb3ZlcmxheSB0aGUgYm90dG9tIGJvcmRlclxuICAgIG1hcmdpbi1ib3R0b206IC0xcHg7XG5cbiAgICAvLyBBY3R1YWwgdGFicyAoYXMgbGlua3MpXG4gICAgPiBhIHtcbiAgICAgIG1hcmdpbi1yaWdodDogMnB4O1xuICAgICAgbGluZS1oZWlnaHQ6IEBsaW5lLWhlaWdodC1iYXNlO1xuICAgICAgYm9yZGVyOiAxcHggc29saWQgdHJhbnNwYXJlbnQ7XG4gICAgICBib3JkZXItcmFkaXVzOiBAYm9yZGVyLXJhZGl1cy1iYXNlIEBib3JkZXItcmFkaXVzLWJhc2UgMCAwO1xuICAgICAgJjpob3ZlciB7XG4gICAgICAgIGJvcmRlci1jb2xvcjogQG5hdi10YWJzLWxpbmstaG92ZXItYm9yZGVyLWNvbG9yIEBuYXYtdGFicy1saW5rLWhvdmVyLWJvcmRlci1jb2xvciBAbmF2LXRhYnMtYm9yZGVyLWNvbG9yO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEFjdGl2ZSBzdGF0ZSwgYW5kIGl0cyA6aG92ZXIgdG8gb3ZlcnJpZGUgbm9ybWFsIDpob3ZlclxuICAgICYuYWN0aXZlID4gYSB7XG4gICAgICAmLFxuICAgICAgJjpob3ZlcixcbiAgICAgICY6Zm9jdXMge1xuICAgICAgICBjb2xvcjogQG5hdi10YWJzLWFjdGl2ZS1saW5rLWhvdmVyLWNvbG9yO1xuICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAbmF2LXRhYnMtYWN0aXZlLWxpbmstaG92ZXItYmc7XG4gICAgICAgIGJvcmRlcjogMXB4IHNvbGlkIEBuYXYtdGFicy1hY3RpdmUtbGluay1ob3Zlci1ib3JkZXItY29sb3I7XG4gICAgICAgIGJvcmRlci1ib3R0b20tY29sb3I6IHRyYW5zcGFyZW50O1xuICAgICAgICBjdXJzb3I6IGRlZmF1bHQ7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIC8vIHB1bGxpbmcgdGhpcyBpbiBtYWlubHkgZm9yIGxlc3Mgc2hvcnRoYW5kXG4gICYubmF2LWp1c3RpZmllZCB7XG4gICAgLm5hdi1qdXN0aWZpZWQoKTtcbiAgICAubmF2LXRhYnMtanVzdGlmaWVkKCk7XG4gIH1cbn1cblxuXG4vLyBQaWxsc1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLm5hdi1waWxscyB7XG4gID4gbGkge1xuICAgIGZsb2F0OiBsZWZ0O1xuXG4gICAgLy8gTGlua3MgcmVuZGVyZWQgYXMgcGlsbHNcbiAgICA+IGEge1xuICAgICAgYm9yZGVyLXJhZGl1czogQG5hdi1waWxscy1ib3JkZXItcmFkaXVzO1xuICAgIH1cbiAgICArIGxpIHtcbiAgICAgIG1hcmdpbi1sZWZ0OiAycHg7XG4gICAgfVxuXG4gICAgLy8gQWN0aXZlIHN0YXRlXG4gICAgJi5hY3RpdmUgPiBhIHtcbiAgICAgICYsXG4gICAgICAmOmhvdmVyLFxuICAgICAgJjpmb2N1cyB7XG4gICAgICAgIGNvbG9yOiBAbmF2LXBpbGxzLWFjdGl2ZS1saW5rLWhvdmVyLWNvbG9yO1xuICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAbmF2LXBpbGxzLWFjdGl2ZS1saW5rLWhvdmVyLWJnO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5cbi8vIFN0YWNrZWQgcGlsbHNcbi5uYXYtc3RhY2tlZCB7XG4gID4gbGkge1xuICAgIGZsb2F0OiBub25lO1xuICAgICsgbGkge1xuICAgICAgbWFyZ2luLXRvcDogMnB4O1xuICAgICAgbWFyZ2luLWxlZnQ6IDA7IC8vIG5vIG5lZWQgZm9yIHRoaXMgZ2FwIGJldHdlZW4gbmF2IGl0ZW1zXG4gICAgfVxuICB9XG59XG5cblxuLy8gTmF2IHZhcmlhdGlvbnNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8vIEp1c3RpZmllZCBuYXYgbGlua3Ncbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLm5hdi1qdXN0aWZpZWQge1xuICB3aWR0aDogMTAwJTtcblxuICA+IGxpIHtcbiAgICBmbG9hdDogbm9uZTtcbiAgICA+IGEge1xuICAgICAgdGV4dC1hbGlnbjogY2VudGVyO1xuICAgICAgbWFyZ2luLWJvdHRvbTogNXB4O1xuICAgIH1cbiAgfVxuXG4gID4gLmRyb3Bkb3duIC5kcm9wZG93bi1tZW51IHtcbiAgICB0b3A6IGF1dG87XG4gICAgbGVmdDogYXV0bztcbiAgfVxuXG4gIEBtZWRpYSAobWluLXdpZHRoOiBAc2NyZWVuLXNtLW1pbikge1xuICAgID4gbGkge1xuICAgICAgZGlzcGxheTogdGFibGUtY2VsbDtcbiAgICAgIHdpZHRoOiAxJTtcbiAgICAgID4gYSB7XG4gICAgICAgIG1hcmdpbi1ib3R0b206IDA7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbi8vIE1vdmUgYm9yZGVycyB0byBhbmNob3JzIGluc3RlYWQgb2YgYm90dG9tIG9mIGxpc3Rcbi8vXG4vLyBNaXhpbiBmb3IgYWRkaW5nIG9uIHRvcCB0aGUgc2hhcmVkIGAubmF2LWp1c3RpZmllZGAgc3R5bGVzIGZvciBvdXIgdGFic1xuLm5hdi10YWJzLWp1c3RpZmllZCB7XG4gIGJvcmRlci1ib3R0b206IDA7XG5cbiAgPiBsaSA+IGEge1xuICAgIC8vIE92ZXJyaWRlIG1hcmdpbiBmcm9tIC5uYXYtdGFic1xuICAgIG1hcmdpbi1yaWdodDogMDtcbiAgICBib3JkZXItcmFkaXVzOiBAYm9yZGVyLXJhZGl1cy1iYXNlO1xuICB9XG5cbiAgPiAuYWN0aXZlID4gYSxcbiAgPiAuYWN0aXZlID4gYTpob3ZlcixcbiAgPiAuYWN0aXZlID4gYTpmb2N1cyB7XG4gICAgYm9yZGVyOiAxcHggc29saWQgQG5hdi10YWJzLWp1c3RpZmllZC1saW5rLWJvcmRlci1jb2xvcjtcbiAgfVxuXG4gIEBtZWRpYSAobWluLXdpZHRoOiBAc2NyZWVuLXNtLW1pbikge1xuICAgID4gbGkgPiBhIHtcbiAgICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCBAbmF2LXRhYnMtanVzdGlmaWVkLWxpbmstYm9yZGVyLWNvbG9yO1xuICAgICAgYm9yZGVyLXJhZGl1czogQGJvcmRlci1yYWRpdXMtYmFzZSBAYm9yZGVyLXJhZGl1cy1iYXNlIDAgMDtcbiAgICB9XG4gICAgPiAuYWN0aXZlID4gYSxcbiAgICA+IC5hY3RpdmUgPiBhOmhvdmVyLFxuICAgID4gLmFjdGl2ZSA+IGE6Zm9jdXMge1xuICAgICAgYm9yZGVyLWJvdHRvbS1jb2xvcjogQG5hdi10YWJzLWp1c3RpZmllZC1hY3RpdmUtbGluay1ib3JkZXItY29sb3I7XG4gICAgfVxuICB9XG59XG5cblxuLy8gVGFiYmFibGUgdGFic1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vLyBIaWRlIHRhYmJhYmxlIHBhbmVzIHRvIHN0YXJ0LCBzaG93IHRoZW0gd2hlbiBgLmFjdGl2ZWBcbi50YWItY29udGVudCB7XG4gID4gLnRhYi1wYW5lIHtcbiAgICBkaXNwbGF5OiBub25lO1xuICAgIHZpc2liaWxpdHk6IGhpZGRlbjtcbiAgfVxuICA+IC5hY3RpdmUge1xuICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgIHZpc2liaWxpdHk6IHZpc2libGU7XG4gIH1cbn1cblxuXG4vLyBEcm9wZG93bnNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLy8gU3BlY2lmaWMgZHJvcGRvd25zXG4ubmF2LXRhYnMgLmRyb3Bkb3duLW1lbnUge1xuICAvLyBtYWtlIGRyb3Bkb3duIGJvcmRlciBvdmVybGFwIHRhYiBib3JkZXJcbiAgbWFyZ2luLXRvcDogLTFweDtcbiAgLy8gUmVtb3ZlIHRoZSB0b3Agcm91bmRlZCBjb3JuZXJzIGhlcmUgc2luY2UgdGhlcmUgaXMgYSBoYXJkIGVkZ2UgYWJvdmUgdGhlIG1lbnVcbiAgLmJvcmRlci10b3AtcmFkaXVzKDApO1xufVxuIiwiLy9cbi8vIE5hdmJhcnNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cblxuLy8gV3JhcHBlciBhbmQgYmFzZSBjbGFzc1xuLy9cbi8vIFByb3ZpZGUgYSBzdGF0aWMgbmF2YmFyIGZyb20gd2hpY2ggd2UgZXhwYW5kIHRvIGNyZWF0ZSBmdWxsLXdpZHRoLCBmaXhlZCwgYW5kXG4vLyBvdGhlciBuYXZiYXIgdmFyaWF0aW9ucy5cblxuLm5hdmJhciB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgbWluLWhlaWdodDogQG5hdmJhci1oZWlnaHQ7IC8vIEVuc3VyZSBhIG5hdmJhciBhbHdheXMgc2hvd3MgKGUuZy4sIHdpdGhvdXQgYSAubmF2YmFyLWJyYW5kIGluIGNvbGxhcHNlZCBtb2RlKVxuICBtYXJnaW4tYm90dG9tOiBAbmF2YmFyLW1hcmdpbi1ib3R0b207XG4gIGJvcmRlcjogMXB4IHNvbGlkIHRyYW5zcGFyZW50O1xuXG4gIC8vIFByZXZlbnQgZmxvYXRzIGZyb20gYnJlYWtpbmcgdGhlIG5hdmJhclxuICAmOmV4dGVuZCguY2xlYXJmaXggYWxsKTtcblxuICBAbWVkaWEgKG1pbi13aWR0aDogQGdyaWQtZmxvYXQtYnJlYWtwb2ludCkge1xuICAgIGJvcmRlci1yYWRpdXM6IEBuYXZiYXItYm9yZGVyLXJhZGl1cztcbiAgfVxufVxuXG5cbi8vIE5hdmJhciBoZWFkaW5nXG4vL1xuLy8gR3JvdXBzIGAubmF2YmFyLWJyYW5kYCBhbmQgYC5uYXZiYXItdG9nZ2xlYCBpbnRvIGEgc2luZ2xlIGNvbXBvbmVudCBmb3IgZWFzeVxuLy8gc3R5bGluZyBvZiByZXNwb25zaXZlIGFzcGVjdHMuXG5cbi5uYXZiYXItaGVhZGVyIHtcbiAgJjpleHRlbmQoLmNsZWFyZml4IGFsbCk7XG5cbiAgQG1lZGlhIChtaW4td2lkdGg6IEBncmlkLWZsb2F0LWJyZWFrcG9pbnQpIHtcbiAgICBmbG9hdDogbGVmdDtcbiAgfVxufVxuXG5cbi8vIE5hdmJhciBjb2xsYXBzZSAoYm9keSlcbi8vXG4vLyBHcm91cCB5b3VyIG5hdmJhciBjb250ZW50IGludG8gdGhpcyBmb3IgZWFzeSBjb2xsYXBzaW5nIGFuZCBleHBhbmRpbmcgYWNyb3NzXG4vLyB2YXJpb3VzIGRldmljZSBzaXplcy4gQnkgZGVmYXVsdCwgdGhpcyBjb250ZW50IGlzIGNvbGxhcHNlZCB3aGVuIDw3NjhweCwgYnV0XG4vLyB3aWxsIGV4cGFuZCBwYXN0IHRoYXQgZm9yIGEgaG9yaXpvbnRhbCBkaXNwbGF5LlxuLy9cbi8vIFRvIHN0YXJ0IChvbiBtb2JpbGUgZGV2aWNlcykgdGhlIG5hdmJhciBsaW5rcywgZm9ybXMsIGFuZCBidXR0b25zIGFyZSBzdGFja2VkXG4vLyB2ZXJ0aWNhbGx5IGFuZCBpbmNsdWRlIGEgYG1heC1oZWlnaHRgIHRvIG92ZXJmbG93IGluIGNhc2UgeW91IGhhdmUgdG9vIG11Y2hcbi8vIGNvbnRlbnQgZm9yIHRoZSB1c2VyJ3Mgdmlld3BvcnQuXG5cbi5uYXZiYXItY29sbGFwc2Uge1xuICBvdmVyZmxvdy14OiB2aXNpYmxlO1xuICBwYWRkaW5nLXJpZ2h0OiBAbmF2YmFyLXBhZGRpbmctaG9yaXpvbnRhbDtcbiAgcGFkZGluZy1sZWZ0OiAgQG5hdmJhci1wYWRkaW5nLWhvcml6b250YWw7XG4gIGJvcmRlci10b3A6IDFweCBzb2xpZCB0cmFuc3BhcmVudDtcbiAgYm94LXNoYWRvdzogaW5zZXQgMCAxcHggMCByZ2JhKDI1NSwyNTUsMjU1LC4xKTtcbiAgJjpleHRlbmQoLmNsZWFyZml4IGFsbCk7XG4gIC13ZWJraXQtb3ZlcmZsb3ctc2Nyb2xsaW5nOiB0b3VjaDtcblxuICAmLmluIHtcbiAgICBvdmVyZmxvdy15OiBhdXRvO1xuICB9XG5cbiAgQG1lZGlhIChtaW4td2lkdGg6IEBncmlkLWZsb2F0LWJyZWFrcG9pbnQpIHtcbiAgICB3aWR0aDogYXV0bztcbiAgICBib3JkZXItdG9wOiAwO1xuICAgIGJveC1zaGFkb3c6IG5vbmU7XG5cbiAgICAmLmNvbGxhcHNlIHtcbiAgICAgIGRpc3BsYXk6IGJsb2NrICFpbXBvcnRhbnQ7XG4gICAgICB2aXNpYmlsaXR5OiB2aXNpYmxlICFpbXBvcnRhbnQ7XG4gICAgICBoZWlnaHQ6IGF1dG8gIWltcG9ydGFudDtcbiAgICAgIHBhZGRpbmctYm90dG9tOiAwOyAvLyBPdmVycmlkZSBkZWZhdWx0IHNldHRpbmdcbiAgICAgIG92ZXJmbG93OiB2aXNpYmxlICFpbXBvcnRhbnQ7XG4gICAgfVxuXG4gICAgJi5pbiB7XG4gICAgICBvdmVyZmxvdy15OiB2aXNpYmxlO1xuICAgIH1cblxuICAgIC8vIFVuZG8gdGhlIGNvbGxhcHNlIHNpZGUgcGFkZGluZyBmb3IgbmF2YmFycyB3aXRoIGNvbnRhaW5lcnMgdG8gZW5zdXJlXG4gICAgLy8gYWxpZ25tZW50IG9mIHJpZ2h0LWFsaWduZWQgY29udGVudHMuXG4gICAgLm5hdmJhci1maXhlZC10b3AgJixcbiAgICAubmF2YmFyLXN0YXRpYy10b3AgJixcbiAgICAubmF2YmFyLWZpeGVkLWJvdHRvbSAmIHtcbiAgICAgIHBhZGRpbmctbGVmdDogMDtcbiAgICAgIHBhZGRpbmctcmlnaHQ6IDA7XG4gICAgfVxuICB9XG59XG5cbi5uYXZiYXItZml4ZWQtdG9wLFxuLm5hdmJhci1maXhlZC1ib3R0b20ge1xuICAubmF2YmFyLWNvbGxhcHNlIHtcbiAgICBtYXgtaGVpZ2h0OiBAbmF2YmFyLWNvbGxhcHNlLW1heC1oZWlnaHQ7XG5cbiAgICBAbWVkaWEgKG1heC1kZXZpY2Utd2lkdGg6IEBzY3JlZW4teHMtbWluKSBhbmQgKG9yaWVudGF0aW9uOiBsYW5kc2NhcGUpIHtcbiAgICAgIG1heC1oZWlnaHQ6IDIwMHB4O1xuICAgIH1cbiAgfVxufVxuXG5cbi8vIEJvdGggbmF2YmFyIGhlYWRlciBhbmQgY29sbGFwc2Vcbi8vXG4vLyBXaGVuIGEgY29udGFpbmVyIGlzIHByZXNlbnQsIGNoYW5nZSB0aGUgYmVoYXZpb3Igb2YgdGhlIGhlYWRlciBhbmQgY29sbGFwc2UuXG5cbi5jb250YWluZXIsXG4uY29udGFpbmVyLWZsdWlkIHtcbiAgPiAubmF2YmFyLWhlYWRlcixcbiAgPiAubmF2YmFyLWNvbGxhcHNlIHtcbiAgICBtYXJnaW4tcmlnaHQ6IC1AbmF2YmFyLXBhZGRpbmctaG9yaXpvbnRhbDtcbiAgICBtYXJnaW4tbGVmdDogIC1AbmF2YmFyLXBhZGRpbmctaG9yaXpvbnRhbDtcblxuICAgIEBtZWRpYSAobWluLXdpZHRoOiBAZ3JpZC1mbG9hdC1icmVha3BvaW50KSB7XG4gICAgICBtYXJnaW4tcmlnaHQ6IDA7XG4gICAgICBtYXJnaW4tbGVmdDogIDA7XG4gICAgfVxuICB9XG59XG5cblxuLy9cbi8vIE5hdmJhciBhbGlnbm1lbnQgb3B0aW9uc1xuLy9cbi8vIERpc3BsYXkgdGhlIG5hdmJhciBhY3Jvc3MgdGhlIGVudGlyZXR5IG9mIHRoZSBwYWdlIG9yIGZpeGVkIGl0IHRvIHRoZSB0b3Agb3Jcbi8vIGJvdHRvbSBvZiB0aGUgcGFnZS5cblxuLy8gU3RhdGljIHRvcCAodW5maXhlZCwgYnV0IDEwMCUgd2lkZSkgbmF2YmFyXG4ubmF2YmFyLXN0YXRpYy10b3Age1xuICB6LWluZGV4OiBAemluZGV4LW5hdmJhcjtcbiAgYm9yZGVyLXdpZHRoOiAwIDAgMXB4O1xuXG4gIEBtZWRpYSAobWluLXdpZHRoOiBAZ3JpZC1mbG9hdC1icmVha3BvaW50KSB7XG4gICAgYm9yZGVyLXJhZGl1czogMDtcbiAgfVxufVxuXG4vLyBGaXggdGhlIHRvcC9ib3R0b20gbmF2YmFycyB3aGVuIHNjcmVlbiByZWFsIGVzdGF0ZSBzdXBwb3J0cyBpdFxuLm5hdmJhci1maXhlZC10b3AsXG4ubmF2YmFyLWZpeGVkLWJvdHRvbSB7XG4gIHBvc2l0aW9uOiBmaXhlZDtcbiAgcmlnaHQ6IDA7XG4gIGxlZnQ6IDA7XG4gIHotaW5kZXg6IEB6aW5kZXgtbmF2YmFyLWZpeGVkO1xuXG4gIC8vIFVuZG8gdGhlIHJvdW5kZWQgY29ybmVyc1xuICBAbWVkaWEgKG1pbi13aWR0aDogQGdyaWQtZmxvYXQtYnJlYWtwb2ludCkge1xuICAgIGJvcmRlci1yYWRpdXM6IDA7XG4gIH1cbn1cbi5uYXZiYXItZml4ZWQtdG9wIHtcbiAgdG9wOiAwO1xuICBib3JkZXItd2lkdGg6IDAgMCAxcHg7XG59XG4ubmF2YmFyLWZpeGVkLWJvdHRvbSB7XG4gIGJvdHRvbTogMDtcbiAgbWFyZ2luLWJvdHRvbTogMDsgLy8gb3ZlcnJpZGUgLm5hdmJhciBkZWZhdWx0c1xuICBib3JkZXItd2lkdGg6IDFweCAwIDA7XG59XG5cblxuLy8gQnJhbmQvcHJvamVjdCBuYW1lXG5cbi5uYXZiYXItYnJhbmQge1xuICBmbG9hdDogbGVmdDtcbiAgcGFkZGluZzogQG5hdmJhci1wYWRkaW5nLXZlcnRpY2FsIEBuYXZiYXItcGFkZGluZy1ob3Jpem9udGFsO1xuICBmb250LXNpemU6IEBmb250LXNpemUtbGFyZ2U7XG4gIGxpbmUtaGVpZ2h0OiBAbGluZS1oZWlnaHQtY29tcHV0ZWQ7XG4gIGhlaWdodDogQG5hdmJhci1oZWlnaHQ7XG5cbiAgJjpob3ZlcixcbiAgJjpmb2N1cyB7XG4gICAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xuICB9XG5cbiAgPiBpbWcge1xuICAgIGRpc3BsYXk6IGJsb2NrO1xuICB9XG5cbiAgQG1lZGlhIChtaW4td2lkdGg6IEBncmlkLWZsb2F0LWJyZWFrcG9pbnQpIHtcbiAgICAubmF2YmFyID4gLmNvbnRhaW5lciAmLFxuICAgIC5uYXZiYXIgPiAuY29udGFpbmVyLWZsdWlkICYge1xuICAgICAgbWFyZ2luLWxlZnQ6IC1AbmF2YmFyLXBhZGRpbmctaG9yaXpvbnRhbDtcbiAgICB9XG4gIH1cbn1cblxuXG4vLyBOYXZiYXIgdG9nZ2xlXG4vL1xuLy8gQ3VzdG9tIGJ1dHRvbiBmb3IgdG9nZ2xpbmcgdGhlIGAubmF2YmFyLWNvbGxhcHNlYCwgcG93ZXJlZCBieSB0aGUgY29sbGFwc2Vcbi8vIEphdmFTY3JpcHQgcGx1Z2luLlxuXG4ubmF2YmFyLXRvZ2dsZSB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgZmxvYXQ6IHJpZ2h0O1xuICBtYXJnaW4tcmlnaHQ6IEBuYXZiYXItcGFkZGluZy1ob3Jpem9udGFsO1xuICBwYWRkaW5nOiA5cHggMTBweDtcbiAgLm5hdmJhci12ZXJ0aWNhbC1hbGlnbigzNHB4KTtcbiAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7XG4gIGJhY2tncm91bmQtaW1hZ2U6IG5vbmU7IC8vIFJlc2V0IHVudXN1YWwgRmlyZWZveC1vbi1BbmRyb2lkIGRlZmF1bHQgc3R5bGU7IHNlZSBodHRwczovL2dpdGh1Yi5jb20vbmVjb2xhcy9ub3JtYWxpemUuY3NzL2lzc3Vlcy8yMTRcbiAgYm9yZGVyOiAxcHggc29saWQgdHJhbnNwYXJlbnQ7XG4gIGJvcmRlci1yYWRpdXM6IEBib3JkZXItcmFkaXVzLWJhc2U7XG5cbiAgLy8gV2UgcmVtb3ZlIHRoZSBgb3V0bGluZWAgaGVyZSwgYnV0IGxhdGVyIGNvbXBlbnNhdGUgYnkgYXR0YWNoaW5nIGA6aG92ZXJgXG4gIC8vIHN0eWxlcyB0byBgOmZvY3VzYC5cbiAgJjpmb2N1cyB7XG4gICAgb3V0bGluZTogMDtcbiAgfVxuXG4gIC8vIEJhcnNcbiAgLmljb24tYmFyIHtcbiAgICBkaXNwbGF5OiBibG9jaztcbiAgICB3aWR0aDogMjJweDtcbiAgICBoZWlnaHQ6IDJweDtcbiAgICBib3JkZXItcmFkaXVzOiAxcHg7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2VlZWVlZSAhaW1wb3J0YW50O1xuICB9XG4gIC5pY29uLWJhciArIC5pY29uLWJhciB7XG4gICAgbWFyZ2luLXRvcDogNHB4O1xuICB9XG5cbiAgQG1lZGlhIChtaW4td2lkdGg6IEBncmlkLWZsb2F0LWJyZWFrcG9pbnQpIHtcbiAgICBkaXNwbGF5OiBub25lO1xuICB9XG59XG5cblxuLy8gTmF2YmFyIG5hdiBsaW5rc1xuLy9cbi8vIEJ1aWxkcyBvbiB0b3Agb2YgdGhlIGAubmF2YCBjb21wb25lbnRzIHdpdGggaXRzIG93biBtb2RpZmllciBjbGFzcyB0byBtYWtlXG4vLyB0aGUgbmF2IHRoZSBmdWxsIGhlaWdodCBvZiB0aGUgaG9yaXpvbnRhbCBuYXYgKGFib3ZlIDc2OHB4KS5cblxuLm5hdmJhci1uYXYge1xuICBtYXJnaW46IChAbmF2YmFyLXBhZGRpbmctdmVydGljYWwgLyAyKSAtQG5hdmJhci1wYWRkaW5nLWhvcml6b250YWw7XG5cbiAgPiBsaSA+IGEge1xuICAgIHBhZGRpbmctdG9wOiAgICAxMHB4O1xuICAgIHBhZGRpbmctYm90dG9tOiAxMHB4O1xuICAgIGxpbmUtaGVpZ2h0OiBAbGluZS1oZWlnaHQtY29tcHV0ZWQ7XG4gIH1cblxuICBAbWVkaWEgKG1heC13aWR0aDogQGdyaWQtZmxvYXQtYnJlYWtwb2ludC1tYXgpIHtcbiAgICAvLyBEcm9wZG93bnMgZ2V0IGN1c3RvbSBkaXNwbGF5IHdoZW4gY29sbGFwc2VkXG4gICAgLm9wZW4gLmRyb3Bkb3duLW1lbnUge1xuICAgICAgcG9zaXRpb246IHN0YXRpYztcbiAgICAgIGZsb2F0OiBub25lO1xuICAgICAgd2lkdGg6IGF1dG87XG4gICAgICBtYXJnaW4tdG9wOiAwO1xuICAgICAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7XG4gICAgICBib3JkZXI6IDA7XG4gICAgICBib3gtc2hhZG93OiBub25lO1xuICAgICAgPiBsaSA+IGEsXG4gICAgICAuZHJvcGRvd24taGVhZGVyIHtcbiAgICAgICAgcGFkZGluZzogNXB4IDE1cHggNXB4IDI1cHg7XG4gICAgICB9XG4gICAgICA+IGxpID4gYSB7XG4gICAgICAgIGxpbmUtaGVpZ2h0OiBAbGluZS1oZWlnaHQtY29tcHV0ZWQ7XG4gICAgICAgICY6aG92ZXIsXG4gICAgICAgICY6Zm9jdXMge1xuICAgICAgICAgIGJhY2tncm91bmQtaW1hZ2U6IG5vbmU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBVbmNvbGxhcHNlIHRoZSBuYXZcbiAgQG1lZGlhIChtaW4td2lkdGg6IEBncmlkLWZsb2F0LWJyZWFrcG9pbnQpIHtcbiAgICBmbG9hdDogbGVmdDtcbiAgICBtYXJnaW46IDA7XG5cbiAgICA+IGxpIHtcbiAgICAgIGZsb2F0OiBsZWZ0O1xuICAgICAgPiBhIHtcbiAgICAgICAgcGFkZGluZy10b3A6ICAgIEBuYXZiYXItcGFkZGluZy12ZXJ0aWNhbDtcbiAgICAgICAgcGFkZGluZy1ib3R0b206IEBuYXZiYXItcGFkZGluZy12ZXJ0aWNhbDtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuXG4vLyBOYXZiYXIgZm9ybVxuLy9cbi8vIEV4dGVuc2lvbiBvZiB0aGUgYC5mb3JtLWlubGluZWAgd2l0aCBzb21lIGV4dHJhIGZsYXZvciBmb3Igb3B0aW11bSBkaXNwbGF5IGluXG4vLyBvdXIgbmF2YmFycy5cblxuLm5hdmJhci1mb3JtIHtcbiAgbWFyZ2luLWxlZnQ6IC1AbmF2YmFyLXBhZGRpbmctaG9yaXpvbnRhbDtcbiAgbWFyZ2luLXJpZ2h0OiAtQG5hdmJhci1wYWRkaW5nLWhvcml6b250YWw7XG4gIHBhZGRpbmc6IDEwcHggQG5hdmJhci1wYWRkaW5nLWhvcml6b250YWw7XG4gIGJvcmRlci10b3A6IDFweCBzb2xpZCB0cmFuc3BhcmVudDtcbiAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHRyYW5zcGFyZW50O1xuICBAc2hhZG93OiBpbnNldCAwIDFweCAwIHJnYmEoMjU1LDI1NSwyNTUsLjEpLCAwIDFweCAwIHJnYmEoMjU1LDI1NSwyNTUsLjEpO1xuICAuYm94LXNoYWRvdyhAc2hhZG93KTtcblxuICAvLyBNaXhpbiBiZWhhdmlvciBmb3Igb3B0aW11bSBkaXNwbGF5XG4gIC5mb3JtLWlubGluZSgpO1xuXG4gIC5mb3JtLWdyb3VwIHtcbiAgICBAbWVkaWEgKG1heC13aWR0aDogQGdyaWQtZmxvYXQtYnJlYWtwb2ludC1tYXgpIHtcbiAgICAgIG1hcmdpbi1ib3R0b206IDVweDtcblxuICAgICAgJjpsYXN0LWNoaWxkIHtcbiAgICAgICAgbWFyZ2luLWJvdHRvbTogMDtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBWZXJ0aWNhbGx5IGNlbnRlciBpbiBleHBhbmRlZCwgaG9yaXpvbnRhbCBuYXZiYXJcbiAgLm5hdmJhci12ZXJ0aWNhbC1hbGlnbihAaW5wdXQtaGVpZ2h0LWJhc2UpO1xuXG4gIC8vIFVuZG8gMTAwJSB3aWR0aCBmb3IgcHVsbCBjbGFzc2VzXG4gIEBtZWRpYSAobWluLXdpZHRoOiBAZ3JpZC1mbG9hdC1icmVha3BvaW50KSB7XG4gICAgd2lkdGg6IGF1dG87XG4gICAgYm9yZGVyOiAwO1xuICAgIG1hcmdpbi1sZWZ0OiAwO1xuICAgIG1hcmdpbi1yaWdodDogMDtcbiAgICBwYWRkaW5nLXRvcDogMDtcbiAgICBwYWRkaW5nLWJvdHRvbTogMDtcbiAgICAuYm94LXNoYWRvdyhub25lKTtcbiAgfVxufVxuXG5cbi8vIERyb3Bkb3duIG1lbnVzXG5cbi8vIE1lbnUgcG9zaXRpb24gYW5kIG1lbnUgY2FyZXRzXG4ubmF2YmFyLW5hdiA+IGxpID4gLmRyb3Bkb3duLW1lbnUge1xuICBtYXJnaW4tdG9wOiAwO1xuICAuYm9yZGVyLXRvcC1yYWRpdXMoMCk7XG59XG4vLyBNZW51IHBvc2l0aW9uIGFuZCBtZW51IGNhcmV0IHN1cHBvcnQgZm9yIGRyb3B1cHMgdmlhIGV4dHJhIGRyb3B1cCBjbGFzc1xuLm5hdmJhci1maXhlZC1ib3R0b20gLm5hdmJhci1uYXYgPiBsaSA+IC5kcm9wZG93bi1tZW51IHtcbiAgLmJvcmRlci1ib3R0b20tcmFkaXVzKDApO1xufVxuXG5cbi8vIEJ1dHRvbnMgaW4gbmF2YmFyc1xuLy9cbi8vIFZlcnRpY2FsbHkgY2VudGVyIGEgYnV0dG9uIHdpdGhpbiBhIG5hdmJhciAod2hlbiAqbm90KiBpbiBhIGZvcm0pLlxuXG4ubmF2YmFyLWJ0biB7XG4gIC5uYXZiYXItdmVydGljYWwtYWxpZ24oQGlucHV0LWhlaWdodC1iYXNlKTtcblxuICAmLmJ0bi1zbSB7XG4gICAgLm5hdmJhci12ZXJ0aWNhbC1hbGlnbihAaW5wdXQtaGVpZ2h0LXNtYWxsKTtcbiAgfVxuICAmLmJ0bi14cyB7XG4gICAgLm5hdmJhci12ZXJ0aWNhbC1hbGlnbigyMik7XG4gIH1cbn1cblxuXG4vLyBUZXh0IGluIG5hdmJhcnNcbi8vXG4vLyBBZGQgYSBjbGFzcyB0byBtYWtlIGFueSBlbGVtZW50IHByb3Blcmx5IGFsaWduIGl0c2VsZiB2ZXJ0aWNhbGx5IHdpdGhpbiB0aGUgbmF2YmFycy5cblxuLm5hdmJhci10ZXh0IHtcbiAgLm5hdmJhci12ZXJ0aWNhbC1hbGlnbihAbGluZS1oZWlnaHQtY29tcHV0ZWQpO1xuXG4gIEBtZWRpYSAobWluLXdpZHRoOiBAZ3JpZC1mbG9hdC1icmVha3BvaW50KSB7XG4gICAgZmxvYXQ6IGxlZnQ7XG4gICAgbWFyZ2luLWxlZnQ6IEBuYXZiYXItcGFkZGluZy1ob3Jpem9udGFsO1xuICAgIG1hcmdpbi1yaWdodDogQG5hdmJhci1wYWRkaW5nLWhvcml6b250YWw7XG4gIH1cbn1cblxuXG4vLyBDb21wb25lbnQgYWxpZ25tZW50XG4vL1xuLy8gUmVwdXJwb3NlIHRoZSBwdWxsIHV0aWxpdGllcyBhcyB0aGVpciBvd24gbmF2YmFyIHV0aWxpdGllcyB0byBhdm9pZCBzcGVjaWZpY2l0eVxuLy8gaXNzdWVzIHdpdGggcGFyZW50cyBhbmQgY2hhaW5pbmcuIE9ubHkgZG8gdGhpcyB3aGVuIHRoZSBuYXZiYXIgaXMgdW5jb2xsYXBzZWRcbi8vIHRob3VnaCBzbyB0aGF0IG5hdmJhciBjb250ZW50cyBwcm9wZXJseSBzdGFjayBhbmQgYWxpZ24gaW4gbW9iaWxlLlxuLy9cbi8vIERlY2xhcmVkIGFmdGVyIHRoZSBuYXZiYXIgY29tcG9uZW50cyB0byBlbnN1cmUgbW9yZSBzcGVjaWZpY2l0eSBvbiB0aGUgbWFyZ2lucy5cblxuQG1lZGlhIChtaW4td2lkdGg6IEBncmlkLWZsb2F0LWJyZWFrcG9pbnQpIHtcbiAgLm5hdmJhci1sZWZ0ICB7IC5wdWxsLWxlZnQoKTsgfVxuICAubmF2YmFyLXJpZ2h0IHtcbiAgICAucHVsbC1yaWdodCgpO1xuICAgIG1hcmdpbi1yaWdodDogLUBuYXZiYXItcGFkZGluZy1ob3Jpem9udGFsO1xuXG4gICAgfiAubmF2YmFyLXJpZ2h0IHtcbiAgICAgIG1hcmdpbi1yaWdodDogMDtcbiAgICB9XG4gIH1cbn1cblxuXG4vLyBBbHRlcm5hdGUgbmF2YmFyc1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLy8gRGVmYXVsdCBuYXZiYXJcbi5uYXZiYXItZGVmYXVsdCB7XG4gIGJhY2tncm91bmQtY29sb3I6IEBuYXZiYXItZGVmYXVsdC1iZztcbiAgYm9yZGVyLWNvbG9yOiBAbmF2YmFyLWRlZmF1bHQtYm9yZGVyO1xuXG4gIC5uYXZiYXItYnJhbmQge1xuICAgIGNvbG9yOiBAbmF2YmFyLWRlZmF1bHQtYnJhbmQtY29sb3I7XG4gICAgJjpob3ZlcixcbiAgICAmOmZvY3VzIHtcbiAgICAgIGNvbG9yOiBAbmF2YmFyLWRlZmF1bHQtYnJhbmQtaG92ZXItY29sb3I7XG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAbmF2YmFyLWRlZmF1bHQtYnJhbmQtaG92ZXItYmc7XG4gICAgfVxuICB9XG5cbiAgLm5hdmJhci10ZXh0IHtcbiAgICBjb2xvcjogQG5hdmJhci1kZWZhdWx0LWNvbG9yO1xuICB9XG5cbiAgLm5hdmJhci1uYXYge1xuICAgID4gbGkgPiBhIHtcbiAgICAgIGNvbG9yOiBAbmF2YmFyLWRlZmF1bHQtbGluay1jb2xvcjtcblxuICAgICAgJjpob3ZlcixcbiAgICAgICY6Zm9jdXMge1xuICAgICAgICBjb2xvcjogQG5hdmJhci1kZWZhdWx0LWxpbmstaG92ZXItY29sb3I7XG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6IEBuYXZiYXItZGVmYXVsdC1saW5rLWhvdmVyLWJnO1xuICAgICAgfVxuICAgIH1cbiAgICA+IC5hY3RpdmUgPiBhIHtcbiAgICAgICYsXG4gICAgICAmOmhvdmVyLFxuICAgICAgJjpmb2N1cyB7XG4gICAgICAgIGNvbG9yOiBAbmF2YmFyLWRlZmF1bHQtbGluay1hY3RpdmUtY29sb3I7XG4gICAgICB9XG4gICAgfVxuICAgID4gLmRpc2FibGVkID4gYSB7XG4gICAgICAmLFxuICAgICAgJjpob3ZlcixcbiAgICAgICY6Zm9jdXMge1xuICAgICAgICBjb2xvcjogQG5hdmJhci1kZWZhdWx0LWxpbmstZGlzYWJsZWQtY29sb3I7XG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6IEBuYXZiYXItZGVmYXVsdC1saW5rLWRpc2FibGVkLWJnO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC5uYXZiYXItdG9nZ2xlIHtcbiAgICBib3JkZXItY29sb3I6IEBuYXZiYXItZGVmYXVsdC10b2dnbGUtYm9yZGVyLWNvbG9yO1xuICAgICY6aG92ZXIsXG4gICAgJjpmb2N1cyB7XG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAbmF2YmFyLWRlZmF1bHQtdG9nZ2xlLWhvdmVyLWJnO1xuICAgIH1cbiAgICAuaWNvbi1iYXIge1xuICAgICAgYmFja2dyb3VuZC1jb2xvcjogQG5hdmJhci1kZWZhdWx0LXRvZ2dsZS1pY29uLWJhci1iZztcbiAgICB9XG4gIH1cblxuICAubmF2YmFyLWNvbGxhcHNlLFxuICAubmF2YmFyLWZvcm0ge1xuICAgIGJvcmRlci1jb2xvcjogQG5hdmJhci1kZWZhdWx0LWJvcmRlcjtcbiAgfVxuXG4gIC8vIERyb3Bkb3duIG1lbnUgaXRlbXNcbiAgLm5hdmJhci1uYXYge1xuICAgIC8vIFJlbW92ZSBiYWNrZ3JvdW5kIGNvbG9yIGZyb20gb3BlbiBkcm9wZG93blxuICAgID4gLm9wZW4gPiBhIHtcbiAgICAgICYsXG4gICAgICAmOmhvdmVyLFxuICAgICAgJjpmb2N1cyB7XG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6IEBuYXZiYXItZGVmYXVsdC1saW5rLWFjdGl2ZS1iZztcbiAgICAgICAgY29sb3I6IEBuYXZiYXItZGVmYXVsdC1saW5rLWFjdGl2ZS1jb2xvcjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBAbWVkaWEgKG1heC13aWR0aDogQGdyaWQtZmxvYXQtYnJlYWtwb2ludC1tYXgpIHtcbiAgICAgIC8vIERyb3Bkb3ducyBnZXQgY3VzdG9tIGRpc3BsYXkgd2hlbiBjb2xsYXBzZWRcbiAgICAgIC5vcGVuIC5kcm9wZG93bi1tZW51IHtcbiAgICAgICAgPiBsaSA+IGEge1xuICAgICAgICAgIGNvbG9yOiBAbmF2YmFyLWRlZmF1bHQtbGluay1jb2xvcjtcbiAgICAgICAgICAmOmhvdmVyLFxuICAgICAgICAgICY6Zm9jdXMge1xuICAgICAgICAgICAgY29sb3I6IEBuYXZiYXItZGVmYXVsdC1saW5rLWhvdmVyLWNvbG9yO1xuICAgICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogQG5hdmJhci1kZWZhdWx0LWxpbmstaG92ZXItYmc7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgID4gLmFjdGl2ZSA+IGEge1xuICAgICAgICAgICYsXG4gICAgICAgICAgJjpob3ZlcixcbiAgICAgICAgICAmOmZvY3VzIHtcbiAgICAgICAgICAgIGNvbG9yOiBAbmF2YmFyLWRlZmF1bHQtbGluay1hY3RpdmUtY29sb3I7XG4gICAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAbmF2YmFyLWRlZmF1bHQtbGluay1hY3RpdmUtYmc7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgID4gLmRpc2FibGVkID4gYSB7XG4gICAgICAgICAgJixcbiAgICAgICAgICAmOmhvdmVyLFxuICAgICAgICAgICY6Zm9jdXMge1xuICAgICAgICAgICAgY29sb3I6IEBuYXZiYXItZGVmYXVsdC1saW5rLWRpc2FibGVkLWNvbG9yO1xuICAgICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogQG5hdmJhci1kZWZhdWx0LWxpbmstZGlzYWJsZWQtYmc7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cblxuICAvLyBMaW5rcyBpbiBuYXZiYXJzXG4gIC8vXG4gIC8vIEFkZCBhIGNsYXNzIHRvIGVuc3VyZSBsaW5rcyBvdXRzaWRlIHRoZSBuYXZiYXIgbmF2IGFyZSBjb2xvcmVkIGNvcnJlY3RseS5cblxuICAubmF2YmFyLWxpbmsge1xuICAgIGNvbG9yOiBAbmF2YmFyLWRlZmF1bHQtbGluay1jb2xvcjtcbiAgICAmOmhvdmVyIHtcbiAgICAgIGNvbG9yOiBAbmF2YmFyLWRlZmF1bHQtbGluay1ob3Zlci1jb2xvcjtcbiAgICB9XG4gIH1cblxuICAuYnRuLWxpbmsge1xuICAgIGNvbG9yOiBAbmF2YmFyLWRlZmF1bHQtbGluay1jb2xvcjtcbiAgICAmOmhvdmVyLFxuICAgICY6Zm9jdXMge1xuICAgICAgY29sb3I6IEBuYXZiYXItZGVmYXVsdC1saW5rLWhvdmVyLWNvbG9yO1xuICAgIH1cbiAgICAmW2Rpc2FibGVkXSxcbiAgICBmaWVsZHNldFtkaXNhYmxlZF0gJiB7XG4gICAgICAmOmhvdmVyLFxuICAgICAgJjpmb2N1cyB7XG4gICAgICAgIGNvbG9yOiBAbmF2YmFyLWRlZmF1bHQtbGluay1kaXNhYmxlZC1jb2xvcjtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuLy8gSW52ZXJzZSBuYXZiYXJcblxuLm5hdmJhci1pbnZlcnNlIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogQG5hdmJhci1pbnZlcnNlLWJnO1xuICBib3JkZXItY29sb3I6IEBuYXZiYXItaW52ZXJzZS1ib3JkZXI7XG5cbiAgLm5hdmJhci1icmFuZCB7XG4gICAgY29sb3I6IEBuYXZiYXItaW52ZXJzZS1icmFuZC1jb2xvcjtcbiAgICAmOmhvdmVyLFxuICAgICY6Zm9jdXMge1xuICAgICAgY29sb3I6IEBuYXZiYXItaW52ZXJzZS1icmFuZC1ob3Zlci1jb2xvcjtcbiAgICAgIGJhY2tncm91bmQtY29sb3I6IEBuYXZiYXItaW52ZXJzZS1icmFuZC1ob3Zlci1iZztcbiAgICB9XG4gIH1cblxuICAubmF2YmFyLXRleHQge1xuICAgIGNvbG9yOiBAbmF2YmFyLWludmVyc2UtY29sb3I7XG4gIH1cblxuICAubmF2YmFyLW5hdiB7XG4gICAgPiBsaSA+IGEge1xuICAgICAgY29sb3I6IEBuYXZiYXItaW52ZXJzZS1saW5rLWNvbG9yO1xuXG4gICAgICAmOmhvdmVyLFxuICAgICAgJjpmb2N1cyB7XG4gICAgICAgIGNvbG9yOiBAbmF2YmFyLWludmVyc2UtbGluay1ob3Zlci1jb2xvcjtcbiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogQG5hdmJhci1pbnZlcnNlLWxpbmstaG92ZXItYmc7XG4gICAgICB9XG4gICAgfVxuICAgID4gLmFjdGl2ZSA+IGEge1xuICAgICAgJixcbiAgICAgICY6aG92ZXIsXG4gICAgICAmOmZvY3VzIHtcbiAgICAgICAgY29sb3I6IEBuYXZiYXItaW52ZXJzZS1saW5rLWFjdGl2ZS1jb2xvcjtcbiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogQG5hdmJhci1pbnZlcnNlLWxpbmstYWN0aXZlLWJnO1xuICAgICAgfVxuICAgIH1cbiAgICA+IC5kaXNhYmxlZCA+IGEge1xuICAgICAgJixcbiAgICAgICY6aG92ZXIsXG4gICAgICAmOmZvY3VzIHtcbiAgICAgICAgY29sb3I6IEBuYXZiYXItaW52ZXJzZS1saW5rLWRpc2FibGVkLWNvbG9yO1xuICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAbmF2YmFyLWludmVyc2UtbGluay1kaXNhYmxlZC1iZztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBEYXJrZW4gdGhlIHJlc3BvbnNpdmUgbmF2IHRvZ2dsZVxuICAubmF2YmFyLXRvZ2dsZSB7XG4gICAgYm9yZGVyLWNvbG9yOiBAbmF2YmFyLWludmVyc2UtdG9nZ2xlLWJvcmRlci1jb2xvcjtcbiAgICAmOmhvdmVyLFxuICAgICY6Zm9jdXMge1xuICAgICAgYmFja2dyb3VuZC1jb2xvcjogQG5hdmJhci1pbnZlcnNlLXRvZ2dsZS1ob3Zlci1iZztcbiAgICB9XG4gICAgLmljb24tYmFyIHtcbiAgICAgIGJhY2tncm91bmQtY29sb3I6IEBuYXZiYXItaW52ZXJzZS10b2dnbGUtaWNvbi1iYXItYmc7XG4gICAgfVxuICB9XG5cbiAgLm5hdmJhci1jb2xsYXBzZSxcbiAgLm5hdmJhci1mb3JtIHtcbiAgICBib3JkZXItY29sb3I6IGRhcmtlbihAbmF2YmFyLWludmVyc2UtYmcsIDclKTtcbiAgfVxuXG4gIC8vIERyb3Bkb3duc1xuICAubmF2YmFyLW5hdiB7XG4gICAgPiAub3BlbiA+IGEge1xuICAgICAgJixcbiAgICAgICY6aG92ZXIsXG4gICAgICAmOmZvY3VzIHtcbiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogQG5hdmJhci1pbnZlcnNlLWxpbmstYWN0aXZlLWJnO1xuICAgICAgICBjb2xvcjogQG5hdmJhci1pbnZlcnNlLWxpbmstYWN0aXZlLWNvbG9yO1xuICAgICAgfVxuICAgIH1cblxuICAgIEBtZWRpYSAobWF4LXdpZHRoOiBAZ3JpZC1mbG9hdC1icmVha3BvaW50LW1heCkge1xuICAgICAgLy8gRHJvcGRvd25zIGdldCBjdXN0b20gZGlzcGxheVxuICAgICAgLm9wZW4gLmRyb3Bkb3duLW1lbnUge1xuICAgICAgICA+IC5kcm9wZG93bi1oZWFkZXIge1xuICAgICAgICAgIGJvcmRlci1jb2xvcjogQG5hdmJhci1pbnZlcnNlLWJvcmRlcjtcbiAgICAgICAgfVxuICAgICAgICAuZGl2aWRlciB7XG4gICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogQG5hdmJhci1pbnZlcnNlLWJvcmRlcjtcbiAgICAgICAgfVxuICAgICAgICA+IGxpID4gYSB7XG4gICAgICAgICAgY29sb3I6IEBuYXZiYXItaW52ZXJzZS1saW5rLWNvbG9yO1xuICAgICAgICAgICY6aG92ZXIsXG4gICAgICAgICAgJjpmb2N1cyB7XG4gICAgICAgICAgICBjb2xvcjogQG5hdmJhci1pbnZlcnNlLWxpbmstaG92ZXItY29sb3I7XG4gICAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAbmF2YmFyLWludmVyc2UtbGluay1ob3Zlci1iZztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgPiAuYWN0aXZlID4gYSB7XG4gICAgICAgICAgJixcbiAgICAgICAgICAmOmhvdmVyLFxuICAgICAgICAgICY6Zm9jdXMge1xuICAgICAgICAgICAgY29sb3I6IEBuYXZiYXItaW52ZXJzZS1saW5rLWFjdGl2ZS1jb2xvcjtcbiAgICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6IEBuYXZiYXItaW52ZXJzZS1saW5rLWFjdGl2ZS1iZztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgPiAuZGlzYWJsZWQgPiBhIHtcbiAgICAgICAgICAmLFxuICAgICAgICAgICY6aG92ZXIsXG4gICAgICAgICAgJjpmb2N1cyB7XG4gICAgICAgICAgICBjb2xvcjogQG5hdmJhci1pbnZlcnNlLWxpbmstZGlzYWJsZWQtY29sb3I7XG4gICAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAbmF2YmFyLWludmVyc2UtbGluay1kaXNhYmxlZC1iZztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAubmF2YmFyLWxpbmsge1xuICAgIGNvbG9yOiBAbmF2YmFyLWludmVyc2UtbGluay1jb2xvcjtcbiAgICAmOmhvdmVyIHtcbiAgICAgIGNvbG9yOiBAbmF2YmFyLWludmVyc2UtbGluay1ob3Zlci1jb2xvcjtcbiAgICB9XG4gIH1cblxuICAuYnRuLWxpbmsge1xuICAgIGNvbG9yOiBAbmF2YmFyLWludmVyc2UtbGluay1jb2xvcjtcbiAgICAmOmhvdmVyLFxuICAgICY6Zm9jdXMge1xuICAgICAgY29sb3I6IEBuYXZiYXItaW52ZXJzZS1saW5rLWhvdmVyLWNvbG9yO1xuICAgIH1cbiAgICAmW2Rpc2FibGVkXSxcbiAgICBmaWVsZHNldFtkaXNhYmxlZF0gJiB7XG4gICAgICAmOmhvdmVyLFxuICAgICAgJjpmb2N1cyB7XG4gICAgICAgIGNvbG9yOiBAbmF2YmFyLWludmVyc2UtbGluay1kaXNhYmxlZC1jb2xvcjtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiIsIi8vIE5hdmJhciB2ZXJ0aWNhbCBhbGlnblxuLy9cbi8vIFZlcnRpY2FsbHkgY2VudGVyIGVsZW1lbnRzIGluIHRoZSBuYXZiYXIuXG4vLyBFeGFtcGxlOiBhbiBlbGVtZW50IGhhcyBhIGhlaWdodCBvZiAzMHB4LCBzbyB3cml0ZSBvdXQgYC5uYXZiYXItdmVydGljYWwtYWxpZ24oMzBweCk7YCB0byBjYWxjdWxhdGUgdGhlIGFwcHJvcHJpYXRlIHRvcCBtYXJnaW4uXG5cbi5uYXZiYXItdmVydGljYWwtYWxpZ24oQGVsZW1lbnQtaGVpZ2h0KSB7XG4gIG1hcmdpbi10b3A6ICgoQG5hdmJhci1oZWlnaHQgLSBAZWxlbWVudC1oZWlnaHQpIC8gMik7XG4gIG1hcmdpbi1ib3R0b206ICgoQG5hdmJhci1oZWlnaHQgLSBAZWxlbWVudC1oZWlnaHQpIC8gMik7XG59XG4iLCIvL1xuLy8gVXRpbGl0eSBjbGFzc2VzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5cbi8vIEZsb2F0c1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4uY2xlYXJmaXgge1xuICAuY2xlYXJmaXgoKTtcbn1cbi5jZW50ZXItYmxvY2sge1xuICAuY2VudGVyLWJsb2NrKCk7XG59XG4ucHVsbC1yaWdodCB7XG4gIGZsb2F0OiByaWdodCAhaW1wb3J0YW50O1xufVxuLnB1bGwtbGVmdCB7XG4gIGZsb2F0OiBsZWZ0ICFpbXBvcnRhbnQ7XG59XG5cblxuLy8gVG9nZ2xpbmcgY29udGVudFxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vLyBOb3RlOiBEZXByZWNhdGVkIC5oaWRlIGluIGZhdm9yIG9mIC5oaWRkZW4gb3IgLnNyLW9ubHkgKGFzIGFwcHJvcHJpYXRlKSBpbiB2My4wLjFcbi5oaWRlIHtcbiAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50O1xufVxuLnNob3cge1xuICBkaXNwbGF5OiBibG9jayAhaW1wb3J0YW50O1xufVxuLmludmlzaWJsZSB7XG4gIHZpc2liaWxpdHk6IGhpZGRlbjtcbn1cbi50ZXh0LWhpZGUge1xuICAudGV4dC1oaWRlKCk7XG59XG5cblxuLy8gSGlkZSBmcm9tIHNjcmVlbnJlYWRlcnMgYW5kIGJyb3dzZXJzXG4vL1xuLy8gQ3JlZGl0OiBIVE1MNSBCb2lsZXJwbGF0ZVxuXG4uaGlkZGVuIHtcbiAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50O1xuICB2aXNpYmlsaXR5OiBoaWRkZW4gIWltcG9ydGFudDtcbn1cblxuXG4vLyBGb3IgQWZmaXggcGx1Z2luXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi5hZmZpeCB7XG4gIHBvc2l0aW9uOiBmaXhlZDtcbn1cbiIsIi8vXG4vLyBCcmVhZGNydW1ic1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuXG4uYnJlYWRjcnVtYiB7XG4gIHBhZGRpbmc6IEBicmVhZGNydW1iLXBhZGRpbmctdmVydGljYWwgQGJyZWFkY3J1bWItcGFkZGluZy1ob3Jpem9udGFsO1xuICBtYXJnaW4tYm90dG9tOiBAbGluZS1oZWlnaHQtY29tcHV0ZWQ7XG4gIGxpc3Qtc3R5bGU6IG5vbmU7XG4gIGJhY2tncm91bmQtY29sb3I6IEBicmVhZGNydW1iLWJnO1xuICBib3JkZXItcmFkaXVzOiBAYm9yZGVyLXJhZGl1cy1iYXNlO1xuXG4gID4gbGkge1xuICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcblxuICAgICsgbGk6YmVmb3JlIHtcbiAgICAgIGNvbnRlbnQ6IFwiQHticmVhZGNydW1iLXNlcGFyYXRvcn1cXDAwYTBcIjsgLy8gVW5pY29kZSBzcGFjZSBhZGRlZCBzaW5jZSBpbmxpbmUtYmxvY2sgbWVhbnMgbm9uLWNvbGxhcHNpbmcgd2hpdGUtc3BhY2VcbiAgICAgIHBhZGRpbmc6IDAgNXB4O1xuICAgICAgY29sb3I6IEBicmVhZGNydW1iLWNvbG9yO1xuICAgIH1cbiAgfVxuXG4gID4gLmFjdGl2ZSB7XG4gICAgY29sb3I6IEBicmVhZGNydW1iLWFjdGl2ZS1jb2xvcjtcbiAgfVxufVxuIiwiLy9cbi8vIFBhZ2luYXRpb24gKG11bHRpcGxlIHBhZ2VzKVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi5wYWdpbmF0aW9uIHtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICBwYWRkaW5nLWxlZnQ6IDA7XG4gIG1hcmdpbjogQGxpbmUtaGVpZ2h0LWNvbXB1dGVkIDA7XG4gIGJvcmRlci1yYWRpdXM6IEBib3JkZXItcmFkaXVzLWJhc2U7XG5cbiAgPiBsaSB7XG4gICAgZGlzcGxheTogaW5saW5lOyAvLyBSZW1vdmUgbGlzdC1zdHlsZSBhbmQgYmxvY2stbGV2ZWwgZGVmYXVsdHNcbiAgICA+IGEsXG4gICAgPiBzcGFuIHtcbiAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICAgIGZsb2F0OiBsZWZ0OyAvLyBDb2xsYXBzZSB3aGl0ZS1zcGFjZVxuICAgICAgcGFkZGluZzogQHBhZGRpbmctYmFzZS12ZXJ0aWNhbCBAcGFkZGluZy1iYXNlLWhvcml6b250YWw7XG4gICAgICBsaW5lLWhlaWdodDogQGxpbmUtaGVpZ2h0LWJhc2U7XG4gICAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7XG4gICAgICBjb2xvcjogQHBhZ2luYXRpb24tY29sb3I7XG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAcGFnaW5hdGlvbi1iZztcbiAgICAgIGJvcmRlcjogMXB4IHNvbGlkIEBwYWdpbmF0aW9uLWJvcmRlcjtcbiAgICAgIG1hcmdpbi1sZWZ0OiAtMXB4O1xuICAgIH1cbiAgICAmOmZpcnN0LWNoaWxkIHtcbiAgICAgID4gYSxcbiAgICAgID4gc3BhbiB7XG4gICAgICAgIG1hcmdpbi1sZWZ0OiAwO1xuICAgICAgICAuYm9yZGVyLWxlZnQtcmFkaXVzKEBib3JkZXItcmFkaXVzLWJhc2UpO1xuICAgICAgfVxuICAgIH1cbiAgICAmOmxhc3QtY2hpbGQge1xuICAgICAgPiBhLFxuICAgICAgPiBzcGFuIHtcbiAgICAgICAgLmJvcmRlci1yaWdodC1yYWRpdXMoQGJvcmRlci1yYWRpdXMtYmFzZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgPiBsaSA+IGEsXG4gID4gbGkgPiBzcGFuIHtcbiAgICAmOmhvdmVyLFxuICAgICY6Zm9jdXMge1xuICAgICAgY29sb3I6IEBwYWdpbmF0aW9uLWhvdmVyLWNvbG9yO1xuICAgICAgYmFja2dyb3VuZC1jb2xvcjogQHBhZ2luYXRpb24taG92ZXItYmc7XG4gICAgICBib3JkZXItY29sb3I6IEBwYWdpbmF0aW9uLWhvdmVyLWJvcmRlcjtcbiAgICB9XG4gIH1cblxuICA+IC5hY3RpdmUgPiBhLFxuICA+IC5hY3RpdmUgPiBzcGFuIHtcbiAgICAmLFxuICAgICY6aG92ZXIsXG4gICAgJjpmb2N1cyB7XG4gICAgICB6LWluZGV4OiAyO1xuICAgICAgY29sb3I6IEBwYWdpbmF0aW9uLWFjdGl2ZS1jb2xvcjtcbiAgICAgIGJhY2tncm91bmQtY29sb3I6IEBwYWdpbmF0aW9uLWFjdGl2ZS1iZztcbiAgICAgIGJvcmRlci1jb2xvcjogQHBhZ2luYXRpb24tYWN0aXZlLWJvcmRlcjtcbiAgICAgIGN1cnNvcjogZGVmYXVsdDtcbiAgICB9XG4gIH1cblxuICA+IC5kaXNhYmxlZCB7XG4gICAgPiBzcGFuLFxuICAgID4gc3Bhbjpob3ZlcixcbiAgICA+IHNwYW46Zm9jdXMsXG4gICAgPiBhLFxuICAgID4gYTpob3ZlcixcbiAgICA+IGE6Zm9jdXMge1xuICAgICAgY29sb3I6IEBwYWdpbmF0aW9uLWRpc2FibGVkLWNvbG9yO1xuICAgICAgYmFja2dyb3VuZC1jb2xvcjogQHBhZ2luYXRpb24tZGlzYWJsZWQtYmc7XG4gICAgICBib3JkZXItY29sb3I6IEBwYWdpbmF0aW9uLWRpc2FibGVkLWJvcmRlcjtcbiAgICAgIGN1cnNvcjogQGN1cnNvci1kaXNhYmxlZDtcbiAgICB9XG4gIH1cbn1cblxuLy8gU2l6aW5nXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vLyBMYXJnZVxuLnBhZ2luYXRpb24tbGcge1xuICAucGFnaW5hdGlvbi1zaXplKEBwYWRkaW5nLWxhcmdlLXZlcnRpY2FsOyBAcGFkZGluZy1sYXJnZS1ob3Jpem9udGFsOyBAZm9udC1zaXplLWxhcmdlOyBAYm9yZGVyLXJhZGl1cy1sYXJnZSk7XG59XG5cbi8vIFNtYWxsXG4ucGFnaW5hdGlvbi1zbSB7XG4gIC5wYWdpbmF0aW9uLXNpemUoQHBhZGRpbmctc21hbGwtdmVydGljYWw7IEBwYWRkaW5nLXNtYWxsLWhvcml6b250YWw7IEBmb250LXNpemUtc21hbGw7IEBib3JkZXItcmFkaXVzLXNtYWxsKTtcbn1cbiIsIi8vIFBhZ2luYXRpb25cblxuLnBhZ2luYXRpb24tc2l6ZShAcGFkZGluZy12ZXJ0aWNhbDsgQHBhZGRpbmctaG9yaXpvbnRhbDsgQGZvbnQtc2l6ZTsgQGJvcmRlci1yYWRpdXMpIHtcbiAgPiBsaSB7XG4gICAgPiBhLFxuICAgID4gc3BhbiB7XG4gICAgICBwYWRkaW5nOiBAcGFkZGluZy12ZXJ0aWNhbCBAcGFkZGluZy1ob3Jpem9udGFsO1xuICAgICAgZm9udC1zaXplOiBAZm9udC1zaXplO1xuICAgIH1cbiAgICAmOmZpcnN0LWNoaWxkIHtcbiAgICAgID4gYSxcbiAgICAgID4gc3BhbiB7XG4gICAgICAgIC5ib3JkZXItbGVmdC1yYWRpdXMoQGJvcmRlci1yYWRpdXMpO1xuICAgICAgfVxuICAgIH1cbiAgICAmOmxhc3QtY2hpbGQge1xuICAgICAgPiBhLFxuICAgICAgPiBzcGFuIHtcbiAgICAgICAgLmJvcmRlci1yaWdodC1yYWRpdXMoQGJvcmRlci1yYWRpdXMpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIiwiLy9cbi8vIFBhZ2VyIHBhZ2luYXRpb25cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cblxuLnBhZ2VyIHtcbiAgcGFkZGluZy1sZWZ0OiAwO1xuICBtYXJnaW46IEBsaW5lLWhlaWdodC1jb21wdXRlZCAwO1xuICBsaXN0LXN0eWxlOiBub25lO1xuICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gICY6ZXh0ZW5kKC5jbGVhcmZpeCBhbGwpO1xuICBsaSB7XG4gICAgZGlzcGxheTogaW5saW5lO1xuICAgID4gYSxcbiAgICA+IHNwYW4ge1xuICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgICAgcGFkZGluZzogNXB4IDE0cHg7XG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAcGFnZXItYmc7XG4gICAgICBib3JkZXI6IDFweCBzb2xpZCBAcGFnZXItYm9yZGVyO1xuICAgICAgYm9yZGVyLXJhZGl1czogQHBhZ2VyLWJvcmRlci1yYWRpdXM7XG4gICAgfVxuXG4gICAgPiBhOmhvdmVyLFxuICAgID4gYTpmb2N1cyB7XG4gICAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7XG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAcGFnZXItaG92ZXItYmc7XG4gICAgfVxuICB9XG5cbiAgLm5leHQge1xuICAgID4gYSxcbiAgICA+IHNwYW4ge1xuICAgICAgZmxvYXQ6IHJpZ2h0O1xuICAgIH1cbiAgfVxuXG4gIC5wcmV2aW91cyB7XG4gICAgPiBhLFxuICAgID4gc3BhbiB7XG4gICAgICBmbG9hdDogbGVmdDtcbiAgICB9XG4gIH1cblxuICAuZGlzYWJsZWQge1xuICAgID4gYSxcbiAgICA+IGE6aG92ZXIsXG4gICAgPiBhOmZvY3VzLFxuICAgID4gc3BhbiB7XG4gICAgICBjb2xvcjogQHBhZ2VyLWRpc2FibGVkLWNvbG9yO1xuICAgICAgYmFja2dyb3VuZC1jb2xvcjogQHBhZ2VyLWJnO1xuICAgICAgY3Vyc29yOiBAY3Vyc29yLWRpc2FibGVkO1xuICAgIH1cbiAgfVxufVxuIiwiLy9cbi8vIExhYmVsc1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLmxhYmVsIHtcbiAgZGlzcGxheTogaW5saW5lO1xuICBwYWRkaW5nOiAuMmVtIC42ZW0gLjNlbTtcbiAgZm9udC1zaXplOiA3NSU7XG4gIGZvbnQtd2VpZ2h0OiBib2xkO1xuICBsaW5lLWhlaWdodDogMTtcbiAgY29sb3I6IEBsYWJlbC1jb2xvcjtcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xuICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuICB2ZXJ0aWNhbC1hbGlnbjogYmFzZWxpbmU7XG4gIGJvcmRlci1yYWRpdXM6IC4yNWVtO1xuXG4gIC8vIEFkZCBob3ZlciBlZmZlY3RzLCBidXQgb25seSBmb3IgbGlua3NcbiAgYSYge1xuICAgICY6aG92ZXIsXG4gICAgJjpmb2N1cyB7XG4gICAgICBjb2xvcjogQGxhYmVsLWxpbmstaG92ZXItY29sb3I7XG4gICAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7XG4gICAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgfVxuICB9XG5cbiAgLy8gRW1wdHkgbGFiZWxzIGNvbGxhcHNlIGF1dG9tYXRpY2FsbHkgKG5vdCBhdmFpbGFibGUgaW4gSUU4KVxuICAmOmVtcHR5IHtcbiAgICBkaXNwbGF5OiBub25lO1xuICB9XG5cbiAgLy8gUXVpY2sgZml4IGZvciBsYWJlbHMgaW4gYnV0dG9uc1xuICAuYnRuICYge1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICB0b3A6IC0xcHg7XG4gIH1cbn1cblxuLy8gQ29sb3JzXG4vLyBDb250ZXh0dWFsIHZhcmlhdGlvbnMgKGxpbmtlZCBsYWJlbHMgZ2V0IGRhcmtlciBvbiA6aG92ZXIpXG5cbi5sYWJlbC1kZWZhdWx0IHtcbiAgLmxhYmVsLXZhcmlhbnQoQGxhYmVsLWRlZmF1bHQtYmcpO1xufVxuXG4ubGFiZWwtcHJpbWFyeSB7XG4gIC5sYWJlbC12YXJpYW50KEBsYWJlbC1wcmltYXJ5LWJnKTtcbn1cblxuLmxhYmVsLXN1Y2Nlc3Mge1xuICAubGFiZWwtdmFyaWFudChAbGFiZWwtc3VjY2Vzcy1iZyk7XG59XG5cbi5sYWJlbC1pbmZvIHtcbiAgLmxhYmVsLXZhcmlhbnQoQGxhYmVsLWluZm8tYmcpO1xufVxuXG4ubGFiZWwtd2FybmluZyB7XG4gIC5sYWJlbC12YXJpYW50KEBsYWJlbC13YXJuaW5nLWJnKTtcbn1cblxuLmxhYmVsLWRhbmdlciB7XG4gIC5sYWJlbC12YXJpYW50KEBsYWJlbC1kYW5nZXItYmcpO1xufVxuIiwiLy8gTGFiZWxzXG5cbi5sYWJlbC12YXJpYW50KEBjb2xvcikge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiBAY29sb3I7XG5cbiAgJltocmVmXSB7XG4gICAgJjpob3ZlcixcbiAgICAmOmZvY3VzIHtcbiAgICAgIGJhY2tncm91bmQtY29sb3I6IGRhcmtlbihAY29sb3IsIDEwJSk7XG4gICAgfVxuICB9XG59XG4iLCIvL1xuLy8gQmFkZ2VzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5cbi8vIEJhc2UgY2xhc3Ncbi5iYWRnZSB7XG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgbWluLXdpZHRoOiAxMHB4O1xuICBwYWRkaW5nOiAzcHggN3B4O1xuICBmb250LXNpemU6IEBmb250LXNpemUtc21hbGw7XG4gIGZvbnQtd2VpZ2h0OiBAYmFkZ2UtZm9udC13ZWlnaHQ7XG4gIGNvbG9yOiBAYmFkZ2UtY29sb3I7XG4gIGxpbmUtaGVpZ2h0OiBAYmFkZ2UtbGluZS1oZWlnaHQ7XG4gIHZlcnRpY2FsLWFsaWduOiBiYXNlbGluZTtcbiAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiBAYmFkZ2UtYmc7XG4gIGJvcmRlci1yYWRpdXM6IEBiYWRnZS1ib3JkZXItcmFkaXVzO1xuXG4gIC8vIEVtcHR5IGJhZGdlcyBjb2xsYXBzZSBhdXRvbWF0aWNhbGx5IChub3QgYXZhaWxhYmxlIGluIElFOClcbiAgJjplbXB0eSB7XG4gICAgZGlzcGxheTogbm9uZTtcbiAgfVxuXG4gIC8vIFF1aWNrIGZpeCBmb3IgYmFkZ2VzIGluIGJ1dHRvbnNcbiAgLmJ0biAmIHtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgdG9wOiAtMXB4O1xuICB9XG4gIC5idG4teHMgJiB7XG4gICAgdG9wOiAwO1xuICAgIHBhZGRpbmc6IDFweCA1cHg7XG4gIH1cblxuICAvLyBIb3ZlciBzdGF0ZSwgYnV0IG9ubHkgZm9yIGxpbmtzXG4gIGEmIHtcbiAgICAmOmhvdmVyLFxuICAgICY6Zm9jdXMge1xuICAgICAgY29sb3I6IEBiYWRnZS1saW5rLWhvdmVyLWNvbG9yO1xuICAgICAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xuICAgICAgY3Vyc29yOiBwb2ludGVyO1xuICAgIH1cbiAgfVxuXG4gIC8vIEFjY291bnQgZm9yIGJhZGdlcyBpbiBuYXZzXG4gIGEubGlzdC1ncm91cC1pdGVtLmFjdGl2ZSA+ICYsXG4gIC5uYXYtcGlsbHMgPiAuYWN0aXZlID4gYSA+ICYge1xuICAgIGNvbG9yOiBAYmFkZ2UtYWN0aXZlLWNvbG9yO1xuICAgIGJhY2tncm91bmQtY29sb3I6IEBiYWRnZS1hY3RpdmUtYmc7XG4gIH1cbiAgLm5hdi1waWxscyA+IGxpID4gYSA+ICYge1xuICAgIG1hcmdpbi1sZWZ0OiAzcHg7XG4gIH1cbn1cbiIsIi8vXG4vLyBKdW1ib3Ryb25cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cblxuLmp1bWJvdHJvbiB7XG4gIHBhZGRpbmc6IEBqdW1ib3Ryb24tcGFkZGluZyAoQGp1bWJvdHJvbi1wYWRkaW5nIC8gMik7XG4gIG1hcmdpbi1ib3R0b206IEBqdW1ib3Ryb24tcGFkZGluZztcbiAgY29sb3I6IEBqdW1ib3Ryb24tY29sb3I7XG4gIGJhY2tncm91bmQtY29sb3I6IEBqdW1ib3Ryb24tYmc7XG5cbiAgaDEsXG4gIC5oMSB7XG4gICAgY29sb3I6IEBqdW1ib3Ryb24taGVhZGluZy1jb2xvcjtcbiAgfVxuICBwIHtcbiAgICBtYXJnaW4tYm90dG9tOiAoQGp1bWJvdHJvbi1wYWRkaW5nIC8gMik7XG4gICAgZm9udC1zaXplOiBAanVtYm90cm9uLWZvbnQtc2l6ZTtcbiAgICBmb250LXdlaWdodDogMjAwO1xuICB9XG5cbiAgPiBociB7XG4gICAgYm9yZGVyLXRvcC1jb2xvcjogZGFya2VuKEBqdW1ib3Ryb24tYmcsIDEwJSk7XG4gIH1cblxuICAuY29udGFpbmVyICYsXG4gIC5jb250YWluZXItZmx1aWQgJiB7XG4gICAgYm9yZGVyLXJhZGl1czogQGJvcmRlci1yYWRpdXMtbGFyZ2U7IC8vIE9ubHkgcm91bmQgY29ybmVycyBhdCBoaWdoZXIgcmVzb2x1dGlvbnMgaWYgY29udGFpbmVkIGluIGEgY29udGFpbmVyXG4gIH1cblxuICAuY29udGFpbmVyIHtcbiAgICBtYXgtd2lkdGg6IDEwMCU7XG4gIH1cblxuICBAbWVkaWEgc2NyZWVuIGFuZCAobWluLXdpZHRoOiBAc2NyZWVuLXNtLW1pbikge1xuICAgIHBhZGRpbmc6IChAanVtYm90cm9uLXBhZGRpbmcgKiAxLjYpIDA7XG5cbiAgICAuY29udGFpbmVyICYge1xuICAgICAgcGFkZGluZy1sZWZ0OiAgKEBqdW1ib3Ryb24tcGFkZGluZyAqIDIpO1xuICAgICAgcGFkZGluZy1yaWdodDogKEBqdW1ib3Ryb24tcGFkZGluZyAqIDIpO1xuICAgIH1cblxuICAgIGgxLFxuICAgIC5oMSB7XG4gICAgICBmb250LXNpemU6IChAZm9udC1zaXplLWJhc2UgKiA0LjUpO1xuICAgIH1cbiAgfVxufVxuIiwiLy9cbi8vIEFsZXJ0c1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuXG4vLyBCYXNlIHN0eWxlc1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4uYWxlcnQge1xuICBwYWRkaW5nOiBAYWxlcnQtcGFkZGluZztcbiAgbWFyZ2luLWJvdHRvbTogQGxpbmUtaGVpZ2h0LWNvbXB1dGVkO1xuICBib3JkZXI6IDFweCBzb2xpZCB0cmFuc3BhcmVudDtcbiAgYm9yZGVyLXJhZGl1czogQGFsZXJ0LWJvcmRlci1yYWRpdXM7XG5cbiAgLy8gSGVhZGluZ3MgZm9yIGxhcmdlciBhbGVydHNcbiAgaDQge1xuICAgIG1hcmdpbi10b3A6IDA7XG4gICAgLy8gU3BlY2lmaWVkIGZvciB0aGUgaDQgdG8gcHJldmVudCBjb25mbGljdHMgb2YgY2hhbmdpbmcgQGhlYWRpbmdzLWNvbG9yXG4gICAgY29sb3I6IGluaGVyaXQ7XG4gIH1cbiAgLy8gUHJvdmlkZSBjbGFzcyBmb3IgbGlua3MgdGhhdCBtYXRjaCBhbGVydHNcbiAgLmFsZXJ0LWxpbmsge1xuICAgIGZvbnQtd2VpZ2h0OiBAYWxlcnQtbGluay1mb250LXdlaWdodDtcbiAgfVxuXG4gIC8vIEltcHJvdmUgYWxpZ25tZW50IGFuZCBzcGFjaW5nIG9mIGlubmVyIGNvbnRlbnRcbiAgPiBwLFxuICA+IHVsIHtcbiAgICBtYXJnaW4tYm90dG9tOiAwO1xuICB9XG4gID4gcCArIHAge1xuICAgIG1hcmdpbi10b3A6IDVweDtcbiAgfVxufVxuXG4vLyBEaXNtaXNzaWJsZSBhbGVydHNcbi8vXG4vLyBFeHBhbmQgdGhlIHJpZ2h0IHBhZGRpbmcgYW5kIGFjY291bnQgZm9yIHRoZSBjbG9zZSBidXR0b24ncyBwb3NpdGlvbmluZy5cblxuLmFsZXJ0LWRpc21pc3NhYmxlLCAvLyBUaGUgbWlzc3BlbGxlZCAuYWxlcnQtZGlzbWlzc2FibGUgd2FzIGRlcHJlY2F0ZWQgaW4gMy4yLjAuXG4uYWxlcnQtZGlzbWlzc2libGUge1xuICBwYWRkaW5nLXJpZ2h0OiAoQGFsZXJ0LXBhZGRpbmcgKyAyMCk7XG5cbiAgLy8gQWRqdXN0IGNsb3NlIGxpbmsgcG9zaXRpb25cbiAgLmNsb3NlIHtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgdG9wOiAtMnB4O1xuICAgIHJpZ2h0OiAtMjFweDtcbiAgICBjb2xvcjogaW5oZXJpdDtcbiAgfVxufVxuXG4vLyBBbHRlcm5hdGUgc3R5bGVzXG4vL1xuLy8gR2VuZXJhdGUgY29udGV4dHVhbCBtb2RpZmllciBjbGFzc2VzIGZvciBjb2xvcml6aW5nIHRoZSBhbGVydC5cblxuLmFsZXJ0LXN1Y2Nlc3Mge1xuICAuYWxlcnQtdmFyaWFudChAYWxlcnQtc3VjY2Vzcy1iZzsgQGFsZXJ0LXN1Y2Nlc3MtYm9yZGVyOyBAYWxlcnQtc3VjY2Vzcy10ZXh0KTtcbn1cbi5hbGVydC1pbmZvIHtcbiAgLmFsZXJ0LXZhcmlhbnQoQGFsZXJ0LWluZm8tYmc7IEBhbGVydC1pbmZvLWJvcmRlcjsgQGFsZXJ0LWluZm8tdGV4dCk7XG59XG4uYWxlcnQtd2FybmluZyB7XG4gIC5hbGVydC12YXJpYW50KEBhbGVydC13YXJuaW5nLWJnOyBAYWxlcnQtd2FybmluZy1ib3JkZXI7IEBhbGVydC13YXJuaW5nLXRleHQpO1xufVxuLmFsZXJ0LWRhbmdlciB7XG4gIC5hbGVydC12YXJpYW50KEBhbGVydC1kYW5nZXItYmc7IEBhbGVydC1kYW5nZXItYm9yZGVyOyBAYWxlcnQtZGFuZ2VyLXRleHQpO1xufVxuIiwiLy8gQWxlcnRzXG5cbi5hbGVydC12YXJpYW50KEBiYWNrZ3JvdW5kOyBAYm9yZGVyOyBAdGV4dC1jb2xvcikge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiBAYmFja2dyb3VuZDtcbiAgYm9yZGVyLWNvbG9yOiBAYm9yZGVyO1xuICBjb2xvcjogQHRleHQtY29sb3I7XG5cbiAgaHIge1xuICAgIGJvcmRlci10b3AtY29sb3I6IGRhcmtlbihAYm9yZGVyLCA1JSk7XG4gIH1cbiAgLmFsZXJ0LWxpbmsge1xuICAgIGNvbG9yOiBkYXJrZW4oQHRleHQtY29sb3IsIDEwJSk7XG4gIH1cbn1cbiIsIi8vXG4vLyBQcm9ncmVzcyBiYXJzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5cbi8vIEJhciBhbmltYXRpb25zXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8vIFdlYktpdFxuQC13ZWJraXQta2V5ZnJhbWVzIHByb2dyZXNzLWJhci1zdHJpcGVzIHtcbiAgZnJvbSAgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiA0MHB4IDA7IH1cbiAgdG8gICAgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAwIDA7IH1cbn1cblxuLy8gU3BlYyBhbmQgSUUxMCtcbkBrZXlmcmFtZXMgcHJvZ3Jlc3MtYmFyLXN0cmlwZXMge1xuICBmcm9tICB7IGJhY2tncm91bmQtcG9zaXRpb246IDQwcHggMDsgfVxuICB0byAgICB7IGJhY2tncm91bmQtcG9zaXRpb246IDAgMDsgfVxufVxuXG5cbi8vIEJhciBpdHNlbGZcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLy8gT3V0ZXIgY29udGFpbmVyXG4ucHJvZ3Jlc3Mge1xuICBvdmVyZmxvdzogaGlkZGVuO1xuICBoZWlnaHQ6IEBsaW5lLWhlaWdodC1jb21wdXRlZDtcbiAgbWFyZ2luLWJvdHRvbTogQGxpbmUtaGVpZ2h0LWNvbXB1dGVkO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiBAcHJvZ3Jlc3MtYmc7XG4gIGJvcmRlci1yYWRpdXM6IEBwcm9ncmVzcy1ib3JkZXItcmFkaXVzO1xuICAuYm94LXNoYWRvdyhpbnNldCAwIDFweCAycHggcmdiYSgwLDAsMCwuMSkpO1xufVxuXG4vLyBCYXIgb2YgcHJvZ3Jlc3Ncbi5wcm9ncmVzcy1iYXIge1xuICBmbG9hdDogbGVmdDtcbiAgd2lkdGg6IDAlO1xuICBoZWlnaHQ6IDEwMCU7XG4gIGZvbnQtc2l6ZTogQGZvbnQtc2l6ZS1zbWFsbDtcbiAgbGluZS1oZWlnaHQ6IEBsaW5lLWhlaWdodC1jb21wdXRlZDtcbiAgY29sb3I6IEBwcm9ncmVzcy1iYXItY29sb3I7XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgYmFja2dyb3VuZC1jb2xvcjogQHByb2dyZXNzLWJhci1iZztcbiAgLmJveC1zaGFkb3coaW5zZXQgMCAtMXB4IDAgcmdiYSgwLDAsMCwuMTUpKTtcbiAgLnRyYW5zaXRpb24od2lkdGggLjZzIGVhc2UpO1xufVxuXG4vLyBTdHJpcGVkIGJhcnNcbi8vXG4vLyBgLnByb2dyZXNzLXN0cmlwZWQgLnByb2dyZXNzLWJhcmAgaXMgZGVwcmVjYXRlZCBhcyBvZiB2My4yLjAgaW4gZmF2b3Igb2YgdGhlXG4vLyBgLnByb2dyZXNzLWJhci1zdHJpcGVkYCBjbGFzcywgd2hpY2ggeW91IGp1c3QgYWRkIHRvIGFuIGV4aXN0aW5nXG4vLyBgLnByb2dyZXNzLWJhcmAuXG4ucHJvZ3Jlc3Mtc3RyaXBlZCAucHJvZ3Jlc3MtYmFyLFxuLnByb2dyZXNzLWJhci1zdHJpcGVkIHtcbiAgI2dyYWRpZW50ID4gLnN0cmlwZWQoKTtcbiAgYmFja2dyb3VuZC1zaXplOiA0MHB4IDQwcHg7XG59XG5cbi8vIENhbGwgYW5pbWF0aW9uIGZvciB0aGUgYWN0aXZlIG9uZVxuLy9cbi8vIGAucHJvZ3Jlc3MuYWN0aXZlIC5wcm9ncmVzcy1iYXJgIGlzIGRlcHJlY2F0ZWQgYXMgb2YgdjMuMi4wIGluIGZhdm9yIG9mIHRoZVxuLy8gYC5wcm9ncmVzcy1iYXIuYWN0aXZlYCBhcHByb2FjaC5cbi5wcm9ncmVzcy5hY3RpdmUgLnByb2dyZXNzLWJhcixcbi5wcm9ncmVzcy1iYXIuYWN0aXZlIHtcbiAgLmFuaW1hdGlvbihwcm9ncmVzcy1iYXItc3RyaXBlcyAycyBsaW5lYXIgaW5maW5pdGUpO1xufVxuXG5cbi8vIFZhcmlhdGlvbnNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLnByb2dyZXNzLWJhci1zdWNjZXNzIHtcbiAgLnByb2dyZXNzLWJhci12YXJpYW50KEBwcm9ncmVzcy1iYXItc3VjY2Vzcy1iZyk7XG59XG5cbi5wcm9ncmVzcy1iYXItaW5mbyB7XG4gIC5wcm9ncmVzcy1iYXItdmFyaWFudChAcHJvZ3Jlc3MtYmFyLWluZm8tYmcpO1xufVxuXG4ucHJvZ3Jlc3MtYmFyLXdhcm5pbmcge1xuICAucHJvZ3Jlc3MtYmFyLXZhcmlhbnQoQHByb2dyZXNzLWJhci13YXJuaW5nLWJnKTtcbn1cblxuLnByb2dyZXNzLWJhci1kYW5nZXIge1xuICAucHJvZ3Jlc3MtYmFyLXZhcmlhbnQoQHByb2dyZXNzLWJhci1kYW5nZXItYmcpO1xufVxuIiwiLy8gR3JhZGllbnRzXG5cbiNncmFkaWVudCB7XG5cbiAgLy8gSG9yaXpvbnRhbCBncmFkaWVudCwgZnJvbSBsZWZ0IHRvIHJpZ2h0XG4gIC8vXG4gIC8vIENyZWF0ZXMgdHdvIGNvbG9yIHN0b3BzLCBzdGFydCBhbmQgZW5kLCBieSBzcGVjaWZ5aW5nIGEgY29sb3IgYW5kIHBvc2l0aW9uIGZvciBlYWNoIGNvbG9yIHN0b3AuXG4gIC8vIENvbG9yIHN0b3BzIGFyZSBub3QgYXZhaWxhYmxlIGluIElFOSBhbmQgYmVsb3cuXG4gIC5ob3Jpem9udGFsKEBzdGFydC1jb2xvcjogIzU1NTsgQGVuZC1jb2xvcjogIzMzMzsgQHN0YXJ0LXBlcmNlbnQ6IDAlOyBAZW5kLXBlcmNlbnQ6IDEwMCUpIHtcbiAgICBiYWNrZ3JvdW5kLWltYWdlOiAtd2Via2l0LWxpbmVhci1ncmFkaWVudChsZWZ0LCBAc3RhcnQtY29sb3IgQHN0YXJ0LXBlcmNlbnQsIEBlbmQtY29sb3IgQGVuZC1wZXJjZW50KTsgLy8gU2FmYXJpIDUuMS02LCBDaHJvbWUgMTArXG4gICAgYmFja2dyb3VuZC1pbWFnZTogLW8tbGluZWFyLWdyYWRpZW50KGxlZnQsIEBzdGFydC1jb2xvciBAc3RhcnQtcGVyY2VudCwgQGVuZC1jb2xvciBAZW5kLXBlcmNlbnQpOyAvLyBPcGVyYSAxMlxuICAgIGJhY2tncm91bmQtaW1hZ2U6IGxpbmVhci1ncmFkaWVudCh0byByaWdodCwgQHN0YXJ0LWNvbG9yIEBzdGFydC1wZXJjZW50LCBAZW5kLWNvbG9yIEBlbmQtcGVyY2VudCk7IC8vIFN0YW5kYXJkLCBJRTEwLCBGaXJlZm94IDE2KywgT3BlcmEgMTIuMTArLCBTYWZhcmkgNyssIENocm9tZSAyNitcbiAgICBiYWNrZ3JvdW5kLXJlcGVhdDogcmVwZWF0LXg7XG4gICAgZmlsdGVyOiBlKCUoXCJwcm9naWQ6RFhJbWFnZVRyYW5zZm9ybS5NaWNyb3NvZnQuZ3JhZGllbnQoc3RhcnRDb2xvcnN0cj0nJWQnLCBlbmRDb2xvcnN0cj0nJWQnLCBHcmFkaWVudFR5cGU9MSlcIixhcmdiKEBzdGFydC1jb2xvciksYXJnYihAZW5kLWNvbG9yKSkpOyAvLyBJRTkgYW5kIGRvd25cbiAgfVxuXG4gIC8vIFZlcnRpY2FsIGdyYWRpZW50LCBmcm9tIHRvcCB0byBib3R0b21cbiAgLy9cbiAgLy8gQ3JlYXRlcyB0d28gY29sb3Igc3RvcHMsIHN0YXJ0IGFuZCBlbmQsIGJ5IHNwZWNpZnlpbmcgYSBjb2xvciBhbmQgcG9zaXRpb24gZm9yIGVhY2ggY29sb3Igc3RvcC5cbiAgLy8gQ29sb3Igc3RvcHMgYXJlIG5vdCBhdmFpbGFibGUgaW4gSUU5IGFuZCBiZWxvdy5cbiAgLnZlcnRpY2FsKEBzdGFydC1jb2xvcjogIzU1NTsgQGVuZC1jb2xvcjogIzMzMzsgQHN0YXJ0LXBlcmNlbnQ6IDAlOyBAZW5kLXBlcmNlbnQ6IDEwMCUpIHtcbiAgICBiYWNrZ3JvdW5kLWltYWdlOiAtd2Via2l0LWxpbmVhci1ncmFkaWVudCh0b3AsIEBzdGFydC1jb2xvciBAc3RhcnQtcGVyY2VudCwgQGVuZC1jb2xvciBAZW5kLXBlcmNlbnQpOyAgLy8gU2FmYXJpIDUuMS02LCBDaHJvbWUgMTArXG4gICAgYmFja2dyb3VuZC1pbWFnZTogLW8tbGluZWFyLWdyYWRpZW50KHRvcCwgQHN0YXJ0LWNvbG9yIEBzdGFydC1wZXJjZW50LCBAZW5kLWNvbG9yIEBlbmQtcGVyY2VudCk7ICAvLyBPcGVyYSAxMlxuICAgIGJhY2tncm91bmQtaW1hZ2U6IGxpbmVhci1ncmFkaWVudCh0byBib3R0b20sIEBzdGFydC1jb2xvciBAc3RhcnQtcGVyY2VudCwgQGVuZC1jb2xvciBAZW5kLXBlcmNlbnQpOyAvLyBTdGFuZGFyZCwgSUUxMCwgRmlyZWZveCAxNissIE9wZXJhIDEyLjEwKywgU2FmYXJpIDcrLCBDaHJvbWUgMjYrXG4gICAgYmFja2dyb3VuZC1yZXBlYXQ6IHJlcGVhdC14O1xuICAgIGZpbHRlcjogZSglKFwicHJvZ2lkOkRYSW1hZ2VUcmFuc2Zvcm0uTWljcm9zb2Z0LmdyYWRpZW50KHN0YXJ0Q29sb3JzdHI9JyVkJywgZW5kQ29sb3JzdHI9JyVkJywgR3JhZGllbnRUeXBlPTApXCIsYXJnYihAc3RhcnQtY29sb3IpLGFyZ2IoQGVuZC1jb2xvcikpKTsgLy8gSUU5IGFuZCBkb3duXG4gIH1cblxuICAuZGlyZWN0aW9uYWwoQHN0YXJ0LWNvbG9yOiAjNTU1OyBAZW5kLWNvbG9yOiAjMzMzOyBAZGVnOiA0NWRlZykge1xuICAgIGJhY2tncm91bmQtcmVwZWF0OiByZXBlYXQteDtcbiAgICBiYWNrZ3JvdW5kLWltYWdlOiAtd2Via2l0LWxpbmVhci1ncmFkaWVudChAZGVnLCBAc3RhcnQtY29sb3IsIEBlbmQtY29sb3IpOyAvLyBTYWZhcmkgNS4xLTYsIENocm9tZSAxMCtcbiAgICBiYWNrZ3JvdW5kLWltYWdlOiAtby1saW5lYXItZ3JhZGllbnQoQGRlZywgQHN0YXJ0LWNvbG9yLCBAZW5kLWNvbG9yKTsgLy8gT3BlcmEgMTJcbiAgICBiYWNrZ3JvdW5kLWltYWdlOiBsaW5lYXItZ3JhZGllbnQoQGRlZywgQHN0YXJ0LWNvbG9yLCBAZW5kLWNvbG9yKTsgLy8gU3RhbmRhcmQsIElFMTAsIEZpcmVmb3ggMTYrLCBPcGVyYSAxMi4xMCssIFNhZmFyaSA3KywgQ2hyb21lIDI2K1xuICB9XG4gIC5ob3Jpem9udGFsLXRocmVlLWNvbG9ycyhAc3RhcnQtY29sb3I6ICMwMGIzZWU7IEBtaWQtY29sb3I6ICM3YTQzYjY7IEBjb2xvci1zdG9wOiA1MCU7IEBlbmQtY29sb3I6ICNjMzMyNWYpIHtcbiAgICBiYWNrZ3JvdW5kLWltYWdlOiAtd2Via2l0LWxpbmVhci1ncmFkaWVudChsZWZ0LCBAc3RhcnQtY29sb3IsIEBtaWQtY29sb3IgQGNvbG9yLXN0b3AsIEBlbmQtY29sb3IpO1xuICAgIGJhY2tncm91bmQtaW1hZ2U6IC1vLWxpbmVhci1ncmFkaWVudChsZWZ0LCBAc3RhcnQtY29sb3IsIEBtaWQtY29sb3IgQGNvbG9yLXN0b3AsIEBlbmQtY29sb3IpO1xuICAgIGJhY2tncm91bmQtaW1hZ2U6IGxpbmVhci1ncmFkaWVudCh0byByaWdodCwgQHN0YXJ0LWNvbG9yLCBAbWlkLWNvbG9yIEBjb2xvci1zdG9wLCBAZW5kLWNvbG9yKTtcbiAgICBiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0O1xuICAgIGZpbHRlcjogZSglKFwicHJvZ2lkOkRYSW1hZ2VUcmFuc2Zvcm0uTWljcm9zb2Z0LmdyYWRpZW50KHN0YXJ0Q29sb3JzdHI9JyVkJywgZW5kQ29sb3JzdHI9JyVkJywgR3JhZGllbnRUeXBlPTEpXCIsYXJnYihAc3RhcnQtY29sb3IpLGFyZ2IoQGVuZC1jb2xvcikpKTsgLy8gSUU5IGFuZCBkb3duLCBnZXRzIG5vIGNvbG9yLXN0b3AgYXQgYWxsIGZvciBwcm9wZXIgZmFsbGJhY2tcbiAgfVxuICAudmVydGljYWwtdGhyZWUtY29sb3JzKEBzdGFydC1jb2xvcjogIzAwYjNlZTsgQG1pZC1jb2xvcjogIzdhNDNiNjsgQGNvbG9yLXN0b3A6IDUwJTsgQGVuZC1jb2xvcjogI2MzMzI1Zikge1xuICAgIGJhY2tncm91bmQtaW1hZ2U6IC13ZWJraXQtbGluZWFyLWdyYWRpZW50KEBzdGFydC1jb2xvciwgQG1pZC1jb2xvciBAY29sb3Itc3RvcCwgQGVuZC1jb2xvcik7XG4gICAgYmFja2dyb3VuZC1pbWFnZTogLW8tbGluZWFyLWdyYWRpZW50KEBzdGFydC1jb2xvciwgQG1pZC1jb2xvciBAY29sb3Itc3RvcCwgQGVuZC1jb2xvcik7XG4gICAgYmFja2dyb3VuZC1pbWFnZTogbGluZWFyLWdyYWRpZW50KEBzdGFydC1jb2xvciwgQG1pZC1jb2xvciBAY29sb3Itc3RvcCwgQGVuZC1jb2xvcik7XG4gICAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDtcbiAgICBmaWx0ZXI6IGUoJShcInByb2dpZDpEWEltYWdlVHJhbnNmb3JtLk1pY3Jvc29mdC5ncmFkaWVudChzdGFydENvbG9yc3RyPSclZCcsIGVuZENvbG9yc3RyPSclZCcsIEdyYWRpZW50VHlwZT0wKVwiLGFyZ2IoQHN0YXJ0LWNvbG9yKSxhcmdiKEBlbmQtY29sb3IpKSk7IC8vIElFOSBhbmQgZG93biwgZ2V0cyBubyBjb2xvci1zdG9wIGF0IGFsbCBmb3IgcHJvcGVyIGZhbGxiYWNrXG4gIH1cbiAgLnJhZGlhbChAaW5uZXItY29sb3I6ICM1NTU7IEBvdXRlci1jb2xvcjogIzMzMykge1xuICAgIGJhY2tncm91bmQtaW1hZ2U6IC13ZWJraXQtcmFkaWFsLWdyYWRpZW50KGNpcmNsZSwgQGlubmVyLWNvbG9yLCBAb3V0ZXItY29sb3IpO1xuICAgIGJhY2tncm91bmQtaW1hZ2U6IHJhZGlhbC1ncmFkaWVudChjaXJjbGUsIEBpbm5lci1jb2xvciwgQG91dGVyLWNvbG9yKTtcbiAgICBiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0O1xuICB9XG4gIC5zdHJpcGVkKEBjb2xvcjogcmdiYSgyNTUsMjU1LDI1NSwuMTUpOyBAYW5nbGU6IDQ1ZGVnKSB7XG4gICAgYmFja2dyb3VuZC1pbWFnZTogLXdlYmtpdC1saW5lYXItZ3JhZGllbnQoQGFuZ2xlLCBAY29sb3IgMjUlLCB0cmFuc3BhcmVudCAyNSUsIHRyYW5zcGFyZW50IDUwJSwgQGNvbG9yIDUwJSwgQGNvbG9yIDc1JSwgdHJhbnNwYXJlbnQgNzUlLCB0cmFuc3BhcmVudCk7XG4gICAgYmFja2dyb3VuZC1pbWFnZTogLW8tbGluZWFyLWdyYWRpZW50KEBhbmdsZSwgQGNvbG9yIDI1JSwgdHJhbnNwYXJlbnQgMjUlLCB0cmFuc3BhcmVudCA1MCUsIEBjb2xvciA1MCUsIEBjb2xvciA3NSUsIHRyYW5zcGFyZW50IDc1JSwgdHJhbnNwYXJlbnQpO1xuICAgIGJhY2tncm91bmQtaW1hZ2U6IGxpbmVhci1ncmFkaWVudChAYW5nbGUsIEBjb2xvciAyNSUsIHRyYW5zcGFyZW50IDI1JSwgdHJhbnNwYXJlbnQgNTAlLCBAY29sb3IgNTAlLCBAY29sb3IgNzUlLCB0cmFuc3BhcmVudCA3NSUsIHRyYW5zcGFyZW50KTtcbiAgfVxufVxuIiwiLy8gUHJvZ3Jlc3MgYmFyc1xuXG4ucHJvZ3Jlc3MtYmFyLXZhcmlhbnQoQGNvbG9yKSB7XG4gIGJhY2tncm91bmQtY29sb3I6IEBjb2xvcjtcblxuICAvLyBEZXByZWNhdGVkIHBhcmVudCBjbGFzcyByZXF1aXJlbWVudCBhcyBvZiB2My4yLjBcbiAgLnByb2dyZXNzLXN0cmlwZWQgJiB7XG4gICAgI2dyYWRpZW50ID4gLnN0cmlwZWQoKTtcbiAgfVxufVxuIiwiLm1lZGlhIHtcbiAgLy8gUHJvcGVyIHNwYWNpbmcgYmV0d2VlbiBpbnN0YW5jZXMgb2YgLm1lZGlhXG4gIG1hcmdpbi10b3A6IDE1cHg7XG5cbiAgJjpmaXJzdC1jaGlsZCB7XG4gICAgbWFyZ2luLXRvcDogMDtcbiAgfVxufVxuXG4ubWVkaWEtcmlnaHQsXG4ubWVkaWEgPiAucHVsbC1yaWdodCB7XG4gIHBhZGRpbmctbGVmdDogMTBweDtcbn1cblxuLm1lZGlhLWxlZnQsXG4ubWVkaWEgPiAucHVsbC1sZWZ0IHtcbiAgcGFkZGluZy1yaWdodDogMTBweDtcbn1cblxuLm1lZGlhLWxlZnQsXG4ubWVkaWEtcmlnaHQsXG4ubWVkaWEtYm9keSB7XG4gIGRpc3BsYXk6IHRhYmxlLWNlbGw7XG4gIHZlcnRpY2FsLWFsaWduOiB0b3A7XG59XG5cbi5tZWRpYS1taWRkbGUge1xuICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1xufVxuXG4ubWVkaWEtYm90dG9tIHtcbiAgdmVydGljYWwtYWxpZ246IGJvdHRvbTtcbn1cblxuLy8gUmVzZXQgbWFyZ2lucyBvbiBoZWFkaW5ncyBmb3IgdGlnaHRlciBkZWZhdWx0IHNwYWNpbmdcbi5tZWRpYS1oZWFkaW5nIHtcbiAgbWFyZ2luLXRvcDogMDtcbiAgbWFyZ2luLWJvdHRvbTogNXB4O1xufVxuXG4vLyBNZWRpYSBsaXN0IHZhcmlhdGlvblxuLy9cbi8vIFVuZG8gZGVmYXVsdCB1bC9vbCBzdHlsZXNcbi5tZWRpYS1saXN0IHtcbiAgcGFkZGluZy1sZWZ0OiAwO1xuICBsaXN0LXN0eWxlOiBub25lO1xufVxuIiwiLy9cbi8vIExpc3QgZ3JvdXBzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5cbi8vIEJhc2UgY2xhc3Ncbi8vXG4vLyBFYXNpbHkgdXNhYmxlIG9uIDx1bD4sIDxvbD4sIG9yIDxkaXY+LlxuXG4ubGlzdC1ncm91cCB7XG4gIC8vIE5vIG5lZWQgdG8gc2V0IGxpc3Qtc3R5bGU6IG5vbmU7IHNpbmNlIC5saXN0LWdyb3VwLWl0ZW0gaXMgYmxvY2sgbGV2ZWxcbiAgbWFyZ2luLWJvdHRvbTogMjBweDtcbiAgcGFkZGluZy1sZWZ0OiAwOyAvLyByZXNldCBwYWRkaW5nIGJlY2F1c2UgdWwgYW5kIG9sXG59XG5cblxuLy8gSW5kaXZpZHVhbCBsaXN0IGl0ZW1zXG4vL1xuLy8gVXNlIG9uIGBsaWBzIG9yIGBkaXZgcyB3aXRoaW4gdGhlIGAubGlzdC1ncm91cGAgcGFyZW50LlxuXG4ubGlzdC1ncm91cC1pdGVtIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICBkaXNwbGF5OiBibG9jaztcbiAgcGFkZGluZzogMTBweCAxNXB4O1xuICAvLyBQbGFjZSB0aGUgYm9yZGVyIG9uIHRoZSBsaXN0IGl0ZW1zIGFuZCBuZWdhdGl2ZSBtYXJnaW4gdXAgZm9yIGJldHRlciBzdHlsaW5nXG4gIG1hcmdpbi1ib3R0b206IC0xcHg7XG4gIGJhY2tncm91bmQtY29sb3I6IEBsaXN0LWdyb3VwLWJnO1xuICBib3JkZXI6IDFweCBzb2xpZCBAbGlzdC1ncm91cC1ib3JkZXI7XG5cbiAgLy8gUm91bmQgdGhlIGZpcnN0IGFuZCBsYXN0IGl0ZW1zXG4gICY6Zmlyc3QtY2hpbGQge1xuICAgIC5ib3JkZXItdG9wLXJhZGl1cyhAbGlzdC1ncm91cC1ib3JkZXItcmFkaXVzKTtcbiAgfVxuICAmOmxhc3QtY2hpbGQge1xuICAgIG1hcmdpbi1ib3R0b206IDA7XG4gICAgLmJvcmRlci1ib3R0b20tcmFkaXVzKEBsaXN0LWdyb3VwLWJvcmRlci1yYWRpdXMpO1xuICB9XG5cbiAgLy8gQWxpZ24gYmFkZ2VzIHdpdGhpbiBsaXN0IGl0ZW1zXG4gID4gLmJhZGdlIHtcbiAgICBmbG9hdDogcmlnaHQ7XG4gIH1cbiAgPiAuYmFkZ2UgKyAuYmFkZ2Uge1xuICAgIG1hcmdpbi1yaWdodDogNXB4O1xuICB9XG59XG5cblxuLy8gTGlua2VkIGxpc3QgaXRlbXNcbi8vXG4vLyBVc2UgYW5jaG9yIGVsZW1lbnRzIGluc3RlYWQgb2YgYGxpYHMgb3IgYGRpdmBzIHRvIGNyZWF0ZSBsaW5rZWQgbGlzdCBpdGVtcy5cbi8vIEluY2x1ZGVzIGFuIGV4dHJhIGAuYWN0aXZlYCBtb2RpZmllciBjbGFzcyBmb3Igc2hvd2luZyBzZWxlY3RlZCBpdGVtcy5cblxuYS5saXN0LWdyb3VwLWl0ZW0ge1xuICBjb2xvcjogQGxpc3QtZ3JvdXAtbGluay1jb2xvcjtcblxuICAubGlzdC1ncm91cC1pdGVtLWhlYWRpbmcge1xuICAgIGNvbG9yOiBAbGlzdC1ncm91cC1saW5rLWhlYWRpbmctY29sb3I7XG4gIH1cblxuICAvLyBIb3ZlciBzdGF0ZVxuICAmOmhvdmVyLFxuICAmOmZvY3VzIHtcbiAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7XG4gICAgY29sb3I6IEBsaXN0LWdyb3VwLWxpbmstaG92ZXItY29sb3I7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogQGxpc3QtZ3JvdXAtaG92ZXItYmc7XG4gIH1cbn1cblxuLmxpc3QtZ3JvdXAtaXRlbSB7XG4gIC8vIERpc2FibGVkIHN0YXRlXG4gICYuZGlzYWJsZWQsXG4gICYuZGlzYWJsZWQ6aG92ZXIsXG4gICYuZGlzYWJsZWQ6Zm9jdXMge1xuICAgIGJhY2tncm91bmQtY29sb3I6IEBsaXN0LWdyb3VwLWRpc2FibGVkLWJnO1xuICAgIGNvbG9yOiBAbGlzdC1ncm91cC1kaXNhYmxlZC1jb2xvcjtcbiAgICBjdXJzb3I6IEBjdXJzb3ItZGlzYWJsZWQ7XG5cbiAgICAvLyBGb3JjZSBjb2xvciB0byBpbmhlcml0IGZvciBjdXN0b20gY29udGVudFxuICAgIC5saXN0LWdyb3VwLWl0ZW0taGVhZGluZyB7XG4gICAgICBjb2xvcjogaW5oZXJpdDtcbiAgICB9XG4gICAgLmxpc3QtZ3JvdXAtaXRlbS10ZXh0IHtcbiAgICAgIGNvbG9yOiBAbGlzdC1ncm91cC1kaXNhYmxlZC10ZXh0LWNvbG9yO1xuICAgIH1cbiAgfVxuXG4gIC8vIEFjdGl2ZSBjbGFzcyBvbiBpdGVtIGl0c2VsZiwgbm90IHBhcmVudFxuICAmLmFjdGl2ZSxcbiAgJi5hY3RpdmU6aG92ZXIsXG4gICYuYWN0aXZlOmZvY3VzIHtcbiAgICB6LWluZGV4OiAyOyAvLyBQbGFjZSBhY3RpdmUgaXRlbXMgYWJvdmUgdGhlaXIgc2libGluZ3MgZm9yIHByb3BlciBib3JkZXIgc3R5bGluZ1xuICAgIGNvbG9yOiBAbGlzdC1ncm91cC1hY3RpdmUtY29sb3I7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogQGxpc3QtZ3JvdXAtYWN0aXZlLWJnO1xuICAgIGJvcmRlci1jb2xvcjogQGxpc3QtZ3JvdXAtYWN0aXZlLWJvcmRlcjtcblxuICAgIC8vIEZvcmNlIGNvbG9yIHRvIGluaGVyaXQgZm9yIGN1c3RvbSBjb250ZW50XG4gICAgLmxpc3QtZ3JvdXAtaXRlbS1oZWFkaW5nLFxuICAgIC5saXN0LWdyb3VwLWl0ZW0taGVhZGluZyA+IHNtYWxsLFxuICAgIC5saXN0LWdyb3VwLWl0ZW0taGVhZGluZyA+IC5zbWFsbCB7XG4gICAgICBjb2xvcjogaW5oZXJpdDtcbiAgICB9XG4gICAgLmxpc3QtZ3JvdXAtaXRlbS10ZXh0IHtcbiAgICAgIGNvbG9yOiBAbGlzdC1ncm91cC1hY3RpdmUtdGV4dC1jb2xvcjtcbiAgICB9XG4gIH1cbn1cblxuXG4vLyBDb250ZXh0dWFsIHZhcmlhbnRzXG4vL1xuLy8gQWRkIG1vZGlmaWVyIGNsYXNzZXMgdG8gY2hhbmdlIHRleHQgYW5kIGJhY2tncm91bmQgY29sb3Igb24gaW5kaXZpZHVhbCBpdGVtcy5cbi8vIE9yZ2FuaXphdGlvbmFsbHksIHRoaXMgbXVzdCBjb21lIGFmdGVyIHRoZSBgOmhvdmVyYCBzdGF0ZXMuXG5cbi5saXN0LWdyb3VwLWl0ZW0tdmFyaWFudChzdWNjZXNzOyBAc3RhdGUtc3VjY2Vzcy1iZzsgQHN0YXRlLXN1Y2Nlc3MtdGV4dCk7XG4ubGlzdC1ncm91cC1pdGVtLXZhcmlhbnQoaW5mbzsgQHN0YXRlLWluZm8tYmc7IEBzdGF0ZS1pbmZvLXRleHQpO1xuLmxpc3QtZ3JvdXAtaXRlbS12YXJpYW50KHdhcm5pbmc7IEBzdGF0ZS13YXJuaW5nLWJnOyBAc3RhdGUtd2FybmluZy10ZXh0KTtcbi5saXN0LWdyb3VwLWl0ZW0tdmFyaWFudChkYW5nZXI7IEBzdGF0ZS1kYW5nZXItYmc7IEBzdGF0ZS1kYW5nZXItdGV4dCk7XG5cblxuLy8gQ3VzdG9tIGNvbnRlbnQgb3B0aW9uc1xuLy9cbi8vIEV4dHJhIGNsYXNzZXMgZm9yIGNyZWF0aW5nIHdlbGwtZm9ybWF0dGVkIGNvbnRlbnQgd2l0aGluIGAubGlzdC1ncm91cC1pdGVtYHMuXG5cbi5saXN0LWdyb3VwLWl0ZW0taGVhZGluZyB7XG4gIG1hcmdpbi10b3A6IDA7XG4gIG1hcmdpbi1ib3R0b206IDVweDtcbn1cbi5saXN0LWdyb3VwLWl0ZW0tdGV4dCB7XG4gIG1hcmdpbi1ib3R0b206IDA7XG4gIGxpbmUtaGVpZ2h0OiAxLjM7XG59XG4iLCIvLyBMaXN0IEdyb3Vwc1xuXG4ubGlzdC1ncm91cC1pdGVtLXZhcmlhbnQoQHN0YXRlOyBAYmFja2dyb3VuZDsgQGNvbG9yKSB7XG4gIC5saXN0LWdyb3VwLWl0ZW0tQHtzdGF0ZX0ge1xuICAgIGNvbG9yOiBAY29sb3I7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogQGJhY2tncm91bmQ7XG5cbiAgICBhJiB7XG4gICAgICBjb2xvcjogQGNvbG9yO1xuXG4gICAgICAubGlzdC1ncm91cC1pdGVtLWhlYWRpbmcge1xuICAgICAgICBjb2xvcjogaW5oZXJpdDtcbiAgICAgIH1cblxuICAgICAgJjpob3ZlcixcbiAgICAgICY6Zm9jdXMge1xuICAgICAgICBjb2xvcjogQGNvbG9yO1xuICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBkYXJrZW4oQGJhY2tncm91bmQsIDUlKTtcbiAgICAgIH1cbiAgICAgICYuYWN0aXZlLFxuICAgICAgJi5hY3RpdmU6aG92ZXIsXG4gICAgICAmLmFjdGl2ZTpmb2N1cyB7XG4gICAgICAgIGNvbG9yOiAjZmZmO1xuICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAY29sb3I7XG4gICAgICAgIGJvcmRlci1jb2xvcjogQGNvbG9yO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIiwiLy9cbi8vIFBhbmVsc1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuXG4vLyBCYXNlIGNsYXNzXG4ucGFuZWwge1xuICBtYXJnaW4tYm90dG9tOiBAbGluZS1oZWlnaHQtY29tcHV0ZWQ7XG4gIGJhY2tncm91bmQtY29sb3I6IEBwYW5lbC1iZztcbiAgYm9yZGVyOiAxcHggc29saWQgdHJhbnNwYXJlbnQ7XG4gIGJvcmRlci1yYWRpdXM6IEBwYW5lbC1ib3JkZXItcmFkaXVzO1xuICAuYm94LXNoYWRvdygwIDFweCAxcHggcmdiYSgwLDAsMCwuMDUpKTtcbn1cblxuLy8gUGFuZWwgY29udGVudHNcbi5wYW5lbC1ib2R5IHtcbiAgcGFkZGluZzogQHBhbmVsLWJvZHktcGFkZGluZztcbiAgJjpleHRlbmQoLmNsZWFyZml4IGFsbCk7XG59XG5cbi8vIE9wdGlvbmFsIGhlYWRpbmdcbi5wYW5lbC1oZWFkaW5nIHtcbiAgcGFkZGluZzogQHBhbmVsLWhlYWRpbmctcGFkZGluZztcbiAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHRyYW5zcGFyZW50O1xuICAuYm9yZGVyLXRvcC1yYWRpdXMoKEBwYW5lbC1ib3JkZXItcmFkaXVzIC0gMSkpO1xuXG4gID4gLmRyb3Bkb3duIC5kcm9wZG93bi10b2dnbGUge1xuICAgIGNvbG9yOiBpbmhlcml0O1xuICB9XG59XG5cbi8vIFdpdGhpbiBoZWFkaW5nLCBzdHJpcCBhbnkgYGgqYCB0YWcgb2YgaXRzIGRlZmF1bHQgbWFyZ2lucyBmb3Igc3BhY2luZy5cbi5wYW5lbC10aXRsZSB7XG4gIG1hcmdpbi10b3A6IDA7XG4gIG1hcmdpbi1ib3R0b206IDA7XG4gIGZvbnQtc2l6ZTogY2VpbCgoQGZvbnQtc2l6ZS1iYXNlICogMS4xMjUpKTtcbiAgY29sb3I6IGluaGVyaXQ7XG5cbiAgPiBhIHtcbiAgICBjb2xvcjogaW5oZXJpdDtcbiAgfVxufVxuXG4vLyBPcHRpb25hbCBmb290ZXIgKHN0YXlzIGdyYXkgaW4gZXZlcnkgbW9kaWZpZXIgY2xhc3MpXG4ucGFuZWwtZm9vdGVyIHtcbiAgcGFkZGluZzogQHBhbmVsLWZvb3Rlci1wYWRkaW5nO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiBAcGFuZWwtZm9vdGVyLWJnO1xuICBib3JkZXItdG9wOiAxcHggc29saWQgQHBhbmVsLWlubmVyLWJvcmRlcjtcbiAgLmJvcmRlci1ib3R0b20tcmFkaXVzKChAcGFuZWwtYm9yZGVyLXJhZGl1cyAtIDEpKTtcbn1cblxuXG4vLyBMaXN0IGdyb3VwcyBpbiBwYW5lbHNcbi8vXG4vLyBCeSBkZWZhdWx0LCBzcGFjZSBvdXQgbGlzdCBncm91cCBjb250ZW50IGZyb20gcGFuZWwgaGVhZGluZ3MgdG8gYWNjb3VudCBmb3Jcbi8vIGFueSBraW5kIG9mIGN1c3RvbSBjb250ZW50IGJldHdlZW4gdGhlIHR3by5cblxuLnBhbmVsIHtcbiAgPiAubGlzdC1ncm91cCxcbiAgPiAucGFuZWwtY29sbGFwc2UgPiAubGlzdC1ncm91cCB7XG4gICAgbWFyZ2luLWJvdHRvbTogMDtcblxuICAgIC5saXN0LWdyb3VwLWl0ZW0ge1xuICAgICAgYm9yZGVyLXdpZHRoOiAxcHggMDtcbiAgICAgIGJvcmRlci1yYWRpdXM6IDA7XG4gICAgfVxuXG4gICAgLy8gQWRkIGJvcmRlciB0b3AgcmFkaXVzIGZvciBmaXJzdCBvbmVcbiAgICAmOmZpcnN0LWNoaWxkIHtcbiAgICAgIC5saXN0LWdyb3VwLWl0ZW06Zmlyc3QtY2hpbGQge1xuICAgICAgICBib3JkZXItdG9wOiAwO1xuICAgICAgICAuYm9yZGVyLXRvcC1yYWRpdXMoKEBwYW5lbC1ib3JkZXItcmFkaXVzIC0gMSkpO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBBZGQgYm9yZGVyIGJvdHRvbSByYWRpdXMgZm9yIGxhc3Qgb25lXG4gICAgJjpsYXN0LWNoaWxkIHtcbiAgICAgIC5saXN0LWdyb3VwLWl0ZW06bGFzdC1jaGlsZCB7XG4gICAgICAgIGJvcmRlci1ib3R0b206IDA7XG4gICAgICAgIC5ib3JkZXItYm90dG9tLXJhZGl1cygoQHBhbmVsLWJvcmRlci1yYWRpdXMgLSAxKSk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4vLyBDb2xsYXBzZSBzcGFjZSBiZXR3ZWVuIHdoZW4gdGhlcmUncyBubyBhZGRpdGlvbmFsIGNvbnRlbnQuXG4ucGFuZWwtaGVhZGluZyArIC5saXN0LWdyb3VwIHtcbiAgLmxpc3QtZ3JvdXAtaXRlbTpmaXJzdC1jaGlsZCB7XG4gICAgYm9yZGVyLXRvcC13aWR0aDogMDtcbiAgfVxufVxuLmxpc3QtZ3JvdXAgKyAucGFuZWwtZm9vdGVyIHtcbiAgYm9yZGVyLXRvcC13aWR0aDogMDtcbn1cblxuLy8gVGFibGVzIGluIHBhbmVsc1xuLy9cbi8vIFBsYWNlIGEgbm9uLWJvcmRlcmVkIGAudGFibGVgIHdpdGhpbiBhIHBhbmVsIChub3Qgd2l0aGluIGEgYC5wYW5lbC1ib2R5YCkgYW5kXG4vLyB3YXRjaCBpdCBnbyBmdWxsIHdpZHRoLlxuXG4ucGFuZWwge1xuICA+IC50YWJsZSxcbiAgPiAudGFibGUtcmVzcG9uc2l2ZSA+IC50YWJsZSxcbiAgPiAucGFuZWwtY29sbGFwc2UgPiAudGFibGUge1xuICAgIG1hcmdpbi1ib3R0b206IDA7XG5cbiAgICBjYXB0aW9uIHtcbiAgICAgIHBhZGRpbmctbGVmdDogQHBhbmVsLWJvZHktcGFkZGluZztcbiAgICAgIHBhZGRpbmctcmlnaHQ6IEBwYW5lbC1ib2R5LXBhZGRpbmc7XG4gICAgfVxuICB9XG4gIC8vIEFkZCBib3JkZXIgdG9wIHJhZGl1cyBmb3IgZmlyc3Qgb25lXG4gID4gLnRhYmxlOmZpcnN0LWNoaWxkLFxuICA+IC50YWJsZS1yZXNwb25zaXZlOmZpcnN0LWNoaWxkID4gLnRhYmxlOmZpcnN0LWNoaWxkIHtcbiAgICAuYm9yZGVyLXRvcC1yYWRpdXMoKEBwYW5lbC1ib3JkZXItcmFkaXVzIC0gMSkpO1xuXG4gICAgPiB0aGVhZDpmaXJzdC1jaGlsZCxcbiAgICA+IHRib2R5OmZpcnN0LWNoaWxkIHtcbiAgICAgID4gdHI6Zmlyc3QtY2hpbGQge1xuICAgICAgICBib3JkZXItdG9wLWxlZnQtcmFkaXVzOiAoQHBhbmVsLWJvcmRlci1yYWRpdXMgLSAxKTtcbiAgICAgICAgYm9yZGVyLXRvcC1yaWdodC1yYWRpdXM6IChAcGFuZWwtYm9yZGVyLXJhZGl1cyAtIDEpO1xuXG4gICAgICAgIHRkOmZpcnN0LWNoaWxkLFxuICAgICAgICB0aDpmaXJzdC1jaGlsZCB7XG4gICAgICAgICAgYm9yZGVyLXRvcC1sZWZ0LXJhZGl1czogKEBwYW5lbC1ib3JkZXItcmFkaXVzIC0gMSk7XG4gICAgICAgIH1cbiAgICAgICAgdGQ6bGFzdC1jaGlsZCxcbiAgICAgICAgdGg6bGFzdC1jaGlsZCB7XG4gICAgICAgICAgYm9yZGVyLXRvcC1yaWdodC1yYWRpdXM6IChAcGFuZWwtYm9yZGVyLXJhZGl1cyAtIDEpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG4gIC8vIEFkZCBib3JkZXIgYm90dG9tIHJhZGl1cyBmb3IgbGFzdCBvbmVcbiAgPiAudGFibGU6bGFzdC1jaGlsZCxcbiAgPiAudGFibGUtcmVzcG9uc2l2ZTpsYXN0LWNoaWxkID4gLnRhYmxlOmxhc3QtY2hpbGQge1xuICAgIC5ib3JkZXItYm90dG9tLXJhZGl1cygoQHBhbmVsLWJvcmRlci1yYWRpdXMgLSAxKSk7XG5cbiAgICA+IHRib2R5Omxhc3QtY2hpbGQsXG4gICAgPiB0Zm9vdDpsYXN0LWNoaWxkIHtcbiAgICAgID4gdHI6bGFzdC1jaGlsZCB7XG4gICAgICAgIGJvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6IChAcGFuZWwtYm9yZGVyLXJhZGl1cyAtIDEpO1xuICAgICAgICBib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czogKEBwYW5lbC1ib3JkZXItcmFkaXVzIC0gMSk7XG5cbiAgICAgICAgdGQ6Zmlyc3QtY2hpbGQsXG4gICAgICAgIHRoOmZpcnN0LWNoaWxkIHtcbiAgICAgICAgICBib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOiAoQHBhbmVsLWJvcmRlci1yYWRpdXMgLSAxKTtcbiAgICAgICAgfVxuICAgICAgICB0ZDpsYXN0LWNoaWxkLFxuICAgICAgICB0aDpsYXN0LWNoaWxkIHtcbiAgICAgICAgICBib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czogKEBwYW5lbC1ib3JkZXItcmFkaXVzIC0gMSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgPiAucGFuZWwtYm9keSArIC50YWJsZSxcbiAgPiAucGFuZWwtYm9keSArIC50YWJsZS1yZXNwb25zaXZlLFxuICA+IC50YWJsZSArIC5wYW5lbC1ib2R5LFxuICA+IC50YWJsZS1yZXNwb25zaXZlICsgLnBhbmVsLWJvZHkge1xuICAgIGJvcmRlci10b3A6IDFweCBzb2xpZCBAdGFibGUtYm9yZGVyLWNvbG9yO1xuICB9XG4gID4gLnRhYmxlID4gdGJvZHk6Zmlyc3QtY2hpbGQgPiB0cjpmaXJzdC1jaGlsZCB0aCxcbiAgPiAudGFibGUgPiB0Ym9keTpmaXJzdC1jaGlsZCA+IHRyOmZpcnN0LWNoaWxkIHRkIHtcbiAgICBib3JkZXItdG9wOiAwO1xuICB9XG4gID4gLnRhYmxlLWJvcmRlcmVkLFxuICA+IC50YWJsZS1yZXNwb25zaXZlID4gLnRhYmxlLWJvcmRlcmVkIHtcbiAgICBib3JkZXI6IDA7XG4gICAgPiB0aGVhZCxcbiAgICA+IHRib2R5LFxuICAgID4gdGZvb3Qge1xuICAgICAgPiB0ciB7XG4gICAgICAgID4gdGg6Zmlyc3QtY2hpbGQsXG4gICAgICAgID4gdGQ6Zmlyc3QtY2hpbGQge1xuICAgICAgICAgIGJvcmRlci1sZWZ0OiAwO1xuICAgICAgICB9XG4gICAgICAgID4gdGg6bGFzdC1jaGlsZCxcbiAgICAgICAgPiB0ZDpsYXN0LWNoaWxkIHtcbiAgICAgICAgICBib3JkZXItcmlnaHQ6IDA7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgPiB0aGVhZCxcbiAgICA+IHRib2R5IHtcbiAgICAgID4gdHI6Zmlyc3QtY2hpbGQge1xuICAgICAgICA+IHRkLFxuICAgICAgICA+IHRoIHtcbiAgICAgICAgICBib3JkZXItYm90dG9tOiAwO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgID4gdGJvZHksXG4gICAgPiB0Zm9vdCB7XG4gICAgICA+IHRyOmxhc3QtY2hpbGQge1xuICAgICAgICA+IHRkLFxuICAgICAgICA+IHRoIHtcbiAgICAgICAgICBib3JkZXItYm90dG9tOiAwO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG4gID4gLnRhYmxlLXJlc3BvbnNpdmUge1xuICAgIGJvcmRlcjogMDtcbiAgICBtYXJnaW4tYm90dG9tOiAwO1xuICB9XG59XG5cblxuLy8gQ29sbGFwc2FibGUgcGFuZWxzIChha2EsIGFjY29yZGlvbilcbi8vXG4vLyBXcmFwIGEgc2VyaWVzIG9mIHBhbmVscyBpbiBgLnBhbmVsLWdyb3VwYCB0byB0dXJuIHRoZW0gaW50byBhbiBhY2NvcmRpb24gd2l0aFxuLy8gdGhlIGhlbHAgb2Ygb3VyIGNvbGxhcHNlIEphdmFTY3JpcHQgcGx1Z2luLlxuXG4ucGFuZWwtZ3JvdXAge1xuICBtYXJnaW4tYm90dG9tOiBAbGluZS1oZWlnaHQtY29tcHV0ZWQ7XG5cbiAgLy8gVGlnaHRlbiB1cCBtYXJnaW4gc28gaXQncyBvbmx5IGJldHdlZW4gcGFuZWxzXG4gIC5wYW5lbCB7XG4gICAgbWFyZ2luLWJvdHRvbTogMDtcbiAgICBib3JkZXItcmFkaXVzOiBAcGFuZWwtYm9yZGVyLXJhZGl1cztcblxuICAgICsgLnBhbmVsIHtcbiAgICAgIG1hcmdpbi10b3A6IDVweDtcbiAgICB9XG4gIH1cblxuICAucGFuZWwtaGVhZGluZyB7XG4gICAgYm9yZGVyLWJvdHRvbTogMDtcblxuICAgICsgLnBhbmVsLWNvbGxhcHNlID4gLnBhbmVsLWJvZHksXG4gICAgKyAucGFuZWwtY29sbGFwc2UgPiAubGlzdC1ncm91cCB7XG4gICAgICBib3JkZXItdG9wOiAxcHggc29saWQgQHBhbmVsLWlubmVyLWJvcmRlcjtcbiAgICB9XG4gIH1cblxuICAucGFuZWwtZm9vdGVyIHtcbiAgICBib3JkZXItdG9wOiAwO1xuICAgICsgLnBhbmVsLWNvbGxhcHNlIC5wYW5lbC1ib2R5IHtcbiAgICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCBAcGFuZWwtaW5uZXItYm9yZGVyO1xuICAgIH1cbiAgfVxufVxuXG5cbi8vIENvbnRleHR1YWwgdmFyaWF0aW9uc1xuLnBhbmVsLWRlZmF1bHQge1xuICAucGFuZWwtdmFyaWFudChAcGFuZWwtZGVmYXVsdC1ib3JkZXI7IEBwYW5lbC1kZWZhdWx0LXRleHQ7IEBwYW5lbC1kZWZhdWx0LWhlYWRpbmctYmc7IEBwYW5lbC1kZWZhdWx0LWJvcmRlcik7XG59XG4ucGFuZWwtcHJpbWFyeSB7XG4gIC5wYW5lbC12YXJpYW50KEBwYW5lbC1wcmltYXJ5LWJvcmRlcjsgQHBhbmVsLXByaW1hcnktdGV4dDsgQHBhbmVsLXByaW1hcnktaGVhZGluZy1iZzsgQHBhbmVsLXByaW1hcnktYm9yZGVyKTtcbn1cbi5wYW5lbC1zdWNjZXNzIHtcbiAgLnBhbmVsLXZhcmlhbnQoQHBhbmVsLXN1Y2Nlc3MtYm9yZGVyOyBAcGFuZWwtc3VjY2Vzcy10ZXh0OyBAcGFuZWwtc3VjY2Vzcy1oZWFkaW5nLWJnOyBAcGFuZWwtc3VjY2Vzcy1ib3JkZXIpO1xufVxuLnBhbmVsLWluZm8ge1xuICAucGFuZWwtdmFyaWFudChAcGFuZWwtaW5mby1ib3JkZXI7IEBwYW5lbC1pbmZvLXRleHQ7IEBwYW5lbC1pbmZvLWhlYWRpbmctYmc7IEBwYW5lbC1pbmZvLWJvcmRlcik7XG59XG4ucGFuZWwtd2FybmluZyB7XG4gIC5wYW5lbC12YXJpYW50KEBwYW5lbC13YXJuaW5nLWJvcmRlcjsgQHBhbmVsLXdhcm5pbmctdGV4dDsgQHBhbmVsLXdhcm5pbmctaGVhZGluZy1iZzsgQHBhbmVsLXdhcm5pbmctYm9yZGVyKTtcbn1cbi5wYW5lbC1kYW5nZXIge1xuICAucGFuZWwtdmFyaWFudChAcGFuZWwtZGFuZ2VyLWJvcmRlcjsgQHBhbmVsLWRhbmdlci10ZXh0OyBAcGFuZWwtZGFuZ2VyLWhlYWRpbmctYmc7IEBwYW5lbC1kYW5nZXItYm9yZGVyKTtcbn1cbiIsIi8vIFBhbmVsc1xuXG4ucGFuZWwtdmFyaWFudChAYm9yZGVyOyBAaGVhZGluZy10ZXh0LWNvbG9yOyBAaGVhZGluZy1iZy1jb2xvcjsgQGhlYWRpbmctYm9yZGVyKSB7XG4gIGJvcmRlci1jb2xvcjogQGJvcmRlcjtcblxuICAmID4gLnBhbmVsLWhlYWRpbmcge1xuICAgIGNvbG9yOiBAaGVhZGluZy10ZXh0LWNvbG9yO1xuICAgIGJhY2tncm91bmQtY29sb3I6IEBoZWFkaW5nLWJnLWNvbG9yO1xuICAgIGJvcmRlci1jb2xvcjogQGhlYWRpbmctYm9yZGVyO1xuXG4gICAgKyAucGFuZWwtY29sbGFwc2UgPiAucGFuZWwtYm9keSB7XG4gICAgICBib3JkZXItdG9wLWNvbG9yOiBAYm9yZGVyO1xuICAgIH1cbiAgICAuYmFkZ2Uge1xuICAgICAgY29sb3I6IEBoZWFkaW5nLWJnLWNvbG9yO1xuICAgICAgYmFja2dyb3VuZC1jb2xvcjogQGhlYWRpbmctdGV4dC1jb2xvcjtcbiAgICB9XG4gIH1cbiAgJiA+IC5wYW5lbC1mb290ZXIge1xuICAgICsgLnBhbmVsLWNvbGxhcHNlID4gLnBhbmVsLWJvZHkge1xuICAgICAgYm9yZGVyLWJvdHRvbS1jb2xvcjogQGJvcmRlcjtcbiAgICB9XG4gIH1cbn1cbiIsIi8vIEVtYmVkcyByZXNwb25zaXZlXG4vL1xuLy8gQ3JlZGl0OiBOaWNvbGFzIEdhbGxhZ2hlciBhbmQgU1VJVCBDU1MuXG5cbi5lbWJlZC1yZXNwb25zaXZlIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICBkaXNwbGF5OiBibG9jaztcbiAgaGVpZ2h0OiAwO1xuICBwYWRkaW5nOiAwO1xuICBvdmVyZmxvdzogaGlkZGVuO1xuXG4gIC5lbWJlZC1yZXNwb25zaXZlLWl0ZW0sXG4gIGlmcmFtZSxcbiAgZW1iZWQsXG4gIG9iamVjdCxcbiAgdmlkZW8ge1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICB0b3A6IDA7XG4gICAgbGVmdDogMDtcbiAgICBib3R0b206IDA7XG4gICAgaGVpZ2h0OiAxMDAlO1xuICAgIHdpZHRoOiAxMDAlO1xuICAgIGJvcmRlcjogMDtcbiAgfVxuXG4gIC8vIE1vZGlmaWVyIGNsYXNzIGZvciAxNjo5IGFzcGVjdCByYXRpb1xuICAmLmVtYmVkLXJlc3BvbnNpdmUtMTZieTkge1xuICAgIHBhZGRpbmctYm90dG9tOiA1Ni4yNSU7XG4gIH1cblxuICAvLyBNb2RpZmllciBjbGFzcyBmb3IgNDozIGFzcGVjdCByYXRpb1xuICAmLmVtYmVkLXJlc3BvbnNpdmUtNGJ5MyB7XG4gICAgcGFkZGluZy1ib3R0b206IDc1JTtcbiAgfVxufVxuIiwiLy9cbi8vIFdlbGxzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5cbi8vIEJhc2UgY2xhc3Ncbi53ZWxsIHtcbiAgbWluLWhlaWdodDogMjBweDtcbiAgcGFkZGluZzogMTlweDtcbiAgbWFyZ2luLWJvdHRvbTogMjBweDtcbiAgYmFja2dyb3VuZC1jb2xvcjogQHdlbGwtYmc7XG4gIGJvcmRlcjogMXB4IHNvbGlkIEB3ZWxsLWJvcmRlcjtcbiAgYm9yZGVyLXJhZGl1czogQGJvcmRlci1yYWRpdXMtYmFzZTtcbiAgLmJveC1zaGFkb3coaW5zZXQgMCAxcHggMXB4IHJnYmEoMCwwLDAsLjA1KSk7XG4gIGJsb2NrcXVvdGUge1xuICAgIGJvcmRlci1jb2xvcjogI2RkZDtcbiAgICBib3JkZXItY29sb3I6IHJnYmEoMCwwLDAsLjE1KTtcbiAgfVxufVxuXG4vLyBTaXplc1xuLndlbGwtbGcge1xuICBwYWRkaW5nOiAyNHB4O1xuICBib3JkZXItcmFkaXVzOiBAYm9yZGVyLXJhZGl1cy1sYXJnZTtcbn1cbi53ZWxsLXNtIHtcbiAgcGFkZGluZzogOXB4O1xuICBib3JkZXItcmFkaXVzOiBAYm9yZGVyLXJhZGl1cy1zbWFsbDtcbn1cbiIsIi8vXG4vLyBDbG9zZSBpY29uc1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuXG4uY2xvc2Uge1xuICBmbG9hdDogcmlnaHQ7XG4gIGZvbnQtc2l6ZTogKEBmb250LXNpemUtYmFzZSAqIDEuNSk7XG4gIGZvbnQtd2VpZ2h0OiBAY2xvc2UtZm9udC13ZWlnaHQ7XG4gIGxpbmUtaGVpZ2h0OiAxO1xuICBjb2xvcjogQGNsb3NlLWNvbG9yO1xuICB0ZXh0LXNoYWRvdzogQGNsb3NlLXRleHQtc2hhZG93O1xuICAub3BhY2l0eSguMik7XG5cbiAgJjpob3ZlcixcbiAgJjpmb2N1cyB7XG4gICAgY29sb3I6IEBjbG9zZS1jb2xvcjtcbiAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7XG4gICAgY3Vyc29yOiBwb2ludGVyO1xuICAgIC5vcGFjaXR5KC41KTtcbiAgfVxuXG4gIC8vIEFkZGl0aW9uYWwgcHJvcGVydGllcyBmb3IgYnV0dG9uIHZlcnNpb25cbiAgLy8gaU9TIHJlcXVpcmVzIHRoZSBidXR0b24gZWxlbWVudCBpbnN0ZWFkIG9mIGFuIGFuY2hvciB0YWcuXG4gIC8vIElmIHlvdSB3YW50IHRoZSBhbmNob3IgdmVyc2lvbiwgaXQgcmVxdWlyZXMgYGhyZWY9XCIjXCJgLlxuICBidXR0b24mIHtcbiAgICBwYWRkaW5nOiAwO1xuICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDtcbiAgICBib3JkZXI6IDA7XG4gICAgLXdlYmtpdC1hcHBlYXJhbmNlOiBub25lO1xuICB9XG59XG4iLCIvL1xuLy8gTW9kYWxzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vLyAubW9kYWwtb3BlbiAgICAgIC0gYm9keSBjbGFzcyBmb3Iga2lsbGluZyB0aGUgc2Nyb2xsXG4vLyAubW9kYWwgICAgICAgICAgIC0gY29udGFpbmVyIHRvIHNjcm9sbCB3aXRoaW5cbi8vIC5tb2RhbC1kaWFsb2cgICAgLSBwb3NpdGlvbmluZyBzaGVsbCBmb3IgdGhlIGFjdHVhbCBtb2RhbFxuLy8gLm1vZGFsLWNvbnRlbnQgICAtIGFjdHVhbCBtb2RhbCB3LyBiZyBhbmQgY29ybmVycyBhbmQgc2hpdFxuXG4vLyBLaWxsIHRoZSBzY3JvbGwgb24gdGhlIGJvZHlcbi5tb2RhbC1vcGVuIHtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cblxuLy8gQ29udGFpbmVyIHRoYXQgdGhlIG1vZGFsIHNjcm9sbHMgd2l0aGluXG4ubW9kYWwge1xuICBkaXNwbGF5OiBub25lO1xuICBvdmVyZmxvdzogaGlkZGVuO1xuICBwb3NpdGlvbjogZml4ZWQ7XG4gIHRvcDogMDtcbiAgcmlnaHQ6IDA7XG4gIGJvdHRvbTogMDtcbiAgbGVmdDogMDtcbiAgei1pbmRleDogQHppbmRleC1tb2RhbDtcbiAgLXdlYmtpdC1vdmVyZmxvdy1zY3JvbGxpbmc6IHRvdWNoO1xuXG4gIC8vIFByZXZlbnQgQ2hyb21lIG9uIFdpbmRvd3MgZnJvbSBhZGRpbmcgYSBmb2N1cyBvdXRsaW5lLiBGb3IgZGV0YWlscywgc2VlXG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9wdWxsLzEwOTUxLlxuICBvdXRsaW5lOiAwO1xuXG4gIC8vIFdoZW4gZmFkaW5nIGluIHRoZSBtb2RhbCwgYW5pbWF0ZSBpdCB0byBzbGlkZSBkb3duXG4gICYuZmFkZSAubW9kYWwtZGlhbG9nIHtcbiAgICAudHJhbnNsYXRlKDAsIC0yNSUpO1xuICAgIC50cmFuc2l0aW9uLXRyYW5zZm9ybSh+XCIwLjNzIGVhc2Utb3V0XCIpO1xuICB9XG4gICYuaW4gLm1vZGFsLWRpYWxvZyB7IC50cmFuc2xhdGUoMCwgMCkgfVxufVxuLm1vZGFsLW9wZW4gLm1vZGFsIHtcbiAgb3ZlcmZsb3cteDogaGlkZGVuO1xuICBvdmVyZmxvdy15OiBhdXRvO1xufVxuXG4vLyBTaGVsbCBkaXYgdG8gcG9zaXRpb24gdGhlIG1vZGFsIHdpdGggYm90dG9tIHBhZGRpbmdcbi5tb2RhbC1kaWFsb2cge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIHdpZHRoOiBhdXRvO1xuICBtYXJnaW46IDEwcHg7XG59XG5cbi8vIEFjdHVhbCBtb2RhbFxuLm1vZGFsLWNvbnRlbnQge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIGJhY2tncm91bmQtY29sb3I6IEBtb2RhbC1jb250ZW50LWJnO1xuICBib3JkZXI6IDFweCBzb2xpZCBAbW9kYWwtY29udGVudC1mYWxsYmFjay1ib3JkZXItY29sb3I7IC8vb2xkIGJyb3dzZXJzIGZhbGxiYWNrIChpZTggZXRjKVxuICBib3JkZXI6IDFweCBzb2xpZCBAbW9kYWwtY29udGVudC1ib3JkZXItY29sb3I7XG4gIGJvcmRlci1yYWRpdXM6IEBib3JkZXItcmFkaXVzLWxhcmdlO1xuICAuYm94LXNoYWRvdygwIDNweCA5cHggcmdiYSgwLDAsMCwuNSkpO1xuICBiYWNrZ3JvdW5kLWNsaXA6IHBhZGRpbmctYm94O1xuICAvLyBSZW1vdmUgZm9jdXMgb3V0bGluZSBmcm9tIG9wZW5lZCBtb2RhbFxuICBvdXRsaW5lOiAwO1xufVxuXG4vLyBNb2RhbCBiYWNrZ3JvdW5kXG4ubW9kYWwtYmFja2Ryb3Age1xuICBwb3NpdGlvbjogZml4ZWQ7XG4gIHRvcDogMDtcbiAgcmlnaHQ6IDA7XG4gIGJvdHRvbTogMDtcbiAgbGVmdDogMDtcbiAgYmFja2dyb3VuZC1jb2xvcjogQG1vZGFsLWJhY2tkcm9wLWJnO1xuICAvLyBGYWRlIGZvciBiYWNrZHJvcFxuICAmLmZhZGUgeyAub3BhY2l0eSgwKTsgfVxuICAmLmluIHsgLm9wYWNpdHkoQG1vZGFsLWJhY2tkcm9wLW9wYWNpdHkpOyB9XG59XG5cbi8vIE1vZGFsIGhlYWRlclxuLy8gVG9wIHNlY3Rpb24gb2YgdGhlIG1vZGFsIHcvIHRpdGxlIGFuZCBkaXNtaXNzXG4ubW9kYWwtaGVhZGVyIHtcbiAgcGFkZGluZzogQG1vZGFsLXRpdGxlLXBhZGRpbmc7XG4gIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCBAbW9kYWwtaGVhZGVyLWJvcmRlci1jb2xvcjtcbiAgbWluLWhlaWdodDogKEBtb2RhbC10aXRsZS1wYWRkaW5nICsgQG1vZGFsLXRpdGxlLWxpbmUtaGVpZ2h0KTtcbn1cbi8vIENsb3NlIGljb25cbi5tb2RhbC1oZWFkZXIgLmNsb3NlIHtcbiAgbWFyZ2luLXRvcDogLTJweDtcbn1cblxuLy8gVGl0bGUgdGV4dCB3aXRoaW4gaGVhZGVyXG4ubW9kYWwtdGl0bGUge1xuICBtYXJnaW46IDA7XG4gIGxpbmUtaGVpZ2h0OiBAbW9kYWwtdGl0bGUtbGluZS1oZWlnaHQ7XG59XG5cbi8vIE1vZGFsIGJvZHlcbi8vIFdoZXJlIGFsbCBtb2RhbCBjb250ZW50IHJlc2lkZXMgKHNpYmxpbmcgb2YgLm1vZGFsLWhlYWRlciBhbmQgLm1vZGFsLWZvb3Rlcilcbi5tb2RhbC1ib2R5IHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICBwYWRkaW5nOiBAbW9kYWwtaW5uZXItcGFkZGluZztcbn1cblxuLy8gRm9vdGVyIChmb3IgYWN0aW9ucylcbi5tb2RhbC1mb290ZXIge1xuICBwYWRkaW5nOiBAbW9kYWwtaW5uZXItcGFkZGluZztcbiAgdGV4dC1hbGlnbjogcmlnaHQ7IC8vIHJpZ2h0IGFsaWduIGJ1dHRvbnNcbiAgYm9yZGVyLXRvcDogMXB4IHNvbGlkIEBtb2RhbC1mb290ZXItYm9yZGVyLWNvbG9yO1xuICAmOmV4dGVuZCguY2xlYXJmaXggYWxsKTsgLy8gY2xlYXIgaXQgaW4gY2FzZSBmb2xrcyB1c2UgLnB1bGwtKiBjbGFzc2VzIG9uIGJ1dHRvbnNcblxuICAvLyBQcm9wZXJseSBzcGFjZSBvdXQgYnV0dG9uc1xuICAuYnRuICsgLmJ0biB7XG4gICAgbWFyZ2luLWxlZnQ6IDVweDtcbiAgICBtYXJnaW4tYm90dG9tOiAwOyAvLyBhY2NvdW50IGZvciBpbnB1dFt0eXBlPVwic3VibWl0XCJdIHdoaWNoIGdldHMgdGhlIGJvdHRvbSBtYXJnaW4gbGlrZSBhbGwgb3RoZXIgaW5wdXRzXG4gIH1cbiAgLy8gYnV0IG92ZXJyaWRlIHRoYXQgZm9yIGJ1dHRvbiBncm91cHNcbiAgLmJ0bi1ncm91cCAuYnRuICsgLmJ0biB7XG4gICAgbWFyZ2luLWxlZnQ6IC0xcHg7XG4gIH1cbiAgLy8gYW5kIG92ZXJyaWRlIGl0IGZvciBibG9jayBidXR0b25zIGFzIHdlbGxcbiAgLmJ0bi1ibG9jayArIC5idG4tYmxvY2sge1xuICAgIG1hcmdpbi1sZWZ0OiAwO1xuICB9XG59XG5cbi8vIE1lYXN1cmUgc2Nyb2xsYmFyIHdpZHRoIGZvciBwYWRkaW5nIGJvZHkgZHVyaW5nIG1vZGFsIHNob3cvaGlkZVxuLm1vZGFsLXNjcm9sbGJhci1tZWFzdXJlIHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB0b3A6IC05OTk5cHg7XG4gIHdpZHRoOiA1MHB4O1xuICBoZWlnaHQ6IDUwcHg7XG4gIG92ZXJmbG93OiBzY3JvbGw7XG59XG5cbi8vIFNjYWxlIHVwIHRoZSBtb2RhbFxuQG1lZGlhIChtaW4td2lkdGg6IEBzY3JlZW4tc20tbWluKSB7XG4gIC8vIEF1dG9tYXRpY2FsbHkgc2V0IG1vZGFsJ3Mgd2lkdGggZm9yIGxhcmdlciB2aWV3cG9ydHNcbiAgLm1vZGFsLWRpYWxvZyB7XG4gICAgd2lkdGg6IEBtb2RhbC1tZDtcbiAgICBtYXJnaW46IDMwcHggYXV0bztcbiAgfVxuICAubW9kYWwtY29udGVudCB7XG4gICAgLmJveC1zaGFkb3coMCA1cHggMTVweCByZ2JhKDAsMCwwLC41KSk7XG4gIH1cblxuICAvLyBNb2RhbCBzaXplc1xuICAubW9kYWwtc20geyB3aWR0aDogQG1vZGFsLXNtOyB9XG59XG5cbkBtZWRpYSAobWluLXdpZHRoOiBAc2NyZWVuLW1kLW1pbikge1xuICAubW9kYWwtbGcgeyB3aWR0aDogQG1vZGFsLWxnOyB9XG59XG4iLCIvL1xuLy8gVG9vbHRpcHNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cblxuLy8gQmFzZSBjbGFzc1xuLnRvb2x0aXAge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHotaW5kZXg6IEB6aW5kZXgtdG9vbHRpcDtcbiAgZGlzcGxheTogYmxvY2s7XG4gIHZpc2liaWxpdHk6IHZpc2libGU7XG4gIGZvbnQtc2l6ZTogQGZvbnQtc2l6ZS1zbWFsbDtcbiAgbGluZS1oZWlnaHQ6IDEuNDtcbiAgLm9wYWNpdHkoMCk7XG5cbiAgJi5pbiAgICAgeyAub3BhY2l0eShAdG9vbHRpcC1vcGFjaXR5KTsgfVxuICAmLnRvcCAgICB7IG1hcmdpbi10b3A6ICAtM3B4OyBwYWRkaW5nOiBAdG9vbHRpcC1hcnJvdy13aWR0aCAwOyB9XG4gICYucmlnaHQgIHsgbWFyZ2luLWxlZnQ6ICAzcHg7IHBhZGRpbmc6IDAgQHRvb2x0aXAtYXJyb3ctd2lkdGg7IH1cbiAgJi5ib3R0b20geyBtYXJnaW4tdG9wOiAgIDNweDsgcGFkZGluZzogQHRvb2x0aXAtYXJyb3ctd2lkdGggMDsgfVxuICAmLmxlZnQgICB7IG1hcmdpbi1sZWZ0OiAtM3B4OyBwYWRkaW5nOiAwIEB0b29sdGlwLWFycm93LXdpZHRoOyB9XG59XG5cbi8vIFdyYXBwZXIgZm9yIHRoZSB0b29sdGlwIGNvbnRlbnRcbi50b29sdGlwLWlubmVyIHtcbiAgbWF4LXdpZHRoOiBAdG9vbHRpcC1tYXgtd2lkdGg7XG4gIHBhZGRpbmc6IDNweCA4cHg7XG4gIGNvbG9yOiBAdG9vbHRpcC1jb2xvcjtcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xuICB0ZXh0LWRlY29yYXRpb246IG5vbmU7XG4gIGJhY2tncm91bmQtY29sb3I6IEB0b29sdGlwLWJnO1xuICBib3JkZXItcmFkaXVzOiBAYm9yZGVyLXJhZGl1cy1iYXNlO1xufVxuXG4vLyBBcnJvd3Ncbi50b29sdGlwLWFycm93IHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB3aWR0aDogMDtcbiAgaGVpZ2h0OiAwO1xuICBib3JkZXItY29sb3I6IHRyYW5zcGFyZW50O1xuICBib3JkZXItc3R5bGU6IHNvbGlkO1xufVxuLnRvb2x0aXAge1xuICAmLnRvcCAudG9vbHRpcC1hcnJvdyB7XG4gICAgYm90dG9tOiAwO1xuICAgIGxlZnQ6IDUwJTtcbiAgICBtYXJnaW4tbGVmdDogLUB0b29sdGlwLWFycm93LXdpZHRoO1xuICAgIGJvcmRlci13aWR0aDogQHRvb2x0aXAtYXJyb3ctd2lkdGggQHRvb2x0aXAtYXJyb3ctd2lkdGggMDtcbiAgICBib3JkZXItdG9wLWNvbG9yOiBAdG9vbHRpcC1hcnJvdy1jb2xvcjtcbiAgfVxuICAmLnRvcC1sZWZ0IC50b29sdGlwLWFycm93IHtcbiAgICBib3R0b206IDA7XG4gICAgbGVmdDogQHRvb2x0aXAtYXJyb3ctd2lkdGg7XG4gICAgYm9yZGVyLXdpZHRoOiBAdG9vbHRpcC1hcnJvdy13aWR0aCBAdG9vbHRpcC1hcnJvdy13aWR0aCAwO1xuICAgIGJvcmRlci10b3AtY29sb3I6IEB0b29sdGlwLWFycm93LWNvbG9yO1xuICB9XG4gICYudG9wLXJpZ2h0IC50b29sdGlwLWFycm93IHtcbiAgICBib3R0b206IDA7XG4gICAgcmlnaHQ6IEB0b29sdGlwLWFycm93LXdpZHRoO1xuICAgIGJvcmRlci13aWR0aDogQHRvb2x0aXAtYXJyb3ctd2lkdGggQHRvb2x0aXAtYXJyb3ctd2lkdGggMDtcbiAgICBib3JkZXItdG9wLWNvbG9yOiBAdG9vbHRpcC1hcnJvdy1jb2xvcjtcbiAgfVxuICAmLnJpZ2h0IC50b29sdGlwLWFycm93IHtcbiAgICB0b3A6IDUwJTtcbiAgICBsZWZ0OiAwO1xuICAgIG1hcmdpbi10b3A6IC1AdG9vbHRpcC1hcnJvdy13aWR0aDtcbiAgICBib3JkZXItd2lkdGg6IEB0b29sdGlwLWFycm93LXdpZHRoIEB0b29sdGlwLWFycm93LXdpZHRoIEB0b29sdGlwLWFycm93LXdpZHRoIDA7XG4gICAgYm9yZGVyLXJpZ2h0LWNvbG9yOiBAdG9vbHRpcC1hcnJvdy1jb2xvcjtcbiAgfVxuICAmLmxlZnQgLnRvb2x0aXAtYXJyb3cge1xuICAgIHRvcDogNTAlO1xuICAgIHJpZ2h0OiAwO1xuICAgIG1hcmdpbi10b3A6IC1AdG9vbHRpcC1hcnJvdy13aWR0aDtcbiAgICBib3JkZXItd2lkdGg6IEB0b29sdGlwLWFycm93LXdpZHRoIDAgQHRvb2x0aXAtYXJyb3ctd2lkdGggQHRvb2x0aXAtYXJyb3ctd2lkdGg7XG4gICAgYm9yZGVyLWxlZnQtY29sb3I6IEB0b29sdGlwLWFycm93LWNvbG9yO1xuICB9XG4gICYuYm90dG9tIC50b29sdGlwLWFycm93IHtcbiAgICB0b3A6IDA7XG4gICAgbGVmdDogNTAlO1xuICAgIG1hcmdpbi1sZWZ0OiAtQHRvb2x0aXAtYXJyb3ctd2lkdGg7XG4gICAgYm9yZGVyLXdpZHRoOiAwIEB0b29sdGlwLWFycm93LXdpZHRoIEB0b29sdGlwLWFycm93LXdpZHRoO1xuICAgIGJvcmRlci1ib3R0b20tY29sb3I6IEB0b29sdGlwLWFycm93LWNvbG9yO1xuICB9XG4gICYuYm90dG9tLWxlZnQgLnRvb2x0aXAtYXJyb3cge1xuICAgIHRvcDogMDtcbiAgICBsZWZ0OiBAdG9vbHRpcC1hcnJvdy13aWR0aDtcbiAgICBib3JkZXItd2lkdGg6IDAgQHRvb2x0aXAtYXJyb3ctd2lkdGggQHRvb2x0aXAtYXJyb3ctd2lkdGg7XG4gICAgYm9yZGVyLWJvdHRvbS1jb2xvcjogQHRvb2x0aXAtYXJyb3ctY29sb3I7XG4gIH1cbiAgJi5ib3R0b20tcmlnaHQgLnRvb2x0aXAtYXJyb3cge1xuICAgIHRvcDogMDtcbiAgICByaWdodDogQHRvb2x0aXAtYXJyb3ctd2lkdGg7XG4gICAgYm9yZGVyLXdpZHRoOiAwIEB0b29sdGlwLWFycm93LXdpZHRoIEB0b29sdGlwLWFycm93LXdpZHRoO1xuICAgIGJvcmRlci1ib3R0b20tY29sb3I6IEB0b29sdGlwLWFycm93LWNvbG9yO1xuICB9XG59XG4iLCIvL1xuLy8gUG9wb3ZlcnNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cblxuLnBvcG92ZXIge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHRvcDogMDtcbiAgbGVmdDogMDtcbiAgei1pbmRleDogQHppbmRleC1wb3BvdmVyO1xuICBkaXNwbGF5OiBub25lO1xuICBtYXgtd2lkdGg6IEBwb3BvdmVyLW1heC13aWR0aDtcbiAgcGFkZGluZzogMXB4O1xuICAvLyBSZXNldCBmb250IGFuZCB0ZXh0IHByb3BlcnRlcyBnaXZlbiBuZXcgaW5zZXJ0aW9uIG1ldGhvZFxuICBmb250LXNpemU6IEBmb250LXNpemUtYmFzZTtcbiAgZm9udC13ZWlnaHQ6IG5vcm1hbDtcbiAgbGluZS1oZWlnaHQ6IEBsaW5lLWhlaWdodC1iYXNlO1xuICB0ZXh0LWFsaWduOiBsZWZ0O1xuICBiYWNrZ3JvdW5kLWNvbG9yOiBAcG9wb3Zlci1iZztcbiAgYmFja2dyb3VuZC1jbGlwOiBwYWRkaW5nLWJveDtcbiAgYm9yZGVyOiAxcHggc29saWQgQHBvcG92ZXItZmFsbGJhY2stYm9yZGVyLWNvbG9yO1xuICBib3JkZXI6IDFweCBzb2xpZCBAcG9wb3Zlci1ib3JkZXItY29sb3I7XG4gIGJvcmRlci1yYWRpdXM6IEBib3JkZXItcmFkaXVzLWxhcmdlO1xuICAuYm94LXNoYWRvdygwIDVweCAxMHB4IHJnYmEoMCwwLDAsLjIpKTtcblxuICAvLyBPdmVycmlkZXMgZm9yIHByb3BlciBpbnNlcnRpb25cbiAgd2hpdGUtc3BhY2U6IG5vcm1hbDtcblxuICAvLyBPZmZzZXQgdGhlIHBvcG92ZXIgdG8gYWNjb3VudCBmb3IgdGhlIHBvcG92ZXIgYXJyb3dcbiAgJi50b3AgICAgIHsgbWFyZ2luLXRvcDogLUBwb3BvdmVyLWFycm93LXdpZHRoOyB9XG4gICYucmlnaHQgICB7IG1hcmdpbi1sZWZ0OiBAcG9wb3Zlci1hcnJvdy13aWR0aDsgfVxuICAmLmJvdHRvbSAgeyBtYXJnaW4tdG9wOiBAcG9wb3Zlci1hcnJvdy13aWR0aDsgfVxuICAmLmxlZnQgICAgeyBtYXJnaW4tbGVmdDogLUBwb3BvdmVyLWFycm93LXdpZHRoOyB9XG59XG5cbi5wb3BvdmVyLXRpdGxlIHtcbiAgbWFyZ2luOiAwOyAvLyByZXNldCBoZWFkaW5nIG1hcmdpblxuICBwYWRkaW5nOiA4cHggMTRweDtcbiAgZm9udC1zaXplOiBAZm9udC1zaXplLWJhc2U7XG4gIGJhY2tncm91bmQtY29sb3I6IEBwb3BvdmVyLXRpdGxlLWJnO1xuICBib3JkZXItYm90dG9tOiAxcHggc29saWQgZGFya2VuKEBwb3BvdmVyLXRpdGxlLWJnLCA1JSk7XG4gIGJvcmRlci1yYWRpdXM6IChAYm9yZGVyLXJhZGl1cy1sYXJnZSAtIDEpIChAYm9yZGVyLXJhZGl1cy1sYXJnZSAtIDEpIDAgMDtcbn1cblxuLnBvcG92ZXItY29udGVudCB7XG4gIHBhZGRpbmc6IDlweCAxNHB4O1xufVxuXG4vLyBBcnJvd3Ncbi8vXG4vLyAuYXJyb3cgaXMgb3V0ZXIsIC5hcnJvdzphZnRlciBpcyBpbm5lclxuXG4ucG9wb3ZlciA+IC5hcnJvdyB7XG4gICYsXG4gICY6YWZ0ZXIge1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICBkaXNwbGF5OiBibG9jaztcbiAgICB3aWR0aDogMDtcbiAgICBoZWlnaHQ6IDA7XG4gICAgYm9yZGVyLWNvbG9yOiB0cmFuc3BhcmVudDtcbiAgICBib3JkZXItc3R5bGU6IHNvbGlkO1xuICB9XG59XG4ucG9wb3ZlciA+IC5hcnJvdyB7XG4gIGJvcmRlci13aWR0aDogQHBvcG92ZXItYXJyb3ctb3V0ZXItd2lkdGg7XG59XG4ucG9wb3ZlciA+IC5hcnJvdzphZnRlciB7XG4gIGJvcmRlci13aWR0aDogQHBvcG92ZXItYXJyb3ctd2lkdGg7XG4gIGNvbnRlbnQ6IFwiXCI7XG59XG5cbi5wb3BvdmVyIHtcbiAgJi50b3AgPiAuYXJyb3cge1xuICAgIGxlZnQ6IDUwJTtcbiAgICBtYXJnaW4tbGVmdDogLUBwb3BvdmVyLWFycm93LW91dGVyLXdpZHRoO1xuICAgIGJvcmRlci1ib3R0b20td2lkdGg6IDA7XG4gICAgYm9yZGVyLXRvcC1jb2xvcjogQHBvcG92ZXItYXJyb3ctb3V0ZXItZmFsbGJhY2stY29sb3I7IC8vIElFOCBmYWxsYmFja1xuICAgIGJvcmRlci10b3AtY29sb3I6IEBwb3BvdmVyLWFycm93LW91dGVyLWNvbG9yO1xuICAgIGJvdHRvbTogLUBwb3BvdmVyLWFycm93LW91dGVyLXdpZHRoO1xuICAgICY6YWZ0ZXIge1xuICAgICAgY29udGVudDogXCIgXCI7XG4gICAgICBib3R0b206IDFweDtcbiAgICAgIG1hcmdpbi1sZWZ0OiAtQHBvcG92ZXItYXJyb3ctd2lkdGg7XG4gICAgICBib3JkZXItYm90dG9tLXdpZHRoOiAwO1xuICAgICAgYm9yZGVyLXRvcC1jb2xvcjogQHBvcG92ZXItYXJyb3ctY29sb3I7XG4gICAgfVxuICB9XG4gICYucmlnaHQgPiAuYXJyb3cge1xuICAgIHRvcDogNTAlO1xuICAgIGxlZnQ6IC1AcG9wb3Zlci1hcnJvdy1vdXRlci13aWR0aDtcbiAgICBtYXJnaW4tdG9wOiAtQHBvcG92ZXItYXJyb3ctb3V0ZXItd2lkdGg7XG4gICAgYm9yZGVyLWxlZnQtd2lkdGg6IDA7XG4gICAgYm9yZGVyLXJpZ2h0LWNvbG9yOiBAcG9wb3Zlci1hcnJvdy1vdXRlci1mYWxsYmFjay1jb2xvcjsgLy8gSUU4IGZhbGxiYWNrXG4gICAgYm9yZGVyLXJpZ2h0LWNvbG9yOiBAcG9wb3Zlci1hcnJvdy1vdXRlci1jb2xvcjtcbiAgICAmOmFmdGVyIHtcbiAgICAgIGNvbnRlbnQ6IFwiIFwiO1xuICAgICAgbGVmdDogMXB4O1xuICAgICAgYm90dG9tOiAtQHBvcG92ZXItYXJyb3ctd2lkdGg7XG4gICAgICBib3JkZXItbGVmdC13aWR0aDogMDtcbiAgICAgIGJvcmRlci1yaWdodC1jb2xvcjogQHBvcG92ZXItYXJyb3ctY29sb3I7XG4gICAgfVxuICB9XG4gICYuYm90dG9tID4gLmFycm93IHtcbiAgICBsZWZ0OiA1MCU7XG4gICAgbWFyZ2luLWxlZnQ6IC1AcG9wb3Zlci1hcnJvdy1vdXRlci13aWR0aDtcbiAgICBib3JkZXItdG9wLXdpZHRoOiAwO1xuICAgIGJvcmRlci1ib3R0b20tY29sb3I6IEBwb3BvdmVyLWFycm93LW91dGVyLWZhbGxiYWNrLWNvbG9yOyAvLyBJRTggZmFsbGJhY2tcbiAgICBib3JkZXItYm90dG9tLWNvbG9yOiBAcG9wb3Zlci1hcnJvdy1vdXRlci1jb2xvcjtcbiAgICB0b3A6IC1AcG9wb3Zlci1hcnJvdy1vdXRlci13aWR0aDtcbiAgICAmOmFmdGVyIHtcbiAgICAgIGNvbnRlbnQ6IFwiIFwiO1xuICAgICAgdG9wOiAxcHg7XG4gICAgICBtYXJnaW4tbGVmdDogLUBwb3BvdmVyLWFycm93LXdpZHRoO1xuICAgICAgYm9yZGVyLXRvcC13aWR0aDogMDtcbiAgICAgIGJvcmRlci1ib3R0b20tY29sb3I6IEBwb3BvdmVyLWFycm93LWNvbG9yO1xuICAgIH1cbiAgfVxuXG4gICYubGVmdCA+IC5hcnJvdyB7XG4gICAgdG9wOiA1MCU7XG4gICAgcmlnaHQ6IC1AcG9wb3Zlci1hcnJvdy1vdXRlci13aWR0aDtcbiAgICBtYXJnaW4tdG9wOiAtQHBvcG92ZXItYXJyb3ctb3V0ZXItd2lkdGg7XG4gICAgYm9yZGVyLXJpZ2h0LXdpZHRoOiAwO1xuICAgIGJvcmRlci1sZWZ0LWNvbG9yOiBAcG9wb3Zlci1hcnJvdy1vdXRlci1mYWxsYmFjay1jb2xvcjsgLy8gSUU4IGZhbGxiYWNrXG4gICAgYm9yZGVyLWxlZnQtY29sb3I6IEBwb3BvdmVyLWFycm93LW91dGVyLWNvbG9yO1xuICAgICY6YWZ0ZXIge1xuICAgICAgY29udGVudDogXCIgXCI7XG4gICAgICByaWdodDogMXB4O1xuICAgICAgYm9yZGVyLXJpZ2h0LXdpZHRoOiAwO1xuICAgICAgYm9yZGVyLWxlZnQtY29sb3I6IEBwb3BvdmVyLWFycm93LWNvbG9yO1xuICAgICAgYm90dG9tOiAtQHBvcG92ZXItYXJyb3ctd2lkdGg7XG4gICAgfVxuICB9XG59XG4iLCIvLyBDbGVhcmZpeFxuLy9cbi8vIEZvciBtb2Rlcm4gYnJvd3NlcnNcbi8vIDEuIFRoZSBzcGFjZSBjb250ZW50IGlzIG9uZSB3YXkgdG8gYXZvaWQgYW4gT3BlcmEgYnVnIHdoZW4gdGhlXG4vLyAgICBjb250ZW50ZWRpdGFibGUgYXR0cmlidXRlIGlzIGluY2x1ZGVkIGFueXdoZXJlIGVsc2UgaW4gdGhlIGRvY3VtZW50LlxuLy8gICAgT3RoZXJ3aXNlIGl0IGNhdXNlcyBzcGFjZSB0byBhcHBlYXIgYXQgdGhlIHRvcCBhbmQgYm90dG9tIG9mIGVsZW1lbnRzXG4vLyAgICB0aGF0IGFyZSBjbGVhcmZpeGVkLlxuLy8gMi4gVGhlIHVzZSBvZiBgdGFibGVgIHJhdGhlciB0aGFuIGBibG9ja2AgaXMgb25seSBuZWNlc3NhcnkgaWYgdXNpbmdcbi8vICAgIGA6YmVmb3JlYCB0byBjb250YWluIHRoZSB0b3AtbWFyZ2lucyBvZiBjaGlsZCBlbGVtZW50cy5cbi8vXG4vLyBTb3VyY2U6IGh0dHA6Ly9uaWNvbGFzZ2FsbGFnaGVyLmNvbS9taWNyby1jbGVhcmZpeC1oYWNrL1xuXG4uY2xlYXJmaXgoKSB7XG4gICY6YmVmb3JlLFxuICAmOmFmdGVyIHtcbiAgICBjb250ZW50OiBcIiBcIjsgLy8gMVxuICAgIGRpc3BsYXk6IHRhYmxlOyAvLyAyXG4gIH1cbiAgJjphZnRlciB7XG4gICAgY2xlYXI6IGJvdGg7XG4gIH1cbn1cbiIsIi8vIENlbnRlci1hbGlnbiBhIGJsb2NrIGxldmVsIGVsZW1lbnRcblxuLmNlbnRlci1ibG9jaygpIHtcbiAgZGlzcGxheTogYmxvY2s7XG4gIG1hcmdpbi1sZWZ0OiBhdXRvO1xuICBtYXJnaW4tcmlnaHQ6IGF1dG87XG59XG4iLCIvLyBDU1MgaW1hZ2UgcmVwbGFjZW1lbnRcbi8vXG4vLyBIZWFkcyB1cCEgdjMgbGF1bmNoZWQgd2l0aCB3aXRoIG9ubHkgYC5oaWRlLXRleHQoKWAsIGJ1dCBwZXIgb3VyIHBhdHRlcm4gZm9yXG4vLyBtaXhpbnMgYmVpbmcgcmV1c2VkIGFzIGNsYXNzZXMgd2l0aCB0aGUgc2FtZSBuYW1lLCB0aGlzIGRvZXNuJ3QgaG9sZCB1cC4gQXNcbi8vIG9mIHYzLjAuMSB3ZSBoYXZlIGFkZGVkIGAudGV4dC1oaWRlKClgIGFuZCBkZXByZWNhdGVkIGAuaGlkZS10ZXh0KClgLlxuLy9cbi8vIFNvdXJjZTogaHR0cHM6Ly9naXRodWIuY29tL2g1YnAvaHRtbDUtYm9pbGVycGxhdGUvY29tbWl0L2FhMDM5NmVhZTc1N1xuXG4vLyBEZXByZWNhdGVkIGFzIG9mIHYzLjAuMSAod2lsbCBiZSByZW1vdmVkIGluIHY0KVxuLmhpZGUtdGV4dCgpIHtcbiAgZm9udDogflwiMC8wXCIgYTtcbiAgY29sb3I6IHRyYW5zcGFyZW50O1xuICB0ZXh0LXNoYWRvdzogbm9uZTtcbiAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7XG4gIGJvcmRlcjogMDtcbn1cblxuLy8gTmV3IG1peGluIHRvIHVzZSBhcyBvZiB2My4wLjFcbi50ZXh0LWhpZGUoKSB7XG4gIC5oaWRlLXRleHQoKTtcbn1cbiIsIi8vXG4vLyBSZXNwb25zaXZlOiBVdGlsaXR5IGNsYXNzZXNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cblxuLy8gSUUxMCBpbiBXaW5kb3dzIChQaG9uZSkgOFxuLy9cbi8vIFN1cHBvcnQgZm9yIHJlc3BvbnNpdmUgdmlld3MgdmlhIG1lZGlhIHF1ZXJpZXMgaXMga2luZCBvZiBib3JrZWQgaW4gSUUxMCwgZm9yXG4vLyBTdXJmYWNlL2Rlc2t0b3AgaW4gc3BsaXQgdmlldyBhbmQgZm9yIFdpbmRvd3MgUGhvbmUgOC4gVGhpcyBwYXJ0aWN1bGFyIGZpeFxuLy8gbXVzdCBiZSBhY2NvbXBhbmllZCBieSBhIHNuaXBwZXQgb2YgSmF2YVNjcmlwdCB0byBzbmlmZiB0aGUgdXNlciBhZ2VudCBhbmRcbi8vIGFwcGx5IHNvbWUgY29uZGl0aW9uYWwgQ1NTIHRvICpvbmx5KiB0aGUgU3VyZmFjZS9kZXNrdG9wIFdpbmRvd3MgOC4gTG9vayBhdFxuLy8gb3VyIEdldHRpbmcgU3RhcnRlZCBwYWdlIGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoaXMgYnVnLlxuLy9cbi8vIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgdGhlIGZvbGxvd2luZzpcbi8vXG4vLyBJc3N1ZTogaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2lzc3Vlcy8xMDQ5N1xuLy8gRG9jczogaHR0cDovL2dldGJvb3RzdHJhcC5jb20vZ2V0dGluZy1zdGFydGVkLyNzdXBwb3J0LWllMTAtd2lkdGhcbi8vIFNvdXJjZTogaHR0cDovL3RpbWthZGxlYy5jb20vMjAxMy8wMS93aW5kb3dzLXBob25lLTgtYW5kLWRldmljZS13aWR0aC9cbi8vIFNvdXJjZTogaHR0cDovL3RpbWthZGxlYy5jb20vMjAxMi8xMC9pZTEwLXNuYXAtbW9kZS1hbmQtcmVzcG9uc2l2ZS1kZXNpZ24vXG5cbkAtbXMtdmlld3BvcnQge1xuICB3aWR0aDogZGV2aWNlLXdpZHRoO1xufVxuXG5cbi8vIFZpc2liaWxpdHkgdXRpbGl0aWVzXG4vLyBOb3RlOiBEZXByZWNhdGVkIC52aXNpYmxlLXhzLCAudmlzaWJsZS1zbSwgLnZpc2libGUtbWQsIGFuZCAudmlzaWJsZS1sZyBhcyBvZiB2My4yLjBcbi52aXNpYmxlLXhzLFxuLnZpc2libGUtc20sXG4udmlzaWJsZS1tZCxcbi52aXNpYmxlLWxnIHtcbiAgLnJlc3BvbnNpdmUtaW52aXNpYmlsaXR5KCk7XG59XG5cbi52aXNpYmxlLXhzLWJsb2NrLFxuLnZpc2libGUteHMtaW5saW5lLFxuLnZpc2libGUteHMtaW5saW5lLWJsb2NrLFxuLnZpc2libGUtc20tYmxvY2ssXG4udmlzaWJsZS1zbS1pbmxpbmUsXG4udmlzaWJsZS1zbS1pbmxpbmUtYmxvY2ssXG4udmlzaWJsZS1tZC1ibG9jayxcbi52aXNpYmxlLW1kLWlubGluZSxcbi52aXNpYmxlLW1kLWlubGluZS1ibG9jayxcbi52aXNpYmxlLWxnLWJsb2NrLFxuLnZpc2libGUtbGctaW5saW5lLFxuLnZpc2libGUtbGctaW5saW5lLWJsb2NrIHtcbiAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50O1xufVxuXG4udmlzaWJsZS14cyB7XG4gIEBtZWRpYSAobWF4LXdpZHRoOiBAc2NyZWVuLXhzLW1heCkge1xuICAgIC5yZXNwb25zaXZlLXZpc2liaWxpdHkoKTtcbiAgfVxufVxuLnZpc2libGUteHMtYmxvY2sge1xuICBAbWVkaWEgKG1heC13aWR0aDogQHNjcmVlbi14cy1tYXgpIHtcbiAgICBkaXNwbGF5OiBibG9jayAhaW1wb3J0YW50O1xuICB9XG59XG4udmlzaWJsZS14cy1pbmxpbmUge1xuICBAbWVkaWEgKG1heC13aWR0aDogQHNjcmVlbi14cy1tYXgpIHtcbiAgICBkaXNwbGF5OiBpbmxpbmUgIWltcG9ydGFudDtcbiAgfVxufVxuLnZpc2libGUteHMtaW5saW5lLWJsb2NrIHtcbiAgQG1lZGlhIChtYXgtd2lkdGg6IEBzY3JlZW4teHMtbWF4KSB7XG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrICFpbXBvcnRhbnQ7XG4gIH1cbn1cblxuLnZpc2libGUtc20ge1xuICBAbWVkaWEgKG1pbi13aWR0aDogQHNjcmVlbi1zbS1taW4pIGFuZCAobWF4LXdpZHRoOiBAc2NyZWVuLXNtLW1heCkge1xuICAgIC5yZXNwb25zaXZlLXZpc2liaWxpdHkoKTtcbiAgfVxufVxuLnZpc2libGUtc20tYmxvY2sge1xuICBAbWVkaWEgKG1pbi13aWR0aDogQHNjcmVlbi1zbS1taW4pIGFuZCAobWF4LXdpZHRoOiBAc2NyZWVuLXNtLW1heCkge1xuICAgIGRpc3BsYXk6IGJsb2NrICFpbXBvcnRhbnQ7XG4gIH1cbn1cbi52aXNpYmxlLXNtLWlubGluZSB7XG4gIEBtZWRpYSAobWluLXdpZHRoOiBAc2NyZWVuLXNtLW1pbikgYW5kIChtYXgtd2lkdGg6IEBzY3JlZW4tc20tbWF4KSB7XG4gICAgZGlzcGxheTogaW5saW5lICFpbXBvcnRhbnQ7XG4gIH1cbn1cbi52aXNpYmxlLXNtLWlubGluZS1ibG9jayB7XG4gIEBtZWRpYSAobWluLXdpZHRoOiBAc2NyZWVuLXNtLW1pbikgYW5kIChtYXgtd2lkdGg6IEBzY3JlZW4tc20tbWF4KSB7XG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrICFpbXBvcnRhbnQ7XG4gIH1cbn1cblxuLnZpc2libGUtbWQge1xuICBAbWVkaWEgKG1pbi13aWR0aDogQHNjcmVlbi1tZC1taW4pIGFuZCAobWF4LXdpZHRoOiBAc2NyZWVuLW1kLW1heCkge1xuICAgIC5yZXNwb25zaXZlLXZpc2liaWxpdHkoKTtcbiAgfVxufVxuLnZpc2libGUtbWQtYmxvY2sge1xuICBAbWVkaWEgKG1pbi13aWR0aDogQHNjcmVlbi1tZC1taW4pIGFuZCAobWF4LXdpZHRoOiBAc2NyZWVuLW1kLW1heCkge1xuICAgIGRpc3BsYXk6IGJsb2NrICFpbXBvcnRhbnQ7XG4gIH1cbn1cbi52aXNpYmxlLW1kLWlubGluZSB7XG4gIEBtZWRpYSAobWluLXdpZHRoOiBAc2NyZWVuLW1kLW1pbikgYW5kIChtYXgtd2lkdGg6IEBzY3JlZW4tbWQtbWF4KSB7XG4gICAgZGlzcGxheTogaW5saW5lICFpbXBvcnRhbnQ7XG4gIH1cbn1cbi52aXNpYmxlLW1kLWlubGluZS1ibG9jayB7XG4gIEBtZWRpYSAobWluLXdpZHRoOiBAc2NyZWVuLW1kLW1pbikgYW5kIChtYXgtd2lkdGg6IEBzY3JlZW4tbWQtbWF4KSB7XG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrICFpbXBvcnRhbnQ7XG4gIH1cbn1cblxuLnZpc2libGUtbGcge1xuICBAbWVkaWEgKG1pbi13aWR0aDogQHNjcmVlbi1sZy1taW4pIHtcbiAgICAucmVzcG9uc2l2ZS12aXNpYmlsaXR5KCk7XG4gIH1cbn1cbi52aXNpYmxlLWxnLWJsb2NrIHtcbiAgQG1lZGlhIChtaW4td2lkdGg6IEBzY3JlZW4tbGctbWluKSB7XG4gICAgZGlzcGxheTogYmxvY2sgIWltcG9ydGFudDtcbiAgfVxufVxuLnZpc2libGUtbGctaW5saW5lIHtcbiAgQG1lZGlhIChtaW4td2lkdGg6IEBzY3JlZW4tbGctbWluKSB7XG4gICAgZGlzcGxheTogaW5saW5lICFpbXBvcnRhbnQ7XG4gIH1cbn1cbi52aXNpYmxlLWxnLWlubGluZS1ibG9jayB7XG4gIEBtZWRpYSAobWluLXdpZHRoOiBAc2NyZWVuLWxnLW1pbikge1xuICAgIGRpc3BsYXk6IGlubGluZS1ibG9jayAhaW1wb3J0YW50O1xuICB9XG59XG5cbi5oaWRkZW4teHMge1xuICBAbWVkaWEgKG1heC13aWR0aDogQHNjcmVlbi14cy1tYXgpIHtcbiAgICAucmVzcG9uc2l2ZS1pbnZpc2liaWxpdHkoKTtcbiAgfVxufVxuLmhpZGRlbi1zbSB7XG4gIEBtZWRpYSAobWluLXdpZHRoOiBAc2NyZWVuLXNtLW1pbikgYW5kIChtYXgtd2lkdGg6IEBzY3JlZW4tc20tbWF4KSB7XG4gICAgLnJlc3BvbnNpdmUtaW52aXNpYmlsaXR5KCk7XG4gIH1cbn1cbi5oaWRkZW4tbWQge1xuICBAbWVkaWEgKG1pbi13aWR0aDogQHNjcmVlbi1tZC1taW4pIGFuZCAobWF4LXdpZHRoOiBAc2NyZWVuLW1kLW1heCkge1xuICAgIC5yZXNwb25zaXZlLWludmlzaWJpbGl0eSgpO1xuICB9XG59XG4uaGlkZGVuLWxnIHtcbiAgQG1lZGlhIChtaW4td2lkdGg6IEBzY3JlZW4tbGctbWluKSB7XG4gICAgLnJlc3BvbnNpdmUtaW52aXNpYmlsaXR5KCk7XG4gIH1cbn1cblxuXG4vLyBQcmludCB1dGlsaXRpZXNcbi8vXG4vLyBNZWRpYSBxdWVyaWVzIGFyZSBwbGFjZWQgb24gdGhlIGluc2lkZSB0byBiZSBtaXhpbi1mcmllbmRseS5cblxuLy8gTm90ZTogRGVwcmVjYXRlZCAudmlzaWJsZS1wcmludCBhcyBvZiB2My4yLjBcbi52aXNpYmxlLXByaW50IHtcbiAgLnJlc3BvbnNpdmUtaW52aXNpYmlsaXR5KCk7XG5cbiAgQG1lZGlhIHByaW50IHtcbiAgICAucmVzcG9uc2l2ZS12aXNpYmlsaXR5KCk7XG4gIH1cbn1cbi52aXNpYmxlLXByaW50LWJsb2NrIHtcbiAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50O1xuXG4gIEBtZWRpYSBwcmludCB7XG4gICAgZGlzcGxheTogYmxvY2sgIWltcG9ydGFudDtcbiAgfVxufVxuLnZpc2libGUtcHJpbnQtaW5saW5lIHtcbiAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50O1xuXG4gIEBtZWRpYSBwcmludCB7XG4gICAgZGlzcGxheTogaW5saW5lICFpbXBvcnRhbnQ7XG4gIH1cbn1cbi52aXNpYmxlLXByaW50LWlubGluZS1ibG9jayB7XG4gIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDtcblxuICBAbWVkaWEgcHJpbnQge1xuICAgIGRpc3BsYXk6IGlubGluZS1ibG9jayAhaW1wb3J0YW50O1xuICB9XG59XG5cbi5oaWRkZW4tcHJpbnQge1xuICBAbWVkaWEgcHJpbnQge1xuICAgIC5yZXNwb25zaXZlLWludmlzaWJpbGl0eSgpO1xuICB9XG59XG4iLCIvLyBSZXNwb25zaXZlIHV0aWxpdGllc1xuXG4vL1xuLy8gTW9yZSBlYXNpbHkgaW5jbHVkZSBhbGwgdGhlIHN0YXRlcyBmb3IgcmVzcG9uc2l2ZS11dGlsaXRpZXMubGVzcy5cbi5yZXNwb25zaXZlLXZpc2liaWxpdHkoKSB7XG4gIGRpc3BsYXk6IGJsb2NrICFpbXBvcnRhbnQ7XG4gIHRhYmxlJiAgeyBkaXNwbGF5OiB0YWJsZTsgfVxuICB0ciYgICAgIHsgZGlzcGxheTogdGFibGUtcm93ICFpbXBvcnRhbnQ7IH1cbiAgdGgmLFxuICB0ZCYgICAgIHsgZGlzcGxheTogdGFibGUtY2VsbCAhaW1wb3J0YW50OyB9XG59XG5cbi5yZXNwb25zaXZlLWludmlzaWJpbGl0eSgpIHtcbiAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50O1xufVxuIiwiLypcbiAqIFNvY2lhbCBCdXR0b25zIGZvciBCb290c3RyYXBcbiAqXG4gKiBDb3B5cmlnaHQgMjAxMy0yMDE0IFBhbmF5aW90aXMgTGlwaXJpZGlzXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2VcbiAqXG4gKiBodHRwczovL2dpdGh1Yi5jb20vbGlwaXMvYm9vdHN0cmFwLXNvY2lhbFxuICovXG5cbkBicy1oZWlnaHQtYmFzZTogKEBsaW5lLWhlaWdodC1jb21wdXRlZCArIEBwYWRkaW5nLWJhc2UtdmVydGljYWwgKiAyKTtcbkBicy1oZWlnaHQtbGc6ICAgKGZsb29yKEBmb250LXNpemUtbGFyZ2UgKiBAbGluZS1oZWlnaHQtYmFzZSkgKyBAcGFkZGluZy1sYXJnZS12ZXJ0aWNhbCAqIDIpO1xuQGJzLWhlaWdodC1zbTogICAoZmxvb3IoQGZvbnQtc2l6ZS1zbWFsbCAqIDEuNSkgKyBAcGFkZGluZy1zbWFsbC12ZXJ0aWNhbCAqIDIpO1xuQGJzLWhlaWdodC14czogICAoZmxvb3IoQGZvbnQtc2l6ZS1zbWFsbCAqIDEuMikgKyBAcGFkZGluZy1zbWFsbC12ZXJ0aWNhbCArIDEpO1xuXG4uYnRuLXNvY2lhbCB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgcGFkZGluZy1sZWZ0OiAoQGJzLWhlaWdodC1iYXNlICsgQHBhZGRpbmctYmFzZS1ob3Jpem9udGFsKTtcbiAgdGV4dC1hbGlnbjogbGVmdDtcbiAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7XG4gID4gOmZpcnN0LWNoaWxkIHtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgbGVmdDogMDtcbiAgICB0b3A6IDA7XG4gICAgYm90dG9tOiAwO1xuICAgIHdpZHRoOiBAYnMtaGVpZ2h0LWJhc2U7XG4gICAgbGluZS1oZWlnaHQ6IChAYnMtaGVpZ2h0LWJhc2UgKyAyKTtcbiAgICBmb250LXNpemU6IDEuNmVtO1xuICAgIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgICBib3JkZXItcmlnaHQ6IDFweCBzb2xpZCByZ2JhKDAsIDAsIDAsIDAuMik7XG4gIH1cbiAgJi5idG4tbGcge1xuICAgIHBhZGRpbmctbGVmdDogKEBicy1oZWlnaHQtbGcgKyBAcGFkZGluZy1sYXJnZS1ob3Jpem9udGFsKTtcbiAgICA6Zmlyc3QtY2hpbGQge1xuICAgICAgbGluZS1oZWlnaHQ6IEBicy1oZWlnaHQtbGc7XG4gICAgICB3aWR0aDogQGJzLWhlaWdodC1sZztcbiAgICAgIGZvbnQtc2l6ZTogMS44ZW07XG4gICAgfVxuICB9XG4gICYuYnRuLXNtIHtcbiAgICBwYWRkaW5nLWxlZnQ6IChAYnMtaGVpZ2h0LXNtICsgQHBhZGRpbmctc21hbGwtaG9yaXpvbnRhbCk7XG4gICAgOmZpcnN0LWNoaWxkIHtcbiAgICAgIGxpbmUtaGVpZ2h0OiBAYnMtaGVpZ2h0LXNtO1xuICAgICAgd2lkdGg6IEBicy1oZWlnaHQtc207XG4gICAgICBmb250LXNpemU6IDEuNGVtO1xuICAgIH1cbiAgfVxuICAmLmJ0bi14cyB7XG4gICAgcGFkZGluZy1sZWZ0OiAoQGJzLWhlaWdodC14cyArIEBwYWRkaW5nLXNtYWxsLWhvcml6b250YWwpO1xuICAgIDpmaXJzdC1jaGlsZCB7XG4gICAgICBsaW5lLWhlaWdodDogQGJzLWhlaWdodC14cztcbiAgICAgIHdpZHRoOiBAYnMtaGVpZ2h0LXhzO1xuICAgICAgZm9udC1zaXplOiAxLjJlbTtcbiAgICB9XG4gIH1cbn1cblxuLmJ0bi1zb2NpYWwtaWNvbiB7XG4gIC5idG4tc29jaWFsO1xuICBoZWlnaHQ6IChAYnMtaGVpZ2h0LWJhc2UgKyAyKTtcbiAgd2lkdGg6IChAYnMtaGVpZ2h0LWJhc2UgKyAyKTtcbiAgcGFkZGluZzogMDtcbiAgOmZpcnN0LWNoaWxkIHtcbiAgICBib3JkZXI6IG5vbmU7XG4gICAgdGV4dC1hbGlnbjogY2VudGVyO1xuICAgIHdpZHRoOiAxMDAlIWltcG9ydGFudDtcbiAgfVxuICAmLmJ0bi1sZyB7XG4gICAgaGVpZ2h0OiBAYnMtaGVpZ2h0LWxnO1xuICAgIHdpZHRoOiBAYnMtaGVpZ2h0LWxnO1xuICAgIHBhZGRpbmctbGVmdDogMDtcbiAgICBwYWRkaW5nLXJpZ2h0OiAwO1xuICB9XG4gICYuYnRuLXNtIHtcbiAgICBoZWlnaHQ6IChAYnMtaGVpZ2h0LXNtICsgMik7XG4gICAgd2lkdGg6IChAYnMtaGVpZ2h0LXNtICsgMik7XG4gICAgcGFkZGluZy1sZWZ0OiAwO1xuICAgIHBhZGRpbmctcmlnaHQ6IDA7XG4gIH1cbiAgJi5idG4teHMge1xuICAgIGhlaWdodDogKEBicy1oZWlnaHQteHMgKyAyKTtcbiAgICB3aWR0aDogKEBicy1oZWlnaHQteHMgKyAyKTtcbiAgICBwYWRkaW5nLWxlZnQ6IDA7XG4gICAgcGFkZGluZy1yaWdodDogMDtcbiAgfVxufVxuXG4uYnRuLXNvY2lhbChAY29sb3ItYmcsIEBjb2xvcjogQGNvbG9yLWJnKSB7XG4gIGJhY2tncm91bmQtY29sb3I6IEBjb2xvci1iZztcbiAgLmJ1dHRvbi12YXJpYW50KEBjb2xvciwgQGNvbG9yLWJnLCByZ2JhKDAsMCwwLC4yKSk7XG59XG5cblxuLmJ0bi1hZG4gICAgICAgICAgIHsgLmJ0bi1zb2NpYWwoI2Q4N2E2OCk7IH1cbi5idG4tYml0YnVja2V0ICAgICB7IC5idG4tc29jaWFsKCMyMDUwODEpOyB9XG4uYnRuLWRyb3Bib3ggICAgICAgeyAuYnRuLXNvY2lhbCgjMTA4N2RkKTsgfVxuLmJ0bi1mYWNlYm9vayAgICAgIHsgLmJ0bi1zb2NpYWwoIzNiNTk5OCk7IH1cbi5idG4tZmxpY2tyICAgICAgICB7IC5idG4tc29jaWFsKCNmZjAwODQpOyB9XG4uYnRuLWZvdXJzcXVhcmUgICAgeyAuYnRuLXNvY2lhbCgjZjk0ODc3KTsgfVxuLmJ0bi1naXRodWIgICAgICAgIHsgLmJ0bi1zb2NpYWwoIzQ0NDQ0NCk7IH1cbi5idG4tZ29vZ2xlLXBsdXMgICB7IC5idG4tc29jaWFsKCNkZDRiMzkpOyB9XG4uYnRuLWluc3RhZ3JhbSAgICAgeyAuYnRuLXNvY2lhbCgjM2Y3MjliKTsgfVxuLmJ0bi1saW5rZWRpbiAgICAgIHsgLmJ0bi1zb2NpYWwoIzAwN2JiNik7IH1cbi5idG4tbWljcm9zb2Z0ICAgICB7IC5idG4tc29jaWFsKCMyNjcyZWMpOyB9XG4uYnRuLW9wZW5pZCAgICAgICAgeyAuYnRuLXNvY2lhbCgjZjc5MzFlKTsgfVxuLmJ0bi1waW50ZXJlc3QgICAgIHsgLmJ0bi1zb2NpYWwoI2NiMjAyNyk7IH1cbi5idG4tcmVkZGl0ICAgICAgICB7IC5idG4tc29jaWFsKCNlZmY3ZmYsICMwMDApOyB9XG4uYnRuLXNvdW5kY2xvdWQgICAgeyAuYnRuLXNvY2lhbCgjZmY1NTAwKTsgfVxuLmJ0bi10dW1ibHIgICAgICAgIHsgLmJ0bi1zb2NpYWwoIzJjNDc2Mik7IH1cbi5idG4tdHdpdHRlciAgICAgICB7IC5idG4tc29jaWFsKCM1NWFjZWUpOyB9XG4uYnRuLXZpbWVvICAgICAgICAgeyAuYnRuLXNvY2lhbCgjMWFiN2VhKTsgfVxuLmJ0bi12ayAgICAgICAgICAgIHsgLmJ0bi1zb2NpYWwoIzU4N2VhMyk7IH1cbi5idG4teWFob28gICAgICAgICB7IC5idG4tc29jaWFsKCM3MjBlOWUpOyB9XG4iLCJAaW1wb3J0IFwibGliL2Jvb3RzdHJhcC9ib290c3RyYXBcIjtcbkBpbXBvcnQgXCJsaWIvYm9vdHN0cmFwLXNvY2lhbC9ib290c3RyYXAtc29jaWFsXCI7XG5AaW1wb3J0IFwibGliL2lvbmljb25zL2lvbmljb25zXCI7XG5AaW1wb3J0IFwibGliL2FuaW1hdGUubWluLmxlc3NcIjtcbkBpbXBvcnQgXCJsaWIvYm9vdHN0cmFwL3ZhcmlhYmxlc1wiO1xuXG5odG1sLGJvZHksZGl2LHNwYW4sYSxsaSx0ZCx0aCB7XG4gIGZvbnQtZmFtaWx5OiAn5b6u6L2v6ZuF6buRJywnTGF0bycsIHNhbnMtc2VyaWY7XG59XG5cbmJvbGQge1xuICBmb250LWZhbWlseTogJ0xhdG8tQm9sZCcsIHNhbnMtc2VyaWY7XG4gIGZvbnQtd2VpZ2h0OiBCb2xkO1xufVxuXG5saSwgLndyYXBwYWJsZSB7XG4gIHdoaXRlLXNwYWNlOiBwcmU7ICAgICAgICAgICAvKiBDU1MgMi4wICovXG4gIHdoaXRlLXNwYWNlOiBwcmUtd3JhcDsgICAgICAvKiBDU1MgMi4xICovXG4gIHdoaXRlLXNwYWNlOiBwcmUtbGluZTsgICAgICAvKiBDU1MgMy4wICovXG4gIHdoaXRlLXNwYWNlOiAtcHJlLXdyYXA7ICAgICAvKiBPcGVyYSA0LTYgKi9cbiAgd2hpdGUtc3BhY2U6IC1vLXByZS13cmFwOyAgIC8qIE9wZXJhIDcgKi9cbiAgd2hpdGUtc3BhY2U6IC1tb3otcHJlLXdyYXA7IC8qIE1vemlsbGEgKi9cbiAgd2hpdGUtc3BhY2U6IC1ocC1wcmUtd3JhcDsgIC8qIEhQIFByaW50ZXJzICovXG4gIHdvcmQtd3JhcDogYnJlYWstd29yZDsgICAgICAvKiBJRSA1KyAqL1xufVxuXG5wcmUud3JhcHBhYmxlIHtcbiAgd2hpdGUtc3BhY2U6IHByZTsgICAgICAgICAgIC8qIENTUyAyLjAgKi9cbiAgd2hpdGUtc3BhY2U6IHByZS13cmFwOyAgICAgIC8qIENTUyAyLjEgKi9cbiAgd2hpdGUtc3BhY2U6IC1wcmUtd3JhcDsgICAgIC8qIE9wZXJhIDQtNiAqL1xuICB3aGl0ZS1zcGFjZTogLW8tcHJlLXdyYXA7ICAgLyogT3BlcmEgNyAqL1xuICB3aGl0ZS1zcGFjZTogLW1vei1wcmUtd3JhcDsgLyogTW96aWxsYSAqL1xuICB3aGl0ZS1zcGFjZTogLWhwLXByZS13cmFwOyAgLyogSFAgUHJpbnRlcnMgKi9cbiAgd29yZC13cmFwOiBicmVhay13b3JkOyAgICAgIC8qIElFIDUrICovXG59XG5cbmh0bWwge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIG1pbi1oZWlnaHQ6IDEwMCU7XG4gIC8vIGhhY2sgdG8gcHJldmVudCBob3Jpem9udGFsIG92ZXJmbG93IHByb2JsZW0gb24gc2hvd0hUTUwgdmlld1xuICBvdmVyZmxvdy14OiBoaWRkZW47XG59XG5cbi8vaW5wdXRbdHlwZT1jaGVja2JveF0ge1xuLy8gIC8qIERvdWJsZS1zaXplZCBDaGVja2JveGVzICovXG4vLyAgLW1zLXRyYW5zZm9ybTogc2NhbGUoMik7IC8qIElFICovXG4vLyAgLW1vei10cmFuc2Zvcm06IHNjYWxlKDIpOyAvKiBGRiAqL1xuLy8gIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZSgyKTsgLyogU2FmYXJpIGFuZCBDaHJvbWUgKi9cbi8vICAtby10cmFuc2Zvcm06IHNjYWxlKDIpOyAvKiBPcGVyYSAqL1xuLy8gIHBhZGRpbmc6IDEwcHg7XG4vL31cblxuLmJ0bi1ncm91cCB7XG4gIGJvcmRlci1jb2xvcjogQGJyYW5kLXByaW1hcnk7XG59XG5cbmJvZHkuZnVsbC1zY3JlZW4tYm9keS1iYWNrZ3JvdW5kIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogQGJvZHktYmc7XG59XG5cblxuYm9keS50b3AtYW5kLWJvdHRvbS1tYXJnaW5zIHtcbiAgcGFkZGluZy10b3A6IDgwcHg7XG4gIG1hcmdpbi1ib3R0b206IDYwcHg7XG59XG5cbmJvZHkubm8tdG9wLWFuZC1ib3R0b20tbWFyZ2lucyB7XG4gIG1hcmdpbjogNzVweCAxMHB4IDBweCAyMHB4O1xufVxuXG5oMSwgaDIge1xuICBmb250LXdlaWdodDogNDAwO1xufVxuXG5cbmgxLCBoMiwgaDMsIGg0LCBoNSwgaDYsIHAsIGxpIHtcbiAgcGFkZGluZy10b3A6IDVweDtcbiAgcGFkZGluZy1ib3R0b206IDVweDtcbn1cblxuLy8gQWxlcnRzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi5hbGVydCB7XG4gIG1hcmdpbi10b3A6IDIwcHg7XG59XG5cbi8vIFRodW1ibmFpbHNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLnRodW1ibmFpbCB7XG4gIGJhY2tncm91bmQtY29sb3I6ICNFRUVFRUU7XG4vLyAgYm94LXNoYWRvdzogMCAwIDVweCAjY2NjLCBpbnNldCAwIDAgMCAjMDAwO1xufVxuXG4vLyBGb250IEljb25zXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi5mYSxcbltjbGFzc149J2lvbi0nXSB7XG4gIG1hcmdpbi1yaWdodDogNXB4O1xufVxuXG4uZmE6aG92ZXIge1xuICB0ZXh0LWRlY29yYXRpb246IG5vbmU7XG59XG5cbi5uby1saW5rLXVuZGVybGluZSB7XG4gIHRleHQtZGVjb3JhdGlvbjogbm9uZTtcbn1cblxuLmltZy1jZW50ZXIge1xuICBtYXJnaW46IDAgYXV0bztcbn1cblxuLmJ0bi1jdGEge1xuICBmb250LXNpemU6IDQwcHg7XG59XG5cbi5zaGFkb3cge1xuICB3aGl0ZS1zcGFjZTogbm9ybWFsO1xuICAtd2Via2l0LWJveC1zaGFkb3c6IDJweCA0cHggMXB4IHJnYmEoMCwgMCwgMCwgMC4zKTtcbiAgLW1vei1ib3gtc2hhZG93OiAgICAycHggNHB4IDFweCByZ2JhKDAsIDAsIDAsIDAuMyk7XG4gIGJveC1zaGFkb3c6ICAgICAgICAgMnB4IDRweCAxcHggcmdiYSgwLCAwLCAwLCAwLjMpO1xufVxuXG4uYnRuLW5hdiB7XG4gIG1hcmdpbi10b3A6IDEwcHg7XG59XG5cbnVsIHtcbiAgbGlzdC1zdHlsZTogbm9uZTtcbn1cblxuLnBhbmVsLWhlYWRpbmcge1xuICBmb250LXNpemU6IDI1cHg7XG59XG5cbi5wYW5lbC1oZWFkaW5nID4gaDEge1xuICBmb250LXNpemU6IDI1cHg7XG4gIHBhZGRpbmc6IDJweDtcbiAgbWFyZ2luOiAycHg7XG59XG5cbi5uYXZiYXItYnJhbmQge1xuICBmb250LXNpemU6IDI2cHg7XG59XG5cbi5uYXZiYXIgPiAuY29udGFpbmVyIHtcbiAgd2lkdGg6IGF1dG87XG4gIHBhZGRpbmctbGVmdDogMHB4O1xuICBwYWRkaW5nLXJpZ2h0OiAwcHg7XG59XG5cbi5uYXYtaGVpZ2h0IHtcbiAgaGVpZ2h0OiA1MHB4O1xuICBib3JkZXI6IG5vbmU7XG59XG5cbi5sYW5kaW5nLWljb24ge1xuICBoZWlnaHQ6IDIwMHB4O1xuICB3aWR0aDogMjAwcHg7XG59XG5cbi5jb21wbGV0aW9uLWljb24ge1xuICBmb250LXNpemU6IDE1MHB4O1xufVxuXG4ucG9zaXRpdmUtMTUge1xuICBtYXJnaW4tdG9wOiAxNXB4O1xufVxuXG4ucG9zaXRpdmUtMjAge1xuICBtYXJnaW4tdG9wOiAyMHB4O1xufVxuXG4ucG9zaXRpdmUtMTUtYm90dG9tIHtcbiAgbWFyZ2luLWJvdHRvbTogMTVweDtcbn1cblxuLnBvc2l0aXZlLTEwIHtcbiAgbWFyZ2luLXRvcDogMTBweDtcbn1cblxuLnBvc2l0aXZlLTUge1xuICBtYXJnaW4tdG9wOiA1cHg7XG59XG5cbi5uZWdhdGl2ZS01IHtcbiAgbWFyZ2luLXRvcDogLTVweDtcbn1cblxuLm5lZ2F0aXZlLTEwIHtcbiAgbWFyZ2luLXRvcDogLTEwcHg7XG59XG5cbi5uZWdhdGl2ZS0xNSB7XG4gIG1hcmdpbi10b3A6IC0xNXB4O1xufVxuXG4ubmVnYXRpdmUtMjAge1xuICBtYXJnaW4tdG9wOiAtMjBweDtcbn1cblxuLm5lZ2F0aXZlLTI4IHtcbiAgbWFyZ2luLXRvcDogLTI4cHg7XG59XG5cbi5uZWdhdGl2ZS0zMCB7XG4gIG1hcmdpbi10b3A6IC0zMHB4O1xufVxuXG4ubmVnYXRpdmUtMzAtYm90dG9tIHtcbiAgbWFyZ2luLWJvdHRvbTogLTMwcHg7XG59XG5cbi5uZWdhdGl2ZS0zNSB7XG4gIG1hcmdpbi10b3A6IC0zNXB4O1xufVxuXG4ubmVnYXRpdmUtNTUge1xuICBtYXJnaW4tdG9wOiAtNTVweDtcbiAgbWFyZ2luLWJvdHRvbTogLTU1cHg7XG59XG5cbi5sYXJnZS1wIHtcbiAgZm9udC1zaXplOiAyNHB4O1xufVxuXG4uc21hbGwtcCB7XG4gIGZvbnQtc2l6ZTogMTRweDtcbn1cblxuLm1hcC1wIHtcbiAgZm9udC1zaXplOiAyMHB4O1xufVxuXG4ubWFwLXJvdy1udW1iZXJzIHtcbiAgdGV4dC1hbGlnbjogcmlnaHQ7XG4gIHBhZGRpbmctcmlnaHQ6IDVweDtcbiAgcGFkZGluZy1sZWZ0OiA1cHg7XG59XG5cbi5saW5rLXRhYmxlIHRke1xuICBmb250LXNpemU6IDE2cHg7XG4gIGJvcmRlci10b3A6IG5vbmUgIWltcG9ydGFudDtcbiAgQG1lZGlhIChtaW4td2lkdGg6IDc2N3B4KSB7XG4gICAgZm9udC1zaXplOiAyNHB4O1xuICB9XG59XG5cbi5jYXBpdGFsaXplIHtcbiAgdGV4dC10cmFuc2Zvcm06IGNhcGl0YWxpemU7XG59XG5cbi50ZXh0LXN1Y2Nlc3Mge1xuICBjb2xvcjogQGJyYW5kLXByaW1hcnk7XG59XG5cbi5mYXN0LWFuaW1hdGlvbiB7XG4gIC13ZWJraXQtYW5pbWF0aW9uLWR1cmF0aW9uOiAwLjVzO1xuICBhbmltYXRpb24tZHVyYXRpb246IDAuNXM7XG59XG5cbi5kaXNhYmxlZCB7XG4gIHBvaW50ZXItZXZlbnRzOiBub25lO1xuICBjdXJzb3I6IGRlZmF1bHQ7XG4gIGNvbG9yOiBncmF5dGV4dCAhaW1wb3J0YW50O1xufVxuXG4uaGlkZGVuLWVsZW1lbnQge1xuICBkaXNwbGF5OiBub25lO1xufVxuXG4ubmF2LWxvZ28ge1xuICBoZWlnaHQ6IDQwcHg7XG4gIG1hcmdpbi10b3A6IC0xMHB4O1xuXG4gIEBtZWRpYSAobWF4LXdpZHRoOiAzOTdweCkge1xuICAgIGhlaWdodDogMzBweDtcbiAgICBtYXJnaW4tdG9wOiAtNXB4O1xuICB9XG4gIEBtZWRpYSAobWF4LXdpZHRoOiAzMzVweCkge1xuICAgIGhlaWdodDogMjVweDtcbiAgICBtYXJnaW4tdG9wOiAtMnB4O1xuICB9XG59XG5cbi5uYXZiYXItcmlnaHQge1xuICBAbWVkaWEgKG1pbi13aWR0aDogNzY3cHgpIHtcbiAgICBtYXJnaW4tcmlnaHQ6MDtcbiAgfVxuICBAbWVkaWEgKG1heC13aWR0aDogOTkxcHgpIGFuZCAobWluLXdpZHRoOiA3NjdweCkge1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICBsZWZ0OiAwO1xuICAgIHJpZ2h0OiAwO1xuICAgIG1hcmdpbi1yaWdodDogMHB4O1xuICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gIH1cbiAgYmFja2dyb3VuZC1jb2xvcjogQGJyYW5kLXByaW1hcnk7XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcbn1cbi5uYXZiYXIge1xuICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuICBib3JkZXI6IG5vbmU7XG4gIGxpbmUtaGVpZ2h0OiAxO1xuICBAbWVkaWEgKG1pbi13aWR0aDogNzY3cHgpIHtcbiAgICBwYWRkaW5nLWxlZnQ6IDE1cHg7XG4gICAgcGFkZGluZy1yaWdodDogMzBweDtcbiAgfVxufVxuXG5saS5hdmF0YXIsIGxpLmF2YXRhciA+IGEgeyBwYWRkaW5nOjA7IG1hcmdpbjowIH1cblxuLnRoaW4tcHJvZ3Jlc3MtYmFyIHtcbiAgaGVpZ2h0OiA4cHg7XG4gIG1hcmdpbi10b3A6IDNweDtcbiAgbWFyZ2luLWJvdHRvbTogMHB4O1xuICB3aWR0aDogNjAlO1xuICBtYXJnaW4tcmlnaHQ6IGF1dG87XG4gIG1hcmdpbi1sZWZ0OiBhdXRvO1xufVxuXG4ucGFuZWwtYm9keSB7XG4gIG1hcmdpbi1ib3R0b206IC02cHg7XG59XG5cbi5sYi1jb250YWluZXIge1xuICBwYWRkaW5nOiAwcHg7XG59XG5cbi5idG4tc29jaWFsIHtcbiAgd2lkdGg6IDI1MHB4O1xuICBtYXJnaW46IGF1dG87XG59XG5cbi5idG4tbGluay1zb2NpYWwge1xuICBtYXgtd2lkdGg6IDQwMHB4O1xuICBtYXJnaW46IGF1dG87XG4gIG1hcmdpbi1ib3R0b206IDEwcHg7XG59XG5cbi5uYXZiYXIge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiBAYnJhbmQtcHJpbWFyeTtcbn1cblxuYSB7XG4gIGZvbnQtd2VpZ2h0OiBib2xkO1xufVxuXG5wIHtcbiAgZm9udC1zaXplOiAxNHB4O1xufVxuXG4ubWFwLWFzaWRlLWJvZHkgcCB7XG4gIGxpbmUtaGVpZ2h0OiAxLjg7XG59XG5cbi5uYXZiYXItbmF2ID4gbGkgPiBhIHtcbiAgY29sb3I6IEBib2R5LWJnO1xuICAmOmhvdmVyIHtcbiAgICBjb2xvcjogQGJyYW5kLXByaW1hcnk7XG4gIH1cbn1cblxuLmh1Zy10b3Age1xuICBtYXJnaW4tdG9wOiAtMzVweDtcbiAgbWFyZ2luLWJvdHRvbTogLTEwcHg7XG59XG5cbi5ub25wcm9maXQtbGFuZGluZyB7XG4gIGZvbnQtc2l6ZTogNTBweDtcbn1cblxuLmJpZy10ZXh0IHtcbiAgZm9udC1zaXplOiA2M3B4O1xufVxuXG4uc2lnbnVwLWJ0bi5idG4ge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZhYzMzO1xuICBiYWNrZ3JvdW5kLWltYWdlOiBsaW5lYXItZ3JhZGllbnQoI2ZmY2M0ZCwgI2ZmYWMzMyk7XG4gIC1tcy1maWx0ZXI6IFwicHJvZ2lkOkRYSW1hZ2VUcmFuc2Zvcm0uTWljcm9zb2Z0LmdyYWRpZW50KHN0YXJ0Q29sb3JzdHI9I2ZmY2M0ZCwgIGVuZENvbG9yc3RyPSNmZmFjMzMsICBHcmFkaWVudFR5cGU9MClcIjtcbiAgYm9yZGVyLWNvbG9yOiAjZjFhMDJhO1xuICBjb2xvcjogIzI5MmYzMyAhaW1wb3J0YW50O1xuICB0ZXh0LXNoYWRvdzogMCAxcHggMCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNSk7XG59XG4uc2lnbnVwLWJ0bjpob3ZlciwgLnNpZ251cC1idG46Zm9jdXMge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZTk5MTEwO1xuICBiYWNrZ3JvdW5kLWltYWdlOiBsaW5lYXItZ3JhZGllbnQoI2ZmY2M0ZCwgI2U5OTExMCk7XG4gIC1tcy1maWx0ZXI6IFwicHJvZ2lkOkRYSW1hZ2VUcmFuc2Zvcm0uTWljcm9zb2Z0LmdyYWRpZW50KHN0YXJ0Q29sb3JzdHI9I2ZmY2M0ZCwgIGVuZENvbG9yc3RyPSNlOTkxMTAsICBHcmFkaWVudFR5cGU9MClcIjtcbiAgYm9yZGVyLWNvbG9yOiAjZWM4YjExO1xuICBjb2xvcjogIzI5MmYzMyAhaW1wb3J0YW50O1xufVxuLnNpZ251cC1idG46YWN0aXZlIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2YyYTMzMDtcbiAgYmFja2dyb3VuZC1pbWFnZTogbm9uZTtcbiAgYm94LXNoYWRvdzogaW5zZXQgMCAxcHggNHB4IHJnYmEoMCwgMCwgMCwgMC4zKTtcbn1cblxuKiwgKjpiZWZvcmUsICo6YWZ0ZXIge1xuICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3ggIWltcG9ydGFudDtcbn1cblxuLmJ0bi1iaWcge1xuICBmb250LXNpemU6IDIwcHg7XG4gIGJvcmRlci1yYWRpdXM6IDZweDtcbn1cblxuLmJ0bi1iaWdnZXIge1xuICBmb250LXNpemU6IDMwcHg7XG59XG5cbi5iaWctdGV4dC1maWVsZCB7XG4gIGZvbnQtc2l6ZTogMzBweDtcbiAgaGVpZ2h0OiA1N3B4O1xuICBiYWNrZ3JvdW5kLWNvbG9yOiBAYm9keS1iZyAhaW1wb3J0YW50O1xufVxuXG5oNCB7XG4gIGZvbnQtc2l6ZTogMjJweDtcbn1cblxuLm5vLXRyYW5zaXRpb24ge1xuICAtd2Via2l0LXRyYW5zaXRpb246IGhlaWdodCAwLjAwMXM7XG4gIC1tb3otdHJhbnNpdGlvbjogaGVpZ2h0IDAuMDAxcztcbiAgLW1zLXRyYW5zaXRpb246IGhlaWdodCAwLjAwMXM7XG4gIC1vLXRyYW5zaXRpb246IGhlaWdodCAwLjAwMXM7XG4gIHRyYW5zaXRpb246IGhlaWdodCAwLjAwMXM7XG59XG5cbi5tYXJnaW4tbGVmdC0xMCB7XG4gIG1hcmdpbi1sZWZ0OiAxMHB4O1xufVxuXG4uYnRuLXJlc3BvbnNpdmUge1xuICBAbWVkaWEgKG1heC13aWR0aDogNzY4cHgpIHtcbiAgICBmb250LXNpemU6IDE1cHg7XG4gICAgaGVpZ2h0OiAyNi41cHg7XG4gICAgcGFkZGluZy10b3A6IDFweDtcbiAgfVxufVxuXG4uZmllbGQtcmVzcG9uc2l2ZSB7XG4gIEBtZWRpYSAobWF4LXdpZHRoOiA3NjhweCkge1xuICAgIGZvbnQtc2l6ZTogMTVweDtcbiAgICBoZWlnaHQ6IDI2LjVweDtcbiAgfVxufVxuXG50aGVhZCB7XG4gIGZvbnQtc2l6ZTogMTUwJTtcbn1cblxuLm5vd3JhcCB7XG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XG59XG5cbi5iaWctYnJlYWsge1xuICBtYXJnaW4tdG9wOiA1MHB4O1xuICBtYXJnaW4tYm90dG9tOiA1MHB4O1xufVxuXG4ucHJvZmlsZS1waWN0dXJlIHtcbiAgaGVpZ2h0OiA1MHB4O1xuICB3aWR0aDogNTBweDtcbn1cblxuLmJyb3duaWUtcG9pbnRzLW5hdiB7XG4gIEBtZWRpYSAobWluLXdpZHRoOiA5OTFweCkgYW5kIChtYXgtd2lkdGg6IDk5OXB4KSB7XG4gICAgbWFyZ2luLXJpZ2h0OiAtMTBweDtcbiAgfVxufVxuXG4ubmF2YmFyLW5hdiBhIHtcbiAgY29sb3I6IEBib2R5LWJnO1xuICBmb250LXNpemU6IDIwcHg7XG4gIG1hcmdpbi10b3A6IC01cHg7XG4gIG1hcmdpbi1ib3R0b206IC01cHg7XG59XG5cbi5uYXZiYXItdG9nZ2xlIHtcbiAgY29sb3I6IEBib2R5LWJnO1xuXG4gICY6aG92ZXIsXG4gICY6Zm9jdXMge1xuICAgIGNvbG9yOiAjNGEyYjBmO1xuICB9XG59XG5cblxuLnNpZ251cC1idG4tbmF2IHtcbiAgbWFyZ2luLXRvcDogLTJweCAhaW1wb3J0YW50O1xuICBwYWRkaW5nLXRvcDogMTBweCAhaW1wb3J0YW50O1xuICBwYWRkaW5nLWJvdHRvbTogMTBweCAhaW1wb3J0YW50O1xuICBtYXJnaW4tcmlnaHQ6IC0xMnB4O1xuICBAbWVkaWEgKG1pbi13aWR0aDogOTkxcHgpIGFuZCAobWF4LXdpZHRoOiAxMDEwcHgpIHtcbiAgICBtYXJnaW4tbGVmdDogLTEwcHg7XG4gICAgbWFyZ2luLXJpZ2h0OiAtNXB4O1xuICB9XG59XG5cbi5wdWJsaWMtcHJvZmlsZS1pbWcge1xuICBoZWlnaHQ6IDIwMHB4O1xuICB3aWR0aDogMjAwcHg7XG4gIGJvcmRlci1yYWRpdXM6IDVweDtcbn1cblxuLm5nLWludmFsaWQubmctZGlydHkge1xuICBib3JkZXItY29sb3I6ICNGQTc4N0U7XG59XG4ubmctdmFsaWQubmctZGlydHkge1xuICBib3JkZXItY29sb3I6ICM3OEZBODk7XG59XG5cbi5mbGF0LXRvcCB7XG4gIG1hcmdpbi10b3A6IC01cHg7XG59XG5cbi5uZWdhdGl2ZS1ib3R0b20ge1xuICBtYXJnaW4tYm90dG9tOiAtMjBweDtcbn1cblxuLm1pbi1oZWlnaHQtMTAwMCB7XG4gIG1pbi1oZWlnaHQ6IDEwMDBweDtcbn1cblxuLnBvaW50cy1vbi10b3Age1xuICBjb2xvcjogQGJvZHktYmc7XG4gIGZvbnQtc2l6ZTogMzVweDtcbiAgei1pbmRleDogMjtcbiAgd2lkdGg6IDYwJTtcbiAgbWFyZ2luOiAwIGF1dG87XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgdG9wOiA1MCU7XG4gIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC01MCUpO1xuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTUwJSk7XG59XG5cbi5sYW5kaW5nLXNraWxsLWljb24ge1xuICBjb2xvcjogQGJyYW5kLXByaW1hcnk7XG4gIGZvbnQtc2l6ZTogMTUwcHg7XG59XG5cbi5jdXN0b20tbGFuZGluZy1za2lsbC1pY29uIHtcbiAgbWFyZ2luLXRvcDogLTE1cHg7XG4gIHBhZGRpbmctYm90dG9tOiAxNXB4O1xufVxuXG4uYmxhY2stdGV4dCB7XG4gIGNvbG9yOiAjMzMzO1xuICBmb250LXdlaWdodDogNDAwO1xuICBmb250LXNpemU6IDQwcHg7XG59XG5cbi5mb250LWF3ZXNvbWUtcGFkZGluZyB7XG4gIG1hcmdpbi10b3A6IDQ1cHg7XG4gIG1hcmdpbi1ib3R0b206IDIwcHg7XG59XG5cbi5iYWNrZ3JvdW5kLXN2ZyB7XG4gIHdpZHRoOiAyMjBweDtcbiAgaGVpZ2h0OiAyMjBweDtcbiAgYmFja2dyb3VuZC1pbWFnZTogdXJsKFwiL2ltYWdlcy9jZXJ0aWZpY2F0ZS1pY29uLnN2Z1wiKTtcbiAgYmFja2dyb3VuZC1zaXplOiAxMjAlO1xuICBiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0O1xuICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiBjZW50ZXI7XG59XG5cbi50ZXN0aW1vbmlhbC1pbWFnZSB7XG4gIGJvcmRlci1yYWRpdXM6IDVweDtcbiAgaGVpZ2h0OiAyMDBweDtcbiAgd2lkdGg6IDIwMHB4O1xuICBjb2xvcjogIzAwOTkwMFxufVxuXG4udGVzdGltb25pYWwtaW1hZ2Utam9icyB7XG4gIGJvcmRlci1yYWRpdXM6IDVweDtcbiAgY29sb3I6ICMwMDk5MDBcbn1cblxuXG4uZGVmYXVsdC1ib3JkZXItcmFkaXVzIHtcbiAgYm9yZGVyLXJhZGl1czogNXB4O1xufVxuXG4uaGVpZ2h0LTUwMCB7XG4gIGhlaWdodDogNTAwcHg7XG59XG5cbi5oZWlnaHQtNDAwIHtcbiAgaGVpZ2h0OiA0MDBweDtcbn1cblxuLnRlc3RpbW9uaWFsLWNvcHkge1xuICB0ZXh0LWFsaWduOiBqdXN0aWZ5O1xuICBmb250LXNpemU6IDE4cHggIWltcG9ydGFudDtcbiAgbWFyZ2luLWxlZnQ6IDIwcHg7XG4gIG1hcmdpbi1yaWdodDogMjBweDtcbiAgQG1lZGlhIChtaW4td2lkdGg6IDk5MXB4KSBhbmQgKG1heC13aWR0aDogMTE5OXB4KSB7XG4gICAgaGVpZ2h0OiAxNTBweDtcbiAgfVxuICBAbWVkaWEgKG1pbi13aWR0aDogMTIwMHB4KSB7XG4gICAgaGVpZ2h0OiAxMDBweDtcbiAgfVxufVxuXG4ubm9ucHJvZml0LXRlc3RpbW9uaWFsLWNvcHkge1xuICB0ZXh0LWFsaWduOiBqdXN0aWZ5O1xuICBmb250LXNpemU6IDE4cHggIWltcG9ydGFudDtcbiAgbWFyZ2luLWxlZnQ6IDIwcHg7XG4gIG1hcmdpbi1yaWdodDogMjBweDtcbiAgQG1lZGlhIChtaW4td2lkdGg6IDk5MXB4KSBhbmQgKG1heC13aWR0aDogMTE5OXB4KSB7XG4gICAgaGVpZ2h0OiAzMDBweCAhaW1wb3J0YW50O1xuICB9XG4gIEBtZWRpYSAobWluLXdpZHRoOiAxMjAwcHgpIHtcbiAgICBoZWlnaHQ6IDIwMHB4ICFpbXBvcnRhbnQ7XG4gIH1cbn1cblxuLm5hdmJhci1jb2xsYXBzZSB7XG4gIGJvcmRlci10b3A6IDA7XG59XG5cbi5jaGFsbGVuZ2UtbGlzdC1oZWFkZXIge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiBAYnJhbmQtcHJpbWFyeTtcbiAgY29sb3I6IEBncmF5LWxpZ2h0ZXI7XG4gIGZvbnQtc2l6ZTogMzZweDtcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xuICBtYXJnaW4tYm90dG9tOiAtMzBweDtcbiAgYm9yZGVyLXJhZGl1czogNXB4IDVweCAwcHggMHB4O1xuICBwYWRkaW5nLWxlZnQ6IDUwcHg7XG59XG5cbi5jbG9zaW5nLXgge1xuICBjb2xvcjogQGdyYXktbGlnaHRlcjtcbiAgZm9udC1zaXplOiA1MHB4O1xuICB0ZXh0LWFsaWduOiByaWdodDtcbn1cblxuLmZjYy1mb290ZXIge1xuICB3aWR0aDogMTAwJTtcbiAgaGVpZ2h0OiA1MHB4O1xuICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gIGJhY2tncm91bmQtY29sb3I6IEBicmFuZC1wcmltYXJ5O1xuICBwYWRkaW5nOiAxMnB4O1xuICBib3R0b206IDA7XG4gIGxlZnQ6IDA7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgYSB7XG4gICAgZm9udC1zaXplOiAyMHB4O1xuICAgIGNvbG9yOiBAZ3JheS1saWdodGVyO1xuICAgIG1hcmdpbi1sZWZ0OiAwcHg7XG4gICAgbWFyZ2luLXJpZ2h0OiAwcHg7XG4gICAgcGFkZGluZy1sZWZ0OiAxMHB4O1xuICAgIHBhZGRpbmctcmlnaHQ6IDEwcHg7XG4gICAgcGFkZGluZy10b3A6IDE0cHg7XG4gICAgcGFkZGluZy1ib3R0b206IDEycHg7XG4gICAgJjpob3ZlciB7XG4gICAgICBjb2xvcjogQGJyYW5kLXByaW1hcnk7XG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAZ3JheS1saWdodGVyO1xuICAgICAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xuICAgIH1cbiAgfVxufVxuXG4uZW1iZWQtcmVzcG9uc2l2ZS10d2l0Y2gtY2hhdCB7XG4gIHBhZGRpbmctYm90dG9tOiAxMTclO1xufVxuXG4jZGlyZWN0aW9ucyB7XG4gIHRleHQtYWxpZ246IGxlZnQ7XG4gIGZvbnQtc2l6ZTogMTVweDtcbn1cblxuLmdyYXBoLXJlY3Qge1xuICBmaWxsOiAjZGRkICFpbXBvcnRhbnRcbn1cblxuXG4vKipcbiAqIEJvbmZpcmUgc3R5bGluZ1xuICovXG5cbmZvcm0uY29kZSBzcGFuIHtcbiAgZm9udC1zaXplOiAxOHB4O1xuICBmb250LWZhbWlseTogXCJVYnVudHUgTW9ub1wiO1xuICBwYWRkaW5nLWJvdHRvbTogMHB4O1xuICBtYXJnaW4tYm90dG9tOiAwcHg7XG4gIGhlaWdodDogMTAwJTtcbn1cblxuLkNvZGVNaXJyb3Ige1xuICBsaW5lLWhlaWdodDogMSAhaW1wb3J0YW50O1xufVxuXG4uQ29kZU1pcnJvci1saW5lbnVtYmVyIHtcbiAgZm9udC1zaXplOiAxOHB4O1xuICBmb250LWZhbWlseTogXCJVYnVudHUgTW9ub1wiO1xufVxuXG4jbWFpbkVkaXRvclBhbmVsIHtcbiAgaGVpZ2h0OiAxMDAlO1xuICB3aWR0aDogOTklO1xufVxuXG4uc2Nyb2xsLWxvY2tlciB7XG4gIG92ZXJmbG93LXg6IGhpZGRlbjtcbiAgb3ZlcmZsb3cteTogYXV0bztcbn1cblxuI21haW5FZGl0b3JQYW5lbCAucGFuZWwtYm9keSB7XG4gIHBhZGRpbmctYm90dG9tOiAwcHg7XG59XG5cbmRpdi5Db2RlTWlycm9yLXNjcm9sbCB7XG4gIHBhZGRpbmctYm90dG9tOiAzMHB4O1xufVxuXG4udGVzdC12ZXJ0aWNhbC1jZW50ZXIge1xuICBtYXJnaW4tdG9wOiA4cHg7XG59XG5cbi5jbS1zLW1vbm9rYWkuQ29kZU1pcnJvciB7XG4gIGJvcmRlci1yYWRpdXM6IDVweDtcbn1cbi5jb3Vyc2V3YXJlLWhlaWdodCB7XG4gIG1pbi1oZWlnaHQ6IDY1MHB4O1xufVxuXG4uYnRuIHtcbiAgZm9udC13ZWlnaHQ6IDQwMDtcbiAgd2hpdGUtc3BhY2U6IG5vcm1hbDtcbiAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG5cbiAgLXdlYmtpdC10cmFuc2l0aW9uOiBiYWNrZ3JvdW5kIC4ycyBlYXNlLWluLW91dCwgYm9yZGVyIC4ycyBlYXNlLWluLW91dDtcbiAgLW1vei10cmFuc2l0aW9uOiBiYWNrZ3JvdW5kIC4ycyBlYXNlLWluLW91dCwgYm9yZGVyIC4ycyBlYXNlLWluLW91dDtcbiAgLW1zLXRyYW5zaXRpb246IGJhY2tncm91bmQgLjJzIGVhc2UtaW4tb3V0LCBib3JkZXIgLjJzIGVhc2UtaW4tb3V0O1xuICAtby10cmFuc2l0aW9uOiBiYWNrZ3JvdW5kIC4ycyBlYXNlLWluLW91dCwgYm9yZGVyIC4ycyBlYXNlLWluLW91dDtcbiAgdHJhbnNpdGlvbjogYmFja2dyb3VuZCAuMnMgZWFzZS1pbi1vdXQsIGJvcmRlciAuMnMgZWFzZS1pbi1vdXQ7XG59XG5cbi5wb3B1bGF0aW9uLXRhYmxlIHtcbiAgZm9udC1zaXplOjMwcHg7XG4gIHdpZHRoOjQ2MHB4O1xuICBtYXJnaW46MCBhdXRvO1xuICBwYWRkaW5nOjA7XG4gIGgyIHtcbiAgICBtYXJnaW46MDtcbiAgICB0ZXh0LWFsaWduOiBsZWZ0O1xuICB9XG4gIC50YWcge1xuICAgICAgd2lkdGg6MTY1cHg7XG4gICAgICBkaXNwbGF5OmlubGluZS1ibG9jaztcbiAgfVxuICAudGV4dC1wcmltYXJ5IHtcbiAgICAgIG1hcmdpbi1yaWdodDo1cHg7XG4gIH1cbiAgQG1lZGlhIChtYXgtd2lkdGg6IDc2N3B4KSB7XG4gICAgZm9udC1zaXplOiAxNnB4O1xuICAgIHdpZHRoOiAyNjBweDtcbiAgICAudGFnIHtcbiAgICAgIHdpZHRoOjk1cHg7XG4gICAgfVxuICB9XG59XG5cbkBtZWRpYSAobWF4LXdpZHRoOiA5OTFweCkge1xuICAubmF2YmFyLWhlYWRlciB7XG4gICAgZmxvYXQ6IG5vbmU7XG4gIH1cblxuICAubmF2YmFyLXRvZ2dsZSB7XG4gICAgZGlzcGxheTogYmxvY2s7XG4gIH1cblxuICAubmF2YmFyLWNvbGxhcHNlLmNvbGxhcHNlIHtcbiAgICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7XG4gIH1cblxuICAubmF2YmFyLW5hdiB7XG4gICAgbWFyZ2luLXRvcDogMDtcbiAgfVxuXG4gIC5uYXZiYXItbmF2ID4gbGkge1xuICAgIGZsb2F0OiBub25lO1xuICB9XG5cbiAgLm5hdmJhci1uYXYgPiBsaSA+IGEge1xuICAgIHBhZGRpbmctdG9wOiAxMHB4O1xuICAgIHBhZGRpbmctYm90dG9tOiAxMHB4O1xuICB9XG5cbiAgLm5hdmJhci10ZXh0IHtcbiAgICBmbG9hdDogbm9uZTtcbiAgICBtYXJnaW46IDE1cHggMDtcbiAgfVxuXG4gIC8qIHNpbmNlIDMuMS4wICovXG4gIC5uYXZiYXItY29sbGFwc2UuY29sbGFwc2UuaW4ge1xuICAgIGRpc3BsYXk6IGJsb2NrICFpbXBvcnRhbnQ7XG4gIH1cblxuICAuY29sbGFwc2luZyB7XG4gICAgb3ZlcmZsb3c6IGhpZGRlbiAhaW1wb3J0YW50O1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICBsZWZ0OiAwO1xuICAgIHJpZ2h0OiAwO1xuICB9XG59XG5cbi5uYXZiYXItdG9nZ2xlIHtcbiAgd2lkdGg6IDgwcHg7XG4gIHBhZGRpbmctbGVmdDogMDtcbiAgcGFkZGluZy1yaWdodDogOHB4O1xuICBtYXJnaW46IDdweCAycHggN3B4IDA7XG4gIHRleHQtYWxpZ246IGxlZnQ7XG4gIGZvbnQtc2l6ZTogMTBweDtcbn1cblxuLmhhbWJ1cmdlci10ZXh0IHtcbiAgbGluZS1oZWlnaHQ6IDAuNzVlbTtcbiAgbWFyZ2luLXRvcDogMTBweDtcbiAgZm9udC1zaXplOiAxOHB4O1xufVxuXG4uc3RvcnktbGlzdCB7XG4gIHBhZGRpbmctYm90dG9tOiAzMHB4O1xuICBtYXJnaW4tYm90dG9tOiAzMHB4O1xufVxuXG4uYnV0dG9uLXNwYWNlciB7XG4gIHBhZGRpbmc6IDVweCAwO1xufVxuXG4uc3BhY2VyIHtcbiAgcGFkZGluZzogMTVweCAwIDE1cHggMDtcbn1cblxuLmltZy1uZXdzIHtcbiAgd2lkdGg6IDUwcHg7XG4gIGhlaWdodDogNTBweDtcbn1cblxuLnVybC1wcmV2aWV3IHtcbiAgbWF4LXdpZHRoOiAyNTBweDtcbiAgbWF4LWhlaWdodDogMjUwcHg7XG59XG5cbi8vLm1lZGlhIH4gLm1lZGlhIC5tZWRpYS1ib2R5LXdyYXBwZXI6bnRoLWNoaWxkKG9kZCkge1xuLy8gIGJhY2tncm91bmQtY29sb3I6ICNlNWU1ZTU7XG4vL31cblxuLm5ld3MtYm94IHtcbiAgQG1lZGlhIChtaW4td2lkdGg6IDc2OHB4KSB7XG4gICAgbWFyZ2luLXRvcDogLTQwcHg7XG4gIH1cbiAgQG1lZGlhIChtYXgtd2lkdGg6IDc2N3B4KSB7XG4gICAgcGFkZGluZzogNXB4O1xuICAgIGJvcmRlci1jb2xvcjogQGJyYW5kLWluZm87XG4gICAgYm9yZGVyLXdpZHRoOiAxcHg7XG4gICAgYm9yZGVyLXN0eWxlOiBzb2xpZDtcbiAgICBib3JkZXItcmFkaXVzOiA1cHg7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgZmxvYXQ6IGxlZnQ7XG4gIH1cbn1cblxuLm5ld3MtYm94LXNlYXJjaCB7XG4gIEBtZWRpYSAobWluLXdpZHRoOiA3NjhweCkge1xuICAgIG1hcmdpbi10b3A6IC0zMHB4O1xuICAgIHBhZGRpbmctYm90dG9tOiAyMHB4O1xuICB9XG4gIEBtZWRpYSAobWF4LXdpZHRoOiA3NjdweCkge1xuICAgIHBhZGRpbmc6IDVweDtcbiAgICBib3JkZXItY29sb3I6IEBicmFuZC1pbmZvO1xuICAgIGJvcmRlci13aWR0aDogMXB4O1xuICAgIGJvcmRlci1zdHlsZTogc29saWQ7XG4gICAgYm9yZGVyLXJhZGl1czogNXB4O1xuICAgIHdpZHRoOiAxMDAlO1xuICAgIGZsb2F0OiBsZWZ0O1xuICB9XG59XG5cbi5zdG9yeS1oZWFkbGluZSB7XG4gIGZvbnQtc2l6ZTogMjBweDtcbiAgbWFyZ2luLWxlZnQ6IDE0cHg7XG4gIG1hcmdpbi10b3A6IC01cHg7XG59XG5cbi5sYW5kaW5nLWhlYWRpbmcge1xuICBmb250LXNpemU6IDUwcHggIWltcG9ydGFudDtcbiAgZm9udC1mYW1pbHk6IEdlb3JnaWE7XG59XG5cbi5tb2JpbGUtc3RvcnktaGVhZGxpbmUge1xuICBmb250LXNpemU6IDIwcHg7XG59XG5cbi5zdG9yeS1ieWxpbmUge1xuICBtYXJnaW4tdG9wOiA1cHg7XG4gIGZvbnQtc2l6ZTogMTRweDtcbn1cblxuLm1lZGlhLXN0b3JpZXMge1xuICBtYXJnaW4tbGVmdDogMjBweDtcbn1cblxuaHIge1xuICBib3JkZXI6IDA7XG4gIGhlaWdodDogMXB4O1xuICBiYWNrZ3JvdW5kLWltYWdlOiBsaW5lYXItZ3JhZGllbnQodG8gcmlnaHQsIHJnYmEoMCwgMCwgMCwgMCksIHJnYmEoMCwgMCwgMCwgMC43NSksIHJnYmEoMCwgMCwgMCwgMCkpO1xufVxuXG4uYmlnLXNwYWNlciB7XG4gIHBhZGRpbmc6IDMwcHggMCAzMHB4IDA7XG59XG5cbiNyZXBseS10by1tYWluLXBvc3QsICN1cHZvdGUge1xuICBjdXJzb3I6IHBvaW50ZXI7XG59XG5cbi5idG4tbm8tc2hhZG93IHtcbiAgLXdlYmtpdC1ib3gtc2hhZG93OiAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDApO1xuICAtbW96LWJveC1zaGFkb3c6ICAgIDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMCk7XG4gIGJveC1zaGFkb3c6ICAgICAgICAgMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwKTtcbn1cblxuLmRvdHRlZC11bmRlcmxpbmUge1xuICBib3JkZXItYm90dG9tOiBkYXNoZWQgMXB4IEBicmFuZC1zdWNjZXNzO1xufVxuXG4uZDMtY2VudGVyZWQge1xuICB3aWR0aDogNzcxcHg7XG4gIG1hcmdpbjogMCBhdXRvO1xufVxuXG4uY2FsLWhlYXRtYXAtY29udGFpbmVyIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogQGJvZHktYmc7XG59XG5cbi5pbnRlcmVzdGVkLWNhbXBlci1pbWFnZSB7XG4gIGhlaWdodDogNTBweDtcbiAgd2lkdGg6IDUwcHg7XG4gIHBhZGRpbmc6IDVweDtcbn1cblxuLm1vYmlsZS1zdG9yeS1pbWFnZSB7XG4gIGJvcmRlci1yYWRpdXM6IDVweDtcbiAgd2lkdGg6IDEwMCU7XG4gIEBtZWRpYSAobWF4LXdpZHRoOiA3NjhweCkge1xuICAgIG1hcmdpbi1yaWdodDogNXB4O1xuICB9XG59XG5cbi5hbGVydCBhIHtcbiAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7XG59XG5cbi5zdGVwLXRleHQge1xuICBsaW5lLWhlaWdodDogMTIwJTtcbiAgcGFkZGluZy1ib3R0b206IDEwcHg7XG59XG5cbi5mYWRlZCB7XG4gIG9wYWNpdHk6IDAuNTtcbn1cblxuLnNsaWdodGx5LWZhZGVkIHtcbiAgb3BhY2l0eTogMC43NTtcbn1cblxuLnBhZGRlZC1pb25pYy1pY29uIHtcbiAgcGFkZGluZy10b3A6IDVweDtcbn1cblxuLmNoZWNrbGlzdC1lbGVtZW50IHtcbiAgICBtYXJnaW4tbGVmdDogLTYwcHg7XG4gICAgbWFyZ2luLXJpZ2h0OiAtMjBweDtcbn1cblxuLnByb2ZpbGUtc29jaWFsLWljb25zIHtcbiAgbWFyZ2luLWxlZnQ6IDhweDtcbn1cblxuLmJvcmRlci1yYWRpdXMtNSB7XG4gIGJvcmRlci1yYWRpdXM6IDVweDtcbn1cblxuY29kZSB7XG4gIHBhZGRpbmc6IDA7XG59XG5cbkBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1pbi13aWR0aDogOTkzcHgpIHtcbiAgLmlmcmFtZS1zY3JvbGwge1xuICAgIHotaW5kZXg6IDE7XG4gIH1cbn1cbkBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1heC13aWR0aDogOTkycHgpIHtcbiAgLmlmcmFtZS1zY3JvbGwge1xuICAgIGhlaWdodDogYXV0bztcbiAgICBvdmVyZmxvdzogYXV0bztcbiAgfVxufVxuXG4vLyBDYWxjdWxhdG9yIHN0eWxlc1xuXG4uY2hhcnQgcmVjdCB7XG4gIGZpbGw6IHN0ZWVsYmx1ZTtcbn1cblxuLmNoYXJ0IHRleHQge1xuICBmb250LXNpemU6IDE0cHg7XG4gIHRleHQtYW5jaG9yOiBlbmQ7XG59XG5cbi5heGlzIHBhdGgsXG4uYXhpcyBsaW5lIHtcbiAgZmlsbDogbm9uZTtcbiAgc3Ryb2tlOiAjMTIxNDAxO1xuICBzdHJva2Utd2lkdGg6IDJweDtcbiAgc2hhcGUtcmVuZGVyaW5nOiBjcmlzcEVkZ2VzO1xufVxuXG4uZ2l0dGVyLWNoYXQtZW1iZWQge1xuIHotaW5kZXg6IDIwMDAwICFpbXBvcnRhbnQ7XG59XG5cblxuLy91bmNvbW1lbnQgdGhpcyB0byBzZWUgdGhlIGRpbWVuc2lvbnMgb2YgYWxsIGVsZW1lbnRzIG91dGxpbmVkIGluIHJlZFxuLy8qIHtcbi8vICBib3JkZXItY29sb3I6IHJlZDtcbi8vICBib3JkZXItd2lkdGg6IDFweDtcbi8vICBib3JkZXItc3R5bGU6IHNvbGlkO1xuLy99XG5cbi8vIHNvdXJjZTogaHR0cHM6Ly9naXRodWIuY29tL2psb25nL2Nzcy1zcGlubmVycy9ibG9iL21hc3Rlci9jc3Mvc3Bpbm5lci9pbm5lci1jaXJjbGVzLmNzc1xuLy8gbGljZW5zZSBNSVRcbi8qIDpub3QoOnJlcXVpcmVkKSBoaWRlcyB0aGlzIHJ1bGUgZnJvbSBJRTkgYW5kIGJlbG93ICovXG4uaW5uZXItY2lyY2xlcy1sb2FkZXI6bm90KDpyZXF1aXJlZCkge1xuICAtbW96LXRyYW5zZm9ybTogdHJhbnNsYXRlM2QoMCwgMCwgMCk7XG4gIC1tcy10cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDAsIDAsIDApO1xuICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlM2QoMCwgMCwgMCk7XG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlM2QoMCwgMCwgMCk7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICB3aWR0aDogMTI1cHg7XG4gIGhlaWdodDogMTI1cHg7XG4gIGJhY2tncm91bmQ6IHJnYmEoMjUsIDE2NSwgMTUyLCAwLjUpO1xuICBib3JkZXItcmFkaXVzOiA1MCU7XG4gIG92ZXJmbG93OiBoaWRkZW47XG4gIHRleHQtaW5kZW50OiAtOTk5OXB4O1xuICBtYXJnaW4tdG9wOiAxMCU7XG4gIC8qIEhpZGVzIGlubmVyIGNpcmNsZXMgb3V0c2lkZSBiYXNlIGNpcmNsZSBhdCBzYWZhcmkgKi9cbiAgLXdlYmtpdC1tYXNrLWltYWdlOiB1cmwoZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFBRUFBQUFCQ0FJQUFBQ1FkMVBlQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUFBNUpSRUZVZU5waVlHQmdBQWd3QUFBRUFBR2JBK29KQUFBQUFFbEZUa1N1UW1DQyk7XG59XG4uaW5uZXItY2lyY2xlcy1sb2FkZXI6bm90KDpyZXF1aXJlZCk6YmVmb3JlLCAuaW5uZXItY2lyY2xlcy1sb2FkZXI6bm90KDpyZXF1aXJlZCk6YWZ0ZXIge1xuICBjb250ZW50OiAnJztcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB0b3A6IDA7XG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgd2lkdGg6IDEyNXB4O1xuICBoZWlnaHQ6IDEyNXB4O1xuICBib3JkZXItcmFkaXVzOiA1MCU7XG59XG4uaW5uZXItY2lyY2xlcy1sb2FkZXI6bm90KDpyZXF1aXJlZCk6YmVmb3JlIHtcbiAgLW1vei1hbmltYXRpb246IGlubmVyLWNpcmNsZXMtbG9hZGVyIDNzIGluZmluaXRlO1xuICAtd2Via2l0LWFuaW1hdGlvbjogaW5uZXItY2lyY2xlcy1sb2FkZXIgM3MgaW5maW5pdGU7XG4gIGFuaW1hdGlvbjogaW5uZXItY2lyY2xlcy1sb2FkZXIgM3MgaW5maW5pdGU7XG4gIC1tb3otdHJhbnNmb3JtLW9yaWdpbjogMCA1MCU7XG4gIC1tcy10cmFuc2Zvcm0tb3JpZ2luOiAwIDUwJTtcbiAgLXdlYmtpdC10cmFuc2Zvcm0tb3JpZ2luOiAwIDUwJTtcbiAgdHJhbnNmb3JtLW9yaWdpbjogMCA1MCU7XG4gIGxlZnQ6IDA7XG4gIGJhY2tncm91bmQ6ICNjN2VmY2Y7XG59XG4uaW5uZXItY2lyY2xlcy1sb2FkZXI6bm90KDpyZXF1aXJlZCk6YWZ0ZXIge1xuICAtbW96LWFuaW1hdGlvbjogaW5uZXItY2lyY2xlcy1sb2FkZXIgM3MgMC4ycyByZXZlcnNlIGluZmluaXRlO1xuICAtd2Via2l0LWFuaW1hdGlvbjogaW5uZXItY2lyY2xlcy1sb2FkZXIgM3MgMC4ycyByZXZlcnNlIGluZmluaXRlO1xuICBhbmltYXRpb246IGlubmVyLWNpcmNsZXMtbG9hZGVyIDNzIDAuMnMgcmV2ZXJzZSBpbmZpbml0ZTtcbiAgLW1vei10cmFuc2Zvcm0tb3JpZ2luOiAxMDAlIDUwJTtcbiAgLW1zLXRyYW5zZm9ybS1vcmlnaW46IDEwMCUgNTAlO1xuICAtd2Via2l0LXRyYW5zZm9ybS1vcmlnaW46IDEwMCUgNTAlO1xuICB0cmFuc2Zvcm0tb3JpZ2luOiAxMDAlIDUwJTtcbiAgcmlnaHQ6IDA7XG4gIGJhY2tncm91bmQ6ICNlZWY1ZGI7XG59XG5cbkAtbW96LWtleWZyYW1lcyBpbm5lci1jaXJjbGVzLWxvYWRlciB7XG4gIDAlIHtcbiAgICAtbW96LXRyYW5zZm9ybTogcm90YXRlKDBkZWcpO1xuICAgIHRyYW5zZm9ybTogcm90YXRlKDBkZWcpO1xuICB9XG4gIDUwJSB7XG4gICAgLW1vei10cmFuc2Zvcm06IHJvdGF0ZSgzNjBkZWcpO1xuICAgIHRyYW5zZm9ybTogcm90YXRlKDM2MGRlZyk7XG4gIH1cbiAgMTAwJSB7XG4gICAgLW1vei10cmFuc2Zvcm06IHJvdGF0ZSgwZGVnKTtcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgwZGVnKTtcbiAgfVxufVxuQC13ZWJraXQta2V5ZnJhbWVzIGlubmVyLWNpcmNsZXMtbG9hZGVyIHtcbiAgMCUge1xuICAgIC13ZWJraXQtdHJhbnNmb3JtOiByb3RhdGUoMGRlZyk7XG4gICAgdHJhbnNmb3JtOiByb3RhdGUoMGRlZyk7XG4gIH1cbiAgNTAlIHtcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKDM2MGRlZyk7XG4gICAgdHJhbnNmb3JtOiByb3RhdGUoMzYwZGVnKTtcbiAgfVxuICAxMDAlIHtcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKDBkZWcpO1xuICAgIHRyYW5zZm9ybTogcm90YXRlKDBkZWcpO1xuICB9XG59XG5Aa2V5ZnJhbWVzIGlubmVyLWNpcmNsZXMtbG9hZGVyIHtcbiAgMCUge1xuICAgIC1tb3otdHJhbnNmb3JtOiByb3RhdGUoMGRlZyk7XG4gICAgLW1zLXRyYW5zZm9ybTogcm90YXRlKDBkZWcpO1xuICAgIC13ZWJraXQtdHJhbnNmb3JtOiByb3RhdGUoMGRlZyk7XG4gICAgdHJhbnNmb3JtOiByb3RhdGUoMGRlZyk7XG4gIH1cbiAgNTAlIHtcbiAgICAtbW96LXRyYW5zZm9ybTogcm90YXRlKDM2MGRlZyk7XG4gICAgLW1zLXRyYW5zZm9ybTogcm90YXRlKDM2MGRlZyk7XG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZSgzNjBkZWcpO1xuICAgIHRyYW5zZm9ybTogcm90YXRlKDM2MGRlZyk7XG4gIH1cbiAgMTAwJSB7XG4gICAgLW1vei10cmFuc2Zvcm06IHJvdGF0ZSgwZGVnKTtcbiAgICAtbXMtdHJhbnNmb3JtOiByb3RhdGUoMGRlZyk7XG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZSgwZGVnKTtcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgwZGVnKTtcbiAgfVxufVxuXG5AaW1wb3J0IFwiY2hhdC5sZXNzXCI7XG5AaW1wb3J0IFwiam9icy5sZXNzXCI7XG5AaW1wb3J0IFwiY2hhbGxlbmdlLmxlc3NcIjtcbkBpbXBvcnQgXCJ0b2FzdHIubGVzc1wiO1xuQGltcG9ydCBcIm1hcC5sZXNzXCI7XG5AaW1wb3J0IFwid2lraS5sZXNzXCI7XG5AaW1wb3J0IFwic2lnbmluLmxlc3NcIjtcbiIsIi8vIElvbmljb25zIEZvbnQgUGF0aFxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuQGZvbnQtZmFjZSB7XG4gIGZvbnQtZmFtaWx5OiBAaW9uaWNvbnMtZm9udC1mYW1pbHk7XG4gIHNyYzp1cmwoXCJAe2lvbmljb25zLWZvbnQtcGF0aH0vaW9uaWNvbnMuZW90P3Y9QHtpb25pY29ucy12ZXJzaW9ufVwiKTtcbiAgc3JjOnVybChcIkB7aW9uaWNvbnMtZm9udC1wYXRofS9pb25pY29ucy5lb3Q/dj1Ae2lvbmljb25zLXZlcnNpb259I2llZml4XCIpIGZvcm1hdChcImVtYmVkZGVkLW9wZW50eXBlXCIpLFxuICB1cmwoXCJAe2lvbmljb25zLWZvbnQtcGF0aH0vaW9uaWNvbnMudHRmP3Y9QHtpb25pY29ucy12ZXJzaW9ufVwiKSBmb3JtYXQoXCJ0cnVldHlwZVwiKSxcbiAgdXJsKFwiQHtpb25pY29ucy1mb250LXBhdGh9L2lvbmljb25zLndvZmY/dj1Ae2lvbmljb25zLXZlcnNpb259XCIpIGZvcm1hdChcIndvZmZcIiksXG4gIHVybChcIkB7aW9uaWNvbnMtZm9udC1wYXRofS9pb25pY29ucy5zdmc/dj1Ae2lvbmljb25zLXZlcnNpb259I0lvbmljb25zXCIpIGZvcm1hdChcInN2Z1wiKTtcbiAgZm9udC13ZWlnaHQ6IG5vcm1hbDtcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xufVxuXG4uaW9uIHtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICBmb250LWZhbWlseTogQGlvbmljb25zLWZvbnQtZmFtaWx5O1xuICBzcGVhazogbm9uZTtcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xuICBmb250LXdlaWdodDogbm9ybWFsO1xuICBmb250LXZhcmlhbnQ6IG5vcm1hbDtcbiAgdGV4dC10cmFuc2Zvcm06IG5vbmU7XG4gIHRleHQtcmVuZGVyaW5nOiBhdXRvO1xuICBsaW5lLWhlaWdodDogMTtcbiAgLXdlYmtpdC1mb250LXNtb290aGluZzogYW50aWFsaWFzZWQ7XG4gIC1tb3otb3N4LWZvbnQtc21vb3RoaW5nOiBncmF5c2NhbGU7XG59IiwiLyohXG5Jb25pY29ucywgdjIuMC4wXG5DcmVhdGVkIGJ5IEJlbiBTcGVycnkgZm9yIHRoZSBJb25pYyBGcmFtZXdvcmssIGh0dHA6Ly9pb25pY29ucy5jb20vXG5odHRwczovL3R3aXR0ZXIuY29tL2JlbmpzcGVycnkgIGh0dHBzOi8vdHdpdHRlci5jb20vaW9uaWNmcmFtZXdvcmtcbk1JVCBMaWNlbnNlOiBodHRwczovL2dpdGh1Yi5jb20vZHJpZnR5Y28vaW9uaWNvbnNcbiovXG4vLyBJb25pY29ucyBWYXJpYWJsZXNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbkBpb25pY29ucy1mb250LXBhdGg6IFwiLi4vZm9udHNcIjtcbkBpb25pY29ucy1mb250LWZhbWlseTogXCJJb25pY29uc1wiO1xuQGlvbmljb25zLXZlcnNpb246IFwiMi4wLjBcIjtcbkBpb25pY29ucy1wcmVmaXg6IGlvbi07XG5cbkBpb25pY29uLXZhci1hbGVydDogXCJcXGYxMDFcIjtcbkBpb25pY29uLXZhci1hbGVydC1jaXJjbGVkOiBcIlxcZjEwMFwiO1xuQGlvbmljb24tdmFyLWFuZHJvaWQtYWRkOiBcIlxcZjJjN1wiO1xuQGlvbmljb24tdmFyLWFuZHJvaWQtYWRkLWNpcmNsZTogXCJcXGYzNTlcIjtcbkBpb25pY29uLXZhci1hbmRyb2lkLWFsYXJtLWNsb2NrOiBcIlxcZjM1YVwiO1xuQGlvbmljb24tdmFyLWFuZHJvaWQtYWxlcnQ6IFwiXFxmMzViXCI7XG5AaW9uaWNvbi12YXItYW5kcm9pZC1hcHBzOiBcIlxcZjM1Y1wiO1xuQGlvbmljb24tdmFyLWFuZHJvaWQtYXJjaGl2ZTogXCJcXGYyYzlcIjtcbkBpb25pY29uLXZhci1hbmRyb2lkLWFycm93LWJhY2s6IFwiXFxmMmNhXCI7XG5AaW9uaWNvbi12YXItYW5kcm9pZC1hcnJvdy1kb3duOiBcIlxcZjM1ZFwiO1xuQGlvbmljb24tdmFyLWFuZHJvaWQtYXJyb3ctZHJvcGRvd246IFwiXFxmMzVmXCI7XG5AaW9uaWNvbi12YXItYW5kcm9pZC1hcnJvdy1kcm9wZG93bi1jaXJjbGU6IFwiXFxmMzVlXCI7XG5AaW9uaWNvbi12YXItYW5kcm9pZC1hcnJvdy1kcm9wbGVmdDogXCJcXGYzNjFcIjtcbkBpb25pY29uLXZhci1hbmRyb2lkLWFycm93LWRyb3BsZWZ0LWNpcmNsZTogXCJcXGYzNjBcIjtcbkBpb25pY29uLXZhci1hbmRyb2lkLWFycm93LWRyb3ByaWdodDogXCJcXGYzNjNcIjtcbkBpb25pY29uLXZhci1hbmRyb2lkLWFycm93LWRyb3ByaWdodC1jaXJjbGU6IFwiXFxmMzYyXCI7XG5AaW9uaWNvbi12YXItYW5kcm9pZC1hcnJvdy1kcm9wdXA6IFwiXFxmMzY1XCI7XG5AaW9uaWNvbi12YXItYW5kcm9pZC1hcnJvdy1kcm9wdXAtY2lyY2xlOiBcIlxcZjM2NFwiO1xuQGlvbmljb24tdmFyLWFuZHJvaWQtYXJyb3ctZm9yd2FyZDogXCJcXGYzMGZcIjtcbkBpb25pY29uLXZhci1hbmRyb2lkLWFycm93LXVwOiBcIlxcZjM2NlwiO1xuQGlvbmljb24tdmFyLWFuZHJvaWQtYXR0YWNoOiBcIlxcZjM2N1wiO1xuQGlvbmljb24tdmFyLWFuZHJvaWQtYmFyOiBcIlxcZjM2OFwiO1xuQGlvbmljb24tdmFyLWFuZHJvaWQtYmljeWNsZTogXCJcXGYzNjlcIjtcbkBpb25pY29uLXZhci1hbmRyb2lkLWJvYXQ6IFwiXFxmMzZhXCI7XG5AaW9uaWNvbi12YXItYW5kcm9pZC1ib29rbWFyazogXCJcXGYzNmJcIjtcbkBpb25pY29uLXZhci1hbmRyb2lkLWJ1bGI6IFwiXFxmMzZjXCI7XG5AaW9uaWNvbi12YXItYW5kcm9pZC1idXM6IFwiXFxmMzZkXCI7XG5AaW9uaWNvbi12YXItYW5kcm9pZC1jYWxlbmRhcjogXCJcXGYyZDFcIjtcbkBpb25pY29uLXZhci1hbmRyb2lkLWNhbGw6IFwiXFxmMmQyXCI7XG5AaW9uaWNvbi12YXItYW5kcm9pZC1jYW1lcmE6IFwiXFxmMmQzXCI7XG5AaW9uaWNvbi12YXItYW5kcm9pZC1jYW5jZWw6IFwiXFxmMzZlXCI7XG5AaW9uaWNvbi12YXItYW5kcm9pZC1jYXI6IFwiXFxmMzZmXCI7XG5AaW9uaWNvbi12YXItYW5kcm9pZC1jYXJ0OiBcIlxcZjM3MFwiO1xuQGlvbmljb24tdmFyLWFuZHJvaWQtY2hhdDogXCJcXGYyZDRcIjtcbkBpb25pY29uLXZhci1hbmRyb2lkLWNoZWNrYm94OiBcIlxcZjM3NFwiO1xuQGlvbmljb24tdmFyLWFuZHJvaWQtY2hlY2tib3gtYmxhbms6IFwiXFxmMzcxXCI7XG5AaW9uaWNvbi12YXItYW5kcm9pZC1jaGVja2JveC1vdXRsaW5lOiBcIlxcZjM3M1wiO1xuQGlvbmljb24tdmFyLWFuZHJvaWQtY2hlY2tib3gtb3V0bGluZS1ibGFuazogXCJcXGYzNzJcIjtcbkBpb25pY29uLXZhci1hbmRyb2lkLWNoZWNrbWFyay1jaXJjbGU6IFwiXFxmMzc1XCI7XG5AaW9uaWNvbi12YXItYW5kcm9pZC1jbGlwYm9hcmQ6IFwiXFxmMzc2XCI7XG5AaW9uaWNvbi12YXItYW5kcm9pZC1jbG9zZTogXCJcXGYyZDdcIjtcbkBpb25pY29uLXZhci1hbmRyb2lkLWNsb3VkOiBcIlxcZjM3YVwiO1xuQGlvbmljb24tdmFyLWFuZHJvaWQtY2xvdWQtY2lyY2xlOiBcIlxcZjM3N1wiO1xuQGlvbmljb24tdmFyLWFuZHJvaWQtY2xvdWQtZG9uZTogXCJcXGYzNzhcIjtcbkBpb25pY29uLXZhci1hbmRyb2lkLWNsb3VkLW91dGxpbmU6IFwiXFxmMzc5XCI7XG5AaW9uaWNvbi12YXItYW5kcm9pZC1jb2xvci1wYWxldHRlOiBcIlxcZjM3YlwiO1xuQGlvbmljb24tdmFyLWFuZHJvaWQtY29tcGFzczogXCJcXGYzN2NcIjtcbkBpb25pY29uLXZhci1hbmRyb2lkLWNvbnRhY3Q6IFwiXFxmMmQ4XCI7XG5AaW9uaWNvbi12YXItYW5kcm9pZC1jb250YWN0czogXCJcXGYyZDlcIjtcbkBpb25pY29uLXZhci1hbmRyb2lkLWNvbnRyYWN0OiBcIlxcZjM3ZFwiO1xuQGlvbmljb24tdmFyLWFuZHJvaWQtY3JlYXRlOiBcIlxcZjM3ZVwiO1xuQGlvbmljb24tdmFyLWFuZHJvaWQtZGVsZXRlOiBcIlxcZjM3ZlwiO1xuQGlvbmljb24tdmFyLWFuZHJvaWQtZGVza3RvcDogXCJcXGYzODBcIjtcbkBpb25pY29uLXZhci1hbmRyb2lkLWRvY3VtZW50OiBcIlxcZjM4MVwiO1xuQGlvbmljb24tdmFyLWFuZHJvaWQtZG9uZTogXCJcXGYzODNcIjtcbkBpb25pY29uLXZhci1hbmRyb2lkLWRvbmUtYWxsOiBcIlxcZjM4MlwiO1xuQGlvbmljb24tdmFyLWFuZHJvaWQtZG93bmxvYWQ6IFwiXFxmMmRkXCI7XG5AaW9uaWNvbi12YXItYW5kcm9pZC1kcmFmdHM6IFwiXFxmMzg0XCI7XG5AaW9uaWNvbi12YXItYW5kcm9pZC1leGl0OiBcIlxcZjM4NVwiO1xuQGlvbmljb24tdmFyLWFuZHJvaWQtZXhwYW5kOiBcIlxcZjM4NlwiO1xuQGlvbmljb24tdmFyLWFuZHJvaWQtZmF2b3JpdGU6IFwiXFxmMzg4XCI7XG5AaW9uaWNvbi12YXItYW5kcm9pZC1mYXZvcml0ZS1vdXRsaW5lOiBcIlxcZjM4N1wiO1xuQGlvbmljb24tdmFyLWFuZHJvaWQtZmlsbTogXCJcXGYzODlcIjtcbkBpb25pY29uLXZhci1hbmRyb2lkLWZvbGRlcjogXCJcXGYyZTBcIjtcbkBpb25pY29uLXZhci1hbmRyb2lkLWZvbGRlci1vcGVuOiBcIlxcZjM4YVwiO1xuQGlvbmljb24tdmFyLWFuZHJvaWQtZnVubmVsOiBcIlxcZjM4YlwiO1xuQGlvbmljb24tdmFyLWFuZHJvaWQtZ2xvYmU6IFwiXFxmMzhjXCI7XG5AaW9uaWNvbi12YXItYW5kcm9pZC1oYW5kOiBcIlxcZjJlM1wiO1xuQGlvbmljb24tdmFyLWFuZHJvaWQtaGFuZ291dDogXCJcXGYzOGRcIjtcbkBpb25pY29uLXZhci1hbmRyb2lkLWhhcHB5OiBcIlxcZjM4ZVwiO1xuQGlvbmljb24tdmFyLWFuZHJvaWQtaG9tZTogXCJcXGYzOGZcIjtcbkBpb25pY29uLXZhci1hbmRyb2lkLWltYWdlOiBcIlxcZjJlNFwiO1xuQGlvbmljb24tdmFyLWFuZHJvaWQtbGFwdG9wOiBcIlxcZjM5MFwiO1xuQGlvbmljb24tdmFyLWFuZHJvaWQtbGlzdDogXCJcXGYzOTFcIjtcbkBpb25pY29uLXZhci1hbmRyb2lkLWxvY2F0ZTogXCJcXGYyZTlcIjtcbkBpb25pY29uLXZhci1hbmRyb2lkLWxvY2s6IFwiXFxmMzkyXCI7XG5AaW9uaWNvbi12YXItYW5kcm9pZC1tYWlsOiBcIlxcZjJlYlwiO1xuQGlvbmljb24tdmFyLWFuZHJvaWQtbWFwOiBcIlxcZjM5M1wiO1xuQGlvbmljb24tdmFyLWFuZHJvaWQtbWVudTogXCJcXGYzOTRcIjtcbkBpb25pY29uLXZhci1hbmRyb2lkLW1pY3JvcGhvbmU6IFwiXFxmMmVjXCI7XG5AaW9uaWNvbi12YXItYW5kcm9pZC1taWNyb3Bob25lLW9mZjogXCJcXGYzOTVcIjtcbkBpb25pY29uLXZhci1hbmRyb2lkLW1vcmUtaG9yaXpvbnRhbDogXCJcXGYzOTZcIjtcbkBpb25pY29uLXZhci1hbmRyb2lkLW1vcmUtdmVydGljYWw6IFwiXFxmMzk3XCI7XG5AaW9uaWNvbi12YXItYW5kcm9pZC1uYXZpZ2F0ZTogXCJcXGYzOThcIjtcbkBpb25pY29uLXZhci1hbmRyb2lkLW5vdGlmaWNhdGlvbnM6IFwiXFxmMzliXCI7XG5AaW9uaWNvbi12YXItYW5kcm9pZC1ub3RpZmljYXRpb25zLW5vbmU6IFwiXFxmMzk5XCI7XG5AaW9uaWNvbi12YXItYW5kcm9pZC1ub3RpZmljYXRpb25zLW9mZjogXCJcXGYzOWFcIjtcbkBpb25pY29uLXZhci1hbmRyb2lkLW9wZW46IFwiXFxmMzljXCI7XG5AaW9uaWNvbi12YXItYW5kcm9pZC1vcHRpb25zOiBcIlxcZjM5ZFwiO1xuQGlvbmljb24tdmFyLWFuZHJvaWQtcGVvcGxlOiBcIlxcZjM5ZVwiO1xuQGlvbmljb24tdmFyLWFuZHJvaWQtcGVyc29uOiBcIlxcZjNhMFwiO1xuQGlvbmljb24tdmFyLWFuZHJvaWQtcGVyc29uLWFkZDogXCJcXGYzOWZcIjtcbkBpb25pY29uLXZhci1hbmRyb2lkLXBob25lLWxhbmRzY2FwZTogXCJcXGYzYTFcIjtcbkBpb25pY29uLXZhci1hbmRyb2lkLXBob25lLXBvcnRyYWl0OiBcIlxcZjNhMlwiO1xuQGlvbmljb24tdmFyLWFuZHJvaWQtcGluOiBcIlxcZjNhM1wiO1xuQGlvbmljb24tdmFyLWFuZHJvaWQtcGxhbmU6IFwiXFxmM2E0XCI7XG5AaW9uaWNvbi12YXItYW5kcm9pZC1wbGF5c3RvcmU6IFwiXFxmMmYwXCI7XG5AaW9uaWNvbi12YXItYW5kcm9pZC1wcmludDogXCJcXGYzYTVcIjtcbkBpb25pY29uLXZhci1hbmRyb2lkLXJhZGlvLWJ1dHRvbi1vZmY6IFwiXFxmM2E2XCI7XG5AaW9uaWNvbi12YXItYW5kcm9pZC1yYWRpby1idXR0b24tb246IFwiXFxmM2E3XCI7XG5AaW9uaWNvbi12YXItYW5kcm9pZC1yZWZyZXNoOiBcIlxcZjNhOFwiO1xuQGlvbmljb24tdmFyLWFuZHJvaWQtcmVtb3ZlOiBcIlxcZjJmNFwiO1xuQGlvbmljb24tdmFyLWFuZHJvaWQtcmVtb3ZlLWNpcmNsZTogXCJcXGYzYTlcIjtcbkBpb25pY29uLXZhci1hbmRyb2lkLXJlc3RhdXJhbnQ6IFwiXFxmM2FhXCI7XG5AaW9uaWNvbi12YXItYW5kcm9pZC1zYWQ6IFwiXFxmM2FiXCI7XG5AaW9uaWNvbi12YXItYW5kcm9pZC1zZWFyY2g6IFwiXFxmMmY1XCI7XG5AaW9uaWNvbi12YXItYW5kcm9pZC1zZW5kOiBcIlxcZjJmNlwiO1xuQGlvbmljb24tdmFyLWFuZHJvaWQtc2V0dGluZ3M6IFwiXFxmMmY3XCI7XG5AaW9uaWNvbi12YXItYW5kcm9pZC1zaGFyZTogXCJcXGYyZjhcIjtcbkBpb25pY29uLXZhci1hbmRyb2lkLXNoYXJlLWFsdDogXCJcXGYzYWNcIjtcbkBpb25pY29uLXZhci1hbmRyb2lkLXN0YXI6IFwiXFxmMmZjXCI7XG5AaW9uaWNvbi12YXItYW5kcm9pZC1zdGFyLWhhbGY6IFwiXFxmM2FkXCI7XG5AaW9uaWNvbi12YXItYW5kcm9pZC1zdGFyLW91dGxpbmU6IFwiXFxmM2FlXCI7XG5AaW9uaWNvbi12YXItYW5kcm9pZC1zdG9wd2F0Y2g6IFwiXFxmMmZkXCI7XG5AaW9uaWNvbi12YXItYW5kcm9pZC1zdWJ3YXk6IFwiXFxmM2FmXCI7XG5AaW9uaWNvbi12YXItYW5kcm9pZC1zdW5ueTogXCJcXGYzYjBcIjtcbkBpb25pY29uLXZhci1hbmRyb2lkLXN5bmM6IFwiXFxmM2IxXCI7XG5AaW9uaWNvbi12YXItYW5kcm9pZC10ZXh0c21zOiBcIlxcZjNiMlwiO1xuQGlvbmljb24tdmFyLWFuZHJvaWQtdGltZTogXCJcXGYzYjNcIjtcbkBpb25pY29uLXZhci1hbmRyb2lkLXRyYWluOiBcIlxcZjNiNFwiO1xuQGlvbmljb24tdmFyLWFuZHJvaWQtdW5sb2NrOiBcIlxcZjNiNVwiO1xuQGlvbmljb24tdmFyLWFuZHJvaWQtdXBsb2FkOiBcIlxcZjNiNlwiO1xuQGlvbmljb24tdmFyLWFuZHJvaWQtdm9sdW1lLWRvd246IFwiXFxmM2I3XCI7XG5AaW9uaWNvbi12YXItYW5kcm9pZC12b2x1bWUtbXV0ZTogXCJcXGYzYjhcIjtcbkBpb25pY29uLXZhci1hbmRyb2lkLXZvbHVtZS1vZmY6IFwiXFxmM2I5XCI7XG5AaW9uaWNvbi12YXItYW5kcm9pZC12b2x1bWUtdXA6IFwiXFxmM2JhXCI7XG5AaW9uaWNvbi12YXItYW5kcm9pZC13YWxrOiBcIlxcZjNiYlwiO1xuQGlvbmljb24tdmFyLWFuZHJvaWQtd2FybmluZzogXCJcXGYzYmNcIjtcbkBpb25pY29uLXZhci1hbmRyb2lkLXdhdGNoOiBcIlxcZjNiZFwiO1xuQGlvbmljb24tdmFyLWFuZHJvaWQtd2lmaTogXCJcXGYzMDVcIjtcbkBpb25pY29uLXZhci1hcGVydHVyZTogXCJcXGYzMTNcIjtcbkBpb25pY29uLXZhci1hcmNoaXZlOiBcIlxcZjEwMlwiO1xuQGlvbmljb24tdmFyLWFycm93LWRvd24tYTogXCJcXGYxMDNcIjtcbkBpb25pY29uLXZhci1hcnJvdy1kb3duLWI6IFwiXFxmMTA0XCI7XG5AaW9uaWNvbi12YXItYXJyb3ctZG93bi1jOiBcIlxcZjEwNVwiO1xuQGlvbmljb24tdmFyLWFycm93LWV4cGFuZDogXCJcXGYyNWVcIjtcbkBpb25pY29uLXZhci1hcnJvdy1ncmFwaC1kb3duLWxlZnQ6IFwiXFxmMjVmXCI7XG5AaW9uaWNvbi12YXItYXJyb3ctZ3JhcGgtZG93bi1yaWdodDogXCJcXGYyNjBcIjtcbkBpb25pY29uLXZhci1hcnJvdy1ncmFwaC11cC1sZWZ0OiBcIlxcZjI2MVwiO1xuQGlvbmljb24tdmFyLWFycm93LWdyYXBoLXVwLXJpZ2h0OiBcIlxcZjI2MlwiO1xuQGlvbmljb24tdmFyLWFycm93LWxlZnQtYTogXCJcXGYxMDZcIjtcbkBpb25pY29uLXZhci1hcnJvdy1sZWZ0LWI6IFwiXFxmMTA3XCI7XG5AaW9uaWNvbi12YXItYXJyb3ctbGVmdC1jOiBcIlxcZjEwOFwiO1xuQGlvbmljb24tdmFyLWFycm93LW1vdmU6IFwiXFxmMjYzXCI7XG5AaW9uaWNvbi12YXItYXJyb3ctcmVzaXplOiBcIlxcZjI2NFwiO1xuQGlvbmljb24tdmFyLWFycm93LXJldHVybi1sZWZ0OiBcIlxcZjI2NVwiO1xuQGlvbmljb24tdmFyLWFycm93LXJldHVybi1yaWdodDogXCJcXGYyNjZcIjtcbkBpb25pY29uLXZhci1hcnJvdy1yaWdodC1hOiBcIlxcZjEwOVwiO1xuQGlvbmljb24tdmFyLWFycm93LXJpZ2h0LWI6IFwiXFxmMTBhXCI7XG5AaW9uaWNvbi12YXItYXJyb3ctcmlnaHQtYzogXCJcXGYxMGJcIjtcbkBpb25pY29uLXZhci1hcnJvdy1zaHJpbms6IFwiXFxmMjY3XCI7XG5AaW9uaWNvbi12YXItYXJyb3ctc3dhcDogXCJcXGYyNjhcIjtcbkBpb25pY29uLXZhci1hcnJvdy11cC1hOiBcIlxcZjEwY1wiO1xuQGlvbmljb24tdmFyLWFycm93LXVwLWI6IFwiXFxmMTBkXCI7XG5AaW9uaWNvbi12YXItYXJyb3ctdXAtYzogXCJcXGYxMGVcIjtcbkBpb25pY29uLXZhci1hc3RlcmlzazogXCJcXGYzMTRcIjtcbkBpb25pY29uLXZhci1hdDogXCJcXGYxMGZcIjtcbkBpb25pY29uLXZhci1iYWNrc3BhY2U6IFwiXFxmM2JmXCI7XG5AaW9uaWNvbi12YXItYmFja3NwYWNlLW91dGxpbmU6IFwiXFxmM2JlXCI7XG5AaW9uaWNvbi12YXItYmFnOiBcIlxcZjExMFwiO1xuQGlvbmljb24tdmFyLWJhdHRlcnktY2hhcmdpbmc6IFwiXFxmMTExXCI7XG5AaW9uaWNvbi12YXItYmF0dGVyeS1lbXB0eTogXCJcXGYxMTJcIjtcbkBpb25pY29uLXZhci1iYXR0ZXJ5LWZ1bGw6IFwiXFxmMTEzXCI7XG5AaW9uaWNvbi12YXItYmF0dGVyeS1oYWxmOiBcIlxcZjExNFwiO1xuQGlvbmljb24tdmFyLWJhdHRlcnktbG93OiBcIlxcZjExNVwiO1xuQGlvbmljb24tdmFyLWJlYWtlcjogXCJcXGYyNjlcIjtcbkBpb25pY29uLXZhci1iZWVyOiBcIlxcZjI2YVwiO1xuQGlvbmljb24tdmFyLWJsdWV0b290aDogXCJcXGYxMTZcIjtcbkBpb25pY29uLXZhci1ib25maXJlOiBcIlxcZjMxNVwiO1xuQGlvbmljb24tdmFyLWJvb2ttYXJrOiBcIlxcZjI2YlwiO1xuQGlvbmljb24tdmFyLWJvd3RpZTogXCJcXGYzYzBcIjtcbkBpb25pY29uLXZhci1icmllZmNhc2U6IFwiXFxmMjZjXCI7XG5AaW9uaWNvbi12YXItYnVnOiBcIlxcZjJiZVwiO1xuQGlvbmljb24tdmFyLWNhbGN1bGF0b3I6IFwiXFxmMjZkXCI7XG5AaW9uaWNvbi12YXItY2FsZW5kYXI6IFwiXFxmMTE3XCI7XG5AaW9uaWNvbi12YXItY2FtZXJhOiBcIlxcZjExOFwiO1xuQGlvbmljb24tdmFyLWNhcmQ6IFwiXFxmMTE5XCI7XG5AaW9uaWNvbi12YXItY2FzaDogXCJcXGYzMTZcIjtcbkBpb25pY29uLXZhci1jaGF0Ym94OiBcIlxcZjExYlwiO1xuQGlvbmljb24tdmFyLWNoYXRib3gtd29ya2luZzogXCJcXGYxMWFcIjtcbkBpb25pY29uLXZhci1jaGF0Ym94ZXM6IFwiXFxmMTFjXCI7XG5AaW9uaWNvbi12YXItY2hhdGJ1YmJsZTogXCJcXGYxMWVcIjtcbkBpb25pY29uLXZhci1jaGF0YnViYmxlLXdvcmtpbmc6IFwiXFxmMTFkXCI7XG5AaW9uaWNvbi12YXItY2hhdGJ1YmJsZXM6IFwiXFxmMTFmXCI7XG5AaW9uaWNvbi12YXItY2hlY2ttYXJrOiBcIlxcZjEyMlwiO1xuQGlvbmljb24tdmFyLWNoZWNrbWFyay1jaXJjbGVkOiBcIlxcZjEyMFwiO1xuQGlvbmljb24tdmFyLWNoZWNrbWFyay1yb3VuZDogXCJcXGYxMjFcIjtcbkBpb25pY29uLXZhci1jaGV2cm9uLWRvd246IFwiXFxmMTIzXCI7XG5AaW9uaWNvbi12YXItY2hldnJvbi1sZWZ0OiBcIlxcZjEyNFwiO1xuQGlvbmljb24tdmFyLWNoZXZyb24tcmlnaHQ6IFwiXFxmMTI1XCI7XG5AaW9uaWNvbi12YXItY2hldnJvbi11cDogXCJcXGYxMjZcIjtcbkBpb25pY29uLXZhci1jbGlwYm9hcmQ6IFwiXFxmMTI3XCI7XG5AaW9uaWNvbi12YXItY2xvY2s6IFwiXFxmMjZlXCI7XG5AaW9uaWNvbi12YXItY2xvc2U6IFwiXFxmMTJhXCI7XG5AaW9uaWNvbi12YXItY2xvc2UtY2lyY2xlZDogXCJcXGYxMjhcIjtcbkBpb25pY29uLXZhci1jbG9zZS1yb3VuZDogXCJcXGYxMjlcIjtcbkBpb25pY29uLXZhci1jbG9zZWQtY2FwdGlvbmluZzogXCJcXGYzMTdcIjtcbkBpb25pY29uLXZhci1jbG91ZDogXCJcXGYxMmJcIjtcbkBpb25pY29uLXZhci1jb2RlOiBcIlxcZjI3MVwiO1xuQGlvbmljb24tdmFyLWNvZGUtZG93bmxvYWQ6IFwiXFxmMjZmXCI7XG5AaW9uaWNvbi12YXItY29kZS13b3JraW5nOiBcIlxcZjI3MFwiO1xuQGlvbmljb24tdmFyLWNvZmZlZTogXCJcXGYyNzJcIjtcbkBpb25pY29uLXZhci1jb21wYXNzOiBcIlxcZjI3M1wiO1xuQGlvbmljb24tdmFyLWNvbXBvc2U6IFwiXFxmMTJjXCI7XG5AaW9uaWNvbi12YXItY29ubmVjdGlvbi1iYXJzOiBcIlxcZjI3NFwiO1xuQGlvbmljb24tdmFyLWNvbnRyYXN0OiBcIlxcZjI3NVwiO1xuQGlvbmljb24tdmFyLWNyb3A6IFwiXFxmM2MxXCI7XG5AaW9uaWNvbi12YXItY3ViZTogXCJcXGYzMThcIjtcbkBpb25pY29uLXZhci1kaXNjOiBcIlxcZjEyZFwiO1xuQGlvbmljb24tdmFyLWRvY3VtZW50OiBcIlxcZjEyZlwiO1xuQGlvbmljb24tdmFyLWRvY3VtZW50LXRleHQ6IFwiXFxmMTJlXCI7XG5AaW9uaWNvbi12YXItZHJhZzogXCJcXGYxMzBcIjtcbkBpb25pY29uLXZhci1lYXJ0aDogXCJcXGYyNzZcIjtcbkBpb25pY29uLXZhci1lYXNlbDogXCJcXGYzYzJcIjtcbkBpb25pY29uLXZhci1lZGl0OiBcIlxcZjJiZlwiO1xuQGlvbmljb24tdmFyLWVnZzogXCJcXGYyNzdcIjtcbkBpb25pY29uLXZhci1lamVjdDogXCJcXGYxMzFcIjtcbkBpb25pY29uLXZhci1lbWFpbDogXCJcXGYxMzJcIjtcbkBpb25pY29uLXZhci1lbWFpbC11bnJlYWQ6IFwiXFxmM2MzXCI7XG5AaW9uaWNvbi12YXItZXJsZW5tZXllci1mbGFzazogXCJcXGYzYzVcIjtcbkBpb25pY29uLXZhci1lcmxlbm1leWVyLWZsYXNrLWJ1YmJsZXM6IFwiXFxmM2M0XCI7XG5AaW9uaWNvbi12YXItZXllOiBcIlxcZjEzM1wiO1xuQGlvbmljb24tdmFyLWV5ZS1kaXNhYmxlZDogXCJcXGYzMDZcIjtcbkBpb25pY29uLXZhci1mZW1hbGU6IFwiXFxmMjc4XCI7XG5AaW9uaWNvbi12YXItZmlsaW5nOiBcIlxcZjEzNFwiO1xuQGlvbmljb24tdmFyLWZpbG0tbWFya2VyOiBcIlxcZjEzNVwiO1xuQGlvbmljb24tdmFyLWZpcmViYWxsOiBcIlxcZjMxOVwiO1xuQGlvbmljb24tdmFyLWZsYWc6IFwiXFxmMjc5XCI7XG5AaW9uaWNvbi12YXItZmxhbWU6IFwiXFxmMzFhXCI7XG5AaW9uaWNvbi12YXItZmxhc2g6IFwiXFxmMTM3XCI7XG5AaW9uaWNvbi12YXItZmxhc2gtb2ZmOiBcIlxcZjEzNlwiO1xuQGlvbmljb24tdmFyLWZvbGRlcjogXCJcXGYxMzlcIjtcbkBpb25pY29uLXZhci1mb3JrOiBcIlxcZjI3YVwiO1xuQGlvbmljb24tdmFyLWZvcmstcmVwbzogXCJcXGYyYzBcIjtcbkBpb25pY29uLXZhci1mb3J3YXJkOiBcIlxcZjEzYVwiO1xuQGlvbmljb24tdmFyLWZ1bm5lbDogXCJcXGYzMWJcIjtcbkBpb25pY29uLXZhci1nZWFyLWE6IFwiXFxmMTNkXCI7XG5AaW9uaWNvbi12YXItZ2Vhci1iOiBcIlxcZjEzZVwiO1xuQGlvbmljb24tdmFyLWdyaWQ6IFwiXFxmMTNmXCI7XG5AaW9uaWNvbi12YXItaGFtbWVyOiBcIlxcZjI3YlwiO1xuQGlvbmljb24tdmFyLWhhcHB5OiBcIlxcZjMxY1wiO1xuQGlvbmljb24tdmFyLWhhcHB5LW91dGxpbmU6IFwiXFxmM2M2XCI7XG5AaW9uaWNvbi12YXItaGVhZHBob25lOiBcIlxcZjE0MFwiO1xuQGlvbmljb24tdmFyLWhlYXJ0OiBcIlxcZjE0MVwiO1xuQGlvbmljb24tdmFyLWhlYXJ0LWJyb2tlbjogXCJcXGYzMWRcIjtcbkBpb25pY29uLXZhci1oZWxwOiBcIlxcZjE0M1wiO1xuQGlvbmljb24tdmFyLWhlbHAtYnVveTogXCJcXGYyN2NcIjtcbkBpb25pY29uLXZhci1oZWxwLWNpcmNsZWQ6IFwiXFxmMTQyXCI7XG5AaW9uaWNvbi12YXItaG9tZTogXCJcXGYxNDRcIjtcbkBpb25pY29uLXZhci1pY2VjcmVhbTogXCJcXGYyN2RcIjtcbkBpb25pY29uLXZhci1pbWFnZTogXCJcXGYxNDdcIjtcbkBpb25pY29uLXZhci1pbWFnZXM6IFwiXFxmMTQ4XCI7XG5AaW9uaWNvbi12YXItaW5mb3JtYXRpb246IFwiXFxmMTRhXCI7XG5AaW9uaWNvbi12YXItaW5mb3JtYXRpb24tY2lyY2xlZDogXCJcXGYxNDlcIjtcbkBpb25pY29uLXZhci1pb25pYzogXCJcXGYxNGJcIjtcbkBpb25pY29uLXZhci1pb3MtYWxhcm06IFwiXFxmM2M4XCI7XG5AaW9uaWNvbi12YXItaW9zLWFsYXJtLW91dGxpbmU6IFwiXFxmM2M3XCI7XG5AaW9uaWNvbi12YXItaW9zLWFsYnVtczogXCJcXGYzY2FcIjtcbkBpb25pY29uLXZhci1pb3MtYWxidW1zLW91dGxpbmU6IFwiXFxmM2M5XCI7XG5AaW9uaWNvbi12YXItaW9zLWFtZXJpY2FuZm9vdGJhbGw6IFwiXFxmM2NjXCI7XG5AaW9uaWNvbi12YXItaW9zLWFtZXJpY2FuZm9vdGJhbGwtb3V0bGluZTogXCJcXGYzY2JcIjtcbkBpb25pY29uLXZhci1pb3MtYW5hbHl0aWNzOiBcIlxcZjNjZVwiO1xuQGlvbmljb24tdmFyLWlvcy1hbmFseXRpY3Mtb3V0bGluZTogXCJcXGYzY2RcIjtcbkBpb25pY29uLXZhci1pb3MtYXJyb3ctYmFjazogXCJcXGYzY2ZcIjtcbkBpb25pY29uLXZhci1pb3MtYXJyb3ctZG93bjogXCJcXGYzZDBcIjtcbkBpb25pY29uLXZhci1pb3MtYXJyb3ctZm9yd2FyZDogXCJcXGYzZDFcIjtcbkBpb25pY29uLXZhci1pb3MtYXJyb3ctbGVmdDogXCJcXGYzZDJcIjtcbkBpb25pY29uLXZhci1pb3MtYXJyb3ctcmlnaHQ6IFwiXFxmM2QzXCI7XG5AaW9uaWNvbi12YXItaW9zLWFycm93LXRoaW4tZG93bjogXCJcXGYzZDRcIjtcbkBpb25pY29uLXZhci1pb3MtYXJyb3ctdGhpbi1sZWZ0OiBcIlxcZjNkNVwiO1xuQGlvbmljb24tdmFyLWlvcy1hcnJvdy10aGluLXJpZ2h0OiBcIlxcZjNkNlwiO1xuQGlvbmljb24tdmFyLWlvcy1hcnJvdy10aGluLXVwOiBcIlxcZjNkN1wiO1xuQGlvbmljb24tdmFyLWlvcy1hcnJvdy11cDogXCJcXGYzZDhcIjtcbkBpb25pY29uLXZhci1pb3MtYXQ6IFwiXFxmM2RhXCI7XG5AaW9uaWNvbi12YXItaW9zLWF0LW91dGxpbmU6IFwiXFxmM2Q5XCI7XG5AaW9uaWNvbi12YXItaW9zLWJhcmNvZGU6IFwiXFxmM2RjXCI7XG5AaW9uaWNvbi12YXItaW9zLWJhcmNvZGUtb3V0bGluZTogXCJcXGYzZGJcIjtcbkBpb25pY29uLXZhci1pb3MtYmFzZWJhbGw6IFwiXFxmM2RlXCI7XG5AaW9uaWNvbi12YXItaW9zLWJhc2ViYWxsLW91dGxpbmU6IFwiXFxmM2RkXCI7XG5AaW9uaWNvbi12YXItaW9zLWJhc2tldGJhbGw6IFwiXFxmM2UwXCI7XG5AaW9uaWNvbi12YXItaW9zLWJhc2tldGJhbGwtb3V0bGluZTogXCJcXGYzZGZcIjtcbkBpb25pY29uLXZhci1pb3MtYmVsbDogXCJcXGYzZTJcIjtcbkBpb25pY29uLXZhci1pb3MtYmVsbC1vdXRsaW5lOiBcIlxcZjNlMVwiO1xuQGlvbmljb24tdmFyLWlvcy1ib2R5OiBcIlxcZjNlNFwiO1xuQGlvbmljb24tdmFyLWlvcy1ib2R5LW91dGxpbmU6IFwiXFxmM2UzXCI7XG5AaW9uaWNvbi12YXItaW9zLWJvbHQ6IFwiXFxmM2U2XCI7XG5AaW9uaWNvbi12YXItaW9zLWJvbHQtb3V0bGluZTogXCJcXGYzZTVcIjtcbkBpb25pY29uLXZhci1pb3MtYm9vazogXCJcXGYzZThcIjtcbkBpb25pY29uLXZhci1pb3MtYm9vay1vdXRsaW5lOiBcIlxcZjNlN1wiO1xuQGlvbmljb24tdmFyLWlvcy1ib29rbWFya3M6IFwiXFxmM2VhXCI7XG5AaW9uaWNvbi12YXItaW9zLWJvb2ttYXJrcy1vdXRsaW5lOiBcIlxcZjNlOVwiO1xuQGlvbmljb24tdmFyLWlvcy1ib3g6IFwiXFxmM2VjXCI7XG5AaW9uaWNvbi12YXItaW9zLWJveC1vdXRsaW5lOiBcIlxcZjNlYlwiO1xuQGlvbmljb24tdmFyLWlvcy1icmllZmNhc2U6IFwiXFxmM2VlXCI7XG5AaW9uaWNvbi12YXItaW9zLWJyaWVmY2FzZS1vdXRsaW5lOiBcIlxcZjNlZFwiO1xuQGlvbmljb24tdmFyLWlvcy1icm93c2VyczogXCJcXGYzZjBcIjtcbkBpb25pY29uLXZhci1pb3MtYnJvd3NlcnMtb3V0bGluZTogXCJcXGYzZWZcIjtcbkBpb25pY29uLXZhci1pb3MtY2FsY3VsYXRvcjogXCJcXGYzZjJcIjtcbkBpb25pY29uLXZhci1pb3MtY2FsY3VsYXRvci1vdXRsaW5lOiBcIlxcZjNmMVwiO1xuQGlvbmljb24tdmFyLWlvcy1jYWxlbmRhcjogXCJcXGYzZjRcIjtcbkBpb25pY29uLXZhci1pb3MtY2FsZW5kYXItb3V0bGluZTogXCJcXGYzZjNcIjtcbkBpb25pY29uLXZhci1pb3MtY2FtZXJhOiBcIlxcZjNmNlwiO1xuQGlvbmljb24tdmFyLWlvcy1jYW1lcmEtb3V0bGluZTogXCJcXGYzZjVcIjtcbkBpb25pY29uLXZhci1pb3MtY2FydDogXCJcXGYzZjhcIjtcbkBpb25pY29uLXZhci1pb3MtY2FydC1vdXRsaW5lOiBcIlxcZjNmN1wiO1xuQGlvbmljb24tdmFyLWlvcy1jaGF0Ym94ZXM6IFwiXFxmM2ZhXCI7XG5AaW9uaWNvbi12YXItaW9zLWNoYXRib3hlcy1vdXRsaW5lOiBcIlxcZjNmOVwiO1xuQGlvbmljb24tdmFyLWlvcy1jaGF0YnViYmxlOiBcIlxcZjNmY1wiO1xuQGlvbmljb24tdmFyLWlvcy1jaGF0YnViYmxlLW91dGxpbmU6IFwiXFxmM2ZiXCI7XG5AaW9uaWNvbi12YXItaW9zLWNoZWNrbWFyazogXCJcXGYzZmZcIjtcbkBpb25pY29uLXZhci1pb3MtY2hlY2ttYXJrLWVtcHR5OiBcIlxcZjNmZFwiO1xuQGlvbmljb24tdmFyLWlvcy1jaGVja21hcmstb3V0bGluZTogXCJcXGYzZmVcIjtcbkBpb25pY29uLXZhci1pb3MtY2lyY2xlLWZpbGxlZDogXCJcXGY0MDBcIjtcbkBpb25pY29uLXZhci1pb3MtY2lyY2xlLW91dGxpbmU6IFwiXFxmNDAxXCI7XG5AaW9uaWNvbi12YXItaW9zLWNsb2NrOiBcIlxcZjQwM1wiO1xuQGlvbmljb24tdmFyLWlvcy1jbG9jay1vdXRsaW5lOiBcIlxcZjQwMlwiO1xuQGlvbmljb24tdmFyLWlvcy1jbG9zZTogXCJcXGY0MDZcIjtcbkBpb25pY29uLXZhci1pb3MtY2xvc2UtZW1wdHk6IFwiXFxmNDA0XCI7XG5AaW9uaWNvbi12YXItaW9zLWNsb3NlLW91dGxpbmU6IFwiXFxmNDA1XCI7XG5AaW9uaWNvbi12YXItaW9zLWNsb3VkOiBcIlxcZjQwY1wiO1xuQGlvbmljb24tdmFyLWlvcy1jbG91ZC1kb3dubG9hZDogXCJcXGY0MDhcIjtcbkBpb25pY29uLXZhci1pb3MtY2xvdWQtZG93bmxvYWQtb3V0bGluZTogXCJcXGY0MDdcIjtcbkBpb25pY29uLXZhci1pb3MtY2xvdWQtb3V0bGluZTogXCJcXGY0MDlcIjtcbkBpb25pY29uLXZhci1pb3MtY2xvdWQtdXBsb2FkOiBcIlxcZjQwYlwiO1xuQGlvbmljb24tdmFyLWlvcy1jbG91ZC11cGxvYWQtb3V0bGluZTogXCJcXGY0MGFcIjtcbkBpb25pY29uLXZhci1pb3MtY2xvdWR5OiBcIlxcZjQxMFwiO1xuQGlvbmljb24tdmFyLWlvcy1jbG91ZHktbmlnaHQ6IFwiXFxmNDBlXCI7XG5AaW9uaWNvbi12YXItaW9zLWNsb3VkeS1uaWdodC1vdXRsaW5lOiBcIlxcZjQwZFwiO1xuQGlvbmljb24tdmFyLWlvcy1jbG91ZHktb3V0bGluZTogXCJcXGY0MGZcIjtcbkBpb25pY29uLXZhci1pb3MtY29nOiBcIlxcZjQxMlwiO1xuQGlvbmljb24tdmFyLWlvcy1jb2ctb3V0bGluZTogXCJcXGY0MTFcIjtcbkBpb25pY29uLXZhci1pb3MtY29sb3ItZmlsdGVyOiBcIlxcZjQxNFwiO1xuQGlvbmljb24tdmFyLWlvcy1jb2xvci1maWx0ZXItb3V0bGluZTogXCJcXGY0MTNcIjtcbkBpb25pY29uLXZhci1pb3MtY29sb3Itd2FuZDogXCJcXGY0MTZcIjtcbkBpb25pY29uLXZhci1pb3MtY29sb3Itd2FuZC1vdXRsaW5lOiBcIlxcZjQxNVwiO1xuQGlvbmljb24tdmFyLWlvcy1jb21wb3NlOiBcIlxcZjQxOFwiO1xuQGlvbmljb24tdmFyLWlvcy1jb21wb3NlLW91dGxpbmU6IFwiXFxmNDE3XCI7XG5AaW9uaWNvbi12YXItaW9zLWNvbnRhY3Q6IFwiXFxmNDFhXCI7XG5AaW9uaWNvbi12YXItaW9zLWNvbnRhY3Qtb3V0bGluZTogXCJcXGY0MTlcIjtcbkBpb25pY29uLXZhci1pb3MtY29weTogXCJcXGY0MWNcIjtcbkBpb25pY29uLXZhci1pb3MtY29weS1vdXRsaW5lOiBcIlxcZjQxYlwiO1xuQGlvbmljb24tdmFyLWlvcy1jcm9wOiBcIlxcZjQxZVwiO1xuQGlvbmljb24tdmFyLWlvcy1jcm9wLXN0cm9uZzogXCJcXGY0MWRcIjtcbkBpb25pY29uLXZhci1pb3MtZG93bmxvYWQ6IFwiXFxmNDIwXCI7XG5AaW9uaWNvbi12YXItaW9zLWRvd25sb2FkLW91dGxpbmU6IFwiXFxmNDFmXCI7XG5AaW9uaWNvbi12YXItaW9zLWRyYWc6IFwiXFxmNDIxXCI7XG5AaW9uaWNvbi12YXItaW9zLWVtYWlsOiBcIlxcZjQyM1wiO1xuQGlvbmljb24tdmFyLWlvcy1lbWFpbC1vdXRsaW5lOiBcIlxcZjQyMlwiO1xuQGlvbmljb24tdmFyLWlvcy1leWU6IFwiXFxmNDI1XCI7XG5AaW9uaWNvbi12YXItaW9zLWV5ZS1vdXRsaW5lOiBcIlxcZjQyNFwiO1xuQGlvbmljb24tdmFyLWlvcy1mYXN0Zm9yd2FyZDogXCJcXGY0MjdcIjtcbkBpb25pY29uLXZhci1pb3MtZmFzdGZvcndhcmQtb3V0bGluZTogXCJcXGY0MjZcIjtcbkBpb25pY29uLXZhci1pb3MtZmlsaW5nOiBcIlxcZjQyOVwiO1xuQGlvbmljb24tdmFyLWlvcy1maWxpbmctb3V0bGluZTogXCJcXGY0MjhcIjtcbkBpb25pY29uLXZhci1pb3MtZmlsbTogXCJcXGY0MmJcIjtcbkBpb25pY29uLXZhci1pb3MtZmlsbS1vdXRsaW5lOiBcIlxcZjQyYVwiO1xuQGlvbmljb24tdmFyLWlvcy1mbGFnOiBcIlxcZjQyZFwiO1xuQGlvbmljb24tdmFyLWlvcy1mbGFnLW91dGxpbmU6IFwiXFxmNDJjXCI7XG5AaW9uaWNvbi12YXItaW9zLWZsYW1lOiBcIlxcZjQyZlwiO1xuQGlvbmljb24tdmFyLWlvcy1mbGFtZS1vdXRsaW5lOiBcIlxcZjQyZVwiO1xuQGlvbmljb24tdmFyLWlvcy1mbGFzazogXCJcXGY0MzFcIjtcbkBpb25pY29uLXZhci1pb3MtZmxhc2stb3V0bGluZTogXCJcXGY0MzBcIjtcbkBpb25pY29uLXZhci1pb3MtZmxvd2VyOiBcIlxcZjQzM1wiO1xuQGlvbmljb24tdmFyLWlvcy1mbG93ZXItb3V0bGluZTogXCJcXGY0MzJcIjtcbkBpb25pY29uLXZhci1pb3MtZm9sZGVyOiBcIlxcZjQzNVwiO1xuQGlvbmljb24tdmFyLWlvcy1mb2xkZXItb3V0bGluZTogXCJcXGY0MzRcIjtcbkBpb25pY29uLXZhci1pb3MtZm9vdGJhbGw6IFwiXFxmNDM3XCI7XG5AaW9uaWNvbi12YXItaW9zLWZvb3RiYWxsLW91dGxpbmU6IFwiXFxmNDM2XCI7XG5AaW9uaWNvbi12YXItaW9zLWdhbWUtY29udHJvbGxlci1hOiBcIlxcZjQzOVwiO1xuQGlvbmljb24tdmFyLWlvcy1nYW1lLWNvbnRyb2xsZXItYS1vdXRsaW5lOiBcIlxcZjQzOFwiO1xuQGlvbmljb24tdmFyLWlvcy1nYW1lLWNvbnRyb2xsZXItYjogXCJcXGY0M2JcIjtcbkBpb25pY29uLXZhci1pb3MtZ2FtZS1jb250cm9sbGVyLWItb3V0bGluZTogXCJcXGY0M2FcIjtcbkBpb25pY29uLXZhci1pb3MtZ2VhcjogXCJcXGY0M2RcIjtcbkBpb25pY29uLXZhci1pb3MtZ2Vhci1vdXRsaW5lOiBcIlxcZjQzY1wiO1xuQGlvbmljb24tdmFyLWlvcy1nbGFzc2VzOiBcIlxcZjQzZlwiO1xuQGlvbmljb24tdmFyLWlvcy1nbGFzc2VzLW91dGxpbmU6IFwiXFxmNDNlXCI7XG5AaW9uaWNvbi12YXItaW9zLWdyaWQtdmlldzogXCJcXGY0NDFcIjtcbkBpb25pY29uLXZhci1pb3MtZ3JpZC12aWV3LW91dGxpbmU6IFwiXFxmNDQwXCI7XG5AaW9uaWNvbi12YXItaW9zLWhlYXJ0OiBcIlxcZjQ0M1wiO1xuQGlvbmljb24tdmFyLWlvcy1oZWFydC1vdXRsaW5lOiBcIlxcZjQ0MlwiO1xuQGlvbmljb24tdmFyLWlvcy1oZWxwOiBcIlxcZjQ0NlwiO1xuQGlvbmljb24tdmFyLWlvcy1oZWxwLWVtcHR5OiBcIlxcZjQ0NFwiO1xuQGlvbmljb24tdmFyLWlvcy1oZWxwLW91dGxpbmU6IFwiXFxmNDQ1XCI7XG5AaW9uaWNvbi12YXItaW9zLWhvbWU6IFwiXFxmNDQ4XCI7XG5AaW9uaWNvbi12YXItaW9zLWhvbWUtb3V0bGluZTogXCJcXGY0NDdcIjtcbkBpb25pY29uLXZhci1pb3MtaW5maW5pdGU6IFwiXFxmNDRhXCI7XG5AaW9uaWNvbi12YXItaW9zLWluZmluaXRlLW91dGxpbmU6IFwiXFxmNDQ5XCI7XG5AaW9uaWNvbi12YXItaW9zLWluZm9ybWF0aW9uOiBcIlxcZjQ0ZFwiO1xuQGlvbmljb24tdmFyLWlvcy1pbmZvcm1hdGlvbi1lbXB0eTogXCJcXGY0NGJcIjtcbkBpb25pY29uLXZhci1pb3MtaW5mb3JtYXRpb24tb3V0bGluZTogXCJcXGY0NGNcIjtcbkBpb25pY29uLXZhci1pb3MtaW9uaWMtb3V0bGluZTogXCJcXGY0NGVcIjtcbkBpb25pY29uLXZhci1pb3Mta2V5cGFkOiBcIlxcZjQ1MFwiO1xuQGlvbmljb24tdmFyLWlvcy1rZXlwYWQtb3V0bGluZTogXCJcXGY0NGZcIjtcbkBpb25pY29uLXZhci1pb3MtbGlnaHRidWxiOiBcIlxcZjQ1MlwiO1xuQGlvbmljb24tdmFyLWlvcy1saWdodGJ1bGItb3V0bGluZTogXCJcXGY0NTFcIjtcbkBpb25pY29uLXZhci1pb3MtbGlzdDogXCJcXGY0NTRcIjtcbkBpb25pY29uLXZhci1pb3MtbGlzdC1vdXRsaW5lOiBcIlxcZjQ1M1wiO1xuQGlvbmljb24tdmFyLWlvcy1sb2NhdGlvbjogXCJcXGY0NTZcIjtcbkBpb25pY29uLXZhci1pb3MtbG9jYXRpb24tb3V0bGluZTogXCJcXGY0NTVcIjtcbkBpb25pY29uLXZhci1pb3MtbG9ja2VkOiBcIlxcZjQ1OFwiO1xuQGlvbmljb24tdmFyLWlvcy1sb2NrZWQtb3V0bGluZTogXCJcXGY0NTdcIjtcbkBpb25pY29uLXZhci1pb3MtbG9vcDogXCJcXGY0NWFcIjtcbkBpb25pY29uLXZhci1pb3MtbG9vcC1zdHJvbmc6IFwiXFxmNDU5XCI7XG5AaW9uaWNvbi12YXItaW9zLW1lZGljYWw6IFwiXFxmNDVjXCI7XG5AaW9uaWNvbi12YXItaW9zLW1lZGljYWwtb3V0bGluZTogXCJcXGY0NWJcIjtcbkBpb25pY29uLXZhci1pb3MtbWVka2l0OiBcIlxcZjQ1ZVwiO1xuQGlvbmljb24tdmFyLWlvcy1tZWRraXQtb3V0bGluZTogXCJcXGY0NWRcIjtcbkBpb25pY29uLXZhci1pb3MtbWljOiBcIlxcZjQ2MVwiO1xuQGlvbmljb24tdmFyLWlvcy1taWMtb2ZmOiBcIlxcZjQ1ZlwiO1xuQGlvbmljb24tdmFyLWlvcy1taWMtb3V0bGluZTogXCJcXGY0NjBcIjtcbkBpb25pY29uLXZhci1pb3MtbWludXM6IFwiXFxmNDY0XCI7XG5AaW9uaWNvbi12YXItaW9zLW1pbnVzLWVtcHR5OiBcIlxcZjQ2MlwiO1xuQGlvbmljb24tdmFyLWlvcy1taW51cy1vdXRsaW5lOiBcIlxcZjQ2M1wiO1xuQGlvbmljb24tdmFyLWlvcy1tb25pdG9yOiBcIlxcZjQ2NlwiO1xuQGlvbmljb24tdmFyLWlvcy1tb25pdG9yLW91dGxpbmU6IFwiXFxmNDY1XCI7XG5AaW9uaWNvbi12YXItaW9zLW1vb246IFwiXFxmNDY4XCI7XG5AaW9uaWNvbi12YXItaW9zLW1vb24tb3V0bGluZTogXCJcXGY0NjdcIjtcbkBpb25pY29uLXZhci1pb3MtbW9yZTogXCJcXGY0NmFcIjtcbkBpb25pY29uLXZhci1pb3MtbW9yZS1vdXRsaW5lOiBcIlxcZjQ2OVwiO1xuQGlvbmljb24tdmFyLWlvcy1tdXNpY2FsLW5vdGU6IFwiXFxmNDZiXCI7XG5AaW9uaWNvbi12YXItaW9zLW11c2ljYWwtbm90ZXM6IFwiXFxmNDZjXCI7XG5AaW9uaWNvbi12YXItaW9zLW5hdmlnYXRlOiBcIlxcZjQ2ZVwiO1xuQGlvbmljb24tdmFyLWlvcy1uYXZpZ2F0ZS1vdXRsaW5lOiBcIlxcZjQ2ZFwiO1xuQGlvbmljb24tdmFyLWlvcy1udXRyaXRpb246IFwiXFxmNDcwXCI7XG5AaW9uaWNvbi12YXItaW9zLW51dHJpdGlvbi1vdXRsaW5lOiBcIlxcZjQ2ZlwiO1xuQGlvbmljb24tdmFyLWlvcy1wYXBlcjogXCJcXGY0NzJcIjtcbkBpb25pY29uLXZhci1pb3MtcGFwZXItb3V0bGluZTogXCJcXGY0NzFcIjtcbkBpb25pY29uLXZhci1pb3MtcGFwZXJwbGFuZTogXCJcXGY0NzRcIjtcbkBpb25pY29uLXZhci1pb3MtcGFwZXJwbGFuZS1vdXRsaW5lOiBcIlxcZjQ3M1wiO1xuQGlvbmljb24tdmFyLWlvcy1wYXJ0bHlzdW5ueTogXCJcXGY0NzZcIjtcbkBpb25pY29uLXZhci1pb3MtcGFydGx5c3Vubnktb3V0bGluZTogXCJcXGY0NzVcIjtcbkBpb25pY29uLXZhci1pb3MtcGF1c2U6IFwiXFxmNDc4XCI7XG5AaW9uaWNvbi12YXItaW9zLXBhdXNlLW91dGxpbmU6IFwiXFxmNDc3XCI7XG5AaW9uaWNvbi12YXItaW9zLXBhdzogXCJcXGY0N2FcIjtcbkBpb25pY29uLXZhci1pb3MtcGF3LW91dGxpbmU6IFwiXFxmNDc5XCI7XG5AaW9uaWNvbi12YXItaW9zLXBlb3BsZTogXCJcXGY0N2NcIjtcbkBpb25pY29uLXZhci1pb3MtcGVvcGxlLW91dGxpbmU6IFwiXFxmNDdiXCI7XG5AaW9uaWNvbi12YXItaW9zLXBlcnNvbjogXCJcXGY0N2VcIjtcbkBpb25pY29uLXZhci1pb3MtcGVyc29uLW91dGxpbmU6IFwiXFxmNDdkXCI7XG5AaW9uaWNvbi12YXItaW9zLXBlcnNvbmFkZDogXCJcXGY0ODBcIjtcbkBpb25pY29uLXZhci1pb3MtcGVyc29uYWRkLW91dGxpbmU6IFwiXFxmNDdmXCI7XG5AaW9uaWNvbi12YXItaW9zLXBob3RvczogXCJcXGY0ODJcIjtcbkBpb25pY29uLXZhci1pb3MtcGhvdG9zLW91dGxpbmU6IFwiXFxmNDgxXCI7XG5AaW9uaWNvbi12YXItaW9zLXBpZTogXCJcXGY0ODRcIjtcbkBpb25pY29uLXZhci1pb3MtcGllLW91dGxpbmU6IFwiXFxmNDgzXCI7XG5AaW9uaWNvbi12YXItaW9zLXBpbnQ6IFwiXFxmNDg2XCI7XG5AaW9uaWNvbi12YXItaW9zLXBpbnQtb3V0bGluZTogXCJcXGY0ODVcIjtcbkBpb25pY29uLXZhci1pb3MtcGxheTogXCJcXGY0ODhcIjtcbkBpb25pY29uLXZhci1pb3MtcGxheS1vdXRsaW5lOiBcIlxcZjQ4N1wiO1xuQGlvbmljb24tdmFyLWlvcy1wbHVzOiBcIlxcZjQ4YlwiO1xuQGlvbmljb24tdmFyLWlvcy1wbHVzLWVtcHR5OiBcIlxcZjQ4OVwiO1xuQGlvbmljb24tdmFyLWlvcy1wbHVzLW91dGxpbmU6IFwiXFxmNDhhXCI7XG5AaW9uaWNvbi12YXItaW9zLXByaWNldGFnOiBcIlxcZjQ4ZFwiO1xuQGlvbmljb24tdmFyLWlvcy1wcmljZXRhZy1vdXRsaW5lOiBcIlxcZjQ4Y1wiO1xuQGlvbmljb24tdmFyLWlvcy1wcmljZXRhZ3M6IFwiXFxmNDhmXCI7XG5AaW9uaWNvbi12YXItaW9zLXByaWNldGFncy1vdXRsaW5lOiBcIlxcZjQ4ZVwiO1xuQGlvbmljb24tdmFyLWlvcy1wcmludGVyOiBcIlxcZjQ5MVwiO1xuQGlvbmljb24tdmFyLWlvcy1wcmludGVyLW91dGxpbmU6IFwiXFxmNDkwXCI7XG5AaW9uaWNvbi12YXItaW9zLXB1bHNlOiBcIlxcZjQ5M1wiO1xuQGlvbmljb24tdmFyLWlvcy1wdWxzZS1zdHJvbmc6IFwiXFxmNDkyXCI7XG5AaW9uaWNvbi12YXItaW9zLXJhaW55OiBcIlxcZjQ5NVwiO1xuQGlvbmljb24tdmFyLWlvcy1yYWlueS1vdXRsaW5lOiBcIlxcZjQ5NFwiO1xuQGlvbmljb24tdmFyLWlvcy1yZWNvcmRpbmc6IFwiXFxmNDk3XCI7XG5AaW9uaWNvbi12YXItaW9zLXJlY29yZGluZy1vdXRsaW5lOiBcIlxcZjQ5NlwiO1xuQGlvbmljb24tdmFyLWlvcy1yZWRvOiBcIlxcZjQ5OVwiO1xuQGlvbmljb24tdmFyLWlvcy1yZWRvLW91dGxpbmU6IFwiXFxmNDk4XCI7XG5AaW9uaWNvbi12YXItaW9zLXJlZnJlc2g6IFwiXFxmNDljXCI7XG5AaW9uaWNvbi12YXItaW9zLXJlZnJlc2gtZW1wdHk6IFwiXFxmNDlhXCI7XG5AaW9uaWNvbi12YXItaW9zLXJlZnJlc2gtb3V0bGluZTogXCJcXGY0OWJcIjtcbkBpb25pY29uLXZhci1pb3MtcmVsb2FkOiBcIlxcZjQ5ZFwiO1xuQGlvbmljb24tdmFyLWlvcy1yZXZlcnNlLWNhbWVyYTogXCJcXGY0OWZcIjtcbkBpb25pY29uLXZhci1pb3MtcmV2ZXJzZS1jYW1lcmEtb3V0bGluZTogXCJcXGY0OWVcIjtcbkBpb25pY29uLXZhci1pb3MtcmV3aW5kOiBcIlxcZjRhMVwiO1xuQGlvbmljb24tdmFyLWlvcy1yZXdpbmQtb3V0bGluZTogXCJcXGY0YTBcIjtcbkBpb25pY29uLXZhci1pb3Mtcm9zZTogXCJcXGY0YTNcIjtcbkBpb25pY29uLXZhci1pb3Mtcm9zZS1vdXRsaW5lOiBcIlxcZjRhMlwiO1xuQGlvbmljb24tdmFyLWlvcy1zZWFyY2g6IFwiXFxmNGE1XCI7XG5AaW9uaWNvbi12YXItaW9zLXNlYXJjaC1zdHJvbmc6IFwiXFxmNGE0XCI7XG5AaW9uaWNvbi12YXItaW9zLXNldHRpbmdzOiBcIlxcZjRhN1wiO1xuQGlvbmljb24tdmFyLWlvcy1zZXR0aW5ncy1zdHJvbmc6IFwiXFxmNGE2XCI7XG5AaW9uaWNvbi12YXItaW9zLXNodWZmbGU6IFwiXFxmNGE5XCI7XG5AaW9uaWNvbi12YXItaW9zLXNodWZmbGUtc3Ryb25nOiBcIlxcZjRhOFwiO1xuQGlvbmljb24tdmFyLWlvcy1za2lwYmFja3dhcmQ6IFwiXFxmNGFiXCI7XG5AaW9uaWNvbi12YXItaW9zLXNraXBiYWNrd2FyZC1vdXRsaW5lOiBcIlxcZjRhYVwiO1xuQGlvbmljb24tdmFyLWlvcy1za2lwZm9yd2FyZDogXCJcXGY0YWRcIjtcbkBpb25pY29uLXZhci1pb3Mtc2tpcGZvcndhcmQtb3V0bGluZTogXCJcXGY0YWNcIjtcbkBpb25pY29uLXZhci1pb3Mtc25vd3k6IFwiXFxmNGFlXCI7XG5AaW9uaWNvbi12YXItaW9zLXNwZWVkb21ldGVyOiBcIlxcZjRiMFwiO1xuQGlvbmljb24tdmFyLWlvcy1zcGVlZG9tZXRlci1vdXRsaW5lOiBcIlxcZjRhZlwiO1xuQGlvbmljb24tdmFyLWlvcy1zdGFyOiBcIlxcZjRiM1wiO1xuQGlvbmljb24tdmFyLWlvcy1zdGFyLWhhbGY6IFwiXFxmNGIxXCI7XG5AaW9uaWNvbi12YXItaW9zLXN0YXItb3V0bGluZTogXCJcXGY0YjJcIjtcbkBpb25pY29uLXZhci1pb3Mtc3RvcHdhdGNoOiBcIlxcZjRiNVwiO1xuQGlvbmljb24tdmFyLWlvcy1zdG9wd2F0Y2gtb3V0bGluZTogXCJcXGY0YjRcIjtcbkBpb25pY29uLXZhci1pb3Mtc3Vubnk6IFwiXFxmNGI3XCI7XG5AaW9uaWNvbi12YXItaW9zLXN1bm55LW91dGxpbmU6IFwiXFxmNGI2XCI7XG5AaW9uaWNvbi12YXItaW9zLXRlbGVwaG9uZTogXCJcXGY0YjlcIjtcbkBpb25pY29uLXZhci1pb3MtdGVsZXBob25lLW91dGxpbmU6IFwiXFxmNGI4XCI7XG5AaW9uaWNvbi12YXItaW9zLXRlbm5pc2JhbGw6IFwiXFxmNGJiXCI7XG5AaW9uaWNvbi12YXItaW9zLXRlbm5pc2JhbGwtb3V0bGluZTogXCJcXGY0YmFcIjtcbkBpb25pY29uLXZhci1pb3MtdGh1bmRlcnN0b3JtOiBcIlxcZjRiZFwiO1xuQGlvbmljb24tdmFyLWlvcy10aHVuZGVyc3Rvcm0tb3V0bGluZTogXCJcXGY0YmNcIjtcbkBpb25pY29uLXZhci1pb3MtdGltZTogXCJcXGY0YmZcIjtcbkBpb25pY29uLXZhci1pb3MtdGltZS1vdXRsaW5lOiBcIlxcZjRiZVwiO1xuQGlvbmljb24tdmFyLWlvcy10aW1lcjogXCJcXGY0YzFcIjtcbkBpb25pY29uLXZhci1pb3MtdGltZXItb3V0bGluZTogXCJcXGY0YzBcIjtcbkBpb25pY29uLXZhci1pb3MtdG9nZ2xlOiBcIlxcZjRjM1wiO1xuQGlvbmljb24tdmFyLWlvcy10b2dnbGUtb3V0bGluZTogXCJcXGY0YzJcIjtcbkBpb25pY29uLXZhci1pb3MtdHJhc2g6IFwiXFxmNGM1XCI7XG5AaW9uaWNvbi12YXItaW9zLXRyYXNoLW91dGxpbmU6IFwiXFxmNGM0XCI7XG5AaW9uaWNvbi12YXItaW9zLXVuZG86IFwiXFxmNGM3XCI7XG5AaW9uaWNvbi12YXItaW9zLXVuZG8tb3V0bGluZTogXCJcXGY0YzZcIjtcbkBpb25pY29uLXZhci1pb3MtdW5sb2NrZWQ6IFwiXFxmNGM5XCI7XG5AaW9uaWNvbi12YXItaW9zLXVubG9ja2VkLW91dGxpbmU6IFwiXFxmNGM4XCI7XG5AaW9uaWNvbi12YXItaW9zLXVwbG9hZDogXCJcXGY0Y2JcIjtcbkBpb25pY29uLXZhci1pb3MtdXBsb2FkLW91dGxpbmU6IFwiXFxmNGNhXCI7XG5AaW9uaWNvbi12YXItaW9zLXZpZGVvY2FtOiBcIlxcZjRjZFwiO1xuQGlvbmljb24tdmFyLWlvcy12aWRlb2NhbS1vdXRsaW5lOiBcIlxcZjRjY1wiO1xuQGlvbmljb24tdmFyLWlvcy12b2x1bWUtaGlnaDogXCJcXGY0Y2VcIjtcbkBpb25pY29uLXZhci1pb3Mtdm9sdW1lLWxvdzogXCJcXGY0Y2ZcIjtcbkBpb25pY29uLXZhci1pb3Mtd2luZWdsYXNzOiBcIlxcZjRkMVwiO1xuQGlvbmljb24tdmFyLWlvcy13aW5lZ2xhc3Mtb3V0bGluZTogXCJcXGY0ZDBcIjtcbkBpb25pY29uLXZhci1pb3Mtd29ybGQ6IFwiXFxmNGQzXCI7XG5AaW9uaWNvbi12YXItaW9zLXdvcmxkLW91dGxpbmU6IFwiXFxmNGQyXCI7XG5AaW9uaWNvbi12YXItaXBhZDogXCJcXGYxZjlcIjtcbkBpb25pY29uLXZhci1pcGhvbmU6IFwiXFxmMWZhXCI7XG5AaW9uaWNvbi12YXItaXBvZDogXCJcXGYxZmJcIjtcbkBpb25pY29uLXZhci1qZXQ6IFwiXFxmMjk1XCI7XG5AaW9uaWNvbi12YXIta2V5OiBcIlxcZjI5NlwiO1xuQGlvbmljb24tdmFyLWtuaWZlOiBcIlxcZjI5N1wiO1xuQGlvbmljb24tdmFyLWxhcHRvcDogXCJcXGYxZmNcIjtcbkBpb25pY29uLXZhci1sZWFmOiBcIlxcZjFmZFwiO1xuQGlvbmljb24tdmFyLWxldmVsczogXCJcXGYyOThcIjtcbkBpb25pY29uLXZhci1saWdodGJ1bGI6IFwiXFxmMjk5XCI7XG5AaW9uaWNvbi12YXItbGluazogXCJcXGYxZmVcIjtcbkBpb25pY29uLXZhci1sb2FkLWE6IFwiXFxmMjlhXCI7XG5AaW9uaWNvbi12YXItbG9hZC1iOiBcIlxcZjI5YlwiO1xuQGlvbmljb24tdmFyLWxvYWQtYzogXCJcXGYyOWNcIjtcbkBpb25pY29uLXZhci1sb2FkLWQ6IFwiXFxmMjlkXCI7XG5AaW9uaWNvbi12YXItbG9jYXRpb246IFwiXFxmMWZmXCI7XG5AaW9uaWNvbi12YXItbG9jay1jb21iaW5hdGlvbjogXCJcXGY0ZDRcIjtcbkBpb25pY29uLXZhci1sb2NrZWQ6IFwiXFxmMjAwXCI7XG5AaW9uaWNvbi12YXItbG9nLWluOiBcIlxcZjI5ZVwiO1xuQGlvbmljb24tdmFyLWxvZy1vdXQ6IFwiXFxmMjlmXCI7XG5AaW9uaWNvbi12YXItbG9vcDogXCJcXGYyMDFcIjtcbkBpb25pY29uLXZhci1tYWduZXQ6IFwiXFxmMmEwXCI7XG5AaW9uaWNvbi12YXItbWFsZTogXCJcXGYyYTFcIjtcbkBpb25pY29uLXZhci1tYW46IFwiXFxmMjAyXCI7XG5AaW9uaWNvbi12YXItbWFwOiBcIlxcZjIwM1wiO1xuQGlvbmljb24tdmFyLW1lZGtpdDogXCJcXGYyYTJcIjtcbkBpb25pY29uLXZhci1tZXJnZTogXCJcXGYzM2ZcIjtcbkBpb25pY29uLXZhci1taWMtYTogXCJcXGYyMDRcIjtcbkBpb25pY29uLXZhci1taWMtYjogXCJcXGYyMDVcIjtcbkBpb25pY29uLXZhci1taWMtYzogXCJcXGYyMDZcIjtcbkBpb25pY29uLXZhci1taW51czogXCJcXGYyMDlcIjtcbkBpb25pY29uLXZhci1taW51cy1jaXJjbGVkOiBcIlxcZjIwN1wiO1xuQGlvbmljb24tdmFyLW1pbnVzLXJvdW5kOiBcIlxcZjIwOFwiO1xuQGlvbmljb24tdmFyLW1vZGVsLXM6IFwiXFxmMmMxXCI7XG5AaW9uaWNvbi12YXItbW9uaXRvcjogXCJcXGYyMGFcIjtcbkBpb25pY29uLXZhci1tb3JlOiBcIlxcZjIwYlwiO1xuQGlvbmljb24tdmFyLW1vdXNlOiBcIlxcZjM0MFwiO1xuQGlvbmljb24tdmFyLW11c2ljLW5vdGU6IFwiXFxmMjBjXCI7XG5AaW9uaWNvbi12YXItbmF2aWNvbjogXCJcXGYyMGVcIjtcbkBpb25pY29uLXZhci1uYXZpY29uLXJvdW5kOiBcIlxcZjIwZFwiO1xuQGlvbmljb24tdmFyLW5hdmlnYXRlOiBcIlxcZjJhM1wiO1xuQGlvbmljb24tdmFyLW5ldHdvcms6IFwiXFxmMzQxXCI7XG5AaW9uaWNvbi12YXItbm8tc21va2luZzogXCJcXGYyYzJcIjtcbkBpb25pY29uLXZhci1udWNsZWFyOiBcIlxcZjJhNFwiO1xuQGlvbmljb24tdmFyLW91dGxldDogXCJcXGYzNDJcIjtcbkBpb25pY29uLXZhci1wYWludGJydXNoOiBcIlxcZjRkNVwiO1xuQGlvbmljb24tdmFyLXBhaW50YnVja2V0OiBcIlxcZjRkNlwiO1xuQGlvbmljb24tdmFyLXBhcGVyLWFpcnBsYW5lOiBcIlxcZjJjM1wiO1xuQGlvbmljb24tdmFyLXBhcGVyY2xpcDogXCJcXGYyMGZcIjtcbkBpb25pY29uLXZhci1wYXVzZTogXCJcXGYyMTBcIjtcbkBpb25pY29uLXZhci1wZXJzb246IFwiXFxmMjEzXCI7XG5AaW9uaWNvbi12YXItcGVyc29uLWFkZDogXCJcXGYyMTFcIjtcbkBpb25pY29uLXZhci1wZXJzb24tc3RhbGtlcjogXCJcXGYyMTJcIjtcbkBpb25pY29uLXZhci1waWUtZ3JhcGg6IFwiXFxmMmE1XCI7XG5AaW9uaWNvbi12YXItcGluOiBcIlxcZjJhNlwiO1xuQGlvbmljb24tdmFyLXBpbnBvaW50OiBcIlxcZjJhN1wiO1xuQGlvbmljb24tdmFyLXBpenphOiBcIlxcZjJhOFwiO1xuQGlvbmljb24tdmFyLXBsYW5lOiBcIlxcZjIxNFwiO1xuQGlvbmljb24tdmFyLXBsYW5ldDogXCJcXGYzNDNcIjtcbkBpb25pY29uLXZhci1wbGF5OiBcIlxcZjIxNVwiO1xuQGlvbmljb24tdmFyLXBsYXlzdGF0aW9uOiBcIlxcZjMwYVwiO1xuQGlvbmljb24tdmFyLXBsdXM6IFwiXFxmMjE4XCI7XG5AaW9uaWNvbi12YXItcGx1cy1jaXJjbGVkOiBcIlxcZjIxNlwiO1xuQGlvbmljb24tdmFyLXBsdXMtcm91bmQ6IFwiXFxmMjE3XCI7XG5AaW9uaWNvbi12YXItcG9kaXVtOiBcIlxcZjM0NFwiO1xuQGlvbmljb24tdmFyLXBvdW5kOiBcIlxcZjIxOVwiO1xuQGlvbmljb24tdmFyLXBvd2VyOiBcIlxcZjJhOVwiO1xuQGlvbmljb24tdmFyLXByaWNldGFnOiBcIlxcZjJhYVwiO1xuQGlvbmljb24tdmFyLXByaWNldGFnczogXCJcXGYyYWJcIjtcbkBpb25pY29uLXZhci1wcmludGVyOiBcIlxcZjIxYVwiO1xuQGlvbmljb24tdmFyLXB1bGwtcmVxdWVzdDogXCJcXGYzNDVcIjtcbkBpb25pY29uLXZhci1xci1zY2FubmVyOiBcIlxcZjM0NlwiO1xuQGlvbmljb24tdmFyLXF1b3RlOiBcIlxcZjM0N1wiO1xuQGlvbmljb24tdmFyLXJhZGlvLXdhdmVzOiBcIlxcZjJhY1wiO1xuQGlvbmljb24tdmFyLXJlY29yZDogXCJcXGYyMWJcIjtcbkBpb25pY29uLXZhci1yZWZyZXNoOiBcIlxcZjIxY1wiO1xuQGlvbmljb24tdmFyLXJlcGx5OiBcIlxcZjIxZVwiO1xuQGlvbmljb24tdmFyLXJlcGx5LWFsbDogXCJcXGYyMWRcIjtcbkBpb25pY29uLXZhci1yaWJib24tYTogXCJcXGYzNDhcIjtcbkBpb25pY29uLXZhci1yaWJib24tYjogXCJcXGYzNDlcIjtcbkBpb25pY29uLXZhci1zYWQ6IFwiXFxmMzRhXCI7XG5AaW9uaWNvbi12YXItc2FkLW91dGxpbmU6IFwiXFxmNGQ3XCI7XG5AaW9uaWNvbi12YXItc2Npc3NvcnM6IFwiXFxmMzRiXCI7XG5AaW9uaWNvbi12YXItc2VhcmNoOiBcIlxcZjIxZlwiO1xuQGlvbmljb24tdmFyLXNldHRpbmdzOiBcIlxcZjJhZFwiO1xuQGlvbmljb24tdmFyLXNoYXJlOiBcIlxcZjIyMFwiO1xuQGlvbmljb24tdmFyLXNodWZmbGU6IFwiXFxmMjIxXCI7XG5AaW9uaWNvbi12YXItc2tpcC1iYWNrd2FyZDogXCJcXGYyMjJcIjtcbkBpb25pY29uLXZhci1za2lwLWZvcndhcmQ6IFwiXFxmMjIzXCI7XG5AaW9uaWNvbi12YXItc29jaWFsLWFuZHJvaWQ6IFwiXFxmMjI1XCI7XG5AaW9uaWNvbi12YXItc29jaWFsLWFuZHJvaWQtb3V0bGluZTogXCJcXGYyMjRcIjtcbkBpb25pY29uLXZhci1zb2NpYWwtYW5ndWxhcjogXCJcXGY0ZDlcIjtcbkBpb25pY29uLXZhci1zb2NpYWwtYW5ndWxhci1vdXRsaW5lOiBcIlxcZjRkOFwiO1xuQGlvbmljb24tdmFyLXNvY2lhbC1hcHBsZTogXCJcXGYyMjdcIjtcbkBpb25pY29uLXZhci1zb2NpYWwtYXBwbGUtb3V0bGluZTogXCJcXGYyMjZcIjtcbkBpb25pY29uLXZhci1zb2NpYWwtYml0Y29pbjogXCJcXGYyYWZcIjtcbkBpb25pY29uLXZhci1zb2NpYWwtYml0Y29pbi1vdXRsaW5lOiBcIlxcZjJhZVwiO1xuQGlvbmljb24tdmFyLXNvY2lhbC1idWZmZXI6IFwiXFxmMjI5XCI7XG5AaW9uaWNvbi12YXItc29jaWFsLWJ1ZmZlci1vdXRsaW5lOiBcIlxcZjIyOFwiO1xuQGlvbmljb24tdmFyLXNvY2lhbC1jaHJvbWU6IFwiXFxmNGRiXCI7XG5AaW9uaWNvbi12YXItc29jaWFsLWNocm9tZS1vdXRsaW5lOiBcIlxcZjRkYVwiO1xuQGlvbmljb24tdmFyLXNvY2lhbC1jb2RlcGVuOiBcIlxcZjRkZFwiO1xuQGlvbmljb24tdmFyLXNvY2lhbC1jb2RlcGVuLW91dGxpbmU6IFwiXFxmNGRjXCI7XG5AaW9uaWNvbi12YXItc29jaWFsLWNzczM6IFwiXFxmNGRmXCI7XG5AaW9uaWNvbi12YXItc29jaWFsLWNzczMtb3V0bGluZTogXCJcXGY0ZGVcIjtcbkBpb25pY29uLXZhci1zb2NpYWwtZGVzaWduZXJuZXdzOiBcIlxcZjIyYlwiO1xuQGlvbmljb24tdmFyLXNvY2lhbC1kZXNpZ25lcm5ld3Mtb3V0bGluZTogXCJcXGYyMmFcIjtcbkBpb25pY29uLXZhci1zb2NpYWwtZHJpYmJibGU6IFwiXFxmMjJkXCI7XG5AaW9uaWNvbi12YXItc29jaWFsLWRyaWJiYmxlLW91dGxpbmU6IFwiXFxmMjJjXCI7XG5AaW9uaWNvbi12YXItc29jaWFsLWRyb3Bib3g6IFwiXFxmMjJmXCI7XG5AaW9uaWNvbi12YXItc29jaWFsLWRyb3Bib3gtb3V0bGluZTogXCJcXGYyMmVcIjtcbkBpb25pY29uLXZhci1zb2NpYWwtZXVybzogXCJcXGY0ZTFcIjtcbkBpb25pY29uLXZhci1zb2NpYWwtZXVyby1vdXRsaW5lOiBcIlxcZjRlMFwiO1xuQGlvbmljb24tdmFyLXNvY2lhbC1mYWNlYm9vazogXCJcXGYyMzFcIjtcbkBpb25pY29uLXZhci1zb2NpYWwtZmFjZWJvb2stb3V0bGluZTogXCJcXGYyMzBcIjtcbkBpb25pY29uLXZhci1zb2NpYWwtZm91cnNxdWFyZTogXCJcXGYzNGRcIjtcbkBpb25pY29uLXZhci1zb2NpYWwtZm91cnNxdWFyZS1vdXRsaW5lOiBcIlxcZjM0Y1wiO1xuQGlvbmljb24tdmFyLXNvY2lhbC1mcmVlYnNkLWRldmlsOiBcIlxcZjJjNFwiO1xuQGlvbmljb24tdmFyLXNvY2lhbC1naXRodWI6IFwiXFxmMjMzXCI7XG5AaW9uaWNvbi12YXItc29jaWFsLWdpdGh1Yi1vdXRsaW5lOiBcIlxcZjIzMlwiO1xuQGlvbmljb24tdmFyLXNvY2lhbC1nb29nbGU6IFwiXFxmMzRmXCI7XG5AaW9uaWNvbi12YXItc29jaWFsLWdvb2dsZS1vdXRsaW5lOiBcIlxcZjM0ZVwiO1xuQGlvbmljb24tdmFyLXNvY2lhbC1nb29nbGVwbHVzOiBcIlxcZjIzNVwiO1xuQGlvbmljb24tdmFyLXNvY2lhbC1nb29nbGVwbHVzLW91dGxpbmU6IFwiXFxmMjM0XCI7XG5AaW9uaWNvbi12YXItc29jaWFsLWhhY2tlcm5ld3M6IFwiXFxmMjM3XCI7XG5AaW9uaWNvbi12YXItc29jaWFsLWhhY2tlcm5ld3Mtb3V0bGluZTogXCJcXGYyMzZcIjtcbkBpb25pY29uLXZhci1zb2NpYWwtaHRtbDU6IFwiXFxmNGUzXCI7XG5AaW9uaWNvbi12YXItc29jaWFsLWh0bWw1LW91dGxpbmU6IFwiXFxmNGUyXCI7XG5AaW9uaWNvbi12YXItc29jaWFsLWluc3RhZ3JhbTogXCJcXGYzNTFcIjtcbkBpb25pY29uLXZhci1zb2NpYWwtaW5zdGFncmFtLW91dGxpbmU6IFwiXFxmMzUwXCI7XG5AaW9uaWNvbi12YXItc29jaWFsLWphdmFzY3JpcHQ6IFwiXFxmNGU1XCI7XG5AaW9uaWNvbi12YXItc29jaWFsLWphdmFzY3JpcHQtb3V0bGluZTogXCJcXGY0ZTRcIjtcbkBpb25pY29uLXZhci1zb2NpYWwtbGlua2VkaW46IFwiXFxmMjM5XCI7XG5AaW9uaWNvbi12YXItc29jaWFsLWxpbmtlZGluLW91dGxpbmU6IFwiXFxmMjM4XCI7XG5AaW9uaWNvbi12YXItc29jaWFsLW1hcmtkb3duOiBcIlxcZjRlNlwiO1xuQGlvbmljb24tdmFyLXNvY2lhbC1ub2RlanM6IFwiXFxmNGU3XCI7XG5AaW9uaWNvbi12YXItc29jaWFsLW9jdG9jYXQ6IFwiXFxmNGU4XCI7XG5AaW9uaWNvbi12YXItc29jaWFsLXBpbnRlcmVzdDogXCJcXGYyYjFcIjtcbkBpb25pY29uLXZhci1zb2NpYWwtcGludGVyZXN0LW91dGxpbmU6IFwiXFxmMmIwXCI7XG5AaW9uaWNvbi12YXItc29jaWFsLXB5dGhvbjogXCJcXGY0ZTlcIjtcbkBpb25pY29uLXZhci1zb2NpYWwtcmVkZGl0OiBcIlxcZjIzYlwiO1xuQGlvbmljb24tdmFyLXNvY2lhbC1yZWRkaXQtb3V0bGluZTogXCJcXGYyM2FcIjtcbkBpb25pY29uLXZhci1zb2NpYWwtcnNzOiBcIlxcZjIzZFwiO1xuQGlvbmljb24tdmFyLXNvY2lhbC1yc3Mtb3V0bGluZTogXCJcXGYyM2NcIjtcbkBpb25pY29uLXZhci1zb2NpYWwtc2FzczogXCJcXGY0ZWFcIjtcbkBpb25pY29uLXZhci1zb2NpYWwtc2t5cGU6IFwiXFxmMjNmXCI7XG5AaW9uaWNvbi12YXItc29jaWFsLXNreXBlLW91dGxpbmU6IFwiXFxmMjNlXCI7XG5AaW9uaWNvbi12YXItc29jaWFsLXNuYXBjaGF0OiBcIlxcZjRlY1wiO1xuQGlvbmljb24tdmFyLXNvY2lhbC1zbmFwY2hhdC1vdXRsaW5lOiBcIlxcZjRlYlwiO1xuQGlvbmljb24tdmFyLXNvY2lhbC10dW1ibHI6IFwiXFxmMjQxXCI7XG5AaW9uaWNvbi12YXItc29jaWFsLXR1bWJsci1vdXRsaW5lOiBcIlxcZjI0MFwiO1xuQGlvbmljb24tdmFyLXNvY2lhbC10dXg6IFwiXFxmMmM1XCI7XG5AaW9uaWNvbi12YXItc29jaWFsLXR3aXRjaDogXCJcXGY0ZWVcIjtcbkBpb25pY29uLXZhci1zb2NpYWwtdHdpdGNoLW91dGxpbmU6IFwiXFxmNGVkXCI7XG5AaW9uaWNvbi12YXItc29jaWFsLXR3aXR0ZXI6IFwiXFxmMjQzXCI7XG5AaW9uaWNvbi12YXItc29jaWFsLXR3aXR0ZXItb3V0bGluZTogXCJcXGYyNDJcIjtcbkBpb25pY29uLXZhci1zb2NpYWwtdXNkOiBcIlxcZjM1M1wiO1xuQGlvbmljb24tdmFyLXNvY2lhbC11c2Qtb3V0bGluZTogXCJcXGYzNTJcIjtcbkBpb25pY29uLXZhci1zb2NpYWwtdmltZW86IFwiXFxmMjQ1XCI7XG5AaW9uaWNvbi12YXItc29jaWFsLXZpbWVvLW91dGxpbmU6IFwiXFxmMjQ0XCI7XG5AaW9uaWNvbi12YXItc29jaWFsLXdoYXRzYXBwOiBcIlxcZjRmMFwiO1xuQGlvbmljb24tdmFyLXNvY2lhbC13aGF0c2FwcC1vdXRsaW5lOiBcIlxcZjRlZlwiO1xuQGlvbmljb24tdmFyLXNvY2lhbC13aW5kb3dzOiBcIlxcZjI0N1wiO1xuQGlvbmljb24tdmFyLXNvY2lhbC13aW5kb3dzLW91dGxpbmU6IFwiXFxmMjQ2XCI7XG5AaW9uaWNvbi12YXItc29jaWFsLXdvcmRwcmVzczogXCJcXGYyNDlcIjtcbkBpb25pY29uLXZhci1zb2NpYWwtd29yZHByZXNzLW91dGxpbmU6IFwiXFxmMjQ4XCI7XG5AaW9uaWNvbi12YXItc29jaWFsLXlhaG9vOiBcIlxcZjI0YlwiO1xuQGlvbmljb24tdmFyLXNvY2lhbC15YWhvby1vdXRsaW5lOiBcIlxcZjI0YVwiO1xuQGlvbmljb24tdmFyLXNvY2lhbC15ZW46IFwiXFxmNGYyXCI7XG5AaW9uaWNvbi12YXItc29jaWFsLXllbi1vdXRsaW5lOiBcIlxcZjRmMVwiO1xuQGlvbmljb24tdmFyLXNvY2lhbC15b3V0dWJlOiBcIlxcZjI0ZFwiO1xuQGlvbmljb24tdmFyLXNvY2lhbC15b3V0dWJlLW91dGxpbmU6IFwiXFxmMjRjXCI7XG5AaW9uaWNvbi12YXItc291cC1jYW46IFwiXFxmNGY0XCI7XG5AaW9uaWNvbi12YXItc291cC1jYW4tb3V0bGluZTogXCJcXGY0ZjNcIjtcbkBpb25pY29uLXZhci1zcGVha2VycGhvbmU6IFwiXFxmMmIyXCI7XG5AaW9uaWNvbi12YXItc3BlZWRvbWV0ZXI6IFwiXFxmMmIzXCI7XG5AaW9uaWNvbi12YXItc3Bvb246IFwiXFxmMmI0XCI7XG5AaW9uaWNvbi12YXItc3RhcjogXCJcXGYyNGVcIjtcbkBpb25pY29uLXZhci1zdGF0cy1iYXJzOiBcIlxcZjJiNVwiO1xuQGlvbmljb24tdmFyLXN0ZWFtOiBcIlxcZjMwYlwiO1xuQGlvbmljb24tdmFyLXN0b3A6IFwiXFxmMjRmXCI7XG5AaW9uaWNvbi12YXItdGhlcm1vbWV0ZXI6IFwiXFxmMmI2XCI7XG5AaW9uaWNvbi12YXItdGh1bWJzZG93bjogXCJcXGYyNTBcIjtcbkBpb25pY29uLXZhci10aHVtYnN1cDogXCJcXGYyNTFcIjtcbkBpb25pY29uLXZhci10b2dnbGU6IFwiXFxmMzU1XCI7XG5AaW9uaWNvbi12YXItdG9nZ2xlLWZpbGxlZDogXCJcXGYzNTRcIjtcbkBpb25pY29uLXZhci10cmFuc2dlbmRlcjogXCJcXGY0ZjVcIjtcbkBpb25pY29uLXZhci10cmFzaC1hOiBcIlxcZjI1MlwiO1xuQGlvbmljb24tdmFyLXRyYXNoLWI6IFwiXFxmMjUzXCI7XG5AaW9uaWNvbi12YXItdHJvcGh5OiBcIlxcZjM1NlwiO1xuQGlvbmljb24tdmFyLXRzaGlydDogXCJcXGY0ZjdcIjtcbkBpb25pY29uLXZhci10c2hpcnQtb3V0bGluZTogXCJcXGY0ZjZcIjtcbkBpb25pY29uLXZhci11bWJyZWxsYTogXCJcXGYyYjdcIjtcbkBpb25pY29uLXZhci11bml2ZXJzaXR5OiBcIlxcZjM1N1wiO1xuQGlvbmljb24tdmFyLXVubG9ja2VkOiBcIlxcZjI1NFwiO1xuQGlvbmljb24tdmFyLXVwbG9hZDogXCJcXGYyNTVcIjtcbkBpb25pY29uLXZhci11c2I6IFwiXFxmMmI4XCI7XG5AaW9uaWNvbi12YXItdmlkZW9jYW1lcmE6IFwiXFxmMjU2XCI7XG5AaW9uaWNvbi12YXItdm9sdW1lLWhpZ2g6IFwiXFxmMjU3XCI7XG5AaW9uaWNvbi12YXItdm9sdW1lLWxvdzogXCJcXGYyNThcIjtcbkBpb25pY29uLXZhci12b2x1bWUtbWVkaXVtOiBcIlxcZjI1OVwiO1xuQGlvbmljb24tdmFyLXZvbHVtZS1tdXRlOiBcIlxcZjI1YVwiO1xuQGlvbmljb24tdmFyLXdhbmQ6IFwiXFxmMzU4XCI7XG5AaW9uaWNvbi12YXItd2F0ZXJkcm9wOiBcIlxcZjI1YlwiO1xuQGlvbmljb24tdmFyLXdpZmk6IFwiXFxmMjVjXCI7XG5AaW9uaWNvbi12YXItd2luZWdsYXNzOiBcIlxcZjJiOVwiO1xuQGlvbmljb24tdmFyLXdvbWFuOiBcIlxcZjI1ZFwiO1xuQGlvbmljb24tdmFyLXdyZW5jaDogXCJcXGYyYmFcIjtcbkBpb25pY29uLXZhci14Ym94OiBcIlxcZjMwY1wiOyIsIi8vIEFuaW1hdGlvbiBJY29uc1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLnNwaW4oKSB7XG4gIC13ZWJraXQtYW5pbWF0aW9uOiBzcGluIDFzIGluZmluaXRlIGxpbmVhcjtcbiAgLW1vei1hbmltYXRpb246IHNwaW4gMXMgaW5maW5pdGUgbGluZWFyO1xuICAtby1hbmltYXRpb246IHNwaW4gMXMgaW5maW5pdGUgbGluZWFyO1xuICBhbmltYXRpb246IHNwaW4gMXMgaW5maW5pdGUgbGluZWFyO1xufVxuXG4uQHtpb25pY29ucy1wcmVmaXh9bG9hZGluZy1hLFxuLkB7aW9uaWNvbnMtcHJlZml4fWxvYWRpbmctYixcbi5Ae2lvbmljb25zLXByZWZpeH1sb2FkaW5nLWMsXG4uQHtpb25pY29ucy1wcmVmaXh9bG9hZGluZy1kLFxuLkB7aW9uaWNvbnMtcHJlZml4fWxvb3BpbmcsXG4uQHtpb25pY29ucy1wcmVmaXh9cmVmcmVzaGluZyxcbi5Ae2lvbmljb25zLXByZWZpeH1pb3M3LXJlbG9hZGluZyB7XG4gICY6ZXh0ZW5kKC5pb24pO1xufVxuXG4uQHtpb25pY29ucy1wcmVmaXh9c3Bpbixcbi5Ae2lvbmljb25zLXByZWZpeH1sb2FkaW5nLWEsXG4uQHtpb25pY29ucy1wcmVmaXh9bG9hZGluZy1iLFxuLkB7aW9uaWNvbnMtcHJlZml4fWxvYWRpbmctYyxcbi5Ae2lvbmljb25zLXByZWZpeH1sb2FkaW5nLWQsXG4uQHtpb25pY29ucy1wcmVmaXh9bG9vcGluZyxcbi5Ae2lvbmljb25zLXByZWZpeH1yZWZyZXNoaW5nLFxuLkB7aW9uaWNvbnMtcHJlZml4fWlvczctcmVsb2FkaW5nIHtcbiAgLnNwaW4oKVxufVxuXG5ALW1vei1rZXlmcmFtZXMgc3BpbiB7XG4gIDAlIHsgLW1vei10cmFuc2Zvcm06IHJvdGF0ZSgwZGVnKTsgfVxuICAxMDAlIHsgLW1vei10cmFuc2Zvcm06IHJvdGF0ZSgzNTlkZWcpOyB9XG59XG5ALXdlYmtpdC1rZXlmcmFtZXMgc3BpbiB7XG4gIDAlIHsgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZSgwZGVnKTsgfVxuICAxMDAlIHsgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZSgzNTlkZWcpOyB9XG59XG5ALW8ta2V5ZnJhbWVzIHNwaW4ge1xuICAwJSB7IC1vLXRyYW5zZm9ybTogcm90YXRlKDBkZWcpOyB9XG4gIDEwMCUgeyAtby10cmFuc2Zvcm06IHJvdGF0ZSgzNTlkZWcpOyB9XG59XG5ALW1zLWtleWZyYW1lcyBzcGluIHtcbiAgMCUgeyAtbXMtdHJhbnNmb3JtOiByb3RhdGUoMGRlZyk7IH1cbiAgMTAwJSB7IC1tcy10cmFuc2Zvcm06IHJvdGF0ZSgzNTlkZWcpOyB9XG59XG5Aa2V5ZnJhbWVzIHNwaW4ge1xuICAwJSB7IHRyYW5zZm9ybTogcm90YXRlKDBkZWcpOyB9XG4gIDEwMCUgeyB0cmFuc2Zvcm06IHJvdGF0ZSgzNTlkZWcpOyB9XG59XG5cbi5Ae2lvbmljb25zLXByZWZpeH1sb2FkaW5nLWEge1xuICAtd2Via2l0LWFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IHN0ZXBzKDgsIHN0YXJ0KTtcbiAgLW1vei1hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBzdGVwcyg4LCBzdGFydCk7XG4gIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IHN0ZXBzKDgsIHN0YXJ0KTtcbn1cblxuLkB7aW9uaWNvbnMtcHJlZml4fWxvYWRpbmctYTpiZWZvcmUgeyBcbiAgJjpleHRlbmQoLkB7aW9uaWNvbnMtcHJlZml4fWxvYWQtYTpiZWZvcmUpO1xufVxuXG4uQHtpb25pY29ucy1wcmVmaXh9bG9hZGluZy1iOmJlZm9yZSB7IFxuICAmOmV4dGVuZCguQHtpb25pY29ucy1wcmVmaXh9bG9hZC1iOmJlZm9yZSk7XG59XG5cbi5Ae2lvbmljb25zLXByZWZpeH1sb2FkaW5nLWM6YmVmb3JlIHsgXG4gICY6ZXh0ZW5kKC5Ae2lvbmljb25zLXByZWZpeH1sb2FkLWM6YmVmb3JlKTtcbn1cblxuLkB7aW9uaWNvbnMtcHJlZml4fWxvYWRpbmctZDpiZWZvcmUgeyBcbiAgJjpleHRlbmQoLkB7aW9uaWNvbnMtcHJlZml4fWxvYWQtZDpiZWZvcmUpO1xufVxuXG4uQHtpb25pY29ucy1wcmVmaXh9bG9vcGluZzpiZWZvcmUgeyBcbiAgJjpleHRlbmQoLkB7aW9uaWNvbnMtcHJlZml4fWxvb3A6YmVmb3JlKTtcbn1cblxuLkB7aW9uaWNvbnMtcHJlZml4fXJlZnJlc2hpbmc6YmVmb3JlIHsgXG4gICY6ZXh0ZW5kKC5Ae2lvbmljb25zLXByZWZpeH1yZWZyZXNoOmJlZm9yZSk7XG59XG5cbi5Ae2lvbmljb25zLXByZWZpeH1pb3M3LXJlbG9hZGluZzpiZWZvcmUgeyBcbiAgJjpleHRlbmQoLkB7aW9uaWNvbnMtcHJlZml4fWlvczctcmVsb2FkOmJlZm9yZSk7XG59XG4iLCIvLyBJb25pY29ucyBJY29uc1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLmlvbmljb25zLFxuLkB7aW9uaWNvbnMtcHJlZml4fWFsZXJ0OmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1hbGVydC1jaXJjbGVkOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1hbmRyb2lkLWFkZDpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9YW5kcm9pZC1hZGQtY2lyY2xlOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1hbmRyb2lkLWFsYXJtLWNsb2NrOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1hbmRyb2lkLWFsZXJ0OmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1hbmRyb2lkLWFwcHM6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWFuZHJvaWQtYXJjaGl2ZTpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9YW5kcm9pZC1hcnJvdy1iYWNrOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1hbmRyb2lkLWFycm93LWRvd246YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWFuZHJvaWQtYXJyb3ctZHJvcGRvd246YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWFuZHJvaWQtYXJyb3ctZHJvcGRvd24tY2lyY2xlOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1hbmRyb2lkLWFycm93LWRyb3BsZWZ0OmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1hbmRyb2lkLWFycm93LWRyb3BsZWZ0LWNpcmNsZTpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9YW5kcm9pZC1hcnJvdy1kcm9wcmlnaHQ6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWFuZHJvaWQtYXJyb3ctZHJvcHJpZ2h0LWNpcmNsZTpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9YW5kcm9pZC1hcnJvdy1kcm9wdXA6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWFuZHJvaWQtYXJyb3ctZHJvcHVwLWNpcmNsZTpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9YW5kcm9pZC1hcnJvdy1mb3J3YXJkOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1hbmRyb2lkLWFycm93LXVwOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1hbmRyb2lkLWF0dGFjaDpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9YW5kcm9pZC1iYXI6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWFuZHJvaWQtYmljeWNsZTpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9YW5kcm9pZC1ib2F0OmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1hbmRyb2lkLWJvb2ttYXJrOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1hbmRyb2lkLWJ1bGI6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWFuZHJvaWQtYnVzOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1hbmRyb2lkLWNhbGVuZGFyOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1hbmRyb2lkLWNhbGw6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWFuZHJvaWQtY2FtZXJhOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1hbmRyb2lkLWNhbmNlbDpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9YW5kcm9pZC1jYXI6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWFuZHJvaWQtY2FydDpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9YW5kcm9pZC1jaGF0OmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1hbmRyb2lkLWNoZWNrYm94OmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1hbmRyb2lkLWNoZWNrYm94LWJsYW5rOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1hbmRyb2lkLWNoZWNrYm94LW91dGxpbmU6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWFuZHJvaWQtY2hlY2tib3gtb3V0bGluZS1ibGFuazpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9YW5kcm9pZC1jaGVja21hcmstY2lyY2xlOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1hbmRyb2lkLWNsaXBib2FyZDpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9YW5kcm9pZC1jbG9zZTpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9YW5kcm9pZC1jbG91ZDpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9YW5kcm9pZC1jbG91ZC1jaXJjbGU6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWFuZHJvaWQtY2xvdWQtZG9uZTpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9YW5kcm9pZC1jbG91ZC1vdXRsaW5lOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1hbmRyb2lkLWNvbG9yLXBhbGV0dGU6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWFuZHJvaWQtY29tcGFzczpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9YW5kcm9pZC1jb250YWN0OmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1hbmRyb2lkLWNvbnRhY3RzOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1hbmRyb2lkLWNvbnRyYWN0OmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1hbmRyb2lkLWNyZWF0ZTpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9YW5kcm9pZC1kZWxldGU6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWFuZHJvaWQtZGVza3RvcDpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9YW5kcm9pZC1kb2N1bWVudDpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9YW5kcm9pZC1kb25lOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1hbmRyb2lkLWRvbmUtYWxsOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1hbmRyb2lkLWRvd25sb2FkOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1hbmRyb2lkLWRyYWZ0czpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9YW5kcm9pZC1leGl0OmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1hbmRyb2lkLWV4cGFuZDpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9YW5kcm9pZC1mYXZvcml0ZTpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9YW5kcm9pZC1mYXZvcml0ZS1vdXRsaW5lOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1hbmRyb2lkLWZpbG06YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWFuZHJvaWQtZm9sZGVyOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1hbmRyb2lkLWZvbGRlci1vcGVuOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1hbmRyb2lkLWZ1bm5lbDpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9YW5kcm9pZC1nbG9iZTpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9YW5kcm9pZC1oYW5kOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1hbmRyb2lkLWhhbmdvdXQ6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWFuZHJvaWQtaGFwcHk6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWFuZHJvaWQtaG9tZTpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9YW5kcm9pZC1pbWFnZTpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9YW5kcm9pZC1sYXB0b3A6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWFuZHJvaWQtbGlzdDpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9YW5kcm9pZC1sb2NhdGU6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWFuZHJvaWQtbG9jazpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9YW5kcm9pZC1tYWlsOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1hbmRyb2lkLW1hcDpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9YW5kcm9pZC1tZW51OmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1hbmRyb2lkLW1pY3JvcGhvbmU6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWFuZHJvaWQtbWljcm9waG9uZS1vZmY6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWFuZHJvaWQtbW9yZS1ob3Jpem9udGFsOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1hbmRyb2lkLW1vcmUtdmVydGljYWw6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWFuZHJvaWQtbmF2aWdhdGU6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWFuZHJvaWQtbm90aWZpY2F0aW9uczpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9YW5kcm9pZC1ub3RpZmljYXRpb25zLW5vbmU6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWFuZHJvaWQtbm90aWZpY2F0aW9ucy1vZmY6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWFuZHJvaWQtb3BlbjpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9YW5kcm9pZC1vcHRpb25zOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1hbmRyb2lkLXBlb3BsZTpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9YW5kcm9pZC1wZXJzb246YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWFuZHJvaWQtcGVyc29uLWFkZDpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9YW5kcm9pZC1waG9uZS1sYW5kc2NhcGU6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWFuZHJvaWQtcGhvbmUtcG9ydHJhaXQ6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWFuZHJvaWQtcGluOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1hbmRyb2lkLXBsYW5lOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1hbmRyb2lkLXBsYXlzdG9yZTpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9YW5kcm9pZC1wcmludDpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9YW5kcm9pZC1yYWRpby1idXR0b24tb2ZmOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1hbmRyb2lkLXJhZGlvLWJ1dHRvbi1vbjpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9YW5kcm9pZC1yZWZyZXNoOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1hbmRyb2lkLXJlbW92ZTpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9YW5kcm9pZC1yZW1vdmUtY2lyY2xlOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1hbmRyb2lkLXJlc3RhdXJhbnQ6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWFuZHJvaWQtc2FkOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1hbmRyb2lkLXNlYXJjaDpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9YW5kcm9pZC1zZW5kOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1hbmRyb2lkLXNldHRpbmdzOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1hbmRyb2lkLXNoYXJlOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1hbmRyb2lkLXNoYXJlLWFsdDpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9YW5kcm9pZC1zdGFyOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1hbmRyb2lkLXN0YXItaGFsZjpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9YW5kcm9pZC1zdGFyLW91dGxpbmU6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWFuZHJvaWQtc3RvcHdhdGNoOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1hbmRyb2lkLXN1YndheTpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9YW5kcm9pZC1zdW5ueTpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9YW5kcm9pZC1zeW5jOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1hbmRyb2lkLXRleHRzbXM6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWFuZHJvaWQtdGltZTpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9YW5kcm9pZC10cmFpbjpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9YW5kcm9pZC11bmxvY2s6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWFuZHJvaWQtdXBsb2FkOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1hbmRyb2lkLXZvbHVtZS1kb3duOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1hbmRyb2lkLXZvbHVtZS1tdXRlOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1hbmRyb2lkLXZvbHVtZS1vZmY6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWFuZHJvaWQtdm9sdW1lLXVwOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1hbmRyb2lkLXdhbGs6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWFuZHJvaWQtd2FybmluZzpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9YW5kcm9pZC13YXRjaDpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9YW5kcm9pZC13aWZpOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1hcGVydHVyZTpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9YXJjaGl2ZTpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9YXJyb3ctZG93bi1hOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1hcnJvdy1kb3duLWI6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWFycm93LWRvd24tYzpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9YXJyb3ctZXhwYW5kOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1hcnJvdy1ncmFwaC1kb3duLWxlZnQ6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWFycm93LWdyYXBoLWRvd24tcmlnaHQ6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWFycm93LWdyYXBoLXVwLWxlZnQ6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWFycm93LWdyYXBoLXVwLXJpZ2h0OmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1hcnJvdy1sZWZ0LWE6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWFycm93LWxlZnQtYjpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9YXJyb3ctbGVmdC1jOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1hcnJvdy1tb3ZlOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1hcnJvdy1yZXNpemU6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWFycm93LXJldHVybi1sZWZ0OmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1hcnJvdy1yZXR1cm4tcmlnaHQ6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWFycm93LXJpZ2h0LWE6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWFycm93LXJpZ2h0LWI6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWFycm93LXJpZ2h0LWM6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWFycm93LXNocmluazpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9YXJyb3ctc3dhcDpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9YXJyb3ctdXAtYTpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9YXJyb3ctdXAtYjpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9YXJyb3ctdXAtYzpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9YXN0ZXJpc2s6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWF0OmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1iYWNrc3BhY2U6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWJhY2tzcGFjZS1vdXRsaW5lOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1iYWc6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWJhdHRlcnktY2hhcmdpbmc6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWJhdHRlcnktZW1wdHk6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWJhdHRlcnktZnVsbDpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9YmF0dGVyeS1oYWxmOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1iYXR0ZXJ5LWxvdzpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9YmVha2VyOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1iZWVyOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1ibHVldG9vdGg6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWJvbmZpcmU6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWJvb2ttYXJrOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1ib3d0aWU6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWJyaWVmY2FzZTpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9YnVnOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1jYWxjdWxhdG9yOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1jYWxlbmRhcjpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9Y2FtZXJhOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1jYXJkOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1jYXNoOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1jaGF0Ym94OmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1jaGF0Ym94LXdvcmtpbmc6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWNoYXRib3hlczpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9Y2hhdGJ1YmJsZTpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9Y2hhdGJ1YmJsZS13b3JraW5nOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1jaGF0YnViYmxlczpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9Y2hlY2ttYXJrOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1jaGVja21hcmstY2lyY2xlZDpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9Y2hlY2ttYXJrLXJvdW5kOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1jaGV2cm9uLWRvd246YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWNoZXZyb24tbGVmdDpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9Y2hldnJvbi1yaWdodDpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9Y2hldnJvbi11cDpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9Y2xpcGJvYXJkOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1jbG9jazpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9Y2xvc2U6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWNsb3NlLWNpcmNsZWQ6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWNsb3NlLXJvdW5kOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1jbG9zZWQtY2FwdGlvbmluZzpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9Y2xvdWQ6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWNvZGU6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWNvZGUtZG93bmxvYWQ6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWNvZGUtd29ya2luZzpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9Y29mZmVlOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1jb21wYXNzOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1jb21wb3NlOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1jb25uZWN0aW9uLWJhcnM6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWNvbnRyYXN0OmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1jcm9wOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1jdWJlOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1kaXNjOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1kb2N1bWVudDpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9ZG9jdW1lbnQtdGV4dDpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9ZHJhZzpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9ZWFydGg6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWVhc2VsOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1lZGl0OmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1lZ2c6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWVqZWN0OmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1lbWFpbDpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9ZW1haWwtdW5yZWFkOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1lcmxlbm1leWVyLWZsYXNrOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1lcmxlbm1leWVyLWZsYXNrLWJ1YmJsZXM6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWV5ZTpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9ZXllLWRpc2FibGVkOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1mZW1hbGU6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWZpbGluZzpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9ZmlsbS1tYXJrZXI6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWZpcmViYWxsOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1mbGFnOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1mbGFtZTpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9Zmxhc2g6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWZsYXNoLW9mZjpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9Zm9sZGVyOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1mb3JrOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1mb3JrLXJlcG86YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWZvcndhcmQ6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWZ1bm5lbDpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9Z2Vhci1hOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1nZWFyLWI6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWdyaWQ6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWhhbW1lcjpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9aGFwcHk6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWhhcHB5LW91dGxpbmU6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWhlYWRwaG9uZTpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9aGVhcnQ6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWhlYXJ0LWJyb2tlbjpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9aGVscDpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9aGVscC1idW95OmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1oZWxwLWNpcmNsZWQ6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWhvbWU6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWljZWNyZWFtOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1pbWFnZTpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9aW1hZ2VzOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1pbmZvcm1hdGlvbjpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9aW5mb3JtYXRpb24tY2lyY2xlZDpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9aW9uaWM6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1hbGFybTpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLWFsYXJtLW91dGxpbmU6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1hbGJ1bXM6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1hbGJ1bXMtb3V0bGluZTpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLWFtZXJpY2FuZm9vdGJhbGw6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1hbWVyaWNhbmZvb3RiYWxsLW91dGxpbmU6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1hbmFseXRpY3M6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1hbmFseXRpY3Mtb3V0bGluZTpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLWFycm93LWJhY2s6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1hcnJvdy1kb3duOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtYXJyb3ctZm9yd2FyZDpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLWFycm93LWxlZnQ6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1hcnJvdy1yaWdodDpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLWFycm93LXRoaW4tZG93bjpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLWFycm93LXRoaW4tbGVmdDpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLWFycm93LXRoaW4tcmlnaHQ6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1hcnJvdy10aGluLXVwOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtYXJyb3ctdXA6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1hdDpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLWF0LW91dGxpbmU6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1iYXJjb2RlOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtYmFyY29kZS1vdXRsaW5lOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtYmFzZWJhbGw6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1iYXNlYmFsbC1vdXRsaW5lOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtYmFza2V0YmFsbDpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLWJhc2tldGJhbGwtb3V0bGluZTpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLWJlbGw6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1iZWxsLW91dGxpbmU6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1ib2R5OmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtYm9keS1vdXRsaW5lOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtYm9sdDpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLWJvbHQtb3V0bGluZTpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLWJvb2s6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1ib29rLW91dGxpbmU6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1ib29rbWFya3M6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1ib29rbWFya3Mtb3V0bGluZTpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLWJveDpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLWJveC1vdXRsaW5lOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtYnJpZWZjYXNlOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtYnJpZWZjYXNlLW91dGxpbmU6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1icm93c2VyczpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLWJyb3dzZXJzLW91dGxpbmU6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1jYWxjdWxhdG9yOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtY2FsY3VsYXRvci1vdXRsaW5lOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtY2FsZW5kYXI6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1jYWxlbmRhci1vdXRsaW5lOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtY2FtZXJhOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtY2FtZXJhLW91dGxpbmU6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1jYXJ0OmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtY2FydC1vdXRsaW5lOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtY2hhdGJveGVzOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtY2hhdGJveGVzLW91dGxpbmU6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1jaGF0YnViYmxlOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtY2hhdGJ1YmJsZS1vdXRsaW5lOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtY2hlY2ttYXJrOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtY2hlY2ttYXJrLWVtcHR5OmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtY2hlY2ttYXJrLW91dGxpbmU6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1jaXJjbGUtZmlsbGVkOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtY2lyY2xlLW91dGxpbmU6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1jbG9jazpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLWNsb2NrLW91dGxpbmU6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1jbG9zZTpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLWNsb3NlLWVtcHR5OmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtY2xvc2Utb3V0bGluZTpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLWNsb3VkOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtY2xvdWQtZG93bmxvYWQ6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1jbG91ZC1kb3dubG9hZC1vdXRsaW5lOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtY2xvdWQtb3V0bGluZTpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLWNsb3VkLXVwbG9hZDpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLWNsb3VkLXVwbG9hZC1vdXRsaW5lOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtY2xvdWR5OmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtY2xvdWR5LW5pZ2h0OmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtY2xvdWR5LW5pZ2h0LW91dGxpbmU6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1jbG91ZHktb3V0bGluZTpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLWNvZzpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLWNvZy1vdXRsaW5lOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtY29sb3ItZmlsdGVyOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtY29sb3ItZmlsdGVyLW91dGxpbmU6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1jb2xvci13YW5kOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtY29sb3Itd2FuZC1vdXRsaW5lOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtY29tcG9zZTpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLWNvbXBvc2Utb3V0bGluZTpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLWNvbnRhY3Q6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1jb250YWN0LW91dGxpbmU6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1jb3B5OmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtY29weS1vdXRsaW5lOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtY3JvcDpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLWNyb3Atc3Ryb25nOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtZG93bmxvYWQ6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1kb3dubG9hZC1vdXRsaW5lOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtZHJhZzpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLWVtYWlsOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtZW1haWwtb3V0bGluZTpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLWV5ZTpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLWV5ZS1vdXRsaW5lOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtZmFzdGZvcndhcmQ6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1mYXN0Zm9yd2FyZC1vdXRsaW5lOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtZmlsaW5nOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtZmlsaW5nLW91dGxpbmU6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1maWxtOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtZmlsbS1vdXRsaW5lOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtZmxhZzpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLWZsYWctb3V0bGluZTpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLWZsYW1lOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtZmxhbWUtb3V0bGluZTpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLWZsYXNrOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtZmxhc2stb3V0bGluZTpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLWZsb3dlcjpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLWZsb3dlci1vdXRsaW5lOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtZm9sZGVyOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtZm9sZGVyLW91dGxpbmU6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1mb290YmFsbDpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLWZvb3RiYWxsLW91dGxpbmU6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1nYW1lLWNvbnRyb2xsZXItYTpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLWdhbWUtY29udHJvbGxlci1hLW91dGxpbmU6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1nYW1lLWNvbnRyb2xsZXItYjpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLWdhbWUtY29udHJvbGxlci1iLW91dGxpbmU6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1nZWFyOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtZ2Vhci1vdXRsaW5lOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtZ2xhc3NlczpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLWdsYXNzZXMtb3V0bGluZTpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLWdyaWQtdmlldzpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLWdyaWQtdmlldy1vdXRsaW5lOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtaGVhcnQ6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1oZWFydC1vdXRsaW5lOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtaGVscDpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLWhlbHAtZW1wdHk6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1oZWxwLW91dGxpbmU6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1ob21lOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtaG9tZS1vdXRsaW5lOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtaW5maW5pdGU6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1pbmZpbml0ZS1vdXRsaW5lOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtaW5mb3JtYXRpb246YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1pbmZvcm1hdGlvbi1lbXB0eTpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLWluZm9ybWF0aW9uLW91dGxpbmU6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1pb25pYy1vdXRsaW5lOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1pb3Mta2V5cGFkOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1pb3Mta2V5cGFkLW91dGxpbmU6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1saWdodGJ1bGI6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1saWdodGJ1bGItb3V0bGluZTpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLWxpc3Q6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1saXN0LW91dGxpbmU6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1sb2NhdGlvbjpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLWxvY2F0aW9uLW91dGxpbmU6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1sb2NrZWQ6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1sb2NrZWQtb3V0bGluZTpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLWxvb3A6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1sb29wLXN0cm9uZzpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLW1lZGljYWw6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1tZWRpY2FsLW91dGxpbmU6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1tZWRraXQ6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1tZWRraXQtb3V0bGluZTpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLW1pYzpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLW1pYy1vZmY6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1taWMtb3V0bGluZTpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLW1pbnVzOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtbWludXMtZW1wdHk6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1taW51cy1vdXRsaW5lOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtbW9uaXRvcjpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLW1vbml0b3Itb3V0bGluZTpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLW1vb246YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1tb29uLW91dGxpbmU6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1tb3JlOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtbW9yZS1vdXRsaW5lOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtbXVzaWNhbC1ub3RlOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtbXVzaWNhbC1ub3RlczpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLW5hdmlnYXRlOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtbmF2aWdhdGUtb3V0bGluZTpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLW51dHJpdGlvbjpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLW51dHJpdGlvbi1vdXRsaW5lOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtcGFwZXI6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1wYXBlci1vdXRsaW5lOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtcGFwZXJwbGFuZTpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLXBhcGVycGxhbmUtb3V0bGluZTpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLXBhcnRseXN1bm55OmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtcGFydGx5c3Vubnktb3V0bGluZTpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLXBhdXNlOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtcGF1c2Utb3V0bGluZTpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLXBhdzpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLXBhdy1vdXRsaW5lOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtcGVvcGxlOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtcGVvcGxlLW91dGxpbmU6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1wZXJzb246YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1wZXJzb24tb3V0bGluZTpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLXBlcnNvbmFkZDpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLXBlcnNvbmFkZC1vdXRsaW5lOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtcGhvdG9zOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtcGhvdG9zLW91dGxpbmU6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1waWU6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1waWUtb3V0bGluZTpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLXBpbnQ6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1waW50LW91dGxpbmU6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1wbGF5OmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtcGxheS1vdXRsaW5lOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtcGx1czpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLXBsdXMtZW1wdHk6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1wbHVzLW91dGxpbmU6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1wcmljZXRhZzpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLXByaWNldGFnLW91dGxpbmU6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1wcmljZXRhZ3M6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1wcmljZXRhZ3Mtb3V0bGluZTpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLXByaW50ZXI6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1wcmludGVyLW91dGxpbmU6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1wdWxzZTpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLXB1bHNlLXN0cm9uZzpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLXJhaW55OmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtcmFpbnktb3V0bGluZTpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLXJlY29yZGluZzpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLXJlY29yZGluZy1vdXRsaW5lOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtcmVkbzpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLXJlZG8tb3V0bGluZTpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLXJlZnJlc2g6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1yZWZyZXNoLWVtcHR5OmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtcmVmcmVzaC1vdXRsaW5lOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtcmVsb2FkOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtcmV2ZXJzZS1jYW1lcmE6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1yZXZlcnNlLWNhbWVyYS1vdXRsaW5lOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtcmV3aW5kOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtcmV3aW5kLW91dGxpbmU6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1yb3NlOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1pb3Mtcm9zZS1vdXRsaW5lOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1pb3Mtc2VhcmNoOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1pb3Mtc2VhcmNoLXN0cm9uZzpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLXNldHRpbmdzOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1pb3Mtc2V0dGluZ3Mtc3Ryb25nOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1pb3Mtc2h1ZmZsZTpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLXNodWZmbGUtc3Ryb25nOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1pb3Mtc2tpcGJhY2t3YXJkOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1pb3Mtc2tpcGJhY2t3YXJkLW91dGxpbmU6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1za2lwZm9yd2FyZDpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLXNraXBmb3J3YXJkLW91dGxpbmU6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1zbm93eTpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLXNwZWVkb21ldGVyOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1pb3Mtc3BlZWRvbWV0ZXItb3V0bGluZTpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLXN0YXI6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1zdGFyLWhhbGY6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1zdGFyLW91dGxpbmU6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1zdG9wd2F0Y2g6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1zdG9wd2F0Y2gtb3V0bGluZTpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLXN1bm55OmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1pb3Mtc3Vubnktb3V0bGluZTpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLXRlbGVwaG9uZTpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLXRlbGVwaG9uZS1vdXRsaW5lOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtdGVubmlzYmFsbDpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLXRlbm5pc2JhbGwtb3V0bGluZTpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLXRodW5kZXJzdG9ybTpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLXRodW5kZXJzdG9ybS1vdXRsaW5lOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtdGltZTpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLXRpbWUtb3V0bGluZTpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLXRpbWVyOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtdGltZXItb3V0bGluZTpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLXRvZ2dsZTpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLXRvZ2dsZS1vdXRsaW5lOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtdHJhc2g6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy10cmFzaC1vdXRsaW5lOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtdW5kbzpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLXVuZG8tb3V0bGluZTpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLXVubG9ja2VkOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtdW5sb2NrZWQtb3V0bGluZTpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLXVwbG9hZDpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLXVwbG9hZC1vdXRsaW5lOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtdmlkZW9jYW06YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy12aWRlb2NhbS1vdXRsaW5lOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1pb3Mtdm9sdW1lLWhpZ2g6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy12b2x1bWUtbG93OmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1pb3Mtd2luZWdsYXNzOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1pb3Mtd2luZWdsYXNzLW91dGxpbmU6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy13b3JsZDpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLXdvcmxkLW91dGxpbmU6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWlwYWQ6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWlwaG9uZTpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9aXBvZDpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9amV0OmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1rZXk6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWtuaWZlOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1sYXB0b3A6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWxlYWY6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWxldmVsczpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9bGlnaHRidWxiOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1saW5rOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1sb2FkLWE6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWxvYWQtYjpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9bG9hZC1jOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1sb2FkLWQ6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWxvY2F0aW9uOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1sb2NrLWNvbWJpbmF0aW9uOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1sb2NrZWQ6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fWxvZy1pbjpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9bG9nLW91dDpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9bG9vcDpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9bWFnbmV0OmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1tYWxlOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1tYW46YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fW1hcDpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9bWVka2l0OmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1tZXJnZTpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9bWljLWE6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fW1pYy1iOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1taWMtYzpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9bWludXM6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fW1pbnVzLWNpcmNsZWQ6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fW1pbnVzLXJvdW5kOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1tb2RlbC1zOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1tb25pdG9yOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1tb3JlOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1tb3VzZTpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9bXVzaWMtbm90ZTpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9bmF2aWNvbjpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9bmF2aWNvbi1yb3VuZDpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9bmF2aWdhdGU6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fW5ldHdvcms6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fW5vLXNtb2tpbmc6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fW51Y2xlYXI6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fW91dGxldDpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9cGFpbnRicnVzaDpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9cGFpbnRidWNrZXQ6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fXBhcGVyLWFpcnBsYW5lOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1wYXBlcmNsaXA6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fXBhdXNlOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1wZXJzb246YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fXBlcnNvbi1hZGQ6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fXBlcnNvbi1zdGFsa2VyOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1waWUtZ3JhcGg6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fXBpbjpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9cGlucG9pbnQ6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fXBpenphOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1wbGFuZTpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9cGxhbmV0OmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1wbGF5OmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1wbGF5c3RhdGlvbjpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9cGx1czpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9cGx1cy1jaXJjbGVkOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1wbHVzLXJvdW5kOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1wb2RpdW06YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fXBvdW5kOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1wb3dlcjpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9cHJpY2V0YWc6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fXByaWNldGFnczpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9cHJpbnRlcjpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9cHVsbC1yZXF1ZXN0OmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1xci1zY2FubmVyOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1xdW90ZTpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9cmFkaW8td2F2ZXM6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fXJlY29yZDpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9cmVmcmVzaDpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9cmVwbHk6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fXJlcGx5LWFsbDpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9cmliYm9uLWE6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fXJpYmJvbi1iOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1zYWQ6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fXNhZC1vdXRsaW5lOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1zY2lzc29yczpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9c2VhcmNoOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1zZXR0aW5nczpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9c2hhcmU6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fXNodWZmbGU6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fXNraXAtYmFja3dhcmQ6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fXNraXAtZm9yd2FyZDpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9c29jaWFsLWFuZHJvaWQ6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fXNvY2lhbC1hbmRyb2lkLW91dGxpbmU6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fXNvY2lhbC1hbmd1bGFyOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1zb2NpYWwtYW5ndWxhci1vdXRsaW5lOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1zb2NpYWwtYXBwbGU6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fXNvY2lhbC1hcHBsZS1vdXRsaW5lOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1zb2NpYWwtYml0Y29pbjpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9c29jaWFsLWJpdGNvaW4tb3V0bGluZTpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9c29jaWFsLWJ1ZmZlcjpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9c29jaWFsLWJ1ZmZlci1vdXRsaW5lOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1zb2NpYWwtY2hyb21lOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1zb2NpYWwtY2hyb21lLW91dGxpbmU6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fXNvY2lhbC1jb2RlcGVuOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1zb2NpYWwtY29kZXBlbi1vdXRsaW5lOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1zb2NpYWwtY3NzMzpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9c29jaWFsLWNzczMtb3V0bGluZTpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9c29jaWFsLWRlc2lnbmVybmV3czpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9c29jaWFsLWRlc2lnbmVybmV3cy1vdXRsaW5lOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1zb2NpYWwtZHJpYmJibGU6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fXNvY2lhbC1kcmliYmJsZS1vdXRsaW5lOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1zb2NpYWwtZHJvcGJveDpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9c29jaWFsLWRyb3Bib3gtb3V0bGluZTpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9c29jaWFsLWV1cm86YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fXNvY2lhbC1ldXJvLW91dGxpbmU6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fXNvY2lhbC1mYWNlYm9vazpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9c29jaWFsLWZhY2Vib29rLW91dGxpbmU6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fXNvY2lhbC1mb3Vyc3F1YXJlOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1zb2NpYWwtZm91cnNxdWFyZS1vdXRsaW5lOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1zb2NpYWwtZnJlZWJzZC1kZXZpbDpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9c29jaWFsLWdpdGh1YjpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9c29jaWFsLWdpdGh1Yi1vdXRsaW5lOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1zb2NpYWwtZ29vZ2xlOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1zb2NpYWwtZ29vZ2xlLW91dGxpbmU6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fXNvY2lhbC1nb29nbGVwbHVzOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1zb2NpYWwtZ29vZ2xlcGx1cy1vdXRsaW5lOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1zb2NpYWwtaGFja2VybmV3czpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9c29jaWFsLWhhY2tlcm5ld3Mtb3V0bGluZTpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9c29jaWFsLWh0bWw1OmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1zb2NpYWwtaHRtbDUtb3V0bGluZTpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9c29jaWFsLWluc3RhZ3JhbTpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9c29jaWFsLWluc3RhZ3JhbS1vdXRsaW5lOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1zb2NpYWwtamF2YXNjcmlwdDpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9c29jaWFsLWphdmFzY3JpcHQtb3V0bGluZTpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9c29jaWFsLWxpbmtlZGluOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1zb2NpYWwtbGlua2VkaW4tb3V0bGluZTpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9c29jaWFsLW1hcmtkb3duOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1zb2NpYWwtbm9kZWpzOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1zb2NpYWwtb2N0b2NhdDpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9c29jaWFsLXBpbnRlcmVzdDpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9c29jaWFsLXBpbnRlcmVzdC1vdXRsaW5lOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1zb2NpYWwtcHl0aG9uOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1zb2NpYWwtcmVkZGl0OmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1zb2NpYWwtcmVkZGl0LW91dGxpbmU6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fXNvY2lhbC1yc3M6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fXNvY2lhbC1yc3Mtb3V0bGluZTpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9c29jaWFsLXNhc3M6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fXNvY2lhbC1za3lwZTpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9c29jaWFsLXNreXBlLW91dGxpbmU6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fXNvY2lhbC1zbmFwY2hhdDpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9c29jaWFsLXNuYXBjaGF0LW91dGxpbmU6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fXNvY2lhbC10dW1ibHI6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fXNvY2lhbC10dW1ibHItb3V0bGluZTpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9c29jaWFsLXR1eDpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9c29jaWFsLXR3aXRjaDpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9c29jaWFsLXR3aXRjaC1vdXRsaW5lOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1zb2NpYWwtdHdpdHRlcjpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9c29jaWFsLXR3aXR0ZXItb3V0bGluZTpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9c29jaWFsLXVzZDpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9c29jaWFsLXVzZC1vdXRsaW5lOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1zb2NpYWwtdmltZW86YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fXNvY2lhbC12aW1lby1vdXRsaW5lOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1zb2NpYWwtd2hhdHNhcHA6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fXNvY2lhbC13aGF0c2FwcC1vdXRsaW5lOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1zb2NpYWwtd2luZG93czpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9c29jaWFsLXdpbmRvd3Mtb3V0bGluZTpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9c29jaWFsLXdvcmRwcmVzczpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9c29jaWFsLXdvcmRwcmVzcy1vdXRsaW5lOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1zb2NpYWwteWFob286YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fXNvY2lhbC15YWhvby1vdXRsaW5lOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1zb2NpYWwteWVuOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1zb2NpYWwteWVuLW91dGxpbmU6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fXNvY2lhbC15b3V0dWJlOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1zb2NpYWwteW91dHViZS1vdXRsaW5lOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1zb3VwLWNhbjpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9c291cC1jYW4tb3V0bGluZTpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9c3BlYWtlcnBob25lOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1zcGVlZG9tZXRlcjpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9c3Bvb246YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fXN0YXI6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fXN0YXRzLWJhcnM6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fXN0ZWFtOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH1zdG9wOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH10aGVybW9tZXRlcjpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9dGh1bWJzZG93bjpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9dGh1bWJzdXA6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fXRvZ2dsZTpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9dG9nZ2xlLWZpbGxlZDpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9dHJhbnNnZW5kZXI6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fXRyYXNoLWE6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fXRyYXNoLWI6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fXRyb3BoeTpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9dHNoaXJ0OmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH10c2hpcnQtb3V0bGluZTpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9dW1icmVsbGE6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fXVuaXZlcnNpdHk6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fXVubG9ja2VkOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH11cGxvYWQ6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fXVzYjpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9dmlkZW9jYW1lcmE6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fXZvbHVtZS1oaWdoOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH12b2x1bWUtbG93OmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH12b2x1bWUtbWVkaXVtOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH12b2x1bWUtbXV0ZTpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9d2FuZDpiZWZvcmUsXG4uQHtpb25pY29ucy1wcmVmaXh9d2F0ZXJkcm9wOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH13aWZpOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH13aW5lZ2xhc3M6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fXdvbWFuOmJlZm9yZSxcbi5Ae2lvbmljb25zLXByZWZpeH13cmVuY2g6YmVmb3JlLFxuLkB7aW9uaWNvbnMtcHJlZml4fXhib3g6YmVmb3JlXG57XG4gICY6ZXh0ZW5kKC5pb24pO1xufVxuLkB7aW9uaWNvbnMtcHJlZml4fWFsZXJ0OmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1hbGVydDsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWFsZXJ0LWNpcmNsZWQ6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWFsZXJ0LWNpcmNsZWQ7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1hbmRyb2lkLWFkZDpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItYW5kcm9pZC1hZGQ7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1hbmRyb2lkLWFkZC1jaXJjbGU6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWFuZHJvaWQtYWRkLWNpcmNsZTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWFuZHJvaWQtYWxhcm0tY2xvY2s6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWFuZHJvaWQtYWxhcm0tY2xvY2s7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1hbmRyb2lkLWFsZXJ0OmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1hbmRyb2lkLWFsZXJ0OyB9XG4uQHtpb25pY29ucy1wcmVmaXh9YW5kcm9pZC1hcHBzOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1hbmRyb2lkLWFwcHM7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1hbmRyb2lkLWFyY2hpdmU6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWFuZHJvaWQtYXJjaGl2ZTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWFuZHJvaWQtYXJyb3ctYmFjazpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItYW5kcm9pZC1hcnJvdy1iYWNrOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9YW5kcm9pZC1hcnJvdy1kb3duOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1hbmRyb2lkLWFycm93LWRvd247IH1cbi5Ae2lvbmljb25zLXByZWZpeH1hbmRyb2lkLWFycm93LWRyb3Bkb3duOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1hbmRyb2lkLWFycm93LWRyb3Bkb3duOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9YW5kcm9pZC1hcnJvdy1kcm9wZG93bi1jaXJjbGU6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWFuZHJvaWQtYXJyb3ctZHJvcGRvd24tY2lyY2xlOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9YW5kcm9pZC1hcnJvdy1kcm9wbGVmdDpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItYW5kcm9pZC1hcnJvdy1kcm9wbGVmdDsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWFuZHJvaWQtYXJyb3ctZHJvcGxlZnQtY2lyY2xlOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1hbmRyb2lkLWFycm93LWRyb3BsZWZ0LWNpcmNsZTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWFuZHJvaWQtYXJyb3ctZHJvcHJpZ2h0OmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1hbmRyb2lkLWFycm93LWRyb3ByaWdodDsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWFuZHJvaWQtYXJyb3ctZHJvcHJpZ2h0LWNpcmNsZTpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItYW5kcm9pZC1hcnJvdy1kcm9wcmlnaHQtY2lyY2xlOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9YW5kcm9pZC1hcnJvdy1kcm9wdXA6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWFuZHJvaWQtYXJyb3ctZHJvcHVwOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9YW5kcm9pZC1hcnJvdy1kcm9wdXAtY2lyY2xlOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1hbmRyb2lkLWFycm93LWRyb3B1cC1jaXJjbGU7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1hbmRyb2lkLWFycm93LWZvcndhcmQ6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWFuZHJvaWQtYXJyb3ctZm9yd2FyZDsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWFuZHJvaWQtYXJyb3ctdXA6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWFuZHJvaWQtYXJyb3ctdXA7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1hbmRyb2lkLWF0dGFjaDpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItYW5kcm9pZC1hdHRhY2g7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1hbmRyb2lkLWJhcjpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItYW5kcm9pZC1iYXI7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1hbmRyb2lkLWJpY3ljbGU6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWFuZHJvaWQtYmljeWNsZTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWFuZHJvaWQtYm9hdDpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItYW5kcm9pZC1ib2F0OyB9XG4uQHtpb25pY29ucy1wcmVmaXh9YW5kcm9pZC1ib29rbWFyazpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItYW5kcm9pZC1ib29rbWFyazsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWFuZHJvaWQtYnVsYjpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItYW5kcm9pZC1idWxiOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9YW5kcm9pZC1idXM6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWFuZHJvaWQtYnVzOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9YW5kcm9pZC1jYWxlbmRhcjpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItYW5kcm9pZC1jYWxlbmRhcjsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWFuZHJvaWQtY2FsbDpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItYW5kcm9pZC1jYWxsOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9YW5kcm9pZC1jYW1lcmE6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWFuZHJvaWQtY2FtZXJhOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9YW5kcm9pZC1jYW5jZWw6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWFuZHJvaWQtY2FuY2VsOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9YW5kcm9pZC1jYXI6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWFuZHJvaWQtY2FyOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9YW5kcm9pZC1jYXJ0OmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1hbmRyb2lkLWNhcnQ7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1hbmRyb2lkLWNoYXQ6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWFuZHJvaWQtY2hhdDsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWFuZHJvaWQtY2hlY2tib3g6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWFuZHJvaWQtY2hlY2tib3g7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1hbmRyb2lkLWNoZWNrYm94LWJsYW5rOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1hbmRyb2lkLWNoZWNrYm94LWJsYW5rOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9YW5kcm9pZC1jaGVja2JveC1vdXRsaW5lOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1hbmRyb2lkLWNoZWNrYm94LW91dGxpbmU7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1hbmRyb2lkLWNoZWNrYm94LW91dGxpbmUtYmxhbms6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWFuZHJvaWQtY2hlY2tib3gtb3V0bGluZS1ibGFuazsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWFuZHJvaWQtY2hlY2ttYXJrLWNpcmNsZTpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItYW5kcm9pZC1jaGVja21hcmstY2lyY2xlOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9YW5kcm9pZC1jbGlwYm9hcmQ6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWFuZHJvaWQtY2xpcGJvYXJkOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9YW5kcm9pZC1jbG9zZTpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItYW5kcm9pZC1jbG9zZTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWFuZHJvaWQtY2xvdWQ6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWFuZHJvaWQtY2xvdWQ7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1hbmRyb2lkLWNsb3VkLWNpcmNsZTpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItYW5kcm9pZC1jbG91ZC1jaXJjbGU7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1hbmRyb2lkLWNsb3VkLWRvbmU6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWFuZHJvaWQtY2xvdWQtZG9uZTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWFuZHJvaWQtY2xvdWQtb3V0bGluZTpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItYW5kcm9pZC1jbG91ZC1vdXRsaW5lOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9YW5kcm9pZC1jb2xvci1wYWxldHRlOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1hbmRyb2lkLWNvbG9yLXBhbGV0dGU7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1hbmRyb2lkLWNvbXBhc3M6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWFuZHJvaWQtY29tcGFzczsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWFuZHJvaWQtY29udGFjdDpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItYW5kcm9pZC1jb250YWN0OyB9XG4uQHtpb25pY29ucy1wcmVmaXh9YW5kcm9pZC1jb250YWN0czpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItYW5kcm9pZC1jb250YWN0czsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWFuZHJvaWQtY29udHJhY3Q6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWFuZHJvaWQtY29udHJhY3Q7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1hbmRyb2lkLWNyZWF0ZTpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItYW5kcm9pZC1jcmVhdGU7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1hbmRyb2lkLWRlbGV0ZTpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItYW5kcm9pZC1kZWxldGU7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1hbmRyb2lkLWRlc2t0b3A6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWFuZHJvaWQtZGVza3RvcDsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWFuZHJvaWQtZG9jdW1lbnQ6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWFuZHJvaWQtZG9jdW1lbnQ7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1hbmRyb2lkLWRvbmU6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWFuZHJvaWQtZG9uZTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWFuZHJvaWQtZG9uZS1hbGw6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWFuZHJvaWQtZG9uZS1hbGw7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1hbmRyb2lkLWRvd25sb2FkOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1hbmRyb2lkLWRvd25sb2FkOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9YW5kcm9pZC1kcmFmdHM6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWFuZHJvaWQtZHJhZnRzOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9YW5kcm9pZC1leGl0OmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1hbmRyb2lkLWV4aXQ7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1hbmRyb2lkLWV4cGFuZDpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItYW5kcm9pZC1leHBhbmQ7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1hbmRyb2lkLWZhdm9yaXRlOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1hbmRyb2lkLWZhdm9yaXRlOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9YW5kcm9pZC1mYXZvcml0ZS1vdXRsaW5lOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1hbmRyb2lkLWZhdm9yaXRlLW91dGxpbmU7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1hbmRyb2lkLWZpbG06YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWFuZHJvaWQtZmlsbTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWFuZHJvaWQtZm9sZGVyOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1hbmRyb2lkLWZvbGRlcjsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWFuZHJvaWQtZm9sZGVyLW9wZW46YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWFuZHJvaWQtZm9sZGVyLW9wZW47IH1cbi5Ae2lvbmljb25zLXByZWZpeH1hbmRyb2lkLWZ1bm5lbDpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItYW5kcm9pZC1mdW5uZWw7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1hbmRyb2lkLWdsb2JlOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1hbmRyb2lkLWdsb2JlOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9YW5kcm9pZC1oYW5kOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1hbmRyb2lkLWhhbmQ7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1hbmRyb2lkLWhhbmdvdXQ6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWFuZHJvaWQtaGFuZ291dDsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWFuZHJvaWQtaGFwcHk6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWFuZHJvaWQtaGFwcHk7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1hbmRyb2lkLWhvbWU6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWFuZHJvaWQtaG9tZTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWFuZHJvaWQtaW1hZ2U6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWFuZHJvaWQtaW1hZ2U7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1hbmRyb2lkLWxhcHRvcDpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItYW5kcm9pZC1sYXB0b3A7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1hbmRyb2lkLWxpc3Q6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWFuZHJvaWQtbGlzdDsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWFuZHJvaWQtbG9jYXRlOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1hbmRyb2lkLWxvY2F0ZTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWFuZHJvaWQtbG9jazpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItYW5kcm9pZC1sb2NrOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9YW5kcm9pZC1tYWlsOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1hbmRyb2lkLW1haWw7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1hbmRyb2lkLW1hcDpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItYW5kcm9pZC1tYXA7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1hbmRyb2lkLW1lbnU6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWFuZHJvaWQtbWVudTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWFuZHJvaWQtbWljcm9waG9uZTpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItYW5kcm9pZC1taWNyb3Bob25lOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9YW5kcm9pZC1taWNyb3Bob25lLW9mZjpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItYW5kcm9pZC1taWNyb3Bob25lLW9mZjsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWFuZHJvaWQtbW9yZS1ob3Jpem9udGFsOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1hbmRyb2lkLW1vcmUtaG9yaXpvbnRhbDsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWFuZHJvaWQtbW9yZS12ZXJ0aWNhbDpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItYW5kcm9pZC1tb3JlLXZlcnRpY2FsOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9YW5kcm9pZC1uYXZpZ2F0ZTpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItYW5kcm9pZC1uYXZpZ2F0ZTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWFuZHJvaWQtbm90aWZpY2F0aW9uczpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItYW5kcm9pZC1ub3RpZmljYXRpb25zOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9YW5kcm9pZC1ub3RpZmljYXRpb25zLW5vbmU6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWFuZHJvaWQtbm90aWZpY2F0aW9ucy1ub25lOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9YW5kcm9pZC1ub3RpZmljYXRpb25zLW9mZjpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItYW5kcm9pZC1ub3RpZmljYXRpb25zLW9mZjsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWFuZHJvaWQtb3BlbjpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItYW5kcm9pZC1vcGVuOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9YW5kcm9pZC1vcHRpb25zOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1hbmRyb2lkLW9wdGlvbnM7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1hbmRyb2lkLXBlb3BsZTpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItYW5kcm9pZC1wZW9wbGU7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1hbmRyb2lkLXBlcnNvbjpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItYW5kcm9pZC1wZXJzb247IH1cbi5Ae2lvbmljb25zLXByZWZpeH1hbmRyb2lkLXBlcnNvbi1hZGQ6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWFuZHJvaWQtcGVyc29uLWFkZDsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWFuZHJvaWQtcGhvbmUtbGFuZHNjYXBlOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1hbmRyb2lkLXBob25lLWxhbmRzY2FwZTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWFuZHJvaWQtcGhvbmUtcG9ydHJhaXQ6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWFuZHJvaWQtcGhvbmUtcG9ydHJhaXQ7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1hbmRyb2lkLXBpbjpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItYW5kcm9pZC1waW47IH1cbi5Ae2lvbmljb25zLXByZWZpeH1hbmRyb2lkLXBsYW5lOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1hbmRyb2lkLXBsYW5lOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9YW5kcm9pZC1wbGF5c3RvcmU6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWFuZHJvaWQtcGxheXN0b3JlOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9YW5kcm9pZC1wcmludDpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItYW5kcm9pZC1wcmludDsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWFuZHJvaWQtcmFkaW8tYnV0dG9uLW9mZjpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItYW5kcm9pZC1yYWRpby1idXR0b24tb2ZmOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9YW5kcm9pZC1yYWRpby1idXR0b24tb246YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWFuZHJvaWQtcmFkaW8tYnV0dG9uLW9uOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9YW5kcm9pZC1yZWZyZXNoOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1hbmRyb2lkLXJlZnJlc2g7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1hbmRyb2lkLXJlbW92ZTpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItYW5kcm9pZC1yZW1vdmU7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1hbmRyb2lkLXJlbW92ZS1jaXJjbGU6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWFuZHJvaWQtcmVtb3ZlLWNpcmNsZTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWFuZHJvaWQtcmVzdGF1cmFudDpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItYW5kcm9pZC1yZXN0YXVyYW50OyB9XG4uQHtpb25pY29ucy1wcmVmaXh9YW5kcm9pZC1zYWQ6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWFuZHJvaWQtc2FkOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9YW5kcm9pZC1zZWFyY2g6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWFuZHJvaWQtc2VhcmNoOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9YW5kcm9pZC1zZW5kOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1hbmRyb2lkLXNlbmQ7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1hbmRyb2lkLXNldHRpbmdzOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1hbmRyb2lkLXNldHRpbmdzOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9YW5kcm9pZC1zaGFyZTpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItYW5kcm9pZC1zaGFyZTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWFuZHJvaWQtc2hhcmUtYWx0OmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1hbmRyb2lkLXNoYXJlLWFsdDsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWFuZHJvaWQtc3RhcjpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItYW5kcm9pZC1zdGFyOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9YW5kcm9pZC1zdGFyLWhhbGY6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWFuZHJvaWQtc3Rhci1oYWxmOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9YW5kcm9pZC1zdGFyLW91dGxpbmU6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWFuZHJvaWQtc3Rhci1vdXRsaW5lOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9YW5kcm9pZC1zdG9wd2F0Y2g6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWFuZHJvaWQtc3RvcHdhdGNoOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9YW5kcm9pZC1zdWJ3YXk6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWFuZHJvaWQtc3Vid2F5OyB9XG4uQHtpb25pY29ucy1wcmVmaXh9YW5kcm9pZC1zdW5ueTpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItYW5kcm9pZC1zdW5ueTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWFuZHJvaWQtc3luYzpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItYW5kcm9pZC1zeW5jOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9YW5kcm9pZC10ZXh0c21zOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1hbmRyb2lkLXRleHRzbXM7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1hbmRyb2lkLXRpbWU6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWFuZHJvaWQtdGltZTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWFuZHJvaWQtdHJhaW46YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWFuZHJvaWQtdHJhaW47IH1cbi5Ae2lvbmljb25zLXByZWZpeH1hbmRyb2lkLXVubG9jazpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItYW5kcm9pZC11bmxvY2s7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1hbmRyb2lkLXVwbG9hZDpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItYW5kcm9pZC11cGxvYWQ7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1hbmRyb2lkLXZvbHVtZS1kb3duOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1hbmRyb2lkLXZvbHVtZS1kb3duOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9YW5kcm9pZC12b2x1bWUtbXV0ZTpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItYW5kcm9pZC12b2x1bWUtbXV0ZTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWFuZHJvaWQtdm9sdW1lLW9mZjpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItYW5kcm9pZC12b2x1bWUtb2ZmOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9YW5kcm9pZC12b2x1bWUtdXA6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWFuZHJvaWQtdm9sdW1lLXVwOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9YW5kcm9pZC13YWxrOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1hbmRyb2lkLXdhbGs7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1hbmRyb2lkLXdhcm5pbmc6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWFuZHJvaWQtd2FybmluZzsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWFuZHJvaWQtd2F0Y2g6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWFuZHJvaWQtd2F0Y2g7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1hbmRyb2lkLXdpZmk6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWFuZHJvaWQtd2lmaTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWFwZXJ0dXJlOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1hcGVydHVyZTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWFyY2hpdmU6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWFyY2hpdmU7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1hcnJvdy1kb3duLWE6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWFycm93LWRvd24tYTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWFycm93LWRvd24tYjpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItYXJyb3ctZG93bi1iOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9YXJyb3ctZG93bi1jOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1hcnJvdy1kb3duLWM7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1hcnJvdy1leHBhbmQ6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWFycm93LWV4cGFuZDsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWFycm93LWdyYXBoLWRvd24tbGVmdDpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItYXJyb3ctZ3JhcGgtZG93bi1sZWZ0OyB9XG4uQHtpb25pY29ucy1wcmVmaXh9YXJyb3ctZ3JhcGgtZG93bi1yaWdodDpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItYXJyb3ctZ3JhcGgtZG93bi1yaWdodDsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWFycm93LWdyYXBoLXVwLWxlZnQ6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWFycm93LWdyYXBoLXVwLWxlZnQ7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1hcnJvdy1ncmFwaC11cC1yaWdodDpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItYXJyb3ctZ3JhcGgtdXAtcmlnaHQ7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1hcnJvdy1sZWZ0LWE6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWFycm93LWxlZnQtYTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWFycm93LWxlZnQtYjpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItYXJyb3ctbGVmdC1iOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9YXJyb3ctbGVmdC1jOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1hcnJvdy1sZWZ0LWM7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1hcnJvdy1tb3ZlOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1hcnJvdy1tb3ZlOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9YXJyb3ctcmVzaXplOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1hcnJvdy1yZXNpemU7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1hcnJvdy1yZXR1cm4tbGVmdDpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItYXJyb3ctcmV0dXJuLWxlZnQ7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1hcnJvdy1yZXR1cm4tcmlnaHQ6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWFycm93LXJldHVybi1yaWdodDsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWFycm93LXJpZ2h0LWE6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWFycm93LXJpZ2h0LWE7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1hcnJvdy1yaWdodC1iOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1hcnJvdy1yaWdodC1iOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9YXJyb3ctcmlnaHQtYzpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItYXJyb3ctcmlnaHQtYzsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWFycm93LXNocmluazpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItYXJyb3ctc2hyaW5rOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9YXJyb3ctc3dhcDpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItYXJyb3ctc3dhcDsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWFycm93LXVwLWE6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWFycm93LXVwLWE7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1hcnJvdy11cC1iOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1hcnJvdy11cC1iOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9YXJyb3ctdXAtYzpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItYXJyb3ctdXAtYzsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWFzdGVyaXNrOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1hc3RlcmlzazsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWF0OmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1hdDsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWJhY2tzcGFjZTpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItYmFja3NwYWNlOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9YmFja3NwYWNlLW91dGxpbmU6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWJhY2tzcGFjZS1vdXRsaW5lOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9YmFnOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1iYWc7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1iYXR0ZXJ5LWNoYXJnaW5nOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1iYXR0ZXJ5LWNoYXJnaW5nOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9YmF0dGVyeS1lbXB0eTpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItYmF0dGVyeS1lbXB0eTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWJhdHRlcnktZnVsbDpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItYmF0dGVyeS1mdWxsOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9YmF0dGVyeS1oYWxmOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1iYXR0ZXJ5LWhhbGY7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1iYXR0ZXJ5LWxvdzpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItYmF0dGVyeS1sb3c7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1iZWFrZXI6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWJlYWtlcjsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWJlZXI6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWJlZXI7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1ibHVldG9vdGg6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWJsdWV0b290aDsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWJvbmZpcmU6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWJvbmZpcmU7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1ib29rbWFyazpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItYm9va21hcms7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1ib3d0aWU6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWJvd3RpZTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWJyaWVmY2FzZTpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItYnJpZWZjYXNlOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9YnVnOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1idWc7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1jYWxjdWxhdG9yOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1jYWxjdWxhdG9yOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9Y2FsZW5kYXI6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWNhbGVuZGFyOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9Y2FtZXJhOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1jYW1lcmE7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1jYXJkOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1jYXJkOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9Y2FzaDpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItY2FzaDsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWNoYXRib3g6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWNoYXRib3g7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1jaGF0Ym94LXdvcmtpbmc6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWNoYXRib3gtd29ya2luZzsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWNoYXRib3hlczpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItY2hhdGJveGVzOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9Y2hhdGJ1YmJsZTpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItY2hhdGJ1YmJsZTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWNoYXRidWJibGUtd29ya2luZzpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItY2hhdGJ1YmJsZS13b3JraW5nOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9Y2hhdGJ1YmJsZXM6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWNoYXRidWJibGVzOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9Y2hlY2ttYXJrOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1jaGVja21hcms7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1jaGVja21hcmstY2lyY2xlZDpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItY2hlY2ttYXJrLWNpcmNsZWQ7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1jaGVja21hcmstcm91bmQ6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWNoZWNrbWFyay1yb3VuZDsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWNoZXZyb24tZG93bjpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItY2hldnJvbi1kb3duOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9Y2hldnJvbi1sZWZ0OmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1jaGV2cm9uLWxlZnQ7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1jaGV2cm9uLXJpZ2h0OmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1jaGV2cm9uLXJpZ2h0OyB9XG4uQHtpb25pY29ucy1wcmVmaXh9Y2hldnJvbi11cDpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItY2hldnJvbi11cDsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWNsaXBib2FyZDpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItY2xpcGJvYXJkOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9Y2xvY2s6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWNsb2NrOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9Y2xvc2U6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWNsb3NlOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9Y2xvc2UtY2lyY2xlZDpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItY2xvc2UtY2lyY2xlZDsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWNsb3NlLXJvdW5kOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1jbG9zZS1yb3VuZDsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWNsb3NlZC1jYXB0aW9uaW5nOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1jbG9zZWQtY2FwdGlvbmluZzsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWNsb3VkOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1jbG91ZDsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWNvZGU6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWNvZGU7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1jb2RlLWRvd25sb2FkOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1jb2RlLWRvd25sb2FkOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9Y29kZS13b3JraW5nOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1jb2RlLXdvcmtpbmc7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1jb2ZmZWU6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWNvZmZlZTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWNvbXBhc3M6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWNvbXBhc3M7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1jb21wb3NlOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1jb21wb3NlOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9Y29ubmVjdGlvbi1iYXJzOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1jb25uZWN0aW9uLWJhcnM7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1jb250cmFzdDpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItY29udHJhc3Q7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1jcm9wOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1jcm9wOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9Y3ViZTpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItY3ViZTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWRpc2M6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWRpc2M7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1kb2N1bWVudDpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItZG9jdW1lbnQ7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1kb2N1bWVudC10ZXh0OmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1kb2N1bWVudC10ZXh0OyB9XG4uQHtpb25pY29ucy1wcmVmaXh9ZHJhZzpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItZHJhZzsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWVhcnRoOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1lYXJ0aDsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWVhc2VsOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1lYXNlbDsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWVkaXQ6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWVkaXQ7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1lZ2c6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWVnZzsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWVqZWN0OmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1lamVjdDsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWVtYWlsOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1lbWFpbDsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWVtYWlsLXVucmVhZDpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItZW1haWwtdW5yZWFkOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9ZXJsZW5tZXllci1mbGFzazpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItZXJsZW5tZXllci1mbGFzazsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWVybGVubWV5ZXItZmxhc2stYnViYmxlczpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItZXJsZW5tZXllci1mbGFzay1idWJibGVzOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9ZXllOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1leWU7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1leWUtZGlzYWJsZWQ6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWV5ZS1kaXNhYmxlZDsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWZlbWFsZTpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItZmVtYWxlOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9ZmlsaW5nOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1maWxpbmc7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1maWxtLW1hcmtlcjpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItZmlsbS1tYXJrZXI7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1maXJlYmFsbDpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItZmlyZWJhbGw7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1mbGFnOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1mbGFnOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9ZmxhbWU6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWZsYW1lOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9Zmxhc2g6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWZsYXNoOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9Zmxhc2gtb2ZmOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1mbGFzaC1vZmY7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1mb2xkZXI6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWZvbGRlcjsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWZvcms6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWZvcms7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1mb3JrLXJlcG86YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWZvcmstcmVwbzsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWZvcndhcmQ6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWZvcndhcmQ7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1mdW5uZWw6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWZ1bm5lbDsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWdlYXItYTpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItZ2Vhci1hOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9Z2Vhci1iOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1nZWFyLWI7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1ncmlkOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1ncmlkOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9aGFtbWVyOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1oYW1tZXI7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1oYXBweTpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItaGFwcHk7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1oYXBweS1vdXRsaW5lOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1oYXBweS1vdXRsaW5lOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9aGVhZHBob25lOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1oZWFkcGhvbmU7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1oZWFydDpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItaGVhcnQ7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1oZWFydC1icm9rZW46YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWhlYXJ0LWJyb2tlbjsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWhlbHA6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWhlbHA7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1oZWxwLWJ1b3k6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWhlbHAtYnVveTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWhlbHAtY2lyY2xlZDpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItaGVscC1jaXJjbGVkOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9aG9tZTpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItaG9tZTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWljZWNyZWFtOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1pY2VjcmVhbTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWltYWdlOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1pbWFnZTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWltYWdlczpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItaW1hZ2VzOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9aW5mb3JtYXRpb246YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWluZm9ybWF0aW9uOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9aW5mb3JtYXRpb24tY2lyY2xlZDpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItaW5mb3JtYXRpb24tY2lyY2xlZDsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWlvbmljOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1pb25pYzsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1hbGFybTpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItaW9zLWFsYXJtOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLWFsYXJtLW91dGxpbmU6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWlvcy1hbGFybS1vdXRsaW5lOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLWFsYnVtczpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItaW9zLWFsYnVtczsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1hbGJ1bXMtb3V0bGluZTpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItaW9zLWFsYnVtcy1vdXRsaW5lOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLWFtZXJpY2FuZm9vdGJhbGw6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWlvcy1hbWVyaWNhbmZvb3RiYWxsOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLWFtZXJpY2FuZm9vdGJhbGwtb3V0bGluZTpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItaW9zLWFtZXJpY2FuZm9vdGJhbGwtb3V0bGluZTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1hbmFseXRpY3M6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWlvcy1hbmFseXRpY3M7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtYW5hbHl0aWNzLW91dGxpbmU6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWlvcy1hbmFseXRpY3Mtb3V0bGluZTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1hcnJvdy1iYWNrOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1pb3MtYXJyb3ctYmFjazsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1hcnJvdy1kb3duOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1pb3MtYXJyb3ctZG93bjsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1hcnJvdy1mb3J3YXJkOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1pb3MtYXJyb3ctZm9yd2FyZDsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1hcnJvdy1sZWZ0OmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1pb3MtYXJyb3ctbGVmdDsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1hcnJvdy1yaWdodDpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItaW9zLWFycm93LXJpZ2h0OyB9XG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLWFycm93LXRoaW4tZG93bjpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItaW9zLWFycm93LXRoaW4tZG93bjsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1hcnJvdy10aGluLWxlZnQ6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWlvcy1hcnJvdy10aGluLWxlZnQ7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtYXJyb3ctdGhpbi1yaWdodDpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItaW9zLWFycm93LXRoaW4tcmlnaHQ7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtYXJyb3ctdGhpbi11cDpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItaW9zLWFycm93LXRoaW4tdXA7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtYXJyb3ctdXA6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWlvcy1hcnJvdy11cDsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1hdDpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItaW9zLWF0OyB9XG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLWF0LW91dGxpbmU6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWlvcy1hdC1vdXRsaW5lOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLWJhcmNvZGU6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWlvcy1iYXJjb2RlOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLWJhcmNvZGUtb3V0bGluZTpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItaW9zLWJhcmNvZGUtb3V0bGluZTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1iYXNlYmFsbDpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItaW9zLWJhc2ViYWxsOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLWJhc2ViYWxsLW91dGxpbmU6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWlvcy1iYXNlYmFsbC1vdXRsaW5lOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLWJhc2tldGJhbGw6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWlvcy1iYXNrZXRiYWxsOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLWJhc2tldGJhbGwtb3V0bGluZTpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItaW9zLWJhc2tldGJhbGwtb3V0bGluZTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1iZWxsOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1pb3MtYmVsbDsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1iZWxsLW91dGxpbmU6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWlvcy1iZWxsLW91dGxpbmU7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtYm9keTpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItaW9zLWJvZHk7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtYm9keS1vdXRsaW5lOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1pb3MtYm9keS1vdXRsaW5lOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLWJvbHQ6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWlvcy1ib2x0OyB9XG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLWJvbHQtb3V0bGluZTpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItaW9zLWJvbHQtb3V0bGluZTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1ib29rOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1pb3MtYm9vazsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1ib29rLW91dGxpbmU6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWlvcy1ib29rLW91dGxpbmU7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtYm9va21hcmtzOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1pb3MtYm9va21hcmtzOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLWJvb2ttYXJrcy1vdXRsaW5lOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1pb3MtYm9va21hcmtzLW91dGxpbmU7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtYm94OmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1pb3MtYm94OyB9XG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLWJveC1vdXRsaW5lOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1pb3MtYm94LW91dGxpbmU7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtYnJpZWZjYXNlOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1pb3MtYnJpZWZjYXNlOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLWJyaWVmY2FzZS1vdXRsaW5lOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1pb3MtYnJpZWZjYXNlLW91dGxpbmU7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtYnJvd3NlcnM6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWlvcy1icm93c2VyczsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1icm93c2Vycy1vdXRsaW5lOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1pb3MtYnJvd3NlcnMtb3V0bGluZTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1jYWxjdWxhdG9yOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1pb3MtY2FsY3VsYXRvcjsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1jYWxjdWxhdG9yLW91dGxpbmU6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWlvcy1jYWxjdWxhdG9yLW91dGxpbmU7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtY2FsZW5kYXI6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWlvcy1jYWxlbmRhcjsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1jYWxlbmRhci1vdXRsaW5lOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1pb3MtY2FsZW5kYXItb3V0bGluZTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1jYW1lcmE6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWlvcy1jYW1lcmE7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtY2FtZXJhLW91dGxpbmU6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWlvcy1jYW1lcmEtb3V0bGluZTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1jYXJ0OmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1pb3MtY2FydDsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1jYXJ0LW91dGxpbmU6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWlvcy1jYXJ0LW91dGxpbmU7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtY2hhdGJveGVzOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1pb3MtY2hhdGJveGVzOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLWNoYXRib3hlcy1vdXRsaW5lOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1pb3MtY2hhdGJveGVzLW91dGxpbmU7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtY2hhdGJ1YmJsZTpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItaW9zLWNoYXRidWJibGU7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtY2hhdGJ1YmJsZS1vdXRsaW5lOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1pb3MtY2hhdGJ1YmJsZS1vdXRsaW5lOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLWNoZWNrbWFyazpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItaW9zLWNoZWNrbWFyazsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1jaGVja21hcmstZW1wdHk6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWlvcy1jaGVja21hcmstZW1wdHk7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtY2hlY2ttYXJrLW91dGxpbmU6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWlvcy1jaGVja21hcmstb3V0bGluZTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1jaXJjbGUtZmlsbGVkOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1pb3MtY2lyY2xlLWZpbGxlZDsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1jaXJjbGUtb3V0bGluZTpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItaW9zLWNpcmNsZS1vdXRsaW5lOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLWNsb2NrOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1pb3MtY2xvY2s7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtY2xvY2stb3V0bGluZTpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItaW9zLWNsb2NrLW91dGxpbmU7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtY2xvc2U6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWlvcy1jbG9zZTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1jbG9zZS1lbXB0eTpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItaW9zLWNsb3NlLWVtcHR5OyB9XG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLWNsb3NlLW91dGxpbmU6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWlvcy1jbG9zZS1vdXRsaW5lOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLWNsb3VkOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1pb3MtY2xvdWQ7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtY2xvdWQtZG93bmxvYWQ6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWlvcy1jbG91ZC1kb3dubG9hZDsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1jbG91ZC1kb3dubG9hZC1vdXRsaW5lOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1pb3MtY2xvdWQtZG93bmxvYWQtb3V0bGluZTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1jbG91ZC1vdXRsaW5lOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1pb3MtY2xvdWQtb3V0bGluZTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1jbG91ZC11cGxvYWQ6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWlvcy1jbG91ZC11cGxvYWQ7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtY2xvdWQtdXBsb2FkLW91dGxpbmU6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWlvcy1jbG91ZC11cGxvYWQtb3V0bGluZTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1jbG91ZHk6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWlvcy1jbG91ZHk7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtY2xvdWR5LW5pZ2h0OmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1pb3MtY2xvdWR5LW5pZ2h0OyB9XG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLWNsb3VkeS1uaWdodC1vdXRsaW5lOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1pb3MtY2xvdWR5LW5pZ2h0LW91dGxpbmU7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtY2xvdWR5LW91dGxpbmU6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWlvcy1jbG91ZHktb3V0bGluZTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1jb2c6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWlvcy1jb2c7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtY29nLW91dGxpbmU6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWlvcy1jb2ctb3V0bGluZTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1jb2xvci1maWx0ZXI6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWlvcy1jb2xvci1maWx0ZXI7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtY29sb3ItZmlsdGVyLW91dGxpbmU6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWlvcy1jb2xvci1maWx0ZXItb3V0bGluZTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1jb2xvci13YW5kOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1pb3MtY29sb3Itd2FuZDsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1jb2xvci13YW5kLW91dGxpbmU6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWlvcy1jb2xvci13YW5kLW91dGxpbmU7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtY29tcG9zZTpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItaW9zLWNvbXBvc2U7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtY29tcG9zZS1vdXRsaW5lOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1pb3MtY29tcG9zZS1vdXRsaW5lOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLWNvbnRhY3Q6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWlvcy1jb250YWN0OyB9XG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLWNvbnRhY3Qtb3V0bGluZTpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItaW9zLWNvbnRhY3Qtb3V0bGluZTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1jb3B5OmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1pb3MtY29weTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1jb3B5LW91dGxpbmU6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWlvcy1jb3B5LW91dGxpbmU7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtY3JvcDpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItaW9zLWNyb3A7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtY3JvcC1zdHJvbmc6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWlvcy1jcm9wLXN0cm9uZzsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1kb3dubG9hZDpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItaW9zLWRvd25sb2FkOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLWRvd25sb2FkLW91dGxpbmU6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWlvcy1kb3dubG9hZC1vdXRsaW5lOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLWRyYWc6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWlvcy1kcmFnOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLWVtYWlsOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1pb3MtZW1haWw7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtZW1haWwtb3V0bGluZTpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItaW9zLWVtYWlsLW91dGxpbmU7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtZXllOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1pb3MtZXllOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLWV5ZS1vdXRsaW5lOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1pb3MtZXllLW91dGxpbmU7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtZmFzdGZvcndhcmQ6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWlvcy1mYXN0Zm9yd2FyZDsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1mYXN0Zm9yd2FyZC1vdXRsaW5lOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1pb3MtZmFzdGZvcndhcmQtb3V0bGluZTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1maWxpbmc6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWlvcy1maWxpbmc7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtZmlsaW5nLW91dGxpbmU6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWlvcy1maWxpbmctb3V0bGluZTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1maWxtOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1pb3MtZmlsbTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1maWxtLW91dGxpbmU6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWlvcy1maWxtLW91dGxpbmU7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtZmxhZzpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItaW9zLWZsYWc7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtZmxhZy1vdXRsaW5lOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1pb3MtZmxhZy1vdXRsaW5lOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLWZsYW1lOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1pb3MtZmxhbWU7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtZmxhbWUtb3V0bGluZTpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItaW9zLWZsYW1lLW91dGxpbmU7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtZmxhc2s6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWlvcy1mbGFzazsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1mbGFzay1vdXRsaW5lOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1pb3MtZmxhc2stb3V0bGluZTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1mbG93ZXI6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWlvcy1mbG93ZXI7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtZmxvd2VyLW91dGxpbmU6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWlvcy1mbG93ZXItb3V0bGluZTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1mb2xkZXI6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWlvcy1mb2xkZXI7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtZm9sZGVyLW91dGxpbmU6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWlvcy1mb2xkZXItb3V0bGluZTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1mb290YmFsbDpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItaW9zLWZvb3RiYWxsOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLWZvb3RiYWxsLW91dGxpbmU6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWlvcy1mb290YmFsbC1vdXRsaW5lOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLWdhbWUtY29udHJvbGxlci1hOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1pb3MtZ2FtZS1jb250cm9sbGVyLWE7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtZ2FtZS1jb250cm9sbGVyLWEtb3V0bGluZTpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItaW9zLWdhbWUtY29udHJvbGxlci1hLW91dGxpbmU7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtZ2FtZS1jb250cm9sbGVyLWI6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWlvcy1nYW1lLWNvbnRyb2xsZXItYjsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1nYW1lLWNvbnRyb2xsZXItYi1vdXRsaW5lOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1pb3MtZ2FtZS1jb250cm9sbGVyLWItb3V0bGluZTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1nZWFyOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1pb3MtZ2VhcjsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1nZWFyLW91dGxpbmU6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWlvcy1nZWFyLW91dGxpbmU7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtZ2xhc3NlczpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItaW9zLWdsYXNzZXM7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtZ2xhc3Nlcy1vdXRsaW5lOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1pb3MtZ2xhc3Nlcy1vdXRsaW5lOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLWdyaWQtdmlldzpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItaW9zLWdyaWQtdmlldzsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1ncmlkLXZpZXctb3V0bGluZTpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItaW9zLWdyaWQtdmlldy1vdXRsaW5lOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLWhlYXJ0OmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1pb3MtaGVhcnQ7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtaGVhcnQtb3V0bGluZTpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItaW9zLWhlYXJ0LW91dGxpbmU7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtaGVscDpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItaW9zLWhlbHA7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtaGVscC1lbXB0eTpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItaW9zLWhlbHAtZW1wdHk7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtaGVscC1vdXRsaW5lOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1pb3MtaGVscC1vdXRsaW5lOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLWhvbWU6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWlvcy1ob21lOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLWhvbWUtb3V0bGluZTpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItaW9zLWhvbWUtb3V0bGluZTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1pbmZpbml0ZTpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItaW9zLWluZmluaXRlOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLWluZmluaXRlLW91dGxpbmU6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWlvcy1pbmZpbml0ZS1vdXRsaW5lOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLWluZm9ybWF0aW9uOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1pb3MtaW5mb3JtYXRpb247IH1cbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtaW5mb3JtYXRpb24tZW1wdHk6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWlvcy1pbmZvcm1hdGlvbi1lbXB0eTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1pbmZvcm1hdGlvbi1vdXRsaW5lOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1pb3MtaW5mb3JtYXRpb24tb3V0bGluZTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1pb25pYy1vdXRsaW5lOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1pb3MtaW9uaWMtb3V0bGluZTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1rZXlwYWQ6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWlvcy1rZXlwYWQ7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1pb3Mta2V5cGFkLW91dGxpbmU6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWlvcy1rZXlwYWQtb3V0bGluZTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1saWdodGJ1bGI6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWlvcy1saWdodGJ1bGI7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtbGlnaHRidWxiLW91dGxpbmU6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWlvcy1saWdodGJ1bGItb3V0bGluZTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1saXN0OmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1pb3MtbGlzdDsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1saXN0LW91dGxpbmU6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWlvcy1saXN0LW91dGxpbmU7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtbG9jYXRpb246YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWlvcy1sb2NhdGlvbjsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1sb2NhdGlvbi1vdXRsaW5lOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1pb3MtbG9jYXRpb24tb3V0bGluZTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1sb2NrZWQ6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWlvcy1sb2NrZWQ7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtbG9ja2VkLW91dGxpbmU6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWlvcy1sb2NrZWQtb3V0bGluZTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1sb29wOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1pb3MtbG9vcDsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1sb29wLXN0cm9uZzpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItaW9zLWxvb3Atc3Ryb25nOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLW1lZGljYWw6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWlvcy1tZWRpY2FsOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLW1lZGljYWwtb3V0bGluZTpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItaW9zLW1lZGljYWwtb3V0bGluZTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1tZWRraXQ6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWlvcy1tZWRraXQ7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtbWVka2l0LW91dGxpbmU6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWlvcy1tZWRraXQtb3V0bGluZTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1taWM6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWlvcy1taWM7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtbWljLW9mZjpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItaW9zLW1pYy1vZmY7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtbWljLW91dGxpbmU6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWlvcy1taWMtb3V0bGluZTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1taW51czpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItaW9zLW1pbnVzOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLW1pbnVzLWVtcHR5OmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1pb3MtbWludXMtZW1wdHk7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtbWludXMtb3V0bGluZTpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItaW9zLW1pbnVzLW91dGxpbmU7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtbW9uaXRvcjpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItaW9zLW1vbml0b3I7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtbW9uaXRvci1vdXRsaW5lOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1pb3MtbW9uaXRvci1vdXRsaW5lOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLW1vb246YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWlvcy1tb29uOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLW1vb24tb3V0bGluZTpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItaW9zLW1vb24tb3V0bGluZTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1tb3JlOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1pb3MtbW9yZTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1tb3JlLW91dGxpbmU6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWlvcy1tb3JlLW91dGxpbmU7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtbXVzaWNhbC1ub3RlOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1pb3MtbXVzaWNhbC1ub3RlOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLW11c2ljYWwtbm90ZXM6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWlvcy1tdXNpY2FsLW5vdGVzOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLW5hdmlnYXRlOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1pb3MtbmF2aWdhdGU7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtbmF2aWdhdGUtb3V0bGluZTpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItaW9zLW5hdmlnYXRlLW91dGxpbmU7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtbnV0cml0aW9uOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1pb3MtbnV0cml0aW9uOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLW51dHJpdGlvbi1vdXRsaW5lOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1pb3MtbnV0cml0aW9uLW91dGxpbmU7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtcGFwZXI6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWlvcy1wYXBlcjsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1wYXBlci1vdXRsaW5lOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1pb3MtcGFwZXItb3V0bGluZTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1wYXBlcnBsYW5lOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1pb3MtcGFwZXJwbGFuZTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1wYXBlcnBsYW5lLW91dGxpbmU6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWlvcy1wYXBlcnBsYW5lLW91dGxpbmU7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtcGFydGx5c3Vubnk6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWlvcy1wYXJ0bHlzdW5ueTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1wYXJ0bHlzdW5ueS1vdXRsaW5lOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1pb3MtcGFydGx5c3Vubnktb3V0bGluZTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1wYXVzZTpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItaW9zLXBhdXNlOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLXBhdXNlLW91dGxpbmU6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWlvcy1wYXVzZS1vdXRsaW5lOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLXBhdzpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItaW9zLXBhdzsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1wYXctb3V0bGluZTpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItaW9zLXBhdy1vdXRsaW5lOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLXBlb3BsZTpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItaW9zLXBlb3BsZTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1wZW9wbGUtb3V0bGluZTpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItaW9zLXBlb3BsZS1vdXRsaW5lOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLXBlcnNvbjpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItaW9zLXBlcnNvbjsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1wZXJzb24tb3V0bGluZTpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItaW9zLXBlcnNvbi1vdXRsaW5lOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLXBlcnNvbmFkZDpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItaW9zLXBlcnNvbmFkZDsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1wZXJzb25hZGQtb3V0bGluZTpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItaW9zLXBlcnNvbmFkZC1vdXRsaW5lOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLXBob3RvczpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItaW9zLXBob3RvczsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1waG90b3Mtb3V0bGluZTpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItaW9zLXBob3Rvcy1vdXRsaW5lOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLXBpZTpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItaW9zLXBpZTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1waWUtb3V0bGluZTpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItaW9zLXBpZS1vdXRsaW5lOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLXBpbnQ6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWlvcy1waW50OyB9XG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLXBpbnQtb3V0bGluZTpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItaW9zLXBpbnQtb3V0bGluZTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1wbGF5OmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1pb3MtcGxheTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1wbGF5LW91dGxpbmU6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWlvcy1wbGF5LW91dGxpbmU7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtcGx1czpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItaW9zLXBsdXM7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtcGx1cy1lbXB0eTpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItaW9zLXBsdXMtZW1wdHk7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtcGx1cy1vdXRsaW5lOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1pb3MtcGx1cy1vdXRsaW5lOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLXByaWNldGFnOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1pb3MtcHJpY2V0YWc7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtcHJpY2V0YWctb3V0bGluZTpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItaW9zLXByaWNldGFnLW91dGxpbmU7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtcHJpY2V0YWdzOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1pb3MtcHJpY2V0YWdzOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLXByaWNldGFncy1vdXRsaW5lOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1pb3MtcHJpY2V0YWdzLW91dGxpbmU7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtcHJpbnRlcjpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItaW9zLXByaW50ZXI7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtcHJpbnRlci1vdXRsaW5lOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1pb3MtcHJpbnRlci1vdXRsaW5lOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLXB1bHNlOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1pb3MtcHVsc2U7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtcHVsc2Utc3Ryb25nOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1pb3MtcHVsc2Utc3Ryb25nOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLXJhaW55OmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1pb3MtcmFpbnk7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtcmFpbnktb3V0bGluZTpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItaW9zLXJhaW55LW91dGxpbmU7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtcmVjb3JkaW5nOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1pb3MtcmVjb3JkaW5nOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLXJlY29yZGluZy1vdXRsaW5lOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1pb3MtcmVjb3JkaW5nLW91dGxpbmU7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtcmVkbzpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItaW9zLXJlZG87IH1cbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtcmVkby1vdXRsaW5lOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1pb3MtcmVkby1vdXRsaW5lOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLXJlZnJlc2g6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWlvcy1yZWZyZXNoOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLXJlZnJlc2gtZW1wdHk6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWlvcy1yZWZyZXNoLWVtcHR5OyB9XG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLXJlZnJlc2gtb3V0bGluZTpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItaW9zLXJlZnJlc2gtb3V0bGluZTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1yZWxvYWQ6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWlvcy1yZWxvYWQ7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtcmV2ZXJzZS1jYW1lcmE6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWlvcy1yZXZlcnNlLWNhbWVyYTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1yZXZlcnNlLWNhbWVyYS1vdXRsaW5lOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1pb3MtcmV2ZXJzZS1jYW1lcmEtb3V0bGluZTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1yZXdpbmQ6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWlvcy1yZXdpbmQ7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtcmV3aW5kLW91dGxpbmU6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWlvcy1yZXdpbmQtb3V0bGluZTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1yb3NlOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1pb3Mtcm9zZTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1yb3NlLW91dGxpbmU6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWlvcy1yb3NlLW91dGxpbmU7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1pb3Mtc2VhcmNoOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1pb3Mtc2VhcmNoOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLXNlYXJjaC1zdHJvbmc6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWlvcy1zZWFyY2gtc3Ryb25nOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLXNldHRpbmdzOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1pb3Mtc2V0dGluZ3M7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1pb3Mtc2V0dGluZ3Mtc3Ryb25nOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1pb3Mtc2V0dGluZ3Mtc3Ryb25nOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLXNodWZmbGU6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWlvcy1zaHVmZmxlOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLXNodWZmbGUtc3Ryb25nOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1pb3Mtc2h1ZmZsZS1zdHJvbmc7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1pb3Mtc2tpcGJhY2t3YXJkOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1pb3Mtc2tpcGJhY2t3YXJkOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLXNraXBiYWNrd2FyZC1vdXRsaW5lOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1pb3Mtc2tpcGJhY2t3YXJkLW91dGxpbmU7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1pb3Mtc2tpcGZvcndhcmQ6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWlvcy1za2lwZm9yd2FyZDsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1za2lwZm9yd2FyZC1vdXRsaW5lOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1pb3Mtc2tpcGZvcndhcmQtb3V0bGluZTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1zbm93eTpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItaW9zLXNub3d5OyB9XG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLXNwZWVkb21ldGVyOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1pb3Mtc3BlZWRvbWV0ZXI7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1pb3Mtc3BlZWRvbWV0ZXItb3V0bGluZTpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItaW9zLXNwZWVkb21ldGVyLW91dGxpbmU7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1pb3Mtc3RhcjpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItaW9zLXN0YXI7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1pb3Mtc3Rhci1oYWxmOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1pb3Mtc3Rhci1oYWxmOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLXN0YXItb3V0bGluZTpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItaW9zLXN0YXItb3V0bGluZTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1zdG9wd2F0Y2g6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWlvcy1zdG9wd2F0Y2g7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1pb3Mtc3RvcHdhdGNoLW91dGxpbmU6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWlvcy1zdG9wd2F0Y2gtb3V0bGluZTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy1zdW5ueTpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItaW9zLXN1bm55OyB9XG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLXN1bm55LW91dGxpbmU6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWlvcy1zdW5ueS1vdXRsaW5lOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLXRlbGVwaG9uZTpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItaW9zLXRlbGVwaG9uZTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy10ZWxlcGhvbmUtb3V0bGluZTpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItaW9zLXRlbGVwaG9uZS1vdXRsaW5lOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLXRlbm5pc2JhbGw6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWlvcy10ZW5uaXNiYWxsOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLXRlbm5pc2JhbGwtb3V0bGluZTpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItaW9zLXRlbm5pc2JhbGwtb3V0bGluZTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy10aHVuZGVyc3Rvcm06YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWlvcy10aHVuZGVyc3Rvcm07IH1cbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtdGh1bmRlcnN0b3JtLW91dGxpbmU6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWlvcy10aHVuZGVyc3Rvcm0tb3V0bGluZTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy10aW1lOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1pb3MtdGltZTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy10aW1lLW91dGxpbmU6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWlvcy10aW1lLW91dGxpbmU7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtdGltZXI6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWlvcy10aW1lcjsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy10aW1lci1vdXRsaW5lOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1pb3MtdGltZXItb3V0bGluZTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy10b2dnbGU6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWlvcy10b2dnbGU7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtdG9nZ2xlLW91dGxpbmU6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWlvcy10b2dnbGUtb3V0bGluZTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy10cmFzaDpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItaW9zLXRyYXNoOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLXRyYXNoLW91dGxpbmU6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWlvcy10cmFzaC1vdXRsaW5lOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLXVuZG86YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWlvcy11bmRvOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLXVuZG8tb3V0bGluZTpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItaW9zLXVuZG8tb3V0bGluZTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy11bmxvY2tlZDpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItaW9zLXVubG9ja2VkOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLXVubG9ja2VkLW91dGxpbmU6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWlvcy11bmxvY2tlZC1vdXRsaW5lOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLXVwbG9hZDpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItaW9zLXVwbG9hZDsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy11cGxvYWQtb3V0bGluZTpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItaW9zLXVwbG9hZC1vdXRsaW5lOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLXZpZGVvY2FtOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1pb3MtdmlkZW9jYW07IH1cbi5Ae2lvbmljb25zLXByZWZpeH1pb3MtdmlkZW9jYW0tb3V0bGluZTpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItaW9zLXZpZGVvY2FtLW91dGxpbmU7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1pb3Mtdm9sdW1lLWhpZ2g6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWlvcy12b2x1bWUtaGlnaDsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy12b2x1bWUtbG93OmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1pb3Mtdm9sdW1lLWxvdzsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy13aW5lZ2xhc3M6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWlvcy13aW5lZ2xhc3M7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1pb3Mtd2luZWdsYXNzLW91dGxpbmU6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWlvcy13aW5lZ2xhc3Mtb3V0bGluZTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWlvcy13b3JsZDpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItaW9zLXdvcmxkOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9aW9zLXdvcmxkLW91dGxpbmU6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWlvcy13b3JsZC1vdXRsaW5lOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9aXBhZDpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItaXBhZDsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWlwaG9uZTpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItaXBob25lOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9aXBvZDpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItaXBvZDsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWpldDpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItamV0OyB9XG4uQHtpb25pY29ucy1wcmVmaXh9a2V5OmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1rZXk7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1rbmlmZTpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXIta25pZmU7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1sYXB0b3A6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWxhcHRvcDsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWxlYWY6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWxlYWY7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1sZXZlbHM6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWxldmVsczsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWxpZ2h0YnVsYjpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItbGlnaHRidWxiOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9bGluazpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItbGluazsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWxvYWQtYTpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItbG9hZC1hOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9bG9hZC1iOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1sb2FkLWI7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1sb2FkLWM6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWxvYWQtYzsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWxvYWQtZDpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItbG9hZC1kOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9bG9jYXRpb246YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLWxvY2F0aW9uOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9bG9jay1jb21iaW5hdGlvbjpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItbG9jay1jb21iaW5hdGlvbjsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fWxvY2tlZDpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItbG9ja2VkOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9bG9nLWluOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1sb2ctaW47IH1cbi5Ae2lvbmljb25zLXByZWZpeH1sb2ctb3V0OmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1sb2ctb3V0OyB9XG4uQHtpb25pY29ucy1wcmVmaXh9bG9vcDpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItbG9vcDsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fW1hZ25ldDpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItbWFnbmV0OyB9XG4uQHtpb25pY29ucy1wcmVmaXh9bWFsZTpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItbWFsZTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fW1hbjpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItbWFuOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9bWFwOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1tYXA7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1tZWRraXQ6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLW1lZGtpdDsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fW1lcmdlOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1tZXJnZTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fW1pYy1hOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1taWMtYTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fW1pYy1iOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1taWMtYjsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fW1pYy1jOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1taWMtYzsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fW1pbnVzOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1taW51czsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fW1pbnVzLWNpcmNsZWQ6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLW1pbnVzLWNpcmNsZWQ7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1taW51cy1yb3VuZDpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItbWludXMtcm91bmQ7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1tb2RlbC1zOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1tb2RlbC1zOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9bW9uaXRvcjpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItbW9uaXRvcjsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fW1vcmU6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLW1vcmU7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1tb3VzZTpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItbW91c2U7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1tdXNpYy1ub3RlOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1tdXNpYy1ub3RlOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9bmF2aWNvbjpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItbmF2aWNvbjsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fW5hdmljb24tcm91bmQ6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLW5hdmljb24tcm91bmQ7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1uYXZpZ2F0ZTpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItbmF2aWdhdGU7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1uZXR3b3JrOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1uZXR3b3JrOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9bm8tc21va2luZzpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItbm8tc21va2luZzsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fW51Y2xlYXI6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLW51Y2xlYXI7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1vdXRsZXQ6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLW91dGxldDsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fXBhaW50YnJ1c2g6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLXBhaW50YnJ1c2g7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1wYWludGJ1Y2tldDpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItcGFpbnRidWNrZXQ7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1wYXBlci1haXJwbGFuZTpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItcGFwZXItYWlycGxhbmU7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1wYXBlcmNsaXA6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLXBhcGVyY2xpcDsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fXBhdXNlOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1wYXVzZTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fXBlcnNvbjpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItcGVyc29uOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9cGVyc29uLWFkZDpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItcGVyc29uLWFkZDsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fXBlcnNvbi1zdGFsa2VyOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1wZXJzb24tc3RhbGtlcjsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fXBpZS1ncmFwaDpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItcGllLWdyYXBoOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9cGluOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1waW47IH1cbi5Ae2lvbmljb25zLXByZWZpeH1waW5wb2ludDpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItcGlucG9pbnQ7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1waXp6YTpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItcGl6emE7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1wbGFuZTpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItcGxhbmU7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1wbGFuZXQ6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLXBsYW5ldDsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fXBsYXk6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLXBsYXk7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1wbGF5c3RhdGlvbjpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItcGxheXN0YXRpb247IH1cbi5Ae2lvbmljb25zLXByZWZpeH1wbHVzOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1wbHVzOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9cGx1cy1jaXJjbGVkOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1wbHVzLWNpcmNsZWQ7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1wbHVzLXJvdW5kOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1wbHVzLXJvdW5kOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9cG9kaXVtOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1wb2RpdW07IH1cbi5Ae2lvbmljb25zLXByZWZpeH1wb3VuZDpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItcG91bmQ7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1wb3dlcjpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItcG93ZXI7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1wcmljZXRhZzpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItcHJpY2V0YWc7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1wcmljZXRhZ3M6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLXByaWNldGFnczsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fXByaW50ZXI6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLXByaW50ZXI7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1wdWxsLXJlcXVlc3Q6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLXB1bGwtcmVxdWVzdDsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fXFyLXNjYW5uZXI6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLXFyLXNjYW5uZXI7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1xdW90ZTpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItcXVvdGU7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1yYWRpby13YXZlczpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItcmFkaW8td2F2ZXM7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1yZWNvcmQ6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLXJlY29yZDsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fXJlZnJlc2g6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLXJlZnJlc2g7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1yZXBseTpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItcmVwbHk7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1yZXBseS1hbGw6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLXJlcGx5LWFsbDsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fXJpYmJvbi1hOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1yaWJib24tYTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fXJpYmJvbi1iOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1yaWJib24tYjsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fXNhZDpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItc2FkOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9c2FkLW91dGxpbmU6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLXNhZC1vdXRsaW5lOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9c2Npc3NvcnM6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLXNjaXNzb3JzOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9c2VhcmNoOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1zZWFyY2g7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1zZXR0aW5nczpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItc2V0dGluZ3M7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1zaGFyZTpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItc2hhcmU7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1zaHVmZmxlOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1zaHVmZmxlOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9c2tpcC1iYWNrd2FyZDpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItc2tpcC1iYWNrd2FyZDsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fXNraXAtZm9yd2FyZDpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItc2tpcC1mb3J3YXJkOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9c29jaWFsLWFuZHJvaWQ6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLXNvY2lhbC1hbmRyb2lkOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9c29jaWFsLWFuZHJvaWQtb3V0bGluZTpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItc29jaWFsLWFuZHJvaWQtb3V0bGluZTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fXNvY2lhbC1hbmd1bGFyOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1zb2NpYWwtYW5ndWxhcjsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fXNvY2lhbC1hbmd1bGFyLW91dGxpbmU6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLXNvY2lhbC1hbmd1bGFyLW91dGxpbmU7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1zb2NpYWwtYXBwbGU6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLXNvY2lhbC1hcHBsZTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fXNvY2lhbC1hcHBsZS1vdXRsaW5lOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1zb2NpYWwtYXBwbGUtb3V0bGluZTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fXNvY2lhbC1iaXRjb2luOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1zb2NpYWwtYml0Y29pbjsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fXNvY2lhbC1iaXRjb2luLW91dGxpbmU6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLXNvY2lhbC1iaXRjb2luLW91dGxpbmU7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1zb2NpYWwtYnVmZmVyOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1zb2NpYWwtYnVmZmVyOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9c29jaWFsLWJ1ZmZlci1vdXRsaW5lOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1zb2NpYWwtYnVmZmVyLW91dGxpbmU7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1zb2NpYWwtY2hyb21lOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1zb2NpYWwtY2hyb21lOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9c29jaWFsLWNocm9tZS1vdXRsaW5lOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1zb2NpYWwtY2hyb21lLW91dGxpbmU7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1zb2NpYWwtY29kZXBlbjpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItc29jaWFsLWNvZGVwZW47IH1cbi5Ae2lvbmljb25zLXByZWZpeH1zb2NpYWwtY29kZXBlbi1vdXRsaW5lOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1zb2NpYWwtY29kZXBlbi1vdXRsaW5lOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9c29jaWFsLWNzczM6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLXNvY2lhbC1jc3MzOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9c29jaWFsLWNzczMtb3V0bGluZTpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItc29jaWFsLWNzczMtb3V0bGluZTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fXNvY2lhbC1kZXNpZ25lcm5ld3M6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLXNvY2lhbC1kZXNpZ25lcm5ld3M7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1zb2NpYWwtZGVzaWduZXJuZXdzLW91dGxpbmU6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLXNvY2lhbC1kZXNpZ25lcm5ld3Mtb3V0bGluZTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fXNvY2lhbC1kcmliYmJsZTpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItc29jaWFsLWRyaWJiYmxlOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9c29jaWFsLWRyaWJiYmxlLW91dGxpbmU6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLXNvY2lhbC1kcmliYmJsZS1vdXRsaW5lOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9c29jaWFsLWRyb3Bib3g6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLXNvY2lhbC1kcm9wYm94OyB9XG4uQHtpb25pY29ucy1wcmVmaXh9c29jaWFsLWRyb3Bib3gtb3V0bGluZTpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItc29jaWFsLWRyb3Bib3gtb3V0bGluZTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fXNvY2lhbC1ldXJvOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1zb2NpYWwtZXVybzsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fXNvY2lhbC1ldXJvLW91dGxpbmU6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLXNvY2lhbC1ldXJvLW91dGxpbmU7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1zb2NpYWwtZmFjZWJvb2s6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLXNvY2lhbC1mYWNlYm9vazsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fXNvY2lhbC1mYWNlYm9vay1vdXRsaW5lOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1zb2NpYWwtZmFjZWJvb2stb3V0bGluZTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fXNvY2lhbC1mb3Vyc3F1YXJlOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1zb2NpYWwtZm91cnNxdWFyZTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fXNvY2lhbC1mb3Vyc3F1YXJlLW91dGxpbmU6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLXNvY2lhbC1mb3Vyc3F1YXJlLW91dGxpbmU7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1zb2NpYWwtZnJlZWJzZC1kZXZpbDpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItc29jaWFsLWZyZWVic2QtZGV2aWw7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1zb2NpYWwtZ2l0aHViOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1zb2NpYWwtZ2l0aHViOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9c29jaWFsLWdpdGh1Yi1vdXRsaW5lOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1zb2NpYWwtZ2l0aHViLW91dGxpbmU7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1zb2NpYWwtZ29vZ2xlOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1zb2NpYWwtZ29vZ2xlOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9c29jaWFsLWdvb2dsZS1vdXRsaW5lOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1zb2NpYWwtZ29vZ2xlLW91dGxpbmU7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1zb2NpYWwtZ29vZ2xlcGx1czpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItc29jaWFsLWdvb2dsZXBsdXM7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1zb2NpYWwtZ29vZ2xlcGx1cy1vdXRsaW5lOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1zb2NpYWwtZ29vZ2xlcGx1cy1vdXRsaW5lOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9c29jaWFsLWhhY2tlcm5ld3M6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLXNvY2lhbC1oYWNrZXJuZXdzOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9c29jaWFsLWhhY2tlcm5ld3Mtb3V0bGluZTpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItc29jaWFsLWhhY2tlcm5ld3Mtb3V0bGluZTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fXNvY2lhbC1odG1sNTpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItc29jaWFsLWh0bWw1OyB9XG4uQHtpb25pY29ucy1wcmVmaXh9c29jaWFsLWh0bWw1LW91dGxpbmU6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLXNvY2lhbC1odG1sNS1vdXRsaW5lOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9c29jaWFsLWluc3RhZ3JhbTpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItc29jaWFsLWluc3RhZ3JhbTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fXNvY2lhbC1pbnN0YWdyYW0tb3V0bGluZTpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItc29jaWFsLWluc3RhZ3JhbS1vdXRsaW5lOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9c29jaWFsLWphdmFzY3JpcHQ6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLXNvY2lhbC1qYXZhc2NyaXB0OyB9XG4uQHtpb25pY29ucy1wcmVmaXh9c29jaWFsLWphdmFzY3JpcHQtb3V0bGluZTpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItc29jaWFsLWphdmFzY3JpcHQtb3V0bGluZTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fXNvY2lhbC1saW5rZWRpbjpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItc29jaWFsLWxpbmtlZGluOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9c29jaWFsLWxpbmtlZGluLW91dGxpbmU6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLXNvY2lhbC1saW5rZWRpbi1vdXRsaW5lOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9c29jaWFsLW1hcmtkb3duOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1zb2NpYWwtbWFya2Rvd247IH1cbi5Ae2lvbmljb25zLXByZWZpeH1zb2NpYWwtbm9kZWpzOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1zb2NpYWwtbm9kZWpzOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9c29jaWFsLW9jdG9jYXQ6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLXNvY2lhbC1vY3RvY2F0OyB9XG4uQHtpb25pY29ucy1wcmVmaXh9c29jaWFsLXBpbnRlcmVzdDpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItc29jaWFsLXBpbnRlcmVzdDsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fXNvY2lhbC1waW50ZXJlc3Qtb3V0bGluZTpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItc29jaWFsLXBpbnRlcmVzdC1vdXRsaW5lOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9c29jaWFsLXB5dGhvbjpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItc29jaWFsLXB5dGhvbjsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fXNvY2lhbC1yZWRkaXQ6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLXNvY2lhbC1yZWRkaXQ7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1zb2NpYWwtcmVkZGl0LW91dGxpbmU6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLXNvY2lhbC1yZWRkaXQtb3V0bGluZTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fXNvY2lhbC1yc3M6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLXNvY2lhbC1yc3M7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1zb2NpYWwtcnNzLW91dGxpbmU6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLXNvY2lhbC1yc3Mtb3V0bGluZTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fXNvY2lhbC1zYXNzOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1zb2NpYWwtc2FzczsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fXNvY2lhbC1za3lwZTpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItc29jaWFsLXNreXBlOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9c29jaWFsLXNreXBlLW91dGxpbmU6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLXNvY2lhbC1za3lwZS1vdXRsaW5lOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9c29jaWFsLXNuYXBjaGF0OmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1zb2NpYWwtc25hcGNoYXQ7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1zb2NpYWwtc25hcGNoYXQtb3V0bGluZTpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItc29jaWFsLXNuYXBjaGF0LW91dGxpbmU7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1zb2NpYWwtdHVtYmxyOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1zb2NpYWwtdHVtYmxyOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9c29jaWFsLXR1bWJsci1vdXRsaW5lOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1zb2NpYWwtdHVtYmxyLW91dGxpbmU7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1zb2NpYWwtdHV4OmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1zb2NpYWwtdHV4OyB9XG4uQHtpb25pY29ucy1wcmVmaXh9c29jaWFsLXR3aXRjaDpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItc29jaWFsLXR3aXRjaDsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fXNvY2lhbC10d2l0Y2gtb3V0bGluZTpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItc29jaWFsLXR3aXRjaC1vdXRsaW5lOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9c29jaWFsLXR3aXR0ZXI6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLXNvY2lhbC10d2l0dGVyOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9c29jaWFsLXR3aXR0ZXItb3V0bGluZTpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItc29jaWFsLXR3aXR0ZXItb3V0bGluZTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fXNvY2lhbC11c2Q6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLXNvY2lhbC11c2Q7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1zb2NpYWwtdXNkLW91dGxpbmU6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLXNvY2lhbC11c2Qtb3V0bGluZTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fXNvY2lhbC12aW1lbzpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItc29jaWFsLXZpbWVvOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9c29jaWFsLXZpbWVvLW91dGxpbmU6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLXNvY2lhbC12aW1lby1vdXRsaW5lOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9c29jaWFsLXdoYXRzYXBwOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1zb2NpYWwtd2hhdHNhcHA7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1zb2NpYWwtd2hhdHNhcHAtb3V0bGluZTpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItc29jaWFsLXdoYXRzYXBwLW91dGxpbmU7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1zb2NpYWwtd2luZG93czpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItc29jaWFsLXdpbmRvd3M7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1zb2NpYWwtd2luZG93cy1vdXRsaW5lOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1zb2NpYWwtd2luZG93cy1vdXRsaW5lOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9c29jaWFsLXdvcmRwcmVzczpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItc29jaWFsLXdvcmRwcmVzczsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fXNvY2lhbC13b3JkcHJlc3Mtb3V0bGluZTpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItc29jaWFsLXdvcmRwcmVzcy1vdXRsaW5lOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9c29jaWFsLXlhaG9vOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1zb2NpYWwteWFob287IH1cbi5Ae2lvbmljb25zLXByZWZpeH1zb2NpYWwteWFob28tb3V0bGluZTpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItc29jaWFsLXlhaG9vLW91dGxpbmU7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1zb2NpYWwteWVuOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1zb2NpYWwteWVuOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9c29jaWFsLXllbi1vdXRsaW5lOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1zb2NpYWwteWVuLW91dGxpbmU7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1zb2NpYWwteW91dHViZTpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItc29jaWFsLXlvdXR1YmU7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1zb2NpYWwteW91dHViZS1vdXRsaW5lOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1zb2NpYWwteW91dHViZS1vdXRsaW5lOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9c291cC1jYW46YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLXNvdXAtY2FuOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9c291cC1jYW4tb3V0bGluZTpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItc291cC1jYW4tb3V0bGluZTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fXNwZWFrZXJwaG9uZTpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItc3BlYWtlcnBob25lOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9c3BlZWRvbWV0ZXI6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLXNwZWVkb21ldGVyOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9c3Bvb246YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLXNwb29uOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9c3RhcjpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItc3RhcjsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fXN0YXRzLWJhcnM6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLXN0YXRzLWJhcnM7IH1cbi5Ae2lvbmljb25zLXByZWZpeH1zdGVhbTpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItc3RlYW07IH1cbi5Ae2lvbmljb25zLXByZWZpeH1zdG9wOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci1zdG9wOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9dGhlcm1vbWV0ZXI6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLXRoZXJtb21ldGVyOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9dGh1bWJzZG93bjpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItdGh1bWJzZG93bjsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fXRodW1ic3VwOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci10aHVtYnN1cDsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fXRvZ2dsZTpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItdG9nZ2xlOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9dG9nZ2xlLWZpbGxlZDpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItdG9nZ2xlLWZpbGxlZDsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fXRyYW5zZ2VuZGVyOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci10cmFuc2dlbmRlcjsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fXRyYXNoLWE6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLXRyYXNoLWE7IH1cbi5Ae2lvbmljb25zLXByZWZpeH10cmFzaC1iOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci10cmFzaC1iOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9dHJvcGh5OmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci10cm9waHk7IH1cbi5Ae2lvbmljb25zLXByZWZpeH10c2hpcnQ6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLXRzaGlydDsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fXRzaGlydC1vdXRsaW5lOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci10c2hpcnQtb3V0bGluZTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fXVtYnJlbGxhOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci11bWJyZWxsYTsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fXVuaXZlcnNpdHk6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLXVuaXZlcnNpdHk7IH1cbi5Ae2lvbmljb25zLXByZWZpeH11bmxvY2tlZDpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItdW5sb2NrZWQ7IH1cbi5Ae2lvbmljb25zLXByZWZpeH11cGxvYWQ6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLXVwbG9hZDsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fXVzYjpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItdXNiOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9dmlkZW9jYW1lcmE6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLXZpZGVvY2FtZXJhOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9dm9sdW1lLWhpZ2g6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLXZvbHVtZS1oaWdoOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9dm9sdW1lLWxvdzpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItdm9sdW1lLWxvdzsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fXZvbHVtZS1tZWRpdW06YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLXZvbHVtZS1tZWRpdW07IH1cbi5Ae2lvbmljb25zLXByZWZpeH12b2x1bWUtbXV0ZTpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItdm9sdW1lLW11dGU7IH1cbi5Ae2lvbmljb25zLXByZWZpeH13YW5kOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci13YW5kOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9d2F0ZXJkcm9wOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci13YXRlcmRyb3A7IH1cbi5Ae2lvbmljb25zLXByZWZpeH13aWZpOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci13aWZpOyB9XG4uQHtpb25pY29ucy1wcmVmaXh9d2luZWdsYXNzOmJlZm9yZSB7IGNvbnRlbnQ6IEBpb25pY29uLXZhci13aW5lZ2xhc3M7IH1cbi5Ae2lvbmljb25zLXByZWZpeH13b21hbjpiZWZvcmUgeyBjb250ZW50OiBAaW9uaWNvbi12YXItd29tYW47IH1cbi5Ae2lvbmljb25zLXByZWZpeH13cmVuY2g6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLXdyZW5jaDsgfVxuLkB7aW9uaWNvbnMtcHJlZml4fXhib3g6YmVmb3JlIHsgY29udGVudDogQGlvbmljb24tdmFyLXhib3g7IH0iLCIuY2hhdC1lbWJlZC1tYWluLXRpdGxlIHtcbiAgZGlzcGxheTogZmxleDtcbiAgZmxleC1ncm93OiAxO1xuICBwYWRkaW5nLWxlZnQ6IDMxcHg7XG4gIHBhZGRpbmctdG9wOiA3cHg7XG59XG5cbi5naXR0ZXItY2hhdC1lbWJlZCB7XG4gIHotaW5kZXg6IDEwMDtcbiAgcG9zaXRpb246IGZpeGVkO1xuXG4gIHRvcDogMDtcbiAgbGVmdDogNjAlO1xuICBib3R0b206IDA7XG4gIHJpZ2h0OiAwO1xuXG4gIGRpc3BsYXk6IGZsZXg7XG4gIGZsZXgtZGlyZWN0aW9uOiByb3c7XG4gIHRyYW5zaXRpb246IHRyYW5zZm9ybSAwLjNzIGN1YmljLWJlemllcigwLjE2LCAwLjIyLCAwLjIyLCAxLjcpO1xufVxuXG4uZ2l0dGVyLWNoYXQtZW1iZWQuaXMtY29sbGFwc2VkOm5vdCguaXMtbG9hZGluZykge1xuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoMTEwJSk7XG59XG4iLCIuam9icy1saXN0LWhpZ2hsaWdodCB7XG4gIGJhY2tncm91bmQtY29sb3I6ICNmZmNcbn1cblxuYS5qb2JzLWxpc3QtaGlnaGxpZ2h0OmhvdmVyIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZmY1xufVxuXG4uam9icy1saXN0IHtcbiAgY3Vyc29yOiBwb2ludGVyO1xuICBjdXJzb3I6IGhhbmQ7XG59XG5cbi5qb2JzLWNoZWNrYm94LXNwYWNlciBpbnB1dFt0eXBlPVwiY2hlY2tib3hcIl0ge1xuICBtYXJnaW4tbGVmdDogLTIzcHhcbn1cbiIsIi5jaGFsbGVuZ2Utc3RlcC1kZXNjcmlwdGlvbiB7XG4gIGZvbnQtc2l6ZTogMS41ZW07XG59XG4uY2hhbGxlbmdlLXN0ZXAtY291bnRlciB7XG4gIGZvbnQtc2l6ZTogMjBweDtcbiAgbGluZS1oZWlnaHQ6IDQ0cHg7XG59XG5cbi5jaGFsbGVuZ2UtaW5zdHJ1Y3Rpb25zLXRpdGxlIHtcbiAgbWFyZ2luLXRvcDogMDtcbiAgaSB7XG4gICAgbWFyZ2luLWxlZnQ6IDVweDtcbiAgICBsaW5lLWhlaWdodDogMjBweDtcbiAgfVxufVxuXG4uY2hhbGxlbmdlLWluc3RydWN0aW9ucyB7XG4gIG1hcmdpbi1ib3R0b206IDVweDtcbiAgaDQge1xuICAgIG1hcmdpbi1ib3R0b206IDA7XG4gIH1cbiAgYmxvY2txdW90ZSB7XG4gICAgZm9udC1zaXplOiA5MCU7XG4gICAgZm9udC1mYW1pbHk6IEBmb250LWZhbWlseS1tb25vc3BhY2U7XG4gICAgY29sb3I6IEBjb2RlLWNvbG9yO1xuICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmZiZTU7XG4gICAgYm9yZGVyLXJhZGl1czogQGJvcmRlci1yYWRpdXMtYmFzZTtcbiAgICBib3JkZXI6IDFweCBzb2xpZCBAcHJlLWJvcmRlci1jb2xvcjtcbiAgICB3aGl0ZS1zcGFjZTogcHJlO1xuICAgIHBhZGRpbmc6IDVweCAxMHB4O1xuICAgIG1hcmdpbi1ib3R0b206IDEwcHg7XG4gICAgbWFyZ2luLXRvcDogLTEwcHg7XG4gICAgb3ZlcmZsb3c6IGF1dG87XG4gIH1cbiAgZGZuIHtcbiAgICBmb250LWZhbWlseTogQGZvbnQtZmFtaWx5LW1vbm9zcGFjZTtcbiAgICBjb2xvcjogQGNvZGUtY29sb3I7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogQGNvZGUtYmc7XG4gICAgYm9yZGVyLXJhZGl1czogQGJvcmRlci1yYWRpdXMtYmFzZTtcbiAgfVxuICAmIGEsICNNRE4tbGlua3MgYSB7XG4gICAgY29sb3I6ICMzMTcwOGY7XG4gIH1cbiAgJiBhOjphZnRlciwgI01ETi1saW5rcyBhOjphZnRlciB7XG4gICAgZm9udC1zaXplOiA3MCU7XG4gICAgZm9udC1mYW1pbHk6IEZvbnRBd2Vzb21lO1xuICAgIGNvbnRlbnQ6IFwiIFxcZjA4ZVwiO1xuICB9XG4gIG9sIHtcbiAgICBmb250LXNpemU6IDE2cHg7XG4gIH1cbn1cblxuI3Rlc3RTdWl0ZSB7XG4gIG1hcmdpbi10b3A6IDEwcHg7XG4gID4gZGl2ID4ucm93IHtcbiAgICBtYXJnaW46IDAhaW1wb3J0YW50O1xuICB9XG59XG5cbi50ZXN0LW91dHB1dCB7XG4gIGZvbnQtc2l6ZTogMTVweDtcbiAgZm9udC1mYW1pbHk6IFwiVWJ1bnR1IE1vbm9cIjtcbiAgbWFyZ2luLXRvcDogOHB4O1xuICBsaW5lLWhlaWdodDoyMHB4O1xufVxuXG4uZ3JheWVkLW91dC10ZXN0LW91dHB1dCB7XG4gIGNvbG9yOiBAZ3JheS1saWdodDtcbn1cblxuLmJpZy1lcnJvci1pY29uIHtcbiAgZm9udC1zaXplOiAzMHB4O1xuICBjb2xvcjogQGJyYW5kLWRhbmdlcjtcbiAgdG9wOjUwJTtcbn1cblxuLmJpZy1zdWNjZXNzLWljb24ge1xuICBmb250LXNpemU6IDMwcHg7XG4gIGNvbG9yOiBAYnJhbmQtcHJpbWFyeTtcbn1cblxuaWZyYW1lLmlwaG9uZSB7XG4gIGJvcmRlcjogbm9uZTtcbiAgQG1lZGlhKG1pbi13aWR0aDogOTkycHgpIHtcbiAgICB3aWR0aDogMjgwcHg7XG4gICAgaGVpZ2h0OiA1MDBweDtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgdG9wOiA3MHB4O1xuICAgIHJpZ2h0OiAzNXB4O1xuICAgIG92ZXJmbG93LXk6IHNjcm9sbDtcbiAgfVxuICBAbWVkaWEobWF4LXdpZHRoOiA5OTFweCkge1xuICAgIHdpZHRoOiAxMDAlO1xuICAgIGJvcmRlci1yYWRpdXM6IDVweDtcbiAgICBvdmVyZmxvdy15OiB2aXNpYmxlO1xuICAgIGhlaWdodDogNTAwcHg7XG4gIH1cbiAgQG1lZGlhIChtaW4td2lkdGg6IDEyMDBweCkgYW5kIChtYXgtd2lkdGg6IDEyNTBweCl7XG4gICAgcmlnaHQ6IDIycHg7ICAgICAgXG4gIH1cbn1cblxuLy8gVG8gYWRqdXN0IHJpZ2h0IG1hcmdpbiwgbmVnYXRpdmUgdmFsdWVzIGJyaW5nIHRoZSBpbWFnZSBjbG9zZXIgdG8gdGhlIGVkZ2Ugb2YgdGhlIHNjcmVlblxuLmlwaG9uZS1wb3NpdGlvbiB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgdG9wOiAtNTBweDtcbiAgei1pbmRleDogLTE7XG4gIHJpZ2h0OiAtMTk1cHg7XG4gIEBtZWRpYSAobWluLXdpZHRoOiAxMjAwcHgpIGFuZCAobWF4LXdpZHRoOiAxMjUwcHgpe1xuICAgIHJpZ2h0OiAtMjA3cHg7ICAgICAgXG4gIH1cbn1cbiIsIi8qXG4gKiBiYXNlZCBvZmYgb2YgaHR0cHM6Ly9naXRodWIuY29tL2dpdHRlckhRL3NpZGVjYXJcbiAqIGxpY2Vuc2U6IE1JVFxuICovXG4ubWFwLWFzaWRlIHtcbiAgICB3aWR0aDo1MDBweDtcblxuICAgIHotaW5kZXg6IDIwMDAwO1xuICAgIHBvc2l0aW9uOiBmaXhlZDtcbiAgICB0b3A6IDA7XG4gICAgYm90dG9tOiAwO1xuICAgIHJpZ2h0OiAwO1xuXG4gICAgZGlzcGxheTogLXdlYmtpdC1mbGV4O1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgLXdlYmtpdC1mbGV4LWRpcmVjdGlvbjogcm93O1xuICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogQGJvZHktYmc7XG4gICAgYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjZGRkO1xuICAgIGJveC1zaGFkb3c6IC0xMnB4IDAgMThweCAwIHJnYmEoNTAsIDUwLCA1MCwgMC4xKTtcblxuICAgIHRyYW5zaXRpb246IHRyYW5zZm9ybSAwLjNzIGN1YmljLWJlemllcigwLjE2LCAwLjIyLCAwLjIyLCAxLjcpO1xuXG4gICAgJi5pcy1jb2xsYXBzZWQ6bm90KC5pcy1sb2FkaW5nKSB7XG4gICAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlWCgxMTAlKTtcbiAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgxMTAlKTtcbiAgICB9XG5cbiAgICAvKiBBZGQgc29tZSBcImV4dGVuc2lvblwiIHNvIHRoYXQgdGhlcmUgaXNuJ3QgYSBnYXBcbiAgICAgKiB3aGVuIHdlIHRyYW5zbGF0ZSh2aWEgYW5pbWF0aW9uKSBtb3JlIHRoYW4gMTAwJSAqL1xuICAgICY6YWZ0ZXIge1xuICAgICAgY29udGVudDogJyc7XG5cbiAgICAgIHotaW5kZXg6IC0xO1xuICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgICAgdG9wOiAwO1xuICAgICAgbGVmdDogMTAwJTtcbiAgICAgIGJvdHRvbTogMDtcbiAgICAgIHJpZ2h0OiAtMTAwJTtcblxuICAgICAgYmFja2dyb3VuZC1jb2xvcjogQGJvZHktYmc7XG4gICAgfVxuICAgIGlmcmFtZSB7XG4gICAgICB3aWR0aDogMTAwJTtcbiAgICAgIGhlaWdodDogMTAwJTtcbiAgICB9XG59XG5cbi5tYXAtYXNpZGUtYWN0aW9uLWJhciB7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIHRvcDogMDtcbiAgICByaWdodDogMDtcblxuICAgIGRpc3BsYXk6IC13ZWJraXQtZmxleDtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGp1c3RpZnktY29udGVudDogZmxleC1lbmQ7XG5cbiAgICBwYWRkaW5nLWJvdHRvbTogNXB4O1xuICAgIHBhZGRpbmctcmlnaHQ6MTBweDtcbiAgICBwYWRkaW5nLXRvcDo1cHg7XG4gICAgei1pbmRleDogMTAwO1xufVxuXG4ubWFwLWZpeGVkLWhlYWRlciB7XG4gIHBvc2l0aW9uOiBmaXhlZDtcbiAgYmFja2dyb3VuZDogd2hpdGU7XG4gIHBhZGRpbmctdG9wOiA1cHg7XG4gIHdpZHRoOiAxMDAlO1xuICB6LWluZGV4OiAxO1xuICBsZWZ0OiAwO1xuICB0b3A6IDA7XG4gIEBtZWRpYSAobWF4LXdpZHRoOiA3MjBweCkge1xuICAgIHBhZGRpbmctdG9wOjMwcHg7XG4gIH1cbiAgcCB7XG4gIG1hcmdpbjogNXB4IDAgMjBweDtcbiAgICBAbWVkaWEgKG1heC13aWR0aDogNzIwcHgpIHtcbiAgICAgIG1hcmdpbi1ib3R0b206MTBweDtcbiAgICB9XG4gIH1cbiAgaHIge1xuICAgIG1hcmdpbjozMHB4IDA7XG4gICAgQG1lZGlhIChtYXgtd2lkdGg6IDcyMHB4KSB7XG4gICAgICBtYXJnaW46MjVweCAwO1xuICAgIH1cbiAgfVxuICAuZmxhc2hNZXNzYWdlIHtcbiAgICBwb3NpdGlvbjpmaXhlZDtcbiAgICBtYXJnaW46IDAgYXV0bztcbiAgICB6LWluZGV4OiAyO1xuICAgIHRvcDogMTYwcHg7XG4gICAgd2lkdGg6IDEwMCU7XG4gIH1cbiB9XG5cbi5tYXAtYnV0dG9ucyB7XG4gIG1hcmdpbi10b3A6IC0xMHB4O1xuICAmIGJ1dHRvbixcbiAgJiAuaW5wdXQtZ3JvdXB7XG4gICAgd2lkdGg6MzAwcHg7XG4gIH1cbiAgLmlucHV0LWdyb3Vwe1xuICAgIG1hcmdpbi10b3A6IDE1cHg7XG4gICAgbWFyZ2luLWxlZnQ6IGF1dG87XG4gICAgbWFyZ2luLXJpZ2h0OiBhdXRvO1xuICB9XG59XG5cbiNtYXAtZmlsdGVyIHtcbiAgICBiYWNrZ3JvdW5kOiNmZmY7XG4gICAgYm9yZGVyLWNvbG9yOiBkYXJrZ3JlZW47XG59XG4uaW5wdXQtZ3JvdXAtYWRkb24ge1xuICB3aWR0aDo0MHB4O1xuICBjb2xvcjogZGFya2dyZWVuO1xuICBiYWNrZ3JvdW5kOiAjZmZmO1xuICBib3JkZXItY29sb3I6IGRhcmtncmVlbjtcbiAgJi5maWxsZWR7XG4gICAgYmFja2dyb3VuZDogZGFya2dyZWVuO1xuICAgIGJvcmRlci1jb2xvcjogIzAwMGQwMDtcbiAgICBjb2xvcjogI2ZmZjtcbiAgICBjdXJzb3I6IHBvaW50ZXI7XG4gIH1cbiAgLmZhIHtcbiAgICBwb3NpdGlvbjphYnNvbHV0ZTtcbiAgICB0b3A6NTAlO1xuICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC01MCUpO1xuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtNTAlKTtcbiAgICByaWdodDoxMHB4O1xuICB9XG59XG5cbi5tYXBXcmFwcGVyIHtcbiAgcG9zaXRpb246YWJzb2x1dGU7XG4gIGRpc3BsYXk6IGJsb2NrO1xuICBoZWlnaHQ6IDEwMCU7XG4gIHdpZHRoOiAxMDAlOyBcbn1cblxuLm1hcC1hY2NvcmRpb24ge1xuICB3aWR0aDo3MDBweDsgXG4gIG1hcmdpbjoxNTVweCBhdXRvIDA7IFxuICBwb3NpdGlvbjpyZWxhdGl2ZTtcbiAgI25lc3RlZCB7XG4gICAgbWFyZ2luOjAgMTBweDtcbiAgICBAbWVkaWEgKG1heC13aWR0aDogNDAwcHgpIHtcbiAgICBtYXJnaW46MDtcbiAgICB9XG4gIH1cbiAgYTpmb2N1cyB7XG4gICAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7XG4gICAgICBjb2xvcjpkYXJrZ3JlZW47XG4gIH1cbiAgYTpmb2N1czpob3ZlciB7XG4gICAgICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTtcbiAgICAgIGNvbG9yOiMwMDE4MDA7XG4gIH1cbiAgaDIgPiBhIHtcbiAgICAgIHdpZHRoOjEwMCU7XG4gICAgICBkaXNwbGF5OmJsb2NrO1xuICAgICAgYmFja2dyb3VuZDojZWZlZmVmO1xuICAgICAgcGFkZGluZzoxMHB4IDA7XG4gICAgICBwYWRkaW5nLWxlZnQ6NTBweDtcbiAgICAgIHBhZGRpbmctcmlnaHQ6MjBweDtcbiAgICB9XG5cbiAgaDMge1xuICAgIG1hcmdpbjoxNXB4IDA7XG4gICAgcGFkZGluZzowO1xuICAgICY6Zmlyc3QtY2hpbGQge1xuICAgICAgbWFyZ2luLXRvcDoyNXB4XG4gICAgfVxuICAgID4gYSB7XG4gICAgICBwYWRkaW5nLWxlZnQ6IDQwcHg7XG4gICAgICBwYWRkaW5nLWJvdHRvbTogMTBweDtcbiAgICAgIGRpc3BsYXk6YmxvY2s7XG4gICAgICBtYXgtd2lkdGg6IDUzNXB4O1xuICAgIH1cbiAgfVxuXG4gIGRpdi5jaGFwdGVyQmxvY2sge1xuICAgIDpiZWZvcmUge1xuICAgICAgbWFyZ2luLXJpZ2h0OiAxNXB4O1xuICAgIH1cbiAgICBwIHtcbiAgICAgIHRleHQtaW5kZW50OiAtMTVweDtcbiAgICAgIG1hcmdpbi1sZWZ0OiA2MHB4O1xuICAgICAgcGFkZGluZy1yaWdodDogMjBweDtcbiAgICAgIEBtZWRpYSAobWF4LXdpZHRoOiA0MDBweCkge1xuICAgICAgICAgIG1hcmdpbi1sZWZ0OjMwcHg7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLmNoYWxsZW5nZUJsb2NrRGVzY3JpcHRpb24ge1xuICAgICAgbWFyZ2luOjA7XG4gICAgICBtYXJnaW4tdG9wOi0xMHB4O1xuICAgICAgcGFkZGluZzowIDE1cHggMjNweCAzMHB4O1xuICAgIH1cblxuICBzcGFuLm5vLWxpbmstdW5kZXJsaW5lIHtcbiAgICBwb3NpdGlvbjphYnNvbHV0ZTtcbiAgICBtYXJnaW4tbGVmdDotMzBweDtcbiAgICBjb2xvcjogIzY2NjtcbiAgfVxuXG4gIGRpdiA+IGRpdjpsYXN0LWNoaWxkIHtcbiAgICBtYXJnaW4tYm90dG9tOjMwcHhcbiAgfVxufVxuLmNoYWxsZW5nZUJsb2NrVGltZSB7XG4gIGZvbnQtc2l6ZTogMThweDtcbiAgY29sb3I6ICNCQkJCQkI7XG4gIGRpc3BsYXk6YmxvY2s7XG4gIG1hcmdpbi1sZWZ0OiA0MHB4O1xuICBtYXJnaW4tYm90dG9tOiAyMHB4O1xuICBAbWVkaWEgKG1pbi13aWR0aDogNzIxcHgpIHtcbiAgICBtYXJnaW4tcmlnaHQ6IDIwcHg7XG4gICAgbWFyZ2luLXRvcDotMzBweDtcbiAgICBmbG9hdDpyaWdodDtcbiAgfVxufVxuXG5AbWVkaWEgKG1heC13aWR0aDogNzIwcHgpIHtcbiAgLm1hcC1hY2NvcmRpb24ge1xuICAgIGxlZnQ6MDtcbiAgICByaWdodDowO1xuICAgIHdpZHRoOjEwMCU7XG4gICAgdG9wOjE5NXB4O1xuICAgIGJvdHRvbTowO1xuICAgIG1hcmdpbjowO1xuICAgIHBvc2l0aW9uOmFic29sdXRlO1xuICAgIG92ZXJmbG93LXg6IGhpZGRlbjtcbiAgICBvdmVyZmxvdy15OiBhdXRvO1xuICAgIC13ZWJraXQtb3ZlcmZsb3ctc2Nyb2xsaW5nOiB0b3VjaDtcbiAgICBoMiB7XG4gICAgICBtYXJnaW46MTVweCAwO1xuICAgICAgcGFkZGluZzowO1xuICAgICAgJjpmaXJzdC1vZi10eXBlIHtcbiAgICAgICAgbWFyZ2luLXRvcDowO1xuICAgICAgfVxuICAgICAgPiBhIHtcbiAgICAgICAgcGFkZGluZzoxMHB4IDA7XG4gICAgICAgIHBhZGRpbmctbGVmdDo1MHB4O1xuICAgICAgICBwYWRkaW5nLXJpZ2h0OjIwcHg7XG4gICAgICAgIGZvbnQtc2l6ZToyMHB4O1xuICAgICAgfVxuICAgIH1cbiAgICBoMyB7XG4gICAgICBtYXJnaW46MTBweCAwO1xuICAgICAgcGFkZGluZzowO1xuICAgICAgPiBhIHtcbiAgICAgICAgY2xlYXI6Ym90aDtcbiAgICAgICAgZm9udC1zaXplOjIwcHg7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4gICAgXG4ubWFwLWFzaWRlLWFjdGlvbi1pdGVtIHtcbiAgICBkaXNwbGF5OiAtd2Via2l0LWZsZXg7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICAvKiBtYWluIGF4aXMgKi9cbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgICAvKiBjcm9zcyBheGlzICovXG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcblxuICAgIHdpZHRoOiA0MHB4O1xuICAgIGhlaWdodDogNDBweDtcblxuICAgIHBhZGRpbmctbGVmdDogMDtcbiAgICBwYWRkaW5nLXJpZ2h0OiAwO1xuXG4gICAgb3BhY2l0eTogMC42NTtcbiAgICBiYWNrZ3JvdW5kOiBub25lO1xuICAgIGJhY2tncm91bmQtcG9zaXRpb246IGNlbnRlciBjZW50ZXI7XG4gICAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDtcbiAgICBiYWNrZ3JvdW5kLXNpemU6IDIycHggMjJweDtcbiAgICBib3JkZXI6IDA7XG4gICAgb3V0bGluZTogbm9uZTtcblxuICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICBjdXJzb3I6IGhhbmQ7XG5cbiAgICB0cmFuc2l0aW9uOiBhbGwgMC4ycyBlYXNlO1xuXG4gICAgJjpob3ZlcixcbiAgICAmOmZvY3VzIHtcbiAgICAgIG9wYWNpdHk6IDE7XG4gICAgfVxuXG4gICAgJjphY3RpdmUge1xuICAgICAgZmlsdGVyOiBodWUtcm90YXRlKDgwZGVnKSBzYXR1cmF0ZSgxNTApO1xuICAgIH1cbn1cblxuI25vbmVGb3VuZCB7XG4gICAgZGlzcGxheTpub25lO1xuICAgIG1hcmdpbjo2MHB4IDMwcHggMDtcbiAgICBmb250LXNpemU6MzBweDtcbiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gICAgY29sb3I6ZGFya2dyZWVuO1xuICAgIC5mYSB7XG4gICAgICBkaXNwbGF5OmJsb2NrO1xuICAgICAgZm9udC1zaXplOjMwMHB4O1xuICAgIH1cbn1cblxuLm1hcC1hc2lkZS1hY3Rpb24tcG9wLW91dCB7XG4gICAgbWFyZ2luLXJpZ2h0OiAtNHB4O1xuICAgIGJhY2tncm91bmQtaW1hZ2U6IHVybChkYXRhOmltYWdlL3N2Zyt4bWw7YmFzZTY0LFBITjJaeUI0Yld4dWN6MGlhSFIwY0RvdkwzZDNkeTUzTXk1dmNtY3ZNakF3TUM5emRtY2lJSFpwWlhkQ2IzZzlJakFnTUNBeU1EQWdNVGN4TGpReU9TSWdabWxzYkQwaUl6TmhNekV6TXlJK1BIQmhkR2dnWkQwaVRURTFOeTR4TkRNc01UQXpMalUzTVhZek5TNDNNVFJqTUN3NExqZzFOQzB6TGpFME5Dd3hOaTQwTWpZdE9TNDBNekVzTWpJdU56RXpjeTB4TXk0NE5UZ3NPUzQwTXpFdE1qSXVOekV5TERrdU5ETXhTRE15TGpFME15QmpMVGd1T0RVMExEQXRNVFl1TkRJMUxUTXVNVFEwTFRJeUxqY3hNaTA1TGpRek1WTXdMREUwT0M0eE5Dd3dMREV6T1M0eU9EVldORFl1TkRJNVl6QXRPQzQ0TlRRc015NHhORFF0TVRZdU5ESTFMRGt1TkRNeExUSXlMamN4TWlCak5pNHlPRGN0Tmk0eU9EY3NNVE11T0RVNExUa3VORE14TERJeUxqY3hNaTA1TGpRek1XZzNPQzQxTnpKak1TNHdOREVzTUN3eExqZzVOaXd3TGpNek5Td3lMalUyTml3eExqQXdOR013TGpZM0xEQXVOamNzTVM0d01EUXNNUzQxTWpVc01TNHdNRFFzTWk0MU5qZFdNalVnWXpBc01TNHdOREl0TUM0ek16UXNNUzQ0T1RjdE1TNHdNRFFzTWk0MU5qZGpMVEF1Tmpjc01DNDJOeTB4TGpVeU5Td3hMakF3TkMweUxqVTJOaXd4TGpBd05FZ3pNaTR4TkROakxUUXVPVEV4TERBdE9TNHhNVFVzTVM0M05Ea3RNVEl1TmpFeUxEVXVNalEySUhNdE5TNHlORFlzTnk0M01ERXROUzR5TkRZc01USXVOakV5ZGpreUxqZzFObU13TERRdU9URXhMREV1TnpRNUxEa3VNVEUxTERVdU1qUTJMREV5TGpZeE1uTTNMamN3TVN3MUxqSTBOU3d4TWk0Mk1USXNOUzR5TkRWSU1USTFZelF1T1RFc01DdzVMakV4TlMweExqYzBPQ3d4TWk0Mk1URXROUzR5TkRVZ1l6TXVORGszTFRNdU5EazNMRFV1TWpRMkxUY3VOekF4TERVdU1qUTJMVEV5TGpZeE1uWXRNelV1TnpFMFl6QXRNUzR3TkRJc01DNHpNelF0TVM0NE9UY3NNUzR3TURRdE1pNDFOamRqTUM0Mk55MHdMalkyT1N3eExqVXlOUzB4TGpBd05Dd3lMalUyTnkweExqQXdOR2czTGpFME15QmpNUzR3TkRJc01Dd3hMamc1Tnl3d0xqTXpOU3d5TGpVMk55d3hMakF3TkVNeE5UWXVPREE1TERFd01TNDJOelFzTVRVM0xqRTBNeXd4TURJdU5USTVMREUxTnk0eE5ETXNNVEF6TGpVM01Yb2dUVEl3TUN3M0xqRTBNM1kxTnk0eE5ETWdZekFzTVM0NU16VXRNQzQzTURjc015NDJNRGt0TWk0eE1qRXNOUzR3TWpKakxURXVOREV6TERFdU5ERTBMVE11TURnNExESXVNVEl4TFRVdU1ESXhMREl1TVRJeFl5MHhMamt6TlN3d0xUTXVOakE1TFRBdU56QTNMVFV1TURJeUxUSXVNVEl4YkMweE9TNDJORFF0TVRrdU5qUXpJR3d0TnpJdU56WTNMRGN5TGpjMk9XTXRNQzQzTkRRc01DNDNORFF0TVM0MkxERXVNVEUxTFRJdU5UWTNMREV1TVRFMWN5MHhMamd5TXkwd0xqTTNNUzB5TGpVMk55MHhMakV4TlV3M055NDFOamNzTVRBNUxqY3hZeTB3TGpjME5DMHdMamMwTkMweExqRXhOaTB4TGpZdE1TNHhNVFl0TWk0MU5qY2dZekF0TUM0NU5qY3NNQzR6TnpJdE1TNDRNaklzTVM0eE1UWXRNaTQxTmpac056SXVOelk0TFRjeUxqYzJPR3d0TVRrdU5qUTBMVEU1TGpZME0yTXRNUzQwTVRNdE1TNDBNVFF0TWk0eE1pMHpMakE0T0MweUxqRXlMVFV1TURJeVl6QXRNUzQ1TXpVc01DNDNNRGN0TXk0Mk1Ea3NNaTR4TWkwMUxqQXlNaUJETVRNeUxqRXdOU3d3TGpjd055d3hNek11TnpjNUxEQXNNVE0xTGpjeE5Td3dhRFUzTGpFME0yTXhMamt6TkN3d0xETXVOakE0TERBdU56QTNMRFV1TURJeExESXVNVEl4UXpFNU9TNHlPVE1zTXk0MU16UXNNakF3TERVdU1qQTRMREl3TUN3M0xqRTBNM29pTHo0OEwzTjJaejQ9KVxufVxuXG4ubWFwLWFzaWRlLWFjdGlvbi1jb2xsYXBzZSB7XG4gICAgYmFja2dyb3VuZC1pbWFnZTogdXJsKGRhdGE6aW1hZ2Uvc3ZnK3htbDtiYXNlNjQsUEhOMlp5QjRiV3h1Y3owaWFIUjBjRG92TDNkM2R5NTNNeTV2Y21jdk1qQXdNQzl6ZG1jaUlIWnBaWGRDYjNnOUlqQWdNQ0F4TnpFdU5ESTVJREUzTVM0ME1qa2lJR1pwYkd3OUlpTXpZVE14TXpNaVBqeHdZWFJvSUdROUlrMHhNakl1TkRNekxERXdOaTR4TXpoc0xURTJMakk1TlN3eE5pNHlPVFZqTFRBdU56UTBMREF1TnpRMExURXVOaXd4TGpFeE5pMHlMalUyTml3eExqRXhObU10TUM0NU5qZ3NNQzB4TGpneU15MHdMak0zTWkweUxqVTJOeTB4TGpFeE5td3RNVFV1TWprdE1UVXVNamtnYkMweE5TNHlPU3d4TlM0eU9XTXRNQzQzTkRRc01DNDNORFF0TVM0MkxERXVNVEUyTFRJdU5UWTNMREV1TVRFMmN5MHhMamd5TXkwd0xqTTNNaTB5TGpVMk55MHhMakV4Tm13dE1UWXVNamswTFRFMkxqSTVOV010TUM0M05EUXRNQzQzTkRRdE1TNHhNVFl0TVM0MkxURXVNVEUyTFRJdU5UWTJJR013TFRBdU9UWTRMREF1TXpjeUxURXVPREl6TERFdU1URTJMVEl1TlRZM2JERTFMakk1TFRFMUxqSTViQzB4TlM0eU9TMHhOUzR5T1dNdE1DNDNORFF0TUM0M05EUXRNUzR4TVRZdE1TNDJMVEV1TVRFMkxUSXVOVFkzY3pBdU16Y3lMVEV1T0RJekxERXVNVEUyTFRJdU5UWTNJRXcyTlM0eU9TdzBPQzQ1T1Raak1DNDNORFF0TUM0M05EUXNNUzQyTFRFdU1URTJMREl1TlRZM0xURXVNVEUyY3pFdU9ESXpMREF1TXpjeUxESXVOVFkzTERFdU1URTJiREUxTGpJNUxERTFMakk1YkRFMUxqSTVMVEUxTGpJNUlHTXdMamMwTkMwd0xqYzBOQ3d4TGpZdE1TNHhNVFlzTWk0MU5qY3RNUzR4TVRaak1DNDVOamNzTUN3eExqZ3lNaXd3TGpNM01pd3lMalUyTml3eExqRXhObXd4Tmk0eU9UVXNNVFl1TWprMFl6QXVOelEwTERBdU56UTBMREV1TVRFMkxERXVOaXd4TGpFeE5pd3lMalUyTnlCekxUQXVNemN5TERFdU9ESXpMVEV1TVRFMkxESXVOVFkzYkMweE5TNHlPU3d4TlM0eU9Xd3hOUzR5T1N3eE5TNHlPV013TGpjME5Dd3dMamMwTkN3eExqRXhOaXd4TGpZc01TNHhNVFlzTWk0MU5qY2dRekV5TXk0MU5Ea3NNVEEwTGpVek9Td3hNak11TVRjM0xERXdOUzR6T1RRc01USXlMalF6TXl3eE1EWXVNVE00ZWlCTk1UUTJMalF5T1N3NE5TNDNNVFJqTUMweE1TNHdNVEl0TWk0M01UY3RNakV1TVRZNExUZ3VNVFE0TFRNd0xqUTJPU0J6TFRFeUxqYzVOeTB4Tmk0Mk5qY3RNakl1TURrNExUSXlMakE1T0ZNNU5pNDNNallzTWpVc09EVXVOekUwTERJMWN5MHlNUzR4Tmpnc01pNDNNVFl0TXpBdU5EWTVMRGd1TVRRM1V6TTRMalUzT1N3ME5TNDVORFVzTXpNdU1UUTNMRFUxTGpJME5sTXlOU3czTkM0M01ETXNNalVzT0RVdU56RTBJSE15TGpjeE5pd3lNUzR4Tmpnc09DNHhORGNzTXpBdU5EWTVjekV5TGpjNU55d3hOaTQyTmpZc01qSXVNRGs0TERJeUxqQTVPSE14T1M0ME5UY3NPQzR4TkRnc016QXVORFk1TERndU1UUTRjekl4TGpFMk9DMHlMamN4Tnl3ek1DNDBOamt0T0M0eE5EZ2djekUyTGpZMk5pMHhNaTQzT1Rjc01qSXVNRGs0TFRJeUxqQTVPRk14TkRZdU5ESTVMRGsyTGpjeU5pd3hORFl1TkRJNUxEZzFMamN4TkhvZ1RURTNNUzQwTWprc09EVXVOekUwWXpBc01UVXVOVFV4TFRNdU9ETXlMREk1TGpnNU15MHhNUzQwT1RZc05ETXVNREkwSUdNdE55NDJOalFzTVRNdU1UTXpMVEU0TGpBMk1pd3lNeTQxTXkwek1TNHhPVFFzTXpFdU1UazBZeTB4TXk0eE16SXNOeTQyTmpRdE1qY3VORGMwTERFeExqUTVOaTAwTXk0d01qUXNNVEV1TkRrMmN5MHlPUzQ0T1RJdE15NDRNekl0TkRNdU1ESTBMVEV4TGpRNU5pQmpMVEV6TGpFek15MDNMalkyTkMweU15NDFNekV0TVRndU1EWXlMVE14TGpFNU5DMHpNUzR4T1RSRE15NDRNeklzTVRFMUxqWXdOeXd3TERFd01TNHlOalVzTUN3NE5TNDNNVFJUTXk0NE16SXNOVFV1T0RJeUxERXhMalE1Tml3ME1pNDJPU0JqTnk0Mk5qUXRNVE11TVRNekxERTRMakEyTWkweU15NDFNekVzTXpFdU1UazBMVE14TGpFNU5FTTFOUzQ0TWpJc015NDRNeklzTnpBdU1UWTBMREFzT0RVdU56RTBMREJ6TWprdU9Ea3pMRE11T0RNeUxEUXpMakF5TkN3eE1TNDBPVFlnWXpFekxqRXpNeXczTGpZMk5Dd3lNeTQxTXl3eE9DNHdOaklzTXpFdU1UazBMRE14TGpFNU5FTXhOamN1TlRrM0xEVTFMamd5TWl3eE56RXVOREk1TERjd0xqRTJOQ3d4TnpFdU5ESTVMRGcxTGpjeE5Ib2lMejQ4TDNOMlp6ND0pXG59XG4iLCIvKlxuICogYmFzZWQgb2ZmIG9mIGh0dHBzOi8vZ2l0aHViLmNvbS9naXR0ZXJIUS9zaWRlY2FyXG4gKiBsaWNlbnNlOiBNSVRcbiAqL1xuXG4jd2lraUZyYW1lIHtcbiAgICB3aWR0aDogMTAwJTtcbiAgICBoZWlnaHQ6IDEwMCU7XG4gICAgdG9wOjA7XG4gICAgYm90dG9tOiAwO1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xufVxuXG4ud2lraS1hc2lkZSB7XG4gICAgd2lkdGg6NTAwcHg7XG5cbiAgICB6LWluZGV4OiAyMDAwMDtcbiAgICBwb3NpdGlvbjogZml4ZWQ7XG4gICAgdG9wOiAwO1xuICAgIGJvdHRvbTogMDtcbiAgICByaWdodDogMDtcblxuICAgIGRpc3BsYXk6IC13ZWJraXQtZmxleDtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIC13ZWJraXQtZmxleC1kaXJlY3Rpb246IHJvdztcbiAgICBmbGV4LWRpcmVjdGlvbjogcm93O1xuXG4gICAgYmFja2dyb3VuZC1jb2xvcjogQGJvZHktYmc7XG4gICAgYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjZGRkO1xuICAgIGJveC1zaGFkb3c6IC0xMnB4IDAgMThweCAwIHJnYmEoNTAsIDUwLCA1MCwgMC4xKTtcblxuICAgIHRyYW5zaXRpb246IHRyYW5zZm9ybSAwLjNzIGN1YmljLWJlemllcigwLjE2LCAwLjIyLCAwLjIyLCAxLjcpO1xuXG4gICAgJi5pcy1jb2xsYXBzZWQ6bm90KC5pcy1sb2FkaW5nKSB7XG4gICAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlWCgxMTAlKTtcbiAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgxMTAlKTtcbiAgICB9XG5cbiAgICAvKiBBZGQgc29tZSBcImV4dGVuc2lvblwiIHNvIHRoYXQgdGhlcmUgaXNuJ3QgYSBnYXBcbiAgICAgKiB3aGVuIHdlIHRyYW5zbGF0ZSh2aWEgYW5pbWF0aW9uKSBtb3JlIHRoYW4gMTAwJSAqL1xuICAgICY6YWZ0ZXIge1xuICAgICAgY29udGVudDogJyc7XG5cbiAgICAgIHotaW5kZXg6IC0xO1xuICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgICAgdG9wOiAwO1xuICAgICAgbGVmdDogMTAwJTtcbiAgICAgIGJvdHRvbTogMDtcbiAgICAgIHJpZ2h0OiAtMTAwJTtcblxuICAgICAgYmFja2dyb3VuZC1jb2xvcjogQGJvZHktYmc7XG4gICAgfVxuXG4gICAgaWZyYW1lIHtcbiAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgaGVpZ2h0OiAxMDAlO1xuICAgICAgdG9wOjA7XG4gICAgICBib3R0b206MDtcbiAgICAgIHBvc2l0aW9uOmFic29sdXRlO1xuICAgICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICB9XG59XG5cbi53aWtpLWFzaWRlIC53aWtpLWhlYWRlciB7XG4gIGRpc3BsYXk6IG5vbmU7XG59XG5cbi53aWtpLWFzaWRlIC53aWtpLWNvbnRhaW5lciB7XG4gIHBhZGRpbmctdG9wOiAxMHB4O1xufVxuXG4ud2lraS1hc2lkZSAud2lraVNlbGVjdG9yIHtcbiAgdG9wOiA1MHB4O1xufVxuXG4ud2lraS1hc2lkZS1hY3Rpb24tYmFyIHtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgdG9wOiAwO1xuICAgIHJpZ2h0OiAxNXB4O1xuXG4gICAgZGlzcGxheTogLXdlYmtpdC1mbGV4O1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAganVzdGlmeS1jb250ZW50OiBmbGV4LWVuZDtcblxuICAgIHBhZGRpbmctYm90dG9tOiA1cHg7XG4gICAgcGFkZGluZy1yaWdodDowcHg7XG4gICAgcGFkZGluZy10b3A6NXB4O1xuICAgIHotaW5kZXg6IDEwMDtcbn1cblxuLndpa2ktZml4ZWQtaGVhZGVyIHtcbiAgcG9zaXRpb246IGZpeGVkO1xuICBiYWNrZ3JvdW5kOiB3aGl0ZTtcbiAgcGFkZGluZy10b3A6IDVweDtcbiAgd2lkdGg6IDEwMCU7XG4gIHotaW5kZXg6IDE7XG4gIGxlZnQ6IDA7XG4gIHRvcDogMDtcbiAgQG1lZGlhIChtYXgtd2lkdGg6IDcyMHB4KSB7XG4gICAgcGFkZGluZy10b3A6MzBweDtcbiAgfVxuICBwIHtcbiAgbWFyZ2luOiA1cHggMCAyMHB4O1xuICAgIEBtZWRpYSAobWF4LXdpZHRoOiA3MjBweCkge1xuICAgICAgbWFyZ2luLWJvdHRvbToxMHB4O1xuICAgIH1cbiAgfVxuICBociB7XG4gICAgbWFyZ2luOjMwcHggMDtcbiAgICBAbWVkaWEgKG1heC13aWR0aDogNzIwcHgpIHtcbiAgICAgIG1hcmdpbjoyNXB4IDA7XG4gICAgfVxuICB9XG4gfVxuXG4ud2lraS1idXR0b25zIHtcbiAgbWFyZ2luLXRvcDogLTEwcHg7XG4gICYgYnV0dG9uLFxuICAmIC5pbnB1dC1ncm91cHtcbiAgICB3aWR0aDozMDBweDtcbiAgfVxuICAuaW5wdXQtZ3JvdXB7XG4gICAgbWFyZ2luLXRvcDogMTVweDtcbiAgICBtYXJnaW4tbGVmdDogYXV0bztcbiAgICBtYXJnaW4tcmlnaHQ6IGF1dG87XG4gIH1cbn1cblxuI3dpa2ktZmlsdGVyIHtcbiAgICBiYWNrZ3JvdW5kOiNmZmY7XG4gICAgYm9yZGVyLWNvbG9yOiBkYXJrZ3JlZW47XG59XG5cbi53aWtpLWFzaWRlLWFjdGlvbi1pdGVtIHtcbiAgICBkaXNwbGF5OiAtd2Via2l0LWZsZXg7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICAvKiBtYWluIGF4aXMgKi9cbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgICAvKiBjcm9zcyBheGlzICovXG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcblxuICAgIHdpZHRoOiA0MHB4O1xuICAgIGhlaWdodDogNDBweDtcblxuICAgIHBhZGRpbmctbGVmdDogMDtcbiAgICBwYWRkaW5nLXJpZ2h0OiAwO1xuXG4gICAgb3BhY2l0eTogMC42NTtcbiAgICBiYWNrZ3JvdW5kOiBub25lO1xuICAgIGJhY2tncm91bmQtcG9zaXRpb246IGNlbnRlciBjZW50ZXI7XG4gICAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDtcbiAgICBiYWNrZ3JvdW5kLXNpemU6IDIycHggMjJweDtcbiAgICBib3JkZXI6IDA7XG4gICAgb3V0bGluZTogbm9uZTtcblxuICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICBjdXJzb3I6IGhhbmQ7XG5cbiAgICB0cmFuc2l0aW9uOiBhbGwgMC4ycyBlYXNlO1xuXG4gICAgJjpob3ZlcixcbiAgICAmOmZvY3VzIHtcbiAgICAgIG9wYWNpdHk6IDE7XG4gICAgfVxuXG4gICAgJjphY3RpdmUge1xuICAgICAgZmlsdGVyOiBodWUtcm90YXRlKDgwZGVnKSBzYXR1cmF0ZSgxNTApO1xuICAgIH1cbn1cblxuLndpa2ktYXNpZGUtYWN0aW9uLXBvcC1vdXQge1xuICAgIG1hcmdpbi1yaWdodDogLTRweDtcbiAgICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoZGF0YTppbWFnZS9zdmcreG1sO2Jhc2U2NCxQSE4yWnlCNGJXeHVjejBpYUhSMGNEb3ZMM2QzZHk1M015NXZjbWN2TWpBd01DOXpkbWNpSUhacFpYZENiM2c5SWpBZ01DQXlNREFnTVRjeExqUXlPU0lnWm1sc2JEMGlJek5oTXpFek15SStQSEJoZEdnZ1pEMGlUVEUxTnk0eE5ETXNNVEF6TGpVM01YWXpOUzQzTVRSak1DdzRMamcxTkMwekxqRTBOQ3d4Tmk0ME1qWXRPUzQwTXpFc01qSXVOekV6Y3kweE15NDROVGdzT1M0ME16RXRNakl1TnpFeUxEa3VORE14U0RNeUxqRTBNeUJqTFRndU9EVTBMREF0TVRZdU5ESTFMVE11TVRRMExUSXlMamN4TWkwNUxqUXpNVk13TERFME9DNHhOQ3d3TERFek9TNHlPRFZXTkRZdU5ESTVZekF0T0M0NE5UUXNNeTR4TkRRdE1UWXVOREkxTERrdU5ETXhMVEl5TGpjeE1pQmpOaTR5T0RjdE5pNHlPRGNzTVRNdU9EVTRMVGt1TkRNeExESXlMamN4TWkwNUxqUXpNV2czT0M0MU56SmpNUzR3TkRFc01Dd3hMamc1Tml3d0xqTXpOU3d5TGpVMk5pd3hMakF3TkdNd0xqWTNMREF1Tmpjc01TNHdNRFFzTVM0MU1qVXNNUzR3TURRc01pNDFOamRXTWpVZ1l6QXNNUzR3TkRJdE1DNHpNelFzTVM0NE9UY3RNUzR3TURRc01pNDFOamRqTFRBdU5qY3NNQzQyTnkweExqVXlOU3d4TGpBd05DMHlMalUyTml3eExqQXdORWd6TWk0eE5ETmpMVFF1T1RFeExEQXRPUzR4TVRVc01TNDNORGt0TVRJdU5qRXlMRFV1TWpRMklITXROUzR5TkRZc055NDNNREV0TlM0eU5EWXNNVEl1TmpFeWRqa3lMamcxTm1Nd0xEUXVPVEV4TERFdU56UTVMRGt1TVRFMUxEVXVNalEyTERFeUxqWXhNbk0zTGpjd01TdzFMakkwTlN3eE1pNDJNVElzTlM0eU5EVklNVEkxWXpRdU9URXNNQ3c1TGpFeE5TMHhMamMwT0N3eE1pNDJNVEV0TlM0eU5EVWdZek11TkRrM0xUTXVORGszTERVdU1qUTJMVGN1TnpBeExEVXVNalEyTFRFeUxqWXhNbll0TXpVdU56RTBZekF0TVM0d05ESXNNQzR6TXpRdE1TNDRPVGNzTVM0d01EUXRNaTQxTmpkak1DNDJOeTB3TGpZMk9Td3hMalV5TlMweExqQXdOQ3d5TGpVMk55MHhMakF3TkdnM0xqRTBNeUJqTVM0d05ESXNNQ3d4TGpnNU55d3dMak16TlN3eUxqVTJOeXd4TGpBd05FTXhOVFl1T0RBNUxERXdNUzQyTnpRc01UVTNMakUwTXl3eE1ESXVOVEk1TERFMU55NHhORE1zTVRBekxqVTNNWG9nVFRJd01DdzNMakUwTTNZMU55NHhORE1nWXpBc01TNDVNelV0TUM0M01EY3NNeTQyTURrdE1pNHhNakVzTlM0d01qSmpMVEV1TkRFekxERXVOREUwTFRNdU1EZzRMREl1TVRJeExUVXVNREl4TERJdU1USXhZeTB4TGprek5Td3dMVE11TmpBNUxUQXVOekEzTFRVdU1ESXlMVEl1TVRJeGJDMHhPUzQyTkRRdE1Ua3VOalF6SUd3dE56SXVOelkzTERjeUxqYzJPV010TUM0M05EUXNNQzQzTkRRdE1TNDJMREV1TVRFMUxUSXVOVFkzTERFdU1URTFjeTB4TGpneU15MHdMak0zTVMweUxqVTJOeTB4TGpFeE5VdzNOeTQxTmpjc01UQTVMamN4WXkwd0xqYzBOQzB3TGpjME5DMHhMakV4TmkweExqWXRNUzR4TVRZdE1pNDFOamNnWXpBdE1DNDVOamNzTUM0ek56SXRNUzQ0TWpJc01TNHhNVFl0TWk0MU5qWnNOekl1TnpZNExUY3lMamMyT0d3dE1Ua3VOalEwTFRFNUxqWTBNMk10TVM0ME1UTXRNUzQwTVRRdE1pNHhNaTB6TGpBNE9DMHlMakV5TFRVdU1ESXlZekF0TVM0NU16VXNNQzQzTURjdE15NDJNRGtzTWk0eE1pMDFMakF5TWlCRE1UTXlMakV3TlN3d0xqY3dOeXd4TXpNdU56YzVMREFzTVRNMUxqY3hOU3d3YURVM0xqRTBNMk14TGprek5Dd3dMRE11TmpBNExEQXVOekEzTERVdU1ESXhMREl1TVRJeFF6RTVPUzR5T1RNc015NDFNelFzTWpBd0xEVXVNakE0TERJd01DdzNMakUwTTNvaUx6NDhMM04yWno0PSlcbn1cblxuLndpa2ktYXNpZGUtYWN0aW9uLWNvbGxhcHNlIHtcbiAgICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoZGF0YTppbWFnZS9zdmcreG1sO2Jhc2U2NCxQSE4yWnlCNGJXeHVjejBpYUhSMGNEb3ZMM2QzZHk1M015NXZjbWN2TWpBd01DOXpkbWNpSUhacFpYZENiM2c5SWpBZ01DQXhOekV1TkRJNUlERTNNUzQwTWpraUlHWnBiR3c5SWlNellUTXhNek1pUGp4d1lYUm9JR1E5SWsweE1qSXVORE16TERFd05pNHhNemhzTFRFMkxqSTVOU3d4Tmk0eU9UVmpMVEF1TnpRMExEQXVOelEwTFRFdU5pd3hMakV4TmkweUxqVTJOaXd4TGpFeE5tTXRNQzQ1Tmpnc01DMHhMamd5TXkwd0xqTTNNaTB5TGpVMk55MHhMakV4Tm13dE1UVXVNamt0TVRVdU1qa2diQzB4TlM0eU9Td3hOUzR5T1dNdE1DNDNORFFzTUM0M05EUXRNUzQyTERFdU1URTJMVEl1TlRZM0xERXVNVEUyY3kweExqZ3lNeTB3TGpNM01pMHlMalUyTnkweExqRXhObXd0TVRZdU1qazBMVEUyTGpJNU5XTXRNQzQzTkRRdE1DNDNORFF0TVM0eE1UWXRNUzQyTFRFdU1URTJMVEl1TlRZMklHTXdMVEF1T1RZNExEQXVNemN5TFRFdU9ESXpMREV1TVRFMkxUSXVOVFkzYkRFMUxqSTVMVEUxTGpJNWJDMHhOUzR5T1MweE5TNHlPV010TUM0M05EUXRNQzQzTkRRdE1TNHhNVFl0TVM0MkxURXVNVEUyTFRJdU5UWTNjekF1TXpjeUxURXVPREl6TERFdU1URTJMVEl1TlRZM0lFdzJOUzR5T1N3ME9DNDVPVFpqTUM0M05EUXRNQzQzTkRRc01TNDJMVEV1TVRFMkxESXVOVFkzTFRFdU1URTJjekV1T0RJekxEQXVNemN5TERJdU5UWTNMREV1TVRFMmJERTFMakk1TERFMUxqSTViREUxTGpJNUxURTFMakk1SUdNd0xqYzBOQzB3TGpjME5Dd3hMall0TVM0eE1UWXNNaTQxTmpjdE1TNHhNVFpqTUM0NU5qY3NNQ3d4TGpneU1pd3dMak0zTWl3eUxqVTJOaXd4TGpFeE5td3hOaTR5T1RVc01UWXVNamswWXpBdU56UTBMREF1TnpRMExERXVNVEUyTERFdU5pd3hMakV4Tml3eUxqVTJOeUJ6TFRBdU16Y3lMREV1T0RJekxURXVNVEUyTERJdU5UWTNiQzB4TlM0eU9Td3hOUzR5T1d3eE5TNHlPU3d4TlM0eU9XTXdMamMwTkN3d0xqYzBOQ3d4TGpFeE5pd3hMallzTVM0eE1UWXNNaTQxTmpjZ1F6RXlNeTQxTkRrc01UQTBMalV6T1N3eE1qTXVNVGMzTERFd05TNHpPVFFzTVRJeUxqUXpNeXd4TURZdU1UTTRlaUJOTVRRMkxqUXlPU3c0TlM0M01UUmpNQzB4TVM0d01USXRNaTQzTVRjdE1qRXVNVFk0TFRndU1UUTRMVE13TGpRMk9TQnpMVEV5TGpjNU55MHhOaTQyTmpjdE1qSXVNRGs0TFRJeUxqQTVPRk01Tmk0M01qWXNNalVzT0RVdU56RTBMREkxY3kweU1TNHhOamdzTWk0M01UWXRNekF1TkRZNUxEZ3VNVFEzVXpNNExqVTNPU3cwTlM0NU5EVXNNek11TVRRM0xEVTFMakkwTmxNeU5TdzNOQzQzTURNc01qVXNPRFV1TnpFMElITXlMamN4Tml3eU1TNHhOamdzT0M0eE5EY3NNekF1TkRZNWN6RXlMamM1Tnl3eE5pNDJOallzTWpJdU1EazRMREl5TGpBNU9ITXhPUzQwTlRjc09DNHhORGdzTXpBdU5EWTVMRGd1TVRRNGN6SXhMakUyT0MweUxqY3hOeXd6TUM0ME5qa3RPQzR4TkRnZ2N6RTJMalkyTmkweE1pNDNPVGNzTWpJdU1EazRMVEl5TGpBNU9GTXhORFl1TkRJNUxEazJMamN5Tml3eE5EWXVOREk1TERnMUxqY3hOSG9nVFRFM01TNDBNamtzT0RVdU56RTBZekFzTVRVdU5UVXhMVE11T0RNeUxESTVMamc1TXkweE1TNDBPVFlzTkRNdU1ESTBJR010Tnk0Mk5qUXNNVE11TVRNekxURTRMakEyTWl3eU15NDFNeTB6TVM0eE9UUXNNekV1TVRrMFl5MHhNeTR4TXpJc055NDJOalF0TWpjdU5EYzBMREV4TGpRNU5pMDBNeTR3TWpRc01URXVORGsyY3kweU9TNDRPVEl0TXk0NE16SXRORE11TURJMExURXhMalE1TmlCakxURXpMakV6TXkwM0xqWTJOQzB5TXk0MU16RXRNVGd1TURZeUxUTXhMakU1TkMwek1TNHhPVFJETXk0NE16SXNNVEUxTGpZd055d3dMREV3TVM0eU5qVXNNQ3c0TlM0M01UUlRNeTQ0TXpJc05UVXVPREl5TERFeExqUTVOaXcwTWk0Mk9TQmpOeTQyTmpRdE1UTXVNVE16TERFNExqQTJNaTB5TXk0MU16RXNNekV1TVRrMExUTXhMakU1TkVNMU5TNDRNaklzTXk0NE16SXNOekF1TVRZMExEQXNPRFV1TnpFMExEQnpNamt1T0RrekxETXVPRE15TERRekxqQXlOQ3d4TVM0ME9UWWdZekV6TGpFek15dzNMalkyTkN3eU15NDFNeXd4T0M0d05qSXNNekV1TVRrMExETXhMakU1TkVNeE5qY3VOVGszTERVMUxqZ3lNaXd4TnpFdU5ESTVMRGN3TGpFMk5Dd3hOekV1TkRJNUxEZzFMamN4TkhvaUx6NDhMM04yWno0PSlcbn1cbiIsIi5naXRodWItbG9naW4ge1xuXHRwb3NpdGlvbjogcmVsYXRpdmU7XG5cdHdpZHRoOiAzMDBweDtcblx0bWFyZ2luLWxlZnQ6IGF1dG87XG5cdG1hcmdpbi1yaWdodDogYXV0bztcblx0LmZpcnN0IHtcblx0cG9zaXRpb246IHJlbGF0aXZlO1xuXHRoZWlnaHQ6MDtcblx0dG9wOi0zMHB4O1xuXHRyaWdodDotMTgwcHg7XG5cdGNvbG9yOnJlZFxuXHR9XG59Il0sImZpbGUiOiJtYWluLmNzcyIsInNvdXJjZVJvb3QiOiIvbGVzcyJ9 */\n"
  },
  {
    "path": "public/css/themes/flatly.less",
    "content": "// Flatly 3.3.0\n// Variables\n// --------------------------------------------------\n\n//== Colors\n//\n//## Gray and brand colors for use across Bootstrap.\n\n@gray-base:              #000;\n@gray-darker:            lighten(@gray-base, 13.5%); // #222\n@gray-dark:              #7b8a8b;   // #333\n@gray:                   #95a5a6; // #555\n@gray-light:             #b4bcc2;   // #999\n@gray-lighter:           #ecf0f1; // #eee\n\n@brand-primary:         #2C3E50;\n@brand-success:         #18BC9C;\n@brand-info:            #3498DB;\n@brand-warning:         #F39C12;\n@brand-danger:          #E74C3C;\n\n\n//== Scaffolding\n//\n//## Settings for some of the most global styles.\n\n//** Background color for `<body>`.\n@body-bg:               #fff;\n//** Global text color on `<body>`.\n@text-color:            @brand-primary;\n\n//** Global textual link color.\n@link-color:            @brand-success;\n//** Link hover color set via `darken()` function.\n@link-hover-color:      @link-color;\n//** Link hover decoration.\n@link-hover-decoration: underline;\n\n\n//== Typography\n//\n//## Font, line-height, and color for body text, headings, and more.\n\n@font-family-sans-serif:  \"Lato\", \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n@font-family-serif:       Georgia, \"Times New Roman\", Times, serif;\n//** Default monospace fonts for `<code>`, `<kbd>`, and `<pre>`.\n@font-family-monospace:   Menlo, Monaco, Consolas, \"Courier New\", monospace;\n@font-family-base:        @font-family-sans-serif;\n\n@font-size-base:          15px;\n@font-size-large:         ceil((@font-size-base * 1.25)); // ~18px\n@font-size-small:         ceil((@font-size-base * 0.85)); // ~12px\n\n@font-size-h1:            floor((@font-size-base * 2.6)); // ~36px\n@font-size-h2:            floor((@font-size-base * 2.15)); // ~30px\n@font-size-h3:            ceil((@font-size-base * 1.7)); // ~24px\n@font-size-h4:            ceil((@font-size-base * 1.25)); // ~18px\n@font-size-h5:            @font-size-base;\n@font-size-h6:            ceil((@font-size-base * 0.85)); // ~12px\n\n//** Unit-less `line-height` for use in components like buttons.\n@line-height-base:        1.428571429; // 20/14\n//** Computed \"line-height\" (`font-size` * `line-height`) for use with `margin`, `padding`, etc.\n@line-height-computed:    floor((@font-size-base * @line-height-base)); // ~20px\n\n//** By default, this inherits from the `<body>`.\n@headings-font-family:    @font-family-base;\n@headings-font-weight:    400;\n@headings-line-height:    1.1;\n@headings-color:          inherit;\n\n\n//== Iconography\n//\n//## Specify custom location and filename of the included Glyphicons icon font. Useful for those including Bootstrap via Bower.\n\n//** Load fonts from this directory.\n@icon-font-path:          \"../fonts/\";\n//** File name for all font files.\n@icon-font-name:          \"glyphicons-halflings-regular\";\n//** Element ID within SVG icon file.\n@icon-font-svg-id:        \"glyphicons_halflingsregular\";\n\n\n//== Components\n//\n//## Define common padding and border radius sizes and more. Values based on 14px text and 1.428 line-height (~20px to start).\n\n@padding-base-vertical:     10px;\n@padding-base-horizontal:   15px;\n\n@padding-large-vertical:    18px;\n@padding-large-horizontal:  27px;\n\n@padding-small-vertical:    6px;\n@padding-small-horizontal:  9px;\n\n@padding-xs-vertical:       1px;\n@padding-xs-horizontal:     5px;\n\n@line-height-large:         1.33;\n@line-height-small:         1.5;\n\n@border-radius-base:        4px;\n@border-radius-large:       6px;\n@border-radius-small:       3px;\n\n//** Global color for active items (e.g., navs or dropdowns).\n@component-active-color:    #fff;\n//** Global background color for active items (e.g., navs or dropdowns).\n@component-active-bg:       @brand-primary;\n\n//** Width of the `border` for generating carets that indicator dropdowns.\n@caret-width-base:          4px;\n//** Carets increase slightly in size for larger components.\n@caret-width-large:         5px;\n\n\n//== Tables\n//\n//## Customizes the `.table` component with basic values, each used across all table variations.\n\n//** Padding for `<th>`s and `<td>`s.\n@table-cell-padding:            8px;\n//** Padding for cells in `.table-condensed`.\n@table-condensed-cell-padding:  5px;\n\n//** Default background color used for all tables.\n@table-bg:                      transparent;\n//** Background color used for `.table-striped`.\n@table-bg-accent:               #f9f9f9;\n//** Background color used for `.table-hover`.\n@table-bg-hover:                @gray-lighter;\n@table-bg-active:               @table-bg-hover;\n\n//** Border color for table and cell borders.\n@table-border-color:            @gray-lighter;\n\n\n//== Buttons\n//\n//## For each of Bootstrap's buttons, define text, background and border color.\n\n@btn-font-weight:                normal;\n\n@btn-default-color:              #fff;\n@btn-default-bg:                 @gray;\n@btn-default-border:             @btn-default-bg;\n\n@btn-primary-color:              @btn-default-color;\n@btn-primary-bg:                 @brand-primary;\n@btn-primary-border:             @btn-primary-bg;\n\n@btn-success-color:              @btn-default-color;\n@btn-success-bg:                 @brand-success;\n@btn-success-border:             @btn-success-bg;\n\n@btn-info-color:                 @btn-default-color;\n@btn-info-bg:                    @brand-info;\n@btn-info-border:                @btn-info-bg;\n\n@btn-warning-color:              @btn-default-color;\n@btn-warning-bg:                 @brand-warning;\n@btn-warning-border:             @btn-warning-bg;\n\n@btn-danger-color:               @btn-default-color;\n@btn-danger-bg:                  @brand-danger;\n@btn-danger-border:              @btn-danger-bg;\n\n@btn-link-disabled-color:        @gray-light;\n\n\n//== Forms\n//\n//##\n\n//** `<input>` background color\n@input-bg:                       #fff;\n//** `<input disabled>` background color\n@input-bg-disabled:              @gray-lighter;\n\n//** Text color for `<input>`s\n@input-color:                    @text-color;\n//** `<input>` border color\n@input-border:                   #dce4ec;\n\n// TODO: Rename `@input-border-radius` to `@input-border-radius-base` in v4\n//** Default `.form-control` border radius\n@input-border-radius:            @border-radius-base;\n//** Large `.form-control` border radius\n@input-border-radius-large:      @border-radius-large;\n//** Small `.form-control` border radius\n@input-border-radius-small:      @border-radius-small;\n\n//** Border color for inputs on focus\n@input-border-focus:             @brand-primary;\n\n//** Placeholder text color\n@input-color-placeholder:        #acb6c0;\n\n//** Default `.form-control` height\n@input-height-base:              (@line-height-computed + (@padding-base-vertical * 2) + 2);\n//** Large `.form-control` height\n@input-height-large:             (ceil(@font-size-large * @line-height-large) + (@padding-large-vertical * 2) + 2);\n//** Small `.form-control` height\n@input-height-small:             (floor(@font-size-small * @line-height-small) + (@padding-small-vertical * 2) + 2);\n\n@legend-color:                   @text-color;\n@legend-border-color:            transparent;\n\n//** Background color for textual input addons\n@input-group-addon-bg:           @gray-lighter;\n//** Border color for textual input addons\n@input-group-addon-border-color: @input-border;\n\n//** Disabled cursor for form controls and buttons.\n@cursor-disabled:                not-allowed;\n\n\n//== Dropdowns\n//\n//## Dropdown menu container and contents.\n\n//** Background for the dropdown menu.\n@dropdown-bg:                    #fff;\n//** Dropdown menu `border-color`.\n@dropdown-border:                rgba(0,0,0,.15);\n//** Dropdown menu `border-color` **for IE8**.\n@dropdown-fallback-border:       #ccc;\n//** Divider color for between dropdown items.\n@dropdown-divider-bg:            #e5e5e5;\n\n//** Dropdown link text color.\n@dropdown-link-color:            @gray-dark;\n//** Hover color for dropdown links.\n@dropdown-link-hover-color:      #fff;\n//** Hover background for dropdown links.\n@dropdown-link-hover-bg:         @dropdown-link-active-bg;\n\n//** Active dropdown menu item text color.\n@dropdown-link-active-color:     #fff;\n//** Active dropdown menu item background color.\n@dropdown-link-active-bg:        @component-active-bg;\n\n//** Disabled dropdown menu item background color.\n@dropdown-link-disabled-color:   @text-muted;\n\n//** Text color for headers within dropdown menus.\n@dropdown-header-color:          @text-muted;\n\n//** Deprecated `@dropdown-caret-color` as of v3.1.0\n@dropdown-caret-color:           #000;\n\n\n//-- Z-index master list\n//\n// Warning: Avoid customizing these values. They're used for a bird's eye view\n// of components dependent on the z-axis and are designed to all work together.\n//\n// Note: These variables are not generated into the Customizer.\n\n@zindex-navbar:            1000;\n@zindex-dropdown:          1000;\n@zindex-popover:           1060;\n@zindex-tooltip:           1070;\n@zindex-navbar-fixed:      1030;\n@zindex-modal:             1040;\n\n\n//== Media queries breakpoints\n//\n//## Define the breakpoints at which your layout will change, adapting to different screen sizes.\n\n// Extra small screen / phone\n//** Deprecated `@screen-xs` as of v3.0.1\n@screen-xs:                  480px;\n//** Deprecated `@screen-xs-min` as of v3.2.0\n@screen-xs-min:              @screen-xs;\n//** Deprecated `@screen-phone` as of v3.0.1\n@screen-phone:               @screen-xs-min;\n\n// Small screen / tablet\n//** Deprecated `@screen-sm` as of v3.0.1\n@screen-sm:                  768px;\n@screen-sm-min:              @screen-sm;\n//** Deprecated `@screen-tablet` as of v3.0.1\n@screen-tablet:              @screen-sm-min;\n\n// Medium screen / desktop\n//** Deprecated `@screen-md` as of v3.0.1\n@screen-md:                  992px;\n@screen-md-min:              @screen-md;\n//** Deprecated `@screen-desktop` as of v3.0.1\n@screen-desktop:             @screen-md-min;\n\n// Large screen / wide desktop\n//** Deprecated `@screen-lg` as of v3.0.1\n@screen-lg:                  1200px;\n@screen-lg-min:              @screen-lg;\n//** Deprecated `@screen-lg-desktop` as of v3.0.1\n@screen-lg-desktop:          @screen-lg-min;\n\n// So media queries don't overlap when required, provide a maximum\n@screen-xs-max:              (@screen-sm-min - 1);\n@screen-sm-max:              (@screen-md-min - 1);\n@screen-md-max:              (@screen-lg-min - 1);\n\n\n//== Grid system\n//\n//## Define your custom responsive grid.\n\n//** Number of columns in the grid.\n@grid-columns:              12;\n//** Padding between columns. Gets divided in half for the left and right.\n@grid-gutter-width:         30px;\n// Navbar collapse\n//** Point at which the navbar becomes uncollapsed.\n@grid-float-breakpoint:     @screen-sm-min;\n//** Point at which the navbar begins collapsing.\n@grid-float-breakpoint-max: (@grid-float-breakpoint - 1);\n\n\n//== Container sizes\n//\n//## Define the maximum width of `.container` for different screen sizes.\n\n// Small screen / tablet\n@container-tablet:             (720px + @grid-gutter-width);\n//** For `@screen-sm-min` and up.\n@container-sm:                 @container-tablet;\n\n// Medium screen / desktop\n@container-desktop:            (940px + @grid-gutter-width);\n//** For `@screen-md-min` and up.\n@container-md:                 @container-desktop;\n\n// Large screen / wide desktop\n@container-large-desktop:      (1140px + @grid-gutter-width);\n//** For `@screen-lg-min` and up.\n@container-lg:                 @container-large-desktop;\n\n\n//== Navbar\n//\n//##\n\n// Basics of a navbar\n@navbar-height:                    60px;\n@navbar-margin-bottom:             @line-height-computed;\n@navbar-border-radius:             @border-radius-base;\n@navbar-padding-horizontal:        floor((@grid-gutter-width / 2));\n@navbar-padding-vertical:          ((@navbar-height - @line-height-computed) / 2);\n@navbar-collapse-max-height:       340px;\n\n@navbar-default-color:             #777;\n@navbar-default-bg:                @brand-primary;\n@navbar-default-border:            transparent;\n\n// Navbar links\n@navbar-default-link-color:                #fff;\n@navbar-default-link-hover-color:          @brand-success;\n@navbar-default-link-hover-bg:             transparent;\n@navbar-default-link-active-color:         #fff;\n@navbar-default-link-active-bg:            darken(@navbar-default-bg, 10%);\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:         @navbar-default-link-hover-color;\n@navbar-default-brand-hover-bg:            transparent;\n\n// Navbar toggle\n@navbar-default-toggle-hover-bg:           darken(@navbar-default-bg, 10%);\n@navbar-default-toggle-icon-bar-bg:        #fff;\n@navbar-default-toggle-border-color:       darken(@navbar-default-bg, 10%);\n\n\n// Inverted navbar\n// Reset inverted navbar basics\n@navbar-inverse-color:                      #fff;\n@navbar-inverse-bg:                         @brand-success;\n@navbar-inverse-border:                     transparent;\n\n// Inverted navbar links\n@navbar-inverse-link-color:                 #fff;\n@navbar-inverse-link-hover-color:           @brand-primary;\n@navbar-inverse-link-hover-bg:              transparent;\n@navbar-inverse-link-active-color:          #fff;\n@navbar-inverse-link-active-bg:             darken(@navbar-inverse-bg, 5%);\n@navbar-inverse-link-disabled-color:        #ccc;\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:          @navbar-inverse-link-hover-color;\n@navbar-inverse-brand-hover-bg:             transparent;\n\n// Inverted navbar toggle\n@navbar-inverse-toggle-hover-bg:            darken(@navbar-inverse-bg, 10%);\n@navbar-inverse-toggle-icon-bar-bg:         #fff;\n@navbar-inverse-toggle-border-color:        darken(@navbar-inverse-bg, 10%);\n\n\n//== Navs\n//\n//##\n\n//=== Shared nav styles\n@nav-link-padding:                          10px 15px;\n@nav-link-hover-bg:                         @gray-lighter;\n\n@nav-disabled-link-color:                   @gray-light;\n@nav-disabled-link-hover-color:             @gray-light;\n\n//== Tabs\n@nav-tabs-border-color:                     @gray-lighter;\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:          @brand-primary;\n@nav-tabs-active-link-hover-border-color:   @gray-lighter;\n\n@nav-tabs-justified-link-border-color:            @gray-lighter;\n@nav-tabs-justified-active-link-border-color:     @body-bg;\n\n//== Pills\n@nav-pills-border-radius:                   @border-radius-base;\n@nav-pills-active-link-hover-bg:            @component-active-bg;\n@nav-pills-active-link-hover-color:         @component-active-color;\n\n\n//== Pagination\n//\n//##\n\n@pagination-color:                     #fff;\n@pagination-bg:                        @brand-success;\n@pagination-border:                    transparent;\n\n@pagination-hover-color:               #fff;\n@pagination-hover-bg:                  darken(@brand-success, 15%);\n@pagination-hover-border:              transparent;\n\n@pagination-active-color:              #fff;\n@pagination-active-bg:                 darken(@brand-success, 15%);\n@pagination-active-border:             transparent;\n\n@pagination-disabled-color:            @gray-lighter;\n@pagination-disabled-bg:               lighten(@brand-success, 15%);;\n@pagination-disabled-border:           transparent;\n\n\n//== Pager\n//\n//##\n\n@pager-bg:                             @pagination-bg;\n@pager-border:                         @pagination-border;\n@pager-border-radius:                  15px;\n\n@pager-hover-bg:                       @pagination-hover-bg;\n\n@pager-active-bg:                      @pagination-active-bg;\n@pager-active-color:                   @pagination-active-color;\n\n@pager-disabled-color:                 #fff;\n\n\n//== Jumbotron\n//\n//##\n\n@jumbotron-padding:              30px;\n@jumbotron-color:                inherit;\n@jumbotron-bg:                   @gray-lighter;\n@jumbotron-heading-color:        inherit;\n@jumbotron-font-size:            ceil((@font-size-base * 1.5));\n\n\n//== Form states and alerts\n//\n//## Define colors for form feedback states and, by default, alerts.\n\n@state-success-text:             #fff;\n@state-success-bg:               @brand-success;\n@state-success-border:           @brand-success;\n\n@state-info-text:                #fff;\n@state-info-bg:                  @brand-info;\n@state-info-border:              @brand-info;\n\n@state-warning-text:             #fff;\n@state-warning-bg:               @brand-warning;\n@state-warning-border:           @brand-warning;\n\n@state-danger-text:              #fff;\n@state-danger-bg:                @brand-danger;\n@state-danger-border:            @brand-danger;\n\n\n//== Tooltips\n//\n//##\n\n//** Tooltip max width\n@tooltip-max-width:           200px;\n//** Tooltip text color\n@tooltip-color:               #fff;\n//** Tooltip background color\n@tooltip-bg:                  rgba(0,0,0,.9);\n@tooltip-opacity:             .9;\n\n//** Tooltip arrow width\n@tooltip-arrow-width:         5px;\n//** Tooltip arrow color\n@tooltip-arrow-color:         @tooltip-bg;\n\n\n//== Popovers\n//\n//##\n\n//** Popover body background color\n@popover-bg:                          #fff;\n//** Popover maximum width\n@popover-max-width:                   276px;\n//** Popover border color\n@popover-border-color:                rgba(0,0,0,.2);\n//** Popover fallback border color\n@popover-fallback-border-color:       #ccc;\n\n//** Popover title background color\n@popover-title-bg:                    darken(@popover-bg, 3%);\n\n//** Popover arrow width\n@popover-arrow-width:                 10px;\n//** Popover arrow color\n@popover-arrow-color:                 @popover-bg;\n\n//** Popover outer arrow width\n@popover-arrow-outer-width:           (@popover-arrow-width + 1);\n//** Popover outer arrow color\n@popover-arrow-outer-color:           fadein(@popover-border-color, 5%);\n//** Popover outer arrow fallback color\n@popover-arrow-outer-fallback-color:  darken(@popover-fallback-border-color, 20%);\n\n\n//== Labels\n//\n//##\n\n//** Default label background color\n@label-default-bg:            @btn-default-bg;\n//** Primary label background color\n@label-primary-bg:            @brand-primary;\n//** Success label background color\n@label-success-bg:            @brand-success;\n//** Info label background color\n@label-info-bg:               @brand-info;\n//** Warning label background color\n@label-warning-bg:            @brand-warning;\n//** Danger label background color\n@label-danger-bg:             @brand-danger;\n\n//** Default label text color\n@label-color:                 #fff;\n//** Default text color of a linked label\n@label-link-hover-color:      #fff;\n\n\n//== Modals\n//\n//##\n\n//** Padding applied to the modal body\n@modal-inner-padding:         20px;\n\n//** Padding applied to the modal title\n@modal-title-padding:         15px;\n//** Modal title line-height\n@modal-title-line-height:     @line-height-base;\n\n//** Background color of modal content area\n@modal-content-bg:                             #fff;\n//** Modal content border color\n@modal-content-border-color:                   rgba(0,0,0,.2);\n//** Modal content border color **for IE8**\n@modal-content-fallback-border-color:          #999;\n\n//** Modal backdrop background color\n@modal-backdrop-bg:           #000;\n//** Modal backdrop opacity\n@modal-backdrop-opacity:      .5;\n//** Modal header border color\n@modal-header-border-color:   #e5e5e5;\n//** Modal footer border color\n@modal-footer-border-color:   @modal-header-border-color;\n\n@modal-lg:                    900px;\n@modal-md:                    600px;\n@modal-sm:                    300px;\n\n\n//== Alerts\n//\n//## Define alert colors, border radius, and padding.\n\n@alert-padding:               15px;\n@alert-border-radius:         @border-radius-base;\n@alert-link-font-weight:      bold;\n\n@alert-success-bg:            @state-success-bg;\n@alert-success-text:          @state-success-text;\n@alert-success-border:        @state-success-border;\n\n@alert-info-bg:               @state-info-bg;\n@alert-info-text:             @state-info-text;\n@alert-info-border:           @state-info-border;\n\n@alert-warning-bg:            @state-warning-bg;\n@alert-warning-text:          @state-warning-text;\n@alert-warning-border:        @state-warning-border;\n\n@alert-danger-bg:             @state-danger-bg;\n@alert-danger-text:           @state-danger-text;\n@alert-danger-border:         @state-danger-border;\n\n\n//== Progress bars\n//\n//##\n\n//** Background color of the whole progress component\n@progress-bg:                 @gray-lighter;\n//** Progress bar text color\n@progress-bar-color:          #fff;\n//** Variable for setting rounded corners on progress bar.\n@progress-border-radius:      @border-radius-base;\n\n//** Default progress bar color\n@progress-bar-bg:             @brand-primary;\n//** Success progress bar color\n@progress-bar-success-bg:     @brand-success;\n//** Warning progress bar color\n@progress-bar-warning-bg:     @brand-warning;\n//** Danger progress bar color\n@progress-bar-danger-bg:      @brand-danger;\n//** Info progress bar color\n@progress-bar-info-bg:        @brand-info;\n\n\n//== List group\n//\n//##\n\n//** Background color on `.list-group-item`\n@list-group-bg:                 #fff;\n//** `.list-group-item` border color\n@list-group-border:             @gray-lighter;\n//** List group border radius\n@list-group-border-radius:      @border-radius-base;\n\n//** Background color of single list items on hover\n@list-group-hover-bg:           @gray-lighter;\n//** Text color of active list items\n@list-group-active-color:       @component-active-color;\n//** Background color of active list items\n@list-group-active-bg:          @component-active-bg;\n//** Border color of active list elements\n@list-group-active-border:      @list-group-active-bg;\n//** Text color for content within active list items\n@list-group-active-text-color:  lighten(@list-group-active-bg, 40%);\n\n//** Text color of disabled list items\n@list-group-disabled-color:      @gray-light;\n//** Background color of disabled list items\n@list-group-disabled-bg:         @gray-lighter;\n//** Text color for content within disabled list items\n@list-group-disabled-text-color: @list-group-disabled-color;\n\n@list-group-link-color:         #555;\n@list-group-link-hover-color:   @list-group-link-color;\n@list-group-link-heading-color: #333;\n\n\n//== Panels\n//\n//##\n\n@panel-bg:                    #fff;\n@panel-body-padding:          15px;\n@panel-heading-padding:       10px 15px;\n@panel-footer-padding:        @panel-heading-padding;\n@panel-border-radius:         @border-radius-base;\n\n//** Border color for elements within panels\n@panel-inner-border:          @gray-lighter;\n@panel-footer-bg:             @gray-lighter;\n\n@panel-default-text:          @text-color;\n@panel-default-border:        @gray-lighter;\n@panel-default-heading-bg:    @gray-lighter;\n\n@panel-primary-text:          #fff;\n@panel-primary-border:        @brand-primary;\n@panel-primary-heading-bg:    @brand-primary;\n\n@panel-success-text:          @state-success-text;\n@panel-success-border:        @state-success-border;\n@panel-success-heading-bg:    @state-success-bg;\n\n@panel-info-text:             @state-info-text;\n@panel-info-border:           @state-info-border;\n@panel-info-heading-bg:       @state-info-bg;\n\n@panel-warning-text:          @state-warning-text;\n@panel-warning-border:        @state-warning-border;\n@panel-warning-heading-bg:    @state-warning-bg;\n\n@panel-danger-text:           @state-danger-text;\n@panel-danger-border:         @state-danger-border;\n@panel-danger-heading-bg:     @state-danger-bg;\n\n\n//== Thumbnails\n//\n//##\n\n//** Padding around the thumbnail image\n@thumbnail-padding:           4px;\n//** Thumbnail background color\n@thumbnail-bg:                @body-bg;\n//** Thumbnail border color\n@thumbnail-border:            @gray-lighter;\n//** Thumbnail border radius\n@thumbnail-border-radius:     @border-radius-base;\n\n//** Custom text color for thumbnail captions\n@thumbnail-caption-color:     @text-color;\n//** Padding around the thumbnail caption\n@thumbnail-caption-padding:   9px;\n\n\n//== Wells\n//\n//##\n\n@well-bg:                     @gray-lighter;\n@well-border:                 transparent;\n\n\n//== Badges\n//\n//##\n\n@badge-color:                 #fff;\n//** Linked badge text color on hover\n@badge-link-hover-color:      #fff;\n@badge-bg:                    @brand-primary;\n\n//** Badge text color in active nav link\n@badge-active-color:          @brand-primary;\n//** Badge background color in active nav link\n@badge-active-bg:             #fff;\n\n@badge-font-weight:           bold;\n@badge-line-height:           1;\n@badge-border-radius:         10px;\n\n\n//== Breadcrumbs\n//\n//##\n\n@breadcrumb-padding-vertical:   8px;\n@breadcrumb-padding-horizontal: 15px;\n//** Breadcrumb background color\n@breadcrumb-bg:                 @gray-lighter;\n//** Breadcrumb text color\n@breadcrumb-color:              #ccc;\n//** Text color of current page in the breadcrumb\n@breadcrumb-active-color:       @gray;\n//** Textual separator for between breadcrumb elements\n@breadcrumb-separator:          \"/\";\n\n\n//== Carousel\n//\n//##\n\n@carousel-text-shadow:                        0 1px 2px rgba(0,0,0,.6);\n\n@carousel-control-color:                      #fff;\n@carousel-control-width:                      15%;\n@carousel-control-opacity:                    .5;\n@carousel-control-font-size:                  20px;\n\n@carousel-indicator-active-bg:                #fff;\n@carousel-indicator-border-color:             #fff;\n\n@carousel-caption-color:                      #fff;\n\n\n//== Close\n//\n//##\n\n@close-font-weight:           bold;\n@close-color:                 #000;\n@close-text-shadow:           none;\n\n\n//== Code\n//\n//##\n\n@code-color:                  #c7254e;\n@code-bg:                     #f9f2f4;\n\n@kbd-color:                   #fff;\n@kbd-bg:                      #333;\n\n@pre-bg:                      @gray-lighter;\n@pre-color:                   @gray-dark;\n@pre-border-color:            #ccc;\n@pre-scrollable-max-height:   340px;\n\n\n//== Type\n//\n//##\n\n//** Horizontal offset for forms and lists.\n@component-offset-horizontal: 180px;\n//** Text muted color\n@text-muted:                  @gray-light;\n//** Abbreviations and acronyms border color\n@abbr-border-color:           @gray-light;\n//** Headings small color\n@headings-small-color:        @gray-light;\n//** Blockquote small color\n@blockquote-small-color:      @gray-light;\n//** Blockquote font size\n@blockquote-font-size:        (@font-size-base * 1.25);\n//** Blockquote border color\n@blockquote-border-color:     @gray-lighter;\n//** Page header border color\n@page-header-border-color:    transparent;\n//** Width of horizontal description list titles\n@dl-horizontal-offset:        @component-offset-horizontal;\n//** Horizontal line color.\n@hr-border:                   @gray-lighter;\n\n// Flatly 3.3.0\n// Bootswatch\n// -----------------------------------------------------\n\n@import url(\"//fonts.gdgdocs.org/css?family=Lato:400,700,400italic\");\n\n// Navbar =====================================================================\n\n.navbar {\n  border-width: 0;\n\n  &-default {\n\n    .badge {\n      background-color: #fff;\n      color: @navbar-default-bg;\n    }\n  }\n\n  &-inverse {\n\n    .badge {\n      background-color: #fff;\n      color: @navbar-inverse-bg;\n    }\n  }\n\n  &-brand {\n    padding: 18.5px 15px 20.5px;\n  }\n}\n\n// Buttons ====================================================================\n\n.btn:active {\n  .box-shadow(none);\n}\n\n.btn-group.open .dropdown-toggle {\n  .box-shadow(none);\n}\n\n// Typography =================================================================\n\n.text-primary,\n.text-primary:hover {\n  color: @brand-primary;\n}\n\n.text-success,\n.text-success:hover {\n  color: @brand-success;\n}\n\n.text-danger,\n.text-danger:hover {\n  color: @brand-danger;\n}\n\n.text-warning,\n.text-warning:hover {\n  color: @brand-warning;\n}\n\n.text-info,\n.text-info:hover {\n  color: @brand-info;\n}\n\n// Tables =====================================================================\n\ntable,\n.table {\n\n  a:not(.btn) {\n    text-decoration: underline;\n  }\n\n  .dropdown-menu a {\n    text-decoration: none;\n  }\n\n  .success,\n  .warning,\n  .danger,\n  .info {\n    color: #fff;\n\n    a {\n      color: #fff;\n    }\n  }\n\n  > thead > tr > th,\n  > tbody > tr > th,\n  > tfoot > tr > th,\n  > thead > tr > td,\n  > tbody > tr > td,\n  > tfoot > tr > td {\n    border: none;\n  }\n\n  &-bordered > thead > tr > th,\n  &-bordered > tbody > tr > th,\n  &-bordered > tfoot > tr > th,\n  &-bordered > thead > tr > td,\n  &-bordered > tbody > tr > td,\n  &-bordered > tfoot > tr > td {\n    border: 1px solid @table-border-color;\n  }\n}\n\n// Forms ======================================================================\n\n.form-control,\ninput, {\n  border-width: 2px;\n  .box-shadow(none);\n\n  &:focus {\n    .box-shadow(none);\n  }\n}\n\n.has-warning {\n  .help-block,\n  .control-label,\n  .radio,\n  .checkbox,\n  .radio-inline,\n  .checkbox-inline,\n  .form-control-feedback {\n    color: @brand-warning;\n  }\n\n  .form-control,\n  .form-control:focus {\n    border: 2px solid @brand-warning;\n  }\n\n  .input-group-addon {\n    border-color: @brand-warning;\n  }\n}\n\n.has-error {\n  .help-block,\n  .control-label,\n  .radio,\n  .checkbox,\n  .radio-inline,\n  .checkbox-inline,\n  .form-control-feedback {\n    color: @brand-danger;\n  }\n\n  .form-control,\n  .form-control:focus {\n    border: 2px solid @brand-danger;\n  }\n\n  .input-group-addon {\n    border-color: @brand-danger;\n  }\n}\n\n.has-success {\n  .help-block,\n  .control-label,\n  .radio,\n  .checkbox,\n  .radio-inline,\n  .checkbox-inline,\n  .form-control-feedback {\n    color: @brand-success;\n  }\n\n  .form-control,\n  .form-control:focus {\n    border: 2px solid @brand-success;\n  }\n\n  .input-group-addon {\n    border-color: @brand-success;\n  }\n}\n\n// Navs =======================================================================\n\n.nav {\n  .open > a,\n  .open > a:hover,\n  .open > a:focus {\n    border-color: transparent;\n  }\n}\n\n.pager {\n  a,\n  a:hover {\n    color: #fff;\n  }\n\n  .disabled {\n    &>a,\n    &>a:hover,\n    &>a:focus,\n    &>span {\n      background-color: @pagination-disabled-bg;\n    }\n  }\n}\n\n// Indicators =================================================================\n\n.close {\n  color: #fff;\n  text-decoration: none;\n  opacity: 0.4;\n\n  &:hover,\n  &:focus {\n    color: #fff;\n    opacity: 1;\n  }\n}\n\n.alert {\n\n  .alert-link {\n    color: #fff;\n    text-decoration: underline;\n  }\n}\n\n// Progress bars ==============================================================\n\n.progress {\n  height: 10px;\n  .box-shadow(none);\n  .progress-bar {\n    font-size: 10px;\n    line-height: 10px;\n  }\n}\n\n// Containers =================================================================\n\n.well {\n  .box-shadow(none);\n}\n\na.list-group-item {\n\n  &.active,\n  &.active:hover,\n  &.active:focus {\n    border-color: @list-group-border;\n  }\n\n  &-success {\n    &.active {\n      background-color: @state-success-bg;\n    }\n\n    &.active:hover,\n    &.active:focus {\n      background-color: darken(@state-success-bg, 5%);\n    }\n  }\n\n  &-warning {\n    &.active {\n      background-color: @state-warning-bg;\n    }\n\n    &.active:hover,\n    &.active:focus {\n      background-color: darken(@state-warning-bg, 5%);\n    }\n  }\n\n  &-danger {\n    &.active {\n      background-color: @state-danger-bg;\n    }\n\n    &.active:hover,\n    &.active:focus {\n      background-color: darken(@state-danger-bg, 5%);\n    }\n  }\n}\n\n.panel {\n  &-default {\n    .close {\n      color: @text-color;\n    }\n  }\n}\n\n.modal {\n  .close {\n    color: @text-color;\n  }\n}\n\n.popover {\n  color: @text-color;\n}"
  },
  {
    "path": "public/css/themes/modern.less",
    "content": "@import url(\"//fonts.gdgdocs.org/css?family=Montserrat:400,700\");\n@import url(\"//fonts.gdgdocs.org/css?family=Raleway:400,300\");\n\n// Colors\n// -------------------------\n\n@gray-lighter: #f5f5f5;\n@gray-light: #e0e0e0;\n@gray: #737373;\n@gray-dark: #404040;\n@gray-darker: #121212;\n\n@brand-primary: #2ac5ee;\n@brand-success: #0f9d58;\n@brand-warning: #f4b400;\n@brand-danger: #d80017;\n@brand-info: #5bc0dd;\n\n// Footer\n// -------------------------\n\nfooter {\n  color: #fff;\n  background-color: @gray-darker;\n\n  a:hover {\n    color: #fff;\n  }\n}\n\n// Typography\n// -------------------------\n\n@font-size-base: 13px;\n@font-family-base: 'Montserrat', sans-serif;\n@headings-font-family: 'Montserrat', sans-serif;\n@headings-font-weight: 700;\n@text-color: @gray-darker;\n@link-color: @brand-primary;\n@link-hover-color: @gray-darker;\n\na {\n  transition: all .4s cubic-bezier(.24,.45,.46,.92);\n\n  &:hover {\n    text-decoration: none;\n  }\n}\n\nul,\np {\n  font-family: 'Raleway', sans-serif;\n  font-size: 14px;\n  font-weight: 300;\n}\n\n.text-danger {\n  color: @brand-danger;\n}\n\n// Dropdowns\n// -------------------------\n\n@dropdown-link-color: @gray-darker;\n\n.dropdown-menu > li > a {\n  font-weight: 300;\n}\n\n// Buttons\n// -------------------------\n\n@btn-default-bg: @gray-lighter;\n@btn-default-color: @gray-darker;\n\n.btn {\n  padding: 10px 16px;\n  border: 0;\n  border-radius: 3px;\n  transition: all .4s cubic-bezier(.24,.45,.46,.92);\n\n  &:hover {\n    color: #fff;\n    background-color: @gray-darker;\n  }\n}\n\n.btn-social {\n  padding: 10px 50px;\n\n  :first-child {\n    width: 38px;\n    line-height: 38px;\n  }\n}\n\n.btn-link {\n\n  &:hover {\n    color: @gray-darker;\n    text-decoration: none;\n    background-color: transparent;\n  }\n}\n\n// Forms\n// -------------------------\n\n@input-border-radius: 2px;\n@input-border-focus: #999;\n@input-border: #f0f0f0;\n@input-color: #444;\n@input-color-placeholder: #999;\n@input-height-base: 44px;\n\n// Form states and alerts\n// -------------------------\n\n@state-success-bg: @brand-success;\n@state-info-bg: @brand-primary;\n@state-warning-bg: @brand-warning;\n@state-danger-bg: @brand-danger;\n\n.alert {\n  font-family: 'Raleway', sans-serif;\n  color: #fff;\n}\n\n// Navbar\n// -------------------------\n\n@navbar-height: 50px;\n@navbar-default-bg: rgba(255,255,255,0.95);\n@navbar-default-link-color: @gray-darker;\n@navbar-default-link-active-color: @brand-primary;\n@navbar-default-link-active-bg: transparent;\n@navbar-default-link-hover-color: @brand-primary;\n@navbar-default-link-hover-bg: transparent;\n@navbar-default-brand-color: @gray-darker;\n@navbar-default-brand-hover-color: @brand-primary;\n\n.navbar-default {\n  border: 0;\n  box-shadow: 0 1px 5px rgba(0,0,0,.15);\n\n  .navbar-nav {\n    > li > a {\n      transition: color .4s cubic-bezier(.24,.45,.46,.92);\n    }\n  }\n}"
  },
  {
    "path": "public/css/ubuntu.css",
    "content": "@font-face {\n  font-family: \"Ubuntu\";\n  src: url(/fonts/Ubuntu-Regular.ttf) format(\"truetype\");\n}\n\n@font-face {\n  font-family: \"Ubuntu Mono\";\n  src: url(/fonts/UbuntuMono-Regular.ttf) format(\"truetype\");\n}\n"
  },
  {
    "path": "public/favicons/android-chrome-manifest.json",
    "content": "{\n \"name\": \"App\",\n \"icons\": [\n  {\n   \"src\": \"\\/android-icon-36x36.png\",\n   \"sizes\": \"36x36\",\n   \"type\": \"image\\/png\",\n   \"density\": \"0.75\"\n  },\n  {\n   \"src\": \"\\/android-icon-48x48.png\",\n   \"sizes\": \"48x48\",\n   \"type\": \"image\\/png\",\n   \"density\": \"1.0\"\n  },\n  {\n   \"src\": \"\\/android-icon-72x72.png\",\n   \"sizes\": \"72x72\",\n   \"type\": \"image\\/png\",\n   \"density\": \"1.5\"\n  },\n  {\n   \"src\": \"\\/android-icon-96x96.png\",\n   \"sizes\": \"96x96\",\n   \"type\": \"image\\/png\",\n   \"density\": \"2.0\"\n  },\n  {\n   \"src\": \"\\/android-icon-144x144.png\",\n   \"sizes\": \"144x144\",\n   \"type\": \"image\\/png\",\n   \"density\": \"3.0\"\n  },\n  {\n   \"src\": \"\\/android-icon-192x192.png\",\n   \"sizes\": \"192x192\",\n   \"type\": \"image\\/png\",\n   \"density\": \"4.0\"\n  }\n ]\n}"
  },
  {
    "path": "public/favicons/browserconfig.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<browserconfig><msapplication><tile><square70x70logo src=\"/ms-icon-70x70.png\"/><square150x150logo src=\"/ms-icon-150x150.png\"/><square310x310logo src=\"/ms-icon-310x310.png\"/><TileColor>#ffffff</TileColor></tile></msapplication></browserconfig>"
  },
  {
    "path": "public/favicons.html",
    "content": "<link rel=\"apple-touch-icon\" sizes=\"57x57\" href=\"/apple-touch-icon-57x57.png\">\n<link rel=\"apple-touch-icon\" sizes=\"60x60\" href=\"/apple-touch-icon-60x60.png\">\n<link rel=\"apple-touch-icon\" sizes=\"72x72\" href=\"/apple-touch-icon-72x72.png\">\n<link rel=\"apple-touch-icon\" sizes=\"76x76\" href=\"/apple-touch-icon-76x76.png\">\n<link rel=\"apple-touch-icon\" sizes=\"114x114\" href=\"/apple-touch-icon-114x114.png\">\n<link rel=\"apple-touch-icon\" sizes=\"120x120\" href=\"/apple-touch-icon-120x120.png\">\n<link rel=\"apple-touch-icon\" sizes=\"144x144\" href=\"/apple-touch-icon-144x144.png\">\n<link rel=\"apple-touch-icon\" sizes=\"152x152\" href=\"/apple-touch-icon-152x152.png\">\n<link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"/apple-touch-icon-180x180.png\">\n<link rel=\"icon\" type=\"image/png\" href=\"/favicon-32x32.png\" sizes=\"32x32\">\n<link rel=\"icon\" type=\"image/png\" href=\"/android-chrome-192x192.png\" sizes=\"192x192\">\n<link rel=\"icon\" type=\"image/png\" href=\"/favicon-96x96.png\" sizes=\"96x96\">\n<link rel=\"icon\" type=\"image/png\" href=\"/favicon-16x16.png\" sizes=\"16x16\">\n<link rel=\"manifest\" href=\"/android-chrome-manifest.json\">\n<meta name=\"msapplication-TileColor\" content=\"#492c14\">\n<meta name=\"msapplication-TileImage\" content=\"/mstile-144x144.png\">\n<meta name=\"theme-color\" content=\"#ffffff\">\n"
  },
  {
    "path": "public/grouth-hacker.html",
    "content": "<!DOCTYPE html>\n<html style=\"height: 100%\">\n  <head>\n     <meta charset=\"utf-8\">\n  </head>\n  <body style=\"height: 100%; margin: 0\">\n     <div id=\"container\" style=\"height: 100%\"></div>\n     <script type=\"text/javascript\" src=\"/js/echarts-all-3.js\"></script>\n     <script src=\"https://cdn.bootcss.com/jquery/2.1.1-rc2/jquery.min.js\"></script>\n     <script type=\"text/javascript\">\nvar dom = document.getElementById(\"container\");\nvar myChart = echarts.init(dom);\nvar app = {};\noption = null;\n$.getJSON('/get-user-identity/',function(res){\n  data = res;\n  var arr = data.map(function(item){\n      return Number(String(new Date(item.created).getMonth()+1)+new Date(item.created).getDate());\n  })\n  //console.log(arr);\n  var result = data.map(function(item){\n    var temp = new Date(item.created);\n    return [temp.getFullYear(), temp.getMonth()+1, temp.getDate()].join('/')\n  })\n  function distinct(arr) {\n    var ret = [],\n        json = {},\n        length = arr.length;\n\n    for(var i = 0; i < length; i++){\n        var val = arr[i];\n        if(!json[val]){\n            json[val] = 1;\n            ret.push(val);\n        }\n    }\n    return ret;\n  }\n  var date = distinct(result);\n  console.log(date);\n  var arrResult = [];\n  for(var i=0;i<arr.length;i++){\n      if(arr[i]!=-1){\n          var temp = arr[i];\n          var count = 0;\n          for(var j=0;j<arr.length;j++){\n              if(temp == arr[j]){\n                  count++;\n                  arr[j] = -1;\n              }\n          }\n          arrResult.push(count);\n      }\n  }\n  arrResult;\n  for(var i=0,sum=0,summer=[];i<arrResult.length;i++){\n    sum+=arrResult[i];\n    summer.push(sum);\n    summer[summer.length-1]+=98;\n  }\n\n  option = {\n      tooltip: {\n          trigger: 'axis',\n          position: function (pt) {\n              return [pt[0], '10%'];\n          }\n      },\n      title: {\n          left: '20px',\n          top: '10px',\n          text: 'FCC用户增长曲线',\n      },\n      legend: {\n          top: '20px',\n          data:['新增人数','累积人数']\n      },\n      toolbox: {\n          feature: {\n              dataZoom: {\n                  yAxisIndex: 'none'\n              },\n              restore: {},\n              saveAsImage: {}\n          }\n      },\n      xAxis: {\n          type: 'category',\n          boundaryGap: false,\n          data: date\n      },\n      yAxis: {\n          type: 'value',\n          boundaryGap: [0, '100%']\n      },\n      dataZoom: [{\n          type: 'inside',\n          start: 0,\n          end: result.length\n      }, {\n          start: 0,\n          end: 10,\n          handleIcon: 'M10.7,11.9v-1.3H9.3v1.3c-4.9,0.3-8.8,4.4-8.8,9.4c0,5,3.9,9.1,8.8,9.4v1.3h1.3v-1.3c4.9-0.3,8.8-4.4,8.8-9.4C19.5,16.3,15.6,12.2,10.7,11.9z M13.3,24.4H6.7V23h6.6V24.4z M13.3,19.6H6.7v-1.4h6.6V19.6z',\n          handleSize: '80%',\n          handleStyle: {\n              color: '#fff',\n              shadowBlur: 3,\n              shadowColor: 'rgba(0, 0, 0, 0.6)',\n              shadowOffsetX: 2,\n              shadowOffsetY: 2\n          }\n      }],\n      series: [\n          {\n              name:'新增人数',\n              type:'line',\n              smooth:true,\n              symbol: 'none',\n              sampling: 'average',\n              itemStyle: {\n                  normal: {\n                      color: 'rgb(255, 70, 131)'\n                  }\n              },\n              areaStyle: {\n                  normal: {\n                      color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [{\n                          offset: 0,\n                          color: 'rgb(255, 158, 68)'\n                      }, {\n                          offset: 1,\n                          color: 'rgb(255, 70, 131)'\n                      }])\n                  }\n              },\n              data: arrResult\n          },\n          {\n              name:'累积人数',\n              type:'line',\n              smooth:true,\n              symbol: 'none',\n              sampling: 'average',\n              itemStyle: {\n                  normal: {\n                      color: 'rgb(255, 131, 131)'\n                  }\n              },\n              areaStyle: {\n                  normal: {\n                      color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [{\n                          offset: 0,\n                          color: 'rgb(255, 158, 68)'\n                      }, {\n                          offset: 1,\n                          color: 'rgb(255, 70, 131)'\n                      }])\n                  }\n              },\n              data: summer\n          }\n      ]\n  };\n  ;\n  if (option && typeof option === \"object\") {\n      myChart.setOption(option, true);\n  }\n})\n\n       </script>\n   </body>\n</html>\n"
  },
  {
    "path": "public/js/.jshintrc",
    "content": "{\n\"node\": true, // Enable globals available when code is running inside of the NodeJS runtime environment.\n\"browser\": true, // Standard browser globals e.g. `window`, `document`.\n\"esnext\": true, // Allow ES.next specific features such as `const` and `let`.\n\"bitwise\": false, // Prohibit bitwise operators (&, |, ^, etc.).\n\"camelcase\": false, // Permit only camelcase for `var` and `object indexes`.\n\"curly\": false, // Require {} for every new block or scope.\n\"eqeqeq\": true, // Require triple equals i.e. `===`.\n\"immed\": true, // Require immediate invocations to be wrapped in parens e.g. `( function(){}() );`\n\"latedef\": true, // Prohibit variable use before definition.\n\"newcap\": true, // Require capitalization of all constructor functions e.g. `new F()`.\n\"noarg\": true, // Prohibit use of `arguments.caller` and `arguments.callee`.\n\"regexp\": true, // Prohibit `.` and `[^...]` in regular expressions.\n\"undef\": true, // Require all non-global variables be declared before they are used.\n\"unused\": false, // Warn unused variables.\n\"strict\": false, // Require `use strict` pragma in every file.\n\"trailing\": true, // Prohibit trailing whitespaces.\n\"smarttabs\": false, // Suppresses warnings about mixed tabs and spaces\n\"globals\": { // Globals variables.\n\"jasmine\": true,\n\"angular\": true,\n\"ApplicationConfiguration\": true\n},\n\"predef\": [ // Extra globals.\n\"define\",\n\"require\",\n\"exports\",\n\"module\",\n\"describe\",\n\"before\",\n\"beforeEach\",\n\"after\",\n\"afterEach\",\n\"it\",\n\"inject\",\n\"expect\"\n],\n\"devel\": true, // Allow development statements e.g. `console.log();`.\n\"noempty\": true // Prohibit use of empty blocks.\n}"
  },
  {
    "path": "public/js/angular.js",
    "content": "/**\n * @license AngularJS v1.5.5\n * (c) 2010-2016 Google, Inc. http://angularjs.org\n * License: MIT\n */\n(function(window) {'use strict';\n\n/**\n * @description\n *\n * This object provides a utility for producing rich Error messages within\n * Angular. It can be called as follows:\n *\n * var exampleMinErr = minErr('example');\n * throw exampleMinErr('one', 'This {0} is {1}', foo, bar);\n *\n * The above creates an instance of minErr in the example namespace. The\n * resulting error will have a namespaced error code of example.one.  The\n * resulting error will replace {0} with the value of foo, and {1} with the\n * value of bar. The object is not restricted in the number of arguments it can\n * take.\n *\n * If fewer arguments are specified than necessary for interpolation, the extra\n * interpolation markers will be preserved in the final string.\n *\n * Since data will be parsed statically during a build step, some restrictions\n * are applied with respect to how minErr instances are created and called.\n * Instances should have names of the form namespaceMinErr for a minErr created\n * using minErr('namespace') . Error codes, namespaces and template strings\n * should all be static strings, not variables or general expressions.\n *\n * @param {string} module The namespace to use for the new minErr instance.\n * @param {function} ErrorConstructor Custom error constructor to be instantiated when returning\n *   error from returned function, for cases when a particular type of error is useful.\n * @returns {function(code:string, template:string, ...templateArgs): Error} minErr instance\n */\n\nfunction minErr(module, ErrorConstructor) {\n  ErrorConstructor = ErrorConstructor || Error;\n  return function() {\n    var SKIP_INDEXES = 2;\n\n    var templateArgs = arguments,\n      code = templateArgs[0],\n      message = '[' + (module ? module + ':' : '') + code + '] ',\n      template = templateArgs[1],\n      paramPrefix, i;\n\n    message += template.replace(/\\{\\d+\\}/g, function(match) {\n      var index = +match.slice(1, -1),\n        shiftedIndex = index + SKIP_INDEXES;\n\n      if (shiftedIndex < templateArgs.length) {\n        return toDebugString(templateArgs[shiftedIndex]);\n      }\n\n      return match;\n    });\n\n    message += '\\nhttp://errors.angularjs.org/1.5.5/' +\n      (module ? module + '/' : '') + code;\n\n    for (i = SKIP_INDEXES, paramPrefix = '?'; i < templateArgs.length; i++, paramPrefix = '&') {\n      message += paramPrefix + 'p' + (i - SKIP_INDEXES) + '=' +\n        encodeURIComponent(toDebugString(templateArgs[i]));\n    }\n\n    return new ErrorConstructor(message);\n  };\n}\n\n/* We need to tell jshint what variables are being exported */\n/* global angular: true,\n  msie: true,\n  jqLite: true,\n  jQuery: true,\n  slice: true,\n  splice: true,\n  push: true,\n  toString: true,\n  ngMinErr: true,\n  angularModule: true,\n  uid: true,\n  REGEX_STRING_REGEXP: true,\n  VALIDITY_STATE_PROPERTY: true,\n\n  lowercase: true,\n  uppercase: true,\n  manualLowercase: true,\n  manualUppercase: true,\n  nodeName_: true,\n  isArrayLike: true,\n  forEach: true,\n  forEachSorted: true,\n  reverseParams: true,\n  nextUid: true,\n  setHashKey: true,\n  extend: true,\n  toInt: true,\n  inherit: true,\n  merge: true,\n  noop: true,\n  identity: true,\n  valueFn: true,\n  isUndefined: true,\n  isDefined: true,\n  isObject: true,\n  isBlankObject: true,\n  isString: true,\n  isNumber: true,\n  isDate: true,\n  isArray: true,\n  isFunction: true,\n  isRegExp: true,\n  isWindow: true,\n  isScope: true,\n  isFile: true,\n  isFormData: true,\n  isBlob: true,\n  isBoolean: true,\n  isPromiseLike: true,\n  trim: true,\n  escapeForRegexp: true,\n  isElement: true,\n  makeMap: true,\n  includes: true,\n  arrayRemove: true,\n  copy: true,\n  shallowCopy: true,\n  equals: true,\n  csp: true,\n  jq: true,\n  concat: true,\n  sliceArgs: true,\n  bind: true,\n  toJsonReplacer: true,\n  toJson: true,\n  fromJson: true,\n  convertTimezoneToLocal: true,\n  timezoneToOffset: true,\n  startingTag: true,\n  tryDecodeURIComponent: true,\n  parseKeyValue: true,\n  toKeyValue: true,\n  encodeUriSegment: true,\n  encodeUriQuery: true,\n  angularInit: true,\n  bootstrap: true,\n  getTestability: true,\n  snake_case: true,\n  bindJQuery: true,\n  assertArg: true,\n  assertArgFn: true,\n  assertNotHasOwnProperty: true,\n  getter: true,\n  getBlockNodes: true,\n  hasOwnProperty: true,\n  createMap: true,\n\n  NODE_TYPE_ELEMENT: true,\n  NODE_TYPE_ATTRIBUTE: true,\n  NODE_TYPE_TEXT: true,\n  NODE_TYPE_COMMENT: true,\n  NODE_TYPE_DOCUMENT: true,\n  NODE_TYPE_DOCUMENT_FRAGMENT: true,\n*/\n\n////////////////////////////////////\n\n/**\n * @ngdoc module\n * @name ng\n * @module ng\n * @installation\n * @description\n *\n * # ng (core module)\n * The ng module is loaded by default when an AngularJS application is started. The module itself\n * contains the essential components for an AngularJS application to function. The table below\n * lists a high level breakdown of each of the services/factories, filters, directives and testing\n * components available within this core module.\n *\n * <div doc-module-components=\"ng\"></div>\n */\n\nvar REGEX_STRING_REGEXP = /^\\/(.+)\\/([a-z]*)$/;\n\n// The name of a form control's ValidityState property.\n// This is used so that it's possible for internal tests to create mock ValidityStates.\nvar VALIDITY_STATE_PROPERTY = 'validity';\n\nvar hasOwnProperty = Object.prototype.hasOwnProperty;\n\nvar lowercase = function(string) {return isString(string) ? string.toLowerCase() : string;};\nvar uppercase = function(string) {return isString(string) ? string.toUpperCase() : string;};\n\n\nvar manualLowercase = function(s) {\n  /* jshint bitwise: false */\n  return isString(s)\n      ? s.replace(/[A-Z]/g, function(ch) {return String.fromCharCode(ch.charCodeAt(0) | 32);})\n      : s;\n};\nvar manualUppercase = function(s) {\n  /* jshint bitwise: false */\n  return isString(s)\n      ? s.replace(/[a-z]/g, function(ch) {return String.fromCharCode(ch.charCodeAt(0) & ~32);})\n      : s;\n};\n\n\n// String#toLowerCase and String#toUpperCase don't produce correct results in browsers with Turkish\n// locale, for this reason we need to detect this case and redefine lowercase/uppercase methods\n// with correct but slower alternatives. See https://github.com/angular/angular.js/issues/11387\nif ('i' !== 'I'.toLowerCase()) {\n  lowercase = manualLowercase;\n  uppercase = manualUppercase;\n}\n\n\nvar\n    msie,             // holds major version number for IE, or NaN if UA is not IE.\n    jqLite,           // delay binding since jQuery could be loaded after us.\n    jQuery,           // delay binding\n    slice             = [].slice,\n    splice            = [].splice,\n    push              = [].push,\n    toString          = Object.prototype.toString,\n    getPrototypeOf    = Object.getPrototypeOf,\n    ngMinErr          = minErr('ng'),\n\n    /** @name angular */\n    angular           = window.angular || (window.angular = {}),\n    angularModule,\n    uid               = 0;\n\n/**\n * documentMode is an IE-only property\n * http://msdn.microsoft.com/en-us/library/ie/cc196988(v=vs.85).aspx\n */\nmsie = window.document.documentMode;\n\n\n/**\n * @private\n * @param {*} obj\n * @return {boolean} Returns true if `obj` is an array or array-like object (NodeList, Arguments,\n *                   String ...)\n */\nfunction isArrayLike(obj) {\n\n  // `null`, `undefined` and `window` are not array-like\n  if (obj == null || isWindow(obj)) return false;\n\n  // arrays, strings and jQuery/jqLite objects are array like\n  // * jqLite is either the jQuery or jqLite constructor function\n  // * we have to check the existence of jqLite first as this method is called\n  //   via the forEach method when constructing the jqLite object in the first place\n  if (isArray(obj) || isString(obj) || (jqLite && obj instanceof jqLite)) return true;\n\n  // Support: iOS 8.2 (not reproducible in simulator)\n  // \"length\" in obj used to prevent JIT error (gh-11508)\n  var length = \"length\" in Object(obj) && obj.length;\n\n  // NodeList objects (with `item` method) and\n  // other objects with suitable length characteristics are array-like\n  return isNumber(length) &&\n    (length >= 0 && ((length - 1) in obj || obj instanceof Array) || typeof obj.item == 'function');\n\n}\n\n/**\n * @ngdoc function\n * @name angular.forEach\n * @module ng\n * @kind function\n *\n * @description\n * Invokes the `iterator` function once for each item in `obj` collection, which can be either an\n * object or an array. The `iterator` function is invoked with `iterator(value, key, obj)`, where `value`\n * is the value of an object property or an array element, `key` is the object property key or\n * array element index and obj is the `obj` itself. Specifying a `context` for the function is optional.\n *\n * It is worth noting that `.forEach` does not iterate over inherited properties because it filters\n * using the `hasOwnProperty` method.\n *\n * Unlike ES262's\n * [Array.prototype.forEach](http://www.ecma-international.org/ecma-262/5.1/#sec-15.4.4.18),\n * providing 'undefined' or 'null' values for `obj` will not throw a TypeError, but rather just\n * return the value provided.\n *\n   ```js\n     var values = {name: 'misko', gender: 'male'};\n     var log = [];\n     angular.forEach(values, function(value, key) {\n       this.push(key + ': ' + value);\n     }, log);\n     expect(log).toEqual(['name: misko', 'gender: male']);\n   ```\n *\n * @param {Object|Array} obj Object to iterate over.\n * @param {Function} iterator Iterator function.\n * @param {Object=} context Object to become context (`this`) for the iterator function.\n * @returns {Object|Array} Reference to `obj`.\n */\n\nfunction forEach(obj, iterator, context) {\n  var key, length;\n  if (obj) {\n    if (isFunction(obj)) {\n      for (key in obj) {\n        // Need to check if hasOwnProperty exists,\n        // as on IE8 the result of querySelectorAll is an object without a hasOwnProperty function\n        if (key != 'prototype' && key != 'length' && key != 'name' && (!obj.hasOwnProperty || obj.hasOwnProperty(key))) {\n          iterator.call(context, obj[key], key, obj);\n        }\n      }\n    } else if (isArray(obj) || isArrayLike(obj)) {\n      var isPrimitive = typeof obj !== 'object';\n      for (key = 0, length = obj.length; key < length; key++) {\n        if (isPrimitive || key in obj) {\n          iterator.call(context, obj[key], key, obj);\n        }\n      }\n    } else if (obj.forEach && obj.forEach !== forEach) {\n        obj.forEach(iterator, context, obj);\n    } else if (isBlankObject(obj)) {\n      // createMap() fast path --- Safe to avoid hasOwnProperty check because prototype chain is empty\n      for (key in obj) {\n        iterator.call(context, obj[key], key, obj);\n      }\n    } else if (typeof obj.hasOwnProperty === 'function') {\n      // Slow path for objects inheriting Object.prototype, hasOwnProperty check needed\n      for (key in obj) {\n        if (obj.hasOwnProperty(key)) {\n          iterator.call(context, obj[key], key, obj);\n        }\n      }\n    } else {\n      // Slow path for objects which do not have a method `hasOwnProperty`\n      for (key in obj) {\n        if (hasOwnProperty.call(obj, key)) {\n          iterator.call(context, obj[key], key, obj);\n        }\n      }\n    }\n  }\n  return obj;\n}\n\nfunction forEachSorted(obj, iterator, context) {\n  var keys = Object.keys(obj).sort();\n  for (var i = 0; i < keys.length; i++) {\n    iterator.call(context, obj[keys[i]], keys[i]);\n  }\n  return keys;\n}\n\n\n/**\n * when using forEach the params are value, key, but it is often useful to have key, value.\n * @param {function(string, *)} iteratorFn\n * @returns {function(*, string)}\n */\nfunction reverseParams(iteratorFn) {\n  return function(value, key) {iteratorFn(key, value);};\n}\n\n/**\n * A consistent way of creating unique IDs in angular.\n *\n * Using simple numbers allows us to generate 28.6 million unique ids per second for 10 years before\n * we hit number precision issues in JavaScript.\n *\n * Math.pow(2,53) / 60 / 60 / 24 / 365 / 10 = 28.6M\n *\n * @returns {number} an unique alpha-numeric string\n */\nfunction nextUid() {\n  return ++uid;\n}\n\n\n/**\n * Set or clear the hashkey for an object.\n * @param obj object\n * @param h the hashkey (!truthy to delete the hashkey)\n */\nfunction setHashKey(obj, h) {\n  if (h) {\n    obj.$$hashKey = h;\n  } else {\n    delete obj.$$hashKey;\n  }\n}\n\n\nfunction baseExtend(dst, objs, deep) {\n  var h = dst.$$hashKey;\n\n  for (var i = 0, ii = objs.length; i < ii; ++i) {\n    var obj = objs[i];\n    if (!isObject(obj) && !isFunction(obj)) continue;\n    var keys = Object.keys(obj);\n    for (var j = 0, jj = keys.length; j < jj; j++) {\n      var key = keys[j];\n      var src = obj[key];\n\n      if (deep && isObject(src)) {\n        if (isDate(src)) {\n          dst[key] = new Date(src.valueOf());\n        } else if (isRegExp(src)) {\n          dst[key] = new RegExp(src);\n        } else if (src.nodeName) {\n          dst[key] = src.cloneNode(true);\n        } else if (isElement(src)) {\n          dst[key] = src.clone();\n        } else {\n          if (!isObject(dst[key])) dst[key] = isArray(src) ? [] : {};\n          baseExtend(dst[key], [src], true);\n        }\n      } else {\n        dst[key] = src;\n      }\n    }\n  }\n\n  setHashKey(dst, h);\n  return dst;\n}\n\n/**\n * @ngdoc function\n * @name angular.extend\n * @module ng\n * @kind function\n *\n * @description\n * Extends the destination object `dst` by copying own enumerable properties from the `src` object(s)\n * to `dst`. You can specify multiple `src` objects. If you want to preserve original objects, you can do so\n * by passing an empty object as the target: `var object = angular.extend({}, object1, object2)`.\n *\n * **Note:** Keep in mind that `angular.extend` does not support recursive merge (deep copy). Use\n * {@link angular.merge} for this.\n *\n * @param {Object} dst Destination object.\n * @param {...Object} src Source object(s).\n * @returns {Object} Reference to `dst`.\n */\nfunction extend(dst) {\n  return baseExtend(dst, slice.call(arguments, 1), false);\n}\n\n\n/**\n* @ngdoc function\n* @name angular.merge\n* @module ng\n* @kind function\n*\n* @description\n* Deeply extends the destination object `dst` by copying own enumerable properties from the `src` object(s)\n* to `dst`. You can specify multiple `src` objects. If you want to preserve original objects, you can do so\n* by passing an empty object as the target: `var object = angular.merge({}, object1, object2)`.\n*\n* Unlike {@link angular.extend extend()}, `merge()` recursively descends into object properties of source\n* objects, performing a deep copy.\n*\n* @param {Object} dst Destination object.\n* @param {...Object} src Source object(s).\n* @returns {Object} Reference to `dst`.\n*/\nfunction merge(dst) {\n  return baseExtend(dst, slice.call(arguments, 1), true);\n}\n\n\n\nfunction toInt(str) {\n  return parseInt(str, 10);\n}\n\n\nfunction inherit(parent, extra) {\n  return extend(Object.create(parent), extra);\n}\n\n/**\n * @ngdoc function\n * @name angular.noop\n * @module ng\n * @kind function\n *\n * @description\n * A function that performs no operations. This function can be useful when writing code in the\n * functional style.\n   ```js\n     function foo(callback) {\n       var result = calculateResult();\n       (callback || angular.noop)(result);\n     }\n   ```\n */\nfunction noop() {}\nnoop.$inject = [];\n\n\n/**\n * @ngdoc function\n * @name angular.identity\n * @module ng\n * @kind function\n *\n * @description\n * A function that returns its first argument. This function is useful when writing code in the\n * functional style.\n *\n   ```js\n     function transformer(transformationFn, value) {\n       return (transformationFn || angular.identity)(value);\n     };\n   ```\n  * @param {*} value to be returned.\n  * @returns {*} the value passed in.\n */\nfunction identity($) {return $;}\nidentity.$inject = [];\n\n\nfunction valueFn(value) {return function valueRef() {return value;};}\n\nfunction hasCustomToString(obj) {\n  return isFunction(obj.toString) && obj.toString !== toString;\n}\n\n\n/**\n * @ngdoc function\n * @name angular.isUndefined\n * @module ng\n * @kind function\n *\n * @description\n * Determines if a reference is undefined.\n *\n * @param {*} value Reference to check.\n * @returns {boolean} True if `value` is undefined.\n */\nfunction isUndefined(value) {return typeof value === 'undefined';}\n\n\n/**\n * @ngdoc function\n * @name angular.isDefined\n * @module ng\n * @kind function\n *\n * @description\n * Determines if a reference is defined.\n *\n * @param {*} value Reference to check.\n * @returns {boolean} True if `value` is defined.\n */\nfunction isDefined(value) {return typeof value !== 'undefined';}\n\n\n/**\n * @ngdoc function\n * @name angular.isObject\n * @module ng\n * @kind function\n *\n * @description\n * Determines if a reference is an `Object`. Unlike `typeof` in JavaScript, `null`s are not\n * considered to be objects. Note that JavaScript arrays are objects.\n *\n * @param {*} value Reference to check.\n * @returns {boolean} True if `value` is an `Object` but not `null`.\n */\nfunction isObject(value) {\n  // http://jsperf.com/isobject4\n  return value !== null && typeof value === 'object';\n}\n\n\n/**\n * Determine if a value is an object with a null prototype\n *\n * @returns {boolean} True if `value` is an `Object` with a null prototype\n */\nfunction isBlankObject(value) {\n  return value !== null && typeof value === 'object' && !getPrototypeOf(value);\n}\n\n\n/**\n * @ngdoc function\n * @name angular.isString\n * @module ng\n * @kind function\n *\n * @description\n * Determines if a reference is a `String`.\n *\n * @param {*} value Reference to check.\n * @returns {boolean} True if `value` is a `String`.\n */\nfunction isString(value) {return typeof value === 'string';}\n\n\n/**\n * @ngdoc function\n * @name angular.isNumber\n * @module ng\n * @kind function\n *\n * @description\n * Determines if a reference is a `Number`.\n *\n * This includes the \"special\" numbers `NaN`, `+Infinity` and `-Infinity`.\n *\n * If you wish to exclude these then you can use the native\n * [`isFinite'](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/isFinite)\n * method.\n *\n * @param {*} value Reference to check.\n * @returns {boolean} True if `value` is a `Number`.\n */\nfunction isNumber(value) {return typeof value === 'number';}\n\n\n/**\n * @ngdoc function\n * @name angular.isDate\n * @module ng\n * @kind function\n *\n * @description\n * Determines if a value is a date.\n *\n * @param {*} value Reference to check.\n * @returns {boolean} True if `value` is a `Date`.\n */\nfunction isDate(value) {\n  return toString.call(value) === '[object Date]';\n}\n\n\n/**\n * @ngdoc function\n * @name angular.isArray\n * @module ng\n * @kind function\n *\n * @description\n * Determines if a reference is an `Array`.\n *\n * @param {*} value Reference to check.\n * @returns {boolean} True if `value` is an `Array`.\n */\nvar isArray = Array.isArray;\n\n/**\n * @ngdoc function\n * @name angular.isFunction\n * @module ng\n * @kind function\n *\n * @description\n * Determines if a reference is a `Function`.\n *\n * @param {*} value Reference to check.\n * @returns {boolean} True if `value` is a `Function`.\n */\nfunction isFunction(value) {return typeof value === 'function';}\n\n\n/**\n * Determines if a value is a regular expression object.\n *\n * @private\n * @param {*} value Reference to check.\n * @returns {boolean} True if `value` is a `RegExp`.\n */\nfunction isRegExp(value) {\n  return toString.call(value) === '[object RegExp]';\n}\n\n\n/**\n * Checks if `obj` is a window object.\n *\n * @private\n * @param {*} obj Object to check\n * @returns {boolean} True if `obj` is a window obj.\n */\nfunction isWindow(obj) {\n  return obj && obj.window === obj;\n}\n\n\nfunction isScope(obj) {\n  return obj && obj.$evalAsync && obj.$watch;\n}\n\n\nfunction isFile(obj) {\n  return toString.call(obj) === '[object File]';\n}\n\n\nfunction isFormData(obj) {\n  return toString.call(obj) === '[object FormData]';\n}\n\n\nfunction isBlob(obj) {\n  return toString.call(obj) === '[object Blob]';\n}\n\n\nfunction isBoolean(value) {\n  return typeof value === 'boolean';\n}\n\n\nfunction isPromiseLike(obj) {\n  return obj && isFunction(obj.then);\n}\n\n\nvar TYPED_ARRAY_REGEXP = /^\\[object (?:Uint8|Uint8Clamped|Uint16|Uint32|Int8|Int16|Int32|Float32|Float64)Array\\]$/;\nfunction isTypedArray(value) {\n  return value && isNumber(value.length) && TYPED_ARRAY_REGEXP.test(toString.call(value));\n}\n\nfunction isArrayBuffer(obj) {\n  return toString.call(obj) === '[object ArrayBuffer]';\n}\n\n\nvar trim = function(value) {\n  return isString(value) ? value.trim() : value;\n};\n\n// Copied from:\n// http://docs.closure-library.googlecode.com/git/local_closure_goog_string_string.js.source.html#line1021\n// Prereq: s is a string.\nvar escapeForRegexp = function(s) {\n  return s.replace(/([-()\\[\\]{}+?*.$\\^|,:#<!\\\\])/g, '\\\\$1').\n           replace(/\\x08/g, '\\\\x08');\n};\n\n\n/**\n * @ngdoc function\n * @name angular.isElement\n * @module ng\n * @kind function\n *\n * @description\n * Determines if a reference is a DOM element (or wrapped jQuery element).\n *\n * @param {*} value Reference to check.\n * @returns {boolean} True if `value` is a DOM element (or wrapped jQuery element).\n */\nfunction isElement(node) {\n  return !!(node &&\n    (node.nodeName  // we are a direct element\n    || (node.prop && node.attr && node.find)));  // we have an on and find method part of jQuery API\n}\n\n/**\n * @param str 'key1,key2,...'\n * @returns {object} in the form of {key1:true, key2:true, ...}\n */\nfunction makeMap(str) {\n  var obj = {}, items = str.split(','), i;\n  for (i = 0; i < items.length; i++) {\n    obj[items[i]] = true;\n  }\n  return obj;\n}\n\n\nfunction nodeName_(element) {\n  return lowercase(element.nodeName || (element[0] && element[0].nodeName));\n}\n\nfunction includes(array, obj) {\n  return Array.prototype.indexOf.call(array, obj) != -1;\n}\n\nfunction arrayRemove(array, value) {\n  var index = array.indexOf(value);\n  if (index >= 0) {\n    array.splice(index, 1);\n  }\n  return index;\n}\n\n/**\n * @ngdoc function\n * @name angular.copy\n * @module ng\n * @kind function\n *\n * @description\n * Creates a deep copy of `source`, which should be an object or an array.\n *\n * * If no destination is supplied, a copy of the object or array is created.\n * * If a destination is provided, all of its elements (for arrays) or properties (for objects)\n *   are deleted and then all elements/properties from the source are copied to it.\n * * If `source` is not an object or array (inc. `null` and `undefined`), `source` is returned.\n * * If `source` is identical to 'destination' an exception will be thrown.\n *\n * @param {*} source The source that will be used to make a copy.\n *                   Can be any type, including primitives, `null`, and `undefined`.\n * @param {(Object|Array)=} destination Destination into which the source is copied. If\n *     provided, must be of the same type as `source`.\n * @returns {*} The copy or updated `destination`, if `destination` was specified.\n *\n * @example\n <example module=\"copyExample\">\n <file name=\"index.html\">\n <div ng-controller=\"ExampleController\">\n <form novalidate class=\"simple-form\">\n Name: <input type=\"text\" ng-model=\"user.name\" /><br />\n E-mail: <input type=\"email\" ng-model=\"user.email\" /><br />\n Gender: <input type=\"radio\" ng-model=\"user.gender\" value=\"male\" />male\n <input type=\"radio\" ng-model=\"user.gender\" value=\"female\" />female<br />\n <button ng-click=\"reset()\">RESET</button>\n <button ng-click=\"update(user)\">SAVE</button>\n </form>\n <pre>form = {{user | json}}</pre>\n <pre>master = {{master | json}}</pre>\n </div>\n\n <script>\n  angular.module('copyExample', [])\n    .controller('ExampleController', ['$scope', function($scope) {\n      $scope.master= {};\n\n      $scope.update = function(user) {\n        // Example with 1 argument\n        $scope.master= angular.copy(user);\n      };\n\n      $scope.reset = function() {\n        // Example with 2 arguments\n        angular.copy($scope.master, $scope.user);\n      };\n\n      $scope.reset();\n    }]);\n </script>\n </file>\n </example>\n */\nfunction copy(source, destination) {\n  var stackSource = [];\n  var stackDest = [];\n\n  if (destination) {\n    if (isTypedArray(destination) || isArrayBuffer(destination)) {\n      throw ngMinErr('cpta', \"Can't copy! TypedArray destination cannot be mutated.\");\n    }\n    if (source === destination) {\n      throw ngMinErr('cpi', \"Can't copy! Source and destination are identical.\");\n    }\n\n    // Empty the destination object\n    if (isArray(destination)) {\n      destination.length = 0;\n    } else {\n      forEach(destination, function(value, key) {\n        if (key !== '$$hashKey') {\n          delete destination[key];\n        }\n      });\n    }\n\n    stackSource.push(source);\n    stackDest.push(destination);\n    return copyRecurse(source, destination);\n  }\n\n  return copyElement(source);\n\n  function copyRecurse(source, destination) {\n    var h = destination.$$hashKey;\n    var key;\n    if (isArray(source)) {\n      for (var i = 0, ii = source.length; i < ii; i++) {\n        destination.push(copyElement(source[i]));\n      }\n    } else if (isBlankObject(source)) {\n      // createMap() fast path --- Safe to avoid hasOwnProperty check because prototype chain is empty\n      for (key in source) {\n        destination[key] = copyElement(source[key]);\n      }\n    } else if (source && typeof source.hasOwnProperty === 'function') {\n      // Slow path, which must rely on hasOwnProperty\n      for (key in source) {\n        if (source.hasOwnProperty(key)) {\n          destination[key] = copyElement(source[key]);\n        }\n      }\n    } else {\n      // Slowest path --- hasOwnProperty can't be called as a method\n      for (key in source) {\n        if (hasOwnProperty.call(source, key)) {\n          destination[key] = copyElement(source[key]);\n        }\n      }\n    }\n    setHashKey(destination, h);\n    return destination;\n  }\n\n  function copyElement(source) {\n    // Simple values\n    if (!isObject(source)) {\n      return source;\n    }\n\n    // Already copied values\n    var index = stackSource.indexOf(source);\n    if (index !== -1) {\n      return stackDest[index];\n    }\n\n    if (isWindow(source) || isScope(source)) {\n      throw ngMinErr('cpws',\n        \"Can't copy! Making copies of Window or Scope instances is not supported.\");\n    }\n\n    var needsRecurse = false;\n    var destination = copyType(source);\n\n    if (destination === undefined) {\n      destination = isArray(source) ? [] : Object.create(getPrototypeOf(source));\n      needsRecurse = true;\n    }\n\n    stackSource.push(source);\n    stackDest.push(destination);\n\n    return needsRecurse\n      ? copyRecurse(source, destination)\n      : destination;\n  }\n\n  function copyType(source) {\n    switch (toString.call(source)) {\n      case '[object Int8Array]':\n      case '[object Int16Array]':\n      case '[object Int32Array]':\n      case '[object Float32Array]':\n      case '[object Float64Array]':\n      case '[object Uint8Array]':\n      case '[object Uint8ClampedArray]':\n      case '[object Uint16Array]':\n      case '[object Uint32Array]':\n        return new source.constructor(copyElement(source.buffer));\n\n      case '[object ArrayBuffer]':\n        //Support: IE10\n        if (!source.slice) {\n          var copied = new ArrayBuffer(source.byteLength);\n          new Uint8Array(copied).set(new Uint8Array(source));\n          return copied;\n        }\n        return source.slice(0);\n\n      case '[object Boolean]':\n      case '[object Number]':\n      case '[object String]':\n      case '[object Date]':\n        return new source.constructor(source.valueOf());\n\n      case '[object RegExp]':\n        var re = new RegExp(source.source, source.toString().match(/[^\\/]*$/)[0]);\n        re.lastIndex = source.lastIndex;\n        return re;\n\n      case '[object Blob]':\n        return new source.constructor([source], {type: source.type});\n    }\n\n    if (isFunction(source.cloneNode)) {\n      return source.cloneNode(true);\n    }\n  }\n}\n\n/**\n * Creates a shallow copy of an object, an array or a primitive.\n *\n * Assumes that there are no proto properties for objects.\n */\nfunction shallowCopy(src, dst) {\n  if (isArray(src)) {\n    dst = dst || [];\n\n    for (var i = 0, ii = src.length; i < ii; i++) {\n      dst[i] = src[i];\n    }\n  } else if (isObject(src)) {\n    dst = dst || {};\n\n    for (var key in src) {\n      if (!(key.charAt(0) === '$' && key.charAt(1) === '$')) {\n        dst[key] = src[key];\n      }\n    }\n  }\n\n  return dst || src;\n}\n\n\n/**\n * @ngdoc function\n * @name angular.equals\n * @module ng\n * @kind function\n *\n * @description\n * Determines if two objects or two values are equivalent. Supports value types, regular\n * expressions, arrays and objects.\n *\n * Two objects or values are considered equivalent if at least one of the following is true:\n *\n * * Both objects or values pass `===` comparison.\n * * Both objects or values are of the same type and all of their properties are equal by\n *   comparing them with `angular.equals`.\n * * Both values are NaN. (In JavaScript, NaN == NaN => false. But we consider two NaN as equal)\n * * Both values represent the same regular expression (In JavaScript,\n *   /abc/ == /abc/ => false. But we consider two regular expressions as equal when their textual\n *   representation matches).\n *\n * During a property comparison, properties of `function` type and properties with names\n * that begin with `$` are ignored.\n *\n * Scope and DOMWindow objects are being compared only by identify (`===`).\n *\n * @param {*} o1 Object or value to compare.\n * @param {*} o2 Object or value to compare.\n * @returns {boolean} True if arguments are equal.\n *\n * @example\n   <example module=\"equalsExample\" name=\"equalsExample\">\n     <file name=\"index.html\">\n      <div ng-controller=\"ExampleController\">\n        <form novalidate>\n          <h3>User 1</h3>\n          Name: <input type=\"text\" ng-model=\"user1.name\">\n          Age: <input type=\"number\" ng-model=\"user1.age\">\n\n          <h3>User 2</h3>\n          Name: <input type=\"text\" ng-model=\"user2.name\">\n          Age: <input type=\"number\" ng-model=\"user2.age\">\n\n          <div>\n            <br/>\n            <input type=\"button\" value=\"Compare\" ng-click=\"compare()\">\n          </div>\n          User 1: <pre>{{user1 | json}}</pre>\n          User 2: <pre>{{user2 | json}}</pre>\n          Equal: <pre>{{result}}</pre>\n        </form>\n      </div>\n    </file>\n    <file name=\"script.js\">\n        angular.module('equalsExample', []).controller('ExampleController', ['$scope', function($scope) {\n          $scope.user1 = {};\n          $scope.user2 = {};\n          $scope.result;\n          $scope.compare = function() {\n            $scope.result = angular.equals($scope.user1, $scope.user2);\n          };\n        }]);\n    </file>\n  </example>\n */\nfunction equals(o1, o2) {\n  if (o1 === o2) return true;\n  if (o1 === null || o2 === null) return false;\n  if (o1 !== o1 && o2 !== o2) return true; // NaN === NaN\n  var t1 = typeof o1, t2 = typeof o2, length, key, keySet;\n  if (t1 == t2 && t1 == 'object') {\n    if (isArray(o1)) {\n      if (!isArray(o2)) return false;\n      if ((length = o1.length) == o2.length) {\n        for (key = 0; key < length; key++) {\n          if (!equals(o1[key], o2[key])) return false;\n        }\n        return true;\n      }\n    } else if (isDate(o1)) {\n      if (!isDate(o2)) return false;\n      return equals(o1.getTime(), o2.getTime());\n    } else if (isRegExp(o1)) {\n      if (!isRegExp(o2)) return false;\n      return o1.toString() == o2.toString();\n    } else {\n      if (isScope(o1) || isScope(o2) || isWindow(o1) || isWindow(o2) ||\n        isArray(o2) || isDate(o2) || isRegExp(o2)) return false;\n      keySet = createMap();\n      for (key in o1) {\n        if (key.charAt(0) === '$' || isFunction(o1[key])) continue;\n        if (!equals(o1[key], o2[key])) return false;\n        keySet[key] = true;\n      }\n      for (key in o2) {\n        if (!(key in keySet) &&\n            key.charAt(0) !== '$' &&\n            isDefined(o2[key]) &&\n            !isFunction(o2[key])) return false;\n      }\n      return true;\n    }\n  }\n  return false;\n}\n\nvar csp = function() {\n  if (!isDefined(csp.rules)) {\n\n\n    var ngCspElement = (window.document.querySelector('[ng-csp]') ||\n                    window.document.querySelector('[data-ng-csp]'));\n\n    if (ngCspElement) {\n      var ngCspAttribute = ngCspElement.getAttribute('ng-csp') ||\n                    ngCspElement.getAttribute('data-ng-csp');\n      csp.rules = {\n        noUnsafeEval: !ngCspAttribute || (ngCspAttribute.indexOf('no-unsafe-eval') !== -1),\n        noInlineStyle: !ngCspAttribute || (ngCspAttribute.indexOf('no-inline-style') !== -1)\n      };\n    } else {\n      csp.rules = {\n        noUnsafeEval: noUnsafeEval(),\n        noInlineStyle: false\n      };\n    }\n  }\n\n  return csp.rules;\n\n  function noUnsafeEval() {\n    try {\n      /* jshint -W031, -W054 */\n      new Function('');\n      /* jshint +W031, +W054 */\n      return false;\n    } catch (e) {\n      return true;\n    }\n  }\n};\n\n/**\n * @ngdoc directive\n * @module ng\n * @name ngJq\n *\n * @element ANY\n * @param {string=} ngJq the name of the library available under `window`\n * to be used for angular.element\n * @description\n * Use this directive to force the angular.element library.  This should be\n * used to force either jqLite by leaving ng-jq blank or setting the name of\n * the jquery variable under window (eg. jQuery).\n *\n * Since angular looks for this directive when it is loaded (doesn't wait for the\n * DOMContentLoaded event), it must be placed on an element that comes before the script\n * which loads angular. Also, only the first instance of `ng-jq` will be used and all\n * others ignored.\n *\n * @example\n * This example shows how to force jqLite using the `ngJq` directive to the `html` tag.\n ```html\n <!doctype html>\n <html ng-app ng-jq>\n ...\n ...\n </html>\n ```\n * @example\n * This example shows how to use a jQuery based library of a different name.\n * The library name must be available at the top most 'window'.\n ```html\n <!doctype html>\n <html ng-app ng-jq=\"jQueryLib\">\n ...\n ...\n </html>\n ```\n */\nvar jq = function() {\n  if (isDefined(jq.name_)) return jq.name_;\n  var el;\n  var i, ii = ngAttrPrefixes.length, prefix, name;\n  for (i = 0; i < ii; ++i) {\n    prefix = ngAttrPrefixes[i];\n    if (el = window.document.querySelector('[' + prefix.replace(':', '\\\\:') + 'jq]')) {\n      name = el.getAttribute(prefix + 'jq');\n      break;\n    }\n  }\n\n  return (jq.name_ = name);\n};\n\nfunction concat(array1, array2, index) {\n  return array1.concat(slice.call(array2, index));\n}\n\nfunction sliceArgs(args, startIndex) {\n  return slice.call(args, startIndex || 0);\n}\n\n\n/* jshint -W101 */\n/**\n * @ngdoc function\n * @name angular.bind\n * @module ng\n * @kind function\n *\n * @description\n * Returns a function which calls function `fn` bound to `self` (`self` becomes the `this` for\n * `fn`). You can supply optional `args` that are prebound to the function. This feature is also\n * known as [partial application](http://en.wikipedia.org/wiki/Partial_application), as\n * distinguished from [function currying](http://en.wikipedia.org/wiki/Currying#Contrast_with_partial_function_application).\n *\n * @param {Object} self Context which `fn` should be evaluated in.\n * @param {function()} fn Function to be bound.\n * @param {...*} args Optional arguments to be prebound to the `fn` function call.\n * @returns {function()} Function that wraps the `fn` with all the specified bindings.\n */\n/* jshint +W101 */\nfunction bind(self, fn) {\n  var curryArgs = arguments.length > 2 ? sliceArgs(arguments, 2) : [];\n  if (isFunction(fn) && !(fn instanceof RegExp)) {\n    return curryArgs.length\n      ? function() {\n          return arguments.length\n            ? fn.apply(self, concat(curryArgs, arguments, 0))\n            : fn.apply(self, curryArgs);\n        }\n      : function() {\n          return arguments.length\n            ? fn.apply(self, arguments)\n            : fn.call(self);\n        };\n  } else {\n    // in IE, native methods are not functions so they cannot be bound (note: they don't need to be)\n    return fn;\n  }\n}\n\n\nfunction toJsonReplacer(key, value) {\n  var val = value;\n\n  if (typeof key === 'string' && key.charAt(0) === '$' && key.charAt(1) === '$') {\n    val = undefined;\n  } else if (isWindow(value)) {\n    val = '$WINDOW';\n  } else if (value &&  window.document === value) {\n    val = '$DOCUMENT';\n  } else if (isScope(value)) {\n    val = '$SCOPE';\n  }\n\n  return val;\n}\n\n\n/**\n * @ngdoc function\n * @name angular.toJson\n * @module ng\n * @kind function\n *\n * @description\n * Serializes input into a JSON-formatted string. Properties with leading $$ characters will be\n * stripped since angular uses this notation internally.\n *\n * @param {Object|Array|Date|string|number} obj Input to be serialized into JSON.\n * @param {boolean|number} [pretty=2] If set to true, the JSON output will contain newlines and whitespace.\n *    If set to an integer, the JSON output will contain that many spaces per indentation.\n * @returns {string|undefined} JSON-ified string representing `obj`.\n */\nfunction toJson(obj, pretty) {\n  if (isUndefined(obj)) return undefined;\n  if (!isNumber(pretty)) {\n    pretty = pretty ? 2 : null;\n  }\n  return JSON.stringify(obj, toJsonReplacer, pretty);\n}\n\n\n/**\n * @ngdoc function\n * @name angular.fromJson\n * @module ng\n * @kind function\n *\n * @description\n * Deserializes a JSON string.\n *\n * @param {string} json JSON string to deserialize.\n * @returns {Object|Array|string|number} Deserialized JSON string.\n */\nfunction fromJson(json) {\n  return isString(json)\n      ? JSON.parse(json)\n      : json;\n}\n\n\nvar ALL_COLONS = /:/g;\nfunction timezoneToOffset(timezone, fallback) {\n  // IE/Edge do not \"understand\" colon (`:`) in timezone\n  timezone = timezone.replace(ALL_COLONS, '');\n  var requestedTimezoneOffset = Date.parse('Jan 01, 1970 00:00:00 ' + timezone) / 60000;\n  return isNaN(requestedTimezoneOffset) ? fallback : requestedTimezoneOffset;\n}\n\n\nfunction addDateMinutes(date, minutes) {\n  date = new Date(date.getTime());\n  date.setMinutes(date.getMinutes() + minutes);\n  return date;\n}\n\n\nfunction convertTimezoneToLocal(date, timezone, reverse) {\n  reverse = reverse ? -1 : 1;\n  var dateTimezoneOffset = date.getTimezoneOffset();\n  var timezoneOffset = timezoneToOffset(timezone, dateTimezoneOffset);\n  return addDateMinutes(date, reverse * (timezoneOffset - dateTimezoneOffset));\n}\n\n\n/**\n * @returns {string} Returns the string representation of the element.\n */\nfunction startingTag(element) {\n  element = jqLite(element).clone();\n  try {\n    // turns out IE does not let you set .html() on elements which\n    // are not allowed to have children. So we just ignore it.\n    element.empty();\n  } catch (e) {}\n  var elemHtml = jqLite('<div>').append(element).html();\n  try {\n    return element[0].nodeType === NODE_TYPE_TEXT ? lowercase(elemHtml) :\n        elemHtml.\n          match(/^(<[^>]+>)/)[1].\n          replace(/^<([\\w\\-]+)/, function(match, nodeName) {return '<' + lowercase(nodeName);});\n  } catch (e) {\n    return lowercase(elemHtml);\n  }\n\n}\n\n\n/////////////////////////////////////////////////\n\n/**\n * Tries to decode the URI component without throwing an exception.\n *\n * @private\n * @param str value potential URI component to check.\n * @returns {boolean} True if `value` can be decoded\n * with the decodeURIComponent function.\n */\nfunction tryDecodeURIComponent(value) {\n  try {\n    return decodeURIComponent(value);\n  } catch (e) {\n    // Ignore any invalid uri component\n  }\n}\n\n\n/**\n * Parses an escaped url query string into key-value pairs.\n * @returns {Object.<string,boolean|Array>}\n */\nfunction parseKeyValue(/**string*/keyValue) {\n  var obj = {};\n  forEach((keyValue || \"\").split('&'), function(keyValue) {\n    var splitPoint, key, val;\n    if (keyValue) {\n      key = keyValue = keyValue.replace(/\\+/g,'%20');\n      splitPoint = keyValue.indexOf('=');\n      if (splitPoint !== -1) {\n        key = keyValue.substring(0, splitPoint);\n        val = keyValue.substring(splitPoint + 1);\n      }\n      key = tryDecodeURIComponent(key);\n      if (isDefined(key)) {\n        val = isDefined(val) ? tryDecodeURIComponent(val) : true;\n        if (!hasOwnProperty.call(obj, key)) {\n          obj[key] = val;\n        } else if (isArray(obj[key])) {\n          obj[key].push(val);\n        } else {\n          obj[key] = [obj[key],val];\n        }\n      }\n    }\n  });\n  return obj;\n}\n\nfunction toKeyValue(obj) {\n  var parts = [];\n  forEach(obj, function(value, key) {\n    if (isArray(value)) {\n      forEach(value, function(arrayValue) {\n        parts.push(encodeUriQuery(key, true) +\n                   (arrayValue === true ? '' : '=' + encodeUriQuery(arrayValue, true)));\n      });\n    } else {\n    parts.push(encodeUriQuery(key, true) +\n               (value === true ? '' : '=' + encodeUriQuery(value, true)));\n    }\n  });\n  return parts.length ? parts.join('&') : '';\n}\n\n\n/**\n * We need our custom method because encodeURIComponent is too aggressive and doesn't follow\n * http://www.ietf.org/rfc/rfc3986.txt with regards to the character set (pchar) allowed in path\n * segments:\n *    segment       = *pchar\n *    pchar         = unreserved / pct-encoded / sub-delims / \":\" / \"@\"\n *    pct-encoded   = \"%\" HEXDIG HEXDIG\n *    unreserved    = ALPHA / DIGIT / \"-\" / \".\" / \"_\" / \"~\"\n *    sub-delims    = \"!\" / \"$\" / \"&\" / \"'\" / \"(\" / \")\"\n *                     / \"*\" / \"+\" / \",\" / \";\" / \"=\"\n */\nfunction encodeUriSegment(val) {\n  return encodeUriQuery(val, true).\n             replace(/%26/gi, '&').\n             replace(/%3D/gi, '=').\n             replace(/%2B/gi, '+');\n}\n\n\n/**\n * This method is intended for encoding *key* or *value* parts of query component. We need a custom\n * method because encodeURIComponent is too aggressive and encodes stuff that doesn't have to be\n * encoded per http://tools.ietf.org/html/rfc3986:\n *    query       = *( pchar / \"/\" / \"?\" )\n *    pchar         = unreserved / pct-encoded / sub-delims / \":\" / \"@\"\n *    unreserved    = ALPHA / DIGIT / \"-\" / \".\" / \"_\" / \"~\"\n *    pct-encoded   = \"%\" HEXDIG HEXDIG\n *    sub-delims    = \"!\" / \"$\" / \"&\" / \"'\" / \"(\" / \")\"\n *                     / \"*\" / \"+\" / \",\" / \";\" / \"=\"\n */\nfunction encodeUriQuery(val, pctEncodeSpaces) {\n  return encodeURIComponent(val).\n             replace(/%40/gi, '@').\n             replace(/%3A/gi, ':').\n             replace(/%24/g, '$').\n             replace(/%2C/gi, ',').\n             replace(/%3B/gi, ';').\n             replace(/%20/g, (pctEncodeSpaces ? '%20' : '+'));\n}\n\nvar ngAttrPrefixes = ['ng-', 'data-ng-', 'ng:', 'x-ng-'];\n\nfunction getNgAttribute(element, ngAttr) {\n  var attr, i, ii = ngAttrPrefixes.length;\n  for (i = 0; i < ii; ++i) {\n    attr = ngAttrPrefixes[i] + ngAttr;\n    if (isString(attr = element.getAttribute(attr))) {\n      return attr;\n    }\n  }\n  return null;\n}\n\n/**\n * @ngdoc directive\n * @name ngApp\n * @module ng\n *\n * @element ANY\n * @param {angular.Module} ngApp an optional application\n *   {@link angular.module module} name to load.\n * @param {boolean=} ngStrictDi if this attribute is present on the app element, the injector will be\n *   created in \"strict-di\" mode. This means that the application will fail to invoke functions which\n *   do not use explicit function annotation (and are thus unsuitable for minification), as described\n *   in {@link guide/di the Dependency Injection guide}, and useful debugging info will assist in\n *   tracking down the root of these bugs.\n *\n * @description\n *\n * Use this directive to **auto-bootstrap** an AngularJS application. The `ngApp` directive\n * designates the **root element** of the application and is typically placed near the root element\n * of the page - e.g. on the `<body>` or `<html>` tags.\n *\n * There are a few things to keep in mind when using `ngApp`:\n * - only one AngularJS application can be auto-bootstrapped per HTML document. The first `ngApp`\n *   found in the document will be used to define the root element to auto-bootstrap as an\n *   application. To run multiple applications in an HTML document you must manually bootstrap them using\n *   {@link angular.bootstrap} instead.\n * - AngularJS applications cannot be nested within each other.\n * - Do not use a directive that uses {@link ng.$compile#transclusion transclusion} on the same element as `ngApp`.\n *   This includes directives such as {@link ng.ngIf `ngIf`}, {@link ng.ngInclude `ngInclude`} and\n *   {@link ngRoute.ngView `ngView`}.\n *   Doing this misplaces the app {@link ng.$rootElement `$rootElement`} and the app's {@link auto.$injector injector},\n *   causing animations to stop working and making the injector inaccessible from outside the app.\n *\n * You can specify an **AngularJS module** to be used as the root module for the application.  This\n * module will be loaded into the {@link auto.$injector} when the application is bootstrapped. It\n * should contain the application code needed or have dependencies on other modules that will\n * contain the code. See {@link angular.module} for more information.\n *\n * In the example below if the `ngApp` directive were not placed on the `html` element then the\n * document would not be compiled, the `AppController` would not be instantiated and the `{{ a+b }}`\n * would not be resolved to `3`.\n *\n * `ngApp` is the easiest, and most common way to bootstrap an application.\n *\n <example module=\"ngAppDemo\">\n   <file name=\"index.html\">\n   <div ng-controller=\"ngAppDemoController\">\n     I can add: {{a}} + {{b}} =  {{ a+b }}\n   </div>\n   </file>\n   <file name=\"script.js\">\n   angular.module('ngAppDemo', []).controller('ngAppDemoController', function($scope) {\n     $scope.a = 1;\n     $scope.b = 2;\n   });\n   </file>\n </example>\n *\n * Using `ngStrictDi`, you would see something like this:\n *\n <example ng-app-included=\"true\">\n   <file name=\"index.html\">\n   <div ng-app=\"ngAppStrictDemo\" ng-strict-di>\n       <div ng-controller=\"GoodController1\">\n           I can add: {{a}} + {{b}} =  {{ a+b }}\n\n           <p>This renders because the controller does not fail to\n              instantiate, by using explicit annotation style (see\n              script.js for details)\n           </p>\n       </div>\n\n       <div ng-controller=\"GoodController2\">\n           Name: <input ng-model=\"name\"><br />\n           Hello, {{name}}!\n\n           <p>This renders because the controller does not fail to\n              instantiate, by using explicit annotation style\n              (see script.js for details)\n           </p>\n       </div>\n\n       <div ng-controller=\"BadController\">\n           I can add: {{a}} + {{b}} =  {{ a+b }}\n\n           <p>The controller could not be instantiated, due to relying\n              on automatic function annotations (which are disabled in\n              strict mode). As such, the content of this section is not\n              interpolated, and there should be an error in your web console.\n           </p>\n       </div>\n   </div>\n   </file>\n   <file name=\"script.js\">\n   angular.module('ngAppStrictDemo', [])\n     // BadController will fail to instantiate, due to relying on automatic function annotation,\n     // rather than an explicit annotation\n     .controller('BadController', function($scope) {\n       $scope.a = 1;\n       $scope.b = 2;\n     })\n     // Unlike BadController, GoodController1 and GoodController2 will not fail to be instantiated,\n     // due to using explicit annotations using the array style and $inject property, respectively.\n     .controller('GoodController1', ['$scope', function($scope) {\n       $scope.a = 1;\n       $scope.b = 2;\n     }])\n     .controller('GoodController2', GoodController2);\n     function GoodController2($scope) {\n       $scope.name = \"World\";\n     }\n     GoodController2.$inject = ['$scope'];\n   </file>\n   <file name=\"style.css\">\n   div[ng-controller] {\n       margin-bottom: 1em;\n       -webkit-border-radius: 4px;\n       border-radius: 4px;\n       border: 1px solid;\n       padding: .5em;\n   }\n   div[ng-controller^=Good] {\n       border-color: #d6e9c6;\n       background-color: #dff0d8;\n       color: #3c763d;\n   }\n   div[ng-controller^=Bad] {\n       border-color: #ebccd1;\n       background-color: #f2dede;\n       color: #a94442;\n       margin-bottom: 0;\n   }\n   </file>\n </example>\n */\nfunction angularInit(element, bootstrap) {\n  var appElement,\n      module,\n      config = {};\n\n  // The element `element` has priority over any other element\n  forEach(ngAttrPrefixes, function(prefix) {\n    var name = prefix + 'app';\n\n    if (!appElement && element.hasAttribute && element.hasAttribute(name)) {\n      appElement = element;\n      module = element.getAttribute(name);\n    }\n  });\n  forEach(ngAttrPrefixes, function(prefix) {\n    var name = prefix + 'app';\n    var candidate;\n\n    if (!appElement && (candidate = element.querySelector('[' + name.replace(':', '\\\\:') + ']'))) {\n      appElement = candidate;\n      module = candidate.getAttribute(name);\n    }\n  });\n  if (appElement) {\n    config.strictDi = getNgAttribute(appElement, \"strict-di\") !== null;\n    bootstrap(appElement, module ? [module] : [], config);\n  }\n}\n\n/**\n * @ngdoc function\n * @name angular.bootstrap\n * @module ng\n * @description\n * Use this function to manually start up angular application.\n *\n * For more information, see the {@link guide/bootstrap Bootstrap guide}.\n *\n * Angular will detect if it has been loaded into the browser more than once and only allow the\n * first loaded script to be bootstrapped and will report a warning to the browser console for\n * each of the subsequent scripts. This prevents strange results in applications, where otherwise\n * multiple instances of Angular try to work on the DOM.\n *\n * <div class=\"alert alert-warning\">\n * **Note:** Protractor based end-to-end tests cannot use this function to bootstrap manually.\n * They must use {@link ng.directive:ngApp ngApp}.\n * </div>\n *\n * <div class=\"alert alert-warning\">\n * **Note:** Do not bootstrap the app on an element with a directive that uses {@link ng.$compile#transclusion transclusion},\n * such as {@link ng.ngIf `ngIf`}, {@link ng.ngInclude `ngInclude`} and {@link ngRoute.ngView `ngView`}.\n * Doing this misplaces the app {@link ng.$rootElement `$rootElement`} and the app's {@link auto.$injector injector},\n * causing animations to stop working and making the injector inaccessible from outside the app.\n * </div>\n *\n * ```html\n * <!doctype html>\n * <html>\n * <body>\n * <div ng-controller=\"WelcomeController\">\n *   {{greeting}}\n * </div>\n *\n * <script src=\"angular.js\"></script>\n * <script>\n *   var app = angular.module('demo', [])\n *   .controller('WelcomeController', function($scope) {\n *       $scope.greeting = 'Welcome!';\n *   });\n *   angular.bootstrap(document, ['demo']);\n * </script>\n * </body>\n * </html>\n * ```\n *\n * @param {DOMElement} element DOM element which is the root of angular application.\n * @param {Array<String|Function|Array>=} modules an array of modules to load into the application.\n *     Each item in the array should be the name of a predefined module or a (DI annotated)\n *     function that will be invoked by the injector as a `config` block.\n *     See: {@link angular.module modules}\n * @param {Object=} config an object for defining configuration options for the application. The\n *     following keys are supported:\n *\n * * `strictDi` - disable automatic function annotation for the application. This is meant to\n *   assist in finding bugs which break minified code. Defaults to `false`.\n *\n * @returns {auto.$injector} Returns the newly created injector for this app.\n */\nfunction bootstrap(element, modules, config) {\n  if (!isObject(config)) config = {};\n  var defaultConfig = {\n    strictDi: false\n  };\n  config = extend(defaultConfig, config);\n  var doBootstrap = function() {\n    element = jqLite(element);\n\n    if (element.injector()) {\n      var tag = (element[0] === window.document) ? 'document' : startingTag(element);\n      //Encode angle brackets to prevent input from being sanitized to empty string #8683\n      throw ngMinErr(\n          'btstrpd',\n          \"App already bootstrapped with this element '{0}'\",\n          tag.replace(/</,'&lt;').replace(/>/,'&gt;'));\n    }\n\n    modules = modules || [];\n    modules.unshift(['$provide', function($provide) {\n      $provide.value('$rootElement', element);\n    }]);\n\n    if (config.debugInfoEnabled) {\n      // Pushing so that this overrides `debugInfoEnabled` setting defined in user's `modules`.\n      modules.push(['$compileProvider', function($compileProvider) {\n        $compileProvider.debugInfoEnabled(true);\n      }]);\n    }\n\n    modules.unshift('ng');\n    var injector = createInjector(modules, config.strictDi);\n    injector.invoke(['$rootScope', '$rootElement', '$compile', '$injector',\n       function bootstrapApply(scope, element, compile, injector) {\n        scope.$apply(function() {\n          element.data('$injector', injector);\n          compile(element)(scope);\n        });\n      }]\n    );\n    return injector;\n  };\n\n  var NG_ENABLE_DEBUG_INFO = /^NG_ENABLE_DEBUG_INFO!/;\n  var NG_DEFER_BOOTSTRAP = /^NG_DEFER_BOOTSTRAP!/;\n\n  if (window && NG_ENABLE_DEBUG_INFO.test(window.name)) {\n    config.debugInfoEnabled = true;\n    window.name = window.name.replace(NG_ENABLE_DEBUG_INFO, '');\n  }\n\n  if (window && !NG_DEFER_BOOTSTRAP.test(window.name)) {\n    return doBootstrap();\n  }\n\n  window.name = window.name.replace(NG_DEFER_BOOTSTRAP, '');\n  angular.resumeBootstrap = function(extraModules) {\n    forEach(extraModules, function(module) {\n      modules.push(module);\n    });\n    return doBootstrap();\n  };\n\n  if (isFunction(angular.resumeDeferredBootstrap)) {\n    angular.resumeDeferredBootstrap();\n  }\n}\n\n/**\n * @ngdoc function\n * @name angular.reloadWithDebugInfo\n * @module ng\n * @description\n * Use this function to reload the current application with debug information turned on.\n * This takes precedence over a call to `$compileProvider.debugInfoEnabled(false)`.\n *\n * See {@link ng.$compileProvider#debugInfoEnabled} for more.\n */\nfunction reloadWithDebugInfo() {\n  window.name = 'NG_ENABLE_DEBUG_INFO!' + window.name;\n  window.location.reload();\n}\n\n/**\n * @name angular.getTestability\n * @module ng\n * @description\n * Get the testability service for the instance of Angular on the given\n * element.\n * @param {DOMElement} element DOM element which is the root of angular application.\n */\nfunction getTestability(rootElement) {\n  var injector = angular.element(rootElement).injector();\n  if (!injector) {\n    throw ngMinErr('test',\n      'no injector found for element argument to getTestability');\n  }\n  return injector.get('$$testability');\n}\n\nvar SNAKE_CASE_REGEXP = /[A-Z]/g;\nfunction snake_case(name, separator) {\n  separator = separator || '_';\n  return name.replace(SNAKE_CASE_REGEXP, function(letter, pos) {\n    return (pos ? separator : '') + letter.toLowerCase();\n  });\n}\n\nvar bindJQueryFired = false;\nfunction bindJQuery() {\n  var originalCleanData;\n\n  if (bindJQueryFired) {\n    return;\n  }\n\n  // bind to jQuery if present;\n  var jqName = jq();\n  jQuery = isUndefined(jqName) ? window.jQuery :   // use jQuery (if present)\n           !jqName             ? undefined     :   // use jqLite\n                                 window[jqName];   // use jQuery specified by `ngJq`\n\n  // Use jQuery if it exists with proper functionality, otherwise default to us.\n  // Angular 1.2+ requires jQuery 1.7+ for on()/off() support.\n  // Angular 1.3+ technically requires at least jQuery 2.1+ but it may work with older\n  // versions. It will not work for sure with jQuery <1.7, though.\n  if (jQuery && jQuery.fn.on) {\n    jqLite = jQuery;\n    extend(jQuery.fn, {\n      scope: JQLitePrototype.scope,\n      isolateScope: JQLitePrototype.isolateScope,\n      controller: JQLitePrototype.controller,\n      injector: JQLitePrototype.injector,\n      inheritedData: JQLitePrototype.inheritedData\n    });\n\n    // All nodes removed from the DOM via various jQuery APIs like .remove()\n    // are passed through jQuery.cleanData. Monkey-patch this method to fire\n    // the $destroy event on all removed nodes.\n    originalCleanData = jQuery.cleanData;\n    jQuery.cleanData = function(elems) {\n      var events;\n      for (var i = 0, elem; (elem = elems[i]) != null; i++) {\n        events = jQuery._data(elem, \"events\");\n        if (events && events.$destroy) {\n          jQuery(elem).triggerHandler('$destroy');\n        }\n      }\n      originalCleanData(elems);\n    };\n  } else {\n    jqLite = JQLite;\n  }\n\n  angular.element = jqLite;\n\n  // Prevent double-proxying.\n  bindJQueryFired = true;\n}\n\n/**\n * throw error if the argument is falsy.\n */\nfunction assertArg(arg, name, reason) {\n  if (!arg) {\n    throw ngMinErr('areq', \"Argument '{0}' is {1}\", (name || '?'), (reason || \"required\"));\n  }\n  return arg;\n}\n\nfunction assertArgFn(arg, name, acceptArrayAnnotation) {\n  if (acceptArrayAnnotation && isArray(arg)) {\n      arg = arg[arg.length - 1];\n  }\n\n  assertArg(isFunction(arg), name, 'not a function, got ' +\n      (arg && typeof arg === 'object' ? arg.constructor.name || 'Object' : typeof arg));\n  return arg;\n}\n\n/**\n * throw error if the name given is hasOwnProperty\n * @param  {String} name    the name to test\n * @param  {String} context the context in which the name is used, such as module or directive\n */\nfunction assertNotHasOwnProperty(name, context) {\n  if (name === 'hasOwnProperty') {\n    throw ngMinErr('badname', \"hasOwnProperty is not a valid {0} name\", context);\n  }\n}\n\n/**\n * Return the value accessible from the object by path. Any undefined traversals are ignored\n * @param {Object} obj starting object\n * @param {String} path path to traverse\n * @param {boolean} [bindFnToScope=true]\n * @returns {Object} value as accessible by path\n */\n//TODO(misko): this function needs to be removed\nfunction getter(obj, path, bindFnToScope) {\n  if (!path) return obj;\n  var keys = path.split('.');\n  var key;\n  var lastInstance = obj;\n  var len = keys.length;\n\n  for (var i = 0; i < len; i++) {\n    key = keys[i];\n    if (obj) {\n      obj = (lastInstance = obj)[key];\n    }\n  }\n  if (!bindFnToScope && isFunction(obj)) {\n    return bind(lastInstance, obj);\n  }\n  return obj;\n}\n\n/**\n * Return the DOM siblings between the first and last node in the given array.\n * @param {Array} array like object\n * @returns {Array} the inputted object or a jqLite collection containing the nodes\n */\nfunction getBlockNodes(nodes) {\n  // TODO(perf): update `nodes` instead of creating a new object?\n  var node = nodes[0];\n  var endNode = nodes[nodes.length - 1];\n  var blockNodes;\n\n  for (var i = 1; node !== endNode && (node = node.nextSibling); i++) {\n    if (blockNodes || nodes[i] !== node) {\n      if (!blockNodes) {\n        blockNodes = jqLite(slice.call(nodes, 0, i));\n      }\n      blockNodes.push(node);\n    }\n  }\n\n  return blockNodes || nodes;\n}\n\n\n/**\n * Creates a new object without a prototype. This object is useful for lookup without having to\n * guard against prototypically inherited properties via hasOwnProperty.\n *\n * Related micro-benchmarks:\n * - http://jsperf.com/object-create2\n * - http://jsperf.com/proto-map-lookup/2\n * - http://jsperf.com/for-in-vs-object-keys2\n *\n * @returns {Object}\n */\nfunction createMap() {\n  return Object.create(null);\n}\n\nvar NODE_TYPE_ELEMENT = 1;\nvar NODE_TYPE_ATTRIBUTE = 2;\nvar NODE_TYPE_TEXT = 3;\nvar NODE_TYPE_COMMENT = 8;\nvar NODE_TYPE_DOCUMENT = 9;\nvar NODE_TYPE_DOCUMENT_FRAGMENT = 11;\n\n/**\n * @ngdoc type\n * @name angular.Module\n * @module ng\n * @description\n *\n * Interface for configuring angular {@link angular.module modules}.\n */\n\nfunction setupModuleLoader(window) {\n\n  var $injectorMinErr = minErr('$injector');\n  var ngMinErr = minErr('ng');\n\n  function ensure(obj, name, factory) {\n    return obj[name] || (obj[name] = factory());\n  }\n\n  var angular = ensure(window, 'angular', Object);\n\n  // We need to expose `angular.$$minErr` to modules such as `ngResource` that reference it during bootstrap\n  angular.$$minErr = angular.$$minErr || minErr;\n\n  return ensure(angular, 'module', function() {\n    /** @type {Object.<string, angular.Module>} */\n    var modules = {};\n\n    /**\n     * @ngdoc function\n     * @name angular.module\n     * @module ng\n     * @description\n     *\n     * The `angular.module` is a global place for creating, registering and retrieving Angular\n     * modules.\n     * All modules (angular core or 3rd party) that should be available to an application must be\n     * registered using this mechanism.\n     *\n     * Passing one argument retrieves an existing {@link angular.Module},\n     * whereas passing more than one argument creates a new {@link angular.Module}\n     *\n     *\n     * # Module\n     *\n     * A module is a collection of services, directives, controllers, filters, and configuration information.\n     * `angular.module` is used to configure the {@link auto.$injector $injector}.\n     *\n     * ```js\n     * // Create a new module\n     * var myModule = angular.module('myModule', []);\n     *\n     * // register a new service\n     * myModule.value('appName', 'MyCoolApp');\n     *\n     * // configure existing services inside initialization blocks.\n     * myModule.config(['$locationProvider', function($locationProvider) {\n     *   // Configure existing providers\n     *   $locationProvider.hashPrefix('!');\n     * }]);\n     * ```\n     *\n     * Then you can create an injector and load your modules like this:\n     *\n     * ```js\n     * var injector = angular.injector(['ng', 'myModule'])\n     * ```\n     *\n     * However it's more likely that you'll just use\n     * {@link ng.directive:ngApp ngApp} or\n     * {@link angular.bootstrap} to simplify this process for you.\n     *\n     * @param {!string} name The name of the module to create or retrieve.\n     * @param {!Array.<string>=} requires If specified then new module is being created. If\n     *        unspecified then the module is being retrieved for further configuration.\n     * @param {Function=} configFn Optional configuration function for the module. Same as\n     *        {@link angular.Module#config Module#config()}.\n     * @returns {angular.Module} new module with the {@link angular.Module} api.\n     */\n    return function module(name, requires, configFn) {\n      var assertNotHasOwnProperty = function(name, context) {\n        if (name === 'hasOwnProperty') {\n          throw ngMinErr('badname', 'hasOwnProperty is not a valid {0} name', context);\n        }\n      };\n\n      assertNotHasOwnProperty(name, 'module');\n      if (requires && modules.hasOwnProperty(name)) {\n        modules[name] = null;\n      }\n      return ensure(modules, name, function() {\n        if (!requires) {\n          throw $injectorMinErr('nomod', \"Module '{0}' is not available! You either misspelled \" +\n             \"the module name or forgot to load it. If registering a module ensure that you \" +\n             \"specify the dependencies as the second argument.\", name);\n        }\n\n        /** @type {!Array.<Array.<*>>} */\n        var invokeQueue = [];\n\n        /** @type {!Array.<Function>} */\n        var configBlocks = [];\n\n        /** @type {!Array.<Function>} */\n        var runBlocks = [];\n\n        var config = invokeLater('$injector', 'invoke', 'push', configBlocks);\n\n        /** @type {angular.Module} */\n        var moduleInstance = {\n          // Private state\n          _invokeQueue: invokeQueue,\n          _configBlocks: configBlocks,\n          _runBlocks: runBlocks,\n\n          /**\n           * @ngdoc property\n           * @name angular.Module#requires\n           * @module ng\n           *\n           * @description\n           * Holds the list of modules which the injector will load before the current module is\n           * loaded.\n           */\n          requires: requires,\n\n          /**\n           * @ngdoc property\n           * @name angular.Module#name\n           * @module ng\n           *\n           * @description\n           * Name of the module.\n           */\n          name: name,\n\n\n          /**\n           * @ngdoc method\n           * @name angular.Module#provider\n           * @module ng\n           * @param {string} name service name\n           * @param {Function} providerType Construction function for creating new instance of the\n           *                                service.\n           * @description\n           * See {@link auto.$provide#provider $provide.provider()}.\n           */\n          provider: invokeLaterAndSetModuleName('$provide', 'provider'),\n\n          /**\n           * @ngdoc method\n           * @name angular.Module#factory\n           * @module ng\n           * @param {string} name service name\n           * @param {Function} providerFunction Function for creating new instance of the service.\n           * @description\n           * See {@link auto.$provide#factory $provide.factory()}.\n           */\n          factory: invokeLaterAndSetModuleName('$provide', 'factory'),\n\n          /**\n           * @ngdoc method\n           * @name angular.Module#service\n           * @module ng\n           * @param {string} name service name\n           * @param {Function} constructor A constructor function that will be instantiated.\n           * @description\n           * See {@link auto.$provide#service $provide.service()}.\n           */\n          service: invokeLaterAndSetModuleName('$provide', 'service'),\n\n          /**\n           * @ngdoc method\n           * @name angular.Module#value\n           * @module ng\n           * @param {string} name service name\n           * @param {*} object Service instance object.\n           * @description\n           * See {@link auto.$provide#value $provide.value()}.\n           */\n          value: invokeLater('$provide', 'value'),\n\n          /**\n           * @ngdoc method\n           * @name angular.Module#constant\n           * @module ng\n           * @param {string} name constant name\n           * @param {*} object Constant value.\n           * @description\n           * Because the constants are fixed, they get applied before other provide methods.\n           * See {@link auto.$provide#constant $provide.constant()}.\n           */\n          constant: invokeLater('$provide', 'constant', 'unshift'),\n\n           /**\n           * @ngdoc method\n           * @name angular.Module#decorator\n           * @module ng\n           * @param {string} name The name of the service to decorate.\n           * @param {Function} decorFn This function will be invoked when the service needs to be\n           *                           instantiated and should return the decorated service instance.\n           * @description\n           * See {@link auto.$provide#decorator $provide.decorator()}.\n           */\n          decorator: invokeLaterAndSetModuleName('$provide', 'decorator'),\n\n          /**\n           * @ngdoc method\n           * @name angular.Module#animation\n           * @module ng\n           * @param {string} name animation name\n           * @param {Function} animationFactory Factory function for creating new instance of an\n           *                                    animation.\n           * @description\n           *\n           * **NOTE**: animations take effect only if the **ngAnimate** module is loaded.\n           *\n           *\n           * Defines an animation hook that can be later used with\n           * {@link $animate $animate} service and directives that use this service.\n           *\n           * ```js\n           * module.animation('.animation-name', function($inject1, $inject2) {\n           *   return {\n           *     eventName : function(element, done) {\n           *       //code to run the animation\n           *       //once complete, then run done()\n           *       return function cancellationFunction(element) {\n           *         //code to cancel the animation\n           *       }\n           *     }\n           *   }\n           * })\n           * ```\n           *\n           * See {@link ng.$animateProvider#register $animateProvider.register()} and\n           * {@link ngAnimate ngAnimate module} for more information.\n           */\n          animation: invokeLaterAndSetModuleName('$animateProvider', 'register'),\n\n          /**\n           * @ngdoc method\n           * @name angular.Module#filter\n           * @module ng\n           * @param {string} name Filter name - this must be a valid angular expression identifier\n           * @param {Function} filterFactory Factory function for creating new instance of filter.\n           * @description\n           * See {@link ng.$filterProvider#register $filterProvider.register()}.\n           *\n           * <div class=\"alert alert-warning\">\n           * **Note:** Filter names must be valid angular {@link expression} identifiers, such as `uppercase` or `orderBy`.\n           * Names with special characters, such as hyphens and dots, are not allowed. If you wish to namespace\n           * your filters, then you can use capitalization (`myappSubsectionFilterx`) or underscores\n           * (`myapp_subsection_filterx`).\n           * </div>\n           */\n          filter: invokeLaterAndSetModuleName('$filterProvider', 'register'),\n\n          /**\n           * @ngdoc method\n           * @name angular.Module#controller\n           * @module ng\n           * @param {string|Object} name Controller name, or an object map of controllers where the\n           *    keys are the names and the values are the constructors.\n           * @param {Function} constructor Controller constructor function.\n           * @description\n           * See {@link ng.$controllerProvider#register $controllerProvider.register()}.\n           */\n          controller: invokeLaterAndSetModuleName('$controllerProvider', 'register'),\n\n          /**\n           * @ngdoc method\n           * @name angular.Module#directive\n           * @module ng\n           * @param {string|Object} name Directive name, or an object map of directives where the\n           *    keys are the names and the values are the factories.\n           * @param {Function} directiveFactory Factory function for creating new instance of\n           * directives.\n           * @description\n           * See {@link ng.$compileProvider#directive $compileProvider.directive()}.\n           */\n          directive: invokeLaterAndSetModuleName('$compileProvider', 'directive'),\n\n          /**\n           * @ngdoc method\n           * @name angular.Module#component\n           * @module ng\n           * @param {string} name Name of the component in camel-case (i.e. myComp which will match as my-comp)\n           * @param {Object} options Component definition object (a simplified\n           *    {@link ng.$compile#directive-definition-object directive definition object})\n           *\n           * @description\n           * See {@link ng.$compileProvider#component $compileProvider.component()}.\n           */\n          component: invokeLaterAndSetModuleName('$compileProvider', 'component'),\n\n          /**\n           * @ngdoc method\n           * @name angular.Module#config\n           * @module ng\n           * @param {Function} configFn Execute this function on module load. Useful for service\n           *    configuration.\n           * @description\n           * Use this method to register work which needs to be performed on module loading.\n           * For more about how to configure services, see\n           * {@link providers#provider-recipe Provider Recipe}.\n           */\n          config: config,\n\n          /**\n           * @ngdoc method\n           * @name angular.Module#run\n           * @module ng\n           * @param {Function} initializationFn Execute this function after injector creation.\n           *    Useful for application initialization.\n           * @description\n           * Use this method to register work which should be performed when the injector is done\n           * loading all modules.\n           */\n          run: function(block) {\n            runBlocks.push(block);\n            return this;\n          }\n        };\n\n        if (configFn) {\n          config(configFn);\n        }\n\n        return moduleInstance;\n\n        /**\n         * @param {string} provider\n         * @param {string} method\n         * @param {String=} insertMethod\n         * @returns {angular.Module}\n         */\n        function invokeLater(provider, method, insertMethod, queue) {\n          if (!queue) queue = invokeQueue;\n          return function() {\n            queue[insertMethod || 'push']([provider, method, arguments]);\n            return moduleInstance;\n          };\n        }\n\n        /**\n         * @param {string} provider\n         * @param {string} method\n         * @returns {angular.Module}\n         */\n        function invokeLaterAndSetModuleName(provider, method) {\n          return function(recipeName, factoryFunction) {\n            if (factoryFunction && isFunction(factoryFunction)) factoryFunction.$$moduleName = name;\n            invokeQueue.push([provider, method, arguments]);\n            return moduleInstance;\n          };\n        }\n      });\n    };\n  });\n\n}\n\n/* global: toDebugString: true */\n\nfunction serializeObject(obj) {\n  var seen = [];\n\n  return JSON.stringify(obj, function(key, val) {\n    val = toJsonReplacer(key, val);\n    if (isObject(val)) {\n\n      if (seen.indexOf(val) >= 0) return '...';\n\n      seen.push(val);\n    }\n    return val;\n  });\n}\n\nfunction toDebugString(obj) {\n  if (typeof obj === 'function') {\n    return obj.toString().replace(/ \\{[\\s\\S]*$/, '');\n  } else if (isUndefined(obj)) {\n    return 'undefined';\n  } else if (typeof obj !== 'string') {\n    return serializeObject(obj);\n  }\n  return obj;\n}\n\n/* global angularModule: true,\n  version: true,\n\n  $CompileProvider,\n\n  htmlAnchorDirective,\n  inputDirective,\n  inputDirective,\n  formDirective,\n  scriptDirective,\n  selectDirective,\n  styleDirective,\n  optionDirective,\n  ngBindDirective,\n  ngBindHtmlDirective,\n  ngBindTemplateDirective,\n  ngClassDirective,\n  ngClassEvenDirective,\n  ngClassOddDirective,\n  ngCloakDirective,\n  ngControllerDirective,\n  ngFormDirective,\n  ngHideDirective,\n  ngIfDirective,\n  ngIncludeDirective,\n  ngIncludeFillContentDirective,\n  ngInitDirective,\n  ngNonBindableDirective,\n  ngPluralizeDirective,\n  ngRepeatDirective,\n  ngShowDirective,\n  ngStyleDirective,\n  ngSwitchDirective,\n  ngSwitchWhenDirective,\n  ngSwitchDefaultDirective,\n  ngOptionsDirective,\n  ngTranscludeDirective,\n  ngModelDirective,\n  ngListDirective,\n  ngChangeDirective,\n  patternDirective,\n  patternDirective,\n  requiredDirective,\n  requiredDirective,\n  minlengthDirective,\n  minlengthDirective,\n  maxlengthDirective,\n  maxlengthDirective,\n  ngValueDirective,\n  ngModelOptionsDirective,\n  ngAttributeAliasDirectives,\n  ngEventDirectives,\n\n  $AnchorScrollProvider,\n  $AnimateProvider,\n  $CoreAnimateCssProvider,\n  $$CoreAnimateJsProvider,\n  $$CoreAnimateQueueProvider,\n  $$AnimateRunnerFactoryProvider,\n  $$AnimateAsyncRunFactoryProvider,\n  $BrowserProvider,\n  $CacheFactoryProvider,\n  $ControllerProvider,\n  $DateProvider,\n  $DocumentProvider,\n  $ExceptionHandlerProvider,\n  $FilterProvider,\n  $$ForceReflowProvider,\n  $InterpolateProvider,\n  $IntervalProvider,\n  $$HashMapProvider,\n  $HttpProvider,\n  $HttpParamSerializerProvider,\n  $HttpParamSerializerJQLikeProvider,\n  $HttpBackendProvider,\n  $xhrFactoryProvider,\n  $LocationProvider,\n  $LogProvider,\n  $ParseProvider,\n  $RootScopeProvider,\n  $QProvider,\n  $$QProvider,\n  $$SanitizeUriProvider,\n  $SceProvider,\n  $SceDelegateProvider,\n  $SnifferProvider,\n  $TemplateCacheProvider,\n  $TemplateRequestProvider,\n  $$TestabilityProvider,\n  $TimeoutProvider,\n  $$RAFProvider,\n  $WindowProvider,\n  $$jqLiteProvider,\n  $$CookieReaderProvider\n*/\n\n\n/**\n * @ngdoc object\n * @name angular.version\n * @module ng\n * @description\n * An object that contains information about the current AngularJS version.\n *\n * This object has the following properties:\n *\n * - `full` – `{string}` – Full version string, such as \"0.9.18\".\n * - `major` – `{number}` – Major version number, such as \"0\".\n * - `minor` – `{number}` – Minor version number, such as \"9\".\n * - `dot` – `{number}` – Dot version number, such as \"18\".\n * - `codeName` – `{string}` – Code name of the release, such as \"jiggling-armfat\".\n */\nvar version = {\n  full: '1.5.5',    // all of these placeholder strings will be replaced by grunt's\n  major: 1,    // package task\n  minor: 5,\n  dot: 5,\n  codeName: 'material-conspiration'\n};\n\n\nfunction publishExternalAPI(angular) {\n  extend(angular, {\n    'bootstrap': bootstrap,\n    'copy': copy,\n    'extend': extend,\n    'merge': merge,\n    'equals': equals,\n    'element': jqLite,\n    'forEach': forEach,\n    'injector': createInjector,\n    'noop': noop,\n    'bind': bind,\n    'toJson': toJson,\n    'fromJson': fromJson,\n    'identity': identity,\n    'isUndefined': isUndefined,\n    'isDefined': isDefined,\n    'isString': isString,\n    'isFunction': isFunction,\n    'isObject': isObject,\n    'isNumber': isNumber,\n    'isElement': isElement,\n    'isArray': isArray,\n    'version': version,\n    'isDate': isDate,\n    'lowercase': lowercase,\n    'uppercase': uppercase,\n    'callbacks': {counter: 0},\n    'getTestability': getTestability,\n    '$$minErr': minErr,\n    '$$csp': csp,\n    'reloadWithDebugInfo': reloadWithDebugInfo\n  });\n\n  angularModule = setupModuleLoader(window);\n\n  angularModule('ng', ['ngLocale'], ['$provide',\n    function ngModule($provide) {\n      // $$sanitizeUriProvider needs to be before $compileProvider as it is used by it.\n      $provide.provider({\n        $$sanitizeUri: $$SanitizeUriProvider\n      });\n      $provide.provider('$compile', $CompileProvider).\n        directive({\n            a: htmlAnchorDirective,\n            input: inputDirective,\n            textarea: inputDirective,\n            form: formDirective,\n            script: scriptDirective,\n            select: selectDirective,\n            style: styleDirective,\n            option: optionDirective,\n            ngBind: ngBindDirective,\n            ngBindHtml: ngBindHtmlDirective,\n            ngBindTemplate: ngBindTemplateDirective,\n            ngClass: ngClassDirective,\n            ngClassEven: ngClassEvenDirective,\n            ngClassOdd: ngClassOddDirective,\n            ngCloak: ngCloakDirective,\n            ngController: ngControllerDirective,\n            ngForm: ngFormDirective,\n            ngHide: ngHideDirective,\n            ngIf: ngIfDirective,\n            ngInclude: ngIncludeDirective,\n            ngInit: ngInitDirective,\n            ngNonBindable: ngNonBindableDirective,\n            ngPluralize: ngPluralizeDirective,\n            ngRepeat: ngRepeatDirective,\n            ngShow: ngShowDirective,\n            ngStyle: ngStyleDirective,\n            ngSwitch: ngSwitchDirective,\n            ngSwitchWhen: ngSwitchWhenDirective,\n            ngSwitchDefault: ngSwitchDefaultDirective,\n            ngOptions: ngOptionsDirective,\n            ngTransclude: ngTranscludeDirective,\n            ngModel: ngModelDirective,\n            ngList: ngListDirective,\n            ngChange: ngChangeDirective,\n            pattern: patternDirective,\n            ngPattern: patternDirective,\n            required: requiredDirective,\n            ngRequired: requiredDirective,\n            minlength: minlengthDirective,\n            ngMinlength: minlengthDirective,\n            maxlength: maxlengthDirective,\n            ngMaxlength: maxlengthDirective,\n            ngValue: ngValueDirective,\n            ngModelOptions: ngModelOptionsDirective\n        }).\n        directive({\n          ngInclude: ngIncludeFillContentDirective\n        }).\n        directive(ngAttributeAliasDirectives).\n        directive(ngEventDirectives);\n      $provide.provider({\n        $anchorScroll: $AnchorScrollProvider,\n        $animate: $AnimateProvider,\n        $animateCss: $CoreAnimateCssProvider,\n        $$animateJs: $$CoreAnimateJsProvider,\n        $$animateQueue: $$CoreAnimateQueueProvider,\n        $$AnimateRunner: $$AnimateRunnerFactoryProvider,\n        $$animateAsyncRun: $$AnimateAsyncRunFactoryProvider,\n        $browser: $BrowserProvider,\n        $cacheFactory: $CacheFactoryProvider,\n        $controller: $ControllerProvider,\n        $document: $DocumentProvider,\n        $exceptionHandler: $ExceptionHandlerProvider,\n        $filter: $FilterProvider,\n        $$forceReflow: $$ForceReflowProvider,\n        $interpolate: $InterpolateProvider,\n        $interval: $IntervalProvider,\n        $http: $HttpProvider,\n        $httpParamSerializer: $HttpParamSerializerProvider,\n        $httpParamSerializerJQLike: $HttpParamSerializerJQLikeProvider,\n        $httpBackend: $HttpBackendProvider,\n        $xhrFactory: $xhrFactoryProvider,\n        $location: $LocationProvider,\n        $log: $LogProvider,\n        $parse: $ParseProvider,\n        $rootScope: $RootScopeProvider,\n        $q: $QProvider,\n        $$q: $$QProvider,\n        $sce: $SceProvider,\n        $sceDelegate: $SceDelegateProvider,\n        $sniffer: $SnifferProvider,\n        $templateCache: $TemplateCacheProvider,\n        $templateRequest: $TemplateRequestProvider,\n        $$testability: $$TestabilityProvider,\n        $timeout: $TimeoutProvider,\n        $window: $WindowProvider,\n        $$rAF: $$RAFProvider,\n        $$jqLite: $$jqLiteProvider,\n        $$HashMap: $$HashMapProvider,\n        $$cookieReader: $$CookieReaderProvider\n      });\n    }\n  ]);\n}\n\n/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n *     Any commits to this file should be reviewed with security in mind.  *\n *   Changes to this file can potentially create security vulnerabilities. *\n *          An approval from 2 Core members with history of modifying      *\n *                         this file is required.                          *\n *                                                                         *\n *  Does the change somehow allow for arbitrary javascript to be executed? *\n *    Or allows for someone to change the prototype of built-in objects?   *\n *     Or gives undesired access to variables likes document or window?    *\n * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */\n\n/* global JQLitePrototype: true,\n  addEventListenerFn: true,\n  removeEventListenerFn: true,\n  BOOLEAN_ATTR: true,\n  ALIASED_ATTR: true,\n*/\n\n//////////////////////////////////\n//JQLite\n//////////////////////////////////\n\n/**\n * @ngdoc function\n * @name angular.element\n * @module ng\n * @kind function\n *\n * @description\n * Wraps a raw DOM element or HTML string as a [jQuery](http://jquery.com) element.\n *\n * If jQuery is available, `angular.element` is an alias for the\n * [jQuery](http://api.jquery.com/jQuery/) function. If jQuery is not available, `angular.element`\n * delegates to Angular's built-in subset of jQuery, called \"jQuery lite\" or **jqLite**.\n *\n * jqLite is a tiny, API-compatible subset of jQuery that allows\n * Angular to manipulate the DOM in a cross-browser compatible way. jqLite implements only the most\n * commonly needed functionality with the goal of having a very small footprint.\n *\n * To use `jQuery`, simply ensure it is loaded before the `angular.js` file. You can also use the\n * {@link ngJq `ngJq`} directive to specify that jqlite should be used over jQuery, or to use a\n * specific version of jQuery if multiple versions exist on the page.\n *\n * <div class=\"alert alert-info\">**Note:** All element references in Angular are always wrapped with jQuery or\n * jqLite (such as the element argument in a directive's compile / link function). They are never raw DOM references.</div>\n *\n * <div class=\"alert alert-warning\">**Note:** Keep in mind that this function will not find elements\n * by tag name / CSS selector. For lookups by tag name, try instead `angular.element(document).find(...)`\n * or `$document.find()`, or use the standard DOM APIs, e.g. `document.querySelectorAll()`.</div>\n *\n * ## Angular's jqLite\n * jqLite provides only the following jQuery methods:\n *\n * - [`addClass()`](http://api.jquery.com/addClass/)\n * - [`after()`](http://api.jquery.com/after/)\n * - [`append()`](http://api.jquery.com/append/)\n * - [`attr()`](http://api.jquery.com/attr/) - Does not support functions as parameters\n * - [`bind()`](http://api.jquery.com/bind/) - Does not support namespaces, selectors or eventData\n * - [`children()`](http://api.jquery.com/children/) - Does not support selectors\n * - [`clone()`](http://api.jquery.com/clone/)\n * - [`contents()`](http://api.jquery.com/contents/)\n * - [`css()`](http://api.jquery.com/css/) - Only retrieves inline-styles, does not call `getComputedStyle()`.\n *   As a setter, does not convert numbers to strings or append 'px', and also does not have automatic property prefixing.\n * - [`data()`](http://api.jquery.com/data/)\n * - [`detach()`](http://api.jquery.com/detach/)\n * - [`empty()`](http://api.jquery.com/empty/)\n * - [`eq()`](http://api.jquery.com/eq/)\n * - [`find()`](http://api.jquery.com/find/) - Limited to lookups by tag name\n * - [`hasClass()`](http://api.jquery.com/hasClass/)\n * - [`html()`](http://api.jquery.com/html/)\n * - [`next()`](http://api.jquery.com/next/) - Does not support selectors\n * - [`on()`](http://api.jquery.com/on/) - Does not support namespaces, selectors or eventData\n * - [`off()`](http://api.jquery.com/off/) - Does not support namespaces, selectors or event object as parameter\n * - [`one()`](http://api.jquery.com/one/) - Does not support namespaces or selectors\n * - [`parent()`](http://api.jquery.com/parent/) - Does not support selectors\n * - [`prepend()`](http://api.jquery.com/prepend/)\n * - [`prop()`](http://api.jquery.com/prop/)\n * - [`ready()`](http://api.jquery.com/ready/)\n * - [`remove()`](http://api.jquery.com/remove/)\n * - [`removeAttr()`](http://api.jquery.com/removeAttr/)\n * - [`removeClass()`](http://api.jquery.com/removeClass/)\n * - [`removeData()`](http://api.jquery.com/removeData/)\n * - [`replaceWith()`](http://api.jquery.com/replaceWith/)\n * - [`text()`](http://api.jquery.com/text/)\n * - [`toggleClass()`](http://api.jquery.com/toggleClass/)\n * - [`triggerHandler()`](http://api.jquery.com/triggerHandler/) - Passes a dummy event object to handlers.\n * - [`unbind()`](http://api.jquery.com/unbind/) - Does not support namespaces or event object as parameter\n * - [`val()`](http://api.jquery.com/val/)\n * - [`wrap()`](http://api.jquery.com/wrap/)\n *\n * ## jQuery/jqLite Extras\n * Angular also provides the following additional methods and events to both jQuery and jqLite:\n *\n * ### Events\n * - `$destroy` - AngularJS intercepts all jqLite/jQuery's DOM destruction apis and fires this event\n *    on all DOM nodes being removed.  This can be used to clean up any 3rd party bindings to the DOM\n *    element before it is removed.\n *\n * ### Methods\n * - `controller(name)` - retrieves the controller of the current element or its parent. By default\n *   retrieves controller associated with the `ngController` directive. If `name` is provided as\n *   camelCase directive name, then the controller for this directive will be retrieved (e.g.\n *   `'ngModel'`).\n * - `injector()` - retrieves the injector of the current element or its parent.\n * - `scope()` - retrieves the {@link ng.$rootScope.Scope scope} of the current\n *   element or its parent. Requires {@link guide/production#disabling-debug-data Debug Data} to\n *   be enabled.\n * - `isolateScope()` - retrieves an isolate {@link ng.$rootScope.Scope scope} if one is attached directly to the\n *   current element. This getter should be used only on elements that contain a directive which starts a new isolate\n *   scope. Calling `scope()` on this element always returns the original non-isolate scope.\n *   Requires {@link guide/production#disabling-debug-data Debug Data} to be enabled.\n * - `inheritedData()` - same as `data()`, but walks up the DOM until a value is found or the top\n *   parent element is reached.\n *\n * @knownIssue You cannot spy on `angular.element` if you are using Jasmine version 1.x. See\n * https://github.com/angular/angular.js/issues/14251 for more information.\n *\n * @param {string|DOMElement} element HTML string or DOMElement to be wrapped into jQuery.\n * @returns {Object} jQuery object.\n */\n\nJQLite.expando = 'ng339';\n\nvar jqCache = JQLite.cache = {},\n    jqId = 1,\n    addEventListenerFn = function(element, type, fn) {\n      element.addEventListener(type, fn, false);\n    },\n    removeEventListenerFn = function(element, type, fn) {\n      element.removeEventListener(type, fn, false);\n    };\n\n/*\n * !!! This is an undocumented \"private\" function !!!\n */\nJQLite._data = function(node) {\n  //jQuery always returns an object on cache miss\n  return this.cache[node[this.expando]] || {};\n};\n\nfunction jqNextId() { return ++jqId; }\n\n\nvar SPECIAL_CHARS_REGEXP = /([\\:\\-\\_]+(.))/g;\nvar MOZ_HACK_REGEXP = /^moz([A-Z])/;\nvar MOUSE_EVENT_MAP= { mouseleave: \"mouseout\", mouseenter: \"mouseover\"};\nvar jqLiteMinErr = minErr('jqLite');\n\n/**\n * Converts snake_case to camelCase.\n * Also there is special case for Moz prefix starting with upper case letter.\n * @param name Name to normalize\n */\nfunction camelCase(name) {\n  return name.\n    replace(SPECIAL_CHARS_REGEXP, function(_, separator, letter, offset) {\n      return offset ? letter.toUpperCase() : letter;\n    }).\n    replace(MOZ_HACK_REGEXP, 'Moz$1');\n}\n\nvar SINGLE_TAG_REGEXP = /^<([\\w-]+)\\s*\\/?>(?:<\\/\\1>|)$/;\nvar HTML_REGEXP = /<|&#?\\w+;/;\nvar TAG_NAME_REGEXP = /<([\\w:-]+)/;\nvar XHTML_TAG_REGEXP = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\\w:-]+)[^>]*)\\/>/gi;\n\nvar wrapMap = {\n  'option': [1, '<select multiple=\"multiple\">', '</select>'],\n\n  'thead': [1, '<table>', '</table>'],\n  'col': [2, '<table><colgroup>', '</colgroup></table>'],\n  'tr': [2, '<table><tbody>', '</tbody></table>'],\n  'td': [3, '<table><tbody><tr>', '</tr></tbody></table>'],\n  '_default': [0, \"\", \"\"]\n};\n\nwrapMap.optgroup = wrapMap.option;\nwrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;\nwrapMap.th = wrapMap.td;\n\n\nfunction jqLiteIsTextNode(html) {\n  return !HTML_REGEXP.test(html);\n}\n\nfunction jqLiteAcceptsData(node) {\n  // The window object can accept data but has no nodeType\n  // Otherwise we are only interested in elements (1) and documents (9)\n  var nodeType = node.nodeType;\n  return nodeType === NODE_TYPE_ELEMENT || !nodeType || nodeType === NODE_TYPE_DOCUMENT;\n}\n\nfunction jqLiteHasData(node) {\n  for (var key in jqCache[node.ng339]) {\n    return true;\n  }\n  return false;\n}\n\nfunction jqLiteCleanData(nodes) {\n  for (var i = 0, ii = nodes.length; i < ii; i++) {\n    jqLiteRemoveData(nodes[i]);\n  }\n}\n\nfunction jqLiteBuildFragment(html, context) {\n  var tmp, tag, wrap,\n      fragment = context.createDocumentFragment(),\n      nodes = [], i;\n\n  if (jqLiteIsTextNode(html)) {\n    // Convert non-html into a text node\n    nodes.push(context.createTextNode(html));\n  } else {\n    // Convert html into DOM nodes\n    tmp = tmp || fragment.appendChild(context.createElement(\"div\"));\n    tag = (TAG_NAME_REGEXP.exec(html) || [\"\", \"\"])[1].toLowerCase();\n    wrap = wrapMap[tag] || wrapMap._default;\n    tmp.innerHTML = wrap[1] + html.replace(XHTML_TAG_REGEXP, \"<$1></$2>\") + wrap[2];\n\n    // Descend through wrappers to the right content\n    i = wrap[0];\n    while (i--) {\n      tmp = tmp.lastChild;\n    }\n\n    nodes = concat(nodes, tmp.childNodes);\n\n    tmp = fragment.firstChild;\n    tmp.textContent = \"\";\n  }\n\n  // Remove wrapper from fragment\n  fragment.textContent = \"\";\n  fragment.innerHTML = \"\"; // Clear inner HTML\n  forEach(nodes, function(node) {\n    fragment.appendChild(node);\n  });\n\n  return fragment;\n}\n\nfunction jqLiteParseHTML(html, context) {\n  context = context || window.document;\n  var parsed;\n\n  if ((parsed = SINGLE_TAG_REGEXP.exec(html))) {\n    return [context.createElement(parsed[1])];\n  }\n\n  if ((parsed = jqLiteBuildFragment(html, context))) {\n    return parsed.childNodes;\n  }\n\n  return [];\n}\n\nfunction jqLiteWrapNode(node, wrapper) {\n  var parent = node.parentNode;\n\n  if (parent) {\n    parent.replaceChild(wrapper, node);\n  }\n\n  wrapper.appendChild(node);\n}\n\n\n// IE9-11 has no method \"contains\" in SVG element and in Node.prototype. Bug #10259.\nvar jqLiteContains = window.Node.prototype.contains || function(arg) {\n  // jshint bitwise: false\n  return !!(this.compareDocumentPosition(arg) & 16);\n  // jshint bitwise: true\n};\n\n/////////////////////////////////////////////\nfunction JQLite(element) {\n  if (element instanceof JQLite) {\n    return element;\n  }\n\n  var argIsString;\n\n  if (isString(element)) {\n    element = trim(element);\n    argIsString = true;\n  }\n  if (!(this instanceof JQLite)) {\n    if (argIsString && element.charAt(0) != '<') {\n      throw jqLiteMinErr('nosel', 'Looking up elements via selectors is not supported by jqLite! See: http://docs.angularjs.org/api/angular.element');\n    }\n    return new JQLite(element);\n  }\n\n  if (argIsString) {\n    jqLiteAddNodes(this, jqLiteParseHTML(element));\n  } else {\n    jqLiteAddNodes(this, element);\n  }\n}\n\nfunction jqLiteClone(element) {\n  return element.cloneNode(true);\n}\n\nfunction jqLiteDealoc(element, onlyDescendants) {\n  if (!onlyDescendants) jqLiteRemoveData(element);\n\n  if (element.querySelectorAll) {\n    var descendants = element.querySelectorAll('*');\n    for (var i = 0, l = descendants.length; i < l; i++) {\n      jqLiteRemoveData(descendants[i]);\n    }\n  }\n}\n\nfunction jqLiteOff(element, type, fn, unsupported) {\n  if (isDefined(unsupported)) throw jqLiteMinErr('offargs', 'jqLite#off() does not support the `selector` argument');\n\n  var expandoStore = jqLiteExpandoStore(element);\n  var events = expandoStore && expandoStore.events;\n  var handle = expandoStore && expandoStore.handle;\n\n  if (!handle) return; //no listeners registered\n\n  if (!type) {\n    for (type in events) {\n      if (type !== '$destroy') {\n        removeEventListenerFn(element, type, handle);\n      }\n      delete events[type];\n    }\n  } else {\n\n    var removeHandler = function(type) {\n      var listenerFns = events[type];\n      if (isDefined(fn)) {\n        arrayRemove(listenerFns || [], fn);\n      }\n      if (!(isDefined(fn) && listenerFns && listenerFns.length > 0)) {\n        removeEventListenerFn(element, type, handle);\n        delete events[type];\n      }\n    };\n\n    forEach(type.split(' '), function(type) {\n      removeHandler(type);\n      if (MOUSE_EVENT_MAP[type]) {\n        removeHandler(MOUSE_EVENT_MAP[type]);\n      }\n    });\n  }\n}\n\nfunction jqLiteRemoveData(element, name) {\n  var expandoId = element.ng339;\n  var expandoStore = expandoId && jqCache[expandoId];\n\n  if (expandoStore) {\n    if (name) {\n      delete expandoStore.data[name];\n      return;\n    }\n\n    if (expandoStore.handle) {\n      if (expandoStore.events.$destroy) {\n        expandoStore.handle({}, '$destroy');\n      }\n      jqLiteOff(element);\n    }\n    delete jqCache[expandoId];\n    element.ng339 = undefined; // don't delete DOM expandos. IE and Chrome don't like it\n  }\n}\n\n\nfunction jqLiteExpandoStore(element, createIfNecessary) {\n  var expandoId = element.ng339,\n      expandoStore = expandoId && jqCache[expandoId];\n\n  if (createIfNecessary && !expandoStore) {\n    element.ng339 = expandoId = jqNextId();\n    expandoStore = jqCache[expandoId] = {events: {}, data: {}, handle: undefined};\n  }\n\n  return expandoStore;\n}\n\n\nfunction jqLiteData(element, key, value) {\n  if (jqLiteAcceptsData(element)) {\n\n    var isSimpleSetter = isDefined(value);\n    var isSimpleGetter = !isSimpleSetter && key && !isObject(key);\n    var massGetter = !key;\n    var expandoStore = jqLiteExpandoStore(element, !isSimpleGetter);\n    var data = expandoStore && expandoStore.data;\n\n    if (isSimpleSetter) { // data('key', value)\n      data[key] = value;\n    } else {\n      if (massGetter) {  // data()\n        return data;\n      } else {\n        if (isSimpleGetter) { // data('key')\n          // don't force creation of expandoStore if it doesn't exist yet\n          return data && data[key];\n        } else { // mass-setter: data({key1: val1, key2: val2})\n          extend(data, key);\n        }\n      }\n    }\n  }\n}\n\nfunction jqLiteHasClass(element, selector) {\n  if (!element.getAttribute) return false;\n  return ((\" \" + (element.getAttribute('class') || '') + \" \").replace(/[\\n\\t]/g, \" \").\n      indexOf(\" \" + selector + \" \") > -1);\n}\n\nfunction jqLiteRemoveClass(element, cssClasses) {\n  if (cssClasses && element.setAttribute) {\n    forEach(cssClasses.split(' '), function(cssClass) {\n      element.setAttribute('class', trim(\n          (\" \" + (element.getAttribute('class') || '') + \" \")\n          .replace(/[\\n\\t]/g, \" \")\n          .replace(\" \" + trim(cssClass) + \" \", \" \"))\n      );\n    });\n  }\n}\n\nfunction jqLiteAddClass(element, cssClasses) {\n  if (cssClasses && element.setAttribute) {\n    var existingClasses = (' ' + (element.getAttribute('class') || '') + ' ')\n                            .replace(/[\\n\\t]/g, \" \");\n\n    forEach(cssClasses.split(' '), function(cssClass) {\n      cssClass = trim(cssClass);\n      if (existingClasses.indexOf(' ' + cssClass + ' ') === -1) {\n        existingClasses += cssClass + ' ';\n      }\n    });\n\n    element.setAttribute('class', trim(existingClasses));\n  }\n}\n\n\nfunction jqLiteAddNodes(root, elements) {\n  // THIS CODE IS VERY HOT. Don't make changes without benchmarking.\n\n  if (elements) {\n\n    // if a Node (the most common case)\n    if (elements.nodeType) {\n      root[root.length++] = elements;\n    } else {\n      var length = elements.length;\n\n      // if an Array or NodeList and not a Window\n      if (typeof length === 'number' && elements.window !== elements) {\n        if (length) {\n          for (var i = 0; i < length; i++) {\n            root[root.length++] = elements[i];\n          }\n        }\n      } else {\n        root[root.length++] = elements;\n      }\n    }\n  }\n}\n\n\nfunction jqLiteController(element, name) {\n  return jqLiteInheritedData(element, '$' + (name || 'ngController') + 'Controller');\n}\n\nfunction jqLiteInheritedData(element, name, value) {\n  // if element is the document object work with the html element instead\n  // this makes $(document).scope() possible\n  if (element.nodeType == NODE_TYPE_DOCUMENT) {\n    element = element.documentElement;\n  }\n  var names = isArray(name) ? name : [name];\n\n  while (element) {\n    for (var i = 0, ii = names.length; i < ii; i++) {\n      if (isDefined(value = jqLite.data(element, names[i]))) return value;\n    }\n\n    // If dealing with a document fragment node with a host element, and no parent, use the host\n    // element as the parent. This enables directives within a Shadow DOM or polyfilled Shadow DOM\n    // to lookup parent controllers.\n    element = element.parentNode || (element.nodeType === NODE_TYPE_DOCUMENT_FRAGMENT && element.host);\n  }\n}\n\nfunction jqLiteEmpty(element) {\n  jqLiteDealoc(element, true);\n  while (element.firstChild) {\n    element.removeChild(element.firstChild);\n  }\n}\n\nfunction jqLiteRemove(element, keepData) {\n  if (!keepData) jqLiteDealoc(element);\n  var parent = element.parentNode;\n  if (parent) parent.removeChild(element);\n}\n\n\nfunction jqLiteDocumentLoaded(action, win) {\n  win = win || window;\n  if (win.document.readyState === 'complete') {\n    // Force the action to be run async for consistent behavior\n    // from the action's point of view\n    // i.e. it will definitely not be in a $apply\n    win.setTimeout(action);\n  } else {\n    // No need to unbind this handler as load is only ever called once\n    jqLite(win).on('load', action);\n  }\n}\n\n//////////////////////////////////////////\n// Functions which are declared directly.\n//////////////////////////////////////////\nvar JQLitePrototype = JQLite.prototype = {\n  ready: function(fn) {\n    var fired = false;\n\n    function trigger() {\n      if (fired) return;\n      fired = true;\n      fn();\n    }\n\n    // check if document is already loaded\n    if (window.document.readyState === 'complete') {\n      window.setTimeout(trigger);\n    } else {\n      this.on('DOMContentLoaded', trigger); // works for modern browsers and IE9\n      // we can not use jqLite since we are not done loading and jQuery could be loaded later.\n      // jshint -W064\n      JQLite(window).on('load', trigger); // fallback to window.onload for others\n      // jshint +W064\n    }\n  },\n  toString: function() {\n    var value = [];\n    forEach(this, function(e) { value.push('' + e);});\n    return '[' + value.join(', ') + ']';\n  },\n\n  eq: function(index) {\n      return (index >= 0) ? jqLite(this[index]) : jqLite(this[this.length + index]);\n  },\n\n  length: 0,\n  push: push,\n  sort: [].sort,\n  splice: [].splice\n};\n\n//////////////////////////////////////////\n// Functions iterating getter/setters.\n// these functions return self on setter and\n// value on get.\n//////////////////////////////////////////\nvar BOOLEAN_ATTR = {};\nforEach('multiple,selected,checked,disabled,readOnly,required,open'.split(','), function(value) {\n  BOOLEAN_ATTR[lowercase(value)] = value;\n});\nvar BOOLEAN_ELEMENTS = {};\nforEach('input,select,option,textarea,button,form,details'.split(','), function(value) {\n  BOOLEAN_ELEMENTS[value] = true;\n});\nvar ALIASED_ATTR = {\n  'ngMinlength': 'minlength',\n  'ngMaxlength': 'maxlength',\n  'ngMin': 'min',\n  'ngMax': 'max',\n  'ngPattern': 'pattern'\n};\n\nfunction getBooleanAttrName(element, name) {\n  // check dom last since we will most likely fail on name\n  var booleanAttr = BOOLEAN_ATTR[name.toLowerCase()];\n\n  // booleanAttr is here twice to minimize DOM access\n  return booleanAttr && BOOLEAN_ELEMENTS[nodeName_(element)] && booleanAttr;\n}\n\nfunction getAliasedAttrName(name) {\n  return ALIASED_ATTR[name];\n}\n\nforEach({\n  data: jqLiteData,\n  removeData: jqLiteRemoveData,\n  hasData: jqLiteHasData,\n  cleanData: jqLiteCleanData\n}, function(fn, name) {\n  JQLite[name] = fn;\n});\n\nforEach({\n  data: jqLiteData,\n  inheritedData: jqLiteInheritedData,\n\n  scope: function(element) {\n    // Can't use jqLiteData here directly so we stay compatible with jQuery!\n    return jqLite.data(element, '$scope') || jqLiteInheritedData(element.parentNode || element, ['$isolateScope', '$scope']);\n  },\n\n  isolateScope: function(element) {\n    // Can't use jqLiteData here directly so we stay compatible with jQuery!\n    return jqLite.data(element, '$isolateScope') || jqLite.data(element, '$isolateScopeNoTemplate');\n  },\n\n  controller: jqLiteController,\n\n  injector: function(element) {\n    return jqLiteInheritedData(element, '$injector');\n  },\n\n  removeAttr: function(element, name) {\n    element.removeAttribute(name);\n  },\n\n  hasClass: jqLiteHasClass,\n\n  css: function(element, name, value) {\n    name = camelCase(name);\n\n    if (isDefined(value)) {\n      element.style[name] = value;\n    } else {\n      return element.style[name];\n    }\n  },\n\n  attr: function(element, name, value) {\n    var nodeType = element.nodeType;\n    if (nodeType === NODE_TYPE_TEXT || nodeType === NODE_TYPE_ATTRIBUTE || nodeType === NODE_TYPE_COMMENT) {\n      return;\n    }\n    var lowercasedName = lowercase(name);\n    if (BOOLEAN_ATTR[lowercasedName]) {\n      if (isDefined(value)) {\n        if (!!value) {\n          element[name] = true;\n          element.setAttribute(name, lowercasedName);\n        } else {\n          element[name] = false;\n          element.removeAttribute(lowercasedName);\n        }\n      } else {\n        return (element[name] ||\n                 (element.attributes.getNamedItem(name) || noop).specified)\n               ? lowercasedName\n               : undefined;\n      }\n    } else if (isDefined(value)) {\n      element.setAttribute(name, value);\n    } else if (element.getAttribute) {\n      // the extra argument \"2\" is to get the right thing for a.href in IE, see jQuery code\n      // some elements (e.g. Document) don't have get attribute, so return undefined\n      var ret = element.getAttribute(name, 2);\n      // normalize non-existing attributes to undefined (as jQuery)\n      return ret === null ? undefined : ret;\n    }\n  },\n\n  prop: function(element, name, value) {\n    if (isDefined(value)) {\n      element[name] = value;\n    } else {\n      return element[name];\n    }\n  },\n\n  text: (function() {\n    getText.$dv = '';\n    return getText;\n\n    function getText(element, value) {\n      if (isUndefined(value)) {\n        var nodeType = element.nodeType;\n        return (nodeType === NODE_TYPE_ELEMENT || nodeType === NODE_TYPE_TEXT) ? element.textContent : '';\n      }\n      element.textContent = value;\n    }\n  })(),\n\n  val: function(element, value) {\n    if (isUndefined(value)) {\n      if (element.multiple && nodeName_(element) === 'select') {\n        var result = [];\n        forEach(element.options, function(option) {\n          if (option.selected) {\n            result.push(option.value || option.text);\n          }\n        });\n        return result.length === 0 ? null : result;\n      }\n      return element.value;\n    }\n    element.value = value;\n  },\n\n  html: function(element, value) {\n    if (isUndefined(value)) {\n      return element.innerHTML;\n    }\n    jqLiteDealoc(element, true);\n    element.innerHTML = value;\n  },\n\n  empty: jqLiteEmpty\n}, function(fn, name) {\n  /**\n   * Properties: writes return selection, reads return first value\n   */\n  JQLite.prototype[name] = function(arg1, arg2) {\n    var i, key;\n    var nodeCount = this.length;\n\n    // jqLiteHasClass has only two arguments, but is a getter-only fn, so we need to special-case it\n    // in a way that survives minification.\n    // jqLiteEmpty takes no arguments but is a setter.\n    if (fn !== jqLiteEmpty &&\n        (isUndefined((fn.length == 2 && (fn !== jqLiteHasClass && fn !== jqLiteController)) ? arg1 : arg2))) {\n      if (isObject(arg1)) {\n\n        // we are a write, but the object properties are the key/values\n        for (i = 0; i < nodeCount; i++) {\n          if (fn === jqLiteData) {\n            // data() takes the whole object in jQuery\n            fn(this[i], arg1);\n          } else {\n            for (key in arg1) {\n              fn(this[i], key, arg1[key]);\n            }\n          }\n        }\n        // return self for chaining\n        return this;\n      } else {\n        // we are a read, so read the first child.\n        // TODO: do we still need this?\n        var value = fn.$dv;\n        // Only if we have $dv do we iterate over all, otherwise it is just the first element.\n        var jj = (isUndefined(value)) ? Math.min(nodeCount, 1) : nodeCount;\n        for (var j = 0; j < jj; j++) {\n          var nodeValue = fn(this[j], arg1, arg2);\n          value = value ? value + nodeValue : nodeValue;\n        }\n        return value;\n      }\n    } else {\n      // we are a write, so apply to all children\n      for (i = 0; i < nodeCount; i++) {\n        fn(this[i], arg1, arg2);\n      }\n      // return self for chaining\n      return this;\n    }\n  };\n});\n\nfunction createEventHandler(element, events) {\n  var eventHandler = function(event, type) {\n    // jQuery specific api\n    event.isDefaultPrevented = function() {\n      return event.defaultPrevented;\n    };\n\n    var eventFns = events[type || event.type];\n    var eventFnsLength = eventFns ? eventFns.length : 0;\n\n    if (!eventFnsLength) return;\n\n    if (isUndefined(event.immediatePropagationStopped)) {\n      var originalStopImmediatePropagation = event.stopImmediatePropagation;\n      event.stopImmediatePropagation = function() {\n        event.immediatePropagationStopped = true;\n\n        if (event.stopPropagation) {\n          event.stopPropagation();\n        }\n\n        if (originalStopImmediatePropagation) {\n          originalStopImmediatePropagation.call(event);\n        }\n      };\n    }\n\n    event.isImmediatePropagationStopped = function() {\n      return event.immediatePropagationStopped === true;\n    };\n\n    // Some events have special handlers that wrap the real handler\n    var handlerWrapper = eventFns.specialHandlerWrapper || defaultHandlerWrapper;\n\n    // Copy event handlers in case event handlers array is modified during execution.\n    if ((eventFnsLength > 1)) {\n      eventFns = shallowCopy(eventFns);\n    }\n\n    for (var i = 0; i < eventFnsLength; i++) {\n      if (!event.isImmediatePropagationStopped()) {\n        handlerWrapper(element, event, eventFns[i]);\n      }\n    }\n  };\n\n  // TODO: this is a hack for angularMocks/clearDataCache that makes it possible to deregister all\n  //       events on `element`\n  eventHandler.elem = element;\n  return eventHandler;\n}\n\nfunction defaultHandlerWrapper(element, event, handler) {\n  handler.call(element, event);\n}\n\nfunction specialMouseHandlerWrapper(target, event, handler) {\n  // Refer to jQuery's implementation of mouseenter & mouseleave\n  // Read about mouseenter and mouseleave:\n  // http://www.quirksmode.org/js/events_mouse.html#link8\n  var related = event.relatedTarget;\n  // For mousenter/leave call the handler if related is outside the target.\n  // NB: No relatedTarget if the mouse left/entered the browser window\n  if (!related || (related !== target && !jqLiteContains.call(target, related))) {\n    handler.call(target, event);\n  }\n}\n\n//////////////////////////////////////////\n// Functions iterating traversal.\n// These functions chain results into a single\n// selector.\n//////////////////////////////////////////\nforEach({\n  removeData: jqLiteRemoveData,\n\n  on: function jqLiteOn(element, type, fn, unsupported) {\n    if (isDefined(unsupported)) throw jqLiteMinErr('onargs', 'jqLite#on() does not support the `selector` or `eventData` parameters');\n\n    // Do not add event handlers to non-elements because they will not be cleaned up.\n    if (!jqLiteAcceptsData(element)) {\n      return;\n    }\n\n    var expandoStore = jqLiteExpandoStore(element, true);\n    var events = expandoStore.events;\n    var handle = expandoStore.handle;\n\n    if (!handle) {\n      handle = expandoStore.handle = createEventHandler(element, events);\n    }\n\n    // http://jsperf.com/string-indexof-vs-split\n    var types = type.indexOf(' ') >= 0 ? type.split(' ') : [type];\n    var i = types.length;\n\n    var addHandler = function(type, specialHandlerWrapper, noEventListener) {\n      var eventFns = events[type];\n\n      if (!eventFns) {\n        eventFns = events[type] = [];\n        eventFns.specialHandlerWrapper = specialHandlerWrapper;\n        if (type !== '$destroy' && !noEventListener) {\n          addEventListenerFn(element, type, handle);\n        }\n      }\n\n      eventFns.push(fn);\n    };\n\n    while (i--) {\n      type = types[i];\n      if (MOUSE_EVENT_MAP[type]) {\n        addHandler(MOUSE_EVENT_MAP[type], specialMouseHandlerWrapper);\n        addHandler(type, undefined, true);\n      } else {\n        addHandler(type);\n      }\n    }\n  },\n\n  off: jqLiteOff,\n\n  one: function(element, type, fn) {\n    element = jqLite(element);\n\n    //add the listener twice so that when it is called\n    //you can remove the original function and still be\n    //able to call element.off(ev, fn) normally\n    element.on(type, function onFn() {\n      element.off(type, fn);\n      element.off(type, onFn);\n    });\n    element.on(type, fn);\n  },\n\n  replaceWith: function(element, replaceNode) {\n    var index, parent = element.parentNode;\n    jqLiteDealoc(element);\n    forEach(new JQLite(replaceNode), function(node) {\n      if (index) {\n        parent.insertBefore(node, index.nextSibling);\n      } else {\n        parent.replaceChild(node, element);\n      }\n      index = node;\n    });\n  },\n\n  children: function(element) {\n    var children = [];\n    forEach(element.childNodes, function(element) {\n      if (element.nodeType === NODE_TYPE_ELEMENT) {\n        children.push(element);\n      }\n    });\n    return children;\n  },\n\n  contents: function(element) {\n    return element.contentDocument || element.childNodes || [];\n  },\n\n  append: function(element, node) {\n    var nodeType = element.nodeType;\n    if (nodeType !== NODE_TYPE_ELEMENT && nodeType !== NODE_TYPE_DOCUMENT_FRAGMENT) return;\n\n    node = new JQLite(node);\n\n    for (var i = 0, ii = node.length; i < ii; i++) {\n      var child = node[i];\n      element.appendChild(child);\n    }\n  },\n\n  prepend: function(element, node) {\n    if (element.nodeType === NODE_TYPE_ELEMENT) {\n      var index = element.firstChild;\n      forEach(new JQLite(node), function(child) {\n        element.insertBefore(child, index);\n      });\n    }\n  },\n\n  wrap: function(element, wrapNode) {\n    jqLiteWrapNode(element, jqLite(wrapNode).eq(0).clone()[0]);\n  },\n\n  remove: jqLiteRemove,\n\n  detach: function(element) {\n    jqLiteRemove(element, true);\n  },\n\n  after: function(element, newElement) {\n    var index = element, parent = element.parentNode;\n    newElement = new JQLite(newElement);\n\n    for (var i = 0, ii = newElement.length; i < ii; i++) {\n      var node = newElement[i];\n      parent.insertBefore(node, index.nextSibling);\n      index = node;\n    }\n  },\n\n  addClass: jqLiteAddClass,\n  removeClass: jqLiteRemoveClass,\n\n  toggleClass: function(element, selector, condition) {\n    if (selector) {\n      forEach(selector.split(' '), function(className) {\n        var classCondition = condition;\n        if (isUndefined(classCondition)) {\n          classCondition = !jqLiteHasClass(element, className);\n        }\n        (classCondition ? jqLiteAddClass : jqLiteRemoveClass)(element, className);\n      });\n    }\n  },\n\n  parent: function(element) {\n    var parent = element.parentNode;\n    return parent && parent.nodeType !== NODE_TYPE_DOCUMENT_FRAGMENT ? parent : null;\n  },\n\n  next: function(element) {\n    return element.nextElementSibling;\n  },\n\n  find: function(element, selector) {\n    if (element.getElementsByTagName) {\n      return element.getElementsByTagName(selector);\n    } else {\n      return [];\n    }\n  },\n\n  clone: jqLiteClone,\n\n  triggerHandler: function(element, event, extraParameters) {\n\n    var dummyEvent, eventFnsCopy, handlerArgs;\n    var eventName = event.type || event;\n    var expandoStore = jqLiteExpandoStore(element);\n    var events = expandoStore && expandoStore.events;\n    var eventFns = events && events[eventName];\n\n    if (eventFns) {\n      // Create a dummy event to pass to the handlers\n      dummyEvent = {\n        preventDefault: function() { this.defaultPrevented = true; },\n        isDefaultPrevented: function() { return this.defaultPrevented === true; },\n        stopImmediatePropagation: function() { this.immediatePropagationStopped = true; },\n        isImmediatePropagationStopped: function() { return this.immediatePropagationStopped === true; },\n        stopPropagation: noop,\n        type: eventName,\n        target: element\n      };\n\n      // If a custom event was provided then extend our dummy event with it\n      if (event.type) {\n        dummyEvent = extend(dummyEvent, event);\n      }\n\n      // Copy event handlers in case event handlers array is modified during execution.\n      eventFnsCopy = shallowCopy(eventFns);\n      handlerArgs = extraParameters ? [dummyEvent].concat(extraParameters) : [dummyEvent];\n\n      forEach(eventFnsCopy, function(fn) {\n        if (!dummyEvent.isImmediatePropagationStopped()) {\n          fn.apply(element, handlerArgs);\n        }\n      });\n    }\n  }\n}, function(fn, name) {\n  /**\n   * chaining functions\n   */\n  JQLite.prototype[name] = function(arg1, arg2, arg3) {\n    var value;\n\n    for (var i = 0, ii = this.length; i < ii; i++) {\n      if (isUndefined(value)) {\n        value = fn(this[i], arg1, arg2, arg3);\n        if (isDefined(value)) {\n          // any function which returns a value needs to be wrapped\n          value = jqLite(value);\n        }\n      } else {\n        jqLiteAddNodes(value, fn(this[i], arg1, arg2, arg3));\n      }\n    }\n    return isDefined(value) ? value : this;\n  };\n\n  // bind legacy bind/unbind to on/off\n  JQLite.prototype.bind = JQLite.prototype.on;\n  JQLite.prototype.unbind = JQLite.prototype.off;\n});\n\n\n// Provider for private $$jqLite service\nfunction $$jqLiteProvider() {\n  this.$get = function $$jqLite() {\n    return extend(JQLite, {\n      hasClass: function(node, classes) {\n        if (node.attr) node = node[0];\n        return jqLiteHasClass(node, classes);\n      },\n      addClass: function(node, classes) {\n        if (node.attr) node = node[0];\n        return jqLiteAddClass(node, classes);\n      },\n      removeClass: function(node, classes) {\n        if (node.attr) node = node[0];\n        return jqLiteRemoveClass(node, classes);\n      }\n    });\n  };\n}\n\n/**\n * Computes a hash of an 'obj'.\n * Hash of a:\n *  string is string\n *  number is number as string\n *  object is either result of calling $$hashKey function on the object or uniquely generated id,\n *         that is also assigned to the $$hashKey property of the object.\n *\n * @param obj\n * @returns {string} hash string such that the same input will have the same hash string.\n *         The resulting string key is in 'type:hashKey' format.\n */\nfunction hashKey(obj, nextUidFn) {\n  var key = obj && obj.$$hashKey;\n\n  if (key) {\n    if (typeof key === 'function') {\n      key = obj.$$hashKey();\n    }\n    return key;\n  }\n\n  var objType = typeof obj;\n  if (objType == 'function' || (objType == 'object' && obj !== null)) {\n    key = obj.$$hashKey = objType + ':' + (nextUidFn || nextUid)();\n  } else {\n    key = objType + ':' + obj;\n  }\n\n  return key;\n}\n\n/**\n * HashMap which can use objects as keys\n */\nfunction HashMap(array, isolatedUid) {\n  if (isolatedUid) {\n    var uid = 0;\n    this.nextUid = function() {\n      return ++uid;\n    };\n  }\n  forEach(array, this.put, this);\n}\nHashMap.prototype = {\n  /**\n   * Store key value pair\n   * @param key key to store can be any type\n   * @param value value to store can be any type\n   */\n  put: function(key, value) {\n    this[hashKey(key, this.nextUid)] = value;\n  },\n\n  /**\n   * @param key\n   * @returns {Object} the value for the key\n   */\n  get: function(key) {\n    return this[hashKey(key, this.nextUid)];\n  },\n\n  /**\n   * Remove the key/value pair\n   * @param key\n   */\n  remove: function(key) {\n    var value = this[key = hashKey(key, this.nextUid)];\n    delete this[key];\n    return value;\n  }\n};\n\nvar $$HashMapProvider = [function() {\n  this.$get = [function() {\n    return HashMap;\n  }];\n}];\n\n/**\n * @ngdoc function\n * @module ng\n * @name angular.injector\n * @kind function\n *\n * @description\n * Creates an injector object that can be used for retrieving services as well as for\n * dependency injection (see {@link guide/di dependency injection}).\n *\n * @param {Array.<string|Function>} modules A list of module functions or their aliases. See\n *     {@link angular.module}. The `ng` module must be explicitly added.\n * @param {boolean=} [strictDi=false] Whether the injector should be in strict mode, which\n *     disallows argument name annotation inference.\n * @returns {injector} Injector object. See {@link auto.$injector $injector}.\n *\n * @example\n * Typical usage\n * ```js\n *   // create an injector\n *   var $injector = angular.injector(['ng']);\n *\n *   // use the injector to kick off your application\n *   // use the type inference to auto inject arguments, or use implicit injection\n *   $injector.invoke(function($rootScope, $compile, $document) {\n *     $compile($document)($rootScope);\n *     $rootScope.$digest();\n *   });\n * ```\n *\n * Sometimes you want to get access to the injector of a currently running Angular app\n * from outside Angular. Perhaps, you want to inject and compile some markup after the\n * application has been bootstrapped. You can do this using the extra `injector()` added\n * to JQuery/jqLite elements. See {@link angular.element}.\n *\n * *This is fairly rare but could be the case if a third party library is injecting the\n * markup.*\n *\n * In the following example a new block of HTML containing a `ng-controller`\n * directive is added to the end of the document body by JQuery. We then compile and link\n * it into the current AngularJS scope.\n *\n * ```js\n * var $div = $('<div ng-controller=\"MyCtrl\">{{content.label}}</div>');\n * $(document.body).append($div);\n *\n * angular.element(document).injector().invoke(function($compile) {\n *   var scope = angular.element($div).scope();\n *   $compile($div)(scope);\n * });\n * ```\n */\n\n\n/**\n * @ngdoc module\n * @name auto\n * @installation\n * @description\n *\n * Implicit module which gets automatically added to each {@link auto.$injector $injector}.\n */\n\nvar ARROW_ARG = /^([^\\(]+?)=>/;\nvar FN_ARGS = /^[^\\(]*\\(\\s*([^\\)]*)\\)/m;\nvar FN_ARG_SPLIT = /,/;\nvar FN_ARG = /^\\s*(_?)(\\S+?)\\1\\s*$/;\nvar STRIP_COMMENTS = /((\\/\\/.*$)|(\\/\\*[\\s\\S]*?\\*\\/))/mg;\nvar $injectorMinErr = minErr('$injector');\n\nfunction extractArgs(fn) {\n  var fnText = Function.prototype.toString.call(fn).replace(STRIP_COMMENTS, ''),\n      args = fnText.match(ARROW_ARG) || fnText.match(FN_ARGS);\n  return args;\n}\n\nfunction anonFn(fn) {\n  // For anonymous functions, showing at the very least the function signature can help in\n  // debugging.\n  var args = extractArgs(fn);\n  if (args) {\n    return 'function(' + (args[1] || '').replace(/[\\s\\r\\n]+/, ' ') + ')';\n  }\n  return 'fn';\n}\n\nfunction annotate(fn, strictDi, name) {\n  var $inject,\n      argDecl,\n      last;\n\n  if (typeof fn === 'function') {\n    if (!($inject = fn.$inject)) {\n      $inject = [];\n      if (fn.length) {\n        if (strictDi) {\n          if (!isString(name) || !name) {\n            name = fn.name || anonFn(fn);\n          }\n          throw $injectorMinErr('strictdi',\n            '{0} is not using explicit annotation and cannot be invoked in strict mode', name);\n        }\n        argDecl = extractArgs(fn);\n        forEach(argDecl[1].split(FN_ARG_SPLIT), function(arg) {\n          arg.replace(FN_ARG, function(all, underscore, name) {\n            $inject.push(name);\n          });\n        });\n      }\n      fn.$inject = $inject;\n    }\n  } else if (isArray(fn)) {\n    last = fn.length - 1;\n    assertArgFn(fn[last], 'fn');\n    $inject = fn.slice(0, last);\n  } else {\n    assertArgFn(fn, 'fn', true);\n  }\n  return $inject;\n}\n\n///////////////////////////////////////\n\n/**\n * @ngdoc service\n * @name $injector\n *\n * @description\n *\n * `$injector` is used to retrieve object instances as defined by\n * {@link auto.$provide provider}, instantiate types, invoke methods,\n * and load modules.\n *\n * The following always holds true:\n *\n * ```js\n *   var $injector = angular.injector();\n *   expect($injector.get('$injector')).toBe($injector);\n *   expect($injector.invoke(function($injector) {\n *     return $injector;\n *   })).toBe($injector);\n * ```\n *\n * # Injection Function Annotation\n *\n * JavaScript does not have annotations, and annotations are needed for dependency injection. The\n * following are all valid ways of annotating function with injection arguments and are equivalent.\n *\n * ```js\n *   // inferred (only works if code not minified/obfuscated)\n *   $injector.invoke(function(serviceA){});\n *\n *   // annotated\n *   function explicit(serviceA) {};\n *   explicit.$inject = ['serviceA'];\n *   $injector.invoke(explicit);\n *\n *   // inline\n *   $injector.invoke(['serviceA', function(serviceA){}]);\n * ```\n *\n * ## Inference\n *\n * In JavaScript calling `toString()` on a function returns the function definition. The definition\n * can then be parsed and the function arguments can be extracted. This method of discovering\n * annotations is disallowed when the injector is in strict mode.\n * *NOTE:* This does not work with minification, and obfuscation tools since these tools change the\n * argument names.\n *\n * ## `$inject` Annotation\n * By adding an `$inject` property onto a function the injection parameters can be specified.\n *\n * ## Inline\n * As an array of injection names, where the last item in the array is the function to call.\n */\n\n/**\n * @ngdoc method\n * @name $injector#get\n *\n * @description\n * Return an instance of the service.\n *\n * @param {string} name The name of the instance to retrieve.\n * @param {string=} caller An optional string to provide the origin of the function call for error messages.\n * @return {*} The instance.\n */\n\n/**\n * @ngdoc method\n * @name $injector#invoke\n *\n * @description\n * Invoke the method and supply the method arguments from the `$injector`.\n *\n * @param {Function|Array.<string|Function>} fn The injectable function to invoke. Function parameters are\n *   injected according to the {@link guide/di $inject Annotation} rules.\n * @param {Object=} self The `this` for the invoked method.\n * @param {Object=} locals Optional object. If preset then any argument names are read from this\n *                         object first, before the `$injector` is consulted.\n * @returns {*} the value returned by the invoked `fn` function.\n */\n\n/**\n * @ngdoc method\n * @name $injector#has\n *\n * @description\n * Allows the user to query if the particular service exists.\n *\n * @param {string} name Name of the service to query.\n * @returns {boolean} `true` if injector has given service.\n */\n\n/**\n * @ngdoc method\n * @name $injector#instantiate\n * @description\n * Create a new instance of JS type. The method takes a constructor function, invokes the new\n * operator, and supplies all of the arguments to the constructor function as specified by the\n * constructor annotation.\n *\n * @param {Function} Type Annotated constructor function.\n * @param {Object=} locals Optional object. If preset then any argument names are read from this\n * object first, before the `$injector` is consulted.\n * @returns {Object} new instance of `Type`.\n */\n\n/**\n * @ngdoc method\n * @name $injector#annotate\n *\n * @description\n * Returns an array of service names which the function is requesting for injection. This API is\n * used by the injector to determine which services need to be injected into the function when the\n * function is invoked. There are three ways in which the function can be annotated with the needed\n * dependencies.\n *\n * # Argument names\n *\n * The simplest form is to extract the dependencies from the arguments of the function. This is done\n * by converting the function into a string using `toString()` method and extracting the argument\n * names.\n * ```js\n *   // Given\n *   function MyController($scope, $route) {\n *     // ...\n *   }\n *\n *   // Then\n *   expect(injector.annotate(MyController)).toEqual(['$scope', '$route']);\n * ```\n *\n * You can disallow this method by using strict injection mode.\n *\n * This method does not work with code minification / obfuscation. For this reason the following\n * annotation strategies are supported.\n *\n * # The `$inject` property\n *\n * If a function has an `$inject` property and its value is an array of strings, then the strings\n * represent names of services to be injected into the function.\n * ```js\n *   // Given\n *   var MyController = function(obfuscatedScope, obfuscatedRoute) {\n *     // ...\n *   }\n *   // Define function dependencies\n *   MyController['$inject'] = ['$scope', '$route'];\n *\n *   // Then\n *   expect(injector.annotate(MyController)).toEqual(['$scope', '$route']);\n * ```\n *\n * # The array notation\n *\n * It is often desirable to inline Injected functions and that's when setting the `$inject` property\n * is very inconvenient. In these situations using the array notation to specify the dependencies in\n * a way that survives minification is a better choice:\n *\n * ```js\n *   // We wish to write this (not minification / obfuscation safe)\n *   injector.invoke(function($compile, $rootScope) {\n *     // ...\n *   });\n *\n *   // We are forced to write break inlining\n *   var tmpFn = function(obfuscatedCompile, obfuscatedRootScope) {\n *     // ...\n *   };\n *   tmpFn.$inject = ['$compile', '$rootScope'];\n *   injector.invoke(tmpFn);\n *\n *   // To better support inline function the inline annotation is supported\n *   injector.invoke(['$compile', '$rootScope', function(obfCompile, obfRootScope) {\n *     // ...\n *   }]);\n *\n *   // Therefore\n *   expect(injector.annotate(\n *      ['$compile', '$rootScope', function(obfus_$compile, obfus_$rootScope) {}])\n *    ).toEqual(['$compile', '$rootScope']);\n * ```\n *\n * @param {Function|Array.<string|Function>} fn Function for which dependent service names need to\n * be retrieved as described above.\n *\n * @param {boolean=} [strictDi=false] Disallow argument name annotation inference.\n *\n * @returns {Array.<string>} The names of the services which the function requires.\n */\n\n\n\n\n/**\n * @ngdoc service\n * @name $provide\n *\n * @description\n *\n * The {@link auto.$provide $provide} service has a number of methods for registering components\n * with the {@link auto.$injector $injector}. Many of these functions are also exposed on\n * {@link angular.Module}.\n *\n * An Angular **service** is a singleton object created by a **service factory**.  These **service\n * factories** are functions which, in turn, are created by a **service provider**.\n * The **service providers** are constructor functions. When instantiated they must contain a\n * property called `$get`, which holds the **service factory** function.\n *\n * When you request a service, the {@link auto.$injector $injector} is responsible for finding the\n * correct **service provider**, instantiating it and then calling its `$get` **service factory**\n * function to get the instance of the **service**.\n *\n * Often services have no configuration options and there is no need to add methods to the service\n * provider.  The provider will be no more than a constructor function with a `$get` property. For\n * these cases the {@link auto.$provide $provide} service has additional helper methods to register\n * services without specifying a provider.\n *\n * * {@link auto.$provide#provider provider(provider)} - registers a **service provider** with the\n *     {@link auto.$injector $injector}\n * * {@link auto.$provide#constant constant(obj)} - registers a value/object that can be accessed by\n *     providers and services.\n * * {@link auto.$provide#value value(obj)} - registers a value/object that can only be accessed by\n *     services, not providers.\n * * {@link auto.$provide#factory factory(fn)} - registers a service **factory function**, `fn`,\n *     that will be wrapped in a **service provider** object, whose `$get` property will contain the\n *     given factory function.\n * * {@link auto.$provide#service service(class)} - registers a **constructor function**, `class`\n *     that will be wrapped in a **service provider** object, whose `$get` property will instantiate\n *      a new object using the given constructor function.\n *\n * See the individual methods for more information and examples.\n */\n\n/**\n * @ngdoc method\n * @name $provide#provider\n * @description\n *\n * Register a **provider function** with the {@link auto.$injector $injector}. Provider functions\n * are constructor functions, whose instances are responsible for \"providing\" a factory for a\n * service.\n *\n * Service provider names start with the name of the service they provide followed by `Provider`.\n * For example, the {@link ng.$log $log} service has a provider called\n * {@link ng.$logProvider $logProvider}.\n *\n * Service provider objects can have additional methods which allow configuration of the provider\n * and its service. Importantly, you can configure what kind of service is created by the `$get`\n * method, or how that service will act. For example, the {@link ng.$logProvider $logProvider} has a\n * method {@link ng.$logProvider#debugEnabled debugEnabled}\n * which lets you specify whether the {@link ng.$log $log} service will log debug messages to the\n * console or not.\n *\n * @param {string} name The name of the instance. NOTE: the provider will be available under `name +\n                        'Provider'` key.\n * @param {(Object|function())} provider If the provider is:\n *\n *   - `Object`: then it should have a `$get` method. The `$get` method will be invoked using\n *     {@link auto.$injector#invoke $injector.invoke()} when an instance needs to be created.\n *   - `Constructor`: a new instance of the provider will be created using\n *     {@link auto.$injector#instantiate $injector.instantiate()}, then treated as `object`.\n *\n * @returns {Object} registered provider instance\n\n * @example\n *\n * The following example shows how to create a simple event tracking service and register it using\n * {@link auto.$provide#provider $provide.provider()}.\n *\n * ```js\n *  // Define the eventTracker provider\n *  function EventTrackerProvider() {\n *    var trackingUrl = '/track';\n *\n *    // A provider method for configuring where the tracked events should been saved\n *    this.setTrackingUrl = function(url) {\n *      trackingUrl = url;\n *    };\n *\n *    // The service factory function\n *    this.$get = ['$http', function($http) {\n *      var trackedEvents = {};\n *      return {\n *        // Call this to track an event\n *        event: function(event) {\n *          var count = trackedEvents[event] || 0;\n *          count += 1;\n *          trackedEvents[event] = count;\n *          return count;\n *        },\n *        // Call this to save the tracked events to the trackingUrl\n *        save: function() {\n *          $http.post(trackingUrl, trackedEvents);\n *        }\n *      };\n *    }];\n *  }\n *\n *  describe('eventTracker', function() {\n *    var postSpy;\n *\n *    beforeEach(module(function($provide) {\n *      // Register the eventTracker provider\n *      $provide.provider('eventTracker', EventTrackerProvider);\n *    }));\n *\n *    beforeEach(module(function(eventTrackerProvider) {\n *      // Configure eventTracker provider\n *      eventTrackerProvider.setTrackingUrl('/custom-track');\n *    }));\n *\n *    it('tracks events', inject(function(eventTracker) {\n *      expect(eventTracker.event('login')).toEqual(1);\n *      expect(eventTracker.event('login')).toEqual(2);\n *    }));\n *\n *    it('saves to the tracking url', inject(function(eventTracker, $http) {\n *      postSpy = spyOn($http, 'post');\n *      eventTracker.event('login');\n *      eventTracker.save();\n *      expect(postSpy).toHaveBeenCalled();\n *      expect(postSpy.mostRecentCall.args[0]).not.toEqual('/track');\n *      expect(postSpy.mostRecentCall.args[0]).toEqual('/custom-track');\n *      expect(postSpy.mostRecentCall.args[1]).toEqual({ 'login': 1 });\n *    }));\n *  });\n * ```\n */\n\n/**\n * @ngdoc method\n * @name $provide#factory\n * @description\n *\n * Register a **service factory**, which will be called to return the service instance.\n * This is short for registering a service where its provider consists of only a `$get` property,\n * which is the given service factory function.\n * You should use {@link auto.$provide#factory $provide.factory(getFn)} if you do not need to\n * configure your service in a provider.\n *\n * @param {string} name The name of the instance.\n * @param {Function|Array.<string|Function>} $getFn The injectable $getFn for the instance creation.\n *                      Internally this is a short hand for `$provide.provider(name, {$get: $getFn})`.\n * @returns {Object} registered provider instance\n *\n * @example\n * Here is an example of registering a service\n * ```js\n *   $provide.factory('ping', ['$http', function($http) {\n *     return function ping() {\n *       return $http.send('/ping');\n *     };\n *   }]);\n * ```\n * You would then inject and use this service like this:\n * ```js\n *   someModule.controller('Ctrl', ['ping', function(ping) {\n *     ping();\n *   }]);\n * ```\n */\n\n\n/**\n * @ngdoc method\n * @name $provide#service\n * @description\n *\n * Register a **service constructor**, which will be invoked with `new` to create the service\n * instance.\n * This is short for registering a service where its provider's `$get` property is a factory\n * function that returns an instance instantiated by the injector from the service constructor\n * function.\n *\n * Internally it looks a bit like this:\n *\n * ```\n * {\n *   $get: function() {\n *     return $injector.instantiate(constructor);\n *   }\n * }\n * ```\n *\n *\n * You should use {@link auto.$provide#service $provide.service(class)} if you define your service\n * as a type/class.\n *\n * @param {string} name The name of the instance.\n * @param {Function|Array.<string|Function>} constructor An injectable class (constructor function)\n *     that will be instantiated.\n * @returns {Object} registered provider instance\n *\n * @example\n * Here is an example of registering a service using\n * {@link auto.$provide#service $provide.service(class)}.\n * ```js\n *   var Ping = function($http) {\n *     this.$http = $http;\n *   };\n *\n *   Ping.$inject = ['$http'];\n *\n *   Ping.prototype.send = function() {\n *     return this.$http.get('/ping');\n *   };\n *   $provide.service('ping', Ping);\n * ```\n * You would then inject and use this service like this:\n * ```js\n *   someModule.controller('Ctrl', ['ping', function(ping) {\n *     ping.send();\n *   }]);\n * ```\n */\n\n\n/**\n * @ngdoc method\n * @name $provide#value\n * @description\n *\n * Register a **value service** with the {@link auto.$injector $injector}, such as a string, a\n * number, an array, an object or a function. This is short for registering a service where its\n * provider's `$get` property is a factory function that takes no arguments and returns the **value\n * service**. That also means it is not possible to inject other services into a value service.\n *\n * Value services are similar to constant services, except that they cannot be injected into a\n * module configuration function (see {@link angular.Module#config}) but they can be overridden by\n * an Angular {@link auto.$provide#decorator decorator}.\n *\n * @param {string} name The name of the instance.\n * @param {*} value The value.\n * @returns {Object} registered provider instance\n *\n * @example\n * Here are some examples of creating value services.\n * ```js\n *   $provide.value('ADMIN_USER', 'admin');\n *\n *   $provide.value('RoleLookup', { admin: 0, writer: 1, reader: 2 });\n *\n *   $provide.value('halfOf', function(value) {\n *     return value / 2;\n *   });\n * ```\n */\n\n\n/**\n * @ngdoc method\n * @name $provide#constant\n * @description\n *\n * Register a **constant service** with the {@link auto.$injector $injector}, such as a string,\n * a number, an array, an object or a function. Like the {@link auto.$provide#value value}, it is not\n * possible to inject other services into a constant.\n *\n * But unlike {@link auto.$provide#value value}, a constant can be\n * injected into a module configuration function (see {@link angular.Module#config}) and it cannot\n * be overridden by an Angular {@link auto.$provide#decorator decorator}.\n *\n * @param {string} name The name of the constant.\n * @param {*} value The constant value.\n * @returns {Object} registered instance\n *\n * @example\n * Here a some examples of creating constants:\n * ```js\n *   $provide.constant('SHARD_HEIGHT', 306);\n *\n *   $provide.constant('MY_COLOURS', ['red', 'blue', 'grey']);\n *\n *   $provide.constant('double', function(value) {\n *     return value * 2;\n *   });\n * ```\n */\n\n\n/**\n * @ngdoc method\n * @name $provide#decorator\n * @description\n *\n * Register a **service decorator** with the {@link auto.$injector $injector}. A service decorator\n * intercepts the creation of a service, allowing it to override or modify the behavior of the\n * service. The object returned by the decorator may be the original service, or a new service\n * object which replaces or wraps and delegates to the original service.\n *\n * @param {string} name The name of the service to decorate.\n * @param {Function|Array.<string|Function>} decorator This function will be invoked when the service needs to be\n *    instantiated and should return the decorated service instance. The function is called using\n *    the {@link auto.$injector#invoke injector.invoke} method and is therefore fully injectable.\n *    Local injection arguments:\n *\n *    * `$delegate` - The original service instance, which can be monkey patched, configured,\n *      decorated or delegated to.\n *\n * @example\n * Here we decorate the {@link ng.$log $log} service to convert warnings to errors by intercepting\n * calls to {@link ng.$log#error $log.warn()}.\n * ```js\n *   $provide.decorator('$log', ['$delegate', function($delegate) {\n *     $delegate.warn = $delegate.error;\n *     return $delegate;\n *   }]);\n * ```\n */\n\n\nfunction createInjector(modulesToLoad, strictDi) {\n  strictDi = (strictDi === true);\n  var INSTANTIATING = {},\n      providerSuffix = 'Provider',\n      path = [],\n      loadedModules = new HashMap([], true),\n      providerCache = {\n        $provide: {\n            provider: supportObject(provider),\n            factory: supportObject(factory),\n            service: supportObject(service),\n            value: supportObject(value),\n            constant: supportObject(constant),\n            decorator: decorator\n          }\n      },\n      providerInjector = (providerCache.$injector =\n          createInternalInjector(providerCache, function(serviceName, caller) {\n            if (angular.isString(caller)) {\n              path.push(caller);\n            }\n            throw $injectorMinErr('unpr', \"Unknown provider: {0}\", path.join(' <- '));\n          })),\n      instanceCache = {},\n      protoInstanceInjector =\n          createInternalInjector(instanceCache, function(serviceName, caller) {\n            var provider = providerInjector.get(serviceName + providerSuffix, caller);\n            return instanceInjector.invoke(\n                provider.$get, provider, undefined, serviceName);\n          }),\n      instanceInjector = protoInstanceInjector;\n\n  providerCache['$injector' + providerSuffix] = { $get: valueFn(protoInstanceInjector) };\n  var runBlocks = loadModules(modulesToLoad);\n  instanceInjector = protoInstanceInjector.get('$injector');\n  instanceInjector.strictDi = strictDi;\n  forEach(runBlocks, function(fn) { if (fn) instanceInjector.invoke(fn); });\n\n  return instanceInjector;\n\n  ////////////////////////////////////\n  // $provider\n  ////////////////////////////////////\n\n  function supportObject(delegate) {\n    return function(key, value) {\n      if (isObject(key)) {\n        forEach(key, reverseParams(delegate));\n      } else {\n        return delegate(key, value);\n      }\n    };\n  }\n\n  function provider(name, provider_) {\n    assertNotHasOwnProperty(name, 'service');\n    if (isFunction(provider_) || isArray(provider_)) {\n      provider_ = providerInjector.instantiate(provider_);\n    }\n    if (!provider_.$get) {\n      throw $injectorMinErr('pget', \"Provider '{0}' must define $get factory method.\", name);\n    }\n    return providerCache[name + providerSuffix] = provider_;\n  }\n\n  function enforceReturnValue(name, factory) {\n    return function enforcedReturnValue() {\n      var result = instanceInjector.invoke(factory, this);\n      if (isUndefined(result)) {\n        throw $injectorMinErr('undef', \"Provider '{0}' must return a value from $get factory method.\", name);\n      }\n      return result;\n    };\n  }\n\n  function factory(name, factoryFn, enforce) {\n    return provider(name, {\n      $get: enforce !== false ? enforceReturnValue(name, factoryFn) : factoryFn\n    });\n  }\n\n  function service(name, constructor) {\n    return factory(name, ['$injector', function($injector) {\n      return $injector.instantiate(constructor);\n    }]);\n  }\n\n  function value(name, val) { return factory(name, valueFn(val), false); }\n\n  function constant(name, value) {\n    assertNotHasOwnProperty(name, 'constant');\n    providerCache[name] = value;\n    instanceCache[name] = value;\n  }\n\n  function decorator(serviceName, decorFn) {\n    var origProvider = providerInjector.get(serviceName + providerSuffix),\n        orig$get = origProvider.$get;\n\n    origProvider.$get = function() {\n      var origInstance = instanceInjector.invoke(orig$get, origProvider);\n      return instanceInjector.invoke(decorFn, null, {$delegate: origInstance});\n    };\n  }\n\n  ////////////////////////////////////\n  // Module Loading\n  ////////////////////////////////////\n  function loadModules(modulesToLoad) {\n    assertArg(isUndefined(modulesToLoad) || isArray(modulesToLoad), 'modulesToLoad', 'not an array');\n    var runBlocks = [], moduleFn;\n    forEach(modulesToLoad, function(module) {\n      if (loadedModules.get(module)) return;\n      loadedModules.put(module, true);\n\n      function runInvokeQueue(queue) {\n        var i, ii;\n        for (i = 0, ii = queue.length; i < ii; i++) {\n          var invokeArgs = queue[i],\n              provider = providerInjector.get(invokeArgs[0]);\n\n          provider[invokeArgs[1]].apply(provider, invokeArgs[2]);\n        }\n      }\n\n      try {\n        if (isString(module)) {\n          moduleFn = angularModule(module);\n          runBlocks = runBlocks.concat(loadModules(moduleFn.requires)).concat(moduleFn._runBlocks);\n          runInvokeQueue(moduleFn._invokeQueue);\n          runInvokeQueue(moduleFn._configBlocks);\n        } else if (isFunction(module)) {\n            runBlocks.push(providerInjector.invoke(module));\n        } else if (isArray(module)) {\n            runBlocks.push(providerInjector.invoke(module));\n        } else {\n          assertArgFn(module, 'module');\n        }\n      } catch (e) {\n        if (isArray(module)) {\n          module = module[module.length - 1];\n        }\n        if (e.message && e.stack && e.stack.indexOf(e.message) == -1) {\n          // Safari & FF's stack traces don't contain error.message content\n          // unlike those of Chrome and IE\n          // So if stack doesn't contain message, we create a new string that contains both.\n          // Since error.stack is read-only in Safari, I'm overriding e and not e.stack here.\n          /* jshint -W022 */\n          e = e.message + '\\n' + e.stack;\n        }\n        throw $injectorMinErr('modulerr', \"Failed to instantiate module {0} due to:\\n{1}\",\n                  module, e.stack || e.message || e);\n      }\n    });\n    return runBlocks;\n  }\n\n  ////////////////////////////////////\n  // internal Injector\n  ////////////////////////////////////\n\n  function createInternalInjector(cache, factory) {\n\n    function getService(serviceName, caller) {\n      if (cache.hasOwnProperty(serviceName)) {\n        if (cache[serviceName] === INSTANTIATING) {\n          throw $injectorMinErr('cdep', 'Circular dependency found: {0}',\n                    serviceName + ' <- ' + path.join(' <- '));\n        }\n        return cache[serviceName];\n      } else {\n        try {\n          path.unshift(serviceName);\n          cache[serviceName] = INSTANTIATING;\n          return cache[serviceName] = factory(serviceName, caller);\n        } catch (err) {\n          if (cache[serviceName] === INSTANTIATING) {\n            delete cache[serviceName];\n          }\n          throw err;\n        } finally {\n          path.shift();\n        }\n      }\n    }\n\n\n    function injectionArgs(fn, locals, serviceName) {\n      var args = [],\n          $inject = createInjector.$$annotate(fn, strictDi, serviceName);\n\n      for (var i = 0, length = $inject.length; i < length; i++) {\n        var key = $inject[i];\n        if (typeof key !== 'string') {\n          throw $injectorMinErr('itkn',\n                  'Incorrect injection token! Expected service name as string, got {0}', key);\n        }\n        args.push(locals && locals.hasOwnProperty(key) ? locals[key] :\n                                                         getService(key, serviceName));\n      }\n      return args;\n    }\n\n    function isClass(func) {\n      // IE 9-11 do not support classes and IE9 leaks with the code below.\n      if (msie <= 11) {\n        return false;\n      }\n      // Workaround for MS Edge.\n      // Check https://connect.microsoft.com/IE/Feedback/Details/2211653\n      return typeof func === 'function'\n        && /^(?:class\\s|constructor\\()/.test(Function.prototype.toString.call(func));\n    }\n\n    function invoke(fn, self, locals, serviceName) {\n      if (typeof locals === 'string') {\n        serviceName = locals;\n        locals = null;\n      }\n\n      var args = injectionArgs(fn, locals, serviceName);\n      if (isArray(fn)) {\n        fn = fn[fn.length - 1];\n      }\n\n      if (!isClass(fn)) {\n        // http://jsperf.com/angularjs-invoke-apply-vs-switch\n        // #5388\n        return fn.apply(self, args);\n      } else {\n        args.unshift(null);\n        return new (Function.prototype.bind.apply(fn, args))();\n      }\n    }\n\n\n    function instantiate(Type, locals, serviceName) {\n      // Check if Type is annotated and use just the given function at n-1 as parameter\n      // e.g. someModule.factory('greeter', ['$window', function(renamed$window) {}]);\n      var ctor = (isArray(Type) ? Type[Type.length - 1] : Type);\n      var args = injectionArgs(Type, locals, serviceName);\n      // Empty object at position 0 is ignored for invocation with `new`, but required.\n      args.unshift(null);\n      return new (Function.prototype.bind.apply(ctor, args))();\n    }\n\n\n    return {\n      invoke: invoke,\n      instantiate: instantiate,\n      get: getService,\n      annotate: createInjector.$$annotate,\n      has: function(name) {\n        return providerCache.hasOwnProperty(name + providerSuffix) || cache.hasOwnProperty(name);\n      }\n    };\n  }\n}\n\ncreateInjector.$$annotate = annotate;\n\n/**\n * @ngdoc provider\n * @name $anchorScrollProvider\n *\n * @description\n * Use `$anchorScrollProvider` to disable automatic scrolling whenever\n * {@link ng.$location#hash $location.hash()} changes.\n */\nfunction $AnchorScrollProvider() {\n\n  var autoScrollingEnabled = true;\n\n  /**\n   * @ngdoc method\n   * @name $anchorScrollProvider#disableAutoScrolling\n   *\n   * @description\n   * By default, {@link ng.$anchorScroll $anchorScroll()} will automatically detect changes to\n   * {@link ng.$location#hash $location.hash()} and scroll to the element matching the new hash.<br />\n   * Use this method to disable automatic scrolling.\n   *\n   * If automatic scrolling is disabled, one must explicitly call\n   * {@link ng.$anchorScroll $anchorScroll()} in order to scroll to the element related to the\n   * current hash.\n   */\n  this.disableAutoScrolling = function() {\n    autoScrollingEnabled = false;\n  };\n\n  /**\n   * @ngdoc service\n   * @name $anchorScroll\n   * @kind function\n   * @requires $window\n   * @requires $location\n   * @requires $rootScope\n   *\n   * @description\n   * When called, it scrolls to the element related to the specified `hash` or (if omitted) to the\n   * current value of {@link ng.$location#hash $location.hash()}, according to the rules specified\n   * in the\n   * [HTML5 spec](http://www.w3.org/html/wg/drafts/html/master/browsers.html#the-indicated-part-of-the-document).\n   *\n   * It also watches the {@link ng.$location#hash $location.hash()} and automatically scrolls to\n   * match any anchor whenever it changes. This can be disabled by calling\n   * {@link ng.$anchorScrollProvider#disableAutoScrolling $anchorScrollProvider.disableAutoScrolling()}.\n   *\n   * Additionally, you can use its {@link ng.$anchorScroll#yOffset yOffset} property to specify a\n   * vertical scroll-offset (either fixed or dynamic).\n   *\n   * @param {string=} hash The hash specifying the element to scroll to. If omitted, the value of\n   *                       {@link ng.$location#hash $location.hash()} will be used.\n   *\n   * @property {(number|function|jqLite)} yOffset\n   * If set, specifies a vertical scroll-offset. This is often useful when there are fixed\n   * positioned elements at the top of the page, such as navbars, headers etc.\n   *\n   * `yOffset` can be specified in various ways:\n   * - **number**: A fixed number of pixels to be used as offset.<br /><br />\n   * - **function**: A getter function called everytime `$anchorScroll()` is executed. Must return\n   *   a number representing the offset (in pixels).<br /><br />\n   * - **jqLite**: A jqLite/jQuery element to be used for specifying the offset. The distance from\n   *   the top of the page to the element's bottom will be used as offset.<br />\n   *   **Note**: The element will be taken into account only as long as its `position` is set to\n   *   `fixed`. This option is useful, when dealing with responsive navbars/headers that adjust\n   *   their height and/or positioning according to the viewport's size.\n   *\n   * <br />\n   * <div class=\"alert alert-warning\">\n   * In order for `yOffset` to work properly, scrolling should take place on the document's root and\n   * not some child element.\n   * </div>\n   *\n   * @example\n     <example module=\"anchorScrollExample\">\n       <file name=\"index.html\">\n         <div id=\"scrollArea\" ng-controller=\"ScrollController\">\n           <a ng-click=\"gotoBottom()\">Go to bottom</a>\n           <a id=\"bottom\"></a> You're at the bottom!\n         </div>\n       </file>\n       <file name=\"script.js\">\n         angular.module('anchorScrollExample', [])\n           .controller('ScrollController', ['$scope', '$location', '$anchorScroll',\n             function ($scope, $location, $anchorScroll) {\n               $scope.gotoBottom = function() {\n                 // set the location.hash to the id of\n                 // the element you wish to scroll to.\n                 $location.hash('bottom');\n\n                 // call $anchorScroll()\n                 $anchorScroll();\n               };\n             }]);\n       </file>\n       <file name=\"style.css\">\n         #scrollArea {\n           height: 280px;\n           overflow: auto;\n         }\n\n         #bottom {\n           display: block;\n           margin-top: 2000px;\n         }\n       </file>\n     </example>\n   *\n   * <hr />\n   * The example below illustrates the use of a vertical scroll-offset (specified as a fixed value).\n   * See {@link ng.$anchorScroll#yOffset $anchorScroll.yOffset} for more details.\n   *\n   * @example\n     <example module=\"anchorScrollOffsetExample\">\n       <file name=\"index.html\">\n         <div class=\"fixed-header\" ng-controller=\"headerCtrl\">\n           <a href=\"\" ng-click=\"gotoAnchor(x)\" ng-repeat=\"x in [1,2,3,4,5]\">\n             Go to anchor {{x}}\n           </a>\n         </div>\n         <div id=\"anchor{{x}}\" class=\"anchor\" ng-repeat=\"x in [1,2,3,4,5]\">\n           Anchor {{x}} of 5\n         </div>\n       </file>\n       <file name=\"script.js\">\n         angular.module('anchorScrollOffsetExample', [])\n           .run(['$anchorScroll', function($anchorScroll) {\n             $anchorScroll.yOffset = 50;   // always scroll by 50 extra pixels\n           }])\n           .controller('headerCtrl', ['$anchorScroll', '$location', '$scope',\n             function ($anchorScroll, $location, $scope) {\n               $scope.gotoAnchor = function(x) {\n                 var newHash = 'anchor' + x;\n                 if ($location.hash() !== newHash) {\n                   // set the $location.hash to `newHash` and\n                   // $anchorScroll will automatically scroll to it\n                   $location.hash('anchor' + x);\n                 } else {\n                   // call $anchorScroll() explicitly,\n                   // since $location.hash hasn't changed\n                   $anchorScroll();\n                 }\n               };\n             }\n           ]);\n       </file>\n       <file name=\"style.css\">\n         body {\n           padding-top: 50px;\n         }\n\n         .anchor {\n           border: 2px dashed DarkOrchid;\n           padding: 10px 10px 200px 10px;\n         }\n\n         .fixed-header {\n           background-color: rgba(0, 0, 0, 0.2);\n           height: 50px;\n           position: fixed;\n           top: 0; left: 0; right: 0;\n         }\n\n         .fixed-header > a {\n           display: inline-block;\n           margin: 5px 15px;\n         }\n       </file>\n     </example>\n   */\n  this.$get = ['$window', '$location', '$rootScope', function($window, $location, $rootScope) {\n    var document = $window.document;\n\n    // Helper function to get first anchor from a NodeList\n    // (using `Array#some()` instead of `angular#forEach()` since it's more performant\n    //  and working in all supported browsers.)\n    function getFirstAnchor(list) {\n      var result = null;\n      Array.prototype.some.call(list, function(element) {\n        if (nodeName_(element) === 'a') {\n          result = element;\n          return true;\n        }\n      });\n      return result;\n    }\n\n    function getYOffset() {\n\n      var offset = scroll.yOffset;\n\n      if (isFunction(offset)) {\n        offset = offset();\n      } else if (isElement(offset)) {\n        var elem = offset[0];\n        var style = $window.getComputedStyle(elem);\n        if (style.position !== 'fixed') {\n          offset = 0;\n        } else {\n          offset = elem.getBoundingClientRect().bottom;\n        }\n      } else if (!isNumber(offset)) {\n        offset = 0;\n      }\n\n      return offset;\n    }\n\n    function scrollTo(elem) {\n      if (elem) {\n        elem.scrollIntoView();\n\n        var offset = getYOffset();\n\n        if (offset) {\n          // `offset` is the number of pixels we should scroll UP in order to align `elem` properly.\n          // This is true ONLY if the call to `elem.scrollIntoView()` initially aligns `elem` at the\n          // top of the viewport.\n          //\n          // IF the number of pixels from the top of `elem` to the end of the page's content is less\n          // than the height of the viewport, then `elem.scrollIntoView()` will align the `elem` some\n          // way down the page.\n          //\n          // This is often the case for elements near the bottom of the page.\n          //\n          // In such cases we do not need to scroll the whole `offset` up, just the difference between\n          // the top of the element and the offset, which is enough to align the top of `elem` at the\n          // desired position.\n          var elemTop = elem.getBoundingClientRect().top;\n          $window.scrollBy(0, elemTop - offset);\n        }\n      } else {\n        $window.scrollTo(0, 0);\n      }\n    }\n\n    function scroll(hash) {\n      hash = isString(hash) ? hash : $location.hash();\n      var elm;\n\n      // empty hash, scroll to the top of the page\n      if (!hash) scrollTo(null);\n\n      // element with given id\n      else if ((elm = document.getElementById(hash))) scrollTo(elm);\n\n      // first anchor with given name :-D\n      else if ((elm = getFirstAnchor(document.getElementsByName(hash)))) scrollTo(elm);\n\n      // no element and hash == 'top', scroll to the top of the page\n      else if (hash === 'top') scrollTo(null);\n    }\n\n    // does not scroll when user clicks on anchor link that is currently on\n    // (no url change, no $location.hash() change), browser native does scroll\n    if (autoScrollingEnabled) {\n      $rootScope.$watch(function autoScrollWatch() {return $location.hash();},\n        function autoScrollWatchAction(newVal, oldVal) {\n          // skip the initial scroll if $location.hash is empty\n          if (newVal === oldVal && newVal === '') return;\n\n          jqLiteDocumentLoaded(function() {\n            $rootScope.$evalAsync(scroll);\n          });\n        });\n    }\n\n    return scroll;\n  }];\n}\n\nvar $animateMinErr = minErr('$animate');\nvar ELEMENT_NODE = 1;\nvar NG_ANIMATE_CLASSNAME = 'ng-animate';\n\nfunction mergeClasses(a,b) {\n  if (!a && !b) return '';\n  if (!a) return b;\n  if (!b) return a;\n  if (isArray(a)) a = a.join(' ');\n  if (isArray(b)) b = b.join(' ');\n  return a + ' ' + b;\n}\n\nfunction extractElementNode(element) {\n  for (var i = 0; i < element.length; i++) {\n    var elm = element[i];\n    if (elm.nodeType === ELEMENT_NODE) {\n      return elm;\n    }\n  }\n}\n\nfunction splitClasses(classes) {\n  if (isString(classes)) {\n    classes = classes.split(' ');\n  }\n\n  // Use createMap() to prevent class assumptions involving property names in\n  // Object.prototype\n  var obj = createMap();\n  forEach(classes, function(klass) {\n    // sometimes the split leaves empty string values\n    // incase extra spaces were applied to the options\n    if (klass.length) {\n      obj[klass] = true;\n    }\n  });\n  return obj;\n}\n\n// if any other type of options value besides an Object value is\n// passed into the $animate.method() animation then this helper code\n// will be run which will ignore it. While this patch is not the\n// greatest solution to this, a lot of existing plugins depend on\n// $animate to either call the callback (< 1.2) or return a promise\n// that can be changed. This helper function ensures that the options\n// are wiped clean incase a callback function is provided.\nfunction prepareAnimateOptions(options) {\n  return isObject(options)\n      ? options\n      : {};\n}\n\nvar $$CoreAnimateJsProvider = function() {\n  this.$get = noop;\n};\n\n// this is prefixed with Core since it conflicts with\n// the animateQueueProvider defined in ngAnimate/animateQueue.js\nvar $$CoreAnimateQueueProvider = function() {\n  var postDigestQueue = new HashMap();\n  var postDigestElements = [];\n\n  this.$get = ['$$AnimateRunner', '$rootScope',\n       function($$AnimateRunner,   $rootScope) {\n    return {\n      enabled: noop,\n      on: noop,\n      off: noop,\n      pin: noop,\n\n      push: function(element, event, options, domOperation) {\n        domOperation        && domOperation();\n\n        options = options || {};\n        options.from        && element.css(options.from);\n        options.to          && element.css(options.to);\n\n        if (options.addClass || options.removeClass) {\n          addRemoveClassesPostDigest(element, options.addClass, options.removeClass);\n        }\n\n        var runner = new $$AnimateRunner(); // jshint ignore:line\n\n        // since there are no animations to run the runner needs to be\n        // notified that the animation call is complete.\n        runner.complete();\n        return runner;\n      }\n    };\n\n\n    function updateData(data, classes, value) {\n      var changed = false;\n      if (classes) {\n        classes = isString(classes) ? classes.split(' ') :\n                  isArray(classes) ? classes : [];\n        forEach(classes, function(className) {\n          if (className) {\n            changed = true;\n            data[className] = value;\n          }\n        });\n      }\n      return changed;\n    }\n\n    function handleCSSClassChanges() {\n      forEach(postDigestElements, function(element) {\n        var data = postDigestQueue.get(element);\n        if (data) {\n          var existing = splitClasses(element.attr('class'));\n          var toAdd = '';\n          var toRemove = '';\n          forEach(data, function(status, className) {\n            var hasClass = !!existing[className];\n            if (status !== hasClass) {\n              if (status) {\n                toAdd += (toAdd.length ? ' ' : '') + className;\n              } else {\n                toRemove += (toRemove.length ? ' ' : '') + className;\n              }\n            }\n          });\n\n          forEach(element, function(elm) {\n            toAdd    && jqLiteAddClass(elm, toAdd);\n            toRemove && jqLiteRemoveClass(elm, toRemove);\n          });\n          postDigestQueue.remove(element);\n        }\n      });\n      postDigestElements.length = 0;\n    }\n\n\n    function addRemoveClassesPostDigest(element, add, remove) {\n      var data = postDigestQueue.get(element) || {};\n\n      var classesAdded = updateData(data, add, true);\n      var classesRemoved = updateData(data, remove, false);\n\n      if (classesAdded || classesRemoved) {\n\n        postDigestQueue.put(element, data);\n        postDigestElements.push(element);\n\n        if (postDigestElements.length === 1) {\n          $rootScope.$$postDigest(handleCSSClassChanges);\n        }\n      }\n    }\n  }];\n};\n\n/**\n * @ngdoc provider\n * @name $animateProvider\n *\n * @description\n * Default implementation of $animate that doesn't perform any animations, instead just\n * synchronously performs DOM updates and resolves the returned runner promise.\n *\n * In order to enable animations the `ngAnimate` module has to be loaded.\n *\n * To see the functional implementation check out `src/ngAnimate/animate.js`.\n */\nvar $AnimateProvider = ['$provide', function($provide) {\n  var provider = this;\n\n  this.$$registeredAnimations = Object.create(null);\n\n   /**\n   * @ngdoc method\n   * @name $animateProvider#register\n   *\n   * @description\n   * Registers a new injectable animation factory function. The factory function produces the\n   * animation object which contains callback functions for each event that is expected to be\n   * animated.\n   *\n   *   * `eventFn`: `function(element, ... , doneFunction, options)`\n   *   The element to animate, the `doneFunction` and the options fed into the animation. Depending\n   *   on the type of animation additional arguments will be injected into the animation function. The\n   *   list below explains the function signatures for the different animation methods:\n   *\n   *   - setClass: function(element, addedClasses, removedClasses, doneFunction, options)\n   *   - addClass: function(element, addedClasses, doneFunction, options)\n   *   - removeClass: function(element, removedClasses, doneFunction, options)\n   *   - enter, leave, move: function(element, doneFunction, options)\n   *   - animate: function(element, fromStyles, toStyles, doneFunction, options)\n   *\n   *   Make sure to trigger the `doneFunction` once the animation is fully complete.\n   *\n   * ```js\n   *   return {\n   *     //enter, leave, move signature\n   *     eventFn : function(element, done, options) {\n   *       //code to run the animation\n   *       //once complete, then run done()\n   *       return function endFunction(wasCancelled) {\n   *         //code to cancel the animation\n   *       }\n   *     }\n   *   }\n   * ```\n   *\n   * @param {string} name The name of the animation (this is what the class-based CSS value will be compared to).\n   * @param {Function} factory The factory function that will be executed to return the animation\n   *                           object.\n   */\n  this.register = function(name, factory) {\n    if (name && name.charAt(0) !== '.') {\n      throw $animateMinErr('notcsel', \"Expecting class selector starting with '.' got '{0}'.\", name);\n    }\n\n    var key = name + '-animation';\n    provider.$$registeredAnimations[name.substr(1)] = key;\n    $provide.factory(key, factory);\n  };\n\n  /**\n   * @ngdoc method\n   * @name $animateProvider#classNameFilter\n   *\n   * @description\n   * Sets and/or returns the CSS class regular expression that is checked when performing\n   * an animation. Upon bootstrap the classNameFilter value is not set at all and will\n   * therefore enable $animate to attempt to perform an animation on any element that is triggered.\n   * When setting the `classNameFilter` value, animations will only be performed on elements\n   * that successfully match the filter expression. This in turn can boost performance\n   * for low-powered devices as well as applications containing a lot of structural operations.\n   * @param {RegExp=} expression The className expression which will be checked against all animations\n   * @return {RegExp} The current CSS className expression value. If null then there is no expression value\n   */\n  this.classNameFilter = function(expression) {\n    if (arguments.length === 1) {\n      this.$$classNameFilter = (expression instanceof RegExp) ? expression : null;\n      if (this.$$classNameFilter) {\n        var reservedRegex = new RegExp(\"(\\\\s+|\\\\/)\" + NG_ANIMATE_CLASSNAME + \"(\\\\s+|\\\\/)\");\n        if (reservedRegex.test(this.$$classNameFilter.toString())) {\n          throw $animateMinErr('nongcls','$animateProvider.classNameFilter(regex) prohibits accepting a regex value which matches/contains the \"{0}\" CSS class.', NG_ANIMATE_CLASSNAME);\n\n        }\n      }\n    }\n    return this.$$classNameFilter;\n  };\n\n  this.$get = ['$$animateQueue', function($$animateQueue) {\n    function domInsert(element, parentElement, afterElement) {\n      // if for some reason the previous element was removed\n      // from the dom sometime before this code runs then let's\n      // just stick to using the parent element as the anchor\n      if (afterElement) {\n        var afterNode = extractElementNode(afterElement);\n        if (afterNode && !afterNode.parentNode && !afterNode.previousElementSibling) {\n          afterElement = null;\n        }\n      }\n      afterElement ? afterElement.after(element) : parentElement.prepend(element);\n    }\n\n    /**\n     * @ngdoc service\n     * @name $animate\n     * @description The $animate service exposes a series of DOM utility methods that provide support\n     * for animation hooks. The default behavior is the application of DOM operations, however,\n     * when an animation is detected (and animations are enabled), $animate will do the heavy lifting\n     * to ensure that animation runs with the triggered DOM operation.\n     *\n     * By default $animate doesn't trigger any animations. This is because the `ngAnimate` module isn't\n     * included and only when it is active then the animation hooks that `$animate` triggers will be\n     * functional. Once active then all structural `ng-` directives will trigger animations as they perform\n     * their DOM-related operations (enter, leave and move). Other directives such as `ngClass`,\n     * `ngShow`, `ngHide` and `ngMessages` also provide support for animations.\n     *\n     * It is recommended that the`$animate` service is always used when executing DOM-related procedures within directives.\n     *\n     * To learn more about enabling animation support, click here to visit the\n     * {@link ngAnimate ngAnimate module page}.\n     */\n    return {\n      // we don't call it directly since non-existant arguments may\n      // be interpreted as null within the sub enabled function\n\n      /**\n       *\n       * @ngdoc method\n       * @name $animate#on\n       * @kind function\n       * @description Sets up an event listener to fire whenever the animation event (enter, leave, move, etc...)\n       *    has fired on the given element or among any of its children. Once the listener is fired, the provided callback\n       *    is fired with the following params:\n       *\n       * ```js\n       * $animate.on('enter', container,\n       *    function callback(element, phase) {\n       *      // cool we detected an enter animation within the container\n       *    }\n       * );\n       * ```\n       *\n       * @param {string} event the animation event that will be captured (e.g. enter, leave, move, addClass, removeClass, etc...)\n       * @param {DOMElement} container the container element that will capture each of the animation events that are fired on itself\n       *     as well as among its children\n       * @param {Function} callback the callback function that will be fired when the listener is triggered\n       *\n       * The arguments present in the callback function are:\n       * * `element` - The captured DOM element that the animation was fired on.\n       * * `phase` - The phase of the animation. The two possible phases are **start** (when the animation starts) and **close** (when it ends).\n       */\n      on: $$animateQueue.on,\n\n      /**\n       *\n       * @ngdoc method\n       * @name $animate#off\n       * @kind function\n       * @description Deregisters an event listener based on the event which has been associated with the provided element. This method\n       * can be used in three different ways depending on the arguments:\n       *\n       * ```js\n       * // remove all the animation event listeners listening for `enter`\n       * $animate.off('enter');\n       *\n       * // remove listeners for all animation events from the container element\n       * $animate.off(container);\n       *\n       * // remove all the animation event listeners listening for `enter` on the given element and its children\n       * $animate.off('enter', container);\n       *\n       * // remove the event listener function provided by `callback` that is set\n       * // to listen for `enter` on the given `container` as well as its children\n       * $animate.off('enter', container, callback);\n       * ```\n       *\n       * @param {string|DOMElement} event|container the animation event (e.g. enter, leave, move,\n       * addClass, removeClass, etc...), or the container element. If it is the element, all other\n       * arguments are ignored.\n       * @param {DOMElement=} container the container element the event listener was placed on\n       * @param {Function=} callback the callback function that was registered as the listener\n       */\n      off: $$animateQueue.off,\n\n      /**\n       * @ngdoc method\n       * @name $animate#pin\n       * @kind function\n       * @description Associates the provided element with a host parent element to allow the element to be animated even if it exists\n       *    outside of the DOM structure of the Angular application. By doing so, any animation triggered via `$animate` can be issued on the\n       *    element despite being outside the realm of the application or within another application. Say for example if the application\n       *    was bootstrapped on an element that is somewhere inside of the `<body>` tag, but we wanted to allow for an element to be situated\n       *    as a direct child of `document.body`, then this can be achieved by pinning the element via `$animate.pin(element)`. Keep in mind\n       *    that calling `$animate.pin(element, parentElement)` will not actually insert into the DOM anywhere; it will just create the association.\n       *\n       *    Note that this feature is only active when the `ngAnimate` module is used.\n       *\n       * @param {DOMElement} element the external element that will be pinned\n       * @param {DOMElement} parentElement the host parent element that will be associated with the external element\n       */\n      pin: $$animateQueue.pin,\n\n      /**\n       *\n       * @ngdoc method\n       * @name $animate#enabled\n       * @kind function\n       * @description Used to get and set whether animations are enabled or not on the entire application or on an element and its children. This\n       * function can be called in four ways:\n       *\n       * ```js\n       * // returns true or false\n       * $animate.enabled();\n       *\n       * // changes the enabled state for all animations\n       * $animate.enabled(false);\n       * $animate.enabled(true);\n       *\n       * // returns true or false if animations are enabled for an element\n       * $animate.enabled(element);\n       *\n       * // changes the enabled state for an element and its children\n       * $animate.enabled(element, true);\n       * $animate.enabled(element, false);\n       * ```\n       *\n       * @param {DOMElement=} element the element that will be considered for checking/setting the enabled state\n       * @param {boolean=} enabled whether or not the animations will be enabled for the element\n       *\n       * @return {boolean} whether or not animations are enabled\n       */\n      enabled: $$animateQueue.enabled,\n\n      /**\n       * @ngdoc method\n       * @name $animate#cancel\n       * @kind function\n       * @description Cancels the provided animation.\n       *\n       * @param {Promise} animationPromise The animation promise that is returned when an animation is started.\n       */\n      cancel: function(runner) {\n        runner.end && runner.end();\n      },\n\n      /**\n       *\n       * @ngdoc method\n       * @name $animate#enter\n       * @kind function\n       * @description Inserts the element into the DOM either after the `after` element (if provided) or\n       *   as the first child within the `parent` element and then triggers an animation.\n       *   A promise is returned that will be resolved during the next digest once the animation\n       *   has completed.\n       *\n       * @param {DOMElement} element the element which will be inserted into the DOM\n       * @param {DOMElement} parent the parent element which will append the element as\n       *   a child (so long as the after element is not present)\n       * @param {DOMElement=} after the sibling element after which the element will be appended\n       * @param {object=} options an optional collection of options/styles that will be applied to the element\n       *\n       * @return {Promise} the animation callback promise\n       */\n      enter: function(element, parent, after, options) {\n        parent = parent && jqLite(parent);\n        after = after && jqLite(after);\n        parent = parent || after.parent();\n        domInsert(element, parent, after);\n        return $$animateQueue.push(element, 'enter', prepareAnimateOptions(options));\n      },\n\n      /**\n       *\n       * @ngdoc method\n       * @name $animate#move\n       * @kind function\n       * @description Inserts (moves) the element into its new position in the DOM either after\n       *   the `after` element (if provided) or as the first child within the `parent` element\n       *   and then triggers an animation. A promise is returned that will be resolved\n       *   during the next digest once the animation has completed.\n       *\n       * @param {DOMElement} element the element which will be moved into the new DOM position\n       * @param {DOMElement} parent the parent element which will append the element as\n       *   a child (so long as the after element is not present)\n       * @param {DOMElement=} after the sibling element after which the element will be appended\n       * @param {object=} options an optional collection of options/styles that will be applied to the element\n       *\n       * @return {Promise} the animation callback promise\n       */\n      move: function(element, parent, after, options) {\n        parent = parent && jqLite(parent);\n        after = after && jqLite(after);\n        parent = parent || after.parent();\n        domInsert(element, parent, after);\n        return $$animateQueue.push(element, 'move', prepareAnimateOptions(options));\n      },\n\n      /**\n       * @ngdoc method\n       * @name $animate#leave\n       * @kind function\n       * @description Triggers an animation and then removes the element from the DOM.\n       * When the function is called a promise is returned that will be resolved during the next\n       * digest once the animation has completed.\n       *\n       * @param {DOMElement} element the element which will be removed from the DOM\n       * @param {object=} options an optional collection of options/styles that will be applied to the element\n       *\n       * @return {Promise} the animation callback promise\n       */\n      leave: function(element, options) {\n        return $$animateQueue.push(element, 'leave', prepareAnimateOptions(options), function() {\n          element.remove();\n        });\n      },\n\n      /**\n       * @ngdoc method\n       * @name $animate#addClass\n       * @kind function\n       *\n       * @description Triggers an addClass animation surrounding the addition of the provided CSS class(es). Upon\n       *   execution, the addClass operation will only be handled after the next digest and it will not trigger an\n       *   animation if element already contains the CSS class or if the class is removed at a later step.\n       *   Note that class-based animations are treated differently compared to structural animations\n       *   (like enter, move and leave) since the CSS classes may be added/removed at different points\n       *   depending if CSS or JavaScript animations are used.\n       *\n       * @param {DOMElement} element the element which the CSS classes will be applied to\n       * @param {string} className the CSS class(es) that will be added (multiple classes are separated via spaces)\n       * @param {object=} options an optional collection of options/styles that will be applied to the element\n       *\n       * @return {Promise} the animation callback promise\n       */\n      addClass: function(element, className, options) {\n        options = prepareAnimateOptions(options);\n        options.addClass = mergeClasses(options.addclass, className);\n        return $$animateQueue.push(element, 'addClass', options);\n      },\n\n      /**\n       * @ngdoc method\n       * @name $animate#removeClass\n       * @kind function\n       *\n       * @description Triggers a removeClass animation surrounding the removal of the provided CSS class(es). Upon\n       *   execution, the removeClass operation will only be handled after the next digest and it will not trigger an\n       *   animation if element does not contain the CSS class or if the class is added at a later step.\n       *   Note that class-based animations are treated differently compared to structural animations\n       *   (like enter, move and leave) since the CSS classes may be added/removed at different points\n       *   depending if CSS or JavaScript animations are used.\n       *\n       * @param {DOMElement} element the element which the CSS classes will be applied to\n       * @param {string} className the CSS class(es) that will be removed (multiple classes are separated via spaces)\n       * @param {object=} options an optional collection of options/styles that will be applied to the element\n       *\n       * @return {Promise} the animation callback promise\n       */\n      removeClass: function(element, className, options) {\n        options = prepareAnimateOptions(options);\n        options.removeClass = mergeClasses(options.removeClass, className);\n        return $$animateQueue.push(element, 'removeClass', options);\n      },\n\n      /**\n       * @ngdoc method\n       * @name $animate#setClass\n       * @kind function\n       *\n       * @description Performs both the addition and removal of a CSS classes on an element and (during the process)\n       *    triggers an animation surrounding the class addition/removal. Much like `$animate.addClass` and\n       *    `$animate.removeClass`, `setClass` will only evaluate the classes being added/removed once a digest has\n       *    passed. Note that class-based animations are treated differently compared to structural animations\n       *    (like enter, move and leave) since the CSS classes may be added/removed at different points\n       *    depending if CSS or JavaScript animations are used.\n       *\n       * @param {DOMElement} element the element which the CSS classes will be applied to\n       * @param {string} add the CSS class(es) that will be added (multiple classes are separated via spaces)\n       * @param {string} remove the CSS class(es) that will be removed (multiple classes are separated via spaces)\n       * @param {object=} options an optional collection of options/styles that will be applied to the element\n       *\n       * @return {Promise} the animation callback promise\n       */\n      setClass: function(element, add, remove, options) {\n        options = prepareAnimateOptions(options);\n        options.addClass = mergeClasses(options.addClass, add);\n        options.removeClass = mergeClasses(options.removeClass, remove);\n        return $$animateQueue.push(element, 'setClass', options);\n      },\n\n      /**\n       * @ngdoc method\n       * @name $animate#animate\n       * @kind function\n       *\n       * @description Performs an inline animation on the element which applies the provided to and from CSS styles to the element.\n       * If any detected CSS transition, keyframe or JavaScript matches the provided className value, then the animation will take\n       * on the provided styles. For example, if a transition animation is set for the given classNamem, then the provided `from` and\n       * `to` styles will be applied alongside the given transition. If the CSS style provided in `from` does not have a corresponding\n       * style in `to`, the style in `from` is applied immediately, and no animation is run.\n       * If a JavaScript animation is detected then the provided styles will be given in as function parameters into the `animate`\n       * method (or as part of the `options` parameter):\n       *\n       * ```js\n       * ngModule.animation('.my-inline-animation', function() {\n       *   return {\n       *     animate : function(element, from, to, done, options) {\n       *       //animation\n       *       done();\n       *     }\n       *   }\n       * });\n       * ```\n       *\n       * @param {DOMElement} element the element which the CSS styles will be applied to\n       * @param {object} from the from (starting) CSS styles that will be applied to the element and across the animation.\n       * @param {object} to the to (destination) CSS styles that will be applied to the element and across the animation.\n       * @param {string=} className an optional CSS class that will be applied to the element for the duration of the animation. If\n       *    this value is left as empty then a CSS class of `ng-inline-animate` will be applied to the element.\n       *    (Note that if no animation is detected then this value will not be applied to the element.)\n       * @param {object=} options an optional collection of options/styles that will be applied to the element\n       *\n       * @return {Promise} the animation callback promise\n       */\n      animate: function(element, from, to, className, options) {\n        options = prepareAnimateOptions(options);\n        options.from = options.from ? extend(options.from, from) : from;\n        options.to   = options.to   ? extend(options.to, to)     : to;\n\n        className = className || 'ng-inline-animate';\n        options.tempClasses = mergeClasses(options.tempClasses, className);\n        return $$animateQueue.push(element, 'animate', options);\n      }\n    };\n  }];\n}];\n\nvar $$AnimateAsyncRunFactoryProvider = function() {\n  this.$get = ['$$rAF', function($$rAF) {\n    var waitQueue = [];\n\n    function waitForTick(fn) {\n      waitQueue.push(fn);\n      if (waitQueue.length > 1) return;\n      $$rAF(function() {\n        for (var i = 0; i < waitQueue.length; i++) {\n          waitQueue[i]();\n        }\n        waitQueue = [];\n      });\n    }\n\n    return function() {\n      var passed = false;\n      waitForTick(function() {\n        passed = true;\n      });\n      return function(callback) {\n        passed ? callback() : waitForTick(callback);\n      };\n    };\n  }];\n};\n\nvar $$AnimateRunnerFactoryProvider = function() {\n  this.$get = ['$q', '$sniffer', '$$animateAsyncRun', '$document', '$timeout',\n       function($q,   $sniffer,   $$animateAsyncRun,   $document,   $timeout) {\n\n    var INITIAL_STATE = 0;\n    var DONE_PENDING_STATE = 1;\n    var DONE_COMPLETE_STATE = 2;\n\n    AnimateRunner.chain = function(chain, callback) {\n      var index = 0;\n\n      next();\n      function next() {\n        if (index === chain.length) {\n          callback(true);\n          return;\n        }\n\n        chain[index](function(response) {\n          if (response === false) {\n            callback(false);\n            return;\n          }\n          index++;\n          next();\n        });\n      }\n    };\n\n    AnimateRunner.all = function(runners, callback) {\n      var count = 0;\n      var status = true;\n      forEach(runners, function(runner) {\n        runner.done(onProgress);\n      });\n\n      function onProgress(response) {\n        status = status && response;\n        if (++count === runners.length) {\n          callback(status);\n        }\n      }\n    };\n\n    function AnimateRunner(host) {\n      this.setHost(host);\n\n      var rafTick = $$animateAsyncRun();\n      var timeoutTick = function(fn) {\n        $timeout(fn, 0, false);\n      };\n\n      this._doneCallbacks = [];\n      this._tick = function(fn) {\n        var doc = $document[0];\n\n        // the document may not be ready or attached\n        // to the module for some internal tests\n        if (doc && doc.hidden) {\n          timeoutTick(fn);\n        } else {\n          rafTick(fn);\n        }\n      };\n      this._state = 0;\n    }\n\n    AnimateRunner.prototype = {\n      setHost: function(host) {\n        this.host = host || {};\n      },\n\n      done: function(fn) {\n        if (this._state === DONE_COMPLETE_STATE) {\n          fn();\n        } else {\n          this._doneCallbacks.push(fn);\n        }\n      },\n\n      progress: noop,\n\n      getPromise: function() {\n        if (!this.promise) {\n          var self = this;\n          this.promise = $q(function(resolve, reject) {\n            self.done(function(status) {\n              status === false ? reject() : resolve();\n            });\n          });\n        }\n        return this.promise;\n      },\n\n      then: function(resolveHandler, rejectHandler) {\n        return this.getPromise().then(resolveHandler, rejectHandler);\n      },\n\n      'catch': function(handler) {\n        return this.getPromise()['catch'](handler);\n      },\n\n      'finally': function(handler) {\n        return this.getPromise()['finally'](handler);\n      },\n\n      pause: function() {\n        if (this.host.pause) {\n          this.host.pause();\n        }\n      },\n\n      resume: function() {\n        if (this.host.resume) {\n          this.host.resume();\n        }\n      },\n\n      end: function() {\n        if (this.host.end) {\n          this.host.end();\n        }\n        this._resolve(true);\n      },\n\n      cancel: function() {\n        if (this.host.cancel) {\n          this.host.cancel();\n        }\n        this._resolve(false);\n      },\n\n      complete: function(response) {\n        var self = this;\n        if (self._state === INITIAL_STATE) {\n          self._state = DONE_PENDING_STATE;\n          self._tick(function() {\n            self._resolve(response);\n          });\n        }\n      },\n\n      _resolve: function(response) {\n        if (this._state !== DONE_COMPLETE_STATE) {\n          forEach(this._doneCallbacks, function(fn) {\n            fn(response);\n          });\n          this._doneCallbacks.length = 0;\n          this._state = DONE_COMPLETE_STATE;\n        }\n      }\n    };\n\n    return AnimateRunner;\n  }];\n};\n\n/**\n * @ngdoc service\n * @name $animateCss\n * @kind object\n *\n * @description\n * This is the core version of `$animateCss`. By default, only when the `ngAnimate` is included,\n * then the `$animateCss` service will actually perform animations.\n *\n * Click here {@link ngAnimate.$animateCss to read the documentation for $animateCss}.\n */\nvar $CoreAnimateCssProvider = function() {\n  this.$get = ['$$rAF', '$q', '$$AnimateRunner', function($$rAF, $q, $$AnimateRunner) {\n\n    return function(element, initialOptions) {\n      // all of the animation functions should create\n      // a copy of the options data, however, if a\n      // parent service has already created a copy then\n      // we should stick to using that\n      var options = initialOptions || {};\n      if (!options.$$prepared) {\n        options = copy(options);\n      }\n\n      // there is no point in applying the styles since\n      // there is no animation that goes on at all in\n      // this version of $animateCss.\n      if (options.cleanupStyles) {\n        options.from = options.to = null;\n      }\n\n      if (options.from) {\n        element.css(options.from);\n        options.from = null;\n      }\n\n      /* jshint newcap: false */\n      var closed, runner = new $$AnimateRunner();\n      return {\n        start: run,\n        end: run\n      };\n\n      function run() {\n        $$rAF(function() {\n          applyAnimationContents();\n          if (!closed) {\n            runner.complete();\n          }\n          closed = true;\n        });\n        return runner;\n      }\n\n      function applyAnimationContents() {\n        if (options.addClass) {\n          element.addClass(options.addClass);\n          options.addClass = null;\n        }\n        if (options.removeClass) {\n          element.removeClass(options.removeClass);\n          options.removeClass = null;\n        }\n        if (options.to) {\n          element.css(options.to);\n          options.to = null;\n        }\n      }\n    };\n  }];\n};\n\n/* global stripHash: true */\n\n/**\n * ! This is a private undocumented service !\n *\n * @name $browser\n * @requires $log\n * @description\n * This object has two goals:\n *\n * - hide all the global state in the browser caused by the window object\n * - abstract away all the browser specific features and inconsistencies\n *\n * For tests we provide {@link ngMock.$browser mock implementation} of the `$browser`\n * service, which can be used for convenient testing of the application without the interaction with\n * the real browser apis.\n */\n/**\n * @param {object} window The global window object.\n * @param {object} document jQuery wrapped document.\n * @param {object} $log window.console or an object with the same interface.\n * @param {object} $sniffer $sniffer service\n */\nfunction Browser(window, document, $log, $sniffer) {\n  var self = this,\n      location = window.location,\n      history = window.history,\n      setTimeout = window.setTimeout,\n      clearTimeout = window.clearTimeout,\n      pendingDeferIds = {};\n\n  self.isMock = false;\n\n  var outstandingRequestCount = 0;\n  var outstandingRequestCallbacks = [];\n\n  // TODO(vojta): remove this temporary api\n  self.$$completeOutstandingRequest = completeOutstandingRequest;\n  self.$$incOutstandingRequestCount = function() { outstandingRequestCount++; };\n\n  /**\n   * Executes the `fn` function(supports currying) and decrements the `outstandingRequestCallbacks`\n   * counter. If the counter reaches 0, all the `outstandingRequestCallbacks` are executed.\n   */\n  function completeOutstandingRequest(fn) {\n    try {\n      fn.apply(null, sliceArgs(arguments, 1));\n    } finally {\n      outstandingRequestCount--;\n      if (outstandingRequestCount === 0) {\n        while (outstandingRequestCallbacks.length) {\n          try {\n            outstandingRequestCallbacks.pop()();\n          } catch (e) {\n            $log.error(e);\n          }\n        }\n      }\n    }\n  }\n\n  function getHash(url) {\n    var index = url.indexOf('#');\n    return index === -1 ? '' : url.substr(index);\n  }\n\n  /**\n   * @private\n   * Note: this method is used only by scenario runner\n   * TODO(vojta): prefix this method with $$ ?\n   * @param {function()} callback Function that will be called when no outstanding request\n   */\n  self.notifyWhenNoOutstandingRequests = function(callback) {\n    if (outstandingRequestCount === 0) {\n      callback();\n    } else {\n      outstandingRequestCallbacks.push(callback);\n    }\n  };\n\n  //////////////////////////////////////////////////////////////\n  // URL API\n  //////////////////////////////////////////////////////////////\n\n  var cachedState, lastHistoryState,\n      lastBrowserUrl = location.href,\n      baseElement = document.find('base'),\n      pendingLocation = null,\n      getCurrentState = !$sniffer.history ? noop : function getCurrentState() {\n        try {\n          return history.state;\n        } catch (e) {\n          // MSIE can reportedly throw when there is no state (UNCONFIRMED).\n        }\n      };\n\n  cacheState();\n  lastHistoryState = cachedState;\n\n  /**\n   * @name $browser#url\n   *\n   * @description\n   * GETTER:\n   * Without any argument, this method just returns current value of location.href.\n   *\n   * SETTER:\n   * With at least one argument, this method sets url to new value.\n   * If html5 history api supported, pushState/replaceState is used, otherwise\n   * location.href/location.replace is used.\n   * Returns its own instance to allow chaining\n   *\n   * NOTE: this api is intended for use only by the $location service. Please use the\n   * {@link ng.$location $location service} to change url.\n   *\n   * @param {string} url New url (when used as setter)\n   * @param {boolean=} replace Should new url replace current history record?\n   * @param {object=} state object to use with pushState/replaceState\n   */\n  self.url = function(url, replace, state) {\n    // In modern browsers `history.state` is `null` by default; treating it separately\n    // from `undefined` would cause `$browser.url('/foo')` to change `history.state`\n    // to undefined via `pushState`. Instead, let's change `undefined` to `null` here.\n    if (isUndefined(state)) {\n      state = null;\n    }\n\n    // Android Browser BFCache causes location, history reference to become stale.\n    if (location !== window.location) location = window.location;\n    if (history !== window.history) history = window.history;\n\n    // setter\n    if (url) {\n      var sameState = lastHistoryState === state;\n\n      // Don't change anything if previous and current URLs and states match. This also prevents\n      // IE<10 from getting into redirect loop when in LocationHashbangInHtml5Url mode.\n      // See https://github.com/angular/angular.js/commit/ffb2701\n      if (lastBrowserUrl === url && (!$sniffer.history || sameState)) {\n        return self;\n      }\n      var sameBase = lastBrowserUrl && stripHash(lastBrowserUrl) === stripHash(url);\n      lastBrowserUrl = url;\n      lastHistoryState = state;\n      // Don't use history API if only the hash changed\n      // due to a bug in IE10/IE11 which leads\n      // to not firing a `hashchange` nor `popstate` event\n      // in some cases (see #9143).\n      if ($sniffer.history && (!sameBase || !sameState)) {\n        history[replace ? 'replaceState' : 'pushState'](state, '', url);\n        cacheState();\n        // Do the assignment again so that those two variables are referentially identical.\n        lastHistoryState = cachedState;\n      } else {\n        if (!sameBase || pendingLocation) {\n          pendingLocation = url;\n        }\n        if (replace) {\n          location.replace(url);\n        } else if (!sameBase) {\n          location.href = url;\n        } else {\n          location.hash = getHash(url);\n        }\n        if (location.href !== url) {\n          pendingLocation = url;\n        }\n      }\n      return self;\n    // getter\n    } else {\n      // - pendingLocation is needed as browsers don't allow to read out\n      //   the new location.href if a reload happened or if there is a bug like in iOS 9 (see\n      //   https://openradar.appspot.com/22186109).\n      // - the replacement is a workaround for https://bugzilla.mozilla.org/show_bug.cgi?id=407172\n      return pendingLocation || location.href.replace(/%27/g,\"'\");\n    }\n  };\n\n  /**\n   * @name $browser#state\n   *\n   * @description\n   * This method is a getter.\n   *\n   * Return history.state or null if history.state is undefined.\n   *\n   * @returns {object} state\n   */\n  self.state = function() {\n    return cachedState;\n  };\n\n  var urlChangeListeners = [],\n      urlChangeInit = false;\n\n  function cacheStateAndFireUrlChange() {\n    pendingLocation = null;\n    cacheState();\n    fireUrlChange();\n  }\n\n  // This variable should be used *only* inside the cacheState function.\n  var lastCachedState = null;\n  function cacheState() {\n    // This should be the only place in $browser where `history.state` is read.\n    cachedState = getCurrentState();\n    cachedState = isUndefined(cachedState) ? null : cachedState;\n\n    // Prevent callbacks fo fire twice if both hashchange & popstate were fired.\n    if (equals(cachedState, lastCachedState)) {\n      cachedState = lastCachedState;\n    }\n    lastCachedState = cachedState;\n  }\n\n  function fireUrlChange() {\n    if (lastBrowserUrl === self.url() && lastHistoryState === cachedState) {\n      return;\n    }\n\n    lastBrowserUrl = self.url();\n    lastHistoryState = cachedState;\n    forEach(urlChangeListeners, function(listener) {\n      listener(self.url(), cachedState);\n    });\n  }\n\n  /**\n   * @name $browser#onUrlChange\n   *\n   * @description\n   * Register callback function that will be called, when url changes.\n   *\n   * It's only called when the url is changed from outside of angular:\n   * - user types different url into address bar\n   * - user clicks on history (forward/back) button\n   * - user clicks on a link\n   *\n   * It's not called when url is changed by $browser.url() method\n   *\n   * The listener gets called with new url as parameter.\n   *\n   * NOTE: this api is intended for use only by the $location service. Please use the\n   * {@link ng.$location $location service} to monitor url changes in angular apps.\n   *\n   * @param {function(string)} listener Listener function to be called when url changes.\n   * @return {function(string)} Returns the registered listener fn - handy if the fn is anonymous.\n   */\n  self.onUrlChange = function(callback) {\n    // TODO(vojta): refactor to use node's syntax for events\n    if (!urlChangeInit) {\n      // We listen on both (hashchange/popstate) when available, as some browsers (e.g. Opera)\n      // don't fire popstate when user change the address bar and don't fire hashchange when url\n      // changed by push/replaceState\n\n      // html5 history api - popstate event\n      if ($sniffer.history) jqLite(window).on('popstate', cacheStateAndFireUrlChange);\n      // hashchange event\n      jqLite(window).on('hashchange', cacheStateAndFireUrlChange);\n\n      urlChangeInit = true;\n    }\n\n    urlChangeListeners.push(callback);\n    return callback;\n  };\n\n  /**\n   * @private\n   * Remove popstate and hashchange handler from window.\n   *\n   * NOTE: this api is intended for use only by $rootScope.\n   */\n  self.$$applicationDestroyed = function() {\n    jqLite(window).off('hashchange popstate', cacheStateAndFireUrlChange);\n  };\n\n  /**\n   * Checks whether the url has changed outside of Angular.\n   * Needs to be exported to be able to check for changes that have been done in sync,\n   * as hashchange/popstate events fire in async.\n   */\n  self.$$checkUrlChange = fireUrlChange;\n\n  //////////////////////////////////////////////////////////////\n  // Misc API\n  //////////////////////////////////////////////////////////////\n\n  /**\n   * @name $browser#baseHref\n   *\n   * @description\n   * Returns current <base href>\n   * (always relative - without domain)\n   *\n   * @returns {string} The current base href\n   */\n  self.baseHref = function() {\n    var href = baseElement.attr('href');\n    return href ? href.replace(/^(https?\\:)?\\/\\/[^\\/]*/, '') : '';\n  };\n\n  /**\n   * @name $browser#defer\n   * @param {function()} fn A function, who's execution should be deferred.\n   * @param {number=} [delay=0] of milliseconds to defer the function execution.\n   * @returns {*} DeferId that can be used to cancel the task via `$browser.defer.cancel()`.\n   *\n   * @description\n   * Executes a fn asynchronously via `setTimeout(fn, delay)`.\n   *\n   * Unlike when calling `setTimeout` directly, in test this function is mocked and instead of using\n   * `setTimeout` in tests, the fns are queued in an array, which can be programmatically flushed\n   * via `$browser.defer.flush()`.\n   *\n   */\n  self.defer = function(fn, delay) {\n    var timeoutId;\n    outstandingRequestCount++;\n    timeoutId = setTimeout(function() {\n      delete pendingDeferIds[timeoutId];\n      completeOutstandingRequest(fn);\n    }, delay || 0);\n    pendingDeferIds[timeoutId] = true;\n    return timeoutId;\n  };\n\n\n  /**\n   * @name $browser#defer.cancel\n   *\n   * @description\n   * Cancels a deferred task identified with `deferId`.\n   *\n   * @param {*} deferId Token returned by the `$browser.defer` function.\n   * @returns {boolean} Returns `true` if the task hasn't executed yet and was successfully\n   *                    canceled.\n   */\n  self.defer.cancel = function(deferId) {\n    if (pendingDeferIds[deferId]) {\n      delete pendingDeferIds[deferId];\n      clearTimeout(deferId);\n      completeOutstandingRequest(noop);\n      return true;\n    }\n    return false;\n  };\n\n}\n\nfunction $BrowserProvider() {\n  this.$get = ['$window', '$log', '$sniffer', '$document',\n      function($window, $log, $sniffer, $document) {\n        return new Browser($window, $document, $log, $sniffer);\n      }];\n}\n\n/**\n * @ngdoc service\n * @name $cacheFactory\n *\n * @description\n * Factory that constructs {@link $cacheFactory.Cache Cache} objects and gives access to\n * them.\n *\n * ```js\n *\n *  var cache = $cacheFactory('cacheId');\n *  expect($cacheFactory.get('cacheId')).toBe(cache);\n *  expect($cacheFactory.get('noSuchCacheId')).not.toBeDefined();\n *\n *  cache.put(\"key\", \"value\");\n *  cache.put(\"another key\", \"another value\");\n *\n *  // We've specified no options on creation\n *  expect(cache.info()).toEqual({id: 'cacheId', size: 2});\n *\n * ```\n *\n *\n * @param {string} cacheId Name or id of the newly created cache.\n * @param {object=} options Options object that specifies the cache behavior. Properties:\n *\n *   - `{number=}` `capacity` — turns the cache into LRU cache.\n *\n * @returns {object} Newly created cache object with the following set of methods:\n *\n * - `{object}` `info()` — Returns id, size, and options of cache.\n * - `{{*}}` `put({string} key, {*} value)` — Puts a new key-value pair into the cache and returns\n *   it.\n * - `{{*}}` `get({string} key)` — Returns cached value for `key` or undefined for cache miss.\n * - `{void}` `remove({string} key)` — Removes a key-value pair from the cache.\n * - `{void}` `removeAll()` — Removes all cached values.\n * - `{void}` `destroy()` — Removes references to this cache from $cacheFactory.\n *\n * @example\n   <example module=\"cacheExampleApp\">\n     <file name=\"index.html\">\n       <div ng-controller=\"CacheController\">\n         <input ng-model=\"newCacheKey\" placeholder=\"Key\">\n         <input ng-model=\"newCacheValue\" placeholder=\"Value\">\n         <button ng-click=\"put(newCacheKey, newCacheValue)\">Cache</button>\n\n         <p ng-if=\"keys.length\">Cached Values</p>\n         <div ng-repeat=\"key in keys\">\n           <span ng-bind=\"key\"></span>\n           <span>: </span>\n           <b ng-bind=\"cache.get(key)\"></b>\n         </div>\n\n         <p>Cache Info</p>\n         <div ng-repeat=\"(key, value) in cache.info()\">\n           <span ng-bind=\"key\"></span>\n           <span>: </span>\n           <b ng-bind=\"value\"></b>\n         </div>\n       </div>\n     </file>\n     <file name=\"script.js\">\n       angular.module('cacheExampleApp', []).\n         controller('CacheController', ['$scope', '$cacheFactory', function($scope, $cacheFactory) {\n           $scope.keys = [];\n           $scope.cache = $cacheFactory('cacheId');\n           $scope.put = function(key, value) {\n             if (angular.isUndefined($scope.cache.get(key))) {\n               $scope.keys.push(key);\n             }\n             $scope.cache.put(key, angular.isUndefined(value) ? null : value);\n           };\n         }]);\n     </file>\n     <file name=\"style.css\">\n       p {\n         margin: 10px 0 3px;\n       }\n     </file>\n   </example>\n */\nfunction $CacheFactoryProvider() {\n\n  this.$get = function() {\n    var caches = {};\n\n    function cacheFactory(cacheId, options) {\n      if (cacheId in caches) {\n        throw minErr('$cacheFactory')('iid', \"CacheId '{0}' is already taken!\", cacheId);\n      }\n\n      var size = 0,\n          stats = extend({}, options, {id: cacheId}),\n          data = createMap(),\n          capacity = (options && options.capacity) || Number.MAX_VALUE,\n          lruHash = createMap(),\n          freshEnd = null,\n          staleEnd = null;\n\n      /**\n       * @ngdoc type\n       * @name $cacheFactory.Cache\n       *\n       * @description\n       * A cache object used to store and retrieve data, primarily used by\n       * {@link $http $http} and the {@link ng.directive:script script} directive to cache\n       * templates and other data.\n       *\n       * ```js\n       *  angular.module('superCache')\n       *    .factory('superCache', ['$cacheFactory', function($cacheFactory) {\n       *      return $cacheFactory('super-cache');\n       *    }]);\n       * ```\n       *\n       * Example test:\n       *\n       * ```js\n       *  it('should behave like a cache', inject(function(superCache) {\n       *    superCache.put('key', 'value');\n       *    superCache.put('another key', 'another value');\n       *\n       *    expect(superCache.info()).toEqual({\n       *      id: 'super-cache',\n       *      size: 2\n       *    });\n       *\n       *    superCache.remove('another key');\n       *    expect(superCache.get('another key')).toBeUndefined();\n       *\n       *    superCache.removeAll();\n       *    expect(superCache.info()).toEqual({\n       *      id: 'super-cache',\n       *      size: 0\n       *    });\n       *  }));\n       * ```\n       */\n      return caches[cacheId] = {\n\n        /**\n         * @ngdoc method\n         * @name $cacheFactory.Cache#put\n         * @kind function\n         *\n         * @description\n         * Inserts a named entry into the {@link $cacheFactory.Cache Cache} object to be\n         * retrieved later, and incrementing the size of the cache if the key was not already\n         * present in the cache. If behaving like an LRU cache, it will also remove stale\n         * entries from the set.\n         *\n         * It will not insert undefined values into the cache.\n         *\n         * @param {string} key the key under which the cached data is stored.\n         * @param {*} value the value to store alongside the key. If it is undefined, the key\n         *    will not be stored.\n         * @returns {*} the value stored.\n         */\n        put: function(key, value) {\n          if (isUndefined(value)) return;\n          if (capacity < Number.MAX_VALUE) {\n            var lruEntry = lruHash[key] || (lruHash[key] = {key: key});\n\n            refresh(lruEntry);\n          }\n\n          if (!(key in data)) size++;\n          data[key] = value;\n\n          if (size > capacity) {\n            this.remove(staleEnd.key);\n          }\n\n          return value;\n        },\n\n        /**\n         * @ngdoc method\n         * @name $cacheFactory.Cache#get\n         * @kind function\n         *\n         * @description\n         * Retrieves named data stored in the {@link $cacheFactory.Cache Cache} object.\n         *\n         * @param {string} key the key of the data to be retrieved\n         * @returns {*} the value stored.\n         */\n        get: function(key) {\n          if (capacity < Number.MAX_VALUE) {\n            var lruEntry = lruHash[key];\n\n            if (!lruEntry) return;\n\n            refresh(lruEntry);\n          }\n\n          return data[key];\n        },\n\n\n        /**\n         * @ngdoc method\n         * @name $cacheFactory.Cache#remove\n         * @kind function\n         *\n         * @description\n         * Removes an entry from the {@link $cacheFactory.Cache Cache} object.\n         *\n         * @param {string} key the key of the entry to be removed\n         */\n        remove: function(key) {\n          if (capacity < Number.MAX_VALUE) {\n            var lruEntry = lruHash[key];\n\n            if (!lruEntry) return;\n\n            if (lruEntry == freshEnd) freshEnd = lruEntry.p;\n            if (lruEntry == staleEnd) staleEnd = lruEntry.n;\n            link(lruEntry.n,lruEntry.p);\n\n            delete lruHash[key];\n          }\n\n          if (!(key in data)) return;\n\n          delete data[key];\n          size--;\n        },\n\n\n        /**\n         * @ngdoc method\n         * @name $cacheFactory.Cache#removeAll\n         * @kind function\n         *\n         * @description\n         * Clears the cache object of any entries.\n         */\n        removeAll: function() {\n          data = createMap();\n          size = 0;\n          lruHash = createMap();\n          freshEnd = staleEnd = null;\n        },\n\n\n        /**\n         * @ngdoc method\n         * @name $cacheFactory.Cache#destroy\n         * @kind function\n         *\n         * @description\n         * Destroys the {@link $cacheFactory.Cache Cache} object entirely,\n         * removing it from the {@link $cacheFactory $cacheFactory} set.\n         */\n        destroy: function() {\n          data = null;\n          stats = null;\n          lruHash = null;\n          delete caches[cacheId];\n        },\n\n\n        /**\n         * @ngdoc method\n         * @name $cacheFactory.Cache#info\n         * @kind function\n         *\n         * @description\n         * Retrieve information regarding a particular {@link $cacheFactory.Cache Cache}.\n         *\n         * @returns {object} an object with the following properties:\n         *   <ul>\n         *     <li>**id**: the id of the cache instance</li>\n         *     <li>**size**: the number of entries kept in the cache instance</li>\n         *     <li>**...**: any additional properties from the options object when creating the\n         *       cache.</li>\n         *   </ul>\n         */\n        info: function() {\n          return extend({}, stats, {size: size});\n        }\n      };\n\n\n      /**\n       * makes the `entry` the freshEnd of the LRU linked list\n       */\n      function refresh(entry) {\n        if (entry != freshEnd) {\n          if (!staleEnd) {\n            staleEnd = entry;\n          } else if (staleEnd == entry) {\n            staleEnd = entry.n;\n          }\n\n          link(entry.n, entry.p);\n          link(entry, freshEnd);\n          freshEnd = entry;\n          freshEnd.n = null;\n        }\n      }\n\n\n      /**\n       * bidirectionally links two entries of the LRU linked list\n       */\n      function link(nextEntry, prevEntry) {\n        if (nextEntry != prevEntry) {\n          if (nextEntry) nextEntry.p = prevEntry; //p stands for previous, 'prev' didn't minify\n          if (prevEntry) prevEntry.n = nextEntry; //n stands for next, 'next' didn't minify\n        }\n      }\n    }\n\n\n  /**\n   * @ngdoc method\n   * @name $cacheFactory#info\n   *\n   * @description\n   * Get information about all the caches that have been created\n   *\n   * @returns {Object} - key-value map of `cacheId` to the result of calling `cache#info`\n   */\n    cacheFactory.info = function() {\n      var info = {};\n      forEach(caches, function(cache, cacheId) {\n        info[cacheId] = cache.info();\n      });\n      return info;\n    };\n\n\n  /**\n   * @ngdoc method\n   * @name $cacheFactory#get\n   *\n   * @description\n   * Get access to a cache object by the `cacheId` used when it was created.\n   *\n   * @param {string} cacheId Name or id of a cache to access.\n   * @returns {object} Cache object identified by the cacheId or undefined if no such cache.\n   */\n    cacheFactory.get = function(cacheId) {\n      return caches[cacheId];\n    };\n\n\n    return cacheFactory;\n  };\n}\n\n/**\n * @ngdoc service\n * @name $templateCache\n *\n * @description\n * The first time a template is used, it is loaded in the template cache for quick retrieval. You\n * can load templates directly into the cache in a `script` tag, or by consuming the\n * `$templateCache` service directly.\n *\n * Adding via the `script` tag:\n *\n * ```html\n *   <script type=\"text/ng-template\" id=\"templateId.html\">\n *     <p>This is the content of the template</p>\n *   </script>\n * ```\n *\n * **Note:** the `script` tag containing the template does not need to be included in the `head` of\n * the document, but it must be a descendent of the {@link ng.$rootElement $rootElement} (IE,\n * element with ng-app attribute), otherwise the template will be ignored.\n *\n * Adding via the `$templateCache` service:\n *\n * ```js\n * var myApp = angular.module('myApp', []);\n * myApp.run(function($templateCache) {\n *   $templateCache.put('templateId.html', 'This is the content of the template');\n * });\n * ```\n *\n * To retrieve the template later, simply use it in your HTML:\n * ```html\n * <div ng-include=\" 'templateId.html' \"></div>\n * ```\n *\n * or get it via Javascript:\n * ```js\n * $templateCache.get('templateId.html')\n * ```\n *\n * See {@link ng.$cacheFactory $cacheFactory}.\n *\n */\nfunction $TemplateCacheProvider() {\n  this.$get = ['$cacheFactory', function($cacheFactory) {\n    return $cacheFactory('templates');\n  }];\n}\n\n/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n *     Any commits to this file should be reviewed with security in mind.  *\n *   Changes to this file can potentially create security vulnerabilities. *\n *          An approval from 2 Core members with history of modifying      *\n *                         this file is required.                          *\n *                                                                         *\n *  Does the change somehow allow for arbitrary javascript to be executed? *\n *    Or allows for someone to change the prototype of built-in objects?   *\n *     Or gives undesired access to variables likes document or window?    *\n * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */\n\n/* ! VARIABLE/FUNCTION NAMING CONVENTIONS THAT APPLY TO THIS FILE!\n *\n * DOM-related variables:\n *\n * - \"node\" - DOM Node\n * - \"element\" - DOM Element or Node\n * - \"$node\" or \"$element\" - jqLite-wrapped node or element\n *\n *\n * Compiler related stuff:\n *\n * - \"linkFn\" - linking fn of a single directive\n * - \"nodeLinkFn\" - function that aggregates all linking fns for a particular node\n * - \"childLinkFn\" -  function that aggregates all linking fns for child nodes of a particular node\n * - \"compositeLinkFn\" - function that aggregates all linking fns for a compilation root (nodeList)\n */\n\n\n/**\n * @ngdoc service\n * @name $compile\n * @kind function\n *\n * @description\n * Compiles an HTML string or DOM into a template and produces a template function, which\n * can then be used to link {@link ng.$rootScope.Scope `scope`} and the template together.\n *\n * The compilation is a process of walking the DOM tree and matching DOM elements to\n * {@link ng.$compileProvider#directive directives}.\n *\n * <div class=\"alert alert-warning\">\n * **Note:** This document is an in-depth reference of all directive options.\n * For a gentle introduction to directives with examples of common use cases,\n * see the {@link guide/directive directive guide}.\n * </div>\n *\n * ## Comprehensive Directive API\n *\n * There are many different options for a directive.\n *\n * The difference resides in the return value of the factory function.\n * You can either return a \"Directive Definition Object\" (see below) that defines the directive properties,\n * or just the `postLink` function (all other properties will have the default values).\n *\n * <div class=\"alert alert-success\">\n * **Best Practice:** It's recommended to use the \"directive definition object\" form.\n * </div>\n *\n * Here's an example directive declared with a Directive Definition Object:\n *\n * ```js\n *   var myModule = angular.module(...);\n *\n *   myModule.directive('directiveName', function factory(injectables) {\n *     var directiveDefinitionObject = {\n *       priority: 0,\n *       template: '<div></div>', // or // function(tElement, tAttrs) { ... },\n *       // or\n *       // templateUrl: 'directive.html', // or // function(tElement, tAttrs) { ... },\n *       transclude: false,\n *       restrict: 'A',\n *       templateNamespace: 'html',\n *       scope: false,\n *       controller: function($scope, $element, $attrs, $transclude, otherInjectables) { ... },\n *       controllerAs: 'stringIdentifier',\n *       bindToController: false,\n *       require: 'siblingDirectiveName', // or // ['^parentDirectiveName', '?optionalDirectiveName', '?^optionalParent'],\n *       compile: function compile(tElement, tAttrs, transclude) {\n *         return {\n *           pre: function preLink(scope, iElement, iAttrs, controller) { ... },\n *           post: function postLink(scope, iElement, iAttrs, controller) { ... }\n *         }\n *         // or\n *         // return function postLink( ... ) { ... }\n *       },\n *       // or\n *       // link: {\n *       //  pre: function preLink(scope, iElement, iAttrs, controller) { ... },\n *       //  post: function postLink(scope, iElement, iAttrs, controller) { ... }\n *       // }\n *       // or\n *       // link: function postLink( ... ) { ... }\n *     };\n *     return directiveDefinitionObject;\n *   });\n * ```\n *\n * <div class=\"alert alert-warning\">\n * **Note:** Any unspecified options will use the default value. You can see the default values below.\n * </div>\n *\n * Therefore the above can be simplified as:\n *\n * ```js\n *   var myModule = angular.module(...);\n *\n *   myModule.directive('directiveName', function factory(injectables) {\n *     var directiveDefinitionObject = {\n *       link: function postLink(scope, iElement, iAttrs) { ... }\n *     };\n *     return directiveDefinitionObject;\n *     // or\n *     // return function postLink(scope, iElement, iAttrs) { ... }\n *   });\n * ```\n *\n *\n *\n * ### Directive Definition Object\n *\n * The directive definition object provides instructions to the {@link ng.$compile\n * compiler}. The attributes are:\n *\n * #### `multiElement`\n * When this property is set to true, the HTML compiler will collect DOM nodes between\n * nodes with the attributes `directive-name-start` and `directive-name-end`, and group them\n * together as the directive elements. It is recommended that this feature be used on directives\n * which are not strictly behavioral (such as {@link ngClick}), and which\n * do not manipulate or replace child nodes (such as {@link ngInclude}).\n *\n * #### `priority`\n * When there are multiple directives defined on a single DOM element, sometimes it\n * is necessary to specify the order in which the directives are applied. The `priority` is used\n * to sort the directives before their `compile` functions get called. Priority is defined as a\n * number. Directives with greater numerical `priority` are compiled first. Pre-link functions\n * are also run in priority order, but post-link functions are run in reverse order. The order\n * of directives with the same priority is undefined. The default priority is `0`.\n *\n * #### `terminal`\n * If set to true then the current `priority` will be the last set of directives\n * which will execute (any directives at the current priority will still execute\n * as the order of execution on same `priority` is undefined). Note that expressions\n * and other directives used in the directive's template will also be excluded from execution.\n *\n * #### `scope`\n * The scope property can be `true`, an object or a falsy value:\n *\n * * **falsy:** No scope will be created for the directive. The directive will use its parent's scope.\n *\n * * **`true`:** A new child scope that prototypically inherits from its parent will be created for\n * the directive's element. If multiple directives on the same element request a new scope,\n * only one new scope is created. The new scope rule does not apply for the root of the template\n * since the root of the template always gets a new scope.\n *\n * * **`{...}` (an object hash):** A new \"isolate\" scope is created for the directive's element. The\n * 'isolate' scope differs from normal scope in that it does not prototypically inherit from its parent\n * scope. This is useful when creating reusable components, which should not accidentally read or modify\n * data in the parent scope.\n *\n * The 'isolate' scope object hash defines a set of local scope properties derived from attributes on the\n * directive's element. These local properties are useful for aliasing values for templates. The keys in\n * the object hash map to the name of the property on the isolate scope; the values define how the property\n * is bound to the parent scope, via matching attributes on the directive's element:\n *\n * * `@` or `@attr` - bind a local scope property to the value of DOM attribute. The result is\n *   always a string since DOM attributes are strings. If no `attr` name is specified then the\n *   attribute name is assumed to be the same as the local name. Given `<my-component\n *   my-attr=\"hello {{name}}\">` and the isolate scope definition `scope: { localName:'@myAttr' }`,\n *   the directive's scope property `localName` will reflect the interpolated value of `hello\n *   {{name}}`. As the `name` attribute changes so will the `localName` property on the directive's\n *   scope. The `name` is read from the parent scope (not the directive's scope).\n *\n * * `=` or `=attr` - set up a bidirectional binding between a local scope property and an expression\n *   passed via the attribute `attr`. The expression is evaluated in the context of the parent scope.\n *   If no `attr` name is specified then the attribute name is assumed to be the same as the local\n *   name. Given `<my-component my-attr=\"parentModel\">` and the isolate scope definition `scope: {\n *   localModel: '=myAttr' }`, the property `localModel` on the directive's scope will reflect the\n *   value of `parentModel` on the parent scope. Changes to `parentModel` will be reflected in\n *   `localModel` and vice versa. Optional attributes should be marked as such with a question mark:\n *   `=?` or `=?attr`. If the binding expression is non-assignable, or if the attribute isn't\n *   optional and doesn't exist, an exception ({@link error/$compile/nonassign `$compile:nonassign`})\n *   will be thrown upon discovering changes to the local value, since it will be impossible to sync\n *   them back to the parent scope. By default, the {@link ng.$rootScope.Scope#$watch `$watch`}\n *   method is used for tracking changes, and the equality check is based on object identity.\n *   However, if an object literal or an array literal is passed as the binding expression, the\n *   equality check is done by value (using the {@link angular.equals} function). It's also possible\n *   to watch the evaluated value shallowly with {@link ng.$rootScope.Scope#$watchCollection\n *   `$watchCollection`}: use `=*` or `=*attr` (`=*?` or `=*?attr` if the attribute is optional).\n *\n  * * `<` or `<attr` - set up a one-way (one-directional) binding between a local scope property and an\n *   expression passed via the attribute `attr`. The expression is evaluated in the context of the\n *   parent scope. If no `attr` name is specified then the attribute name is assumed to be the same as the\n *   local name. You can also make the binding optional by adding `?`: `<?` or `<?attr`.\n *\n *   For example, given `<my-component my-attr=\"parentModel\">` and directive definition of\n *   `scope: { localModel:'<myAttr' }`, then the isolated scope property `localModel` will reflect the\n *   value of `parentModel` on the parent scope. Any changes to `parentModel` will be reflected\n *   in `localModel`, but changes in `localModel` will not reflect in `parentModel`. There are however\n *   two caveats:\n *     1. one-way binding does not copy the value from the parent to the isolate scope, it simply\n *     sets the same value. That means if your bound value is an object, changes to its properties\n *     in the isolated scope will be reflected in the parent scope (because both reference the same object).\n *     2. one-way binding watches changes to the **identity** of the parent value. That means the\n *     {@link ng.$rootScope.Scope#$watch `$watch`} on the parent value only fires if the reference\n *     to the value has changed. In most cases, this should not be of concern, but can be important\n *     to know if you one-way bind to an object, and then replace that object in the isolated scope.\n *     If you now change a property of the object in your parent scope, the change will not be\n *     propagated to the isolated scope, because the identity of the object on the parent scope\n *     has not changed. Instead you must assign a new object.\n *\n *   One-way binding is useful if you do not plan to propagate changes to your isolated scope bindings\n *   back to the parent. However, it does not make this completely impossible.\n *\n * * `&` or `&attr` - provides a way to execute an expression in the context of the parent scope. If\n *   no `attr` name is specified then the attribute name is assumed to be the same as the local name.\n *   Given `<my-component my-attr=\"count = count + value\">` and the isolate scope definition `scope: {\n *   localFn:'&myAttr' }`, the isolate scope property `localFn` will point to a function wrapper for\n *   the `count = count + value` expression. Often it's desirable to pass data from the isolated scope\n *   via an expression to the parent scope. This can be done by passing a map of local variable names\n *   and values into the expression wrapper fn. For example, if the expression is `increment(amount)`\n *   then we can specify the amount value by calling the `localFn` as `localFn({amount: 22})`.\n *\n * In general it's possible to apply more than one directive to one element, but there might be limitations\n * depending on the type of scope required by the directives. The following points will help explain these limitations.\n * For simplicity only two directives are taken into account, but it is also applicable for several directives:\n *\n * * **no scope** + **no scope** => Two directives which don't require their own scope will use their parent's scope\n * * **child scope** + **no scope** =>  Both directives will share one single child scope\n * * **child scope** + **child scope** =>  Both directives will share one single child scope\n * * **isolated scope** + **no scope** =>  The isolated directive will use it's own created isolated scope. The other directive will use\n * its parent's scope\n * * **isolated scope** + **child scope** =>  **Won't work!** Only one scope can be related to one element. Therefore these directives cannot\n * be applied to the same element.\n * * **isolated scope** + **isolated scope**  =>  **Won't work!** Only one scope can be related to one element. Therefore these directives\n * cannot be applied to the same element.\n *\n *\n * #### `bindToController`\n * This property is used to bind scope properties directly to the controller. It can be either\n * `true` or an object hash with the same format as the `scope` property. Additionally, a controller\n * alias must be set, either by using `controllerAs: 'myAlias'` or by specifying the alias in the controller\n * definition: `controller: 'myCtrl as myAlias'`.\n *\n * When an isolate scope is used for a directive (see above), `bindToController: true` will\n * allow a component to have its properties bound to the controller, rather than to scope.\n *\n * After the controller is instantiated, the initial values of the isolate scope bindings will be bound to the controller\n * properties. You can access these bindings once they have been initialized by providing a controller method called\n * `$onInit`, which is called after all the controllers on an element have been constructed and had their bindings\n * initialized.\n *\n * <div class=\"alert alert-warning\">\n * **Deprecation warning:** although bindings for non-ES6 class controllers are currently\n * bound to `this` before the controller constructor is called, this use is now deprecated. Please place initialization\n * code that relies upon bindings inside a `$onInit` method on the controller, instead.\n * </div>\n *\n * It is also possible to set `bindToController` to an object hash with the same format as the `scope` property.\n * This will set up the scope bindings to the controller directly. Note that `scope` can still be used\n * to define which kind of scope is created. By default, no scope is created. Use `scope: {}` to create an isolate\n * scope (useful for component directives).\n *\n * If both `bindToController` and `scope` are defined and have object hashes, `bindToController` overrides `scope`.\n *\n *\n * #### `controller`\n * Controller constructor function. The controller is instantiated before the\n * pre-linking phase and can be accessed by other directives (see\n * `require` attribute). This allows the directives to communicate with each other and augment\n * each other's behavior. The controller is injectable (and supports bracket notation) with the following locals:\n *\n * * `$scope` - Current scope associated with the element\n * * `$element` - Current element\n * * `$attrs` - Current attributes object for the element\n * * `$transclude` - A transclude linking function pre-bound to the correct transclusion scope:\n *   `function([scope], cloneLinkingFn, futureParentElement, slotName)`:\n *    * `scope`: (optional) override the scope.\n *    * `cloneLinkingFn`: (optional) argument to create clones of the original transcluded content.\n *    * `futureParentElement` (optional):\n *        * defines the parent to which the `cloneLinkingFn` will add the cloned elements.\n *        * default: `$element.parent()` resp. `$element` for `transclude:'element'` resp. `transclude:true`.\n *        * only needed for transcludes that are allowed to contain non html elements (e.g. SVG elements)\n *          and when the `cloneLinkinFn` is passed,\n *          as those elements need to created and cloned in a special way when they are defined outside their\n *          usual containers (e.g. like `<svg>`).\n *        * See also the `directive.templateNamespace` property.\n *    * `slotName`: (optional) the name of the slot to transclude. If falsy (e.g. `null`, `undefined` or `''`)\n *      then the default translusion is provided.\n *    The `$transclude` function also has a method on it, `$transclude.isSlotFilled(slotName)`, which returns\n *    `true` if the specified slot contains content (i.e. one or more DOM nodes).\n *\n * The controller can provide the following methods that act as life-cycle hooks:\n * * `$onInit()` - Called on each controller after all the controllers on an element have been constructed and\n *   had their bindings initialized (and before the pre &amp; post linking functions for the directives on\n *   this element). This is a good place to put initialization code for your controller.\n * * `$onChanges(changesObj)` - Called whenever one-way (`<`) or interpolation (`@`) bindings are updated. The\n *   `changesObj` is a hash whose keys are the names of the bound properties that have changed, and the values are an\n *   object of the form `{ currentValue, previousValue, isFirstChange() }`. Use this hook to trigger updates within a\n *   component such as cloning the bound value to prevent accidental mutation of the outer value.\n * * `$onDestroy()` - Called on a controller when its containing scope is destroyed. Use this hook for releasing\n *   external resources, watches and event handlers. Note that components have their `$onDestroy()` hooks called in\n *   the same order as the `$scope.$broadcast` events are triggered, which is top down. This means that parent\n *   components will have their `$onDestroy()` hook called before child components.\n * * `$postLink()` - Called after this controller's element and its children have been linked. Similar to the post-link\n *   function this hook can be used to set up DOM event handlers and do direct DOM manipulation.\n *   Note that child elements that contain `templateUrl` directives will not have been compiled and linked since\n *   they are waiting for their template to load asynchronously and their own compilation and linking has been\n *   suspended until that occurs.\n *\n *\n * #### `require`\n * Require another directive and inject its controller as the fourth argument to the linking function. The\n * `require` property can be a string, an array or an object:\n * * a **string** containing the name of the directive to pass to the linking function\n * * an **array** containing the names of directives to pass to the linking function. The argument passed to the\n * linking function will be an array of controllers in the same order as the names in the `require` property\n * * an **object** whose property values are the names of the directives to pass to the linking function. The argument\n * passed to the linking function will also be an object with matching keys, whose values will hold the corresponding\n * controllers.\n *\n * If the `require` property is an object and `bindToController` is truthy, then the required controllers are\n * bound to the controller using the keys of the `require` property. This binding occurs after all the controllers\n * have been constructed but before `$onInit` is called.\n * See the {@link $compileProvider#component} helper for an example of how this can be used.\n *\n * If no such required directive(s) can be found, or if the directive does not have a controller, then an error is\n * raised (unless no link function is specified and the required controllers are not being bound to the directive\n * controller, in which case error checking is skipped). The name can be prefixed with:\n *\n * * (no prefix) - Locate the required controller on the current element. Throw an error if not found.\n * * `?` - Attempt to locate the required controller or pass `null` to the `link` fn if not found.\n * * `^` - Locate the required controller by searching the element and its parents. Throw an error if not found.\n * * `^^` - Locate the required controller by searching the element's parents. Throw an error if not found.\n * * `?^` - Attempt to locate the required controller by searching the element and its parents or pass\n *   `null` to the `link` fn if not found.\n * * `?^^` - Attempt to locate the required controller by searching the element's parents, or pass\n *   `null` to the `link` fn if not found.\n *\n *\n * #### `controllerAs`\n * Identifier name for a reference to the controller in the directive's scope.\n * This allows the controller to be referenced from the directive template. This is especially\n * useful when a directive is used as component, i.e. with an `isolate` scope. It's also possible\n * to use it in a directive without an `isolate` / `new` scope, but you need to be aware that the\n * `controllerAs` reference might overwrite a property that already exists on the parent scope.\n *\n *\n * #### `restrict`\n * String of subset of `EACM` which restricts the directive to a specific directive\n * declaration style. If omitted, the defaults (elements and attributes) are used.\n *\n * * `E` - Element name (default): `<my-directive></my-directive>`\n * * `A` - Attribute (default): `<div my-directive=\"exp\"></div>`\n * * `C` - Class: `<div class=\"my-directive: exp;\"></div>`\n * * `M` - Comment: `<!-- directive: my-directive exp -->`\n *\n *\n * #### `templateNamespace`\n * String representing the document type used by the markup in the template.\n * AngularJS needs this information as those elements need to be created and cloned\n * in a special way when they are defined outside their usual containers like `<svg>` and `<math>`.\n *\n * * `html` - All root nodes in the template are HTML. Root nodes may also be\n *   top-level elements such as `<svg>` or `<math>`.\n * * `svg` - The root nodes in the template are SVG elements (excluding `<math>`).\n * * `math` - The root nodes in the template are MathML elements (excluding `<svg>`).\n *\n * If no `templateNamespace` is specified, then the namespace is considered to be `html`.\n *\n * #### `template`\n * HTML markup that may:\n * * Replace the contents of the directive's element (default).\n * * Replace the directive's element itself (if `replace` is true - DEPRECATED).\n * * Wrap the contents of the directive's element (if `transclude` is true).\n *\n * Value may be:\n *\n * * A string. For example `<div red-on-hover>{{delete_str}}</div>`.\n * * A function which takes two arguments `tElement` and `tAttrs` (described in the `compile`\n *   function api below) and returns a string value.\n *\n *\n * #### `templateUrl`\n * This is similar to `template` but the template is loaded from the specified URL, asynchronously.\n *\n * Because template loading is asynchronous the compiler will suspend compilation of directives on that element\n * for later when the template has been resolved.  In the meantime it will continue to compile and link\n * sibling and parent elements as though this element had not contained any directives.\n *\n * The compiler does not suspend the entire compilation to wait for templates to be loaded because this\n * would result in the whole app \"stalling\" until all templates are loaded asynchronously - even in the\n * case when only one deeply nested directive has `templateUrl`.\n *\n * Template loading is asynchronous even if the template has been preloaded into the {@link $templateCache}\n *\n * You can specify `templateUrl` as a string representing the URL or as a function which takes two\n * arguments `tElement` and `tAttrs` (described in the `compile` function api below) and returns\n * a string value representing the url.  In either case, the template URL is passed through {@link\n * $sce#getTrustedResourceUrl $sce.getTrustedResourceUrl}.\n *\n *\n * #### `replace` ([*DEPRECATED*!], will be removed in next major release - i.e. v2.0)\n * specify what the template should replace. Defaults to `false`.\n *\n * * `true` - the template will replace the directive's element.\n * * `false` - the template will replace the contents of the directive's element.\n *\n * The replacement process migrates all of the attributes / classes from the old element to the new\n * one. See the {@link guide/directive#template-expanding-directive\n * Directives Guide} for an example.\n *\n * There are very few scenarios where element replacement is required for the application function,\n * the main one being reusable custom components that are used within SVG contexts\n * (because SVG doesn't work with custom elements in the DOM tree).\n *\n * #### `transclude`\n * Extract the contents of the element where the directive appears and make it available to the directive.\n * The contents are compiled and provided to the directive as a **transclusion function**. See the\n * {@link $compile#transclusion Transclusion} section below.\n *\n *\n * #### `compile`\n *\n * ```js\n *   function compile(tElement, tAttrs, transclude) { ... }\n * ```\n *\n * The compile function deals with transforming the template DOM. Since most directives do not do\n * template transformation, it is not used often. The compile function takes the following arguments:\n *\n *   * `tElement` - template element - The element where the directive has been declared. It is\n *     safe to do template transformation on the element and child elements only.\n *\n *   * `tAttrs` - template attributes - Normalized list of attributes declared on this element shared\n *     between all directive compile functions.\n *\n *   * `transclude` -  [*DEPRECATED*!] A transclude linking function: `function(scope, cloneLinkingFn)`\n *\n * <div class=\"alert alert-warning\">\n * **Note:** The template instance and the link instance may be different objects if the template has\n * been cloned. For this reason it is **not** safe to do anything other than DOM transformations that\n * apply to all cloned DOM nodes within the compile function. Specifically, DOM listener registration\n * should be done in a linking function rather than in a compile function.\n * </div>\n\n * <div class=\"alert alert-warning\">\n * **Note:** The compile function cannot handle directives that recursively use themselves in their\n * own templates or compile functions. Compiling these directives results in an infinite loop and\n * stack overflow errors.\n *\n * This can be avoided by manually using $compile in the postLink function to imperatively compile\n * a directive's template instead of relying on automatic template compilation via `template` or\n * `templateUrl` declaration or manual compilation inside the compile function.\n * </div>\n *\n * <div class=\"alert alert-danger\">\n * **Note:** The `transclude` function that is passed to the compile function is deprecated, as it\n *   e.g. does not know about the right outer scope. Please use the transclude function that is passed\n *   to the link function instead.\n * </div>\n\n * A compile function can have a return value which can be either a function or an object.\n *\n * * returning a (post-link) function - is equivalent to registering the linking function via the\n *   `link` property of the config object when the compile function is empty.\n *\n * * returning an object with function(s) registered via `pre` and `post` properties - allows you to\n *   control when a linking function should be called during the linking phase. See info about\n *   pre-linking and post-linking functions below.\n *\n *\n * #### `link`\n * This property is used only if the `compile` property is not defined.\n *\n * ```js\n *   function link(scope, iElement, iAttrs, controller, transcludeFn) { ... }\n * ```\n *\n * The link function is responsible for registering DOM listeners as well as updating the DOM. It is\n * executed after the template has been cloned. This is where most of the directive logic will be\n * put.\n *\n *   * `scope` - {@link ng.$rootScope.Scope Scope} - The scope to be used by the\n *     directive for registering {@link ng.$rootScope.Scope#$watch watches}.\n *\n *   * `iElement` - instance element - The element where the directive is to be used. It is safe to\n *     manipulate the children of the element only in `postLink` function since the children have\n *     already been linked.\n *\n *   * `iAttrs` - instance attributes - Normalized list of attributes declared on this element shared\n *     between all directive linking functions.\n *\n *   * `controller` - the directive's required controller instance(s) - Instances are shared\n *     among all directives, which allows the directives to use the controllers as a communication\n *     channel. The exact value depends on the directive's `require` property:\n *       * no controller(s) required: the directive's own controller, or `undefined` if it doesn't have one\n *       * `string`: the controller instance\n *       * `array`: array of controller instances\n *\n *     If a required controller cannot be found, and it is optional, the instance is `null`,\n *     otherwise the {@link error:$compile:ctreq Missing Required Controller} error is thrown.\n *\n *     Note that you can also require the directive's own controller - it will be made available like\n *     any other controller.\n *\n *   * `transcludeFn` - A transclude linking function pre-bound to the correct transclusion scope.\n *     This is the same as the `$transclude`\n *     parameter of directive controllers, see there for details.\n *     `function([scope], cloneLinkingFn, futureParentElement)`.\n *\n * #### Pre-linking function\n *\n * Executed before the child elements are linked. Not safe to do DOM transformation since the\n * compiler linking function will fail to locate the correct elements for linking.\n *\n * #### Post-linking function\n *\n * Executed after the child elements are linked.\n *\n * Note that child elements that contain `templateUrl` directives will not have been compiled\n * and linked since they are waiting for their template to load asynchronously and their own\n * compilation and linking has been suspended until that occurs.\n *\n * It is safe to do DOM transformation in the post-linking function on elements that are not waiting\n * for their async templates to be resolved.\n *\n *\n * ### Transclusion\n *\n * Transclusion is the process of extracting a collection of DOM elements from one part of the DOM and\n * copying them to another part of the DOM, while maintaining their connection to the original AngularJS\n * scope from where they were taken.\n *\n * Transclusion is used (often with {@link ngTransclude}) to insert the\n * original contents of a directive's element into a specified place in the template of the directive.\n * The benefit of transclusion, over simply moving the DOM elements manually, is that the transcluded\n * content has access to the properties on the scope from which it was taken, even if the directive\n * has isolated scope.\n * See the {@link guide/directive#creating-a-directive-that-wraps-other-elements Directives Guide}.\n *\n * This makes it possible for the widget to have private state for its template, while the transcluded\n * content has access to its originating scope.\n *\n * <div class=\"alert alert-warning\">\n * **Note:** When testing an element transclude directive you must not place the directive at the root of the\n * DOM fragment that is being compiled. See {@link guide/unit-testing#testing-transclusion-directives\n * Testing Transclusion Directives}.\n * </div>\n *\n * There are three kinds of transclusion depending upon whether you want to transclude just the contents of the\n * directive's element, the entire element or multiple parts of the element contents:\n *\n * * `true` - transclude the content (i.e. the child nodes) of the directive's element.\n * * `'element'` - transclude the whole of the directive's element including any directives on this\n *   element that defined at a lower priority than this directive. When used, the `template`\n *   property is ignored.\n * * **`{...}` (an object hash):** - map elements of the content onto transclusion \"slots\" in the template.\n *\n * **Mult-slot transclusion** is declared by providing an object for the `transclude` property.\n *\n * This object is a map where the keys are the name of the slot to fill and the value is an element selector\n * used to match the HTML to the slot. The element selector should be in normalized form (e.g. `myElement`)\n * and will match the standard element variants (e.g. `my-element`, `my:element`, `data-my-element`, etc).\n *\n * For further information check out the guide on {@link guide/directive#matching-directives Matching Directives}\n *\n * If the element selector is prefixed with a `?` then that slot is optional.\n *\n * For example, the transclude object `{ slotA: '?myCustomElement' }` maps `<my-custom-element>` elements to\n * the `slotA` slot, which can be accessed via the `$transclude` function or via the {@link ngTransclude} directive.\n *\n * Slots that are not marked as optional (`?`) will trigger a compile time error if there are no matching elements\n * in the transclude content. If you wish to know if an optional slot was filled with content, then you can call\n * `$transclude.isSlotFilled(slotName)` on the transclude function passed to the directive's link function and\n * injectable into the directive's controller.\n *\n *\n * #### Transclusion Functions\n *\n * When a directive requests transclusion, the compiler extracts its contents and provides a **transclusion\n * function** to the directive's `link` function and `controller`. This transclusion function is a special\n * **linking function** that will return the compiled contents linked to a new transclusion scope.\n *\n * <div class=\"alert alert-info\">\n * If you are just using {@link ngTransclude} then you don't need to worry about this function, since\n * ngTransclude will deal with it for us.\n * </div>\n *\n * If you want to manually control the insertion and removal of the transcluded content in your directive\n * then you must use this transclude function. When you call a transclude function it returns a a jqLite/JQuery\n * object that contains the compiled DOM, which is linked to the correct transclusion scope.\n *\n * When you call a transclusion function you can pass in a **clone attach function**. This function accepts\n * two parameters, `function(clone, scope) { ... }`, where the `clone` is a fresh compiled copy of your transcluded\n * content and the `scope` is the newly created transclusion scope, to which the clone is bound.\n *\n * <div class=\"alert alert-info\">\n * **Best Practice**: Always provide a `cloneFn` (clone attach function) when you call a transclude function\n * since you then get a fresh clone of the original DOM and also have access to the new transclusion scope.\n * </div>\n *\n * It is normal practice to attach your transcluded content (`clone`) to the DOM inside your **clone\n * attach function**:\n *\n * ```js\n * var transcludedContent, transclusionScope;\n *\n * $transclude(function(clone, scope) {\n *   element.append(clone);\n *   transcludedContent = clone;\n *   transclusionScope = scope;\n * });\n * ```\n *\n * Later, if you want to remove the transcluded content from your DOM then you should also destroy the\n * associated transclusion scope:\n *\n * ```js\n * transcludedContent.remove();\n * transclusionScope.$destroy();\n * ```\n *\n * <div class=\"alert alert-info\">\n * **Best Practice**: if you intend to add and remove transcluded content manually in your directive\n * (by calling the transclude function to get the DOM and calling `element.remove()` to remove it),\n * then you are also responsible for calling `$destroy` on the transclusion scope.\n * </div>\n *\n * The built-in DOM manipulation directives, such as {@link ngIf}, {@link ngSwitch} and {@link ngRepeat}\n * automatically destroy their transcluded clones as necessary so you do not need to worry about this if\n * you are simply using {@link ngTransclude} to inject the transclusion into your directive.\n *\n *\n * #### Transclusion Scopes\n *\n * When you call a transclude function it returns a DOM fragment that is pre-bound to a **transclusion\n * scope**. This scope is special, in that it is a child of the directive's scope (and so gets destroyed\n * when the directive's scope gets destroyed) but it inherits the properties of the scope from which it\n * was taken.\n *\n * For example consider a directive that uses transclusion and isolated scope. The DOM hierarchy might look\n * like this:\n *\n * ```html\n * <div ng-app>\n *   <div isolate>\n *     <div transclusion>\n *     </div>\n *   </div>\n * </div>\n * ```\n *\n * The `$parent` scope hierarchy will look like this:\n *\n   ```\n   - $rootScope\n     - isolate\n       - transclusion\n   ```\n *\n * but the scopes will inherit prototypically from different scopes to their `$parent`.\n *\n   ```\n   - $rootScope\n     - transclusion\n   - isolate\n   ```\n *\n *\n * ### Attributes\n *\n * The {@link ng.$compile.directive.Attributes Attributes} object - passed as a parameter in the\n * `link()` or `compile()` functions. It has a variety of uses.\n *\n * * *Accessing normalized attribute names:* Directives like 'ngBind' can be expressed in many ways:\n *   'ng:bind', `data-ng-bind`, or 'x-ng-bind'. The attributes object allows for normalized access\n *   to the attributes.\n *\n * * *Directive inter-communication:* All directives share the same instance of the attributes\n *   object which allows the directives to use the attributes object as inter directive\n *   communication.\n *\n * * *Supports interpolation:* Interpolation attributes are assigned to the attribute object\n *   allowing other directives to read the interpolated value.\n *\n * * *Observing interpolated attributes:* Use `$observe` to observe the value changes of attributes\n *   that contain interpolation (e.g. `src=\"{{bar}}\"`). Not only is this very efficient but it's also\n *   the only way to easily get the actual value because during the linking phase the interpolation\n *   hasn't been evaluated yet and so the value is at this time set to `undefined`.\n *\n * ```js\n * function linkingFn(scope, elm, attrs, ctrl) {\n *   // get the attribute value\n *   console.log(attrs.ngModel);\n *\n *   // change the attribute\n *   attrs.$set('ngModel', 'new value');\n *\n *   // observe changes to interpolated attribute\n *   attrs.$observe('ngModel', function(value) {\n *     console.log('ngModel has changed value to ' + value);\n *   });\n * }\n * ```\n *\n * ## Example\n *\n * <div class=\"alert alert-warning\">\n * **Note**: Typically directives are registered with `module.directive`. The example below is\n * to illustrate how `$compile` works.\n * </div>\n *\n <example module=\"compileExample\">\n   <file name=\"index.html\">\n    <script>\n      angular.module('compileExample', [], function($compileProvider) {\n        // configure new 'compile' directive by passing a directive\n        // factory function. The factory function injects the '$compile'\n        $compileProvider.directive('compile', function($compile) {\n          // directive factory creates a link function\n          return function(scope, element, attrs) {\n            scope.$watch(\n              function(scope) {\n                 // watch the 'compile' expression for changes\n                return scope.$eval(attrs.compile);\n              },\n              function(value) {\n                // when the 'compile' expression changes\n                // assign it into the current DOM\n                element.html(value);\n\n                // compile the new DOM and link it to the current\n                // scope.\n                // NOTE: we only compile .childNodes so that\n                // we don't get into infinite loop compiling ourselves\n                $compile(element.contents())(scope);\n              }\n            );\n          };\n        });\n      })\n      .controller('GreeterController', ['$scope', function($scope) {\n        $scope.name = 'Angular';\n        $scope.html = 'Hello {{name}}';\n      }]);\n    </script>\n    <div ng-controller=\"GreeterController\">\n      <input ng-model=\"name\"> <br/>\n      <textarea ng-model=\"html\"></textarea> <br/>\n      <div compile=\"html\"></div>\n    </div>\n   </file>\n   <file name=\"protractor.js\" type=\"protractor\">\n     it('should auto compile', function() {\n       var textarea = $('textarea');\n       var output = $('div[compile]');\n       // The initial state reads 'Hello Angular'.\n       expect(output.getText()).toBe('Hello Angular');\n       textarea.clear();\n       textarea.sendKeys('{{name}}!');\n       expect(output.getText()).toBe('Angular!');\n     });\n   </file>\n </example>\n\n *\n *\n * @param {string|DOMElement} element Element or HTML string to compile into a template function.\n * @param {function(angular.Scope, cloneAttachFn=)} transclude function available to directives - DEPRECATED.\n *\n * <div class=\"alert alert-danger\">\n * **Note:** Passing a `transclude` function to the $compile function is deprecated, as it\n *   e.g. will not use the right outer scope. Please pass the transclude function as a\n *   `parentBoundTranscludeFn` to the link function instead.\n * </div>\n *\n * @param {number} maxPriority only apply directives lower than given priority (Only effects the\n *                 root element(s), not their children)\n * @returns {function(scope, cloneAttachFn=, options=)} a link function which is used to bind template\n * (a DOM element/tree) to a scope. Where:\n *\n *  * `scope` - A {@link ng.$rootScope.Scope Scope} to bind to.\n *  * `cloneAttachFn` - If `cloneAttachFn` is provided, then the link function will clone the\n *  `template` and call the `cloneAttachFn` function allowing the caller to attach the\n *  cloned elements to the DOM document at the appropriate place. The `cloneAttachFn` is\n *  called as: <br/> `cloneAttachFn(clonedElement, scope)` where:\n *\n *      * `clonedElement` - is a clone of the original `element` passed into the compiler.\n *      * `scope` - is the current scope with which the linking function is working with.\n *\n *  * `options` - An optional object hash with linking options. If `options` is provided, then the following\n *  keys may be used to control linking behavior:\n *\n *      * `parentBoundTranscludeFn` - the transclude function made available to\n *        directives; if given, it will be passed through to the link functions of\n *        directives found in `element` during compilation.\n *      * `transcludeControllers` - an object hash with keys that map controller names\n *        to a hash with the key `instance`, which maps to the controller instance;\n *        if given, it will make the controllers available to directives on the compileNode:\n *        ```\n *        {\n *          parent: {\n *            instance: parentControllerInstance\n *          }\n *        }\n *        ```\n *      * `futureParentElement` - defines the parent to which the `cloneAttachFn` will add\n *        the cloned elements; only needed for transcludes that are allowed to contain non html\n *        elements (e.g. SVG elements). See also the directive.controller property.\n *\n * Calling the linking function returns the element of the template. It is either the original\n * element passed in, or the clone of the element if the `cloneAttachFn` is provided.\n *\n * After linking the view is not updated until after a call to $digest which typically is done by\n * Angular automatically.\n *\n * If you need access to the bound view, there are two ways to do it:\n *\n * - If you are not asking the linking function to clone the template, create the DOM element(s)\n *   before you send them to the compiler and keep this reference around.\n *   ```js\n *     var element = $compile('<p>{{total}}</p>')(scope);\n *   ```\n *\n * - if on the other hand, you need the element to be cloned, the view reference from the original\n *   example would not point to the clone, but rather to the original template that was cloned. In\n *   this case, you can access the clone via the cloneAttachFn:\n *   ```js\n *     var templateElement = angular.element('<p>{{total}}</p>'),\n *         scope = ....;\n *\n *     var clonedElement = $compile(templateElement)(scope, function(clonedElement, scope) {\n *       //attach the clone to DOM document at the right place\n *     });\n *\n *     //now we have reference to the cloned DOM via `clonedElement`\n *   ```\n *\n *\n * For information on how the compiler works, see the\n * {@link guide/compiler Angular HTML Compiler} section of the Developer Guide.\n */\n\nvar $compileMinErr = minErr('$compile');\n\nfunction UNINITIALIZED_VALUE() {}\nvar _UNINITIALIZED_VALUE = new UNINITIALIZED_VALUE();\n\n/**\n * @ngdoc provider\n * @name $compileProvider\n *\n * @description\n */\n$CompileProvider.$inject = ['$provide', '$$sanitizeUriProvider'];\nfunction $CompileProvider($provide, $$sanitizeUriProvider) {\n  var hasDirectives = {},\n      Suffix = 'Directive',\n      COMMENT_DIRECTIVE_REGEXP = /^\\s*directive\\:\\s*([\\w\\-]+)\\s+(.*)$/,\n      CLASS_DIRECTIVE_REGEXP = /(([\\w\\-]+)(?:\\:([^;]+))?;?)/,\n      ALL_OR_NOTHING_ATTRS = makeMap('ngSrc,ngSrcset,src,srcset'),\n      REQUIRE_PREFIX_REGEXP = /^(?:(\\^\\^?)?(\\?)?(\\^\\^?)?)?/;\n\n  // Ref: http://developers.whatwg.org/webappapis.html#event-handler-idl-attributes\n  // The assumption is that future DOM event attribute names will begin with\n  // 'on' and be composed of only English letters.\n  var EVENT_HANDLER_ATTR_REGEXP = /^(on[a-z]+|formaction)$/;\n  var bindingCache = createMap();\n\n  function parseIsolateBindings(scope, directiveName, isController) {\n    var LOCAL_REGEXP = /^\\s*([@&<]|=(\\*?))(\\??)\\s*(\\w*)\\s*$/;\n\n    var bindings = createMap();\n\n    forEach(scope, function(definition, scopeName) {\n      if (definition in bindingCache) {\n        bindings[scopeName] = bindingCache[definition];\n        return;\n      }\n      var match = definition.match(LOCAL_REGEXP);\n\n      if (!match) {\n        throw $compileMinErr('iscp',\n            \"Invalid {3} for directive '{0}'.\" +\n            \" Definition: {... {1}: '{2}' ...}\",\n            directiveName, scopeName, definition,\n            (isController ? \"controller bindings definition\" :\n            \"isolate scope definition\"));\n      }\n\n      bindings[scopeName] = {\n        mode: match[1][0],\n        collection: match[2] === '*',\n        optional: match[3] === '?',\n        attrName: match[4] || scopeName\n      };\n      if (match[4]) {\n        bindingCache[definition] = bindings[scopeName];\n      }\n    });\n\n    return bindings;\n  }\n\n  function parseDirectiveBindings(directive, directiveName) {\n    var bindings = {\n      isolateScope: null,\n      bindToController: null\n    };\n    if (isObject(directive.scope)) {\n      if (directive.bindToController === true) {\n        bindings.bindToController = parseIsolateBindings(directive.scope,\n                                                         directiveName, true);\n        bindings.isolateScope = {};\n      } else {\n        bindings.isolateScope = parseIsolateBindings(directive.scope,\n                                                     directiveName, false);\n      }\n    }\n    if (isObject(directive.bindToController)) {\n      bindings.bindToController =\n          parseIsolateBindings(directive.bindToController, directiveName, true);\n    }\n    if (isObject(bindings.bindToController)) {\n      var controller = directive.controller;\n      var controllerAs = directive.controllerAs;\n      if (!controller) {\n        // There is no controller, there may or may not be a controllerAs property\n        throw $compileMinErr('noctrl',\n              \"Cannot bind to controller without directive '{0}'s controller.\",\n              directiveName);\n      } else if (!identifierForController(controller, controllerAs)) {\n        // There is a controller, but no identifier or controllerAs property\n        throw $compileMinErr('noident',\n              \"Cannot bind to controller without identifier for directive '{0}'.\",\n              directiveName);\n      }\n    }\n    return bindings;\n  }\n\n  function assertValidDirectiveName(name) {\n    var letter = name.charAt(0);\n    if (!letter || letter !== lowercase(letter)) {\n      throw $compileMinErr('baddir', \"Directive/Component name '{0}' is invalid. The first character must be a lowercase letter\", name);\n    }\n    if (name !== name.trim()) {\n      throw $compileMinErr('baddir',\n            \"Directive/Component name '{0}' is invalid. The name should not contain leading or trailing whitespaces\",\n            name);\n    }\n  }\n\n  /**\n   * @ngdoc method\n   * @name $compileProvider#directive\n   * @kind function\n   *\n   * @description\n   * Register a new directive with the compiler.\n   *\n   * @param {string|Object} name Name of the directive in camel-case (i.e. <code>ngBind</code> which\n   *    will match as <code>ng-bind</code>), or an object map of directives where the keys are the\n   *    names and the values are the factories.\n   * @param {Function|Array} directiveFactory An injectable directive factory function. See the\n   *    {@link guide/directive directive guide} and the {@link $compile compile API} for more info.\n   * @returns {ng.$compileProvider} Self for chaining.\n   */\n  this.directive = function registerDirective(name, directiveFactory) {\n    assertNotHasOwnProperty(name, 'directive');\n    if (isString(name)) {\n      assertValidDirectiveName(name);\n      assertArg(directiveFactory, 'directiveFactory');\n      if (!hasDirectives.hasOwnProperty(name)) {\n        hasDirectives[name] = [];\n        $provide.factory(name + Suffix, ['$injector', '$exceptionHandler',\n          function($injector, $exceptionHandler) {\n            var directives = [];\n            forEach(hasDirectives[name], function(directiveFactory, index) {\n              try {\n                var directive = $injector.invoke(directiveFactory);\n                if (isFunction(directive)) {\n                  directive = { compile: valueFn(directive) };\n                } else if (!directive.compile && directive.link) {\n                  directive.compile = valueFn(directive.link);\n                }\n                directive.priority = directive.priority || 0;\n                directive.index = index;\n                directive.name = directive.name || name;\n                directive.require = directive.require || (directive.controller && directive.name);\n                directive.restrict = directive.restrict || 'EA';\n                directive.$$moduleName = directiveFactory.$$moduleName;\n                directives.push(directive);\n              } catch (e) {\n                $exceptionHandler(e);\n              }\n            });\n            return directives;\n          }]);\n      }\n      hasDirectives[name].push(directiveFactory);\n    } else {\n      forEach(name, reverseParams(registerDirective));\n    }\n    return this;\n  };\n\n  /**\n   * @ngdoc method\n   * @name $compileProvider#component\n   * @module ng\n   * @param {string} name Name of the component in camelCase (i.e. `myComp` which will match `<my-comp>`)\n   * @param {Object} options Component definition object (a simplified\n   *    {@link ng.$compile#directive-definition-object directive definition object}),\n   *    with the following properties (all optional):\n   *\n   *    - `controller` – `{(string|function()=}` – controller constructor function that should be\n   *      associated with newly created scope or the name of a {@link ng.$compile#-controller-\n   *      registered controller} if passed as a string. An empty `noop` function by default.\n   *    - `controllerAs` – `{string=}` – identifier name for to reference the controller in the component's scope.\n   *      If present, the controller will be published to scope under the `controllerAs` name.\n   *      If not present, this will default to be `$ctrl`.\n   *    - `template` – `{string=|function()=}` – html template as a string or a function that\n   *      returns an html template as a string which should be used as the contents of this component.\n   *      Empty string by default.\n   *\n   *      If `template` is a function, then it is {@link auto.$injector#invoke injected} with\n   *      the following locals:\n   *\n   *      - `$element` - Current element\n   *      - `$attrs` - Current attributes object for the element\n   *\n   *    - `templateUrl` – `{string=|function()=}` – path or function that returns a path to an html\n   *      template that should be used  as the contents of this component.\n   *\n   *      If `templateUrl` is a function, then it is {@link auto.$injector#invoke injected} with\n   *      the following locals:\n   *\n   *      - `$element` - Current element\n   *      - `$attrs` - Current attributes object for the element\n   *\n   *    - `bindings` – `{object=}` – defines bindings between DOM attributes and component properties.\n   *      Component properties are always bound to the component controller and not to the scope.\n   *      See {@link ng.$compile#-bindtocontroller- `bindToController`}.\n   *    - `transclude` – `{boolean=}` – whether {@link $compile#transclusion content transclusion} is enabled.\n   *      Disabled by default.\n   *    - `require` - `{Object<string, string>=}` - requires the controllers of other directives and binds them to\n   *      this component's controller. The object keys specify the property names under which the required\n   *      controllers (object values) will be bound. See {@link ng.$compile#-require- `require`}.\n   *    - `$...` – additional properties to attach to the directive factory function and the controller\n   *      constructor function. (This is used by the component router to annotate)\n   *\n   * @returns {ng.$compileProvider} the compile provider itself, for chaining of function calls.\n   * @description\n   * Register a **component definition** with the compiler. This is a shorthand for registering a special\n   * type of directive, which represents a self-contained UI component in your application. Such components\n   * are always isolated (i.e. `scope: {}`) and are always restricted to elements (i.e. `restrict: 'E'`).\n   *\n   * Component definitions are very simple and do not require as much configuration as defining general\n   * directives. Component definitions usually consist only of a template and a controller backing it.\n   *\n   * In order to make the definition easier, components enforce best practices like use of `controllerAs`,\n   * `bindToController`. They always have **isolate scope** and are restricted to elements.\n   *\n   * Here are a few examples of how you would usually define components:\n   *\n   * ```js\n   *   var myMod = angular.module(...);\n   *   myMod.component('myComp', {\n   *     template: '<div>My name is {{$ctrl.name}}</div>',\n   *     controller: function() {\n   *       this.name = 'shahar';\n   *     }\n   *   });\n   *\n   *   myMod.component('myComp', {\n   *     template: '<div>My name is {{$ctrl.name}}</div>',\n   *     bindings: {name: '@'}\n   *   });\n   *\n   *   myMod.component('myComp', {\n   *     templateUrl: 'views/my-comp.html',\n   *     controller: 'MyCtrl',\n   *     controllerAs: 'ctrl',\n   *     bindings: {name: '@'}\n   *   });\n   *\n   * ```\n   * For more examples, and an in-depth guide, see the {@link guide/component component guide}.\n   *\n   * <br />\n   * See also {@link ng.$compileProvider#directive $compileProvider.directive()}.\n   */\n  this.component = function registerComponent(name, options) {\n    var controller = options.controller || function() {};\n\n    function factory($injector) {\n      function makeInjectable(fn) {\n        if (isFunction(fn) || isArray(fn)) {\n          return function(tElement, tAttrs) {\n            return $injector.invoke(fn, this, {$element: tElement, $attrs: tAttrs});\n          };\n        } else {\n          return fn;\n        }\n      }\n\n      var template = (!options.template && !options.templateUrl ? '' : options.template);\n      var ddo = {\n        controller: controller,\n        controllerAs: identifierForController(options.controller) || options.controllerAs || '$ctrl',\n        template: makeInjectable(template),\n        templateUrl: makeInjectable(options.templateUrl),\n        transclude: options.transclude,\n        scope: {},\n        bindToController: options.bindings || {},\n        restrict: 'E',\n        require: options.require\n      };\n\n      // Copy annotations (starting with $) over to the DDO\n      forEach(options, function(val, key) {\n        if (key.charAt(0) === '$') ddo[key] = val;\n      });\n\n      return ddo;\n    }\n\n    // TODO(pete) remove the following `forEach` before we release 1.6.0\n    // The component-router@0.2.0 looks for the annotations on the controller constructor\n    // Nothing in Angular looks for annotations on the factory function but we can't remove\n    // it from 1.5.x yet.\n\n    // Copy any annotation properties (starting with $) over to the factory and controller constructor functions\n    // These could be used by libraries such as the new component router\n    forEach(options, function(val, key) {\n      if (key.charAt(0) === '$') {\n        factory[key] = val;\n        // Don't try to copy over annotations to named controller\n        if (isFunction(controller)) controller[key] = val;\n      }\n    });\n\n    factory.$inject = ['$injector'];\n\n    return this.directive(name, factory);\n  };\n\n\n  /**\n   * @ngdoc method\n   * @name $compileProvider#aHrefSanitizationWhitelist\n   * @kind function\n   *\n   * @description\n   * Retrieves or overrides the default regular expression that is used for whitelisting of safe\n   * urls during a[href] sanitization.\n   *\n   * The sanitization is a security measure aimed at preventing XSS attacks via html links.\n   *\n   * Any url about to be assigned to a[href] via data-binding is first normalized and turned into\n   * an absolute url. Afterwards, the url is matched against the `aHrefSanitizationWhitelist`\n   * regular expression. If a match is found, the original url is written into the dom. Otherwise,\n   * the absolute url is prefixed with `'unsafe:'` string and only then is it written into the DOM.\n   *\n   * @param {RegExp=} regexp New regexp to whitelist urls with.\n   * @returns {RegExp|ng.$compileProvider} Current RegExp if called without value or self for\n   *    chaining otherwise.\n   */\n  this.aHrefSanitizationWhitelist = function(regexp) {\n    if (isDefined(regexp)) {\n      $$sanitizeUriProvider.aHrefSanitizationWhitelist(regexp);\n      return this;\n    } else {\n      return $$sanitizeUriProvider.aHrefSanitizationWhitelist();\n    }\n  };\n\n\n  /**\n   * @ngdoc method\n   * @name $compileProvider#imgSrcSanitizationWhitelist\n   * @kind function\n   *\n   * @description\n   * Retrieves or overrides the default regular expression that is used for whitelisting of safe\n   * urls during img[src] sanitization.\n   *\n   * The sanitization is a security measure aimed at prevent XSS attacks via html links.\n   *\n   * Any url about to be assigned to img[src] via data-binding is first normalized and turned into\n   * an absolute url. Afterwards, the url is matched against the `imgSrcSanitizationWhitelist`\n   * regular expression. If a match is found, the original url is written into the dom. Otherwise,\n   * the absolute url is prefixed with `'unsafe:'` string and only then is it written into the DOM.\n   *\n   * @param {RegExp=} regexp New regexp to whitelist urls with.\n   * @returns {RegExp|ng.$compileProvider} Current RegExp if called without value or self for\n   *    chaining otherwise.\n   */\n  this.imgSrcSanitizationWhitelist = function(regexp) {\n    if (isDefined(regexp)) {\n      $$sanitizeUriProvider.imgSrcSanitizationWhitelist(regexp);\n      return this;\n    } else {\n      return $$sanitizeUriProvider.imgSrcSanitizationWhitelist();\n    }\n  };\n\n  /**\n   * @ngdoc method\n   * @name  $compileProvider#debugInfoEnabled\n   *\n   * @param {boolean=} enabled update the debugInfoEnabled state if provided, otherwise just return the\n   * current debugInfoEnabled state\n   * @returns {*} current value if used as getter or itself (chaining) if used as setter\n   *\n   * @kind function\n   *\n   * @description\n   * Call this method to enable/disable various debug runtime information in the compiler such as adding\n   * binding information and a reference to the current scope on to DOM elements.\n   * If enabled, the compiler will add the following to DOM elements that have been bound to the scope\n   * * `ng-binding` CSS class\n   * * `$binding` data property containing an array of the binding expressions\n   *\n   * You may want to disable this in production for a significant performance boost. See\n   * {@link guide/production#disabling-debug-data Disabling Debug Data} for more.\n   *\n   * The default value is true.\n   */\n  var debugInfoEnabled = true;\n  this.debugInfoEnabled = function(enabled) {\n    if (isDefined(enabled)) {\n      debugInfoEnabled = enabled;\n      return this;\n    }\n    return debugInfoEnabled;\n  };\n\n\n  var TTL = 10;\n  /**\n   * @ngdoc method\n   * @name $compileProvider#onChangesTtl\n   * @description\n   *\n   * Sets the number of times `$onChanges` hooks can trigger new changes before giving up and\n   * assuming that the model is unstable.\n   *\n   * The current default is 10 iterations.\n   *\n   * In complex applications it's possible that dependencies between `$onChanges` hooks and bindings will result\n   * in several iterations of calls to these hooks. However if an application needs more than the default 10\n   * iterations to stabilize then you should investigate what is causing the model to continuously change during\n   * the `$onChanges` hook execution.\n   *\n   * Increasing the TTL could have performance implications, so you should not change it without proper justification.\n   *\n   * @param {number} limit The number of `$onChanges` hook iterations.\n   * @returns {number|object} the current limit (or `this` if called as a setter for chaining)\n   */\n  this.onChangesTtl = function(value) {\n    if (arguments.length) {\n      TTL = value;\n      return this;\n    }\n    return TTL;\n  };\n\n  this.$get = [\n            '$injector', '$interpolate', '$exceptionHandler', '$templateRequest', '$parse',\n            '$controller', '$rootScope', '$sce', '$animate', '$$sanitizeUri',\n    function($injector,   $interpolate,   $exceptionHandler,   $templateRequest,   $parse,\n             $controller,   $rootScope,   $sce,   $animate,   $$sanitizeUri) {\n\n    var SIMPLE_ATTR_NAME = /^\\w/;\n    var specialAttrHolder = window.document.createElement('div');\n\n\n\n    var onChangesTtl = TTL;\n    // The onChanges hooks should all be run together in a single digest\n    // When changes occur, the call to trigger their hooks will be added to this queue\n    var onChangesQueue;\n\n    // This function is called in a $$postDigest to trigger all the onChanges hooks in a single digest\n    function flushOnChangesQueue() {\n      try {\n        if (!(--onChangesTtl)) {\n          // We have hit the TTL limit so reset everything\n          onChangesQueue = undefined;\n          throw $compileMinErr('infchng', '{0} $onChanges() iterations reached. Aborting!\\n', TTL);\n        }\n        // We must run this hook in an apply since the $$postDigest runs outside apply\n        $rootScope.$apply(function() {\n          for (var i = 0, ii = onChangesQueue.length; i < ii; ++i) {\n            onChangesQueue[i]();\n          }\n          // Reset the queue to trigger a new schedule next time there is a change\n          onChangesQueue = undefined;\n        });\n      } finally {\n        onChangesTtl++;\n      }\n    }\n\n\n    function Attributes(element, attributesToCopy) {\n      if (attributesToCopy) {\n        var keys = Object.keys(attributesToCopy);\n        var i, l, key;\n\n        for (i = 0, l = keys.length; i < l; i++) {\n          key = keys[i];\n          this[key] = attributesToCopy[key];\n        }\n      } else {\n        this.$attr = {};\n      }\n\n      this.$$element = element;\n    }\n\n    Attributes.prototype = {\n      /**\n       * @ngdoc method\n       * @name $compile.directive.Attributes#$normalize\n       * @kind function\n       *\n       * @description\n       * Converts an attribute name (e.g. dash/colon/underscore-delimited string, optionally prefixed with `x-` or\n       * `data-`) to its normalized, camelCase form.\n       *\n       * Also there is special case for Moz prefix starting with upper case letter.\n       *\n       * For further information check out the guide on {@link guide/directive#matching-directives Matching Directives}\n       *\n       * @param {string} name Name to normalize\n       */\n      $normalize: directiveNormalize,\n\n\n      /**\n       * @ngdoc method\n       * @name $compile.directive.Attributes#$addClass\n       * @kind function\n       *\n       * @description\n       * Adds the CSS class value specified by the classVal parameter to the element. If animations\n       * are enabled then an animation will be triggered for the class addition.\n       *\n       * @param {string} classVal The className value that will be added to the element\n       */\n      $addClass: function(classVal) {\n        if (classVal && classVal.length > 0) {\n          $animate.addClass(this.$$element, classVal);\n        }\n      },\n\n      /**\n       * @ngdoc method\n       * @name $compile.directive.Attributes#$removeClass\n       * @kind function\n       *\n       * @description\n       * Removes the CSS class value specified by the classVal parameter from the element. If\n       * animations are enabled then an animation will be triggered for the class removal.\n       *\n       * @param {string} classVal The className value that will be removed from the element\n       */\n      $removeClass: function(classVal) {\n        if (classVal && classVal.length > 0) {\n          $animate.removeClass(this.$$element, classVal);\n        }\n      },\n\n      /**\n       * @ngdoc method\n       * @name $compile.directive.Attributes#$updateClass\n       * @kind function\n       *\n       * @description\n       * Adds and removes the appropriate CSS class values to the element based on the difference\n       * between the new and old CSS class values (specified as newClasses and oldClasses).\n       *\n       * @param {string} newClasses The current CSS className value\n       * @param {string} oldClasses The former CSS className value\n       */\n      $updateClass: function(newClasses, oldClasses) {\n        var toAdd = tokenDifference(newClasses, oldClasses);\n        if (toAdd && toAdd.length) {\n          $animate.addClass(this.$$element, toAdd);\n        }\n\n        var toRemove = tokenDifference(oldClasses, newClasses);\n        if (toRemove && toRemove.length) {\n          $animate.removeClass(this.$$element, toRemove);\n        }\n      },\n\n      /**\n       * Set a normalized attribute on the element in a way such that all directives\n       * can share the attribute. This function properly handles boolean attributes.\n       * @param {string} key Normalized key. (ie ngAttribute)\n       * @param {string|boolean} value The value to set. If `null` attribute will be deleted.\n       * @param {boolean=} writeAttr If false, does not write the value to DOM element attribute.\n       *     Defaults to true.\n       * @param {string=} attrName Optional none normalized name. Defaults to key.\n       */\n      $set: function(key, value, writeAttr, attrName) {\n        // TODO: decide whether or not to throw an error if \"class\"\n        //is set through this function since it may cause $updateClass to\n        //become unstable.\n\n        var node = this.$$element[0],\n            booleanKey = getBooleanAttrName(node, key),\n            aliasedKey = getAliasedAttrName(key),\n            observer = key,\n            nodeName;\n\n        if (booleanKey) {\n          this.$$element.prop(key, value);\n          attrName = booleanKey;\n        } else if (aliasedKey) {\n          this[aliasedKey] = value;\n          observer = aliasedKey;\n        }\n\n        this[key] = value;\n\n        // translate normalized key to actual key\n        if (attrName) {\n          this.$attr[key] = attrName;\n        } else {\n          attrName = this.$attr[key];\n          if (!attrName) {\n            this.$attr[key] = attrName = snake_case(key, '-');\n          }\n        }\n\n        nodeName = nodeName_(this.$$element);\n\n        if ((nodeName === 'a' && (key === 'href' || key === 'xlinkHref')) ||\n            (nodeName === 'img' && key === 'src')) {\n          // sanitize a[href] and img[src] values\n          this[key] = value = $$sanitizeUri(value, key === 'src');\n        } else if (nodeName === 'img' && key === 'srcset') {\n          // sanitize img[srcset] values\n          var result = \"\";\n\n          // first check if there are spaces because it's not the same pattern\n          var trimmedSrcset = trim(value);\n          //                (   999x   ,|   999w   ,|   ,|,   )\n          var srcPattern = /(\\s+\\d+x\\s*,|\\s+\\d+w\\s*,|\\s+,|,\\s+)/;\n          var pattern = /\\s/.test(trimmedSrcset) ? srcPattern : /(,)/;\n\n          // split srcset into tuple of uri and descriptor except for the last item\n          var rawUris = trimmedSrcset.split(pattern);\n\n          // for each tuples\n          var nbrUrisWith2parts = Math.floor(rawUris.length / 2);\n          for (var i = 0; i < nbrUrisWith2parts; i++) {\n            var innerIdx = i * 2;\n            // sanitize the uri\n            result += $$sanitizeUri(trim(rawUris[innerIdx]), true);\n            // add the descriptor\n            result += (\" \" + trim(rawUris[innerIdx + 1]));\n          }\n\n          // split the last item into uri and descriptor\n          var lastTuple = trim(rawUris[i * 2]).split(/\\s/);\n\n          // sanitize the last uri\n          result += $$sanitizeUri(trim(lastTuple[0]), true);\n\n          // and add the last descriptor if any\n          if (lastTuple.length === 2) {\n            result += (\" \" + trim(lastTuple[1]));\n          }\n          this[key] = value = result;\n        }\n\n        if (writeAttr !== false) {\n          if (value === null || isUndefined(value)) {\n            this.$$element.removeAttr(attrName);\n          } else {\n            if (SIMPLE_ATTR_NAME.test(attrName)) {\n              this.$$element.attr(attrName, value);\n            } else {\n              setSpecialAttr(this.$$element[0], attrName, value);\n            }\n          }\n        }\n\n        // fire observers\n        var $$observers = this.$$observers;\n        $$observers && forEach($$observers[observer], function(fn) {\n          try {\n            fn(value);\n          } catch (e) {\n            $exceptionHandler(e);\n          }\n        });\n      },\n\n\n      /**\n       * @ngdoc method\n       * @name $compile.directive.Attributes#$observe\n       * @kind function\n       *\n       * @description\n       * Observes an interpolated attribute.\n       *\n       * The observer function will be invoked once during the next `$digest` following\n       * compilation. The observer is then invoked whenever the interpolated value\n       * changes.\n       *\n       * @param {string} key Normalized key. (ie ngAttribute) .\n       * @param {function(interpolatedValue)} fn Function that will be called whenever\n                the interpolated value of the attribute changes.\n       *        See the {@link guide/interpolation#how-text-and-attribute-bindings-work Interpolation\n       *        guide} for more info.\n       * @returns {function()} Returns a deregistration function for this observer.\n       */\n      $observe: function(key, fn) {\n        var attrs = this,\n            $$observers = (attrs.$$observers || (attrs.$$observers = createMap())),\n            listeners = ($$observers[key] || ($$observers[key] = []));\n\n        listeners.push(fn);\n        $rootScope.$evalAsync(function() {\n          if (!listeners.$$inter && attrs.hasOwnProperty(key) && !isUndefined(attrs[key])) {\n            // no one registered attribute interpolation function, so lets call it manually\n            fn(attrs[key]);\n          }\n        });\n\n        return function() {\n          arrayRemove(listeners, fn);\n        };\n      }\n    };\n\n    function setSpecialAttr(element, attrName, value) {\n      // Attributes names that do not start with letters (such as `(click)`) cannot be set using `setAttribute`\n      // so we have to jump through some hoops to get such an attribute\n      // https://github.com/angular/angular.js/pull/13318\n      specialAttrHolder.innerHTML = \"<span \" + attrName + \">\";\n      var attributes = specialAttrHolder.firstChild.attributes;\n      var attribute = attributes[0];\n      // We have to remove the attribute from its container element before we can add it to the destination element\n      attributes.removeNamedItem(attribute.name);\n      attribute.value = value;\n      element.attributes.setNamedItem(attribute);\n    }\n\n    function safeAddClass($element, className) {\n      try {\n        $element.addClass(className);\n      } catch (e) {\n        // ignore, since it means that we are trying to set class on\n        // SVG element, where class name is read-only.\n      }\n    }\n\n\n    var startSymbol = $interpolate.startSymbol(),\n        endSymbol = $interpolate.endSymbol(),\n        denormalizeTemplate = (startSymbol == '{{' && endSymbol  == '}}')\n            ? identity\n            : function denormalizeTemplate(template) {\n              return template.replace(/\\{\\{/g, startSymbol).replace(/}}/g, endSymbol);\n        },\n        NG_ATTR_BINDING = /^ngAttr[A-Z]/;\n    var MULTI_ELEMENT_DIR_RE = /^(.+)Start$/;\n\n    compile.$$addBindingInfo = debugInfoEnabled ? function $$addBindingInfo($element, binding) {\n      var bindings = $element.data('$binding') || [];\n\n      if (isArray(binding)) {\n        bindings = bindings.concat(binding);\n      } else {\n        bindings.push(binding);\n      }\n\n      $element.data('$binding', bindings);\n    } : noop;\n\n    compile.$$addBindingClass = debugInfoEnabled ? function $$addBindingClass($element) {\n      safeAddClass($element, 'ng-binding');\n    } : noop;\n\n    compile.$$addScopeInfo = debugInfoEnabled ? function $$addScopeInfo($element, scope, isolated, noTemplate) {\n      var dataName = isolated ? (noTemplate ? '$isolateScopeNoTemplate' : '$isolateScope') : '$scope';\n      $element.data(dataName, scope);\n    } : noop;\n\n    compile.$$addScopeClass = debugInfoEnabled ? function $$addScopeClass($element, isolated) {\n      safeAddClass($element, isolated ? 'ng-isolate-scope' : 'ng-scope');\n    } : noop;\n\n    compile.$$createComment = function(directiveName, comment) {\n      var content = '';\n      if (debugInfoEnabled) {\n        content = ' ' + (directiveName || '') + ': ' + (comment || '') + ' ';\n      }\n      return window.document.createComment(content);\n    };\n\n    return compile;\n\n    //================================\n\n    function compile($compileNodes, transcludeFn, maxPriority, ignoreDirective,\n                        previousCompileContext) {\n      if (!($compileNodes instanceof jqLite)) {\n        // jquery always rewraps, whereas we need to preserve the original selector so that we can\n        // modify it.\n        $compileNodes = jqLite($compileNodes);\n      }\n\n      var NOT_EMPTY = /\\S+/;\n\n      // We can not compile top level text elements since text nodes can be merged and we will\n      // not be able to attach scope data to them, so we will wrap them in <span>\n      for (var i = 0, len = $compileNodes.length; i < len; i++) {\n        var domNode = $compileNodes[i];\n\n        if (domNode.nodeType === NODE_TYPE_TEXT && domNode.nodeValue.match(NOT_EMPTY) /* non-empty */) {\n          jqLiteWrapNode(domNode, $compileNodes[i] = window.document.createElement('span'));\n        }\n      }\n\n      var compositeLinkFn =\n              compileNodes($compileNodes, transcludeFn, $compileNodes,\n                           maxPriority, ignoreDirective, previousCompileContext);\n      compile.$$addScopeClass($compileNodes);\n      var namespace = null;\n      return function publicLinkFn(scope, cloneConnectFn, options) {\n        assertArg(scope, 'scope');\n\n        if (previousCompileContext && previousCompileContext.needsNewScope) {\n          // A parent directive did a replace and a directive on this element asked\n          // for transclusion, which caused us to lose a layer of element on which\n          // we could hold the new transclusion scope, so we will create it manually\n          // here.\n          scope = scope.$parent.$new();\n        }\n\n        options = options || {};\n        var parentBoundTranscludeFn = options.parentBoundTranscludeFn,\n          transcludeControllers = options.transcludeControllers,\n          futureParentElement = options.futureParentElement;\n\n        // When `parentBoundTranscludeFn` is passed, it is a\n        // `controllersBoundTransclude` function (it was previously passed\n        // as `transclude` to directive.link) so we must unwrap it to get\n        // its `boundTranscludeFn`\n        if (parentBoundTranscludeFn && parentBoundTranscludeFn.$$boundTransclude) {\n          parentBoundTranscludeFn = parentBoundTranscludeFn.$$boundTransclude;\n        }\n\n        if (!namespace) {\n          namespace = detectNamespaceForChildElements(futureParentElement);\n        }\n        var $linkNode;\n        if (namespace !== 'html') {\n          // When using a directive with replace:true and templateUrl the $compileNodes\n          // (or a child element inside of them)\n          // might change, so we need to recreate the namespace adapted compileNodes\n          // for call to the link function.\n          // Note: This will already clone the nodes...\n          $linkNode = jqLite(\n            wrapTemplate(namespace, jqLite('<div>').append($compileNodes).html())\n          );\n        } else if (cloneConnectFn) {\n          // important!!: we must call our jqLite.clone() since the jQuery one is trying to be smart\n          // and sometimes changes the structure of the DOM.\n          $linkNode = JQLitePrototype.clone.call($compileNodes);\n        } else {\n          $linkNode = $compileNodes;\n        }\n\n        if (transcludeControllers) {\n          for (var controllerName in transcludeControllers) {\n            $linkNode.data('$' + controllerName + 'Controller', transcludeControllers[controllerName].instance);\n          }\n        }\n\n        compile.$$addScopeInfo($linkNode, scope);\n\n        if (cloneConnectFn) cloneConnectFn($linkNode, scope);\n        if (compositeLinkFn) compositeLinkFn(scope, $linkNode, $linkNode, parentBoundTranscludeFn);\n        return $linkNode;\n      };\n    }\n\n    function detectNamespaceForChildElements(parentElement) {\n      // TODO: Make this detect MathML as well...\n      var node = parentElement && parentElement[0];\n      if (!node) {\n        return 'html';\n      } else {\n        return nodeName_(node) !== 'foreignobject' && toString.call(node).match(/SVG/) ? 'svg' : 'html';\n      }\n    }\n\n    /**\n     * Compile function matches each node in nodeList against the directives. Once all directives\n     * for a particular node are collected their compile functions are executed. The compile\n     * functions return values - the linking functions - are combined into a composite linking\n     * function, which is the a linking function for the node.\n     *\n     * @param {NodeList} nodeList an array of nodes or NodeList to compile\n     * @param {function(angular.Scope, cloneAttachFn=)} transcludeFn A linking function, where the\n     *        scope argument is auto-generated to the new child of the transcluded parent scope.\n     * @param {DOMElement=} $rootElement If the nodeList is the root of the compilation tree then\n     *        the rootElement must be set the jqLite collection of the compile root. This is\n     *        needed so that the jqLite collection items can be replaced with widgets.\n     * @param {number=} maxPriority Max directive priority.\n     * @returns {Function} A composite linking function of all of the matched directives or null.\n     */\n    function compileNodes(nodeList, transcludeFn, $rootElement, maxPriority, ignoreDirective,\n                            previousCompileContext) {\n      var linkFns = [],\n          attrs, directives, nodeLinkFn, childNodes, childLinkFn, linkFnFound, nodeLinkFnFound;\n\n      for (var i = 0; i < nodeList.length; i++) {\n        attrs = new Attributes();\n\n        // we must always refer to nodeList[i] since the nodes can be replaced underneath us.\n        directives = collectDirectives(nodeList[i], [], attrs, i === 0 ? maxPriority : undefined,\n                                        ignoreDirective);\n\n        nodeLinkFn = (directives.length)\n            ? applyDirectivesToNode(directives, nodeList[i], attrs, transcludeFn, $rootElement,\n                                      null, [], [], previousCompileContext)\n            : null;\n\n        if (nodeLinkFn && nodeLinkFn.scope) {\n          compile.$$addScopeClass(attrs.$$element);\n        }\n\n        childLinkFn = (nodeLinkFn && nodeLinkFn.terminal ||\n                      !(childNodes = nodeList[i].childNodes) ||\n                      !childNodes.length)\n            ? null\n            : compileNodes(childNodes,\n                 nodeLinkFn ? (\n                  (nodeLinkFn.transcludeOnThisElement || !nodeLinkFn.templateOnThisElement)\n                     && nodeLinkFn.transclude) : transcludeFn);\n\n        if (nodeLinkFn || childLinkFn) {\n          linkFns.push(i, nodeLinkFn, childLinkFn);\n          linkFnFound = true;\n          nodeLinkFnFound = nodeLinkFnFound || nodeLinkFn;\n        }\n\n        //use the previous context only for the first element in the virtual group\n        previousCompileContext = null;\n      }\n\n      // return a linking function if we have found anything, null otherwise\n      return linkFnFound ? compositeLinkFn : null;\n\n      function compositeLinkFn(scope, nodeList, $rootElement, parentBoundTranscludeFn) {\n        var nodeLinkFn, childLinkFn, node, childScope, i, ii, idx, childBoundTranscludeFn;\n        var stableNodeList;\n\n\n        if (nodeLinkFnFound) {\n          // copy nodeList so that if a nodeLinkFn removes or adds an element at this DOM level our\n          // offsets don't get screwed up\n          var nodeListLength = nodeList.length;\n          stableNodeList = new Array(nodeListLength);\n\n          // create a sparse array by only copying the elements which have a linkFn\n          for (i = 0; i < linkFns.length; i+=3) {\n            idx = linkFns[i];\n            stableNodeList[idx] = nodeList[idx];\n          }\n        } else {\n          stableNodeList = nodeList;\n        }\n\n        for (i = 0, ii = linkFns.length; i < ii;) {\n          node = stableNodeList[linkFns[i++]];\n          nodeLinkFn = linkFns[i++];\n          childLinkFn = linkFns[i++];\n\n          if (nodeLinkFn) {\n            if (nodeLinkFn.scope) {\n              childScope = scope.$new();\n              compile.$$addScopeInfo(jqLite(node), childScope);\n            } else {\n              childScope = scope;\n            }\n\n            if (nodeLinkFn.transcludeOnThisElement) {\n              childBoundTranscludeFn = createBoundTranscludeFn(\n                  scope, nodeLinkFn.transclude, parentBoundTranscludeFn);\n\n            } else if (!nodeLinkFn.templateOnThisElement && parentBoundTranscludeFn) {\n              childBoundTranscludeFn = parentBoundTranscludeFn;\n\n            } else if (!parentBoundTranscludeFn && transcludeFn) {\n              childBoundTranscludeFn = createBoundTranscludeFn(scope, transcludeFn);\n\n            } else {\n              childBoundTranscludeFn = null;\n            }\n\n            nodeLinkFn(childLinkFn, childScope, node, $rootElement, childBoundTranscludeFn);\n\n          } else if (childLinkFn) {\n            childLinkFn(scope, node.childNodes, undefined, parentBoundTranscludeFn);\n          }\n        }\n      }\n    }\n\n    function createBoundTranscludeFn(scope, transcludeFn, previousBoundTranscludeFn) {\n      function boundTranscludeFn(transcludedScope, cloneFn, controllers, futureParentElement, containingScope) {\n\n        if (!transcludedScope) {\n          transcludedScope = scope.$new(false, containingScope);\n          transcludedScope.$$transcluded = true;\n        }\n\n        return transcludeFn(transcludedScope, cloneFn, {\n          parentBoundTranscludeFn: previousBoundTranscludeFn,\n          transcludeControllers: controllers,\n          futureParentElement: futureParentElement\n        });\n      }\n\n      // We need  to attach the transclusion slots onto the `boundTranscludeFn`\n      // so that they are available inside the `controllersBoundTransclude` function\n      var boundSlots = boundTranscludeFn.$$slots = createMap();\n      for (var slotName in transcludeFn.$$slots) {\n        if (transcludeFn.$$slots[slotName]) {\n          boundSlots[slotName] = createBoundTranscludeFn(scope, transcludeFn.$$slots[slotName], previousBoundTranscludeFn);\n        } else {\n          boundSlots[slotName] = null;\n        }\n      }\n\n      return boundTranscludeFn;\n    }\n\n    /**\n     * Looks for directives on the given node and adds them to the directive collection which is\n     * sorted.\n     *\n     * @param node Node to search.\n     * @param directives An array to which the directives are added to. This array is sorted before\n     *        the function returns.\n     * @param attrs The shared attrs object which is used to populate the normalized attributes.\n     * @param {number=} maxPriority Max directive priority.\n     */\n    function collectDirectives(node, directives, attrs, maxPriority, ignoreDirective) {\n      var nodeType = node.nodeType,\n          attrsMap = attrs.$attr,\n          match,\n          className;\n\n      switch (nodeType) {\n        case NODE_TYPE_ELEMENT: /* Element */\n          // use the node name: <directive>\n          addDirective(directives,\n              directiveNormalize(nodeName_(node)), 'E', maxPriority, ignoreDirective);\n\n          // iterate over the attributes\n          for (var attr, name, nName, ngAttrName, value, isNgAttr, nAttrs = node.attributes,\n                   j = 0, jj = nAttrs && nAttrs.length; j < jj; j++) {\n            var attrStartName = false;\n            var attrEndName = false;\n\n            attr = nAttrs[j];\n            name = attr.name;\n            value = trim(attr.value);\n\n            // support ngAttr attribute binding\n            ngAttrName = directiveNormalize(name);\n            if (isNgAttr = NG_ATTR_BINDING.test(ngAttrName)) {\n              name = name.replace(PREFIX_REGEXP, '')\n                .substr(8).replace(/_(.)/g, function(match, letter) {\n                  return letter.toUpperCase();\n                });\n            }\n\n            var multiElementMatch = ngAttrName.match(MULTI_ELEMENT_DIR_RE);\n            if (multiElementMatch && directiveIsMultiElement(multiElementMatch[1])) {\n              attrStartName = name;\n              attrEndName = name.substr(0, name.length - 5) + 'end';\n              name = name.substr(0, name.length - 6);\n            }\n\n            nName = directiveNormalize(name.toLowerCase());\n            attrsMap[nName] = name;\n            if (isNgAttr || !attrs.hasOwnProperty(nName)) {\n                attrs[nName] = value;\n                if (getBooleanAttrName(node, nName)) {\n                  attrs[nName] = true; // presence means true\n                }\n            }\n            addAttrInterpolateDirective(node, directives, value, nName, isNgAttr);\n            addDirective(directives, nName, 'A', maxPriority, ignoreDirective, attrStartName,\n                          attrEndName);\n          }\n\n          // use class as directive\n          className = node.className;\n          if (isObject(className)) {\n              // Maybe SVGAnimatedString\n              className = className.animVal;\n          }\n          if (isString(className) && className !== '') {\n            while (match = CLASS_DIRECTIVE_REGEXP.exec(className)) {\n              nName = directiveNormalize(match[2]);\n              if (addDirective(directives, nName, 'C', maxPriority, ignoreDirective)) {\n                attrs[nName] = trim(match[3]);\n              }\n              className = className.substr(match.index + match[0].length);\n            }\n          }\n          break;\n        case NODE_TYPE_TEXT: /* Text Node */\n          if (msie === 11) {\n            // Workaround for #11781\n            while (node.parentNode && node.nextSibling && node.nextSibling.nodeType === NODE_TYPE_TEXT) {\n              node.nodeValue = node.nodeValue + node.nextSibling.nodeValue;\n              node.parentNode.removeChild(node.nextSibling);\n            }\n          }\n          addTextInterpolateDirective(directives, node.nodeValue);\n          break;\n        case NODE_TYPE_COMMENT: /* Comment */\n          try {\n            match = COMMENT_DIRECTIVE_REGEXP.exec(node.nodeValue);\n            if (match) {\n              nName = directiveNormalize(match[1]);\n              if (addDirective(directives, nName, 'M', maxPriority, ignoreDirective)) {\n                attrs[nName] = trim(match[2]);\n              }\n            }\n          } catch (e) {\n            // turns out that under some circumstances IE9 throws errors when one attempts to read\n            // comment's node value.\n            // Just ignore it and continue. (Can't seem to reproduce in test case.)\n          }\n          break;\n      }\n\n      directives.sort(byPriority);\n      return directives;\n    }\n\n    /**\n     * Given a node with an directive-start it collects all of the siblings until it finds\n     * directive-end.\n     * @param node\n     * @param attrStart\n     * @param attrEnd\n     * @returns {*}\n     */\n    function groupScan(node, attrStart, attrEnd) {\n      var nodes = [];\n      var depth = 0;\n      if (attrStart && node.hasAttribute && node.hasAttribute(attrStart)) {\n        do {\n          if (!node) {\n            throw $compileMinErr('uterdir',\n                      \"Unterminated attribute, found '{0}' but no matching '{1}' found.\",\n                      attrStart, attrEnd);\n          }\n          if (node.nodeType == NODE_TYPE_ELEMENT) {\n            if (node.hasAttribute(attrStart)) depth++;\n            if (node.hasAttribute(attrEnd)) depth--;\n          }\n          nodes.push(node);\n          node = node.nextSibling;\n        } while (depth > 0);\n      } else {\n        nodes.push(node);\n      }\n\n      return jqLite(nodes);\n    }\n\n    /**\n     * Wrapper for linking function which converts normal linking function into a grouped\n     * linking function.\n     * @param linkFn\n     * @param attrStart\n     * @param attrEnd\n     * @returns {Function}\n     */\n    function groupElementsLinkFnWrapper(linkFn, attrStart, attrEnd) {\n      return function groupedElementsLink(scope, element, attrs, controllers, transcludeFn) {\n        element = groupScan(element[0], attrStart, attrEnd);\n        return linkFn(scope, element, attrs, controllers, transcludeFn);\n      };\n    }\n\n    /**\n     * A function generator that is used to support both eager and lazy compilation\n     * linking function.\n     * @param eager\n     * @param $compileNodes\n     * @param transcludeFn\n     * @param maxPriority\n     * @param ignoreDirective\n     * @param previousCompileContext\n     * @returns {Function}\n     */\n    function compilationGenerator(eager, $compileNodes, transcludeFn, maxPriority, ignoreDirective, previousCompileContext) {\n      var compiled;\n\n      if (eager) {\n        return compile($compileNodes, transcludeFn, maxPriority, ignoreDirective, previousCompileContext);\n      }\n      return function lazyCompilation() {\n        if (!compiled) {\n          compiled = compile($compileNodes, transcludeFn, maxPriority, ignoreDirective, previousCompileContext);\n\n          // Null out all of these references in order to make them eligible for garbage collection\n          // since this is a potentially long lived closure\n          $compileNodes = transcludeFn = previousCompileContext = null;\n        }\n        return compiled.apply(this, arguments);\n      };\n    }\n\n    /**\n     * Once the directives have been collected, their compile functions are executed. This method\n     * is responsible for inlining directive templates as well as terminating the application\n     * of the directives if the terminal directive has been reached.\n     *\n     * @param {Array} directives Array of collected directives to execute their compile function.\n     *        this needs to be pre-sorted by priority order.\n     * @param {Node} compileNode The raw DOM node to apply the compile functions to\n     * @param {Object} templateAttrs The shared attribute function\n     * @param {function(angular.Scope, cloneAttachFn=)} transcludeFn A linking function, where the\n     *                                                  scope argument is auto-generated to the new\n     *                                                  child of the transcluded parent scope.\n     * @param {JQLite} jqCollection If we are working on the root of the compile tree then this\n     *                              argument has the root jqLite array so that we can replace nodes\n     *                              on it.\n     * @param {Object=} originalReplaceDirective An optional directive that will be ignored when\n     *                                           compiling the transclusion.\n     * @param {Array.<Function>} preLinkFns\n     * @param {Array.<Function>} postLinkFns\n     * @param {Object} previousCompileContext Context used for previous compilation of the current\n     *                                        node\n     * @returns {Function} linkFn\n     */\n    function applyDirectivesToNode(directives, compileNode, templateAttrs, transcludeFn,\n                                   jqCollection, originalReplaceDirective, preLinkFns, postLinkFns,\n                                   previousCompileContext) {\n      previousCompileContext = previousCompileContext || {};\n\n      var terminalPriority = -Number.MAX_VALUE,\n          newScopeDirective = previousCompileContext.newScopeDirective,\n          controllerDirectives = previousCompileContext.controllerDirectives,\n          newIsolateScopeDirective = previousCompileContext.newIsolateScopeDirective,\n          templateDirective = previousCompileContext.templateDirective,\n          nonTlbTranscludeDirective = previousCompileContext.nonTlbTranscludeDirective,\n          hasTranscludeDirective = false,\n          hasTemplate = false,\n          hasElementTranscludeDirective = previousCompileContext.hasElementTranscludeDirective,\n          $compileNode = templateAttrs.$$element = jqLite(compileNode),\n          directive,\n          directiveName,\n          $template,\n          replaceDirective = originalReplaceDirective,\n          childTranscludeFn = transcludeFn,\n          linkFn,\n          didScanForMultipleTransclusion = false,\n          mightHaveMultipleTransclusionError = false,\n          directiveValue;\n\n      // executes all directives on the current element\n      for (var i = 0, ii = directives.length; i < ii; i++) {\n        directive = directives[i];\n        var attrStart = directive.$$start;\n        var attrEnd = directive.$$end;\n\n        // collect multiblock sections\n        if (attrStart) {\n          $compileNode = groupScan(compileNode, attrStart, attrEnd);\n        }\n        $template = undefined;\n\n        if (terminalPriority > directive.priority) {\n          break; // prevent further processing of directives\n        }\n\n        if (directiveValue = directive.scope) {\n\n          // skip the check for directives with async templates, we'll check the derived sync\n          // directive when the template arrives\n          if (!directive.templateUrl) {\n            if (isObject(directiveValue)) {\n              // This directive is trying to add an isolated scope.\n              // Check that there is no scope of any kind already\n              assertNoDuplicate('new/isolated scope', newIsolateScopeDirective || newScopeDirective,\n                                directive, $compileNode);\n              newIsolateScopeDirective = directive;\n            } else {\n              // This directive is trying to add a child scope.\n              // Check that there is no isolated scope already\n              assertNoDuplicate('new/isolated scope', newIsolateScopeDirective, directive,\n                                $compileNode);\n            }\n          }\n\n          newScopeDirective = newScopeDirective || directive;\n        }\n\n        directiveName = directive.name;\n\n        // If we encounter a condition that can result in transclusion on the directive,\n        // then scan ahead in the remaining directives for others that may cause a multiple\n        // transclusion error to be thrown during the compilation process.  If a matching directive\n        // is found, then we know that when we encounter a transcluded directive, we need to eagerly\n        // compile the `transclude` function rather than doing it lazily in order to throw\n        // exceptions at the correct time\n        if (!didScanForMultipleTransclusion && ((directive.replace && (directive.templateUrl || directive.template))\n            || (directive.transclude && !directive.$$tlb))) {\n                var candidateDirective;\n\n                for (var scanningIndex = i + 1; candidateDirective = directives[scanningIndex++];) {\n                    if ((candidateDirective.transclude && !candidateDirective.$$tlb)\n                        || (candidateDirective.replace && (candidateDirective.templateUrl || candidateDirective.template))) {\n                        mightHaveMultipleTransclusionError = true;\n                        break;\n                    }\n                }\n\n                didScanForMultipleTransclusion = true;\n        }\n\n        if (!directive.templateUrl && directive.controller) {\n          directiveValue = directive.controller;\n          controllerDirectives = controllerDirectives || createMap();\n          assertNoDuplicate(\"'\" + directiveName + \"' controller\",\n              controllerDirectives[directiveName], directive, $compileNode);\n          controllerDirectives[directiveName] = directive;\n        }\n\n        if (directiveValue = directive.transclude) {\n          hasTranscludeDirective = true;\n\n          // Special case ngIf and ngRepeat so that we don't complain about duplicate transclusion.\n          // This option should only be used by directives that know how to safely handle element transclusion,\n          // where the transcluded nodes are added or replaced after linking.\n          if (!directive.$$tlb) {\n            assertNoDuplicate('transclusion', nonTlbTranscludeDirective, directive, $compileNode);\n            nonTlbTranscludeDirective = directive;\n          }\n\n          if (directiveValue == 'element') {\n            hasElementTranscludeDirective = true;\n            terminalPriority = directive.priority;\n            $template = $compileNode;\n            $compileNode = templateAttrs.$$element =\n                jqLite(compile.$$createComment(directiveName, templateAttrs[directiveName]));\n            compileNode = $compileNode[0];\n            replaceWith(jqCollection, sliceArgs($template), compileNode);\n\n            // Support: Chrome < 50\n            // https://github.com/angular/angular.js/issues/14041\n\n            // In the versions of V8 prior to Chrome 50, the document fragment that is created\n            // in the `replaceWith` function is improperly garbage collected despite still\n            // being referenced by the `parentNode` property of all of the child nodes.  By adding\n            // a reference to the fragment via a different property, we can avoid that incorrect\n            // behavior.\n            // TODO: remove this line after Chrome 50 has been released\n            $template[0].$$parentNode = $template[0].parentNode;\n\n            childTranscludeFn = compilationGenerator(mightHaveMultipleTransclusionError, $template, transcludeFn, terminalPriority,\n                                        replaceDirective && replaceDirective.name, {\n                                          // Don't pass in:\n                                          // - controllerDirectives - otherwise we'll create duplicates controllers\n                                          // - newIsolateScopeDirective or templateDirective - combining templates with\n                                          //   element transclusion doesn't make sense.\n                                          //\n                                          // We need only nonTlbTranscludeDirective so that we prevent putting transclusion\n                                          // on the same element more than once.\n                                          nonTlbTranscludeDirective: nonTlbTranscludeDirective\n                                        });\n          } else {\n\n            var slots = createMap();\n\n            $template = jqLite(jqLiteClone(compileNode)).contents();\n\n            if (isObject(directiveValue)) {\n\n              // We have transclusion slots,\n              // collect them up, compile them and store their transclusion functions\n              $template = [];\n\n              var slotMap = createMap();\n              var filledSlots = createMap();\n\n              // Parse the element selectors\n              forEach(directiveValue, function(elementSelector, slotName) {\n                // If an element selector starts with a ? then it is optional\n                var optional = (elementSelector.charAt(0) === '?');\n                elementSelector = optional ? elementSelector.substring(1) : elementSelector;\n\n                slotMap[elementSelector] = slotName;\n\n                // We explicitly assign `null` since this implies that a slot was defined but not filled.\n                // Later when calling boundTransclusion functions with a slot name we only error if the\n                // slot is `undefined`\n                slots[slotName] = null;\n\n                // filledSlots contains `true` for all slots that are either optional or have been\n                // filled. This is used to check that we have not missed any required slots\n                filledSlots[slotName] = optional;\n              });\n\n              // Add the matching elements into their slot\n              forEach($compileNode.contents(), function(node) {\n                var slotName = slotMap[directiveNormalize(nodeName_(node))];\n                if (slotName) {\n                  filledSlots[slotName] = true;\n                  slots[slotName] = slots[slotName] || [];\n                  slots[slotName].push(node);\n                } else {\n                  $template.push(node);\n                }\n              });\n\n              // Check for required slots that were not filled\n              forEach(filledSlots, function(filled, slotName) {\n                if (!filled) {\n                  throw $compileMinErr('reqslot', 'Required transclusion slot `{0}` was not filled.', slotName);\n                }\n              });\n\n              for (var slotName in slots) {\n                if (slots[slotName]) {\n                  // Only define a transclusion function if the slot was filled\n                  slots[slotName] = compilationGenerator(mightHaveMultipleTransclusionError, slots[slotName], transcludeFn);\n                }\n              }\n            }\n\n            $compileNode.empty(); // clear contents\n            childTranscludeFn = compilationGenerator(mightHaveMultipleTransclusionError, $template, transcludeFn, undefined,\n                undefined, { needsNewScope: directive.$$isolateScope || directive.$$newScope});\n            childTranscludeFn.$$slots = slots;\n          }\n        }\n\n        if (directive.template) {\n          hasTemplate = true;\n          assertNoDuplicate('template', templateDirective, directive, $compileNode);\n          templateDirective = directive;\n\n          directiveValue = (isFunction(directive.template))\n              ? directive.template($compileNode, templateAttrs)\n              : directive.template;\n\n          directiveValue = denormalizeTemplate(directiveValue);\n\n          if (directive.replace) {\n            replaceDirective = directive;\n            if (jqLiteIsTextNode(directiveValue)) {\n              $template = [];\n            } else {\n              $template = removeComments(wrapTemplate(directive.templateNamespace, trim(directiveValue)));\n            }\n            compileNode = $template[0];\n\n            if ($template.length != 1 || compileNode.nodeType !== NODE_TYPE_ELEMENT) {\n              throw $compileMinErr('tplrt',\n                  \"Template for directive '{0}' must have exactly one root element. {1}\",\n                  directiveName, '');\n            }\n\n            replaceWith(jqCollection, $compileNode, compileNode);\n\n            var newTemplateAttrs = {$attr: {}};\n\n            // combine directives from the original node and from the template:\n            // - take the array of directives for this element\n            // - split it into two parts, those that already applied (processed) and those that weren't (unprocessed)\n            // - collect directives from the template and sort them by priority\n            // - combine directives as: processed + template + unprocessed\n            var templateDirectives = collectDirectives(compileNode, [], newTemplateAttrs);\n            var unprocessedDirectives = directives.splice(i + 1, directives.length - (i + 1));\n\n            if (newIsolateScopeDirective || newScopeDirective) {\n              // The original directive caused the current element to be replaced but this element\n              // also needs to have a new scope, so we need to tell the template directives\n              // that they would need to get their scope from further up, if they require transclusion\n              markDirectiveScope(templateDirectives, newIsolateScopeDirective, newScopeDirective);\n            }\n            directives = directives.concat(templateDirectives).concat(unprocessedDirectives);\n            mergeTemplateAttributes(templateAttrs, newTemplateAttrs);\n\n            ii = directives.length;\n          } else {\n            $compileNode.html(directiveValue);\n          }\n        }\n\n        if (directive.templateUrl) {\n          hasTemplate = true;\n          assertNoDuplicate('template', templateDirective, directive, $compileNode);\n          templateDirective = directive;\n\n          if (directive.replace) {\n            replaceDirective = directive;\n          }\n\n          /* jshint -W021 */\n          nodeLinkFn = compileTemplateUrl(directives.splice(i, directives.length - i), $compileNode,\n          /* jshint +W021 */\n              templateAttrs, jqCollection, hasTranscludeDirective && childTranscludeFn, preLinkFns, postLinkFns, {\n                controllerDirectives: controllerDirectives,\n                newScopeDirective: (newScopeDirective !== directive) && newScopeDirective,\n                newIsolateScopeDirective: newIsolateScopeDirective,\n                templateDirective: templateDirective,\n                nonTlbTranscludeDirective: nonTlbTranscludeDirective\n              });\n          ii = directives.length;\n        } else if (directive.compile) {\n          try {\n            linkFn = directive.compile($compileNode, templateAttrs, childTranscludeFn);\n            if (isFunction(linkFn)) {\n              addLinkFns(null, linkFn, attrStart, attrEnd);\n            } else if (linkFn) {\n              addLinkFns(linkFn.pre, linkFn.post, attrStart, attrEnd);\n            }\n          } catch (e) {\n            $exceptionHandler(e, startingTag($compileNode));\n          }\n        }\n\n        if (directive.terminal) {\n          nodeLinkFn.terminal = true;\n          terminalPriority = Math.max(terminalPriority, directive.priority);\n        }\n\n      }\n\n      nodeLinkFn.scope = newScopeDirective && newScopeDirective.scope === true;\n      nodeLinkFn.transcludeOnThisElement = hasTranscludeDirective;\n      nodeLinkFn.templateOnThisElement = hasTemplate;\n      nodeLinkFn.transclude = childTranscludeFn;\n\n      previousCompileContext.hasElementTranscludeDirective = hasElementTranscludeDirective;\n\n      // might be normal or delayed nodeLinkFn depending on if templateUrl is present\n      return nodeLinkFn;\n\n      ////////////////////\n\n      function addLinkFns(pre, post, attrStart, attrEnd) {\n        if (pre) {\n          if (attrStart) pre = groupElementsLinkFnWrapper(pre, attrStart, attrEnd);\n          pre.require = directive.require;\n          pre.directiveName = directiveName;\n          if (newIsolateScopeDirective === directive || directive.$$isolateScope) {\n            pre = cloneAndAnnotateFn(pre, {isolateScope: true});\n          }\n          preLinkFns.push(pre);\n        }\n        if (post) {\n          if (attrStart) post = groupElementsLinkFnWrapper(post, attrStart, attrEnd);\n          post.require = directive.require;\n          post.directiveName = directiveName;\n          if (newIsolateScopeDirective === directive || directive.$$isolateScope) {\n            post = cloneAndAnnotateFn(post, {isolateScope: true});\n          }\n          postLinkFns.push(post);\n        }\n      }\n\n      function nodeLinkFn(childLinkFn, scope, linkNode, $rootElement, boundTranscludeFn) {\n        var i, ii, linkFn, isolateScope, controllerScope, elementControllers, transcludeFn, $element,\n            attrs, scopeBindingInfo;\n\n        if (compileNode === linkNode) {\n          attrs = templateAttrs;\n          $element = templateAttrs.$$element;\n        } else {\n          $element = jqLite(linkNode);\n          attrs = new Attributes($element, templateAttrs);\n        }\n\n        controllerScope = scope;\n        if (newIsolateScopeDirective) {\n          isolateScope = scope.$new(true);\n        } else if (newScopeDirective) {\n          controllerScope = scope.$parent;\n        }\n\n        if (boundTranscludeFn) {\n          // track `boundTranscludeFn` so it can be unwrapped if `transcludeFn`\n          // is later passed as `parentBoundTranscludeFn` to `publicLinkFn`\n          transcludeFn = controllersBoundTransclude;\n          transcludeFn.$$boundTransclude = boundTranscludeFn;\n          // expose the slots on the `$transclude` function\n          transcludeFn.isSlotFilled = function(slotName) {\n            return !!boundTranscludeFn.$$slots[slotName];\n          };\n        }\n\n        if (controllerDirectives) {\n          elementControllers = setupControllers($element, attrs, transcludeFn, controllerDirectives, isolateScope, scope, newIsolateScopeDirective);\n        }\n\n        if (newIsolateScopeDirective) {\n          // Initialize isolate scope bindings for new isolate scope directive.\n          compile.$$addScopeInfo($element, isolateScope, true, !(templateDirective && (templateDirective === newIsolateScopeDirective ||\n              templateDirective === newIsolateScopeDirective.$$originalDirective)));\n          compile.$$addScopeClass($element, true);\n          isolateScope.$$isolateBindings =\n              newIsolateScopeDirective.$$isolateBindings;\n          scopeBindingInfo = initializeDirectiveBindings(scope, attrs, isolateScope,\n                                        isolateScope.$$isolateBindings,\n                                        newIsolateScopeDirective);\n          if (scopeBindingInfo.removeWatches) {\n            isolateScope.$on('$destroy', scopeBindingInfo.removeWatches);\n          }\n        }\n\n        // Initialize bindToController bindings\n        for (var name in elementControllers) {\n          var controllerDirective = controllerDirectives[name];\n          var controller = elementControllers[name];\n          var bindings = controllerDirective.$$bindings.bindToController;\n\n          if (controller.identifier && bindings) {\n            controller.bindingInfo =\n              initializeDirectiveBindings(controllerScope, attrs, controller.instance, bindings, controllerDirective);\n          } else {\n            controller.bindingInfo = {};\n          }\n\n          var controllerResult = controller();\n          if (controllerResult !== controller.instance) {\n            // If the controller constructor has a return value, overwrite the instance\n            // from setupControllers\n            controller.instance = controllerResult;\n            $element.data('$' + controllerDirective.name + 'Controller', controllerResult);\n            controller.bindingInfo.removeWatches && controller.bindingInfo.removeWatches();\n            controller.bindingInfo =\n              initializeDirectiveBindings(controllerScope, attrs, controller.instance, bindings, controllerDirective);\n          }\n        }\n\n        // Bind the required controllers to the controller, if `require` is an object and `bindToController` is truthy\n        forEach(controllerDirectives, function(controllerDirective, name) {\n          var require = controllerDirective.require;\n          if (controllerDirective.bindToController && !isArray(require) && isObject(require)) {\n            extend(elementControllers[name].instance, getControllers(name, require, $element, elementControllers));\n          }\n        });\n\n        // Handle the init and destroy lifecycle hooks on all controllers that have them\n        forEach(elementControllers, function(controller) {\n          var controllerInstance = controller.instance;\n          if (isFunction(controllerInstance.$onChanges)) {\n            controllerInstance.$onChanges(controller.bindingInfo.initialChanges);\n          }\n          if (isFunction(controllerInstance.$onInit)) {\n            controllerInstance.$onInit();\n          }\n          if (isFunction(controllerInstance.$onDestroy)) {\n            controllerScope.$on('$destroy', function callOnDestroyHook() {\n              controllerInstance.$onDestroy();\n            });\n          }\n        });\n\n        // PRELINKING\n        for (i = 0, ii = preLinkFns.length; i < ii; i++) {\n          linkFn = preLinkFns[i];\n          invokeLinkFn(linkFn,\n              linkFn.isolateScope ? isolateScope : scope,\n              $element,\n              attrs,\n              linkFn.require && getControllers(linkFn.directiveName, linkFn.require, $element, elementControllers),\n              transcludeFn\n          );\n        }\n\n        // RECURSION\n        // We only pass the isolate scope, if the isolate directive has a template,\n        // otherwise the child elements do not belong to the isolate directive.\n        var scopeToChild = scope;\n        if (newIsolateScopeDirective && (newIsolateScopeDirective.template || newIsolateScopeDirective.templateUrl === null)) {\n          scopeToChild = isolateScope;\n        }\n        childLinkFn && childLinkFn(scopeToChild, linkNode.childNodes, undefined, boundTranscludeFn);\n\n        // POSTLINKING\n        for (i = postLinkFns.length - 1; i >= 0; i--) {\n          linkFn = postLinkFns[i];\n          invokeLinkFn(linkFn,\n              linkFn.isolateScope ? isolateScope : scope,\n              $element,\n              attrs,\n              linkFn.require && getControllers(linkFn.directiveName, linkFn.require, $element, elementControllers),\n              transcludeFn\n          );\n        }\n\n        // Trigger $postLink lifecycle hooks\n        forEach(elementControllers, function(controller) {\n          var controllerInstance = controller.instance;\n          if (isFunction(controllerInstance.$postLink)) {\n            controllerInstance.$postLink();\n          }\n        });\n\n        // This is the function that is injected as `$transclude`.\n        // Note: all arguments are optional!\n        function controllersBoundTransclude(scope, cloneAttachFn, futureParentElement, slotName) {\n          var transcludeControllers;\n          // No scope passed in:\n          if (!isScope(scope)) {\n            slotName = futureParentElement;\n            futureParentElement = cloneAttachFn;\n            cloneAttachFn = scope;\n            scope = undefined;\n          }\n\n          if (hasElementTranscludeDirective) {\n            transcludeControllers = elementControllers;\n          }\n          if (!futureParentElement) {\n            futureParentElement = hasElementTranscludeDirective ? $element.parent() : $element;\n          }\n          if (slotName) {\n            // slotTranscludeFn can be one of three things:\n            //  * a transclude function - a filled slot\n            //  * `null` - an optional slot that was not filled\n            //  * `undefined` - a slot that was not declared (i.e. invalid)\n            var slotTranscludeFn = boundTranscludeFn.$$slots[slotName];\n            if (slotTranscludeFn) {\n              return slotTranscludeFn(scope, cloneAttachFn, transcludeControllers, futureParentElement, scopeToChild);\n            } else if (isUndefined(slotTranscludeFn)) {\n              throw $compileMinErr('noslot',\n               'No parent directive that requires a transclusion with slot name \"{0}\". ' +\n               'Element: {1}',\n               slotName, startingTag($element));\n            }\n          } else {\n            return boundTranscludeFn(scope, cloneAttachFn, transcludeControllers, futureParentElement, scopeToChild);\n          }\n        }\n      }\n    }\n\n    function getControllers(directiveName, require, $element, elementControllers) {\n      var value;\n\n      if (isString(require)) {\n        var match = require.match(REQUIRE_PREFIX_REGEXP);\n        var name = require.substring(match[0].length);\n        var inheritType = match[1] || match[3];\n        var optional = match[2] === '?';\n\n        //If only parents then start at the parent element\n        if (inheritType === '^^') {\n          $element = $element.parent();\n        //Otherwise attempt getting the controller from elementControllers in case\n        //the element is transcluded (and has no data) and to avoid .data if possible\n        } else {\n          value = elementControllers && elementControllers[name];\n          value = value && value.instance;\n        }\n\n        if (!value) {\n          var dataName = '$' + name + 'Controller';\n          value = inheritType ? $element.inheritedData(dataName) : $element.data(dataName);\n        }\n\n        if (!value && !optional) {\n          throw $compileMinErr('ctreq',\n              \"Controller '{0}', required by directive '{1}', can't be found!\",\n              name, directiveName);\n        }\n      } else if (isArray(require)) {\n        value = [];\n        for (var i = 0, ii = require.length; i < ii; i++) {\n          value[i] = getControllers(directiveName, require[i], $element, elementControllers);\n        }\n      } else if (isObject(require)) {\n        value = {};\n        forEach(require, function(controller, property) {\n          value[property] = getControllers(directiveName, controller, $element, elementControllers);\n        });\n      }\n\n      return value || null;\n    }\n\n    function setupControllers($element, attrs, transcludeFn, controllerDirectives, isolateScope, scope, newIsolateScopeDirective) {\n      var elementControllers = createMap();\n      for (var controllerKey in controllerDirectives) {\n        var directive = controllerDirectives[controllerKey];\n        var locals = {\n          $scope: directive === newIsolateScopeDirective || directive.$$isolateScope ? isolateScope : scope,\n          $element: $element,\n          $attrs: attrs,\n          $transclude: transcludeFn\n        };\n\n        var controller = directive.controller;\n        if (controller == '@') {\n          controller = attrs[directive.name];\n        }\n\n        var controllerInstance = $controller(controller, locals, true, directive.controllerAs);\n\n        // For directives with element transclusion the element is a comment.\n        // In this case .data will not attach any data.\n        // Instead, we save the controllers for the element in a local hash and attach to .data\n        // later, once we have the actual element.\n        elementControllers[directive.name] = controllerInstance;\n        $element.data('$' + directive.name + 'Controller', controllerInstance.instance);\n      }\n      return elementControllers;\n    }\n\n    // Depending upon the context in which a directive finds itself it might need to have a new isolated\n    // or child scope created. For instance:\n    // * if the directive has been pulled into a template because another directive with a higher priority\n    // asked for element transclusion\n    // * if the directive itself asks for transclusion but it is at the root of a template and the original\n    // element was replaced. See https://github.com/angular/angular.js/issues/12936\n    function markDirectiveScope(directives, isolateScope, newScope) {\n      for (var j = 0, jj = directives.length; j < jj; j++) {\n        directives[j] = inherit(directives[j], {$$isolateScope: isolateScope, $$newScope: newScope});\n      }\n    }\n\n    /**\n     * looks up the directive and decorates it with exception handling and proper parameters. We\n     * call this the boundDirective.\n     *\n     * @param {string} name name of the directive to look up.\n     * @param {string} location The directive must be found in specific format.\n     *   String containing any of theses characters:\n     *\n     *   * `E`: element name\n     *   * `A': attribute\n     *   * `C`: class\n     *   * `M`: comment\n     * @returns {boolean} true if directive was added.\n     */\n    function addDirective(tDirectives, name, location, maxPriority, ignoreDirective, startAttrName,\n                          endAttrName) {\n      if (name === ignoreDirective) return null;\n      var match = null;\n      if (hasDirectives.hasOwnProperty(name)) {\n        for (var directive, directives = $injector.get(name + Suffix),\n            i = 0, ii = directives.length; i < ii; i++) {\n          try {\n            directive = directives[i];\n            if ((isUndefined(maxPriority) || maxPriority > directive.priority) &&\n                 directive.restrict.indexOf(location) != -1) {\n              if (startAttrName) {\n                directive = inherit(directive, {$$start: startAttrName, $$end: endAttrName});\n              }\n              if (!directive.$$bindings) {\n                var bindings = directive.$$bindings =\n                    parseDirectiveBindings(directive, directive.name);\n                if (isObject(bindings.isolateScope)) {\n                  directive.$$isolateBindings = bindings.isolateScope;\n                }\n              }\n              tDirectives.push(directive);\n              match = directive;\n            }\n          } catch (e) { $exceptionHandler(e); }\n        }\n      }\n      return match;\n    }\n\n\n    /**\n     * looks up the directive and returns true if it is a multi-element directive,\n     * and therefore requires DOM nodes between -start and -end markers to be grouped\n     * together.\n     *\n     * @param {string} name name of the directive to look up.\n     * @returns true if directive was registered as multi-element.\n     */\n    function directiveIsMultiElement(name) {\n      if (hasDirectives.hasOwnProperty(name)) {\n        for (var directive, directives = $injector.get(name + Suffix),\n            i = 0, ii = directives.length; i < ii; i++) {\n          directive = directives[i];\n          if (directive.multiElement) {\n            return true;\n          }\n        }\n      }\n      return false;\n    }\n\n    /**\n     * When the element is replaced with HTML template then the new attributes\n     * on the template need to be merged with the existing attributes in the DOM.\n     * The desired effect is to have both of the attributes present.\n     *\n     * @param {object} dst destination attributes (original DOM)\n     * @param {object} src source attributes (from the directive template)\n     */\n    function mergeTemplateAttributes(dst, src) {\n      var srcAttr = src.$attr,\n          dstAttr = dst.$attr,\n          $element = dst.$$element;\n\n      // reapply the old attributes to the new element\n      forEach(dst, function(value, key) {\n        if (key.charAt(0) != '$') {\n          if (src[key] && src[key] !== value) {\n            value += (key === 'style' ? ';' : ' ') + src[key];\n          }\n          dst.$set(key, value, true, srcAttr[key]);\n        }\n      });\n\n      // copy the new attributes on the old attrs object\n      forEach(src, function(value, key) {\n        if (key == 'class') {\n          safeAddClass($element, value);\n          dst['class'] = (dst['class'] ? dst['class'] + ' ' : '') + value;\n        } else if (key == 'style') {\n          $element.attr('style', $element.attr('style') + ';' + value);\n          dst['style'] = (dst['style'] ? dst['style'] + ';' : '') + value;\n          // `dst` will never contain hasOwnProperty as DOM parser won't let it.\n          // You will get an \"InvalidCharacterError: DOM Exception 5\" error if you\n          // have an attribute like \"has-own-property\" or \"data-has-own-property\", etc.\n        } else if (key.charAt(0) != '$' && !dst.hasOwnProperty(key)) {\n          dst[key] = value;\n          dstAttr[key] = srcAttr[key];\n        }\n      });\n    }\n\n\n    function compileTemplateUrl(directives, $compileNode, tAttrs,\n        $rootElement, childTranscludeFn, preLinkFns, postLinkFns, previousCompileContext) {\n      var linkQueue = [],\n          afterTemplateNodeLinkFn,\n          afterTemplateChildLinkFn,\n          beforeTemplateCompileNode = $compileNode[0],\n          origAsyncDirective = directives.shift(),\n          derivedSyncDirective = inherit(origAsyncDirective, {\n            templateUrl: null, transclude: null, replace: null, $$originalDirective: origAsyncDirective\n          }),\n          templateUrl = (isFunction(origAsyncDirective.templateUrl))\n              ? origAsyncDirective.templateUrl($compileNode, tAttrs)\n              : origAsyncDirective.templateUrl,\n          templateNamespace = origAsyncDirective.templateNamespace;\n\n      $compileNode.empty();\n\n      $templateRequest(templateUrl)\n        .then(function(content) {\n          var compileNode, tempTemplateAttrs, $template, childBoundTranscludeFn;\n\n          content = denormalizeTemplate(content);\n\n          if (origAsyncDirective.replace) {\n            if (jqLiteIsTextNode(content)) {\n              $template = [];\n            } else {\n              $template = removeComments(wrapTemplate(templateNamespace, trim(content)));\n            }\n            compileNode = $template[0];\n\n            if ($template.length != 1 || compileNode.nodeType !== NODE_TYPE_ELEMENT) {\n              throw $compileMinErr('tplrt',\n                  \"Template for directive '{0}' must have exactly one root element. {1}\",\n                  origAsyncDirective.name, templateUrl);\n            }\n\n            tempTemplateAttrs = {$attr: {}};\n            replaceWith($rootElement, $compileNode, compileNode);\n            var templateDirectives = collectDirectives(compileNode, [], tempTemplateAttrs);\n\n            if (isObject(origAsyncDirective.scope)) {\n              // the original directive that caused the template to be loaded async required\n              // an isolate scope\n              markDirectiveScope(templateDirectives, true);\n            }\n            directives = templateDirectives.concat(directives);\n            mergeTemplateAttributes(tAttrs, tempTemplateAttrs);\n          } else {\n            compileNode = beforeTemplateCompileNode;\n            $compileNode.html(content);\n          }\n\n          directives.unshift(derivedSyncDirective);\n\n          afterTemplateNodeLinkFn = applyDirectivesToNode(directives, compileNode, tAttrs,\n              childTranscludeFn, $compileNode, origAsyncDirective, preLinkFns, postLinkFns,\n              previousCompileContext);\n          forEach($rootElement, function(node, i) {\n            if (node == compileNode) {\n              $rootElement[i] = $compileNode[0];\n            }\n          });\n          afterTemplateChildLinkFn = compileNodes($compileNode[0].childNodes, childTranscludeFn);\n\n          while (linkQueue.length) {\n            var scope = linkQueue.shift(),\n                beforeTemplateLinkNode = linkQueue.shift(),\n                linkRootElement = linkQueue.shift(),\n                boundTranscludeFn = linkQueue.shift(),\n                linkNode = $compileNode[0];\n\n            if (scope.$$destroyed) continue;\n\n            if (beforeTemplateLinkNode !== beforeTemplateCompileNode) {\n              var oldClasses = beforeTemplateLinkNode.className;\n\n              if (!(previousCompileContext.hasElementTranscludeDirective &&\n                  origAsyncDirective.replace)) {\n                // it was cloned therefore we have to clone as well.\n                linkNode = jqLiteClone(compileNode);\n              }\n              replaceWith(linkRootElement, jqLite(beforeTemplateLinkNode), linkNode);\n\n              // Copy in CSS classes from original node\n              safeAddClass(jqLite(linkNode), oldClasses);\n            }\n            if (afterTemplateNodeLinkFn.transcludeOnThisElement) {\n              childBoundTranscludeFn = createBoundTranscludeFn(scope, afterTemplateNodeLinkFn.transclude, boundTranscludeFn);\n            } else {\n              childBoundTranscludeFn = boundTranscludeFn;\n            }\n            afterTemplateNodeLinkFn(afterTemplateChildLinkFn, scope, linkNode, $rootElement,\n              childBoundTranscludeFn);\n          }\n          linkQueue = null;\n        });\n\n      return function delayedNodeLinkFn(ignoreChildLinkFn, scope, node, rootElement, boundTranscludeFn) {\n        var childBoundTranscludeFn = boundTranscludeFn;\n        if (scope.$$destroyed) return;\n        if (linkQueue) {\n          linkQueue.push(scope,\n                         node,\n                         rootElement,\n                         childBoundTranscludeFn);\n        } else {\n          if (afterTemplateNodeLinkFn.transcludeOnThisElement) {\n            childBoundTranscludeFn = createBoundTranscludeFn(scope, afterTemplateNodeLinkFn.transclude, boundTranscludeFn);\n          }\n          afterTemplateNodeLinkFn(afterTemplateChildLinkFn, scope, node, rootElement, childBoundTranscludeFn);\n        }\n      };\n    }\n\n\n    /**\n     * Sorting function for bound directives.\n     */\n    function byPriority(a, b) {\n      var diff = b.priority - a.priority;\n      if (diff !== 0) return diff;\n      if (a.name !== b.name) return (a.name < b.name) ? -1 : 1;\n      return a.index - b.index;\n    }\n\n    function assertNoDuplicate(what, previousDirective, directive, element) {\n\n      function wrapModuleNameIfDefined(moduleName) {\n        return moduleName ?\n          (' (module: ' + moduleName + ')') :\n          '';\n      }\n\n      if (previousDirective) {\n        throw $compileMinErr('multidir', 'Multiple directives [{0}{1}, {2}{3}] asking for {4} on: {5}',\n            previousDirective.name, wrapModuleNameIfDefined(previousDirective.$$moduleName),\n            directive.name, wrapModuleNameIfDefined(directive.$$moduleName), what, startingTag(element));\n      }\n    }\n\n\n    function addTextInterpolateDirective(directives, text) {\n      var interpolateFn = $interpolate(text, true);\n      if (interpolateFn) {\n        directives.push({\n          priority: 0,\n          compile: function textInterpolateCompileFn(templateNode) {\n            var templateNodeParent = templateNode.parent(),\n                hasCompileParent = !!templateNodeParent.length;\n\n            // When transcluding a template that has bindings in the root\n            // we don't have a parent and thus need to add the class during linking fn.\n            if (hasCompileParent) compile.$$addBindingClass(templateNodeParent);\n\n            return function textInterpolateLinkFn(scope, node) {\n              var parent = node.parent();\n              if (!hasCompileParent) compile.$$addBindingClass(parent);\n              compile.$$addBindingInfo(parent, interpolateFn.expressions);\n              scope.$watch(interpolateFn, function interpolateFnWatchAction(value) {\n                node[0].nodeValue = value;\n              });\n            };\n          }\n        });\n      }\n    }\n\n\n    function wrapTemplate(type, template) {\n      type = lowercase(type || 'html');\n      switch (type) {\n      case 'svg':\n      case 'math':\n        var wrapper = window.document.createElement('div');\n        wrapper.innerHTML = '<' + type + '>' + template + '</' + type + '>';\n        return wrapper.childNodes[0].childNodes;\n      default:\n        return template;\n      }\n    }\n\n\n    function getTrustedContext(node, attrNormalizedName) {\n      if (attrNormalizedName == \"srcdoc\") {\n        return $sce.HTML;\n      }\n      var tag = nodeName_(node);\n      // maction[xlink:href] can source SVG.  It's not limited to <maction>.\n      if (attrNormalizedName == \"xlinkHref\" ||\n          (tag == \"form\" && attrNormalizedName == \"action\") ||\n          (tag != \"img\" && (attrNormalizedName == \"src\" ||\n                            attrNormalizedName == \"ngSrc\"))) {\n        return $sce.RESOURCE_URL;\n      }\n    }\n\n\n    function addAttrInterpolateDirective(node, directives, value, name, allOrNothing) {\n      var trustedContext = getTrustedContext(node, name);\n      allOrNothing = ALL_OR_NOTHING_ATTRS[name] || allOrNothing;\n\n      var interpolateFn = $interpolate(value, true, trustedContext, allOrNothing);\n\n      // no interpolation found -> ignore\n      if (!interpolateFn) return;\n\n\n      if (name === \"multiple\" && nodeName_(node) === \"select\") {\n        throw $compileMinErr(\"selmulti\",\n            \"Binding to the 'multiple' attribute is not supported. Element: {0}\",\n            startingTag(node));\n      }\n\n      directives.push({\n        priority: 100,\n        compile: function() {\n            return {\n              pre: function attrInterpolatePreLinkFn(scope, element, attr) {\n                var $$observers = (attr.$$observers || (attr.$$observers = createMap()));\n\n                if (EVENT_HANDLER_ATTR_REGEXP.test(name)) {\n                  throw $compileMinErr('nodomevents',\n                      \"Interpolations for HTML DOM event attributes are disallowed.  Please use the \" +\n                          \"ng- versions (such as ng-click instead of onclick) instead.\");\n                }\n\n                // If the attribute has changed since last $interpolate()ed\n                var newValue = attr[name];\n                if (newValue !== value) {\n                  // we need to interpolate again since the attribute value has been updated\n                  // (e.g. by another directive's compile function)\n                  // ensure unset/empty values make interpolateFn falsy\n                  interpolateFn = newValue && $interpolate(newValue, true, trustedContext, allOrNothing);\n                  value = newValue;\n                }\n\n                // if attribute was updated so that there is no interpolation going on we don't want to\n                // register any observers\n                if (!interpolateFn) return;\n\n                // initialize attr object so that it's ready in case we need the value for isolate\n                // scope initialization, otherwise the value would not be available from isolate\n                // directive's linking fn during linking phase\n                attr[name] = interpolateFn(scope);\n\n                ($$observers[name] || ($$observers[name] = [])).$$inter = true;\n                (attr.$$observers && attr.$$observers[name].$$scope || scope).\n                  $watch(interpolateFn, function interpolateFnWatchAction(newValue, oldValue) {\n                    //special case for class attribute addition + removal\n                    //so that class changes can tap into the animation\n                    //hooks provided by the $animate service. Be sure to\n                    //skip animations when the first digest occurs (when\n                    //both the new and the old values are the same) since\n                    //the CSS classes are the non-interpolated values\n                    if (name === 'class' && newValue != oldValue) {\n                      attr.$updateClass(newValue, oldValue);\n                    } else {\n                      attr.$set(name, newValue);\n                    }\n                  });\n              }\n            };\n          }\n      });\n    }\n\n\n    /**\n     * This is a special jqLite.replaceWith, which can replace items which\n     * have no parents, provided that the containing jqLite collection is provided.\n     *\n     * @param {JqLite=} $rootElement The root of the compile tree. Used so that we can replace nodes\n     *                               in the root of the tree.\n     * @param {JqLite} elementsToRemove The jqLite element which we are going to replace. We keep\n     *                                  the shell, but replace its DOM node reference.\n     * @param {Node} newNode The new DOM node.\n     */\n    function replaceWith($rootElement, elementsToRemove, newNode) {\n      var firstElementToRemove = elementsToRemove[0],\n          removeCount = elementsToRemove.length,\n          parent = firstElementToRemove.parentNode,\n          i, ii;\n\n      if ($rootElement) {\n        for (i = 0, ii = $rootElement.length; i < ii; i++) {\n          if ($rootElement[i] == firstElementToRemove) {\n            $rootElement[i++] = newNode;\n            for (var j = i, j2 = j + removeCount - 1,\n                     jj = $rootElement.length;\n                 j < jj; j++, j2++) {\n              if (j2 < jj) {\n                $rootElement[j] = $rootElement[j2];\n              } else {\n                delete $rootElement[j];\n              }\n            }\n            $rootElement.length -= removeCount - 1;\n\n            // If the replaced element is also the jQuery .context then replace it\n            // .context is a deprecated jQuery api, so we should set it only when jQuery set it\n            // http://api.jquery.com/context/\n            if ($rootElement.context === firstElementToRemove) {\n              $rootElement.context = newNode;\n            }\n            break;\n          }\n        }\n      }\n\n      if (parent) {\n        parent.replaceChild(newNode, firstElementToRemove);\n      }\n\n      // Append all the `elementsToRemove` to a fragment. This will...\n      // - remove them from the DOM\n      // - allow them to still be traversed with .nextSibling\n      // - allow a single fragment.qSA to fetch all elements being removed\n      var fragment = window.document.createDocumentFragment();\n      for (i = 0; i < removeCount; i++) {\n        fragment.appendChild(elementsToRemove[i]);\n      }\n\n      if (jqLite.hasData(firstElementToRemove)) {\n        // Copy over user data (that includes Angular's $scope etc.). Don't copy private\n        // data here because there's no public interface in jQuery to do that and copying over\n        // event listeners (which is the main use of private data) wouldn't work anyway.\n        jqLite.data(newNode, jqLite.data(firstElementToRemove));\n\n        // Remove $destroy event listeners from `firstElementToRemove`\n        jqLite(firstElementToRemove).off('$destroy');\n      }\n\n      // Cleanup any data/listeners on the elements and children.\n      // This includes invoking the $destroy event on any elements with listeners.\n      jqLite.cleanData(fragment.querySelectorAll('*'));\n\n      // Update the jqLite collection to only contain the `newNode`\n      for (i = 1; i < removeCount; i++) {\n        delete elementsToRemove[i];\n      }\n      elementsToRemove[0] = newNode;\n      elementsToRemove.length = 1;\n    }\n\n\n    function cloneAndAnnotateFn(fn, annotation) {\n      return extend(function() { return fn.apply(null, arguments); }, fn, annotation);\n    }\n\n\n    function invokeLinkFn(linkFn, scope, $element, attrs, controllers, transcludeFn) {\n      try {\n        linkFn(scope, $element, attrs, controllers, transcludeFn);\n      } catch (e) {\n        $exceptionHandler(e, startingTag($element));\n      }\n    }\n\n\n    // Set up $watches for isolate scope and controller bindings. This process\n    // only occurs for isolate scopes and new scopes with controllerAs.\n    function initializeDirectiveBindings(scope, attrs, destination, bindings, directive) {\n      var removeWatchCollection = [];\n      var initialChanges = {};\n      var changes;\n      forEach(bindings, function initializeBinding(definition, scopeName) {\n        var attrName = definition.attrName,\n        optional = definition.optional,\n        mode = definition.mode, // @, =, or &\n        lastValue,\n        parentGet, parentSet, compare, removeWatch;\n\n        switch (mode) {\n\n          case '@':\n            if (!optional && !hasOwnProperty.call(attrs, attrName)) {\n              destination[scopeName] = attrs[attrName] = void 0;\n            }\n            attrs.$observe(attrName, function(value) {\n              if (isString(value) || isBoolean(value)) {\n                var oldValue = destination[scopeName];\n                recordChanges(scopeName, value, oldValue);\n                destination[scopeName] = value;\n              }\n            });\n            attrs.$$observers[attrName].$$scope = scope;\n            lastValue = attrs[attrName];\n            if (isString(lastValue)) {\n              // If the attribute has been provided then we trigger an interpolation to ensure\n              // the value is there for use in the link fn\n              destination[scopeName] = $interpolate(lastValue)(scope);\n            } else if (isBoolean(lastValue)) {\n              // If the attributes is one of the BOOLEAN_ATTR then Angular will have converted\n              // the value to boolean rather than a string, so we special case this situation\n              destination[scopeName] = lastValue;\n            }\n            initialChanges[scopeName] = new SimpleChange(_UNINITIALIZED_VALUE, destination[scopeName]);\n            break;\n\n          case '=':\n            if (!hasOwnProperty.call(attrs, attrName)) {\n              if (optional) break;\n              attrs[attrName] = void 0;\n            }\n            if (optional && !attrs[attrName]) break;\n\n            parentGet = $parse(attrs[attrName]);\n            if (parentGet.literal) {\n              compare = equals;\n            } else {\n              compare = function simpleCompare(a, b) { return a === b || (a !== a && b !== b); };\n            }\n            parentSet = parentGet.assign || function() {\n              // reset the change, or we will throw this exception on every $digest\n              lastValue = destination[scopeName] = parentGet(scope);\n              throw $compileMinErr('nonassign',\n                  \"Expression '{0}' in attribute '{1}' used with directive '{2}' is non-assignable!\",\n                  attrs[attrName], attrName, directive.name);\n            };\n            lastValue = destination[scopeName] = parentGet(scope);\n            var parentValueWatch = function parentValueWatch(parentValue) {\n              if (!compare(parentValue, destination[scopeName])) {\n                // we are out of sync and need to copy\n                if (!compare(parentValue, lastValue)) {\n                  // parent changed and it has precedence\n                  destination[scopeName] = parentValue;\n                } else {\n                  // if the parent can be assigned then do so\n                  parentSet(scope, parentValue = destination[scopeName]);\n                }\n              }\n              return lastValue = parentValue;\n            };\n            parentValueWatch.$stateful = true;\n            if (definition.collection) {\n              removeWatch = scope.$watchCollection(attrs[attrName], parentValueWatch);\n            } else {\n              removeWatch = scope.$watch($parse(attrs[attrName], parentValueWatch), null, parentGet.literal);\n            }\n            removeWatchCollection.push(removeWatch);\n            break;\n\n          case '<':\n            if (!hasOwnProperty.call(attrs, attrName)) {\n              if (optional) break;\n              attrs[attrName] = void 0;\n            }\n            if (optional && !attrs[attrName]) break;\n\n            parentGet = $parse(attrs[attrName]);\n\n            destination[scopeName] = parentGet(scope);\n            initialChanges[scopeName] = new SimpleChange(_UNINITIALIZED_VALUE, destination[scopeName]);\n\n            removeWatch = scope.$watch(parentGet, function parentValueWatchAction(newValue, oldValue) {\n              if (newValue === oldValue) {\n                // If the new and old values are identical then this is the first time the watch has been triggered\n                // So instead we use the current value on the destination as the old value\n                oldValue = destination[scopeName];\n              }\n              recordChanges(scopeName, newValue, oldValue);\n              destination[scopeName] = newValue;\n            }, parentGet.literal);\n\n            removeWatchCollection.push(removeWatch);\n            break;\n\n          case '&':\n            // Don't assign Object.prototype method to scope\n            parentGet = attrs.hasOwnProperty(attrName) ? $parse(attrs[attrName]) : noop;\n\n            // Don't assign noop to destination if expression is not valid\n            if (parentGet === noop && optional) break;\n\n            destination[scopeName] = function(locals) {\n              return parentGet(scope, locals);\n            };\n            break;\n        }\n      });\n\n      function recordChanges(key, currentValue, previousValue) {\n        if (isFunction(destination.$onChanges) && currentValue !== previousValue) {\n          // If we have not already scheduled the top level onChangesQueue handler then do so now\n          if (!onChangesQueue) {\n            scope.$$postDigest(flushOnChangesQueue);\n            onChangesQueue = [];\n          }\n          // If we have not already queued a trigger of onChanges for this controller then do so now\n          if (!changes) {\n            changes = {};\n            onChangesQueue.push(triggerOnChangesHook);\n          }\n          // If the has been a change on this property already then we need to reuse the previous value\n          if (changes[key]) {\n            previousValue = changes[key].previousValue;\n          }\n          // Store this change\n          changes[key] = new SimpleChange(previousValue, currentValue);\n        }\n      }\n\n      function triggerOnChangesHook() {\n        destination.$onChanges(changes);\n        // Now clear the changes so that we schedule onChanges when more changes arrive\n        changes = undefined;\n      }\n\n      return {\n        initialChanges: initialChanges,\n        removeWatches: removeWatchCollection.length && function removeWatches() {\n          for (var i = 0, ii = removeWatchCollection.length; i < ii; ++i) {\n            removeWatchCollection[i]();\n          }\n        }\n      };\n    }\n  }];\n}\n\nfunction SimpleChange(previous, current) {\n  this.previousValue = previous;\n  this.currentValue = current;\n}\nSimpleChange.prototype.isFirstChange = function() { return this.previousValue === _UNINITIALIZED_VALUE; };\n\n\nvar PREFIX_REGEXP = /^((?:x|data)[\\:\\-_])/i;\n/**\n * Converts all accepted directives format into proper directive name.\n * @param name Name to normalize\n */\nfunction directiveNormalize(name) {\n  return camelCase(name.replace(PREFIX_REGEXP, ''));\n}\n\n/**\n * @ngdoc type\n * @name $compile.directive.Attributes\n *\n * @description\n * A shared object between directive compile / linking functions which contains normalized DOM\n * element attributes. The values reflect current binding state `{{ }}`. The normalization is\n * needed since all of these are treated as equivalent in Angular:\n *\n * ```\n *    <span ng:bind=\"a\" ng-bind=\"a\" data-ng-bind=\"a\" x-ng-bind=\"a\">\n * ```\n */\n\n/**\n * @ngdoc property\n * @name $compile.directive.Attributes#$attr\n *\n * @description\n * A map of DOM element attribute names to the normalized name. This is\n * needed to do reverse lookup from normalized name back to actual name.\n */\n\n\n/**\n * @ngdoc method\n * @name $compile.directive.Attributes#$set\n * @kind function\n *\n * @description\n * Set DOM element attribute value.\n *\n *\n * @param {string} name Normalized element attribute name of the property to modify. The name is\n *          reverse-translated using the {@link ng.$compile.directive.Attributes#$attr $attr}\n *          property to the original name.\n * @param {string} value Value to set the attribute to. The value can be an interpolated string.\n */\n\n\n\n/**\n * Closure compiler type information\n */\n\nfunction nodesetLinkingFn(\n  /* angular.Scope */ scope,\n  /* NodeList */ nodeList,\n  /* Element */ rootElement,\n  /* function(Function) */ boundTranscludeFn\n) {}\n\nfunction directiveLinkingFn(\n  /* nodesetLinkingFn */ nodesetLinkingFn,\n  /* angular.Scope */ scope,\n  /* Node */ node,\n  /* Element */ rootElement,\n  /* function(Function) */ boundTranscludeFn\n) {}\n\nfunction tokenDifference(str1, str2) {\n  var values = '',\n      tokens1 = str1.split(/\\s+/),\n      tokens2 = str2.split(/\\s+/);\n\n  outer:\n  for (var i = 0; i < tokens1.length; i++) {\n    var token = tokens1[i];\n    for (var j = 0; j < tokens2.length; j++) {\n      if (token == tokens2[j]) continue outer;\n    }\n    values += (values.length > 0 ? ' ' : '') + token;\n  }\n  return values;\n}\n\nfunction removeComments(jqNodes) {\n  jqNodes = jqLite(jqNodes);\n  var i = jqNodes.length;\n\n  if (i <= 1) {\n    return jqNodes;\n  }\n\n  while (i--) {\n    var node = jqNodes[i];\n    if (node.nodeType === NODE_TYPE_COMMENT) {\n      splice.call(jqNodes, i, 1);\n    }\n  }\n  return jqNodes;\n}\n\nvar $controllerMinErr = minErr('$controller');\n\n\nvar CNTRL_REG = /^(\\S+)(\\s+as\\s+([\\w$]+))?$/;\nfunction identifierForController(controller, ident) {\n  if (ident && isString(ident)) return ident;\n  if (isString(controller)) {\n    var match = CNTRL_REG.exec(controller);\n    if (match) return match[3];\n  }\n}\n\n\n/**\n * @ngdoc provider\n * @name $controllerProvider\n * @description\n * The {@link ng.$controller $controller service} is used by Angular to create new\n * controllers.\n *\n * This provider allows controller registration via the\n * {@link ng.$controllerProvider#register register} method.\n */\nfunction $ControllerProvider() {\n  var controllers = {},\n      globals = false;\n\n  /**\n   * @ngdoc method\n   * @name $controllerProvider#has\n   * @param {string} name Controller name to check.\n   */\n  this.has = function(name) {\n    return controllers.hasOwnProperty(name);\n  };\n\n  /**\n   * @ngdoc method\n   * @name $controllerProvider#register\n   * @param {string|Object} name Controller name, or an object map of controllers where the keys are\n   *    the names and the values are the constructors.\n   * @param {Function|Array} constructor Controller constructor fn (optionally decorated with DI\n   *    annotations in the array notation).\n   */\n  this.register = function(name, constructor) {\n    assertNotHasOwnProperty(name, 'controller');\n    if (isObject(name)) {\n      extend(controllers, name);\n    } else {\n      controllers[name] = constructor;\n    }\n  };\n\n  /**\n   * @ngdoc method\n   * @name $controllerProvider#allowGlobals\n   * @description If called, allows `$controller` to find controller constructors on `window`\n   */\n  this.allowGlobals = function() {\n    globals = true;\n  };\n\n\n  this.$get = ['$injector', '$window', function($injector, $window) {\n\n    /**\n     * @ngdoc service\n     * @name $controller\n     * @requires $injector\n     *\n     * @param {Function|string} constructor If called with a function then it's considered to be the\n     *    controller constructor function. Otherwise it's considered to be a string which is used\n     *    to retrieve the controller constructor using the following steps:\n     *\n     *    * check if a controller with given name is registered via `$controllerProvider`\n     *    * check if evaluating the string on the current scope returns a constructor\n     *    * if $controllerProvider#allowGlobals, check `window[constructor]` on the global\n     *      `window` object (not recommended)\n     *\n     *    The string can use the `controller as property` syntax, where the controller instance is published\n     *    as the specified property on the `scope`; the `scope` must be injected into `locals` param for this\n     *    to work correctly.\n     *\n     * @param {Object} locals Injection locals for Controller.\n     * @return {Object} Instance of given controller.\n     *\n     * @description\n     * `$controller` service is responsible for instantiating controllers.\n     *\n     * It's just a simple call to {@link auto.$injector $injector}, but extracted into\n     * a service, so that one can override this service with [BC version](https://gist.github.com/1649788).\n     */\n    return function $controller(expression, locals, later, ident) {\n      // PRIVATE API:\n      //   param `later` --- indicates that the controller's constructor is invoked at a later time.\n      //                     If true, $controller will allocate the object with the correct\n      //                     prototype chain, but will not invoke the controller until a returned\n      //                     callback is invoked.\n      //   param `ident` --- An optional label which overrides the label parsed from the controller\n      //                     expression, if any.\n      var instance, match, constructor, identifier;\n      later = later === true;\n      if (ident && isString(ident)) {\n        identifier = ident;\n      }\n\n      if (isString(expression)) {\n        match = expression.match(CNTRL_REG);\n        if (!match) {\n          throw $controllerMinErr('ctrlfmt',\n            \"Badly formed controller string '{0}'. \" +\n            \"Must match `__name__ as __id__` or `__name__`.\", expression);\n        }\n        constructor = match[1],\n        identifier = identifier || match[3];\n        expression = controllers.hasOwnProperty(constructor)\n            ? controllers[constructor]\n            : getter(locals.$scope, constructor, true) ||\n                (globals ? getter($window, constructor, true) : undefined);\n\n        assertArgFn(expression, constructor, true);\n      }\n\n      if (later) {\n        // Instantiate controller later:\n        // This machinery is used to create an instance of the object before calling the\n        // controller's constructor itself.\n        //\n        // This allows properties to be added to the controller before the constructor is\n        // invoked. Primarily, this is used for isolate scope bindings in $compile.\n        //\n        // This feature is not intended for use by applications, and is thus not documented\n        // publicly.\n        // Object creation: http://jsperf.com/create-constructor/2\n        var controllerPrototype = (isArray(expression) ?\n          expression[expression.length - 1] : expression).prototype;\n        instance = Object.create(controllerPrototype || null);\n\n        if (identifier) {\n          addIdentifier(locals, identifier, instance, constructor || expression.name);\n        }\n\n        var instantiate;\n        return instantiate = extend(function $controllerInit() {\n          var result = $injector.invoke(expression, instance, locals, constructor);\n          if (result !== instance && (isObject(result) || isFunction(result))) {\n            instance = result;\n            if (identifier) {\n              // If result changed, re-assign controllerAs value to scope.\n              addIdentifier(locals, identifier, instance, constructor || expression.name);\n            }\n          }\n          return instance;\n        }, {\n          instance: instance,\n          identifier: identifier\n        });\n      }\n\n      instance = $injector.instantiate(expression, locals, constructor);\n\n      if (identifier) {\n        addIdentifier(locals, identifier, instance, constructor || expression.name);\n      }\n\n      return instance;\n    };\n\n    function addIdentifier(locals, identifier, instance, name) {\n      if (!(locals && isObject(locals.$scope))) {\n        throw minErr('$controller')('noscp',\n          \"Cannot export controller '{0}' as '{1}'! No $scope object provided via `locals`.\",\n          name, identifier);\n      }\n\n      locals.$scope[identifier] = instance;\n    }\n  }];\n}\n\n/**\n * @ngdoc service\n * @name $document\n * @requires $window\n *\n * @description\n * A {@link angular.element jQuery or jqLite} wrapper for the browser's `window.document` object.\n *\n * @example\n   <example module=\"documentExample\">\n     <file name=\"index.html\">\n       <div ng-controller=\"ExampleController\">\n         <p>$document title: <b ng-bind=\"title\"></b></p>\n         <p>window.document title: <b ng-bind=\"windowTitle\"></b></p>\n       </div>\n     </file>\n     <file name=\"script.js\">\n       angular.module('documentExample', [])\n         .controller('ExampleController', ['$scope', '$document', function($scope, $document) {\n           $scope.title = $document[0].title;\n           $scope.windowTitle = angular.element(window.document)[0].title;\n         }]);\n     </file>\n   </example>\n */\nfunction $DocumentProvider() {\n  this.$get = ['$window', function(window) {\n    return jqLite(window.document);\n  }];\n}\n\n/**\n * @ngdoc service\n * @name $exceptionHandler\n * @requires ng.$log\n *\n * @description\n * Any uncaught exception in angular expressions is delegated to this service.\n * The default implementation simply delegates to `$log.error` which logs it into\n * the browser console.\n *\n * In unit tests, if `angular-mocks.js` is loaded, this service is overridden by\n * {@link ngMock.$exceptionHandler mock $exceptionHandler} which aids in testing.\n *\n * ## Example:\n *\n * ```js\n *   angular.module('exceptionOverride', []).factory('$exceptionHandler', function() {\n *     return function(exception, cause) {\n *       exception.message += ' (caused by \"' + cause + '\")';\n *       throw exception;\n *     };\n *   });\n * ```\n *\n * This example will override the normal action of `$exceptionHandler`, to make angular\n * exceptions fail hard when they happen, instead of just logging to the console.\n *\n * <hr />\n * Note, that code executed in event-listeners (even those registered using jqLite's `on`/`bind`\n * methods) does not delegate exceptions to the {@link ng.$exceptionHandler $exceptionHandler}\n * (unless executed during a digest).\n *\n * If you wish, you can manually delegate exceptions, e.g.\n * `try { ... } catch(e) { $exceptionHandler(e); }`\n *\n * @param {Error} exception Exception associated with the error.\n * @param {string=} cause optional information about the context in which\n *       the error was thrown.\n *\n */\nfunction $ExceptionHandlerProvider() {\n  this.$get = ['$log', function($log) {\n    return function(exception, cause) {\n      $log.error.apply($log, arguments);\n    };\n  }];\n}\n\nvar $$ForceReflowProvider = function() {\n  this.$get = ['$document', function($document) {\n    return function(domNode) {\n      //the line below will force the browser to perform a repaint so\n      //that all the animated elements within the animation frame will\n      //be properly updated and drawn on screen. This is required to\n      //ensure that the preparation animation is properly flushed so that\n      //the active state picks up from there. DO NOT REMOVE THIS LINE.\n      //DO NOT OPTIMIZE THIS LINE. THE MINIFIER WILL REMOVE IT OTHERWISE WHICH\n      //WILL RESULT IN AN UNPREDICTABLE BUG THAT IS VERY HARD TO TRACK DOWN AND\n      //WILL TAKE YEARS AWAY FROM YOUR LIFE.\n      if (domNode) {\n        if (!domNode.nodeType && domNode instanceof jqLite) {\n          domNode = domNode[0];\n        }\n      } else {\n        domNode = $document[0].body;\n      }\n      return domNode.offsetWidth + 1;\n    };\n  }];\n};\n\nvar APPLICATION_JSON = 'application/json';\nvar CONTENT_TYPE_APPLICATION_JSON = {'Content-Type': APPLICATION_JSON + ';charset=utf-8'};\nvar JSON_START = /^\\[|^\\{(?!\\{)/;\nvar JSON_ENDS = {\n  '[': /]$/,\n  '{': /}$/\n};\nvar JSON_PROTECTION_PREFIX = /^\\)\\]\\}',?\\n/;\nvar $httpMinErr = minErr('$http');\nvar $httpMinErrLegacyFn = function(method) {\n  return function() {\n    throw $httpMinErr('legacy', 'The method `{0}` on the promise returned from `$http` has been disabled.', method);\n  };\n};\n\nfunction serializeValue(v) {\n  if (isObject(v)) {\n    return isDate(v) ? v.toISOString() : toJson(v);\n  }\n  return v;\n}\n\n\nfunction $HttpParamSerializerProvider() {\n  /**\n   * @ngdoc service\n   * @name $httpParamSerializer\n   * @description\n   *\n   * Default {@link $http `$http`} params serializer that converts objects to strings\n   * according to the following rules:\n   *\n   * * `{'foo': 'bar'}` results in `foo=bar`\n   * * `{'foo': Date.now()}` results in `foo=2015-04-01T09%3A50%3A49.262Z` (`toISOString()` and encoded representation of a Date object)\n   * * `{'foo': ['bar', 'baz']}` results in `foo=bar&foo=baz` (repeated key for each array element)\n   * * `{'foo': {'bar':'baz'}}` results in `foo=%7B%22bar%22%3A%22baz%22%7D\"` (stringified and encoded representation of an object)\n   *\n   * Note that serializer will sort the request parameters alphabetically.\n   * */\n\n  this.$get = function() {\n    return function ngParamSerializer(params) {\n      if (!params) return '';\n      var parts = [];\n      forEachSorted(params, function(value, key) {\n        if (value === null || isUndefined(value)) return;\n        if (isArray(value)) {\n          forEach(value, function(v) {\n            parts.push(encodeUriQuery(key)  + '=' + encodeUriQuery(serializeValue(v)));\n          });\n        } else {\n          parts.push(encodeUriQuery(key) + '=' + encodeUriQuery(serializeValue(value)));\n        }\n      });\n\n      return parts.join('&');\n    };\n  };\n}\n\nfunction $HttpParamSerializerJQLikeProvider() {\n  /**\n   * @ngdoc service\n   * @name $httpParamSerializerJQLike\n   * @description\n   *\n   * Alternative {@link $http `$http`} params serializer that follows\n   * jQuery's [`param()`](http://api.jquery.com/jquery.param/) method logic.\n   * The serializer will also sort the params alphabetically.\n   *\n   * To use it for serializing `$http` request parameters, set it as the `paramSerializer` property:\n   *\n   * ```js\n   * $http({\n   *   url: myUrl,\n   *   method: 'GET',\n   *   params: myParams,\n   *   paramSerializer: '$httpParamSerializerJQLike'\n   * });\n   * ```\n   *\n   * It is also possible to set it as the default `paramSerializer` in the\n   * {@link $httpProvider#defaults `$httpProvider`}.\n   *\n   * Additionally, you can inject the serializer and use it explicitly, for example to serialize\n   * form data for submission:\n   *\n   * ```js\n   * .controller(function($http, $httpParamSerializerJQLike) {\n   *   //...\n   *\n   *   $http({\n   *     url: myUrl,\n   *     method: 'POST',\n   *     data: $httpParamSerializerJQLike(myData),\n   *     headers: {\n   *       'Content-Type': 'application/x-www-form-urlencoded'\n   *     }\n   *   });\n   *\n   * });\n   * ```\n   *\n   * */\n  this.$get = function() {\n    return function jQueryLikeParamSerializer(params) {\n      if (!params) return '';\n      var parts = [];\n      serialize(params, '', true);\n      return parts.join('&');\n\n      function serialize(toSerialize, prefix, topLevel) {\n        if (toSerialize === null || isUndefined(toSerialize)) return;\n        if (isArray(toSerialize)) {\n          forEach(toSerialize, function(value, index) {\n            serialize(value, prefix + '[' + (isObject(value) ? index : '') + ']');\n          });\n        } else if (isObject(toSerialize) && !isDate(toSerialize)) {\n          forEachSorted(toSerialize, function(value, key) {\n            serialize(value, prefix +\n                (topLevel ? '' : '[') +\n                key +\n                (topLevel ? '' : ']'));\n          });\n        } else {\n          parts.push(encodeUriQuery(prefix) + '=' + encodeUriQuery(serializeValue(toSerialize)));\n        }\n      }\n    };\n  };\n}\n\nfunction defaultHttpResponseTransform(data, headers) {\n  if (isString(data)) {\n    // Strip json vulnerability protection prefix and trim whitespace\n    var tempData = data.replace(JSON_PROTECTION_PREFIX, '').trim();\n\n    if (tempData) {\n      var contentType = headers('Content-Type');\n      if ((contentType && (contentType.indexOf(APPLICATION_JSON) === 0)) || isJsonLike(tempData)) {\n        data = fromJson(tempData);\n      }\n    }\n  }\n\n  return data;\n}\n\nfunction isJsonLike(str) {\n    var jsonStart = str.match(JSON_START);\n    return jsonStart && JSON_ENDS[jsonStart[0]].test(str);\n}\n\n/**\n * Parse headers into key value object\n *\n * @param {string} headers Raw headers as a string\n * @returns {Object} Parsed headers as key value object\n */\nfunction parseHeaders(headers) {\n  var parsed = createMap(), i;\n\n  function fillInParsed(key, val) {\n    if (key) {\n      parsed[key] = parsed[key] ? parsed[key] + ', ' + val : val;\n    }\n  }\n\n  if (isString(headers)) {\n    forEach(headers.split('\\n'), function(line) {\n      i = line.indexOf(':');\n      fillInParsed(lowercase(trim(line.substr(0, i))), trim(line.substr(i + 1)));\n    });\n  } else if (isObject(headers)) {\n    forEach(headers, function(headerVal, headerKey) {\n      fillInParsed(lowercase(headerKey), trim(headerVal));\n    });\n  }\n\n  return parsed;\n}\n\n\n/**\n * Returns a function that provides access to parsed headers.\n *\n * Headers are lazy parsed when first requested.\n * @see parseHeaders\n *\n * @param {(string|Object)} headers Headers to provide access to.\n * @returns {function(string=)} Returns a getter function which if called with:\n *\n *   - if called with single an argument returns a single header value or null\n *   - if called with no arguments returns an object containing all headers.\n */\nfunction headersGetter(headers) {\n  var headersObj;\n\n  return function(name) {\n    if (!headersObj) headersObj =  parseHeaders(headers);\n\n    if (name) {\n      var value = headersObj[lowercase(name)];\n      if (value === void 0) {\n        value = null;\n      }\n      return value;\n    }\n\n    return headersObj;\n  };\n}\n\n\n/**\n * Chain all given functions\n *\n * This function is used for both request and response transforming\n *\n * @param {*} data Data to transform.\n * @param {function(string=)} headers HTTP headers getter fn.\n * @param {number} status HTTP status code of the response.\n * @param {(Function|Array.<Function>)} fns Function or an array of functions.\n * @returns {*} Transformed data.\n */\nfunction transformData(data, headers, status, fns) {\n  if (isFunction(fns)) {\n    return fns(data, headers, status);\n  }\n\n  forEach(fns, function(fn) {\n    data = fn(data, headers, status);\n  });\n\n  return data;\n}\n\n\nfunction isSuccess(status) {\n  return 200 <= status && status < 300;\n}\n\n\n/**\n * @ngdoc provider\n * @name $httpProvider\n * @description\n * Use `$httpProvider` to change the default behavior of the {@link ng.$http $http} service.\n * */\nfunction $HttpProvider() {\n  /**\n   * @ngdoc property\n   * @name $httpProvider#defaults\n   * @description\n   *\n   * Object containing default values for all {@link ng.$http $http} requests.\n   *\n   * - **`defaults.cache`** - {boolean|Object} - A boolean value or object created with\n   * {@link ng.$cacheFactory `$cacheFactory`} to enable or disable caching of HTTP responses\n   * by default. See {@link $http#caching $http Caching} for more information.\n   *\n   * - **`defaults.xsrfCookieName`** - {string} - Name of cookie containing the XSRF token.\n   * Defaults value is `'XSRF-TOKEN'`.\n   *\n   * - **`defaults.xsrfHeaderName`** - {string} - Name of HTTP header to populate with the\n   * XSRF token. Defaults value is `'X-XSRF-TOKEN'`.\n   *\n   * - **`defaults.headers`** - {Object} - Default headers for all $http requests.\n   * Refer to {@link ng.$http#setting-http-headers $http} for documentation on\n   * setting default headers.\n   *     - **`defaults.headers.common`**\n   *     - **`defaults.headers.post`**\n   *     - **`defaults.headers.put`**\n   *     - **`defaults.headers.patch`**\n   *\n   *\n   * - **`defaults.paramSerializer`** - `{string|function(Object<string,string>):string}` - A function\n   *  used to the prepare string representation of request parameters (specified as an object).\n   *  If specified as string, it is interpreted as a function registered with the {@link auto.$injector $injector}.\n   *  Defaults to {@link ng.$httpParamSerializer $httpParamSerializer}.\n   *\n   **/\n  var defaults = this.defaults = {\n    // transform incoming response data\n    transformResponse: [defaultHttpResponseTransform],\n\n    // transform outgoing request data\n    transformRequest: [function(d) {\n      return isObject(d) && !isFile(d) && !isBlob(d) && !isFormData(d) ? toJson(d) : d;\n    }],\n\n    // default headers\n    headers: {\n      common: {\n        'Accept': 'application/json, text/plain, */*'\n      },\n      post:   shallowCopy(CONTENT_TYPE_APPLICATION_JSON),\n      put:    shallowCopy(CONTENT_TYPE_APPLICATION_JSON),\n      patch:  shallowCopy(CONTENT_TYPE_APPLICATION_JSON)\n    },\n\n    xsrfCookieName: 'XSRF-TOKEN',\n    xsrfHeaderName: 'X-XSRF-TOKEN',\n\n    paramSerializer: '$httpParamSerializer'\n  };\n\n  var useApplyAsync = false;\n  /**\n   * @ngdoc method\n   * @name $httpProvider#useApplyAsync\n   * @description\n   *\n   * Configure $http service to combine processing of multiple http responses received at around\n   * the same time via {@link ng.$rootScope.Scope#$applyAsync $rootScope.$applyAsync}. This can result in\n   * significant performance improvement for bigger applications that make many HTTP requests\n   * concurrently (common during application bootstrap).\n   *\n   * Defaults to false. If no value is specified, returns the current configured value.\n   *\n   * @param {boolean=} value If true, when requests are loaded, they will schedule a deferred\n   *    \"apply\" on the next tick, giving time for subsequent requests in a roughly ~10ms window\n   *    to load and share the same digest cycle.\n   *\n   * @returns {boolean|Object} If a value is specified, returns the $httpProvider for chaining.\n   *    otherwise, returns the current configured value.\n   **/\n  this.useApplyAsync = function(value) {\n    if (isDefined(value)) {\n      useApplyAsync = !!value;\n      return this;\n    }\n    return useApplyAsync;\n  };\n\n  var useLegacyPromise = true;\n  /**\n   * @ngdoc method\n   * @name $httpProvider#useLegacyPromiseExtensions\n   * @description\n   *\n   * Configure `$http` service to return promises without the shorthand methods `success` and `error`.\n   * This should be used to make sure that applications work without these methods.\n   *\n   * Defaults to true. If no value is specified, returns the current configured value.\n   *\n   * @param {boolean=} value If true, `$http` will return a promise with the deprecated legacy `success` and `error` methods.\n   *\n   * @returns {boolean|Object} If a value is specified, returns the $httpProvider for chaining.\n   *    otherwise, returns the current configured value.\n   **/\n  this.useLegacyPromiseExtensions = function(value) {\n    if (isDefined(value)) {\n      useLegacyPromise = !!value;\n      return this;\n    }\n    return useLegacyPromise;\n  };\n\n  /**\n   * @ngdoc property\n   * @name $httpProvider#interceptors\n   * @description\n   *\n   * Array containing service factories for all synchronous or asynchronous {@link ng.$http $http}\n   * pre-processing of request or postprocessing of responses.\n   *\n   * These service factories are ordered by request, i.e. they are applied in the same order as the\n   * array, on request, but reverse order, on response.\n   *\n   * {@link ng.$http#interceptors Interceptors detailed info}\n   **/\n  var interceptorFactories = this.interceptors = [];\n\n  this.$get = ['$httpBackend', '$$cookieReader', '$cacheFactory', '$rootScope', '$q', '$injector',\n      function($httpBackend, $$cookieReader, $cacheFactory, $rootScope, $q, $injector) {\n\n    var defaultCache = $cacheFactory('$http');\n\n    /**\n     * Make sure that default param serializer is exposed as a function\n     */\n    defaults.paramSerializer = isString(defaults.paramSerializer) ?\n      $injector.get(defaults.paramSerializer) : defaults.paramSerializer;\n\n    /**\n     * Interceptors stored in reverse order. Inner interceptors before outer interceptors.\n     * The reversal is needed so that we can build up the interception chain around the\n     * server request.\n     */\n    var reversedInterceptors = [];\n\n    forEach(interceptorFactories, function(interceptorFactory) {\n      reversedInterceptors.unshift(isString(interceptorFactory)\n          ? $injector.get(interceptorFactory) : $injector.invoke(interceptorFactory));\n    });\n\n    /**\n     * @ngdoc service\n     * @kind function\n     * @name $http\n     * @requires ng.$httpBackend\n     * @requires $cacheFactory\n     * @requires $rootScope\n     * @requires $q\n     * @requires $injector\n     *\n     * @description\n     * The `$http` service is a core Angular service that facilitates communication with the remote\n     * HTTP servers via the browser's [XMLHttpRequest](https://developer.mozilla.org/en/xmlhttprequest)\n     * object or via [JSONP](http://en.wikipedia.org/wiki/JSONP).\n     *\n     * For unit testing applications that use `$http` service, see\n     * {@link ngMock.$httpBackend $httpBackend mock}.\n     *\n     * For a higher level of abstraction, please check out the {@link ngResource.$resource\n     * $resource} service.\n     *\n     * The $http API is based on the {@link ng.$q deferred/promise APIs} exposed by\n     * the $q service. While for simple usage patterns this doesn't matter much, for advanced usage\n     * it is important to familiarize yourself with these APIs and the guarantees they provide.\n     *\n     *\n     * ## General usage\n     * The `$http` service is a function which takes a single argument — a {@link $http#usage configuration object} —\n     * that is used to generate an HTTP request and returns  a {@link ng.$q promise}.\n     *\n     * ```js\n     *   // Simple GET request example:\n     *   $http({\n     *     method: 'GET',\n     *     url: '/someUrl'\n     *   }).then(function successCallback(response) {\n     *       // this callback will be called asynchronously\n     *       // when the response is available\n     *     }, function errorCallback(response) {\n     *       // called asynchronously if an error occurs\n     *       // or server returns response with an error status.\n     *     });\n     * ```\n     *\n     * The response object has these properties:\n     *\n     *   - **data** – `{string|Object}` – The response body transformed with the transform\n     *     functions.\n     *   - **status** – `{number}` – HTTP status code of the response.\n     *   - **headers** – `{function([headerName])}` – Header getter function.\n     *   - **config** – `{Object}` – The configuration object that was used to generate the request.\n     *   - **statusText** – `{string}` – HTTP status text of the response.\n     *\n     * A response status code between 200 and 299 is considered a success status and\n     * will result in the success callback being called. Note that if the response is a redirect,\n     * XMLHttpRequest will transparently follow it, meaning that the error callback will not be\n     * called for such responses.\n     *\n     *\n     * ## Shortcut methods\n     *\n     * Shortcut methods are also available. All shortcut methods require passing in the URL, and\n     * request data must be passed in for POST/PUT requests. An optional config can be passed as the\n     * last argument.\n     *\n     * ```js\n     *   $http.get('/someUrl', config).then(successCallback, errorCallback);\n     *   $http.post('/someUrl', data, config).then(successCallback, errorCallback);\n     * ```\n     *\n     * Complete list of shortcut methods:\n     *\n     * - {@link ng.$http#get $http.get}\n     * - {@link ng.$http#head $http.head}\n     * - {@link ng.$http#post $http.post}\n     * - {@link ng.$http#put $http.put}\n     * - {@link ng.$http#delete $http.delete}\n     * - {@link ng.$http#jsonp $http.jsonp}\n     * - {@link ng.$http#patch $http.patch}\n     *\n     *\n     * ## Writing Unit Tests that use $http\n     * When unit testing (using {@link ngMock ngMock}), it is necessary to call\n     * {@link ngMock.$httpBackend#flush $httpBackend.flush()} to flush each pending\n     * request using trained responses.\n     *\n     * ```\n     * $httpBackend.expectGET(...);\n     * $http.get(...);\n     * $httpBackend.flush();\n     * ```\n     *\n     * ## Deprecation Notice\n     * <div class=\"alert alert-danger\">\n     *   The `$http` legacy promise methods `success` and `error` have been deprecated.\n     *   Use the standard `then` method instead.\n     *   If {@link $httpProvider#useLegacyPromiseExtensions `$httpProvider.useLegacyPromiseExtensions`} is set to\n     *   `false` then these methods will throw {@link $http:legacy `$http/legacy`} error.\n     * </div>\n     *\n     * ## Setting HTTP Headers\n     *\n     * The $http service will automatically add certain HTTP headers to all requests. These defaults\n     * can be fully configured by accessing the `$httpProvider.defaults.headers` configuration\n     * object, which currently contains this default configuration:\n     *\n     * - `$httpProvider.defaults.headers.common` (headers that are common for all requests):\n     *   - `Accept: application/json, text/plain, * / *`\n     * - `$httpProvider.defaults.headers.post`: (header defaults for POST requests)\n     *   - `Content-Type: application/json`\n     * - `$httpProvider.defaults.headers.put` (header defaults for PUT requests)\n     *   - `Content-Type: application/json`\n     *\n     * To add or overwrite these defaults, simply add or remove a property from these configuration\n     * objects. To add headers for an HTTP method other than POST or PUT, simply add a new object\n     * with the lowercased HTTP method name as the key, e.g.\n     * `$httpProvider.defaults.headers.get = { 'My-Header' : 'value' }`.\n     *\n     * The defaults can also be set at runtime via the `$http.defaults` object in the same\n     * fashion. For example:\n     *\n     * ```\n     * module.run(function($http) {\n     *   $http.defaults.headers.common.Authorization = 'Basic YmVlcDpib29w';\n     * });\n     * ```\n     *\n     * In addition, you can supply a `headers` property in the config object passed when\n     * calling `$http(config)`, which overrides the defaults without changing them globally.\n     *\n     * To explicitly remove a header automatically added via $httpProvider.defaults.headers on a per request basis,\n     * Use the `headers` property, setting the desired header to `undefined`. For example:\n     *\n     * ```js\n     * var req = {\n     *  method: 'POST',\n     *  url: 'http://example.com',\n     *  headers: {\n     *    'Content-Type': undefined\n     *  },\n     *  data: { test: 'test' }\n     * }\n     *\n     * $http(req).then(function(){...}, function(){...});\n     * ```\n     *\n     * ## Transforming Requests and Responses\n     *\n     * Both requests and responses can be transformed using transformation functions: `transformRequest`\n     * and `transformResponse`. These properties can be a single function that returns\n     * the transformed value (`function(data, headersGetter, status)`) or an array of such transformation functions,\n     * which allows you to `push` or `unshift` a new transformation function into the transformation chain.\n     *\n     * <div class=\"alert alert-warning\">\n     * **Note:** Angular does not make a copy of the `data` parameter before it is passed into the `transformRequest` pipeline.\n     * That means changes to the properties of `data` are not local to the transform function (since Javascript passes objects by reference).\n     * For example, when calling `$http.get(url, $scope.myObject)`, modifications to the object's properties in a transformRequest\n     * function will be reflected on the scope and in any templates where the object is data-bound.\n     * To prevent this, transform functions should have no side-effects.\n     * If you need to modify properties, it is recommended to make a copy of the data, or create new object to return.\n     * </div>\n     *\n     * ### Default Transformations\n     *\n     * The `$httpProvider` provider and `$http` service expose `defaults.transformRequest` and\n     * `defaults.transformResponse` properties. If a request does not provide its own transformations\n     * then these will be applied.\n     *\n     * You can augment or replace the default transformations by modifying these properties by adding to or\n     * replacing the array.\n     *\n     * Angular provides the following default transformations:\n     *\n     * Request transformations (`$httpProvider.defaults.transformRequest` and `$http.defaults.transformRequest`):\n     *\n     * - If the `data` property of the request configuration object contains an object, serialize it\n     *   into JSON format.\n     *\n     * Response transformations (`$httpProvider.defaults.transformResponse` and `$http.defaults.transformResponse`):\n     *\n     *  - If XSRF prefix is detected, strip it (see Security Considerations section below).\n     *  - If JSON response is detected, deserialize it using a JSON parser.\n     *\n     *\n     * ### Overriding the Default Transformations Per Request\n     *\n     * If you wish override the request/response transformations only for a single request then provide\n     * `transformRequest` and/or `transformResponse` properties on the configuration object passed\n     * into `$http`.\n     *\n     * Note that if you provide these properties on the config object the default transformations will be\n     * overwritten. If you wish to augment the default transformations then you must include them in your\n     * local transformation array.\n     *\n     * The following code demonstrates adding a new response transformation to be run after the default response\n     * transformations have been run.\n     *\n     * ```js\n     * function appendTransform(defaults, transform) {\n     *\n     *   // We can't guarantee that the default transformation is an array\n     *   defaults = angular.isArray(defaults) ? defaults : [defaults];\n     *\n     *   // Append the new transformation to the defaults\n     *   return defaults.concat(transform);\n     * }\n     *\n     * $http({\n     *   url: '...',\n     *   method: 'GET',\n     *   transformResponse: appendTransform($http.defaults.transformResponse, function(value) {\n     *     return doTransform(value);\n     *   })\n     * });\n     * ```\n     *\n     *\n     * ## Caching\n     *\n     * {@link ng.$http `$http`} responses are not cached by default. To enable caching, you must\n     * set the config.cache value or the default cache value to TRUE or to a cache object (created\n     * with {@link ng.$cacheFactory `$cacheFactory`}). If defined, the value of config.cache takes\n     * precedence over the default cache value.\n     *\n     * In order to:\n     *   * cache all responses - set the default cache value to TRUE or to a cache object\n     *   * cache a specific response - set config.cache value to TRUE or to a cache object\n     *\n     * If caching is enabled, but neither the default cache nor config.cache are set to a cache object,\n     * then the default `$cacheFactory($http)` object is used.\n     *\n     * The default cache value can be set by updating the\n     * {@link ng.$http#defaults `$http.defaults.cache`} property or the\n     * {@link $httpProvider#defaults `$httpProvider.defaults.cache`} property.\n     *\n     * When caching is enabled, {@link ng.$http `$http`} stores the response from the server using\n     * the relevant cache object. The next time the same request is made, the response is returned\n     * from the cache without sending a request to the server.\n     *\n     * Take note that:\n     *\n     *   * Only GET and JSONP requests are cached.\n     *   * The cache key is the request URL including search parameters; headers are not considered.\n     *   * Cached responses are returned asynchronously, in the same way as responses from the server.\n     *   * If multiple identical requests are made using the same cache, which is not yet populated,\n     *     one request will be made to the server and remaining requests will return the same response.\n     *   * A cache-control header on the response does not affect if or how responses are cached.\n     *\n     *\n     * ## Interceptors\n     *\n     * Before you start creating interceptors, be sure to understand the\n     * {@link ng.$q $q and deferred/promise APIs}.\n     *\n     * For purposes of global error handling, authentication, or any kind of synchronous or\n     * asynchronous pre-processing of request or postprocessing of responses, it is desirable to be\n     * able to intercept requests before they are handed to the server and\n     * responses before they are handed over to the application code that\n     * initiated these requests. The interceptors leverage the {@link ng.$q\n     * promise APIs} to fulfill this need for both synchronous and asynchronous pre-processing.\n     *\n     * The interceptors are service factories that are registered with the `$httpProvider` by\n     * adding them to the `$httpProvider.interceptors` array. The factory is called and\n     * injected with dependencies (if specified) and returns the interceptor.\n     *\n     * There are two kinds of interceptors (and two kinds of rejection interceptors):\n     *\n     *   * `request`: interceptors get called with a http {@link $http#usage config} object. The function is free to\n     *     modify the `config` object or create a new one. The function needs to return the `config`\n     *     object directly, or a promise containing the `config` or a new `config` object.\n     *   * `requestError`: interceptor gets called when a previous interceptor threw an error or\n     *     resolved with a rejection.\n     *   * `response`: interceptors get called with http `response` object. The function is free to\n     *     modify the `response` object or create a new one. The function needs to return the `response`\n     *     object directly, or as a promise containing the `response` or a new `response` object.\n     *   * `responseError`: interceptor gets called when a previous interceptor threw an error or\n     *     resolved with a rejection.\n     *\n     *\n     * ```js\n     *   // register the interceptor as a service\n     *   $provide.factory('myHttpInterceptor', function($q, dependency1, dependency2) {\n     *     return {\n     *       // optional method\n     *       'request': function(config) {\n     *         // do something on success\n     *         return config;\n     *       },\n     *\n     *       // optional method\n     *      'requestError': function(rejection) {\n     *         // do something on error\n     *         if (canRecover(rejection)) {\n     *           return responseOrNewPromise\n     *         }\n     *         return $q.reject(rejection);\n     *       },\n     *\n     *\n     *\n     *       // optional method\n     *       'response': function(response) {\n     *         // do something on success\n     *         return response;\n     *       },\n     *\n     *       // optional method\n     *      'responseError': function(rejection) {\n     *         // do something on error\n     *         if (canRecover(rejection)) {\n     *           return responseOrNewPromise\n     *         }\n     *         return $q.reject(rejection);\n     *       }\n     *     };\n     *   });\n     *\n     *   $httpProvider.interceptors.push('myHttpInterceptor');\n     *\n     *\n     *   // alternatively, register the interceptor via an anonymous factory\n     *   $httpProvider.interceptors.push(function($q, dependency1, dependency2) {\n     *     return {\n     *      'request': function(config) {\n     *          // same as above\n     *       },\n     *\n     *       'response': function(response) {\n     *          // same as above\n     *       }\n     *     };\n     *   });\n     * ```\n     *\n     * ## Security Considerations\n     *\n     * When designing web applications, consider security threats from:\n     *\n     * - [JSON vulnerability](http://haacked.com/archive/2008/11/20/anatomy-of-a-subtle-json-vulnerability.aspx)\n     * - [XSRF](http://en.wikipedia.org/wiki/Cross-site_request_forgery)\n     *\n     * Both server and the client must cooperate in order to eliminate these threats. Angular comes\n     * pre-configured with strategies that address these issues, but for this to work backend server\n     * cooperation is required.\n     *\n     * ### JSON Vulnerability Protection\n     *\n     * A [JSON vulnerability](http://haacked.com/archive/2008/11/20/anatomy-of-a-subtle-json-vulnerability.aspx)\n     * allows third party website to turn your JSON resource URL into\n     * [JSONP](http://en.wikipedia.org/wiki/JSONP) request under some conditions. To\n     * counter this your server can prefix all JSON requests with following string `\")]}',\\n\"`.\n     * Angular will automatically strip the prefix before processing it as JSON.\n     *\n     * For example if your server needs to return:\n     * ```js\n     * ['one','two']\n     * ```\n     *\n     * which is vulnerable to attack, your server can return:\n     * ```js\n     * )]}',\n     * ['one','two']\n     * ```\n     *\n     * Angular will strip the prefix, before processing the JSON.\n     *\n     *\n     * ### Cross Site Request Forgery (XSRF) Protection\n     *\n     * [XSRF](http://en.wikipedia.org/wiki/Cross-site_request_forgery) is an attack technique by\n     * which the attacker can trick an authenticated user into unknowingly executing actions on your\n     * website. Angular provides a mechanism to counter XSRF. When performing XHR requests, the\n     * $http service reads a token from a cookie (by default, `XSRF-TOKEN`) and sets it as an HTTP\n     * header (`X-XSRF-TOKEN`). Since only JavaScript that runs on your domain could read the\n     * cookie, your server can be assured that the XHR came from JavaScript running on your domain.\n     * The header will not be set for cross-domain requests.\n     *\n     * To take advantage of this, your server needs to set a token in a JavaScript readable session\n     * cookie called `XSRF-TOKEN` on the first HTTP GET request. On subsequent XHR requests the\n     * server can verify that the cookie matches `X-XSRF-TOKEN` HTTP header, and therefore be sure\n     * that only JavaScript running on your domain could have sent the request. The token must be\n     * unique for each user and must be verifiable by the server (to prevent the JavaScript from\n     * making up its own tokens). We recommend that the token is a digest of your site's\n     * authentication cookie with a [salt](https://en.wikipedia.org/wiki/Salt_(cryptography&#41;)\n     * for added security.\n     *\n     * The name of the headers can be specified using the xsrfHeaderName and xsrfCookieName\n     * properties of either $httpProvider.defaults at config-time, $http.defaults at run-time,\n     * or the per-request config object.\n     *\n     * In order to prevent collisions in environments where multiple Angular apps share the\n     * same domain or subdomain, we recommend that each application uses unique cookie name.\n     *\n     * @param {object} config Object describing the request to be made and how it should be\n     *    processed. The object has following properties:\n     *\n     *    - **method** – `{string}` – HTTP method (e.g. 'GET', 'POST', etc)\n     *    - **url** – `{string}` – Absolute or relative URL of the resource that is being requested.\n     *    - **params** – `{Object.<string|Object>}` – Map of strings or objects which will be serialized\n     *      with the `paramSerializer` and appended as GET parameters.\n     *    - **data** – `{string|Object}` – Data to be sent as the request message data.\n     *    - **headers** – `{Object}` – Map of strings or functions which return strings representing\n     *      HTTP headers to send to the server. If the return value of a function is null, the\n     *      header will not be sent. Functions accept a config object as an argument.\n     *    - **eventHandlers** - `{Object}` - Event listeners to be bound to the XMLHttpRequest object.\n     *      To bind events to the XMLHttpRequest upload object, use `uploadEventHandlers`.\n     *      The handler will be called in the context of a `$apply` block.\n     *    - **uploadEventHandlers** - `{Object}` - Event listeners to be bound to the XMLHttpRequest upload\n     *      object. To bind events to the XMLHttpRequest object, use `eventHandlers`.\n     *      The handler will be called in the context of a `$apply` block.\n     *    - **xsrfHeaderName** – `{string}` – Name of HTTP header to populate with the XSRF token.\n     *    - **xsrfCookieName** – `{string}` – Name of cookie containing the XSRF token.\n     *    - **transformRequest** –\n     *      `{function(data, headersGetter)|Array.<function(data, headersGetter)>}` –\n     *      transform function or an array of such functions. The transform function takes the http\n     *      request body and headers and returns its transformed (typically serialized) version.\n     *      See {@link ng.$http#overriding-the-default-transformations-per-request\n     *      Overriding the Default Transformations}\n     *    - **transformResponse** –\n     *      `{function(data, headersGetter, status)|Array.<function(data, headersGetter, status)>}` –\n     *      transform function or an array of such functions. The transform function takes the http\n     *      response body, headers and status and returns its transformed (typically deserialized) version.\n     *      See {@link ng.$http#overriding-the-default-transformations-per-request\n     *      Overriding the Default Transformations}\n     *    - **paramSerializer** - `{string|function(Object<string,string>):string}` - A function used to\n     *      prepare the string representation of request parameters (specified as an object).\n     *      If specified as string, it is interpreted as function registered with the\n     *      {@link $injector $injector}, which means you can create your own serializer\n     *      by registering it as a {@link auto.$provide#service service}.\n     *      The default serializer is the {@link $httpParamSerializer $httpParamSerializer};\n     *      alternatively, you can use the {@link $httpParamSerializerJQLike $httpParamSerializerJQLike}\n     *    - **cache** – `{boolean|Object}` – A boolean value or object created with\n     *      {@link ng.$cacheFactory `$cacheFactory`} to enable or disable caching of the HTTP response.\n     *      See {@link $http#caching $http Caching} for more information.\n     *    - **timeout** – `{number|Promise}` – timeout in milliseconds, or {@link ng.$q promise}\n     *      that should abort the request when resolved.\n     *    - **withCredentials** - `{boolean}` - whether to set the `withCredentials` flag on the\n     *      XHR object. See [requests with credentials](https://developer.mozilla.org/docs/Web/HTTP/Access_control_CORS#Requests_with_credentials)\n     *      for more information.\n     *    - **responseType** - `{string}` - see\n     *      [XMLHttpRequest.responseType](https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest#xmlhttprequest-responsetype).\n     *\n     * @returns {HttpPromise} Returns a {@link ng.$q `Promise}` that will be resolved to a response object\n     *                        when the request succeeds or fails.\n     *\n     *\n     * @property {Array.<Object>} pendingRequests Array of config objects for currently pending\n     *   requests. This is primarily meant to be used for debugging purposes.\n     *\n     *\n     * @example\n<example module=\"httpExample\">\n<file name=\"index.html\">\n  <div ng-controller=\"FetchController\">\n    <select ng-model=\"method\" aria-label=\"Request method\">\n      <option>GET</option>\n      <option>JSONP</option>\n    </select>\n    <input type=\"text\" ng-model=\"url\" size=\"80\" aria-label=\"URL\" />\n    <button id=\"fetchbtn\" ng-click=\"fetch()\">fetch</button><br>\n    <button id=\"samplegetbtn\" ng-click=\"updateModel('GET', 'http-hello.html')\">Sample GET</button>\n    <button id=\"samplejsonpbtn\"\n      ng-click=\"updateModel('JSONP',\n                    'https://angularjs.org/greet.php?callback=JSON_CALLBACK&name=Super%20Hero')\">\n      Sample JSONP\n    </button>\n    <button id=\"invalidjsonpbtn\"\n      ng-click=\"updateModel('JSONP', 'https://angularjs.org/doesntexist&callback=JSON_CALLBACK')\">\n        Invalid JSONP\n      </button>\n    <pre>http status code: {{status}}</pre>\n    <pre>http response data: {{data}}</pre>\n  </div>\n</file>\n<file name=\"script.js\">\n  angular.module('httpExample', [])\n    .controller('FetchController', ['$scope', '$http', '$templateCache',\n      function($scope, $http, $templateCache) {\n        $scope.method = 'GET';\n        $scope.url = 'http-hello.html';\n\n        $scope.fetch = function() {\n          $scope.code = null;\n          $scope.response = null;\n\n          $http({method: $scope.method, url: $scope.url, cache: $templateCache}).\n            then(function(response) {\n              $scope.status = response.status;\n              $scope.data = response.data;\n            }, function(response) {\n              $scope.data = response.data || \"Request failed\";\n              $scope.status = response.status;\n          });\n        };\n\n        $scope.updateModel = function(method, url) {\n          $scope.method = method;\n          $scope.url = url;\n        };\n      }]);\n</file>\n<file name=\"http-hello.html\">\n  Hello, $http!\n</file>\n<file name=\"protractor.js\" type=\"protractor\">\n  var status = element(by.binding('status'));\n  var data = element(by.binding('data'));\n  var fetchBtn = element(by.id('fetchbtn'));\n  var sampleGetBtn = element(by.id('samplegetbtn'));\n  var sampleJsonpBtn = element(by.id('samplejsonpbtn'));\n  var invalidJsonpBtn = element(by.id('invalidjsonpbtn'));\n\n  it('should make an xhr GET request', function() {\n    sampleGetBtn.click();\n    fetchBtn.click();\n    expect(status.getText()).toMatch('200');\n    expect(data.getText()).toMatch(/Hello, \\$http!/);\n  });\n\n// Commented out due to flakes. See https://github.com/angular/angular.js/issues/9185\n// it('should make a JSONP request to angularjs.org', function() {\n//   sampleJsonpBtn.click();\n//   fetchBtn.click();\n//   expect(status.getText()).toMatch('200');\n//   expect(data.getText()).toMatch(/Super Hero!/);\n// });\n\n  it('should make JSONP request to invalid URL and invoke the error handler',\n      function() {\n    invalidJsonpBtn.click();\n    fetchBtn.click();\n    expect(status.getText()).toMatch('0');\n    expect(data.getText()).toMatch('Request failed');\n  });\n</file>\n</example>\n     */\n    function $http(requestConfig) {\n\n      if (!isObject(requestConfig)) {\n        throw minErr('$http')('badreq', 'Http request configuration must be an object.  Received: {0}', requestConfig);\n      }\n\n      if (!isString(requestConfig.url)) {\n        throw minErr('$http')('badreq', 'Http request configuration url must be a string.  Received: {0}', requestConfig.url);\n      }\n\n      var config = extend({\n        method: 'get',\n        transformRequest: defaults.transformRequest,\n        transformResponse: defaults.transformResponse,\n        paramSerializer: defaults.paramSerializer\n      }, requestConfig);\n\n      config.headers = mergeHeaders(requestConfig);\n      config.method = uppercase(config.method);\n      config.paramSerializer = isString(config.paramSerializer) ?\n        $injector.get(config.paramSerializer) : config.paramSerializer;\n\n      var serverRequest = function(config) {\n        var headers = config.headers;\n        var reqData = transformData(config.data, headersGetter(headers), undefined, config.transformRequest);\n\n        // strip content-type if data is undefined\n        if (isUndefined(reqData)) {\n          forEach(headers, function(value, header) {\n            if (lowercase(header) === 'content-type') {\n                delete headers[header];\n            }\n          });\n        }\n\n        if (isUndefined(config.withCredentials) && !isUndefined(defaults.withCredentials)) {\n          config.withCredentials = defaults.withCredentials;\n        }\n\n        // send request\n        return sendReq(config, reqData).then(transformResponse, transformResponse);\n      };\n\n      var chain = [serverRequest, undefined];\n      var promise = $q.when(config);\n\n      // apply interceptors\n      forEach(reversedInterceptors, function(interceptor) {\n        if (interceptor.request || interceptor.requestError) {\n          chain.unshift(interceptor.request, interceptor.requestError);\n        }\n        if (interceptor.response || interceptor.responseError) {\n          chain.push(interceptor.response, interceptor.responseError);\n        }\n      });\n\n      while (chain.length) {\n        var thenFn = chain.shift();\n        var rejectFn = chain.shift();\n\n        promise = promise.then(thenFn, rejectFn);\n      }\n\n      if (useLegacyPromise) {\n        promise.success = function(fn) {\n          assertArgFn(fn, 'fn');\n\n          promise.then(function(response) {\n            fn(response.data, response.status, response.headers, config);\n          });\n          return promise;\n        };\n\n        promise.error = function(fn) {\n          assertArgFn(fn, 'fn');\n\n          promise.then(null, function(response) {\n            fn(response.data, response.status, response.headers, config);\n          });\n          return promise;\n        };\n      } else {\n        promise.success = $httpMinErrLegacyFn('success');\n        promise.error = $httpMinErrLegacyFn('error');\n      }\n\n      return promise;\n\n      function transformResponse(response) {\n        // make a copy since the response must be cacheable\n        var resp = extend({}, response);\n        resp.data = transformData(response.data, response.headers, response.status,\n                                  config.transformResponse);\n        return (isSuccess(response.status))\n          ? resp\n          : $q.reject(resp);\n      }\n\n      function executeHeaderFns(headers, config) {\n        var headerContent, processedHeaders = {};\n\n        forEach(headers, function(headerFn, header) {\n          if (isFunction(headerFn)) {\n            headerContent = headerFn(config);\n            if (headerContent != null) {\n              processedHeaders[header] = headerContent;\n            }\n          } else {\n            processedHeaders[header] = headerFn;\n          }\n        });\n\n        return processedHeaders;\n      }\n\n      function mergeHeaders(config) {\n        var defHeaders = defaults.headers,\n            reqHeaders = extend({}, config.headers),\n            defHeaderName, lowercaseDefHeaderName, reqHeaderName;\n\n        defHeaders = extend({}, defHeaders.common, defHeaders[lowercase(config.method)]);\n\n        // using for-in instead of forEach to avoid unnecessary iteration after header has been found\n        defaultHeadersIteration:\n        for (defHeaderName in defHeaders) {\n          lowercaseDefHeaderName = lowercase(defHeaderName);\n\n          for (reqHeaderName in reqHeaders) {\n            if (lowercase(reqHeaderName) === lowercaseDefHeaderName) {\n              continue defaultHeadersIteration;\n            }\n          }\n\n          reqHeaders[defHeaderName] = defHeaders[defHeaderName];\n        }\n\n        // execute if header value is a function for merged headers\n        return executeHeaderFns(reqHeaders, shallowCopy(config));\n      }\n    }\n\n    $http.pendingRequests = [];\n\n    /**\n     * @ngdoc method\n     * @name $http#get\n     *\n     * @description\n     * Shortcut method to perform `GET` request.\n     *\n     * @param {string} url Relative or absolute URL specifying the destination of the request\n     * @param {Object=} config Optional configuration object\n     * @returns {HttpPromise} Future object\n     */\n\n    /**\n     * @ngdoc method\n     * @name $http#delete\n     *\n     * @description\n     * Shortcut method to perform `DELETE` request.\n     *\n     * @param {string} url Relative or absolute URL specifying the destination of the request\n     * @param {Object=} config Optional configuration object\n     * @returns {HttpPromise} Future object\n     */\n\n    /**\n     * @ngdoc method\n     * @name $http#head\n     *\n     * @description\n     * Shortcut method to perform `HEAD` request.\n     *\n     * @param {string} url Relative or absolute URL specifying the destination of the request\n     * @param {Object=} config Optional configuration object\n     * @returns {HttpPromise} Future object\n     */\n\n    /**\n     * @ngdoc method\n     * @name $http#jsonp\n     *\n     * @description\n     * Shortcut method to perform `JSONP` request.\n     *\n     * @param {string} url Relative or absolute URL specifying the destination of the request.\n     *                     The name of the callback should be the string `JSON_CALLBACK`.\n     * @param {Object=} config Optional configuration object\n     * @returns {HttpPromise} Future object\n     */\n    createShortMethods('get', 'delete', 'head', 'jsonp');\n\n    /**\n     * @ngdoc method\n     * @name $http#post\n     *\n     * @description\n     * Shortcut method to perform `POST` request.\n     *\n     * @param {string} url Relative or absolute URL specifying the destination of the request\n     * @param {*} data Request content\n     * @param {Object=} config Optional configuration object\n     * @returns {HttpPromise} Future object\n     */\n\n    /**\n     * @ngdoc method\n     * @name $http#put\n     *\n     * @description\n     * Shortcut method to perform `PUT` request.\n     *\n     * @param {string} url Relative or absolute URL specifying the destination of the request\n     * @param {*} data Request content\n     * @param {Object=} config Optional configuration object\n     * @returns {HttpPromise} Future object\n     */\n\n     /**\n      * @ngdoc method\n      * @name $http#patch\n      *\n      * @description\n      * Shortcut method to perform `PATCH` request.\n      *\n      * @param {string} url Relative or absolute URL specifying the destination of the request\n      * @param {*} data Request content\n      * @param {Object=} config Optional configuration object\n      * @returns {HttpPromise} Future object\n      */\n    createShortMethodsWithData('post', 'put', 'patch');\n\n        /**\n         * @ngdoc property\n         * @name $http#defaults\n         *\n         * @description\n         * Runtime equivalent of the `$httpProvider.defaults` property. Allows configuration of\n         * default headers, withCredentials as well as request and response transformations.\n         *\n         * See \"Setting HTTP Headers\" and \"Transforming Requests and Responses\" sections above.\n         */\n    $http.defaults = defaults;\n\n\n    return $http;\n\n\n    function createShortMethods(names) {\n      forEach(arguments, function(name) {\n        $http[name] = function(url, config) {\n          return $http(extend({}, config || {}, {\n            method: name,\n            url: url\n          }));\n        };\n      });\n    }\n\n\n    function createShortMethodsWithData(name) {\n      forEach(arguments, function(name) {\n        $http[name] = function(url, data, config) {\n          return $http(extend({}, config || {}, {\n            method: name,\n            url: url,\n            data: data\n          }));\n        };\n      });\n    }\n\n\n    /**\n     * Makes the request.\n     *\n     * !!! ACCESSES CLOSURE VARS:\n     * $httpBackend, defaults, $log, $rootScope, defaultCache, $http.pendingRequests\n     */\n    function sendReq(config, reqData) {\n      var deferred = $q.defer(),\n          promise = deferred.promise,\n          cache,\n          cachedResp,\n          reqHeaders = config.headers,\n          url = buildUrl(config.url, config.paramSerializer(config.params));\n\n      $http.pendingRequests.push(config);\n      promise.then(removePendingReq, removePendingReq);\n\n\n      if ((config.cache || defaults.cache) && config.cache !== false &&\n          (config.method === 'GET' || config.method === 'JSONP')) {\n        cache = isObject(config.cache) ? config.cache\n              : isObject(defaults.cache) ? defaults.cache\n              : defaultCache;\n      }\n\n      if (cache) {\n        cachedResp = cache.get(url);\n        if (isDefined(cachedResp)) {\n          if (isPromiseLike(cachedResp)) {\n            // cached request has already been sent, but there is no response yet\n            cachedResp.then(resolvePromiseWithResult, resolvePromiseWithResult);\n          } else {\n            // serving from cache\n            if (isArray(cachedResp)) {\n              resolvePromise(cachedResp[1], cachedResp[0], shallowCopy(cachedResp[2]), cachedResp[3]);\n            } else {\n              resolvePromise(cachedResp, 200, {}, 'OK');\n            }\n          }\n        } else {\n          // put the promise for the non-transformed response into cache as a placeholder\n          cache.put(url, promise);\n        }\n      }\n\n\n      // if we won't have the response in cache, set the xsrf headers and\n      // send the request to the backend\n      if (isUndefined(cachedResp)) {\n        var xsrfValue = urlIsSameOrigin(config.url)\n            ? $$cookieReader()[config.xsrfCookieName || defaults.xsrfCookieName]\n            : undefined;\n        if (xsrfValue) {\n          reqHeaders[(config.xsrfHeaderName || defaults.xsrfHeaderName)] = xsrfValue;\n        }\n\n        $httpBackend(config.method, url, reqData, done, reqHeaders, config.timeout,\n            config.withCredentials, config.responseType,\n            createApplyHandlers(config.eventHandlers),\n            createApplyHandlers(config.uploadEventHandlers));\n      }\n\n      return promise;\n\n      function createApplyHandlers(eventHandlers) {\n        if (eventHandlers) {\n          var applyHandlers = {};\n          forEach(eventHandlers, function(eventHandler, key) {\n            applyHandlers[key] = function(event) {\n              if (useApplyAsync) {\n                $rootScope.$applyAsync(callEventHandler);\n              } else if ($rootScope.$$phase) {\n                callEventHandler();\n              } else {\n                $rootScope.$apply(callEventHandler);\n              }\n\n              function callEventHandler() {\n                eventHandler(event);\n              }\n            };\n          });\n          return applyHandlers;\n        }\n      }\n\n\n      /**\n       * Callback registered to $httpBackend():\n       *  - caches the response if desired\n       *  - resolves the raw $http promise\n       *  - calls $apply\n       */\n      function done(status, response, headersString, statusText) {\n        if (cache) {\n          if (isSuccess(status)) {\n            cache.put(url, [status, response, parseHeaders(headersString), statusText]);\n          } else {\n            // remove promise from the cache\n            cache.remove(url);\n          }\n        }\n\n        function resolveHttpPromise() {\n          resolvePromise(response, status, headersString, statusText);\n        }\n\n        if (useApplyAsync) {\n          $rootScope.$applyAsync(resolveHttpPromise);\n        } else {\n          resolveHttpPromise();\n          if (!$rootScope.$$phase) $rootScope.$apply();\n        }\n      }\n\n\n      /**\n       * Resolves the raw $http promise.\n       */\n      function resolvePromise(response, status, headers, statusText) {\n        //status: HTTP response status code, 0, -1 (aborted by timeout / promise)\n        status = status >= -1 ? status : 0;\n\n        (isSuccess(status) ? deferred.resolve : deferred.reject)({\n          data: response,\n          status: status,\n          headers: headersGetter(headers),\n          config: config,\n          statusText: statusText\n        });\n      }\n\n      function resolvePromiseWithResult(result) {\n        resolvePromise(result.data, result.status, shallowCopy(result.headers()), result.statusText);\n      }\n\n      function removePendingReq() {\n        var idx = $http.pendingRequests.indexOf(config);\n        if (idx !== -1) $http.pendingRequests.splice(idx, 1);\n      }\n    }\n\n\n    function buildUrl(url, serializedParams) {\n      if (serializedParams.length > 0) {\n        url += ((url.indexOf('?') == -1) ? '?' : '&') + serializedParams;\n      }\n      return url;\n    }\n  }];\n}\n\n/**\n * @ngdoc service\n * @name $xhrFactory\n *\n * @description\n * Factory function used to create XMLHttpRequest objects.\n *\n * Replace or decorate this service to create your own custom XMLHttpRequest objects.\n *\n * ```\n * angular.module('myApp', [])\n * .factory('$xhrFactory', function() {\n *   return function createXhr(method, url) {\n *     return new window.XMLHttpRequest({mozSystem: true});\n *   };\n * });\n * ```\n *\n * @param {string} method HTTP method of the request (GET, POST, PUT, ..)\n * @param {string} url URL of the request.\n */\nfunction $xhrFactoryProvider() {\n  this.$get = function() {\n    return function createXhr() {\n      return new window.XMLHttpRequest();\n    };\n  };\n}\n\n/**\n * @ngdoc service\n * @name $httpBackend\n * @requires $window\n * @requires $document\n * @requires $xhrFactory\n *\n * @description\n * HTTP backend used by the {@link ng.$http service} that delegates to\n * XMLHttpRequest object or JSONP and deals with browser incompatibilities.\n *\n * You should never need to use this service directly, instead use the higher-level abstractions:\n * {@link ng.$http $http} or {@link ngResource.$resource $resource}.\n *\n * During testing this implementation is swapped with {@link ngMock.$httpBackend mock\n * $httpBackend} which can be trained with responses.\n */\nfunction $HttpBackendProvider() {\n  this.$get = ['$browser', '$window', '$document', '$xhrFactory', function($browser, $window, $document, $xhrFactory) {\n    return createHttpBackend($browser, $xhrFactory, $browser.defer, $window.angular.callbacks, $document[0]);\n  }];\n}\n\nfunction createHttpBackend($browser, createXhr, $browserDefer, callbacks, rawDocument) {\n  // TODO(vojta): fix the signature\n  return function(method, url, post, callback, headers, timeout, withCredentials, responseType, eventHandlers, uploadEventHandlers) {\n    $browser.$$incOutstandingRequestCount();\n    url = url || $browser.url();\n\n    if (lowercase(method) == 'jsonp') {\n      var callbackId = '_' + (callbacks.counter++).toString(36);\n      callbacks[callbackId] = function(data) {\n        callbacks[callbackId].data = data;\n        callbacks[callbackId].called = true;\n      };\n\n      var jsonpDone = jsonpReq(url.replace('JSON_CALLBACK', 'angular.callbacks.' + callbackId),\n          callbackId, function(status, text) {\n        completeRequest(callback, status, callbacks[callbackId].data, \"\", text);\n        callbacks[callbackId] = noop;\n      });\n    } else {\n\n      var xhr = createXhr(method, url);\n\n      xhr.open(method, url, true);\n      forEach(headers, function(value, key) {\n        if (isDefined(value)) {\n            xhr.setRequestHeader(key, value);\n        }\n      });\n\n      xhr.onload = function requestLoaded() {\n        var statusText = xhr.statusText || '';\n\n        // responseText is the old-school way of retrieving response (supported by IE9)\n        // response/responseType properties were introduced in XHR Level2 spec (supported by IE10)\n        var response = ('response' in xhr) ? xhr.response : xhr.responseText;\n\n        // normalize IE9 bug (http://bugs.jquery.com/ticket/1450)\n        var status = xhr.status === 1223 ? 204 : xhr.status;\n\n        // fix status code when it is 0 (0 status is undocumented).\n        // Occurs when accessing file resources or on Android 4.1 stock browser\n        // while retrieving files from application cache.\n        if (status === 0) {\n          status = response ? 200 : urlResolve(url).protocol == 'file' ? 404 : 0;\n        }\n\n        completeRequest(callback,\n            status,\n            response,\n            xhr.getAllResponseHeaders(),\n            statusText);\n      };\n\n      var requestError = function() {\n        // The response is always empty\n        // See https://xhr.spec.whatwg.org/#request-error-steps and https://fetch.spec.whatwg.org/#concept-network-error\n        completeRequest(callback, -1, null, null, '');\n      };\n\n      xhr.onerror = requestError;\n      xhr.onabort = requestError;\n\n      forEach(eventHandlers, function(value, key) {\n          xhr.addEventListener(key, value);\n      });\n\n      forEach(uploadEventHandlers, function(value, key) {\n        xhr.upload.addEventListener(key, value);\n      });\n\n      if (withCredentials) {\n        xhr.withCredentials = true;\n      }\n\n      if (responseType) {\n        try {\n          xhr.responseType = responseType;\n        } catch (e) {\n          // WebKit added support for the json responseType value on 09/03/2013\n          // https://bugs.webkit.org/show_bug.cgi?id=73648. Versions of Safari prior to 7 are\n          // known to throw when setting the value \"json\" as the response type. Other older\n          // browsers implementing the responseType\n          //\n          // The json response type can be ignored if not supported, because JSON payloads are\n          // parsed on the client-side regardless.\n          if (responseType !== 'json') {\n            throw e;\n          }\n        }\n      }\n\n      xhr.send(isUndefined(post) ? null : post);\n    }\n\n    if (timeout > 0) {\n      var timeoutId = $browserDefer(timeoutRequest, timeout);\n    } else if (isPromiseLike(timeout)) {\n      timeout.then(timeoutRequest);\n    }\n\n\n    function timeoutRequest() {\n      jsonpDone && jsonpDone();\n      xhr && xhr.abort();\n    }\n\n    function completeRequest(callback, status, response, headersString, statusText) {\n      // cancel timeout and subsequent timeout promise resolution\n      if (isDefined(timeoutId)) {\n        $browserDefer.cancel(timeoutId);\n      }\n      jsonpDone = xhr = null;\n\n      callback(status, response, headersString, statusText);\n      $browser.$$completeOutstandingRequest(noop);\n    }\n  };\n\n  function jsonpReq(url, callbackId, done) {\n    // we can't use jQuery/jqLite here because jQuery does crazy stuff with script elements, e.g.:\n    // - fetches local scripts via XHR and evals them\n    // - adds and immediately removes script elements from the document\n    var script = rawDocument.createElement('script'), callback = null;\n    script.type = \"text/javascript\";\n    script.src = url;\n    script.async = true;\n\n    callback = function(event) {\n      removeEventListenerFn(script, \"load\", callback);\n      removeEventListenerFn(script, \"error\", callback);\n      rawDocument.body.removeChild(script);\n      script = null;\n      var status = -1;\n      var text = \"unknown\";\n\n      if (event) {\n        if (event.type === \"load\" && !callbacks[callbackId].called) {\n          event = { type: \"error\" };\n        }\n        text = event.type;\n        status = event.type === \"error\" ? 404 : 200;\n      }\n\n      if (done) {\n        done(status, text);\n      }\n    };\n\n    addEventListenerFn(script, \"load\", callback);\n    addEventListenerFn(script, \"error\", callback);\n    rawDocument.body.appendChild(script);\n    return callback;\n  }\n}\n\nvar $interpolateMinErr = angular.$interpolateMinErr = minErr('$interpolate');\n$interpolateMinErr.throwNoconcat = function(text) {\n  throw $interpolateMinErr('noconcat',\n      \"Error while interpolating: {0}\\nStrict Contextual Escaping disallows \" +\n      \"interpolations that concatenate multiple expressions when a trusted value is \" +\n      \"required.  See http://docs.angularjs.org/api/ng.$sce\", text);\n};\n\n$interpolateMinErr.interr = function(text, err) {\n  return $interpolateMinErr('interr', \"Can't interpolate: {0}\\n{1}\", text, err.toString());\n};\n\n/**\n * @ngdoc provider\n * @name $interpolateProvider\n *\n * @description\n *\n * Used for configuring the interpolation markup. Defaults to `{{` and `}}`.\n *\n * <div class=\"alert alert-danger\">\n * This feature is sometimes used to mix different markup languages, e.g. to wrap an Angular\n * template within a Python Jinja template (or any other template language). Mixing templating\n * languages is **very dangerous**. The embedding template language will not safely escape Angular\n * expressions, so any user-controlled values in the template will cause Cross Site Scripting (XSS)\n * security bugs!\n * </div>\n *\n * @example\n<example name=\"custom-interpolation-markup\" module=\"customInterpolationApp\">\n<file name=\"index.html\">\n<script>\n  var customInterpolationApp = angular.module('customInterpolationApp', []);\n\n  customInterpolationApp.config(function($interpolateProvider) {\n    $interpolateProvider.startSymbol('//');\n    $interpolateProvider.endSymbol('//');\n  });\n\n\n  customInterpolationApp.controller('DemoController', function() {\n      this.label = \"This binding is brought you by // interpolation symbols.\";\n  });\n</script>\n<div ng-controller=\"DemoController as demo\">\n    //demo.label//\n</div>\n</file>\n<file name=\"protractor.js\" type=\"protractor\">\n  it('should interpolate binding with custom symbols', function() {\n    expect(element(by.binding('demo.label')).getText()).toBe('This binding is brought you by // interpolation symbols.');\n  });\n</file>\n</example>\n */\nfunction $InterpolateProvider() {\n  var startSymbol = '{{';\n  var endSymbol = '}}';\n\n  /**\n   * @ngdoc method\n   * @name $interpolateProvider#startSymbol\n   * @description\n   * Symbol to denote start of expression in the interpolated string. Defaults to `{{`.\n   *\n   * @param {string=} value new value to set the starting symbol to.\n   * @returns {string|self} Returns the symbol when used as getter and self if used as setter.\n   */\n  this.startSymbol = function(value) {\n    if (value) {\n      startSymbol = value;\n      return this;\n    } else {\n      return startSymbol;\n    }\n  };\n\n  /**\n   * @ngdoc method\n   * @name $interpolateProvider#endSymbol\n   * @description\n   * Symbol to denote the end of expression in the interpolated string. Defaults to `}}`.\n   *\n   * @param {string=} value new value to set the ending symbol to.\n   * @returns {string|self} Returns the symbol when used as getter and self if used as setter.\n   */\n  this.endSymbol = function(value) {\n    if (value) {\n      endSymbol = value;\n      return this;\n    } else {\n      return endSymbol;\n    }\n  };\n\n\n  this.$get = ['$parse', '$exceptionHandler', '$sce', function($parse, $exceptionHandler, $sce) {\n    var startSymbolLength = startSymbol.length,\n        endSymbolLength = endSymbol.length,\n        escapedStartRegexp = new RegExp(startSymbol.replace(/./g, escape), 'g'),\n        escapedEndRegexp = new RegExp(endSymbol.replace(/./g, escape), 'g');\n\n    function escape(ch) {\n      return '\\\\\\\\\\\\' + ch;\n    }\n\n    function unescapeText(text) {\n      return text.replace(escapedStartRegexp, startSymbol).\n        replace(escapedEndRegexp, endSymbol);\n    }\n\n    function stringify(value) {\n      if (value == null) { // null || undefined\n        return '';\n      }\n      switch (typeof value) {\n        case 'string':\n          break;\n        case 'number':\n          value = '' + value;\n          break;\n        default:\n          value = toJson(value);\n      }\n\n      return value;\n    }\n\n    //TODO: this is the same as the constantWatchDelegate in parse.js\n    function constantWatchDelegate(scope, listener, objectEquality, constantInterp) {\n      var unwatch;\n      return unwatch = scope.$watch(function constantInterpolateWatch(scope) {\n        unwatch();\n        return constantInterp(scope);\n      }, listener, objectEquality);\n    }\n\n    /**\n     * @ngdoc service\n     * @name $interpolate\n     * @kind function\n     *\n     * @requires $parse\n     * @requires $sce\n     *\n     * @description\n     *\n     * Compiles a string with markup into an interpolation function. This service is used by the\n     * HTML {@link ng.$compile $compile} service for data binding. See\n     * {@link ng.$interpolateProvider $interpolateProvider} for configuring the\n     * interpolation markup.\n     *\n     *\n     * ```js\n     *   var $interpolate = ...; // injected\n     *   var exp = $interpolate('Hello {{name | uppercase}}!');\n     *   expect(exp({name:'Angular'})).toEqual('Hello ANGULAR!');\n     * ```\n     *\n     * `$interpolate` takes an optional fourth argument, `allOrNothing`. If `allOrNothing` is\n     * `true`, the interpolation function will return `undefined` unless all embedded expressions\n     * evaluate to a value other than `undefined`.\n     *\n     * ```js\n     *   var $interpolate = ...; // injected\n     *   var context = {greeting: 'Hello', name: undefined };\n     *\n     *   // default \"forgiving\" mode\n     *   var exp = $interpolate('{{greeting}} {{name}}!');\n     *   expect(exp(context)).toEqual('Hello !');\n     *\n     *   // \"allOrNothing\" mode\n     *   exp = $interpolate('{{greeting}} {{name}}!', false, null, true);\n     *   expect(exp(context)).toBeUndefined();\n     *   context.name = 'Angular';\n     *   expect(exp(context)).toEqual('Hello Angular!');\n     * ```\n     *\n     * `allOrNothing` is useful for interpolating URLs. `ngSrc` and `ngSrcset` use this behavior.\n     *\n     * ####Escaped Interpolation\n     * $interpolate provides a mechanism for escaping interpolation markers. Start and end markers\n     * can be escaped by preceding each of their characters with a REVERSE SOLIDUS U+005C (backslash).\n     * It will be rendered as a regular start/end marker, and will not be interpreted as an expression\n     * or binding.\n     *\n     * This enables web-servers to prevent script injection attacks and defacing attacks, to some\n     * degree, while also enabling code examples to work without relying on the\n     * {@link ng.directive:ngNonBindable ngNonBindable} directive.\n     *\n     * **For security purposes, it is strongly encouraged that web servers escape user-supplied data,\n     * replacing angle brackets (&lt;, &gt;) with &amp;lt; and &amp;gt; respectively, and replacing all\n     * interpolation start/end markers with their escaped counterparts.**\n     *\n     * Escaped interpolation markers are only replaced with the actual interpolation markers in rendered\n     * output when the $interpolate service processes the text. So, for HTML elements interpolated\n     * by {@link ng.$compile $compile}, or otherwise interpolated with the `mustHaveExpression` parameter\n     * set to `true`, the interpolated text must contain an unescaped interpolation expression. As such,\n     * this is typically useful only when user-data is used in rendering a template from the server, or\n     * when otherwise untrusted data is used by a directive.\n     *\n     * <example>\n     *  <file name=\"index.html\">\n     *    <div ng-init=\"username='A user'\">\n     *      <p ng-init=\"apptitle='Escaping demo'\">{{apptitle}}: \\{\\{ username = \"defaced value\"; \\}\\}\n     *        </p>\n     *      <p><strong>{{username}}</strong> attempts to inject code which will deface the\n     *        application, but fails to accomplish their task, because the server has correctly\n     *        escaped the interpolation start/end markers with REVERSE SOLIDUS U+005C (backslash)\n     *        characters.</p>\n     *      <p>Instead, the result of the attempted script injection is visible, and can be removed\n     *        from the database by an administrator.</p>\n     *    </div>\n     *  </file>\n     * </example>\n     *\n     * @param {string} text The text with markup to interpolate.\n     * @param {boolean=} mustHaveExpression if set to true then the interpolation string must have\n     *    embedded expression in order to return an interpolation function. Strings with no\n     *    embedded expression will return null for the interpolation function.\n     * @param {string=} trustedContext when provided, the returned function passes the interpolated\n     *    result through {@link ng.$sce#getTrusted $sce.getTrusted(interpolatedResult,\n     *    trustedContext)} before returning it.  Refer to the {@link ng.$sce $sce} service that\n     *    provides Strict Contextual Escaping for details.\n     * @param {boolean=} allOrNothing if `true`, then the returned function returns undefined\n     *    unless all embedded expressions evaluate to a value other than `undefined`.\n     * @returns {function(context)} an interpolation function which is used to compute the\n     *    interpolated string. The function has these parameters:\n     *\n     * - `context`: evaluation context for all expressions embedded in the interpolated text\n     */\n    function $interpolate(text, mustHaveExpression, trustedContext, allOrNothing) {\n      // Provide a quick exit and simplified result function for text with no interpolation\n      if (!text.length || text.indexOf(startSymbol) === -1) {\n        var constantInterp;\n        if (!mustHaveExpression) {\n          var unescapedText = unescapeText(text);\n          constantInterp = valueFn(unescapedText);\n          constantInterp.exp = text;\n          constantInterp.expressions = [];\n          constantInterp.$$watchDelegate = constantWatchDelegate;\n        }\n        return constantInterp;\n      }\n\n      allOrNothing = !!allOrNothing;\n      var startIndex,\n          endIndex,\n          index = 0,\n          expressions = [],\n          parseFns = [],\n          textLength = text.length,\n          exp,\n          concat = [],\n          expressionPositions = [];\n\n      while (index < textLength) {\n        if (((startIndex = text.indexOf(startSymbol, index)) != -1) &&\n             ((endIndex = text.indexOf(endSymbol, startIndex + startSymbolLength)) != -1)) {\n          if (index !== startIndex) {\n            concat.push(unescapeText(text.substring(index, startIndex)));\n          }\n          exp = text.substring(startIndex + startSymbolLength, endIndex);\n          expressions.push(exp);\n          parseFns.push($parse(exp, parseStringifyInterceptor));\n          index = endIndex + endSymbolLength;\n          expressionPositions.push(concat.length);\n          concat.push('');\n        } else {\n          // we did not find an interpolation, so we have to add the remainder to the separators array\n          if (index !== textLength) {\n            concat.push(unescapeText(text.substring(index)));\n          }\n          break;\n        }\n      }\n\n      // Concatenating expressions makes it hard to reason about whether some combination of\n      // concatenated values are unsafe to use and could easily lead to XSS.  By requiring that a\n      // single expression be used for iframe[src], object[src], etc., we ensure that the value\n      // that's used is assigned or constructed by some JS code somewhere that is more testable or\n      // make it obvious that you bound the value to some user controlled value.  This helps reduce\n      // the load when auditing for XSS issues.\n      if (trustedContext && concat.length > 1) {\n          $interpolateMinErr.throwNoconcat(text);\n      }\n\n      if (!mustHaveExpression || expressions.length) {\n        var compute = function(values) {\n          for (var i = 0, ii = expressions.length; i < ii; i++) {\n            if (allOrNothing && isUndefined(values[i])) return;\n            concat[expressionPositions[i]] = values[i];\n          }\n          return concat.join('');\n        };\n\n        var getValue = function(value) {\n          return trustedContext ?\n            $sce.getTrusted(trustedContext, value) :\n            $sce.valueOf(value);\n        };\n\n        return extend(function interpolationFn(context) {\n            var i = 0;\n            var ii = expressions.length;\n            var values = new Array(ii);\n\n            try {\n              for (; i < ii; i++) {\n                values[i] = parseFns[i](context);\n              }\n\n              return compute(values);\n            } catch (err) {\n              $exceptionHandler($interpolateMinErr.interr(text, err));\n            }\n\n          }, {\n          // all of these properties are undocumented for now\n          exp: text, //just for compatibility with regular watchers created via $watch\n          expressions: expressions,\n          $$watchDelegate: function(scope, listener) {\n            var lastValue;\n            return scope.$watchGroup(parseFns, function interpolateFnWatcher(values, oldValues) {\n              var currValue = compute(values);\n              if (isFunction(listener)) {\n                listener.call(this, currValue, values !== oldValues ? lastValue : currValue, scope);\n              }\n              lastValue = currValue;\n            });\n          }\n        });\n      }\n\n      function parseStringifyInterceptor(value) {\n        try {\n          value = getValue(value);\n          return allOrNothing && !isDefined(value) ? value : stringify(value);\n        } catch (err) {\n          $exceptionHandler($interpolateMinErr.interr(text, err));\n        }\n      }\n    }\n\n\n    /**\n     * @ngdoc method\n     * @name $interpolate#startSymbol\n     * @description\n     * Symbol to denote the start of expression in the interpolated string. Defaults to `{{`.\n     *\n     * Use {@link ng.$interpolateProvider#startSymbol `$interpolateProvider.startSymbol`} to change\n     * the symbol.\n     *\n     * @returns {string} start symbol.\n     */\n    $interpolate.startSymbol = function() {\n      return startSymbol;\n    };\n\n\n    /**\n     * @ngdoc method\n     * @name $interpolate#endSymbol\n     * @description\n     * Symbol to denote the end of expression in the interpolated string. Defaults to `}}`.\n     *\n     * Use {@link ng.$interpolateProvider#endSymbol `$interpolateProvider.endSymbol`} to change\n     * the symbol.\n     *\n     * @returns {string} end symbol.\n     */\n    $interpolate.endSymbol = function() {\n      return endSymbol;\n    };\n\n    return $interpolate;\n  }];\n}\n\nfunction $IntervalProvider() {\n  this.$get = ['$rootScope', '$window', '$q', '$$q', '$browser',\n       function($rootScope,   $window,   $q,   $$q,   $browser) {\n    var intervals = {};\n\n\n     /**\n      * @ngdoc service\n      * @name $interval\n      *\n      * @description\n      * Angular's wrapper for `window.setInterval`. The `fn` function is executed every `delay`\n      * milliseconds.\n      *\n      * The return value of registering an interval function is a promise. This promise will be\n      * notified upon each tick of the interval, and will be resolved after `count` iterations, or\n      * run indefinitely if `count` is not defined. The value of the notification will be the\n      * number of iterations that have run.\n      * To cancel an interval, call `$interval.cancel(promise)`.\n      *\n      * In tests you can use {@link ngMock.$interval#flush `$interval.flush(millis)`} to\n      * move forward by `millis` milliseconds and trigger any functions scheduled to run in that\n      * time.\n      *\n      * <div class=\"alert alert-warning\">\n      * **Note**: Intervals created by this service must be explicitly destroyed when you are finished\n      * with them.  In particular they are not automatically destroyed when a controller's scope or a\n      * directive's element are destroyed.\n      * You should take this into consideration and make sure to always cancel the interval at the\n      * appropriate moment.  See the example below for more details on how and when to do this.\n      * </div>\n      *\n      * @param {function()} fn A function that should be called repeatedly.\n      * @param {number} delay Number of milliseconds between each function call.\n      * @param {number=} [count=0] Number of times to repeat. If not set, or 0, will repeat\n      *   indefinitely.\n      * @param {boolean=} [invokeApply=true] If set to `false` skips model dirty checking, otherwise\n      *   will invoke `fn` within the {@link ng.$rootScope.Scope#$apply $apply} block.\n      * @param {...*=} Pass additional parameters to the executed function.\n      * @returns {promise} A promise which will be notified on each iteration.\n      *\n      * @example\n      * <example module=\"intervalExample\">\n      * <file name=\"index.html\">\n      *   <script>\n      *     angular.module('intervalExample', [])\n      *       .controller('ExampleController', ['$scope', '$interval',\n      *         function($scope, $interval) {\n      *           $scope.format = 'M/d/yy h:mm:ss a';\n      *           $scope.blood_1 = 100;\n      *           $scope.blood_2 = 120;\n      *\n      *           var stop;\n      *           $scope.fight = function() {\n      *             // Don't start a new fight if we are already fighting\n      *             if ( angular.isDefined(stop) ) return;\n      *\n      *             stop = $interval(function() {\n      *               if ($scope.blood_1 > 0 && $scope.blood_2 > 0) {\n      *                 $scope.blood_1 = $scope.blood_1 - 3;\n      *                 $scope.blood_2 = $scope.blood_2 - 4;\n      *               } else {\n      *                 $scope.stopFight();\n      *               }\n      *             }, 100);\n      *           };\n      *\n      *           $scope.stopFight = function() {\n      *             if (angular.isDefined(stop)) {\n      *               $interval.cancel(stop);\n      *               stop = undefined;\n      *             }\n      *           };\n      *\n      *           $scope.resetFight = function() {\n      *             $scope.blood_1 = 100;\n      *             $scope.blood_2 = 120;\n      *           };\n      *\n      *           $scope.$on('$destroy', function() {\n      *             // Make sure that the interval is destroyed too\n      *             $scope.stopFight();\n      *           });\n      *         }])\n      *       // Register the 'myCurrentTime' directive factory method.\n      *       // We inject $interval and dateFilter service since the factory method is DI.\n      *       .directive('myCurrentTime', ['$interval', 'dateFilter',\n      *         function($interval, dateFilter) {\n      *           // return the directive link function. (compile function not needed)\n      *           return function(scope, element, attrs) {\n      *             var format,  // date format\n      *                 stopTime; // so that we can cancel the time updates\n      *\n      *             // used to update the UI\n      *             function updateTime() {\n      *               element.text(dateFilter(new Date(), format));\n      *             }\n      *\n      *             // watch the expression, and update the UI on change.\n      *             scope.$watch(attrs.myCurrentTime, function(value) {\n      *               format = value;\n      *               updateTime();\n      *             });\n      *\n      *             stopTime = $interval(updateTime, 1000);\n      *\n      *             // listen on DOM destroy (removal) event, and cancel the next UI update\n      *             // to prevent updating time after the DOM element was removed.\n      *             element.on('$destroy', function() {\n      *               $interval.cancel(stopTime);\n      *             });\n      *           }\n      *         }]);\n      *   </script>\n      *\n      *   <div>\n      *     <div ng-controller=\"ExampleController\">\n      *       <label>Date format: <input ng-model=\"format\"></label> <hr/>\n      *       Current time is: <span my-current-time=\"format\"></span>\n      *       <hr/>\n      *       Blood 1 : <font color='red'>{{blood_1}}</font>\n      *       Blood 2 : <font color='red'>{{blood_2}}</font>\n      *       <button type=\"button\" data-ng-click=\"fight()\">Fight</button>\n      *       <button type=\"button\" data-ng-click=\"stopFight()\">StopFight</button>\n      *       <button type=\"button\" data-ng-click=\"resetFight()\">resetFight</button>\n      *     </div>\n      *   </div>\n      *\n      * </file>\n      * </example>\n      */\n    function interval(fn, delay, count, invokeApply) {\n      var hasParams = arguments.length > 4,\n          args = hasParams ? sliceArgs(arguments, 4) : [],\n          setInterval = $window.setInterval,\n          clearInterval = $window.clearInterval,\n          iteration = 0,\n          skipApply = (isDefined(invokeApply) && !invokeApply),\n          deferred = (skipApply ? $$q : $q).defer(),\n          promise = deferred.promise;\n\n      count = isDefined(count) ? count : 0;\n\n      promise.$$intervalId = setInterval(function tick() {\n        if (skipApply) {\n          $browser.defer(callback);\n        } else {\n          $rootScope.$evalAsync(callback);\n        }\n        deferred.notify(iteration++);\n\n        if (count > 0 && iteration >= count) {\n          deferred.resolve(iteration);\n          clearInterval(promise.$$intervalId);\n          delete intervals[promise.$$intervalId];\n        }\n\n        if (!skipApply) $rootScope.$apply();\n\n      }, delay);\n\n      intervals[promise.$$intervalId] = deferred;\n\n      return promise;\n\n      function callback() {\n        if (!hasParams) {\n          fn(iteration);\n        } else {\n          fn.apply(null, args);\n        }\n      }\n    }\n\n\n     /**\n      * @ngdoc method\n      * @name $interval#cancel\n      *\n      * @description\n      * Cancels a task associated with the `promise`.\n      *\n      * @param {Promise=} promise returned by the `$interval` function.\n      * @returns {boolean} Returns `true` if the task was successfully canceled.\n      */\n    interval.cancel = function(promise) {\n      if (promise && promise.$$intervalId in intervals) {\n        intervals[promise.$$intervalId].reject('canceled');\n        $window.clearInterval(promise.$$intervalId);\n        delete intervals[promise.$$intervalId];\n        return true;\n      }\n      return false;\n    };\n\n    return interval;\n  }];\n}\n\n/**\n * @ngdoc service\n * @name $locale\n *\n * @description\n * $locale service provides localization rules for various Angular components. As of right now the\n * only public api is:\n *\n * * `id` – `{string}` – locale id formatted as `languageId-countryId` (e.g. `en-us`)\n */\n\nvar PATH_MATCH = /^([^\\?#]*)(\\?([^#]*))?(#(.*))?$/,\n    DEFAULT_PORTS = {'http': 80, 'https': 443, 'ftp': 21};\nvar $locationMinErr = minErr('$location');\n\n\n/**\n * Encode path using encodeUriSegment, ignoring forward slashes\n *\n * @param {string} path Path to encode\n * @returns {string}\n */\nfunction encodePath(path) {\n  var segments = path.split('/'),\n      i = segments.length;\n\n  while (i--) {\n    segments[i] = encodeUriSegment(segments[i]);\n  }\n\n  return segments.join('/');\n}\n\nfunction parseAbsoluteUrl(absoluteUrl, locationObj) {\n  var parsedUrl = urlResolve(absoluteUrl);\n\n  locationObj.$$protocol = parsedUrl.protocol;\n  locationObj.$$host = parsedUrl.hostname;\n  locationObj.$$port = toInt(parsedUrl.port) || DEFAULT_PORTS[parsedUrl.protocol] || null;\n}\n\n\nfunction parseAppUrl(relativeUrl, locationObj) {\n  var prefixed = (relativeUrl.charAt(0) !== '/');\n  if (prefixed) {\n    relativeUrl = '/' + relativeUrl;\n  }\n  var match = urlResolve(relativeUrl);\n  locationObj.$$path = decodeURIComponent(prefixed && match.pathname.charAt(0) === '/' ?\n      match.pathname.substring(1) : match.pathname);\n  locationObj.$$search = parseKeyValue(match.search);\n  locationObj.$$hash = decodeURIComponent(match.hash);\n\n  // make sure path starts with '/';\n  if (locationObj.$$path && locationObj.$$path.charAt(0) != '/') {\n    locationObj.$$path = '/' + locationObj.$$path;\n  }\n}\n\n\n/**\n *\n * @param {string} begin\n * @param {string} whole\n * @returns {string} returns text from whole after begin or undefined if it does not begin with\n *                   expected string.\n */\nfunction beginsWith(begin, whole) {\n  if (whole.indexOf(begin) === 0) {\n    return whole.substr(begin.length);\n  }\n}\n\n\nfunction stripHash(url) {\n  var index = url.indexOf('#');\n  return index == -1 ? url : url.substr(0, index);\n}\n\nfunction trimEmptyHash(url) {\n  return url.replace(/(#.+)|#$/, '$1');\n}\n\n\nfunction stripFile(url) {\n  return url.substr(0, stripHash(url).lastIndexOf('/') + 1);\n}\n\n/* return the server only (scheme://host:port) */\nfunction serverBase(url) {\n  return url.substring(0, url.indexOf('/', url.indexOf('//') + 2));\n}\n\n\n/**\n * LocationHtml5Url represents an url\n * This object is exposed as $location service when HTML5 mode is enabled and supported\n *\n * @constructor\n * @param {string} appBase application base URL\n * @param {string} appBaseNoFile application base URL stripped of any filename\n * @param {string} basePrefix url path prefix\n */\nfunction LocationHtml5Url(appBase, appBaseNoFile, basePrefix) {\n  this.$$html5 = true;\n  basePrefix = basePrefix || '';\n  parseAbsoluteUrl(appBase, this);\n\n\n  /**\n   * Parse given html5 (regular) url string into properties\n   * @param {string} url HTML5 url\n   * @private\n   */\n  this.$$parse = function(url) {\n    var pathUrl = beginsWith(appBaseNoFile, url);\n    if (!isString(pathUrl)) {\n      throw $locationMinErr('ipthprfx', 'Invalid url \"{0}\", missing path prefix \"{1}\".', url,\n          appBaseNoFile);\n    }\n\n    parseAppUrl(pathUrl, this);\n\n    if (!this.$$path) {\n      this.$$path = '/';\n    }\n\n    this.$$compose();\n  };\n\n  /**\n   * Compose url and update `absUrl` property\n   * @private\n   */\n  this.$$compose = function() {\n    var search = toKeyValue(this.$$search),\n        hash = this.$$hash ? '#' + encodeUriSegment(this.$$hash) : '';\n\n    this.$$url = encodePath(this.$$path) + (search ? '?' + search : '') + hash;\n    this.$$absUrl = appBaseNoFile + this.$$url.substr(1); // first char is always '/'\n  };\n\n  this.$$parseLinkUrl = function(url, relHref) {\n    if (relHref && relHref[0] === '#') {\n      // special case for links to hash fragments:\n      // keep the old url and only replace the hash fragment\n      this.hash(relHref.slice(1));\n      return true;\n    }\n    var appUrl, prevAppUrl;\n    var rewrittenUrl;\n\n    if (isDefined(appUrl = beginsWith(appBase, url))) {\n      prevAppUrl = appUrl;\n      if (isDefined(appUrl = beginsWith(basePrefix, appUrl))) {\n        rewrittenUrl = appBaseNoFile + (beginsWith('/', appUrl) || appUrl);\n      } else {\n        rewrittenUrl = appBase + prevAppUrl;\n      }\n    } else if (isDefined(appUrl = beginsWith(appBaseNoFile, url))) {\n      rewrittenUrl = appBaseNoFile + appUrl;\n    } else if (appBaseNoFile == url + '/') {\n      rewrittenUrl = appBaseNoFile;\n    }\n    if (rewrittenUrl) {\n      this.$$parse(rewrittenUrl);\n    }\n    return !!rewrittenUrl;\n  };\n}\n\n\n/**\n * LocationHashbangUrl represents url\n * This object is exposed as $location service when developer doesn't opt into html5 mode.\n * It also serves as the base class for html5 mode fallback on legacy browsers.\n *\n * @constructor\n * @param {string} appBase application base URL\n * @param {string} appBaseNoFile application base URL stripped of any filename\n * @param {string} hashPrefix hashbang prefix\n */\nfunction LocationHashbangUrl(appBase, appBaseNoFile, hashPrefix) {\n\n  parseAbsoluteUrl(appBase, this);\n\n\n  /**\n   * Parse given hashbang url into properties\n   * @param {string} url Hashbang url\n   * @private\n   */\n  this.$$parse = function(url) {\n    var withoutBaseUrl = beginsWith(appBase, url) || beginsWith(appBaseNoFile, url);\n    var withoutHashUrl;\n\n    if (!isUndefined(withoutBaseUrl) && withoutBaseUrl.charAt(0) === '#') {\n\n      // The rest of the url starts with a hash so we have\n      // got either a hashbang path or a plain hash fragment\n      withoutHashUrl = beginsWith(hashPrefix, withoutBaseUrl);\n      if (isUndefined(withoutHashUrl)) {\n        // There was no hashbang prefix so we just have a hash fragment\n        withoutHashUrl = withoutBaseUrl;\n      }\n\n    } else {\n      // There was no hashbang path nor hash fragment:\n      // If we are in HTML5 mode we use what is left as the path;\n      // Otherwise we ignore what is left\n      if (this.$$html5) {\n        withoutHashUrl = withoutBaseUrl;\n      } else {\n        withoutHashUrl = '';\n        if (isUndefined(withoutBaseUrl)) {\n          appBase = url;\n          this.replace();\n        }\n      }\n    }\n\n    parseAppUrl(withoutHashUrl, this);\n\n    this.$$path = removeWindowsDriveName(this.$$path, withoutHashUrl, appBase);\n\n    this.$$compose();\n\n    /*\n     * In Windows, on an anchor node on documents loaded from\n     * the filesystem, the browser will return a pathname\n     * prefixed with the drive name ('/C:/path') when a\n     * pathname without a drive is set:\n     *  * a.setAttribute('href', '/foo')\n     *   * a.pathname === '/C:/foo' //true\n     *\n     * Inside of Angular, we're always using pathnames that\n     * do not include drive names for routing.\n     */\n    function removeWindowsDriveName(path, url, base) {\n      /*\n      Matches paths for file protocol on windows,\n      such as /C:/foo/bar, and captures only /foo/bar.\n      */\n      var windowsFilePathExp = /^\\/[A-Z]:(\\/.*)/;\n\n      var firstPathSegmentMatch;\n\n      //Get the relative path from the input URL.\n      if (url.indexOf(base) === 0) {\n        url = url.replace(base, '');\n      }\n\n      // The input URL intentionally contains a first path segment that ends with a colon.\n      if (windowsFilePathExp.exec(url)) {\n        return path;\n      }\n\n      firstPathSegmentMatch = windowsFilePathExp.exec(path);\n      return firstPathSegmentMatch ? firstPathSegmentMatch[1] : path;\n    }\n  };\n\n  /**\n   * Compose hashbang url and update `absUrl` property\n   * @private\n   */\n  this.$$compose = function() {\n    var search = toKeyValue(this.$$search),\n        hash = this.$$hash ? '#' + encodeUriSegment(this.$$hash) : '';\n\n    this.$$url = encodePath(this.$$path) + (search ? '?' + search : '') + hash;\n    this.$$absUrl = appBase + (this.$$url ? hashPrefix + this.$$url : '');\n  };\n\n  this.$$parseLinkUrl = function(url, relHref) {\n    if (stripHash(appBase) == stripHash(url)) {\n      this.$$parse(url);\n      return true;\n    }\n    return false;\n  };\n}\n\n\n/**\n * LocationHashbangUrl represents url\n * This object is exposed as $location service when html5 history api is enabled but the browser\n * does not support it.\n *\n * @constructor\n * @param {string} appBase application base URL\n * @param {string} appBaseNoFile application base URL stripped of any filename\n * @param {string} hashPrefix hashbang prefix\n */\nfunction LocationHashbangInHtml5Url(appBase, appBaseNoFile, hashPrefix) {\n  this.$$html5 = true;\n  LocationHashbangUrl.apply(this, arguments);\n\n  this.$$parseLinkUrl = function(url, relHref) {\n    if (relHref && relHref[0] === '#') {\n      // special case for links to hash fragments:\n      // keep the old url and only replace the hash fragment\n      this.hash(relHref.slice(1));\n      return true;\n    }\n\n    var rewrittenUrl;\n    var appUrl;\n\n    if (appBase == stripHash(url)) {\n      rewrittenUrl = url;\n    } else if ((appUrl = beginsWith(appBaseNoFile, url))) {\n      rewrittenUrl = appBase + hashPrefix + appUrl;\n    } else if (appBaseNoFile === url + '/') {\n      rewrittenUrl = appBaseNoFile;\n    }\n    if (rewrittenUrl) {\n      this.$$parse(rewrittenUrl);\n    }\n    return !!rewrittenUrl;\n  };\n\n  this.$$compose = function() {\n    var search = toKeyValue(this.$$search),\n        hash = this.$$hash ? '#' + encodeUriSegment(this.$$hash) : '';\n\n    this.$$url = encodePath(this.$$path) + (search ? '?' + search : '') + hash;\n    // include hashPrefix in $$absUrl when $$url is empty so IE9 does not reload page because of removal of '#'\n    this.$$absUrl = appBase + hashPrefix + this.$$url;\n  };\n\n}\n\n\nvar locationPrototype = {\n\n  /**\n   * Are we in html5 mode?\n   * @private\n   */\n  $$html5: false,\n\n  /**\n   * Has any change been replacing?\n   * @private\n   */\n  $$replace: false,\n\n  /**\n   * @ngdoc method\n   * @name $location#absUrl\n   *\n   * @description\n   * This method is getter only.\n   *\n   * Return full url representation with all segments encoded according to rules specified in\n   * [RFC 3986](http://www.ietf.org/rfc/rfc3986.txt).\n   *\n   *\n   * ```js\n   * // given url http://example.com/#/some/path?foo=bar&baz=xoxo\n   * var absUrl = $location.absUrl();\n   * // => \"http://example.com/#/some/path?foo=bar&baz=xoxo\"\n   * ```\n   *\n   * @return {string} full url\n   */\n  absUrl: locationGetter('$$absUrl'),\n\n  /**\n   * @ngdoc method\n   * @name $location#url\n   *\n   * @description\n   * This method is getter / setter.\n   *\n   * Return url (e.g. `/path?a=b#hash`) when called without any parameter.\n   *\n   * Change path, search and hash, when called with parameter and return `$location`.\n   *\n   *\n   * ```js\n   * // given url http://example.com/#/some/path?foo=bar&baz=xoxo\n   * var url = $location.url();\n   * // => \"/some/path?foo=bar&baz=xoxo\"\n   * ```\n   *\n   * @param {string=} url New url without base prefix (e.g. `/path?a=b#hash`)\n   * @return {string} url\n   */\n  url: function(url) {\n    if (isUndefined(url)) {\n      return this.$$url;\n    }\n\n    var match = PATH_MATCH.exec(url);\n    if (match[1] || url === '') this.path(decodeURIComponent(match[1]));\n    if (match[2] || match[1] || url === '') this.search(match[3] || '');\n    this.hash(match[5] || '');\n\n    return this;\n  },\n\n  /**\n   * @ngdoc method\n   * @name $location#protocol\n   *\n   * @description\n   * This method is getter only.\n   *\n   * Return protocol of current url.\n   *\n   *\n   * ```js\n   * // given url http://example.com/#/some/path?foo=bar&baz=xoxo\n   * var protocol = $location.protocol();\n   * // => \"http\"\n   * ```\n   *\n   * @return {string} protocol of current url\n   */\n  protocol: locationGetter('$$protocol'),\n\n  /**\n   * @ngdoc method\n   * @name $location#host\n   *\n   * @description\n   * This method is getter only.\n   *\n   * Return host of current url.\n   *\n   * Note: compared to the non-angular version `location.host` which returns `hostname:port`, this returns the `hostname` portion only.\n   *\n   *\n   * ```js\n   * // given url http://example.com/#/some/path?foo=bar&baz=xoxo\n   * var host = $location.host();\n   * // => \"example.com\"\n   *\n   * // given url http://user:password@example.com:8080/#/some/path?foo=bar&baz=xoxo\n   * host = $location.host();\n   * // => \"example.com\"\n   * host = location.host;\n   * // => \"example.com:8080\"\n   * ```\n   *\n   * @return {string} host of current url.\n   */\n  host: locationGetter('$$host'),\n\n  /**\n   * @ngdoc method\n   * @name $location#port\n   *\n   * @description\n   * This method is getter only.\n   *\n   * Return port of current url.\n   *\n   *\n   * ```js\n   * // given url http://example.com/#/some/path?foo=bar&baz=xoxo\n   * var port = $location.port();\n   * // => 80\n   * ```\n   *\n   * @return {Number} port\n   */\n  port: locationGetter('$$port'),\n\n  /**\n   * @ngdoc method\n   * @name $location#path\n   *\n   * @description\n   * This method is getter / setter.\n   *\n   * Return path of current url when called without any parameter.\n   *\n   * Change path when called with parameter and return `$location`.\n   *\n   * Note: Path should always begin with forward slash (/), this method will add the forward slash\n   * if it is missing.\n   *\n   *\n   * ```js\n   * // given url http://example.com/#/some/path?foo=bar&baz=xoxo\n   * var path = $location.path();\n   * // => \"/some/path\"\n   * ```\n   *\n   * @param {(string|number)=} path New path\n   * @return {string} path\n   */\n  path: locationGetterSetter('$$path', function(path) {\n    path = path !== null ? path.toString() : '';\n    return path.charAt(0) == '/' ? path : '/' + path;\n  }),\n\n  /**\n   * @ngdoc method\n   * @name $location#search\n   *\n   * @description\n   * This method is getter / setter.\n   *\n   * Return search part (as object) of current url when called without any parameter.\n   *\n   * Change search part when called with parameter and return `$location`.\n   *\n   *\n   * ```js\n   * // given url http://example.com/#/some/path?foo=bar&baz=xoxo\n   * var searchObject = $location.search();\n   * // => {foo: 'bar', baz: 'xoxo'}\n   *\n   * // set foo to 'yipee'\n   * $location.search('foo', 'yipee');\n   * // $location.search() => {foo: 'yipee', baz: 'xoxo'}\n   * ```\n   *\n   * @param {string|Object.<string>|Object.<Array.<string>>} search New search params - string or\n   * hash object.\n   *\n   * When called with a single argument the method acts as a setter, setting the `search` component\n   * of `$location` to the specified value.\n   *\n   * If the argument is a hash object containing an array of values, these values will be encoded\n   * as duplicate search parameters in the url.\n   *\n   * @param {(string|Number|Array<string>|boolean)=} paramValue If `search` is a string or number, then `paramValue`\n   * will override only a single search property.\n   *\n   * If `paramValue` is an array, it will override the property of the `search` component of\n   * `$location` specified via the first argument.\n   *\n   * If `paramValue` is `null`, the property specified via the first argument will be deleted.\n   *\n   * If `paramValue` is `true`, the property specified via the first argument will be added with no\n   * value nor trailing equal sign.\n   *\n   * @return {Object} If called with no arguments returns the parsed `search` object. If called with\n   * one or more arguments returns `$location` object itself.\n   */\n  search: function(search, paramValue) {\n    switch (arguments.length) {\n      case 0:\n        return this.$$search;\n      case 1:\n        if (isString(search) || isNumber(search)) {\n          search = search.toString();\n          this.$$search = parseKeyValue(search);\n        } else if (isObject(search)) {\n          search = copy(search, {});\n          // remove object undefined or null properties\n          forEach(search, function(value, key) {\n            if (value == null) delete search[key];\n          });\n\n          this.$$search = search;\n        } else {\n          throw $locationMinErr('isrcharg',\n              'The first argument of the `$location#search()` call must be a string or an object.');\n        }\n        break;\n      default:\n        if (isUndefined(paramValue) || paramValue === null) {\n          delete this.$$search[search];\n        } else {\n          this.$$search[search] = paramValue;\n        }\n    }\n\n    this.$$compose();\n    return this;\n  },\n\n  /**\n   * @ngdoc method\n   * @name $location#hash\n   *\n   * @description\n   * This method is getter / setter.\n   *\n   * Returns the hash fragment when called without any parameters.\n   *\n   * Changes the hash fragment when called with a parameter and returns `$location`.\n   *\n   *\n   * ```js\n   * // given url http://example.com/#/some/path?foo=bar&baz=xoxo#hashValue\n   * var hash = $location.hash();\n   * // => \"hashValue\"\n   * ```\n   *\n   * @param {(string|number)=} hash New hash fragment\n   * @return {string} hash\n   */\n  hash: locationGetterSetter('$$hash', function(hash) {\n    return hash !== null ? hash.toString() : '';\n  }),\n\n  /**\n   * @ngdoc method\n   * @name $location#replace\n   *\n   * @description\n   * If called, all changes to $location during the current `$digest` will replace the current history\n   * record, instead of adding a new one.\n   */\n  replace: function() {\n    this.$$replace = true;\n    return this;\n  }\n};\n\nforEach([LocationHashbangInHtml5Url, LocationHashbangUrl, LocationHtml5Url], function(Location) {\n  Location.prototype = Object.create(locationPrototype);\n\n  /**\n   * @ngdoc method\n   * @name $location#state\n   *\n   * @description\n   * This method is getter / setter.\n   *\n   * Return the history state object when called without any parameter.\n   *\n   * Change the history state object when called with one parameter and return `$location`.\n   * The state object is later passed to `pushState` or `replaceState`.\n   *\n   * NOTE: This method is supported only in HTML5 mode and only in browsers supporting\n   * the HTML5 History API (i.e. methods `pushState` and `replaceState`). If you need to support\n   * older browsers (like IE9 or Android < 4.0), don't use this method.\n   *\n   * @param {object=} state State object for pushState or replaceState\n   * @return {object} state\n   */\n  Location.prototype.state = function(state) {\n    if (!arguments.length) {\n      return this.$$state;\n    }\n\n    if (Location !== LocationHtml5Url || !this.$$html5) {\n      throw $locationMinErr('nostate', 'History API state support is available only ' +\n        'in HTML5 mode and only in browsers supporting HTML5 History API');\n    }\n    // The user might modify `stateObject` after invoking `$location.state(stateObject)`\n    // but we're changing the $$state reference to $browser.state() during the $digest\n    // so the modification window is narrow.\n    this.$$state = isUndefined(state) ? null : state;\n\n    return this;\n  };\n});\n\n\nfunction locationGetter(property) {\n  return function() {\n    return this[property];\n  };\n}\n\n\nfunction locationGetterSetter(property, preprocess) {\n  return function(value) {\n    if (isUndefined(value)) {\n      return this[property];\n    }\n\n    this[property] = preprocess(value);\n    this.$$compose();\n\n    return this;\n  };\n}\n\n\n/**\n * @ngdoc service\n * @name $location\n *\n * @requires $rootElement\n *\n * @description\n * The $location service parses the URL in the browser address bar (based on the\n * [window.location](https://developer.mozilla.org/en/window.location)) and makes the URL\n * available to your application. Changes to the URL in the address bar are reflected into\n * $location service and changes to $location are reflected into the browser address bar.\n *\n * **The $location service:**\n *\n * - Exposes the current URL in the browser address bar, so you can\n *   - Watch and observe the URL.\n *   - Change the URL.\n * - Synchronizes the URL with the browser when the user\n *   - Changes the address bar.\n *   - Clicks the back or forward button (or clicks a History link).\n *   - Clicks on a link.\n * - Represents the URL object as a set of methods (protocol, host, port, path, search, hash).\n *\n * For more information see {@link guide/$location Developer Guide: Using $location}\n */\n\n/**\n * @ngdoc provider\n * @name $locationProvider\n * @description\n * Use the `$locationProvider` to configure how the application deep linking paths are stored.\n */\nfunction $LocationProvider() {\n  var hashPrefix = '',\n      html5Mode = {\n        enabled: false,\n        requireBase: true,\n        rewriteLinks: true\n      };\n\n  /**\n   * @ngdoc method\n   * @name $locationProvider#hashPrefix\n   * @description\n   * @param {string=} prefix Prefix for hash part (containing path and search)\n   * @returns {*} current value if used as getter or itself (chaining) if used as setter\n   */\n  this.hashPrefix = function(prefix) {\n    if (isDefined(prefix)) {\n      hashPrefix = prefix;\n      return this;\n    } else {\n      return hashPrefix;\n    }\n  };\n\n  /**\n   * @ngdoc method\n   * @name $locationProvider#html5Mode\n   * @description\n   * @param {(boolean|Object)=} mode If boolean, sets `html5Mode.enabled` to value.\n   *   If object, sets `enabled`, `requireBase` and `rewriteLinks` to respective values. Supported\n   *   properties:\n   *   - **enabled** – `{boolean}` – (default: false) If true, will rely on `history.pushState` to\n   *     change urls where supported. Will fall back to hash-prefixed paths in browsers that do not\n   *     support `pushState`.\n   *   - **requireBase** - `{boolean}` - (default: `true`) When html5Mode is enabled, specifies\n   *     whether or not a <base> tag is required to be present. If `enabled` and `requireBase` are\n   *     true, and a base tag is not present, an error will be thrown when `$location` is injected.\n   *     See the {@link guide/$location $location guide for more information}\n   *   - **rewriteLinks** - `{boolean}` - (default: `true`) When html5Mode is enabled,\n   *     enables/disables url rewriting for relative links.\n   *\n   * @returns {Object} html5Mode object if used as getter or itself (chaining) if used as setter\n   */\n  this.html5Mode = function(mode) {\n    if (isBoolean(mode)) {\n      html5Mode.enabled = mode;\n      return this;\n    } else if (isObject(mode)) {\n\n      if (isBoolean(mode.enabled)) {\n        html5Mode.enabled = mode.enabled;\n      }\n\n      if (isBoolean(mode.requireBase)) {\n        html5Mode.requireBase = mode.requireBase;\n      }\n\n      if (isBoolean(mode.rewriteLinks)) {\n        html5Mode.rewriteLinks = mode.rewriteLinks;\n      }\n\n      return this;\n    } else {\n      return html5Mode;\n    }\n  };\n\n  /**\n   * @ngdoc event\n   * @name $location#$locationChangeStart\n   * @eventType broadcast on root scope\n   * @description\n   * Broadcasted before a URL will change.\n   *\n   * This change can be prevented by calling\n   * `preventDefault` method of the event. See {@link ng.$rootScope.Scope#$on} for more\n   * details about event object. Upon successful change\n   * {@link ng.$location#$locationChangeSuccess $locationChangeSuccess} is fired.\n   *\n   * The `newState` and `oldState` parameters may be defined only in HTML5 mode and when\n   * the browser supports the HTML5 History API.\n   *\n   * @param {Object} angularEvent Synthetic event object.\n   * @param {string} newUrl New URL\n   * @param {string=} oldUrl URL that was before it was changed.\n   * @param {string=} newState New history state object\n   * @param {string=} oldState History state object that was before it was changed.\n   */\n\n  /**\n   * @ngdoc event\n   * @name $location#$locationChangeSuccess\n   * @eventType broadcast on root scope\n   * @description\n   * Broadcasted after a URL was changed.\n   *\n   * The `newState` and `oldState` parameters may be defined only in HTML5 mode and when\n   * the browser supports the HTML5 History API.\n   *\n   * @param {Object} angularEvent Synthetic event object.\n   * @param {string} newUrl New URL\n   * @param {string=} oldUrl URL that was before it was changed.\n   * @param {string=} newState New history state object\n   * @param {string=} oldState History state object that was before it was changed.\n   */\n\n  this.$get = ['$rootScope', '$browser', '$sniffer', '$rootElement', '$window',\n      function($rootScope, $browser, $sniffer, $rootElement, $window) {\n    var $location,\n        LocationMode,\n        baseHref = $browser.baseHref(), // if base[href] is undefined, it defaults to ''\n        initialUrl = $browser.url(),\n        appBase;\n\n    if (html5Mode.enabled) {\n      if (!baseHref && html5Mode.requireBase) {\n        throw $locationMinErr('nobase',\n          \"$location in HTML5 mode requires a <base> tag to be present!\");\n      }\n      appBase = serverBase(initialUrl) + (baseHref || '/');\n      LocationMode = $sniffer.history ? LocationHtml5Url : LocationHashbangInHtml5Url;\n    } else {\n      appBase = stripHash(initialUrl);\n      LocationMode = LocationHashbangUrl;\n    }\n    var appBaseNoFile = stripFile(appBase);\n\n    $location = new LocationMode(appBase, appBaseNoFile, '#' + hashPrefix);\n    $location.$$parseLinkUrl(initialUrl, initialUrl);\n\n    $location.$$state = $browser.state();\n\n    var IGNORE_URI_REGEXP = /^\\s*(javascript|mailto):/i;\n\n    function setBrowserUrlWithFallback(url, replace, state) {\n      var oldUrl = $location.url();\n      var oldState = $location.$$state;\n      try {\n        $browser.url(url, replace, state);\n\n        // Make sure $location.state() returns referentially identical (not just deeply equal)\n        // state object; this makes possible quick checking if the state changed in the digest\n        // loop. Checking deep equality would be too expensive.\n        $location.$$state = $browser.state();\n      } catch (e) {\n        // Restore old values if pushState fails\n        $location.url(oldUrl);\n        $location.$$state = oldState;\n\n        throw e;\n      }\n    }\n\n    $rootElement.on('click', function(event) {\n      // TODO(vojta): rewrite link when opening in new tab/window (in legacy browser)\n      // currently we open nice url link and redirect then\n\n      if (!html5Mode.rewriteLinks || event.ctrlKey || event.metaKey || event.shiftKey || event.which == 2 || event.button == 2) return;\n\n      var elm = jqLite(event.target);\n\n      // traverse the DOM up to find first A tag\n      while (nodeName_(elm[0]) !== 'a') {\n        // ignore rewriting if no A tag (reached root element, or no parent - removed from document)\n        if (elm[0] === $rootElement[0] || !(elm = elm.parent())[0]) return;\n      }\n\n      var absHref = elm.prop('href');\n      // get the actual href attribute - see\n      // http://msdn.microsoft.com/en-us/library/ie/dd347148(v=vs.85).aspx\n      var relHref = elm.attr('href') || elm.attr('xlink:href');\n\n      if (isObject(absHref) && absHref.toString() === '[object SVGAnimatedString]') {\n        // SVGAnimatedString.animVal should be identical to SVGAnimatedString.baseVal, unless during\n        // an animation.\n        absHref = urlResolve(absHref.animVal).href;\n      }\n\n      // Ignore when url is started with javascript: or mailto:\n      if (IGNORE_URI_REGEXP.test(absHref)) return;\n\n      if (absHref && !elm.attr('target') && !event.isDefaultPrevented()) {\n        if ($location.$$parseLinkUrl(absHref, relHref)) {\n          // We do a preventDefault for all urls that are part of the angular application,\n          // in html5mode and also without, so that we are able to abort navigation without\n          // getting double entries in the location history.\n          event.preventDefault();\n          // update location manually\n          if ($location.absUrl() != $browser.url()) {\n            $rootScope.$apply();\n            // hack to work around FF6 bug 684208 when scenario runner clicks on links\n            $window.angular['ff-684208-preventDefault'] = true;\n          }\n        }\n      }\n    });\n\n\n    // rewrite hashbang url <> html5 url\n    if (trimEmptyHash($location.absUrl()) != trimEmptyHash(initialUrl)) {\n      $browser.url($location.absUrl(), true);\n    }\n\n    var initializing = true;\n\n    // update $location when $browser url changes\n    $browser.onUrlChange(function(newUrl, newState) {\n\n      if (isUndefined(beginsWith(appBaseNoFile, newUrl))) {\n        // If we are navigating outside of the app then force a reload\n        $window.location.href = newUrl;\n        return;\n      }\n\n      $rootScope.$evalAsync(function() {\n        var oldUrl = $location.absUrl();\n        var oldState = $location.$$state;\n        var defaultPrevented;\n        newUrl = trimEmptyHash(newUrl);\n        $location.$$parse(newUrl);\n        $location.$$state = newState;\n\n        defaultPrevented = $rootScope.$broadcast('$locationChangeStart', newUrl, oldUrl,\n            newState, oldState).defaultPrevented;\n\n        // if the location was changed by a `$locationChangeStart` handler then stop\n        // processing this location change\n        if ($location.absUrl() !== newUrl) return;\n\n        if (defaultPrevented) {\n          $location.$$parse(oldUrl);\n          $location.$$state = oldState;\n          setBrowserUrlWithFallback(oldUrl, false, oldState);\n        } else {\n          initializing = false;\n          afterLocationChange(oldUrl, oldState);\n        }\n      });\n      if (!$rootScope.$$phase) $rootScope.$digest();\n    });\n\n    // update browser\n    $rootScope.$watch(function $locationWatch() {\n      var oldUrl = trimEmptyHash($browser.url());\n      var newUrl = trimEmptyHash($location.absUrl());\n      var oldState = $browser.state();\n      var currentReplace = $location.$$replace;\n      var urlOrStateChanged = oldUrl !== newUrl ||\n        ($location.$$html5 && $sniffer.history && oldState !== $location.$$state);\n\n      if (initializing || urlOrStateChanged) {\n        initializing = false;\n\n        $rootScope.$evalAsync(function() {\n          var newUrl = $location.absUrl();\n          var defaultPrevented = $rootScope.$broadcast('$locationChangeStart', newUrl, oldUrl,\n              $location.$$state, oldState).defaultPrevented;\n\n          // if the location was changed by a `$locationChangeStart` handler then stop\n          // processing this location change\n          if ($location.absUrl() !== newUrl) return;\n\n          if (defaultPrevented) {\n            $location.$$parse(oldUrl);\n            $location.$$state = oldState;\n          } else {\n            if (urlOrStateChanged) {\n              setBrowserUrlWithFallback(newUrl, currentReplace,\n                                        oldState === $location.$$state ? null : $location.$$state);\n            }\n            afterLocationChange(oldUrl, oldState);\n          }\n        });\n      }\n\n      $location.$$replace = false;\n\n      // we don't need to return anything because $evalAsync will make the digest loop dirty when\n      // there is a change\n    });\n\n    return $location;\n\n    function afterLocationChange(oldUrl, oldState) {\n      $rootScope.$broadcast('$locationChangeSuccess', $location.absUrl(), oldUrl,\n        $location.$$state, oldState);\n    }\n}];\n}\n\n/**\n * @ngdoc service\n * @name $log\n * @requires $window\n *\n * @description\n * Simple service for logging. Default implementation safely writes the message\n * into the browser's console (if present).\n *\n * The main purpose of this service is to simplify debugging and troubleshooting.\n *\n * The default is to log `debug` messages. You can use\n * {@link ng.$logProvider ng.$logProvider#debugEnabled} to change this.\n *\n * @example\n   <example module=\"logExample\">\n     <file name=\"script.js\">\n       angular.module('logExample', [])\n         .controller('LogController', ['$scope', '$log', function($scope, $log) {\n           $scope.$log = $log;\n           $scope.message = 'Hello World!';\n         }]);\n     </file>\n     <file name=\"index.html\">\n       <div ng-controller=\"LogController\">\n         <p>Reload this page with open console, enter text and hit the log button...</p>\n         <label>Message:\n         <input type=\"text\" ng-model=\"message\" /></label>\n         <button ng-click=\"$log.log(message)\">log</button>\n         <button ng-click=\"$log.warn(message)\">warn</button>\n         <button ng-click=\"$log.info(message)\">info</button>\n         <button ng-click=\"$log.error(message)\">error</button>\n         <button ng-click=\"$log.debug(message)\">debug</button>\n       </div>\n     </file>\n   </example>\n */\n\n/**\n * @ngdoc provider\n * @name $logProvider\n * @description\n * Use the `$logProvider` to configure how the application logs messages\n */\nfunction $LogProvider() {\n  var debug = true,\n      self = this;\n\n  /**\n   * @ngdoc method\n   * @name $logProvider#debugEnabled\n   * @description\n   * @param {boolean=} flag enable or disable debug level messages\n   * @returns {*} current value if used as getter or itself (chaining) if used as setter\n   */\n  this.debugEnabled = function(flag) {\n    if (isDefined(flag)) {\n      debug = flag;\n    return this;\n    } else {\n      return debug;\n    }\n  };\n\n  this.$get = ['$window', function($window) {\n    return {\n      /**\n       * @ngdoc method\n       * @name $log#log\n       *\n       * @description\n       * Write a log message\n       */\n      log: consoleLog('log'),\n\n      /**\n       * @ngdoc method\n       * @name $log#info\n       *\n       * @description\n       * Write an information message\n       */\n      info: consoleLog('info'),\n\n      /**\n       * @ngdoc method\n       * @name $log#warn\n       *\n       * @description\n       * Write a warning message\n       */\n      warn: consoleLog('warn'),\n\n      /**\n       * @ngdoc method\n       * @name $log#error\n       *\n       * @description\n       * Write an error message\n       */\n      error: consoleLog('error'),\n\n      /**\n       * @ngdoc method\n       * @name $log#debug\n       *\n       * @description\n       * Write a debug message\n       */\n      debug: (function() {\n        var fn = consoleLog('debug');\n\n        return function() {\n          if (debug) {\n            fn.apply(self, arguments);\n          }\n        };\n      }())\n    };\n\n    function formatError(arg) {\n      if (arg instanceof Error) {\n        if (arg.stack) {\n          arg = (arg.message && arg.stack.indexOf(arg.message) === -1)\n              ? 'Error: ' + arg.message + '\\n' + arg.stack\n              : arg.stack;\n        } else if (arg.sourceURL) {\n          arg = arg.message + '\\n' + arg.sourceURL + ':' + arg.line;\n        }\n      }\n      return arg;\n    }\n\n    function consoleLog(type) {\n      var console = $window.console || {},\n          logFn = console[type] || console.log || noop,\n          hasApply = false;\n\n      // Note: reading logFn.apply throws an error in IE11 in IE8 document mode.\n      // The reason behind this is that console.log has type \"object\" in IE8...\n      try {\n        hasApply = !!logFn.apply;\n      } catch (e) {}\n\n      if (hasApply) {\n        return function() {\n          var args = [];\n          forEach(arguments, function(arg) {\n            args.push(formatError(arg));\n          });\n          return logFn.apply(console, args);\n        };\n      }\n\n      // we are IE which either doesn't have window.console => this is noop and we do nothing,\n      // or we are IE where console.log doesn't have apply so we log at least first 2 args\n      return function(arg1, arg2) {\n        logFn(arg1, arg2 == null ? '' : arg2);\n      };\n    }\n  }];\n}\n\n/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n *     Any commits to this file should be reviewed with security in mind.  *\n *   Changes to this file can potentially create security vulnerabilities. *\n *          An approval from 2 Core members with history of modifying      *\n *                         this file is required.                          *\n *                                                                         *\n *  Does the change somehow allow for arbitrary javascript to be executed? *\n *    Or allows for someone to change the prototype of built-in objects?   *\n *     Or gives undesired access to variables likes document or window?    *\n * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */\n\nvar $parseMinErr = minErr('$parse');\n\n// Sandboxing Angular Expressions\n// ------------------------------\n// Angular expressions are generally considered safe because these expressions only have direct\n// access to `$scope` and locals. However, one can obtain the ability to execute arbitrary JS code by\n// obtaining a reference to native JS functions such as the Function constructor.\n//\n// As an example, consider the following Angular expression:\n//\n//   {}.toString.constructor('alert(\"evil JS code\")')\n//\n// This sandboxing technique is not perfect and doesn't aim to be. The goal is to prevent exploits\n// against the expression language, but not to prevent exploits that were enabled by exposing\n// sensitive JavaScript or browser APIs on Scope. Exposing such objects on a Scope is never a good\n// practice and therefore we are not even trying to protect against interaction with an object\n// explicitly exposed in this way.\n//\n// In general, it is not possible to access a Window object from an angular expression unless a\n// window or some DOM object that has a reference to window is published onto a Scope.\n// Similarly we prevent invocations of function known to be dangerous, as well as assignments to\n// native objects.\n//\n// See https://docs.angularjs.org/guide/security\n\n\nfunction ensureSafeMemberName(name, fullExpression) {\n  if (name === \"__defineGetter__\" || name === \"__defineSetter__\"\n      || name === \"__lookupGetter__\" || name === \"__lookupSetter__\"\n      || name === \"__proto__\") {\n    throw $parseMinErr('isecfld',\n        'Attempting to access a disallowed field in Angular expressions! '\n        + 'Expression: {0}', fullExpression);\n  }\n  return name;\n}\n\nfunction getStringValue(name) {\n  // Property names must be strings. This means that non-string objects cannot be used\n  // as keys in an object. Any non-string object, including a number, is typecasted\n  // into a string via the toString method.\n  // -- MDN, https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Operators/Property_accessors#Property_names\n  //\n  // So, to ensure that we are checking the same `name` that JavaScript would use, we cast it\n  // to a string. It's not always possible. If `name` is an object and its `toString` method is\n  // 'broken' (doesn't return a string, isn't a function, etc.), an error will be thrown:\n  //\n  // TypeError: Cannot convert object to primitive value\n  //\n  // For performance reasons, we don't catch this error here and allow it to propagate up the call\n  // stack. Note that you'll get the same error in JavaScript if you try to access a property using\n  // such a 'broken' object as a key.\n  return name + '';\n}\n\nfunction ensureSafeObject(obj, fullExpression) {\n  // nifty check if obj is Function that is fast and works across iframes and other contexts\n  if (obj) {\n    if (obj.constructor === obj) {\n      throw $parseMinErr('isecfn',\n          'Referencing Function in Angular expressions is disallowed! Expression: {0}',\n          fullExpression);\n    } else if (// isWindow(obj)\n        obj.window === obj) {\n      throw $parseMinErr('isecwindow',\n          'Referencing the Window in Angular expressions is disallowed! Expression: {0}',\n          fullExpression);\n    } else if (// isElement(obj)\n        obj.children && (obj.nodeName || (obj.prop && obj.attr && obj.find))) {\n      throw $parseMinErr('isecdom',\n          'Referencing DOM nodes in Angular expressions is disallowed! Expression: {0}',\n          fullExpression);\n    } else if (// block Object so that we can't get hold of dangerous Object.* methods\n        obj === Object) {\n      throw $parseMinErr('isecobj',\n          'Referencing Object in Angular expressions is disallowed! Expression: {0}',\n          fullExpression);\n    }\n  }\n  return obj;\n}\n\nvar CALL = Function.prototype.call;\nvar APPLY = Function.prototype.apply;\nvar BIND = Function.prototype.bind;\n\nfunction ensureSafeFunction(obj, fullExpression) {\n  if (obj) {\n    if (obj.constructor === obj) {\n      throw $parseMinErr('isecfn',\n        'Referencing Function in Angular expressions is disallowed! Expression: {0}',\n        fullExpression);\n    } else if (obj === CALL || obj === APPLY || obj === BIND) {\n      throw $parseMinErr('isecff',\n        'Referencing call, apply or bind in Angular expressions is disallowed! Expression: {0}',\n        fullExpression);\n    }\n  }\n}\n\nfunction ensureSafeAssignContext(obj, fullExpression) {\n  if (obj) {\n    if (obj === (0).constructor || obj === (false).constructor || obj === ''.constructor ||\n        obj === {}.constructor || obj === [].constructor || obj === Function.constructor) {\n      throw $parseMinErr('isecaf',\n        'Assigning to a constructor is disallowed! Expression: {0}', fullExpression);\n    }\n  }\n}\n\nvar OPERATORS = createMap();\nforEach('+ - * / % === !== == != < > <= >= && || ! = |'.split(' '), function(operator) { OPERATORS[operator] = true; });\nvar ESCAPE = {\"n\":\"\\n\", \"f\":\"\\f\", \"r\":\"\\r\", \"t\":\"\\t\", \"v\":\"\\v\", \"'\":\"'\", '\"':'\"'};\n\n\n/////////////////////////////////////////\n\n\n/**\n * @constructor\n */\nvar Lexer = function(options) {\n  this.options = options;\n};\n\nLexer.prototype = {\n  constructor: Lexer,\n\n  lex: function(text) {\n    this.text = text;\n    this.index = 0;\n    this.tokens = [];\n\n    while (this.index < this.text.length) {\n      var ch = this.text.charAt(this.index);\n      if (ch === '\"' || ch === \"'\") {\n        this.readString(ch);\n      } else if (this.isNumber(ch) || ch === '.' && this.isNumber(this.peek())) {\n        this.readNumber();\n      } else if (this.isIdentifierStart(this.peekMultichar())) {\n        this.readIdent();\n      } else if (this.is(ch, '(){}[].,;:?')) {\n        this.tokens.push({index: this.index, text: ch});\n        this.index++;\n      } else if (this.isWhitespace(ch)) {\n        this.index++;\n      } else {\n        var ch2 = ch + this.peek();\n        var ch3 = ch2 + this.peek(2);\n        var op1 = OPERATORS[ch];\n        var op2 = OPERATORS[ch2];\n        var op3 = OPERATORS[ch3];\n        if (op1 || op2 || op3) {\n          var token = op3 ? ch3 : (op2 ? ch2 : ch);\n          this.tokens.push({index: this.index, text: token, operator: true});\n          this.index += token.length;\n        } else {\n          this.throwError('Unexpected next character ', this.index, this.index + 1);\n        }\n      }\n    }\n    return this.tokens;\n  },\n\n  is: function(ch, chars) {\n    return chars.indexOf(ch) !== -1;\n  },\n\n  peek: function(i) {\n    var num = i || 1;\n    return (this.index + num < this.text.length) ? this.text.charAt(this.index + num) : false;\n  },\n\n  isNumber: function(ch) {\n    return ('0' <= ch && ch <= '9') && typeof ch === \"string\";\n  },\n\n  isWhitespace: function(ch) {\n    // IE treats non-breaking space as \\u00A0\n    return (ch === ' ' || ch === '\\r' || ch === '\\t' ||\n            ch === '\\n' || ch === '\\v' || ch === '\\u00A0');\n  },\n\n  isIdentifierStart: function(ch) {\n    return this.options.isIdentifierStart ?\n        this.options.isIdentifierStart(ch, this.codePointAt(ch)) :\n        this.isValidIdentifierStart(ch);\n  },\n\n  isValidIdentifierStart: function(ch) {\n    return ('a' <= ch && ch <= 'z' ||\n            'A' <= ch && ch <= 'Z' ||\n            '_' === ch || ch === '$');\n  },\n\n  isIdentifierContinue: function(ch) {\n    return this.options.isIdentifierContinue ?\n        this.options.isIdentifierContinue(ch, this.codePointAt(ch)) :\n        this.isValidIdentifierContinue(ch);\n  },\n\n  isValidIdentifierContinue: function(ch, cp) {\n    return this.isValidIdentifierStart(ch, cp) || this.isNumber(ch);\n  },\n\n  codePointAt: function(ch) {\n    if (ch.length === 1) return ch.charCodeAt(0);\n    /*jshint bitwise: false*/\n    return (ch.charCodeAt(0) << 10) + ch.charCodeAt(1) - 0x35FDC00;\n    /*jshint bitwise: true*/\n  },\n\n  peekMultichar: function() {\n    var ch = this.text.charAt(this.index);\n    var peek = this.peek();\n    if (!peek) {\n      return ch;\n    }\n    var cp1 = ch.charCodeAt(0);\n    var cp2 = peek.charCodeAt(0);\n    if (cp1 >= 0xD800 && cp1 <= 0xDBFF && cp2 >= 0xDC00 && cp2 <= 0xDFFF) {\n      return ch + peek;\n    }\n    return ch;\n  },\n\n  isExpOperator: function(ch) {\n    return (ch === '-' || ch === '+' || this.isNumber(ch));\n  },\n\n  throwError: function(error, start, end) {\n    end = end || this.index;\n    var colStr = (isDefined(start)\n            ? 's ' + start +  '-' + this.index + ' [' + this.text.substring(start, end) + ']'\n            : ' ' + end);\n    throw $parseMinErr('lexerr', 'Lexer Error: {0} at column{1} in expression [{2}].',\n        error, colStr, this.text);\n  },\n\n  readNumber: function() {\n    var number = '';\n    var start = this.index;\n    while (this.index < this.text.length) {\n      var ch = lowercase(this.text.charAt(this.index));\n      if (ch == '.' || this.isNumber(ch)) {\n        number += ch;\n      } else {\n        var peekCh = this.peek();\n        if (ch == 'e' && this.isExpOperator(peekCh)) {\n          number += ch;\n        } else if (this.isExpOperator(ch) &&\n            peekCh && this.isNumber(peekCh) &&\n            number.charAt(number.length - 1) == 'e') {\n          number += ch;\n        } else if (this.isExpOperator(ch) &&\n            (!peekCh || !this.isNumber(peekCh)) &&\n            number.charAt(number.length - 1) == 'e') {\n          this.throwError('Invalid exponent');\n        } else {\n          break;\n        }\n      }\n      this.index++;\n    }\n    this.tokens.push({\n      index: start,\n      text: number,\n      constant: true,\n      value: Number(number)\n    });\n  },\n\n  readIdent: function() {\n    var start = this.index;\n    this.index += this.peekMultichar().length;\n    while (this.index < this.text.length) {\n      var ch = this.peekMultichar();\n      if (!this.isIdentifierContinue(ch)) {\n        break;\n      }\n      this.index += ch.length;\n    }\n    this.tokens.push({\n      index: start,\n      text: this.text.slice(start, this.index),\n      identifier: true\n    });\n  },\n\n  readString: function(quote) {\n    var start = this.index;\n    this.index++;\n    var string = '';\n    var rawString = quote;\n    var escape = false;\n    while (this.index < this.text.length) {\n      var ch = this.text.charAt(this.index);\n      rawString += ch;\n      if (escape) {\n        if (ch === 'u') {\n          var hex = this.text.substring(this.index + 1, this.index + 5);\n          if (!hex.match(/[\\da-f]{4}/i)) {\n            this.throwError('Invalid unicode escape [\\\\u' + hex + ']');\n          }\n          this.index += 4;\n          string += String.fromCharCode(parseInt(hex, 16));\n        } else {\n          var rep = ESCAPE[ch];\n          string = string + (rep || ch);\n        }\n        escape = false;\n      } else if (ch === '\\\\') {\n        escape = true;\n      } else if (ch === quote) {\n        this.index++;\n        this.tokens.push({\n          index: start,\n          text: rawString,\n          constant: true,\n          value: string\n        });\n        return;\n      } else {\n        string += ch;\n      }\n      this.index++;\n    }\n    this.throwError('Unterminated quote', start);\n  }\n};\n\nvar AST = function(lexer, options) {\n  this.lexer = lexer;\n  this.options = options;\n};\n\nAST.Program = 'Program';\nAST.ExpressionStatement = 'ExpressionStatement';\nAST.AssignmentExpression = 'AssignmentExpression';\nAST.ConditionalExpression = 'ConditionalExpression';\nAST.LogicalExpression = 'LogicalExpression';\nAST.BinaryExpression = 'BinaryExpression';\nAST.UnaryExpression = 'UnaryExpression';\nAST.CallExpression = 'CallExpression';\nAST.MemberExpression = 'MemberExpression';\nAST.Identifier = 'Identifier';\nAST.Literal = 'Literal';\nAST.ArrayExpression = 'ArrayExpression';\nAST.Property = 'Property';\nAST.ObjectExpression = 'ObjectExpression';\nAST.ThisExpression = 'ThisExpression';\nAST.LocalsExpression = 'LocalsExpression';\n\n// Internal use only\nAST.NGValueParameter = 'NGValueParameter';\n\nAST.prototype = {\n  ast: function(text) {\n    this.text = text;\n    this.tokens = this.lexer.lex(text);\n\n    var value = this.program();\n\n    if (this.tokens.length !== 0) {\n      this.throwError('is an unexpected token', this.tokens[0]);\n    }\n\n    return value;\n  },\n\n  program: function() {\n    var body = [];\n    while (true) {\n      if (this.tokens.length > 0 && !this.peek('}', ')', ';', ']'))\n        body.push(this.expressionStatement());\n      if (!this.expect(';')) {\n        return { type: AST.Program, body: body};\n      }\n    }\n  },\n\n  expressionStatement: function() {\n    return { type: AST.ExpressionStatement, expression: this.filterChain() };\n  },\n\n  filterChain: function() {\n    var left = this.expression();\n    var token;\n    while ((token = this.expect('|'))) {\n      left = this.filter(left);\n    }\n    return left;\n  },\n\n  expression: function() {\n    return this.assignment();\n  },\n\n  assignment: function() {\n    var result = this.ternary();\n    if (this.expect('=')) {\n      result = { type: AST.AssignmentExpression, left: result, right: this.assignment(), operator: '='};\n    }\n    return result;\n  },\n\n  ternary: function() {\n    var test = this.logicalOR();\n    var alternate;\n    var consequent;\n    if (this.expect('?')) {\n      alternate = this.expression();\n      if (this.consume(':')) {\n        consequent = this.expression();\n        return { type: AST.ConditionalExpression, test: test, alternate: alternate, consequent: consequent};\n      }\n    }\n    return test;\n  },\n\n  logicalOR: function() {\n    var left = this.logicalAND();\n    while (this.expect('||')) {\n      left = { type: AST.LogicalExpression, operator: '||', left: left, right: this.logicalAND() };\n    }\n    return left;\n  },\n\n  logicalAND: function() {\n    var left = this.equality();\n    while (this.expect('&&')) {\n      left = { type: AST.LogicalExpression, operator: '&&', left: left, right: this.equality()};\n    }\n    return left;\n  },\n\n  equality: function() {\n    var left = this.relational();\n    var token;\n    while ((token = this.expect('==','!=','===','!=='))) {\n      left = { type: AST.BinaryExpression, operator: token.text, left: left, right: this.relational() };\n    }\n    return left;\n  },\n\n  relational: function() {\n    var left = this.additive();\n    var token;\n    while ((token = this.expect('<', '>', '<=', '>='))) {\n      left = { type: AST.BinaryExpression, operator: token.text, left: left, right: this.additive() };\n    }\n    return left;\n  },\n\n  additive: function() {\n    var left = this.multiplicative();\n    var token;\n    while ((token = this.expect('+','-'))) {\n      left = { type: AST.BinaryExpression, operator: token.text, left: left, right: this.multiplicative() };\n    }\n    return left;\n  },\n\n  multiplicative: function() {\n    var left = this.unary();\n    var token;\n    while ((token = this.expect('*','/','%'))) {\n      left = { type: AST.BinaryExpression, operator: token.text, left: left, right: this.unary() };\n    }\n    return left;\n  },\n\n  unary: function() {\n    var token;\n    if ((token = this.expect('+', '-', '!'))) {\n      return { type: AST.UnaryExpression, operator: token.text, prefix: true, argument: this.unary() };\n    } else {\n      return this.primary();\n    }\n  },\n\n  primary: function() {\n    var primary;\n    if (this.expect('(')) {\n      primary = this.filterChain();\n      this.consume(')');\n    } else if (this.expect('[')) {\n      primary = this.arrayDeclaration();\n    } else if (this.expect('{')) {\n      primary = this.object();\n    } else if (this.selfReferential.hasOwnProperty(this.peek().text)) {\n      primary = copy(this.selfReferential[this.consume().text]);\n    } else if (this.options.literals.hasOwnProperty(this.peek().text)) {\n      primary = { type: AST.Literal, value: this.options.literals[this.consume().text]};\n    } else if (this.peek().identifier) {\n      primary = this.identifier();\n    } else if (this.peek().constant) {\n      primary = this.constant();\n    } else {\n      this.throwError('not a primary expression', this.peek());\n    }\n\n    var next;\n    while ((next = this.expect('(', '[', '.'))) {\n      if (next.text === '(') {\n        primary = {type: AST.CallExpression, callee: primary, arguments: this.parseArguments() };\n        this.consume(')');\n      } else if (next.text === '[') {\n        primary = { type: AST.MemberExpression, object: primary, property: this.expression(), computed: true };\n        this.consume(']');\n      } else if (next.text === '.') {\n        primary = { type: AST.MemberExpression, object: primary, property: this.identifier(), computed: false };\n      } else {\n        this.throwError('IMPOSSIBLE');\n      }\n    }\n    return primary;\n  },\n\n  filter: function(baseExpression) {\n    var args = [baseExpression];\n    var result = {type: AST.CallExpression, callee: this.identifier(), arguments: args, filter: true};\n\n    while (this.expect(':')) {\n      args.push(this.expression());\n    }\n\n    return result;\n  },\n\n  parseArguments: function() {\n    var args = [];\n    if (this.peekToken().text !== ')') {\n      do {\n        args.push(this.expression());\n      } while (this.expect(','));\n    }\n    return args;\n  },\n\n  identifier: function() {\n    var token = this.consume();\n    if (!token.identifier) {\n      this.throwError('is not a valid identifier', token);\n    }\n    return { type: AST.Identifier, name: token.text };\n  },\n\n  constant: function() {\n    // TODO check that it is a constant\n    return { type: AST.Literal, value: this.consume().value };\n  },\n\n  arrayDeclaration: function() {\n    var elements = [];\n    if (this.peekToken().text !== ']') {\n      do {\n        if (this.peek(']')) {\n          // Support trailing commas per ES5.1.\n          break;\n        }\n        elements.push(this.expression());\n      } while (this.expect(','));\n    }\n    this.consume(']');\n\n    return { type: AST.ArrayExpression, elements: elements };\n  },\n\n  object: function() {\n    var properties = [], property;\n    if (this.peekToken().text !== '}') {\n      do {\n        if (this.peek('}')) {\n          // Support trailing commas per ES5.1.\n          break;\n        }\n        property = {type: AST.Property, kind: 'init'};\n        if (this.peek().constant) {\n          property.key = this.constant();\n        } else if (this.peek().identifier) {\n          property.key = this.identifier();\n        } else {\n          this.throwError(\"invalid key\", this.peek());\n        }\n        this.consume(':');\n        property.value = this.expression();\n        properties.push(property);\n      } while (this.expect(','));\n    }\n    this.consume('}');\n\n    return {type: AST.ObjectExpression, properties: properties };\n  },\n\n  throwError: function(msg, token) {\n    throw $parseMinErr('syntax',\n        'Syntax Error: Token \\'{0}\\' {1} at column {2} of the expression [{3}] starting at [{4}].',\n          token.text, msg, (token.index + 1), this.text, this.text.substring(token.index));\n  },\n\n  consume: function(e1) {\n    if (this.tokens.length === 0) {\n      throw $parseMinErr('ueoe', 'Unexpected end of expression: {0}', this.text);\n    }\n\n    var token = this.expect(e1);\n    if (!token) {\n      this.throwError('is unexpected, expecting [' + e1 + ']', this.peek());\n    }\n    return token;\n  },\n\n  peekToken: function() {\n    if (this.tokens.length === 0) {\n      throw $parseMinErr('ueoe', 'Unexpected end of expression: {0}', this.text);\n    }\n    return this.tokens[0];\n  },\n\n  peek: function(e1, e2, e3, e4) {\n    return this.peekAhead(0, e1, e2, e3, e4);\n  },\n\n  peekAhead: function(i, e1, e2, e3, e4) {\n    if (this.tokens.length > i) {\n      var token = this.tokens[i];\n      var t = token.text;\n      if (t === e1 || t === e2 || t === e3 || t === e4 ||\n          (!e1 && !e2 && !e3 && !e4)) {\n        return token;\n      }\n    }\n    return false;\n  },\n\n  expect: function(e1, e2, e3, e4) {\n    var token = this.peek(e1, e2, e3, e4);\n    if (token) {\n      this.tokens.shift();\n      return token;\n    }\n    return false;\n  },\n\n  selfReferential: {\n    'this': {type: AST.ThisExpression },\n    '$locals': {type: AST.LocalsExpression }\n  }\n};\n\nfunction ifDefined(v, d) {\n  return typeof v !== 'undefined' ? v : d;\n}\n\nfunction plusFn(l, r) {\n  if (typeof l === 'undefined') return r;\n  if (typeof r === 'undefined') return l;\n  return l + r;\n}\n\nfunction isStateless($filter, filterName) {\n  var fn = $filter(filterName);\n  return !fn.$stateful;\n}\n\nfunction findConstantAndWatchExpressions(ast, $filter) {\n  var allConstants;\n  var argsToWatch;\n  switch (ast.type) {\n  case AST.Program:\n    allConstants = true;\n    forEach(ast.body, function(expr) {\n      findConstantAndWatchExpressions(expr.expression, $filter);\n      allConstants = allConstants && expr.expression.constant;\n    });\n    ast.constant = allConstants;\n    break;\n  case AST.Literal:\n    ast.constant = true;\n    ast.toWatch = [];\n    break;\n  case AST.UnaryExpression:\n    findConstantAndWatchExpressions(ast.argument, $filter);\n    ast.constant = ast.argument.constant;\n    ast.toWatch = ast.argument.toWatch;\n    break;\n  case AST.BinaryExpression:\n    findConstantAndWatchExpressions(ast.left, $filter);\n    findConstantAndWatchExpressions(ast.right, $filter);\n    ast.constant = ast.left.constant && ast.right.constant;\n    ast.toWatch = ast.left.toWatch.concat(ast.right.toWatch);\n    break;\n  case AST.LogicalExpression:\n    findConstantAndWatchExpressions(ast.left, $filter);\n    findConstantAndWatchExpressions(ast.right, $filter);\n    ast.constant = ast.left.constant && ast.right.constant;\n    ast.toWatch = ast.constant ? [] : [ast];\n    break;\n  case AST.ConditionalExpression:\n    findConstantAndWatchExpressions(ast.test, $filter);\n    findConstantAndWatchExpressions(ast.alternate, $filter);\n    findConstantAndWatchExpressions(ast.consequent, $filter);\n    ast.constant = ast.test.constant && ast.alternate.constant && ast.consequent.constant;\n    ast.toWatch = ast.constant ? [] : [ast];\n    break;\n  case AST.Identifier:\n    ast.constant = false;\n    ast.toWatch = [ast];\n    break;\n  case AST.MemberExpression:\n    findConstantAndWatchExpressions(ast.object, $filter);\n    if (ast.computed) {\n      findConstantAndWatchExpressions(ast.property, $filter);\n    }\n    ast.constant = ast.object.constant && (!ast.computed || ast.property.constant);\n    ast.toWatch = [ast];\n    break;\n  case AST.CallExpression:\n    allConstants = ast.filter ? isStateless($filter, ast.callee.name) : false;\n    argsToWatch = [];\n    forEach(ast.arguments, function(expr) {\n      findConstantAndWatchExpressions(expr, $filter);\n      allConstants = allConstants && expr.constant;\n      if (!expr.constant) {\n        argsToWatch.push.apply(argsToWatch, expr.toWatch);\n      }\n    });\n    ast.constant = allConstants;\n    ast.toWatch = ast.filter && isStateless($filter, ast.callee.name) ? argsToWatch : [ast];\n    break;\n  case AST.AssignmentExpression:\n    findConstantAndWatchExpressions(ast.left, $filter);\n    findConstantAndWatchExpressions(ast.right, $filter);\n    ast.constant = ast.left.constant && ast.right.constant;\n    ast.toWatch = [ast];\n    break;\n  case AST.ArrayExpression:\n    allConstants = true;\n    argsToWatch = [];\n    forEach(ast.elements, function(expr) {\n      findConstantAndWatchExpressions(expr, $filter);\n      allConstants = allConstants && expr.constant;\n      if (!expr.constant) {\n        argsToWatch.push.apply(argsToWatch, expr.toWatch);\n      }\n    });\n    ast.constant = allConstants;\n    ast.toWatch = argsToWatch;\n    break;\n  case AST.ObjectExpression:\n    allConstants = true;\n    argsToWatch = [];\n    forEach(ast.properties, function(property) {\n      findConstantAndWatchExpressions(property.value, $filter);\n      allConstants = allConstants && property.value.constant;\n      if (!property.value.constant) {\n        argsToWatch.push.apply(argsToWatch, property.value.toWatch);\n      }\n    });\n    ast.constant = allConstants;\n    ast.toWatch = argsToWatch;\n    break;\n  case AST.ThisExpression:\n    ast.constant = false;\n    ast.toWatch = [];\n    break;\n  case AST.LocalsExpression:\n    ast.constant = false;\n    ast.toWatch = [];\n    break;\n  }\n}\n\nfunction getInputs(body) {\n  if (body.length != 1) return;\n  var lastExpression = body[0].expression;\n  var candidate = lastExpression.toWatch;\n  if (candidate.length !== 1) return candidate;\n  return candidate[0] !== lastExpression ? candidate : undefined;\n}\n\nfunction isAssignable(ast) {\n  return ast.type === AST.Identifier || ast.type === AST.MemberExpression;\n}\n\nfunction assignableAST(ast) {\n  if (ast.body.length === 1 && isAssignable(ast.body[0].expression)) {\n    return {type: AST.AssignmentExpression, left: ast.body[0].expression, right: {type: AST.NGValueParameter}, operator: '='};\n  }\n}\n\nfunction isLiteral(ast) {\n  return ast.body.length === 0 ||\n      ast.body.length === 1 && (\n      ast.body[0].expression.type === AST.Literal ||\n      ast.body[0].expression.type === AST.ArrayExpression ||\n      ast.body[0].expression.type === AST.ObjectExpression);\n}\n\nfunction isConstant(ast) {\n  return ast.constant;\n}\n\nfunction ASTCompiler(astBuilder, $filter) {\n  this.astBuilder = astBuilder;\n  this.$filter = $filter;\n}\n\nASTCompiler.prototype = {\n  compile: function(expression, expensiveChecks) {\n    var self = this;\n    var ast = this.astBuilder.ast(expression);\n    this.state = {\n      nextId: 0,\n      filters: {},\n      expensiveChecks: expensiveChecks,\n      fn: {vars: [], body: [], own: {}},\n      assign: {vars: [], body: [], own: {}},\n      inputs: []\n    };\n    findConstantAndWatchExpressions(ast, self.$filter);\n    var extra = '';\n    var assignable;\n    this.stage = 'assign';\n    if ((assignable = assignableAST(ast))) {\n      this.state.computing = 'assign';\n      var result = this.nextId();\n      this.recurse(assignable, result);\n      this.return_(result);\n      extra = 'fn.assign=' + this.generateFunction('assign', 's,v,l');\n    }\n    var toWatch = getInputs(ast.body);\n    self.stage = 'inputs';\n    forEach(toWatch, function(watch, key) {\n      var fnKey = 'fn' + key;\n      self.state[fnKey] = {vars: [], body: [], own: {}};\n      self.state.computing = fnKey;\n      var intoId = self.nextId();\n      self.recurse(watch, intoId);\n      self.return_(intoId);\n      self.state.inputs.push(fnKey);\n      watch.watchId = key;\n    });\n    this.state.computing = 'fn';\n    this.stage = 'main';\n    this.recurse(ast);\n    var fnString =\n      // The build and minification steps remove the string \"use strict\" from the code, but this is done using a regex.\n      // This is a workaround for this until we do a better job at only removing the prefix only when we should.\n      '\"' + this.USE + ' ' + this.STRICT + '\";\\n' +\n      this.filterPrefix() +\n      'var fn=' + this.generateFunction('fn', 's,l,a,i') +\n      extra +\n      this.watchFns() +\n      'return fn;';\n\n    /* jshint -W054 */\n    var fn = (new Function('$filter',\n        'ensureSafeMemberName',\n        'ensureSafeObject',\n        'ensureSafeFunction',\n        'getStringValue',\n        'ensureSafeAssignContext',\n        'ifDefined',\n        'plus',\n        'text',\n        fnString))(\n          this.$filter,\n          ensureSafeMemberName,\n          ensureSafeObject,\n          ensureSafeFunction,\n          getStringValue,\n          ensureSafeAssignContext,\n          ifDefined,\n          plusFn,\n          expression);\n    /* jshint +W054 */\n    this.state = this.stage = undefined;\n    fn.literal = isLiteral(ast);\n    fn.constant = isConstant(ast);\n    return fn;\n  },\n\n  USE: 'use',\n\n  STRICT: 'strict',\n\n  watchFns: function() {\n    var result = [];\n    var fns = this.state.inputs;\n    var self = this;\n    forEach(fns, function(name) {\n      result.push('var ' + name + '=' + self.generateFunction(name, 's'));\n    });\n    if (fns.length) {\n      result.push('fn.inputs=[' + fns.join(',') + '];');\n    }\n    return result.join('');\n  },\n\n  generateFunction: function(name, params) {\n    return 'function(' + params + '){' +\n        this.varsPrefix(name) +\n        this.body(name) +\n        '};';\n  },\n\n  filterPrefix: function() {\n    var parts = [];\n    var self = this;\n    forEach(this.state.filters, function(id, filter) {\n      parts.push(id + '=$filter(' + self.escape(filter) + ')');\n    });\n    if (parts.length) return 'var ' + parts.join(',') + ';';\n    return '';\n  },\n\n  varsPrefix: function(section) {\n    return this.state[section].vars.length ? 'var ' + this.state[section].vars.join(',') + ';' : '';\n  },\n\n  body: function(section) {\n    return this.state[section].body.join('');\n  },\n\n  recurse: function(ast, intoId, nameId, recursionFn, create, skipWatchIdCheck) {\n    var left, right, self = this, args, expression;\n    recursionFn = recursionFn || noop;\n    if (!skipWatchIdCheck && isDefined(ast.watchId)) {\n      intoId = intoId || this.nextId();\n      this.if_('i',\n        this.lazyAssign(intoId, this.computedMember('i', ast.watchId)),\n        this.lazyRecurse(ast, intoId, nameId, recursionFn, create, true)\n      );\n      return;\n    }\n    switch (ast.type) {\n    case AST.Program:\n      forEach(ast.body, function(expression, pos) {\n        self.recurse(expression.expression, undefined, undefined, function(expr) { right = expr; });\n        if (pos !== ast.body.length - 1) {\n          self.current().body.push(right, ';');\n        } else {\n          self.return_(right);\n        }\n      });\n      break;\n    case AST.Literal:\n      expression = this.escape(ast.value);\n      this.assign(intoId, expression);\n      recursionFn(expression);\n      break;\n    case AST.UnaryExpression:\n      this.recurse(ast.argument, undefined, undefined, function(expr) { right = expr; });\n      expression = ast.operator + '(' + this.ifDefined(right, 0) + ')';\n      this.assign(intoId, expression);\n      recursionFn(expression);\n      break;\n    case AST.BinaryExpression:\n      this.recurse(ast.left, undefined, undefined, function(expr) { left = expr; });\n      this.recurse(ast.right, undefined, undefined, function(expr) { right = expr; });\n      if (ast.operator === '+') {\n        expression = this.plus(left, right);\n      } else if (ast.operator === '-') {\n        expression = this.ifDefined(left, 0) + ast.operator + this.ifDefined(right, 0);\n      } else {\n        expression = '(' + left + ')' + ast.operator + '(' + right + ')';\n      }\n      this.assign(intoId, expression);\n      recursionFn(expression);\n      break;\n    case AST.LogicalExpression:\n      intoId = intoId || this.nextId();\n      self.recurse(ast.left, intoId);\n      self.if_(ast.operator === '&&' ? intoId : self.not(intoId), self.lazyRecurse(ast.right, intoId));\n      recursionFn(intoId);\n      break;\n    case AST.ConditionalExpression:\n      intoId = intoId || this.nextId();\n      self.recurse(ast.test, intoId);\n      self.if_(intoId, self.lazyRecurse(ast.alternate, intoId), self.lazyRecurse(ast.consequent, intoId));\n      recursionFn(intoId);\n      break;\n    case AST.Identifier:\n      intoId = intoId || this.nextId();\n      if (nameId) {\n        nameId.context = self.stage === 'inputs' ? 's' : this.assign(this.nextId(), this.getHasOwnProperty('l', ast.name) + '?l:s');\n        nameId.computed = false;\n        nameId.name = ast.name;\n      }\n      ensureSafeMemberName(ast.name);\n      self.if_(self.stage === 'inputs' || self.not(self.getHasOwnProperty('l', ast.name)),\n        function() {\n          self.if_(self.stage === 'inputs' || 's', function() {\n            if (create && create !== 1) {\n              self.if_(\n                self.not(self.nonComputedMember('s', ast.name)),\n                self.lazyAssign(self.nonComputedMember('s', ast.name), '{}'));\n            }\n            self.assign(intoId, self.nonComputedMember('s', ast.name));\n          });\n        }, intoId && self.lazyAssign(intoId, self.nonComputedMember('l', ast.name))\n        );\n      if (self.state.expensiveChecks || isPossiblyDangerousMemberName(ast.name)) {\n        self.addEnsureSafeObject(intoId);\n      }\n      recursionFn(intoId);\n      break;\n    case AST.MemberExpression:\n      left = nameId && (nameId.context = this.nextId()) || this.nextId();\n      intoId = intoId || this.nextId();\n      self.recurse(ast.object, left, undefined, function() {\n        self.if_(self.notNull(left), function() {\n          if (create && create !== 1) {\n            self.addEnsureSafeAssignContext(left);\n          }\n          if (ast.computed) {\n            right = self.nextId();\n            self.recurse(ast.property, right);\n            self.getStringValue(right);\n            self.addEnsureSafeMemberName(right);\n            if (create && create !== 1) {\n              self.if_(self.not(self.computedMember(left, right)), self.lazyAssign(self.computedMember(left, right), '{}'));\n            }\n            expression = self.ensureSafeObject(self.computedMember(left, right));\n            self.assign(intoId, expression);\n            if (nameId) {\n              nameId.computed = true;\n              nameId.name = right;\n            }\n          } else {\n            ensureSafeMemberName(ast.property.name);\n            if (create && create !== 1) {\n              self.if_(self.not(self.nonComputedMember(left, ast.property.name)), self.lazyAssign(self.nonComputedMember(left, ast.property.name), '{}'));\n            }\n            expression = self.nonComputedMember(left, ast.property.name);\n            if (self.state.expensiveChecks || isPossiblyDangerousMemberName(ast.property.name)) {\n              expression = self.ensureSafeObject(expression);\n            }\n            self.assign(intoId, expression);\n            if (nameId) {\n              nameId.computed = false;\n              nameId.name = ast.property.name;\n            }\n          }\n        }, function() {\n          self.assign(intoId, 'undefined');\n        });\n        recursionFn(intoId);\n      }, !!create);\n      break;\n    case AST.CallExpression:\n      intoId = intoId || this.nextId();\n      if (ast.filter) {\n        right = self.filter(ast.callee.name);\n        args = [];\n        forEach(ast.arguments, function(expr) {\n          var argument = self.nextId();\n          self.recurse(expr, argument);\n          args.push(argument);\n        });\n        expression = right + '(' + args.join(',') + ')';\n        self.assign(intoId, expression);\n        recursionFn(intoId);\n      } else {\n        right = self.nextId();\n        left = {};\n        args = [];\n        self.recurse(ast.callee, right, left, function() {\n          self.if_(self.notNull(right), function() {\n            self.addEnsureSafeFunction(right);\n            forEach(ast.arguments, function(expr) {\n              self.recurse(expr, self.nextId(), undefined, function(argument) {\n                args.push(self.ensureSafeObject(argument));\n              });\n            });\n            if (left.name) {\n              if (!self.state.expensiveChecks) {\n                self.addEnsureSafeObject(left.context);\n              }\n              expression = self.member(left.context, left.name, left.computed) + '(' + args.join(',') + ')';\n            } else {\n              expression = right + '(' + args.join(',') + ')';\n            }\n            expression = self.ensureSafeObject(expression);\n            self.assign(intoId, expression);\n          }, function() {\n            self.assign(intoId, 'undefined');\n          });\n          recursionFn(intoId);\n        });\n      }\n      break;\n    case AST.AssignmentExpression:\n      right = this.nextId();\n      left = {};\n      if (!isAssignable(ast.left)) {\n        throw $parseMinErr('lval', 'Trying to assign a value to a non l-value');\n      }\n      this.recurse(ast.left, undefined, left, function() {\n        self.if_(self.notNull(left.context), function() {\n          self.recurse(ast.right, right);\n          self.addEnsureSafeObject(self.member(left.context, left.name, left.computed));\n          self.addEnsureSafeAssignContext(left.context);\n          expression = self.member(left.context, left.name, left.computed) + ast.operator + right;\n          self.assign(intoId, expression);\n          recursionFn(intoId || expression);\n        });\n      }, 1);\n      break;\n    case AST.ArrayExpression:\n      args = [];\n      forEach(ast.elements, function(expr) {\n        self.recurse(expr, self.nextId(), undefined, function(argument) {\n          args.push(argument);\n        });\n      });\n      expression = '[' + args.join(',') + ']';\n      this.assign(intoId, expression);\n      recursionFn(expression);\n      break;\n    case AST.ObjectExpression:\n      args = [];\n      forEach(ast.properties, function(property) {\n        self.recurse(property.value, self.nextId(), undefined, function(expr) {\n          args.push(self.escape(\n              property.key.type === AST.Identifier ? property.key.name :\n                ('' + property.key.value)) +\n              ':' + expr);\n        });\n      });\n      expression = '{' + args.join(',') + '}';\n      this.assign(intoId, expression);\n      recursionFn(expression);\n      break;\n    case AST.ThisExpression:\n      this.assign(intoId, 's');\n      recursionFn('s');\n      break;\n    case AST.LocalsExpression:\n      this.assign(intoId, 'l');\n      recursionFn('l');\n      break;\n    case AST.NGValueParameter:\n      this.assign(intoId, 'v');\n      recursionFn('v');\n      break;\n    }\n  },\n\n  getHasOwnProperty: function(element, property) {\n    var key = element + '.' + property;\n    var own = this.current().own;\n    if (!own.hasOwnProperty(key)) {\n      own[key] = this.nextId(false, element + '&&(' + this.escape(property) + ' in ' + element + ')');\n    }\n    return own[key];\n  },\n\n  assign: function(id, value) {\n    if (!id) return;\n    this.current().body.push(id, '=', value, ';');\n    return id;\n  },\n\n  filter: function(filterName) {\n    if (!this.state.filters.hasOwnProperty(filterName)) {\n      this.state.filters[filterName] = this.nextId(true);\n    }\n    return this.state.filters[filterName];\n  },\n\n  ifDefined: function(id, defaultValue) {\n    return 'ifDefined(' + id + ',' + this.escape(defaultValue) + ')';\n  },\n\n  plus: function(left, right) {\n    return 'plus(' + left + ',' + right + ')';\n  },\n\n  return_: function(id) {\n    this.current().body.push('return ', id, ';');\n  },\n\n  if_: function(test, alternate, consequent) {\n    if (test === true) {\n      alternate();\n    } else {\n      var body = this.current().body;\n      body.push('if(', test, '){');\n      alternate();\n      body.push('}');\n      if (consequent) {\n        body.push('else{');\n        consequent();\n        body.push('}');\n      }\n    }\n  },\n\n  not: function(expression) {\n    return '!(' + expression + ')';\n  },\n\n  notNull: function(expression) {\n    return expression + '!=null';\n  },\n\n  nonComputedMember: function(left, right) {\n    var SAFE_IDENTIFIER = /[$_a-zA-Z][$_a-zA-Z0-9]*/;\n    var UNSAFE_CHARACTERS = /[^$_a-zA-Z0-9]/g;\n    if (SAFE_IDENTIFIER.test(right)) {\n      return left + '.' + right;\n    } else {\n      return left  + '[\"' + right.replace(UNSAFE_CHARACTERS, this.stringEscapeFn) + '\"]';\n    }\n  },\n\n  computedMember: function(left, right) {\n    return left + '[' + right + ']';\n  },\n\n  member: function(left, right, computed) {\n    if (computed) return this.computedMember(left, right);\n    return this.nonComputedMember(left, right);\n  },\n\n  addEnsureSafeObject: function(item) {\n    this.current().body.push(this.ensureSafeObject(item), ';');\n  },\n\n  addEnsureSafeMemberName: function(item) {\n    this.current().body.push(this.ensureSafeMemberName(item), ';');\n  },\n\n  addEnsureSafeFunction: function(item) {\n    this.current().body.push(this.ensureSafeFunction(item), ';');\n  },\n\n  addEnsureSafeAssignContext: function(item) {\n    this.current().body.push(this.ensureSafeAssignContext(item), ';');\n  },\n\n  ensureSafeObject: function(item) {\n    return 'ensureSafeObject(' + item + ',text)';\n  },\n\n  ensureSafeMemberName: function(item) {\n    return 'ensureSafeMemberName(' + item + ',text)';\n  },\n\n  ensureSafeFunction: function(item) {\n    return 'ensureSafeFunction(' + item + ',text)';\n  },\n\n  getStringValue: function(item) {\n    this.assign(item, 'getStringValue(' + item + ')');\n  },\n\n  ensureSafeAssignContext: function(item) {\n    return 'ensureSafeAssignContext(' + item + ',text)';\n  },\n\n  lazyRecurse: function(ast, intoId, nameId, recursionFn, create, skipWatchIdCheck) {\n    var self = this;\n    return function() {\n      self.recurse(ast, intoId, nameId, recursionFn, create, skipWatchIdCheck);\n    };\n  },\n\n  lazyAssign: function(id, value) {\n    var self = this;\n    return function() {\n      self.assign(id, value);\n    };\n  },\n\n  stringEscapeRegex: /[^ a-zA-Z0-9]/g,\n\n  stringEscapeFn: function(c) {\n    return '\\\\u' + ('0000' + c.charCodeAt(0).toString(16)).slice(-4);\n  },\n\n  escape: function(value) {\n    if (isString(value)) return \"'\" + value.replace(this.stringEscapeRegex, this.stringEscapeFn) + \"'\";\n    if (isNumber(value)) return value.toString();\n    if (value === true) return 'true';\n    if (value === false) return 'false';\n    if (value === null) return 'null';\n    if (typeof value === 'undefined') return 'undefined';\n\n    throw $parseMinErr('esc', 'IMPOSSIBLE');\n  },\n\n  nextId: function(skip, init) {\n    var id = 'v' + (this.state.nextId++);\n    if (!skip) {\n      this.current().vars.push(id + (init ? '=' + init : ''));\n    }\n    return id;\n  },\n\n  current: function() {\n    return this.state[this.state.computing];\n  }\n};\n\n\nfunction ASTInterpreter(astBuilder, $filter) {\n  this.astBuilder = astBuilder;\n  this.$filter = $filter;\n}\n\nASTInterpreter.prototype = {\n  compile: function(expression, expensiveChecks) {\n    var self = this;\n    var ast = this.astBuilder.ast(expression);\n    this.expression = expression;\n    this.expensiveChecks = expensiveChecks;\n    findConstantAndWatchExpressions(ast, self.$filter);\n    var assignable;\n    var assign;\n    if ((assignable = assignableAST(ast))) {\n      assign = this.recurse(assignable);\n    }\n    var toWatch = getInputs(ast.body);\n    var inputs;\n    if (toWatch) {\n      inputs = [];\n      forEach(toWatch, function(watch, key) {\n        var input = self.recurse(watch);\n        watch.input = input;\n        inputs.push(input);\n        watch.watchId = key;\n      });\n    }\n    var expressions = [];\n    forEach(ast.body, function(expression) {\n      expressions.push(self.recurse(expression.expression));\n    });\n    var fn = ast.body.length === 0 ? noop :\n             ast.body.length === 1 ? expressions[0] :\n             function(scope, locals) {\n               var lastValue;\n               forEach(expressions, function(exp) {\n                 lastValue = exp(scope, locals);\n               });\n               return lastValue;\n             };\n    if (assign) {\n      fn.assign = function(scope, value, locals) {\n        return assign(scope, locals, value);\n      };\n    }\n    if (inputs) {\n      fn.inputs = inputs;\n    }\n    fn.literal = isLiteral(ast);\n    fn.constant = isConstant(ast);\n    return fn;\n  },\n\n  recurse: function(ast, context, create) {\n    var left, right, self = this, args, expression;\n    if (ast.input) {\n      return this.inputs(ast.input, ast.watchId);\n    }\n    switch (ast.type) {\n    case AST.Literal:\n      return this.value(ast.value, context);\n    case AST.UnaryExpression:\n      right = this.recurse(ast.argument);\n      return this['unary' + ast.operator](right, context);\n    case AST.BinaryExpression:\n      left = this.recurse(ast.left);\n      right = this.recurse(ast.right);\n      return this['binary' + ast.operator](left, right, context);\n    case AST.LogicalExpression:\n      left = this.recurse(ast.left);\n      right = this.recurse(ast.right);\n      return this['binary' + ast.operator](left, right, context);\n    case AST.ConditionalExpression:\n      return this['ternary?:'](\n        this.recurse(ast.test),\n        this.recurse(ast.alternate),\n        this.recurse(ast.consequent),\n        context\n      );\n    case AST.Identifier:\n      ensureSafeMemberName(ast.name, self.expression);\n      return self.identifier(ast.name,\n                             self.expensiveChecks || isPossiblyDangerousMemberName(ast.name),\n                             context, create, self.expression);\n    case AST.MemberExpression:\n      left = this.recurse(ast.object, false, !!create);\n      if (!ast.computed) {\n        ensureSafeMemberName(ast.property.name, self.expression);\n        right = ast.property.name;\n      }\n      if (ast.computed) right = this.recurse(ast.property);\n      return ast.computed ?\n        this.computedMember(left, right, context, create, self.expression) :\n        this.nonComputedMember(left, right, self.expensiveChecks, context, create, self.expression);\n    case AST.CallExpression:\n      args = [];\n      forEach(ast.arguments, function(expr) {\n        args.push(self.recurse(expr));\n      });\n      if (ast.filter) right = this.$filter(ast.callee.name);\n      if (!ast.filter) right = this.recurse(ast.callee, true);\n      return ast.filter ?\n        function(scope, locals, assign, inputs) {\n          var values = [];\n          for (var i = 0; i < args.length; ++i) {\n            values.push(args[i](scope, locals, assign, inputs));\n          }\n          var value = right.apply(undefined, values, inputs);\n          return context ? {context: undefined, name: undefined, value: value} : value;\n        } :\n        function(scope, locals, assign, inputs) {\n          var rhs = right(scope, locals, assign, inputs);\n          var value;\n          if (rhs.value != null) {\n            ensureSafeObject(rhs.context, self.expression);\n            ensureSafeFunction(rhs.value, self.expression);\n            var values = [];\n            for (var i = 0; i < args.length; ++i) {\n              values.push(ensureSafeObject(args[i](scope, locals, assign, inputs), self.expression));\n            }\n            value = ensureSafeObject(rhs.value.apply(rhs.context, values), self.expression);\n          }\n          return context ? {value: value} : value;\n        };\n    case AST.AssignmentExpression:\n      left = this.recurse(ast.left, true, 1);\n      right = this.recurse(ast.right);\n      return function(scope, locals, assign, inputs) {\n        var lhs = left(scope, locals, assign, inputs);\n        var rhs = right(scope, locals, assign, inputs);\n        ensureSafeObject(lhs.value, self.expression);\n        ensureSafeAssignContext(lhs.context);\n        lhs.context[lhs.name] = rhs;\n        return context ? {value: rhs} : rhs;\n      };\n    case AST.ArrayExpression:\n      args = [];\n      forEach(ast.elements, function(expr) {\n        args.push(self.recurse(expr));\n      });\n      return function(scope, locals, assign, inputs) {\n        var value = [];\n        for (var i = 0; i < args.length; ++i) {\n          value.push(args[i](scope, locals, assign, inputs));\n        }\n        return context ? {value: value} : value;\n      };\n    case AST.ObjectExpression:\n      args = [];\n      forEach(ast.properties, function(property) {\n        args.push({key: property.key.type === AST.Identifier ?\n                        property.key.name :\n                        ('' + property.key.value),\n                   value: self.recurse(property.value)\n        });\n      });\n      return function(scope, locals, assign, inputs) {\n        var value = {};\n        for (var i = 0; i < args.length; ++i) {\n          value[args[i].key] = args[i].value(scope, locals, assign, inputs);\n        }\n        return context ? {value: value} : value;\n      };\n    case AST.ThisExpression:\n      return function(scope) {\n        return context ? {value: scope} : scope;\n      };\n    case AST.LocalsExpression:\n      return function(scope, locals) {\n        return context ? {value: locals} : locals;\n      };\n    case AST.NGValueParameter:\n      return function(scope, locals, assign) {\n        return context ? {value: assign} : assign;\n      };\n    }\n  },\n\n  'unary+': function(argument, context) {\n    return function(scope, locals, assign, inputs) {\n      var arg = argument(scope, locals, assign, inputs);\n      if (isDefined(arg)) {\n        arg = +arg;\n      } else {\n        arg = 0;\n      }\n      return context ? {value: arg} : arg;\n    };\n  },\n  'unary-': function(argument, context) {\n    return function(scope, locals, assign, inputs) {\n      var arg = argument(scope, locals, assign, inputs);\n      if (isDefined(arg)) {\n        arg = -arg;\n      } else {\n        arg = 0;\n      }\n      return context ? {value: arg} : arg;\n    };\n  },\n  'unary!': function(argument, context) {\n    return function(scope, locals, assign, inputs) {\n      var arg = !argument(scope, locals, assign, inputs);\n      return context ? {value: arg} : arg;\n    };\n  },\n  'binary+': function(left, right, context) {\n    return function(scope, locals, assign, inputs) {\n      var lhs = left(scope, locals, assign, inputs);\n      var rhs = right(scope, locals, assign, inputs);\n      var arg = plusFn(lhs, rhs);\n      return context ? {value: arg} : arg;\n    };\n  },\n  'binary-': function(left, right, context) {\n    return function(scope, locals, assign, inputs) {\n      var lhs = left(scope, locals, assign, inputs);\n      var rhs = right(scope, locals, assign, inputs);\n      var arg = (isDefined(lhs) ? lhs : 0) - (isDefined(rhs) ? rhs : 0);\n      return context ? {value: arg} : arg;\n    };\n  },\n  'binary*': function(left, right, context) {\n    return function(scope, locals, assign, inputs) {\n      var arg = left(scope, locals, assign, inputs) * right(scope, locals, assign, inputs);\n      return context ? {value: arg} : arg;\n    };\n  },\n  'binary/': function(left, right, context) {\n    return function(scope, locals, assign, inputs) {\n      var arg = left(scope, locals, assign, inputs) / right(scope, locals, assign, inputs);\n      return context ? {value: arg} : arg;\n    };\n  },\n  'binary%': function(left, right, context) {\n    return function(scope, locals, assign, inputs) {\n      var arg = left(scope, locals, assign, inputs) % right(scope, locals, assign, inputs);\n      return context ? {value: arg} : arg;\n    };\n  },\n  'binary===': function(left, right, context) {\n    return function(scope, locals, assign, inputs) {\n      var arg = left(scope, locals, assign, inputs) === right(scope, locals, assign, inputs);\n      return context ? {value: arg} : arg;\n    };\n  },\n  'binary!==': function(left, right, context) {\n    return function(scope, locals, assign, inputs) {\n      var arg = left(scope, locals, assign, inputs) !== right(scope, locals, assign, inputs);\n      return context ? {value: arg} : arg;\n    };\n  },\n  'binary==': function(left, right, context) {\n    return function(scope, locals, assign, inputs) {\n      var arg = left(scope, locals, assign, inputs) == right(scope, locals, assign, inputs);\n      return context ? {value: arg} : arg;\n    };\n  },\n  'binary!=': function(left, right, context) {\n    return function(scope, locals, assign, inputs) {\n      var arg = left(scope, locals, assign, inputs) != right(scope, locals, assign, inputs);\n      return context ? {value: arg} : arg;\n    };\n  },\n  'binary<': function(left, right, context) {\n    return function(scope, locals, assign, inputs) {\n      var arg = left(scope, locals, assign, inputs) < right(scope, locals, assign, inputs);\n      return context ? {value: arg} : arg;\n    };\n  },\n  'binary>': function(left, right, context) {\n    return function(scope, locals, assign, inputs) {\n      var arg = left(scope, locals, assign, inputs) > right(scope, locals, assign, inputs);\n      return context ? {value: arg} : arg;\n    };\n  },\n  'binary<=': function(left, right, context) {\n    return function(scope, locals, assign, inputs) {\n      var arg = left(scope, locals, assign, inputs) <= right(scope, locals, assign, inputs);\n      return context ? {value: arg} : arg;\n    };\n  },\n  'binary>=': function(left, right, context) {\n    return function(scope, locals, assign, inputs) {\n      var arg = left(scope, locals, assign, inputs) >= right(scope, locals, assign, inputs);\n      return context ? {value: arg} : arg;\n    };\n  },\n  'binary&&': function(left, right, context) {\n    return function(scope, locals, assign, inputs) {\n      var arg = left(scope, locals, assign, inputs) && right(scope, locals, assign, inputs);\n      return context ? {value: arg} : arg;\n    };\n  },\n  'binary||': function(left, right, context) {\n    return function(scope, locals, assign, inputs) {\n      var arg = left(scope, locals, assign, inputs) || right(scope, locals, assign, inputs);\n      return context ? {value: arg} : arg;\n    };\n  },\n  'ternary?:': function(test, alternate, consequent, context) {\n    return function(scope, locals, assign, inputs) {\n      var arg = test(scope, locals, assign, inputs) ? alternate(scope, locals, assign, inputs) : consequent(scope, locals, assign, inputs);\n      return context ? {value: arg} : arg;\n    };\n  },\n  value: function(value, context) {\n    return function() { return context ? {context: undefined, name: undefined, value: value} : value; };\n  },\n  identifier: function(name, expensiveChecks, context, create, expression) {\n    return function(scope, locals, assign, inputs) {\n      var base = locals && (name in locals) ? locals : scope;\n      if (create && create !== 1 && base && !(base[name])) {\n        base[name] = {};\n      }\n      var value = base ? base[name] : undefined;\n      if (expensiveChecks) {\n        ensureSafeObject(value, expression);\n      }\n      if (context) {\n        return {context: base, name: name, value: value};\n      } else {\n        return value;\n      }\n    };\n  },\n  computedMember: function(left, right, context, create, expression) {\n    return function(scope, locals, assign, inputs) {\n      var lhs = left(scope, locals, assign, inputs);\n      var rhs;\n      var value;\n      if (lhs != null) {\n        rhs = right(scope, locals, assign, inputs);\n        rhs = getStringValue(rhs);\n        ensureSafeMemberName(rhs, expression);\n        if (create && create !== 1) {\n          ensureSafeAssignContext(lhs);\n          if (lhs && !(lhs[rhs])) {\n            lhs[rhs] = {};\n          }\n        }\n        value = lhs[rhs];\n        ensureSafeObject(value, expression);\n      }\n      if (context) {\n        return {context: lhs, name: rhs, value: value};\n      } else {\n        return value;\n      }\n    };\n  },\n  nonComputedMember: function(left, right, expensiveChecks, context, create, expression) {\n    return function(scope, locals, assign, inputs) {\n      var lhs = left(scope, locals, assign, inputs);\n      if (create && create !== 1) {\n        ensureSafeAssignContext(lhs);\n        if (lhs && !(lhs[right])) {\n          lhs[right] = {};\n        }\n      }\n      var value = lhs != null ? lhs[right] : undefined;\n      if (expensiveChecks || isPossiblyDangerousMemberName(right)) {\n        ensureSafeObject(value, expression);\n      }\n      if (context) {\n        return {context: lhs, name: right, value: value};\n      } else {\n        return value;\n      }\n    };\n  },\n  inputs: function(input, watchId) {\n    return function(scope, value, locals, inputs) {\n      if (inputs) return inputs[watchId];\n      return input(scope, value, locals);\n    };\n  }\n};\n\n/**\n * @constructor\n */\nvar Parser = function(lexer, $filter, options) {\n  this.lexer = lexer;\n  this.$filter = $filter;\n  this.options = options;\n  this.ast = new AST(lexer, options);\n  this.astCompiler = options.csp ? new ASTInterpreter(this.ast, $filter) :\n                                   new ASTCompiler(this.ast, $filter);\n};\n\nParser.prototype = {\n  constructor: Parser,\n\n  parse: function(text) {\n    return this.astCompiler.compile(text, this.options.expensiveChecks);\n  }\n};\n\nfunction isPossiblyDangerousMemberName(name) {\n  return name == 'constructor';\n}\n\nvar objectValueOf = Object.prototype.valueOf;\n\nfunction getValueOf(value) {\n  return isFunction(value.valueOf) ? value.valueOf() : objectValueOf.call(value);\n}\n\n///////////////////////////////////\n\n/**\n * @ngdoc service\n * @name $parse\n * @kind function\n *\n * @description\n *\n * Converts Angular {@link guide/expression expression} into a function.\n *\n * ```js\n *   var getter = $parse('user.name');\n *   var setter = getter.assign;\n *   var context = {user:{name:'angular'}};\n *   var locals = {user:{name:'local'}};\n *\n *   expect(getter(context)).toEqual('angular');\n *   setter(context, 'newValue');\n *   expect(context.user.name).toEqual('newValue');\n *   expect(getter(context, locals)).toEqual('local');\n * ```\n *\n *\n * @param {string} expression String expression to compile.\n * @returns {function(context, locals)} a function which represents the compiled expression:\n *\n *    * `context` – `{object}` – an object against which any expressions embedded in the strings\n *      are evaluated against (typically a scope object).\n *    * `locals` – `{object=}` – local variables context object, useful for overriding values in\n *      `context`.\n *\n *    The returned function also has the following properties:\n *      * `literal` – `{boolean}` – whether the expression's top-level node is a JavaScript\n *        literal.\n *      * `constant` – `{boolean}` – whether the expression is made entirely of JavaScript\n *        constant literals.\n *      * `assign` – `{?function(context, value)}` – if the expression is assignable, this will be\n *        set to a function to change its value on the given context.\n *\n */\n\n\n/**\n * @ngdoc provider\n * @name $parseProvider\n *\n * @description\n * `$parseProvider` can be used for configuring the default behavior of the {@link ng.$parse $parse}\n *  service.\n */\nfunction $ParseProvider() {\n  var cacheDefault = createMap();\n  var cacheExpensive = createMap();\n  var literals = {\n    'true': true,\n    'false': false,\n    'null': null,\n    'undefined': undefined\n  };\n  var identStart, identContinue;\n\n  /**\n   * @ngdoc method\n   * @name $parseProvider#addLiteral\n   * @description\n   *\n   * Configure $parse service to add literal values that will be present as literal at expressions.\n   *\n   * @param {string} literalName Token for the literal value. The literal name value must be a valid literal name.\n   * @param {*} literalValue Value for this literal. All literal values must be primitives or `undefined`.\n   *\n   **/\n  this.addLiteral = function(literalName, literalValue) {\n    literals[literalName] = literalValue;\n  };\n\n /**\n  * @ngdoc method\n  * @name $parseProvider#setIdentifierFns\n  * @description\n  *\n  * Allows defining the set of characters that are allowed in Angular expressions. The function\n  * `identifierStart` will get called to know if a given character is a valid character to be the\n  * first character for an identifier. The function `identifierContinue` will get called to know if\n  * a given character is a valid character to be a follow-up identifier character. The functions\n  * `identifierStart` and `identifierContinue` will receive as arguments the single character to be\n  * identifier and the character code point. These arguments will be `string` and `numeric`. Keep in\n  * mind that the `string` parameter can be two characters long depending on the character\n  * representation. It is expected for the function to return `true` or `false`, whether that\n  * character is allowed or not.\n  *\n  * Since this function will be called extensivelly, keep the implementation of these functions fast,\n  * as the performance of these functions have a direct impact on the expressions parsing speed.\n  *\n  * @param {function=} identifierStart The function that will decide whether the given character is\n  *   a valid identifier start character.\n  * @param {function=} identifierContinue The function that will decide whether the given character is\n  *   a valid identifier continue character.\n  */\n  this.setIdentifierFns = function(identifierStart, identifierContinue) {\n    identStart = identifierStart;\n    identContinue = identifierContinue;\n    return this;\n  };\n\n  this.$get = ['$filter', function($filter) {\n    var noUnsafeEval = csp().noUnsafeEval;\n    var $parseOptions = {\n          csp: noUnsafeEval,\n          expensiveChecks: false,\n          literals: copy(literals),\n          isIdentifierStart: isFunction(identStart) && identStart,\n          isIdentifierContinue: isFunction(identContinue) && identContinue\n        },\n        $parseOptionsExpensive = {\n          csp: noUnsafeEval,\n          expensiveChecks: true,\n          literals: copy(literals),\n          isIdentifierStart: isFunction(identStart) && identStart,\n          isIdentifierContinue: isFunction(identContinue) && identContinue\n        };\n    var runningChecksEnabled = false;\n\n    $parse.$$runningExpensiveChecks = function() {\n      return runningChecksEnabled;\n    };\n\n    return $parse;\n\n    function $parse(exp, interceptorFn, expensiveChecks) {\n      var parsedExpression, oneTime, cacheKey;\n\n      expensiveChecks = expensiveChecks || runningChecksEnabled;\n\n      switch (typeof exp) {\n        case 'string':\n          exp = exp.trim();\n          cacheKey = exp;\n\n          var cache = (expensiveChecks ? cacheExpensive : cacheDefault);\n          parsedExpression = cache[cacheKey];\n\n          if (!parsedExpression) {\n            if (exp.charAt(0) === ':' && exp.charAt(1) === ':') {\n              oneTime = true;\n              exp = exp.substring(2);\n            }\n            var parseOptions = expensiveChecks ? $parseOptionsExpensive : $parseOptions;\n            var lexer = new Lexer(parseOptions);\n            var parser = new Parser(lexer, $filter, parseOptions);\n            parsedExpression = parser.parse(exp);\n            if (parsedExpression.constant) {\n              parsedExpression.$$watchDelegate = constantWatchDelegate;\n            } else if (oneTime) {\n              parsedExpression.$$watchDelegate = parsedExpression.literal ?\n                  oneTimeLiteralWatchDelegate : oneTimeWatchDelegate;\n            } else if (parsedExpression.inputs) {\n              parsedExpression.$$watchDelegate = inputsWatchDelegate;\n            }\n            if (expensiveChecks) {\n              parsedExpression = expensiveChecksInterceptor(parsedExpression);\n            }\n            cache[cacheKey] = parsedExpression;\n          }\n          return addInterceptor(parsedExpression, interceptorFn);\n\n        case 'function':\n          return addInterceptor(exp, interceptorFn);\n\n        default:\n          return addInterceptor(noop, interceptorFn);\n      }\n    }\n\n    function expensiveChecksInterceptor(fn) {\n      if (!fn) return fn;\n      expensiveCheckFn.$$watchDelegate = fn.$$watchDelegate;\n      expensiveCheckFn.assign = expensiveChecksInterceptor(fn.assign);\n      expensiveCheckFn.constant = fn.constant;\n      expensiveCheckFn.literal = fn.literal;\n      for (var i = 0; fn.inputs && i < fn.inputs.length; ++i) {\n        fn.inputs[i] = expensiveChecksInterceptor(fn.inputs[i]);\n      }\n      expensiveCheckFn.inputs = fn.inputs;\n\n      return expensiveCheckFn;\n\n      function expensiveCheckFn(scope, locals, assign, inputs) {\n        var expensiveCheckOldValue = runningChecksEnabled;\n        runningChecksEnabled = true;\n        try {\n          return fn(scope, locals, assign, inputs);\n        } finally {\n          runningChecksEnabled = expensiveCheckOldValue;\n        }\n      }\n    }\n\n    function expressionInputDirtyCheck(newValue, oldValueOfValue) {\n\n      if (newValue == null || oldValueOfValue == null) { // null/undefined\n        return newValue === oldValueOfValue;\n      }\n\n      if (typeof newValue === 'object') {\n\n        // attempt to convert the value to a primitive type\n        // TODO(docs): add a note to docs that by implementing valueOf even objects and arrays can\n        //             be cheaply dirty-checked\n        newValue = getValueOf(newValue);\n\n        if (typeof newValue === 'object') {\n          // objects/arrays are not supported - deep-watching them would be too expensive\n          return false;\n        }\n\n        // fall-through to the primitive equality check\n      }\n\n      //Primitive or NaN\n      return newValue === oldValueOfValue || (newValue !== newValue && oldValueOfValue !== oldValueOfValue);\n    }\n\n    function inputsWatchDelegate(scope, listener, objectEquality, parsedExpression, prettyPrintExpression) {\n      var inputExpressions = parsedExpression.inputs;\n      var lastResult;\n\n      if (inputExpressions.length === 1) {\n        var oldInputValueOf = expressionInputDirtyCheck; // init to something unique so that equals check fails\n        inputExpressions = inputExpressions[0];\n        return scope.$watch(function expressionInputWatch(scope) {\n          var newInputValue = inputExpressions(scope);\n          if (!expressionInputDirtyCheck(newInputValue, oldInputValueOf)) {\n            lastResult = parsedExpression(scope, undefined, undefined, [newInputValue]);\n            oldInputValueOf = newInputValue && getValueOf(newInputValue);\n          }\n          return lastResult;\n        }, listener, objectEquality, prettyPrintExpression);\n      }\n\n      var oldInputValueOfValues = [];\n      var oldInputValues = [];\n      for (var i = 0, ii = inputExpressions.length; i < ii; i++) {\n        oldInputValueOfValues[i] = expressionInputDirtyCheck; // init to something unique so that equals check fails\n        oldInputValues[i] = null;\n      }\n\n      return scope.$watch(function expressionInputsWatch(scope) {\n        var changed = false;\n\n        for (var i = 0, ii = inputExpressions.length; i < ii; i++) {\n          var newInputValue = inputExpressions[i](scope);\n          if (changed || (changed = !expressionInputDirtyCheck(newInputValue, oldInputValueOfValues[i]))) {\n            oldInputValues[i] = newInputValue;\n            oldInputValueOfValues[i] = newInputValue && getValueOf(newInputValue);\n          }\n        }\n\n        if (changed) {\n          lastResult = parsedExpression(scope, undefined, undefined, oldInputValues);\n        }\n\n        return lastResult;\n      }, listener, objectEquality, prettyPrintExpression);\n    }\n\n    function oneTimeWatchDelegate(scope, listener, objectEquality, parsedExpression) {\n      var unwatch, lastValue;\n      return unwatch = scope.$watch(function oneTimeWatch(scope) {\n        return parsedExpression(scope);\n      }, function oneTimeListener(value, old, scope) {\n        lastValue = value;\n        if (isFunction(listener)) {\n          listener.apply(this, arguments);\n        }\n        if (isDefined(value)) {\n          scope.$$postDigest(function() {\n            if (isDefined(lastValue)) {\n              unwatch();\n            }\n          });\n        }\n      }, objectEquality);\n    }\n\n    function oneTimeLiteralWatchDelegate(scope, listener, objectEquality, parsedExpression) {\n      var unwatch, lastValue;\n      return unwatch = scope.$watch(function oneTimeWatch(scope) {\n        return parsedExpression(scope);\n      }, function oneTimeListener(value, old, scope) {\n        lastValue = value;\n        if (isFunction(listener)) {\n          listener.call(this, value, old, scope);\n        }\n        if (isAllDefined(value)) {\n          scope.$$postDigest(function() {\n            if (isAllDefined(lastValue)) unwatch();\n          });\n        }\n      }, objectEquality);\n\n      function isAllDefined(value) {\n        var allDefined = true;\n        forEach(value, function(val) {\n          if (!isDefined(val)) allDefined = false;\n        });\n        return allDefined;\n      }\n    }\n\n    function constantWatchDelegate(scope, listener, objectEquality, parsedExpression) {\n      var unwatch;\n      return unwatch = scope.$watch(function constantWatch(scope) {\n        unwatch();\n        return parsedExpression(scope);\n      }, listener, objectEquality);\n    }\n\n    function addInterceptor(parsedExpression, interceptorFn) {\n      if (!interceptorFn) return parsedExpression;\n      var watchDelegate = parsedExpression.$$watchDelegate;\n      var useInputs = false;\n\n      var regularWatch =\n          watchDelegate !== oneTimeLiteralWatchDelegate &&\n          watchDelegate !== oneTimeWatchDelegate;\n\n      var fn = regularWatch ? function regularInterceptedExpression(scope, locals, assign, inputs) {\n        var value = useInputs && inputs ? inputs[0] : parsedExpression(scope, locals, assign, inputs);\n        return interceptorFn(value, scope, locals);\n      } : function oneTimeInterceptedExpression(scope, locals, assign, inputs) {\n        var value = parsedExpression(scope, locals, assign, inputs);\n        var result = interceptorFn(value, scope, locals);\n        // we only return the interceptor's result if the\n        // initial value is defined (for bind-once)\n        return isDefined(value) ? result : value;\n      };\n\n      // Propagate $$watchDelegates other then inputsWatchDelegate\n      if (parsedExpression.$$watchDelegate &&\n          parsedExpression.$$watchDelegate !== inputsWatchDelegate) {\n        fn.$$watchDelegate = parsedExpression.$$watchDelegate;\n      } else if (!interceptorFn.$stateful) {\n        // If there is an interceptor, but no watchDelegate then treat the interceptor like\n        // we treat filters - it is assumed to be a pure function unless flagged with $stateful\n        fn.$$watchDelegate = inputsWatchDelegate;\n        useInputs = !parsedExpression.inputs;\n        fn.inputs = parsedExpression.inputs ? parsedExpression.inputs : [parsedExpression];\n      }\n\n      return fn;\n    }\n  }];\n}\n\n/**\n * @ngdoc service\n * @name $q\n * @requires $rootScope\n *\n * @description\n * A service that helps you run functions asynchronously, and use their return values (or exceptions)\n * when they are done processing.\n *\n * This is an implementation of promises/deferred objects inspired by\n * [Kris Kowal's Q](https://github.com/kriskowal/q).\n *\n * $q can be used in two fashions --- one which is more similar to Kris Kowal's Q or jQuery's Deferred\n * implementations, and the other which resembles ES6 (ES2015) promises to some degree.\n *\n * # $q constructor\n *\n * The streamlined ES6 style promise is essentially just using $q as a constructor which takes a `resolver`\n * function as the first argument. This is similar to the native Promise implementation from ES6,\n * see [MDN](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise).\n *\n * While the constructor-style use is supported, not all of the supporting methods from ES6 promises are\n * available yet.\n *\n * It can be used like so:\n *\n * ```js\n *   // for the purpose of this example let's assume that variables `$q` and `okToGreet`\n *   // are available in the current lexical scope (they could have been injected or passed in).\n *\n *   function asyncGreet(name) {\n *     // perform some asynchronous operation, resolve or reject the promise when appropriate.\n *     return $q(function(resolve, reject) {\n *       setTimeout(function() {\n *         if (okToGreet(name)) {\n *           resolve('Hello, ' + name + '!');\n *         } else {\n *           reject('Greeting ' + name + ' is not allowed.');\n *         }\n *       }, 1000);\n *     });\n *   }\n *\n *   var promise = asyncGreet('Robin Hood');\n *   promise.then(function(greeting) {\n *     alert('Success: ' + greeting);\n *   }, function(reason) {\n *     alert('Failed: ' + reason);\n *   });\n * ```\n *\n * Note: progress/notify callbacks are not currently supported via the ES6-style interface.\n *\n * Note: unlike ES6 behavior, an exception thrown in the constructor function will NOT implicitly reject the promise.\n *\n * However, the more traditional CommonJS-style usage is still available, and documented below.\n *\n * [The CommonJS Promise proposal](http://wiki.commonjs.org/wiki/Promises) describes a promise as an\n * interface for interacting with an object that represents the result of an action that is\n * performed asynchronously, and may or may not be finished at any given point in time.\n *\n * From the perspective of dealing with error handling, deferred and promise APIs are to\n * asynchronous programming what `try`, `catch` and `throw` keywords are to synchronous programming.\n *\n * ```js\n *   // for the purpose of this example let's assume that variables `$q` and `okToGreet`\n *   // are available in the current lexical scope (they could have been injected or passed in).\n *\n *   function asyncGreet(name) {\n *     var deferred = $q.defer();\n *\n *     setTimeout(function() {\n *       deferred.notify('About to greet ' + name + '.');\n *\n *       if (okToGreet(name)) {\n *         deferred.resolve('Hello, ' + name + '!');\n *       } else {\n *         deferred.reject('Greeting ' + name + ' is not allowed.');\n *       }\n *     }, 1000);\n *\n *     return deferred.promise;\n *   }\n *\n *   var promise = asyncGreet('Robin Hood');\n *   promise.then(function(greeting) {\n *     alert('Success: ' + greeting);\n *   }, function(reason) {\n *     alert('Failed: ' + reason);\n *   }, function(update) {\n *     alert('Got notification: ' + update);\n *   });\n * ```\n *\n * At first it might not be obvious why this extra complexity is worth the trouble. The payoff\n * comes in the way of guarantees that promise and deferred APIs make, see\n * https://github.com/kriskowal/uncommonjs/blob/master/promises/specification.md.\n *\n * Additionally the promise api allows for composition that is very hard to do with the\n * traditional callback ([CPS](http://en.wikipedia.org/wiki/Continuation-passing_style)) approach.\n * For more on this please see the [Q documentation](https://github.com/kriskowal/q) especially the\n * section on serial or parallel joining of promises.\n *\n * # The Deferred API\n *\n * A new instance of deferred is constructed by calling `$q.defer()`.\n *\n * The purpose of the deferred object is to expose the associated Promise instance as well as APIs\n * that can be used for signaling the successful or unsuccessful completion, as well as the status\n * of the task.\n *\n * **Methods**\n *\n * - `resolve(value)` – resolves the derived promise with the `value`. If the value is a rejection\n *   constructed via `$q.reject`, the promise will be rejected instead.\n * - `reject(reason)` – rejects the derived promise with the `reason`. This is equivalent to\n *   resolving it with a rejection constructed via `$q.reject`.\n * - `notify(value)` - provides updates on the status of the promise's execution. This may be called\n *   multiple times before the promise is either resolved or rejected.\n *\n * **Properties**\n *\n * - promise – `{Promise}` – promise object associated with this deferred.\n *\n *\n * # The Promise API\n *\n * A new promise instance is created when a deferred instance is created and can be retrieved by\n * calling `deferred.promise`.\n *\n * The purpose of the promise object is to allow for interested parties to get access to the result\n * of the deferred task when it completes.\n *\n * **Methods**\n *\n * - `then(successCallback, errorCallback, notifyCallback)` – regardless of when the promise was or\n *   will be resolved or rejected, `then` calls one of the success or error callbacks asynchronously\n *   as soon as the result is available. The callbacks are called with a single argument: the result\n *   or rejection reason. Additionally, the notify callback may be called zero or more times to\n *   provide a progress indication, before the promise is resolved or rejected.\n *\n *   This method *returns a new promise* which is resolved or rejected via the return value of the\n *   `successCallback`, `errorCallback` (unless that value is a promise, in which case it is resolved\n *   with the value which is resolved in that promise using\n *   [promise chaining](http://www.html5rocks.com/en/tutorials/es6/promises/#toc-promises-queues)).\n *   It also notifies via the return value of the `notifyCallback` method. The promise cannot be\n *   resolved or rejected from the notifyCallback method.\n *\n * - `catch(errorCallback)` – shorthand for `promise.then(null, errorCallback)`\n *\n * - `finally(callback, notifyCallback)` – allows you to observe either the fulfillment or rejection of a promise,\n *   but to do so without modifying the final value. This is useful to release resources or do some\n *   clean-up that needs to be done whether the promise was rejected or resolved. See the [full\n *   specification](https://github.com/kriskowal/q/wiki/API-Reference#promisefinallycallback) for\n *   more information.\n *\n * # Chaining promises\n *\n * Because calling the `then` method of a promise returns a new derived promise, it is easily\n * possible to create a chain of promises:\n *\n * ```js\n *   promiseB = promiseA.then(function(result) {\n *     return result + 1;\n *   });\n *\n *   // promiseB will be resolved immediately after promiseA is resolved and its value\n *   // will be the result of promiseA incremented by 1\n * ```\n *\n * It is possible to create chains of any length and since a promise can be resolved with another\n * promise (which will defer its resolution further), it is possible to pause/defer resolution of\n * the promises at any point in the chain. This makes it possible to implement powerful APIs like\n * $http's response interceptors.\n *\n *\n * # Differences between Kris Kowal's Q and $q\n *\n *  There are two main differences:\n *\n * - $q is integrated with the {@link ng.$rootScope.Scope} Scope model observation\n *   mechanism in angular, which means faster propagation of resolution or rejection into your\n *   models and avoiding unnecessary browser repaints, which would result in flickering UI.\n * - Q has many more features than $q, but that comes at a cost of bytes. $q is tiny, but contains\n *   all the important functionality needed for common async tasks.\n *\n * # Testing\n *\n *  ```js\n *    it('should simulate promise', inject(function($q, $rootScope) {\n *      var deferred = $q.defer();\n *      var promise = deferred.promise;\n *      var resolvedValue;\n *\n *      promise.then(function(value) { resolvedValue = value; });\n *      expect(resolvedValue).toBeUndefined();\n *\n *      // Simulate resolving of promise\n *      deferred.resolve(123);\n *      // Note that the 'then' function does not get called synchronously.\n *      // This is because we want the promise API to always be async, whether or not\n *      // it got called synchronously or asynchronously.\n *      expect(resolvedValue).toBeUndefined();\n *\n *      // Propagate promise resolution to 'then' functions using $apply().\n *      $rootScope.$apply();\n *      expect(resolvedValue).toEqual(123);\n *    }));\n *  ```\n *\n * @param {function(function, function)} resolver Function which is responsible for resolving or\n *   rejecting the newly created promise. The first parameter is a function which resolves the\n *   promise, the second parameter is a function which rejects the promise.\n *\n * @returns {Promise} The newly created promise.\n */\nfunction $QProvider() {\n\n  this.$get = ['$rootScope', '$exceptionHandler', function($rootScope, $exceptionHandler) {\n    return qFactory(function(callback) {\n      $rootScope.$evalAsync(callback);\n    }, $exceptionHandler);\n  }];\n}\n\nfunction $$QProvider() {\n  this.$get = ['$browser', '$exceptionHandler', function($browser, $exceptionHandler) {\n    return qFactory(function(callback) {\n      $browser.defer(callback);\n    }, $exceptionHandler);\n  }];\n}\n\n/**\n * Constructs a promise manager.\n *\n * @param {function(function)} nextTick Function for executing functions in the next turn.\n * @param {function(...*)} exceptionHandler Function into which unexpected exceptions are passed for\n *     debugging purposes.\n * @returns {object} Promise manager.\n */\nfunction qFactory(nextTick, exceptionHandler) {\n  var $qMinErr = minErr('$q', TypeError);\n\n  /**\n   * @ngdoc method\n   * @name ng.$q#defer\n   * @kind function\n   *\n   * @description\n   * Creates a `Deferred` object which represents a task which will finish in the future.\n   *\n   * @returns {Deferred} Returns a new instance of deferred.\n   */\n  var defer = function() {\n    var d = new Deferred();\n    //Necessary to support unbound execution :/\n    d.resolve = simpleBind(d, d.resolve);\n    d.reject = simpleBind(d, d.reject);\n    d.notify = simpleBind(d, d.notify);\n    return d;\n  };\n\n  function Promise() {\n    this.$$state = { status: 0 };\n  }\n\n  extend(Promise.prototype, {\n    then: function(onFulfilled, onRejected, progressBack) {\n      if (isUndefined(onFulfilled) && isUndefined(onRejected) && isUndefined(progressBack)) {\n        return this;\n      }\n      var result = new Deferred();\n\n      this.$$state.pending = this.$$state.pending || [];\n      this.$$state.pending.push([result, onFulfilled, onRejected, progressBack]);\n      if (this.$$state.status > 0) scheduleProcessQueue(this.$$state);\n\n      return result.promise;\n    },\n\n    \"catch\": function(callback) {\n      return this.then(null, callback);\n    },\n\n    \"finally\": function(callback, progressBack) {\n      return this.then(function(value) {\n        return handleCallback(value, true, callback);\n      }, function(error) {\n        return handleCallback(error, false, callback);\n      }, progressBack);\n    }\n  });\n\n  //Faster, more basic than angular.bind http://jsperf.com/angular-bind-vs-custom-vs-native\n  function simpleBind(context, fn) {\n    return function(value) {\n      fn.call(context, value);\n    };\n  }\n\n  function processQueue(state) {\n    var fn, deferred, pending;\n\n    pending = state.pending;\n    state.processScheduled = false;\n    state.pending = undefined;\n    for (var i = 0, ii = pending.length; i < ii; ++i) {\n      deferred = pending[i][0];\n      fn = pending[i][state.status];\n      try {\n        if (isFunction(fn)) {\n          deferred.resolve(fn(state.value));\n        } else if (state.status === 1) {\n          deferred.resolve(state.value);\n        } else {\n          deferred.reject(state.value);\n        }\n      } catch (e) {\n        deferred.reject(e);\n        exceptionHandler(e);\n      }\n    }\n  }\n\n  function scheduleProcessQueue(state) {\n    if (state.processScheduled || !state.pending) return;\n    state.processScheduled = true;\n    nextTick(function() { processQueue(state); });\n  }\n\n  function Deferred() {\n    this.promise = new Promise();\n  }\n\n  extend(Deferred.prototype, {\n    resolve: function(val) {\n      if (this.promise.$$state.status) return;\n      if (val === this.promise) {\n        this.$$reject($qMinErr(\n          'qcycle',\n          \"Expected promise to be resolved with value other than itself '{0}'\",\n          val));\n      } else {\n        this.$$resolve(val);\n      }\n\n    },\n\n    $$resolve: function(val) {\n      var then;\n      var that = this;\n      var done = false;\n      try {\n        if ((isObject(val) || isFunction(val))) then = val && val.then;\n        if (isFunction(then)) {\n          this.promise.$$state.status = -1;\n          then.call(val, resolvePromise, rejectPromise, simpleBind(this, this.notify));\n        } else {\n          this.promise.$$state.value = val;\n          this.promise.$$state.status = 1;\n          scheduleProcessQueue(this.promise.$$state);\n        }\n      } catch (e) {\n        rejectPromise(e);\n        exceptionHandler(e);\n      }\n\n      function resolvePromise(val) {\n        if (done) return;\n        done = true;\n        that.$$resolve(val);\n      }\n      function rejectPromise(val) {\n        if (done) return;\n        done = true;\n        that.$$reject(val);\n      }\n    },\n\n    reject: function(reason) {\n      if (this.promise.$$state.status) return;\n      this.$$reject(reason);\n    },\n\n    $$reject: function(reason) {\n      this.promise.$$state.value = reason;\n      this.promise.$$state.status = 2;\n      scheduleProcessQueue(this.promise.$$state);\n    },\n\n    notify: function(progress) {\n      var callbacks = this.promise.$$state.pending;\n\n      if ((this.promise.$$state.status <= 0) && callbacks && callbacks.length) {\n        nextTick(function() {\n          var callback, result;\n          for (var i = 0, ii = callbacks.length; i < ii; i++) {\n            result = callbacks[i][0];\n            callback = callbacks[i][3];\n            try {\n              result.notify(isFunction(callback) ? callback(progress) : progress);\n            } catch (e) {\n              exceptionHandler(e);\n            }\n          }\n        });\n      }\n    }\n  });\n\n  /**\n   * @ngdoc method\n   * @name $q#reject\n   * @kind function\n   *\n   * @description\n   * Creates a promise that is resolved as rejected with the specified `reason`. This api should be\n   * used to forward rejection in a chain of promises. If you are dealing with the last promise in\n   * a promise chain, you don't need to worry about it.\n   *\n   * When comparing deferreds/promises to the familiar behavior of try/catch/throw, think of\n   * `reject` as the `throw` keyword in JavaScript. This also means that if you \"catch\" an error via\n   * a promise error callback and you want to forward the error to the promise derived from the\n   * current promise, you have to \"rethrow\" the error by returning a rejection constructed via\n   * `reject`.\n   *\n   * ```js\n   *   promiseB = promiseA.then(function(result) {\n   *     // success: do something and resolve promiseB\n   *     //          with the old or a new result\n   *     return result;\n   *   }, function(reason) {\n   *     // error: handle the error if possible and\n   *     //        resolve promiseB with newPromiseOrValue,\n   *     //        otherwise forward the rejection to promiseB\n   *     if (canHandle(reason)) {\n   *      // handle the error and recover\n   *      return newPromiseOrValue;\n   *     }\n   *     return $q.reject(reason);\n   *   });\n   * ```\n   *\n   * @param {*} reason Constant, message, exception or an object representing the rejection reason.\n   * @returns {Promise} Returns a promise that was already resolved as rejected with the `reason`.\n   */\n  var reject = function(reason) {\n    var result = new Deferred();\n    result.reject(reason);\n    return result.promise;\n  };\n\n  var makePromise = function makePromise(value, resolved) {\n    var result = new Deferred();\n    if (resolved) {\n      result.resolve(value);\n    } else {\n      result.reject(value);\n    }\n    return result.promise;\n  };\n\n  var handleCallback = function handleCallback(value, isResolved, callback) {\n    var callbackOutput = null;\n    try {\n      if (isFunction(callback)) callbackOutput = callback();\n    } catch (e) {\n      return makePromise(e, false);\n    }\n    if (isPromiseLike(callbackOutput)) {\n      return callbackOutput.then(function() {\n        return makePromise(value, isResolved);\n      }, function(error) {\n        return makePromise(error, false);\n      });\n    } else {\n      return makePromise(value, isResolved);\n    }\n  };\n\n  /**\n   * @ngdoc method\n   * @name $q#when\n   * @kind function\n   *\n   * @description\n   * Wraps an object that might be a value or a (3rd party) then-able promise into a $q promise.\n   * This is useful when you are dealing with an object that might or might not be a promise, or if\n   * the promise comes from a source that can't be trusted.\n   *\n   * @param {*} value Value or a promise\n   * @param {Function=} successCallback\n   * @param {Function=} errorCallback\n   * @param {Function=} progressCallback\n   * @returns {Promise} Returns a promise of the passed value or promise\n   */\n\n\n  var when = function(value, callback, errback, progressBack) {\n    var result = new Deferred();\n    result.resolve(value);\n    return result.promise.then(callback, errback, progressBack);\n  };\n\n  /**\n   * @ngdoc method\n   * @name $q#resolve\n   * @kind function\n   *\n   * @description\n   * Alias of {@link ng.$q#when when} to maintain naming consistency with ES6.\n   *\n   * @param {*} value Value or a promise\n   * @param {Function=} successCallback\n   * @param {Function=} errorCallback\n   * @param {Function=} progressCallback\n   * @returns {Promise} Returns a promise of the passed value or promise\n   */\n  var resolve = when;\n\n  /**\n   * @ngdoc method\n   * @name $q#all\n   * @kind function\n   *\n   * @description\n   * Combines multiple promises into a single promise that is resolved when all of the input\n   * promises are resolved.\n   *\n   * @param {Array.<Promise>|Object.<Promise>} promises An array or hash of promises.\n   * @returns {Promise} Returns a single promise that will be resolved with an array/hash of values,\n   *   each value corresponding to the promise at the same index/key in the `promises` array/hash.\n   *   If any of the promises is resolved with a rejection, this resulting promise will be rejected\n   *   with the same rejection value.\n   */\n\n  function all(promises) {\n    var deferred = new Deferred(),\n        counter = 0,\n        results = isArray(promises) ? [] : {};\n\n    forEach(promises, function(promise, key) {\n      counter++;\n      when(promise).then(function(value) {\n        if (results.hasOwnProperty(key)) return;\n        results[key] = value;\n        if (!(--counter)) deferred.resolve(results);\n      }, function(reason) {\n        if (results.hasOwnProperty(key)) return;\n        deferred.reject(reason);\n      });\n    });\n\n    if (counter === 0) {\n      deferred.resolve(results);\n    }\n\n    return deferred.promise;\n  }\n\n  var $Q = function Q(resolver) {\n    if (!isFunction(resolver)) {\n      throw $qMinErr('norslvr', \"Expected resolverFn, got '{0}'\", resolver);\n    }\n\n    var deferred = new Deferred();\n\n    function resolveFn(value) {\n      deferred.resolve(value);\n    }\n\n    function rejectFn(reason) {\n      deferred.reject(reason);\n    }\n\n    resolver(resolveFn, rejectFn);\n\n    return deferred.promise;\n  };\n\n  // Let's make the instanceof operator work for promises, so that\n  // `new $q(fn) instanceof $q` would evaluate to true.\n  $Q.prototype = Promise.prototype;\n\n  $Q.defer = defer;\n  $Q.reject = reject;\n  $Q.when = when;\n  $Q.resolve = resolve;\n  $Q.all = all;\n\n  return $Q;\n}\n\nfunction $$RAFProvider() { //rAF\n  this.$get = ['$window', '$timeout', function($window, $timeout) {\n    var requestAnimationFrame = $window.requestAnimationFrame ||\n                                $window.webkitRequestAnimationFrame;\n\n    var cancelAnimationFrame = $window.cancelAnimationFrame ||\n                               $window.webkitCancelAnimationFrame ||\n                               $window.webkitCancelRequestAnimationFrame;\n\n    var rafSupported = !!requestAnimationFrame;\n    var raf = rafSupported\n      ? function(fn) {\n          var id = requestAnimationFrame(fn);\n          return function() {\n            cancelAnimationFrame(id);\n          };\n        }\n      : function(fn) {\n          var timer = $timeout(fn, 16.66, false); // 1000 / 60 = 16.666\n          return function() {\n            $timeout.cancel(timer);\n          };\n        };\n\n    raf.supported = rafSupported;\n\n    return raf;\n  }];\n}\n\n/**\n * DESIGN NOTES\n *\n * The design decisions behind the scope are heavily favored for speed and memory consumption.\n *\n * The typical use of scope is to watch the expressions, which most of the time return the same\n * value as last time so we optimize the operation.\n *\n * Closures construction is expensive in terms of speed as well as memory:\n *   - No closures, instead use prototypical inheritance for API\n *   - Internal state needs to be stored on scope directly, which means that private state is\n *     exposed as $$____ properties\n *\n * Loop operations are optimized by using while(count--) { ... }\n *   - This means that in order to keep the same order of execution as addition we have to add\n *     items to the array at the beginning (unshift) instead of at the end (push)\n *\n * Child scopes are created and removed often\n *   - Using an array would be slow since inserts in the middle are expensive; so we use linked lists\n *\n * There are fewer watches than observers. This is why you don't want the observer to be implemented\n * in the same way as watch. Watch requires return of the initialization function which is expensive\n * to construct.\n */\n\n\n/**\n * @ngdoc provider\n * @name $rootScopeProvider\n * @description\n *\n * Provider for the $rootScope service.\n */\n\n/**\n * @ngdoc method\n * @name $rootScopeProvider#digestTtl\n * @description\n *\n * Sets the number of `$digest` iterations the scope should attempt to execute before giving up and\n * assuming that the model is unstable.\n *\n * The current default is 10 iterations.\n *\n * In complex applications it's possible that the dependencies between `$watch`s will result in\n * several digest iterations. However if an application needs more than the default 10 digest\n * iterations for its model to stabilize then you should investigate what is causing the model to\n * continuously change during the digest.\n *\n * Increasing the TTL could have performance implications, so you should not change it without\n * proper justification.\n *\n * @param {number} limit The number of digest iterations.\n */\n\n\n/**\n * @ngdoc service\n * @name $rootScope\n * @description\n *\n * Every application has a single root {@link ng.$rootScope.Scope scope}.\n * All other scopes are descendant scopes of the root scope. Scopes provide separation\n * between the model and the view, via a mechanism for watching the model for changes.\n * They also provide event emission/broadcast and subscription facility. See the\n * {@link guide/scope developer guide on scopes}.\n */\nfunction $RootScopeProvider() {\n  var TTL = 10;\n  var $rootScopeMinErr = minErr('$rootScope');\n  var lastDirtyWatch = null;\n  var applyAsyncId = null;\n\n  this.digestTtl = function(value) {\n    if (arguments.length) {\n      TTL = value;\n    }\n    return TTL;\n  };\n\n  function createChildScopeClass(parent) {\n    function ChildScope() {\n      this.$$watchers = this.$$nextSibling =\n          this.$$childHead = this.$$childTail = null;\n      this.$$listeners = {};\n      this.$$listenerCount = {};\n      this.$$watchersCount = 0;\n      this.$id = nextUid();\n      this.$$ChildScope = null;\n    }\n    ChildScope.prototype = parent;\n    return ChildScope;\n  }\n\n  this.$get = ['$exceptionHandler', '$parse', '$browser',\n      function($exceptionHandler, $parse, $browser) {\n\n    function destroyChildScope($event) {\n        $event.currentScope.$$destroyed = true;\n    }\n\n    function cleanUpScope($scope) {\n\n      if (msie === 9) {\n        // There is a memory leak in IE9 if all child scopes are not disconnected\n        // completely when a scope is destroyed. So this code will recurse up through\n        // all this scopes children\n        //\n        // See issue https://github.com/angular/angular.js/issues/10706\n        $scope.$$childHead && cleanUpScope($scope.$$childHead);\n        $scope.$$nextSibling && cleanUpScope($scope.$$nextSibling);\n      }\n\n      // The code below works around IE9 and V8's memory leaks\n      //\n      // See:\n      // - https://code.google.com/p/v8/issues/detail?id=2073#c26\n      // - https://github.com/angular/angular.js/issues/6794#issuecomment-38648909\n      // - https://github.com/angular/angular.js/issues/1313#issuecomment-10378451\n\n      $scope.$parent = $scope.$$nextSibling = $scope.$$prevSibling = $scope.$$childHead =\n          $scope.$$childTail = $scope.$root = $scope.$$watchers = null;\n    }\n\n    /**\n     * @ngdoc type\n     * @name $rootScope.Scope\n     *\n     * @description\n     * A root scope can be retrieved using the {@link ng.$rootScope $rootScope} key from the\n     * {@link auto.$injector $injector}. Child scopes are created using the\n     * {@link ng.$rootScope.Scope#$new $new()} method. (Most scopes are created automatically when\n     * compiled HTML template is executed.) See also the {@link guide/scope Scopes guide} for\n     * an in-depth introduction and usage examples.\n     *\n     *\n     * # Inheritance\n     * A scope can inherit from a parent scope, as in this example:\n     * ```js\n         var parent = $rootScope;\n         var child = parent.$new();\n\n         parent.salutation = \"Hello\";\n         expect(child.salutation).toEqual('Hello');\n\n         child.salutation = \"Welcome\";\n         expect(child.salutation).toEqual('Welcome');\n         expect(parent.salutation).toEqual('Hello');\n     * ```\n     *\n     * When interacting with `Scope` in tests, additional helper methods are available on the\n     * instances of `Scope` type. See {@link ngMock.$rootScope.Scope ngMock Scope} for additional\n     * details.\n     *\n     *\n     * @param {Object.<string, function()>=} providers Map of service factory which need to be\n     *                                       provided for the current scope. Defaults to {@link ng}.\n     * @param {Object.<string, *>=} instanceCache Provides pre-instantiated services which should\n     *                              append/override services provided by `providers`. This is handy\n     *                              when unit-testing and having the need to override a default\n     *                              service.\n     * @returns {Object} Newly created scope.\n     *\n     */\n    function Scope() {\n      this.$id = nextUid();\n      this.$$phase = this.$parent = this.$$watchers =\n                     this.$$nextSibling = this.$$prevSibling =\n                     this.$$childHead = this.$$childTail = null;\n      this.$root = this;\n      this.$$destroyed = false;\n      this.$$listeners = {};\n      this.$$listenerCount = {};\n      this.$$watchersCount = 0;\n      this.$$isolateBindings = null;\n    }\n\n    /**\n     * @ngdoc property\n     * @name $rootScope.Scope#$id\n     *\n     * @description\n     * Unique scope ID (monotonically increasing) useful for debugging.\n     */\n\n     /**\n      * @ngdoc property\n      * @name $rootScope.Scope#$parent\n      *\n      * @description\n      * Reference to the parent scope.\n      */\n\n      /**\n       * @ngdoc property\n       * @name $rootScope.Scope#$root\n       *\n       * @description\n       * Reference to the root scope.\n       */\n\n    Scope.prototype = {\n      constructor: Scope,\n      /**\n       * @ngdoc method\n       * @name $rootScope.Scope#$new\n       * @kind function\n       *\n       * @description\n       * Creates a new child {@link ng.$rootScope.Scope scope}.\n       *\n       * The parent scope will propagate the {@link ng.$rootScope.Scope#$digest $digest()} event.\n       * The scope can be removed from the scope hierarchy using {@link ng.$rootScope.Scope#$destroy $destroy()}.\n       *\n       * {@link ng.$rootScope.Scope#$destroy $destroy()} must be called on a scope when it is\n       * desired for the scope and its child scopes to be permanently detached from the parent and\n       * thus stop participating in model change detection and listener notification by invoking.\n       *\n       * @param {boolean} isolate If true, then the scope does not prototypically inherit from the\n       *         parent scope. The scope is isolated, as it can not see parent scope properties.\n       *         When creating widgets, it is useful for the widget to not accidentally read parent\n       *         state.\n       *\n       * @param {Scope} [parent=this] The {@link ng.$rootScope.Scope `Scope`} that will be the `$parent`\n       *                              of the newly created scope. Defaults to `this` scope if not provided.\n       *                              This is used when creating a transclude scope to correctly place it\n       *                              in the scope hierarchy while maintaining the correct prototypical\n       *                              inheritance.\n       *\n       * @returns {Object} The newly created child scope.\n       *\n       */\n      $new: function(isolate, parent) {\n        var child;\n\n        parent = parent || this;\n\n        if (isolate) {\n          child = new Scope();\n          child.$root = this.$root;\n        } else {\n          // Only create a child scope class if somebody asks for one,\n          // but cache it to allow the VM to optimize lookups.\n          if (!this.$$ChildScope) {\n            this.$$ChildScope = createChildScopeClass(this);\n          }\n          child = new this.$$ChildScope();\n        }\n        child.$parent = parent;\n        child.$$prevSibling = parent.$$childTail;\n        if (parent.$$childHead) {\n          parent.$$childTail.$$nextSibling = child;\n          parent.$$childTail = child;\n        } else {\n          parent.$$childHead = parent.$$childTail = child;\n        }\n\n        // When the new scope is not isolated or we inherit from `this`, and\n        // the parent scope is destroyed, the property `$$destroyed` is inherited\n        // prototypically. In all other cases, this property needs to be set\n        // when the parent scope is destroyed.\n        // The listener needs to be added after the parent is set\n        if (isolate || parent != this) child.$on('$destroy', destroyChildScope);\n\n        return child;\n      },\n\n      /**\n       * @ngdoc method\n       * @name $rootScope.Scope#$watch\n       * @kind function\n       *\n       * @description\n       * Registers a `listener` callback to be executed whenever the `watchExpression` changes.\n       *\n       * - The `watchExpression` is called on every call to {@link ng.$rootScope.Scope#$digest\n       *   $digest()} and should return the value that will be watched. (`watchExpression` should not change\n       *   its value when executed multiple times with the same input because it may be executed multiple\n       *   times by {@link ng.$rootScope.Scope#$digest $digest()}. That is, `watchExpression` should be\n       *   [idempotent](http://en.wikipedia.org/wiki/Idempotence).\n       * - The `listener` is called only when the value from the current `watchExpression` and the\n       *   previous call to `watchExpression` are not equal (with the exception of the initial run,\n       *   see below). Inequality is determined according to reference inequality,\n       *   [strict comparison](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Comparison_Operators)\n       *    via the `!==` Javascript operator, unless `objectEquality == true`\n       *   (see next point)\n       * - When `objectEquality == true`, inequality of the `watchExpression` is determined\n       *   according to the {@link angular.equals} function. To save the value of the object for\n       *   later comparison, the {@link angular.copy} function is used. This therefore means that\n       *   watching complex objects will have adverse memory and performance implications.\n       * - The watch `listener` may change the model, which may trigger other `listener`s to fire.\n       *   This is achieved by rerunning the watchers until no changes are detected. The rerun\n       *   iteration limit is 10 to prevent an infinite loop deadlock.\n       *\n       *\n       * If you want to be notified whenever {@link ng.$rootScope.Scope#$digest $digest} is called,\n       * you can register a `watchExpression` function with no `listener`. (Be prepared for\n       * multiple calls to your `watchExpression` because it will execute multiple times in a\n       * single {@link ng.$rootScope.Scope#$digest $digest} cycle if a change is detected.)\n       *\n       * After a watcher is registered with the scope, the `listener` fn is called asynchronously\n       * (via {@link ng.$rootScope.Scope#$evalAsync $evalAsync}) to initialize the\n       * watcher. In rare cases, this is undesirable because the listener is called when the result\n       * of `watchExpression` didn't change. To detect this scenario within the `listener` fn, you\n       * can compare the `newVal` and `oldVal`. If these two values are identical (`===`) then the\n       * listener was called due to initialization.\n       *\n       *\n       *\n       * # Example\n       * ```js\n           // let's assume that scope was dependency injected as the $rootScope\n           var scope = $rootScope;\n           scope.name = 'misko';\n           scope.counter = 0;\n\n           expect(scope.counter).toEqual(0);\n           scope.$watch('name', function(newValue, oldValue) {\n             scope.counter = scope.counter + 1;\n           });\n           expect(scope.counter).toEqual(0);\n\n           scope.$digest();\n           // the listener is always called during the first $digest loop after it was registered\n           expect(scope.counter).toEqual(1);\n\n           scope.$digest();\n           // but now it will not be called unless the value changes\n           expect(scope.counter).toEqual(1);\n\n           scope.name = 'adam';\n           scope.$digest();\n           expect(scope.counter).toEqual(2);\n\n\n\n           // Using a function as a watchExpression\n           var food;\n           scope.foodCounter = 0;\n           expect(scope.foodCounter).toEqual(0);\n           scope.$watch(\n             // This function returns the value being watched. It is called for each turn of the $digest loop\n             function() { return food; },\n             // This is the change listener, called when the value returned from the above function changes\n             function(newValue, oldValue) {\n               if ( newValue !== oldValue ) {\n                 // Only increment the counter if the value changed\n                 scope.foodCounter = scope.foodCounter + 1;\n               }\n             }\n           );\n           // No digest has been run so the counter will be zero\n           expect(scope.foodCounter).toEqual(0);\n\n           // Run the digest but since food has not changed count will still be zero\n           scope.$digest();\n           expect(scope.foodCounter).toEqual(0);\n\n           // Update food and run digest.  Now the counter will increment\n           food = 'cheeseburger';\n           scope.$digest();\n           expect(scope.foodCounter).toEqual(1);\n\n       * ```\n       *\n       *\n       *\n       * @param {(function()|string)} watchExpression Expression that is evaluated on each\n       *    {@link ng.$rootScope.Scope#$digest $digest} cycle. A change in the return value triggers\n       *    a call to the `listener`.\n       *\n       *    - `string`: Evaluated as {@link guide/expression expression}\n       *    - `function(scope)`: called with current `scope` as a parameter.\n       * @param {function(newVal, oldVal, scope)} listener Callback called whenever the value\n       *    of `watchExpression` changes.\n       *\n       *    - `newVal` contains the current value of the `watchExpression`\n       *    - `oldVal` contains the previous value of the `watchExpression`\n       *    - `scope` refers to the current scope\n       * @param {boolean=} [objectEquality=false] Compare for object equality using {@link angular.equals} instead of\n       *     comparing for reference equality.\n       * @returns {function()} Returns a deregistration function for this listener.\n       */\n      $watch: function(watchExp, listener, objectEquality, prettyPrintExpression) {\n        var get = $parse(watchExp);\n\n        if (get.$$watchDelegate) {\n          return get.$$watchDelegate(this, listener, objectEquality, get, watchExp);\n        }\n        var scope = this,\n            array = scope.$$watchers,\n            watcher = {\n              fn: listener,\n              last: initWatchVal,\n              get: get,\n              exp: prettyPrintExpression || watchExp,\n              eq: !!objectEquality\n            };\n\n        lastDirtyWatch = null;\n\n        if (!isFunction(listener)) {\n          watcher.fn = noop;\n        }\n\n        if (!array) {\n          array = scope.$$watchers = [];\n        }\n        // we use unshift since we use a while loop in $digest for speed.\n        // the while loop reads in reverse order.\n        array.unshift(watcher);\n        incrementWatchersCount(this, 1);\n\n        return function deregisterWatch() {\n          if (arrayRemove(array, watcher) >= 0) {\n            incrementWatchersCount(scope, -1);\n          }\n          lastDirtyWatch = null;\n        };\n      },\n\n      /**\n       * @ngdoc method\n       * @name $rootScope.Scope#$watchGroup\n       * @kind function\n       *\n       * @description\n       * A variant of {@link ng.$rootScope.Scope#$watch $watch()} where it watches an array of `watchExpressions`.\n       * If any one expression in the collection changes the `listener` is executed.\n       *\n       * - The items in the `watchExpressions` array are observed via standard $watch operation and are examined on every\n       *   call to $digest() to see if any items changes.\n       * - The `listener` is called whenever any expression in the `watchExpressions` array changes.\n       *\n       * @param {Array.<string|Function(scope)>} watchExpressions Array of expressions that will be individually\n       * watched using {@link ng.$rootScope.Scope#$watch $watch()}\n       *\n       * @param {function(newValues, oldValues, scope)} listener Callback called whenever the return value of any\n       *    expression in `watchExpressions` changes\n       *    The `newValues` array contains the current values of the `watchExpressions`, with the indexes matching\n       *    those of `watchExpression`\n       *    and the `oldValues` array contains the previous values of the `watchExpressions`, with the indexes matching\n       *    those of `watchExpression`\n       *    The `scope` refers to the current scope.\n       * @returns {function()} Returns a de-registration function for all listeners.\n       */\n      $watchGroup: function(watchExpressions, listener) {\n        var oldValues = new Array(watchExpressions.length);\n        var newValues = new Array(watchExpressions.length);\n        var deregisterFns = [];\n        var self = this;\n        var changeReactionScheduled = false;\n        var firstRun = true;\n\n        if (!watchExpressions.length) {\n          // No expressions means we call the listener ASAP\n          var shouldCall = true;\n          self.$evalAsync(function() {\n            if (shouldCall) listener(newValues, newValues, self);\n          });\n          return function deregisterWatchGroup() {\n            shouldCall = false;\n          };\n        }\n\n        if (watchExpressions.length === 1) {\n          // Special case size of one\n          return this.$watch(watchExpressions[0], function watchGroupAction(value, oldValue, scope) {\n            newValues[0] = value;\n            oldValues[0] = oldValue;\n            listener(newValues, (value === oldValue) ? newValues : oldValues, scope);\n          });\n        }\n\n        forEach(watchExpressions, function(expr, i) {\n          var unwatchFn = self.$watch(expr, function watchGroupSubAction(value, oldValue) {\n            newValues[i] = value;\n            oldValues[i] = oldValue;\n            if (!changeReactionScheduled) {\n              changeReactionScheduled = true;\n              self.$evalAsync(watchGroupAction);\n            }\n          });\n          deregisterFns.push(unwatchFn);\n        });\n\n        function watchGroupAction() {\n          changeReactionScheduled = false;\n\n          if (firstRun) {\n            firstRun = false;\n            listener(newValues, newValues, self);\n          } else {\n            listener(newValues, oldValues, self);\n          }\n        }\n\n        return function deregisterWatchGroup() {\n          while (deregisterFns.length) {\n            deregisterFns.shift()();\n          }\n        };\n      },\n\n\n      /**\n       * @ngdoc method\n       * @name $rootScope.Scope#$watchCollection\n       * @kind function\n       *\n       * @description\n       * Shallow watches the properties of an object and fires whenever any of the properties change\n       * (for arrays, this implies watching the array items; for object maps, this implies watching\n       * the properties). If a change is detected, the `listener` callback is fired.\n       *\n       * - The `obj` collection is observed via standard $watch operation and is examined on every\n       *   call to $digest() to see if any items have been added, removed, or moved.\n       * - The `listener` is called whenever anything within the `obj` has changed. Examples include\n       *   adding, removing, and moving items belonging to an object or array.\n       *\n       *\n       * # Example\n       * ```js\n          $scope.names = ['igor', 'matias', 'misko', 'james'];\n          $scope.dataCount = 4;\n\n          $scope.$watchCollection('names', function(newNames, oldNames) {\n            $scope.dataCount = newNames.length;\n          });\n\n          expect($scope.dataCount).toEqual(4);\n          $scope.$digest();\n\n          //still at 4 ... no changes\n          expect($scope.dataCount).toEqual(4);\n\n          $scope.names.pop();\n          $scope.$digest();\n\n          //now there's been a change\n          expect($scope.dataCount).toEqual(3);\n       * ```\n       *\n       *\n       * @param {string|function(scope)} obj Evaluated as {@link guide/expression expression}. The\n       *    expression value should evaluate to an object or an array which is observed on each\n       *    {@link ng.$rootScope.Scope#$digest $digest} cycle. Any shallow change within the\n       *    collection will trigger a call to the `listener`.\n       *\n       * @param {function(newCollection, oldCollection, scope)} listener a callback function called\n       *    when a change is detected.\n       *    - The `newCollection` object is the newly modified data obtained from the `obj` expression\n       *    - The `oldCollection` object is a copy of the former collection data.\n       *      Due to performance considerations, the`oldCollection` value is computed only if the\n       *      `listener` function declares two or more arguments.\n       *    - The `scope` argument refers to the current scope.\n       *\n       * @returns {function()} Returns a de-registration function for this listener. When the\n       *    de-registration function is executed, the internal watch operation is terminated.\n       */\n      $watchCollection: function(obj, listener) {\n        $watchCollectionInterceptor.$stateful = true;\n\n        var self = this;\n        // the current value, updated on each dirty-check run\n        var newValue;\n        // a shallow copy of the newValue from the last dirty-check run,\n        // updated to match newValue during dirty-check run\n        var oldValue;\n        // a shallow copy of the newValue from when the last change happened\n        var veryOldValue;\n        // only track veryOldValue if the listener is asking for it\n        var trackVeryOldValue = (listener.length > 1);\n        var changeDetected = 0;\n        var changeDetector = $parse(obj, $watchCollectionInterceptor);\n        var internalArray = [];\n        var internalObject = {};\n        var initRun = true;\n        var oldLength = 0;\n\n        function $watchCollectionInterceptor(_value) {\n          newValue = _value;\n          var newLength, key, bothNaN, newItem, oldItem;\n\n          // If the new value is undefined, then return undefined as the watch may be a one-time watch\n          if (isUndefined(newValue)) return;\n\n          if (!isObject(newValue)) { // if primitive\n            if (oldValue !== newValue) {\n              oldValue = newValue;\n              changeDetected++;\n            }\n          } else if (isArrayLike(newValue)) {\n            if (oldValue !== internalArray) {\n              // we are transitioning from something which was not an array into array.\n              oldValue = internalArray;\n              oldLength = oldValue.length = 0;\n              changeDetected++;\n            }\n\n            newLength = newValue.length;\n\n            if (oldLength !== newLength) {\n              // if lengths do not match we need to trigger change notification\n              changeDetected++;\n              oldValue.length = oldLength = newLength;\n            }\n            // copy the items to oldValue and look for changes.\n            for (var i = 0; i < newLength; i++) {\n              oldItem = oldValue[i];\n              newItem = newValue[i];\n\n              bothNaN = (oldItem !== oldItem) && (newItem !== newItem);\n              if (!bothNaN && (oldItem !== newItem)) {\n                changeDetected++;\n                oldValue[i] = newItem;\n              }\n            }\n          } else {\n            if (oldValue !== internalObject) {\n              // we are transitioning from something which was not an object into object.\n              oldValue = internalObject = {};\n              oldLength = 0;\n              changeDetected++;\n            }\n            // copy the items to oldValue and look for changes.\n            newLength = 0;\n            for (key in newValue) {\n              if (hasOwnProperty.call(newValue, key)) {\n                newLength++;\n                newItem = newValue[key];\n                oldItem = oldValue[key];\n\n                if (key in oldValue) {\n                  bothNaN = (oldItem !== oldItem) && (newItem !== newItem);\n                  if (!bothNaN && (oldItem !== newItem)) {\n                    changeDetected++;\n                    oldValue[key] = newItem;\n                  }\n                } else {\n                  oldLength++;\n                  oldValue[key] = newItem;\n                  changeDetected++;\n                }\n              }\n            }\n            if (oldLength > newLength) {\n              // we used to have more keys, need to find them and destroy them.\n              changeDetected++;\n              for (key in oldValue) {\n                if (!hasOwnProperty.call(newValue, key)) {\n                  oldLength--;\n                  delete oldValue[key];\n                }\n              }\n            }\n          }\n          return changeDetected;\n        }\n\n        function $watchCollectionAction() {\n          if (initRun) {\n            initRun = false;\n            listener(newValue, newValue, self);\n          } else {\n            listener(newValue, veryOldValue, self);\n          }\n\n          // make a copy for the next time a collection is changed\n          if (trackVeryOldValue) {\n            if (!isObject(newValue)) {\n              //primitive\n              veryOldValue = newValue;\n            } else if (isArrayLike(newValue)) {\n              veryOldValue = new Array(newValue.length);\n              for (var i = 0; i < newValue.length; i++) {\n                veryOldValue[i] = newValue[i];\n              }\n            } else { // if object\n              veryOldValue = {};\n              for (var key in newValue) {\n                if (hasOwnProperty.call(newValue, key)) {\n                  veryOldValue[key] = newValue[key];\n                }\n              }\n            }\n          }\n        }\n\n        return this.$watch(changeDetector, $watchCollectionAction);\n      },\n\n      /**\n       * @ngdoc method\n       * @name $rootScope.Scope#$digest\n       * @kind function\n       *\n       * @description\n       * Processes all of the {@link ng.$rootScope.Scope#$watch watchers} of the current scope and\n       * its children. Because a {@link ng.$rootScope.Scope#$watch watcher}'s listener can change\n       * the model, the `$digest()` keeps calling the {@link ng.$rootScope.Scope#$watch watchers}\n       * until no more listeners are firing. This means that it is possible to get into an infinite\n       * loop. This function will throw `'Maximum iteration limit exceeded.'` if the number of\n       * iterations exceeds 10.\n       *\n       * Usually, you don't call `$digest()` directly in\n       * {@link ng.directive:ngController controllers} or in\n       * {@link ng.$compileProvider#directive directives}.\n       * Instead, you should call {@link ng.$rootScope.Scope#$apply $apply()} (typically from within\n       * a {@link ng.$compileProvider#directive directive}), which will force a `$digest()`.\n       *\n       * If you want to be notified whenever `$digest()` is called,\n       * you can register a `watchExpression` function with\n       * {@link ng.$rootScope.Scope#$watch $watch()} with no `listener`.\n       *\n       * In unit tests, you may need to call `$digest()` to simulate the scope life cycle.\n       *\n       * # Example\n       * ```js\n           var scope = ...;\n           scope.name = 'misko';\n           scope.counter = 0;\n\n           expect(scope.counter).toEqual(0);\n           scope.$watch('name', function(newValue, oldValue) {\n             scope.counter = scope.counter + 1;\n           });\n           expect(scope.counter).toEqual(0);\n\n           scope.$digest();\n           // the listener is always called during the first $digest loop after it was registered\n           expect(scope.counter).toEqual(1);\n\n           scope.$digest();\n           // but now it will not be called unless the value changes\n           expect(scope.counter).toEqual(1);\n\n           scope.name = 'adam';\n           scope.$digest();\n           expect(scope.counter).toEqual(2);\n       * ```\n       *\n       */\n      $digest: function() {\n        var watch, value, last, fn, get,\n            watchers,\n            length,\n            dirty, ttl = TTL,\n            next, current, target = this,\n            watchLog = [],\n            logIdx, asyncTask;\n\n        beginPhase('$digest');\n        // Check for changes to browser url that happened in sync before the call to $digest\n        $browser.$$checkUrlChange();\n\n        if (this === $rootScope && applyAsyncId !== null) {\n          // If this is the root scope, and $applyAsync has scheduled a deferred $apply(), then\n          // cancel the scheduled $apply and flush the queue of expressions to be evaluated.\n          $browser.defer.cancel(applyAsyncId);\n          flushApplyAsync();\n        }\n\n        lastDirtyWatch = null;\n\n        do { // \"while dirty\" loop\n          dirty = false;\n          current = target;\n\n          while (asyncQueue.length) {\n            try {\n              asyncTask = asyncQueue.shift();\n              asyncTask.scope.$eval(asyncTask.expression, asyncTask.locals);\n            } catch (e) {\n              $exceptionHandler(e);\n            }\n            lastDirtyWatch = null;\n          }\n\n          traverseScopesLoop:\n          do { // \"traverse the scopes\" loop\n            if ((watchers = current.$$watchers)) {\n              // process our watches\n              length = watchers.length;\n              while (length--) {\n                try {\n                  watch = watchers[length];\n                  // Most common watches are on primitives, in which case we can short\n                  // circuit it with === operator, only when === fails do we use .equals\n                  if (watch) {\n                    get = watch.get;\n                    if ((value = get(current)) !== (last = watch.last) &&\n                        !(watch.eq\n                            ? equals(value, last)\n                            : (typeof value === 'number' && typeof last === 'number'\n                               && isNaN(value) && isNaN(last)))) {\n                      dirty = true;\n                      lastDirtyWatch = watch;\n                      watch.last = watch.eq ? copy(value, null) : value;\n                      fn = watch.fn;\n                      fn(value, ((last === initWatchVal) ? value : last), current);\n                      if (ttl < 5) {\n                        logIdx = 4 - ttl;\n                        if (!watchLog[logIdx]) watchLog[logIdx] = [];\n                        watchLog[logIdx].push({\n                          msg: isFunction(watch.exp) ? 'fn: ' + (watch.exp.name || watch.exp.toString()) : watch.exp,\n                          newVal: value,\n                          oldVal: last\n                        });\n                      }\n                    } else if (watch === lastDirtyWatch) {\n                      // If the most recently dirty watcher is now clean, short circuit since the remaining watchers\n                      // have already been tested.\n                      dirty = false;\n                      break traverseScopesLoop;\n                    }\n                  }\n                } catch (e) {\n                  $exceptionHandler(e);\n                }\n              }\n            }\n\n            // Insanity Warning: scope depth-first traversal\n            // yes, this code is a bit crazy, but it works and we have tests to prove it!\n            // this piece should be kept in sync with the traversal in $broadcast\n            if (!(next = ((current.$$watchersCount && current.$$childHead) ||\n                (current !== target && current.$$nextSibling)))) {\n              while (current !== target && !(next = current.$$nextSibling)) {\n                current = current.$parent;\n              }\n            }\n          } while ((current = next));\n\n          // `break traverseScopesLoop;` takes us to here\n\n          if ((dirty || asyncQueue.length) && !(ttl--)) {\n            clearPhase();\n            throw $rootScopeMinErr('infdig',\n                '{0} $digest() iterations reached. Aborting!\\n' +\n                'Watchers fired in the last 5 iterations: {1}',\n                TTL, watchLog);\n          }\n\n        } while (dirty || asyncQueue.length);\n\n        clearPhase();\n\n        while (postDigestQueue.length) {\n          try {\n            postDigestQueue.shift()();\n          } catch (e) {\n            $exceptionHandler(e);\n          }\n        }\n      },\n\n\n      /**\n       * @ngdoc event\n       * @name $rootScope.Scope#$destroy\n       * @eventType broadcast on scope being destroyed\n       *\n       * @description\n       * Broadcasted when a scope and its children are being destroyed.\n       *\n       * Note that, in AngularJS, there is also a `$destroy` jQuery event, which can be used to\n       * clean up DOM bindings before an element is removed from the DOM.\n       */\n\n      /**\n       * @ngdoc method\n       * @name $rootScope.Scope#$destroy\n       * @kind function\n       *\n       * @description\n       * Removes the current scope (and all of its children) from the parent scope. Removal implies\n       * that calls to {@link ng.$rootScope.Scope#$digest $digest()} will no longer\n       * propagate to the current scope and its children. Removal also implies that the current\n       * scope is eligible for garbage collection.\n       *\n       * The `$destroy()` is usually used by directives such as\n       * {@link ng.directive:ngRepeat ngRepeat} for managing the\n       * unrolling of the loop.\n       *\n       * Just before a scope is destroyed, a `$destroy` event is broadcasted on this scope.\n       * Application code can register a `$destroy` event handler that will give it a chance to\n       * perform any necessary cleanup.\n       *\n       * Note that, in AngularJS, there is also a `$destroy` jQuery event, which can be used to\n       * clean up DOM bindings before an element is removed from the DOM.\n       */\n      $destroy: function() {\n        // We can't destroy a scope that has been already destroyed.\n        if (this.$$destroyed) return;\n        var parent = this.$parent;\n\n        this.$broadcast('$destroy');\n        this.$$destroyed = true;\n\n        if (this === $rootScope) {\n          //Remove handlers attached to window when $rootScope is removed\n          $browser.$$applicationDestroyed();\n        }\n\n        incrementWatchersCount(this, -this.$$watchersCount);\n        for (var eventName in this.$$listenerCount) {\n          decrementListenerCount(this, this.$$listenerCount[eventName], eventName);\n        }\n\n        // sever all the references to parent scopes (after this cleanup, the current scope should\n        // not be retained by any of our references and should be eligible for garbage collection)\n        if (parent && parent.$$childHead == this) parent.$$childHead = this.$$nextSibling;\n        if (parent && parent.$$childTail == this) parent.$$childTail = this.$$prevSibling;\n        if (this.$$prevSibling) this.$$prevSibling.$$nextSibling = this.$$nextSibling;\n        if (this.$$nextSibling) this.$$nextSibling.$$prevSibling = this.$$prevSibling;\n\n        // Disable listeners, watchers and apply/digest methods\n        this.$destroy = this.$digest = this.$apply = this.$evalAsync = this.$applyAsync = noop;\n        this.$on = this.$watch = this.$watchGroup = function() { return noop; };\n        this.$$listeners = {};\n\n        // Disconnect the next sibling to prevent `cleanUpScope` destroying those too\n        this.$$nextSibling = null;\n        cleanUpScope(this);\n      },\n\n      /**\n       * @ngdoc method\n       * @name $rootScope.Scope#$eval\n       * @kind function\n       *\n       * @description\n       * Executes the `expression` on the current scope and returns the result. Any exceptions in\n       * the expression are propagated (uncaught). This is useful when evaluating Angular\n       * expressions.\n       *\n       * # Example\n       * ```js\n           var scope = ng.$rootScope.Scope();\n           scope.a = 1;\n           scope.b = 2;\n\n           expect(scope.$eval('a+b')).toEqual(3);\n           expect(scope.$eval(function(scope){ return scope.a + scope.b; })).toEqual(3);\n       * ```\n       *\n       * @param {(string|function())=} expression An angular expression to be executed.\n       *\n       *    - `string`: execute using the rules as defined in  {@link guide/expression expression}.\n       *    - `function(scope)`: execute the function with the current `scope` parameter.\n       *\n       * @param {(object)=} locals Local variables object, useful for overriding values in scope.\n       * @returns {*} The result of evaluating the expression.\n       */\n      $eval: function(expr, locals) {\n        return $parse(expr)(this, locals);\n      },\n\n      /**\n       * @ngdoc method\n       * @name $rootScope.Scope#$evalAsync\n       * @kind function\n       *\n       * @description\n       * Executes the expression on the current scope at a later point in time.\n       *\n       * The `$evalAsync` makes no guarantees as to when the `expression` will be executed, only\n       * that:\n       *\n       *   - it will execute after the function that scheduled the evaluation (preferably before DOM\n       *     rendering).\n       *   - at least one {@link ng.$rootScope.Scope#$digest $digest cycle} will be performed after\n       *     `expression` execution.\n       *\n       * Any exceptions from the execution of the expression are forwarded to the\n       * {@link ng.$exceptionHandler $exceptionHandler} service.\n       *\n       * __Note:__ if this function is called outside of a `$digest` cycle, a new `$digest` cycle\n       * will be scheduled. However, it is encouraged to always call code that changes the model\n       * from within an `$apply` call. That includes code evaluated via `$evalAsync`.\n       *\n       * @param {(string|function())=} expression An angular expression to be executed.\n       *\n       *    - `string`: execute using the rules as defined in {@link guide/expression expression}.\n       *    - `function(scope)`: execute the function with the current `scope` parameter.\n       *\n       * @param {(object)=} locals Local variables object, useful for overriding values in scope.\n       */\n      $evalAsync: function(expr, locals) {\n        // if we are outside of an $digest loop and this is the first time we are scheduling async\n        // task also schedule async auto-flush\n        if (!$rootScope.$$phase && !asyncQueue.length) {\n          $browser.defer(function() {\n            if (asyncQueue.length) {\n              $rootScope.$digest();\n            }\n          });\n        }\n\n        asyncQueue.push({scope: this, expression: $parse(expr), locals: locals});\n      },\n\n      $$postDigest: function(fn) {\n        postDigestQueue.push(fn);\n      },\n\n      /**\n       * @ngdoc method\n       * @name $rootScope.Scope#$apply\n       * @kind function\n       *\n       * @description\n       * `$apply()` is used to execute an expression in angular from outside of the angular\n       * framework. (For example from browser DOM events, setTimeout, XHR or third party libraries).\n       * Because we are calling into the angular framework we need to perform proper scope life\n       * cycle of {@link ng.$exceptionHandler exception handling},\n       * {@link ng.$rootScope.Scope#$digest executing watches}.\n       *\n       * ## Life cycle\n       *\n       * # Pseudo-Code of `$apply()`\n       * ```js\n           function $apply(expr) {\n             try {\n               return $eval(expr);\n             } catch (e) {\n               $exceptionHandler(e);\n             } finally {\n               $root.$digest();\n             }\n           }\n       * ```\n       *\n       *\n       * Scope's `$apply()` method transitions through the following stages:\n       *\n       * 1. The {@link guide/expression expression} is executed using the\n       *    {@link ng.$rootScope.Scope#$eval $eval()} method.\n       * 2. Any exceptions from the execution of the expression are forwarded to the\n       *    {@link ng.$exceptionHandler $exceptionHandler} service.\n       * 3. The {@link ng.$rootScope.Scope#$watch watch} listeners are fired immediately after the\n       *    expression was executed using the {@link ng.$rootScope.Scope#$digest $digest()} method.\n       *\n       *\n       * @param {(string|function())=} exp An angular expression to be executed.\n       *\n       *    - `string`: execute using the rules as defined in {@link guide/expression expression}.\n       *    - `function(scope)`: execute the function with current `scope` parameter.\n       *\n       * @returns {*} The result of evaluating the expression.\n       */\n      $apply: function(expr) {\n        try {\n          beginPhase('$apply');\n          try {\n            return this.$eval(expr);\n          } finally {\n            clearPhase();\n          }\n        } catch (e) {\n          $exceptionHandler(e);\n        } finally {\n          try {\n            $rootScope.$digest();\n          } catch (e) {\n            $exceptionHandler(e);\n            throw e;\n          }\n        }\n      },\n\n      /**\n       * @ngdoc method\n       * @name $rootScope.Scope#$applyAsync\n       * @kind function\n       *\n       * @description\n       * Schedule the invocation of $apply to occur at a later time. The actual time difference\n       * varies across browsers, but is typically around ~10 milliseconds.\n       *\n       * This can be used to queue up multiple expressions which need to be evaluated in the same\n       * digest.\n       *\n       * @param {(string|function())=} exp An angular expression to be executed.\n       *\n       *    - `string`: execute using the rules as defined in {@link guide/expression expression}.\n       *    - `function(scope)`: execute the function with current `scope` parameter.\n       */\n      $applyAsync: function(expr) {\n        var scope = this;\n        expr && applyAsyncQueue.push($applyAsyncExpression);\n        expr = $parse(expr);\n        scheduleApplyAsync();\n\n        function $applyAsyncExpression() {\n          scope.$eval(expr);\n        }\n      },\n\n      /**\n       * @ngdoc method\n       * @name $rootScope.Scope#$on\n       * @kind function\n       *\n       * @description\n       * Listens on events of a given type. See {@link ng.$rootScope.Scope#$emit $emit} for\n       * discussion of event life cycle.\n       *\n       * The event listener function format is: `function(event, args...)`. The `event` object\n       * passed into the listener has the following attributes:\n       *\n       *   - `targetScope` - `{Scope}`: the scope on which the event was `$emit`-ed or\n       *     `$broadcast`-ed.\n       *   - `currentScope` - `{Scope}`: the scope that is currently handling the event. Once the\n       *     event propagates through the scope hierarchy, this property is set to null.\n       *   - `name` - `{string}`: name of the event.\n       *   - `stopPropagation` - `{function=}`: calling `stopPropagation` function will cancel\n       *     further event propagation (available only for events that were `$emit`-ed).\n       *   - `preventDefault` - `{function}`: calling `preventDefault` sets `defaultPrevented` flag\n       *     to true.\n       *   - `defaultPrevented` - `{boolean}`: true if `preventDefault` was called.\n       *\n       * @param {string} name Event name to listen on.\n       * @param {function(event, ...args)} listener Function to call when the event is emitted.\n       * @returns {function()} Returns a deregistration function for this listener.\n       */\n      $on: function(name, listener) {\n        var namedListeners = this.$$listeners[name];\n        if (!namedListeners) {\n          this.$$listeners[name] = namedListeners = [];\n        }\n        namedListeners.push(listener);\n\n        var current = this;\n        do {\n          if (!current.$$listenerCount[name]) {\n            current.$$listenerCount[name] = 0;\n          }\n          current.$$listenerCount[name]++;\n        } while ((current = current.$parent));\n\n        var self = this;\n        return function() {\n          var indexOfListener = namedListeners.indexOf(listener);\n          if (indexOfListener !== -1) {\n            namedListeners[indexOfListener] = null;\n            decrementListenerCount(self, 1, name);\n          }\n        };\n      },\n\n\n      /**\n       * @ngdoc method\n       * @name $rootScope.Scope#$emit\n       * @kind function\n       *\n       * @description\n       * Dispatches an event `name` upwards through the scope hierarchy notifying the\n       * registered {@link ng.$rootScope.Scope#$on} listeners.\n       *\n       * The event life cycle starts at the scope on which `$emit` was called. All\n       * {@link ng.$rootScope.Scope#$on listeners} listening for `name` event on this scope get\n       * notified. Afterwards, the event traverses upwards toward the root scope and calls all\n       * registered listeners along the way. The event will stop propagating if one of the listeners\n       * cancels it.\n       *\n       * Any exception emitted from the {@link ng.$rootScope.Scope#$on listeners} will be passed\n       * onto the {@link ng.$exceptionHandler $exceptionHandler} service.\n       *\n       * @param {string} name Event name to emit.\n       * @param {...*} args Optional one or more arguments which will be passed onto the event listeners.\n       * @return {Object} Event object (see {@link ng.$rootScope.Scope#$on}).\n       */\n      $emit: function(name, args) {\n        var empty = [],\n            namedListeners,\n            scope = this,\n            stopPropagation = false,\n            event = {\n              name: name,\n              targetScope: scope,\n              stopPropagation: function() {stopPropagation = true;},\n              preventDefault: function() {\n                event.defaultPrevented = true;\n              },\n              defaultPrevented: false\n            },\n            listenerArgs = concat([event], arguments, 1),\n            i, length;\n\n        do {\n          namedListeners = scope.$$listeners[name] || empty;\n          event.currentScope = scope;\n          for (i = 0, length = namedListeners.length; i < length; i++) {\n\n            // if listeners were deregistered, defragment the array\n            if (!namedListeners[i]) {\n              namedListeners.splice(i, 1);\n              i--;\n              length--;\n              continue;\n            }\n            try {\n              //allow all listeners attached to the current scope to run\n              namedListeners[i].apply(null, listenerArgs);\n            } catch (e) {\n              $exceptionHandler(e);\n            }\n          }\n          //if any listener on the current scope stops propagation, prevent bubbling\n          if (stopPropagation) {\n            event.currentScope = null;\n            return event;\n          }\n          //traverse upwards\n          scope = scope.$parent;\n        } while (scope);\n\n        event.currentScope = null;\n\n        return event;\n      },\n\n\n      /**\n       * @ngdoc method\n       * @name $rootScope.Scope#$broadcast\n       * @kind function\n       *\n       * @description\n       * Dispatches an event `name` downwards to all child scopes (and their children) notifying the\n       * registered {@link ng.$rootScope.Scope#$on} listeners.\n       *\n       * The event life cycle starts at the scope on which `$broadcast` was called. All\n       * {@link ng.$rootScope.Scope#$on listeners} listening for `name` event on this scope get\n       * notified. Afterwards, the event propagates to all direct and indirect scopes of the current\n       * scope and calls all registered listeners along the way. The event cannot be canceled.\n       *\n       * Any exception emitted from the {@link ng.$rootScope.Scope#$on listeners} will be passed\n       * onto the {@link ng.$exceptionHandler $exceptionHandler} service.\n       *\n       * @param {string} name Event name to broadcast.\n       * @param {...*} args Optional one or more arguments which will be passed onto the event listeners.\n       * @return {Object} Event object, see {@link ng.$rootScope.Scope#$on}\n       */\n      $broadcast: function(name, args) {\n        var target = this,\n            current = target,\n            next = target,\n            event = {\n              name: name,\n              targetScope: target,\n              preventDefault: function() {\n                event.defaultPrevented = true;\n              },\n              defaultPrevented: false\n            };\n\n        if (!target.$$listenerCount[name]) return event;\n\n        var listenerArgs = concat([event], arguments, 1),\n            listeners, i, length;\n\n        //down while you can, then up and next sibling or up and next sibling until back at root\n        while ((current = next)) {\n          event.currentScope = current;\n          listeners = current.$$listeners[name] || [];\n          for (i = 0, length = listeners.length; i < length; i++) {\n            // if listeners were deregistered, defragment the array\n            if (!listeners[i]) {\n              listeners.splice(i, 1);\n              i--;\n              length--;\n              continue;\n            }\n\n            try {\n              listeners[i].apply(null, listenerArgs);\n            } catch (e) {\n              $exceptionHandler(e);\n            }\n          }\n\n          // Insanity Warning: scope depth-first traversal\n          // yes, this code is a bit crazy, but it works and we have tests to prove it!\n          // this piece should be kept in sync with the traversal in $digest\n          // (though it differs due to having the extra check for $$listenerCount)\n          if (!(next = ((current.$$listenerCount[name] && current.$$childHead) ||\n              (current !== target && current.$$nextSibling)))) {\n            while (current !== target && !(next = current.$$nextSibling)) {\n              current = current.$parent;\n            }\n          }\n        }\n\n        event.currentScope = null;\n        return event;\n      }\n    };\n\n    var $rootScope = new Scope();\n\n    //The internal queues. Expose them on the $rootScope for debugging/testing purposes.\n    var asyncQueue = $rootScope.$$asyncQueue = [];\n    var postDigestQueue = $rootScope.$$postDigestQueue = [];\n    var applyAsyncQueue = $rootScope.$$applyAsyncQueue = [];\n\n    return $rootScope;\n\n\n    function beginPhase(phase) {\n      if ($rootScope.$$phase) {\n        throw $rootScopeMinErr('inprog', '{0} already in progress', $rootScope.$$phase);\n      }\n\n      $rootScope.$$phase = phase;\n    }\n\n    function clearPhase() {\n      $rootScope.$$phase = null;\n    }\n\n    function incrementWatchersCount(current, count) {\n      do {\n        current.$$watchersCount += count;\n      } while ((current = current.$parent));\n    }\n\n    function decrementListenerCount(current, count, name) {\n      do {\n        current.$$listenerCount[name] -= count;\n\n        if (current.$$listenerCount[name] === 0) {\n          delete current.$$listenerCount[name];\n        }\n      } while ((current = current.$parent));\n    }\n\n    /**\n     * function used as an initial value for watchers.\n     * because it's unique we can easily tell it apart from other values\n     */\n    function initWatchVal() {}\n\n    function flushApplyAsync() {\n      while (applyAsyncQueue.length) {\n        try {\n          applyAsyncQueue.shift()();\n        } catch (e) {\n          $exceptionHandler(e);\n        }\n      }\n      applyAsyncId = null;\n    }\n\n    function scheduleApplyAsync() {\n      if (applyAsyncId === null) {\n        applyAsyncId = $browser.defer(function() {\n          $rootScope.$apply(flushApplyAsync);\n        });\n      }\n    }\n  }];\n}\n\n/**\n * @ngdoc service\n * @name $rootElement\n *\n * @description\n * The root element of Angular application. This is either the element where {@link\n * ng.directive:ngApp ngApp} was declared or the element passed into\n * {@link angular.bootstrap}. The element represents the root element of application. It is also the\n * location where the application's {@link auto.$injector $injector} service gets\n * published, and can be retrieved using `$rootElement.injector()`.\n */\n\n\n// the implementation is in angular.bootstrap\n\n/**\n * @description\n * Private service to sanitize uris for links and images. Used by $compile and $sanitize.\n */\nfunction $$SanitizeUriProvider() {\n  var aHrefSanitizationWhitelist = /^\\s*(https?|ftp|mailto|tel|file):/,\n    imgSrcSanitizationWhitelist = /^\\s*((https?|ftp|file|blob):|data:image\\/)/;\n\n  /**\n   * @description\n   * Retrieves or overrides the default regular expression that is used for whitelisting of safe\n   * urls during a[href] sanitization.\n   *\n   * The sanitization is a security measure aimed at prevent XSS attacks via html links.\n   *\n   * Any url about to be assigned to a[href] via data-binding is first normalized and turned into\n   * an absolute url. Afterwards, the url is matched against the `aHrefSanitizationWhitelist`\n   * regular expression. If a match is found, the original url is written into the dom. Otherwise,\n   * the absolute url is prefixed with `'unsafe:'` string and only then is it written into the DOM.\n   *\n   * @param {RegExp=} regexp New regexp to whitelist urls with.\n   * @returns {RegExp|ng.$compileProvider} Current RegExp if called without value or self for\n   *    chaining otherwise.\n   */\n  this.aHrefSanitizationWhitelist = function(regexp) {\n    if (isDefined(regexp)) {\n      aHrefSanitizationWhitelist = regexp;\n      return this;\n    }\n    return aHrefSanitizationWhitelist;\n  };\n\n\n  /**\n   * @description\n   * Retrieves or overrides the default regular expression that is used for whitelisting of safe\n   * urls during img[src] sanitization.\n   *\n   * The sanitization is a security measure aimed at prevent XSS attacks via html links.\n   *\n   * Any url about to be assigned to img[src] via data-binding is first normalized and turned into\n   * an absolute url. Afterwards, the url is matched against the `imgSrcSanitizationWhitelist`\n   * regular expression. If a match is found, the original url is written into the dom. Otherwise,\n   * the absolute url is prefixed with `'unsafe:'` string and only then is it written into the DOM.\n   *\n   * @param {RegExp=} regexp New regexp to whitelist urls with.\n   * @returns {RegExp|ng.$compileProvider} Current RegExp if called without value or self for\n   *    chaining otherwise.\n   */\n  this.imgSrcSanitizationWhitelist = function(regexp) {\n    if (isDefined(regexp)) {\n      imgSrcSanitizationWhitelist = regexp;\n      return this;\n    }\n    return imgSrcSanitizationWhitelist;\n  };\n\n  this.$get = function() {\n    return function sanitizeUri(uri, isImage) {\n      var regex = isImage ? imgSrcSanitizationWhitelist : aHrefSanitizationWhitelist;\n      var normalizedVal;\n      normalizedVal = urlResolve(uri).href;\n      if (normalizedVal !== '' && !normalizedVal.match(regex)) {\n        return 'unsafe:' + normalizedVal;\n      }\n      return uri;\n    };\n  };\n}\n\n/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n *     Any commits to this file should be reviewed with security in mind.  *\n *   Changes to this file can potentially create security vulnerabilities. *\n *          An approval from 2 Core members with history of modifying      *\n *                         this file is required.                          *\n *                                                                         *\n *  Does the change somehow allow for arbitrary javascript to be executed? *\n *    Or allows for someone to change the prototype of built-in objects?   *\n *     Or gives undesired access to variables likes document or window?    *\n * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */\n\nvar $sceMinErr = minErr('$sce');\n\nvar SCE_CONTEXTS = {\n  HTML: 'html',\n  CSS: 'css',\n  URL: 'url',\n  // RESOURCE_URL is a subtype of URL used in contexts where a privileged resource is sourced from a\n  // url.  (e.g. ng-include, script src, templateUrl)\n  RESOURCE_URL: 'resourceUrl',\n  JS: 'js'\n};\n\n// Helper functions follow.\n\nfunction adjustMatcher(matcher) {\n  if (matcher === 'self') {\n    return matcher;\n  } else if (isString(matcher)) {\n    // Strings match exactly except for 2 wildcards - '*' and '**'.\n    // '*' matches any character except those from the set ':/.?&'.\n    // '**' matches any character (like .* in a RegExp).\n    // More than 2 *'s raises an error as it's ill defined.\n    if (matcher.indexOf('***') > -1) {\n      throw $sceMinErr('iwcard',\n          'Illegal sequence *** in string matcher.  String: {0}', matcher);\n    }\n    matcher = escapeForRegexp(matcher).\n                  replace('\\\\*\\\\*', '.*').\n                  replace('\\\\*', '[^:/.?&;]*');\n    return new RegExp('^' + matcher + '$');\n  } else if (isRegExp(matcher)) {\n    // The only other type of matcher allowed is a Regexp.\n    // Match entire URL / disallow partial matches.\n    // Flags are reset (i.e. no global, ignoreCase or multiline)\n    return new RegExp('^' + matcher.source + '$');\n  } else {\n    throw $sceMinErr('imatcher',\n        'Matchers may only be \"self\", string patterns or RegExp objects');\n  }\n}\n\n\nfunction adjustMatchers(matchers) {\n  var adjustedMatchers = [];\n  if (isDefined(matchers)) {\n    forEach(matchers, function(matcher) {\n      adjustedMatchers.push(adjustMatcher(matcher));\n    });\n  }\n  return adjustedMatchers;\n}\n\n\n/**\n * @ngdoc service\n * @name $sceDelegate\n * @kind function\n *\n * @description\n *\n * `$sceDelegate` is a service that is used by the `$sce` service to provide {@link ng.$sce Strict\n * Contextual Escaping (SCE)} services to AngularJS.\n *\n * Typically, you would configure or override the {@link ng.$sceDelegate $sceDelegate} instead of\n * the `$sce` service to customize the way Strict Contextual Escaping works in AngularJS.  This is\n * because, while the `$sce` provides numerous shorthand methods, etc., you really only need to\n * override 3 core functions (`trustAs`, `getTrusted` and `valueOf`) to replace the way things\n * work because `$sce` delegates to `$sceDelegate` for these operations.\n *\n * Refer {@link ng.$sceDelegateProvider $sceDelegateProvider} to configure this service.\n *\n * The default instance of `$sceDelegate` should work out of the box with little pain.  While you\n * can override it completely to change the behavior of `$sce`, the common case would\n * involve configuring the {@link ng.$sceDelegateProvider $sceDelegateProvider} instead by setting\n * your own whitelists and blacklists for trusting URLs used for loading AngularJS resources such as\n * templates.  Refer {@link ng.$sceDelegateProvider#resourceUrlWhitelist\n * $sceDelegateProvider.resourceUrlWhitelist} and {@link\n * ng.$sceDelegateProvider#resourceUrlBlacklist $sceDelegateProvider.resourceUrlBlacklist}\n */\n\n/**\n * @ngdoc provider\n * @name $sceDelegateProvider\n * @description\n *\n * The `$sceDelegateProvider` provider allows developers to configure the {@link ng.$sceDelegate\n * $sceDelegate} service.  This allows one to get/set the whitelists and blacklists used to ensure\n * that the URLs used for sourcing Angular templates are safe.  Refer {@link\n * ng.$sceDelegateProvider#resourceUrlWhitelist $sceDelegateProvider.resourceUrlWhitelist} and\n * {@link ng.$sceDelegateProvider#resourceUrlBlacklist $sceDelegateProvider.resourceUrlBlacklist}\n *\n * For the general details about this service in Angular, read the main page for {@link ng.$sce\n * Strict Contextual Escaping (SCE)}.\n *\n * **Example**:  Consider the following case. <a name=\"example\"></a>\n *\n * - your app is hosted at url `http://myapp.example.com/`\n * - but some of your templates are hosted on other domains you control such as\n *   `http://srv01.assets.example.com/`,  `http://srv02.assets.example.com/`, etc.\n * - and you have an open redirect at `http://myapp.example.com/clickThru?...`.\n *\n * Here is what a secure configuration for this scenario might look like:\n *\n * ```\n *  angular.module('myApp', []).config(function($sceDelegateProvider) {\n *    $sceDelegateProvider.resourceUrlWhitelist([\n *      // Allow same origin resource loads.\n *      'self',\n *      // Allow loading from our assets domain.  Notice the difference between * and **.\n *      'http://srv*.assets.example.com/**'\n *    ]);\n *\n *    // The blacklist overrides the whitelist so the open redirect here is blocked.\n *    $sceDelegateProvider.resourceUrlBlacklist([\n *      'http://myapp.example.com/clickThru**'\n *    ]);\n *  });\n * ```\n */\n\nfunction $SceDelegateProvider() {\n  this.SCE_CONTEXTS = SCE_CONTEXTS;\n\n  // Resource URLs can also be trusted by policy.\n  var resourceUrlWhitelist = ['self'],\n      resourceUrlBlacklist = [];\n\n  /**\n   * @ngdoc method\n   * @name $sceDelegateProvider#resourceUrlWhitelist\n   * @kind function\n   *\n   * @param {Array=} whitelist When provided, replaces the resourceUrlWhitelist with the value\n   *    provided.  This must be an array or null.  A snapshot of this array is used so further\n   *    changes to the array are ignored.\n   *\n   *    Follow {@link ng.$sce#resourceUrlPatternItem this link} for a description of the items\n   *    allowed in this array.\n   *\n   *    <div class=\"alert alert-warning\">\n   *    **Note:** an empty whitelist array will block all URLs!\n   *    </div>\n   *\n   * @return {Array} the currently set whitelist array.\n   *\n   * The **default value** when no whitelist has been explicitly set is `['self']` allowing only\n   * same origin resource requests.\n   *\n   * @description\n   * Sets/Gets the whitelist of trusted resource URLs.\n   */\n  this.resourceUrlWhitelist = function(value) {\n    if (arguments.length) {\n      resourceUrlWhitelist = adjustMatchers(value);\n    }\n    return resourceUrlWhitelist;\n  };\n\n  /**\n   * @ngdoc method\n   * @name $sceDelegateProvider#resourceUrlBlacklist\n   * @kind function\n   *\n   * @param {Array=} blacklist When provided, replaces the resourceUrlBlacklist with the value\n   *    provided.  This must be an array or null.  A snapshot of this array is used so further\n   *    changes to the array are ignored.\n   *\n   *    Follow {@link ng.$sce#resourceUrlPatternItem this link} for a description of the items\n   *    allowed in this array.\n   *\n   *    The typical usage for the blacklist is to **block\n   *    [open redirects](http://cwe.mitre.org/data/definitions/601.html)** served by your domain as\n   *    these would otherwise be trusted but actually return content from the redirected domain.\n   *\n   *    Finally, **the blacklist overrides the whitelist** and has the final say.\n   *\n   * @return {Array} the currently set blacklist array.\n   *\n   * The **default value** when no whitelist has been explicitly set is the empty array (i.e. there\n   * is no blacklist.)\n   *\n   * @description\n   * Sets/Gets the blacklist of trusted resource URLs.\n   */\n\n  this.resourceUrlBlacklist = function(value) {\n    if (arguments.length) {\n      resourceUrlBlacklist = adjustMatchers(value);\n    }\n    return resourceUrlBlacklist;\n  };\n\n  this.$get = ['$injector', function($injector) {\n\n    var htmlSanitizer = function htmlSanitizer(html) {\n      throw $sceMinErr('unsafe', 'Attempting to use an unsafe value in a safe context.');\n    };\n\n    if ($injector.has('$sanitize')) {\n      htmlSanitizer = $injector.get('$sanitize');\n    }\n\n\n    function matchUrl(matcher, parsedUrl) {\n      if (matcher === 'self') {\n        return urlIsSameOrigin(parsedUrl);\n      } else {\n        // definitely a regex.  See adjustMatchers()\n        return !!matcher.exec(parsedUrl.href);\n      }\n    }\n\n    function isResourceUrlAllowedByPolicy(url) {\n      var parsedUrl = urlResolve(url.toString());\n      var i, n, allowed = false;\n      // Ensure that at least one item from the whitelist allows this url.\n      for (i = 0, n = resourceUrlWhitelist.length; i < n; i++) {\n        if (matchUrl(resourceUrlWhitelist[i], parsedUrl)) {\n          allowed = true;\n          break;\n        }\n      }\n      if (allowed) {\n        // Ensure that no item from the blacklist blocked this url.\n        for (i = 0, n = resourceUrlBlacklist.length; i < n; i++) {\n          if (matchUrl(resourceUrlBlacklist[i], parsedUrl)) {\n            allowed = false;\n            break;\n          }\n        }\n      }\n      return allowed;\n    }\n\n    function generateHolderType(Base) {\n      var holderType = function TrustedValueHolderType(trustedValue) {\n        this.$$unwrapTrustedValue = function() {\n          return trustedValue;\n        };\n      };\n      if (Base) {\n        holderType.prototype = new Base();\n      }\n      holderType.prototype.valueOf = function sceValueOf() {\n        return this.$$unwrapTrustedValue();\n      };\n      holderType.prototype.toString = function sceToString() {\n        return this.$$unwrapTrustedValue().toString();\n      };\n      return holderType;\n    }\n\n    var trustedValueHolderBase = generateHolderType(),\n        byType = {};\n\n    byType[SCE_CONTEXTS.HTML] = generateHolderType(trustedValueHolderBase);\n    byType[SCE_CONTEXTS.CSS] = generateHolderType(trustedValueHolderBase);\n    byType[SCE_CONTEXTS.URL] = generateHolderType(trustedValueHolderBase);\n    byType[SCE_CONTEXTS.JS] = generateHolderType(trustedValueHolderBase);\n    byType[SCE_CONTEXTS.RESOURCE_URL] = generateHolderType(byType[SCE_CONTEXTS.URL]);\n\n    /**\n     * @ngdoc method\n     * @name $sceDelegate#trustAs\n     *\n     * @description\n     * Returns an object that is trusted by angular for use in specified strict\n     * contextual escaping contexts (such as ng-bind-html, ng-include, any src\n     * attribute interpolation, any dom event binding attribute interpolation\n     * such as for onclick,  etc.) that uses the provided value.\n     * See {@link ng.$sce $sce} for enabling strict contextual escaping.\n     *\n     * @param {string} type The kind of context in which this value is safe for use.  e.g. url,\n     *   resourceUrl, html, js and css.\n     * @param {*} value The value that that should be considered trusted/safe.\n     * @returns {*} A value that can be used to stand in for the provided `value` in places\n     * where Angular expects a $sce.trustAs() return value.\n     */\n    function trustAs(type, trustedValue) {\n      var Constructor = (byType.hasOwnProperty(type) ? byType[type] : null);\n      if (!Constructor) {\n        throw $sceMinErr('icontext',\n            'Attempted to trust a value in invalid context. Context: {0}; Value: {1}',\n            type, trustedValue);\n      }\n      if (trustedValue === null || isUndefined(trustedValue) || trustedValue === '') {\n        return trustedValue;\n      }\n      // All the current contexts in SCE_CONTEXTS happen to be strings.  In order to avoid trusting\n      // mutable objects, we ensure here that the value passed in is actually a string.\n      if (typeof trustedValue !== 'string') {\n        throw $sceMinErr('itype',\n            'Attempted to trust a non-string value in a content requiring a string: Context: {0}',\n            type);\n      }\n      return new Constructor(trustedValue);\n    }\n\n    /**\n     * @ngdoc method\n     * @name $sceDelegate#valueOf\n     *\n     * @description\n     * If the passed parameter had been returned by a prior call to {@link ng.$sceDelegate#trustAs\n     * `$sceDelegate.trustAs`}, returns the value that had been passed to {@link\n     * ng.$sceDelegate#trustAs `$sceDelegate.trustAs`}.\n     *\n     * If the passed parameter is not a value that had been returned by {@link\n     * ng.$sceDelegate#trustAs `$sceDelegate.trustAs`}, returns it as-is.\n     *\n     * @param {*} value The result of a prior {@link ng.$sceDelegate#trustAs `$sceDelegate.trustAs`}\n     *      call or anything else.\n     * @returns {*} The `value` that was originally provided to {@link ng.$sceDelegate#trustAs\n     *     `$sceDelegate.trustAs`} if `value` is the result of such a call.  Otherwise, returns\n     *     `value` unchanged.\n     */\n    function valueOf(maybeTrusted) {\n      if (maybeTrusted instanceof trustedValueHolderBase) {\n        return maybeTrusted.$$unwrapTrustedValue();\n      } else {\n        return maybeTrusted;\n      }\n    }\n\n    /**\n     * @ngdoc method\n     * @name $sceDelegate#getTrusted\n     *\n     * @description\n     * Takes the result of a {@link ng.$sceDelegate#trustAs `$sceDelegate.trustAs`} call and\n     * returns the originally supplied value if the queried context type is a supertype of the\n     * created type.  If this condition isn't satisfied, throws an exception.\n     *\n     * <div class=\"alert alert-danger\">\n     * Disabling auto-escaping is extremely dangerous, it usually creates a Cross Site Scripting\n     * (XSS) vulnerability in your application.\n     * </div>\n     *\n     * @param {string} type The kind of context in which this value is to be used.\n     * @param {*} maybeTrusted The result of a prior {@link ng.$sceDelegate#trustAs\n     *     `$sceDelegate.trustAs`} call.\n     * @returns {*} The value the was originally provided to {@link ng.$sceDelegate#trustAs\n     *     `$sceDelegate.trustAs`} if valid in this context.  Otherwise, throws an exception.\n     */\n    function getTrusted(type, maybeTrusted) {\n      if (maybeTrusted === null || isUndefined(maybeTrusted) || maybeTrusted === '') {\n        return maybeTrusted;\n      }\n      var constructor = (byType.hasOwnProperty(type) ? byType[type] : null);\n      if (constructor && maybeTrusted instanceof constructor) {\n        return maybeTrusted.$$unwrapTrustedValue();\n      }\n      // If we get here, then we may only take one of two actions.\n      // 1. sanitize the value for the requested type, or\n      // 2. throw an exception.\n      if (type === SCE_CONTEXTS.RESOURCE_URL) {\n        if (isResourceUrlAllowedByPolicy(maybeTrusted)) {\n          return maybeTrusted;\n        } else {\n          throw $sceMinErr('insecurl',\n              'Blocked loading resource from url not allowed by $sceDelegate policy.  URL: {0}',\n              maybeTrusted.toString());\n        }\n      } else if (type === SCE_CONTEXTS.HTML) {\n        return htmlSanitizer(maybeTrusted);\n      }\n      throw $sceMinErr('unsafe', 'Attempting to use an unsafe value in a safe context.');\n    }\n\n    return { trustAs: trustAs,\n             getTrusted: getTrusted,\n             valueOf: valueOf };\n  }];\n}\n\n\n/**\n * @ngdoc provider\n * @name $sceProvider\n * @description\n *\n * The $sceProvider provider allows developers to configure the {@link ng.$sce $sce} service.\n * -   enable/disable Strict Contextual Escaping (SCE) in a module\n * -   override the default implementation with a custom delegate\n *\n * Read more about {@link ng.$sce Strict Contextual Escaping (SCE)}.\n */\n\n/* jshint maxlen: false*/\n\n/**\n * @ngdoc service\n * @name $sce\n * @kind function\n *\n * @description\n *\n * `$sce` is a service that provides Strict Contextual Escaping services to AngularJS.\n *\n * # Strict Contextual Escaping\n *\n * Strict Contextual Escaping (SCE) is a mode in which AngularJS requires bindings in certain\n * contexts to result in a value that is marked as safe to use for that context.  One example of\n * such a context is binding arbitrary html controlled by the user via `ng-bind-html`.  We refer\n * to these contexts as privileged or SCE contexts.\n *\n * As of version 1.2, Angular ships with SCE enabled by default.\n *\n * Note:  When enabled (the default), IE<11 in quirks mode is not supported.  In this mode, IE<11 allow\n * one to execute arbitrary javascript by the use of the expression() syntax.  Refer\n * <http://blogs.msdn.com/b/ie/archive/2008/10/16/ending-expressions.aspx> to learn more about them.\n * You can ensure your document is in standards mode and not quirks mode by adding `<!doctype html>`\n * to the top of your HTML document.\n *\n * SCE assists in writing code in way that (a) is secure by default and (b) makes auditing for\n * security vulnerabilities such as XSS, clickjacking, etc. a lot easier.\n *\n * Here's an example of a binding in a privileged context:\n *\n * ```\n * <input ng-model=\"userHtml\" aria-label=\"User input\">\n * <div ng-bind-html=\"userHtml\"></div>\n * ```\n *\n * Notice that `ng-bind-html` is bound to `userHtml` controlled by the user.  With SCE\n * disabled, this application allows the user to render arbitrary HTML into the DIV.\n * In a more realistic example, one may be rendering user comments, blog articles, etc. via\n * bindings.  (HTML is just one example of a context where rendering user controlled input creates\n * security vulnerabilities.)\n *\n * For the case of HTML, you might use a library, either on the client side, or on the server side,\n * to sanitize unsafe HTML before binding to the value and rendering it in the document.\n *\n * How would you ensure that every place that used these types of bindings was bound to a value that\n * was sanitized by your library (or returned as safe for rendering by your server?)  How can you\n * ensure that you didn't accidentally delete the line that sanitized the value, or renamed some\n * properties/fields and forgot to update the binding to the sanitized value?\n *\n * To be secure by default, you want to ensure that any such bindings are disallowed unless you can\n * determine that something explicitly says it's safe to use a value for binding in that\n * context.  You can then audit your code (a simple grep would do) to ensure that this is only done\n * for those values that you can easily tell are safe - because they were received from your server,\n * sanitized by your library, etc.  You can organize your codebase to help with this - perhaps\n * allowing only the files in a specific directory to do this.  Ensuring that the internal API\n * exposed by that code doesn't markup arbitrary values as safe then becomes a more manageable task.\n *\n * In the case of AngularJS' SCE service, one uses {@link ng.$sce#trustAs $sce.trustAs}\n * (and shorthand methods such as {@link ng.$sce#trustAsHtml $sce.trustAsHtml}, etc.) to\n * obtain values that will be accepted by SCE / privileged contexts.\n *\n *\n * ## How does it work?\n *\n * In privileged contexts, directives and code will bind to the result of {@link ng.$sce#getTrusted\n * $sce.getTrusted(context, value)} rather than to the value directly.  Directives use {@link\n * ng.$sce#parseAs $sce.parseAs} rather than `$parse` to watch attribute bindings, which performs the\n * {@link ng.$sce#getTrusted $sce.getTrusted} behind the scenes on non-constant literals.\n *\n * As an example, {@link ng.directive:ngBindHtml ngBindHtml} uses {@link\n * ng.$sce#parseAsHtml $sce.parseAsHtml(binding expression)}.  Here's the actual code (slightly\n * simplified):\n *\n * ```\n * var ngBindHtmlDirective = ['$sce', function($sce) {\n *   return function(scope, element, attr) {\n *     scope.$watch($sce.parseAsHtml(attr.ngBindHtml), function(value) {\n *       element.html(value || '');\n *     });\n *   };\n * }];\n * ```\n *\n * ## Impact on loading templates\n *\n * This applies both to the {@link ng.directive:ngInclude `ng-include`} directive as well as\n * `templateUrl`'s specified by {@link guide/directive directives}.\n *\n * By default, Angular only loads templates from the same domain and protocol as the application\n * document.  This is done by calling {@link ng.$sce#getTrustedResourceUrl\n * $sce.getTrustedResourceUrl} on the template URL.  To load templates from other domains and/or\n * protocols, you may either {@link ng.$sceDelegateProvider#resourceUrlWhitelist whitelist\n * them} or {@link ng.$sce#trustAsResourceUrl wrap it} into a trusted value.\n *\n * *Please note*:\n * The browser's\n * [Same Origin Policy](https://code.google.com/p/browsersec/wiki/Part2#Same-origin_policy_for_XMLHttpRequest)\n * and [Cross-Origin Resource Sharing (CORS)](http://www.w3.org/TR/cors/)\n * policy apply in addition to this and may further restrict whether the template is successfully\n * loaded.  This means that without the right CORS policy, loading templates from a different domain\n * won't work on all browsers.  Also, loading templates from `file://` URL does not work on some\n * browsers.\n *\n * ## This feels like too much overhead\n *\n * It's important to remember that SCE only applies to interpolation expressions.\n *\n * If your expressions are constant literals, they're automatically trusted and you don't need to\n * call `$sce.trustAs` on them (remember to include the `ngSanitize` module) (e.g.\n * `<div ng-bind-html=\"'<b>implicitly trusted</b>'\"></div>`) just works.\n *\n * Additionally, `a[href]` and `img[src]` automatically sanitize their URLs and do not pass them\n * through {@link ng.$sce#getTrusted $sce.getTrusted}.  SCE doesn't play a role here.\n *\n * The included {@link ng.$sceDelegate $sceDelegate} comes with sane defaults to allow you to load\n * templates in `ng-include` from your application's domain without having to even know about SCE.\n * It blocks loading templates from other domains or loading templates over http from an https\n * served document.  You can change these by setting your own custom {@link\n * ng.$sceDelegateProvider#resourceUrlWhitelist whitelists} and {@link\n * ng.$sceDelegateProvider#resourceUrlBlacklist blacklists} for matching such URLs.\n *\n * This significantly reduces the overhead.  It is far easier to pay the small overhead and have an\n * application that's secure and can be audited to verify that with much more ease than bolting\n * security onto an application later.\n *\n * <a name=\"contexts\"></a>\n * ## What trusted context types are supported?\n *\n * | Context             | Notes          |\n * |---------------------|----------------|\n * | `$sce.HTML`         | For HTML that's safe to source into the application.  The {@link ng.directive:ngBindHtml ngBindHtml} directive uses this context for bindings. If an unsafe value is encountered and the {@link ngSanitize $sanitize} module is present this will sanitize the value instead of throwing an error. |\n * | `$sce.CSS`          | For CSS that's safe to source into the application.  Currently unused.  Feel free to use it in your own directives. |\n * | `$sce.URL`          | For URLs that are safe to follow as links.  Currently unused (`<a href=` and `<img src=` sanitize their urls and don't constitute an SCE context. |\n * | `$sce.RESOURCE_URL` | For URLs that are not only safe to follow as links, but whose contents are also safe to include in your application.  Examples include `ng-include`, `src` / `ngSrc` bindings for tags other than `IMG` (e.g. `IFRAME`, `OBJECT`, etc.)  <br><br>Note that `$sce.RESOURCE_URL` makes a stronger statement about the URL than `$sce.URL` does and therefore contexts requiring values trusted for `$sce.RESOURCE_URL` can be used anywhere that values trusted for `$sce.URL` are required. |\n * | `$sce.JS`           | For JavaScript that is safe to execute in your application's context.  Currently unused.  Feel free to use it in your own directives. |\n *\n * ## Format of items in {@link ng.$sceDelegateProvider#resourceUrlWhitelist resourceUrlWhitelist}/{@link ng.$sceDelegateProvider#resourceUrlBlacklist Blacklist} <a name=\"resourceUrlPatternItem\"></a>\n *\n *  Each element in these arrays must be one of the following:\n *\n *  - **'self'**\n *    - The special **string**, `'self'`, can be used to match against all URLs of the **same\n *      domain** as the application document using the **same protocol**.\n *  - **String** (except the special value `'self'`)\n *    - The string is matched against the full *normalized / absolute URL* of the resource\n *      being tested (substring matches are not good enough.)\n *    - There are exactly **two wildcard sequences** - `*` and `**`.  All other characters\n *      match themselves.\n *    - `*`: matches zero or more occurrences of any character other than one of the following 6\n *      characters: '`:`', '`/`', '`.`', '`?`', '`&`' and '`;`'.  It's a useful wildcard for use\n *      in a whitelist.\n *    - `**`: matches zero or more occurrences of *any* character.  As such, it's not\n *      appropriate for use in a scheme, domain, etc. as it would match too much.  (e.g.\n *      http://**.example.com/ would match http://evil.com/?ignore=.example.com/ and that might\n *      not have been the intention.)  Its usage at the very end of the path is ok.  (e.g.\n *      http://foo.example.com/templates/**).\n *  - **RegExp** (*see caveat below*)\n *    - *Caveat*:  While regular expressions are powerful and offer great flexibility,  their syntax\n *      (and all the inevitable escaping) makes them *harder to maintain*.  It's easy to\n *      accidentally introduce a bug when one updates a complex expression (imho, all regexes should\n *      have good test coverage).  For instance, the use of `.` in the regex is correct only in a\n *      small number of cases.  A `.` character in the regex used when matching the scheme or a\n *      subdomain could be matched against a `:` or literal `.` that was likely not intended.   It\n *      is highly recommended to use the string patterns and only fall back to regular expressions\n *      as a last resort.\n *    - The regular expression must be an instance of RegExp (i.e. not a string.)  It is\n *      matched against the **entire** *normalized / absolute URL* of the resource being tested\n *      (even when the RegExp did not have the `^` and `$` codes.)  In addition, any flags\n *      present on the RegExp (such as multiline, global, ignoreCase) are ignored.\n *    - If you are generating your JavaScript from some other templating engine (not\n *      recommended, e.g. in issue [#4006](https://github.com/angular/angular.js/issues/4006)),\n *      remember to escape your regular expression (and be aware that you might need more than\n *      one level of escaping depending on your templating engine and the way you interpolated\n *      the value.)  Do make use of your platform's escaping mechanism as it might be good\n *      enough before coding your own.  E.g. Ruby has\n *      [Regexp.escape(str)](http://www.ruby-doc.org/core-2.0.0/Regexp.html#method-c-escape)\n *      and Python has [re.escape](http://docs.python.org/library/re.html#re.escape).\n *      Javascript lacks a similar built in function for escaping.  Take a look at Google\n *      Closure library's [goog.string.regExpEscape(s)](\n *      http://docs.closure-library.googlecode.com/git/closure_goog_string_string.js.source.html#line962).\n *\n * Refer {@link ng.$sceDelegateProvider $sceDelegateProvider} for an example.\n *\n * ## Show me an example using SCE.\n *\n * <example module=\"mySceApp\" deps=\"angular-sanitize.js\">\n * <file name=\"index.html\">\n *   <div ng-controller=\"AppController as myCtrl\">\n *     <i ng-bind-html=\"myCtrl.explicitlyTrustedHtml\" id=\"explicitlyTrustedHtml\"></i><br><br>\n *     <b>User comments</b><br>\n *     By default, HTML that isn't explicitly trusted (e.g. Alice's comment) is sanitized when\n *     $sanitize is available.  If $sanitize isn't available, this results in an error instead of an\n *     exploit.\n *     <div class=\"well\">\n *       <div ng-repeat=\"userComment in myCtrl.userComments\">\n *         <b>{{userComment.name}}</b>:\n *         <span ng-bind-html=\"userComment.htmlComment\" class=\"htmlComment\"></span>\n *         <br>\n *       </div>\n *     </div>\n *   </div>\n * </file>\n *\n * <file name=\"script.js\">\n *   angular.module('mySceApp', ['ngSanitize'])\n *     .controller('AppController', ['$http', '$templateCache', '$sce',\n *       function($http, $templateCache, $sce) {\n *         var self = this;\n *         $http.get(\"test_data.json\", {cache: $templateCache}).success(function(userComments) {\n *           self.userComments = userComments;\n *         });\n *         self.explicitlyTrustedHtml = $sce.trustAsHtml(\n *             '<span onmouseover=\"this.textContent=&quot;Explicitly trusted HTML bypasses ' +\n *             'sanitization.&quot;\">Hover over this text.</span>');\n *       }]);\n * </file>\n *\n * <file name=\"test_data.json\">\n * [\n *   { \"name\": \"Alice\",\n *     \"htmlComment\":\n *         \"<span onmouseover='this.textContent=\\\"PWN3D!\\\"'>Is <i>anyone</i> reading this?</span>\"\n *   },\n *   { \"name\": \"Bob\",\n *     \"htmlComment\": \"<i>Yes!</i>  Am I the only other one?\"\n *   }\n * ]\n * </file>\n *\n * <file name=\"protractor.js\" type=\"protractor\">\n *   describe('SCE doc demo', function() {\n *     it('should sanitize untrusted values', function() {\n *       expect(element.all(by.css('.htmlComment')).first().getInnerHtml())\n *           .toBe('<span>Is <i>anyone</i> reading this?</span>');\n *     });\n *\n *     it('should NOT sanitize explicitly trusted values', function() {\n *       expect(element(by.id('explicitlyTrustedHtml')).getInnerHtml()).toBe(\n *           '<span onmouseover=\"this.textContent=&quot;Explicitly trusted HTML bypasses ' +\n *           'sanitization.&quot;\">Hover over this text.</span>');\n *     });\n *   });\n * </file>\n * </example>\n *\n *\n *\n * ## Can I disable SCE completely?\n *\n * Yes, you can.  However, this is strongly discouraged.  SCE gives you a lot of security benefits\n * for little coding overhead.  It will be much harder to take an SCE disabled application and\n * either secure it on your own or enable SCE at a later stage.  It might make sense to disable SCE\n * for cases where you have a lot of existing code that was written before SCE was introduced and\n * you're migrating them a module at a time.\n *\n * That said, here's how you can completely disable SCE:\n *\n * ```\n * angular.module('myAppWithSceDisabledmyApp', []).config(function($sceProvider) {\n *   // Completely disable SCE.  For demonstration purposes only!\n *   // Do not use in new projects.\n *   $sceProvider.enabled(false);\n * });\n * ```\n *\n */\n/* jshint maxlen: 100 */\n\nfunction $SceProvider() {\n  var enabled = true;\n\n  /**\n   * @ngdoc method\n   * @name $sceProvider#enabled\n   * @kind function\n   *\n   * @param {boolean=} value If provided, then enables/disables SCE.\n   * @return {boolean} true if SCE is enabled, false otherwise.\n   *\n   * @description\n   * Enables/disables SCE and returns the current value.\n   */\n  this.enabled = function(value) {\n    if (arguments.length) {\n      enabled = !!value;\n    }\n    return enabled;\n  };\n\n\n  /* Design notes on the default implementation for SCE.\n   *\n   * The API contract for the SCE delegate\n   * -------------------------------------\n   * The SCE delegate object must provide the following 3 methods:\n   *\n   * - trustAs(contextEnum, value)\n   *     This method is used to tell the SCE service that the provided value is OK to use in the\n   *     contexts specified by contextEnum.  It must return an object that will be accepted by\n   *     getTrusted() for a compatible contextEnum and return this value.\n   *\n   * - valueOf(value)\n   *     For values that were not produced by trustAs(), return them as is.  For values that were\n   *     produced by trustAs(), return the corresponding input value to trustAs.  Basically, if\n   *     trustAs is wrapping the given values into some type, this operation unwraps it when given\n   *     such a value.\n   *\n   * - getTrusted(contextEnum, value)\n   *     This function should return the a value that is safe to use in the context specified by\n   *     contextEnum or throw and exception otherwise.\n   *\n   * NOTE: This contract deliberately does NOT state that values returned by trustAs() must be\n   * opaque or wrapped in some holder object.  That happens to be an implementation detail.  For\n   * instance, an implementation could maintain a registry of all trusted objects by context.  In\n   * such a case, trustAs() would return the same object that was passed in.  getTrusted() would\n   * return the same object passed in if it was found in the registry under a compatible context or\n   * throw an exception otherwise.  An implementation might only wrap values some of the time based\n   * on some criteria.  getTrusted() might return a value and not throw an exception for special\n   * constants or objects even if not wrapped.  All such implementations fulfill this contract.\n   *\n   *\n   * A note on the inheritance model for SCE contexts\n   * ------------------------------------------------\n   * I've used inheritance and made RESOURCE_URL wrapped types a subtype of URL wrapped types.  This\n   * is purely an implementation details.\n   *\n   * The contract is simply this:\n   *\n   *     getTrusted($sce.RESOURCE_URL, value) succeeding implies that getTrusted($sce.URL, value)\n   *     will also succeed.\n   *\n   * Inheritance happens to capture this in a natural way.  In some future, we\n   * may not use inheritance anymore.  That is OK because no code outside of\n   * sce.js and sceSpecs.js would need to be aware of this detail.\n   */\n\n  this.$get = ['$parse', '$sceDelegate', function(\n                $parse,   $sceDelegate) {\n    // Prereq: Ensure that we're not running in IE<11 quirks mode.  In that mode, IE < 11 allow\n    // the \"expression(javascript expression)\" syntax which is insecure.\n    if (enabled && msie < 8) {\n      throw $sceMinErr('iequirks',\n        'Strict Contextual Escaping does not support Internet Explorer version < 11 in quirks ' +\n        'mode.  You can fix this by adding the text <!doctype html> to the top of your HTML ' +\n        'document.  See http://docs.angularjs.org/api/ng.$sce for more information.');\n    }\n\n    var sce = shallowCopy(SCE_CONTEXTS);\n\n    /**\n     * @ngdoc method\n     * @name $sce#isEnabled\n     * @kind function\n     *\n     * @return {Boolean} true if SCE is enabled, false otherwise.  If you want to set the value, you\n     * have to do it at module config time on {@link ng.$sceProvider $sceProvider}.\n     *\n     * @description\n     * Returns a boolean indicating if SCE is enabled.\n     */\n    sce.isEnabled = function() {\n      return enabled;\n    };\n    sce.trustAs = $sceDelegate.trustAs;\n    sce.getTrusted = $sceDelegate.getTrusted;\n    sce.valueOf = $sceDelegate.valueOf;\n\n    if (!enabled) {\n      sce.trustAs = sce.getTrusted = function(type, value) { return value; };\n      sce.valueOf = identity;\n    }\n\n    /**\n     * @ngdoc method\n     * @name $sce#parseAs\n     *\n     * @description\n     * Converts Angular {@link guide/expression expression} into a function.  This is like {@link\n     * ng.$parse $parse} and is identical when the expression is a literal constant.  Otherwise, it\n     * wraps the expression in a call to {@link ng.$sce#getTrusted $sce.getTrusted(*type*,\n     * *result*)}\n     *\n     * @param {string} type The kind of SCE context in which this result will be used.\n     * @param {string} expression String expression to compile.\n     * @returns {function(context, locals)} a function which represents the compiled expression:\n     *\n     *    * `context` – `{object}` – an object against which any expressions embedded in the strings\n     *      are evaluated against (typically a scope object).\n     *    * `locals` – `{object=}` – local variables context object, useful for overriding values in\n     *      `context`.\n     */\n    sce.parseAs = function sceParseAs(type, expr) {\n      var parsed = $parse(expr);\n      if (parsed.literal && parsed.constant) {\n        return parsed;\n      } else {\n        return $parse(expr, function(value) {\n          return sce.getTrusted(type, value);\n        });\n      }\n    };\n\n    /**\n     * @ngdoc method\n     * @name $sce#trustAs\n     *\n     * @description\n     * Delegates to {@link ng.$sceDelegate#trustAs `$sceDelegate.trustAs`}.  As such,\n     * returns an object that is trusted by angular for use in specified strict contextual\n     * escaping contexts (such as ng-bind-html, ng-include, any src attribute\n     * interpolation, any dom event binding attribute interpolation such as for onclick,  etc.)\n     * that uses the provided value.  See * {@link ng.$sce $sce} for enabling strict contextual\n     * escaping.\n     *\n     * @param {string} type The kind of context in which this value is safe for use.  e.g. url,\n     *   resourceUrl, html, js and css.\n     * @param {*} value The value that that should be considered trusted/safe.\n     * @returns {*} A value that can be used to stand in for the provided `value` in places\n     * where Angular expects a $sce.trustAs() return value.\n     */\n\n    /**\n     * @ngdoc method\n     * @name $sce#trustAsHtml\n     *\n     * @description\n     * Shorthand method.  `$sce.trustAsHtml(value)` →\n     *     {@link ng.$sceDelegate#trustAs `$sceDelegate.trustAs($sce.HTML, value)`}\n     *\n     * @param {*} value The value to trustAs.\n     * @returns {*} An object that can be passed to {@link ng.$sce#getTrustedHtml\n     *     $sce.getTrustedHtml(value)} to obtain the original value.  (privileged directives\n     *     only accept expressions that are either literal constants or are the\n     *     return value of {@link ng.$sce#trustAs $sce.trustAs}.)\n     */\n\n    /**\n     * @ngdoc method\n     * @name $sce#trustAsUrl\n     *\n     * @description\n     * Shorthand method.  `$sce.trustAsUrl(value)` →\n     *     {@link ng.$sceDelegate#trustAs `$sceDelegate.trustAs($sce.URL, value)`}\n     *\n     * @param {*} value The value to trustAs.\n     * @returns {*} An object that can be passed to {@link ng.$sce#getTrustedUrl\n     *     $sce.getTrustedUrl(value)} to obtain the original value.  (privileged directives\n     *     only accept expressions that are either literal constants or are the\n     *     return value of {@link ng.$sce#trustAs $sce.trustAs}.)\n     */\n\n    /**\n     * @ngdoc method\n     * @name $sce#trustAsResourceUrl\n     *\n     * @description\n     * Shorthand method.  `$sce.trustAsResourceUrl(value)` →\n     *     {@link ng.$sceDelegate#trustAs `$sceDelegate.trustAs($sce.RESOURCE_URL, value)`}\n     *\n     * @param {*} value The value to trustAs.\n     * @returns {*} An object that can be passed to {@link ng.$sce#getTrustedResourceUrl\n     *     $sce.getTrustedResourceUrl(value)} to obtain the original value.  (privileged directives\n     *     only accept expressions that are either literal constants or are the return\n     *     value of {@link ng.$sce#trustAs $sce.trustAs}.)\n     */\n\n    /**\n     * @ngdoc method\n     * @name $sce#trustAsJs\n     *\n     * @description\n     * Shorthand method.  `$sce.trustAsJs(value)` →\n     *     {@link ng.$sceDelegate#trustAs `$sceDelegate.trustAs($sce.JS, value)`}\n     *\n     * @param {*} value The value to trustAs.\n     * @returns {*} An object that can be passed to {@link ng.$sce#getTrustedJs\n     *     $sce.getTrustedJs(value)} to obtain the original value.  (privileged directives\n     *     only accept expressions that are either literal constants or are the\n     *     return value of {@link ng.$sce#trustAs $sce.trustAs}.)\n     */\n\n    /**\n     * @ngdoc method\n     * @name $sce#getTrusted\n     *\n     * @description\n     * Delegates to {@link ng.$sceDelegate#getTrusted `$sceDelegate.getTrusted`}.  As such,\n     * takes the result of a {@link ng.$sce#trustAs `$sce.trustAs`}() call and returns the\n     * originally supplied value if the queried context type is a supertype of the created type.\n     * If this condition isn't satisfied, throws an exception.\n     *\n     * @param {string} type The kind of context in which this value is to be used.\n     * @param {*} maybeTrusted The result of a prior {@link ng.$sce#trustAs `$sce.trustAs`}\n     *                         call.\n     * @returns {*} The value the was originally provided to\n     *              {@link ng.$sce#trustAs `$sce.trustAs`} if valid in this context.\n     *              Otherwise, throws an exception.\n     */\n\n    /**\n     * @ngdoc method\n     * @name $sce#getTrustedHtml\n     *\n     * @description\n     * Shorthand method.  `$sce.getTrustedHtml(value)` →\n     *     {@link ng.$sceDelegate#getTrusted `$sceDelegate.getTrusted($sce.HTML, value)`}\n     *\n     * @param {*} value The value to pass to `$sce.getTrusted`.\n     * @returns {*} The return value of `$sce.getTrusted($sce.HTML, value)`\n     */\n\n    /**\n     * @ngdoc method\n     * @name $sce#getTrustedCss\n     *\n     * @description\n     * Shorthand method.  `$sce.getTrustedCss(value)` →\n     *     {@link ng.$sceDelegate#getTrusted `$sceDelegate.getTrusted($sce.CSS, value)`}\n     *\n     * @param {*} value The value to pass to `$sce.getTrusted`.\n     * @returns {*} The return value of `$sce.getTrusted($sce.CSS, value)`\n     */\n\n    /**\n     * @ngdoc method\n     * @name $sce#getTrustedUrl\n     *\n     * @description\n     * Shorthand method.  `$sce.getTrustedUrl(value)` →\n     *     {@link ng.$sceDelegate#getTrusted `$sceDelegate.getTrusted($sce.URL, value)`}\n     *\n     * @param {*} value The value to pass to `$sce.getTrusted`.\n     * @returns {*} The return value of `$sce.getTrusted($sce.URL, value)`\n     */\n\n    /**\n     * @ngdoc method\n     * @name $sce#getTrustedResourceUrl\n     *\n     * @description\n     * Shorthand method.  `$sce.getTrustedResourceUrl(value)` →\n     *     {@link ng.$sceDelegate#getTrusted `$sceDelegate.getTrusted($sce.RESOURCE_URL, value)`}\n     *\n     * @param {*} value The value to pass to `$sceDelegate.getTrusted`.\n     * @returns {*} The return value of `$sce.getTrusted($sce.RESOURCE_URL, value)`\n     */\n\n    /**\n     * @ngdoc method\n     * @name $sce#getTrustedJs\n     *\n     * @description\n     * Shorthand method.  `$sce.getTrustedJs(value)` →\n     *     {@link ng.$sceDelegate#getTrusted `$sceDelegate.getTrusted($sce.JS, value)`}\n     *\n     * @param {*} value The value to pass to `$sce.getTrusted`.\n     * @returns {*} The return value of `$sce.getTrusted($sce.JS, value)`\n     */\n\n    /**\n     * @ngdoc method\n     * @name $sce#parseAsHtml\n     *\n     * @description\n     * Shorthand method.  `$sce.parseAsHtml(expression string)` →\n     *     {@link ng.$sce#parseAs `$sce.parseAs($sce.HTML, value)`}\n     *\n     * @param {string} expression String expression to compile.\n     * @returns {function(context, locals)} a function which represents the compiled expression:\n     *\n     *    * `context` – `{object}` – an object against which any expressions embedded in the strings\n     *      are evaluated against (typically a scope object).\n     *    * `locals` – `{object=}` – local variables context object, useful for overriding values in\n     *      `context`.\n     */\n\n    /**\n     * @ngdoc method\n     * @name $sce#parseAsCss\n     *\n     * @description\n     * Shorthand method.  `$sce.parseAsCss(value)` →\n     *     {@link ng.$sce#parseAs `$sce.parseAs($sce.CSS, value)`}\n     *\n     * @param {string} expression String expression to compile.\n     * @returns {function(context, locals)} a function which represents the compiled expression:\n     *\n     *    * `context` – `{object}` – an object against which any expressions embedded in the strings\n     *      are evaluated against (typically a scope object).\n     *    * `locals` – `{object=}` – local variables context object, useful for overriding values in\n     *      `context`.\n     */\n\n    /**\n     * @ngdoc method\n     * @name $sce#parseAsUrl\n     *\n     * @description\n     * Shorthand method.  `$sce.parseAsUrl(value)` →\n     *     {@link ng.$sce#parseAs `$sce.parseAs($sce.URL, value)`}\n     *\n     * @param {string} expression String expression to compile.\n     * @returns {function(context, locals)} a function which represents the compiled expression:\n     *\n     *    * `context` – `{object}` – an object against which any expressions embedded in the strings\n     *      are evaluated against (typically a scope object).\n     *    * `locals` – `{object=}` – local variables context object, useful for overriding values in\n     *      `context`.\n     */\n\n    /**\n     * @ngdoc method\n     * @name $sce#parseAsResourceUrl\n     *\n     * @description\n     * Shorthand method.  `$sce.parseAsResourceUrl(value)` →\n     *     {@link ng.$sce#parseAs `$sce.parseAs($sce.RESOURCE_URL, value)`}\n     *\n     * @param {string} expression String expression to compile.\n     * @returns {function(context, locals)} a function which represents the compiled expression:\n     *\n     *    * `context` – `{object}` – an object against which any expressions embedded in the strings\n     *      are evaluated against (typically a scope object).\n     *    * `locals` – `{object=}` – local variables context object, useful for overriding values in\n     *      `context`.\n     */\n\n    /**\n     * @ngdoc method\n     * @name $sce#parseAsJs\n     *\n     * @description\n     * Shorthand method.  `$sce.parseAsJs(value)` →\n     *     {@link ng.$sce#parseAs `$sce.parseAs($sce.JS, value)`}\n     *\n     * @param {string} expression String expression to compile.\n     * @returns {function(context, locals)} a function which represents the compiled expression:\n     *\n     *    * `context` – `{object}` – an object against which any expressions embedded in the strings\n     *      are evaluated against (typically a scope object).\n     *    * `locals` – `{object=}` – local variables context object, useful for overriding values in\n     *      `context`.\n     */\n\n    // Shorthand delegations.\n    var parse = sce.parseAs,\n        getTrusted = sce.getTrusted,\n        trustAs = sce.trustAs;\n\n    forEach(SCE_CONTEXTS, function(enumValue, name) {\n      var lName = lowercase(name);\n      sce[camelCase(\"parse_as_\" + lName)] = function(expr) {\n        return parse(enumValue, expr);\n      };\n      sce[camelCase(\"get_trusted_\" + lName)] = function(value) {\n        return getTrusted(enumValue, value);\n      };\n      sce[camelCase(\"trust_as_\" + lName)] = function(value) {\n        return trustAs(enumValue, value);\n      };\n    });\n\n    return sce;\n  }];\n}\n\n/**\n * !!! This is an undocumented \"private\" service !!!\n *\n * @name $sniffer\n * @requires $window\n * @requires $document\n *\n * @property {boolean} history Does the browser support html5 history api ?\n * @property {boolean} transitions Does the browser support CSS transition events ?\n * @property {boolean} animations Does the browser support CSS animation events ?\n *\n * @description\n * This is very simple implementation of testing browser's features.\n */\nfunction $SnifferProvider() {\n  this.$get = ['$window', '$document', function($window, $document) {\n    var eventSupport = {},\n        // Chrome Packaged Apps are not allowed to access `history.pushState`. They can be detected by\n        // the presence of `chrome.app.runtime` (see https://developer.chrome.com/apps/api_index)\n        isChromePackagedApp = $window.chrome && $window.chrome.app && $window.chrome.app.runtime,\n        hasHistoryPushState = !isChromePackagedApp && $window.history && $window.history.pushState,\n        android =\n          toInt((/android (\\d+)/.exec(lowercase(($window.navigator || {}).userAgent)) || [])[1]),\n        boxee = /Boxee/i.test(($window.navigator || {}).userAgent),\n        document = $document[0] || {},\n        vendorPrefix,\n        vendorRegex = /^(Moz|webkit|ms)(?=[A-Z])/,\n        bodyStyle = document.body && document.body.style,\n        transitions = false,\n        animations = false,\n        match;\n\n    if (bodyStyle) {\n      for (var prop in bodyStyle) {\n        if (match = vendorRegex.exec(prop)) {\n          vendorPrefix = match[0];\n          vendorPrefix = vendorPrefix.substr(0, 1).toUpperCase() + vendorPrefix.substr(1);\n          break;\n        }\n      }\n\n      if (!vendorPrefix) {\n        vendorPrefix = ('WebkitOpacity' in bodyStyle) && 'webkit';\n      }\n\n      transitions = !!(('transition' in bodyStyle) || (vendorPrefix + 'Transition' in bodyStyle));\n      animations  = !!(('animation' in bodyStyle) || (vendorPrefix + 'Animation' in bodyStyle));\n\n      if (android && (!transitions ||  !animations)) {\n        transitions = isString(bodyStyle.webkitTransition);\n        animations = isString(bodyStyle.webkitAnimation);\n      }\n    }\n\n\n    return {\n      // Android has history.pushState, but it does not update location correctly\n      // so let's not use the history API at all.\n      // http://code.google.com/p/android/issues/detail?id=17471\n      // https://github.com/angular/angular.js/issues/904\n\n      // older webkit browser (533.9) on Boxee box has exactly the same problem as Android has\n      // so let's not use the history API also\n      // We are purposefully using `!(android < 4)` to cover the case when `android` is undefined\n      // jshint -W018\n      history: !!(hasHistoryPushState && !(android < 4) && !boxee),\n      // jshint +W018\n      hasEvent: function(event) {\n        // IE9 implements 'input' event it's so fubared that we rather pretend that it doesn't have\n        // it. In particular the event is not fired when backspace or delete key are pressed or\n        // when cut operation is performed.\n        // IE10+ implements 'input' event but it erroneously fires under various situations,\n        // e.g. when placeholder changes, or a form is focused.\n        if (event === 'input' && msie <= 11) return false;\n\n        if (isUndefined(eventSupport[event])) {\n          var divElm = document.createElement('div');\n          eventSupport[event] = 'on' + event in divElm;\n        }\n\n        return eventSupport[event];\n      },\n      csp: csp(),\n      vendorPrefix: vendorPrefix,\n      transitions: transitions,\n      animations: animations,\n      android: android\n    };\n  }];\n}\n\nvar $templateRequestMinErr = minErr('$compile');\n\n/**\n * @ngdoc provider\n * @name $templateRequestProvider\n * @description\n * Used to configure the options passed to the {@link $http} service when making a template request.\n *\n * For example, it can be used for specifying the \"Accept\" header that is sent to the server, when\n * requesting a template.\n */\nfunction $TemplateRequestProvider() {\n\n  var httpOptions;\n\n  /**\n   * @ngdoc method\n   * @name $templateRequestProvider#httpOptions\n   * @description\n   * The options to be passed to the {@link $http} service when making the request.\n   * You can use this to override options such as the \"Accept\" header for template requests.\n   *\n   * The {@link $templateRequest} will set the `cache` and the `transformResponse` properties of the\n   * options if not overridden here.\n   *\n   * @param {string=} value new value for the {@link $http} options.\n   * @returns {string|self} Returns the {@link $http} options when used as getter and self if used as setter.\n   */\n  this.httpOptions = function(val) {\n    if (val) {\n      httpOptions = val;\n      return this;\n    }\n    return httpOptions;\n  };\n\n  /**\n   * @ngdoc service\n   * @name $templateRequest\n   *\n   * @description\n   * The `$templateRequest` service runs security checks then downloads the provided template using\n   * `$http` and, upon success, stores the contents inside of `$templateCache`. If the HTTP request\n   * fails or the response data of the HTTP request is empty, a `$compile` error will be thrown (the\n   * exception can be thwarted by setting the 2nd parameter of the function to true). Note that the\n   * contents of `$templateCache` are trusted, so the call to `$sce.getTrustedUrl(tpl)` is omitted\n   * when `tpl` is of type string and `$templateCache` has the matching entry.\n   *\n   * If you want to pass custom options to the `$http` service, such as setting the Accept header you\n   * can configure this via {@link $templateRequestProvider#httpOptions}.\n   *\n   * @param {string|TrustedResourceUrl} tpl The HTTP request template URL\n   * @param {boolean=} ignoreRequestError Whether or not to ignore the exception when the request fails or the template is empty\n   *\n   * @return {Promise} a promise for the HTTP response data of the given URL.\n   *\n   * @property {number} totalPendingRequests total amount of pending template requests being downloaded.\n   */\n  this.$get = ['$templateCache', '$http', '$q', '$sce', function($templateCache, $http, $q, $sce) {\n\n    function handleRequestFn(tpl, ignoreRequestError) {\n      handleRequestFn.totalPendingRequests++;\n\n      // We consider the template cache holds only trusted templates, so\n      // there's no need to go through whitelisting again for keys that already\n      // are included in there. This also makes Angular accept any script\n      // directive, no matter its name. However, we still need to unwrap trusted\n      // types.\n      if (!isString(tpl) || !$templateCache.get(tpl)) {\n        tpl = $sce.getTrustedResourceUrl(tpl);\n      }\n\n      var transformResponse = $http.defaults && $http.defaults.transformResponse;\n\n      if (isArray(transformResponse)) {\n        transformResponse = transformResponse.filter(function(transformer) {\n          return transformer !== defaultHttpResponseTransform;\n        });\n      } else if (transformResponse === defaultHttpResponseTransform) {\n        transformResponse = null;\n      }\n\n      return $http.get(tpl, extend({\n          cache: $templateCache,\n          transformResponse: transformResponse\n        }, httpOptions))\n        ['finally'](function() {\n          handleRequestFn.totalPendingRequests--;\n        })\n        .then(function(response) {\n          $templateCache.put(tpl, response.data);\n          return response.data;\n        }, handleError);\n\n      function handleError(resp) {\n        if (!ignoreRequestError) {\n          throw $templateRequestMinErr('tpload', 'Failed to load template: {0} (HTTP status: {1} {2})',\n            tpl, resp.status, resp.statusText);\n        }\n        return $q.reject(resp);\n      }\n    }\n\n    handleRequestFn.totalPendingRequests = 0;\n\n    return handleRequestFn;\n  }];\n}\n\nfunction $$TestabilityProvider() {\n  this.$get = ['$rootScope', '$browser', '$location',\n       function($rootScope,   $browser,   $location) {\n\n    /**\n     * @name $testability\n     *\n     * @description\n     * The private $$testability service provides a collection of methods for use when debugging\n     * or by automated test and debugging tools.\n     */\n    var testability = {};\n\n    /**\n     * @name $$testability#findBindings\n     *\n     * @description\n     * Returns an array of elements that are bound (via ng-bind or {{}})\n     * to expressions matching the input.\n     *\n     * @param {Element} element The element root to search from.\n     * @param {string} expression The binding expression to match.\n     * @param {boolean} opt_exactMatch If true, only returns exact matches\n     *     for the expression. Filters and whitespace are ignored.\n     */\n    testability.findBindings = function(element, expression, opt_exactMatch) {\n      var bindings = element.getElementsByClassName('ng-binding');\n      var matches = [];\n      forEach(bindings, function(binding) {\n        var dataBinding = angular.element(binding).data('$binding');\n        if (dataBinding) {\n          forEach(dataBinding, function(bindingName) {\n            if (opt_exactMatch) {\n              var matcher = new RegExp('(^|\\\\s)' + escapeForRegexp(expression) + '(\\\\s|\\\\||$)');\n              if (matcher.test(bindingName)) {\n                matches.push(binding);\n              }\n            } else {\n              if (bindingName.indexOf(expression) != -1) {\n                matches.push(binding);\n              }\n            }\n          });\n        }\n      });\n      return matches;\n    };\n\n    /**\n     * @name $$testability#findModels\n     *\n     * @description\n     * Returns an array of elements that are two-way found via ng-model to\n     * expressions matching the input.\n     *\n     * @param {Element} element The element root to search from.\n     * @param {string} expression The model expression to match.\n     * @param {boolean} opt_exactMatch If true, only returns exact matches\n     *     for the expression.\n     */\n    testability.findModels = function(element, expression, opt_exactMatch) {\n      var prefixes = ['ng-', 'data-ng-', 'ng\\\\:'];\n      for (var p = 0; p < prefixes.length; ++p) {\n        var attributeEquals = opt_exactMatch ? '=' : '*=';\n        var selector = '[' + prefixes[p] + 'model' + attributeEquals + '\"' + expression + '\"]';\n        var elements = element.querySelectorAll(selector);\n        if (elements.length) {\n          return elements;\n        }\n      }\n    };\n\n    /**\n     * @name $$testability#getLocation\n     *\n     * @description\n     * Shortcut for getting the location in a browser agnostic way. Returns\n     *     the path, search, and hash. (e.g. /path?a=b#hash)\n     */\n    testability.getLocation = function() {\n      return $location.url();\n    };\n\n    /**\n     * @name $$testability#setLocation\n     *\n     * @description\n     * Shortcut for navigating to a location without doing a full page reload.\n     *\n     * @param {string} url The location url (path, search and hash,\n     *     e.g. /path?a=b#hash) to go to.\n     */\n    testability.setLocation = function(url) {\n      if (url !== $location.url()) {\n        $location.url(url);\n        $rootScope.$digest();\n      }\n    };\n\n    /**\n     * @name $$testability#whenStable\n     *\n     * @description\n     * Calls the callback when $timeout and $http requests are completed.\n     *\n     * @param {function} callback\n     */\n    testability.whenStable = function(callback) {\n      $browser.notifyWhenNoOutstandingRequests(callback);\n    };\n\n    return testability;\n  }];\n}\n\nfunction $TimeoutProvider() {\n  this.$get = ['$rootScope', '$browser', '$q', '$$q', '$exceptionHandler',\n       function($rootScope,   $browser,   $q,   $$q,   $exceptionHandler) {\n\n    var deferreds = {};\n\n\n     /**\n      * @ngdoc service\n      * @name $timeout\n      *\n      * @description\n      * Angular's wrapper for `window.setTimeout`. The `fn` function is wrapped into a try/catch\n      * block and delegates any exceptions to\n      * {@link ng.$exceptionHandler $exceptionHandler} service.\n      *\n      * The return value of calling `$timeout` is a promise, which will be resolved when\n      * the delay has passed and the timeout function, if provided, is executed.\n      *\n      * To cancel a timeout request, call `$timeout.cancel(promise)`.\n      *\n      * In tests you can use {@link ngMock.$timeout `$timeout.flush()`} to\n      * synchronously flush the queue of deferred functions.\n      *\n      * If you only want a promise that will be resolved after some specified delay\n      * then you can call `$timeout` without the `fn` function.\n      *\n      * @param {function()=} fn A function, whose execution should be delayed.\n      * @param {number=} [delay=0] Delay in milliseconds.\n      * @param {boolean=} [invokeApply=true] If set to `false` skips model dirty checking, otherwise\n      *   will invoke `fn` within the {@link ng.$rootScope.Scope#$apply $apply} block.\n      * @param {...*=} Pass additional parameters to the executed function.\n      * @returns {Promise} Promise that will be resolved when the timeout is reached. The promise\n      *   will be resolved with the return value of the `fn` function.\n      *\n      */\n    function timeout(fn, delay, invokeApply) {\n      if (!isFunction(fn)) {\n        invokeApply = delay;\n        delay = fn;\n        fn = noop;\n      }\n\n      var args = sliceArgs(arguments, 3),\n          skipApply = (isDefined(invokeApply) && !invokeApply),\n          deferred = (skipApply ? $$q : $q).defer(),\n          promise = deferred.promise,\n          timeoutId;\n\n      timeoutId = $browser.defer(function() {\n        try {\n          deferred.resolve(fn.apply(null, args));\n        } catch (e) {\n          deferred.reject(e);\n          $exceptionHandler(e);\n        }\n        finally {\n          delete deferreds[promise.$$timeoutId];\n        }\n\n        if (!skipApply) $rootScope.$apply();\n      }, delay);\n\n      promise.$$timeoutId = timeoutId;\n      deferreds[timeoutId] = deferred;\n\n      return promise;\n    }\n\n\n     /**\n      * @ngdoc method\n      * @name $timeout#cancel\n      *\n      * @description\n      * Cancels a task associated with the `promise`. As a result of this, the promise will be\n      * resolved with a rejection.\n      *\n      * @param {Promise=} promise Promise returned by the `$timeout` function.\n      * @returns {boolean} Returns `true` if the task hasn't executed yet and was successfully\n      *   canceled.\n      */\n    timeout.cancel = function(promise) {\n      if (promise && promise.$$timeoutId in deferreds) {\n        deferreds[promise.$$timeoutId].reject('canceled');\n        delete deferreds[promise.$$timeoutId];\n        return $browser.defer.cancel(promise.$$timeoutId);\n      }\n      return false;\n    };\n\n    return timeout;\n  }];\n}\n\n// NOTE:  The usage of window and document instead of $window and $document here is\n// deliberate.  This service depends on the specific behavior of anchor nodes created by the\n// browser (resolving and parsing URLs) that is unlikely to be provided by mock objects and\n// cause us to break tests.  In addition, when the browser resolves a URL for XHR, it\n// doesn't know about mocked locations and resolves URLs to the real document - which is\n// exactly the behavior needed here.  There is little value is mocking these out for this\n// service.\nvar urlParsingNode = window.document.createElement(\"a\");\nvar originUrl = urlResolve(window.location.href);\n\n\n/**\n *\n * Implementation Notes for non-IE browsers\n * ----------------------------------------\n * Assigning a URL to the href property of an anchor DOM node, even one attached to the DOM,\n * results both in the normalizing and parsing of the URL.  Normalizing means that a relative\n * URL will be resolved into an absolute URL in the context of the application document.\n * Parsing means that the anchor node's host, hostname, protocol, port, pathname and related\n * properties are all populated to reflect the normalized URL.  This approach has wide\n * compatibility - Safari 1+, Mozilla 1+, Opera 7+,e etc.  See\n * http://www.aptana.com/reference/html/api/HTMLAnchorElement.html\n *\n * Implementation Notes for IE\n * ---------------------------\n * IE <= 10 normalizes the URL when assigned to the anchor node similar to the other\n * browsers.  However, the parsed components will not be set if the URL assigned did not specify\n * them.  (e.g. if you assign a.href = \"foo\", then a.protocol, a.host, etc. will be empty.)  We\n * work around that by performing the parsing in a 2nd step by taking a previously normalized\n * URL (e.g. by assigning to a.href) and assigning it a.href again.  This correctly populates the\n * properties such as protocol, hostname, port, etc.\n *\n * References:\n *   http://developer.mozilla.org/en-US/docs/Web/API/HTMLAnchorElement\n *   http://www.aptana.com/reference/html/api/HTMLAnchorElement.html\n *   http://url.spec.whatwg.org/#urlutils\n *   https://github.com/angular/angular.js/pull/2902\n *   http://james.padolsey.com/javascript/parsing-urls-with-the-dom/\n *\n * @kind function\n * @param {string} url The URL to be parsed.\n * @description Normalizes and parses a URL.\n * @returns {object} Returns the normalized URL as a dictionary.\n *\n *   | member name   | Description    |\n *   |---------------|----------------|\n *   | href          | A normalized version of the provided URL if it was not an absolute URL |\n *   | protocol      | The protocol including the trailing colon                              |\n *   | host          | The host and port (if the port is non-default) of the normalizedUrl    |\n *   | search        | The search params, minus the question mark                             |\n *   | hash          | The hash string, minus the hash symbol\n *   | hostname      | The hostname\n *   | port          | The port, without \":\"\n *   | pathname      | The pathname, beginning with \"/\"\n *\n */\nfunction urlResolve(url) {\n  var href = url;\n\n  if (msie) {\n    // Normalize before parse.  Refer Implementation Notes on why this is\n    // done in two steps on IE.\n    urlParsingNode.setAttribute(\"href\", href);\n    href = urlParsingNode.href;\n  }\n\n  urlParsingNode.setAttribute('href', href);\n\n  // urlParsingNode provides the UrlUtils interface - http://url.spec.whatwg.org/#urlutils\n  return {\n    href: urlParsingNode.href,\n    protocol: urlParsingNode.protocol ? urlParsingNode.protocol.replace(/:$/, '') : '',\n    host: urlParsingNode.host,\n    search: urlParsingNode.search ? urlParsingNode.search.replace(/^\\?/, '') : '',\n    hash: urlParsingNode.hash ? urlParsingNode.hash.replace(/^#/, '') : '',\n    hostname: urlParsingNode.hostname,\n    port: urlParsingNode.port,\n    pathname: (urlParsingNode.pathname.charAt(0) === '/')\n      ? urlParsingNode.pathname\n      : '/' + urlParsingNode.pathname\n  };\n}\n\n/**\n * Parse a request URL and determine whether this is a same-origin request as the application document.\n *\n * @param {string|object} requestUrl The url of the request as a string that will be resolved\n * or a parsed URL object.\n * @returns {boolean} Whether the request is for the same origin as the application document.\n */\nfunction urlIsSameOrigin(requestUrl) {\n  var parsed = (isString(requestUrl)) ? urlResolve(requestUrl) : requestUrl;\n  return (parsed.protocol === originUrl.protocol &&\n          parsed.host === originUrl.host);\n}\n\n/**\n * @ngdoc service\n * @name $window\n *\n * @description\n * A reference to the browser's `window` object. While `window`\n * is globally available in JavaScript, it causes testability problems, because\n * it is a global variable. In angular we always refer to it through the\n * `$window` service, so it may be overridden, removed or mocked for testing.\n *\n * Expressions, like the one defined for the `ngClick` directive in the example\n * below, are evaluated with respect to the current scope.  Therefore, there is\n * no risk of inadvertently coding in a dependency on a global value in such an\n * expression.\n *\n * @example\n   <example module=\"windowExample\">\n     <file name=\"index.html\">\n       <script>\n         angular.module('windowExample', [])\n           .controller('ExampleController', ['$scope', '$window', function($scope, $window) {\n             $scope.greeting = 'Hello, World!';\n             $scope.doGreeting = function(greeting) {\n               $window.alert(greeting);\n             };\n           }]);\n       </script>\n       <div ng-controller=\"ExampleController\">\n         <input type=\"text\" ng-model=\"greeting\" aria-label=\"greeting\" />\n         <button ng-click=\"doGreeting(greeting)\">ALERT</button>\n       </div>\n     </file>\n     <file name=\"protractor.js\" type=\"protractor\">\n      it('should display the greeting in the input box', function() {\n       element(by.model('greeting')).sendKeys('Hello, E2E Tests');\n       // If we click the button it will block the test runner\n       // element(':button').click();\n      });\n     </file>\n   </example>\n */\nfunction $WindowProvider() {\n  this.$get = valueFn(window);\n}\n\n/**\n * @name $$cookieReader\n * @requires $document\n *\n * @description\n * This is a private service for reading cookies used by $http and ngCookies\n *\n * @return {Object} a key/value map of the current cookies\n */\nfunction $$CookieReader($document) {\n  var rawDocument = $document[0] || {};\n  var lastCookies = {};\n  var lastCookieString = '';\n\n  function safeDecodeURIComponent(str) {\n    try {\n      return decodeURIComponent(str);\n    } catch (e) {\n      return str;\n    }\n  }\n\n  return function() {\n    var cookieArray, cookie, i, index, name;\n    var currentCookieString = rawDocument.cookie || '';\n\n    if (currentCookieString !== lastCookieString) {\n      lastCookieString = currentCookieString;\n      cookieArray = lastCookieString.split('; ');\n      lastCookies = {};\n\n      for (i = 0; i < cookieArray.length; i++) {\n        cookie = cookieArray[i];\n        index = cookie.indexOf('=');\n        if (index > 0) { //ignore nameless cookies\n          name = safeDecodeURIComponent(cookie.substring(0, index));\n          // the first value that is seen for a cookie is the most\n          // specific one.  values for the same cookie name that\n          // follow are for less specific paths.\n          if (isUndefined(lastCookies[name])) {\n            lastCookies[name] = safeDecodeURIComponent(cookie.substring(index + 1));\n          }\n        }\n      }\n    }\n    return lastCookies;\n  };\n}\n\n$$CookieReader.$inject = ['$document'];\n\nfunction $$CookieReaderProvider() {\n  this.$get = $$CookieReader;\n}\n\n/* global currencyFilter: true,\n dateFilter: true,\n filterFilter: true,\n jsonFilter: true,\n limitToFilter: true,\n lowercaseFilter: true,\n numberFilter: true,\n orderByFilter: true,\n uppercaseFilter: true,\n */\n\n/**\n * @ngdoc provider\n * @name $filterProvider\n * @description\n *\n * Filters are just functions which transform input to an output. However filters need to be\n * Dependency Injected. To achieve this a filter definition consists of a factory function which is\n * annotated with dependencies and is responsible for creating a filter function.\n *\n * <div class=\"alert alert-warning\">\n * **Note:** Filter names must be valid angular {@link expression} identifiers, such as `uppercase` or `orderBy`.\n * Names with special characters, such as hyphens and dots, are not allowed. If you wish to namespace\n * your filters, then you can use capitalization (`myappSubsectionFilterx`) or underscores\n * (`myapp_subsection_filterx`).\n * </div>\n *\n * ```js\n *   // Filter registration\n *   function MyModule($provide, $filterProvider) {\n *     // create a service to demonstrate injection (not always needed)\n *     $provide.value('greet', function(name){\n *       return 'Hello ' + name + '!';\n *     });\n *\n *     // register a filter factory which uses the\n *     // greet service to demonstrate DI.\n *     $filterProvider.register('greet', function(greet){\n *       // return the filter function which uses the greet service\n *       // to generate salutation\n *       return function(text) {\n *         // filters need to be forgiving so check input validity\n *         return text && greet(text) || text;\n *       };\n *     });\n *   }\n * ```\n *\n * The filter function is registered with the `$injector` under the filter name suffix with\n * `Filter`.\n *\n * ```js\n *   it('should be the same instance', inject(\n *     function($filterProvider) {\n *       $filterProvider.register('reverse', function(){\n *         return ...;\n *       });\n *     },\n *     function($filter, reverseFilter) {\n *       expect($filter('reverse')).toBe(reverseFilter);\n *     });\n * ```\n *\n *\n * For more information about how angular filters work, and how to create your own filters, see\n * {@link guide/filter Filters} in the Angular Developer Guide.\n */\n\n/**\n * @ngdoc service\n * @name $filter\n * @kind function\n * @description\n * Filters are used for formatting data displayed to the user.\n *\n * The general syntax in templates is as follows:\n *\n *         {{ expression [| filter_name[:parameter_value] ... ] }}\n *\n * @param {String} name Name of the filter function to retrieve\n * @return {Function} the filter function\n * @example\n   <example name=\"$filter\" module=\"filterExample\">\n     <file name=\"index.html\">\n       <div ng-controller=\"MainCtrl\">\n        <h3>{{ originalText }}</h3>\n        <h3>{{ filteredText }}</h3>\n       </div>\n     </file>\n\n     <file name=\"script.js\">\n      angular.module('filterExample', [])\n      .controller('MainCtrl', function($scope, $filter) {\n        $scope.originalText = 'hello';\n        $scope.filteredText = $filter('uppercase')($scope.originalText);\n      });\n     </file>\n   </example>\n  */\n$FilterProvider.$inject = ['$provide'];\nfunction $FilterProvider($provide) {\n  var suffix = 'Filter';\n\n  /**\n   * @ngdoc method\n   * @name $filterProvider#register\n   * @param {string|Object} name Name of the filter function, or an object map of filters where\n   *    the keys are the filter names and the values are the filter factories.\n   *\n   *    <div class=\"alert alert-warning\">\n   *    **Note:** Filter names must be valid angular {@link expression} identifiers, such as `uppercase` or `orderBy`.\n   *    Names with special characters, such as hyphens and dots, are not allowed. If you wish to namespace\n   *    your filters, then you can use capitalization (`myappSubsectionFilterx`) or underscores\n   *    (`myapp_subsection_filterx`).\n   *    </div>\n    * @param {Function} factory If the first argument was a string, a factory function for the filter to be registered.\n   * @returns {Object} Registered filter instance, or if a map of filters was provided then a map\n   *    of the registered filter instances.\n   */\n  function register(name, factory) {\n    if (isObject(name)) {\n      var filters = {};\n      forEach(name, function(filter, key) {\n        filters[key] = register(key, filter);\n      });\n      return filters;\n    } else {\n      return $provide.factory(name + suffix, factory);\n    }\n  }\n  this.register = register;\n\n  this.$get = ['$injector', function($injector) {\n    return function(name) {\n      return $injector.get(name + suffix);\n    };\n  }];\n\n  ////////////////////////////////////////\n\n  /* global\n    currencyFilter: false,\n    dateFilter: false,\n    filterFilter: false,\n    jsonFilter: false,\n    limitToFilter: false,\n    lowercaseFilter: false,\n    numberFilter: false,\n    orderByFilter: false,\n    uppercaseFilter: false,\n  */\n\n  register('currency', currencyFilter);\n  register('date', dateFilter);\n  register('filter', filterFilter);\n  register('json', jsonFilter);\n  register('limitTo', limitToFilter);\n  register('lowercase', lowercaseFilter);\n  register('number', numberFilter);\n  register('orderBy', orderByFilter);\n  register('uppercase', uppercaseFilter);\n}\n\n/**\n * @ngdoc filter\n * @name filter\n * @kind function\n *\n * @description\n * Selects a subset of items from `array` and returns it as a new array.\n *\n * @param {Array} array The source array.\n * @param {string|Object|function()} expression The predicate to be used for selecting items from\n *   `array`.\n *\n *   Can be one of:\n *\n *   - `string`: The string is used for matching against the contents of the `array`. All strings or\n *     objects with string properties in `array` that match this string will be returned. This also\n *     applies to nested object properties.\n *     The predicate can be negated by prefixing the string with `!`.\n *\n *   - `Object`: A pattern object can be used to filter specific properties on objects contained\n *     by `array`. For example `{name:\"M\", phone:\"1\"}` predicate will return an array of items\n *     which have property `name` containing \"M\" and property `phone` containing \"1\". A special\n *     property name `$` can be used (as in `{$:\"text\"}`) to accept a match against any\n *     property of the object or its nested object properties. That's equivalent to the simple\n *     substring match with a `string` as described above. The predicate can be negated by prefixing\n *     the string with `!`.\n *     For example `{name: \"!M\"}` predicate will return an array of items which have property `name`\n *     not containing \"M\".\n *\n *     Note that a named property will match properties on the same level only, while the special\n *     `$` property will match properties on the same level or deeper. E.g. an array item like\n *     `{name: {first: 'John', last: 'Doe'}}` will **not** be matched by `{name: 'John'}`, but\n *     **will** be matched by `{$: 'John'}`.\n *\n *   - `function(value, index, array)`: A predicate function can be used to write arbitrary filters.\n *     The function is called for each element of the array, with the element, its index, and\n *     the entire array itself as arguments.\n *\n *     The final result is an array of those elements that the predicate returned true for.\n *\n * @param {function(actual, expected)|true|undefined} comparator Comparator which is used in\n *     determining if the expected value (from the filter expression) and actual value (from\n *     the object in the array) should be considered a match.\n *\n *   Can be one of:\n *\n *   - `function(actual, expected)`:\n *     The function will be given the object value and the predicate value to compare and\n *     should return true if both values should be considered equal.\n *\n *   - `true`: A shorthand for `function(actual, expected) { return angular.equals(actual, expected)}`.\n *     This is essentially strict comparison of expected and actual.\n *\n *   - `false|undefined`: A short hand for a function which will look for a substring match in case\n *     insensitive way.\n *\n *     Primitive values are converted to strings. Objects are not compared against primitives,\n *     unless they have a custom `toString` method (e.g. `Date` objects).\n *\n * @example\n   <example>\n     <file name=\"index.html\">\n       <div ng-init=\"friends = [{name:'John', phone:'555-1276'},\n                                {name:'Mary', phone:'800-BIG-MARY'},\n                                {name:'Mike', phone:'555-4321'},\n                                {name:'Adam', phone:'555-5678'},\n                                {name:'Julie', phone:'555-8765'},\n                                {name:'Juliette', phone:'555-5678'}]\"></div>\n\n       <label>Search: <input ng-model=\"searchText\"></label>\n       <table id=\"searchTextResults\">\n         <tr><th>Name</th><th>Phone</th></tr>\n         <tr ng-repeat=\"friend in friends | filter:searchText\">\n           <td>{{friend.name}}</td>\n           <td>{{friend.phone}}</td>\n         </tr>\n       </table>\n       <hr>\n       <label>Any: <input ng-model=\"search.$\"></label> <br>\n       <label>Name only <input ng-model=\"search.name\"></label><br>\n       <label>Phone only <input ng-model=\"search.phone\"></label><br>\n       <label>Equality <input type=\"checkbox\" ng-model=\"strict\"></label><br>\n       <table id=\"searchObjResults\">\n         <tr><th>Name</th><th>Phone</th></tr>\n         <tr ng-repeat=\"friendObj in friends | filter:search:strict\">\n           <td>{{friendObj.name}}</td>\n           <td>{{friendObj.phone}}</td>\n         </tr>\n       </table>\n     </file>\n     <file name=\"protractor.js\" type=\"protractor\">\n       var expectFriendNames = function(expectedNames, key) {\n         element.all(by.repeater(key + ' in friends').column(key + '.name')).then(function(arr) {\n           arr.forEach(function(wd, i) {\n             expect(wd.getText()).toMatch(expectedNames[i]);\n           });\n         });\n       };\n\n       it('should search across all fields when filtering with a string', function() {\n         var searchText = element(by.model('searchText'));\n         searchText.clear();\n         searchText.sendKeys('m');\n         expectFriendNames(['Mary', 'Mike', 'Adam'], 'friend');\n\n         searchText.clear();\n         searchText.sendKeys('76');\n         expectFriendNames(['John', 'Julie'], 'friend');\n       });\n\n       it('should search in specific fields when filtering with a predicate object', function() {\n         var searchAny = element(by.model('search.$'));\n         searchAny.clear();\n         searchAny.sendKeys('i');\n         expectFriendNames(['Mary', 'Mike', 'Julie', 'Juliette'], 'friendObj');\n       });\n       it('should use a equal comparison when comparator is true', function() {\n         var searchName = element(by.model('search.name'));\n         var strict = element(by.model('strict'));\n         searchName.clear();\n         searchName.sendKeys('Julie');\n         strict.click();\n         expectFriendNames(['Julie'], 'friendObj');\n       });\n     </file>\n   </example>\n */\nfunction filterFilter() {\n  return function(array, expression, comparator) {\n    if (!isArrayLike(array)) {\n      if (array == null) {\n        return array;\n      } else {\n        throw minErr('filter')('notarray', 'Expected array but received: {0}', array);\n      }\n    }\n\n    var expressionType = getTypeForFilter(expression);\n    var predicateFn;\n    var matchAgainstAnyProp;\n\n    switch (expressionType) {\n      case 'function':\n        predicateFn = expression;\n        break;\n      case 'boolean':\n      case 'null':\n      case 'number':\n      case 'string':\n        matchAgainstAnyProp = true;\n        //jshint -W086\n      case 'object':\n        //jshint +W086\n        predicateFn = createPredicateFn(expression, comparator, matchAgainstAnyProp);\n        break;\n      default:\n        return array;\n    }\n\n    return Array.prototype.filter.call(array, predicateFn);\n  };\n}\n\n// Helper functions for `filterFilter`\nfunction createPredicateFn(expression, comparator, matchAgainstAnyProp) {\n  var shouldMatchPrimitives = isObject(expression) && ('$' in expression);\n  var predicateFn;\n\n  if (comparator === true) {\n    comparator = equals;\n  } else if (!isFunction(comparator)) {\n    comparator = function(actual, expected) {\n      if (isUndefined(actual)) {\n        // No substring matching against `undefined`\n        return false;\n      }\n      if ((actual === null) || (expected === null)) {\n        // No substring matching against `null`; only match against `null`\n        return actual === expected;\n      }\n      if (isObject(expected) || (isObject(actual) && !hasCustomToString(actual))) {\n        // Should not compare primitives against objects, unless they have custom `toString` method\n        return false;\n      }\n\n      actual = lowercase('' + actual);\n      expected = lowercase('' + expected);\n      return actual.indexOf(expected) !== -1;\n    };\n  }\n\n  predicateFn = function(item) {\n    if (shouldMatchPrimitives && !isObject(item)) {\n      return deepCompare(item, expression.$, comparator, false);\n    }\n    return deepCompare(item, expression, comparator, matchAgainstAnyProp);\n  };\n\n  return predicateFn;\n}\n\nfunction deepCompare(actual, expected, comparator, matchAgainstAnyProp, dontMatchWholeObject) {\n  var actualType = getTypeForFilter(actual);\n  var expectedType = getTypeForFilter(expected);\n\n  if ((expectedType === 'string') && (expected.charAt(0) === '!')) {\n    return !deepCompare(actual, expected.substring(1), comparator, matchAgainstAnyProp);\n  } else if (isArray(actual)) {\n    // In case `actual` is an array, consider it a match\n    // if ANY of it's items matches `expected`\n    return actual.some(function(item) {\n      return deepCompare(item, expected, comparator, matchAgainstAnyProp);\n    });\n  }\n\n  switch (actualType) {\n    case 'object':\n      var key;\n      if (matchAgainstAnyProp) {\n        for (key in actual) {\n          if ((key.charAt(0) !== '$') && deepCompare(actual[key], expected, comparator, true)) {\n            return true;\n          }\n        }\n        return dontMatchWholeObject ? false : deepCompare(actual, expected, comparator, false);\n      } else if (expectedType === 'object') {\n        for (key in expected) {\n          var expectedVal = expected[key];\n          if (isFunction(expectedVal) || isUndefined(expectedVal)) {\n            continue;\n          }\n\n          var matchAnyProperty = key === '$';\n          var actualVal = matchAnyProperty ? actual : actual[key];\n          if (!deepCompare(actualVal, expectedVal, comparator, matchAnyProperty, matchAnyProperty)) {\n            return false;\n          }\n        }\n        return true;\n      } else {\n        return comparator(actual, expected);\n      }\n      break;\n    case 'function':\n      return false;\n    default:\n      return comparator(actual, expected);\n  }\n}\n\n// Used for easily differentiating between `null` and actual `object`\nfunction getTypeForFilter(val) {\n  return (val === null) ? 'null' : typeof val;\n}\n\nvar MAX_DIGITS = 22;\nvar DECIMAL_SEP = '.';\nvar ZERO_CHAR = '0';\n\n/**\n * @ngdoc filter\n * @name currency\n * @kind function\n *\n * @description\n * Formats a number as a currency (ie $1,234.56). When no currency symbol is provided, default\n * symbol for current locale is used.\n *\n * @param {number} amount Input to filter.\n * @param {string=} symbol Currency symbol or identifier to be displayed.\n * @param {number=} fractionSize Number of decimal places to round the amount to, defaults to default max fraction size for current locale\n * @returns {string} Formatted number.\n *\n *\n * @example\n   <example module=\"currencyExample\">\n     <file name=\"index.html\">\n       <script>\n         angular.module('currencyExample', [])\n           .controller('ExampleController', ['$scope', function($scope) {\n             $scope.amount = 1234.56;\n           }]);\n       </script>\n       <div ng-controller=\"ExampleController\">\n         <input type=\"number\" ng-model=\"amount\" aria-label=\"amount\"> <br>\n         default currency symbol ($): <span id=\"currency-default\">{{amount | currency}}</span><br>\n         custom currency identifier (USD$): <span id=\"currency-custom\">{{amount | currency:\"USD$\"}}</span>\n         no fractions (0): <span id=\"currency-no-fractions\">{{amount | currency:\"USD$\":0}}</span>\n       </div>\n     </file>\n     <file name=\"protractor.js\" type=\"protractor\">\n       it('should init with 1234.56', function() {\n         expect(element(by.id('currency-default')).getText()).toBe('$1,234.56');\n         expect(element(by.id('currency-custom')).getText()).toBe('USD$1,234.56');\n         expect(element(by.id('currency-no-fractions')).getText()).toBe('USD$1,235');\n       });\n       it('should update', function() {\n         if (browser.params.browser == 'safari') {\n           // Safari does not understand the minus key. See\n           // https://github.com/angular/protractor/issues/481\n           return;\n         }\n         element(by.model('amount')).clear();\n         element(by.model('amount')).sendKeys('-1234');\n         expect(element(by.id('currency-default')).getText()).toBe('-$1,234.00');\n         expect(element(by.id('currency-custom')).getText()).toBe('-USD$1,234.00');\n         expect(element(by.id('currency-no-fractions')).getText()).toBe('-USD$1,234');\n       });\n     </file>\n   </example>\n */\ncurrencyFilter.$inject = ['$locale'];\nfunction currencyFilter($locale) {\n  var formats = $locale.NUMBER_FORMATS;\n  return function(amount, currencySymbol, fractionSize) {\n    if (isUndefined(currencySymbol)) {\n      currencySymbol = formats.CURRENCY_SYM;\n    }\n\n    if (isUndefined(fractionSize)) {\n      fractionSize = formats.PATTERNS[1].maxFrac;\n    }\n\n    // if null or undefined pass it through\n    return (amount == null)\n        ? amount\n        : formatNumber(amount, formats.PATTERNS[1], formats.GROUP_SEP, formats.DECIMAL_SEP, fractionSize).\n            replace(/\\u00A4/g, currencySymbol);\n  };\n}\n\n/**\n * @ngdoc filter\n * @name number\n * @kind function\n *\n * @description\n * Formats a number as text.\n *\n * If the input is null or undefined, it will just be returned.\n * If the input is infinite (Infinity or -Infinity), the Infinity symbol '∞' or '-∞' is returned, respectively.\n * If the input is not a number an empty string is returned.\n *\n *\n * @param {number|string} number Number to format.\n * @param {(number|string)=} fractionSize Number of decimal places to round the number to.\n * If this is not provided then the fraction size is computed from the current locale's number\n * formatting pattern. In the case of the default locale, it will be 3.\n * @returns {string} Number rounded to `fractionSize` appropriately formatted based on the current\n *                   locale (e.g., in the en_US locale it will have \".\" as the decimal separator and\n *                   include \",\" group separators after each third digit).\n *\n * @example\n   <example module=\"numberFilterExample\">\n     <file name=\"index.html\">\n       <script>\n         angular.module('numberFilterExample', [])\n           .controller('ExampleController', ['$scope', function($scope) {\n             $scope.val = 1234.56789;\n           }]);\n       </script>\n       <div ng-controller=\"ExampleController\">\n         <label>Enter number: <input ng-model='val'></label><br>\n         Default formatting: <span id='number-default'>{{val | number}}</span><br>\n         No fractions: <span>{{val | number:0}}</span><br>\n         Negative number: <span>{{-val | number:4}}</span>\n       </div>\n     </file>\n     <file name=\"protractor.js\" type=\"protractor\">\n       it('should format numbers', function() {\n         expect(element(by.id('number-default')).getText()).toBe('1,234.568');\n         expect(element(by.binding('val | number:0')).getText()).toBe('1,235');\n         expect(element(by.binding('-val | number:4')).getText()).toBe('-1,234.5679');\n       });\n\n       it('should update', function() {\n         element(by.model('val')).clear();\n         element(by.model('val')).sendKeys('3374.333');\n         expect(element(by.id('number-default')).getText()).toBe('3,374.333');\n         expect(element(by.binding('val | number:0')).getText()).toBe('3,374');\n         expect(element(by.binding('-val | number:4')).getText()).toBe('-3,374.3330');\n      });\n     </file>\n   </example>\n */\nnumberFilter.$inject = ['$locale'];\nfunction numberFilter($locale) {\n  var formats = $locale.NUMBER_FORMATS;\n  return function(number, fractionSize) {\n\n    // if null or undefined pass it through\n    return (number == null)\n        ? number\n        : formatNumber(number, formats.PATTERNS[0], formats.GROUP_SEP, formats.DECIMAL_SEP,\n                       fractionSize);\n  };\n}\n\n/**\n * Parse a number (as a string) into three components that can be used\n * for formatting the number.\n *\n * (Significant bits of this parse algorithm came from https://github.com/MikeMcl/big.js/)\n *\n * @param  {string} numStr The number to parse\n * @return {object} An object describing this number, containing the following keys:\n *  - d : an array of digits containing leading zeros as necessary\n *  - i : the number of the digits in `d` that are to the left of the decimal point\n *  - e : the exponent for numbers that would need more than `MAX_DIGITS` digits in `d`\n *\n */\nfunction parse(numStr) {\n  var exponent = 0, digits, numberOfIntegerDigits;\n  var i, j, zeros;\n\n  // Decimal point?\n  if ((numberOfIntegerDigits = numStr.indexOf(DECIMAL_SEP)) > -1) {\n    numStr = numStr.replace(DECIMAL_SEP, '');\n  }\n\n  // Exponential form?\n  if ((i = numStr.search(/e/i)) > 0) {\n    // Work out the exponent.\n    if (numberOfIntegerDigits < 0) numberOfIntegerDigits = i;\n    numberOfIntegerDigits += +numStr.slice(i + 1);\n    numStr = numStr.substring(0, i);\n  } else if (numberOfIntegerDigits < 0) {\n    // There was no decimal point or exponent so it is an integer.\n    numberOfIntegerDigits = numStr.length;\n  }\n\n  // Count the number of leading zeros.\n  for (i = 0; numStr.charAt(i) == ZERO_CHAR; i++) {/* jshint noempty: false */}\n\n  if (i == (zeros = numStr.length)) {\n    // The digits are all zero.\n    digits = [0];\n    numberOfIntegerDigits = 1;\n  } else {\n    // Count the number of trailing zeros\n    zeros--;\n    while (numStr.charAt(zeros) == ZERO_CHAR) zeros--;\n\n    // Trailing zeros are insignificant so ignore them\n    numberOfIntegerDigits -= i;\n    digits = [];\n    // Convert string to array of digits without leading/trailing zeros.\n    for (j = 0; i <= zeros; i++, j++) {\n      digits[j] = +numStr.charAt(i);\n    }\n  }\n\n  // If the number overflows the maximum allowed digits then use an exponent.\n  if (numberOfIntegerDigits > MAX_DIGITS) {\n    digits = digits.splice(0, MAX_DIGITS - 1);\n    exponent = numberOfIntegerDigits - 1;\n    numberOfIntegerDigits = 1;\n  }\n\n  return { d: digits, e: exponent, i: numberOfIntegerDigits };\n}\n\n/**\n * Round the parsed number to the specified number of decimal places\n * This function changed the parsedNumber in-place\n */\nfunction roundNumber(parsedNumber, fractionSize, minFrac, maxFrac) {\n    var digits = parsedNumber.d;\n    var fractionLen = digits.length - parsedNumber.i;\n\n    // determine fractionSize if it is not specified; `+fractionSize` converts it to a number\n    fractionSize = (isUndefined(fractionSize)) ? Math.min(Math.max(minFrac, fractionLen), maxFrac) : +fractionSize;\n\n    // The index of the digit to where rounding is to occur\n    var roundAt = fractionSize + parsedNumber.i;\n    var digit = digits[roundAt];\n\n    if (roundAt > 0) {\n      // Drop fractional digits beyond `roundAt`\n      digits.splice(Math.max(parsedNumber.i, roundAt));\n\n      // Set non-fractional digits beyond `roundAt` to 0\n      for (var j = roundAt; j < digits.length; j++) {\n        digits[j] = 0;\n      }\n    } else {\n      // We rounded to zero so reset the parsedNumber\n      fractionLen = Math.max(0, fractionLen);\n      parsedNumber.i = 1;\n      digits.length = Math.max(1, roundAt = fractionSize + 1);\n      digits[0] = 0;\n      for (var i = 1; i < roundAt; i++) digits[i] = 0;\n    }\n\n    if (digit >= 5) {\n      if (roundAt - 1 < 0) {\n        for (var k = 0; k > roundAt; k--) {\n          digits.unshift(0);\n          parsedNumber.i++;\n        }\n        digits.unshift(1);\n        parsedNumber.i++;\n      } else {\n        digits[roundAt - 1]++;\n      }\n    }\n\n    // Pad out with zeros to get the required fraction length\n    for (; fractionLen < Math.max(0, fractionSize); fractionLen++) digits.push(0);\n\n\n    // Do any carrying, e.g. a digit was rounded up to 10\n    var carry = digits.reduceRight(function(carry, d, i, digits) {\n      d = d + carry;\n      digits[i] = d % 10;\n      return Math.floor(d / 10);\n    }, 0);\n    if (carry) {\n      digits.unshift(carry);\n      parsedNumber.i++;\n    }\n}\n\n/**\n * Format a number into a string\n * @param  {number} number       The number to format\n * @param  {{\n *           minFrac, // the minimum number of digits required in the fraction part of the number\n *           maxFrac, // the maximum number of digits required in the fraction part of the number\n *           gSize,   // number of digits in each group of separated digits\n *           lgSize,  // number of digits in the last group of digits before the decimal separator\n *           negPre,  // the string to go in front of a negative number (e.g. `-` or `(`))\n *           posPre,  // the string to go in front of a positive number\n *           negSuf,  // the string to go after a negative number (e.g. `)`)\n *           posSuf   // the string to go after a positive number\n *         }} pattern\n * @param  {string} groupSep     The string to separate groups of number (e.g. `,`)\n * @param  {string} decimalSep   The string to act as the decimal separator (e.g. `.`)\n * @param  {[type]} fractionSize The size of the fractional part of the number\n * @return {string}              The number formatted as a string\n */\nfunction formatNumber(number, pattern, groupSep, decimalSep, fractionSize) {\n\n  if (!(isString(number) || isNumber(number)) || isNaN(number)) return '';\n\n  var isInfinity = !isFinite(number);\n  var isZero = false;\n  var numStr = Math.abs(number) + '',\n      formattedText = '',\n      parsedNumber;\n\n  if (isInfinity) {\n    formattedText = '\\u221e';\n  } else {\n    parsedNumber = parse(numStr);\n\n    roundNumber(parsedNumber, fractionSize, pattern.minFrac, pattern.maxFrac);\n\n    var digits = parsedNumber.d;\n    var integerLen = parsedNumber.i;\n    var exponent = parsedNumber.e;\n    var decimals = [];\n    isZero = digits.reduce(function(isZero, d) { return isZero && !d; }, true);\n\n    // pad zeros for small numbers\n    while (integerLen < 0) {\n      digits.unshift(0);\n      integerLen++;\n    }\n\n    // extract decimals digits\n    if (integerLen > 0) {\n      decimals = digits.splice(integerLen);\n    } else {\n      decimals = digits;\n      digits = [0];\n    }\n\n    // format the integer digits with grouping separators\n    var groups = [];\n    if (digits.length >= pattern.lgSize) {\n      groups.unshift(digits.splice(-pattern.lgSize).join(''));\n    }\n    while (digits.length > pattern.gSize) {\n      groups.unshift(digits.splice(-pattern.gSize).join(''));\n    }\n    if (digits.length) {\n      groups.unshift(digits.join(''));\n    }\n    formattedText = groups.join(groupSep);\n\n    // append the decimal digits\n    if (decimals.length) {\n      formattedText += decimalSep + decimals.join('');\n    }\n\n    if (exponent) {\n      formattedText += 'e+' + exponent;\n    }\n  }\n  if (number < 0 && !isZero) {\n    return pattern.negPre + formattedText + pattern.negSuf;\n  } else {\n    return pattern.posPre + formattedText + pattern.posSuf;\n  }\n}\n\nfunction padNumber(num, digits, trim, negWrap) {\n  var neg = '';\n  if (num < 0 || (negWrap && num <= 0)) {\n    if (negWrap) {\n      num = -num + 1;\n    } else {\n      num = -num;\n      neg = '-';\n    }\n  }\n  num = '' + num;\n  while (num.length < digits) num = ZERO_CHAR + num;\n  if (trim) {\n    num = num.substr(num.length - digits);\n  }\n  return neg + num;\n}\n\n\nfunction dateGetter(name, size, offset, trim, negWrap) {\n  offset = offset || 0;\n  return function(date) {\n    var value = date['get' + name]();\n    if (offset > 0 || value > -offset) {\n      value += offset;\n    }\n    if (value === 0 && offset == -12) value = 12;\n    return padNumber(value, size, trim, negWrap);\n  };\n}\n\nfunction dateStrGetter(name, shortForm, standAlone) {\n  return function(date, formats) {\n    var value = date['get' + name]();\n    var propPrefix = (standAlone ? 'STANDALONE' : '') + (shortForm ? 'SHORT' : '');\n    var get = uppercase(propPrefix + name);\n\n    return formats[get][value];\n  };\n}\n\nfunction timeZoneGetter(date, formats, offset) {\n  var zone = -1 * offset;\n  var paddedZone = (zone >= 0) ? \"+\" : \"\";\n\n  paddedZone += padNumber(Math[zone > 0 ? 'floor' : 'ceil'](zone / 60), 2) +\n                padNumber(Math.abs(zone % 60), 2);\n\n  return paddedZone;\n}\n\nfunction getFirstThursdayOfYear(year) {\n    // 0 = index of January\n    var dayOfWeekOnFirst = (new Date(year, 0, 1)).getDay();\n    // 4 = index of Thursday (+1 to account for 1st = 5)\n    // 11 = index of *next* Thursday (+1 account for 1st = 12)\n    return new Date(year, 0, ((dayOfWeekOnFirst <= 4) ? 5 : 12) - dayOfWeekOnFirst);\n}\n\nfunction getThursdayThisWeek(datetime) {\n    return new Date(datetime.getFullYear(), datetime.getMonth(),\n      // 4 = index of Thursday\n      datetime.getDate() + (4 - datetime.getDay()));\n}\n\nfunction weekGetter(size) {\n   return function(date) {\n      var firstThurs = getFirstThursdayOfYear(date.getFullYear()),\n         thisThurs = getThursdayThisWeek(date);\n\n      var diff = +thisThurs - +firstThurs,\n         result = 1 + Math.round(diff / 6.048e8); // 6.048e8 ms per week\n\n      return padNumber(result, size);\n   };\n}\n\nfunction ampmGetter(date, formats) {\n  return date.getHours() < 12 ? formats.AMPMS[0] : formats.AMPMS[1];\n}\n\nfunction eraGetter(date, formats) {\n  return date.getFullYear() <= 0 ? formats.ERAS[0] : formats.ERAS[1];\n}\n\nfunction longEraGetter(date, formats) {\n  return date.getFullYear() <= 0 ? formats.ERANAMES[0] : formats.ERANAMES[1];\n}\n\nvar DATE_FORMATS = {\n  yyyy: dateGetter('FullYear', 4, 0, false, true),\n    yy: dateGetter('FullYear', 2, 0, true, true),\n     y: dateGetter('FullYear', 1, 0, false, true),\n  MMMM: dateStrGetter('Month'),\n   MMM: dateStrGetter('Month', true),\n    MM: dateGetter('Month', 2, 1),\n     M: dateGetter('Month', 1, 1),\n  LLLL: dateStrGetter('Month', false, true),\n    dd: dateGetter('Date', 2),\n     d: dateGetter('Date', 1),\n    HH: dateGetter('Hours', 2),\n     H: dateGetter('Hours', 1),\n    hh: dateGetter('Hours', 2, -12),\n     h: dateGetter('Hours', 1, -12),\n    mm: dateGetter('Minutes', 2),\n     m: dateGetter('Minutes', 1),\n    ss: dateGetter('Seconds', 2),\n     s: dateGetter('Seconds', 1),\n     // while ISO 8601 requires fractions to be prefixed with `.` or `,`\n     // we can be just safely rely on using `sss` since we currently don't support single or two digit fractions\n   sss: dateGetter('Milliseconds', 3),\n  EEEE: dateStrGetter('Day'),\n   EEE: dateStrGetter('Day', true),\n     a: ampmGetter,\n     Z: timeZoneGetter,\n    ww: weekGetter(2),\n     w: weekGetter(1),\n     G: eraGetter,\n     GG: eraGetter,\n     GGG: eraGetter,\n     GGGG: longEraGetter\n};\n\nvar DATE_FORMATS_SPLIT = /((?:[^yMLdHhmsaZEwG']+)|(?:'(?:[^']|'')*')|(?:E+|y+|M+|L+|d+|H+|h+|m+|s+|a|Z|G+|w+))(.*)/,\n    NUMBER_STRING = /^\\-?\\d+$/;\n\n/**\n * @ngdoc filter\n * @name date\n * @kind function\n *\n * @description\n *   Formats `date` to a string based on the requested `format`.\n *\n *   `format` string can be composed of the following elements:\n *\n *   * `'yyyy'`: 4 digit representation of year (e.g. AD 1 => 0001, AD 2010 => 2010)\n *   * `'yy'`: 2 digit representation of year, padded (00-99). (e.g. AD 2001 => 01, AD 2010 => 10)\n *   * `'y'`: 1 digit representation of year, e.g. (AD 1 => 1, AD 199 => 199)\n *   * `'MMMM'`: Month in year (January-December)\n *   * `'MMM'`: Month in year (Jan-Dec)\n *   * `'MM'`: Month in year, padded (01-12)\n *   * `'M'`: Month in year (1-12)\n *   * `'LLLL'`: Stand-alone month in year (January-December)\n *   * `'dd'`: Day in month, padded (01-31)\n *   * `'d'`: Day in month (1-31)\n *   * `'EEEE'`: Day in Week,(Sunday-Saturday)\n *   * `'EEE'`: Day in Week, (Sun-Sat)\n *   * `'HH'`: Hour in day, padded (00-23)\n *   * `'H'`: Hour in day (0-23)\n *   * `'hh'`: Hour in AM/PM, padded (01-12)\n *   * `'h'`: Hour in AM/PM, (1-12)\n *   * `'mm'`: Minute in hour, padded (00-59)\n *   * `'m'`: Minute in hour (0-59)\n *   * `'ss'`: Second in minute, padded (00-59)\n *   * `'s'`: Second in minute (0-59)\n *   * `'sss'`: Millisecond in second, padded (000-999)\n *   * `'a'`: AM/PM marker\n *   * `'Z'`: 4 digit (+sign) representation of the timezone offset (-1200-+1200)\n *   * `'ww'`: Week of year, padded (00-53). Week 01 is the week with the first Thursday of the year\n *   * `'w'`: Week of year (0-53). Week 1 is the week with the first Thursday of the year\n *   * `'G'`, `'GG'`, `'GGG'`: The abbreviated form of the era string (e.g. 'AD')\n *   * `'GGGG'`: The long form of the era string (e.g. 'Anno Domini')\n *\n *   `format` string can also be one of the following predefined\n *   {@link guide/i18n localizable formats}:\n *\n *   * `'medium'`: equivalent to `'MMM d, y h:mm:ss a'` for en_US locale\n *     (e.g. Sep 3, 2010 12:05:08 PM)\n *   * `'short'`: equivalent to `'M/d/yy h:mm a'` for en_US  locale (e.g. 9/3/10 12:05 PM)\n *   * `'fullDate'`: equivalent to `'EEEE, MMMM d, y'` for en_US  locale\n *     (e.g. Friday, September 3, 2010)\n *   * `'longDate'`: equivalent to `'MMMM d, y'` for en_US  locale (e.g. September 3, 2010)\n *   * `'mediumDate'`: equivalent to `'MMM d, y'` for en_US  locale (e.g. Sep 3, 2010)\n *   * `'shortDate'`: equivalent to `'M/d/yy'` for en_US locale (e.g. 9/3/10)\n *   * `'mediumTime'`: equivalent to `'h:mm:ss a'` for en_US locale (e.g. 12:05:08 PM)\n *   * `'shortTime'`: equivalent to `'h:mm a'` for en_US locale (e.g. 12:05 PM)\n *\n *   `format` string can contain literal values. These need to be escaped by surrounding with single quotes (e.g.\n *   `\"h 'in the morning'\"`). In order to output a single quote, escape it - i.e., two single quotes in a sequence\n *   (e.g. `\"h 'o''clock'\"`).\n *\n * @param {(Date|number|string)} date Date to format either as Date object, milliseconds (string or\n *    number) or various ISO 8601 datetime string formats (e.g. yyyy-MM-ddTHH:mm:ss.sssZ and its\n *    shorter versions like yyyy-MM-ddTHH:mmZ, yyyy-MM-dd or yyyyMMddTHHmmssZ). If no timezone is\n *    specified in the string input, the time is considered to be in the local timezone.\n * @param {string=} format Formatting rules (see Description). If not specified,\n *    `mediumDate` is used.\n * @param {string=} timezone Timezone to be used for formatting. It understands UTC/GMT and the\n *    continental US time zone abbreviations, but for general use, use a time zone offset, for\n *    example, `'+0430'` (4 hours, 30 minutes east of the Greenwich meridian)\n *    If not specified, the timezone of the browser will be used.\n * @returns {string} Formatted string or the input if input is not recognized as date/millis.\n *\n * @example\n   <example>\n     <file name=\"index.html\">\n       <span ng-non-bindable>{{1288323623006 | date:'medium'}}</span>:\n           <span>{{1288323623006 | date:'medium'}}</span><br>\n       <span ng-non-bindable>{{1288323623006 | date:'yyyy-MM-dd HH:mm:ss Z'}}</span>:\n          <span>{{1288323623006 | date:'yyyy-MM-dd HH:mm:ss Z'}}</span><br>\n       <span ng-non-bindable>{{1288323623006 | date:'MM/dd/yyyy @ h:mma'}}</span>:\n          <span>{{'1288323623006' | date:'MM/dd/yyyy @ h:mma'}}</span><br>\n       <span ng-non-bindable>{{1288323623006 | date:\"MM/dd/yyyy 'at' h:mma\"}}</span>:\n          <span>{{'1288323623006' | date:\"MM/dd/yyyy 'at' h:mma\"}}</span><br>\n     </file>\n     <file name=\"protractor.js\" type=\"protractor\">\n       it('should format date', function() {\n         expect(element(by.binding(\"1288323623006 | date:'medium'\")).getText()).\n            toMatch(/Oct 2\\d, 2010 \\d{1,2}:\\d{2}:\\d{2} (AM|PM)/);\n         expect(element(by.binding(\"1288323623006 | date:'yyyy-MM-dd HH:mm:ss Z'\")).getText()).\n            toMatch(/2010\\-10\\-2\\d \\d{2}:\\d{2}:\\d{2} (\\-|\\+)?\\d{4}/);\n         expect(element(by.binding(\"'1288323623006' | date:'MM/dd/yyyy @ h:mma'\")).getText()).\n            toMatch(/10\\/2\\d\\/2010 @ \\d{1,2}:\\d{2}(AM|PM)/);\n         expect(element(by.binding(\"'1288323623006' | date:\\\"MM/dd/yyyy 'at' h:mma\\\"\")).getText()).\n            toMatch(/10\\/2\\d\\/2010 at \\d{1,2}:\\d{2}(AM|PM)/);\n       });\n     </file>\n   </example>\n */\ndateFilter.$inject = ['$locale'];\nfunction dateFilter($locale) {\n\n\n  var R_ISO8601_STR = /^(\\d{4})-?(\\d\\d)-?(\\d\\d)(?:T(\\d\\d)(?::?(\\d\\d)(?::?(\\d\\d)(?:\\.(\\d+))?)?)?(Z|([+-])(\\d\\d):?(\\d\\d))?)?$/;\n                     // 1        2       3         4          5          6          7          8  9     10      11\n  function jsonStringToDate(string) {\n    var match;\n    if (match = string.match(R_ISO8601_STR)) {\n      var date = new Date(0),\n          tzHour = 0,\n          tzMin  = 0,\n          dateSetter = match[8] ? date.setUTCFullYear : date.setFullYear,\n          timeSetter = match[8] ? date.setUTCHours : date.setHours;\n\n      if (match[9]) {\n        tzHour = toInt(match[9] + match[10]);\n        tzMin = toInt(match[9] + match[11]);\n      }\n      dateSetter.call(date, toInt(match[1]), toInt(match[2]) - 1, toInt(match[3]));\n      var h = toInt(match[4] || 0) - tzHour;\n      var m = toInt(match[5] || 0) - tzMin;\n      var s = toInt(match[6] || 0);\n      var ms = Math.round(parseFloat('0.' + (match[7] || 0)) * 1000);\n      timeSetter.call(date, h, m, s, ms);\n      return date;\n    }\n    return string;\n  }\n\n\n  return function(date, format, timezone) {\n    var text = '',\n        parts = [],\n        fn, match;\n\n    format = format || 'mediumDate';\n    format = $locale.DATETIME_FORMATS[format] || format;\n    if (isString(date)) {\n      date = NUMBER_STRING.test(date) ? toInt(date) : jsonStringToDate(date);\n    }\n\n    if (isNumber(date)) {\n      date = new Date(date);\n    }\n\n    if (!isDate(date) || !isFinite(date.getTime())) {\n      return date;\n    }\n\n    while (format) {\n      match = DATE_FORMATS_SPLIT.exec(format);\n      if (match) {\n        parts = concat(parts, match, 1);\n        format = parts.pop();\n      } else {\n        parts.push(format);\n        format = null;\n      }\n    }\n\n    var dateTimezoneOffset = date.getTimezoneOffset();\n    if (timezone) {\n      dateTimezoneOffset = timezoneToOffset(timezone, dateTimezoneOffset);\n      date = convertTimezoneToLocal(date, timezone, true);\n    }\n    forEach(parts, function(value) {\n      fn = DATE_FORMATS[value];\n      text += fn ? fn(date, $locale.DATETIME_FORMATS, dateTimezoneOffset)\n                 : value === \"''\" ? \"'\" : value.replace(/(^'|'$)/g, '').replace(/''/g, \"'\");\n    });\n\n    return text;\n  };\n}\n\n\n/**\n * @ngdoc filter\n * @name json\n * @kind function\n *\n * @description\n *   Allows you to convert a JavaScript object into JSON string.\n *\n *   This filter is mostly useful for debugging. When using the double curly {{value}} notation\n *   the binding is automatically converted to JSON.\n *\n * @param {*} object Any JavaScript object (including arrays and primitive types) to filter.\n * @param {number=} spacing The number of spaces to use per indentation, defaults to 2.\n * @returns {string} JSON string.\n *\n *\n * @example\n   <example>\n     <file name=\"index.html\">\n       <pre id=\"default-spacing\">{{ {'name':'value'} | json }}</pre>\n       <pre id=\"custom-spacing\">{{ {'name':'value'} | json:4 }}</pre>\n     </file>\n     <file name=\"protractor.js\" type=\"protractor\">\n       it('should jsonify filtered objects', function() {\n         expect(element(by.id('default-spacing')).getText()).toMatch(/\\{\\n  \"name\": ?\"value\"\\n}/);\n         expect(element(by.id('custom-spacing')).getText()).toMatch(/\\{\\n    \"name\": ?\"value\"\\n}/);\n       });\n     </file>\n   </example>\n *\n */\nfunction jsonFilter() {\n  return function(object, spacing) {\n    if (isUndefined(spacing)) {\n        spacing = 2;\n    }\n    return toJson(object, spacing);\n  };\n}\n\n\n/**\n * @ngdoc filter\n * @name lowercase\n * @kind function\n * @description\n * Converts string to lowercase.\n * @see angular.lowercase\n */\nvar lowercaseFilter = valueFn(lowercase);\n\n\n/**\n * @ngdoc filter\n * @name uppercase\n * @kind function\n * @description\n * Converts string to uppercase.\n * @see angular.uppercase\n */\nvar uppercaseFilter = valueFn(uppercase);\n\n/**\n * @ngdoc filter\n * @name limitTo\n * @kind function\n *\n * @description\n * Creates a new array or string containing only a specified number of elements. The elements\n * are taken from either the beginning or the end of the source array, string or number, as specified by\n * the value and sign (positive or negative) of `limit`. If a number is used as input, it is\n * converted to a string.\n *\n * @param {Array|string|number} input Source array, string or number to be limited.\n * @param {string|number} limit The length of the returned array or string. If the `limit` number\n *     is positive, `limit` number of items from the beginning of the source array/string are copied.\n *     If the number is negative, `limit` number  of items from the end of the source array/string\n *     are copied. The `limit` will be trimmed if it exceeds `array.length`. If `limit` is undefined,\n *     the input will be returned unchanged.\n * @param {(string|number)=} begin Index at which to begin limitation. As a negative index, `begin`\n *     indicates an offset from the end of `input`. Defaults to `0`.\n * @returns {Array|string} A new sub-array or substring of length `limit` or less if input array\n *     had less than `limit` elements.\n *\n * @example\n   <example module=\"limitToExample\">\n     <file name=\"index.html\">\n       <script>\n         angular.module('limitToExample', [])\n           .controller('ExampleController', ['$scope', function($scope) {\n             $scope.numbers = [1,2,3,4,5,6,7,8,9];\n             $scope.letters = \"abcdefghi\";\n             $scope.longNumber = 2345432342;\n             $scope.numLimit = 3;\n             $scope.letterLimit = 3;\n             $scope.longNumberLimit = 3;\n           }]);\n       </script>\n       <div ng-controller=\"ExampleController\">\n         <label>\n            Limit {{numbers}} to:\n            <input type=\"number\" step=\"1\" ng-model=\"numLimit\">\n         </label>\n         <p>Output numbers: {{ numbers | limitTo:numLimit }}</p>\n         <label>\n            Limit {{letters}} to:\n            <input type=\"number\" step=\"1\" ng-model=\"letterLimit\">\n         </label>\n         <p>Output letters: {{ letters | limitTo:letterLimit }}</p>\n         <label>\n            Limit {{longNumber}} to:\n            <input type=\"number\" step=\"1\" ng-model=\"longNumberLimit\">\n         </label>\n         <p>Output long number: {{ longNumber | limitTo:longNumberLimit }}</p>\n       </div>\n     </file>\n     <file name=\"protractor.js\" type=\"protractor\">\n       var numLimitInput = element(by.model('numLimit'));\n       var letterLimitInput = element(by.model('letterLimit'));\n       var longNumberLimitInput = element(by.model('longNumberLimit'));\n       var limitedNumbers = element(by.binding('numbers | limitTo:numLimit'));\n       var limitedLetters = element(by.binding('letters | limitTo:letterLimit'));\n       var limitedLongNumber = element(by.binding('longNumber | limitTo:longNumberLimit'));\n\n       it('should limit the number array to first three items', function() {\n         expect(numLimitInput.getAttribute('value')).toBe('3');\n         expect(letterLimitInput.getAttribute('value')).toBe('3');\n         expect(longNumberLimitInput.getAttribute('value')).toBe('3');\n         expect(limitedNumbers.getText()).toEqual('Output numbers: [1,2,3]');\n         expect(limitedLetters.getText()).toEqual('Output letters: abc');\n         expect(limitedLongNumber.getText()).toEqual('Output long number: 234');\n       });\n\n       // There is a bug in safari and protractor that doesn't like the minus key\n       // it('should update the output when -3 is entered', function() {\n       //   numLimitInput.clear();\n       //   numLimitInput.sendKeys('-3');\n       //   letterLimitInput.clear();\n       //   letterLimitInput.sendKeys('-3');\n       //   longNumberLimitInput.clear();\n       //   longNumberLimitInput.sendKeys('-3');\n       //   expect(limitedNumbers.getText()).toEqual('Output numbers: [7,8,9]');\n       //   expect(limitedLetters.getText()).toEqual('Output letters: ghi');\n       //   expect(limitedLongNumber.getText()).toEqual('Output long number: 342');\n       // });\n\n       it('should not exceed the maximum size of input array', function() {\n         numLimitInput.clear();\n         numLimitInput.sendKeys('100');\n         letterLimitInput.clear();\n         letterLimitInput.sendKeys('100');\n         longNumberLimitInput.clear();\n         longNumberLimitInput.sendKeys('100');\n         expect(limitedNumbers.getText()).toEqual('Output numbers: [1,2,3,4,5,6,7,8,9]');\n         expect(limitedLetters.getText()).toEqual('Output letters: abcdefghi');\n         expect(limitedLongNumber.getText()).toEqual('Output long number: 2345432342');\n       });\n     </file>\n   </example>\n*/\nfunction limitToFilter() {\n  return function(input, limit, begin) {\n    if (Math.abs(Number(limit)) === Infinity) {\n      limit = Number(limit);\n    } else {\n      limit = toInt(limit);\n    }\n    if (isNaN(limit)) return input;\n\n    if (isNumber(input)) input = input.toString();\n    if (!isArray(input) && !isString(input)) return input;\n\n    begin = (!begin || isNaN(begin)) ? 0 : toInt(begin);\n    begin = (begin < 0) ? Math.max(0, input.length + begin) : begin;\n\n    if (limit >= 0) {\n      return input.slice(begin, begin + limit);\n    } else {\n      if (begin === 0) {\n        return input.slice(limit, input.length);\n      } else {\n        return input.slice(Math.max(0, begin + limit), begin);\n      }\n    }\n  };\n}\n\n/**\n * @ngdoc filter\n * @name orderBy\n * @kind function\n *\n * @description\n * Orders a specified `array` by the `expression` predicate. It is ordered alphabetically\n * for strings and numerically for numbers. Note: if you notice numbers are not being sorted\n * as expected, make sure they are actually being saved as numbers and not strings.\n * Array-like values (e.g. NodeLists, jQuery objects, TypedArrays, Strings, etc) are also supported.\n *\n * @param {Array} array The array (or array-like object) to sort.\n * @param {function(*)|string|Array.<(function(*)|string)>=} expression A predicate to be\n *    used by the comparator to determine the order of elements.\n *\n *    Can be one of:\n *\n *    - `function`: Getter function. The result of this function will be sorted using the\n *      `<`, `===`, `>` operator.\n *    - `string`: An Angular expression. The result of this expression is used to compare elements\n *      (for example `name` to sort by a property called `name` or `name.substr(0, 3)` to sort by\n *      3 first characters of a property called `name`). The result of a constant expression\n *      is interpreted as a property name to be used in comparisons (for example `\"special name\"`\n *      to sort object by the value of their `special name` property). An expression can be\n *      optionally prefixed with `+` or `-` to control ascending or descending sort order\n *      (for example, `+name` or `-name`). If no property is provided, (e.g. `'+'`) then the array\n *      element itself is used to compare where sorting.\n *    - `Array`: An array of function or string predicates. The first predicate in the array\n *      is used for sorting, but when two items are equivalent, the next predicate is used.\n *\n *    If the predicate is missing or empty then it defaults to `'+'`.\n *\n * @param {boolean=} reverse Reverse the order of the array.\n * @returns {Array} Sorted copy of the source array.\n *\n *\n * @example\n * The example below demonstrates a simple ngRepeat, where the data is sorted\n * by age in descending order (predicate is set to `'-age'`).\n * `reverse` is not set, which means it defaults to `false`.\n   <example module=\"orderByExample\">\n     <file name=\"index.html\">\n       <div ng-controller=\"ExampleController\">\n         <table class=\"friend\">\n           <tr>\n             <th>Name</th>\n             <th>Phone Number</th>\n             <th>Age</th>\n           </tr>\n           <tr ng-repeat=\"friend in friends | orderBy:'-age'\">\n             <td>{{friend.name}}</td>\n             <td>{{friend.phone}}</td>\n             <td>{{friend.age}}</td>\n           </tr>\n         </table>\n       </div>\n     </file>\n     <file name=\"script.js\">\n       angular.module('orderByExample', [])\n         .controller('ExampleController', ['$scope', function($scope) {\n           $scope.friends =\n               [{name:'John', phone:'555-1212', age:10},\n                {name:'Mary', phone:'555-9876', age:19},\n                {name:'Mike', phone:'555-4321', age:21},\n                {name:'Adam', phone:'555-5678', age:35},\n                {name:'Julie', phone:'555-8765', age:29}];\n         }]);\n     </file>\n   </example>\n *\n * The predicate and reverse parameters can be controlled dynamically through scope properties,\n * as shown in the next example.\n * @example\n   <example module=\"orderByExample\">\n     <file name=\"index.html\">\n       <div ng-controller=\"ExampleController\">\n         <pre>Sorting predicate = {{predicate}}; reverse = {{reverse}}</pre>\n         <hr/>\n         <button ng-click=\"predicate=''\">Set to unsorted</button>\n         <table class=\"friend\">\n           <tr>\n            <th>\n                <button ng-click=\"order('name')\">Name</button>\n                <span class=\"sortorder\" ng-show=\"predicate === 'name'\" ng-class=\"{reverse:reverse}\"></span>\n            </th>\n            <th>\n                <button ng-click=\"order('phone')\">Phone Number</button>\n                <span class=\"sortorder\" ng-show=\"predicate === 'phone'\" ng-class=\"{reverse:reverse}\"></span>\n            </th>\n            <th>\n                <button ng-click=\"order('age')\">Age</button>\n                <span class=\"sortorder\" ng-show=\"predicate === 'age'\" ng-class=\"{reverse:reverse}\"></span>\n            </th>\n           </tr>\n           <tr ng-repeat=\"friend in friends | orderBy:predicate:reverse\">\n             <td>{{friend.name}}</td>\n             <td>{{friend.phone}}</td>\n             <td>{{friend.age}}</td>\n           </tr>\n         </table>\n       </div>\n     </file>\n     <file name=\"script.js\">\n       angular.module('orderByExample', [])\n         .controller('ExampleController', ['$scope', function($scope) {\n           $scope.friends =\n               [{name:'John', phone:'555-1212', age:10},\n                {name:'Mary', phone:'555-9876', age:19},\n                {name:'Mike', phone:'555-4321', age:21},\n                {name:'Adam', phone:'555-5678', age:35},\n                {name:'Julie', phone:'555-8765', age:29}];\n           $scope.predicate = 'age';\n           $scope.reverse = true;\n           $scope.order = function(predicate) {\n             $scope.reverse = ($scope.predicate === predicate) ? !$scope.reverse : false;\n             $scope.predicate = predicate;\n           };\n         }]);\n      </file>\n     <file name=\"style.css\">\n       .sortorder:after {\n         content: '\\25b2';\n       }\n       .sortorder.reverse:after {\n         content: '\\25bc';\n       }\n     </file>\n   </example>\n *\n * It's also possible to call the orderBy filter manually, by injecting `$filter`, retrieving the\n * filter routine with `$filter('orderBy')`, and calling the returned filter routine with the\n * desired parameters.\n *\n * Example:\n *\n * @example\n  <example module=\"orderByExample\">\n    <file name=\"index.html\">\n    <div ng-controller=\"ExampleController\">\n      <pre>Sorting predicate = {{predicate}}; reverse = {{reverse}}</pre>\n      <table class=\"friend\">\n        <tr>\n          <th>\n              <button ng-click=\"order('name')\">Name</button>\n              <span class=\"sortorder\" ng-show=\"predicate === 'name'\" ng-class=\"{reverse:reverse}\"></span>\n          </th>\n          <th>\n              <button ng-click=\"order('phone')\">Phone Number</button>\n              <span class=\"sortorder\" ng-show=\"predicate === 'phone'\" ng-class=\"{reverse:reverse}\"></span>\n          </th>\n          <th>\n              <button ng-click=\"order('age')\">Age</button>\n              <span class=\"sortorder\" ng-show=\"predicate === 'age'\" ng-class=\"{reverse:reverse}\"></span>\n          </th>\n        </tr>\n        <tr ng-repeat=\"friend in friends\">\n          <td>{{friend.name}}</td>\n          <td>{{friend.phone}}</td>\n          <td>{{friend.age}}</td>\n        </tr>\n      </table>\n    </div>\n    </file>\n\n    <file name=\"script.js\">\n      angular.module('orderByExample', [])\n        .controller('ExampleController', ['$scope', '$filter', function($scope, $filter) {\n          var orderBy = $filter('orderBy');\n          $scope.friends = [\n            { name: 'John',    phone: '555-1212',    age: 10 },\n            { name: 'Mary',    phone: '555-9876',    age: 19 },\n            { name: 'Mike',    phone: '555-4321',    age: 21 },\n            { name: 'Adam',    phone: '555-5678',    age: 35 },\n            { name: 'Julie',   phone: '555-8765',    age: 29 }\n          ];\n          $scope.order = function(predicate) {\n            $scope.predicate = predicate;\n            $scope.reverse = ($scope.predicate === predicate) ? !$scope.reverse : false;\n            $scope.friends = orderBy($scope.friends, predicate, $scope.reverse);\n          };\n          $scope.order('age', true);\n        }]);\n    </file>\n\n    <file name=\"style.css\">\n       .sortorder:after {\n         content: '\\25b2';\n       }\n       .sortorder.reverse:after {\n         content: '\\25bc';\n       }\n    </file>\n</example>\n */\norderByFilter.$inject = ['$parse'];\nfunction orderByFilter($parse) {\n  return function(array, sortPredicate, reverseOrder) {\n\n    if (array == null) return array;\n    if (!isArrayLike(array)) {\n      throw minErr('orderBy')('notarray', 'Expected array but received: {0}', array);\n    }\n\n    if (!isArray(sortPredicate)) { sortPredicate = [sortPredicate]; }\n    if (sortPredicate.length === 0) { sortPredicate = ['+']; }\n\n    var predicates = processPredicates(sortPredicate, reverseOrder);\n    // Add a predicate at the end that evaluates to the element index. This makes the\n    // sort stable as it works as a tie-breaker when all the input predicates cannot\n    // distinguish between two elements.\n    predicates.push({ get: function() { return {}; }, descending: reverseOrder ? -1 : 1});\n\n    // The next three lines are a version of a Swartzian Transform idiom from Perl\n    // (sometimes called the Decorate-Sort-Undecorate idiom)\n    // See https://en.wikipedia.org/wiki/Schwartzian_transform\n    var compareValues = Array.prototype.map.call(array, getComparisonObject);\n    compareValues.sort(doComparison);\n    array = compareValues.map(function(item) { return item.value; });\n\n    return array;\n\n    function getComparisonObject(value, index) {\n      return {\n        value: value,\n        predicateValues: predicates.map(function(predicate) {\n          return getPredicateValue(predicate.get(value), index);\n        })\n      };\n    }\n\n    function doComparison(v1, v2) {\n      var result = 0;\n      for (var index=0, length = predicates.length; index < length; ++index) {\n        result = compare(v1.predicateValues[index], v2.predicateValues[index]) * predicates[index].descending;\n        if (result) break;\n      }\n      return result;\n    }\n  };\n\n  function processPredicates(sortPredicate, reverseOrder) {\n    reverseOrder = reverseOrder ? -1 : 1;\n    return sortPredicate.map(function(predicate) {\n      var descending = 1, get = identity;\n\n      if (isFunction(predicate)) {\n        get = predicate;\n      } else if (isString(predicate)) {\n        if ((predicate.charAt(0) == '+' || predicate.charAt(0) == '-')) {\n          descending = predicate.charAt(0) == '-' ? -1 : 1;\n          predicate = predicate.substring(1);\n        }\n        if (predicate !== '') {\n          get = $parse(predicate);\n          if (get.constant) {\n            var key = get();\n            get = function(value) { return value[key]; };\n          }\n        }\n      }\n      return { get: get, descending: descending * reverseOrder };\n    });\n  }\n\n  function isPrimitive(value) {\n    switch (typeof value) {\n      case 'number': /* falls through */\n      case 'boolean': /* falls through */\n      case 'string':\n        return true;\n      default:\n        return false;\n    }\n  }\n\n  function objectValue(value, index) {\n    // If `valueOf` is a valid function use that\n    if (typeof value.valueOf === 'function') {\n      value = value.valueOf();\n      if (isPrimitive(value)) return value;\n    }\n    // If `toString` is a valid function and not the one from `Object.prototype` use that\n    if (hasCustomToString(value)) {\n      value = value.toString();\n      if (isPrimitive(value)) return value;\n    }\n    // We have a basic object so we use the position of the object in the collection\n    return index;\n  }\n\n  function getPredicateValue(value, index) {\n    var type = typeof value;\n    if (value === null) {\n      type = 'string';\n      value = 'null';\n    } else if (type === 'string') {\n      value = value.toLowerCase();\n    } else if (type === 'object') {\n      value = objectValue(value, index);\n    }\n    return { value: value, type: type };\n  }\n\n  function compare(v1, v2) {\n    var result = 0;\n    if (v1.type === v2.type) {\n      if (v1.value !== v2.value) {\n        result = v1.value < v2.value ? -1 : 1;\n      }\n    } else {\n      result = v1.type < v2.type ? -1 : 1;\n    }\n    return result;\n  }\n}\n\nfunction ngDirective(directive) {\n  if (isFunction(directive)) {\n    directive = {\n      link: directive\n    };\n  }\n  directive.restrict = directive.restrict || 'AC';\n  return valueFn(directive);\n}\n\n/**\n * @ngdoc directive\n * @name a\n * @restrict E\n *\n * @description\n * Modifies the default behavior of the html A tag so that the default action is prevented when\n * the href attribute is empty.\n *\n * This change permits the easy creation of action links with the `ngClick` directive\n * without changing the location or causing page reloads, e.g.:\n * `<a href=\"\" ng-click=\"list.addItem()\">Add Item</a>`\n */\nvar htmlAnchorDirective = valueFn({\n  restrict: 'E',\n  compile: function(element, attr) {\n    if (!attr.href && !attr.xlinkHref) {\n      return function(scope, element) {\n        // If the linked element is not an anchor tag anymore, do nothing\n        if (element[0].nodeName.toLowerCase() !== 'a') return;\n\n        // SVGAElement does not use the href attribute, but rather the 'xlinkHref' attribute.\n        var href = toString.call(element.prop('href')) === '[object SVGAnimatedString]' ?\n                   'xlink:href' : 'href';\n        element.on('click', function(event) {\n          // if we have no href url, then don't navigate anywhere.\n          if (!element.attr(href)) {\n            event.preventDefault();\n          }\n        });\n      };\n    }\n  }\n});\n\n/**\n * @ngdoc directive\n * @name ngHref\n * @restrict A\n * @priority 99\n *\n * @description\n * Using Angular markup like `{{hash}}` in an href attribute will\n * make the link go to the wrong URL if the user clicks it before\n * Angular has a chance to replace the `{{hash}}` markup with its\n * value. Until Angular replaces the markup the link will be broken\n * and will most likely return a 404 error. The `ngHref` directive\n * solves this problem.\n *\n * The wrong way to write it:\n * ```html\n * <a href=\"http://www.gravatar.com/avatar/{{hash}}\">link1</a>\n * ```\n *\n * The correct way to write it:\n * ```html\n * <a ng-href=\"http://www.gravatar.com/avatar/{{hash}}\">link1</a>\n * ```\n *\n * @element A\n * @param {template} ngHref any string which can contain `{{}}` markup.\n *\n * @example\n * This example shows various combinations of `href`, `ng-href` and `ng-click` attributes\n * in links and their different behaviors:\n    <example>\n      <file name=\"index.html\">\n        <input ng-model=\"value\" /><br />\n        <a id=\"link-1\" href ng-click=\"value = 1\">link 1</a> (link, don't reload)<br />\n        <a id=\"link-2\" href=\"\" ng-click=\"value = 2\">link 2</a> (link, don't reload)<br />\n        <a id=\"link-3\" ng-href=\"/{{'123'}}\">link 3</a> (link, reload!)<br />\n        <a id=\"link-4\" href=\"\" name=\"xx\" ng-click=\"value = 4\">anchor</a> (link, don't reload)<br />\n        <a id=\"link-5\" name=\"xxx\" ng-click=\"value = 5\">anchor</a> (no link)<br />\n        <a id=\"link-6\" ng-href=\"{{value}}\">link</a> (link, change location)\n      </file>\n      <file name=\"protractor.js\" type=\"protractor\">\n        it('should execute ng-click but not reload when href without value', function() {\n          element(by.id('link-1')).click();\n          expect(element(by.model('value')).getAttribute('value')).toEqual('1');\n          expect(element(by.id('link-1')).getAttribute('href')).toBe('');\n        });\n\n        it('should execute ng-click but not reload when href empty string', function() {\n          element(by.id('link-2')).click();\n          expect(element(by.model('value')).getAttribute('value')).toEqual('2');\n          expect(element(by.id('link-2')).getAttribute('href')).toBe('');\n        });\n\n        it('should execute ng-click and change url when ng-href specified', function() {\n          expect(element(by.id('link-3')).getAttribute('href')).toMatch(/\\/123$/);\n\n          element(by.id('link-3')).click();\n\n          // At this point, we navigate away from an Angular page, so we need\n          // to use browser.driver to get the base webdriver.\n\n          browser.wait(function() {\n            return browser.driver.getCurrentUrl().then(function(url) {\n              return url.match(/\\/123$/);\n            });\n          }, 5000, 'page should navigate to /123');\n        });\n\n        it('should execute ng-click but not reload when href empty string and name specified', function() {\n          element(by.id('link-4')).click();\n          expect(element(by.model('value')).getAttribute('value')).toEqual('4');\n          expect(element(by.id('link-4')).getAttribute('href')).toBe('');\n        });\n\n        it('should execute ng-click but not reload when no href but name specified', function() {\n          element(by.id('link-5')).click();\n          expect(element(by.model('value')).getAttribute('value')).toEqual('5');\n          expect(element(by.id('link-5')).getAttribute('href')).toBe(null);\n        });\n\n        it('should only change url when only ng-href', function() {\n          element(by.model('value')).clear();\n          element(by.model('value')).sendKeys('6');\n          expect(element(by.id('link-6')).getAttribute('href')).toMatch(/\\/6$/);\n\n          element(by.id('link-6')).click();\n\n          // At this point, we navigate away from an Angular page, so we need\n          // to use browser.driver to get the base webdriver.\n          browser.wait(function() {\n            return browser.driver.getCurrentUrl().then(function(url) {\n              return url.match(/\\/6$/);\n            });\n          }, 5000, 'page should navigate to /6');\n        });\n      </file>\n    </example>\n */\n\n/**\n * @ngdoc directive\n * @name ngSrc\n * @restrict A\n * @priority 99\n *\n * @description\n * Using Angular markup like `{{hash}}` in a `src` attribute doesn't\n * work right: The browser will fetch from the URL with the literal\n * text `{{hash}}` until Angular replaces the expression inside\n * `{{hash}}`. The `ngSrc` directive solves this problem.\n *\n * The buggy way to write it:\n * ```html\n * <img src=\"http://www.gravatar.com/avatar/{{hash}}\" alt=\"Description\"/>\n * ```\n *\n * The correct way to write it:\n * ```html\n * <img ng-src=\"http://www.gravatar.com/avatar/{{hash}}\" alt=\"Description\" />\n * ```\n *\n * @element IMG\n * @param {template} ngSrc any string which can contain `{{}}` markup.\n */\n\n/**\n * @ngdoc directive\n * @name ngSrcset\n * @restrict A\n * @priority 99\n *\n * @description\n * Using Angular markup like `{{hash}}` in a `srcset` attribute doesn't\n * work right: The browser will fetch from the URL with the literal\n * text `{{hash}}` until Angular replaces the expression inside\n * `{{hash}}`. The `ngSrcset` directive solves this problem.\n *\n * The buggy way to write it:\n * ```html\n * <img srcset=\"http://www.gravatar.com/avatar/{{hash}} 2x\" alt=\"Description\"/>\n * ```\n *\n * The correct way to write it:\n * ```html\n * <img ng-srcset=\"http://www.gravatar.com/avatar/{{hash}} 2x\" alt=\"Description\" />\n * ```\n *\n * @element IMG\n * @param {template} ngSrcset any string which can contain `{{}}` markup.\n */\n\n/**\n * @ngdoc directive\n * @name ngDisabled\n * @restrict A\n * @priority 100\n *\n * @description\n *\n * This directive sets the `disabled` attribute on the element if the\n * {@link guide/expression expression} inside `ngDisabled` evaluates to truthy.\n *\n * A special directive is necessary because we cannot use interpolation inside the `disabled`\n * attribute. See the {@link guide/interpolation interpolation guide} for more info.\n *\n * @example\n    <example>\n      <file name=\"index.html\">\n        <label>Click me to toggle: <input type=\"checkbox\" ng-model=\"checked\"></label><br/>\n        <button ng-model=\"button\" ng-disabled=\"checked\">Button</button>\n      </file>\n      <file name=\"protractor.js\" type=\"protractor\">\n        it('should toggle button', function() {\n          expect(element(by.css('button')).getAttribute('disabled')).toBeFalsy();\n          element(by.model('checked')).click();\n          expect(element(by.css('button')).getAttribute('disabled')).toBeTruthy();\n        });\n      </file>\n    </example>\n *\n * @element INPUT\n * @param {expression} ngDisabled If the {@link guide/expression expression} is truthy,\n *     then the `disabled` attribute will be set on the element\n */\n\n\n/**\n * @ngdoc directive\n * @name ngChecked\n * @restrict A\n * @priority 100\n *\n * @description\n * Sets the `checked` attribute on the element, if the expression inside `ngChecked` is truthy.\n *\n * Note that this directive should not be used together with {@link ngModel `ngModel`},\n * as this can lead to unexpected behavior.\n *\n * A special directive is necessary because we cannot use interpolation inside the `checked`\n * attribute. See the {@link guide/interpolation interpolation guide} for more info.\n *\n * @example\n    <example>\n      <file name=\"index.html\">\n        <label>Check me to check both: <input type=\"checkbox\" ng-model=\"master\"></label><br/>\n        <input id=\"checkSlave\" type=\"checkbox\" ng-checked=\"master\" aria-label=\"Slave input\">\n      </file>\n      <file name=\"protractor.js\" type=\"protractor\">\n        it('should check both checkBoxes', function() {\n          expect(element(by.id('checkSlave')).getAttribute('checked')).toBeFalsy();\n          element(by.model('master')).click();\n          expect(element(by.id('checkSlave')).getAttribute('checked')).toBeTruthy();\n        });\n      </file>\n    </example>\n *\n * @element INPUT\n * @param {expression} ngChecked If the {@link guide/expression expression} is truthy,\n *     then the `checked` attribute will be set on the element\n */\n\n\n/**\n * @ngdoc directive\n * @name ngReadonly\n * @restrict A\n * @priority 100\n *\n * @description\n *\n * Sets the `readOnly` attribute on the element, if the expression inside `ngReadonly` is truthy.\n *\n * A special directive is necessary because we cannot use interpolation inside the `readOnly`\n * attribute. See the {@link guide/interpolation interpolation guide} for more info.\n *\n * @example\n    <example>\n      <file name=\"index.html\">\n        <label>Check me to make text readonly: <input type=\"checkbox\" ng-model=\"checked\"></label><br/>\n        <input type=\"text\" ng-readonly=\"checked\" value=\"I'm Angular\" aria-label=\"Readonly field\" />\n      </file>\n      <file name=\"protractor.js\" type=\"protractor\">\n        it('should toggle readonly attr', function() {\n          expect(element(by.css('[type=\"text\"]')).getAttribute('readonly')).toBeFalsy();\n          element(by.model('checked')).click();\n          expect(element(by.css('[type=\"text\"]')).getAttribute('readonly')).toBeTruthy();\n        });\n      </file>\n    </example>\n *\n * @element INPUT\n * @param {expression} ngReadonly If the {@link guide/expression expression} is truthy,\n *     then special attribute \"readonly\" will be set on the element\n */\n\n\n/**\n * @ngdoc directive\n * @name ngSelected\n * @restrict A\n * @priority 100\n *\n * @description\n *\n * Sets the `selected` attribute on the element, if the expression inside `ngSelected` is truthy.\n *\n * A special directive is necessary because we cannot use interpolation inside the `selected`\n * attribute. See the {@link guide/interpolation interpolation guide} for more info.\n *\n * @example\n    <example>\n      <file name=\"index.html\">\n        <label>Check me to select: <input type=\"checkbox\" ng-model=\"selected\"></label><br/>\n        <select aria-label=\"ngSelected demo\">\n          <option>Hello!</option>\n          <option id=\"greet\" ng-selected=\"selected\">Greetings!</option>\n        </select>\n      </file>\n      <file name=\"protractor.js\" type=\"protractor\">\n        it('should select Greetings!', function() {\n          expect(element(by.id('greet')).getAttribute('selected')).toBeFalsy();\n          element(by.model('selected')).click();\n          expect(element(by.id('greet')).getAttribute('selected')).toBeTruthy();\n        });\n      </file>\n    </example>\n *\n * @element OPTION\n * @param {expression} ngSelected If the {@link guide/expression expression} is truthy,\n *     then special attribute \"selected\" will be set on the element\n */\n\n/**\n * @ngdoc directive\n * @name ngOpen\n * @restrict A\n * @priority 100\n *\n * @description\n *\n * Sets the `open` attribute on the element, if the expression inside `ngOpen` is truthy.\n *\n * A special directive is necessary because we cannot use interpolation inside the `open`\n * attribute. See the {@link guide/interpolation interpolation guide} for more info.\n *\n * @example\n     <example>\n       <file name=\"index.html\">\n         <label>Check me check multiple: <input type=\"checkbox\" ng-model=\"open\"></label><br/>\n         <details id=\"details\" ng-open=\"open\">\n            <summary>Show/Hide me</summary>\n         </details>\n       </file>\n       <file name=\"protractor.js\" type=\"protractor\">\n         it('should toggle open', function() {\n           expect(element(by.id('details')).getAttribute('open')).toBeFalsy();\n           element(by.model('open')).click();\n           expect(element(by.id('details')).getAttribute('open')).toBeTruthy();\n         });\n       </file>\n     </example>\n *\n * @element DETAILS\n * @param {expression} ngOpen If the {@link guide/expression expression} is truthy,\n *     then special attribute \"open\" will be set on the element\n */\n\nvar ngAttributeAliasDirectives = {};\n\n// boolean attrs are evaluated\nforEach(BOOLEAN_ATTR, function(propName, attrName) {\n  // binding to multiple is not supported\n  if (propName == \"multiple\") return;\n\n  function defaultLinkFn(scope, element, attr) {\n    scope.$watch(attr[normalized], function ngBooleanAttrWatchAction(value) {\n      attr.$set(attrName, !!value);\n    });\n  }\n\n  var normalized = directiveNormalize('ng-' + attrName);\n  var linkFn = defaultLinkFn;\n\n  if (propName === 'checked') {\n    linkFn = function(scope, element, attr) {\n      // ensuring ngChecked doesn't interfere with ngModel when both are set on the same input\n      if (attr.ngModel !== attr[normalized]) {\n        defaultLinkFn(scope, element, attr);\n      }\n    };\n  }\n\n  ngAttributeAliasDirectives[normalized] = function() {\n    return {\n      restrict: 'A',\n      priority: 100,\n      link: linkFn\n    };\n  };\n});\n\n// aliased input attrs are evaluated\nforEach(ALIASED_ATTR, function(htmlAttr, ngAttr) {\n  ngAttributeAliasDirectives[ngAttr] = function() {\n    return {\n      priority: 100,\n      link: function(scope, element, attr) {\n        //special case ngPattern when a literal regular expression value\n        //is used as the expression (this way we don't have to watch anything).\n        if (ngAttr === \"ngPattern\" && attr.ngPattern.charAt(0) == \"/\") {\n          var match = attr.ngPattern.match(REGEX_STRING_REGEXP);\n          if (match) {\n            attr.$set(\"ngPattern\", new RegExp(match[1], match[2]));\n            return;\n          }\n        }\n\n        scope.$watch(attr[ngAttr], function ngAttrAliasWatchAction(value) {\n          attr.$set(ngAttr, value);\n        });\n      }\n    };\n  };\n});\n\n// ng-src, ng-srcset, ng-href are interpolated\nforEach(['src', 'srcset', 'href'], function(attrName) {\n  var normalized = directiveNormalize('ng-' + attrName);\n  ngAttributeAliasDirectives[normalized] = function() {\n    return {\n      priority: 99, // it needs to run after the attributes are interpolated\n      link: function(scope, element, attr) {\n        var propName = attrName,\n            name = attrName;\n\n        if (attrName === 'href' &&\n            toString.call(element.prop('href')) === '[object SVGAnimatedString]') {\n          name = 'xlinkHref';\n          attr.$attr[name] = 'xlink:href';\n          propName = null;\n        }\n\n        attr.$observe(normalized, function(value) {\n          if (!value) {\n            if (attrName === 'href') {\n              attr.$set(name, null);\n            }\n            return;\n          }\n\n          attr.$set(name, value);\n\n          // on IE, if \"ng:src\" directive declaration is used and \"src\" attribute doesn't exist\n          // then calling element.setAttribute('src', 'foo') doesn't do anything, so we need\n          // to set the property as well to achieve the desired effect.\n          // we use attr[attrName] value since $set can sanitize the url.\n          if (msie && propName) element.prop(propName, attr[name]);\n        });\n      }\n    };\n  };\n});\n\n/* global -nullFormCtrl, -SUBMITTED_CLASS, addSetValidityMethod: true\n */\nvar nullFormCtrl = {\n  $addControl: noop,\n  $$renameControl: nullFormRenameControl,\n  $removeControl: noop,\n  $setValidity: noop,\n  $setDirty: noop,\n  $setPristine: noop,\n  $setSubmitted: noop\n},\nSUBMITTED_CLASS = 'ng-submitted';\n\nfunction nullFormRenameControl(control, name) {\n  control.$name = name;\n}\n\n/**\n * @ngdoc type\n * @name form.FormController\n *\n * @property {boolean} $pristine True if user has not interacted with the form yet.\n * @property {boolean} $dirty True if user has already interacted with the form.\n * @property {boolean} $valid True if all of the containing forms and controls are valid.\n * @property {boolean} $invalid True if at least one containing control or form is invalid.\n * @property {boolean} $pending True if at least one containing control or form is pending.\n * @property {boolean} $submitted True if user has submitted the form even if its invalid.\n *\n * @property {Object} $error Is an object hash, containing references to controls or\n *  forms with failing validators, where:\n *\n *  - keys are validation tokens (error names),\n *  - values are arrays of controls or forms that have a failing validator for given error name.\n *\n *  Built-in validation tokens:\n *\n *  - `email`\n *  - `max`\n *  - `maxlength`\n *  - `min`\n *  - `minlength`\n *  - `number`\n *  - `pattern`\n *  - `required`\n *  - `url`\n *  - `date`\n *  - `datetimelocal`\n *  - `time`\n *  - `week`\n *  - `month`\n *\n * @description\n * `FormController` keeps track of all its controls and nested forms as well as the state of them,\n * such as being valid/invalid or dirty/pristine.\n *\n * Each {@link ng.directive:form form} directive creates an instance\n * of `FormController`.\n *\n */\n//asks for $scope to fool the BC controller module\nFormController.$inject = ['$element', '$attrs', '$scope', '$animate', '$interpolate'];\nfunction FormController(element, attrs, $scope, $animate, $interpolate) {\n  var form = this,\n      controls = [];\n\n  // init state\n  form.$error = {};\n  form.$$success = {};\n  form.$pending = undefined;\n  form.$name = $interpolate(attrs.name || attrs.ngForm || '')($scope);\n  form.$dirty = false;\n  form.$pristine = true;\n  form.$valid = true;\n  form.$invalid = false;\n  form.$submitted = false;\n  form.$$parentForm = nullFormCtrl;\n\n  /**\n   * @ngdoc method\n   * @name form.FormController#$rollbackViewValue\n   *\n   * @description\n   * Rollback all form controls pending updates to the `$modelValue`.\n   *\n   * Updates may be pending by a debounced event or because the input is waiting for a some future\n   * event defined in `ng-model-options`. This method is typically needed by the reset button of\n   * a form that uses `ng-model-options` to pend updates.\n   */\n  form.$rollbackViewValue = function() {\n    forEach(controls, function(control) {\n      control.$rollbackViewValue();\n    });\n  };\n\n  /**\n   * @ngdoc method\n   * @name form.FormController#$commitViewValue\n   *\n   * @description\n   * Commit all form controls pending updates to the `$modelValue`.\n   *\n   * Updates may be pending by a debounced event or because the input is waiting for a some future\n   * event defined in `ng-model-options`. This method is rarely needed as `NgModelController`\n   * usually handles calling this in response to input events.\n   */\n  form.$commitViewValue = function() {\n    forEach(controls, function(control) {\n      control.$commitViewValue();\n    });\n  };\n\n  /**\n   * @ngdoc method\n   * @name form.FormController#$addControl\n   * @param {object} control control object, either a {@link form.FormController} or an\n   * {@link ngModel.NgModelController}\n   *\n   * @description\n   * Register a control with the form. Input elements using ngModelController do this automatically\n   * when they are linked.\n   *\n   * Note that the current state of the control will not be reflected on the new parent form. This\n   * is not an issue with normal use, as freshly compiled and linked controls are in a `$pristine`\n   * state.\n   *\n   * However, if the method is used programmatically, for example by adding dynamically created controls,\n   * or controls that have been previously removed without destroying their corresponding DOM element,\n   * it's the developers responsibility to make sure the current state propagates to the parent form.\n   *\n   * For example, if an input control is added that is already `$dirty` and has `$error` properties,\n   * calling `$setDirty()` and `$validate()` afterwards will propagate the state to the parent form.\n   */\n  form.$addControl = function(control) {\n    // Breaking change - before, inputs whose name was \"hasOwnProperty\" were quietly ignored\n    // and not added to the scope.  Now we throw an error.\n    assertNotHasOwnProperty(control.$name, 'input');\n    controls.push(control);\n\n    if (control.$name) {\n      form[control.$name] = control;\n    }\n\n    control.$$parentForm = form;\n  };\n\n  // Private API: rename a form control\n  form.$$renameControl = function(control, newName) {\n    var oldName = control.$name;\n\n    if (form[oldName] === control) {\n      delete form[oldName];\n    }\n    form[newName] = control;\n    control.$name = newName;\n  };\n\n  /**\n   * @ngdoc method\n   * @name form.FormController#$removeControl\n   * @param {object} control control object, either a {@link form.FormController} or an\n   * {@link ngModel.NgModelController}\n   *\n   * @description\n   * Deregister a control from the form.\n   *\n   * Input elements using ngModelController do this automatically when they are destroyed.\n   *\n   * Note that only the removed control's validation state (`$errors`etc.) will be removed from the\n   * form. `$dirty`, `$submitted` states will not be changed, because the expected behavior can be\n   * different from case to case. For example, removing the only `$dirty` control from a form may or\n   * may not mean that the form is still `$dirty`.\n   */\n  form.$removeControl = function(control) {\n    if (control.$name && form[control.$name] === control) {\n      delete form[control.$name];\n    }\n    forEach(form.$pending, function(value, name) {\n      form.$setValidity(name, null, control);\n    });\n    forEach(form.$error, function(value, name) {\n      form.$setValidity(name, null, control);\n    });\n    forEach(form.$$success, function(value, name) {\n      form.$setValidity(name, null, control);\n    });\n\n    arrayRemove(controls, control);\n    control.$$parentForm = nullFormCtrl;\n  };\n\n\n  /**\n   * @ngdoc method\n   * @name form.FormController#$setValidity\n   *\n   * @description\n   * Sets the validity of a form control.\n   *\n   * This method will also propagate to parent forms.\n   */\n  addSetValidityMethod({\n    ctrl: this,\n    $element: element,\n    set: function(object, property, controller) {\n      var list = object[property];\n      if (!list) {\n        object[property] = [controller];\n      } else {\n        var index = list.indexOf(controller);\n        if (index === -1) {\n          list.push(controller);\n        }\n      }\n    },\n    unset: function(object, property, controller) {\n      var list = object[property];\n      if (!list) {\n        return;\n      }\n      arrayRemove(list, controller);\n      if (list.length === 0) {\n        delete object[property];\n      }\n    },\n    $animate: $animate\n  });\n\n  /**\n   * @ngdoc method\n   * @name form.FormController#$setDirty\n   *\n   * @description\n   * Sets the form to a dirty state.\n   *\n   * This method can be called to add the 'ng-dirty' class and set the form to a dirty\n   * state (ng-dirty class). This method will also propagate to parent forms.\n   */\n  form.$setDirty = function() {\n    $animate.removeClass(element, PRISTINE_CLASS);\n    $animate.addClass(element, DIRTY_CLASS);\n    form.$dirty = true;\n    form.$pristine = false;\n    form.$$parentForm.$setDirty();\n  };\n\n  /**\n   * @ngdoc method\n   * @name form.FormController#$setPristine\n   *\n   * @description\n   * Sets the form to its pristine state.\n   *\n   * This method can be called to remove the 'ng-dirty' class and set the form to its pristine\n   * state (ng-pristine class). This method will also propagate to all the controls contained\n   * in this form.\n   *\n   * Setting a form back to a pristine state is often useful when we want to 'reuse' a form after\n   * saving or resetting it.\n   */\n  form.$setPristine = function() {\n    $animate.setClass(element, PRISTINE_CLASS, DIRTY_CLASS + ' ' + SUBMITTED_CLASS);\n    form.$dirty = false;\n    form.$pristine = true;\n    form.$submitted = false;\n    forEach(controls, function(control) {\n      control.$setPristine();\n    });\n  };\n\n  /**\n   * @ngdoc method\n   * @name form.FormController#$setUntouched\n   *\n   * @description\n   * Sets the form to its untouched state.\n   *\n   * This method can be called to remove the 'ng-touched' class and set the form controls to their\n   * untouched state (ng-untouched class).\n   *\n   * Setting a form controls back to their untouched state is often useful when setting the form\n   * back to its pristine state.\n   */\n  form.$setUntouched = function() {\n    forEach(controls, function(control) {\n      control.$setUntouched();\n    });\n  };\n\n  /**\n   * @ngdoc method\n   * @name form.FormController#$setSubmitted\n   *\n   * @description\n   * Sets the form to its submitted state.\n   */\n  form.$setSubmitted = function() {\n    $animate.addClass(element, SUBMITTED_CLASS);\n    form.$submitted = true;\n    form.$$parentForm.$setSubmitted();\n  };\n}\n\n/**\n * @ngdoc directive\n * @name ngForm\n * @restrict EAC\n *\n * @description\n * Nestable alias of {@link ng.directive:form `form`} directive. HTML\n * does not allow nesting of form elements. It is useful to nest forms, for example if the validity of a\n * sub-group of controls needs to be determined.\n *\n * Note: the purpose of `ngForm` is to group controls,\n * but not to be a replacement for the `<form>` tag with all of its capabilities\n * (e.g. posting to the server, ...).\n *\n * @param {string=} ngForm|name Name of the form. If specified, the form controller will be published into\n *                       related scope, under this name.\n *\n */\n\n /**\n * @ngdoc directive\n * @name form\n * @restrict E\n *\n * @description\n * Directive that instantiates\n * {@link form.FormController FormController}.\n *\n * If the `name` attribute is specified, the form controller is published onto the current scope under\n * this name.\n *\n * # Alias: {@link ng.directive:ngForm `ngForm`}\n *\n * In Angular, forms can be nested. This means that the outer form is valid when all of the child\n * forms are valid as well. However, browsers do not allow nesting of `<form>` elements, so\n * Angular provides the {@link ng.directive:ngForm `ngForm`} directive, which behaves identically to\n * `form` but can be nested. Nested forms can be useful, for example, if the validity of a sub-group\n * of controls needs to be determined.\n *\n * # CSS classes\n *  - `ng-valid` is set if the form is valid.\n *  - `ng-invalid` is set if the form is invalid.\n *  - `ng-pending` is set if the form is pending.\n *  - `ng-pristine` is set if the form is pristine.\n *  - `ng-dirty` is set if the form is dirty.\n *  - `ng-submitted` is set if the form was submitted.\n *\n * Keep in mind that ngAnimate can detect each of these classes when added and removed.\n *\n *\n * # Submitting a form and preventing the default action\n *\n * Since the role of forms in client-side Angular applications is different than in classical\n * roundtrip apps, it is desirable for the browser not to translate the form submission into a full\n * page reload that sends the data to the server. Instead some javascript logic should be triggered\n * to handle the form submission in an application-specific way.\n *\n * For this reason, Angular prevents the default action (form submission to the server) unless the\n * `<form>` element has an `action` attribute specified.\n *\n * You can use one of the following two ways to specify what javascript method should be called when\n * a form is submitted:\n *\n * - {@link ng.directive:ngSubmit ngSubmit} directive on the form element\n * - {@link ng.directive:ngClick ngClick} directive on the first\n  *  button or input field of type submit (input[type=submit])\n *\n * To prevent double execution of the handler, use only one of the {@link ng.directive:ngSubmit ngSubmit}\n * or {@link ng.directive:ngClick ngClick} directives.\n * This is because of the following form submission rules in the HTML specification:\n *\n * - If a form has only one input field then hitting enter in this field triggers form submit\n * (`ngSubmit`)\n * - if a form has 2+ input fields and no buttons or input[type=submit] then hitting enter\n * doesn't trigger submit\n * - if a form has one or more input fields and one or more buttons or input[type=submit] then\n * hitting enter in any of the input fields will trigger the click handler on the *first* button or\n * input[type=submit] (`ngClick`) *and* a submit handler on the enclosing form (`ngSubmit`)\n *\n * Any pending `ngModelOptions` changes will take place immediately when an enclosing form is\n * submitted. Note that `ngClick` events will occur before the model is updated. Use `ngSubmit`\n * to have access to the updated model.\n *\n * ## Animation Hooks\n *\n * Animations in ngForm are triggered when any of the associated CSS classes are added and removed.\n * These classes are: `.ng-pristine`, `.ng-dirty`, `.ng-invalid` and `.ng-valid` as well as any\n * other validations that are performed within the form. Animations in ngForm are similar to how\n * they work in ngClass and animations can be hooked into using CSS transitions, keyframes as well\n * as JS animations.\n *\n * The following example shows a simple way to utilize CSS transitions to style a form element\n * that has been rendered as invalid after it has been validated:\n *\n * <pre>\n * //be sure to include ngAnimate as a module to hook into more\n * //advanced animations\n * .my-form {\n *   transition:0.5s linear all;\n *   background: white;\n * }\n * .my-form.ng-invalid {\n *   background: red;\n *   color:white;\n * }\n * </pre>\n *\n * @example\n    <example deps=\"angular-animate.js\" animations=\"true\" fixBase=\"true\" module=\"formExample\">\n      <file name=\"index.html\">\n       <script>\n         angular.module('formExample', [])\n           .controller('FormController', ['$scope', function($scope) {\n             $scope.userType = 'guest';\n           }]);\n       </script>\n       <style>\n        .my-form {\n          transition:all linear 0.5s;\n          background: transparent;\n        }\n        .my-form.ng-invalid {\n          background: red;\n        }\n       </style>\n       <form name=\"myForm\" ng-controller=\"FormController\" class=\"my-form\">\n         userType: <input name=\"input\" ng-model=\"userType\" required>\n         <span class=\"error\" ng-show=\"myForm.input.$error.required\">Required!</span><br>\n         <code>userType = {{userType}}</code><br>\n         <code>myForm.input.$valid = {{myForm.input.$valid}}</code><br>\n         <code>myForm.input.$error = {{myForm.input.$error}}</code><br>\n         <code>myForm.$valid = {{myForm.$valid}}</code><br>\n         <code>myForm.$error.required = {{!!myForm.$error.required}}</code><br>\n        </form>\n      </file>\n      <file name=\"protractor.js\" type=\"protractor\">\n        it('should initialize to model', function() {\n          var userType = element(by.binding('userType'));\n          var valid = element(by.binding('myForm.input.$valid'));\n\n          expect(userType.getText()).toContain('guest');\n          expect(valid.getText()).toContain('true');\n        });\n\n        it('should be invalid if empty', function() {\n          var userType = element(by.binding('userType'));\n          var valid = element(by.binding('myForm.input.$valid'));\n          var userInput = element(by.model('userType'));\n\n          userInput.clear();\n          userInput.sendKeys('');\n\n          expect(userType.getText()).toEqual('userType =');\n          expect(valid.getText()).toContain('false');\n        });\n      </file>\n    </example>\n *\n * @param {string=} name Name of the form. If specified, the form controller will be published into\n *                       related scope, under this name.\n */\nvar formDirectiveFactory = function(isNgForm) {\n  return ['$timeout', '$parse', function($timeout, $parse) {\n    var formDirective = {\n      name: 'form',\n      restrict: isNgForm ? 'EAC' : 'E',\n      require: ['form', '^^?form'], //first is the form's own ctrl, second is an optional parent form\n      controller: FormController,\n      compile: function ngFormCompile(formElement, attr) {\n        // Setup initial state of the control\n        formElement.addClass(PRISTINE_CLASS).addClass(VALID_CLASS);\n\n        var nameAttr = attr.name ? 'name' : (isNgForm && attr.ngForm ? 'ngForm' : false);\n\n        return {\n          pre: function ngFormPreLink(scope, formElement, attr, ctrls) {\n            var controller = ctrls[0];\n\n            // if `action` attr is not present on the form, prevent the default action (submission)\n            if (!('action' in attr)) {\n              // we can't use jq events because if a form is destroyed during submission the default\n              // action is not prevented. see #1238\n              //\n              // IE 9 is not affected because it doesn't fire a submit event and try to do a full\n              // page reload if the form was destroyed by submission of the form via a click handler\n              // on a button in the form. Looks like an IE9 specific bug.\n              var handleFormSubmission = function(event) {\n                scope.$apply(function() {\n                  controller.$commitViewValue();\n                  controller.$setSubmitted();\n                });\n\n                event.preventDefault();\n              };\n\n              addEventListenerFn(formElement[0], 'submit', handleFormSubmission);\n\n              // unregister the preventDefault listener so that we don't not leak memory but in a\n              // way that will achieve the prevention of the default action.\n              formElement.on('$destroy', function() {\n                $timeout(function() {\n                  removeEventListenerFn(formElement[0], 'submit', handleFormSubmission);\n                }, 0, false);\n              });\n            }\n\n            var parentFormCtrl = ctrls[1] || controller.$$parentForm;\n            parentFormCtrl.$addControl(controller);\n\n            var setter = nameAttr ? getSetter(controller.$name) : noop;\n\n            if (nameAttr) {\n              setter(scope, controller);\n              attr.$observe(nameAttr, function(newValue) {\n                if (controller.$name === newValue) return;\n                setter(scope, undefined);\n                controller.$$parentForm.$$renameControl(controller, newValue);\n                setter = getSetter(controller.$name);\n                setter(scope, controller);\n              });\n            }\n            formElement.on('$destroy', function() {\n              controller.$$parentForm.$removeControl(controller);\n              setter(scope, undefined);\n              extend(controller, nullFormCtrl); //stop propagating child destruction handlers upwards\n            });\n          }\n        };\n      }\n    };\n\n    return formDirective;\n\n    function getSetter(expression) {\n      if (expression === '') {\n        //create an assignable expression, so forms with an empty name can be renamed later\n        return $parse('this[\"\"]').assign;\n      }\n      return $parse(expression).assign || noop;\n    }\n  }];\n};\n\nvar formDirective = formDirectiveFactory();\nvar ngFormDirective = formDirectiveFactory(true);\n\n/* global VALID_CLASS: false,\n  INVALID_CLASS: false,\n  PRISTINE_CLASS: false,\n  DIRTY_CLASS: false,\n  UNTOUCHED_CLASS: false,\n  TOUCHED_CLASS: false,\n  ngModelMinErr: false,\n*/\n\n// Regex code was initially obtained from SO prior to modification: https://stackoverflow.com/questions/3143070/javascript-regex-iso-datetime#answer-3143231\nvar ISO_DATE_REGEXP = /^\\d{4,}-[01]\\d-[0-3]\\dT[0-2]\\d:[0-5]\\d:[0-5]\\d\\.\\d+(?:[+-][0-2]\\d:[0-5]\\d|Z)$/;\n// See valid URLs in RFC3987 (http://tools.ietf.org/html/rfc3987)\n// Note: We are being more lenient, because browsers are too.\n//   1. Scheme\n//   2. Slashes\n//   3. Username\n//   4. Password\n//   5. Hostname\n//   6. Port\n//   7. Path\n//   8. Query\n//   9. Fragment\n//                 1111111111111111 222   333333    44444        555555555555555555555555    666     77777777     8888888     999\nvar URL_REGEXP = /^[a-z][a-z\\d.+-]*:\\/*(?:[^:@]+(?::[^@]+)?@)?(?:[^\\s:/?#]+|\\[[a-f\\d:]+\\])(?::\\d+)?(?:\\/[^?#]*)?(?:\\?[^#]*)?(?:#.*)?$/i;\nvar EMAIL_REGEXP = /^[a-z0-9!#$%&'*+\\/=?^_`{|}~.-]+@[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$/i;\nvar NUMBER_REGEXP = /^\\s*(\\-|\\+)?(\\d+|(\\d*(\\.\\d*)))([eE][+-]?\\d+)?\\s*$/;\nvar DATE_REGEXP = /^(\\d{4,})-(\\d{2})-(\\d{2})$/;\nvar DATETIMELOCAL_REGEXP = /^(\\d{4,})-(\\d\\d)-(\\d\\d)T(\\d\\d):(\\d\\d)(?::(\\d\\d)(\\.\\d{1,3})?)?$/;\nvar WEEK_REGEXP = /^(\\d{4,})-W(\\d\\d)$/;\nvar MONTH_REGEXP = /^(\\d{4,})-(\\d\\d)$/;\nvar TIME_REGEXP = /^(\\d\\d):(\\d\\d)(?::(\\d\\d)(\\.\\d{1,3})?)?$/;\n\nvar PARTIAL_VALIDATION_EVENTS = 'keydown wheel mousedown';\nvar PARTIAL_VALIDATION_TYPES = createMap();\nforEach('date,datetime-local,month,time,week'.split(','), function(type) {\n  PARTIAL_VALIDATION_TYPES[type] = true;\n});\n\nvar inputType = {\n\n  /**\n   * @ngdoc input\n   * @name input[text]\n   *\n   * @description\n   * Standard HTML text input with angular data binding, inherited by most of the `input` elements.\n   *\n   *\n   * @param {string} ngModel Assignable angular expression to data-bind to.\n   * @param {string=} name Property name of the form under which the control is published.\n   * @param {string=} required Adds `required` validation error key if the value is not entered.\n   * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to\n   *    the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of\n   *    `required` when you want to data-bind to the `required` attribute.\n   * @param {number=} ngMinlength Sets `minlength` validation error key if the value is shorter than\n   *    minlength.\n   * @param {number=} ngMaxlength Sets `maxlength` validation error key if the value is longer than\n   *    maxlength. Setting the attribute to a negative or non-numeric value, allows view values of\n   *    any length.\n   * @param {string=} pattern Similar to `ngPattern` except that the attribute value is the actual string\n   *    that contains the regular expression body that will be converted to a regular expression\n   *    as in the ngPattern directive.\n   * @param {string=} ngPattern Sets `pattern` validation error key if the ngModel {@link ngModel.NgModelController#$viewValue $viewValue}\n   *    does not match a RegExp found by evaluating the Angular expression given in the attribute value.\n   *    If the expression evaluates to a RegExp object, then this is used directly.\n   *    If the expression evaluates to a string, then it will be converted to a RegExp\n   *    after wrapping it in `^` and `$` characters. For instance, `\"abc\"` will be converted to\n   *    `new RegExp('^abc$')`.<br />\n   *    **Note:** Avoid using the `g` flag on the RegExp, as it will cause each successive search to\n   *    start at the index of the last search's match, thus not taking the whole input value into\n   *    account.\n   * @param {string=} ngChange Angular expression to be executed when input changes due to user\n   *    interaction with the input element.\n   * @param {boolean=} [ngTrim=true] If set to false Angular will not automatically trim the input.\n   *    This parameter is ignored for input[type=password] controls, which will never trim the\n   *    input.\n   *\n   * @example\n      <example name=\"text-input-directive\" module=\"textInputExample\">\n        <file name=\"index.html\">\n         <script>\n           angular.module('textInputExample', [])\n             .controller('ExampleController', ['$scope', function($scope) {\n               $scope.example = {\n                 text: 'guest',\n                 word: /^\\s*\\w*\\s*$/\n               };\n             }]);\n         </script>\n         <form name=\"myForm\" ng-controller=\"ExampleController\">\n           <label>Single word:\n             <input type=\"text\" name=\"input\" ng-model=\"example.text\"\n                    ng-pattern=\"example.word\" required ng-trim=\"false\">\n           </label>\n           <div role=\"alert\">\n             <span class=\"error\" ng-show=\"myForm.input.$error.required\">\n               Required!</span>\n             <span class=\"error\" ng-show=\"myForm.input.$error.pattern\">\n               Single word only!</span>\n           </div>\n           <tt>text = {{example.text}}</tt><br/>\n           <tt>myForm.input.$valid = {{myForm.input.$valid}}</tt><br/>\n           <tt>myForm.input.$error = {{myForm.input.$error}}</tt><br/>\n           <tt>myForm.$valid = {{myForm.$valid}}</tt><br/>\n           <tt>myForm.$error.required = {{!!myForm.$error.required}}</tt><br/>\n          </form>\n        </file>\n        <file name=\"protractor.js\" type=\"protractor\">\n          var text = element(by.binding('example.text'));\n          var valid = element(by.binding('myForm.input.$valid'));\n          var input = element(by.model('example.text'));\n\n          it('should initialize to model', function() {\n            expect(text.getText()).toContain('guest');\n            expect(valid.getText()).toContain('true');\n          });\n\n          it('should be invalid if empty', function() {\n            input.clear();\n            input.sendKeys('');\n\n            expect(text.getText()).toEqual('text =');\n            expect(valid.getText()).toContain('false');\n          });\n\n          it('should be invalid if multi word', function() {\n            input.clear();\n            input.sendKeys('hello world');\n\n            expect(valid.getText()).toContain('false');\n          });\n        </file>\n      </example>\n   */\n  'text': textInputType,\n\n    /**\n     * @ngdoc input\n     * @name input[date]\n     *\n     * @description\n     * Input with date validation and transformation. In browsers that do not yet support\n     * the HTML5 date input, a text element will be used. In that case, text must be entered in a valid ISO-8601\n     * date format (yyyy-MM-dd), for example: `2009-01-06`. Since many\n     * modern browsers do not yet support this input type, it is important to provide cues to users on the\n     * expected input format via a placeholder or label.\n     *\n     * The model must always be a Date object, otherwise Angular will throw an error.\n     * Invalid `Date` objects (dates whose `getTime()` is `NaN`) will be rendered as an empty string.\n     *\n     * The timezone to be used to read/write the `Date` instance in the model can be defined using\n     * {@link ng.directive:ngModelOptions ngModelOptions}. By default, this is the timezone of the browser.\n     *\n     * @param {string} ngModel Assignable angular expression to data-bind to.\n     * @param {string=} name Property name of the form under which the control is published.\n     * @param {string=} min Sets the `min` validation error key if the value entered is less than `min`. This must be a\n     *   valid ISO date string (yyyy-MM-dd). You can also use interpolation inside this attribute\n     *   (e.g. `min=\"{{minDate | date:'yyyy-MM-dd'}}\"`). Note that `min` will also add native HTML5\n     *   constraint validation.\n     * @param {string=} max Sets the `max` validation error key if the value entered is greater than `max`. This must be\n     *   a valid ISO date string (yyyy-MM-dd). You can also use interpolation inside this attribute\n     *   (e.g. `max=\"{{maxDate | date:'yyyy-MM-dd'}}\"`). Note that `max` will also add native HTML5\n     *   constraint validation.\n     * @param {(date|string)=} ngMin Sets the `min` validation constraint to the Date / ISO date string\n     *   the `ngMin` expression evaluates to. Note that it does not set the `min` attribute.\n     * @param {(date|string)=} ngMax Sets the `max` validation constraint to the Date / ISO date string\n     *   the `ngMax` expression evaluates to. Note that it does not set the `max` attribute.\n     * @param {string=} required Sets `required` validation error key if the value is not entered.\n     * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to\n     *    the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of\n     *    `required` when you want to data-bind to the `required` attribute.\n     * @param {string=} ngChange Angular expression to be executed when input changes due to user\n     *    interaction with the input element.\n     *\n     * @example\n     <example name=\"date-input-directive\" module=\"dateInputExample\">\n     <file name=\"index.html\">\n       <script>\n          angular.module('dateInputExample', [])\n            .controller('DateController', ['$scope', function($scope) {\n              $scope.example = {\n                value: new Date(2013, 9, 22)\n              };\n            }]);\n       </script>\n       <form name=\"myForm\" ng-controller=\"DateController as dateCtrl\">\n          <label for=\"exampleInput\">Pick a date in 2013:</label>\n          <input type=\"date\" id=\"exampleInput\" name=\"input\" ng-model=\"example.value\"\n              placeholder=\"yyyy-MM-dd\" min=\"2013-01-01\" max=\"2013-12-31\" required />\n          <div role=\"alert\">\n            <span class=\"error\" ng-show=\"myForm.input.$error.required\">\n                Required!</span>\n            <span class=\"error\" ng-show=\"myForm.input.$error.date\">\n                Not a valid date!</span>\n           </div>\n           <tt>value = {{example.value | date: \"yyyy-MM-dd\"}}</tt><br/>\n           <tt>myForm.input.$valid = {{myForm.input.$valid}}</tt><br/>\n           <tt>myForm.input.$error = {{myForm.input.$error}}</tt><br/>\n           <tt>myForm.$valid = {{myForm.$valid}}</tt><br/>\n           <tt>myForm.$error.required = {{!!myForm.$error.required}}</tt><br/>\n       </form>\n     </file>\n     <file name=\"protractor.js\" type=\"protractor\">\n        var value = element(by.binding('example.value | date: \"yyyy-MM-dd\"'));\n        var valid = element(by.binding('myForm.input.$valid'));\n        var input = element(by.model('example.value'));\n\n        // currently protractor/webdriver does not support\n        // sending keys to all known HTML5 input controls\n        // for various browsers (see https://github.com/angular/protractor/issues/562).\n        function setInput(val) {\n          // set the value of the element and force validation.\n          var scr = \"var ipt = document.getElementById('exampleInput'); \" +\n          \"ipt.value = '\" + val + \"';\" +\n          \"angular.element(ipt).scope().$apply(function(s) { s.myForm[ipt.name].$setViewValue('\" + val + \"'); });\";\n          browser.executeScript(scr);\n        }\n\n        it('should initialize to model', function() {\n          expect(value.getText()).toContain('2013-10-22');\n          expect(valid.getText()).toContain('myForm.input.$valid = true');\n        });\n\n        it('should be invalid if empty', function() {\n          setInput('');\n          expect(value.getText()).toEqual('value =');\n          expect(valid.getText()).toContain('myForm.input.$valid = false');\n        });\n\n        it('should be invalid if over max', function() {\n          setInput('2015-01-01');\n          expect(value.getText()).toContain('');\n          expect(valid.getText()).toContain('myForm.input.$valid = false');\n        });\n     </file>\n     </example>\n     */\n  'date': createDateInputType('date', DATE_REGEXP,\n         createDateParser(DATE_REGEXP, ['yyyy', 'MM', 'dd']),\n         'yyyy-MM-dd'),\n\n   /**\n    * @ngdoc input\n    * @name input[datetime-local]\n    *\n    * @description\n    * Input with datetime validation and transformation. In browsers that do not yet support\n    * the HTML5 date input, a text element will be used. In that case, the text must be entered in a valid ISO-8601\n    * local datetime format (yyyy-MM-ddTHH:mm:ss), for example: `2010-12-28T14:57:00`.\n    *\n    * The model must always be a Date object, otherwise Angular will throw an error.\n    * Invalid `Date` objects (dates whose `getTime()` is `NaN`) will be rendered as an empty string.\n    *\n    * The timezone to be used to read/write the `Date` instance in the model can be defined using\n    * {@link ng.directive:ngModelOptions ngModelOptions}. By default, this is the timezone of the browser.\n    *\n    * @param {string} ngModel Assignable angular expression to data-bind to.\n    * @param {string=} name Property name of the form under which the control is published.\n    * @param {string=} min Sets the `min` validation error key if the value entered is less than `min`.\n    *   This must be a valid ISO datetime format (yyyy-MM-ddTHH:mm:ss). You can also use interpolation\n    *   inside this attribute (e.g. `min=\"{{minDatetimeLocal | date:'yyyy-MM-ddTHH:mm:ss'}}\"`).\n    *   Note that `min` will also add native HTML5 constraint validation.\n    * @param {string=} max Sets the `max` validation error key if the value entered is greater than `max`.\n    *   This must be a valid ISO datetime format (yyyy-MM-ddTHH:mm:ss). You can also use interpolation\n    *   inside this attribute (e.g. `max=\"{{maxDatetimeLocal | date:'yyyy-MM-ddTHH:mm:ss'}}\"`).\n    *   Note that `max` will also add native HTML5 constraint validation.\n    * @param {(date|string)=} ngMin Sets the `min` validation error key to the Date / ISO datetime string\n    *   the `ngMin` expression evaluates to. Note that it does not set the `min` attribute.\n    * @param {(date|string)=} ngMax Sets the `max` validation error key to the Date / ISO datetime string\n    *   the `ngMax` expression evaluates to. Note that it does not set the `max` attribute.\n    * @param {string=} required Sets `required` validation error key if the value is not entered.\n    * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to\n    *    the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of\n    *    `required` when you want to data-bind to the `required` attribute.\n    * @param {string=} ngChange Angular expression to be executed when input changes due to user\n    *    interaction with the input element.\n    *\n    * @example\n    <example name=\"datetimelocal-input-directive\" module=\"dateExample\">\n    <file name=\"index.html\">\n      <script>\n        angular.module('dateExample', [])\n          .controller('DateController', ['$scope', function($scope) {\n            $scope.example = {\n              value: new Date(2010, 11, 28, 14, 57)\n            };\n          }]);\n      </script>\n      <form name=\"myForm\" ng-controller=\"DateController as dateCtrl\">\n        <label for=\"exampleInput\">Pick a date between in 2013:</label>\n        <input type=\"datetime-local\" id=\"exampleInput\" name=\"input\" ng-model=\"example.value\"\n            placeholder=\"yyyy-MM-ddTHH:mm:ss\" min=\"2001-01-01T00:00:00\" max=\"2013-12-31T00:00:00\" required />\n        <div role=\"alert\">\n          <span class=\"error\" ng-show=\"myForm.input.$error.required\">\n              Required!</span>\n          <span class=\"error\" ng-show=\"myForm.input.$error.datetimelocal\">\n              Not a valid date!</span>\n        </div>\n        <tt>value = {{example.value | date: \"yyyy-MM-ddTHH:mm:ss\"}}</tt><br/>\n        <tt>myForm.input.$valid = {{myForm.input.$valid}}</tt><br/>\n        <tt>myForm.input.$error = {{myForm.input.$error}}</tt><br/>\n        <tt>myForm.$valid = {{myForm.$valid}}</tt><br/>\n        <tt>myForm.$error.required = {{!!myForm.$error.required}}</tt><br/>\n      </form>\n    </file>\n    <file name=\"protractor.js\" type=\"protractor\">\n      var value = element(by.binding('example.value | date: \"yyyy-MM-ddTHH:mm:ss\"'));\n      var valid = element(by.binding('myForm.input.$valid'));\n      var input = element(by.model('example.value'));\n\n      // currently protractor/webdriver does not support\n      // sending keys to all known HTML5 input controls\n      // for various browsers (https://github.com/angular/protractor/issues/562).\n      function setInput(val) {\n        // set the value of the element and force validation.\n        var scr = \"var ipt = document.getElementById('exampleInput'); \" +\n        \"ipt.value = '\" + val + \"';\" +\n        \"angular.element(ipt).scope().$apply(function(s) { s.myForm[ipt.name].$setViewValue('\" + val + \"'); });\";\n        browser.executeScript(scr);\n      }\n\n      it('should initialize to model', function() {\n        expect(value.getText()).toContain('2010-12-28T14:57:00');\n        expect(valid.getText()).toContain('myForm.input.$valid = true');\n      });\n\n      it('should be invalid if empty', function() {\n        setInput('');\n        expect(value.getText()).toEqual('value =');\n        expect(valid.getText()).toContain('myForm.input.$valid = false');\n      });\n\n      it('should be invalid if over max', function() {\n        setInput('2015-01-01T23:59:00');\n        expect(value.getText()).toContain('');\n        expect(valid.getText()).toContain('myForm.input.$valid = false');\n      });\n    </file>\n    </example>\n    */\n  'datetime-local': createDateInputType('datetimelocal', DATETIMELOCAL_REGEXP,\n      createDateParser(DATETIMELOCAL_REGEXP, ['yyyy', 'MM', 'dd', 'HH', 'mm', 'ss', 'sss']),\n      'yyyy-MM-ddTHH:mm:ss.sss'),\n\n  /**\n   * @ngdoc input\n   * @name input[time]\n   *\n   * @description\n   * Input with time validation and transformation. In browsers that do not yet support\n   * the HTML5 time input, a text element will be used. In that case, the text must be entered in a valid ISO-8601\n   * local time format (HH:mm:ss), for example: `14:57:00`. Model must be a Date object. This binding will always output a\n   * Date object to the model of January 1, 1970, or local date `new Date(1970, 0, 1, HH, mm, ss)`.\n   *\n   * The model must always be a Date object, otherwise Angular will throw an error.\n   * Invalid `Date` objects (dates whose `getTime()` is `NaN`) will be rendered as an empty string.\n   *\n   * The timezone to be used to read/write the `Date` instance in the model can be defined using\n   * {@link ng.directive:ngModelOptions ngModelOptions}. By default, this is the timezone of the browser.\n   *\n   * @param {string} ngModel Assignable angular expression to data-bind to.\n   * @param {string=} name Property name of the form under which the control is published.\n   * @param {string=} min Sets the `min` validation error key if the value entered is less than `min`.\n   *   This must be a valid ISO time format (HH:mm:ss). You can also use interpolation inside this\n   *   attribute (e.g. `min=\"{{minTime | date:'HH:mm:ss'}}\"`). Note that `min` will also add\n   *   native HTML5 constraint validation.\n   * @param {string=} max Sets the `max` validation error key if the value entered is greater than `max`.\n   *   This must be a valid ISO time format (HH:mm:ss). You can also use interpolation inside this\n   *   attribute (e.g. `max=\"{{maxTime | date:'HH:mm:ss'}}\"`). Note that `max` will also add\n   *   native HTML5 constraint validation.\n   * @param {(date|string)=} ngMin Sets the `min` validation constraint to the Date / ISO time string the\n   *   `ngMin` expression evaluates to. Note that it does not set the `min` attribute.\n   * @param {(date|string)=} ngMax Sets the `max` validation constraint to the Date / ISO time string the\n   *   `ngMax` expression evaluates to. Note that it does not set the `max` attribute.\n   * @param {string=} required Sets `required` validation error key if the value is not entered.\n   * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to\n   *    the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of\n   *    `required` when you want to data-bind to the `required` attribute.\n   * @param {string=} ngChange Angular expression to be executed when input changes due to user\n   *    interaction with the input element.\n   *\n   * @example\n   <example name=\"time-input-directive\" module=\"timeExample\">\n   <file name=\"index.html\">\n     <script>\n      angular.module('timeExample', [])\n        .controller('DateController', ['$scope', function($scope) {\n          $scope.example = {\n            value: new Date(1970, 0, 1, 14, 57, 0)\n          };\n        }]);\n     </script>\n     <form name=\"myForm\" ng-controller=\"DateController as dateCtrl\">\n        <label for=\"exampleInput\">Pick a time between 8am and 5pm:</label>\n        <input type=\"time\" id=\"exampleInput\" name=\"input\" ng-model=\"example.value\"\n            placeholder=\"HH:mm:ss\" min=\"08:00:00\" max=\"17:00:00\" required />\n        <div role=\"alert\">\n          <span class=\"error\" ng-show=\"myForm.input.$error.required\">\n              Required!</span>\n          <span class=\"error\" ng-show=\"myForm.input.$error.time\">\n              Not a valid date!</span>\n        </div>\n        <tt>value = {{example.value | date: \"HH:mm:ss\"}}</tt><br/>\n        <tt>myForm.input.$valid = {{myForm.input.$valid}}</tt><br/>\n        <tt>myForm.input.$error = {{myForm.input.$error}}</tt><br/>\n        <tt>myForm.$valid = {{myForm.$valid}}</tt><br/>\n        <tt>myForm.$error.required = {{!!myForm.$error.required}}</tt><br/>\n     </form>\n   </file>\n   <file name=\"protractor.js\" type=\"protractor\">\n      var value = element(by.binding('example.value | date: \"HH:mm:ss\"'));\n      var valid = element(by.binding('myForm.input.$valid'));\n      var input = element(by.model('example.value'));\n\n      // currently protractor/webdriver does not support\n      // sending keys to all known HTML5 input controls\n      // for various browsers (https://github.com/angular/protractor/issues/562).\n      function setInput(val) {\n        // set the value of the element and force validation.\n        var scr = \"var ipt = document.getElementById('exampleInput'); \" +\n        \"ipt.value = '\" + val + \"';\" +\n        \"angular.element(ipt).scope().$apply(function(s) { s.myForm[ipt.name].$setViewValue('\" + val + \"'); });\";\n        browser.executeScript(scr);\n      }\n\n      it('should initialize to model', function() {\n        expect(value.getText()).toContain('14:57:00');\n        expect(valid.getText()).toContain('myForm.input.$valid = true');\n      });\n\n      it('should be invalid if empty', function() {\n        setInput('');\n        expect(value.getText()).toEqual('value =');\n        expect(valid.getText()).toContain('myForm.input.$valid = false');\n      });\n\n      it('should be invalid if over max', function() {\n        setInput('23:59:00');\n        expect(value.getText()).toContain('');\n        expect(valid.getText()).toContain('myForm.input.$valid = false');\n      });\n   </file>\n   </example>\n   */\n  'time': createDateInputType('time', TIME_REGEXP,\n      createDateParser(TIME_REGEXP, ['HH', 'mm', 'ss', 'sss']),\n     'HH:mm:ss.sss'),\n\n   /**\n    * @ngdoc input\n    * @name input[week]\n    *\n    * @description\n    * Input with week-of-the-year validation and transformation to Date. In browsers that do not yet support\n    * the HTML5 week input, a text element will be used. In that case, the text must be entered in a valid ISO-8601\n    * week format (yyyy-W##), for example: `2013-W02`.\n    *\n    * The model must always be a Date object, otherwise Angular will throw an error.\n    * Invalid `Date` objects (dates whose `getTime()` is `NaN`) will be rendered as an empty string.\n    *\n    * The timezone to be used to read/write the `Date` instance in the model can be defined using\n    * {@link ng.directive:ngModelOptions ngModelOptions}. By default, this is the timezone of the browser.\n    *\n    * @param {string} ngModel Assignable angular expression to data-bind to.\n    * @param {string=} name Property name of the form under which the control is published.\n    * @param {string=} min Sets the `min` validation error key if the value entered is less than `min`.\n    *   This must be a valid ISO week format (yyyy-W##). You can also use interpolation inside this\n    *   attribute (e.g. `min=\"{{minWeek | date:'yyyy-Www'}}\"`). Note that `min` will also add\n    *   native HTML5 constraint validation.\n    * @param {string=} max Sets the `max` validation error key if the value entered is greater than `max`.\n    *   This must be a valid ISO week format (yyyy-W##). You can also use interpolation inside this\n    *   attribute (e.g. `max=\"{{maxWeek | date:'yyyy-Www'}}\"`). Note that `max` will also add\n    *   native HTML5 constraint validation.\n    * @param {(date|string)=} ngMin Sets the `min` validation constraint to the Date / ISO week string\n    *   the `ngMin` expression evaluates to. Note that it does not set the `min` attribute.\n    * @param {(date|string)=} ngMax Sets the `max` validation constraint to the Date / ISO week string\n    *   the `ngMax` expression evaluates to. Note that it does not set the `max` attribute.\n    * @param {string=} required Sets `required` validation error key if the value is not entered.\n    * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to\n    *    the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of\n    *    `required` when you want to data-bind to the `required` attribute.\n    * @param {string=} ngChange Angular expression to be executed when input changes due to user\n    *    interaction with the input element.\n    *\n    * @example\n    <example name=\"week-input-directive\" module=\"weekExample\">\n    <file name=\"index.html\">\n      <script>\n      angular.module('weekExample', [])\n        .controller('DateController', ['$scope', function($scope) {\n          $scope.example = {\n            value: new Date(2013, 0, 3)\n          };\n        }]);\n      </script>\n      <form name=\"myForm\" ng-controller=\"DateController as dateCtrl\">\n        <label>Pick a date between in 2013:\n          <input id=\"exampleInput\" type=\"week\" name=\"input\" ng-model=\"example.value\"\n                 placeholder=\"YYYY-W##\" min=\"2012-W32\"\n                 max=\"2013-W52\" required />\n        </label>\n        <div role=\"alert\">\n          <span class=\"error\" ng-show=\"myForm.input.$error.required\">\n              Required!</span>\n          <span class=\"error\" ng-show=\"myForm.input.$error.week\">\n              Not a valid date!</span>\n        </div>\n        <tt>value = {{example.value | date: \"yyyy-Www\"}}</tt><br/>\n        <tt>myForm.input.$valid = {{myForm.input.$valid}}</tt><br/>\n        <tt>myForm.input.$error = {{myForm.input.$error}}</tt><br/>\n        <tt>myForm.$valid = {{myForm.$valid}}</tt><br/>\n        <tt>myForm.$error.required = {{!!myForm.$error.required}}</tt><br/>\n      </form>\n    </file>\n    <file name=\"protractor.js\" type=\"protractor\">\n      var value = element(by.binding('example.value | date: \"yyyy-Www\"'));\n      var valid = element(by.binding('myForm.input.$valid'));\n      var input = element(by.model('example.value'));\n\n      // currently protractor/webdriver does not support\n      // sending keys to all known HTML5 input controls\n      // for various browsers (https://github.com/angular/protractor/issues/562).\n      function setInput(val) {\n        // set the value of the element and force validation.\n        var scr = \"var ipt = document.getElementById('exampleInput'); \" +\n        \"ipt.value = '\" + val + \"';\" +\n        \"angular.element(ipt).scope().$apply(function(s) { s.myForm[ipt.name].$setViewValue('\" + val + \"'); });\";\n        browser.executeScript(scr);\n      }\n\n      it('should initialize to model', function() {\n        expect(value.getText()).toContain('2013-W01');\n        expect(valid.getText()).toContain('myForm.input.$valid = true');\n      });\n\n      it('should be invalid if empty', function() {\n        setInput('');\n        expect(value.getText()).toEqual('value =');\n        expect(valid.getText()).toContain('myForm.input.$valid = false');\n      });\n\n      it('should be invalid if over max', function() {\n        setInput('2015-W01');\n        expect(value.getText()).toContain('');\n        expect(valid.getText()).toContain('myForm.input.$valid = false');\n      });\n    </file>\n    </example>\n    */\n  'week': createDateInputType('week', WEEK_REGEXP, weekParser, 'yyyy-Www'),\n\n  /**\n   * @ngdoc input\n   * @name input[month]\n   *\n   * @description\n   * Input with month validation and transformation. In browsers that do not yet support\n   * the HTML5 month input, a text element will be used. In that case, the text must be entered in a valid ISO-8601\n   * month format (yyyy-MM), for example: `2009-01`.\n   *\n   * The model must always be a Date object, otherwise Angular will throw an error.\n   * Invalid `Date` objects (dates whose `getTime()` is `NaN`) will be rendered as an empty string.\n   * If the model is not set to the first of the month, the next view to model update will set it\n   * to the first of the month.\n   *\n   * The timezone to be used to read/write the `Date` instance in the model can be defined using\n   * {@link ng.directive:ngModelOptions ngModelOptions}. By default, this is the timezone of the browser.\n   *\n   * @param {string} ngModel Assignable angular expression to data-bind to.\n   * @param {string=} name Property name of the form under which the control is published.\n   * @param {string=} min Sets the `min` validation error key if the value entered is less than `min`.\n   *   This must be a valid ISO month format (yyyy-MM). You can also use interpolation inside this\n   *   attribute (e.g. `min=\"{{minMonth | date:'yyyy-MM'}}\"`). Note that `min` will also add\n   *   native HTML5 constraint validation.\n   * @param {string=} max Sets the `max` validation error key if the value entered is greater than `max`.\n   *   This must be a valid ISO month format (yyyy-MM). You can also use interpolation inside this\n   *   attribute (e.g. `max=\"{{maxMonth | date:'yyyy-MM'}}\"`). Note that `max` will also add\n   *   native HTML5 constraint validation.\n   * @param {(date|string)=} ngMin Sets the `min` validation constraint to the Date / ISO week string\n   *   the `ngMin` expression evaluates to. Note that it does not set the `min` attribute.\n   * @param {(date|string)=} ngMax Sets the `max` validation constraint to the Date / ISO week string\n   *   the `ngMax` expression evaluates to. Note that it does not set the `max` attribute.\n\n   * @param {string=} required Sets `required` validation error key if the value is not entered.\n   * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to\n   *    the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of\n   *    `required` when you want to data-bind to the `required` attribute.\n   * @param {string=} ngChange Angular expression to be executed when input changes due to user\n   *    interaction with the input element.\n   *\n   * @example\n   <example name=\"month-input-directive\" module=\"monthExample\">\n   <file name=\"index.html\">\n     <script>\n      angular.module('monthExample', [])\n        .controller('DateController', ['$scope', function($scope) {\n          $scope.example = {\n            value: new Date(2013, 9, 1)\n          };\n        }]);\n     </script>\n     <form name=\"myForm\" ng-controller=\"DateController as dateCtrl\">\n       <label for=\"exampleInput\">Pick a month in 2013:</label>\n       <input id=\"exampleInput\" type=\"month\" name=\"input\" ng-model=\"example.value\"\n          placeholder=\"yyyy-MM\" min=\"2013-01\" max=\"2013-12\" required />\n       <div role=\"alert\">\n         <span class=\"error\" ng-show=\"myForm.input.$error.required\">\n            Required!</span>\n         <span class=\"error\" ng-show=\"myForm.input.$error.month\">\n            Not a valid month!</span>\n       </div>\n       <tt>value = {{example.value | date: \"yyyy-MM\"}}</tt><br/>\n       <tt>myForm.input.$valid = {{myForm.input.$valid}}</tt><br/>\n       <tt>myForm.input.$error = {{myForm.input.$error}}</tt><br/>\n       <tt>myForm.$valid = {{myForm.$valid}}</tt><br/>\n       <tt>myForm.$error.required = {{!!myForm.$error.required}}</tt><br/>\n     </form>\n   </file>\n   <file name=\"protractor.js\" type=\"protractor\">\n      var value = element(by.binding('example.value | date: \"yyyy-MM\"'));\n      var valid = element(by.binding('myForm.input.$valid'));\n      var input = element(by.model('example.value'));\n\n      // currently protractor/webdriver does not support\n      // sending keys to all known HTML5 input controls\n      // for various browsers (https://github.com/angular/protractor/issues/562).\n      function setInput(val) {\n        // set the value of the element and force validation.\n        var scr = \"var ipt = document.getElementById('exampleInput'); \" +\n        \"ipt.value = '\" + val + \"';\" +\n        \"angular.element(ipt).scope().$apply(function(s) { s.myForm[ipt.name].$setViewValue('\" + val + \"'); });\";\n        browser.executeScript(scr);\n      }\n\n      it('should initialize to model', function() {\n        expect(value.getText()).toContain('2013-10');\n        expect(valid.getText()).toContain('myForm.input.$valid = true');\n      });\n\n      it('should be invalid if empty', function() {\n        setInput('');\n        expect(value.getText()).toEqual('value =');\n        expect(valid.getText()).toContain('myForm.input.$valid = false');\n      });\n\n      it('should be invalid if over max', function() {\n        setInput('2015-01');\n        expect(value.getText()).toContain('');\n        expect(valid.getText()).toContain('myForm.input.$valid = false');\n      });\n   </file>\n   </example>\n   */\n  'month': createDateInputType('month', MONTH_REGEXP,\n     createDateParser(MONTH_REGEXP, ['yyyy', 'MM']),\n     'yyyy-MM'),\n\n  /**\n   * @ngdoc input\n   * @name input[number]\n   *\n   * @description\n   * Text input with number validation and transformation. Sets the `number` validation\n   * error if not a valid number.\n   *\n   * <div class=\"alert alert-warning\">\n   * The model must always be of type `number` otherwise Angular will throw an error.\n   * Be aware that a string containing a number is not enough. See the {@link ngModel:numfmt}\n   * error docs for more information and an example of how to convert your model if necessary.\n   * </div>\n   *\n   * ## Issues with HTML5 constraint validation\n   *\n   * In browsers that follow the\n   * [HTML5 specification](https://html.spec.whatwg.org/multipage/forms.html#number-state-%28type=number%29),\n   * `input[number]` does not work as expected with {@link ngModelOptions `ngModelOptions.allowInvalid`}.\n   * If a non-number is entered in the input, the browser will report the value as an empty string,\n   * which means the view / model values in `ngModel` and subsequently the scope value\n   * will also be an empty string.\n   *\n   *\n   * @param {string} ngModel Assignable angular expression to data-bind to.\n   * @param {string=} name Property name of the form under which the control is published.\n   * @param {string=} min Sets the `min` validation error key if the value entered is less than `min`.\n   * @param {string=} max Sets the `max` validation error key if the value entered is greater than `max`.\n   * @param {string=} required Sets `required` validation error key if the value is not entered.\n   * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to\n   *    the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of\n   *    `required` when you want to data-bind to the `required` attribute.\n   * @param {number=} ngMinlength Sets `minlength` validation error key if the value is shorter than\n   *    minlength.\n   * @param {number=} ngMaxlength Sets `maxlength` validation error key if the value is longer than\n   *    maxlength. Setting the attribute to a negative or non-numeric value, allows view values of\n   *    any length.\n   * @param {string=} pattern Similar to `ngPattern` except that the attribute value is the actual string\n   *    that contains the regular expression body that will be converted to a regular expression\n   *    as in the ngPattern directive.\n   * @param {string=} ngPattern Sets `pattern` validation error key if the ngModel {@link ngModel.NgModelController#$viewValue $viewValue}\n   *    does not match a RegExp found by evaluating the Angular expression given in the attribute value.\n   *    If the expression evaluates to a RegExp object, then this is used directly.\n   *    If the expression evaluates to a string, then it will be converted to a RegExp\n   *    after wrapping it in `^` and `$` characters. For instance, `\"abc\"` will be converted to\n   *    `new RegExp('^abc$')`.<br />\n   *    **Note:** Avoid using the `g` flag on the RegExp, as it will cause each successive search to\n   *    start at the index of the last search's match, thus not taking the whole input value into\n   *    account.\n   * @param {string=} ngChange Angular expression to be executed when input changes due to user\n   *    interaction with the input element.\n   *\n   * @example\n      <example name=\"number-input-directive\" module=\"numberExample\">\n        <file name=\"index.html\">\n         <script>\n           angular.module('numberExample', [])\n             .controller('ExampleController', ['$scope', function($scope) {\n               $scope.example = {\n                 value: 12\n               };\n             }]);\n         </script>\n         <form name=\"myForm\" ng-controller=\"ExampleController\">\n           <label>Number:\n             <input type=\"number\" name=\"input\" ng-model=\"example.value\"\n                    min=\"0\" max=\"99\" required>\n          </label>\n           <div role=\"alert\">\n             <span class=\"error\" ng-show=\"myForm.input.$error.required\">\n               Required!</span>\n             <span class=\"error\" ng-show=\"myForm.input.$error.number\">\n               Not valid number!</span>\n           </div>\n           <tt>value = {{example.value}}</tt><br/>\n           <tt>myForm.input.$valid = {{myForm.input.$valid}}</tt><br/>\n           <tt>myForm.input.$error = {{myForm.input.$error}}</tt><br/>\n           <tt>myForm.$valid = {{myForm.$valid}}</tt><br/>\n           <tt>myForm.$error.required = {{!!myForm.$error.required}}</tt><br/>\n          </form>\n        </file>\n        <file name=\"protractor.js\" type=\"protractor\">\n          var value = element(by.binding('example.value'));\n          var valid = element(by.binding('myForm.input.$valid'));\n          var input = element(by.model('example.value'));\n\n          it('should initialize to model', function() {\n            expect(value.getText()).toContain('12');\n            expect(valid.getText()).toContain('true');\n          });\n\n          it('should be invalid if empty', function() {\n            input.clear();\n            input.sendKeys('');\n            expect(value.getText()).toEqual('value =');\n            expect(valid.getText()).toContain('false');\n          });\n\n          it('should be invalid if over max', function() {\n            input.clear();\n            input.sendKeys('123');\n            expect(value.getText()).toEqual('value =');\n            expect(valid.getText()).toContain('false');\n          });\n        </file>\n      </example>\n   */\n  'number': numberInputType,\n\n\n  /**\n   * @ngdoc input\n   * @name input[url]\n   *\n   * @description\n   * Text input with URL validation. Sets the `url` validation error key if the content is not a\n   * valid URL.\n   *\n   * <div class=\"alert alert-warning\">\n   * **Note:** `input[url]` uses a regex to validate urls that is derived from the regex\n   * used in Chromium. If you need stricter validation, you can use `ng-pattern` or modify\n   * the built-in validators (see the {@link guide/forms Forms guide})\n   * </div>\n   *\n   * @param {string} ngModel Assignable angular expression to data-bind to.\n   * @param {string=} name Property name of the form under which the control is published.\n   * @param {string=} required Sets `required` validation error key if the value is not entered.\n   * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to\n   *    the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of\n   *    `required` when you want to data-bind to the `required` attribute.\n   * @param {number=} ngMinlength Sets `minlength` validation error key if the value is shorter than\n   *    minlength.\n   * @param {number=} ngMaxlength Sets `maxlength` validation error key if the value is longer than\n   *    maxlength. Setting the attribute to a negative or non-numeric value, allows view values of\n   *    any length.\n   * @param {string=} pattern Similar to `ngPattern` except that the attribute value is the actual string\n   *    that contains the regular expression body that will be converted to a regular expression\n   *    as in the ngPattern directive.\n   * @param {string=} ngPattern Sets `pattern` validation error key if the ngModel {@link ngModel.NgModelController#$viewValue $viewValue}\n   *    does not match a RegExp found by evaluating the Angular expression given in the attribute value.\n   *    If the expression evaluates to a RegExp object, then this is used directly.\n   *    If the expression evaluates to a string, then it will be converted to a RegExp\n   *    after wrapping it in `^` and `$` characters. For instance, `\"abc\"` will be converted to\n   *    `new RegExp('^abc$')`.<br />\n   *    **Note:** Avoid using the `g` flag on the RegExp, as it will cause each successive search to\n   *    start at the index of the last search's match, thus not taking the whole input value into\n   *    account.\n   * @param {string=} ngChange Angular expression to be executed when input changes due to user\n   *    interaction with the input element.\n   *\n   * @example\n      <example name=\"url-input-directive\" module=\"urlExample\">\n        <file name=\"index.html\">\n         <script>\n           angular.module('urlExample', [])\n             .controller('ExampleController', ['$scope', function($scope) {\n               $scope.url = {\n                 text: 'http://google.com'\n               };\n             }]);\n         </script>\n         <form name=\"myForm\" ng-controller=\"ExampleController\">\n           <label>URL:\n             <input type=\"url\" name=\"input\" ng-model=\"url.text\" required>\n           <label>\n           <div role=\"alert\">\n             <span class=\"error\" ng-show=\"myForm.input.$error.required\">\n               Required!</span>\n             <span class=\"error\" ng-show=\"myForm.input.$error.url\">\n               Not valid url!</span>\n           </div>\n           <tt>text = {{url.text}}</tt><br/>\n           <tt>myForm.input.$valid = {{myForm.input.$valid}}</tt><br/>\n           <tt>myForm.input.$error = {{myForm.input.$error}}</tt><br/>\n           <tt>myForm.$valid = {{myForm.$valid}}</tt><br/>\n           <tt>myForm.$error.required = {{!!myForm.$error.required}}</tt><br/>\n           <tt>myForm.$error.url = {{!!myForm.$error.url}}</tt><br/>\n          </form>\n        </file>\n        <file name=\"protractor.js\" type=\"protractor\">\n          var text = element(by.binding('url.text'));\n          var valid = element(by.binding('myForm.input.$valid'));\n          var input = element(by.model('url.text'));\n\n          it('should initialize to model', function() {\n            expect(text.getText()).toContain('http://google.com');\n            expect(valid.getText()).toContain('true');\n          });\n\n          it('should be invalid if empty', function() {\n            input.clear();\n            input.sendKeys('');\n\n            expect(text.getText()).toEqual('text =');\n            expect(valid.getText()).toContain('false');\n          });\n\n          it('should be invalid if not url', function() {\n            input.clear();\n            input.sendKeys('box');\n\n            expect(valid.getText()).toContain('false');\n          });\n        </file>\n      </example>\n   */\n  'url': urlInputType,\n\n\n  /**\n   * @ngdoc input\n   * @name input[email]\n   *\n   * @description\n   * Text input with email validation. Sets the `email` validation error key if not a valid email\n   * address.\n   *\n   * <div class=\"alert alert-warning\">\n   * **Note:** `input[email]` uses a regex to validate email addresses that is derived from the regex\n   * used in Chromium. If you need stricter validation (e.g. requiring a top-level domain), you can\n   * use `ng-pattern` or modify the built-in validators (see the {@link guide/forms Forms guide})\n   * </div>\n   *\n   * @param {string} ngModel Assignable angular expression to data-bind to.\n   * @param {string=} name Property name of the form under which the control is published.\n   * @param {string=} required Sets `required` validation error key if the value is not entered.\n   * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to\n   *    the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of\n   *    `required` when you want to data-bind to the `required` attribute.\n   * @param {number=} ngMinlength Sets `minlength` validation error key if the value is shorter than\n   *    minlength.\n   * @param {number=} ngMaxlength Sets `maxlength` validation error key if the value is longer than\n   *    maxlength. Setting the attribute to a negative or non-numeric value, allows view values of\n   *    any length.\n   * @param {string=} pattern Similar to `ngPattern` except that the attribute value is the actual string\n   *    that contains the regular expression body that will be converted to a regular expression\n   *    as in the ngPattern directive.\n   * @param {string=} ngPattern Sets `pattern` validation error key if the ngModel {@link ngModel.NgModelController#$viewValue $viewValue}\n   *    does not match a RegExp found by evaluating the Angular expression given in the attribute value.\n   *    If the expression evaluates to a RegExp object, then this is used directly.\n   *    If the expression evaluates to a string, then it will be converted to a RegExp\n   *    after wrapping it in `^` and `$` characters. For instance, `\"abc\"` will be converted to\n   *    `new RegExp('^abc$')`.<br />\n   *    **Note:** Avoid using the `g` flag on the RegExp, as it will cause each successive search to\n   *    start at the index of the last search's match, thus not taking the whole input value into\n   *    account.\n   * @param {string=} ngChange Angular expression to be executed when input changes due to user\n   *    interaction with the input element.\n   *\n   * @example\n      <example name=\"email-input-directive\" module=\"emailExample\">\n        <file name=\"index.html\">\n         <script>\n           angular.module('emailExample', [])\n             .controller('ExampleController', ['$scope', function($scope) {\n               $scope.email = {\n                 text: 'me@example.com'\n               };\n             }]);\n         </script>\n           <form name=\"myForm\" ng-controller=\"ExampleController\">\n             <label>Email:\n               <input type=\"email\" name=\"input\" ng-model=\"email.text\" required>\n             </label>\n             <div role=\"alert\">\n               <span class=\"error\" ng-show=\"myForm.input.$error.required\">\n                 Required!</span>\n               <span class=\"error\" ng-show=\"myForm.input.$error.email\">\n                 Not valid email!</span>\n             </div>\n             <tt>text = {{email.text}}</tt><br/>\n             <tt>myForm.input.$valid = {{myForm.input.$valid}}</tt><br/>\n             <tt>myForm.input.$error = {{myForm.input.$error}}</tt><br/>\n             <tt>myForm.$valid = {{myForm.$valid}}</tt><br/>\n             <tt>myForm.$error.required = {{!!myForm.$error.required}}</tt><br/>\n             <tt>myForm.$error.email = {{!!myForm.$error.email}}</tt><br/>\n           </form>\n         </file>\n        <file name=\"protractor.js\" type=\"protractor\">\n          var text = element(by.binding('email.text'));\n          var valid = element(by.binding('myForm.input.$valid'));\n          var input = element(by.model('email.text'));\n\n          it('should initialize to model', function() {\n            expect(text.getText()).toContain('me@example.com');\n            expect(valid.getText()).toContain('true');\n          });\n\n          it('should be invalid if empty', function() {\n            input.clear();\n            input.sendKeys('');\n            expect(text.getText()).toEqual('text =');\n            expect(valid.getText()).toContain('false');\n          });\n\n          it('should be invalid if not email', function() {\n            input.clear();\n            input.sendKeys('xxx');\n\n            expect(valid.getText()).toContain('false');\n          });\n        </file>\n      </example>\n   */\n  'email': emailInputType,\n\n\n  /**\n   * @ngdoc input\n   * @name input[radio]\n   *\n   * @description\n   * HTML radio button.\n   *\n   * @param {string} ngModel Assignable angular expression to data-bind to.\n   * @param {string} value The value to which the `ngModel` expression should be set when selected.\n   *    Note that `value` only supports `string` values, i.e. the scope model needs to be a string,\n   *    too. Use `ngValue` if you need complex models (`number`, `object`, ...).\n   * @param {string=} name Property name of the form under which the control is published.\n   * @param {string=} ngChange Angular expression to be executed when input changes due to user\n   *    interaction with the input element.\n   * @param {string} ngValue Angular expression to which `ngModel` will be be set when the radio\n   *    is selected. Should be used instead of the `value` attribute if you need\n   *    a non-string `ngModel` (`boolean`, `array`, ...).\n   *\n   * @example\n      <example name=\"radio-input-directive\" module=\"radioExample\">\n        <file name=\"index.html\">\n         <script>\n           angular.module('radioExample', [])\n             .controller('ExampleController', ['$scope', function($scope) {\n               $scope.color = {\n                 name: 'blue'\n               };\n               $scope.specialValue = {\n                 \"id\": \"12345\",\n                 \"value\": \"green\"\n               };\n             }]);\n         </script>\n         <form name=\"myForm\" ng-controller=\"ExampleController\">\n           <label>\n             <input type=\"radio\" ng-model=\"color.name\" value=\"red\">\n             Red\n           </label><br/>\n           <label>\n             <input type=\"radio\" ng-model=\"color.name\" ng-value=\"specialValue\">\n             Green\n           </label><br/>\n           <label>\n             <input type=\"radio\" ng-model=\"color.name\" value=\"blue\">\n             Blue\n           </label><br/>\n           <tt>color = {{color.name | json}}</tt><br/>\n          </form>\n          Note that `ng-value=\"specialValue\"` sets radio item's value to be the value of `$scope.specialValue`.\n        </file>\n        <file name=\"protractor.js\" type=\"protractor\">\n          it('should change state', function() {\n            var color = element(by.binding('color.name'));\n\n            expect(color.getText()).toContain('blue');\n\n            element.all(by.model('color.name')).get(0).click();\n\n            expect(color.getText()).toContain('red');\n          });\n        </file>\n      </example>\n   */\n  'radio': radioInputType,\n\n\n  /**\n   * @ngdoc input\n   * @name input[checkbox]\n   *\n   * @description\n   * HTML checkbox.\n   *\n   * @param {string} ngModel Assignable angular expression to data-bind to.\n   * @param {string=} name Property name of the form under which the control is published.\n   * @param {expression=} ngTrueValue The value to which the expression should be set when selected.\n   * @param {expression=} ngFalseValue The value to which the expression should be set when not selected.\n   * @param {string=} ngChange Angular expression to be executed when input changes due to user\n   *    interaction with the input element.\n   *\n   * @example\n      <example name=\"checkbox-input-directive\" module=\"checkboxExample\">\n        <file name=\"index.html\">\n         <script>\n           angular.module('checkboxExample', [])\n             .controller('ExampleController', ['$scope', function($scope) {\n               $scope.checkboxModel = {\n                value1 : true,\n                value2 : 'YES'\n              };\n             }]);\n         </script>\n         <form name=\"myForm\" ng-controller=\"ExampleController\">\n           <label>Value1:\n             <input type=\"checkbox\" ng-model=\"checkboxModel.value1\">\n           </label><br/>\n           <label>Value2:\n             <input type=\"checkbox\" ng-model=\"checkboxModel.value2\"\n                    ng-true-value=\"'YES'\" ng-false-value=\"'NO'\">\n            </label><br/>\n           <tt>value1 = {{checkboxModel.value1}}</tt><br/>\n           <tt>value2 = {{checkboxModel.value2}}</tt><br/>\n          </form>\n        </file>\n        <file name=\"protractor.js\" type=\"protractor\">\n          it('should change state', function() {\n            var value1 = element(by.binding('checkboxModel.value1'));\n            var value2 = element(by.binding('checkboxModel.value2'));\n\n            expect(value1.getText()).toContain('true');\n            expect(value2.getText()).toContain('YES');\n\n            element(by.model('checkboxModel.value1')).click();\n            element(by.model('checkboxModel.value2')).click();\n\n            expect(value1.getText()).toContain('false');\n            expect(value2.getText()).toContain('NO');\n          });\n        </file>\n      </example>\n   */\n  'checkbox': checkboxInputType,\n\n  'hidden': noop,\n  'button': noop,\n  'submit': noop,\n  'reset': noop,\n  'file': noop\n};\n\nfunction stringBasedInputType(ctrl) {\n  ctrl.$formatters.push(function(value) {\n    return ctrl.$isEmpty(value) ? value : value.toString();\n  });\n}\n\nfunction textInputType(scope, element, attr, ctrl, $sniffer, $browser) {\n  baseInputType(scope, element, attr, ctrl, $sniffer, $browser);\n  stringBasedInputType(ctrl);\n}\n\nfunction baseInputType(scope, element, attr, ctrl, $sniffer, $browser) {\n  var type = lowercase(element[0].type);\n\n  // In composition mode, users are still inputing intermediate text buffer,\n  // hold the listener until composition is done.\n  // More about composition events: https://developer.mozilla.org/en-US/docs/Web/API/CompositionEvent\n  if (!$sniffer.android) {\n    var composing = false;\n\n    element.on('compositionstart', function() {\n      composing = true;\n    });\n\n    element.on('compositionend', function() {\n      composing = false;\n      listener();\n    });\n  }\n\n  var timeout;\n\n  var listener = function(ev) {\n    if (timeout) {\n      $browser.defer.cancel(timeout);\n      timeout = null;\n    }\n    if (composing) return;\n    var value = element.val(),\n        event = ev && ev.type;\n\n    // By default we will trim the value\n    // If the attribute ng-trim exists we will avoid trimming\n    // If input type is 'password', the value is never trimmed\n    if (type !== 'password' && (!attr.ngTrim || attr.ngTrim !== 'false')) {\n      value = trim(value);\n    }\n\n    // If a control is suffering from bad input (due to native validators), browsers discard its\n    // value, so it may be necessary to revalidate (by calling $setViewValue again) even if the\n    // control's value is the same empty value twice in a row.\n    if (ctrl.$viewValue !== value || (value === '' && ctrl.$$hasNativeValidators)) {\n      ctrl.$setViewValue(value, event);\n    }\n  };\n\n  // if the browser does support \"input\" event, we are fine - except on IE9 which doesn't fire the\n  // input event on backspace, delete or cut\n  if ($sniffer.hasEvent('input')) {\n    element.on('input', listener);\n  } else {\n    var deferListener = function(ev, input, origValue) {\n      if (!timeout) {\n        timeout = $browser.defer(function() {\n          timeout = null;\n          if (!input || input.value !== origValue) {\n            listener(ev);\n          }\n        });\n      }\n    };\n\n    element.on('keydown', function(event) {\n      var key = event.keyCode;\n\n      // ignore\n      //    command            modifiers                   arrows\n      if (key === 91 || (15 < key && key < 19) || (37 <= key && key <= 40)) return;\n\n      deferListener(event, this, this.value);\n    });\n\n    // if user modifies input value using context menu in IE, we need \"paste\" and \"cut\" events to catch it\n    if ($sniffer.hasEvent('paste')) {\n      element.on('paste cut', deferListener);\n    }\n  }\n\n  // if user paste into input using mouse on older browser\n  // or form autocomplete on newer browser, we need \"change\" event to catch it\n  element.on('change', listener);\n\n  // Some native input types (date-family) have the ability to change validity without\n  // firing any input/change events.\n  // For these event types, when native validators are present and the browser supports the type,\n  // check for validity changes on various DOM events.\n  if (PARTIAL_VALIDATION_TYPES[type] && ctrl.$$hasNativeValidators && type === attr.type) {\n    element.on(PARTIAL_VALIDATION_EVENTS, function(ev) {\n      if (!timeout) {\n        var validity = this[VALIDITY_STATE_PROPERTY];\n        var origBadInput = validity.badInput;\n        var origTypeMismatch = validity.typeMismatch;\n        timeout = $browser.defer(function() {\n          timeout = null;\n          if (validity.badInput !== origBadInput || validity.typeMismatch !== origTypeMismatch) {\n            listener(ev);\n          }\n        });\n      }\n    });\n  }\n\n  ctrl.$render = function() {\n    // Workaround for Firefox validation #12102.\n    var value = ctrl.$isEmpty(ctrl.$viewValue) ? '' : ctrl.$viewValue;\n    if (element.val() !== value) {\n      element.val(value);\n    }\n  };\n}\n\nfunction weekParser(isoWeek, existingDate) {\n  if (isDate(isoWeek)) {\n    return isoWeek;\n  }\n\n  if (isString(isoWeek)) {\n    WEEK_REGEXP.lastIndex = 0;\n    var parts = WEEK_REGEXP.exec(isoWeek);\n    if (parts) {\n      var year = +parts[1],\n          week = +parts[2],\n          hours = 0,\n          minutes = 0,\n          seconds = 0,\n          milliseconds = 0,\n          firstThurs = getFirstThursdayOfYear(year),\n          addDays = (week - 1) * 7;\n\n      if (existingDate) {\n        hours = existingDate.getHours();\n        minutes = existingDate.getMinutes();\n        seconds = existingDate.getSeconds();\n        milliseconds = existingDate.getMilliseconds();\n      }\n\n      return new Date(year, 0, firstThurs.getDate() + addDays, hours, minutes, seconds, milliseconds);\n    }\n  }\n\n  return NaN;\n}\n\nfunction createDateParser(regexp, mapping) {\n  return function(iso, date) {\n    var parts, map;\n\n    if (isDate(iso)) {\n      return iso;\n    }\n\n    if (isString(iso)) {\n      // When a date is JSON'ified to wraps itself inside of an extra\n      // set of double quotes. This makes the date parsing code unable\n      // to match the date string and parse it as a date.\n      if (iso.charAt(0) == '\"' && iso.charAt(iso.length - 1) == '\"') {\n        iso = iso.substring(1, iso.length - 1);\n      }\n      if (ISO_DATE_REGEXP.test(iso)) {\n        return new Date(iso);\n      }\n      regexp.lastIndex = 0;\n      parts = regexp.exec(iso);\n\n      if (parts) {\n        parts.shift();\n        if (date) {\n          map = {\n            yyyy: date.getFullYear(),\n            MM: date.getMonth() + 1,\n            dd: date.getDate(),\n            HH: date.getHours(),\n            mm: date.getMinutes(),\n            ss: date.getSeconds(),\n            sss: date.getMilliseconds() / 1000\n          };\n        } else {\n          map = { yyyy: 1970, MM: 1, dd: 1, HH: 0, mm: 0, ss: 0, sss: 0 };\n        }\n\n        forEach(parts, function(part, index) {\n          if (index < mapping.length) {\n            map[mapping[index]] = +part;\n          }\n        });\n        return new Date(map.yyyy, map.MM - 1, map.dd, map.HH, map.mm, map.ss || 0, map.sss * 1000 || 0);\n      }\n    }\n\n    return NaN;\n  };\n}\n\nfunction createDateInputType(type, regexp, parseDate, format) {\n  return function dynamicDateInputType(scope, element, attr, ctrl, $sniffer, $browser, $filter) {\n    badInputChecker(scope, element, attr, ctrl);\n    baseInputType(scope, element, attr, ctrl, $sniffer, $browser);\n    var timezone = ctrl && ctrl.$options && ctrl.$options.timezone;\n    var previousDate;\n\n    ctrl.$$parserName = type;\n    ctrl.$parsers.push(function(value) {\n      if (ctrl.$isEmpty(value)) return null;\n      if (regexp.test(value)) {\n        // Note: We cannot read ctrl.$modelValue, as there might be a different\n        // parser/formatter in the processing chain so that the model\n        // contains some different data format!\n        var parsedDate = parseDate(value, previousDate);\n        if (timezone) {\n          parsedDate = convertTimezoneToLocal(parsedDate, timezone);\n        }\n        return parsedDate;\n      }\n      return undefined;\n    });\n\n    ctrl.$formatters.push(function(value) {\n      if (value && !isDate(value)) {\n        throw ngModelMinErr('datefmt', 'Expected `{0}` to be a date', value);\n      }\n      if (isValidDate(value)) {\n        previousDate = value;\n        if (previousDate && timezone) {\n          previousDate = convertTimezoneToLocal(previousDate, timezone, true);\n        }\n        return $filter('date')(value, format, timezone);\n      } else {\n        previousDate = null;\n        return '';\n      }\n    });\n\n    if (isDefined(attr.min) || attr.ngMin) {\n      var minVal;\n      ctrl.$validators.min = function(value) {\n        return !isValidDate(value) || isUndefined(minVal) || parseDate(value) >= minVal;\n      };\n      attr.$observe('min', function(val) {\n        minVal = parseObservedDateValue(val);\n        ctrl.$validate();\n      });\n    }\n\n    if (isDefined(attr.max) || attr.ngMax) {\n      var maxVal;\n      ctrl.$validators.max = function(value) {\n        return !isValidDate(value) || isUndefined(maxVal) || parseDate(value) <= maxVal;\n      };\n      attr.$observe('max', function(val) {\n        maxVal = parseObservedDateValue(val);\n        ctrl.$validate();\n      });\n    }\n\n    function isValidDate(value) {\n      // Invalid Date: getTime() returns NaN\n      return value && !(value.getTime && value.getTime() !== value.getTime());\n    }\n\n    function parseObservedDateValue(val) {\n      return isDefined(val) && !isDate(val) ? parseDate(val) || undefined : val;\n    }\n  };\n}\n\nfunction badInputChecker(scope, element, attr, ctrl) {\n  var node = element[0];\n  var nativeValidation = ctrl.$$hasNativeValidators = isObject(node.validity);\n  if (nativeValidation) {\n    ctrl.$parsers.push(function(value) {\n      var validity = element.prop(VALIDITY_STATE_PROPERTY) || {};\n      return validity.badInput || validity.typeMismatch ? undefined : value;\n    });\n  }\n}\n\nfunction numberInputType(scope, element, attr, ctrl, $sniffer, $browser) {\n  badInputChecker(scope, element, attr, ctrl);\n  baseInputType(scope, element, attr, ctrl, $sniffer, $browser);\n\n  ctrl.$$parserName = 'number';\n  ctrl.$parsers.push(function(value) {\n    if (ctrl.$isEmpty(value))      return null;\n    if (NUMBER_REGEXP.test(value)) return parseFloat(value);\n    return undefined;\n  });\n\n  ctrl.$formatters.push(function(value) {\n    if (!ctrl.$isEmpty(value)) {\n      if (!isNumber(value)) {\n        throw ngModelMinErr('numfmt', 'Expected `{0}` to be a number', value);\n      }\n      value = value.toString();\n    }\n    return value;\n  });\n\n  if (isDefined(attr.min) || attr.ngMin) {\n    var minVal;\n    ctrl.$validators.min = function(value) {\n      return ctrl.$isEmpty(value) || isUndefined(minVal) || value >= minVal;\n    };\n\n    attr.$observe('min', function(val) {\n      if (isDefined(val) && !isNumber(val)) {\n        val = parseFloat(val, 10);\n      }\n      minVal = isNumber(val) && !isNaN(val) ? val : undefined;\n      // TODO(matsko): implement validateLater to reduce number of validations\n      ctrl.$validate();\n    });\n  }\n\n  if (isDefined(attr.max) || attr.ngMax) {\n    var maxVal;\n    ctrl.$validators.max = function(value) {\n      return ctrl.$isEmpty(value) || isUndefined(maxVal) || value <= maxVal;\n    };\n\n    attr.$observe('max', function(val) {\n      if (isDefined(val) && !isNumber(val)) {\n        val = parseFloat(val, 10);\n      }\n      maxVal = isNumber(val) && !isNaN(val) ? val : undefined;\n      // TODO(matsko): implement validateLater to reduce number of validations\n      ctrl.$validate();\n    });\n  }\n}\n\nfunction urlInputType(scope, element, attr, ctrl, $sniffer, $browser) {\n  // Note: no badInputChecker here by purpose as `url` is only a validation\n  // in browsers, i.e. we can always read out input.value even if it is not valid!\n  baseInputType(scope, element, attr, ctrl, $sniffer, $browser);\n  stringBasedInputType(ctrl);\n\n  ctrl.$$parserName = 'url';\n  ctrl.$validators.url = function(modelValue, viewValue) {\n    var value = modelValue || viewValue;\n    return ctrl.$isEmpty(value) || URL_REGEXP.test(value);\n  };\n}\n\nfunction emailInputType(scope, element, attr, ctrl, $sniffer, $browser) {\n  // Note: no badInputChecker here by purpose as `url` is only a validation\n  // in browsers, i.e. we can always read out input.value even if it is not valid!\n  baseInputType(scope, element, attr, ctrl, $sniffer, $browser);\n  stringBasedInputType(ctrl);\n\n  ctrl.$$parserName = 'email';\n  ctrl.$validators.email = function(modelValue, viewValue) {\n    var value = modelValue || viewValue;\n    return ctrl.$isEmpty(value) || EMAIL_REGEXP.test(value);\n  };\n}\n\nfunction radioInputType(scope, element, attr, ctrl) {\n  // make the name unique, if not defined\n  if (isUndefined(attr.name)) {\n    element.attr('name', nextUid());\n  }\n\n  var listener = function(ev) {\n    if (element[0].checked) {\n      ctrl.$setViewValue(attr.value, ev && ev.type);\n    }\n  };\n\n  element.on('click', listener);\n\n  ctrl.$render = function() {\n    var value = attr.value;\n    element[0].checked = (value == ctrl.$viewValue);\n  };\n\n  attr.$observe('value', ctrl.$render);\n}\n\nfunction parseConstantExpr($parse, context, name, expression, fallback) {\n  var parseFn;\n  if (isDefined(expression)) {\n    parseFn = $parse(expression);\n    if (!parseFn.constant) {\n      throw ngModelMinErr('constexpr', 'Expected constant expression for `{0}`, but saw ' +\n                                   '`{1}`.', name, expression);\n    }\n    return parseFn(context);\n  }\n  return fallback;\n}\n\nfunction checkboxInputType(scope, element, attr, ctrl, $sniffer, $browser, $filter, $parse) {\n  var trueValue = parseConstantExpr($parse, scope, 'ngTrueValue', attr.ngTrueValue, true);\n  var falseValue = parseConstantExpr($parse, scope, 'ngFalseValue', attr.ngFalseValue, false);\n\n  var listener = function(ev) {\n    ctrl.$setViewValue(element[0].checked, ev && ev.type);\n  };\n\n  element.on('click', listener);\n\n  ctrl.$render = function() {\n    element[0].checked = ctrl.$viewValue;\n  };\n\n  // Override the standard `$isEmpty` because the $viewValue of an empty checkbox is always set to `false`\n  // This is because of the parser below, which compares the `$modelValue` with `trueValue` to convert\n  // it to a boolean.\n  ctrl.$isEmpty = function(value) {\n    return value === false;\n  };\n\n  ctrl.$formatters.push(function(value) {\n    return equals(value, trueValue);\n  });\n\n  ctrl.$parsers.push(function(value) {\n    return value ? trueValue : falseValue;\n  });\n}\n\n\n/**\n * @ngdoc directive\n * @name textarea\n * @restrict E\n *\n * @description\n * HTML textarea element control with angular data-binding. The data-binding and validation\n * properties of this element are exactly the same as those of the\n * {@link ng.directive:input input element}.\n *\n * @param {string} ngModel Assignable angular expression to data-bind to.\n * @param {string=} name Property name of the form under which the control is published.\n * @param {string=} required Sets `required` validation error key if the value is not entered.\n * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to\n *    the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of\n *    `required` when you want to data-bind to the `required` attribute.\n * @param {number=} ngMinlength Sets `minlength` validation error key if the value is shorter than\n *    minlength.\n * @param {number=} ngMaxlength Sets `maxlength` validation error key if the value is longer than\n *    maxlength. Setting the attribute to a negative or non-numeric value, allows view values of any\n *    length.\n * @param {string=} ngPattern Sets `pattern` validation error key if the ngModel {@link ngModel.NgModelController#$viewValue $viewValue}\n *    does not match a RegExp found by evaluating the Angular expression given in the attribute value.\n *    If the expression evaluates to a RegExp object, then this is used directly.\n *    If the expression evaluates to a string, then it will be converted to a RegExp\n *    after wrapping it in `^` and `$` characters. For instance, `\"abc\"` will be converted to\n *    `new RegExp('^abc$')`.<br />\n *    **Note:** Avoid using the `g` flag on the RegExp, as it will cause each successive search to\n *    start at the index of the last search's match, thus not taking the whole input value into\n *    account.\n * @param {string=} ngChange Angular expression to be executed when input changes due to user\n *    interaction with the input element.\n * @param {boolean=} [ngTrim=true] If set to false Angular will not automatically trim the input.\n */\n\n\n/**\n * @ngdoc directive\n * @name input\n * @restrict E\n *\n * @description\n * HTML input element control. When used together with {@link ngModel `ngModel`}, it provides data-binding,\n * input state control, and validation.\n * Input control follows HTML5 input types and polyfills the HTML5 validation behavior for older browsers.\n *\n * <div class=\"alert alert-warning\">\n * **Note:** Not every feature offered is available for all input types.\n * Specifically, data binding and event handling via `ng-model` is unsupported for `input[file]`.\n * </div>\n *\n * @param {string} ngModel Assignable angular expression to data-bind to.\n * @param {string=} name Property name of the form under which the control is published.\n * @param {string=} required Sets `required` validation error key if the value is not entered.\n * @param {boolean=} ngRequired Sets `required` attribute if set to true\n * @param {number=} ngMinlength Sets `minlength` validation error key if the value is shorter than\n *    minlength.\n * @param {number=} ngMaxlength Sets `maxlength` validation error key if the value is longer than\n *    maxlength. Setting the attribute to a negative or non-numeric value, allows view values of any\n *    length.\n * @param {string=} ngPattern Sets `pattern` validation error key if the ngModel {@link ngModel.NgModelController#$viewValue $viewValue}\n *    value does not match a RegExp found by evaluating the Angular expression given in the attribute value.\n *    If the expression evaluates to a RegExp object, then this is used directly.\n *    If the expression evaluates to a string, then it will be converted to a RegExp\n *    after wrapping it in `^` and `$` characters. For instance, `\"abc\"` will be converted to\n *    `new RegExp('^abc$')`.<br />\n *    **Note:** Avoid using the `g` flag on the RegExp, as it will cause each successive search to\n *    start at the index of the last search's match, thus not taking the whole input value into\n *    account.\n * @param {string=} ngChange Angular expression to be executed when input changes due to user\n *    interaction with the input element.\n * @param {boolean=} [ngTrim=true] If set to false Angular will not automatically trim the input.\n *    This parameter is ignored for input[type=password] controls, which will never trim the\n *    input.\n *\n * @example\n    <example name=\"input-directive\" module=\"inputExample\">\n      <file name=\"index.html\">\n       <script>\n          angular.module('inputExample', [])\n            .controller('ExampleController', ['$scope', function($scope) {\n              $scope.user = {name: 'guest', last: 'visitor'};\n            }]);\n       </script>\n       <div ng-controller=\"ExampleController\">\n         <form name=\"myForm\">\n           <label>\n              User name:\n              <input type=\"text\" name=\"userName\" ng-model=\"user.name\" required>\n           </label>\n           <div role=\"alert\">\n             <span class=\"error\" ng-show=\"myForm.userName.$error.required\">\n              Required!</span>\n           </div>\n           <label>\n              Last name:\n              <input type=\"text\" name=\"lastName\" ng-model=\"user.last\"\n              ng-minlength=\"3\" ng-maxlength=\"10\">\n           </label>\n           <div role=\"alert\">\n             <span class=\"error\" ng-show=\"myForm.lastName.$error.minlength\">\n               Too short!</span>\n             <span class=\"error\" ng-show=\"myForm.lastName.$error.maxlength\">\n               Too long!</span>\n           </div>\n         </form>\n         <hr>\n         <tt>user = {{user}}</tt><br/>\n         <tt>myForm.userName.$valid = {{myForm.userName.$valid}}</tt><br/>\n         <tt>myForm.userName.$error = {{myForm.userName.$error}}</tt><br/>\n         <tt>myForm.lastName.$valid = {{myForm.lastName.$valid}}</tt><br/>\n         <tt>myForm.lastName.$error = {{myForm.lastName.$error}}</tt><br/>\n         <tt>myForm.$valid = {{myForm.$valid}}</tt><br/>\n         <tt>myForm.$error.required = {{!!myForm.$error.required}}</tt><br/>\n         <tt>myForm.$error.minlength = {{!!myForm.$error.minlength}}</tt><br/>\n         <tt>myForm.$error.maxlength = {{!!myForm.$error.maxlength}}</tt><br/>\n       </div>\n      </file>\n      <file name=\"protractor.js\" type=\"protractor\">\n        var user = element(by.exactBinding('user'));\n        var userNameValid = element(by.binding('myForm.userName.$valid'));\n        var lastNameValid = element(by.binding('myForm.lastName.$valid'));\n        var lastNameError = element(by.binding('myForm.lastName.$error'));\n        var formValid = element(by.binding('myForm.$valid'));\n        var userNameInput = element(by.model('user.name'));\n        var userLastInput = element(by.model('user.last'));\n\n        it('should initialize to model', function() {\n          expect(user.getText()).toContain('{\"name\":\"guest\",\"last\":\"visitor\"}');\n          expect(userNameValid.getText()).toContain('true');\n          expect(formValid.getText()).toContain('true');\n        });\n\n        it('should be invalid if empty when required', function() {\n          userNameInput.clear();\n          userNameInput.sendKeys('');\n\n          expect(user.getText()).toContain('{\"last\":\"visitor\"}');\n          expect(userNameValid.getText()).toContain('false');\n          expect(formValid.getText()).toContain('false');\n        });\n\n        it('should be valid if empty when min length is set', function() {\n          userLastInput.clear();\n          userLastInput.sendKeys('');\n\n          expect(user.getText()).toContain('{\"name\":\"guest\",\"last\":\"\"}');\n          expect(lastNameValid.getText()).toContain('true');\n          expect(formValid.getText()).toContain('true');\n        });\n\n        it('should be invalid if less than required min length', function() {\n          userLastInput.clear();\n          userLastInput.sendKeys('xx');\n\n          expect(user.getText()).toContain('{\"name\":\"guest\"}');\n          expect(lastNameValid.getText()).toContain('false');\n          expect(lastNameError.getText()).toContain('minlength');\n          expect(formValid.getText()).toContain('false');\n        });\n\n        it('should be invalid if longer than max length', function() {\n          userLastInput.clear();\n          userLastInput.sendKeys('some ridiculously long name');\n\n          expect(user.getText()).toContain('{\"name\":\"guest\"}');\n          expect(lastNameValid.getText()).toContain('false');\n          expect(lastNameError.getText()).toContain('maxlength');\n          expect(formValid.getText()).toContain('false');\n        });\n      </file>\n    </example>\n */\nvar inputDirective = ['$browser', '$sniffer', '$filter', '$parse',\n    function($browser, $sniffer, $filter, $parse) {\n  return {\n    restrict: 'E',\n    require: ['?ngModel'],\n    link: {\n      pre: function(scope, element, attr, ctrls) {\n        if (ctrls[0]) {\n          (inputType[lowercase(attr.type)] || inputType.text)(scope, element, attr, ctrls[0], $sniffer,\n                                                              $browser, $filter, $parse);\n        }\n      }\n    }\n  };\n}];\n\n\n\nvar CONSTANT_VALUE_REGEXP = /^(true|false|\\d+)$/;\n/**\n * @ngdoc directive\n * @name ngValue\n *\n * @description\n * Binds the given expression to the value of `<option>` or {@link input[radio] `input[radio]`},\n * so that when the element is selected, the {@link ngModel `ngModel`} of that element is set to\n * the bound value.\n *\n * `ngValue` is useful when dynamically generating lists of radio buttons using\n * {@link ngRepeat `ngRepeat`}, as shown below.\n *\n * Likewise, `ngValue` can be used to generate `<option>` elements for\n * the {@link select `select`} element. In that case however, only strings are supported\n * for the `value `attribute, so the resulting `ngModel` will always be a string.\n * Support for `select` models with non-string values is available via `ngOptions`.\n *\n * @element input\n * @param {string=} ngValue angular expression, whose value will be bound to the `value` attribute\n *   of the `input` element\n *\n * @example\n    <example name=\"ngValue-directive\" module=\"valueExample\">\n      <file name=\"index.html\">\n       <script>\n          angular.module('valueExample', [])\n            .controller('ExampleController', ['$scope', function($scope) {\n              $scope.names = ['pizza', 'unicorns', 'robots'];\n              $scope.my = { favorite: 'unicorns' };\n            }]);\n       </script>\n        <form ng-controller=\"ExampleController\">\n          <h2>Which is your favorite?</h2>\n            <label ng-repeat=\"name in names\" for=\"{{name}}\">\n              {{name}}\n              <input type=\"radio\"\n                     ng-model=\"my.favorite\"\n                     ng-value=\"name\"\n                     id=\"{{name}}\"\n                     name=\"favorite\">\n            </label>\n          <div>You chose {{my.favorite}}</div>\n        </form>\n      </file>\n      <file name=\"protractor.js\" type=\"protractor\">\n        var favorite = element(by.binding('my.favorite'));\n\n        it('should initialize to model', function() {\n          expect(favorite.getText()).toContain('unicorns');\n        });\n        it('should bind the values to the inputs', function() {\n          element.all(by.model('my.favorite')).get(0).click();\n          expect(favorite.getText()).toContain('pizza');\n        });\n      </file>\n    </example>\n */\nvar ngValueDirective = function() {\n  return {\n    restrict: 'A',\n    priority: 100,\n    compile: function(tpl, tplAttr) {\n      if (CONSTANT_VALUE_REGEXP.test(tplAttr.ngValue)) {\n        return function ngValueConstantLink(scope, elm, attr) {\n          attr.$set('value', scope.$eval(attr.ngValue));\n        };\n      } else {\n        return function ngValueLink(scope, elm, attr) {\n          scope.$watch(attr.ngValue, function valueWatchAction(value) {\n            attr.$set('value', value);\n          });\n        };\n      }\n    }\n  };\n};\n\n/**\n * @ngdoc directive\n * @name ngBind\n * @restrict AC\n *\n * @description\n * The `ngBind` attribute tells Angular to replace the text content of the specified HTML element\n * with the value of a given expression, and to update the text content when the value of that\n * expression changes.\n *\n * Typically, you don't use `ngBind` directly, but instead you use the double curly markup like\n * `{{ expression }}` which is similar but less verbose.\n *\n * It is preferable to use `ngBind` instead of `{{ expression }}` if a template is momentarily\n * displayed by the browser in its raw state before Angular compiles it. Since `ngBind` is an\n * element attribute, it makes the bindings invisible to the user while the page is loading.\n *\n * An alternative solution to this problem would be using the\n * {@link ng.directive:ngCloak ngCloak} directive.\n *\n *\n * @element ANY\n * @param {expression} ngBind {@link guide/expression Expression} to evaluate.\n *\n * @example\n * Enter a name in the Live Preview text box; the greeting below the text box changes instantly.\n   <example module=\"bindExample\">\n     <file name=\"index.html\">\n       <script>\n         angular.module('bindExample', [])\n           .controller('ExampleController', ['$scope', function($scope) {\n             $scope.name = 'Whirled';\n           }]);\n       </script>\n       <div ng-controller=\"ExampleController\">\n         <label>Enter name: <input type=\"text\" ng-model=\"name\"></label><br>\n         Hello <span ng-bind=\"name\"></span>!\n       </div>\n     </file>\n     <file name=\"protractor.js\" type=\"protractor\">\n       it('should check ng-bind', function() {\n         var nameInput = element(by.model('name'));\n\n         expect(element(by.binding('name')).getText()).toBe('Whirled');\n         nameInput.clear();\n         nameInput.sendKeys('world');\n         expect(element(by.binding('name')).getText()).toBe('world');\n       });\n     </file>\n   </example>\n */\nvar ngBindDirective = ['$compile', function($compile) {\n  return {\n    restrict: 'AC',\n    compile: function ngBindCompile(templateElement) {\n      $compile.$$addBindingClass(templateElement);\n      return function ngBindLink(scope, element, attr) {\n        $compile.$$addBindingInfo(element, attr.ngBind);\n        element = element[0];\n        scope.$watch(attr.ngBind, function ngBindWatchAction(value) {\n          element.textContent = isUndefined(value) ? '' : value;\n        });\n      };\n    }\n  };\n}];\n\n\n/**\n * @ngdoc directive\n * @name ngBindTemplate\n *\n * @description\n * The `ngBindTemplate` directive specifies that the element\n * text content should be replaced with the interpolation of the template\n * in the `ngBindTemplate` attribute.\n * Unlike `ngBind`, the `ngBindTemplate` can contain multiple `{{` `}}`\n * expressions. This directive is needed since some HTML elements\n * (such as TITLE and OPTION) cannot contain SPAN elements.\n *\n * @element ANY\n * @param {string} ngBindTemplate template of form\n *   <tt>{{</tt> <tt>expression</tt> <tt>}}</tt> to eval.\n *\n * @example\n * Try it here: enter text in text box and watch the greeting change.\n   <example module=\"bindExample\">\n     <file name=\"index.html\">\n       <script>\n         angular.module('bindExample', [])\n           .controller('ExampleController', ['$scope', function($scope) {\n             $scope.salutation = 'Hello';\n             $scope.name = 'World';\n           }]);\n       </script>\n       <div ng-controller=\"ExampleController\">\n        <label>Salutation: <input type=\"text\" ng-model=\"salutation\"></label><br>\n        <label>Name: <input type=\"text\" ng-model=\"name\"></label><br>\n        <pre ng-bind-template=\"{{salutation}} {{name}}!\"></pre>\n       </div>\n     </file>\n     <file name=\"protractor.js\" type=\"protractor\">\n       it('should check ng-bind', function() {\n         var salutationElem = element(by.binding('salutation'));\n         var salutationInput = element(by.model('salutation'));\n         var nameInput = element(by.model('name'));\n\n         expect(salutationElem.getText()).toBe('Hello World!');\n\n         salutationInput.clear();\n         salutationInput.sendKeys('Greetings');\n         nameInput.clear();\n         nameInput.sendKeys('user');\n\n         expect(salutationElem.getText()).toBe('Greetings user!');\n       });\n     </file>\n   </example>\n */\nvar ngBindTemplateDirective = ['$interpolate', '$compile', function($interpolate, $compile) {\n  return {\n    compile: function ngBindTemplateCompile(templateElement) {\n      $compile.$$addBindingClass(templateElement);\n      return function ngBindTemplateLink(scope, element, attr) {\n        var interpolateFn = $interpolate(element.attr(attr.$attr.ngBindTemplate));\n        $compile.$$addBindingInfo(element, interpolateFn.expressions);\n        element = element[0];\n        attr.$observe('ngBindTemplate', function(value) {\n          element.textContent = isUndefined(value) ? '' : value;\n        });\n      };\n    }\n  };\n}];\n\n\n/**\n * @ngdoc directive\n * @name ngBindHtml\n *\n * @description\n * Evaluates the expression and inserts the resulting HTML into the element in a secure way. By default,\n * the resulting HTML content will be sanitized using the {@link ngSanitize.$sanitize $sanitize} service.\n * To utilize this functionality, ensure that `$sanitize` is available, for example, by including {@link\n * ngSanitize} in your module's dependencies (not in core Angular). In order to use {@link ngSanitize}\n * in your module's dependencies, you need to include \"angular-sanitize.js\" in your application.\n *\n * You may also bypass sanitization for values you know are safe. To do so, bind to\n * an explicitly trusted value via {@link ng.$sce#trustAsHtml $sce.trustAsHtml}.  See the example\n * under {@link ng.$sce#show-me-an-example-using-sce- Strict Contextual Escaping (SCE)}.\n *\n * Note: If a `$sanitize` service is unavailable and the bound value isn't explicitly trusted, you\n * will have an exception (instead of an exploit.)\n *\n * @element ANY\n * @param {expression} ngBindHtml {@link guide/expression Expression} to evaluate.\n *\n * @example\n\n   <example module=\"bindHtmlExample\" deps=\"angular-sanitize.js\">\n     <file name=\"index.html\">\n       <div ng-controller=\"ExampleController\">\n        <p ng-bind-html=\"myHTML\"></p>\n       </div>\n     </file>\n\n     <file name=\"script.js\">\n       angular.module('bindHtmlExample', ['ngSanitize'])\n         .controller('ExampleController', ['$scope', function($scope) {\n           $scope.myHTML =\n              'I am an <code>HTML</code>string with ' +\n              '<a href=\"#\">links!</a> and other <em>stuff</em>';\n         }]);\n     </file>\n\n     <file name=\"protractor.js\" type=\"protractor\">\n       it('should check ng-bind-html', function() {\n         expect(element(by.binding('myHTML')).getText()).toBe(\n             'I am an HTMLstring with links! and other stuff');\n       });\n     </file>\n   </example>\n */\nvar ngBindHtmlDirective = ['$sce', '$parse', '$compile', function($sce, $parse, $compile) {\n  return {\n    restrict: 'A',\n    compile: function ngBindHtmlCompile(tElement, tAttrs) {\n      var ngBindHtmlGetter = $parse(tAttrs.ngBindHtml);\n      var ngBindHtmlWatch = $parse(tAttrs.ngBindHtml, function getStringValue(value) {\n        return (value || '').toString();\n      });\n      $compile.$$addBindingClass(tElement);\n\n      return function ngBindHtmlLink(scope, element, attr) {\n        $compile.$$addBindingInfo(element, attr.ngBindHtml);\n\n        scope.$watch(ngBindHtmlWatch, function ngBindHtmlWatchAction() {\n          // we re-evaluate the expr because we want a TrustedValueHolderType\n          // for $sce, not a string\n          element.html($sce.getTrustedHtml(ngBindHtmlGetter(scope)) || '');\n        });\n      };\n    }\n  };\n}];\n\n/**\n * @ngdoc directive\n * @name ngChange\n *\n * @description\n * Evaluate the given expression when the user changes the input.\n * The expression is evaluated immediately, unlike the JavaScript onchange event\n * which only triggers at the end of a change (usually, when the user leaves the\n * form element or presses the return key).\n *\n * The `ngChange` expression is only evaluated when a change in the input value causes\n * a new value to be committed to the model.\n *\n * It will not be evaluated:\n * * if the value returned from the `$parsers` transformation pipeline has not changed\n * * if the input has continued to be invalid since the model will stay `null`\n * * if the model is changed programmatically and not by a change to the input value\n *\n *\n * Note, this directive requires `ngModel` to be present.\n *\n * @element input\n * @param {expression} ngChange {@link guide/expression Expression} to evaluate upon change\n * in input value.\n *\n * @example\n * <example name=\"ngChange-directive\" module=\"changeExample\">\n *   <file name=\"index.html\">\n *     <script>\n *       angular.module('changeExample', [])\n *         .controller('ExampleController', ['$scope', function($scope) {\n *           $scope.counter = 0;\n *           $scope.change = function() {\n *             $scope.counter++;\n *           };\n *         }]);\n *     </script>\n *     <div ng-controller=\"ExampleController\">\n *       <input type=\"checkbox\" ng-model=\"confirmed\" ng-change=\"change()\" id=\"ng-change-example1\" />\n *       <input type=\"checkbox\" ng-model=\"confirmed\" id=\"ng-change-example2\" />\n *       <label for=\"ng-change-example2\">Confirmed</label><br />\n *       <tt>debug = {{confirmed}}</tt><br/>\n *       <tt>counter = {{counter}}</tt><br/>\n *     </div>\n *   </file>\n *   <file name=\"protractor.js\" type=\"protractor\">\n *     var counter = element(by.binding('counter'));\n *     var debug = element(by.binding('confirmed'));\n *\n *     it('should evaluate the expression if changing from view', function() {\n *       expect(counter.getText()).toContain('0');\n *\n *       element(by.id('ng-change-example1')).click();\n *\n *       expect(counter.getText()).toContain('1');\n *       expect(debug.getText()).toContain('true');\n *     });\n *\n *     it('should not evaluate the expression if changing from model', function() {\n *       element(by.id('ng-change-example2')).click();\n\n *       expect(counter.getText()).toContain('0');\n *       expect(debug.getText()).toContain('true');\n *     });\n *   </file>\n * </example>\n */\nvar ngChangeDirective = valueFn({\n  restrict: 'A',\n  require: 'ngModel',\n  link: function(scope, element, attr, ctrl) {\n    ctrl.$viewChangeListeners.push(function() {\n      scope.$eval(attr.ngChange);\n    });\n  }\n});\n\nfunction classDirective(name, selector) {\n  name = 'ngClass' + name;\n  return ['$animate', function($animate) {\n    return {\n      restrict: 'AC',\n      link: function(scope, element, attr) {\n        var oldVal;\n\n        scope.$watch(attr[name], ngClassWatchAction, true);\n\n        attr.$observe('class', function(value) {\n          ngClassWatchAction(scope.$eval(attr[name]));\n        });\n\n\n        if (name !== 'ngClass') {\n          scope.$watch('$index', function($index, old$index) {\n            // jshint bitwise: false\n            var mod = $index & 1;\n            if (mod !== (old$index & 1)) {\n              var classes = arrayClasses(scope.$eval(attr[name]));\n              mod === selector ?\n                addClasses(classes) :\n                removeClasses(classes);\n            }\n          });\n        }\n\n        function addClasses(classes) {\n          var newClasses = digestClassCounts(classes, 1);\n          attr.$addClass(newClasses);\n        }\n\n        function removeClasses(classes) {\n          var newClasses = digestClassCounts(classes, -1);\n          attr.$removeClass(newClasses);\n        }\n\n        function digestClassCounts(classes, count) {\n          // Use createMap() to prevent class assumptions involving property\n          // names in Object.prototype\n          var classCounts = element.data('$classCounts') || createMap();\n          var classesToUpdate = [];\n          forEach(classes, function(className) {\n            if (count > 0 || classCounts[className]) {\n              classCounts[className] = (classCounts[className] || 0) + count;\n              if (classCounts[className] === +(count > 0)) {\n                classesToUpdate.push(className);\n              }\n            }\n          });\n          element.data('$classCounts', classCounts);\n          return classesToUpdate.join(' ');\n        }\n\n        function updateClasses(oldClasses, newClasses) {\n          var toAdd = arrayDifference(newClasses, oldClasses);\n          var toRemove = arrayDifference(oldClasses, newClasses);\n          toAdd = digestClassCounts(toAdd, 1);\n          toRemove = digestClassCounts(toRemove, -1);\n          if (toAdd && toAdd.length) {\n            $animate.addClass(element, toAdd);\n          }\n          if (toRemove && toRemove.length) {\n            $animate.removeClass(element, toRemove);\n          }\n        }\n\n        function ngClassWatchAction(newVal) {\n          if (selector === true || scope.$index % 2 === selector) {\n            var newClasses = arrayClasses(newVal || []);\n            if (!oldVal) {\n              addClasses(newClasses);\n            } else if (!equals(newVal,oldVal)) {\n              var oldClasses = arrayClasses(oldVal);\n              updateClasses(oldClasses, newClasses);\n            }\n          }\n          if (isArray(newVal)) {\n            oldVal = newVal.map(function(v) { return shallowCopy(v); });\n          } else {\n            oldVal = shallowCopy(newVal);\n          }\n        }\n      }\n    };\n\n    function arrayDifference(tokens1, tokens2) {\n      var values = [];\n\n      outer:\n      for (var i = 0; i < tokens1.length; i++) {\n        var token = tokens1[i];\n        for (var j = 0; j < tokens2.length; j++) {\n          if (token == tokens2[j]) continue outer;\n        }\n        values.push(token);\n      }\n      return values;\n    }\n\n    function arrayClasses(classVal) {\n      var classes = [];\n      if (isArray(classVal)) {\n        forEach(classVal, function(v) {\n          classes = classes.concat(arrayClasses(v));\n        });\n        return classes;\n      } else if (isString(classVal)) {\n        return classVal.split(' ');\n      } else if (isObject(classVal)) {\n        forEach(classVal, function(v, k) {\n          if (v) {\n            classes = classes.concat(k.split(' '));\n          }\n        });\n        return classes;\n      }\n      return classVal;\n    }\n  }];\n}\n\n/**\n * @ngdoc directive\n * @name ngClass\n * @restrict AC\n *\n * @description\n * The `ngClass` directive allows you to dynamically set CSS classes on an HTML element by databinding\n * an expression that represents all classes to be added.\n *\n * The directive operates in three different ways, depending on which of three types the expression\n * evaluates to:\n *\n * 1. If the expression evaluates to a string, the string should be one or more space-delimited class\n * names.\n *\n * 2. If the expression evaluates to an object, then for each key-value pair of the\n * object with a truthy value the corresponding key is used as a class name.\n *\n * 3. If the expression evaluates to an array, each element of the array should either be a string as in\n * type 1 or an object as in type 2. This means that you can mix strings and objects together in an array\n * to give you more control over what CSS classes appear. See the code below for an example of this.\n *\n *\n * The directive won't add duplicate classes if a particular class was already set.\n *\n * When the expression changes, the previously added classes are removed and only then are the\n * new classes added.\n *\n * @animations\n * | Animation                        | Occurs                              |\n * |----------------------------------|-------------------------------------|\n * | {@link ng.$animate#addClass addClass}       | just before the class is applied to the element   |\n * | {@link ng.$animate#removeClass removeClass} | just before the class is removed from the element |\n *\n * @element ANY\n * @param {expression} ngClass {@link guide/expression Expression} to eval. The result\n *   of the evaluation can be a string representing space delimited class\n *   names, an array, or a map of class names to boolean values. In the case of a map, the\n *   names of the properties whose values are truthy will be added as css classes to the\n *   element.\n *\n * @example Example that demonstrates basic bindings via ngClass directive.\n   <example>\n     <file name=\"index.html\">\n       <p ng-class=\"{strike: deleted, bold: important, 'has-error': error}\">Map Syntax Example</p>\n       <label>\n          <input type=\"checkbox\" ng-model=\"deleted\">\n          deleted (apply \"strike\" class)\n       </label><br>\n       <label>\n          <input type=\"checkbox\" ng-model=\"important\">\n          important (apply \"bold\" class)\n       </label><br>\n       <label>\n          <input type=\"checkbox\" ng-model=\"error\">\n          error (apply \"has-error\" class)\n       </label>\n       <hr>\n       <p ng-class=\"style\">Using String Syntax</p>\n       <input type=\"text\" ng-model=\"style\"\n              placeholder=\"Type: bold strike red\" aria-label=\"Type: bold strike red\">\n       <hr>\n       <p ng-class=\"[style1, style2, style3]\">Using Array Syntax</p>\n       <input ng-model=\"style1\"\n              placeholder=\"Type: bold, strike or red\" aria-label=\"Type: bold, strike or red\"><br>\n       <input ng-model=\"style2\"\n              placeholder=\"Type: bold, strike or red\" aria-label=\"Type: bold, strike or red 2\"><br>\n       <input ng-model=\"style3\"\n              placeholder=\"Type: bold, strike or red\" aria-label=\"Type: bold, strike or red 3\"><br>\n       <hr>\n       <p ng-class=\"[style4, {orange: warning}]\">Using Array and Map Syntax</p>\n       <input ng-model=\"style4\" placeholder=\"Type: bold, strike\" aria-label=\"Type: bold, strike\"><br>\n       <label><input type=\"checkbox\" ng-model=\"warning\"> warning (apply \"orange\" class)</label>\n     </file>\n     <file name=\"style.css\">\n       .strike {\n           text-decoration: line-through;\n       }\n       .bold {\n           font-weight: bold;\n       }\n       .red {\n           color: red;\n       }\n       .has-error {\n           color: red;\n           background-color: yellow;\n       }\n       .orange {\n           color: orange;\n       }\n     </file>\n     <file name=\"protractor.js\" type=\"protractor\">\n       var ps = element.all(by.css('p'));\n\n       it('should let you toggle the class', function() {\n\n         expect(ps.first().getAttribute('class')).not.toMatch(/bold/);\n         expect(ps.first().getAttribute('class')).not.toMatch(/has-error/);\n\n         element(by.model('important')).click();\n         expect(ps.first().getAttribute('class')).toMatch(/bold/);\n\n         element(by.model('error')).click();\n         expect(ps.first().getAttribute('class')).toMatch(/has-error/);\n       });\n\n       it('should let you toggle string example', function() {\n         expect(ps.get(1).getAttribute('class')).toBe('');\n         element(by.model('style')).clear();\n         element(by.model('style')).sendKeys('red');\n         expect(ps.get(1).getAttribute('class')).toBe('red');\n       });\n\n       it('array example should have 3 classes', function() {\n         expect(ps.get(2).getAttribute('class')).toBe('');\n         element(by.model('style1')).sendKeys('bold');\n         element(by.model('style2')).sendKeys('strike');\n         element(by.model('style3')).sendKeys('red');\n         expect(ps.get(2).getAttribute('class')).toBe('bold strike red');\n       });\n\n       it('array with map example should have 2 classes', function() {\n         expect(ps.last().getAttribute('class')).toBe('');\n         element(by.model('style4')).sendKeys('bold');\n         element(by.model('warning')).click();\n         expect(ps.last().getAttribute('class')).toBe('bold orange');\n       });\n     </file>\n   </example>\n\n   ## Animations\n\n   The example below demonstrates how to perform animations using ngClass.\n\n   <example module=\"ngAnimate\" deps=\"angular-animate.js\" animations=\"true\">\n     <file name=\"index.html\">\n      <input id=\"setbtn\" type=\"button\" value=\"set\" ng-click=\"myVar='my-class'\">\n      <input id=\"clearbtn\" type=\"button\" value=\"clear\" ng-click=\"myVar=''\">\n      <br>\n      <span class=\"base-class\" ng-class=\"myVar\">Sample Text</span>\n     </file>\n     <file name=\"style.css\">\n       .base-class {\n         transition:all cubic-bezier(0.250, 0.460, 0.450, 0.940) 0.5s;\n       }\n\n       .base-class.my-class {\n         color: red;\n         font-size:3em;\n       }\n     </file>\n     <file name=\"protractor.js\" type=\"protractor\">\n       it('should check ng-class', function() {\n         expect(element(by.css('.base-class')).getAttribute('class')).not.\n           toMatch(/my-class/);\n\n         element(by.id('setbtn')).click();\n\n         expect(element(by.css('.base-class')).getAttribute('class')).\n           toMatch(/my-class/);\n\n         element(by.id('clearbtn')).click();\n\n         expect(element(by.css('.base-class')).getAttribute('class')).not.\n           toMatch(/my-class/);\n       });\n     </file>\n   </example>\n\n\n   ## ngClass and pre-existing CSS3 Transitions/Animations\n   The ngClass directive still supports CSS3 Transitions/Animations even if they do not follow the ngAnimate CSS naming structure.\n   Upon animation ngAnimate will apply supplementary CSS classes to track the start and end of an animation, but this will not hinder\n   any pre-existing CSS transitions already on the element. To get an idea of what happens during a class-based animation, be sure\n   to view the step by step details of {@link $animate#addClass $animate.addClass} and\n   {@link $animate#removeClass $animate.removeClass}.\n */\nvar ngClassDirective = classDirective('', true);\n\n/**\n * @ngdoc directive\n * @name ngClassOdd\n * @restrict AC\n *\n * @description\n * The `ngClassOdd` and `ngClassEven` directives work exactly as\n * {@link ng.directive:ngClass ngClass}, except they work in\n * conjunction with `ngRepeat` and take effect only on odd (even) rows.\n *\n * This directive can be applied only within the scope of an\n * {@link ng.directive:ngRepeat ngRepeat}.\n *\n * @element ANY\n * @param {expression} ngClassOdd {@link guide/expression Expression} to eval. The result\n *   of the evaluation can be a string representing space delimited class names or an array.\n *\n * @example\n   <example>\n     <file name=\"index.html\">\n        <ol ng-init=\"names=['John', 'Mary', 'Cate', 'Suz']\">\n          <li ng-repeat=\"name in names\">\n           <span ng-class-odd=\"'odd'\" ng-class-even=\"'even'\">\n             {{name}}\n           </span>\n          </li>\n        </ol>\n     </file>\n     <file name=\"style.css\">\n       .odd {\n         color: red;\n       }\n       .even {\n         color: blue;\n       }\n     </file>\n     <file name=\"protractor.js\" type=\"protractor\">\n       it('should check ng-class-odd and ng-class-even', function() {\n         expect(element(by.repeater('name in names').row(0).column('name')).getAttribute('class')).\n           toMatch(/odd/);\n         expect(element(by.repeater('name in names').row(1).column('name')).getAttribute('class')).\n           toMatch(/even/);\n       });\n     </file>\n   </example>\n */\nvar ngClassOddDirective = classDirective('Odd', 0);\n\n/**\n * @ngdoc directive\n * @name ngClassEven\n * @restrict AC\n *\n * @description\n * The `ngClassOdd` and `ngClassEven` directives work exactly as\n * {@link ng.directive:ngClass ngClass}, except they work in\n * conjunction with `ngRepeat` and take effect only on odd (even) rows.\n *\n * This directive can be applied only within the scope of an\n * {@link ng.directive:ngRepeat ngRepeat}.\n *\n * @element ANY\n * @param {expression} ngClassEven {@link guide/expression Expression} to eval. The\n *   result of the evaluation can be a string representing space delimited class names or an array.\n *\n * @example\n   <example>\n     <file name=\"index.html\">\n        <ol ng-init=\"names=['John', 'Mary', 'Cate', 'Suz']\">\n          <li ng-repeat=\"name in names\">\n           <span ng-class-odd=\"'odd'\" ng-class-even=\"'even'\">\n             {{name}} &nbsp; &nbsp; &nbsp;\n           </span>\n          </li>\n        </ol>\n     </file>\n     <file name=\"style.css\">\n       .odd {\n         color: red;\n       }\n       .even {\n         color: blue;\n       }\n     </file>\n     <file name=\"protractor.js\" type=\"protractor\">\n       it('should check ng-class-odd and ng-class-even', function() {\n         expect(element(by.repeater('name in names').row(0).column('name')).getAttribute('class')).\n           toMatch(/odd/);\n         expect(element(by.repeater('name in names').row(1).column('name')).getAttribute('class')).\n           toMatch(/even/);\n       });\n     </file>\n   </example>\n */\nvar ngClassEvenDirective = classDirective('Even', 1);\n\n/**\n * @ngdoc directive\n * @name ngCloak\n * @restrict AC\n *\n * @description\n * The `ngCloak` directive is used to prevent the Angular html template from being briefly\n * displayed by the browser in its raw (uncompiled) form while your application is loading. Use this\n * directive to avoid the undesirable flicker effect caused by the html template display.\n *\n * The directive can be applied to the `<body>` element, but the preferred usage is to apply\n * multiple `ngCloak` directives to small portions of the page to permit progressive rendering\n * of the browser view.\n *\n * `ngCloak` works in cooperation with the following css rule embedded within `angular.js` and\n * `angular.min.js`.\n * For CSP mode please add `angular-csp.css` to your html file (see {@link ng.directive:ngCsp ngCsp}).\n *\n * ```css\n * [ng\\:cloak], [ng-cloak], [data-ng-cloak], [x-ng-cloak], .ng-cloak, .x-ng-cloak {\n *   display: none !important;\n * }\n * ```\n *\n * When this css rule is loaded by the browser, all html elements (including their children) that\n * are tagged with the `ngCloak` directive are hidden. When Angular encounters this directive\n * during the compilation of the template it deletes the `ngCloak` element attribute, making\n * the compiled element visible.\n *\n * For the best result, the `angular.js` script must be loaded in the head section of the html\n * document; alternatively, the css rule above must be included in the external stylesheet of the\n * application.\n *\n * @element ANY\n *\n * @example\n   <example>\n     <file name=\"index.html\">\n        <div id=\"template1\" ng-cloak>{{ 'hello' }}</div>\n        <div id=\"template2\" class=\"ng-cloak\">{{ 'world' }}</div>\n     </file>\n     <file name=\"protractor.js\" type=\"protractor\">\n       it('should remove the template directive and css class', function() {\n         expect($('#template1').getAttribute('ng-cloak')).\n           toBeNull();\n         expect($('#template2').getAttribute('ng-cloak')).\n           toBeNull();\n       });\n     </file>\n   </example>\n *\n */\nvar ngCloakDirective = ngDirective({\n  compile: function(element, attr) {\n    attr.$set('ngCloak', undefined);\n    element.removeClass('ng-cloak');\n  }\n});\n\n/**\n * @ngdoc directive\n * @name ngController\n *\n * @description\n * The `ngController` directive attaches a controller class to the view. This is a key aspect of how angular\n * supports the principles behind the Model-View-Controller design pattern.\n *\n * MVC components in angular:\n *\n * * Model — Models are the properties of a scope; scopes are attached to the DOM where scope properties\n *   are accessed through bindings.\n * * View — The template (HTML with data bindings) that is rendered into the View.\n * * Controller — The `ngController` directive specifies a Controller class; the class contains business\n *   logic behind the application to decorate the scope with functions and values\n *\n * Note that you can also attach controllers to the DOM by declaring it in a route definition\n * via the {@link ngRoute.$route $route} service. A common mistake is to declare the controller\n * again using `ng-controller` in the template itself.  This will cause the controller to be attached\n * and executed twice.\n *\n * @element ANY\n * @scope\n * @priority 500\n * @param {expression} ngController Name of a constructor function registered with the current\n * {@link ng.$controllerProvider $controllerProvider} or an {@link guide/expression expression}\n * that on the current scope evaluates to a constructor function.\n *\n * The controller instance can be published into a scope property by specifying\n * `ng-controller=\"as propertyName\"`.\n *\n * If the current `$controllerProvider` is configured to use globals (via\n * {@link ng.$controllerProvider#allowGlobals `$controllerProvider.allowGlobals()` }), this may\n * also be the name of a globally accessible constructor function (not recommended).\n *\n * @example\n * Here is a simple form for editing user contact information. Adding, removing, clearing, and\n * greeting are methods declared on the controller (see source tab). These methods can\n * easily be called from the angular markup. Any changes to the data are automatically reflected\n * in the View without the need for a manual update.\n *\n * Two different declaration styles are included below:\n *\n * * one binds methods and properties directly onto the controller using `this`:\n * `ng-controller=\"SettingsController1 as settings\"`\n * * one injects `$scope` into the controller:\n * `ng-controller=\"SettingsController2\"`\n *\n * The second option is more common in the Angular community, and is generally used in boilerplates\n * and in this guide. However, there are advantages to binding properties directly to the controller\n * and avoiding scope.\n *\n * * Using `controller as` makes it obvious which controller you are accessing in the template when\n * multiple controllers apply to an element.\n * * If you are writing your controllers as classes you have easier access to the properties and\n * methods, which will appear on the scope, from inside the controller code.\n * * Since there is always a `.` in the bindings, you don't have to worry about prototypal\n * inheritance masking primitives.\n *\n * This example demonstrates the `controller as` syntax.\n *\n * <example name=\"ngControllerAs\" module=\"controllerAsExample\">\n *   <file name=\"index.html\">\n *    <div id=\"ctrl-as-exmpl\" ng-controller=\"SettingsController1 as settings\">\n *      <label>Name: <input type=\"text\" ng-model=\"settings.name\"/></label>\n *      <button ng-click=\"settings.greet()\">greet</button><br/>\n *      Contact:\n *      <ul>\n *        <li ng-repeat=\"contact in settings.contacts\">\n *          <select ng-model=\"contact.type\" aria-label=\"Contact method\" id=\"select_{{$index}}\">\n *             <option>phone</option>\n *             <option>email</option>\n *          </select>\n *          <input type=\"text\" ng-model=\"contact.value\" aria-labelledby=\"select_{{$index}}\" />\n *          <button ng-click=\"settings.clearContact(contact)\">clear</button>\n *          <button ng-click=\"settings.removeContact(contact)\" aria-label=\"Remove\">X</button>\n *        </li>\n *        <li><button ng-click=\"settings.addContact()\">add</button></li>\n *     </ul>\n *    </div>\n *   </file>\n *   <file name=\"app.js\">\n *    angular.module('controllerAsExample', [])\n *      .controller('SettingsController1', SettingsController1);\n *\n *    function SettingsController1() {\n *      this.name = \"John Smith\";\n *      this.contacts = [\n *        {type: 'phone', value: '408 555 1212'},\n *        {type: 'email', value: 'john.smith@example.org'} ];\n *    }\n *\n *    SettingsController1.prototype.greet = function() {\n *      alert(this.name);\n *    };\n *\n *    SettingsController1.prototype.addContact = function() {\n *      this.contacts.push({type: 'email', value: 'yourname@example.org'});\n *    };\n *\n *    SettingsController1.prototype.removeContact = function(contactToRemove) {\n *     var index = this.contacts.indexOf(contactToRemove);\n *      this.contacts.splice(index, 1);\n *    };\n *\n *    SettingsController1.prototype.clearContact = function(contact) {\n *      contact.type = 'phone';\n *      contact.value = '';\n *    };\n *   </file>\n *   <file name=\"protractor.js\" type=\"protractor\">\n *     it('should check controller as', function() {\n *       var container = element(by.id('ctrl-as-exmpl'));\n *         expect(container.element(by.model('settings.name'))\n *           .getAttribute('value')).toBe('John Smith');\n *\n *       var firstRepeat =\n *           container.element(by.repeater('contact in settings.contacts').row(0));\n *       var secondRepeat =\n *           container.element(by.repeater('contact in settings.contacts').row(1));\n *\n *       expect(firstRepeat.element(by.model('contact.value')).getAttribute('value'))\n *           .toBe('408 555 1212');\n *\n *       expect(secondRepeat.element(by.model('contact.value')).getAttribute('value'))\n *           .toBe('john.smith@example.org');\n *\n *       firstRepeat.element(by.buttonText('clear')).click();\n *\n *       expect(firstRepeat.element(by.model('contact.value')).getAttribute('value'))\n *           .toBe('');\n *\n *       container.element(by.buttonText('add')).click();\n *\n *       expect(container.element(by.repeater('contact in settings.contacts').row(2))\n *           .element(by.model('contact.value'))\n *           .getAttribute('value'))\n *           .toBe('yourname@example.org');\n *     });\n *   </file>\n * </example>\n *\n * This example demonstrates the \"attach to `$scope`\" style of controller.\n *\n * <example name=\"ngController\" module=\"controllerExample\">\n *  <file name=\"index.html\">\n *   <div id=\"ctrl-exmpl\" ng-controller=\"SettingsController2\">\n *     <label>Name: <input type=\"text\" ng-model=\"name\"/></label>\n *     <button ng-click=\"greet()\">greet</button><br/>\n *     Contact:\n *     <ul>\n *       <li ng-repeat=\"contact in contacts\">\n *         <select ng-model=\"contact.type\" id=\"select_{{$index}}\">\n *            <option>phone</option>\n *            <option>email</option>\n *         </select>\n *         <input type=\"text\" ng-model=\"contact.value\" aria-labelledby=\"select_{{$index}}\" />\n *         <button ng-click=\"clearContact(contact)\">clear</button>\n *         <button ng-click=\"removeContact(contact)\">X</button>\n *       </li>\n *       <li>[ <button ng-click=\"addContact()\">add</button> ]</li>\n *    </ul>\n *   </div>\n *  </file>\n *  <file name=\"app.js\">\n *   angular.module('controllerExample', [])\n *     .controller('SettingsController2', ['$scope', SettingsController2]);\n *\n *   function SettingsController2($scope) {\n *     $scope.name = \"John Smith\";\n *     $scope.contacts = [\n *       {type:'phone', value:'408 555 1212'},\n *       {type:'email', value:'john.smith@example.org'} ];\n *\n *     $scope.greet = function() {\n *       alert($scope.name);\n *     };\n *\n *     $scope.addContact = function() {\n *       $scope.contacts.push({type:'email', value:'yourname@example.org'});\n *     };\n *\n *     $scope.removeContact = function(contactToRemove) {\n *       var index = $scope.contacts.indexOf(contactToRemove);\n *       $scope.contacts.splice(index, 1);\n *     };\n *\n *     $scope.clearContact = function(contact) {\n *       contact.type = 'phone';\n *       contact.value = '';\n *     };\n *   }\n *  </file>\n *  <file name=\"protractor.js\" type=\"protractor\">\n *    it('should check controller', function() {\n *      var container = element(by.id('ctrl-exmpl'));\n *\n *      expect(container.element(by.model('name'))\n *          .getAttribute('value')).toBe('John Smith');\n *\n *      var firstRepeat =\n *          container.element(by.repeater('contact in contacts').row(0));\n *      var secondRepeat =\n *          container.element(by.repeater('contact in contacts').row(1));\n *\n *      expect(firstRepeat.element(by.model('contact.value')).getAttribute('value'))\n *          .toBe('408 555 1212');\n *      expect(secondRepeat.element(by.model('contact.value')).getAttribute('value'))\n *          .toBe('john.smith@example.org');\n *\n *      firstRepeat.element(by.buttonText('clear')).click();\n *\n *      expect(firstRepeat.element(by.model('contact.value')).getAttribute('value'))\n *          .toBe('');\n *\n *      container.element(by.buttonText('add')).click();\n *\n *      expect(container.element(by.repeater('contact in contacts').row(2))\n *          .element(by.model('contact.value'))\n *          .getAttribute('value'))\n *          .toBe('yourname@example.org');\n *    });\n *  </file>\n *</example>\n\n */\nvar ngControllerDirective = [function() {\n  return {\n    restrict: 'A',\n    scope: true,\n    controller: '@',\n    priority: 500\n  };\n}];\n\n/**\n * @ngdoc directive\n * @name ngCsp\n *\n * @element html\n * @description\n *\n * Angular has some features that can break certain\n * [CSP (Content Security Policy)](https://developer.mozilla.org/en/Security/CSP) rules.\n *\n * If you intend to implement these rules then you must tell Angular not to use these features.\n *\n * This is necessary when developing things like Google Chrome Extensions or Universal Windows Apps.\n *\n *\n * The following rules affect Angular:\n *\n * * `unsafe-eval`: this rule forbids apps to use `eval` or `Function(string)` generated functions\n * (among other things). Angular makes use of this in the {@link $parse} service to provide a 30%\n * increase in the speed of evaluating Angular expressions.\n *\n * * `unsafe-inline`: this rule forbids apps from inject custom styles into the document. Angular\n * makes use of this to include some CSS rules (e.g. {@link ngCloak} and {@link ngHide}).\n * To make these directives work when a CSP rule is blocking inline styles, you must link to the\n * `angular-csp.css` in your HTML manually.\n *\n * If you do not provide `ngCsp` then Angular tries to autodetect if CSP is blocking unsafe-eval\n * and automatically deactivates this feature in the {@link $parse} service. This autodetection,\n * however, triggers a CSP error to be logged in the console:\n *\n * ```\n * Refused to evaluate a string as JavaScript because 'unsafe-eval' is not an allowed source of\n * script in the following Content Security Policy directive: \"default-src 'self'\". Note that\n * 'script-src' was not explicitly set, so 'default-src' is used as a fallback.\n * ```\n *\n * This error is harmless but annoying. To prevent the error from showing up, put the `ngCsp`\n * directive on an element of the HTML document that appears before the `<script>` tag that loads\n * the `angular.js` file.\n *\n * *Note: This directive is only available in the `ng-csp` and `data-ng-csp` attribute form.*\n *\n * You can specify which of the CSP related Angular features should be deactivated by providing\n * a value for the `ng-csp` attribute. The options are as follows:\n *\n * * no-inline-style: this stops Angular from injecting CSS styles into the DOM\n *\n * * no-unsafe-eval: this stops Angular from optimizing $parse with unsafe eval of strings\n *\n * You can use these values in the following combinations:\n *\n *\n * * No declaration means that Angular will assume that you can do inline styles, but it will do\n * a runtime check for unsafe-eval. E.g. `<body>`. This is backwardly compatible with previous versions\n * of Angular.\n *\n * * A simple `ng-csp` (or `data-ng-csp`) attribute will tell Angular to deactivate both inline\n * styles and unsafe eval. E.g. `<body ng-csp>`. This is backwardly compatible with previous versions\n * of Angular.\n *\n * * Specifying only `no-unsafe-eval` tells Angular that we must not use eval, but that we can inject\n * inline styles. E.g. `<body ng-csp=\"no-unsafe-eval\">`.\n *\n * * Specifying only `no-inline-style` tells Angular that we must not inject styles, but that we can\n * run eval - no automatic check for unsafe eval will occur. E.g. `<body ng-csp=\"no-inline-style\">`\n *\n * * Specifying both `no-unsafe-eval` and `no-inline-style` tells Angular that we must not inject\n * styles nor use eval, which is the same as an empty: ng-csp.\n * E.g.`<body ng-csp=\"no-inline-style;no-unsafe-eval\">`\n *\n * @example\n * This example shows how to apply the `ngCsp` directive to the `html` tag.\n   ```html\n     <!doctype html>\n     <html ng-app ng-csp>\n     ...\n     ...\n     </html>\n   ```\n  * @example\n      // Note: the suffix `.csp` in the example name triggers\n      // csp mode in our http server!\n      <example name=\"example.csp\" module=\"cspExample\" ng-csp=\"true\">\n        <file name=\"index.html\">\n          <div ng-controller=\"MainController as ctrl\">\n            <div>\n              <button ng-click=\"ctrl.inc()\" id=\"inc\">Increment</button>\n              <span id=\"counter\">\n                {{ctrl.counter}}\n              </span>\n            </div>\n\n            <div>\n              <button ng-click=\"ctrl.evil()\" id=\"evil\">Evil</button>\n              <span id=\"evilError\">\n                {{ctrl.evilError}}\n              </span>\n            </div>\n          </div>\n        </file>\n        <file name=\"script.js\">\n           angular.module('cspExample', [])\n             .controller('MainController', function() {\n                this.counter = 0;\n                this.inc = function() {\n                  this.counter++;\n                };\n                this.evil = function() {\n                  // jshint evil:true\n                  try {\n                    eval('1+2');\n                  } catch (e) {\n                    this.evilError = e.message;\n                  }\n                };\n              });\n        </file>\n        <file name=\"protractor.js\" type=\"protractor\">\n          var util, webdriver;\n\n          var incBtn = element(by.id('inc'));\n          var counter = element(by.id('counter'));\n          var evilBtn = element(by.id('evil'));\n          var evilError = element(by.id('evilError'));\n\n          function getAndClearSevereErrors() {\n            return browser.manage().logs().get('browser').then(function(browserLog) {\n              return browserLog.filter(function(logEntry) {\n                return logEntry.level.value > webdriver.logging.Level.WARNING.value;\n              });\n            });\n          }\n\n          function clearErrors() {\n            getAndClearSevereErrors();\n          }\n\n          function expectNoErrors() {\n            getAndClearSevereErrors().then(function(filteredLog) {\n              expect(filteredLog.length).toEqual(0);\n              if (filteredLog.length) {\n                console.log('browser console errors: ' + util.inspect(filteredLog));\n              }\n            });\n          }\n\n          function expectError(regex) {\n            getAndClearSevereErrors().then(function(filteredLog) {\n              var found = false;\n              filteredLog.forEach(function(log) {\n                if (log.message.match(regex)) {\n                  found = true;\n                }\n              });\n              if (!found) {\n                throw new Error('expected an error that matches ' + regex);\n              }\n            });\n          }\n\n          beforeEach(function() {\n            util = require('util');\n            webdriver = require('protractor/node_modules/selenium-webdriver');\n          });\n\n          // For now, we only test on Chrome,\n          // as Safari does not load the page with Protractor's injected scripts,\n          // and Firefox webdriver always disables content security policy (#6358)\n          if (browser.params.browser !== 'chrome') {\n            return;\n          }\n\n          it('should not report errors when the page is loaded', function() {\n            // clear errors so we are not dependent on previous tests\n            clearErrors();\n            // Need to reload the page as the page is already loaded when\n            // we come here\n            browser.driver.getCurrentUrl().then(function(url) {\n              browser.get(url);\n            });\n            expectNoErrors();\n          });\n\n          it('should evaluate expressions', function() {\n            expect(counter.getText()).toEqual('0');\n            incBtn.click();\n            expect(counter.getText()).toEqual('1');\n            expectNoErrors();\n          });\n\n          it('should throw and report an error when using \"eval\"', function() {\n            evilBtn.click();\n            expect(evilError.getText()).toMatch(/Content Security Policy/);\n            expectError(/Content Security Policy/);\n          });\n        </file>\n      </example>\n  */\n\n// ngCsp is not implemented as a proper directive any more, because we need it be processed while we\n// bootstrap the system (before $parse is instantiated), for this reason we just have\n// the csp() fn that looks for the `ng-csp` attribute anywhere in the current doc\n\n/**\n * @ngdoc directive\n * @name ngClick\n *\n * @description\n * The ngClick directive allows you to specify custom behavior when\n * an element is clicked.\n *\n * @element ANY\n * @priority 0\n * @param {expression} ngClick {@link guide/expression Expression} to evaluate upon\n * click. ({@link guide/expression#-event- Event object is available as `$event`})\n *\n * @example\n   <example>\n     <file name=\"index.html\">\n      <button ng-click=\"count = count + 1\" ng-init=\"count=0\">\n        Increment\n      </button>\n      <span>\n        count: {{count}}\n      </span>\n     </file>\n     <file name=\"protractor.js\" type=\"protractor\">\n       it('should check ng-click', function() {\n         expect(element(by.binding('count')).getText()).toMatch('0');\n         element(by.css('button')).click();\n         expect(element(by.binding('count')).getText()).toMatch('1');\n       });\n     </file>\n   </example>\n */\n/*\n * A collection of directives that allows creation of custom event handlers that are defined as\n * angular expressions and are compiled and executed within the current scope.\n */\nvar ngEventDirectives = {};\n\n// For events that might fire synchronously during DOM manipulation\n// we need to execute their event handlers asynchronously using $evalAsync,\n// so that they are not executed in an inconsistent state.\nvar forceAsyncEvents = {\n  'blur': true,\n  'focus': true\n};\nforEach(\n  'click dblclick mousedown mouseup mouseover mouseout mousemove mouseenter mouseleave keydown keyup keypress submit focus blur copy cut paste'.split(' '),\n  function(eventName) {\n    var directiveName = directiveNormalize('ng-' + eventName);\n    ngEventDirectives[directiveName] = ['$parse', '$rootScope', function($parse, $rootScope) {\n      return {\n        restrict: 'A',\n        compile: function($element, attr) {\n          // We expose the powerful $event object on the scope that provides access to the Window,\n          // etc. that isn't protected by the fast paths in $parse.  We explicitly request better\n          // checks at the cost of speed since event handler expressions are not executed as\n          // frequently as regular change detection.\n          var fn = $parse(attr[directiveName], /* interceptorFn */ null, /* expensiveChecks */ true);\n          return function ngEventHandler(scope, element) {\n            element.on(eventName, function(event) {\n              var callback = function() {\n                fn(scope, {$event:event});\n              };\n              if (forceAsyncEvents[eventName] && $rootScope.$$phase) {\n                scope.$evalAsync(callback);\n              } else {\n                scope.$apply(callback);\n              }\n            });\n          };\n        }\n      };\n    }];\n  }\n);\n\n/**\n * @ngdoc directive\n * @name ngDblclick\n *\n * @description\n * The `ngDblclick` directive allows you to specify custom behavior on a dblclick event.\n *\n * @element ANY\n * @priority 0\n * @param {expression} ngDblclick {@link guide/expression Expression} to evaluate upon\n * a dblclick. (The Event object is available as `$event`)\n *\n * @example\n   <example>\n     <file name=\"index.html\">\n      <button ng-dblclick=\"count = count + 1\" ng-init=\"count=0\">\n        Increment (on double click)\n      </button>\n      count: {{count}}\n     </file>\n   </example>\n */\n\n\n/**\n * @ngdoc directive\n * @name ngMousedown\n *\n * @description\n * The ngMousedown directive allows you to specify custom behavior on mousedown event.\n *\n * @element ANY\n * @priority 0\n * @param {expression} ngMousedown {@link guide/expression Expression} to evaluate upon\n * mousedown. ({@link guide/expression#-event- Event object is available as `$event`})\n *\n * @example\n   <example>\n     <file name=\"index.html\">\n      <button ng-mousedown=\"count = count + 1\" ng-init=\"count=0\">\n        Increment (on mouse down)\n      </button>\n      count: {{count}}\n     </file>\n   </example>\n */\n\n\n/**\n * @ngdoc directive\n * @name ngMouseup\n *\n * @description\n * Specify custom behavior on mouseup event.\n *\n * @element ANY\n * @priority 0\n * @param {expression} ngMouseup {@link guide/expression Expression} to evaluate upon\n * mouseup. ({@link guide/expression#-event- Event object is available as `$event`})\n *\n * @example\n   <example>\n     <file name=\"index.html\">\n      <button ng-mouseup=\"count = count + 1\" ng-init=\"count=0\">\n        Increment (on mouse up)\n      </button>\n      count: {{count}}\n     </file>\n   </example>\n */\n\n/**\n * @ngdoc directive\n * @name ngMouseover\n *\n * @description\n * Specify custom behavior on mouseover event.\n *\n * @element ANY\n * @priority 0\n * @param {expression} ngMouseover {@link guide/expression Expression} to evaluate upon\n * mouseover. ({@link guide/expression#-event- Event object is available as `$event`})\n *\n * @example\n   <example>\n     <file name=\"index.html\">\n      <button ng-mouseover=\"count = count + 1\" ng-init=\"count=0\">\n        Increment (when mouse is over)\n      </button>\n      count: {{count}}\n     </file>\n   </example>\n */\n\n\n/**\n * @ngdoc directive\n * @name ngMouseenter\n *\n * @description\n * Specify custom behavior on mouseenter event.\n *\n * @element ANY\n * @priority 0\n * @param {expression} ngMouseenter {@link guide/expression Expression} to evaluate upon\n * mouseenter. ({@link guide/expression#-event- Event object is available as `$event`})\n *\n * @example\n   <example>\n     <file name=\"index.html\">\n      <button ng-mouseenter=\"count = count + 1\" ng-init=\"count=0\">\n        Increment (when mouse enters)\n      </button>\n      count: {{count}}\n     </file>\n   </example>\n */\n\n\n/**\n * @ngdoc directive\n * @name ngMouseleave\n *\n * @description\n * Specify custom behavior on mouseleave event.\n *\n * @element ANY\n * @priority 0\n * @param {expression} ngMouseleave {@link guide/expression Expression} to evaluate upon\n * mouseleave. ({@link guide/expression#-event- Event object is available as `$event`})\n *\n * @example\n   <example>\n     <file name=\"index.html\">\n      <button ng-mouseleave=\"count = count + 1\" ng-init=\"count=0\">\n        Increment (when mouse leaves)\n      </button>\n      count: {{count}}\n     </file>\n   </example>\n */\n\n\n/**\n * @ngdoc directive\n * @name ngMousemove\n *\n * @description\n * Specify custom behavior on mousemove event.\n *\n * @element ANY\n * @priority 0\n * @param {expression} ngMousemove {@link guide/expression Expression} to evaluate upon\n * mousemove. ({@link guide/expression#-event- Event object is available as `$event`})\n *\n * @example\n   <example>\n     <file name=\"index.html\">\n      <button ng-mousemove=\"count = count + 1\" ng-init=\"count=0\">\n        Increment (when mouse moves)\n      </button>\n      count: {{count}}\n     </file>\n   </example>\n */\n\n\n/**\n * @ngdoc directive\n * @name ngKeydown\n *\n * @description\n * Specify custom behavior on keydown event.\n *\n * @element ANY\n * @priority 0\n * @param {expression} ngKeydown {@link guide/expression Expression} to evaluate upon\n * keydown. (Event object is available as `$event` and can be interrogated for keyCode, altKey, etc.)\n *\n * @example\n   <example>\n     <file name=\"index.html\">\n      <input ng-keydown=\"count = count + 1\" ng-init=\"count=0\">\n      key down count: {{count}}\n     </file>\n   </example>\n */\n\n\n/**\n * @ngdoc directive\n * @name ngKeyup\n *\n * @description\n * Specify custom behavior on keyup event.\n *\n * @element ANY\n * @priority 0\n * @param {expression} ngKeyup {@link guide/expression Expression} to evaluate upon\n * keyup. (Event object is available as `$event` and can be interrogated for keyCode, altKey, etc.)\n *\n * @example\n   <example>\n     <file name=\"index.html\">\n       <p>Typing in the input box below updates the key count</p>\n       <input ng-keyup=\"count = count + 1\" ng-init=\"count=0\"> key up count: {{count}}\n\n       <p>Typing in the input box below updates the keycode</p>\n       <input ng-keyup=\"event=$event\">\n       <p>event keyCode: {{ event.keyCode }}</p>\n       <p>event altKey: {{ event.altKey }}</p>\n     </file>\n   </example>\n */\n\n\n/**\n * @ngdoc directive\n * @name ngKeypress\n *\n * @description\n * Specify custom behavior on keypress event.\n *\n * @element ANY\n * @param {expression} ngKeypress {@link guide/expression Expression} to evaluate upon\n * keypress. ({@link guide/expression#-event- Event object is available as `$event`}\n * and can be interrogated for keyCode, altKey, etc.)\n *\n * @example\n   <example>\n     <file name=\"index.html\">\n      <input ng-keypress=\"count = count + 1\" ng-init=\"count=0\">\n      key press count: {{count}}\n     </file>\n   </example>\n */\n\n\n/**\n * @ngdoc directive\n * @name ngSubmit\n *\n * @description\n * Enables binding angular expressions to onsubmit events.\n *\n * Additionally it prevents the default action (which for form means sending the request to the\n * server and reloading the current page), but only if the form does not contain `action`,\n * `data-action`, or `x-action` attributes.\n *\n * <div class=\"alert alert-warning\">\n * **Warning:** Be careful not to cause \"double-submission\" by using both the `ngClick` and\n * `ngSubmit` handlers together. See the\n * {@link form#submitting-a-form-and-preventing-the-default-action `form` directive documentation}\n * for a detailed discussion of when `ngSubmit` may be triggered.\n * </div>\n *\n * @element form\n * @priority 0\n * @param {expression} ngSubmit {@link guide/expression Expression} to eval.\n * ({@link guide/expression#-event- Event object is available as `$event`})\n *\n * @example\n   <example module=\"submitExample\">\n     <file name=\"index.html\">\n      <script>\n        angular.module('submitExample', [])\n          .controller('ExampleController', ['$scope', function($scope) {\n            $scope.list = [];\n            $scope.text = 'hello';\n            $scope.submit = function() {\n              if ($scope.text) {\n                $scope.list.push(this.text);\n                $scope.text = '';\n              }\n            };\n          }]);\n      </script>\n      <form ng-submit=\"submit()\" ng-controller=\"ExampleController\">\n        Enter text and hit enter:\n        <input type=\"text\" ng-model=\"text\" name=\"text\" />\n        <input type=\"submit\" id=\"submit\" value=\"Submit\" />\n        <pre>list={{list}}</pre>\n      </form>\n     </file>\n     <file name=\"protractor.js\" type=\"protractor\">\n       it('should check ng-submit', function() {\n         expect(element(by.binding('list')).getText()).toBe('list=[]');\n         element(by.css('#submit')).click();\n         expect(element(by.binding('list')).getText()).toContain('hello');\n         expect(element(by.model('text')).getAttribute('value')).toBe('');\n       });\n       it('should ignore empty strings', function() {\n         expect(element(by.binding('list')).getText()).toBe('list=[]');\n         element(by.css('#submit')).click();\n         element(by.css('#submit')).click();\n         expect(element(by.binding('list')).getText()).toContain('hello');\n        });\n     </file>\n   </example>\n */\n\n/**\n * @ngdoc directive\n * @name ngFocus\n *\n * @description\n * Specify custom behavior on focus event.\n *\n * Note: As the `focus` event is executed synchronously when calling `input.focus()`\n * AngularJS executes the expression using `scope.$evalAsync` if the event is fired\n * during an `$apply` to ensure a consistent state.\n *\n * @element window, input, select, textarea, a\n * @priority 0\n * @param {expression} ngFocus {@link guide/expression Expression} to evaluate upon\n * focus. ({@link guide/expression#-event- Event object is available as `$event`})\n *\n * @example\n * See {@link ng.directive:ngClick ngClick}\n */\n\n/**\n * @ngdoc directive\n * @name ngBlur\n *\n * @description\n * Specify custom behavior on blur event.\n *\n * A [blur event](https://developer.mozilla.org/en-US/docs/Web/Events/blur) fires when\n * an element has lost focus.\n *\n * Note: As the `blur` event is executed synchronously also during DOM manipulations\n * (e.g. removing a focussed input),\n * AngularJS executes the expression using `scope.$evalAsync` if the event is fired\n * during an `$apply` to ensure a consistent state.\n *\n * @element window, input, select, textarea, a\n * @priority 0\n * @param {expression} ngBlur {@link guide/expression Expression} to evaluate upon\n * blur. ({@link guide/expression#-event- Event object is available as `$event`})\n *\n * @example\n * See {@link ng.directive:ngClick ngClick}\n */\n\n/**\n * @ngdoc directive\n * @name ngCopy\n *\n * @description\n * Specify custom behavior on copy event.\n *\n * @element window, input, select, textarea, a\n * @priority 0\n * @param {expression} ngCopy {@link guide/expression Expression} to evaluate upon\n * copy. ({@link guide/expression#-event- Event object is available as `$event`})\n *\n * @example\n   <example>\n     <file name=\"index.html\">\n      <input ng-copy=\"copied=true\" ng-init=\"copied=false; value='copy me'\" ng-model=\"value\">\n      copied: {{copied}}\n     </file>\n   </example>\n */\n\n/**\n * @ngdoc directive\n * @name ngCut\n *\n * @description\n * Specify custom behavior on cut event.\n *\n * @element window, input, select, textarea, a\n * @priority 0\n * @param {expression} ngCut {@link guide/expression Expression} to evaluate upon\n * cut. ({@link guide/expression#-event- Event object is available as `$event`})\n *\n * @example\n   <example>\n     <file name=\"index.html\">\n      <input ng-cut=\"cut=true\" ng-init=\"cut=false; value='cut me'\" ng-model=\"value\">\n      cut: {{cut}}\n     </file>\n   </example>\n */\n\n/**\n * @ngdoc directive\n * @name ngPaste\n *\n * @description\n * Specify custom behavior on paste event.\n *\n * @element window, input, select, textarea, a\n * @priority 0\n * @param {expression} ngPaste {@link guide/expression Expression} to evaluate upon\n * paste. ({@link guide/expression#-event- Event object is available as `$event`})\n *\n * @example\n   <example>\n     <file name=\"index.html\">\n      <input ng-paste=\"paste=true\" ng-init=\"paste=false\" placeholder='paste here'>\n      pasted: {{paste}}\n     </file>\n   </example>\n */\n\n/**\n * @ngdoc directive\n * @name ngIf\n * @restrict A\n * @multiElement\n *\n * @description\n * The `ngIf` directive removes or recreates a portion of the DOM tree based on an\n * {expression}. If the expression assigned to `ngIf` evaluates to a false\n * value then the element is removed from the DOM, otherwise a clone of the\n * element is reinserted into the DOM.\n *\n * `ngIf` differs from `ngShow` and `ngHide` in that `ngIf` completely removes and recreates the\n * element in the DOM rather than changing its visibility via the `display` css property.  A common\n * case when this difference is significant is when using css selectors that rely on an element's\n * position within the DOM, such as the `:first-child` or `:last-child` pseudo-classes.\n *\n * Note that when an element is removed using `ngIf` its scope is destroyed and a new scope\n * is created when the element is restored.  The scope created within `ngIf` inherits from\n * its parent scope using\n * [prototypal inheritance](https://github.com/angular/angular.js/wiki/Understanding-Scopes#javascript-prototypal-inheritance).\n * An important implication of this is if `ngModel` is used within `ngIf` to bind to\n * a javascript primitive defined in the parent scope. In this case any modifications made to the\n * variable within the child scope will override (hide) the value in the parent scope.\n *\n * Also, `ngIf` recreates elements using their compiled state. An example of this behavior\n * is if an element's class attribute is directly modified after it's compiled, using something like\n * jQuery's `.addClass()` method, and the element is later removed. When `ngIf` recreates the element\n * the added class will be lost because the original compiled state is used to regenerate the element.\n *\n * Additionally, you can provide animations via the `ngAnimate` module to animate the `enter`\n * and `leave` effects.\n *\n * @animations\n * | Animation                        | Occurs                               |\n * |----------------------------------|-------------------------------------|\n * | {@link ng.$animate#enter enter}  | just after the `ngIf` contents change and a new DOM element is created and injected into the `ngIf` container |\n * | {@link ng.$animate#leave leave}  | just before the `ngIf` contents are removed from the DOM |\n *\n * @element ANY\n * @scope\n * @priority 600\n * @param {expression} ngIf If the {@link guide/expression expression} is falsy then\n *     the element is removed from the DOM tree. If it is truthy a copy of the compiled\n *     element is added to the DOM tree.\n *\n * @example\n  <example module=\"ngAnimate\" deps=\"angular-animate.js\" animations=\"true\">\n    <file name=\"index.html\">\n      <label>Click me: <input type=\"checkbox\" ng-model=\"checked\" ng-init=\"checked=true\" /></label><br/>\n      Show when checked:\n      <span ng-if=\"checked\" class=\"animate-if\">\n        This is removed when the checkbox is unchecked.\n      </span>\n    </file>\n    <file name=\"animations.css\">\n      .animate-if {\n        background:white;\n        border:1px solid black;\n        padding:10px;\n      }\n\n      .animate-if.ng-enter, .animate-if.ng-leave {\n        transition:all cubic-bezier(0.250, 0.460, 0.450, 0.940) 0.5s;\n      }\n\n      .animate-if.ng-enter,\n      .animate-if.ng-leave.ng-leave-active {\n        opacity:0;\n      }\n\n      .animate-if.ng-leave,\n      .animate-if.ng-enter.ng-enter-active {\n        opacity:1;\n      }\n    </file>\n  </example>\n */\nvar ngIfDirective = ['$animate', '$compile', function($animate, $compile) {\n  return {\n    multiElement: true,\n    transclude: 'element',\n    priority: 600,\n    terminal: true,\n    restrict: 'A',\n    $$tlb: true,\n    link: function($scope, $element, $attr, ctrl, $transclude) {\n        var block, childScope, previousElements;\n        $scope.$watch($attr.ngIf, function ngIfWatchAction(value) {\n\n          if (value) {\n            if (!childScope) {\n              $transclude(function(clone, newScope) {\n                childScope = newScope;\n                clone[clone.length++] = $compile.$$createComment('end ngIf', $attr.ngIf);\n                // Note: We only need the first/last node of the cloned nodes.\n                // However, we need to keep the reference to the jqlite wrapper as it might be changed later\n                // by a directive with templateUrl when its template arrives.\n                block = {\n                  clone: clone\n                };\n                $animate.enter(clone, $element.parent(), $element);\n              });\n            }\n          } else {\n            if (previousElements) {\n              previousElements.remove();\n              previousElements = null;\n            }\n            if (childScope) {\n              childScope.$destroy();\n              childScope = null;\n            }\n            if (block) {\n              previousElements = getBlockNodes(block.clone);\n              $animate.leave(previousElements).then(function() {\n                previousElements = null;\n              });\n              block = null;\n            }\n          }\n        });\n    }\n  };\n}];\n\n/**\n * @ngdoc directive\n * @name ngInclude\n * @restrict ECA\n *\n * @description\n * Fetches, compiles and includes an external HTML fragment.\n *\n * By default, the template URL is restricted to the same domain and protocol as the\n * application document. This is done by calling {@link $sce#getTrustedResourceUrl\n * $sce.getTrustedResourceUrl} on it. To load templates from other domains or protocols\n * you may either {@link ng.$sceDelegateProvider#resourceUrlWhitelist whitelist them} or\n * {@link $sce#trustAsResourceUrl wrap them} as trusted values. Refer to Angular's {@link\n * ng.$sce Strict Contextual Escaping}.\n *\n * In addition, the browser's\n * [Same Origin Policy](https://code.google.com/p/browsersec/wiki/Part2#Same-origin_policy_for_XMLHttpRequest)\n * and [Cross-Origin Resource Sharing (CORS)](http://www.w3.org/TR/cors/)\n * policy may further restrict whether the template is successfully loaded.\n * For example, `ngInclude` won't work for cross-domain requests on all browsers and for `file://`\n * access on some browsers.\n *\n * @animations\n * | Animation                        | Occurs                              |\n * |----------------------------------|-------------------------------------|\n * | {@link ng.$animate#enter enter}  | when the expression changes, on the new include |\n * | {@link ng.$animate#leave leave}  | when the expression changes, on the old include |\n *\n * The enter and leave animation occur concurrently.\n *\n * @scope\n * @priority 400\n *\n * @param {string} ngInclude|src angular expression evaluating to URL. If the source is a string constant,\n *                 make sure you wrap it in **single** quotes, e.g. `src=\"'myPartialTemplate.html'\"`.\n * @param {string=} onload Expression to evaluate when a new partial is loaded.\n *                  <div class=\"alert alert-warning\">\n *                  **Note:** When using onload on SVG elements in IE11, the browser will try to call\n *                  a function with the name on the window element, which will usually throw a\n *                  \"function is undefined\" error. To fix this, you can instead use `data-onload` or a\n *                  different form that {@link guide/directive#normalization matches} `onload`.\n *                  </div>\n   *\n * @param {string=} autoscroll Whether `ngInclude` should call {@link ng.$anchorScroll\n *                  $anchorScroll} to scroll the viewport after the content is loaded.\n *\n *                  - If the attribute is not set, disable scrolling.\n *                  - If the attribute is set without value, enable scrolling.\n *                  - Otherwise enable scrolling only if the expression evaluates to truthy value.\n *\n * @example\n  <example module=\"includeExample\" deps=\"angular-animate.js\" animations=\"true\">\n    <file name=\"index.html\">\n     <div ng-controller=\"ExampleController\">\n       <select ng-model=\"template\" ng-options=\"t.name for t in templates\">\n        <option value=\"\">(blank)</option>\n       </select>\n       url of the template: <code>{{template.url}}</code>\n       <hr/>\n       <div class=\"slide-animate-container\">\n         <div class=\"slide-animate\" ng-include=\"template.url\"></div>\n       </div>\n     </div>\n    </file>\n    <file name=\"script.js\">\n      angular.module('includeExample', ['ngAnimate'])\n        .controller('ExampleController', ['$scope', function($scope) {\n          $scope.templates =\n            [ { name: 'template1.html', url: 'template1.html'},\n              { name: 'template2.html', url: 'template2.html'} ];\n          $scope.template = $scope.templates[0];\n        }]);\n     </file>\n    <file name=\"template1.html\">\n      Content of template1.html\n    </file>\n    <file name=\"template2.html\">\n      Content of template2.html\n    </file>\n    <file name=\"animations.css\">\n      .slide-animate-container {\n        position:relative;\n        background:white;\n        border:1px solid black;\n        height:40px;\n        overflow:hidden;\n      }\n\n      .slide-animate {\n        padding:10px;\n      }\n\n      .slide-animate.ng-enter, .slide-animate.ng-leave {\n        transition:all cubic-bezier(0.250, 0.460, 0.450, 0.940) 0.5s;\n\n        position:absolute;\n        top:0;\n        left:0;\n        right:0;\n        bottom:0;\n        display:block;\n        padding:10px;\n      }\n\n      .slide-animate.ng-enter {\n        top:-50px;\n      }\n      .slide-animate.ng-enter.ng-enter-active {\n        top:0;\n      }\n\n      .slide-animate.ng-leave {\n        top:0;\n      }\n      .slide-animate.ng-leave.ng-leave-active {\n        top:50px;\n      }\n    </file>\n    <file name=\"protractor.js\" type=\"protractor\">\n      var templateSelect = element(by.model('template'));\n      var includeElem = element(by.css('[ng-include]'));\n\n      it('should load template1.html', function() {\n        expect(includeElem.getText()).toMatch(/Content of template1.html/);\n      });\n\n      it('should load template2.html', function() {\n        if (browser.params.browser == 'firefox') {\n          // Firefox can't handle using selects\n          // See https://github.com/angular/protractor/issues/480\n          return;\n        }\n        templateSelect.click();\n        templateSelect.all(by.css('option')).get(2).click();\n        expect(includeElem.getText()).toMatch(/Content of template2.html/);\n      });\n\n      it('should change to blank', function() {\n        if (browser.params.browser == 'firefox') {\n          // Firefox can't handle using selects\n          return;\n        }\n        templateSelect.click();\n        templateSelect.all(by.css('option')).get(0).click();\n        expect(includeElem.isPresent()).toBe(false);\n      });\n    </file>\n  </example>\n */\n\n\n/**\n * @ngdoc event\n * @name ngInclude#$includeContentRequested\n * @eventType emit on the scope ngInclude was declared in\n * @description\n * Emitted every time the ngInclude content is requested.\n *\n * @param {Object} angularEvent Synthetic event object.\n * @param {String} src URL of content to load.\n */\n\n\n/**\n * @ngdoc event\n * @name ngInclude#$includeContentLoaded\n * @eventType emit on the current ngInclude scope\n * @description\n * Emitted every time the ngInclude content is reloaded.\n *\n * @param {Object} angularEvent Synthetic event object.\n * @param {String} src URL of content to load.\n */\n\n\n/**\n * @ngdoc event\n * @name ngInclude#$includeContentError\n * @eventType emit on the scope ngInclude was declared in\n * @description\n * Emitted when a template HTTP request yields an erroneous response (status < 200 || status > 299)\n *\n * @param {Object} angularEvent Synthetic event object.\n * @param {String} src URL of content to load.\n */\nvar ngIncludeDirective = ['$templateRequest', '$anchorScroll', '$animate',\n                  function($templateRequest,   $anchorScroll,   $animate) {\n  return {\n    restrict: 'ECA',\n    priority: 400,\n    terminal: true,\n    transclude: 'element',\n    controller: angular.noop,\n    compile: function(element, attr) {\n      var srcExp = attr.ngInclude || attr.src,\n          onloadExp = attr.onload || '',\n          autoScrollExp = attr.autoscroll;\n\n      return function(scope, $element, $attr, ctrl, $transclude) {\n        var changeCounter = 0,\n            currentScope,\n            previousElement,\n            currentElement;\n\n        var cleanupLastIncludeContent = function() {\n          if (previousElement) {\n            previousElement.remove();\n            previousElement = null;\n          }\n          if (currentScope) {\n            currentScope.$destroy();\n            currentScope = null;\n          }\n          if (currentElement) {\n            $animate.leave(currentElement).then(function() {\n              previousElement = null;\n            });\n            previousElement = currentElement;\n            currentElement = null;\n          }\n        };\n\n        scope.$watch(srcExp, function ngIncludeWatchAction(src) {\n          var afterAnimation = function() {\n            if (isDefined(autoScrollExp) && (!autoScrollExp || scope.$eval(autoScrollExp))) {\n              $anchorScroll();\n            }\n          };\n          var thisChangeId = ++changeCounter;\n\n          if (src) {\n            //set the 2nd param to true to ignore the template request error so that the inner\n            //contents and scope can be cleaned up.\n            $templateRequest(src, true).then(function(response) {\n              if (scope.$$destroyed) return;\n\n              if (thisChangeId !== changeCounter) return;\n              var newScope = scope.$new();\n              ctrl.template = response;\n\n              // Note: This will also link all children of ng-include that were contained in the original\n              // html. If that content contains controllers, ... they could pollute/change the scope.\n              // However, using ng-include on an element with additional content does not make sense...\n              // Note: We can't remove them in the cloneAttchFn of $transclude as that\n              // function is called before linking the content, which would apply child\n              // directives to non existing elements.\n              var clone = $transclude(newScope, function(clone) {\n                cleanupLastIncludeContent();\n                $animate.enter(clone, null, $element).then(afterAnimation);\n              });\n\n              currentScope = newScope;\n              currentElement = clone;\n\n              currentScope.$emit('$includeContentLoaded', src);\n              scope.$eval(onloadExp);\n            }, function() {\n              if (scope.$$destroyed) return;\n\n              if (thisChangeId === changeCounter) {\n                cleanupLastIncludeContent();\n                scope.$emit('$includeContentError', src);\n              }\n            });\n            scope.$emit('$includeContentRequested', src);\n          } else {\n            cleanupLastIncludeContent();\n            ctrl.template = null;\n          }\n        });\n      };\n    }\n  };\n}];\n\n// This directive is called during the $transclude call of the first `ngInclude` directive.\n// It will replace and compile the content of the element with the loaded template.\n// We need this directive so that the element content is already filled when\n// the link function of another directive on the same element as ngInclude\n// is called.\nvar ngIncludeFillContentDirective = ['$compile',\n  function($compile) {\n    return {\n      restrict: 'ECA',\n      priority: -400,\n      require: 'ngInclude',\n      link: function(scope, $element, $attr, ctrl) {\n        if (toString.call($element[0]).match(/SVG/)) {\n          // WebKit: https://bugs.webkit.org/show_bug.cgi?id=135698 --- SVG elements do not\n          // support innerHTML, so detect this here and try to generate the contents\n          // specially.\n          $element.empty();\n          $compile(jqLiteBuildFragment(ctrl.template, window.document).childNodes)(scope,\n              function namespaceAdaptedClone(clone) {\n            $element.append(clone);\n          }, {futureParentElement: $element});\n          return;\n        }\n\n        $element.html(ctrl.template);\n        $compile($element.contents())(scope);\n      }\n    };\n  }];\n\n/**\n * @ngdoc directive\n * @name ngInit\n * @restrict AC\n *\n * @description\n * The `ngInit` directive allows you to evaluate an expression in the\n * current scope.\n *\n * <div class=\"alert alert-danger\">\n * This directive can be abused to add unnecessary amounts of logic into your templates.\n * There are only a few appropriate uses of `ngInit`, such as for aliasing special properties of\n * {@link ng.directive:ngRepeat `ngRepeat`}, as seen in the demo below; and for injecting data via\n * server side scripting. Besides these few cases, you should use {@link guide/controller controllers}\n * rather than `ngInit` to initialize values on a scope.\n * </div>\n *\n * <div class=\"alert alert-warning\">\n * **Note**: If you have assignment in `ngInit` along with a {@link ng.$filter `filter`}, make\n * sure you have parentheses to ensure correct operator precedence:\n * <pre class=\"prettyprint\">\n * `<div ng-init=\"test1 = ($index | toString)\"></div>`\n * </pre>\n * </div>\n *\n * @priority 450\n *\n * @element ANY\n * @param {expression} ngInit {@link guide/expression Expression} to eval.\n *\n * @example\n   <example module=\"initExample\">\n     <file name=\"index.html\">\n   <script>\n     angular.module('initExample', [])\n       .controller('ExampleController', ['$scope', function($scope) {\n         $scope.list = [['a', 'b'], ['c', 'd']];\n       }]);\n   </script>\n   <div ng-controller=\"ExampleController\">\n     <div ng-repeat=\"innerList in list\" ng-init=\"outerIndex = $index\">\n       <div ng-repeat=\"value in innerList\" ng-init=\"innerIndex = $index\">\n          <span class=\"example-init\">list[ {{outerIndex}} ][ {{innerIndex}} ] = {{value}};</span>\n       </div>\n     </div>\n   </div>\n     </file>\n     <file name=\"protractor.js\" type=\"protractor\">\n       it('should alias index positions', function() {\n         var elements = element.all(by.css('.example-init'));\n         expect(elements.get(0).getText()).toBe('list[ 0 ][ 0 ] = a;');\n         expect(elements.get(1).getText()).toBe('list[ 0 ][ 1 ] = b;');\n         expect(elements.get(2).getText()).toBe('list[ 1 ][ 0 ] = c;');\n         expect(elements.get(3).getText()).toBe('list[ 1 ][ 1 ] = d;');\n       });\n     </file>\n   </example>\n */\nvar ngInitDirective = ngDirective({\n  priority: 450,\n  compile: function() {\n    return {\n      pre: function(scope, element, attrs) {\n        scope.$eval(attrs.ngInit);\n      }\n    };\n  }\n});\n\n/**\n * @ngdoc directive\n * @name ngList\n *\n * @description\n * Text input that converts between a delimited string and an array of strings. The default\n * delimiter is a comma followed by a space - equivalent to `ng-list=\", \"`. You can specify a custom\n * delimiter as the value of the `ngList` attribute - for example, `ng-list=\" | \"`.\n *\n * The behaviour of the directive is affected by the use of the `ngTrim` attribute.\n * * If `ngTrim` is set to `\"false\"` then whitespace around both the separator and each\n *   list item is respected. This implies that the user of the directive is responsible for\n *   dealing with whitespace but also allows you to use whitespace as a delimiter, such as a\n *   tab or newline character.\n * * Otherwise whitespace around the delimiter is ignored when splitting (although it is respected\n *   when joining the list items back together) and whitespace around each list item is stripped\n *   before it is added to the model.\n *\n * ### Example with Validation\n *\n * <example name=\"ngList-directive\" module=\"listExample\">\n *   <file name=\"app.js\">\n *      angular.module('listExample', [])\n *        .controller('ExampleController', ['$scope', function($scope) {\n *          $scope.names = ['morpheus', 'neo', 'trinity'];\n *        }]);\n *   </file>\n *   <file name=\"index.html\">\n *    <form name=\"myForm\" ng-controller=\"ExampleController\">\n *      <label>List: <input name=\"namesInput\" ng-model=\"names\" ng-list required></label>\n *      <span role=\"alert\">\n *        <span class=\"error\" ng-show=\"myForm.namesInput.$error.required\">\n *        Required!</span>\n *      </span>\n *      <br>\n *      <tt>names = {{names}}</tt><br/>\n *      <tt>myForm.namesInput.$valid = {{myForm.namesInput.$valid}}</tt><br/>\n *      <tt>myForm.namesInput.$error = {{myForm.namesInput.$error}}</tt><br/>\n *      <tt>myForm.$valid = {{myForm.$valid}}</tt><br/>\n *      <tt>myForm.$error.required = {{!!myForm.$error.required}}</tt><br/>\n *     </form>\n *   </file>\n *   <file name=\"protractor.js\" type=\"protractor\">\n *     var listInput = element(by.model('names'));\n *     var names = element(by.exactBinding('names'));\n *     var valid = element(by.binding('myForm.namesInput.$valid'));\n *     var error = element(by.css('span.error'));\n *\n *     it('should initialize to model', function() {\n *       expect(names.getText()).toContain('[\"morpheus\",\"neo\",\"trinity\"]');\n *       expect(valid.getText()).toContain('true');\n *       expect(error.getCssValue('display')).toBe('none');\n *     });\n *\n *     it('should be invalid if empty', function() {\n *       listInput.clear();\n *       listInput.sendKeys('');\n *\n *       expect(names.getText()).toContain('');\n *       expect(valid.getText()).toContain('false');\n *       expect(error.getCssValue('display')).not.toBe('none');\n *     });\n *   </file>\n * </example>\n *\n * ### Example - splitting on newline\n * <example name=\"ngList-directive-newlines\">\n *   <file name=\"index.html\">\n *    <textarea ng-model=\"list\" ng-list=\"&#10;\" ng-trim=\"false\"></textarea>\n *    <pre>{{ list | json }}</pre>\n *   </file>\n *   <file name=\"protractor.js\" type=\"protractor\">\n *     it(\"should split the text by newlines\", function() {\n *       var listInput = element(by.model('list'));\n *       var output = element(by.binding('list | json'));\n *       listInput.sendKeys('abc\\ndef\\nghi');\n *       expect(output.getText()).toContain('[\\n  \"abc\",\\n  \"def\",\\n  \"ghi\"\\n]');\n *     });\n *   </file>\n * </example>\n *\n * @element input\n * @param {string=} ngList optional delimiter that should be used to split the value.\n */\nvar ngListDirective = function() {\n  return {\n    restrict: 'A',\n    priority: 100,\n    require: 'ngModel',\n    link: function(scope, element, attr, ctrl) {\n      // We want to control whitespace trimming so we use this convoluted approach\n      // to access the ngList attribute, which doesn't pre-trim the attribute\n      var ngList = element.attr(attr.$attr.ngList) || ', ';\n      var trimValues = attr.ngTrim !== 'false';\n      var separator = trimValues ? trim(ngList) : ngList;\n\n      var parse = function(viewValue) {\n        // If the viewValue is invalid (say required but empty) it will be `undefined`\n        if (isUndefined(viewValue)) return;\n\n        var list = [];\n\n        if (viewValue) {\n          forEach(viewValue.split(separator), function(value) {\n            if (value) list.push(trimValues ? trim(value) : value);\n          });\n        }\n\n        return list;\n      };\n\n      ctrl.$parsers.push(parse);\n      ctrl.$formatters.push(function(value) {\n        if (isArray(value)) {\n          return value.join(ngList);\n        }\n\n        return undefined;\n      });\n\n      // Override the standard $isEmpty because an empty array means the input is empty.\n      ctrl.$isEmpty = function(value) {\n        return !value || !value.length;\n      };\n    }\n  };\n};\n\n/* global VALID_CLASS: true,\n  INVALID_CLASS: true,\n  PRISTINE_CLASS: true,\n  DIRTY_CLASS: true,\n  UNTOUCHED_CLASS: true,\n  TOUCHED_CLASS: true,\n*/\n\nvar VALID_CLASS = 'ng-valid',\n    INVALID_CLASS = 'ng-invalid',\n    PRISTINE_CLASS = 'ng-pristine',\n    DIRTY_CLASS = 'ng-dirty',\n    UNTOUCHED_CLASS = 'ng-untouched',\n    TOUCHED_CLASS = 'ng-touched',\n    PENDING_CLASS = 'ng-pending',\n    EMPTY_CLASS = 'ng-empty',\n    NOT_EMPTY_CLASS = 'ng-not-empty';\n\nvar ngModelMinErr = minErr('ngModel');\n\n/**\n * @ngdoc type\n * @name ngModel.NgModelController\n *\n * @property {*} $viewValue The actual value from the control's view. For `input` elements, this is a\n * String. See {@link ngModel.NgModelController#$setViewValue} for information about when the $viewValue\n * is set.\n * @property {*} $modelValue The value in the model that the control is bound to.\n * @property {Array.<Function>} $parsers Array of functions to execute, as a pipeline, whenever\n       the control reads value from the DOM. The functions are called in array order, each passing\n       its return value through to the next. The last return value is forwarded to the\n       {@link ngModel.NgModelController#$validators `$validators`} collection.\n\nParsers are used to sanitize / convert the {@link ngModel.NgModelController#$viewValue\n`$viewValue`}.\n\nReturning `undefined` from a parser means a parse error occurred. In that case,\nno {@link ngModel.NgModelController#$validators `$validators`} will run and the `ngModel`\nwill be set to `undefined` unless {@link ngModelOptions `ngModelOptions.allowInvalid`}\nis set to `true`. The parse error is stored in `ngModel.$error.parse`.\n\n *\n * @property {Array.<Function>} $formatters Array of functions to execute, as a pipeline, whenever\n       the model value changes. The functions are called in reverse array order, each passing the value through to the\n       next. The last return value is used as the actual DOM value.\n       Used to format / convert values for display in the control.\n * ```js\n * function formatter(value) {\n *   if (value) {\n *     return value.toUpperCase();\n *   }\n * }\n * ngModel.$formatters.push(formatter);\n * ```\n *\n * @property {Object.<string, function>} $validators A collection of validators that are applied\n *      whenever the model value changes. The key value within the object refers to the name of the\n *      validator while the function refers to the validation operation. The validation operation is\n *      provided with the model value as an argument and must return a true or false value depending\n *      on the response of that validation.\n *\n * ```js\n * ngModel.$validators.validCharacters = function(modelValue, viewValue) {\n *   var value = modelValue || viewValue;\n *   return /[0-9]+/.test(value) &&\n *          /[a-z]+/.test(value) &&\n *          /[A-Z]+/.test(value) &&\n *          /\\W+/.test(value);\n * };\n * ```\n *\n * @property {Object.<string, function>} $asyncValidators A collection of validations that are expected to\n *      perform an asynchronous validation (e.g. a HTTP request). The validation function that is provided\n *      is expected to return a promise when it is run during the model validation process. Once the promise\n *      is delivered then the validation status will be set to true when fulfilled and false when rejected.\n *      When the asynchronous validators are triggered, each of the validators will run in parallel and the model\n *      value will only be updated once all validators have been fulfilled. As long as an asynchronous validator\n *      is unfulfilled, its key will be added to the controllers `$pending` property. Also, all asynchronous validators\n *      will only run once all synchronous validators have passed.\n *\n * Please note that if $http is used then it is important that the server returns a success HTTP response code\n * in order to fulfill the validation and a status level of `4xx` in order to reject the validation.\n *\n * ```js\n * ngModel.$asyncValidators.uniqueUsername = function(modelValue, viewValue) {\n *   var value = modelValue || viewValue;\n *\n *   // Lookup user by username\n *   return $http.get('/api/users/' + value).\n *      then(function resolved() {\n *        //username exists, this means validation fails\n *        return $q.reject('exists');\n *      }, function rejected() {\n *        //username does not exist, therefore this validation passes\n *        return true;\n *      });\n * };\n * ```\n *\n * @property {Array.<Function>} $viewChangeListeners Array of functions to execute whenever the\n *     view value has changed. It is called with no arguments, and its return value is ignored.\n *     This can be used in place of additional $watches against the model value.\n *\n * @property {Object} $error An object hash with all failing validator ids as keys.\n * @property {Object} $pending An object hash with all pending validator ids as keys.\n *\n * @property {boolean} $untouched True if control has not lost focus yet.\n * @property {boolean} $touched True if control has lost focus.\n * @property {boolean} $pristine True if user has not interacted with the control yet.\n * @property {boolean} $dirty True if user has already interacted with the control.\n * @property {boolean} $valid True if there is no error.\n * @property {boolean} $invalid True if at least one error on the control.\n * @property {string} $name The name attribute of the control.\n *\n * @description\n *\n * `NgModelController` provides API for the {@link ngModel `ngModel`} directive.\n * The controller contains services for data-binding, validation, CSS updates, and value formatting\n * and parsing. It purposefully does not contain any logic which deals with DOM rendering or\n * listening to DOM events.\n * Such DOM related logic should be provided by other directives which make use of\n * `NgModelController` for data-binding to control elements.\n * Angular provides this DOM logic for most {@link input `input`} elements.\n * At the end of this page you can find a {@link ngModel.NgModelController#custom-control-example\n * custom control example} that uses `ngModelController` to bind to `contenteditable` elements.\n *\n * @example\n * ### Custom Control Example\n * This example shows how to use `NgModelController` with a custom control to achieve\n * data-binding. Notice how different directives (`contenteditable`, `ng-model`, and `required`)\n * collaborate together to achieve the desired result.\n *\n * `contenteditable` is an HTML5 attribute, which tells the browser to let the element\n * contents be edited in place by the user.\n *\n * We are using the {@link ng.service:$sce $sce} service here and include the {@link ngSanitize $sanitize}\n * module to automatically remove \"bad\" content like inline event listener (e.g. `<span onclick=\"...\">`).\n * However, as we are using `$sce` the model can still decide to provide unsafe content if it marks\n * that content using the `$sce` service.\n *\n * <example name=\"NgModelController\" module=\"customControl\" deps=\"angular-sanitize.js\">\n    <file name=\"style.css\">\n      [contenteditable] {\n        border: 1px solid black;\n        background-color: white;\n        min-height: 20px;\n      }\n\n      .ng-invalid {\n        border: 1px solid red;\n      }\n\n    </file>\n    <file name=\"script.js\">\n      angular.module('customControl', ['ngSanitize']).\n        directive('contenteditable', ['$sce', function($sce) {\n          return {\n            restrict: 'A', // only activate on element attribute\n            require: '?ngModel', // get a hold of NgModelController\n            link: function(scope, element, attrs, ngModel) {\n              if (!ngModel) return; // do nothing if no ng-model\n\n              // Specify how UI should be updated\n              ngModel.$render = function() {\n                element.html($sce.getTrustedHtml(ngModel.$viewValue || ''));\n              };\n\n              // Listen for change events to enable binding\n              element.on('blur keyup change', function() {\n                scope.$evalAsync(read);\n              });\n              read(); // initialize\n\n              // Write data to the model\n              function read() {\n                var html = element.html();\n                // When we clear the content editable the browser leaves a <br> behind\n                // If strip-br attribute is provided then we strip this out\n                if ( attrs.stripBr && html == '<br>' ) {\n                  html = '';\n                }\n                ngModel.$setViewValue(html);\n              }\n            }\n          };\n        }]);\n    </file>\n    <file name=\"index.html\">\n      <form name=\"myForm\">\n       <div contenteditable\n            name=\"myWidget\" ng-model=\"userContent\"\n            strip-br=\"true\"\n            required>Change me!</div>\n        <span ng-show=\"myForm.myWidget.$error.required\">Required!</span>\n       <hr>\n       <textarea ng-model=\"userContent\" aria-label=\"Dynamic textarea\"></textarea>\n      </form>\n    </file>\n    <file name=\"protractor.js\" type=\"protractor\">\n    it('should data-bind and become invalid', function() {\n      if (browser.params.browser == 'safari' || browser.params.browser == 'firefox') {\n        // SafariDriver can't handle contenteditable\n        // and Firefox driver can't clear contenteditables very well\n        return;\n      }\n      var contentEditable = element(by.css('[contenteditable]'));\n      var content = 'Change me!';\n\n      expect(contentEditable.getText()).toEqual(content);\n\n      contentEditable.clear();\n      contentEditable.sendKeys(protractor.Key.BACK_SPACE);\n      expect(contentEditable.getText()).toEqual('');\n      expect(contentEditable.getAttribute('class')).toMatch(/ng-invalid-required/);\n    });\n    </file>\n * </example>\n *\n *\n */\nvar NgModelController = ['$scope', '$exceptionHandler', '$attrs', '$element', '$parse', '$animate', '$timeout', '$rootScope', '$q', '$interpolate',\n    function($scope, $exceptionHandler, $attr, $element, $parse, $animate, $timeout, $rootScope, $q, $interpolate) {\n  this.$viewValue = Number.NaN;\n  this.$modelValue = Number.NaN;\n  this.$$rawModelValue = undefined; // stores the parsed modelValue / model set from scope regardless of validity.\n  this.$validators = {};\n  this.$asyncValidators = {};\n  this.$parsers = [];\n  this.$formatters = [];\n  this.$viewChangeListeners = [];\n  this.$untouched = true;\n  this.$touched = false;\n  this.$pristine = true;\n  this.$dirty = false;\n  this.$valid = true;\n  this.$invalid = false;\n  this.$error = {}; // keep invalid keys here\n  this.$$success = {}; // keep valid keys here\n  this.$pending = undefined; // keep pending keys here\n  this.$name = $interpolate($attr.name || '', false)($scope);\n  this.$$parentForm = nullFormCtrl;\n\n  var parsedNgModel = $parse($attr.ngModel),\n      parsedNgModelAssign = parsedNgModel.assign,\n      ngModelGet = parsedNgModel,\n      ngModelSet = parsedNgModelAssign,\n      pendingDebounce = null,\n      parserValid,\n      ctrl = this;\n\n  this.$$setOptions = function(options) {\n    ctrl.$options = options;\n    if (options && options.getterSetter) {\n      var invokeModelGetter = $parse($attr.ngModel + '()'),\n          invokeModelSetter = $parse($attr.ngModel + '($$$p)');\n\n      ngModelGet = function($scope) {\n        var modelValue = parsedNgModel($scope);\n        if (isFunction(modelValue)) {\n          modelValue = invokeModelGetter($scope);\n        }\n        return modelValue;\n      };\n      ngModelSet = function($scope, newValue) {\n        if (isFunction(parsedNgModel($scope))) {\n          invokeModelSetter($scope, {$$$p: newValue});\n        } else {\n          parsedNgModelAssign($scope, newValue);\n        }\n      };\n    } else if (!parsedNgModel.assign) {\n      throw ngModelMinErr('nonassign', \"Expression '{0}' is non-assignable. Element: {1}\",\n          $attr.ngModel, startingTag($element));\n    }\n  };\n\n  /**\n   * @ngdoc method\n   * @name ngModel.NgModelController#$render\n   *\n   * @description\n   * Called when the view needs to be updated. It is expected that the user of the ng-model\n   * directive will implement this method.\n   *\n   * The `$render()` method is invoked in the following situations:\n   *\n   * * `$rollbackViewValue()` is called.  If we are rolling back the view value to the last\n   *   committed value then `$render()` is called to update the input control.\n   * * The value referenced by `ng-model` is changed programmatically and both the `$modelValue` and\n   *   the `$viewValue` are different from last time.\n   *\n   * Since `ng-model` does not do a deep watch, `$render()` is only invoked if the values of\n   * `$modelValue` and `$viewValue` are actually different from their previous values. If `$modelValue`\n   * or `$viewValue` are objects (rather than a string or number) then `$render()` will not be\n   * invoked if you only change a property on the objects.\n   */\n  this.$render = noop;\n\n  /**\n   * @ngdoc method\n   * @name ngModel.NgModelController#$isEmpty\n   *\n   * @description\n   * This is called when we need to determine if the value of an input is empty.\n   *\n   * For instance, the required directive does this to work out if the input has data or not.\n   *\n   * The default `$isEmpty` function checks whether the value is `undefined`, `''`, `null` or `NaN`.\n   *\n   * You can override this for input directives whose concept of being empty is different from the\n   * default. The `checkboxInputType` directive does this because in its case a value of `false`\n   * implies empty.\n   *\n   * @param {*} value The value of the input to check for emptiness.\n   * @returns {boolean} True if `value` is \"empty\".\n   */\n  this.$isEmpty = function(value) {\n    return isUndefined(value) || value === '' || value === null || value !== value;\n  };\n\n  this.$$updateEmptyClasses = function(value) {\n    if (ctrl.$isEmpty(value)) {\n      $animate.removeClass($element, NOT_EMPTY_CLASS);\n      $animate.addClass($element, EMPTY_CLASS);\n    } else {\n      $animate.removeClass($element, EMPTY_CLASS);\n      $animate.addClass($element, NOT_EMPTY_CLASS);\n    }\n  };\n\n\n  var currentValidationRunId = 0;\n\n  /**\n   * @ngdoc method\n   * @name ngModel.NgModelController#$setValidity\n   *\n   * @description\n   * Change the validity state, and notify the form.\n   *\n   * This method can be called within $parsers/$formatters or a custom validation implementation.\n   * However, in most cases it should be sufficient to use the `ngModel.$validators` and\n   * `ngModel.$asyncValidators` collections which will call `$setValidity` automatically.\n   *\n   * @param {string} validationErrorKey Name of the validator. The `validationErrorKey` will be assigned\n   *        to either `$error[validationErrorKey]` or `$pending[validationErrorKey]`\n   *        (for unfulfilled `$asyncValidators`), so that it is available for data-binding.\n   *        The `validationErrorKey` should be in camelCase and will get converted into dash-case\n   *        for class name. Example: `myError` will result in `ng-valid-my-error` and `ng-invalid-my-error`\n   *        class and can be bound to as  `{{someForm.someControl.$error.myError}}` .\n   * @param {boolean} isValid Whether the current state is valid (true), invalid (false), pending (undefined),\n   *                          or skipped (null). Pending is used for unfulfilled `$asyncValidators`.\n   *                          Skipped is used by Angular when validators do not run because of parse errors and\n   *                          when `$asyncValidators` do not run because any of the `$validators` failed.\n   */\n  addSetValidityMethod({\n    ctrl: this,\n    $element: $element,\n    set: function(object, property) {\n      object[property] = true;\n    },\n    unset: function(object, property) {\n      delete object[property];\n    },\n    $animate: $animate\n  });\n\n  /**\n   * @ngdoc method\n   * @name ngModel.NgModelController#$setPristine\n   *\n   * @description\n   * Sets the control to its pristine state.\n   *\n   * This method can be called to remove the `ng-dirty` class and set the control to its pristine\n   * state (`ng-pristine` class). A model is considered to be pristine when the control\n   * has not been changed from when first compiled.\n   */\n  this.$setPristine = function() {\n    ctrl.$dirty = false;\n    ctrl.$pristine = true;\n    $animate.removeClass($element, DIRTY_CLASS);\n    $animate.addClass($element, PRISTINE_CLASS);\n  };\n\n  /**\n   * @ngdoc method\n   * @name ngModel.NgModelController#$setDirty\n   *\n   * @description\n   * Sets the control to its dirty state.\n   *\n   * This method can be called to remove the `ng-pristine` class and set the control to its dirty\n   * state (`ng-dirty` class). A model is considered to be dirty when the control has been changed\n   * from when first compiled.\n   */\n  this.$setDirty = function() {\n    ctrl.$dirty = true;\n    ctrl.$pristine = false;\n    $animate.removeClass($element, PRISTINE_CLASS);\n    $animate.addClass($element, DIRTY_CLASS);\n    ctrl.$$parentForm.$setDirty();\n  };\n\n  /**\n   * @ngdoc method\n   * @name ngModel.NgModelController#$setUntouched\n   *\n   * @description\n   * Sets the control to its untouched state.\n   *\n   * This method can be called to remove the `ng-touched` class and set the control to its\n   * untouched state (`ng-untouched` class). Upon compilation, a model is set as untouched\n   * by default, however this function can be used to restore that state if the model has\n   * already been touched by the user.\n   */\n  this.$setUntouched = function() {\n    ctrl.$touched = false;\n    ctrl.$untouched = true;\n    $animate.setClass($element, UNTOUCHED_CLASS, TOUCHED_CLASS);\n  };\n\n  /**\n   * @ngdoc method\n   * @name ngModel.NgModelController#$setTouched\n   *\n   * @description\n   * Sets the control to its touched state.\n   *\n   * This method can be called to remove the `ng-untouched` class and set the control to its\n   * touched state (`ng-touched` class). A model is considered to be touched when the user has\n   * first focused the control element and then shifted focus away from the control (blur event).\n   */\n  this.$setTouched = function() {\n    ctrl.$touched = true;\n    ctrl.$untouched = false;\n    $animate.setClass($element, TOUCHED_CLASS, UNTOUCHED_CLASS);\n  };\n\n  /**\n   * @ngdoc method\n   * @name ngModel.NgModelController#$rollbackViewValue\n   *\n   * @description\n   * Cancel an update and reset the input element's value to prevent an update to the `$modelValue`,\n   * which may be caused by a pending debounced event or because the input is waiting for a some\n   * future event.\n   *\n   * If you have an input that uses `ng-model-options` to set up debounced updates or updates that\n   * depend on special events such as blur, you can have a situation where there is a period when\n   * the `$viewValue` is out of sync with the ngModel's `$modelValue`.\n   *\n   * In this case, you can use `$rollbackViewValue()` to manually cancel the debounced / future update\n   * and reset the input to the last committed view value.\n   *\n   * It is also possible that you run into difficulties if you try to update the ngModel's `$modelValue`\n   * programmatically before these debounced/future events have resolved/occurred, because Angular's\n   * dirty checking mechanism is not able to tell whether the model has actually changed or not.\n   *\n   * The `$rollbackViewValue()` method should be called before programmatically changing the model of an\n   * input which may have such events pending. This is important in order to make sure that the\n   * input field will be updated with the new model value and any pending operations are cancelled.\n   *\n   * <example name=\"ng-model-cancel-update\" module=\"cancel-update-example\">\n   *   <file name=\"app.js\">\n   *     angular.module('cancel-update-example', [])\n   *\n   *     .controller('CancelUpdateController', ['$scope', function($scope) {\n   *       $scope.model = {};\n   *\n   *       $scope.setEmpty = function(e, value, rollback) {\n   *         if (e.keyCode == 27) {\n   *           e.preventDefault();\n   *           if (rollback) {\n   *             $scope.myForm[value].$rollbackViewValue();\n   *           }\n   *           $scope.model[value] = '';\n   *         }\n   *       };\n   *     }]);\n   *   </file>\n   *   <file name=\"index.html\">\n   *     <div ng-controller=\"CancelUpdateController\">\n   *        <p>Both of these inputs are only updated if they are blurred. Hitting escape should\n   *        empty them. Follow these steps and observe the difference:</p>\n   *       <ol>\n   *         <li>Type something in the input. You will see that the model is not yet updated</li>\n   *         <li>Press the Escape key.\n   *           <ol>\n   *             <li> In the first example, nothing happens, because the model is already '', and no\n   *             update is detected. If you blur the input, the model will be set to the current view.\n   *             </li>\n   *             <li> In the second example, the pending update is cancelled, and the input is set back\n   *             to the last committed view value (''). Blurring the input does nothing.\n   *             </li>\n   *           </ol>\n   *         </li>\n   *       </ol>\n   *\n   *       <form name=\"myForm\" ng-model-options=\"{ updateOn: 'blur' }\">\n   *         <div>\n   *        <p id=\"inputDescription1\">Without $rollbackViewValue():</p>\n   *         <input name=\"value1\" aria-describedby=\"inputDescription1\" ng-model=\"model.value1\"\n   *                ng-keydown=\"setEmpty($event, 'value1')\">\n   *         value1: \"{{ model.value1 }}\"\n   *         </div>\n   *\n   *         <div>\n   *        <p id=\"inputDescription2\">With $rollbackViewValue():</p>\n   *         <input name=\"value2\" aria-describedby=\"inputDescription2\" ng-model=\"model.value2\"\n   *                ng-keydown=\"setEmpty($event, 'value2', true)\">\n   *         value2: \"{{ model.value2 }}\"\n   *         </div>\n   *       </form>\n   *     </div>\n   *   </file>\n       <file name=\"style.css\">\n          div {\n            display: table-cell;\n          }\n          div:nth-child(1) {\n            padding-right: 30px;\n          }\n\n        </file>\n   * </example>\n   */\n  this.$rollbackViewValue = function() {\n    $timeout.cancel(pendingDebounce);\n    ctrl.$viewValue = ctrl.$$lastCommittedViewValue;\n    ctrl.$render();\n  };\n\n  /**\n   * @ngdoc method\n   * @name ngModel.NgModelController#$validate\n   *\n   * @description\n   * Runs each of the registered validators (first synchronous validators and then\n   * asynchronous validators).\n   * If the validity changes to invalid, the model will be set to `undefined`,\n   * unless {@link ngModelOptions `ngModelOptions.allowInvalid`} is `true`.\n   * If the validity changes to valid, it will set the model to the last available valid\n   * `$modelValue`, i.e. either the last parsed value or the last value set from the scope.\n   */\n  this.$validate = function() {\n    // ignore $validate before model is initialized\n    if (isNumber(ctrl.$modelValue) && isNaN(ctrl.$modelValue)) {\n      return;\n    }\n\n    var viewValue = ctrl.$$lastCommittedViewValue;\n    // Note: we use the $$rawModelValue as $modelValue might have been\n    // set to undefined during a view -> model update that found validation\n    // errors. We can't parse the view here, since that could change\n    // the model although neither viewValue nor the model on the scope changed\n    var modelValue = ctrl.$$rawModelValue;\n\n    var prevValid = ctrl.$valid;\n    var prevModelValue = ctrl.$modelValue;\n\n    var allowInvalid = ctrl.$options && ctrl.$options.allowInvalid;\n\n    ctrl.$$runValidators(modelValue, viewValue, function(allValid) {\n      // If there was no change in validity, don't update the model\n      // This prevents changing an invalid modelValue to undefined\n      if (!allowInvalid && prevValid !== allValid) {\n        // Note: Don't check ctrl.$valid here, as we could have\n        // external validators (e.g. calculated on the server),\n        // that just call $setValidity and need the model value\n        // to calculate their validity.\n        ctrl.$modelValue = allValid ? modelValue : undefined;\n\n        if (ctrl.$modelValue !== prevModelValue) {\n          ctrl.$$writeModelToScope();\n        }\n      }\n    });\n\n  };\n\n  this.$$runValidators = function(modelValue, viewValue, doneCallback) {\n    currentValidationRunId++;\n    var localValidationRunId = currentValidationRunId;\n\n    // check parser error\n    if (!processParseErrors()) {\n      validationDone(false);\n      return;\n    }\n    if (!processSyncValidators()) {\n      validationDone(false);\n      return;\n    }\n    processAsyncValidators();\n\n    function processParseErrors() {\n      var errorKey = ctrl.$$parserName || 'parse';\n      if (isUndefined(parserValid)) {\n        setValidity(errorKey, null);\n      } else {\n        if (!parserValid) {\n          forEach(ctrl.$validators, function(v, name) {\n            setValidity(name, null);\n          });\n          forEach(ctrl.$asyncValidators, function(v, name) {\n            setValidity(name, null);\n          });\n        }\n        // Set the parse error last, to prevent unsetting it, should a $validators key == parserName\n        setValidity(errorKey, parserValid);\n        return parserValid;\n      }\n      return true;\n    }\n\n    function processSyncValidators() {\n      var syncValidatorsValid = true;\n      forEach(ctrl.$validators, function(validator, name) {\n        var result = validator(modelValue, viewValue);\n        syncValidatorsValid = syncValidatorsValid && result;\n        setValidity(name, result);\n      });\n      if (!syncValidatorsValid) {\n        forEach(ctrl.$asyncValidators, function(v, name) {\n          setValidity(name, null);\n        });\n        return false;\n      }\n      return true;\n    }\n\n    function processAsyncValidators() {\n      var validatorPromises = [];\n      var allValid = true;\n      forEach(ctrl.$asyncValidators, function(validator, name) {\n        var promise = validator(modelValue, viewValue);\n        if (!isPromiseLike(promise)) {\n          throw ngModelMinErr('nopromise',\n            \"Expected asynchronous validator to return a promise but got '{0}' instead.\", promise);\n        }\n        setValidity(name, undefined);\n        validatorPromises.push(promise.then(function() {\n          setValidity(name, true);\n        }, function() {\n          allValid = false;\n          setValidity(name, false);\n        }));\n      });\n      if (!validatorPromises.length) {\n        validationDone(true);\n      } else {\n        $q.all(validatorPromises).then(function() {\n          validationDone(allValid);\n        }, noop);\n      }\n    }\n\n    function setValidity(name, isValid) {\n      if (localValidationRunId === currentValidationRunId) {\n        ctrl.$setValidity(name, isValid);\n      }\n    }\n\n    function validationDone(allValid) {\n      if (localValidationRunId === currentValidationRunId) {\n\n        doneCallback(allValid);\n      }\n    }\n  };\n\n  /**\n   * @ngdoc method\n   * @name ngModel.NgModelController#$commitViewValue\n   *\n   * @description\n   * Commit a pending update to the `$modelValue`.\n   *\n   * Updates may be pending by a debounced event or because the input is waiting for a some future\n   * event defined in `ng-model-options`. this method is rarely needed as `NgModelController`\n   * usually handles calling this in response to input events.\n   */\n  this.$commitViewValue = function() {\n    var viewValue = ctrl.$viewValue;\n\n    $timeout.cancel(pendingDebounce);\n\n    // If the view value has not changed then we should just exit, except in the case where there is\n    // a native validator on the element. In this case the validation state may have changed even though\n    // the viewValue has stayed empty.\n    if (ctrl.$$lastCommittedViewValue === viewValue && (viewValue !== '' || !ctrl.$$hasNativeValidators)) {\n      return;\n    }\n    ctrl.$$updateEmptyClasses(viewValue);\n    ctrl.$$lastCommittedViewValue = viewValue;\n\n    // change to dirty\n    if (ctrl.$pristine) {\n      this.$setDirty();\n    }\n    this.$$parseAndValidate();\n  };\n\n  this.$$parseAndValidate = function() {\n    var viewValue = ctrl.$$lastCommittedViewValue;\n    var modelValue = viewValue;\n    parserValid = isUndefined(modelValue) ? undefined : true;\n\n    if (parserValid) {\n      for (var i = 0; i < ctrl.$parsers.length; i++) {\n        modelValue = ctrl.$parsers[i](modelValue);\n        if (isUndefined(modelValue)) {\n          parserValid = false;\n          break;\n        }\n      }\n    }\n    if (isNumber(ctrl.$modelValue) && isNaN(ctrl.$modelValue)) {\n      // ctrl.$modelValue has not been touched yet...\n      ctrl.$modelValue = ngModelGet($scope);\n    }\n    var prevModelValue = ctrl.$modelValue;\n    var allowInvalid = ctrl.$options && ctrl.$options.allowInvalid;\n    ctrl.$$rawModelValue = modelValue;\n\n    if (allowInvalid) {\n      ctrl.$modelValue = modelValue;\n      writeToModelIfNeeded();\n    }\n\n    // Pass the $$lastCommittedViewValue here, because the cached viewValue might be out of date.\n    // This can happen if e.g. $setViewValue is called from inside a parser\n    ctrl.$$runValidators(modelValue, ctrl.$$lastCommittedViewValue, function(allValid) {\n      if (!allowInvalid) {\n        // Note: Don't check ctrl.$valid here, as we could have\n        // external validators (e.g. calculated on the server),\n        // that just call $setValidity and need the model value\n        // to calculate their validity.\n        ctrl.$modelValue = allValid ? modelValue : undefined;\n        writeToModelIfNeeded();\n      }\n    });\n\n    function writeToModelIfNeeded() {\n      if (ctrl.$modelValue !== prevModelValue) {\n        ctrl.$$writeModelToScope();\n      }\n    }\n  };\n\n  this.$$writeModelToScope = function() {\n    ngModelSet($scope, ctrl.$modelValue);\n    forEach(ctrl.$viewChangeListeners, function(listener) {\n      try {\n        listener();\n      } catch (e) {\n        $exceptionHandler(e);\n      }\n    });\n  };\n\n  /**\n   * @ngdoc method\n   * @name ngModel.NgModelController#$setViewValue\n   *\n   * @description\n   * Update the view value.\n   *\n   * This method should be called when a control wants to change the view value; typically,\n   * this is done from within a DOM event handler. For example, the {@link ng.directive:input input}\n   * directive calls it when the value of the input changes and {@link ng.directive:select select}\n   * calls it when an option is selected.\n   *\n   * When `$setViewValue` is called, the new `value` will be staged for committing through the `$parsers`\n   * and `$validators` pipelines. If there are no special {@link ngModelOptions} specified then the staged\n   * value sent directly for processing, finally to be applied to `$modelValue` and then the\n   * **expression** specified in the `ng-model` attribute. Lastly, all the registered change listeners,\n   * in the `$viewChangeListeners` list, are called.\n   *\n   * In case the {@link ng.directive:ngModelOptions ngModelOptions} directive is used with `updateOn`\n   * and the `default` trigger is not listed, all those actions will remain pending until one of the\n   * `updateOn` events is triggered on the DOM element.\n   * All these actions will be debounced if the {@link ng.directive:ngModelOptions ngModelOptions}\n   * directive is used with a custom debounce for this particular event.\n   * Note that a `$digest` is only triggered once the `updateOn` events are fired, or if `debounce`\n   * is specified, once the timer runs out.\n   *\n   * When used with standard inputs, the view value will always be a string (which is in some cases\n   * parsed into another type, such as a `Date` object for `input[date]`.)\n   * However, custom controls might also pass objects to this method. In this case, we should make\n   * a copy of the object before passing it to `$setViewValue`. This is because `ngModel` does not\n   * perform a deep watch of objects, it only looks for a change of identity. If you only change\n   * the property of the object then ngModel will not realize that the object has changed and\n   * will not invoke the `$parsers` and `$validators` pipelines. For this reason, you should\n   * not change properties of the copy once it has been passed to `$setViewValue`.\n   * Otherwise you may cause the model value on the scope to change incorrectly.\n   *\n   * <div class=\"alert alert-info\">\n   * In any case, the value passed to the method should always reflect the current value\n   * of the control. For example, if you are calling `$setViewValue` for an input element,\n   * you should pass the input DOM value. Otherwise, the control and the scope model become\n   * out of sync. It's also important to note that `$setViewValue` does not call `$render` or change\n   * the control's DOM value in any way. If we want to change the control's DOM value\n   * programmatically, we should update the `ngModel` scope expression. Its new value will be\n   * picked up by the model controller, which will run it through the `$formatters`, `$render` it\n   * to update the DOM, and finally call `$validate` on it.\n   * </div>\n   *\n   * @param {*} value value from the view.\n   * @param {string} trigger Event that triggered the update.\n   */\n  this.$setViewValue = function(value, trigger) {\n    ctrl.$viewValue = value;\n    if (!ctrl.$options || ctrl.$options.updateOnDefault) {\n      ctrl.$$debounceViewValueCommit(trigger);\n    }\n  };\n\n  this.$$debounceViewValueCommit = function(trigger) {\n    var debounceDelay = 0,\n        options = ctrl.$options,\n        debounce;\n\n    if (options && isDefined(options.debounce)) {\n      debounce = options.debounce;\n      if (isNumber(debounce)) {\n        debounceDelay = debounce;\n      } else if (isNumber(debounce[trigger])) {\n        debounceDelay = debounce[trigger];\n      } else if (isNumber(debounce['default'])) {\n        debounceDelay = debounce['default'];\n      }\n    }\n\n    $timeout.cancel(pendingDebounce);\n    if (debounceDelay) {\n      pendingDebounce = $timeout(function() {\n        ctrl.$commitViewValue();\n      }, debounceDelay);\n    } else if ($rootScope.$$phase) {\n      ctrl.$commitViewValue();\n    } else {\n      $scope.$apply(function() {\n        ctrl.$commitViewValue();\n      });\n    }\n  };\n\n  // model -> value\n  // Note: we cannot use a normal scope.$watch as we want to detect the following:\n  // 1. scope value is 'a'\n  // 2. user enters 'b'\n  // 3. ng-change kicks in and reverts scope value to 'a'\n  //    -> scope value did not change since the last digest as\n  //       ng-change executes in apply phase\n  // 4. view should be changed back to 'a'\n  $scope.$watch(function ngModelWatch() {\n    var modelValue = ngModelGet($scope);\n\n    // if scope model value and ngModel value are out of sync\n    // TODO(perf): why not move this to the action fn?\n    if (modelValue !== ctrl.$modelValue &&\n       // checks for NaN is needed to allow setting the model to NaN when there's an asyncValidator\n       (ctrl.$modelValue === ctrl.$modelValue || modelValue === modelValue)\n    ) {\n      ctrl.$modelValue = ctrl.$$rawModelValue = modelValue;\n      parserValid = undefined;\n\n      var formatters = ctrl.$formatters,\n          idx = formatters.length;\n\n      var viewValue = modelValue;\n      while (idx--) {\n        viewValue = formatters[idx](viewValue);\n      }\n      if (ctrl.$viewValue !== viewValue) {\n        ctrl.$$updateEmptyClasses(viewValue);\n        ctrl.$viewValue = ctrl.$$lastCommittedViewValue = viewValue;\n        ctrl.$render();\n\n        ctrl.$$runValidators(modelValue, viewValue, noop);\n      }\n    }\n\n    return modelValue;\n  });\n}];\n\n\n/**\n * @ngdoc directive\n * @name ngModel\n *\n * @element input\n * @priority 1\n *\n * @description\n * The `ngModel` directive binds an `input`,`select`, `textarea` (or custom form control) to a\n * property on the scope using {@link ngModel.NgModelController NgModelController},\n * which is created and exposed by this directive.\n *\n * `ngModel` is responsible for:\n *\n * - Binding the view into the model, which other directives such as `input`, `textarea` or `select`\n *   require.\n * - Providing validation behavior (i.e. required, number, email, url).\n * - Keeping the state of the control (valid/invalid, dirty/pristine, touched/untouched, validation errors).\n * - Setting related css classes on the element (`ng-valid`, `ng-invalid`, `ng-dirty`, `ng-pristine`, `ng-touched`,\n *   `ng-untouched`, `ng-empty`, `ng-not-empty`) including animations.\n * - Registering the control with its parent {@link ng.directive:form form}.\n *\n * Note: `ngModel` will try to bind to the property given by evaluating the expression on the\n * current scope. If the property doesn't already exist on this scope, it will be created\n * implicitly and added to the scope.\n *\n * For best practices on using `ngModel`, see:\n *\n *  - [Understanding Scopes](https://github.com/angular/angular.js/wiki/Understanding-Scopes)\n *\n * For basic examples, how to use `ngModel`, see:\n *\n *  - {@link ng.directive:input input}\n *    - {@link input[text] text}\n *    - {@link input[checkbox] checkbox}\n *    - {@link input[radio] radio}\n *    - {@link input[number] number}\n *    - {@link input[email] email}\n *    - {@link input[url] url}\n *    - {@link input[date] date}\n *    - {@link input[datetime-local] datetime-local}\n *    - {@link input[time] time}\n *    - {@link input[month] month}\n *    - {@link input[week] week}\n *  - {@link ng.directive:select select}\n *  - {@link ng.directive:textarea textarea}\n *\n * # Complex Models (objects or collections)\n *\n * By default, `ngModel` watches the model by reference, not value. This is important to know when\n * binding inputs to models that are objects (e.g. `Date`) or collections (e.g. arrays). If only properties of the\n * object or collection change, `ngModel` will not be notified and so the input will not be  re-rendered.\n *\n * The model must be assigned an entirely new object or collection before a re-rendering will occur.\n *\n * Some directives have options that will cause them to use a custom `$watchCollection` on the model expression\n * - for example, `ngOptions` will do so when a `track by` clause is included in the comprehension expression or\n * if the select is given the `multiple` attribute.\n *\n * The `$watchCollection()` method only does a shallow comparison, meaning that changing properties deeper than the\n * first level of the object (or only changing the properties of an item in the collection if it's an array) will still\n * not trigger a re-rendering of the model.\n *\n * # CSS classes\n * The following CSS classes are added and removed on the associated input/select/textarea element\n * depending on the validity of the model.\n *\n *  - `ng-valid`: the model is valid\n *  - `ng-invalid`: the model is invalid\n *  - `ng-valid-[key]`: for each valid key added by `$setValidity`\n *  - `ng-invalid-[key]`: for each invalid key added by `$setValidity`\n *  - `ng-pristine`: the control hasn't been interacted with yet\n *  - `ng-dirty`: the control has been interacted with\n *  - `ng-touched`: the control has been blurred\n *  - `ng-untouched`: the control hasn't been blurred\n *  - `ng-pending`: any `$asyncValidators` are unfulfilled\n *  - `ng-empty`: the view does not contain a value or the value is deemed \"empty\", as defined\n *     by the {@link ngModel.NgModelController#$isEmpty} method\n *  - `ng-not-empty`: the view contains a non-empty value\n *\n * Keep in mind that ngAnimate can detect each of these classes when added and removed.\n *\n * ## Animation Hooks\n *\n * Animations within models are triggered when any of the associated CSS classes are added and removed\n * on the input element which is attached to the model. These classes include: `.ng-pristine`, `.ng-dirty`,\n * `.ng-invalid` and `.ng-valid` as well as any other validations that are performed on the model itself.\n * The animations that are triggered within ngModel are similar to how they work in ngClass and\n * animations can be hooked into using CSS transitions, keyframes as well as JS animations.\n *\n * The following example shows a simple way to utilize CSS transitions to style an input element\n * that has been rendered as invalid after it has been validated:\n *\n * <pre>\n * //be sure to include ngAnimate as a module to hook into more\n * //advanced animations\n * .my-input {\n *   transition:0.5s linear all;\n *   background: white;\n * }\n * .my-input.ng-invalid {\n *   background: red;\n *   color:white;\n * }\n * </pre>\n *\n * @example\n * <example deps=\"angular-animate.js\" animations=\"true\" fixBase=\"true\" module=\"inputExample\">\n     <file name=\"index.html\">\n       <script>\n        angular.module('inputExample', [])\n          .controller('ExampleController', ['$scope', function($scope) {\n            $scope.val = '1';\n          }]);\n       </script>\n       <style>\n         .my-input {\n           transition:all linear 0.5s;\n           background: transparent;\n         }\n         .my-input.ng-invalid {\n           color:white;\n           background: red;\n         }\n       </style>\n       <p id=\"inputDescription\">\n        Update input to see transitions when valid/invalid.\n        Integer is a valid value.\n       </p>\n       <form name=\"testForm\" ng-controller=\"ExampleController\">\n         <input ng-model=\"val\" ng-pattern=\"/^\\d+$/\" name=\"anim\" class=\"my-input\"\n                aria-describedby=\"inputDescription\" />\n       </form>\n     </file>\n * </example>\n *\n * ## Binding to a getter/setter\n *\n * Sometimes it's helpful to bind `ngModel` to a getter/setter function.  A getter/setter is a\n * function that returns a representation of the model when called with zero arguments, and sets\n * the internal state of a model when called with an argument. It's sometimes useful to use this\n * for models that have an internal representation that's different from what the model exposes\n * to the view.\n *\n * <div class=\"alert alert-success\">\n * **Best Practice:** It's best to keep getters fast because Angular is likely to call them more\n * frequently than other parts of your code.\n * </div>\n *\n * You use this behavior by adding `ng-model-options=\"{ getterSetter: true }\"` to an element that\n * has `ng-model` attached to it. You can also add `ng-model-options=\"{ getterSetter: true }\"` to\n * a `<form>`, which will enable this behavior for all `<input>`s within it. See\n * {@link ng.directive:ngModelOptions `ngModelOptions`} for more.\n *\n * The following example shows how to use `ngModel` with a getter/setter:\n *\n * @example\n * <example name=\"ngModel-getter-setter\" module=\"getterSetterExample\">\n     <file name=\"index.html\">\n       <div ng-controller=\"ExampleController\">\n         <form name=\"userForm\">\n           <label>Name:\n             <input type=\"text\" name=\"userName\"\n                    ng-model=\"user.name\"\n                    ng-model-options=\"{ getterSetter: true }\" />\n           </label>\n         </form>\n         <pre>user.name = <span ng-bind=\"user.name()\"></span></pre>\n       </div>\n     </file>\n     <file name=\"app.js\">\n       angular.module('getterSetterExample', [])\n         .controller('ExampleController', ['$scope', function($scope) {\n           var _name = 'Brian';\n           $scope.user = {\n             name: function(newName) {\n              // Note that newName can be undefined for two reasons:\n              // 1. Because it is called as a getter and thus called with no arguments\n              // 2. Because the property should actually be set to undefined. This happens e.g. if the\n              //    input is invalid\n              return arguments.length ? (_name = newName) : _name;\n             }\n           };\n         }]);\n     </file>\n * </example>\n */\nvar ngModelDirective = ['$rootScope', function($rootScope) {\n  return {\n    restrict: 'A',\n    require: ['ngModel', '^?form', '^?ngModelOptions'],\n    controller: NgModelController,\n    // Prelink needs to run before any input directive\n    // so that we can set the NgModelOptions in NgModelController\n    // before anyone else uses it.\n    priority: 1,\n    compile: function ngModelCompile(element) {\n      // Setup initial state of the control\n      element.addClass(PRISTINE_CLASS).addClass(UNTOUCHED_CLASS).addClass(VALID_CLASS);\n\n      return {\n        pre: function ngModelPreLink(scope, element, attr, ctrls) {\n          var modelCtrl = ctrls[0],\n              formCtrl = ctrls[1] || modelCtrl.$$parentForm;\n\n          modelCtrl.$$setOptions(ctrls[2] && ctrls[2].$options);\n\n          // notify others, especially parent forms\n          formCtrl.$addControl(modelCtrl);\n\n          attr.$observe('name', function(newValue) {\n            if (modelCtrl.$name !== newValue) {\n              modelCtrl.$$parentForm.$$renameControl(modelCtrl, newValue);\n            }\n          });\n\n          scope.$on('$destroy', function() {\n            modelCtrl.$$parentForm.$removeControl(modelCtrl);\n          });\n        },\n        post: function ngModelPostLink(scope, element, attr, ctrls) {\n          var modelCtrl = ctrls[0];\n          if (modelCtrl.$options && modelCtrl.$options.updateOn) {\n            element.on(modelCtrl.$options.updateOn, function(ev) {\n              modelCtrl.$$debounceViewValueCommit(ev && ev.type);\n            });\n          }\n\n          element.on('blur', function() {\n            if (modelCtrl.$touched) return;\n\n            if ($rootScope.$$phase) {\n              scope.$evalAsync(modelCtrl.$setTouched);\n            } else {\n              scope.$apply(modelCtrl.$setTouched);\n            }\n          });\n        }\n      };\n    }\n  };\n}];\n\nvar DEFAULT_REGEXP = /(\\s+|^)default(\\s+|$)/;\n\n/**\n * @ngdoc directive\n * @name ngModelOptions\n *\n * @description\n * Allows tuning how model updates are done. Using `ngModelOptions` you can specify a custom list of\n * events that will trigger a model update and/or a debouncing delay so that the actual update only\n * takes place when a timer expires; this timer will be reset after another change takes place.\n *\n * Given the nature of `ngModelOptions`, the value displayed inside input fields in the view might\n * be different from the value in the actual model. This means that if you update the model you\n * should also invoke {@link ngModel.NgModelController `$rollbackViewValue`} on the relevant input field in\n * order to make sure it is synchronized with the model and that any debounced action is canceled.\n *\n * The easiest way to reference the control's {@link ngModel.NgModelController `$rollbackViewValue`}\n * method is by making sure the input is placed inside a form that has a `name` attribute. This is\n * important because `form` controllers are published to the related scope under the name in their\n * `name` attribute.\n *\n * Any pending changes will take place immediately when an enclosing form is submitted via the\n * `submit` event. Note that `ngClick` events will occur before the model is updated. Use `ngSubmit`\n * to have access to the updated model.\n *\n * `ngModelOptions` has an effect on the element it's declared on and its descendants.\n *\n * @param {Object} ngModelOptions options to apply to the current model. Valid keys are:\n *   - `updateOn`: string specifying which event should the input be bound to. You can set several\n *     events using an space delimited list. There is a special event called `default` that\n *     matches the default events belonging of the control.\n *   - `debounce`: integer value which contains the debounce model update value in milliseconds. A\n *     value of 0 triggers an immediate update. If an object is supplied instead, you can specify a\n *     custom value for each event. For example:\n *     `ng-model-options=\"{ updateOn: 'default blur', debounce: { 'default': 500, 'blur': 0 } }\"`\n *   - `allowInvalid`: boolean value which indicates that the model can be set with values that did\n *     not validate correctly instead of the default behavior of setting the model to undefined.\n *   - `getterSetter`: boolean value which determines whether or not to treat functions bound to\n       `ngModel` as getters/setters.\n *   - `timezone`: Defines the timezone to be used to read/write the `Date` instance in the model for\n *     `<input type=\"date\">`, `<input type=\"time\">`, ... . It understands UTC/GMT and the\n *     continental US time zone abbreviations, but for general use, use a time zone offset, for\n *     example, `'+0430'` (4 hours, 30 minutes east of the Greenwich meridian)\n *     If not specified, the timezone of the browser will be used.\n *\n * @example\n\n  The following example shows how to override immediate updates. Changes on the inputs within the\n  form will update the model only when the control loses focus (blur event). If `escape` key is\n  pressed while the input field is focused, the value is reset to the value in the current model.\n\n  <example name=\"ngModelOptions-directive-blur\" module=\"optionsExample\">\n    <file name=\"index.html\">\n      <div ng-controller=\"ExampleController\">\n        <form name=\"userForm\">\n          <label>Name:\n            <input type=\"text\" name=\"userName\"\n                   ng-model=\"user.name\"\n                   ng-model-options=\"{ updateOn: 'blur' }\"\n                   ng-keyup=\"cancel($event)\" />\n          </label><br />\n          <label>Other data:\n            <input type=\"text\" ng-model=\"user.data\" />\n          </label><br />\n        </form>\n        <pre>user.name = <span ng-bind=\"user.name\"></span></pre>\n        <pre>user.data = <span ng-bind=\"user.data\"></span></pre>\n      </div>\n    </file>\n    <file name=\"app.js\">\n      angular.module('optionsExample', [])\n        .controller('ExampleController', ['$scope', function($scope) {\n          $scope.user = { name: 'John', data: '' };\n\n          $scope.cancel = function(e) {\n            if (e.keyCode == 27) {\n              $scope.userForm.userName.$rollbackViewValue();\n            }\n          };\n        }]);\n    </file>\n    <file name=\"protractor.js\" type=\"protractor\">\n      var model = element(by.binding('user.name'));\n      var input = element(by.model('user.name'));\n      var other = element(by.model('user.data'));\n\n      it('should allow custom events', function() {\n        input.sendKeys(' Doe');\n        input.click();\n        expect(model.getText()).toEqual('John');\n        other.click();\n        expect(model.getText()).toEqual('John Doe');\n      });\n\n      it('should $rollbackViewValue when model changes', function() {\n        input.sendKeys(' Doe');\n        expect(input.getAttribute('value')).toEqual('John Doe');\n        input.sendKeys(protractor.Key.ESCAPE);\n        expect(input.getAttribute('value')).toEqual('John');\n        other.click();\n        expect(model.getText()).toEqual('John');\n      });\n    </file>\n  </example>\n\n  This one shows how to debounce model changes. Model will be updated only 1 sec after last change.\n  If the `Clear` button is pressed, any debounced action is canceled and the value becomes empty.\n\n  <example name=\"ngModelOptions-directive-debounce\" module=\"optionsExample\">\n    <file name=\"index.html\">\n      <div ng-controller=\"ExampleController\">\n        <form name=\"userForm\">\n          <label>Name:\n            <input type=\"text\" name=\"userName\"\n                   ng-model=\"user.name\"\n                   ng-model-options=\"{ debounce: 1000 }\" />\n          </label>\n          <button ng-click=\"userForm.userName.$rollbackViewValue(); user.name=''\">Clear</button>\n          <br />\n        </form>\n        <pre>user.name = <span ng-bind=\"user.name\"></span></pre>\n      </div>\n    </file>\n    <file name=\"app.js\">\n      angular.module('optionsExample', [])\n        .controller('ExampleController', ['$scope', function($scope) {\n          $scope.user = { name: 'Igor' };\n        }]);\n    </file>\n  </example>\n\n  This one shows how to bind to getter/setters:\n\n  <example name=\"ngModelOptions-directive-getter-setter\" module=\"getterSetterExample\">\n    <file name=\"index.html\">\n      <div ng-controller=\"ExampleController\">\n        <form name=\"userForm\">\n          <label>Name:\n            <input type=\"text\" name=\"userName\"\n                   ng-model=\"user.name\"\n                   ng-model-options=\"{ getterSetter: true }\" />\n          </label>\n        </form>\n        <pre>user.name = <span ng-bind=\"user.name()\"></span></pre>\n      </div>\n    </file>\n    <file name=\"app.js\">\n      angular.module('getterSetterExample', [])\n        .controller('ExampleController', ['$scope', function($scope) {\n          var _name = 'Brian';\n          $scope.user = {\n            name: function(newName) {\n              // Note that newName can be undefined for two reasons:\n              // 1. Because it is called as a getter and thus called with no arguments\n              // 2. Because the property should actually be set to undefined. This happens e.g. if the\n              //    input is invalid\n              return arguments.length ? (_name = newName) : _name;\n            }\n          };\n        }]);\n    </file>\n  </example>\n */\nvar ngModelOptionsDirective = function() {\n  return {\n    restrict: 'A',\n    controller: ['$scope', '$attrs', function($scope, $attrs) {\n      var that = this;\n      this.$options = copy($scope.$eval($attrs.ngModelOptions));\n      // Allow adding/overriding bound events\n      if (isDefined(this.$options.updateOn)) {\n        this.$options.updateOnDefault = false;\n        // extract \"default\" pseudo-event from list of events that can trigger a model update\n        this.$options.updateOn = trim(this.$options.updateOn.replace(DEFAULT_REGEXP, function() {\n          that.$options.updateOnDefault = true;\n          return ' ';\n        }));\n      } else {\n        this.$options.updateOnDefault = true;\n      }\n    }]\n  };\n};\n\n\n\n// helper methods\nfunction addSetValidityMethod(context) {\n  var ctrl = context.ctrl,\n      $element = context.$element,\n      classCache = {},\n      set = context.set,\n      unset = context.unset,\n      $animate = context.$animate;\n\n  classCache[INVALID_CLASS] = !(classCache[VALID_CLASS] = $element.hasClass(VALID_CLASS));\n\n  ctrl.$setValidity = setValidity;\n\n  function setValidity(validationErrorKey, state, controller) {\n    if (isUndefined(state)) {\n      createAndSet('$pending', validationErrorKey, controller);\n    } else {\n      unsetAndCleanup('$pending', validationErrorKey, controller);\n    }\n    if (!isBoolean(state)) {\n      unset(ctrl.$error, validationErrorKey, controller);\n      unset(ctrl.$$success, validationErrorKey, controller);\n    } else {\n      if (state) {\n        unset(ctrl.$error, validationErrorKey, controller);\n        set(ctrl.$$success, validationErrorKey, controller);\n      } else {\n        set(ctrl.$error, validationErrorKey, controller);\n        unset(ctrl.$$success, validationErrorKey, controller);\n      }\n    }\n    if (ctrl.$pending) {\n      cachedToggleClass(PENDING_CLASS, true);\n      ctrl.$valid = ctrl.$invalid = undefined;\n      toggleValidationCss('', null);\n    } else {\n      cachedToggleClass(PENDING_CLASS, false);\n      ctrl.$valid = isObjectEmpty(ctrl.$error);\n      ctrl.$invalid = !ctrl.$valid;\n      toggleValidationCss('', ctrl.$valid);\n    }\n\n    // re-read the state as the set/unset methods could have\n    // combined state in ctrl.$error[validationError] (used for forms),\n    // where setting/unsetting only increments/decrements the value,\n    // and does not replace it.\n    var combinedState;\n    if (ctrl.$pending && ctrl.$pending[validationErrorKey]) {\n      combinedState = undefined;\n    } else if (ctrl.$error[validationErrorKey]) {\n      combinedState = false;\n    } else if (ctrl.$$success[validationErrorKey]) {\n      combinedState = true;\n    } else {\n      combinedState = null;\n    }\n\n    toggleValidationCss(validationErrorKey, combinedState);\n    ctrl.$$parentForm.$setValidity(validationErrorKey, combinedState, ctrl);\n  }\n\n  function createAndSet(name, value, controller) {\n    if (!ctrl[name]) {\n      ctrl[name] = {};\n    }\n    set(ctrl[name], value, controller);\n  }\n\n  function unsetAndCleanup(name, value, controller) {\n    if (ctrl[name]) {\n      unset(ctrl[name], value, controller);\n    }\n    if (isObjectEmpty(ctrl[name])) {\n      ctrl[name] = undefined;\n    }\n  }\n\n  function cachedToggleClass(className, switchValue) {\n    if (switchValue && !classCache[className]) {\n      $animate.addClass($element, className);\n      classCache[className] = true;\n    } else if (!switchValue && classCache[className]) {\n      $animate.removeClass($element, className);\n      classCache[className] = false;\n    }\n  }\n\n  function toggleValidationCss(validationErrorKey, isValid) {\n    validationErrorKey = validationErrorKey ? '-' + snake_case(validationErrorKey, '-') : '';\n\n    cachedToggleClass(VALID_CLASS + validationErrorKey, isValid === true);\n    cachedToggleClass(INVALID_CLASS + validationErrorKey, isValid === false);\n  }\n}\n\nfunction isObjectEmpty(obj) {\n  if (obj) {\n    for (var prop in obj) {\n      if (obj.hasOwnProperty(prop)) {\n        return false;\n      }\n    }\n  }\n  return true;\n}\n\n/**\n * @ngdoc directive\n * @name ngNonBindable\n * @restrict AC\n * @priority 1000\n *\n * @description\n * The `ngNonBindable` directive tells Angular not to compile or bind the contents of the current\n * DOM element. This is useful if the element contains what appears to be Angular directives and\n * bindings but which should be ignored by Angular. This could be the case if you have a site that\n * displays snippets of code, for instance.\n *\n * @element ANY\n *\n * @example\n * In this example there are two locations where a simple interpolation binding (`{{}}`) is present,\n * but the one wrapped in `ngNonBindable` is left alone.\n *\n * @example\n    <example>\n      <file name=\"index.html\">\n        <div>Normal: {{1 + 2}}</div>\n        <div ng-non-bindable>Ignored: {{1 + 2}}</div>\n      </file>\n      <file name=\"protractor.js\" type=\"protractor\">\n       it('should check ng-non-bindable', function() {\n         expect(element(by.binding('1 + 2')).getText()).toContain('3');\n         expect(element.all(by.css('div')).last().getText()).toMatch(/1 \\+ 2/);\n       });\n      </file>\n    </example>\n */\nvar ngNonBindableDirective = ngDirective({ terminal: true, priority: 1000 });\n\n/* global jqLiteRemove */\n\nvar ngOptionsMinErr = minErr('ngOptions');\n\n/**\n * @ngdoc directive\n * @name ngOptions\n * @restrict A\n *\n * @description\n *\n * The `ngOptions` attribute can be used to dynamically generate a list of `<option>`\n * elements for the `<select>` element using the array or object obtained by evaluating the\n * `ngOptions` comprehension expression.\n *\n * In many cases, `ngRepeat` can be used on `<option>` elements instead of `ngOptions` to achieve a\n * similar result. However, `ngOptions` provides some benefits such as reducing memory and\n * increasing speed by not creating a new scope for each repeated instance, as well as providing\n * more flexibility in how the `<select>`'s model is assigned via the `select` **`as`** part of the\n * comprehension expression. `ngOptions` should be used when the `<select>` model needs to be bound\n *  to a non-string value. This is because an option element can only be bound to string values at\n * present.\n *\n * When an item in the `<select>` menu is selected, the array element or object property\n * represented by the selected option will be bound to the model identified by the `ngModel`\n * directive.\n *\n * Optionally, a single hard-coded `<option>` element, with the value set to an empty string, can\n * be nested into the `<select>` element. This element will then represent the `null` or \"not selected\"\n * option. See example below for demonstration.\n *\n * ## Complex Models (objects or collections)\n *\n * By default, `ngModel` watches the model by reference, not value. This is important to know when\n * binding the select to a model that is an object or a collection.\n *\n * One issue occurs if you want to preselect an option. For example, if you set\n * the model to an object that is equal to an object in your collection, `ngOptions` won't be able to set the selection,\n * because the objects are not identical. So by default, you should always reference the item in your collection\n * for preselections, e.g.: `$scope.selected = $scope.collection[3]`.\n *\n * Another solution is to use a `track by` clause, because then `ngOptions` will track the identity\n * of the item not by reference, but by the result of the `track by` expression. For example, if your\n * collection items have an id property, you would `track by item.id`.\n *\n * A different issue with objects or collections is that ngModel won't detect if an object property or\n * a collection item changes. For that reason, `ngOptions` additionally watches the model using\n * `$watchCollection`, when the expression contains a `track by` clause or the the select has the `multiple` attribute.\n * This allows ngOptions to trigger a re-rendering of the options even if the actual object/collection\n * has not changed identity, but only a property on the object or an item in the collection changes.\n *\n * Note that `$watchCollection` does a shallow comparison of the properties of the object (or the items in the collection\n * if the model is an array). This means that changing a property deeper than the first level inside the\n * object/collection will not trigger a re-rendering.\n *\n * ## `select` **`as`**\n *\n * Using `select` **`as`** will bind the result of the `select` expression to the model, but\n * the value of the `<select>` and `<option>` html elements will be either the index (for array data sources)\n * or property name (for object data sources) of the value within the collection. If a **`track by`** expression\n * is used, the result of that expression will be set as the value of the `option` and `select` elements.\n *\n *\n * ### `select` **`as`** and **`track by`**\n *\n * <div class=\"alert alert-warning\">\n * Be careful when using `select` **`as`** and **`track by`** in the same expression.\n * </div>\n *\n * Given this array of items on the $scope:\n *\n * ```js\n * $scope.items = [{\n *   id: 1,\n *   label: 'aLabel',\n *   subItem: { name: 'aSubItem' }\n * }, {\n *   id: 2,\n *   label: 'bLabel',\n *   subItem: { name: 'bSubItem' }\n * }];\n * ```\n *\n * This will work:\n *\n * ```html\n * <select ng-options=\"item as item.label for item in items track by item.id\" ng-model=\"selected\"></select>\n * ```\n * ```js\n * $scope.selected = $scope.items[0];\n * ```\n *\n * but this will not work:\n *\n * ```html\n * <select ng-options=\"item.subItem as item.label for item in items track by item.id\" ng-model=\"selected\"></select>\n * ```\n * ```js\n * $scope.selected = $scope.items[0].subItem;\n * ```\n *\n * In both examples, the **`track by`** expression is applied successfully to each `item` in the\n * `items` array. Because the selected option has been set programmatically in the controller, the\n * **`track by`** expression is also applied to the `ngModel` value. In the first example, the\n * `ngModel` value is `items[0]` and the **`track by`** expression evaluates to `items[0].id` with\n * no issue. In the second example, the `ngModel` value is `items[0].subItem` and the **`track by`**\n * expression evaluates to `items[0].subItem.id` (which is undefined). As a result, the model value\n * is not matched against any `<option>` and the `<select>` appears as having no selected value.\n *\n *\n * @param {string} ngModel Assignable angular expression to data-bind to.\n * @param {string=} name Property name of the form under which the control is published.\n * @param {string=} required The control is considered valid only if value is entered.\n * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to\n *    the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of\n *    `required` when you want to data-bind to the `required` attribute.\n * @param {comprehension_expression=} ngOptions in one of the following forms:\n *\n *   * for array data sources:\n *     * `label` **`for`** `value` **`in`** `array`\n *     * `select` **`as`** `label` **`for`** `value` **`in`** `array`\n *     * `label` **`group by`** `group` **`for`** `value` **`in`** `array`\n *     * `label` **`disable when`** `disable` **`for`** `value` **`in`** `array`\n *     * `label` **`group by`** `group` **`for`** `value` **`in`** `array` **`track by`** `trackexpr`\n *     * `label` **`disable when`** `disable` **`for`** `value` **`in`** `array` **`track by`** `trackexpr`\n *     * `label` **`for`** `value` **`in`** `array` | orderBy:`orderexpr` **`track by`** `trackexpr`\n *        (for including a filter with `track by`)\n *   * for object data sources:\n *     * `label` **`for (`**`key` **`,`** `value`**`) in`** `object`\n *     * `select` **`as`** `label` **`for (`**`key` **`,`** `value`**`) in`** `object`\n *     * `label` **`group by`** `group` **`for (`**`key`**`,`** `value`**`) in`** `object`\n *     * `label` **`disable when`** `disable` **`for (`**`key`**`,`** `value`**`) in`** `object`\n *     * `select` **`as`** `label` **`group by`** `group`\n *         **`for` `(`**`key`**`,`** `value`**`) in`** `object`\n *     * `select` **`as`** `label` **`disable when`** `disable`\n *         **`for` `(`**`key`**`,`** `value`**`) in`** `object`\n *\n * Where:\n *\n *   * `array` / `object`: an expression which evaluates to an array / object to iterate over.\n *   * `value`: local variable which will refer to each item in the `array` or each property value\n *      of `object` during iteration.\n *   * `key`: local variable which will refer to a property name in `object` during iteration.\n *   * `label`: The result of this expression will be the label for `<option>` element. The\n *     `expression` will most likely refer to the `value` variable (e.g. `value.propertyName`).\n *   * `select`: The result of this expression will be bound to the model of the parent `<select>`\n *      element. If not specified, `select` expression will default to `value`.\n *   * `group`: The result of this expression will be used to group options using the `<optgroup>`\n *      DOM element.\n *   * `disable`: The result of this expression will be used to disable the rendered `<option>`\n *      element. Return `true` to disable.\n *   * `trackexpr`: Used when working with an array of objects. The result of this expression will be\n *      used to identify the objects in the array. The `trackexpr` will most likely refer to the\n *     `value` variable (e.g. `value.propertyName`). With this the selection is preserved\n *      even when the options are recreated (e.g. reloaded from the server).\n *\n * @example\n    <example module=\"selectExample\">\n      <file name=\"index.html\">\n        <script>\n        angular.module('selectExample', [])\n          .controller('ExampleController', ['$scope', function($scope) {\n            $scope.colors = [\n              {name:'black', shade:'dark'},\n              {name:'white', shade:'light', notAnOption: true},\n              {name:'red', shade:'dark'},\n              {name:'blue', shade:'dark', notAnOption: true},\n              {name:'yellow', shade:'light', notAnOption: false}\n            ];\n            $scope.myColor = $scope.colors[2]; // red\n          }]);\n        </script>\n        <div ng-controller=\"ExampleController\">\n          <ul>\n            <li ng-repeat=\"color in colors\">\n              <label>Name: <input ng-model=\"color.name\"></label>\n              <label><input type=\"checkbox\" ng-model=\"color.notAnOption\"> Disabled?</label>\n              <button ng-click=\"colors.splice($index, 1)\" aria-label=\"Remove\">X</button>\n            </li>\n            <li>\n              <button ng-click=\"colors.push({})\">add</button>\n            </li>\n          </ul>\n          <hr/>\n          <label>Color (null not allowed):\n            <select ng-model=\"myColor\" ng-options=\"color.name for color in colors\"></select>\n          </label><br/>\n          <label>Color (null allowed):\n          <span  class=\"nullable\">\n            <select ng-model=\"myColor\" ng-options=\"color.name for color in colors\">\n              <option value=\"\">-- choose color --</option>\n            </select>\n          </span></label><br/>\n\n          <label>Color grouped by shade:\n            <select ng-model=\"myColor\" ng-options=\"color.name group by color.shade for color in colors\">\n            </select>\n          </label><br/>\n\n          <label>Color grouped by shade, with some disabled:\n            <select ng-model=\"myColor\"\n                  ng-options=\"color.name group by color.shade disable when color.notAnOption for color in colors\">\n            </select>\n          </label><br/>\n\n\n\n          Select <button ng-click=\"myColor = { name:'not in list', shade: 'other' }\">bogus</button>.\n          <br/>\n          <hr/>\n          Currently selected: {{ {selected_color:myColor} }}\n          <div style=\"border:solid 1px black; height:20px\"\n               ng-style=\"{'background-color':myColor.name}\">\n          </div>\n        </div>\n      </file>\n      <file name=\"protractor.js\" type=\"protractor\">\n         it('should check ng-options', function() {\n           expect(element(by.binding('{selected_color:myColor}')).getText()).toMatch('red');\n           element.all(by.model('myColor')).first().click();\n           element.all(by.css('select[ng-model=\"myColor\"] option')).first().click();\n           expect(element(by.binding('{selected_color:myColor}')).getText()).toMatch('black');\n           element(by.css('.nullable select[ng-model=\"myColor\"]')).click();\n           element.all(by.css('.nullable select[ng-model=\"myColor\"] option')).first().click();\n           expect(element(by.binding('{selected_color:myColor}')).getText()).toMatch('null');\n         });\n      </file>\n    </example>\n */\n\n// jshint maxlen: false\n//                     //00001111111111000000000002222222222000000000000000000000333333333300000000000000000000000004444444444400000000000005555555555555550000000006666666666666660000000777777777777777000000000000000888888888800000000000000000009999999999\nvar NG_OPTIONS_REGEXP = /^\\s*([\\s\\S]+?)(?:\\s+as\\s+([\\s\\S]+?))?(?:\\s+group\\s+by\\s+([\\s\\S]+?))?(?:\\s+disable\\s+when\\s+([\\s\\S]+?))?\\s+for\\s+(?:([\\$\\w][\\$\\w]*)|(?:\\(\\s*([\\$\\w][\\$\\w]*)\\s*,\\s*([\\$\\w][\\$\\w]*)\\s*\\)))\\s+in\\s+([\\s\\S]+?)(?:\\s+track\\s+by\\s+([\\s\\S]+?))?$/;\n                        // 1: value expression (valueFn)\n                        // 2: label expression (displayFn)\n                        // 3: group by expression (groupByFn)\n                        // 4: disable when expression (disableWhenFn)\n                        // 5: array item variable name\n                        // 6: object item key variable name\n                        // 7: object item value variable name\n                        // 8: collection expression\n                        // 9: track by expression\n// jshint maxlen: 100\n\n\nvar ngOptionsDirective = ['$compile', '$document', '$parse', function($compile, $document, $parse) {\n\n  function parseOptionsExpression(optionsExp, selectElement, scope) {\n\n    var match = optionsExp.match(NG_OPTIONS_REGEXP);\n    if (!(match)) {\n      throw ngOptionsMinErr('iexp',\n        \"Expected expression in form of \" +\n        \"'_select_ (as _label_)? for (_key_,)?_value_ in _collection_'\" +\n        \" but got '{0}'. Element: {1}\",\n        optionsExp, startingTag(selectElement));\n    }\n\n    // Extract the parts from the ngOptions expression\n\n    // The variable name for the value of the item in the collection\n    var valueName = match[5] || match[7];\n    // The variable name for the key of the item in the collection\n    var keyName = match[6];\n\n    // An expression that generates the viewValue for an option if there is a label expression\n    var selectAs = / as /.test(match[0]) && match[1];\n    // An expression that is used to track the id of each object in the options collection\n    var trackBy = match[9];\n    // An expression that generates the viewValue for an option if there is no label expression\n    var valueFn = $parse(match[2] ? match[1] : valueName);\n    var selectAsFn = selectAs && $parse(selectAs);\n    var viewValueFn = selectAsFn || valueFn;\n    var trackByFn = trackBy && $parse(trackBy);\n\n    // Get the value by which we are going to track the option\n    // if we have a trackFn then use that (passing scope and locals)\n    // otherwise just hash the given viewValue\n    var getTrackByValueFn = trackBy ?\n                              function(value, locals) { return trackByFn(scope, locals); } :\n                              function getHashOfValue(value) { return hashKey(value); };\n    var getTrackByValue = function(value, key) {\n      return getTrackByValueFn(value, getLocals(value, key));\n    };\n\n    var displayFn = $parse(match[2] || match[1]);\n    var groupByFn = $parse(match[3] || '');\n    var disableWhenFn = $parse(match[4] || '');\n    var valuesFn = $parse(match[8]);\n\n    var locals = {};\n    var getLocals = keyName ? function(value, key) {\n      locals[keyName] = key;\n      locals[valueName] = value;\n      return locals;\n    } : function(value) {\n      locals[valueName] = value;\n      return locals;\n    };\n\n\n    function Option(selectValue, viewValue, label, group, disabled) {\n      this.selectValue = selectValue;\n      this.viewValue = viewValue;\n      this.label = label;\n      this.group = group;\n      this.disabled = disabled;\n    }\n\n    function getOptionValuesKeys(optionValues) {\n      var optionValuesKeys;\n\n      if (!keyName && isArrayLike(optionValues)) {\n        optionValuesKeys = optionValues;\n      } else {\n        // if object, extract keys, in enumeration order, unsorted\n        optionValuesKeys = [];\n        for (var itemKey in optionValues) {\n          if (optionValues.hasOwnProperty(itemKey) && itemKey.charAt(0) !== '$') {\n            optionValuesKeys.push(itemKey);\n          }\n        }\n      }\n      return optionValuesKeys;\n    }\n\n    return {\n      trackBy: trackBy,\n      getTrackByValue: getTrackByValue,\n      getWatchables: $parse(valuesFn, function(optionValues) {\n        // Create a collection of things that we would like to watch (watchedArray)\n        // so that they can all be watched using a single $watchCollection\n        // that only runs the handler once if anything changes\n        var watchedArray = [];\n        optionValues = optionValues || [];\n\n        var optionValuesKeys = getOptionValuesKeys(optionValues);\n        var optionValuesLength = optionValuesKeys.length;\n        for (var index = 0; index < optionValuesLength; index++) {\n          var key = (optionValues === optionValuesKeys) ? index : optionValuesKeys[index];\n          var value = optionValues[key];\n\n          var locals = getLocals(value, key);\n          var selectValue = getTrackByValueFn(value, locals);\n          watchedArray.push(selectValue);\n\n          // Only need to watch the displayFn if there is a specific label expression\n          if (match[2] || match[1]) {\n            var label = displayFn(scope, locals);\n            watchedArray.push(label);\n          }\n\n          // Only need to watch the disableWhenFn if there is a specific disable expression\n          if (match[4]) {\n            var disableWhen = disableWhenFn(scope, locals);\n            watchedArray.push(disableWhen);\n          }\n        }\n        return watchedArray;\n      }),\n\n      getOptions: function() {\n\n        var optionItems = [];\n        var selectValueMap = {};\n\n        // The option values were already computed in the `getWatchables` fn,\n        // which must have been called to trigger `getOptions`\n        var optionValues = valuesFn(scope) || [];\n        var optionValuesKeys = getOptionValuesKeys(optionValues);\n        var optionValuesLength = optionValuesKeys.length;\n\n        for (var index = 0; index < optionValuesLength; index++) {\n          var key = (optionValues === optionValuesKeys) ? index : optionValuesKeys[index];\n          var value = optionValues[key];\n          var locals = getLocals(value, key);\n          var viewValue = viewValueFn(scope, locals);\n          var selectValue = getTrackByValueFn(viewValue, locals);\n          var label = displayFn(scope, locals);\n          var group = groupByFn(scope, locals);\n          var disabled = disableWhenFn(scope, locals);\n          var optionItem = new Option(selectValue, viewValue, label, group, disabled);\n\n          optionItems.push(optionItem);\n          selectValueMap[selectValue] = optionItem;\n        }\n\n        return {\n          items: optionItems,\n          selectValueMap: selectValueMap,\n          getOptionFromViewValue: function(value) {\n            return selectValueMap[getTrackByValue(value)];\n          },\n          getViewValueFromOption: function(option) {\n            // If the viewValue could be an object that may be mutated by the application,\n            // we need to make a copy and not return the reference to the value on the option.\n            return trackBy ? angular.copy(option.viewValue) : option.viewValue;\n          }\n        };\n      }\n    };\n  }\n\n\n  // we can't just jqLite('<option>') since jqLite is not smart enough\n  // to create it in <select> and IE barfs otherwise.\n  var optionTemplate = window.document.createElement('option'),\n      optGroupTemplate = window.document.createElement('optgroup');\n\n    function ngOptionsPostLink(scope, selectElement, attr, ctrls) {\n\n      var selectCtrl = ctrls[0];\n      var ngModelCtrl = ctrls[1];\n      var multiple = attr.multiple;\n\n      // The emptyOption allows the application developer to provide their own custom \"empty\"\n      // option when the viewValue does not match any of the option values.\n      var emptyOption;\n      for (var i = 0, children = selectElement.children(), ii = children.length; i < ii; i++) {\n        if (children[i].value === '') {\n          emptyOption = children.eq(i);\n          break;\n        }\n      }\n\n      var providedEmptyOption = !!emptyOption;\n\n      var unknownOption = jqLite(optionTemplate.cloneNode(false));\n      unknownOption.val('?');\n\n      var options;\n      var ngOptions = parseOptionsExpression(attr.ngOptions, selectElement, scope);\n      // This stores the newly created options before they are appended to the select.\n      // Since the contents are removed from the fragment when it is appended,\n      // we only need to create it once.\n      var listFragment = $document[0].createDocumentFragment();\n\n      var renderEmptyOption = function() {\n        if (!providedEmptyOption) {\n          selectElement.prepend(emptyOption);\n        }\n        selectElement.val('');\n        emptyOption.prop('selected', true); // needed for IE\n        emptyOption.attr('selected', true);\n      };\n\n      var removeEmptyOption = function() {\n        if (!providedEmptyOption) {\n          emptyOption.remove();\n        }\n      };\n\n\n      var renderUnknownOption = function() {\n        selectElement.prepend(unknownOption);\n        selectElement.val('?');\n        unknownOption.prop('selected', true); // needed for IE\n        unknownOption.attr('selected', true);\n      };\n\n      var removeUnknownOption = function() {\n        unknownOption.remove();\n      };\n\n      // Update the controller methods for multiple selectable options\n      if (!multiple) {\n\n        selectCtrl.writeValue = function writeNgOptionsValue(value) {\n          var option = options.getOptionFromViewValue(value);\n\n          if (option) {\n            // Don't update the option when it is already selected.\n            // For example, the browser will select the first option by default. In that case,\n            // most properties are set automatically - except the `selected` attribute, which we\n            // set always\n\n            if (selectElement[0].value !== option.selectValue) {\n              removeUnknownOption();\n              removeEmptyOption();\n\n              selectElement[0].value = option.selectValue;\n              option.element.selected = true;\n            }\n\n            option.element.setAttribute('selected', 'selected');\n          } else {\n            if (value === null || providedEmptyOption) {\n              removeUnknownOption();\n              renderEmptyOption();\n            } else {\n              removeEmptyOption();\n              renderUnknownOption();\n            }\n          }\n        };\n\n        selectCtrl.readValue = function readNgOptionsValue() {\n\n          var selectedOption = options.selectValueMap[selectElement.val()];\n\n          if (selectedOption && !selectedOption.disabled) {\n            removeEmptyOption();\n            removeUnknownOption();\n            return options.getViewValueFromOption(selectedOption);\n          }\n          return null;\n        };\n\n        // If we are using `track by` then we must watch the tracked value on the model\n        // since ngModel only watches for object identity change\n        if (ngOptions.trackBy) {\n          scope.$watch(\n            function() { return ngOptions.getTrackByValue(ngModelCtrl.$viewValue); },\n            function() { ngModelCtrl.$render(); }\n          );\n        }\n\n      } else {\n\n        ngModelCtrl.$isEmpty = function(value) {\n          return !value || value.length === 0;\n        };\n\n\n        selectCtrl.writeValue = function writeNgOptionsMultiple(value) {\n          options.items.forEach(function(option) {\n            option.element.selected = false;\n          });\n\n          if (value) {\n            value.forEach(function(item) {\n              var option = options.getOptionFromViewValue(item);\n              if (option) option.element.selected = true;\n            });\n          }\n        };\n\n\n        selectCtrl.readValue = function readNgOptionsMultiple() {\n          var selectedValues = selectElement.val() || [],\n              selections = [];\n\n          forEach(selectedValues, function(value) {\n            var option = options.selectValueMap[value];\n            if (option && !option.disabled) selections.push(options.getViewValueFromOption(option));\n          });\n\n          return selections;\n        };\n\n        // If we are using `track by` then we must watch these tracked values on the model\n        // since ngModel only watches for object identity change\n        if (ngOptions.trackBy) {\n\n          scope.$watchCollection(function() {\n            if (isArray(ngModelCtrl.$viewValue)) {\n              return ngModelCtrl.$viewValue.map(function(value) {\n                return ngOptions.getTrackByValue(value);\n              });\n            }\n          }, function() {\n            ngModelCtrl.$render();\n          });\n\n        }\n      }\n\n\n      if (providedEmptyOption) {\n\n        // we need to remove it before calling selectElement.empty() because otherwise IE will\n        // remove the label from the element. wtf?\n        emptyOption.remove();\n\n        // compile the element since there might be bindings in it\n        $compile(emptyOption)(scope);\n\n        // remove the class, which is added automatically because we recompile the element and it\n        // becomes the compilation root\n        emptyOption.removeClass('ng-scope');\n      } else {\n        emptyOption = jqLite(optionTemplate.cloneNode(false));\n      }\n\n      selectElement.empty();\n\n      // We need to do this here to ensure that the options object is defined\n      // when we first hit it in writeNgOptionsValue\n      updateOptions();\n\n      // We will re-render the option elements if the option values or labels change\n      scope.$watchCollection(ngOptions.getWatchables, updateOptions);\n\n      // ------------------------------------------------------------------ //\n\n      function addOptionElement(option, parent) {\n        var optionElement = optionTemplate.cloneNode(false);\n        parent.appendChild(optionElement);\n        updateOptionElement(option, optionElement);\n      }\n\n\n      function updateOptionElement(option, element) {\n        option.element = element;\n        element.disabled = option.disabled;\n        // NOTE: The label must be set before the value, otherwise IE10/11/EDGE create unresponsive\n        // selects in certain circumstances when multiple selects are next to each other and display\n        // the option list in listbox style, i.e. the select is [multiple], or specifies a [size].\n        // See https://github.com/angular/angular.js/issues/11314 for more info.\n        // This is unfortunately untestable with unit / e2e tests\n        if (option.label !== element.label) {\n          element.label = option.label;\n          element.textContent = option.label;\n        }\n        if (option.value !== element.value) element.value = option.selectValue;\n      }\n\n      function updateOptions() {\n        var previousValue = options && selectCtrl.readValue();\n\n        // We must remove all current options, but cannot simply set innerHTML = null\n        // since the providedEmptyOption might have an ngIf on it that inserts comments which we\n        // must preserve.\n        // Instead, iterate over the current option elements and remove them or their optgroup\n        // parents\n        if (options) {\n\n          for (var i = options.items.length - 1; i >= 0; i--) {\n            var option = options.items[i];\n            if (option.group) {\n              jqLiteRemove(option.element.parentNode);\n            } else {\n              jqLiteRemove(option.element);\n            }\n          }\n        }\n\n        options = ngOptions.getOptions();\n\n        var groupElementMap = {};\n\n        // Ensure that the empty option is always there if it was explicitly provided\n        if (providedEmptyOption) {\n          selectElement.prepend(emptyOption);\n        }\n\n        options.items.forEach(function addOption(option) {\n          var groupElement;\n\n          if (isDefined(option.group)) {\n\n            // This option is to live in a group\n            // See if we have already created this group\n            groupElement = groupElementMap[option.group];\n\n            if (!groupElement) {\n\n              groupElement = optGroupTemplate.cloneNode(false);\n              listFragment.appendChild(groupElement);\n\n              // Update the label on the group element\n              groupElement.label = option.group;\n\n              // Store it for use later\n              groupElementMap[option.group] = groupElement;\n            }\n\n            addOptionElement(option, groupElement);\n\n          } else {\n\n            // This option is not in a group\n            addOptionElement(option, listFragment);\n          }\n        });\n\n        selectElement[0].appendChild(listFragment);\n\n        ngModelCtrl.$render();\n\n        // Check to see if the value has changed due to the update to the options\n        if (!ngModelCtrl.$isEmpty(previousValue)) {\n          var nextValue = selectCtrl.readValue();\n          var isNotPrimitive = ngOptions.trackBy || multiple;\n          if (isNotPrimitive ? !equals(previousValue, nextValue) : previousValue !== nextValue) {\n            ngModelCtrl.$setViewValue(nextValue);\n            ngModelCtrl.$render();\n          }\n        }\n\n      }\n  }\n\n  return {\n    restrict: 'A',\n    terminal: true,\n    require: ['select', 'ngModel'],\n    link: {\n      pre: function ngOptionsPreLink(scope, selectElement, attr, ctrls) {\n        // Deactivate the SelectController.register method to prevent\n        // option directives from accidentally registering themselves\n        // (and unwanted $destroy handlers etc.)\n        ctrls[0].registerOption = noop;\n      },\n      post: ngOptionsPostLink\n    }\n  };\n}];\n\n/**\n * @ngdoc directive\n * @name ngPluralize\n * @restrict EA\n *\n * @description\n * `ngPluralize` is a directive that displays messages according to en-US localization rules.\n * These rules are bundled with angular.js, but can be overridden\n * (see {@link guide/i18n Angular i18n} dev guide). You configure ngPluralize directive\n * by specifying the mappings between\n * [plural categories](http://unicode.org/repos/cldr-tmp/trunk/diff/supplemental/language_plural_rules.html)\n * and the strings to be displayed.\n *\n * # Plural categories and explicit number rules\n * There are two\n * [plural categories](http://unicode.org/repos/cldr-tmp/trunk/diff/supplemental/language_plural_rules.html)\n * in Angular's default en-US locale: \"one\" and \"other\".\n *\n * While a plural category may match many numbers (for example, in en-US locale, \"other\" can match\n * any number that is not 1), an explicit number rule can only match one number. For example, the\n * explicit number rule for \"3\" matches the number 3. There are examples of plural categories\n * and explicit number rules throughout the rest of this documentation.\n *\n * # Configuring ngPluralize\n * You configure ngPluralize by providing 2 attributes: `count` and `when`.\n * You can also provide an optional attribute, `offset`.\n *\n * The value of the `count` attribute can be either a string or an {@link guide/expression\n * Angular expression}; these are evaluated on the current scope for its bound value.\n *\n * The `when` attribute specifies the mappings between plural categories and the actual\n * string to be displayed. The value of the attribute should be a JSON object.\n *\n * The following example shows how to configure ngPluralize:\n *\n * ```html\n * <ng-pluralize count=\"personCount\"\n                 when=\"{'0': 'Nobody is viewing.',\n *                      'one': '1 person is viewing.',\n *                      'other': '{} people are viewing.'}\">\n * </ng-pluralize>\n *```\n *\n * In the example, `\"0: Nobody is viewing.\"` is an explicit number rule. If you did not\n * specify this rule, 0 would be matched to the \"other\" category and \"0 people are viewing\"\n * would be shown instead of \"Nobody is viewing\". You can specify an explicit number rule for\n * other numbers, for example 12, so that instead of showing \"12 people are viewing\", you can\n * show \"a dozen people are viewing\".\n *\n * You can use a set of closed braces (`{}`) as a placeholder for the number that you want substituted\n * into pluralized strings. In the previous example, Angular will replace `{}` with\n * <span ng-non-bindable>`{{personCount}}`</span>. The closed braces `{}` is a placeholder\n * for <span ng-non-bindable>{{numberExpression}}</span>.\n *\n * If no rule is defined for a category, then an empty string is displayed and a warning is generated.\n * Note that some locales define more categories than `one` and `other`. For example, fr-fr defines `few` and `many`.\n *\n * # Configuring ngPluralize with offset\n * The `offset` attribute allows further customization of pluralized text, which can result in\n * a better user experience. For example, instead of the message \"4 people are viewing this document\",\n * you might display \"John, Kate and 2 others are viewing this document\".\n * The offset attribute allows you to offset a number by any desired value.\n * Let's take a look at an example:\n *\n * ```html\n * <ng-pluralize count=\"personCount\" offset=2\n *               when=\"{'0': 'Nobody is viewing.',\n *                      '1': '{{person1}} is viewing.',\n *                      '2': '{{person1}} and {{person2}} are viewing.',\n *                      'one': '{{person1}}, {{person2}} and one other person are viewing.',\n *                      'other': '{{person1}}, {{person2}} and {} other people are viewing.'}\">\n * </ng-pluralize>\n * ```\n *\n * Notice that we are still using two plural categories(one, other), but we added\n * three explicit number rules 0, 1 and 2.\n * When one person, perhaps John, views the document, \"John is viewing\" will be shown.\n * When three people view the document, no explicit number rule is found, so\n * an offset of 2 is taken off 3, and Angular uses 1 to decide the plural category.\n * In this case, plural category 'one' is matched and \"John, Mary and one other person are viewing\"\n * is shown.\n *\n * Note that when you specify offsets, you must provide explicit number rules for\n * numbers from 0 up to and including the offset. If you use an offset of 3, for example,\n * you must provide explicit number rules for 0, 1, 2 and 3. You must also provide plural strings for\n * plural categories \"one\" and \"other\".\n *\n * @param {string|expression} count The variable to be bound to.\n * @param {string} when The mapping between plural category to its corresponding strings.\n * @param {number=} offset Offset to deduct from the total number.\n *\n * @example\n    <example module=\"pluralizeExample\">\n      <file name=\"index.html\">\n        <script>\n          angular.module('pluralizeExample', [])\n            .controller('ExampleController', ['$scope', function($scope) {\n              $scope.person1 = 'Igor';\n              $scope.person2 = 'Misko';\n              $scope.personCount = 1;\n            }]);\n        </script>\n        <div ng-controller=\"ExampleController\">\n          <label>Person 1:<input type=\"text\" ng-model=\"person1\" value=\"Igor\" /></label><br/>\n          <label>Person 2:<input type=\"text\" ng-model=\"person2\" value=\"Misko\" /></label><br/>\n          <label>Number of People:<input type=\"text\" ng-model=\"personCount\" value=\"1\" /></label><br/>\n\n          <!--- Example with simple pluralization rules for en locale --->\n          Without Offset:\n          <ng-pluralize count=\"personCount\"\n                        when=\"{'0': 'Nobody is viewing.',\n                               'one': '1 person is viewing.',\n                               'other': '{} people are viewing.'}\">\n          </ng-pluralize><br>\n\n          <!--- Example with offset --->\n          With Offset(2):\n          <ng-pluralize count=\"personCount\" offset=2\n                        when=\"{'0': 'Nobody is viewing.',\n                               '1': '{{person1}} is viewing.',\n                               '2': '{{person1}} and {{person2}} are viewing.',\n                               'one': '{{person1}}, {{person2}} and one other person are viewing.',\n                               'other': '{{person1}}, {{person2}} and {} other people are viewing.'}\">\n          </ng-pluralize>\n        </div>\n      </file>\n      <file name=\"protractor.js\" type=\"protractor\">\n        it('should show correct pluralized string', function() {\n          var withoutOffset = element.all(by.css('ng-pluralize')).get(0);\n          var withOffset = element.all(by.css('ng-pluralize')).get(1);\n          var countInput = element(by.model('personCount'));\n\n          expect(withoutOffset.getText()).toEqual('1 person is viewing.');\n          expect(withOffset.getText()).toEqual('Igor is viewing.');\n\n          countInput.clear();\n          countInput.sendKeys('0');\n\n          expect(withoutOffset.getText()).toEqual('Nobody is viewing.');\n          expect(withOffset.getText()).toEqual('Nobody is viewing.');\n\n          countInput.clear();\n          countInput.sendKeys('2');\n\n          expect(withoutOffset.getText()).toEqual('2 people are viewing.');\n          expect(withOffset.getText()).toEqual('Igor and Misko are viewing.');\n\n          countInput.clear();\n          countInput.sendKeys('3');\n\n          expect(withoutOffset.getText()).toEqual('3 people are viewing.');\n          expect(withOffset.getText()).toEqual('Igor, Misko and one other person are viewing.');\n\n          countInput.clear();\n          countInput.sendKeys('4');\n\n          expect(withoutOffset.getText()).toEqual('4 people are viewing.');\n          expect(withOffset.getText()).toEqual('Igor, Misko and 2 other people are viewing.');\n        });\n        it('should show data-bound names', function() {\n          var withOffset = element.all(by.css('ng-pluralize')).get(1);\n          var personCount = element(by.model('personCount'));\n          var person1 = element(by.model('person1'));\n          var person2 = element(by.model('person2'));\n          personCount.clear();\n          personCount.sendKeys('4');\n          person1.clear();\n          person1.sendKeys('Di');\n          person2.clear();\n          person2.sendKeys('Vojta');\n          expect(withOffset.getText()).toEqual('Di, Vojta and 2 other people are viewing.');\n        });\n      </file>\n    </example>\n */\nvar ngPluralizeDirective = ['$locale', '$interpolate', '$log', function($locale, $interpolate, $log) {\n  var BRACE = /{}/g,\n      IS_WHEN = /^when(Minus)?(.+)$/;\n\n  return {\n    link: function(scope, element, attr) {\n      var numberExp = attr.count,\n          whenExp = attr.$attr.when && element.attr(attr.$attr.when), // we have {{}} in attrs\n          offset = attr.offset || 0,\n          whens = scope.$eval(whenExp) || {},\n          whensExpFns = {},\n          startSymbol = $interpolate.startSymbol(),\n          endSymbol = $interpolate.endSymbol(),\n          braceReplacement = startSymbol + numberExp + '-' + offset + endSymbol,\n          watchRemover = angular.noop,\n          lastCount;\n\n      forEach(attr, function(expression, attributeName) {\n        var tmpMatch = IS_WHEN.exec(attributeName);\n        if (tmpMatch) {\n          var whenKey = (tmpMatch[1] ? '-' : '') + lowercase(tmpMatch[2]);\n          whens[whenKey] = element.attr(attr.$attr[attributeName]);\n        }\n      });\n      forEach(whens, function(expression, key) {\n        whensExpFns[key] = $interpolate(expression.replace(BRACE, braceReplacement));\n\n      });\n\n      scope.$watch(numberExp, function ngPluralizeWatchAction(newVal) {\n        var count = parseFloat(newVal);\n        var countIsNaN = isNaN(count);\n\n        if (!countIsNaN && !(count in whens)) {\n          // If an explicit number rule such as 1, 2, 3... is defined, just use it.\n          // Otherwise, check it against pluralization rules in $locale service.\n          count = $locale.pluralCat(count - offset);\n        }\n\n        // If both `count` and `lastCount` are NaN, we don't need to re-register a watch.\n        // In JS `NaN !== NaN`, so we have to explicitly check.\n        if ((count !== lastCount) && !(countIsNaN && isNumber(lastCount) && isNaN(lastCount))) {\n          watchRemover();\n          var whenExpFn = whensExpFns[count];\n          if (isUndefined(whenExpFn)) {\n            if (newVal != null) {\n              $log.debug(\"ngPluralize: no rule defined for '\" + count + \"' in \" + whenExp);\n            }\n            watchRemover = noop;\n            updateElementText();\n          } else {\n            watchRemover = scope.$watch(whenExpFn, updateElementText);\n          }\n          lastCount = count;\n        }\n      });\n\n      function updateElementText(newText) {\n        element.text(newText || '');\n      }\n    }\n  };\n}];\n\n/**\n * @ngdoc directive\n * @name ngRepeat\n * @multiElement\n *\n * @description\n * The `ngRepeat` directive instantiates a template once per item from a collection. Each template\n * instance gets its own scope, where the given loop variable is set to the current collection item,\n * and `$index` is set to the item index or key.\n *\n * Special properties are exposed on the local scope of each template instance, including:\n *\n * | Variable  | Type            | Details                                                                     |\n * |-----------|-----------------|-----------------------------------------------------------------------------|\n * | `$index`  | {@type number}  | iterator offset of the repeated element (0..length-1)                       |\n * | `$first`  | {@type boolean} | true if the repeated element is first in the iterator.                      |\n * | `$middle` | {@type boolean} | true if the repeated element is between the first and last in the iterator. |\n * | `$last`   | {@type boolean} | true if the repeated element is last in the iterator.                       |\n * | `$even`   | {@type boolean} | true if the iterator position `$index` is even (otherwise false).           |\n * | `$odd`    | {@type boolean} | true if the iterator position `$index` is odd (otherwise false).            |\n *\n * <div class=\"alert alert-info\">\n *   Creating aliases for these properties is possible with {@link ng.directive:ngInit `ngInit`}.\n *   This may be useful when, for instance, nesting ngRepeats.\n * </div>\n *\n *\n * # Iterating over object properties\n *\n * It is possible to get `ngRepeat` to iterate over the properties of an object using the following\n * syntax:\n *\n * ```js\n * <div ng-repeat=\"(key, value) in myObj\"> ... </div>\n * ```\n *\n * However, there are a limitations compared to array iteration:\n *\n * - The JavaScript specification does not define the order of keys\n *   returned for an object, so Angular relies on the order returned by the browser\n *   when running `for key in myObj`. Browsers generally follow the strategy of providing\n *   keys in the order in which they were defined, although there are exceptions when keys are deleted\n *   and reinstated. See the\n *   [MDN page on `delete` for more info](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/delete#Cross-browser_notes).\n *\n * - `ngRepeat` will silently *ignore* object keys starting with `$`, because\n *   it's a prefix used by Angular for public (`$`) and private (`$$`) properties.\n *\n * - The built-in filters {@link ng.orderBy orderBy} and {@link ng.filter filter} do not work with\n *   objects, and will throw if used with one.\n *\n * If you are hitting any of these limitations, the recommended workaround is to convert your object into an array\n * that is sorted into the order that you prefer before providing it to `ngRepeat`. You could\n * do this with a filter such as [toArrayFilter](http://ngmodules.org/modules/angular-toArrayFilter)\n * or implement a `$watch` on the object yourself.\n *\n *\n * # Tracking and Duplicates\n *\n * `ngRepeat` uses {@link $rootScope.Scope#$watchCollection $watchCollection} to detect changes in\n * the collection. When a change happens, ngRepeat then makes the corresponding changes to the DOM:\n *\n * * When an item is added, a new instance of the template is added to the DOM.\n * * When an item is removed, its template instance is removed from the DOM.\n * * When items are reordered, their respective templates are reordered in the DOM.\n *\n * To minimize creation of DOM elements, `ngRepeat` uses a function\n * to \"keep track\" of all items in the collection and their corresponding DOM elements.\n * For example, if an item is added to the collection, ngRepeat will know that all other items\n * already have DOM elements, and will not re-render them.\n *\n * The default tracking function (which tracks items by their identity) does not allow\n * duplicate items in arrays. This is because when there are duplicates, it is not possible\n * to maintain a one-to-one mapping between collection items and DOM elements.\n *\n * If you do need to repeat duplicate items, you can substitute the default tracking behavior\n * with your own using the `track by` expression.\n *\n * For example, you may track items by the index of each item in the collection, using the\n * special scope property `$index`:\n * ```html\n *    <div ng-repeat=\"n in [42, 42, 43, 43] track by $index\">\n *      {{n}}\n *    </div>\n * ```\n *\n * You may also use arbitrary expressions in `track by`, including references to custom functions\n * on the scope:\n * ```html\n *    <div ng-repeat=\"n in [42, 42, 43, 43] track by myTrackingFunction(n)\">\n *      {{n}}\n *    </div>\n * ```\n *\n * <div class=\"alert alert-success\">\n * If you are working with objects that have an identifier property, you should track\n * by the identifier instead of the whole object. Should you reload your data later, `ngRepeat`\n * will not have to rebuild the DOM elements for items it has already rendered, even if the\n * JavaScript objects in the collection have been substituted for new ones. For large collections,\n * this significantly improves rendering performance. If you don't have a unique identifier,\n * `track by $index` can also provide a performance boost.\n * </div>\n * ```html\n *    <div ng-repeat=\"model in collection track by model.id\">\n *      {{model.name}}\n *    </div>\n * ```\n *\n * When no `track by` expression is provided, it is equivalent to tracking by the built-in\n * `$id` function, which tracks items by their identity:\n * ```html\n *    <div ng-repeat=\"obj in collection track by $id(obj)\">\n *      {{obj.prop}}\n *    </div>\n * ```\n *\n * <div class=\"alert alert-warning\">\n * **Note:** `track by` must always be the last expression:\n * </div>\n * ```\n * <div ng-repeat=\"model in collection | orderBy: 'id' as filtered_result track by model.id\">\n *     {{model.name}}\n * </div>\n * ```\n *\n * # Special repeat start and end points\n * To repeat a series of elements instead of just one parent element, ngRepeat (as well as other ng directives) supports extending\n * the range of the repeater by defining explicit start and end points by using **ng-repeat-start** and **ng-repeat-end** respectively.\n * The **ng-repeat-start** directive works the same as **ng-repeat**, but will repeat all the HTML code (including the tag it's defined on)\n * up to and including the ending HTML tag where **ng-repeat-end** is placed.\n *\n * The example below makes use of this feature:\n * ```html\n *   <header ng-repeat-start=\"item in items\">\n *     Header {{ item }}\n *   </header>\n *   <div class=\"body\">\n *     Body {{ item }}\n *   </div>\n *   <footer ng-repeat-end>\n *     Footer {{ item }}\n *   </footer>\n * ```\n *\n * And with an input of {@type ['A','B']} for the items variable in the example above, the output will evaluate to:\n * ```html\n *   <header>\n *     Header A\n *   </header>\n *   <div class=\"body\">\n *     Body A\n *   </div>\n *   <footer>\n *     Footer A\n *   </footer>\n *   <header>\n *     Header B\n *   </header>\n *   <div class=\"body\">\n *     Body B\n *   </div>\n *   <footer>\n *     Footer B\n *   </footer>\n * ```\n *\n * The custom start and end points for ngRepeat also support all other HTML directive syntax flavors provided in AngularJS (such\n * as **data-ng-repeat-start**, **x-ng-repeat-start** and **ng:repeat-start**).\n *\n * @animations\n * | Animation                        | Occurs                              |\n * |----------------------------------|-------------------------------------|\n * | {@link ng.$animate#enter enter} | when a new item is added to the list or when an item is revealed after a filter |\n * | {@link ng.$animate#leave leave} | when an item is removed from the list or when an item is filtered out |\n * | {@link ng.$animate#move move } | when an adjacent item is filtered out causing a reorder or when the item contents are reordered |\n *\n * See the example below for defining CSS animations with ngRepeat.\n *\n * @element ANY\n * @scope\n * @priority 1000\n * @param {repeat_expression} ngRepeat The expression indicating how to enumerate a collection. These\n *   formats are currently supported:\n *\n *   * `variable in expression` – where variable is the user defined loop variable and `expression`\n *     is a scope expression giving the collection to enumerate.\n *\n *     For example: `album in artist.albums`.\n *\n *   * `(key, value) in expression` – where `key` and `value` can be any user defined identifiers,\n *     and `expression` is the scope expression giving the collection to enumerate.\n *\n *     For example: `(name, age) in {'adam':10, 'amalie':12}`.\n *\n *   * `variable in expression track by tracking_expression` – You can also provide an optional tracking expression\n *     which can be used to associate the objects in the collection with the DOM elements. If no tracking expression\n *     is specified, ng-repeat associates elements by identity. It is an error to have\n *     more than one tracking expression value resolve to the same key. (This would mean that two distinct objects are\n *     mapped to the same DOM element, which is not possible.)\n *\n *     Note that the tracking expression must come last, after any filters, and the alias expression.\n *\n *     For example: `item in items` is equivalent to `item in items track by $id(item)`. This implies that the DOM elements\n *     will be associated by item identity in the array.\n *\n *     For example: `item in items track by $id(item)`. A built in `$id()` function can be used to assign a unique\n *     `$$hashKey` property to each item in the array. This property is then used as a key to associated DOM elements\n *     with the corresponding item in the array by identity. Moving the same object in array would move the DOM\n *     element in the same way in the DOM.\n *\n *     For example: `item in items track by item.id` is a typical pattern when the items come from the database. In this\n *     case the object identity does not matter. Two objects are considered equivalent as long as their `id`\n *     property is same.\n *\n *     For example: `item in items | filter:searchText track by item.id` is a pattern that might be used to apply a filter\n *     to items in conjunction with a tracking expression.\n *\n *   * `variable in expression as alias_expression` – You can also provide an optional alias expression which will then store the\n *     intermediate results of the repeater after the filters have been applied. Typically this is used to render a special message\n *     when a filter is active on the repeater, but the filtered result set is empty.\n *\n *     For example: `item in items | filter:x as results` will store the fragment of the repeated items as `results`, but only after\n *     the items have been processed through the filter.\n *\n *     Please note that `as [variable name] is not an operator but rather a part of ngRepeat micro-syntax so it can be used only at the end\n *     (and not as operator, inside an expression).\n *\n *     For example: `item in items | filter : x | orderBy : order | limitTo : limit as results` .\n *\n * @example\n * This example uses `ngRepeat` to display a list of people. A filter is used to restrict the displayed\n * results by name. New (entering) and removed (leaving) items are animated.\n  <example module=\"ngRepeat\" name=\"ngRepeat\" deps=\"angular-animate.js\" animations=\"true\">\n    <file name=\"index.html\">\n      <div ng-controller=\"repeatController\">\n        I have {{friends.length}} friends. They are:\n        <input type=\"search\" ng-model=\"q\" placeholder=\"filter friends...\" aria-label=\"filter friends\" />\n        <ul class=\"example-animate-container\">\n          <li class=\"animate-repeat\" ng-repeat=\"friend in friends | filter:q as results\">\n            [{{$index + 1}}] {{friend.name}} who is {{friend.age}} years old.\n          </li>\n          <li class=\"animate-repeat\" ng-if=\"results.length == 0\">\n            <strong>No results found...</strong>\n          </li>\n        </ul>\n      </div>\n    </file>\n    <file name=\"script.js\">\n      angular.module('ngRepeat', ['ngAnimate']).controller('repeatController', function($scope) {\n        $scope.friends = [\n          {name:'John', age:25, gender:'boy'},\n          {name:'Jessie', age:30, gender:'girl'},\n          {name:'Johanna', age:28, gender:'girl'},\n          {name:'Joy', age:15, gender:'girl'},\n          {name:'Mary', age:28, gender:'girl'},\n          {name:'Peter', age:95, gender:'boy'},\n          {name:'Sebastian', age:50, gender:'boy'},\n          {name:'Erika', age:27, gender:'girl'},\n          {name:'Patrick', age:40, gender:'boy'},\n          {name:'Samantha', age:60, gender:'girl'}\n        ];\n      });\n    </file>\n    <file name=\"animations.css\">\n      .example-animate-container {\n        background:white;\n        border:1px solid black;\n        list-style:none;\n        margin:0;\n        padding:0 10px;\n      }\n\n      .animate-repeat {\n        line-height:30px;\n        list-style:none;\n        box-sizing:border-box;\n      }\n\n      .animate-repeat.ng-move,\n      .animate-repeat.ng-enter,\n      .animate-repeat.ng-leave {\n        transition:all linear 0.5s;\n      }\n\n      .animate-repeat.ng-leave.ng-leave-active,\n      .animate-repeat.ng-move,\n      .animate-repeat.ng-enter {\n        opacity:0;\n        max-height:0;\n      }\n\n      .animate-repeat.ng-leave,\n      .animate-repeat.ng-move.ng-move-active,\n      .animate-repeat.ng-enter.ng-enter-active {\n        opacity:1;\n        max-height:30px;\n      }\n    </file>\n    <file name=\"protractor.js\" type=\"protractor\">\n      var friends = element.all(by.repeater('friend in friends'));\n\n      it('should render initial data set', function() {\n        expect(friends.count()).toBe(10);\n        expect(friends.get(0).getText()).toEqual('[1] John who is 25 years old.');\n        expect(friends.get(1).getText()).toEqual('[2] Jessie who is 30 years old.');\n        expect(friends.last().getText()).toEqual('[10] Samantha who is 60 years old.');\n        expect(element(by.binding('friends.length')).getText())\n            .toMatch(\"I have 10 friends. They are:\");\n      });\n\n       it('should update repeater when filter predicate changes', function() {\n         expect(friends.count()).toBe(10);\n\n         element(by.model('q')).sendKeys('ma');\n\n         expect(friends.count()).toBe(2);\n         expect(friends.get(0).getText()).toEqual('[1] Mary who is 28 years old.');\n         expect(friends.last().getText()).toEqual('[2] Samantha who is 60 years old.');\n       });\n      </file>\n    </example>\n */\nvar ngRepeatDirective = ['$parse', '$animate', '$compile', function($parse, $animate, $compile) {\n  var NG_REMOVED = '$$NG_REMOVED';\n  var ngRepeatMinErr = minErr('ngRepeat');\n\n  var updateScope = function(scope, index, valueIdentifier, value, keyIdentifier, key, arrayLength) {\n    // TODO(perf): generate setters to shave off ~40ms or 1-1.5%\n    scope[valueIdentifier] = value;\n    if (keyIdentifier) scope[keyIdentifier] = key;\n    scope.$index = index;\n    scope.$first = (index === 0);\n    scope.$last = (index === (arrayLength - 1));\n    scope.$middle = !(scope.$first || scope.$last);\n    // jshint bitwise: false\n    scope.$odd = !(scope.$even = (index&1) === 0);\n    // jshint bitwise: true\n  };\n\n  var getBlockStart = function(block) {\n    return block.clone[0];\n  };\n\n  var getBlockEnd = function(block) {\n    return block.clone[block.clone.length - 1];\n  };\n\n\n  return {\n    restrict: 'A',\n    multiElement: true,\n    transclude: 'element',\n    priority: 1000,\n    terminal: true,\n    $$tlb: true,\n    compile: function ngRepeatCompile($element, $attr) {\n      var expression = $attr.ngRepeat;\n      var ngRepeatEndComment = $compile.$$createComment('end ngRepeat', expression);\n\n      var match = expression.match(/^\\s*([\\s\\S]+?)\\s+in\\s+([\\s\\S]+?)(?:\\s+as\\s+([\\s\\S]+?))?(?:\\s+track\\s+by\\s+([\\s\\S]+?))?\\s*$/);\n\n      if (!match) {\n        throw ngRepeatMinErr('iexp', \"Expected expression in form of '_item_ in _collection_[ track by _id_]' but got '{0}'.\",\n            expression);\n      }\n\n      var lhs = match[1];\n      var rhs = match[2];\n      var aliasAs = match[3];\n      var trackByExp = match[4];\n\n      match = lhs.match(/^(?:(\\s*[\\$\\w]+)|\\(\\s*([\\$\\w]+)\\s*,\\s*([\\$\\w]+)\\s*\\))$/);\n\n      if (!match) {\n        throw ngRepeatMinErr('iidexp', \"'_item_' in '_item_ in _collection_' should be an identifier or '(_key_, _value_)' expression, but got '{0}'.\",\n            lhs);\n      }\n      var valueIdentifier = match[3] || match[1];\n      var keyIdentifier = match[2];\n\n      if (aliasAs && (!/^[$a-zA-Z_][$a-zA-Z0-9_]*$/.test(aliasAs) ||\n          /^(null|undefined|this|\\$index|\\$first|\\$middle|\\$last|\\$even|\\$odd|\\$parent|\\$root|\\$id)$/.test(aliasAs))) {\n        throw ngRepeatMinErr('badident', \"alias '{0}' is invalid --- must be a valid JS identifier which is not a reserved name.\",\n          aliasAs);\n      }\n\n      var trackByExpGetter, trackByIdExpFn, trackByIdArrayFn, trackByIdObjFn;\n      var hashFnLocals = {$id: hashKey};\n\n      if (trackByExp) {\n        trackByExpGetter = $parse(trackByExp);\n      } else {\n        trackByIdArrayFn = function(key, value) {\n          return hashKey(value);\n        };\n        trackByIdObjFn = function(key) {\n          return key;\n        };\n      }\n\n      return function ngRepeatLink($scope, $element, $attr, ctrl, $transclude) {\n\n        if (trackByExpGetter) {\n          trackByIdExpFn = function(key, value, index) {\n            // assign key, value, and $index to the locals so that they can be used in hash functions\n            if (keyIdentifier) hashFnLocals[keyIdentifier] = key;\n            hashFnLocals[valueIdentifier] = value;\n            hashFnLocals.$index = index;\n            return trackByExpGetter($scope, hashFnLocals);\n          };\n        }\n\n        // Store a list of elements from previous run. This is a hash where key is the item from the\n        // iterator, and the value is objects with following properties.\n        //   - scope: bound scope\n        //   - element: previous element.\n        //   - index: position\n        //\n        // We are using no-proto object so that we don't need to guard against inherited props via\n        // hasOwnProperty.\n        var lastBlockMap = createMap();\n\n        //watch props\n        $scope.$watchCollection(rhs, function ngRepeatAction(collection) {\n          var index, length,\n              previousNode = $element[0],     // node that cloned nodes should be inserted after\n                                              // initialized to the comment node anchor\n              nextNode,\n              // Same as lastBlockMap but it has the current state. It will become the\n              // lastBlockMap on the next iteration.\n              nextBlockMap = createMap(),\n              collectionLength,\n              key, value, // key/value of iteration\n              trackById,\n              trackByIdFn,\n              collectionKeys,\n              block,       // last object information {scope, element, id}\n              nextBlockOrder,\n              elementsToRemove;\n\n          if (aliasAs) {\n            $scope[aliasAs] = collection;\n          }\n\n          if (isArrayLike(collection)) {\n            collectionKeys = collection;\n            trackByIdFn = trackByIdExpFn || trackByIdArrayFn;\n          } else {\n            trackByIdFn = trackByIdExpFn || trackByIdObjFn;\n            // if object, extract keys, in enumeration order, unsorted\n            collectionKeys = [];\n            for (var itemKey in collection) {\n              if (hasOwnProperty.call(collection, itemKey) && itemKey.charAt(0) !== '$') {\n                collectionKeys.push(itemKey);\n              }\n            }\n          }\n\n          collectionLength = collectionKeys.length;\n          nextBlockOrder = new Array(collectionLength);\n\n          // locate existing items\n          for (index = 0; index < collectionLength; index++) {\n            key = (collection === collectionKeys) ? index : collectionKeys[index];\n            value = collection[key];\n            trackById = trackByIdFn(key, value, index);\n            if (lastBlockMap[trackById]) {\n              // found previously seen block\n              block = lastBlockMap[trackById];\n              delete lastBlockMap[trackById];\n              nextBlockMap[trackById] = block;\n              nextBlockOrder[index] = block;\n            } else if (nextBlockMap[trackById]) {\n              // if collision detected. restore lastBlockMap and throw an error\n              forEach(nextBlockOrder, function(block) {\n                if (block && block.scope) lastBlockMap[block.id] = block;\n              });\n              throw ngRepeatMinErr('dupes',\n                  \"Duplicates in a repeater are not allowed. Use 'track by' expression to specify unique keys. Repeater: {0}, Duplicate key: {1}, Duplicate value: {2}\",\n                  expression, trackById, value);\n            } else {\n              // new never before seen block\n              nextBlockOrder[index] = {id: trackById, scope: undefined, clone: undefined};\n              nextBlockMap[trackById] = true;\n            }\n          }\n\n          // remove leftover items\n          for (var blockKey in lastBlockMap) {\n            block = lastBlockMap[blockKey];\n            elementsToRemove = getBlockNodes(block.clone);\n            $animate.leave(elementsToRemove);\n            if (elementsToRemove[0].parentNode) {\n              // if the element was not removed yet because of pending animation, mark it as deleted\n              // so that we can ignore it later\n              for (index = 0, length = elementsToRemove.length; index < length; index++) {\n                elementsToRemove[index][NG_REMOVED] = true;\n              }\n            }\n            block.scope.$destroy();\n          }\n\n          // we are not using forEach for perf reasons (trying to avoid #call)\n          for (index = 0; index < collectionLength; index++) {\n            key = (collection === collectionKeys) ? index : collectionKeys[index];\n            value = collection[key];\n            block = nextBlockOrder[index];\n\n            if (block.scope) {\n              // if we have already seen this object, then we need to reuse the\n              // associated scope/element\n\n              nextNode = previousNode;\n\n              // skip nodes that are already pending removal via leave animation\n              do {\n                nextNode = nextNode.nextSibling;\n              } while (nextNode && nextNode[NG_REMOVED]);\n\n              if (getBlockStart(block) != nextNode) {\n                // existing item which got moved\n                $animate.move(getBlockNodes(block.clone), null, previousNode);\n              }\n              previousNode = getBlockEnd(block);\n              updateScope(block.scope, index, valueIdentifier, value, keyIdentifier, key, collectionLength);\n            } else {\n              // new item which we don't know about\n              $transclude(function ngRepeatTransclude(clone, scope) {\n                block.scope = scope;\n                // http://jsperf.com/clone-vs-createcomment\n                var endNode = ngRepeatEndComment.cloneNode(false);\n                clone[clone.length++] = endNode;\n\n                $animate.enter(clone, null, previousNode);\n                previousNode = endNode;\n                // Note: We only need the first/last node of the cloned nodes.\n                // However, we need to keep the reference to the jqlite wrapper as it might be changed later\n                // by a directive with templateUrl when its template arrives.\n                block.clone = clone;\n                nextBlockMap[block.id] = block;\n                updateScope(block.scope, index, valueIdentifier, value, keyIdentifier, key, collectionLength);\n              });\n            }\n          }\n          lastBlockMap = nextBlockMap;\n        });\n      };\n    }\n  };\n}];\n\nvar NG_HIDE_CLASS = 'ng-hide';\nvar NG_HIDE_IN_PROGRESS_CLASS = 'ng-hide-animate';\n/**\n * @ngdoc directive\n * @name ngShow\n * @multiElement\n *\n * @description\n * The `ngShow` directive shows or hides the given HTML element based on the expression\n * provided to the `ngShow` attribute. The element is shown or hidden by removing or adding\n * the `.ng-hide` CSS class onto the element. The `.ng-hide` CSS class is predefined\n * in AngularJS and sets the display style to none (using an !important flag).\n * For CSP mode please add `angular-csp.css` to your html file (see {@link ng.directive:ngCsp ngCsp}).\n *\n * ```html\n * <!-- when $scope.myValue is truthy (element is visible) -->\n * <div ng-show=\"myValue\"></div>\n *\n * <!-- when $scope.myValue is falsy (element is hidden) -->\n * <div ng-show=\"myValue\" class=\"ng-hide\"></div>\n * ```\n *\n * When the `ngShow` expression evaluates to a falsy value then the `.ng-hide` CSS class is added to the class\n * attribute on the element causing it to become hidden. When truthy, the `.ng-hide` CSS class is removed\n * from the element causing the element not to appear hidden.\n *\n * ## Why is !important used?\n *\n * You may be wondering why !important is used for the `.ng-hide` CSS class. This is because the `.ng-hide` selector\n * can be easily overridden by heavier selectors. For example, something as simple\n * as changing the display style on a HTML list item would make hidden elements appear visible.\n * This also becomes a bigger issue when dealing with CSS frameworks.\n *\n * By using !important, the show and hide behavior will work as expected despite any clash between CSS selector\n * specificity (when !important isn't used with any conflicting styles). If a developer chooses to override the\n * styling to change how to hide an element then it is just a matter of using !important in their own CSS code.\n *\n * ### Overriding `.ng-hide`\n *\n * By default, the `.ng-hide` class will style the element with `display: none!important`. If you wish to change\n * the hide behavior with ngShow/ngHide then this can be achieved by restating the styles for the `.ng-hide`\n * class CSS. Note that the selector that needs to be used is actually `.ng-hide:not(.ng-hide-animate)` to cope\n * with extra animation classes that can be added.\n *\n * ```css\n * .ng-hide:not(.ng-hide-animate) {\n *   /&#42; this is just another form of hiding an element &#42;/\n *   display: block!important;\n *   position: absolute;\n *   top: -9999px;\n *   left: -9999px;\n * }\n * ```\n *\n * By default you don't need to override in CSS anything and the animations will work around the display style.\n *\n * ## A note about animations with `ngShow`\n *\n * Animations in ngShow/ngHide work with the show and hide events that are triggered when the directive expression\n * is true and false. This system works like the animation system present with ngClass except that\n * you must also include the !important flag to override the display property\n * so that you can perform an animation when the element is hidden during the time of the animation.\n *\n * ```css\n * //\n * //a working example can be found at the bottom of this page\n * //\n * .my-element.ng-hide-add, .my-element.ng-hide-remove {\n *   /&#42; this is required as of 1.3x to properly\n *      apply all styling in a show/hide animation &#42;/\n *   transition: 0s linear all;\n * }\n *\n * .my-element.ng-hide-add-active,\n * .my-element.ng-hide-remove-active {\n *   /&#42; the transition is defined in the active class &#42;/\n *   transition: 1s linear all;\n * }\n *\n * .my-element.ng-hide-add { ... }\n * .my-element.ng-hide-add.ng-hide-add-active { ... }\n * .my-element.ng-hide-remove { ... }\n * .my-element.ng-hide-remove.ng-hide-remove-active { ... }\n * ```\n *\n * Keep in mind that, as of AngularJS version 1.3, there is no need to change the display\n * property to block during animation states--ngAnimate will handle the style toggling automatically for you.\n *\n * @animations\n * | Animation                        | Occurs                              |\n * |----------------------------------|-------------------------------------|\n * | {@link $animate#addClass addClass} `.ng-hide`  | after the `ngShow` expression evaluates to a non truthy value and just before the contents are set to hidden |\n * | {@link $animate#removeClass removeClass}  `.ng-hide`  | after the `ngShow` expression evaluates to a truthy value and just before contents are set to visible |\n *\n * @element ANY\n * @param {expression} ngShow If the {@link guide/expression expression} is truthy\n *     then the element is shown or hidden respectively.\n *\n * @example\n  <example module=\"ngAnimate\" deps=\"angular-animate.js\" animations=\"true\">\n    <file name=\"index.html\">\n      Click me: <input type=\"checkbox\" ng-model=\"checked\" aria-label=\"Toggle ngHide\"><br/>\n      <div>\n        Show:\n        <div class=\"check-element animate-show\" ng-show=\"checked\">\n          <span class=\"glyphicon glyphicon-thumbs-up\"></span> I show up when your checkbox is checked.\n        </div>\n      </div>\n      <div>\n        Hide:\n        <div class=\"check-element animate-show\" ng-hide=\"checked\">\n          <span class=\"glyphicon glyphicon-thumbs-down\"></span> I hide when your checkbox is checked.\n        </div>\n      </div>\n    </file>\n    <file name=\"glyphicons.css\">\n      @import url(../../components/bootstrap-3.1.1/css/bootstrap.css);\n    </file>\n    <file name=\"animations.css\">\n      .animate-show {\n        line-height: 20px;\n        opacity: 1;\n        padding: 10px;\n        border: 1px solid black;\n        background: white;\n      }\n\n      .animate-show.ng-hide-add, .animate-show.ng-hide-remove {\n        transition: all linear 0.5s;\n      }\n\n      .animate-show.ng-hide {\n        line-height: 0;\n        opacity: 0;\n        padding: 0 10px;\n      }\n\n      .check-element {\n        padding: 10px;\n        border: 1px solid black;\n        background: white;\n      }\n    </file>\n    <file name=\"protractor.js\" type=\"protractor\">\n      var thumbsUp = element(by.css('span.glyphicon-thumbs-up'));\n      var thumbsDown = element(by.css('span.glyphicon-thumbs-down'));\n\n      it('should check ng-show / ng-hide', function() {\n        expect(thumbsUp.isDisplayed()).toBeFalsy();\n        expect(thumbsDown.isDisplayed()).toBeTruthy();\n\n        element(by.model('checked')).click();\n\n        expect(thumbsUp.isDisplayed()).toBeTruthy();\n        expect(thumbsDown.isDisplayed()).toBeFalsy();\n      });\n    </file>\n  </example>\n */\nvar ngShowDirective = ['$animate', function($animate) {\n  return {\n    restrict: 'A',\n    multiElement: true,\n    link: function(scope, element, attr) {\n      scope.$watch(attr.ngShow, function ngShowWatchAction(value) {\n        // we're adding a temporary, animation-specific class for ng-hide since this way\n        // we can control when the element is actually displayed on screen without having\n        // to have a global/greedy CSS selector that breaks when other animations are run.\n        // Read: https://github.com/angular/angular.js/issues/9103#issuecomment-58335845\n        $animate[value ? 'removeClass' : 'addClass'](element, NG_HIDE_CLASS, {\n          tempClasses: NG_HIDE_IN_PROGRESS_CLASS\n        });\n      });\n    }\n  };\n}];\n\n\n/**\n * @ngdoc directive\n * @name ngHide\n * @multiElement\n *\n * @description\n * The `ngHide` directive shows or hides the given HTML element based on the expression\n * provided to the `ngHide` attribute. The element is shown or hidden by removing or adding\n * the `ng-hide` CSS class onto the element. The `.ng-hide` CSS class is predefined\n * in AngularJS and sets the display style to none (using an !important flag).\n * For CSP mode please add `angular-csp.css` to your html file (see {@link ng.directive:ngCsp ngCsp}).\n *\n * ```html\n * <!-- when $scope.myValue is truthy (element is hidden) -->\n * <div ng-hide=\"myValue\" class=\"ng-hide\"></div>\n *\n * <!-- when $scope.myValue is falsy (element is visible) -->\n * <div ng-hide=\"myValue\"></div>\n * ```\n *\n * When the `ngHide` expression evaluates to a truthy value then the `.ng-hide` CSS class is added to the class\n * attribute on the element causing it to become hidden. When falsy, the `.ng-hide` CSS class is removed\n * from the element causing the element not to appear hidden.\n *\n * ## Why is !important used?\n *\n * You may be wondering why !important is used for the `.ng-hide` CSS class. This is because the `.ng-hide` selector\n * can be easily overridden by heavier selectors. For example, something as simple\n * as changing the display style on a HTML list item would make hidden elements appear visible.\n * This also becomes a bigger issue when dealing with CSS frameworks.\n *\n * By using !important, the show and hide behavior will work as expected despite any clash between CSS selector\n * specificity (when !important isn't used with any conflicting styles). If a developer chooses to override the\n * styling to change how to hide an element then it is just a matter of using !important in their own CSS code.\n *\n * ### Overriding `.ng-hide`\n *\n * By default, the `.ng-hide` class will style the element with `display: none!important`. If you wish to change\n * the hide behavior with ngShow/ngHide then this can be achieved by restating the styles for the `.ng-hide`\n * class in CSS:\n *\n * ```css\n * .ng-hide {\n *   /&#42; this is just another form of hiding an element &#42;/\n *   display: block!important;\n *   position: absolute;\n *   top: -9999px;\n *   left: -9999px;\n * }\n * ```\n *\n * By default you don't need to override in CSS anything and the animations will work around the display style.\n *\n * ## A note about animations with `ngHide`\n *\n * Animations in ngShow/ngHide work with the show and hide events that are triggered when the directive expression\n * is true and false. This system works like the animation system present with ngClass, except that the `.ng-hide`\n * CSS class is added and removed for you instead of your own CSS class.\n *\n * ```css\n * //\n * //a working example can be found at the bottom of this page\n * //\n * .my-element.ng-hide-add, .my-element.ng-hide-remove {\n *   transition: 0.5s linear all;\n * }\n *\n * .my-element.ng-hide-add { ... }\n * .my-element.ng-hide-add.ng-hide-add-active { ... }\n * .my-element.ng-hide-remove { ... }\n * .my-element.ng-hide-remove.ng-hide-remove-active { ... }\n * ```\n *\n * Keep in mind that, as of AngularJS version 1.3, there is no need to change the display\n * property to block during animation states--ngAnimate will handle the style toggling automatically for you.\n *\n * @animations\n * | Animation                        | Occurs                              |\n * |----------------------------------|-------------------------------------|\n * | {@link $animate#addClass addClass} `.ng-hide`  | after the `ngHide` expression evaluates to a truthy value and just before the contents are set to hidden |\n * | {@link $animate#removeClass removeClass}  `.ng-hide`  | after the `ngHide` expression evaluates to a non truthy value and just before contents are set to visible |\n *\n *\n * @element ANY\n * @param {expression} ngHide If the {@link guide/expression expression} is truthy then\n *     the element is shown or hidden respectively.\n *\n * @example\n  <example module=\"ngAnimate\" deps=\"angular-animate.js\" animations=\"true\">\n    <file name=\"index.html\">\n      Click me: <input type=\"checkbox\" ng-model=\"checked\" aria-label=\"Toggle ngShow\"><br/>\n      <div>\n        Show:\n        <div class=\"check-element animate-hide\" ng-show=\"checked\">\n          <span class=\"glyphicon glyphicon-thumbs-up\"></span> I show up when your checkbox is checked.\n        </div>\n      </div>\n      <div>\n        Hide:\n        <div class=\"check-element animate-hide\" ng-hide=\"checked\">\n          <span class=\"glyphicon glyphicon-thumbs-down\"></span> I hide when your checkbox is checked.\n        </div>\n      </div>\n    </file>\n    <file name=\"glyphicons.css\">\n      @import url(../../components/bootstrap-3.1.1/css/bootstrap.css);\n    </file>\n    <file name=\"animations.css\">\n      .animate-hide {\n        transition: all linear 0.5s;\n        line-height: 20px;\n        opacity: 1;\n        padding: 10px;\n        border: 1px solid black;\n        background: white;\n      }\n\n      .animate-hide.ng-hide {\n        line-height: 0;\n        opacity: 0;\n        padding: 0 10px;\n      }\n\n      .check-element {\n        padding: 10px;\n        border: 1px solid black;\n        background: white;\n      }\n    </file>\n    <file name=\"protractor.js\" type=\"protractor\">\n      var thumbsUp = element(by.css('span.glyphicon-thumbs-up'));\n      var thumbsDown = element(by.css('span.glyphicon-thumbs-down'));\n\n      it('should check ng-show / ng-hide', function() {\n        expect(thumbsUp.isDisplayed()).toBeFalsy();\n        expect(thumbsDown.isDisplayed()).toBeTruthy();\n\n        element(by.model('checked')).click();\n\n        expect(thumbsUp.isDisplayed()).toBeTruthy();\n        expect(thumbsDown.isDisplayed()).toBeFalsy();\n      });\n    </file>\n  </example>\n */\nvar ngHideDirective = ['$animate', function($animate) {\n  return {\n    restrict: 'A',\n    multiElement: true,\n    link: function(scope, element, attr) {\n      scope.$watch(attr.ngHide, function ngHideWatchAction(value) {\n        // The comment inside of the ngShowDirective explains why we add and\n        // remove a temporary class for the show/hide animation\n        $animate[value ? 'addClass' : 'removeClass'](element,NG_HIDE_CLASS, {\n          tempClasses: NG_HIDE_IN_PROGRESS_CLASS\n        });\n      });\n    }\n  };\n}];\n\n/**\n * @ngdoc directive\n * @name ngStyle\n * @restrict AC\n *\n * @description\n * The `ngStyle` directive allows you to set CSS style on an HTML element conditionally.\n *\n * @element ANY\n * @param {expression} ngStyle\n *\n * {@link guide/expression Expression} which evals to an\n * object whose keys are CSS style names and values are corresponding values for those CSS\n * keys.\n *\n * Since some CSS style names are not valid keys for an object, they must be quoted.\n * See the 'background-color' style in the example below.\n *\n * @example\n   <example>\n     <file name=\"index.html\">\n        <input type=\"button\" value=\"set color\" ng-click=\"myStyle={color:'red'}\">\n        <input type=\"button\" value=\"set background\" ng-click=\"myStyle={'background-color':'blue'}\">\n        <input type=\"button\" value=\"clear\" ng-click=\"myStyle={}\">\n        <br/>\n        <span ng-style=\"myStyle\">Sample Text</span>\n        <pre>myStyle={{myStyle}}</pre>\n     </file>\n     <file name=\"style.css\">\n       span {\n         color: black;\n       }\n     </file>\n     <file name=\"protractor.js\" type=\"protractor\">\n       var colorSpan = element(by.css('span'));\n\n       it('should check ng-style', function() {\n         expect(colorSpan.getCssValue('color')).toBe('rgba(0, 0, 0, 1)');\n         element(by.css('input[value=\\'set color\\']')).click();\n         expect(colorSpan.getCssValue('color')).toBe('rgba(255, 0, 0, 1)');\n         element(by.css('input[value=clear]')).click();\n         expect(colorSpan.getCssValue('color')).toBe('rgba(0, 0, 0, 1)');\n       });\n     </file>\n   </example>\n */\nvar ngStyleDirective = ngDirective(function(scope, element, attr) {\n  scope.$watch(attr.ngStyle, function ngStyleWatchAction(newStyles, oldStyles) {\n    if (oldStyles && (newStyles !== oldStyles)) {\n      forEach(oldStyles, function(val, style) { element.css(style, '');});\n    }\n    if (newStyles) element.css(newStyles);\n  }, true);\n});\n\n/**\n * @ngdoc directive\n * @name ngSwitch\n * @restrict EA\n *\n * @description\n * The `ngSwitch` directive is used to conditionally swap DOM structure on your template based on a scope expression.\n * Elements within `ngSwitch` but without `ngSwitchWhen` or `ngSwitchDefault` directives will be preserved at the location\n * as specified in the template.\n *\n * The directive itself works similar to ngInclude, however, instead of downloading template code (or loading it\n * from the template cache), `ngSwitch` simply chooses one of the nested elements and makes it visible based on which element\n * matches the value obtained from the evaluated expression. In other words, you define a container element\n * (where you place the directive), place an expression on the **`on=\"...\"` attribute**\n * (or the **`ng-switch=\"...\"` attribute**), define any inner elements inside of the directive and place\n * a when attribute per element. The when attribute is used to inform ngSwitch which element to display when the on\n * expression is evaluated. If a matching expression is not found via a when attribute then an element with the default\n * attribute is displayed.\n *\n * <div class=\"alert alert-info\">\n * Be aware that the attribute values to match against cannot be expressions. They are interpreted\n * as literal string values to match against.\n * For example, **`ng-switch-when=\"someVal\"`** will match against the string `\"someVal\"` not against the\n * value of the expression `$scope.someVal`.\n * </div>\n\n * @animations\n * | Animation                        | Occurs                              |\n * |----------------------------------|-------------------------------------|\n * | {@link ng.$animate#enter enter}  | after the ngSwitch contents change and the matched child element is placed inside the container |\n * | {@link ng.$animate#leave leave}  | after the ngSwitch contents change and just before the former contents are removed from the DOM |\n *\n * @usage\n *\n * ```\n * <ANY ng-switch=\"expression\">\n *   <ANY ng-switch-when=\"matchValue1\">...</ANY>\n *   <ANY ng-switch-when=\"matchValue2\">...</ANY>\n *   <ANY ng-switch-default>...</ANY>\n * </ANY>\n * ```\n *\n *\n * @scope\n * @priority 1200\n * @param {*} ngSwitch|on expression to match against <code>ng-switch-when</code>.\n * On child elements add:\n *\n * * `ngSwitchWhen`: the case statement to match against. If match then this\n *   case will be displayed. If the same match appears multiple times, all the\n *   elements will be displayed.\n * * `ngSwitchDefault`: the default case when no other case match. If there\n *   are multiple default cases, all of them will be displayed when no other\n *   case match.\n *\n *\n * @example\n  <example module=\"switchExample\" deps=\"angular-animate.js\" animations=\"true\">\n    <file name=\"index.html\">\n      <div ng-controller=\"ExampleController\">\n        <select ng-model=\"selection\" ng-options=\"item for item in items\">\n        </select>\n        <code>selection={{selection}}</code>\n        <hr/>\n        <div class=\"animate-switch-container\"\n          ng-switch on=\"selection\">\n            <div class=\"animate-switch\" ng-switch-when=\"settings\">Settings Div</div>\n            <div class=\"animate-switch\" ng-switch-when=\"home\">Home Span</div>\n            <div class=\"animate-switch\" ng-switch-default>default</div>\n        </div>\n      </div>\n    </file>\n    <file name=\"script.js\">\n      angular.module('switchExample', ['ngAnimate'])\n        .controller('ExampleController', ['$scope', function($scope) {\n          $scope.items = ['settings', 'home', 'other'];\n          $scope.selection = $scope.items[0];\n        }]);\n    </file>\n    <file name=\"animations.css\">\n      .animate-switch-container {\n        position:relative;\n        background:white;\n        border:1px solid black;\n        height:40px;\n        overflow:hidden;\n      }\n\n      .animate-switch {\n        padding:10px;\n      }\n\n      .animate-switch.ng-animate {\n        transition:all cubic-bezier(0.250, 0.460, 0.450, 0.940) 0.5s;\n\n        position:absolute;\n        top:0;\n        left:0;\n        right:0;\n        bottom:0;\n      }\n\n      .animate-switch.ng-leave.ng-leave-active,\n      .animate-switch.ng-enter {\n        top:-50px;\n      }\n      .animate-switch.ng-leave,\n      .animate-switch.ng-enter.ng-enter-active {\n        top:0;\n      }\n    </file>\n    <file name=\"protractor.js\" type=\"protractor\">\n      var switchElem = element(by.css('[ng-switch]'));\n      var select = element(by.model('selection'));\n\n      it('should start in settings', function() {\n        expect(switchElem.getText()).toMatch(/Settings Div/);\n      });\n      it('should change to home', function() {\n        select.all(by.css('option')).get(1).click();\n        expect(switchElem.getText()).toMatch(/Home Span/);\n      });\n      it('should select default', function() {\n        select.all(by.css('option')).get(2).click();\n        expect(switchElem.getText()).toMatch(/default/);\n      });\n    </file>\n  </example>\n */\nvar ngSwitchDirective = ['$animate', '$compile', function($animate, $compile) {\n  return {\n    require: 'ngSwitch',\n\n    // asks for $scope to fool the BC controller module\n    controller: ['$scope', function ngSwitchController() {\n     this.cases = {};\n    }],\n    link: function(scope, element, attr, ngSwitchController) {\n      var watchExpr = attr.ngSwitch || attr.on,\n          selectedTranscludes = [],\n          selectedElements = [],\n          previousLeaveAnimations = [],\n          selectedScopes = [];\n\n      var spliceFactory = function(array, index) {\n          return function() { array.splice(index, 1); };\n      };\n\n      scope.$watch(watchExpr, function ngSwitchWatchAction(value) {\n        var i, ii;\n        for (i = 0, ii = previousLeaveAnimations.length; i < ii; ++i) {\n          $animate.cancel(previousLeaveAnimations[i]);\n        }\n        previousLeaveAnimations.length = 0;\n\n        for (i = 0, ii = selectedScopes.length; i < ii; ++i) {\n          var selected = getBlockNodes(selectedElements[i].clone);\n          selectedScopes[i].$destroy();\n          var promise = previousLeaveAnimations[i] = $animate.leave(selected);\n          promise.then(spliceFactory(previousLeaveAnimations, i));\n        }\n\n        selectedElements.length = 0;\n        selectedScopes.length = 0;\n\n        if ((selectedTranscludes = ngSwitchController.cases['!' + value] || ngSwitchController.cases['?'])) {\n          forEach(selectedTranscludes, function(selectedTransclude) {\n            selectedTransclude.transclude(function(caseElement, selectedScope) {\n              selectedScopes.push(selectedScope);\n              var anchor = selectedTransclude.element;\n              caseElement[caseElement.length++] = $compile.$$createComment('end ngSwitchWhen');\n              var block = { clone: caseElement };\n\n              selectedElements.push(block);\n              $animate.enter(caseElement, anchor.parent(), anchor);\n            });\n          });\n        }\n      });\n    }\n  };\n}];\n\nvar ngSwitchWhenDirective = ngDirective({\n  transclude: 'element',\n  priority: 1200,\n  require: '^ngSwitch',\n  multiElement: true,\n  link: function(scope, element, attrs, ctrl, $transclude) {\n    ctrl.cases['!' + attrs.ngSwitchWhen] = (ctrl.cases['!' + attrs.ngSwitchWhen] || []);\n    ctrl.cases['!' + attrs.ngSwitchWhen].push({ transclude: $transclude, element: element });\n  }\n});\n\nvar ngSwitchDefaultDirective = ngDirective({\n  transclude: 'element',\n  priority: 1200,\n  require: '^ngSwitch',\n  multiElement: true,\n  link: function(scope, element, attr, ctrl, $transclude) {\n    ctrl.cases['?'] = (ctrl.cases['?'] || []);\n    ctrl.cases['?'].push({ transclude: $transclude, element: element });\n   }\n});\n\n/**\n * @ngdoc directive\n * @name ngTransclude\n * @restrict EAC\n *\n * @description\n * Directive that marks the insertion point for the transcluded DOM of the nearest parent directive that uses transclusion.\n *\n * You can specify that you want to insert a named transclusion slot, instead of the default slot, by providing the slot name\n * as the value of the `ng-transclude` or `ng-transclude-slot` attribute.\n *\n * If the transcluded content is not empty (i.e. contains one or more DOM nodes, including whitespace text nodes), any existing\n * content of this element will be removed before the transcluded content is inserted.\n * If the transcluded content is empty, the existing content is left intact. This lets you provide fallback content in the case\n * that no transcluded content is provided.\n *\n * @element ANY\n *\n * @param {string} ngTransclude|ngTranscludeSlot the name of the slot to insert at this point. If this is not provided, is empty\n *                                               or its value is the same as the name of the attribute then the default slot is used.\n *\n * @example\n * ### Basic transclusion\n * This example demonstrates basic transclusion of content into a component directive.\n * <example name=\"simpleTranscludeExample\" module=\"transcludeExample\">\n *   <file name=\"index.html\">\n *     <script>\n *       angular.module('transcludeExample', [])\n *        .directive('pane', function(){\n *           return {\n *             restrict: 'E',\n *             transclude: true,\n *             scope: { title:'@' },\n *             template: '<div style=\"border: 1px solid black;\">' +\n *                         '<div style=\"background-color: gray\">{{title}}</div>' +\n *                         '<ng-transclude></ng-transclude>' +\n *                       '</div>'\n *           };\n *       })\n *       .controller('ExampleController', ['$scope', function($scope) {\n *         $scope.title = 'Lorem Ipsum';\n *         $scope.text = 'Neque porro quisquam est qui dolorem ipsum quia dolor...';\n *       }]);\n *     </script>\n *     <div ng-controller=\"ExampleController\">\n *       <input ng-model=\"title\" aria-label=\"title\"> <br/>\n *       <textarea ng-model=\"text\" aria-label=\"text\"></textarea> <br/>\n *       <pane title=\"{{title}}\">{{text}}</pane>\n *     </div>\n *   </file>\n *   <file name=\"protractor.js\" type=\"protractor\">\n *      it('should have transcluded', function() {\n *        var titleElement = element(by.model('title'));\n *        titleElement.clear();\n *        titleElement.sendKeys('TITLE');\n *        var textElement = element(by.model('text'));\n *        textElement.clear();\n *        textElement.sendKeys('TEXT');\n *        expect(element(by.binding('title')).getText()).toEqual('TITLE');\n *        expect(element(by.binding('text')).getText()).toEqual('TEXT');\n *      });\n *   </file>\n * </example>\n *\n * @example\n * ### Transclude fallback content\n * This example shows how to use `NgTransclude` with fallback content, that\n * is displayed if no transcluded content is provided.\n *\n * <example module=\"transcludeFallbackContentExample\">\n * <file name=\"index.html\">\n * <script>\n * angular.module('transcludeFallbackContentExample', [])\n * .directive('myButton', function(){\n *             return {\n *               restrict: 'E',\n *               transclude: true,\n *               scope: true,\n *               template: '<button style=\"cursor: pointer;\">' +\n *                           '<ng-transclude>' +\n *                             '<b style=\"color: red;\">Button1</b>' +\n *                           '</ng-transclude>' +\n *                         '</button>'\n *             };\n *         });\n * </script>\n * <!-- fallback button content -->\n * <my-button id=\"fallback\"></my-button>\n * <!-- modified button content -->\n * <my-button id=\"modified\">\n *   <i style=\"color: green;\">Button2</i>\n * </my-button>\n * </file>\n * <file name=\"protractor.js\" type=\"protractor\">\n * it('should have different transclude element content', function() {\n *          expect(element(by.id('fallback')).getText()).toBe('Button1');\n *          expect(element(by.id('modified')).getText()).toBe('Button2');\n *        });\n * </file>\n * </example>\n *\n * @example\n * ### Multi-slot transclusion\n * This example demonstrates using multi-slot transclusion in a component directive.\n * <example name=\"multiSlotTranscludeExample\" module=\"multiSlotTranscludeExample\">\n *   <file name=\"index.html\">\n *    <style>\n *      .title, .footer {\n *        background-color: gray\n *      }\n *    </style>\n *    <div ng-controller=\"ExampleController\">\n *      <input ng-model=\"title\" aria-label=\"title\"> <br/>\n *      <textarea ng-model=\"text\" aria-label=\"text\"></textarea> <br/>\n *      <pane>\n *        <pane-title><a ng-href=\"{{link}}\">{{title}}</a></pane-title>\n *        <pane-body><p>{{text}}</p></pane-body>\n *      </pane>\n *    </div>\n *   </file>\n *   <file name=\"app.js\">\n *    angular.module('multiSlotTranscludeExample', [])\n *     .directive('pane', function(){\n *        return {\n *          restrict: 'E',\n *          transclude: {\n *            'title': '?paneTitle',\n *            'body': 'paneBody',\n *            'footer': '?paneFooter'\n *          },\n *          template: '<div style=\"border: 1px solid black;\">' +\n *                      '<div class=\"title\" ng-transclude=\"title\">Fallback Title</div>' +\n *                      '<div ng-transclude=\"body\"></div>' +\n *                      '<div class=\"footer\" ng-transclude=\"footer\">Fallback Footer</div>' +\n *                    '</div>'\n *        };\n *    })\n *    .controller('ExampleController', ['$scope', function($scope) {\n *      $scope.title = 'Lorem Ipsum';\n *      $scope.link = \"https://google.com\";\n *      $scope.text = 'Neque porro quisquam est qui dolorem ipsum quia dolor...';\n *    }]);\n *   </file>\n *   <file name=\"protractor.js\" type=\"protractor\">\n *      it('should have transcluded the title and the body', function() {\n *        var titleElement = element(by.model('title'));\n *        titleElement.clear();\n *        titleElement.sendKeys('TITLE');\n *        var textElement = element(by.model('text'));\n *        textElement.clear();\n *        textElement.sendKeys('TEXT');\n *        expect(element(by.css('.title')).getText()).toEqual('TITLE');\n *        expect(element(by.binding('text')).getText()).toEqual('TEXT');\n *        expect(element(by.css('.footer')).getText()).toEqual('Fallback Footer');\n *      });\n *   </file>\n * </example>\n */\nvar ngTranscludeMinErr = minErr('ngTransclude');\nvar ngTranscludeDirective = ngDirective({\n  restrict: 'EAC',\n  link: function($scope, $element, $attrs, controller, $transclude) {\n\n    if ($attrs.ngTransclude === $attrs.$attr.ngTransclude) {\n      // If the attribute is of the form: `ng-transclude=\"ng-transclude\"`\n      // then treat it like the default\n      $attrs.ngTransclude = '';\n    }\n\n    function ngTranscludeCloneAttachFn(clone) {\n      if (clone.length) {\n        $element.empty();\n        $element.append(clone);\n      }\n    }\n\n    if (!$transclude) {\n      throw ngTranscludeMinErr('orphan',\n       'Illegal use of ngTransclude directive in the template! ' +\n       'No parent directive that requires a transclusion found. ' +\n       'Element: {0}',\n       startingTag($element));\n    }\n\n    // If there is no slot name defined or the slot name is not optional\n    // then transclude the slot\n    var slotName = $attrs.ngTransclude || $attrs.ngTranscludeSlot;\n    $transclude(ngTranscludeCloneAttachFn, null, slotName);\n  }\n});\n\n/**\n * @ngdoc directive\n * @name script\n * @restrict E\n *\n * @description\n * Load the content of a `<script>` element into {@link ng.$templateCache `$templateCache`}, so that the\n * template can be used by {@link ng.directive:ngInclude `ngInclude`},\n * {@link ngRoute.directive:ngView `ngView`}, or {@link guide/directive directives}. The type of the\n * `<script>` element must be specified as `text/ng-template`, and a cache name for the template must be\n * assigned through the element's `id`, which can then be used as a directive's `templateUrl`.\n *\n * @param {string} type Must be set to `'text/ng-template'`.\n * @param {string} id Cache name of the template.\n *\n * @example\n  <example>\n    <file name=\"index.html\">\n      <script type=\"text/ng-template\" id=\"/tpl.html\">\n        Content of the template.\n      </script>\n\n      <a ng-click=\"currentTpl='/tpl.html'\" id=\"tpl-link\">Load inlined template</a>\n      <div id=\"tpl-content\" ng-include src=\"currentTpl\"></div>\n    </file>\n    <file name=\"protractor.js\" type=\"protractor\">\n      it('should load template defined inside script tag', function() {\n        element(by.css('#tpl-link')).click();\n        expect(element(by.css('#tpl-content')).getText()).toMatch(/Content of the template/);\n      });\n    </file>\n  </example>\n */\nvar scriptDirective = ['$templateCache', function($templateCache) {\n  return {\n    restrict: 'E',\n    terminal: true,\n    compile: function(element, attr) {\n      if (attr.type == 'text/ng-template') {\n        var templateUrl = attr.id,\n            text = element[0].text;\n\n        $templateCache.put(templateUrl, text);\n      }\n    }\n  };\n}];\n\nvar noopNgModelController = { $setViewValue: noop, $render: noop };\n\nfunction chromeHack(optionElement) {\n  // Workaround for https://code.google.com/p/chromium/issues/detail?id=381459\n  // Adding an <option selected=\"selected\"> element to a <select required=\"required\"> should\n  // automatically select the new element\n  if (optionElement[0].hasAttribute('selected')) {\n    optionElement[0].selected = true;\n  }\n}\n\n/**\n * @ngdoc type\n * @name  select.SelectController\n * @description\n * The controller for the `<select>` directive. This provides support for reading\n * and writing the selected value(s) of the control and also coordinates dynamically\n * added `<option>` elements, perhaps by an `ngRepeat` directive.\n */\nvar SelectController =\n        ['$element', '$scope', function($element, $scope) {\n\n  var self = this,\n      optionsMap = new HashMap();\n\n  // If the ngModel doesn't get provided then provide a dummy noop version to prevent errors\n  self.ngModelCtrl = noopNgModelController;\n\n  // The \"unknown\" option is one that is prepended to the list if the viewValue\n  // does not match any of the options. When it is rendered the value of the unknown\n  // option is '? XXX ?' where XXX is the hashKey of the value that is not known.\n  //\n  // We can't just jqLite('<option>') since jqLite is not smart enough\n  // to create it in <select> and IE barfs otherwise.\n  self.unknownOption = jqLite(window.document.createElement('option'));\n  self.renderUnknownOption = function(val) {\n    var unknownVal = '? ' + hashKey(val) + ' ?';\n    self.unknownOption.val(unknownVal);\n    $element.prepend(self.unknownOption);\n    $element.val(unknownVal);\n  };\n\n  $scope.$on('$destroy', function() {\n    // disable unknown option so that we don't do work when the whole select is being destroyed\n    self.renderUnknownOption = noop;\n  });\n\n  self.removeUnknownOption = function() {\n    if (self.unknownOption.parent()) self.unknownOption.remove();\n  };\n\n\n  // Read the value of the select control, the implementation of this changes depending\n  // upon whether the select can have multiple values and whether ngOptions is at work.\n  self.readValue = function readSingleValue() {\n    self.removeUnknownOption();\n    return $element.val();\n  };\n\n\n  // Write the value to the select control, the implementation of this changes depending\n  // upon whether the select can have multiple values and whether ngOptions is at work.\n  self.writeValue = function writeSingleValue(value) {\n    if (self.hasOption(value)) {\n      self.removeUnknownOption();\n      $element.val(value);\n      if (value === '') self.emptyOption.prop('selected', true); // to make IE9 happy\n    } else {\n      if (value == null && self.emptyOption) {\n        self.removeUnknownOption();\n        $element.val('');\n      } else {\n        self.renderUnknownOption(value);\n      }\n    }\n  };\n\n\n  // Tell the select control that an option, with the given value, has been added\n  self.addOption = function(value, element) {\n    // Skip comment nodes, as they only pollute the `optionsMap`\n    if (element[0].nodeType === NODE_TYPE_COMMENT) return;\n\n    assertNotHasOwnProperty(value, '\"option value\"');\n    if (value === '') {\n      self.emptyOption = element;\n    }\n    var count = optionsMap.get(value) || 0;\n    optionsMap.put(value, count + 1);\n    self.ngModelCtrl.$render();\n    chromeHack(element);\n  };\n\n  // Tell the select control that an option, with the given value, has been removed\n  self.removeOption = function(value) {\n    var count = optionsMap.get(value);\n    if (count) {\n      if (count === 1) {\n        optionsMap.remove(value);\n        if (value === '') {\n          self.emptyOption = undefined;\n        }\n      } else {\n        optionsMap.put(value, count - 1);\n      }\n    }\n  };\n\n  // Check whether the select control has an option matching the given value\n  self.hasOption = function(value) {\n    return !!optionsMap.get(value);\n  };\n\n\n  self.registerOption = function(optionScope, optionElement, optionAttrs, interpolateValueFn, interpolateTextFn) {\n\n    if (interpolateValueFn) {\n      // The value attribute is interpolated\n      var oldVal;\n      optionAttrs.$observe('value', function valueAttributeObserveAction(newVal) {\n        if (isDefined(oldVal)) {\n          self.removeOption(oldVal);\n        }\n        oldVal = newVal;\n        self.addOption(newVal, optionElement);\n      });\n    } else if (interpolateTextFn) {\n      // The text content is interpolated\n      optionScope.$watch(interpolateTextFn, function interpolateWatchAction(newVal, oldVal) {\n        optionAttrs.$set('value', newVal);\n        if (oldVal !== newVal) {\n          self.removeOption(oldVal);\n        }\n        self.addOption(newVal, optionElement);\n      });\n    } else {\n      // The value attribute is static\n      self.addOption(optionAttrs.value, optionElement);\n    }\n\n    optionElement.on('$destroy', function() {\n      self.removeOption(optionAttrs.value);\n      self.ngModelCtrl.$render();\n    });\n  };\n}];\n\n/**\n * @ngdoc directive\n * @name select\n * @restrict E\n *\n * @description\n * HTML `SELECT` element with angular data-binding.\n *\n * The `select` directive is used together with {@link ngModel `ngModel`} to provide data-binding\n * between the scope and the `<select>` control (including setting default values).\n * It also handles dynamic `<option>` elements, which can be added using the {@link ngRepeat `ngRepeat}` or\n * {@link ngOptions `ngOptions`} directives.\n *\n * When an item in the `<select>` menu is selected, the value of the selected option will be bound\n * to the model identified by the `ngModel` directive. With static or repeated options, this is\n * the content of the `value` attribute or the textContent of the `<option>`, if the value attribute is missing.\n * If you want dynamic value attributes, you can use interpolation inside the value attribute.\n *\n * <div class=\"alert alert-warning\">\n * Note that the value of a `select` directive used without `ngOptions` is always a string.\n * When the model needs to be bound to a non-string value, you must either explicitly convert it\n * using a directive (see example below) or use `ngOptions` to specify the set of options.\n * This is because an option element can only be bound to string values at present.\n * </div>\n *\n * If the viewValue of `ngModel` does not match any of the options, then the control\n * will automatically add an \"unknown\" option, which it then removes when the mismatch is resolved.\n *\n * Optionally, a single hard-coded `<option>` element, with the value set to an empty string, can\n * be nested into the `<select>` element. This element will then represent the `null` or \"not selected\"\n * option. See example below for demonstration.\n *\n * <div class=\"alert alert-info\">\n * In many cases, `ngRepeat` can be used on `<option>` elements instead of {@link ng.directive:ngOptions\n * ngOptions} to achieve a similar result. However, `ngOptions` provides some benefits, such as\n * more flexibility in how the `<select>`'s model is assigned via the `select` **`as`** part of the\n * comprehension expression, and additionally in reducing memory and increasing speed by not creating\n * a new scope for each repeated instance.\n * </div>\n *\n *\n * @param {string} ngModel Assignable angular expression to data-bind to.\n * @param {string=} name Property name of the form under which the control is published.\n * @param {string=} multiple Allows multiple options to be selected. The selected values will be\n *     bound to the model as an array.\n * @param {string=} required Sets `required` validation error key if the value is not entered.\n * @param {string=} ngRequired Adds required attribute and required validation constraint to\n * the element when the ngRequired expression evaluates to true. Use ngRequired instead of required\n * when you want to data-bind to the required attribute.\n * @param {string=} ngChange Angular expression to be executed when selected option(s) changes due to user\n *    interaction with the select element.\n * @param {string=} ngOptions sets the options that the select is populated with and defines what is\n * set on the model on selection. See {@link ngOptions `ngOptions`}.\n *\n * @example\n * ### Simple `select` elements with static options\n *\n * <example name=\"static-select\" module=\"staticSelect\">\n * <file name=\"index.html\">\n * <div ng-controller=\"ExampleController\">\n *   <form name=\"myForm\">\n *     <label for=\"singleSelect\"> Single select: </label><br>\n *     <select name=\"singleSelect\" ng-model=\"data.singleSelect\">\n *       <option value=\"option-1\">Option 1</option>\n *       <option value=\"option-2\">Option 2</option>\n *     </select><br>\n *\n *     <label for=\"singleSelect\"> Single select with \"not selected\" option and dynamic option values: </label><br>\n *     <select name=\"singleSelect\" id=\"singleSelect\" ng-model=\"data.singleSelect\">\n *       <option value=\"\">---Please select---</option> <!-- not selected / blank option -->\n *       <option value=\"{{data.option1}}\">Option 1</option> <!-- interpolation -->\n *       <option value=\"option-2\">Option 2</option>\n *     </select><br>\n *     <button ng-click=\"forceUnknownOption()\">Force unknown option</button><br>\n *     <tt>singleSelect = {{data.singleSelect}}</tt>\n *\n *     <hr>\n *     <label for=\"multipleSelect\"> Multiple select: </label><br>\n *     <select name=\"multipleSelect\" id=\"multipleSelect\" ng-model=\"data.multipleSelect\" multiple>\n *       <option value=\"option-1\">Option 1</option>\n *       <option value=\"option-2\">Option 2</option>\n *       <option value=\"option-3\">Option 3</option>\n *     </select><br>\n *     <tt>multipleSelect = {{data.multipleSelect}}</tt><br/>\n *   </form>\n * </div>\n * </file>\n * <file name=\"app.js\">\n *  angular.module('staticSelect', [])\n *    .controller('ExampleController', ['$scope', function($scope) {\n *      $scope.data = {\n *       singleSelect: null,\n *       multipleSelect: [],\n *       option1: 'option-1',\n *      };\n *\n *      $scope.forceUnknownOption = function() {\n *        $scope.data.singleSelect = 'nonsense';\n *      };\n *   }]);\n * </file>\n *</example>\n *\n * ### Using `ngRepeat` to generate `select` options\n * <example name=\"ngrepeat-select\" module=\"ngrepeatSelect\">\n * <file name=\"index.html\">\n * <div ng-controller=\"ExampleController\">\n *   <form name=\"myForm\">\n *     <label for=\"repeatSelect\"> Repeat select: </label>\n *     <select name=\"repeatSelect\" id=\"repeatSelect\" ng-model=\"data.repeatSelect\">\n *       <option ng-repeat=\"option in data.availableOptions\" value=\"{{option.id}}\">{{option.name}}</option>\n *     </select>\n *   </form>\n *   <hr>\n *   <tt>repeatSelect = {{data.repeatSelect}}</tt><br/>\n * </div>\n * </file>\n * <file name=\"app.js\">\n *  angular.module('ngrepeatSelect', [])\n *    .controller('ExampleController', ['$scope', function($scope) {\n *      $scope.data = {\n *       repeatSelect: null,\n *       availableOptions: [\n *         {id: '1', name: 'Option A'},\n *         {id: '2', name: 'Option B'},\n *         {id: '3', name: 'Option C'}\n *       ],\n *      };\n *   }]);\n * </file>\n *</example>\n *\n *\n * ### Using `select` with `ngOptions` and setting a default value\n * See the {@link ngOptions ngOptions documentation} for more `ngOptions` usage examples.\n *\n * <example name=\"select-with-default-values\" module=\"defaultValueSelect\">\n * <file name=\"index.html\">\n * <div ng-controller=\"ExampleController\">\n *   <form name=\"myForm\">\n *     <label for=\"mySelect\">Make a choice:</label>\n *     <select name=\"mySelect\" id=\"mySelect\"\n *       ng-options=\"option.name for option in data.availableOptions track by option.id\"\n *       ng-model=\"data.selectedOption\"></select>\n *   </form>\n *   <hr>\n *   <tt>option = {{data.selectedOption}}</tt><br/>\n * </div>\n * </file>\n * <file name=\"app.js\">\n *  angular.module('defaultValueSelect', [])\n *    .controller('ExampleController', ['$scope', function($scope) {\n *      $scope.data = {\n *       availableOptions: [\n *         {id: '1', name: 'Option A'},\n *         {id: '2', name: 'Option B'},\n *         {id: '3', name: 'Option C'}\n *       ],\n *       selectedOption: {id: '3', name: 'Option C'} //This sets the default value of the select in the ui\n *       };\n *   }]);\n * </file>\n *</example>\n *\n *\n * ### Binding `select` to a non-string value via `ngModel` parsing / formatting\n *\n * <example name=\"select-with-non-string-options\" module=\"nonStringSelect\">\n *   <file name=\"index.html\">\n *     <select ng-model=\"model.id\" convert-to-number>\n *       <option value=\"0\">Zero</option>\n *       <option value=\"1\">One</option>\n *       <option value=\"2\">Two</option>\n *     </select>\n *     {{ model }}\n *   </file>\n *   <file name=\"app.js\">\n *     angular.module('nonStringSelect', [])\n *       .run(function($rootScope) {\n *         $rootScope.model = { id: 2 };\n *       })\n *       .directive('convertToNumber', function() {\n *         return {\n *           require: 'ngModel',\n *           link: function(scope, element, attrs, ngModel) {\n *             ngModel.$parsers.push(function(val) {\n *               return parseInt(val, 10);\n *             });\n *             ngModel.$formatters.push(function(val) {\n *               return '' + val;\n *             });\n *           }\n *         };\n *       });\n *   </file>\n *   <file name=\"protractor.js\" type=\"protractor\">\n *     it('should initialize to model', function() {\n *       var select = element(by.css('select'));\n *       expect(element(by.model('model.id')).$('option:checked').getText()).toEqual('Two');\n *     });\n *   </file>\n * </example>\n *\n */\nvar selectDirective = function() {\n\n  return {\n    restrict: 'E',\n    require: ['select', '?ngModel'],\n    controller: SelectController,\n    priority: 1,\n    link: {\n      pre: selectPreLink,\n      post: selectPostLink\n    }\n  };\n\n  function selectPreLink(scope, element, attr, ctrls) {\n\n      // if ngModel is not defined, we don't need to do anything\n      var ngModelCtrl = ctrls[1];\n      if (!ngModelCtrl) return;\n\n      var selectCtrl = ctrls[0];\n\n      selectCtrl.ngModelCtrl = ngModelCtrl;\n\n      // When the selected item(s) changes we delegate getting the value of the select control\n      // to the `readValue` method, which can be changed if the select can have multiple\n      // selected values or if the options are being generated by `ngOptions`\n      element.on('change', function() {\n        scope.$apply(function() {\n          ngModelCtrl.$setViewValue(selectCtrl.readValue());\n        });\n      });\n\n      // If the select allows multiple values then we need to modify how we read and write\n      // values from and to the control; also what it means for the value to be empty and\n      // we have to add an extra watch since ngModel doesn't work well with arrays - it\n      // doesn't trigger rendering if only an item in the array changes.\n      if (attr.multiple) {\n\n        // Read value now needs to check each option to see if it is selected\n        selectCtrl.readValue = function readMultipleValue() {\n          var array = [];\n          forEach(element.find('option'), function(option) {\n            if (option.selected) {\n              array.push(option.value);\n            }\n          });\n          return array;\n        };\n\n        // Write value now needs to set the selected property of each matching option\n        selectCtrl.writeValue = function writeMultipleValue(value) {\n          var items = new HashMap(value);\n          forEach(element.find('option'), function(option) {\n            option.selected = isDefined(items.get(option.value));\n          });\n        };\n\n        // we have to do it on each watch since ngModel watches reference, but\n        // we need to work of an array, so we need to see if anything was inserted/removed\n        var lastView, lastViewRef = NaN;\n        scope.$watch(function selectMultipleWatch() {\n          if (lastViewRef === ngModelCtrl.$viewValue && !equals(lastView, ngModelCtrl.$viewValue)) {\n            lastView = shallowCopy(ngModelCtrl.$viewValue);\n            ngModelCtrl.$render();\n          }\n          lastViewRef = ngModelCtrl.$viewValue;\n        });\n\n        // If we are a multiple select then value is now a collection\n        // so the meaning of $isEmpty changes\n        ngModelCtrl.$isEmpty = function(value) {\n          return !value || value.length === 0;\n        };\n\n      }\n    }\n\n    function selectPostLink(scope, element, attrs, ctrls) {\n      // if ngModel is not defined, we don't need to do anything\n      var ngModelCtrl = ctrls[1];\n      if (!ngModelCtrl) return;\n\n      var selectCtrl = ctrls[0];\n\n      // We delegate rendering to the `writeValue` method, which can be changed\n      // if the select can have multiple selected values or if the options are being\n      // generated by `ngOptions`.\n      // This must be done in the postLink fn to prevent $render to be called before\n      // all nodes have been linked correctly.\n      ngModelCtrl.$render = function() {\n        selectCtrl.writeValue(ngModelCtrl.$viewValue);\n      };\n    }\n};\n\n\n// The option directive is purely designed to communicate the existence (or lack of)\n// of dynamically created (and destroyed) option elements to their containing select\n// directive via its controller.\nvar optionDirective = ['$interpolate', function($interpolate) {\n  return {\n    restrict: 'E',\n    priority: 100,\n    compile: function(element, attr) {\n      if (isDefined(attr.value)) {\n        // If the value attribute is defined, check if it contains an interpolation\n        var interpolateValueFn = $interpolate(attr.value, true);\n      } else {\n        // If the value attribute is not defined then we fall back to the\n        // text content of the option element, which may be interpolated\n        var interpolateTextFn = $interpolate(element.text(), true);\n        if (!interpolateTextFn) {\n          attr.$set('value', element.text());\n        }\n      }\n\n      return function(scope, element, attr) {\n        // This is an optimization over using ^^ since we don't want to have to search\n        // all the way to the root of the DOM for every single option element\n        var selectCtrlName = '$selectController',\n            parent = element.parent(),\n            selectCtrl = parent.data(selectCtrlName) ||\n              parent.parent().data(selectCtrlName); // in case we are in optgroup\n\n        if (selectCtrl) {\n          selectCtrl.registerOption(scope, element, attr, interpolateValueFn, interpolateTextFn);\n        }\n      };\n    }\n  };\n}];\n\nvar styleDirective = valueFn({\n  restrict: 'E',\n  terminal: false\n});\n\n/**\n * @ngdoc directive\n * @name ngRequired\n *\n * @description\n *\n * ngRequired adds the required {@link ngModel.NgModelController#$validators `validator`} to {@link ngModel `ngModel`}.\n * It is most often used for {@link input `input`} and {@link select `select`} controls, but can also be\n * applied to custom controls.\n *\n * The directive sets the `required` attribute on the element if the Angular expression inside\n * `ngRequired` evaluates to true. A special directive for setting `required` is necessary because we\n * cannot use interpolation inside `required`. See the {@link guide/interpolation interpolation guide}\n * for more info.\n *\n * The validator will set the `required` error key to true if the `required` attribute is set and\n * calling {@link ngModel.NgModelController#$isEmpty `NgModelController.$isEmpty`} with the\n * {@link ngModel.NgModelController#$viewValue `ngModel.$viewValue`} returns `true`. For example, the\n * `$isEmpty()` implementation for `input[text]` checks the length of the `$viewValue`. When developing\n * custom controls, `$isEmpty()` can be overwritten to account for a $viewValue that is not string-based.\n *\n * @example\n * <example name=\"ngRequiredDirective\" module=\"ngRequiredExample\">\n *   <file name=\"index.html\">\n *     <script>\n *       angular.module('ngRequiredExample', [])\n *         .controller('ExampleController', ['$scope', function($scope) {\n *           $scope.required = true;\n *         }]);\n *     </script>\n *     <div ng-controller=\"ExampleController\">\n *       <form name=\"form\">\n *         <label for=\"required\">Toggle required: </label>\n *         <input type=\"checkbox\" ng-model=\"required\" id=\"required\" />\n *         <br>\n *         <label for=\"input\">This input must be filled if `required` is true: </label>\n *         <input type=\"text\" ng-model=\"model\" id=\"input\" name=\"input\" ng-required=\"required\" /><br>\n *         <hr>\n *         required error set? = <code>{{form.input.$error.required}}</code><br>\n *         model = <code>{{model}}</code>\n *       </form>\n *     </div>\n *   </file>\n *   <file name=\"protractor.js\" type=\"protractor\">\n       var required = element(by.binding('form.input.$error.required'));\n       var model = element(by.binding('model'));\n       var input = element(by.id('input'));\n\n       it('should set the required error', function() {\n         expect(required.getText()).toContain('true');\n\n         input.sendKeys('123');\n         expect(required.getText()).not.toContain('true');\n         expect(model.getText()).toContain('123');\n       });\n *   </file>\n * </example>\n */\nvar requiredDirective = function() {\n  return {\n    restrict: 'A',\n    require: '?ngModel',\n    link: function(scope, elm, attr, ctrl) {\n      if (!ctrl) return;\n      attr.required = true; // force truthy in case we are on non input element\n\n      ctrl.$validators.required = function(modelValue, viewValue) {\n        return !attr.required || !ctrl.$isEmpty(viewValue);\n      };\n\n      attr.$observe('required', function() {\n        ctrl.$validate();\n      });\n    }\n  };\n};\n\n/**\n * @ngdoc directive\n * @name ngPattern\n *\n * @description\n *\n * ngPattern adds the pattern {@link ngModel.NgModelController#$validators `validator`} to {@link ngModel `ngModel`}.\n * It is most often used for text-based {@link input `input`} controls, but can also be applied to custom text-based controls.\n *\n * The validator sets the `pattern` error key if the {@link ngModel.NgModelController#$viewValue `ngModel.$viewValue`}\n * does not match a RegExp which is obtained by evaluating the Angular expression given in the\n * `ngPattern` attribute value:\n * * If the expression evaluates to a RegExp object, then this is used directly.\n * * If the expression evaluates to a string, then it will be converted to a RegExp after wrapping it\n * in `^` and `$` characters. For instance, `\"abc\"` will be converted to `new RegExp('^abc$')`.\n *\n * <div class=\"alert alert-info\">\n * **Note:** Avoid using the `g` flag on the RegExp, as it will cause each successive search to\n * start at the index of the last search's match, thus not taking the whole input value into\n * account.\n * </div>\n *\n * <div class=\"alert alert-info\">\n * **Note:** This directive is also added when the plain `pattern` attribute is used, with two\n * differences:\n * <ol>\n *   <li>\n *     `ngPattern` does not set the `pattern` attribute and therefore HTML5 constraint validation is\n *     not available.\n *   </li>\n *   <li>\n *     The `ngPattern` attribute must be an expression, while the `pattern` value must be\n *     interpolated.\n *   </li>\n * </ol>\n * </div>\n *\n * @example\n * <example name=\"ngPatternDirective\" module=\"ngPatternExample\">\n *   <file name=\"index.html\">\n *     <script>\n *       angular.module('ngPatternExample', [])\n *         .controller('ExampleController', ['$scope', function($scope) {\n *           $scope.regex = '\\\\d+';\n *         }]);\n *     </script>\n *     <div ng-controller=\"ExampleController\">\n *       <form name=\"form\">\n *         <label for=\"regex\">Set a pattern (regex string): </label>\n *         <input type=\"text\" ng-model=\"regex\" id=\"regex\" />\n *         <br>\n *         <label for=\"input\">This input is restricted by the current pattern: </label>\n *         <input type=\"text\" ng-model=\"model\" id=\"input\" name=\"input\" ng-pattern=\"regex\" /><br>\n *         <hr>\n *         input valid? = <code>{{form.input.$valid}}</code><br>\n *         model = <code>{{model}}</code>\n *       </form>\n *     </div>\n *   </file>\n *   <file name=\"protractor.js\" type=\"protractor\">\n       var model = element(by.binding('model'));\n       var input = element(by.id('input'));\n\n       it('should validate the input with the default pattern', function() {\n         input.sendKeys('aaa');\n         expect(model.getText()).not.toContain('aaa');\n\n         input.clear().then(function() {\n           input.sendKeys('123');\n           expect(model.getText()).toContain('123');\n         });\n       });\n *   </file>\n * </example>\n */\nvar patternDirective = function() {\n  return {\n    restrict: 'A',\n    require: '?ngModel',\n    link: function(scope, elm, attr, ctrl) {\n      if (!ctrl) return;\n\n      var regexp, patternExp = attr.ngPattern || attr.pattern;\n      attr.$observe('pattern', function(regex) {\n        if (isString(regex) && regex.length > 0) {\n          regex = new RegExp('^' + regex + '$');\n        }\n\n        if (regex && !regex.test) {\n          throw minErr('ngPattern')('noregexp',\n            'Expected {0} to be a RegExp but was {1}. Element: {2}', patternExp,\n            regex, startingTag(elm));\n        }\n\n        regexp = regex || undefined;\n        ctrl.$validate();\n      });\n\n      ctrl.$validators.pattern = function(modelValue, viewValue) {\n        // HTML5 pattern constraint validates the input value, so we validate the viewValue\n        return ctrl.$isEmpty(viewValue) || isUndefined(regexp) || regexp.test(viewValue);\n      };\n    }\n  };\n};\n\n/**\n * @ngdoc directive\n * @name ngMaxlength\n *\n * @description\n *\n * ngMaxlength adds the maxlength {@link ngModel.NgModelController#$validators `validator`} to {@link ngModel `ngModel`}.\n * It is most often used for text-based {@link input `input`} controls, but can also be applied to custom text-based controls.\n *\n * The validator sets the `maxlength` error key if the {@link ngModel.NgModelController#$viewValue `ngModel.$viewValue`}\n * is longer than the integer obtained by evaluating the Angular expression given in the\n * `ngMaxlength` attribute value.\n *\n * <div class=\"alert alert-info\">\n * **Note:** This directive is also added when the plain `maxlength` attribute is used, with two\n * differences:\n * <ol>\n *   <li>\n *     `ngMaxlength` does not set the `maxlength` attribute and therefore HTML5 constraint\n *     validation is not available.\n *   </li>\n *   <li>\n *     The `ngMaxlength` attribute must be an expression, while the `maxlength` value must be\n *     interpolated.\n *   </li>\n * </ol>\n * </div>\n *\n * @example\n * <example name=\"ngMaxlengthDirective\" module=\"ngMaxlengthExample\">\n *   <file name=\"index.html\">\n *     <script>\n *       angular.module('ngMaxlengthExample', [])\n *         .controller('ExampleController', ['$scope', function($scope) {\n *           $scope.maxlength = 5;\n *         }]);\n *     </script>\n *     <div ng-controller=\"ExampleController\">\n *       <form name=\"form\">\n *         <label for=\"maxlength\">Set a maxlength: </label>\n *         <input type=\"number\" ng-model=\"maxlength\" id=\"maxlength\" />\n *         <br>\n *         <label for=\"input\">This input is restricted by the current maxlength: </label>\n *         <input type=\"text\" ng-model=\"model\" id=\"input\" name=\"input\" ng-maxlength=\"maxlength\" /><br>\n *         <hr>\n *         input valid? = <code>{{form.input.$valid}}</code><br>\n *         model = <code>{{model}}</code>\n *       </form>\n *     </div>\n *   </file>\n *   <file name=\"protractor.js\" type=\"protractor\">\n       var model = element(by.binding('model'));\n       var input = element(by.id('input'));\n\n       it('should validate the input with the default maxlength', function() {\n         input.sendKeys('abcdef');\n         expect(model.getText()).not.toContain('abcdef');\n\n         input.clear().then(function() {\n           input.sendKeys('abcde');\n           expect(model.getText()).toContain('abcde');\n         });\n       });\n *   </file>\n * </example>\n */\nvar maxlengthDirective = function() {\n  return {\n    restrict: 'A',\n    require: '?ngModel',\n    link: function(scope, elm, attr, ctrl) {\n      if (!ctrl) return;\n\n      var maxlength = -1;\n      attr.$observe('maxlength', function(value) {\n        var intVal = toInt(value);\n        maxlength = isNaN(intVal) ? -1 : intVal;\n        ctrl.$validate();\n      });\n      ctrl.$validators.maxlength = function(modelValue, viewValue) {\n        return (maxlength < 0) || ctrl.$isEmpty(viewValue) || (viewValue.length <= maxlength);\n      };\n    }\n  };\n};\n\n/**\n * @ngdoc directive\n * @name ngMinlength\n *\n * @description\n *\n * ngMinlength adds the minlength {@link ngModel.NgModelController#$validators `validator`} to {@link ngModel `ngModel`}.\n * It is most often used for text-based {@link input `input`} controls, but can also be applied to custom text-based controls.\n *\n * The validator sets the `minlength` error key if the {@link ngModel.NgModelController#$viewValue `ngModel.$viewValue`}\n * is shorter than the integer obtained by evaluating the Angular expression given in the\n * `ngMinlength` attribute value.\n *\n * <div class=\"alert alert-info\">\n * **Note:** This directive is also added when the plain `minlength` attribute is used, with two\n * differences:\n * <ol>\n *   <li>\n *     `ngMinlength` does not set the `minlength` attribute and therefore HTML5 constraint\n *     validation is not available.\n *   </li>\n *   <li>\n *     The `ngMinlength` value must be an expression, while the `minlength` value must be\n *     interpolated.\n *   </li>\n * </ol>\n * </div>\n *\n * @example\n * <example name=\"ngMinlengthDirective\" module=\"ngMinlengthExample\">\n *   <file name=\"index.html\">\n *     <script>\n *       angular.module('ngMinlengthExample', [])\n *         .controller('ExampleController', ['$scope', function($scope) {\n *           $scope.minlength = 3;\n *         }]);\n *     </script>\n *     <div ng-controller=\"ExampleController\">\n *       <form name=\"form\">\n *         <label for=\"minlength\">Set a minlength: </label>\n *         <input type=\"number\" ng-model=\"minlength\" id=\"minlength\" />\n *         <br>\n *         <label for=\"input\">This input is restricted by the current minlength: </label>\n *         <input type=\"text\" ng-model=\"model\" id=\"input\" name=\"input\" ng-minlength=\"minlength\" /><br>\n *         <hr>\n *         input valid? = <code>{{form.input.$valid}}</code><br>\n *         model = <code>{{model}}</code>\n *       </form>\n *     </div>\n *   </file>\n *   <file name=\"protractor.js\" type=\"protractor\">\n       var model = element(by.binding('model'));\n       var input = element(by.id('input'));\n\n       it('should validate the input with the default minlength', function() {\n         input.sendKeys('ab');\n         expect(model.getText()).not.toContain('ab');\n\n         input.sendKeys('abc');\n         expect(model.getText()).toContain('abc');\n       });\n *   </file>\n * </example>\n */\nvar minlengthDirective = function() {\n  return {\n    restrict: 'A',\n    require: '?ngModel',\n    link: function(scope, elm, attr, ctrl) {\n      if (!ctrl) return;\n\n      var minlength = 0;\n      attr.$observe('minlength', function(value) {\n        minlength = toInt(value) || 0;\n        ctrl.$validate();\n      });\n      ctrl.$validators.minlength = function(modelValue, viewValue) {\n        return ctrl.$isEmpty(viewValue) || viewValue.length >= minlength;\n      };\n    }\n  };\n};\n\nif (window.angular.bootstrap) {\n  //AngularJS is already loaded, so we can return here...\n  if (window.console) {\n    console.log('WARNING: Tried to load angular more than once.');\n  }\n  return;\n}\n\n//try to bind to jquery now so that one can write jqLite(document).ready()\n//but we will rebind on bootstrap again.\nbindJQuery();\n\npublishExternalAPI(angular);\n\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\nfunction getDecimals(n) {\n  n = n + '';\n  var i = n.indexOf('.');\n  return (i == -1) ? 0 : n.length - i - 1;\n}\n\nfunction getVF(n, opt_precision) {\n  var v = opt_precision;\n\n  if (undefined === v) {\n    v = Math.min(getDecimals(n), 3);\n  }\n\n  var base = Math.pow(10, v);\n  var f = ((n * base) | 0) % base;\n  return {v: v, f: f};\n}\n\n$provide.value(\"$locale\", {\n  \"DATETIME_FORMATS\": {\n    \"AMPMS\": [\n      \"AM\",\n      \"PM\"\n    ],\n    \"DAY\": [\n      \"Sunday\",\n      \"Monday\",\n      \"Tuesday\",\n      \"Wednesday\",\n      \"Thursday\",\n      \"Friday\",\n      \"Saturday\"\n    ],\n    \"ERANAMES\": [\n      \"Before Christ\",\n      \"Anno Domini\"\n    ],\n    \"ERAS\": [\n      \"BC\",\n      \"AD\"\n    ],\n    \"FIRSTDAYOFWEEK\": 6,\n    \"MONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"SHORTDAY\": [\n      \"Sun\",\n      \"Mon\",\n      \"Tue\",\n      \"Wed\",\n      \"Thu\",\n      \"Fri\",\n      \"Sat\"\n    ],\n    \"SHORTMONTH\": [\n      \"Jan\",\n      \"Feb\",\n      \"Mar\",\n      \"Apr\",\n      \"May\",\n      \"Jun\",\n      \"Jul\",\n      \"Aug\",\n      \"Sep\",\n      \"Oct\",\n      \"Nov\",\n      \"Dec\"\n    ],\n    \"STANDALONEMONTH\": [\n      \"January\",\n      \"February\",\n      \"March\",\n      \"April\",\n      \"May\",\n      \"June\",\n      \"July\",\n      \"August\",\n      \"September\",\n      \"October\",\n      \"November\",\n      \"December\"\n    ],\n    \"WEEKENDRANGE\": [\n      5,\n      6\n    ],\n    \"fullDate\": \"EEEE, MMMM d, y\",\n    \"longDate\": \"MMMM d, y\",\n    \"medium\": \"MMM d, y h:mm:ss a\",\n    \"mediumDate\": \"MMM d, y\",\n    \"mediumTime\": \"h:mm:ss a\",\n    \"short\": \"M/d/yy h:mm a\",\n    \"shortDate\": \"M/d/yy\",\n    \"shortTime\": \"h:mm a\"\n  },\n  \"NUMBER_FORMATS\": {\n    \"CURRENCY_SYM\": \"$\",\n    \"DECIMAL_SEP\": \".\",\n    \"GROUP_SEP\": \",\",\n    \"PATTERNS\": [\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 3,\n        \"minFrac\": 0,\n        \"minInt\": 1,\n        \"negPre\": \"-\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\",\n        \"posSuf\": \"\"\n      },\n      {\n        \"gSize\": 3,\n        \"lgSize\": 3,\n        \"maxFrac\": 2,\n        \"minFrac\": 2,\n        \"minInt\": 1,\n        \"negPre\": \"-\\u00a4\",\n        \"negSuf\": \"\",\n        \"posPre\": \"\\u00a4\",\n        \"posSuf\": \"\"\n      }\n    ]\n  },\n  \"id\": \"en-us\",\n  \"localeID\": \"en_US\",\n  \"pluralCat\": function(n, opt_precision) {  var i = n | 0;  var vf = getVF(n, opt_precision);  if (i == 1 && vf.v == 0) {    return PLURAL_CATEGORY.ONE;  }  return PLURAL_CATEGORY.OTHER;}\n});\n}]);\n\n  jqLite(window.document).ready(function() {\n    angularInit(window.document, bootstrap);\n  });\n\n})(window);\n\n!window.angular.$$csp().noInlineStyle && window.angular.element(document.head).prepend('<style type=\"text/css\">@charset \"UTF-8\";[ng\\\\:cloak],[ng-cloak],[data-ng-cloak],[x-ng-cloak],.ng-cloak,.x-ng-cloak,.ng-hide:not(.ng-hide-animate){display:none !important;}ng\\\\:form{display:block;}.ng-animate-shim{visibility:hidden;}.ng-anchor{position:absolute;}</style>');"
  },
  {
    "path": "public/js/calculator.js",
    "content": "$(document).ready(function () {\n  var bootcamps = ''\n  $.getJSON('/json/bootcamps.json', function(data) {\n    bootcamps = data;\n  });\n  var city = \"\";\n  $(\"body\").data(\"state\", \"stacked\");\n  $('#city-buttons').on(\"click\", \"button\", function () {\n    $(this).addClass('animated pulse');\n    city = $(this).attr(\"id\");\n    $('#chosen').text('Coming from ' + city.replace(/-/g, ' ').replace(/\\w\\S*/g, function (txt) {\n        return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase();\n      }) + ', and making $_______, your true costs will be:');\n    setTimeout(function () {\n      $('#city-buttons').hide();\n      $('#income').addClass('animated fadeIn').show();\n    }, 1000);\n  });\n  $('#income').on(\"click\", \"button\", function () {\n    $(this).addClass('animated pulse');\n    setTimeout(function () {\n      $('#income').hide();\n      $('#chart').addClass('animated fadeIn').show();\n      $('#chart-controls').addClass('animated fadeIn').show();\n      $('#explanation').addClass('animated fadeIn').show();\n    }, 1000);\n    var lastYearsIncome = parseInt($(this).attr(\"id\"));\n    $('#chosen').text('Coming from ' + city.replace(/-/g, ' ').replace(/\\w\\S*/g, function (txt) {\n        return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase();\n      }) + ', and making $' + lastYearsIncome.toString().replace(/0000$/, '0,000') + ', your true costs will be:');\n    var categoryNames = ['Lost Wages', 'Financing Cost', 'Housing Cost', 'Tuition / Est. Wage Garnishing'];\n    bootcamps.forEach(function (camp) {\n      var x0 = 0;\n      if (camp.cities.indexOf(city) > -1) {\n        weeklyHousing = 0;\n      } else {\n        weeklyHousing = +camp.housing;\n      }\n      camp.mapping = [{\n        name: camp.name,\n        label: 'Tuition / Est. Wage Garnishing',\n        value: +camp.cost,\n        x0: x0,\n        x1: x0 += +camp.cost\n      }, {\n        name: camp.name,\n        label: 'Financing Cost',\n        value: +Math.floor(camp.cost * .09519),\n        x0: +camp.cost,\n        x1: camp.finance ? x0 += +Math.floor(camp.cost * .09519) : 0\n      }, {\n        name: camp.name,\n        label: 'Housing Cost',\n        value: +weeklyHousing * camp.weeks,\n        x0: camp.finance ? +Math.floor(camp.cost * 1.09519) : camp.cost,\n        x1: x0 += weeklyHousing * camp.weeks\n      }, {\n        name: camp.name,\n        label: 'Lost Wages',\n        value: +(Math.floor(camp.weeks * lastYearsIncome / 50)),\n        x0: camp.finance ? +(Math.floor(camp.cost * 1.09519) + weeklyHousing * camp.weeks) : +camp.cost + weeklyHousing * camp.weeks,\n        x1: x0 += +(Math.floor(camp.weeks * lastYearsIncome / 50))\n      }];\n      camp.total = camp.mapping[camp.mapping.length - 1].x1;\n    });\n    bootcamps.sort(function (a, b) {\n      return a.total - b.total;\n    });\n    maxValue = 0;\n    bootcamps.forEach(function (camp) {\n      camp.mapping.forEach(function (elem) {\n        if (elem.value > maxValue) {\n          maxValue = elem.value;\n        }\n      });\n    });\n    var xStackMax = d3.max(bootcamps, function (d) {\n        return d.total;\n      }), //Scale for Stacked\n      xGroupMax = bootcamps.map(function (camp) {\n        return camp.mapping.reduce(function (a, b) {\n          return a.value > b.value ? a.value : b.value;\n        });\n      }).reduce(function (a, b) {\n        return a > b ? a : b;\n      });\n    var margin = {\n        top: 30,\n        right: 60,\n        bottom: 50,\n        left: 140\n      },\n      width = 800 - margin.left - margin.right,\n      height = 1200 - margin.top - margin.bottom;\n    var barHeight = 20;\n    var xScale = d3.scale.linear()\n      .domain([0, xStackMax])\n      .rangeRound([0, width]);\n    var y0Scale = d3.scale.ordinal()\n      .domain(bootcamps.map(function (d) {\n        return d.name;\n      }))\n      .rangeRoundBands([0, height], .1);\n    var y1Scale = d3.scale.ordinal()\n      .domain(categoryNames).rangeRoundBands([0, y0Scale.rangeBand()]);\n    var color = d3.scale.ordinal()\n      .range([\"#215f1e\", \"#5f5c1e\", \"#1e215f\", \"#5c1e5f\"])\n      .domain(categoryNames);\n    var svg = d3.select(\"svg\")\n      .attr(\"width\", width + margin.left + margin.right)\n      .attr(\"height\", height + margin.top + margin.bottom)\n      .append(\"g\")\n      .attr(\"transform\", \"translate(\" + margin.left + \",\" + margin.top + \")\");\n    var selection = svg.selectAll(\".series\")\n      .data(bootcamps)\n      .enter().append(\"g\")\n      .attr(\"class\", \"series\")\n      .attr(\"transform\", function (d) {\n        return \"translate(0,\" + y0Scale(d.name) + \")\";\n      });\n    var rect = selection.selectAll(\"rect\")\n      .data(function (d) {\n        return d.mapping;\n      })\n      .enter().append(\"rect\")\n      .attr(\"x\", 0)\n      .attr(\"width\", 0)\n      .attr(\"height\", y0Scale.rangeBand())\n      .style(\"fill\", function (d) {\n        return color(d.label);\n      })\n      .style(\"stroke\", \"white\")\n      .on(\"mouseover\", function (d) {\n        showPopover.call(this, d);\n      })\n      .on(\"mouseout\", function (d) {\n        removePopovers();\n      });\n    rect.transition()\n      .delay(function (d, i) {\n        return i * 10;\n      })\n      .attr(\"x\", function (d) {\n        return xScale(d.x0);\n      })\n      .attr(\"width\", function (d) {\n        return xScale((d.x1) - (d.x0));\n      });\n    d3.selectAll(\"#transform\").on(\"click\", function () {\n      $('#transform').addClass('animated pulse');\n      change();\n      setTimeout(function () {\n        $('#transform').removeClass('animated pulse');\n      }, 1000);\n    });\n\n    d3.selectAll(\"#chart\").on(\"click\", function () {\n      change();\n    });\n\n    function change() {\n      if ($(\"body\").data(\"state\") === \"stacked\") {\n        transitionGrouped();\n        $(\"body\").data(\"state\", \"grouped\");\n      } else {\n        transitionStacked();\n        $(\"body\").data(\"state\", \"stacked\");\n      }\n    }\n\n    function transitionGrouped() {\n      xScale.domain = ([0, xGroupMax]);\n      rect.transition()\n        .duration(500)\n        .delay(function (d, i) {\n          return i * 10;\n        })\n        .attr(\"width\", function (d) {\n          return xScale((d.x1) - (d.x0));\n        })\n        .transition()\n        .attr(\"y\", function (d) {\n          return y1Scale(d.label);\n        })\n        .attr(\"x\", 0)\n        .attr(\"height\", y1Scale.rangeBand())\n    }\n\n    function transitionStacked() {\n      xScale.domain = ([0, xStackMax]);\n      rect.transition()\n        .duration(500)\n        .delay(function (d, i) {\n          return i * 10;\n        })\n        .attr(\"x\", function (d) {\n          return xScale(d.x0);\n        })\n        .transition()\n        .attr(\"y\", function (d) {\n          return y0Scale(d.label);\n        })\n        .attr(\"height\", y0Scale.rangeBand())\n    }\n\n    //axes\n    var xAxis = d3.svg.axis()\n      .scale(xScale)\n      .orient(\"bottom\");\n    var yAxis = d3.svg.axis()\n      .scale(y0Scale)\n      .orient(\"left\");\n    svg.append(\"g\")\n      .attr(\"class\", \"y axis\")\n      .call(yAxis);\n    svg.append(\"g\")\n      .attr(\"class\", \"x axis\")\n      .attr(\"transform\", \"translate(0,\" + height + \")\")\n      .call(xAxis)\n      .append(\"text\")\n      .attr(\"x\", 300)\n      .attr(\"y\", 35)\n      .attr(\"dy\", \".35em\")\n      .style(\"text-anchor\", \"middle\")\n      .text(\"Cost in $USD\");\n    //tooltips\n    function removePopovers() {\n      $('.popover').each(function () {\n        $(this).remove();\n      });\n    }\n\n    function showPopover(d) {\n      $(this).popover({\n        title: d.name,\n        placement: 'auto top',\n        container: 'body',\n        trigger: 'manual',\n        html: true,\n        content: function () {\n          return d.label +\n            \"<br/>$\" +\n            d3.format(\",\")(d.value ? d.value : d.x1 - d.x0);\n        }\n      });\n      $(this).popover('show')\n    }\n\n    //legends\n    var legend = svg.selectAll(\".legend\")\n      .data(categoryNames.slice().reverse())\n      .enter().append(\"g\")\n      .attr(\"class\", \"legend\")\n      .attr(\"transform\", function (d, i) {\n        return \"translate(30,\" + i * y0Scale.rangeBand() * 1.1 + \")\";\n      });\n    legend.append(\"rect\")\n      .attr(\"x\", width - y0Scale.rangeBand())\n      .attr(\"width\", y0Scale.rangeBand())\n      .attr(\"height\", y0Scale.rangeBand())\n      .style(\"fill\", color)\n      .style(\"stroke\", \"white\");\n    legend.append(\"text\")\n      .attr(\"x\", width - y0Scale.rangeBand() * 1.2)\n      .attr(\"y\", 12)\n      .attr(\"dy\", \".35em\")\n      .style(\"text-anchor\", \"end\")\n      .text(function (d) {\n        return d;\n      });\n  });\n});\n"
  },
  {
    "path": "public/js/commonFramework-2c9795240d.js",
    "content": "\"use strict\";\nfunction _objectWithoutProperties(e, n) {\n    var t = {};\n    for (var o in e)\n        n.indexOf(o) >= 0 || Object.prototype.hasOwnProperty.call(e, o) && (t[o] = e[o]);\n    return t\n}\nfunction _objectWithoutProperties(e, n) {\n    var t = {};\n    for (var o in e)\n        n.indexOf(o) >= 0 || Object.prototype.hasOwnProperty.call(e, o) && (t[o] = e[o]);\n    return t\n}\nwindow.common = function(e) {\n    var n = e.Rx\n      , t = n.Disposable\n      , o = n.Observable\n      , r = n.config\n      , i = e.common\n      , a = void 0 === i ? {\n        init: []\n    } : i;\n    r.longStackSupport = !0,\n    a.head = a.head || [],\n    a.tail = a.tail || [],\n    a.salt = Math.random(),\n    a.challengeTypes = {\n        HTML: \"0\",\n        JS: \"1\",\n        VIDEO: \"2\",\n        ZIPLINE: \"3\",\n        BASEJUMP: \"4\",\n        BONFIRE: \"5\",\n        HIKES: \"6\",\n        STEP: \"7\"\n    },\n    a.arrayToNewLineString = function(e) {\n        return e = Array.isArray(e) ? e : [e],\n        e.reduce(function(e, n) {\n            return \"\" + e + n + \"\\n\"\n        }, \"\")\n    }\n    ,\n    a.seed = a.arrayToNewLineString(a.challengeSeed),\n    a.replaceScriptTags = function(e) {\n        return e.replace(/<script>/gi, \"fccss\").replace(/<\\/script>/gi, \"fcces\")\n    }\n    ,\n    a.replaceSafeTags = function(e) {\n        return e.replace(/fccss/gi, \"<script>\").replace(/fcces/gi, \"</script>\")\n    }\n    ,\n    a.replaceFormActionAttr = function(e) {\n        return e.replace(/<form[^>]*>/, function(e) {\n            return e.replace(/action(\\s*?)=/, \"fccfaa$1=\")\n        })\n    }\n    ,\n    a.replaceFccfaaAttr = function(e) {\n        return e.replace(/<form[^>]*>/, function(e) {\n            return e.replace(/fccfaa(\\s*?)=/, \"action$1=\")\n        })\n    }\n    ,\n    a.scopejQuery = function(e) {\n        return e.replace(/\\$/gi, \"j$\").replace(/document/gi, \"jdocument\").replace(/jQuery/gi, \"jjQuery\")\n    }\n    ,\n    a.unScopeJQuery = function(e) {\n        return e.replace(/j\\$/gi, \"$\").replace(/jdocument/gi, \"document\").replace(/jjQuery/gi, \"jQuery\")\n    }\n    ;\n    var l = /(\\/\\*[^(\\*\\/)]*\\*\\/)|([ \\n]\\/\\/[^\\n]*)/g;\n    a.removeComments = function(e) {\n        return e.replace(l, \"\")\n    }\n    ;\n    var c = /(console\\.[\\w]+\\s*\\(.*\\;)/g;\n    a.removeLogs = function(e) {\n        return e.replace(c, \"\")\n    }\n    ,\n    a.reassembleTest = function() {\n        var e = arguments.length <= 0 || void 0 === arguments[0] ? \"\" : arguments[0]\n          , n = arguments[1]\n          , t = n.line\n          , o = n.text\n          , r = new RegExp(\"//\" + t + a.salt);\n        return e.replace(r, o)\n    }\n    ,\n    a.getScriptContent$ = function(e) {\n        return o.create(function(n) {\n            var o = $.get(e, null , null , \"text\").success(function(e) {\n                n.onNext(e),\n                n.onCompleted()\n            }).fail(function(e) {\n                return n.onError(e)\n            }).always(function() {\n                return n.onCompleted()\n            });\n            return new t(function() {\n                o.abort()\n            }\n            )\n        })\n    }\n    ;\n    var s = /\\<\\s?script\\s?\\>/gi\n      , u = /\\<\\s?\\/\\s?script\\s?\\>/gi;\n    return a.hasJs = function(e) {\n        return !!a.getJsFromHtml(e)\n    }\n    ,\n    a.getJsFromHtml = function(e) {\n        return (e.split(s)[1] || \"\").split(u)[0] || \"\"\n    }\n    ,\n    a\n}(window),\nwindow.common = function(e) {\n    var n = e.$\n      , t = e.Rx.Observable\n      , o = e.common\n      , r = void 0 === o ? {\n        init: []\n    } : o;\n    return r.ctrlEnterClickHandler = function i(e) {\n        13 === e.keyCode && (e.metaKey || e.ctrlKey) && (n(\"#complete-courseware-dialog\").off(\"keydown\", i),\n        n(\"#submit-challenge\").length > 0 ? n(\"#submit-challenge\").click() : window.location = \"/challenges/next-challenge?id=\" + r.challengeId)\n    }\n    ,\n    r.init.push(function(e) {\n        var n = e(\".innerMarginFix\");\n        n.css(\"min-height\", n.height()),\n        r.submitBtn$ = t.fromEvent(e(\"#submitButton\"), \"click\"),\n        r.resetBtn$ = t.fromEvent(e(\"#reset-button\"), \"click\"),\n        e(\"#complete-courseware-dialog\").on(\"shown.bs.modal\", function() {\n            e(\"#complete-courseware-dialog\").keydown(r.ctrlEnterClickHandler)\n        }),\n        e(\"#complete-courseware-dialog\").on(\"hidden.bs.modal\", function() {\n            e(\"#complete-courseware-dialog\").off(\"keydown\", r.ctrlEnterClickHandler)\n        }),\n        e(\".challenge-list-checkbox\").on(\"change\", function() {\n            var n = e(this).parent().parent().attr(\"id\");\n            e(this).is(\":checked\") && (e(this).parent().siblings().children().addClass(\"faded\"),\n            localStorage && localStorage[n] || (localStorage[n] = !0)),\n            e(this).is(\":checked\") || (e(this).parent().siblings().children().removeClass(\"faded\"),\n            localStorage[n] && localStorage.removeItem(n))\n        }),\n        e(\".checklist-element\").each(function() {\n            var n = e(this).attr(\"id\");\n            localStorage[n] && (e(this).children().children(\"li\").addClass(\"faded\"),\n            e(this).children().children(\"input\").trigger(\"click\"))\n        }),\n        e(\"#next-courseware-button\").on(\"click\", function() {\n            if (e(\"#next-courseware-button\").unbind(\"click\"),\n            e(\".signup-btn-nav\").length < 1) {\n                var n, t = e(\"#public-url\").val() || null , o = e(\"#github-url\").val() || null ;\n                switch (r.challengeType) {\n                case r.challengeTypes.VIDEO:\n                    n = {\n                        id: r.challengeId,\n                        name: r.challengeName,\n                        challengeType: +r.challengeType\n                    },\n                    e.ajax({\n                        url: \"/completed-challenge/\",\n                        type: \"POST\",\n                        data: JSON.stringify(n),\n                        contentType: \"application/json\",\n                        dataType: \"json\"\n                    }).success(function(e) {\n                        e && (window.location.href = \"/challenges/next-challenge?id=\" + r.challengeId)\n                    }).fail(function() {\n                        window.location.replace(window.location.href)\n                    });\n                    break;\n                case r.challengeTypes.BASEJUMP:\n                case r.challengeTypes.ZIPLINE:\n                    n = {\n                        id: r.challengeId,\n                        name: r.challengeName,\n                        challengeType: +r.challengeType,\n                        solution: t,\n                        githubLink: o\n                    },\n                    e.ajax({\n                        url: \"/completed-zipline-or-basejump/\",\n                        type: \"POST\",\n                        data: JSON.stringify(n),\n                        contentType: \"application/json\",\n                        dataType: \"json\"\n                    }).success(function() {\n                        window.location.href = \"/challenges/next-challenge?id=\" + r.challengeId\n                    }).fail(function() {\n                        window.location.replace(window.location.href)\n                    });\n                    break;\n                case r.challengeTypes.BONFIRE:\n                    window.location.href = \"/challenges/next-challenge?id=\" + r.challengeId;\n                    break;\n                default:\n                    console.log(\"Happy Coding!\")\n                }\n            }\n        }),\n        r.challengeName && window.ga(\"send\", \"event\", \"Challenge\", \"load\", r.gaName),\n        e(\"#complete-courseware-dialog\").on(\"hidden.bs.modal\", function() {\n            r.editor.focus && r.editor.focus()\n        }),\n        e(\"#trigger-issue-modal\").on(\"click\", function() {\n            e(\"#issue-modal\").modal(\"show\")\n        }),\n        e(\"#trigger-help-modal\").on(\"click\", function() {\n            e(\"#help-modal\").modal(\"show\")\n        }),\n        e(\"#trigger-reset-modal\").on(\"click\", function() {\n            e(\"#reset-modal\").modal(\"show\")\n        }),\n        e(\"#trigger-pair-modal\").on(\"click\", function() {\n            e(\"#pair-modal\").modal(\"show\")\n        }),\n        e(\"#completed-courseware\").on(\"click\", function() {\n            e(\"#complete-courseware-dialog\").modal(\"show\")\n        }),\n        e(\"#help-ive-found-a-bug-wiki-article\").on(\"click\", function() {\n            window.open(\"https://github.com/freecodecampchina/freecodecamp.cn/wiki/Help-I've-Found-a-Bug\", \"_blank\")\n        }),\n        e(\"#search-issue\").on(\"click\", function() {\n            var e = window.location.href.toString().split(\"?\")[0].replace(/(#*)$/, \"\");\n            window.open(\"https://github.com/freecodecampchina/freecodecamp.cn/issues?q=is:issue is:all \" + r.challengeName + \" OR \" + e.substr(e.lastIndexOf(\"challenges/\") + 11).replace(\"/\", \"\"), \"_blank\")\n        })\n    }),\n    r\n}(window),\nwindow.common = function(e) {\n    var n, t = e.localStorage, o = e.common, r = void 0 === o ? {\n        init: []\n    } : o, i = [\"Bonfire: \", \"Waypoint: \", \"Zipline: \", \"Basejump: \", \"Checkpoint: \"], a = {\n        getStoredValue: function(e) {\n            if (!t || \"function\" != typeof t.getItem || !e || \"string\" != typeof e)\n                return console.log(\"unable to read from storage\"),\n                \"\";\n            if (t.getItem(e + \"Val\"))\n                return \"\" + t.getItem(e + \"Val\");\n            for (var o = 0; o <= i.length; o++)\n                if (n = t.getItem(i[o] + e + \"Val\"))\n                    return \"\" + n;\n            return null\n        },\n        isAlive: function(e) {\n            var n = this.getStoredValue(e);\n            return \"null\" !== n && \"undefined\" !== n && n && n.length > 0\n        },\n        updateStorage: function(e, n) {\n            return t && \"function\" == typeof t.setItem && e && \"string\" == typeof e ? (t.setItem(e + \"Val\", n),\n            n) : (console.log(\"unable to save to storage\"),\n            n)\n        }\n    };\n    return r.codeStorage = a,\n    r\n}(window, window.common),\nwindow.common = function(e) {\n    function n(e) {\n        return s(d(e))\n    }\n    function t(e) {\n        return u(p(e))\n    }\n    var o = e.encodeURIComponent\n      , r = e.decodeURIComponent\n      , i = e.location\n      , a = e.history\n      , l = e.common\n      , c = void 0 === l ? {\n        init: []\n    } : l\n      , s = c.replaceScriptTags\n      , u = c.replaceSafeTags\n      , d = c.replaceFormActionAttr\n      , p = c.replaceFccfaaAttr\n      , h = /^(\\?|#\\?)/\n      , f = {\n        encode: function(e) {\n            return o(e)\n        },\n        decode: function(e) {\n            try {\n                return r(e)\n            } catch (n) {\n                return null\n            }\n        },\n        isInQuery: function(e) {\n            var n = f.decode(e);\n            return n && \"function\" == typeof n.split ? n.replace(h, \"\").split(\"&\").reduce(function(e, n) {\n                var t = n.split(\"=\")[0];\n                return \"solution\" === t ? !0 : e\n            }, !1) : !1\n        },\n        isAlive: function() {\n            return f.enabled && f.isInQuery(i.search) || f.isInQuery(i.hash)\n        },\n        getKeyInQuery: function(e) {\n            var n = arguments.length <= 1 || void 0 === arguments[1] ? \"\" : arguments[1];\n            return e.split(\"&\").reduce(function(e, t) {\n                var o = t.split(\"=\")[0]\n                  , r = t.split(\"=\").slice(1).join(\"=\");\n                return o === n ? r : e\n            }, null )\n        },\n        getSolutionFromQuery: function() {\n            var e = arguments.length <= 0 || void 0 === arguments[0] ? \"\" : arguments[0];\n            return t(f.decode(f.getKeyInQuery(e, \"solution\")))\n        },\n        parse: function() {\n            if (!f.enabled)\n                return null ;\n            var e;\n            return i.search && f.isInQuery(i.search) ? (e = i.search.replace(/^\\?/, \"\"),\n            a && \"function\" == typeof a.replaceState && (a.replaceState(a.state, null , i.href.split(\"?\")[0]),\n            i.hash = \"#?\" + n(e))) : e = i.hash.replace(/^\\#\\?/, \"\"),\n            e ? this.getSolutionFromQuery(e) : null\n        },\n        querify: function(e) {\n            if (!f.enabled)\n                return null ;\n            if (a && \"function\" == typeof a.replaceState) {\n                var t = i.href.split(\"?\")[0].replace(/(#*)$/, \"\");\n                a.replaceState(a.state, null , t + \"#?\" + (f.shouldRun() ? \"\" : \"run=disabled&\") + \"solution=\" + f.encode(n(e)))\n            } else\n                i.hash = \"?solution=\" + f.encode(n(e));\n            return e\n        },\n        enabled: !0,\n        shouldRun: function() {\n            return !this.getKeyInQuery((i.search || i.hash).replace(h, \"\"), \"run\")\n        }\n    };\n    return c.init.push(function() {\n        f.parse()\n    }),\n    c.codeUri = f,\n    c.shouldRun = function() {\n        return f.shouldRun()\n    }\n    ,\n    c\n}(window),\nwindow.common = function(e) {\n    var n = e.loopProtect\n      , t = e.common\n      , o = void 0 === t ? {\n        init: []\n    } : t;\n    return n.hit = function(e) {\n        var n = \"Error: Exiting potential infinite loop at line \" + e + \". To disable loop protection, write: \\n\\\\/\\\\/ noprotect\\nas the firstline. Beware that if you do have an infinite loop in your codethis will crash your browser.\";\n        console.error(n)\n    }\n    ,\n    o.addLoopProtect = function() {\n        var e = arguments.length <= 0 || void 0 === arguments[0] ? \"\" : arguments[0];\n        return n(e)\n    }\n    ,\n    o\n}(window),\nwindow.common = function(e) {\n    var n = e.common\n      , t = void 0 === n ? {\n        init: []\n    } : n\n      , o = e.document;\n    return t.getIframe = function() {\n        var e = arguments.length <= 0 || void 0 === arguments[0] ? \"preview\" : arguments[0]\n          , n = o.getElementById(e);\n        return n || (n = o.createElement(\"iframe\"),\n        n.id = e,\n        n.setAttribute(\"style\", \"display: none\"),\n        o.body.appendChild(n)),\n        n.contentDocument || n.contentWindow.document\n    }\n    ,\n    t\n}(window),\nwindow.common = function(e) {\n    var n = e.Rx\n      , t = n.BehaviorSubject\n      , o = n.Observable\n      , r = e.common\n      , i = void 0 === r ? {\n        init: []\n    } : r\n      , a = \"\\n<script>\\n  window.loopProtect = parent.loopProtect;\\n  window.__err = null;\\n  window.loopProtect.hit = function(line) {\\n    window.__err = new Error(\\n      'Potential infinite loop at line ' +\\n      line +\\n      '. To disable loop protection, write:' +\\n      ' \\\\n\\\\/\\\\/ noprotect\\\\nas the first' +\\n      ' line. Beware that if you do have an infinite loop in your code' +\\n      ' this will crash your browser.'\\n    );\\n  };\\n</script>\\n<link\\n  rel='stylesheet'\\n  href='//cdn.bootcss.com/animate.css/3.2.0/animate.min.css'\\n  />\\n<link\\n  rel='stylesheet'\\n  href='//cdn.bootcss.com/bootstrap/3.3.1/css/bootstrap.min.css'\\n  />\\n\\n<link\\n  rel='stylesheet'\\n  href='//cdn.bootcss.com/font-awesome/4.2.0/css/font-awesome.min.css'\\n  />\\n<style>\\n  body { padding: 0px 3px 0px 3px; }\\n</style>\\n  \"\n      , l = \"\\n    <script>\\n      window.__err = new Error('code has been disabled');\\n    </script>\\n  \"\n      , c = i.getScriptContent$(\"/js/iFrameScripts-08bc15b460.js\").shareReplay()\n      , s = i.getScriptContent$(\"/bower_components/jquery/dist/jquery.js\").shareReplay();\n    return i.previewReady$ = new t(!1),\n    i.runPreviewTests$ = i.checkPreview$ = function() {\n        return o[\"throw\"](new Error(\"Preview not fully loaded\"))\n    }\n    ,\n    i.updatePreview$ = function() {\n        var e = arguments.length <= 0 || void 0 === arguments[0] ? \"\" : arguments[0]\n          , n = i.getIframe(\"preview\");\n        return o.combineLatest(c, s, function(e, n) {\n            return {\n                iframeScript: \"<script>\" + e + \"</script>\",\n                jQuery: \"<script>\" + n + \"</script>\"\n            }\n        }).first().flatMap(function(t) {\n            var o = t.iframeScript\n              , r = t.jQuery;\n            return i.previewReady$.onNext(!1),\n            n.open(),\n            n.write(a + r + (i.shouldRun() ? e : l) + \"<!-- -->\" + o),\n            n.close(),\n            i.previewReady$.filter(function(e) {\n                return e\n            }).first().delay(400)\n        }).map(function() {\n            return e\n        })\n    }\n    ,\n    i\n}(window),\nwindow.common = function(e) {\n    var n = e.Rx\n      , t = n.Subject\n      , o = n.Observable\n      , r = e.CodeMirror\n      , i = e.emmetCodeMirror\n      , a = e.common\n      , l = void 0 === a ? {\n        init: []\n    } : a\n      , c = l.challengeType\n      , s = void 0 === c ? \"0\" : c\n      , u = l.challengeTypes;\n    if (!r || s === u.BASEJUMP || s === u.ZIPLINE || s === u.VIDEO || s === u.STEP || s === u.HIKES)\n        return l.editor = {},\n        l;\n    var d = r.fromTextArea(document.getElementById(\"codeEditor\"), {\n        lint: !0,\n        lineNumbers: !0,\n        mode: \"javascript\",\n        theme: \"monokai\",\n        runnable: !0,\n        matchBrackets: !0,\n        autoCloseBrackets: !0,\n        scrollbarStyle: \"null\",\n        lineWrapping: !0,\n        gutters: [\"CodeMirror-lint-markers\"]\n    });\n    d.setSize(\"100%\", \"auto\"),\n    l.editorExecute$ = new t,\n    l.editorKeyUp$ = o.fromEventPattern(function(e) {\n        return d.on(\"keyup\", e)\n    }, function(e) {\n        return d.off(\"keyup\", e)\n    }),\n    d.setOption(\"extraKeys\", {\n        Tab: function(e) {\n            if (e.somethingSelected())\n                e.indentSelection(\"add\");\n            else {\n                var n = Array(e.getOption(\"indentUnit\") + 1).join(\" \");\n                e.replaceSelection(n)\n            }\n        },\n        \"Shift-Tab\": function(e) {\n            if (e.somethingSelected())\n                e.indentSelection(\"subtract\");\n            else {\n                var n = Array(e.getOption(\"indentUnit\") + 1).join(\" \");\n                e.replaceSelection(n)\n            }\n        },\n        \"Ctrl-Enter\": function() {\n            return l.editorExecute$.onNext(),\n            !1\n        },\n        \"Cmd-Enter\": function() {\n            return l.editorExecute$.onNext(),\n            !1\n        }\n    });\n    var p = d.getScrollInfo()\n      , h = d.charCoords({\n        line: d.getCursor().line + 1,\n        ch: 0\n    }, \"local\").top;\n    return p.top + p.clientHeight < h && d.scrollTo(null , h - p.clientHeight + 3),\n    i && i(d, {\n        \"Cmd-E\": \"emmet.expand_abbreviation\",\n        Tab: \"emmet.expand_abbreviation_with_tab\",\n        Enter: \"emmet.insert_formatted_line_break_only\"\n    }),\n    l.init.push(function() {\n        var e = void 0;\n        e = l.codeUri.isAlive() ? l.codeUri.parse() : l.codeStorage.isAlive(l.challengeName) ? l.codeStorage.getStoredValue(l.challengeName) : l.seed,\n        d.setValue(l.replaceSafeTags(e)),\n        d.refresh()\n    }),\n    l.editor = d,\n    l\n}(window),\nwindow.common = function(e) {\n    var n = e.Rx.Observable\n      , t = e.common\n      , o = void 0 === t ? {\n        init: []\n    } : t\n      , r = /function\\s*?\\(|function\\s+\\w+\\s*?\\(/gi\n      , i = /\\$\\s*?\\(\\s*?\\$\\s*?\\)/gi\n      , a = /if\\s\\(null\\)\\sconsole\\.log\\(1\\);/gi;\n    return o.detectUnsafeCode$ = function(e) {\n        var t = e.match(/\\/\\*/gi)\n          , o = e.match(/\\*\\//gi);\n        return t && (!o || t.length > o.length) ? n[\"throw\"](new Error(\"SyntaxError: Unfinished multi-line comment\")) : e.match(i) ? n[\"throw\"](new Error(\"Unsafe $($)\")) : e.match(/function/g) && !e.match(r) ? n[\"throw\"](new Error(\"SyntaxError: Unsafe or unfinished function declaration\")) : e.match(a) ? n[\"throw\"](new Error(\"Invalid if (null) console.log(1); detected\")) : n.just(e)\n    }\n    ,\n    o\n}(window),\nwindow.common = function(e) {\n    var n = e.$\n      , t = e.common\n      , o = void 0 === t ? {\n        init: []\n    } : t;\n    return o.displayTestResults = function() {\n        var e = arguments.length <= 0 || void 0 === arguments[0] ? [] : arguments[0];\n        return n(\"#testSuite\").children().remove(),\n        e.forEach(function(e) {\n            var t = e.err\n              , o = void 0 === t ? !1 : t\n              , r = e.text\n              , i = void 0 === r ? \"\" : r\n              , a = o ? '\"ion-close-circled big-error-icon\"' : '\"ion-checkmark-circled big-success-icon\"';\n            n(\"<div></div>\").html(\"\\n        <div class='row'>\\n          <div class='col-xs-2 text-center'>\\n            <i class=\" + a + \"></i>\\n          </div>\\n          <div class='col-xs-10 test-output'>\\n            \" + i.split(\"message: \").pop().replace(/\\'\\);/g, \"\") + \"\\n          </div>\\n          <div class='ten-pixel-break'/>\\n        </div>\\n      \").appendTo(n(\"#testSuite\"))\n        }),\n        e\n    }\n    ,\n    o\n}(window),\nwindow.common = function(e) {\n    var n = e.ga\n      , t = e.common\n      , o = void 0 === t ? {\n        init: []\n    } : t\n      , r = o.addLoopProtect\n      , i = o.getJsFromHtml\n      , a = o.detectUnsafeCode$\n      , l = o.updatePreview$\n      , c = o.challengeType\n      , s = o.challengeTypes;\n    return o.executeChallenge$ = function() {\n        var e = o.editor.getValue()\n          , t = e\n          , u = o.arrayToNewLineString(o.head)\n          , d = o.arrayToNewLineString(o.tail)\n          , p = u + e + d;\n        return n(\"send\", \"event\", \"Challenge\", \"ran-code\", o.gaName),\n        a(e).map(function() {\n            return c !== s.HTML ? \"<script>;\" + r(p) + \"/**/</script>\" : r(p)\n        }).flatMap(function(e) {\n            return l(e)\n        }).flatMap(function(e) {\n            var n = void 0;\n            return c === s.HTML && o.hasJs(e) ? n = o.getJsOutput(i(e)) : c !== s.HTML && (n = o.getJsOutput(r(p))),\n            o.runPreviewTests$({\n                tests: o.tests.slice(),\n                originalCode: t,\n                output: n\n            })\n        })\n    }\n    ,\n    o\n}(window),\nwindow.common = function(e) {\n    var n = e.CodeMirror\n      , t = e.document\n      , o = e.common\n      , r = void 0 === o ? {\n        init: []\n    } : o\n      , i = r.challengeTypes\n      , a = r.challengeType\n      , l = void 0 === a ? \"0\" : a;\n    if (!n || l !== i.JS && l !== i.BONFIRE)\n        return r.updateOutputDisplay = function() {}\n        ,\n        r.appendToOutputDisplay = function() {}\n        ,\n        r;\n    var c = n.fromTextArea(t.getElementById(\"codeOutput\"), {\n        lineNumbers: !1,\n        mode: \"text\",\n        theme: \"monokai\",\n        readOnly: \"nocursor\",\n        lineWrapping: !0\n    });\n    return c.setValue(\"/**\\n  * Your output will go here.\\n  * Any console.log() -type\\n  * statements will appear in\\n  * your browser's DevTools\\n  * JavaScript console.\\n  */\"),\n    c.setSize(\"100%\", \"100%\"),\n    r.updateOutputDisplay = function() {\n        var e = arguments.length <= 0 || void 0 === arguments[0] ? \"\" : arguments[0];\n        return \"string\" != typeof e && (e = JSON.stringify(e)),\n        c.setValue(e),\n        e\n    }\n    ,\n    r.appendToOutputDisplay = function() {\n        var e = arguments.length <= 0 || void 0 === arguments[0] ? \"\" : arguments[0];\n        return c.setValue(c.getValue() + e),\n        e\n    }\n    ,\n    r\n}(window),\nwindow.common = function(e) {\n    var n = e.common\n      , t = void 0 === n ? {\n        init: []\n    } : n;\n    return t.lockTop = function() {\n        var e;\n        $(window).width() >= 990 ? ($(\".editorScrollDiv\").html() && (e = $(window).height() - $(\".navbar\").height(),\n        0 > e && (e = 0),\n        $(\".editorScrollDiv\").css(\"height\", e - 50 + \"px\")),\n        e = $(window).height() - $(\".navbar\").height(),\n        0 > e && (e = 0),\n        $(\".scroll-locker\").css(\"min-height\", $(\".editorScrollDiv\").height()).css(\"height\", e - 50)) : ($(\".editorScrollDiv\").css(\"max-height\", \"500px\"),\n        $(\".scroll-locker\").css(\"position\", \"inherit\").css(\"top\", \"inherit\").css(\"width\", \"100%\").css(\"max-height\", \"100%\"))\n    }\n    ,\n    t.init.push(function(e) {\n        if (e(\".iphone-position\").html() || e(\".iphone\").html()) {\n            var n = parseInt(e(\".iphone-position\").css(\"top\").replace(\"px\", \"\"), 10)\n              , o = parseInt(e(\".iphone\").css(\"top\").replace(\"px\", \"\"), 10);\n            e(window).on(\"scroll\", function() {\n                var t = e(\".courseware-height\").height()\n                  , r = e(\".courseware-height\").offset().top\n                  , i = e(window).scrollTop()\n                  , a = e(\".iphone-position\").height();\n                0 >= t + r - i - a ? (e(\".iphone-position\").css(\"top\", n + t + r - i - a),\n                e(\".iphone\").css(\"top\", n + t + r - i - a + 120)) : (e(\".iphone-position\").css(\"top\", n),\n                e(\".iphone\").css(\"top\", o))\n            })\n        }\n        if (e(\".scroll-locker\").html()) {\n            e(\".scroll-locker\").html() && (t.lockTop(),\n            e(window).on(\"resize\", function() {\n                t.lockTop()\n            }),\n            e(window).on(\"scroll\", function() {\n                t.lockTop()\n            }));\n            var r = !1;\n            document.getElementById(\"scroll-locker\").addEventListener(\"previewUpdateSpy\", function(n) {\n                return r ? null : (r = !0,\n                setTimeout(function() {\n                    if (e(e(\".scroll-locker\").children()[0]).height() - 800 > n.detail)\n                        e(\".scroll-locker\").scrollTop(n.detail);\n                    else {\n                        var t = e(e(\".scroll-locker\").children()[0]).height();\n                        e(\".scroll-locker\").animate({\n                            scrollTop: t\n                        }, 175)\n                    }\n                    r = !1\n                }, 750))\n            }, !1)\n        }\n    }),\n    t\n}(window),\nwindow.common = function(e) {\n    var n = e.common\n      , t = void 0 === n ? {\n        init: []\n    } : n;\n    return t.init.push(function(e) {\n        e(\"#report-issue\").on(\"click\", function() {\n            var n = [\"Challenge [\", t.challengeName || window.location.pathname, \"](\", window.location.href, \") has an issue.\\n\", \"User Agent is: <code>\", navigator.userAgent, \"</code>.\\n\", \"Please describe how to reproduce this issue, and include \", \"links to screenshots if possible.\\n\\n\"].join(\"\");\n            if (t.editor && \"function\" == typeof t.editor.getValue && t.editor.getValue().trim()) {\n                var o;\n                switch (t.challengeType) {\n                case t.challengeTypes.HTML:\n                    o = \"html\";\n                    break;\n                case t.challengeTypes.JS:\n                case t.challengeTypes.BONFIRE:\n                    o = \"javascript\";\n                    break;\n                default:\n                    o = \"\"\n                }\n                n += [\"My code:\\n```\", o, \"\\n\", t.editor.getValue(), \"\\n```\\n\\n\"].join(\"\")\n            }\n            n = encodeURIComponent(n),\n            e(\"#issue-modal\").modal(\"hide\"),\n            window.open(\"https://github.com/freecodecampchina/freecodecamp.cn/issues/new?&body=\" + n, \"_blank\")\n        })\n    }),\n    t\n}(window);\nvar _extends = Object.assign || function(e) {\n    for (var n = 1; n < arguments.length; n++) {\n        var t = arguments[n];\n        for (var o in t)\n            Object.prototype.hasOwnProperty.call(t, o) && (e[o] = t[o])\n    }\n    return e\n}\n;\nwindow.common = function(global) {\n    var Observable = global.Rx.Observable\n      , chai = global.chai\n      , _global$common = global.common\n      , common = void 0 === _global$common ? {\n        init: []\n    } : _global$common;\n    return common.runTests$ = function runTests$(_ref) {\n        var code = _ref.code\n          , originalCode = _ref.originalCode\n          , userTests = _ref.userTests\n          , rest = _objectWithoutProperties(_ref, [\"code\", \"originalCode\", \"userTests\"]);\n        return Observable.from(userTests).map(function(test) {\n            var assert = chai.assert\n              , editor = {\n                getValue: function() {\n                    return originalCode\n                }\n            };\n            try {\n                test && eval(common.reassembleTest(code, test))\n            } catch (e) {\n                test.err = e.message\n            }\n            return test\n        }).toArray().map(function(e) {\n            return _extends({}, rest, {\n                tests: e\n            })\n        })\n    }\n    ,\n    common\n}(window),\nwindow.common = function(e) {\n    function n(e) {\n        e.preventDefault();\n        var n = l.editor.getValue();\n        t(\"#submit-challenge\").attr(\"disabled\", \"true\").removeClass(\"btn-primary\").addClass(\"btn-warning disabled\");\n        var r = t(\"#checkmark-container\");\n        r.css({\n            height: r.innerHeight()\n        }),\n        t(\"#challenge-checkmark\").addClass(\"zoomOutUp\").delay(1e3).queue(function(e) {\n            t(this).replaceWith('<div id=\"challenge-spinner\" class=\"animated zoomInUp inner-circles-loader\">submitting...</div>'),\n            e()\n        });\n        var i = \"UTC\";\n        try {\n            i = o.tz.guess()\n        } catch (a) {\n            a.message = \"\\n          known bug, see: https://github.com/moment/moment-timezone/issues/294:\\n          \" + a.message + \"\\n        \",\n            console.error(a)\n        }\n        var c = JSON.stringify({\n            id: l.challengeId,\n            name: l.challengeName,\n            challengeType: +l.challengeType,\n            solution: n,\n            timezone: i\n        });\n        t.ajax({\n            url: \"/completed-challenge/\",\n            type: \"POST\",\n            data: c,\n            contentType: \"application/json\",\n            dataType: \"json\"\n        }).success(function(e) {\n            e && (window.location = \"/challenges/next-challenge?id=\" + l.challengeId)\n        }).fail(function() {\n            window.location.replace(window.location.href)\n        })\n    }\n    var t = e.$\n      , o = e.moment\n      , r = e.ga\n      , i = void 0 === r ? function() {}\n    : r\n      , a = e.common\n      , l = void 0 === a ? {\n        init: []\n    } : a;\n    return l.showCompletion = function() {\n        i(\"send\", \"event\", \"Challenge\", \"solved\", l.gaName, !0),\n        t(\"#complete-courseware-dialog\").modal(\"show\"),\n        t(\"#complete-courseware-dialog .modal-header\").click(),\n        t(\"#submit-challenge\").off(\"click\"),\n        t(\"#submit-challenge\").on(\"click\", n)\n    }\n    ,\n    l\n}(window),\nwindow.common = function(e) {\n    function n(e) {\n        var n = !1\n          , t = 0;\n        return e.each(function(e) {\n            var n = c(this);\n            n.hasClass(\"hidden\") || (t = e - 1)\n        }),\n        n = e[t]\n    }\n    function t(e) {\n        var n = e.length\n          , t = !1\n          , o = 0;\n        return e.each(function(e) {\n            var t = c(this);\n            t.hasClass(\"hidden\") || e + 1 === n || (o = e + 1)\n        }),\n        t = e[o]\n    }\n    function o(e) {\n        e.preventDefault();\n        var t = n(c(d));\n        c(this).parent().parent().removeClass(\"slideInLeft slideInRight\").addClass(\"animated fadeOutRight fast-animation\").delay(250).queue(function(e) {\n            c(this).addClass(\"hidden\"),\n            t && c(t).removeClass(\"hidden\").removeClass(\"fadeOutLeft fadeOutRight\").addClass(\"animated slideInLeft fast-animation\").delay(500).queue(function(e) {\n                e()\n            }),\n            e()\n        })\n    }\n    function r(e) {\n        e.preventDefault();\n        var n = t(c(d));\n        c(this).parent().parent().removeClass(\"slideInRight slideInLeft\").addClass(\"animated fadeOutLeft fast-animation\").delay(250).queue(function(e) {\n            c(this).addClass(\"hidden\"),\n            n && c(n).removeClass(\"hidden\").removeClass(\"fadeOutRight fadeOutLeft\").addClass(\"animated slideInRight fast-animation\").delay(500).queue(function(e) {\n                e()\n            }),\n            e()\n        })\n    }\n    function i(e) {\n        var n = u.challengeSeed[0] || {\n            stepIndex: []\n        }\n          , t = c(this)\n          , o = +t.attr(\"id\")\n          , r = n.stepIndex.indexOf(o);\n        if (-1 === r)\n            return t.parent().find(\".disabled\").removeClass(\"disabled\");\n        e.preventDefault();\n        var i = n.properties[r]\n          , a = n.apis[r];\n        return u[i] ? t.parent().find(\".disabled\").removeClass(\"disabled\") : c.post(a).done(function(e) {\n            return \"boolean\" == typeof e ? t.parent().find(\".disabled\").removeClass(\"disabled\") : t.parent().find(\".disabled\").replaceWith(\"<p>\" + e + \"</p>\")\n        }).fail(function() {\n            console.log(\"failed\")\n        })\n    }\n    function a(e) {\n        e.preventDefault(),\n        c(w).modal(\"show\"),\n        c(w + \".modal-header\").click(),\n        c(g).click(l)\n    }\n    function l(e) {\n        e.preventDefault(),\n        c(\"#submit-challenge\").attr(\"disabled\", \"true\").removeClass(\"btn-primary\").addClass(\"btn-warning disabled\");\n        var n = c(\"#checkmark-container\");\n        n.css({\n            height: n.innerHeight()\n        }),\n        c(\"#challenge-checkmark\").addClass(\"zoomOutUp\").delay(1e3).queue(function(e) {\n            c(this).replaceWith('<div id=\"challenge-spinner\" class=\"animated zoomInUp inner-circles-loader\">submitting...</div>'),\n            e()\n        }),\n        c.ajax({\n            url: \"/completed-challenge/\",\n            type: \"POST\",\n            data: JSON.stringify({\n                id: u.challengeId,\n                name: u.challengeName,\n                challengeType: +u.challengeType\n            }),\n            contentType: \"application/json\",\n            dataType: \"json\"\n        }).success(function(e) {\n            e && (window.location = \"/challenges/next-challenge?id=\" + u.challengeId)\n        }).fail(function() {\n            window.location.replace(window.location.href)\n        })\n    }\n    var c = e.$\n      , s = e.common\n      , u = void 0 === s ? {\n        init: []\n    } : s\n      , d = \".challenge-step\"\n      , p = \".challenge-step-btn-prev\"\n      , h = \".challenge-step-btn-next\"\n      , f = \".challenge-step-btn-action\"\n      , m = \".challenge-step-btn-finish\"\n      , g = \"#challenge-step-btn-submit\"\n      , w = \"#challenge-step-modal\";\n    return u.init.push(function(e) {\n        return \"7\" !== u.challengeType ? null : (e(p).click(o),\n        e(h).click(r),\n        e(f).click(i),\n        e(m).click(a),\n        null )\n    }),\n    u\n}(window);\nvar _extends = Object.assign || function(e) {\n    for (var n = 1; n < arguments.length; n++) {\n        var t = arguments[n];\n        for (var o in t)\n            Object.prototype.hasOwnProperty.call(t, o) && (e[o] = t[o])\n    }\n    return e\n}\n;\n$(document).ready(function() {\n    var e = window.common\n      , n = window.Rx.Observable\n      , t = e.addLoopProtect\n      , o = e.challengeName\n      , r = e.challengeType\n      , i = e.challengeTypes;\n    if (e.init.forEach(function(e) {\n        e($)\n    }),\n    e.editor.getValue) {\n        var a = e.editorKeyUp$.debounce(750).map(function() {\n            return e.editor.getValue()\n        }).distinctUntilChanged().shareReplay();\n        a.subscribe(function(n) {\n            e.codeStorage.updateStorage(e.challengeName, n),\n            e.codeUri.querify(n)\n        }, function(e) {\n            return console.error(e)\n        }),\n        a.filter(function() {\n            return e.challengeType === i.HTML\n        }).flatMap(function(o) {\n            return e.detectUnsafeCode$(o).map(function() {\n                var n = e.head + o + e.tail;\n                return t(n)\n            }).flatMap(function(n) {\n                return e.updatePreview$(n)\n            }).flatMap(function() {\n                return e.checkPreview$({\n                    code: o\n                })\n            })[\"catch\"](function(e) {\n                return n.just({\n                    err: e\n                })\n            })\n        }).subscribe(function(n) {\n            var t = n.err;\n            return t ? (console.error(t),\n            e.updatePreview$(\"\\n              <h1>\" + t + \"</h1>\\n            \").subscribe(function() {})) : null\n        }, function(e) {\n            return console.error(e)\n        })\n    }\n    if (e.resetBtn$.doOnNext(function() {\n        e.editor.setValue(e.replaceSafeTags(e.seed))\n    }).flatMap(function() {\n        return e.executeChallenge$()[\"catch\"](function(e) {\n            return n.just({\n                err: e\n            })\n        })\n    }).subscribe(function(n) {\n        var t = n.err\n          , r = n.output\n          , i = n.originalCode;\n        return t ? (console.error(t),\n        e.updateOutputDisplay(\"\" + t)) : (e.codeStorage.updateStorage(o, i),\n        e.codeUri.querify(i),\n        e.updateOutputDisplay(r),\n        null )\n    }, function(n) {\n        n && console.error(n),\n        e.updateOutputDisplay(\"\" + n)\n    }),\n    n.merge(e.editorExecute$, e.submitBtn$).flatMap(function() {\n        return e.appendToOutputDisplay(\"\\n// testing challenge...\"),\n        e.executeChallenge$().map(function(e) {\n            var n = e.tests\n              , t = _objectWithoutProperties(e, [\"tests\"])\n              , o = n.every(function(e) {\n                return !e.err\n            });\n            return _extends({}, t, {\n                tests: n,\n                solved: o\n            })\n        })[\"catch\"](function(e) {\n            return n.just({\n                err: e\n            })\n        })\n    }).subscribe(function(n) {\n        var t = n.err\n          , o = n.solved\n          , r = n.output\n          , i = n.tests;\n        return t ? (console.error(t),\n        e.challengeType === e.challengeTypes.HTML ? e.updatePreview$(\"\\n              <h1>\" + t + \"</h1>\\n            \").first().subscribe(function() {}) : e.updateOutputDisplay(\"\" + t)) : (e.updateOutputDisplay(r),\n        e.displayTestResults(i),\n        o && e.showCompletion(),\n        null )\n    }, function(n) {\n        var t = n.err;\n        console.error(t),\n        e.updateOutputDisplay(\"\" + t)\n    }),\n    r === i.HTML) {\n        var l = $(\"#preview\");\n        return n.fromCallback(l.ready, l)().delay(500).flatMap(function() {\n            return e.executeChallenge$()\n        })[\"catch\"](function(e) {\n            return n.just({\n                err: e\n            })\n        }).subscribe(function(n) {\n            var t = n.err\n              , o = n.tests;\n            return t ? (console.error(t),\n            e.challengeType === e.challengeTypes.HTML ? e.updatePreview$(\"\\n                <h1>\" + t + \"</h1>\\n              \").subscribe(function() {}) : e.updateOutputDisplay(\"\" + t)) : (e.displayTestResults(o),\n            null )\n        }, function(e) {\n            var n = e.err;\n            console.error(n)\n        })\n    }\n    return r === i.BONFIRE || r === i.JS ? n.just({}).delay(500).flatMap(function() {\n        return e.executeChallenge$()\n    })[\"catch\"](function(e) {\n        return n.just({\n            err: e\n        })\n    }).subscribe(function(n) {\n        var t = n.err\n          , r = n.originalCode\n          , i = n.tests;\n        return t ? (console.error(t),\n        e.updateOutputDisplay(\"\" + t)) : (e.codeStorage.updateStorage(o, r),\n        e.displayTestResults(i),\n        null )\n    }, function(n) {\n        console.error(n),\n        e.updateOutputDisplay(\"\" + n)\n    }) : null\n});\n"
  },
  {
    "path": "public/js/commonFramework-2f0be7f94b.js",
    "content": "\"use strict\";function _objectWithoutProperties(e,n){var t={};for(var o in e)n.indexOf(o)>=0||Object.prototype.hasOwnProperty.call(e,o)&&(t[o]=e[o]);return t}function _objectWithoutProperties(e,n){var t={};for(var o in e)n.indexOf(o)>=0||Object.prototype.hasOwnProperty.call(e,o)&&(t[o]=e[o]);return t}window.common=function(e){var n=e.Rx,t=n.Disposable,o=n.Observable,r=n.config,i=e.common,a=void 0===i?{init:[]}:i;r.longStackSupport=!0,a.head=a.head||[],a.tail=a.tail||[],a.salt=Math.random(),a.challengeTypes={HTML:\"0\",JS:\"1\",VIDEO:\"2\",ZIPLINE:\"3\",BASEJUMP:\"4\",BONFIRE:\"5\",HIKES:\"6\",STEP:\"7\"},a.arrayToNewLineString=function(e){return e=Array.isArray(e)?e:[e],e.reduce(function(e,n){return\"\"+e+n+\"\\n\"},\"\")},a.seed=a.arrayToNewLineString(a.challengeSeed),a.replaceScriptTags=function(e){return e.replace(/<script>/gi,\"fccss\").replace(/<\\/script>/gi,\"fcces\")},a.replaceSafeTags=function(e){return e.replace(/fccss/gi,\"<script>\").replace(/fcces/gi,\"</script>\")},a.replaceFormActionAttr=function(e){return e.replace(/<form[^>]*>/,function(e){return e.replace(/action(\\s*?)=/,\"fccfaa$1=\")})},a.replaceFccfaaAttr=function(e){return e.replace(/<form[^>]*>/,function(e){return e.replace(/fccfaa(\\s*?)=/,\"action$1=\")})},a.scopejQuery=function(e){return e.replace(/\\$/gi,\"j$\").replace(/document/gi,\"jdocument\").replace(/jQuery/gi,\"jjQuery\")},a.unScopeJQuery=function(e){return e.replace(/j\\$/gi,\"$\").replace(/jdocument/gi,\"document\").replace(/jjQuery/gi,\"jQuery\")};var l=/(\\/\\*[^(\\*\\/)]*\\*\\/)|([ \\n]\\/\\/[^\\n]*)/g;a.removeComments=function(e){return e.replace(l,\"\")};var c=/(console\\.[\\w]+\\s*\\(.*\\;)/g;a.removeLogs=function(e){return e.replace(c,\"\")},a.reassembleTest=function(){var e=arguments.length<=0||void 0===arguments[0]?\"\":arguments[0],n=arguments[1],t=n.line,o=n.text,r=new RegExp(\"//\"+t+a.salt);return e.replace(r,o)},a.getScriptContent$=function(e){return o.create(function(n){var o=$.get(e,null,null,\"text\").success(function(e){n.onNext(e),n.onCompleted()}).fail(function(e){return n.onError(e)}).always(function(){return n.onCompleted()});return new t(function(){o.abort()})})};var s=/\\<\\s?script\\s?\\>/gi,u=/\\<\\s?\\/\\s?script\\s?\\>/gi;return a.hasJs=function(e){return!!a.getJsFromHtml(e)},a.getJsFromHtml=function(e){return(e.split(s)[1]||\"\").split(u)[0]||\"\"},a}(window),window.common=function(e){var n=e.$,t=e.Rx.Observable,o=e.common,r=void 0===o?{init:[]}:o;return r.ctrlEnterClickHandler=function i(e){13===e.keyCode&&(e.metaKey||e.ctrlKey)&&(n(\"#complete-courseware-dialog\").off(\"keydown\",i),n(\"#submit-challenge\").length>0?n(\"#submit-challenge\").click():window.location=\"/challenges/next-challenge?id=\"+r.challengeId)},r.init.push(function(e){var n=e(\".innerMarginFix\");n.css(\"min-height\",n.height()),r.submitBtn$=t.fromEvent(e(\"#submitButton\"),\"click\"),r.resetBtn$=t.fromEvent(e(\"#reset-button\"),\"click\"),e(\"#complete-courseware-dialog\").on(\"shown.bs.modal\",function(){e(\"#complete-courseware-dialog\").keydown(r.ctrlEnterClickHandler)}),e(\"#complete-courseware-dialog\").on(\"hidden.bs.modal\",function(){e(\"#complete-courseware-dialog\").off(\"keydown\",r.ctrlEnterClickHandler)}),e(\".challenge-list-checkbox\").on(\"change\",function(){var n=e(this).parent().parent().attr(\"id\");e(this).is(\":checked\")&&(e(this).parent().siblings().children().addClass(\"faded\"),localStorage&&localStorage[n]||(localStorage[n]=!0)),e(this).is(\":checked\")||(e(this).parent().siblings().children().removeClass(\"faded\"),localStorage[n]&&localStorage.removeItem(n))}),e(\".checklist-element\").each(function(){var n=e(this).attr(\"id\");localStorage[n]&&(e(this).children().children(\"li\").addClass(\"faded\"),e(this).children().children(\"input\").trigger(\"click\"))}),e(\"#next-courseware-button\").on(\"click\",function(){if(e(\"#next-courseware-button\").unbind(\"click\"),e(\".signup-btn-nav\").length<1){var n,t=e(\"#public-url\").val()||null,o=e(\"#github-url\").val()||null;switch(r.challengeType){case r.challengeTypes.VIDEO:n={id:r.challengeId,name:r.challengeName,challengeType:+r.challengeType},e.ajax({url:\"/completed-challenge/\",type:\"POST\",data:JSON.stringify(n),contentType:\"application/json\",dataType:\"json\"}).success(function(e){e&&(window.location.href=\"/challenges/next-challenge?id=\"+r.challengeId)}).fail(function(){window.location.replace(window.location.href)});break;case r.challengeTypes.BASEJUMP:case r.challengeTypes.ZIPLINE:n={id:r.challengeId,name:r.challengeName,challengeType:+r.challengeType,solution:t,githubLink:o},e.ajax({url:\"/completed-zipline-or-basejump/\",type:\"POST\",data:JSON.stringify(n),contentType:\"application/json\",dataType:\"json\"}).success(function(){window.location.href=\"/challenges/next-challenge?id=\"+r.challengeId}).fail(function(){window.location.replace(window.location.href)});break;case r.challengeTypes.BONFIRE:window.location.href=\"/challenges/next-challenge?id=\"+r.challengeId;break;default:console.log(\"Happy Coding!\")}}}),r.challengeName&&window.ga(\"send\",\"event\",\"Challenge\",\"load\",r.gaName),e(\"#complete-courseware-dialog\").on(\"hidden.bs.modal\",function(){r.editor.focus&&r.editor.focus()}),e(\"#trigger-issue-modal\").on(\"click\",function(){e(\"#issue-modal\").modal(\"show\")}),e(\"#trigger-help-modal\").on(\"click\",function(){e(\"#help-modal\").modal(\"show\")}),e(\"#trigger-reset-modal\").on(\"click\",function(){e(\"#reset-modal\").modal(\"show\")}),e(\"#trigger-pair-modal\").on(\"click\",function(){e(\"#pair-modal\").modal(\"show\")}),e(\"#completed-courseware\").on(\"click\",function(){e(\"#complete-courseware-dialog\").modal(\"show\")}),e(\"#help-ive-found-a-bug-wiki-article\").on(\"click\",function(){window.open(\"https://github.com/freecodecampchina/freecodecamp.cn/wiki/Help-I've-Found-a-Bug\",\"_blank\")}),e(\"#search-issue\").on(\"click\",function(){var e=window.location.href.toString().split(\"?\")[0].replace(/(#*)$/,\"\");window.open(\"https://github.com/freecodecampchina/freecodecamp.cn/issues?q=is:issue is:all \"+r.challengeName+\" OR \"+e.substr(e.lastIndexOf(\"challenges/\")+11).replace(\"/\",\"\"),\"_blank\")})}),r}(window),window.common=function(e){var n,t=e.localStorage,o=e.common,r=void 0===o?{init:[]}:o,i=[\"Bonfire: \",\"Waypoint: \",\"Zipline: \",\"Basejump: \",\"Checkpoint: \"],a={getStoredValue:function(e){if(!t||\"function\"!=typeof t.getItem||!e||\"string\"!=typeof e)return console.log(\"unable to read from storage\"),\"\";if(t.getItem(e+\"Val\"))return\"\"+t.getItem(e+\"Val\");for(var o=0;o<=i.length;o++)if(n=t.getItem(i[o]+e+\"Val\"))return\"\"+n;return null},isAlive:function(e){var n=this.getStoredValue(e);return\"null\"!==n&&\"undefined\"!==n&&n&&n.length>0},updateStorage:function(e,n){return t&&\"function\"==typeof t.setItem&&e&&\"string\"==typeof e?(t.setItem(e+\"Val\",n),n):(console.log(\"unable to save to storage\"),n)}};return r.codeStorage=a,r}(window,window.common),window.common=function(e){function n(e){return s(d(e))}function t(e){return u(p(e))}var o=e.encodeURIComponent,r=e.decodeURIComponent,i=e.location,a=e.history,l=e.common,c=void 0===l?{init:[]}:l,s=c.replaceScriptTags,u=c.replaceSafeTags,d=c.replaceFormActionAttr,p=c.replaceFccfaaAttr,h=/^(\\?|#\\?)/,f={encode:function(e){return o(e)},decode:function(e){try{return r(e)}catch(n){return null}},isInQuery:function(e){var n=f.decode(e);return n&&\"function\"==typeof n.split?n.replace(h,\"\").split(\"&\").reduce(function(e,n){var t=n.split(\"=\")[0];return\"solution\"===t?!0:e},!1):!1},isAlive:function(){return f.enabled&&f.isInQuery(i.search)||f.isInQuery(i.hash)},getKeyInQuery:function(e){var n=arguments.length<=1||void 0===arguments[1]?\"\":arguments[1];return e.split(\"&\").reduce(function(e,t){var o=t.split(\"=\")[0],r=t.split(\"=\").slice(1).join(\"=\");return o===n?r:e},null)},getSolutionFromQuery:function(){var e=arguments.length<=0||void 0===arguments[0]?\"\":arguments[0];return t(f.decode(f.getKeyInQuery(e,\"solution\")))},parse:function(){if(!f.enabled)return null;var e;return i.search&&f.isInQuery(i.search)?(e=i.search.replace(/^\\?/,\"\"),a&&\"function\"==typeof a.replaceState&&(a.replaceState(a.state,null,i.href.split(\"?\")[0]),i.hash=\"#?\"+n(e))):e=i.hash.replace(/^\\#\\?/,\"\"),e?this.getSolutionFromQuery(e):null},querify:function(e){if(!f.enabled)return null;if(a&&\"function\"==typeof a.replaceState){var t=i.href.split(\"?\")[0].replace(/(#*)$/,\"\");a.replaceState(a.state,null,t+\"#?\"+(f.shouldRun()?\"\":\"run=disabled&\")+\"solution=\"+f.encode(n(e)))}else i.hash=\"?solution=\"+f.encode(n(e));return e},enabled:!0,shouldRun:function(){return!this.getKeyInQuery((i.search||i.hash).replace(h,\"\"),\"run\")}};return c.init.push(function(){f.parse()}),c.codeUri=f,c.shouldRun=function(){return f.shouldRun()},c}(window),window.common=function(e){var n=e.loopProtect,t=e.common,o=void 0===t?{init:[]}:t;return n.hit=function(e){var n=\"Error: Exiting potential infinite loop at line \"+e+\". To disable loop protection, write: \\n\\\\/\\\\/ noprotect\\nas the firstline. Beware that if you do have an infinite loop in your codethis will crash your browser.\";console.error(n)},o.addLoopProtect=function(){var e=arguments.length<=0||void 0===arguments[0]?\"\":arguments[0];return n(e)},o}(window),window.common=function(e){var n=e.common,t=void 0===n?{init:[]}:n,o=e.document;return t.getIframe=function(){var e=arguments.length<=0||void 0===arguments[0]?\"preview\":arguments[0],n=o.getElementById(e);return n||(n=o.createElement(\"iframe\"),n.id=e,n.setAttribute(\"style\",\"display: none\"),o.body.appendChild(n)),n.contentDocument||n.contentWindow.document},t}(window),window.common=function(e){var n=e.Rx,t=n.BehaviorSubject,o=n.Observable,r=e.common,i=void 0===r?{init:[]}:r,a=\"\\n<script>\\n  window.loopProtect = parent.loopProtect;\\n  window.__err = null;\\n  window.loopProtect.hit = function(line) {\\n    window.__err = new Error(\\n      'Potential infinite loop at line ' +\\n      line +\\n      '. To disable loop protection, write:' +\\n      ' \\\\n\\\\/\\\\/ noprotect\\\\nas the first' +\\n      ' line. Beware that if you do have an infinite loop in your code' +\\n      ' this will crash your browser.'\\n    );\\n  };\\n</script>\\n<link\\n  rel='stylesheet'\\n  href='//cdn.bootcss.com/animate.css/3.2.0/animate.min.css'\\n  />\\n<link\\n  rel='stylesheet'\\n  href='//cdn.bootcss.com/bootstrap/3.3.1/css/bootstrap.min.css'\\n  />\\n\\n<link\\n  rel='stylesheet'\\n  href='//cdn.bootcss.com/font-awesome/4.2.0/css/font-awesome.min.css'\\n  />\\n<style>\\n  body { padding: 0px 3px 0px 3px; }\\n</style>\\n  \",l=\"\\n    <script>\\n      window.__err = new Error('code has been disabled');\\n    </script>\\n  \",c=i.getScriptContent$(\"/js/iFrameScripts-08bc15b460.js\").shareReplay(),s=i.getScriptContent$(\"/bower_components/jquery/dist/jquery.js\").shareReplay();return i.previewReady$=new t(!1),i.runPreviewTests$=i.checkPreview$=function(){return o[\"throw\"](new Error(\"Preview not fully loaded\"))},i.updatePreview$=function(){var e=arguments.length<=0||void 0===arguments[0]?\"\":arguments[0],n=i.getIframe(\"preview\");return o.combineLatest(c,s,function(e,n){return{iframeScript:\"<script>\"+e+\"</script>\",jQuery:\"<script>\"+n+\"</script>\"}}).first().flatMap(function(t){var o=t.iframeScript,r=t.jQuery;return i.previewReady$.onNext(!1),n.open(),n.write(a+r+(i.shouldRun()?e:l)+\"<!-- -->\"+o),n.close(),i.previewReady$.filter(function(e){return e}).first().delay(400)}).map(function(){return e})},i}(window),window.common=function(e){var n=e.Rx,t=n.Subject,o=n.Observable,r=e.CodeMirror,i=e.emmetCodeMirror,a=e.common,l=void 0===a?{init:[]}:a,c=l.challengeType,s=void 0===c?\"0\":c,u=l.challengeTypes;if(!r||s===u.BASEJUMP||s===u.ZIPLINE||s===u.VIDEO||s===u.STEP||s===u.HIKES)return l.editor={},l;var d=r.fromTextArea(document.getElementById(\"codeEditor\"),{lint:!0,lineNumbers:!0,mode:\"javascript\",theme:\"monokai\",runnable:!0,matchBrackets:!0,autoCloseBrackets:!0,scrollbarStyle:\"null\",lineWrapping:!0,gutters:[\"CodeMirror-lint-markers\"]});d.setSize(\"100%\",\"auto\"),l.editorExecute$=new t,l.editorKeyUp$=o.fromEventPattern(function(e){return d.on(\"keyup\",e)},function(e){return d.off(\"keyup\",e)}),d.setOption(\"extraKeys\",{Tab:function(e){if(e.somethingSelected())e.indentSelection(\"add\");else{var n=Array(e.getOption(\"indentUnit\")+1).join(\" \");e.replaceSelection(n)}},\"Shift-Tab\":function(e){if(e.somethingSelected())e.indentSelection(\"subtract\");else{var n=Array(e.getOption(\"indentUnit\")+1).join(\" \");e.replaceSelection(n)}},\"Ctrl-Enter\":function(){return l.editorExecute$.onNext(),!1},\"Cmd-Enter\":function(){return l.editorExecute$.onNext(),!1}});var p=d.getScrollInfo(),h=d.charCoords({line:d.getCursor().line+1,ch:0},\"local\").top;return p.top+p.clientHeight<h&&d.scrollTo(null,h-p.clientHeight+3),i&&i(d,{\"Cmd-E\":\"emmet.expand_abbreviation\",Tab:\"emmet.expand_abbreviation_with_tab\",Enter:\"emmet.insert_formatted_line_break_only\"}),l.init.push(function(){var e=void 0;e=l.codeUri.isAlive()?l.codeUri.parse():l.codeStorage.isAlive(l.challengeName)?l.codeStorage.getStoredValue(l.challengeName):l.seed,d.setValue(l.replaceSafeTags(e)),d.refresh()}),l.editor=d,l}(window),window.common=function(e){var n=e.Rx.Observable,t=e.common,o=void 0===t?{init:[]}:t,r=/function\\s*?\\(|function\\s+\\w+\\s*?\\(/gi,i=/\\$\\s*?\\(\\s*?\\$\\s*?\\)/gi,a=/if\\s\\(null\\)\\sconsole\\.log\\(1\\);/gi;return o.detectUnsafeCode$=function(e){var t=e.match(/\\/\\*/gi),o=e.match(/\\*\\//gi);return t&&(!o||t.length>o.length)?n[\"throw\"](new Error(\"SyntaxError: Unfinished multi-line comment\")):e.match(i)?n[\"throw\"](new Error(\"Unsafe $($)\")):e.match(/function/g)&&!e.match(r)?n[\"throw\"](new Error(\"SyntaxError: Unsafe or unfinished function declaration\")):e.match(a)?n[\"throw\"](new Error(\"Invalid if (null) console.log(1); detected\")):n.just(e)},o}(window),window.common=function(e){var n=e.$,t=e.common,o=void 0===t?{init:[]}:t;return o.displayTestResults=function(){var e=arguments.length<=0||void 0===arguments[0]?[]:arguments[0];return n(\"#testSuite\").children().remove(),e.forEach(function(e){var t=e.err,o=void 0===t?!1:t,r=e.text,i=void 0===r?\"\":r,a=o?'\"ion-close-circled big-error-icon\"':'\"ion-checkmark-circled big-success-icon\"';n(\"<div></div>\").html(\"\\n        <div class='row'>\\n          <div class='col-xs-2 text-center'>\\n            <i class=\"+a+\"></i>\\n          </div>\\n          <div class='col-xs-10 test-output'>\\n            \"+i.split(\"message: \").pop().replace(/\\'\\);/g,\"\")+\"\\n          </div>\\n          <div class='ten-pixel-break'/>\\n        </div>\\n      \").appendTo(n(\"#testSuite\"))}),e},o}(window),window.common=function(e){var n=e.ga,t=e.common,o=void 0===t?{init:[]}:t,r=o.addLoopProtect,i=o.getJsFromHtml,a=o.detectUnsafeCode$,l=o.updatePreview$,c=o.challengeType,s=o.challengeTypes;return o.executeChallenge$=function(){var e=o.editor.getValue(),t=e,u=o.arrayToNewLineString(o.head),d=o.arrayToNewLineString(o.tail),p=u+e+d;return n(\"send\",\"event\",\"Challenge\",\"ran-code\",o.gaName),a(e).map(function(){return c!==s.HTML?\"<script>;\"+r(p)+\"/**/</script>\":r(p)}).flatMap(function(e){return l(e)}).flatMap(function(e){var n=void 0;return c===s.HTML&&o.hasJs(e)?n=o.getJsOutput(i(e)):c!==s.HTML&&(n=o.getJsOutput(r(p))),o.runPreviewTests$({tests:o.tests.slice(),originalCode:t,output:n})})},o}(window),window.common=function(e){var n=e.CodeMirror,t=e.document,o=e.common,r=void 0===o?{init:[]}:o,i=r.challengeTypes,a=r.challengeType,l=void 0===a?\"0\":a;if(!n||l!==i.JS&&l!==i.BONFIRE)return r.updateOutputDisplay=function(){},r.appendToOutputDisplay=function(){},r;var c=n.fromTextArea(t.getElementById(\"codeOutput\"),{lineNumbers:!1,mode:\"text\",theme:\"monokai\",readOnly:\"nocursor\",lineWrapping:!0});return c.setValue(\"/**\\n  * Your output will go here.\\n  * Any console.log() -type\\n  * statements will appear in\\n  * your browser's DevTools\\n  * JavaScript console.\\n  */\"),c.setSize(\"100%\",\"100%\"),r.updateOutputDisplay=function(){var e=arguments.length<=0||void 0===arguments[0]?\"\":arguments[0];return\"string\"!=typeof e&&(e=JSON.stringify(e)),c.setValue(e),e},r.appendToOutputDisplay=function(){var e=arguments.length<=0||void 0===arguments[0]?\"\":arguments[0];return c.setValue(c.getValue()+e),e},r}(window),window.common=function(e){var n=e.common,t=void 0===n?{init:[]}:n;return t.lockTop=function(){var e;$(window).width()>=990?($(\".editorScrollDiv\").html()&&(e=$(window).height()-$(\".navbar\").height(),0>e&&(e=0),$(\".editorScrollDiv\").css(\"height\",e-50+\"px\")),e=$(window).height()-$(\".navbar\").height(),0>e&&(e=0),$(\".scroll-locker\").css(\"min-height\",$(\".editorScrollDiv\").height()).css(\"height\",e-50)):($(\".editorScrollDiv\").css(\"max-height\",\"500px\"),$(\".scroll-locker\").css(\"position\",\"inherit\").css(\"top\",\"inherit\").css(\"width\",\"100%\").css(\"max-height\",\"100%\"))},t.init.push(function(e){if(e(\".iphone-position\").html()||e(\".iphone\").html()){var n=parseInt(e(\".iphone-position\").css(\"top\").replace(\"px\",\"\"),10),o=parseInt(e(\".iphone\").css(\"top\").replace(\"px\",\"\"),10);e(window).on(\"scroll\",function(){var t=e(\".courseware-height\").height(),r=e(\".courseware-height\").offset().top,i=e(window).scrollTop(),a=e(\".iphone-position\").height();0>=t+r-i-a?(e(\".iphone-position\").css(\"top\",n+t+r-i-a),e(\".iphone\").css(\"top\",n+t+r-i-a+120)):(e(\".iphone-position\").css(\"top\",n),e(\".iphone\").css(\"top\",o))})}if(e(\".scroll-locker\").html()){e(\".scroll-locker\").html()&&(t.lockTop(),e(window).on(\"resize\",function(){t.lockTop()}),e(window).on(\"scroll\",function(){t.lockTop()}));var r=!1;document.getElementById(\"scroll-locker\").addEventListener(\"previewUpdateSpy\",function(n){return r?null:(r=!0,setTimeout(function(){if(e(e(\".scroll-locker\").children()[0]).height()-800>n.detail)e(\".scroll-locker\").scrollTop(n.detail);else{var t=e(e(\".scroll-locker\").children()[0]).height();e(\".scroll-locker\").animate({scrollTop:t},175)}r=!1},750))},!1)}}),t}(window),window.common=function(e){var n=e.common,t=void 0===n?{init:[]}:n;return t.init.push(function(e){e(\"#report-issue\").on(\"click\",function(){var n=[\"Challenge [\",t.challengeName||window.location.pathname,\"](\",window.location.href,\") has an issue.\\n\",\"User Agent is: <code>\",navigator.userAgent,\"</code>.\\n\",\"Please describe how to reproduce this issue, and include \",\"links to screenshots if possible.\\n\\n\"].join(\"\");if(t.editor&&\"function\"==typeof t.editor.getValue&&t.editor.getValue().trim()){var o;switch(t.challengeType){case t.challengeTypes.HTML:o=\"html\";break;case t.challengeTypes.JS:case t.challengeTypes.BONFIRE:o=\"javascript\";break;default:o=\"\"}n+=[\"My code:\\n```\",o,\"\\n\",t.editor.getValue(),\"\\n```\\n\\n\"].join(\"\")}n=encodeURIComponent(n),e(\"#issue-modal\").modal(\"hide\"),window.open(\"https://github.com/freecodecampchina/freecodecamp.cn/issues/new?&body=\"+n,\"_blank\")})}),t}(window);var _extends=Object.assign||function(e){for(var n=1;n<arguments.length;n++){var t=arguments[n];for(var o in t)Object.prototype.hasOwnProperty.call(t,o)&&(e[o]=t[o])}return e};window.common=function(global){var Observable=global.Rx.Observable,chai=global.chai,_global$common=global.common,common=void 0===_global$common?{init:[]}:_global$common;return common.runTests$=function runTests$(_ref){var code=_ref.code,originalCode=_ref.originalCode,userTests=_ref.userTests,rest=_objectWithoutProperties(_ref,[\"code\",\"originalCode\",\"userTests\"]);return Observable.from(userTests).map(function(test){var assert=chai.assert,editor={getValue:function(){return originalCode}};try{test&&eval(common.reassembleTest(code,test))}catch(e){test.err=e.message}return test}).toArray().map(function(e){return _extends({},rest,{tests:e})})},common}(window),window.common=function(e){function n(e){e.preventDefault();var n=l.editor.getValue();t(\"#submit-challenge\").attr(\"disabled\",\"true\").removeClass(\"btn-primary\").addClass(\"btn-warning disabled\");var r=t(\"#checkmark-container\");r.css({height:r.innerHeight()}),t(\"#challenge-checkmark\").addClass(\"zoomOutUp\").delay(1e3).queue(function(e){t(this).replaceWith('<div id=\"challenge-spinner\" class=\"animated zoomInUp inner-circles-loader\">submitting...</div>'),e()});var i=\"UTC\";try{i=o.tz.guess()}catch(a){a.message=\"\\n          known bug, see: https://github.com/moment/moment-timezone/issues/294:\\n          \"+a.message+\"\\n        \",console.error(a)}var c=JSON.stringify({id:l.challengeId,name:l.challengeName,challengeType:+l.challengeType,solution:n,timezone:i});t.ajax({url:\"/completed-challenge/\",type:\"POST\",data:c,contentType:\"application/json\",dataType:\"json\"}).success(function(e){e&&(window.location=\"/challenges/next-challenge?id=\"+l.challengeId)}).fail(function(){window.location.replace(window.location.href)})}var t=e.$,o=e.moment,r=e.ga,i=void 0===r?function(){}:r,a=e.common,l=void 0===a?{init:[]}:a;return l.showCompletion=function(){i(\"send\",\"event\",\"Challenge\",\"solved\",l.gaName,!0),t(\"#complete-courseware-dialog\").modal(\"show\"),t(\"#complete-courseware-dialog .modal-header\").click(),t(\"#submit-challenge\").off(\"click\"),t(\"#submit-challenge\").on(\"click\",n)},l}(window),window.common=function(e){function n(e){var n=!1,t=0;return e.each(function(e){var n=c(this);n.hasClass(\"hidden\")||(t=e-1)}),n=e[t]}function t(e){var n=e.length,t=!1,o=0;return e.each(function(e){var t=c(this);t.hasClass(\"hidden\")||e+1===n||(o=e+1)}),t=e[o]}function o(e){e.preventDefault();var t=n(c(d));c(this).parent().parent().removeClass(\"slideInLeft slideInRight\").addClass(\"animated fadeOutRight fast-animation\").delay(250).queue(function(e){c(this).addClass(\"hidden\"),t&&c(t).removeClass(\"hidden\").removeClass(\"fadeOutLeft fadeOutRight\").addClass(\"animated slideInLeft fast-animation\").delay(500).queue(function(e){e()}),e()})}function r(e){e.preventDefault();var n=t(c(d));c(this).parent().parent().removeClass(\"slideInRight slideInLeft\").addClass(\"animated fadeOutLeft fast-animation\").delay(250).queue(function(e){c(this).addClass(\"hidden\"),n&&c(n).removeClass(\"hidden\").removeClass(\"fadeOutRight fadeOutLeft\").addClass(\"animated slideInRight fast-animation\").delay(500).queue(function(e){e()}),e()})}function i(e){var n=u.challengeSeed[0]||{stepIndex:[]},t=c(this),o=+t.attr(\"id\"),r=n.stepIndex.indexOf(o);if(-1===r)return t.parent().find(\".disabled\").removeClass(\"disabled\");e.preventDefault();var i=n.properties[r],a=n.apis[r];return u[i]?t.parent().find(\".disabled\").removeClass(\"disabled\"):c.post(a).done(function(e){return\"boolean\"==typeof e?t.parent().find(\".disabled\").removeClass(\"disabled\"):t.parent().find(\".disabled\").replaceWith(\"<p>\"+e+\"</p>\")}).fail(function(){console.log(\"failed\")})}function a(e){e.preventDefault(),c(w).modal(\"show\"),c(w+\".modal-header\").click(),c(g).click(l)}function l(e){e.preventDefault(),c(\"#submit-challenge\").attr(\"disabled\",\"true\").removeClass(\"btn-primary\").addClass(\"btn-warning disabled\");var n=c(\"#checkmark-container\");n.css({height:n.innerHeight()}),c(\"#challenge-checkmark\").addClass(\"zoomOutUp\").delay(1e3).queue(function(e){c(this).replaceWith('<div id=\"challenge-spinner\" class=\"animated zoomInUp inner-circles-loader\">submitting...</div>'),e()}),c.ajax({url:\"/completed-challenge/\",type:\"POST\",data:JSON.stringify({id:u.challengeId,name:u.challengeName,challengeType:+u.challengeType}),contentType:\"application/json\",dataType:\"json\"}).success(function(e){e&&(window.location=\"/challenges/next-challenge?id=\"+u.challengeId)}).fail(function(){window.location.replace(window.location.href)})}var c=e.$,s=e.common,u=void 0===s?{init:[]}:s,d=\".challenge-step\",p=\".challenge-step-btn-prev\",h=\".challenge-step-btn-next\",f=\".challenge-step-btn-action\",m=\".challenge-step-btn-finish\",g=\"#challenge-step-btn-submit\",w=\"#challenge-step-modal\";return u.init.push(function(e){return\"7\"!==u.challengeType?null:(e(p).click(o),e(h).click(r),e(f).click(i),e(m).click(a),null)}),u}(window);var _extends=Object.assign||function(e){for(var n=1;n<arguments.length;n++){var t=arguments[n];for(var o in t)Object.prototype.hasOwnProperty.call(t,o)&&(e[o]=t[o])}return e};$(document).ready(function(){var e=window.common,n=window.Rx.Observable,t=e.addLoopProtect,o=e.challengeName,r=e.challengeType,i=e.challengeTypes;if(e.init.forEach(function(e){e($)}),e.editor.getValue){var a=e.editorKeyUp$.debounce(750).map(function(){return e.editor.getValue()}).distinctUntilChanged().shareReplay();a.subscribe(function(n){e.codeStorage.updateStorage(e.challengeName,n),e.codeUri.querify(n)},function(e){return console.error(e)}),a.filter(function(){return e.challengeType===i.HTML}).flatMap(function(o){return e.detectUnsafeCode$(o).map(function(){var n=e.head+o+e.tail;return t(n)}).flatMap(function(n){return e.updatePreview$(n)}).flatMap(function(){return e.checkPreview$({code:o})})[\"catch\"](function(e){return n.just({err:e})})}).subscribe(function(n){var t=n.err;return t?(console.error(t),e.updatePreview$(\"\\n              <h1>\"+t+\"</h1>\\n            \").subscribe(function(){})):null},function(e){return console.error(e)})}if(e.resetBtn$.doOnNext(function(){e.editor.setValue(e.replaceSafeTags(e.seed))}).flatMap(function(){return e.executeChallenge$()[\"catch\"](function(e){return n.just({err:e})})}).subscribe(function(n){var t=n.err,r=n.output,i=n.originalCode;return t?(console.error(t),e.updateOutputDisplay(\"\"+t)):(e.codeStorage.updateStorage(o,i),e.codeUri.querify(i),e.updateOutputDisplay(r),null)},function(n){n&&console.error(n),e.updateOutputDisplay(\"\"+n)}),n.merge(e.editorExecute$,e.submitBtn$).flatMap(function(){return e.appendToOutputDisplay(\"\\n// testing challenge...\"),e.executeChallenge$().map(function(e){var n=e.tests,t=_objectWithoutProperties(e,[\"tests\"]),o=n.every(function(e){return!e.err});return _extends({},t,{tests:n,solved:o})})[\"catch\"](function(e){return n.just({err:e})})}).subscribe(function(n){var t=n.err,o=n.solved,r=n.output,i=n.tests;return t?(console.error(t),e.challengeType===e.challengeTypes.HTML?e.updatePreview$(\"\\n              <h1>\"+t+\"</h1>\\n            \").first().subscribe(function(){}):e.updateOutputDisplay(\"\"+t)):(e.updateOutputDisplay(r),e.displayTestResults(i),o&&e.showCompletion(),null)},function(n){var t=n.err;console.error(t),e.updateOutputDisplay(\"\"+t)}),r===i.HTML){var l=$(\"#preview\");return n.fromCallback(l.ready,l)().delay(500).flatMap(function(){return e.executeChallenge$()})[\"catch\"](function(e){return n.just({err:e})}).subscribe(function(n){var t=n.err,o=n.tests;return t?(console.error(t),e.challengeType===e.challengeTypes.HTML?e.updatePreview$(\"\\n                <h1>\"+t+\"</h1>\\n              \").subscribe(function(){}):e.updateOutputDisplay(\"\"+t)):(e.displayTestResults(o),null)},function(e){var n=e.err;console.error(n)})}return r===i.BONFIRE||r===i.JS?n.just({}).delay(500).flatMap(function(){return e.executeChallenge$()})[\"catch\"](function(e){return n.just({err:e})}).subscribe(function(n){var t=n.err,r=n.originalCode,i=n.tests;return t?(console.error(t),e.updateOutputDisplay(\"\"+t)):(e.codeStorage.updateStorage(o,r),e.displayTestResults(i),null)},function(n){console.error(n),e.updateOutputDisplay(\"\"+n)}):null});"
  },
  {
    "path": "public/js/commonFramework-64e637bbe5.js",
    "content": "'use strict';\n\nwindow.common = function (global) {\n  // common namespace\n  // all classes should be stored here\n  // called at the beginning of dom ready\n  var _global$Rx = global.Rx,\n      Disposable = _global$Rx.Disposable,\n      Observable = _global$Rx.Observable,\n      config = _global$Rx.config,\n      _global$common = global.common,\n      common = _global$common === undefined ? { init: [] } : _global$common;\n\n\n  config.longStackSupport = true;\n  common.head = common.head || [];\n  common.tail = common.tail || [];\n  common.salt = Math.random();\n\n  common.challengeTypes = {\n    HTML: '0',\n    JS: '1',\n    VIDEO: '2',\n    ZIPLINE: '3',\n    BASEJUMP: '4',\n    BONFIRE: '5',\n    HIKES: '6',\n    STEP: '7'\n  };\n\n  common.arrayToNewLineString = function arrayToNewLineString(seedData) {\n    seedData = Array.isArray(seedData) ? seedData : [seedData];\n    return seedData.reduce(function (seed, line) {\n      return '' + seed + line + '\\n';\n    }, '');\n  };\n\n  common.seed = common.arrayToNewLineString(common.challengeSeed);\n\n  common.replaceScriptTags = function replaceScriptTags(value) {\n    return value.replace(/<script>/gi, 'fccss').replace(/<\\/script>/gi, 'fcces');\n  };\n\n  common.replaceSafeTags = function replaceSafeTags(value) {\n    return value.replace(/fccss/gi, '<script>').replace(/fcces/gi, '</script>');\n  };\n\n  common.replaceFormActionAttr = function replaceFormAction(value) {\n    return value.replace(/<form[^>]*>/, function (val) {\n      return val.replace(/action(\\s*?)=/, 'fccfaa$1=');\n    });\n  };\n\n  common.replaceFccfaaAttr = function replaceFccfaaAttr(value) {\n    return value.replace(/<form[^>]*>/, function (val) {\n      return val.replace(/fccfaa(\\s*?)=/, 'action$1=');\n    });\n  };\n\n  common.scopejQuery = function scopejQuery(str) {\n    return str.replace(/\\$/gi, 'j$').replace(/document/gi, 'jdocument').replace(/jQuery/gi, 'jjQuery');\n  };\n\n  common.unScopeJQuery = function unScopeJQuery(str) {\n    return str.replace(/j\\$/gi, '$').replace(/jdocument/gi, 'document').replace(/jjQuery/gi, 'jQuery');\n  };\n\n  var commentRegex = /(\\/\\*[^(\\*\\/)]*\\*\\/)|([ \\n]\\/\\/[^\\n]*)/g;\n  common.removeComments = function removeComments(str) {\n    return str.replace(commentRegex, '');\n  };\n\n  var logRegex = /(console\\.[\\w]+\\s*\\(.*\\;)/g;\n  common.removeLogs = function removeLogs(str) {\n    return str.replace(logRegex, '');\n  };\n\n  common.reassembleTest = function reassembleTest() {\n    var code = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';\n    var _ref = arguments[1];\n    var line = _ref.line,\n        text = _ref.text;\n\n    var regexp = new RegExp('//' + line + common.salt);\n    return code.replace(regexp, text);\n  };\n\n  common.getScriptContent$ = function getScriptContent$(script) {\n    return Observable.create(function (observer) {\n      var jqXHR = $.get(script, null, null, 'text').success(function (data) {\n        observer.onNext(data);\n        observer.onCompleted();\n      }).fail(function (e) {\n        return observer.onError(e);\n      }).always(function () {\n        return observer.onCompleted();\n      });\n\n      return new Disposable(function () {\n        jqXHR.abort();\n      });\n    });\n  };\n\n  var openScript = /\\<\\s?script\\s?\\>/gi;\n  var closingScript = /\\<\\s?\\/\\s?script\\s?\\>/gi;\n\n  // detects if there is JavaScript in the first script tag\n  common.hasJs = function hasJs(code) {\n    return !!common.getJsFromHtml(code);\n  };\n\n  // grabs the content from the first script tag in the code\n  common.getJsFromHtml = function getJsFromHtml(code) {\n    // grab user javaScript\n    return (code.split(openScript)[1] || '').split(closingScript)[0] || '';\n  };\n\n  return common;\n}(window);\n'use strict';\n\nwindow.common = function (global) {\n  var $ = global.$,\n      Observable = global.Rx.Observable,\n      _global$common = global.common,\n      common = _global$common === undefined ? { init: [] } : _global$common;\n\n\n  common.ctrlEnterClickHandler = function ctrlEnterClickHandler(e) {\n    // ctrl + enter or cmd + enter\n    if (e.keyCode === 13 && (e.metaKey || e.ctrlKey)) {\n      $('#complete-courseware-dialog').off('keydown', ctrlEnterClickHandler);\n      if ($('#submit-challenge').length > 0) {\n        $('#submit-challenge').click();\n      } else {\n        window.location = '/challenges/next-challenge?id=' + common.challengeId;\n      }\n    }\n  };\n\n  common.init.push(function ($) {\n\n    var $marginFix = $('.innerMarginFix');\n    $marginFix.css('min-height', $marginFix.height());\n\n    common.submitBtn$ = Observable.fromEvent($('#submitButton'), 'click');\n\n    common.resetBtn$ = Observable.fromEvent($('#reset-button'), 'click');\n\n    // init modal keybindings on open\n    $('#complete-courseware-dialog').on('shown.bs.modal', function () {\n      $('#complete-courseware-dialog').keydown(common.ctrlEnterClickHandler);\n    });\n\n    // remove modal keybinds on close\n    $('#complete-courseware-dialog').on('hidden.bs.modal', function () {\n      $('#complete-courseware-dialog').off('keydown', common.ctrlEnterClickHandler);\n    });\n\n    // video checklist binding\n    $('.challenge-list-checkbox').on('change', function () {\n      var checkboxId = $(this).parent().parent().attr('id');\n      if ($(this).is(':checked')) {\n        $(this).parent().siblings().children().addClass('faded');\n        if (!localStorage || !localStorage[checkboxId]) {\n          localStorage[checkboxId] = true;\n        }\n      }\n\n      if (!$(this).is(':checked')) {\n        $(this).parent().siblings().children().removeClass('faded');\n        if (localStorage[checkboxId]) {\n          localStorage.removeItem(checkboxId);\n        }\n      }\n    });\n\n    $('.checklist-element').each(function () {\n      var checklistElementId = $(this).attr('id');\n      if (localStorage[checklistElementId]) {\n        $(this).children().children('li').addClass('faded');\n        $(this).children().children('input').trigger('click');\n      }\n    });\n\n    // video challenge submit\n    $('#next-courseware-button').on('click', function () {\n      $('#next-courseware-button').unbind('click');\n      if ($('.signup-btn-nav').length < 1) {\n        var data;\n        var solution = $('#public-url').val() || null;\n        var githubLink = $('#github-url').val() || null;\n        switch (common.challengeType) {\n          case common.challengeTypes.VIDEO:\n            data = {\n              id: common.challengeId,\n              name: common.challengeName,\n              challengeType: +common.challengeType\n            };\n            $.ajax({\n              url: '/completed-challenge/',\n              type: 'POST',\n              data: JSON.stringify(data),\n              contentType: 'application/json',\n              dataType: 'json'\n            }).success(function (res) {\n              if (!res) {\n                return;\n              }\n              window.location.href = '/challenges/next-challenge?id=' + common.challengeId;\n            }).fail(function () {\n              window.location.replace(window.location.href);\n            });\n\n            break;\n          case common.challengeTypes.BASEJUMP:\n          case common.challengeTypes.ZIPLINE:\n            data = {\n              id: common.challengeId,\n              name: common.challengeName,\n              challengeType: +common.challengeType,\n              solution: solution,\n              githubLink: githubLink\n            };\n\n            $.ajax({\n              url: '/completed-zipline-or-basejump/',\n              type: 'POST',\n              data: JSON.stringify(data),\n              contentType: 'application/json',\n              dataType: 'json'\n            }).success(function () {\n              window.location.href = '/challenges/next-challenge?id=' + common.challengeId;\n            }).fail(function () {\n              window.location.replace(window.location.href);\n            });\n            break;\n\n          case common.challengeTypes.BONFIRE:\n            window.location.href = '/challenges/next-challenge?id=' + common.challengeId;\n            break;\n\n          default:\n            console.log('Happy Coding!');\n            break;\n        }\n      }\n    });\n\n    if (common.challengeName) {\n      window.ga('send', 'event', 'Challenge', 'load', common.gaName);\n    }\n\n    $('#complete-courseware-dialog').on('hidden.bs.modal', function () {\n      if (common.editor.focus) {\n        common.editor.focus();\n      }\n    });\n\n    $('#trigger-issue-modal').on('click', function () {\n      $('#issue-modal').modal('show');\n    });\n\n    $('#trigger-help-modal').on('click', function () {\n      $('#help-modal').modal('show');\n    });\n\n    $('#trigger-reset-modal').on('click', function () {\n      $('#reset-modal').modal('show');\n    });\n\n    $('#trigger-pair-modal').on('click', function () {\n      $('#pair-modal').modal('show');\n    });\n\n    $('#completed-courseware').on('click', function () {\n      $('#complete-courseware-dialog').modal('show');\n    });\n\n    $('#help-ive-found-a-bug-wiki-article').on('click', function () {\n      window.open('https://github.com/freecodecampchina/freecodecamp.cn/wiki/' + \"Help-I've-Found-a-Bug\", '_blank');\n    });\n\n    $('#search-issue').on('click', function () {\n      var queryIssue = window.location.href.toString().split('?')[0].replace(/(#*)$/, '');\n      window.open('https://github.com/freecodecampchina/freecodecamp.cn/issues?q=' + 'is:issue is:all ' + common.challengeName + ' OR ' + queryIssue.substr(queryIssue.lastIndexOf('challenges/') + 11).replace('/', ''), '_blank');\n    });\n  });\n\n  return common;\n}(window);\n'use strict';\n\n// depends on: codeUri\nwindow.common = function (global) {\n  var localStorage = global.localStorage,\n      _global$common = global.common,\n      common = _global$common === undefined ? { init: [] } : _global$common;\n\n\n  var challengePrefix = ['Bonfire: ', 'Waypoint: ', 'Zipline: ', 'Basejump: ', 'Checkpoint: '],\n      item;\n\n  var codeStorage = {\n    getStoredValue: function getStoredValue(key) {\n      if (!localStorage || typeof localStorage.getItem !== 'function' || !key || typeof key !== 'string') {\n        console.log('unable to read from storage');\n        return '';\n      }\n      if (localStorage.getItem(key + 'Val')) {\n        return '' + localStorage.getItem(key + 'Val');\n      } else {\n        for (var i = 0; i <= challengePrefix.length; i++) {\n          item = localStorage.getItem(challengePrefix[i] + key + 'Val');\n          if (item) {\n            return '' + item;\n          }\n        }\n      }\n      return null;\n    },\n\n\n    isAlive: function isAlive(key) {\n      var val = this.getStoredValue(key);\n      return val !== 'null' && val !== 'undefined' && val && val.length > 0;\n    },\n\n    updateStorage: function updateStorage(key, code) {\n      if (!localStorage || typeof localStorage.setItem !== 'function' || !key || typeof key !== 'string') {\n        console.log('unable to save to storage');\n        return code;\n      }\n      localStorage.setItem(key + 'Val', code);\n      return code;\n    }\n  };\n\n  common.codeStorage = codeStorage;\n\n  return common;\n}(window, window.common);\n'use strict';\n\n// store code in the URL\nwindow.common = function (global) {\n  var _encode = global.encodeURIComponent,\n      _decode = global.decodeURIComponent,\n      location = global.location,\n      history = global.history,\n      _global$common = global.common,\n      common = _global$common === undefined ? { init: [] } : _global$common;\n  var replaceScriptTags = common.replaceScriptTags,\n      replaceSafeTags = common.replaceSafeTags,\n      replaceFormActionAttr = common.replaceFormActionAttr,\n      replaceFccfaaAttr = common.replaceFccfaaAttr;\n\n\n  var queryRegex = /^(\\?|#\\?)/;\n  function encodeFcc(val) {\n    return replaceScriptTags(replaceFormActionAttr(val));\n  }\n\n  function decodeFcc(val) {\n    return replaceSafeTags(replaceFccfaaAttr(val));\n  }\n\n  var codeUri = {\n    encode: function encode(code) {\n      return _encode(code);\n    },\n    decode: function decode(code) {\n      try {\n        return _decode(code);\n      } catch (ignore) {\n        return null;\n      }\n    },\n    isInQuery: function isInQuery(query) {\n      var decoded = codeUri.decode(query);\n      if (!decoded || typeof decoded.split !== 'function') {\n        return false;\n      }\n      return decoded.replace(queryRegex, '').split('&').reduce(function (found, param) {\n        var key = param.split('=')[0];\n        if (key === 'solution') {\n          return true;\n        }\n        return found;\n      }, false);\n    },\n    isAlive: function isAlive() {\n      return codeUri.enabled && codeUri.isInQuery(location.search) || codeUri.isInQuery(location.hash);\n    },\n    getKeyInQuery: function getKeyInQuery(query) {\n      var keyToFind = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';\n\n      return query.split('&').reduce(function (oldValue, param) {\n        var key = param.split('=')[0];\n        var value = param.split('=').slice(1).join('=');\n\n        if (key === keyToFind) {\n          return value;\n        }\n        return oldValue;\n      }, null);\n    },\n    getSolutionFromQuery: function getSolutionFromQuery() {\n      var query = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';\n\n      return decodeFcc(codeUri.decode(codeUri.getKeyInQuery(query, 'solution')));\n    },\n\n    parse: function parse() {\n      if (!codeUri.enabled) {\n        return null;\n      }\n      var query;\n      if (location.search && codeUri.isInQuery(location.search)) {\n        query = location.search.replace(/^\\?/, '');\n\n        if (history && typeof history.replaceState === 'function') {\n          history.replaceState(history.state, null, location.href.split('?')[0]);\n          location.hash = '#?' + encodeFcc(query);\n        }\n      } else {\n        query = location.hash.replace(/^\\#\\?/, '');\n      }\n\n      if (!query) {\n        return null;\n      }\n\n      return this.getSolutionFromQuery(query);\n    },\n    querify: function querify(solution) {\n      if (!codeUri.enabled) {\n        return null;\n      }\n      if (history && typeof history.replaceState === 'function') {\n        // grab the url up to the query\n        // destroy any hash symbols still clinging to life\n        var url = location.href.split('?')[0].replace(/(#*)$/, '');\n        history.replaceState(history.state, null, url + '#?' + (codeUri.shouldRun() ? '' : 'run=disabled&') + 'solution=' + codeUri.encode(encodeFcc(solution)));\n      } else {\n        location.hash = '?solution=' + codeUri.encode(encodeFcc(solution));\n      }\n\n      return solution;\n    },\n    enabled: true,\n    shouldRun: function shouldRun() {\n      return !this.getKeyInQuery((location.search || location.hash).replace(queryRegex, ''), 'run');\n    }\n  };\n\n  common.init.push(function () {\n    codeUri.parse();\n  });\n\n  common.codeUri = codeUri;\n  common.shouldRun = function () {\n    return codeUri.shouldRun();\n  };\n\n  return common;\n}(window);\n'use strict';\n\nwindow.common = function (global) {\n  var loopProtect = global.loopProtect,\n      _global$common = global.common,\n      common = _global$common === undefined ? { init: [] } : _global$common;\n\n\n  loopProtect.hit = function hit(line) {\n    var err = 'Error: Exiting potential infinite loop at line ' + line + '. To disable loop protection, write: \\n\\\\/\\\\/ noprotect\\nas the first' + 'line. Beware that if you do have an infinite loop in your code' + 'this will crash your browser.';\n    console.error(err);\n  };\n\n  common.addLoopProtect = function addLoopProtect() {\n    var code = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';\n\n    return loopProtect(code);\n  };\n\n  return common;\n}(window);\n'use strict';\n\nwindow.common = function (global) {\n  var _global$common = global.common,\n      common = _global$common === undefined ? { init: [] } : _global$common,\n      doc = global.document;\n\n\n  common.getIframe = function getIframe() {\n    var id = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'preview';\n\n    var previewFrame = doc.getElementById(id);\n\n    // create and append a hidden preview frame\n    if (!previewFrame) {\n      previewFrame = doc.createElement('iframe');\n      previewFrame.id = id;\n      previewFrame.setAttribute('style', 'display: none');\n      doc.body.appendChild(previewFrame);\n    }\n\n    return previewFrame.contentDocument || previewFrame.contentWindow.document;\n  };\n\n  return common;\n}(window);\n'use strict';\n\nwindow.common = function (global) {\n  var _global$Rx = global.Rx,\n      BehaviorSubject = _global$Rx.BehaviorSubject,\n      Observable = _global$Rx.Observable,\n      _global$common = global.common,\n      common = _global$common === undefined ? { init: [] } : _global$common;\n\n  // the first script tag here is to proxy jQuery\n  // We use the same jQuery on the main window but we change the\n  // context to that of the iframe.\n\n  var libraryIncludes = '\\n<script>\\n  window.loopProtect = parent.loopProtect;\\n  window.__err = null;\\n  window.loopProtect.hit = function(line) {\\n    window.__err = new Error(\\n      \\'Potential infinite loop at line \\' +\\n      line +\\n      \\'. To disable loop protection, write:\\' +\\n      \\' \\\\n\\\\/\\\\/ noprotect\\\\nas the first\\' +\\n      \\' line. Beware that if you do have an infinite loop in your code\\' +\\n      \\' this will crash your browser.\\'\\n    );\\n  };\\n</script>\\n<link\\n  rel=\\'stylesheet\\'\\n  href=\\'//cdn.bootcss.com/animate.css/3.2.0/animate.min.css\\'\\n  />\\n<link\\n  rel=\\'stylesheet\\'\\n  href=\\'//cdn.bootcss.com/bootstrap/3.3.1/css/bootstrap.min.css\\'\\n  />\\n\\n<link\\n  rel=\\'stylesheet\\'\\n  href=\\'//cdn.bootcss.com/font-awesome/4.2.0/css/font-awesome.min.css\\'\\n  />\\n<style>\\n  body { padding: 0px 3px 0px 3px; }\\n</style>\\n  ';\n  var codeDisabledError = '\\n    <script>\\n      window.__err = new Error(\\'code has been disabled\\');\\n    </script>\\n  ';\n\n  var iFrameScript$ = common.getScriptContent$('/js/iFrameScripts-b55595ec35.js').shareReplay();\n  var jQueryScript$ = common.getScriptContent$('/bower_components/jquery/dist/jquery.js').shareReplay();\n\n  // behavior subject allways remembers the last value\n  // we use this to determine if runPreviewTest$ is defined\n  // and prime it with false\n  common.previewReady$ = new BehaviorSubject(false);\n\n  // These should be set up in the preview window\n  // if this error is seen it is because the function tried to run\n  // before the iframe has completely loaded\n  common.runPreviewTests$ = common.checkPreview$ = function () {\n    return Observable.throw(new Error('Preview not fully loaded'));\n  };\n\n  common.updatePreview$ = function updatePreview$() {\n    var code = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';\n\n    var preview = common.getIframe('preview');\n\n    return Observable.combineLatest(iFrameScript$, jQueryScript$, function (iframe, jQuery) {\n      return {\n        iframeScript: '<script>' + iframe + '</script>',\n        jQuery: '<script>' + jQuery + '</script>'\n      };\n    }).first().flatMap(function (_ref) {\n      var iframeScript = _ref.iframeScript,\n          jQuery = _ref.jQuery;\n\n      // we make sure to override the last value in the\n      // subject to false here.\n      common.previewReady$.onNext(false);\n      preview.open();\n      preview.write(libraryIncludes + jQuery + (common.shouldRun() ? code : codeDisabledError) + '<!-- -->' + iframeScript);\n      preview.close();\n      // now we filter false values and wait for the first true\n      return common.previewReady$.filter(function (ready) {\n        return ready;\n      }).first()\n      // the delay here is to give code within the iframe\n      // control to run\n      .delay(400);\n    }).map(function () {\n      return code;\n    });\n  };\n\n  return common;\n}(window);\n'use strict';\n\nwindow.common = function (global) {\n  var _global$Rx = global.Rx,\n      Subject = _global$Rx.Subject,\n      Observable = _global$Rx.Observable,\n      CodeMirror = global.CodeMirror,\n      emmetCodeMirror = global.emmetCodeMirror,\n      _global$common = global.common,\n      common = _global$common === undefined ? { init: [] } : _global$common;\n  var _common$challengeType = common.challengeType,\n      challengeType = _common$challengeType === undefined ? '0' : _common$challengeType,\n      challengeTypes = common.challengeTypes;\n\n\n  if (!CodeMirror || challengeType === challengeTypes.BASEJUMP || challengeType === challengeTypes.ZIPLINE || challengeType === challengeTypes.VIDEO || challengeType === challengeTypes.STEP || challengeType === challengeTypes.HIKES) {\n    common.editor = {};\n    return common;\n  }\n\n  var editor = CodeMirror.fromTextArea(document.getElementById('codeEditor'), {\n    lint: true,\n    lineNumbers: true,\n    mode: 'javascript',\n    theme: 'monokai',\n    runnable: true,\n    matchBrackets: true,\n    autoCloseBrackets: true,\n    scrollbarStyle: 'null',\n    lineWrapping: true,\n    gutters: ['CodeMirror-lint-markers']\n  });\n\n  editor.setSize('100%', 'auto');\n\n  common.editorExecute$ = new Subject();\n  common.editorKeyUp$ = Observable.fromEventPattern(function (handler) {\n    return editor.on('keyup', handler);\n  }, function (handler) {\n    return editor.off('keyup', handler);\n  });\n\n  editor.setOption('extraKeys', {\n    Tab: function Tab(cm) {\n      if (cm.somethingSelected()) {\n        cm.indentSelection('add');\n      } else {\n        var spaces = Array(cm.getOption('indentUnit') + 1).join(' ');\n        cm.replaceSelection(spaces);\n      }\n    },\n    'Shift-Tab': function ShiftTab(cm) {\n      if (cm.somethingSelected()) {\n        cm.indentSelection('subtract');\n      } else {\n        var spaces = Array(cm.getOption('indentUnit') + 1).join(' ');\n        cm.replaceSelection(spaces);\n      }\n    },\n    'Ctrl-Enter': function CtrlEnter() {\n      common.editorExecute$.onNext();\n      return false;\n    },\n    'Cmd-Enter': function CmdEnter() {\n      common.editorExecute$.onNext();\n      return false;\n    }\n  });\n\n  var info = editor.getScrollInfo();\n\n  var after = editor.charCoords({\n    line: editor.getCursor().line + 1,\n    ch: 0\n  }, 'local').top;\n\n  if (info.top + info.clientHeight < after) {\n    editor.scrollTo(null, after - info.clientHeight + 3);\n  }\n\n  if (emmetCodeMirror) {\n    emmetCodeMirror(editor, {\n      'Cmd-E': 'emmet.expand_abbreviation',\n      Tab: 'emmet.expand_abbreviation_with_tab',\n      Enter: 'emmet.insert_formatted_line_break_only'\n    });\n  }\n  common.init.push(function () {\n    var editorValue = void 0;\n    if (common.codeUri.isAlive()) {\n      editorValue = common.codeUri.parse();\n    } else {\n      editorValue = common.codeStorage.isAlive(common.challengeName) ? common.codeStorage.getStoredValue(common.challengeName) : common.seed;\n    }\n\n    editor.setValue(common.replaceSafeTags(editorValue));\n    editor.refresh();\n  });\n\n  common.editor = editor;\n\n  return common;\n}(window);\n'use strict';\n\nwindow.common = function (global) {\n  var Observable = global.Rx.Observable,\n      _global$common = global.common,\n      common = _global$common === undefined ? { init: [] } : _global$common;\n\n\n  var detectFunctionCall = /function\\s*?\\(|function\\s+\\w+\\s*?\\(/gi;\n  var detectUnsafeJQ = /\\$\\s*?\\(\\s*?\\$\\s*?\\)/gi;\n  var detectUnsafeConsoleCall = /if\\s\\(null\\)\\sconsole\\.log\\(1\\);/gi;\n\n  common.detectUnsafeCode$ = function detectUnsafeCode$(code) {\n    var openingComments = code.match(/\\/\\*/gi);\n    var closingComments = code.match(/\\*\\//gi);\n\n    // checks if the number of opening comments(/*) matches the number of\n    // closing comments(*/)\n    if (openingComments && (!closingComments || openingComments.length > closingComments.length)) {\n\n      return Observable.throw(new Error('SyntaxError: Unfinished multi-line comment'));\n    }\n\n    if (code.match(detectUnsafeJQ)) {\n      return Observable.throw(new Error('Unsafe $($)'));\n    }\n\n    if (code.match(/function/g) && !code.match(detectFunctionCall)) {\n      return Observable.throw(new Error('SyntaxError: Unsafe or unfinished function declaration'));\n    }\n\n    if (code.match(detectUnsafeConsoleCall)) {\n      return Observable.throw(new Error('Invalid if (null) console.log(1); detected'));\n    }\n\n    return Observable.just(code);\n  };\n\n  return common;\n}(window);\n'use strict';\n\nwindow.common = function (_ref) {\n  var $ = _ref.$,\n      _ref$common = _ref.common,\n      common = _ref$common === undefined ? { init: [] } : _ref$common;\n\n\n  common.displayTestResults = function displayTestResults() {\n    var data = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];\n\n    $('#testSuite').children().remove();\n    data.forEach(function (_ref2) {\n      var _ref2$err = _ref2.err,\n          err = _ref2$err === undefined ? false : _ref2$err,\n          _ref2$text = _ref2.text,\n          text = _ref2$text === undefined ? '' : _ref2$text;\n\n      var iconClass = err ? '\"ion-close-circled big-error-icon\"' : '\"ion-checkmark-circled big-success-icon\"';\n\n      $('<div></div>').html('\\n        <div class=\\'row\\'>\\n          <div class=\\'col-xs-2 text-center\\'>\\n            <i class=' + iconClass + '></i>\\n          </div>\\n          <div class=\\'col-xs-10 test-output\\'>\\n            ' + text.split('message: ').pop().replace(/\\'\\);/g, '') + '\\n          </div>\\n          <div class=\\'ten-pixel-break\\'/>\\n        </div>\\n      ').appendTo($('#testSuite'));\n    });\n\n    return data;\n  };\n\n  return common;\n}(window);\n'use strict';\n\nwindow.common = function (global) {\n  var ga = global.ga,\n      _global$common = global.common,\n      common = _global$common === undefined ? { init: [] } : _global$common;\n  var addLoopProtect = common.addLoopProtect,\n      getJsFromHtml = common.getJsFromHtml,\n      detectUnsafeCode$ = common.detectUnsafeCode$,\n      updatePreview$ = common.updatePreview$,\n      challengeType = common.challengeType,\n      challengeTypes = common.challengeTypes;\n\n\n  common.executeChallenge$ = function executeChallenge$() {\n    var code = common.editor.getValue();\n    var originalCode = code;\n    var head = common.arrayToNewLineString(common.head);\n    var tail = common.arrayToNewLineString(common.tail);\n    var combinedCode = head + code + tail;\n\n    ga('send', 'event', 'Challenge', 'ran-code', common.gaName);\n\n    // run checks for unsafe code\n    return detectUnsafeCode$(code)\n    // add head and tail and detect loops\n    .map(function () {\n      if (challengeType !== challengeTypes.HTML) {\n        return '<script>;' + addLoopProtect(combinedCode) + '/**/</script>';\n      }\n\n      return addLoopProtect(combinedCode);\n    }).flatMap(function (code) {\n      return updatePreview$(code);\n    }).flatMap(function (code) {\n      var output = void 0;\n\n      if (challengeType === challengeTypes.HTML && common.hasJs(code)) {\n        output = common.getJsOutput(getJsFromHtml(code));\n      } else if (challengeType !== challengeTypes.HTML) {\n        output = common.getJsOutput(addLoopProtect(combinedCode));\n      }\n\n      return common.runPreviewTests$({\n        tests: common.tests.slice(),\n        originalCode: originalCode,\n        output: output\n      });\n    });\n  };\n\n  return common;\n}(window);\n'use strict';\n\nwindow.common = function (global) {\n  var CodeMirror = global.CodeMirror,\n      doc = global.document,\n      _global$common = global.common,\n      common = _global$common === undefined ? { init: [] } : _global$common;\n  var challengeTypes = common.challengeTypes,\n      _common$challengeType = common.challengeType,\n      challengeType = _common$challengeType === undefined ? '0' : _common$challengeType;\n\n\n  if (!CodeMirror || challengeType !== challengeTypes.JS && challengeType !== challengeTypes.BONFIRE) {\n    common.updateOutputDisplay = function () {};\n    common.appendToOutputDisplay = function () {};\n    return common;\n  }\n\n  var codeOutput = CodeMirror.fromTextArea(doc.getElementById('codeOutput'), {\n    lineNumbers: false,\n    mode: 'text',\n    theme: 'monokai',\n    readOnly: 'nocursor',\n    lineWrapping: true\n  });\n\n  codeOutput.setValue('/**\\n  * Your output will go here.\\n  * Any console.log() -type\\n  * statements will appear in\\n  * your browser\\'s DevTools\\n  * JavaScript console.\\n  */');\n\n  codeOutput.setSize('100%', '100%');\n\n  common.updateOutputDisplay = function updateOutputDisplay() {\n    var str = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';\n\n    if (typeof str !== 'string') {\n      str = JSON.stringify(str);\n    }\n    codeOutput.setValue(str);\n    return str;\n  };\n\n  common.appendToOutputDisplay = function appendToOutputDisplay() {\n    var str = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';\n\n    codeOutput.setValue(codeOutput.getValue() + str);\n    return str;\n  };\n\n  return common;\n}(window);\n'use strict';\n\nwindow.common = function (_ref) {\n  var _ref$common = _ref.common,\n      common = _ref$common === undefined ? { init: [] } : _ref$common;\n\n\n  common.lockTop = function lockTop() {\n    var magiVal;\n\n    if ($(window).width() >= 990) {\n      if ($('.editorScrollDiv').html()) {\n\n        magiVal = $(window).height() - $('.navbar').height();\n\n        if (magiVal < 0) {\n          magiVal = 0;\n        }\n        $('.editorScrollDiv').css('height', magiVal - 50 + 'px');\n      }\n\n      magiVal = $(window).height() - $('.navbar').height();\n\n      if (magiVal < 0) {\n        magiVal = 0;\n      }\n\n      $('.scroll-locker').css('min-height', $('.editorScrollDiv').height()).css('height', magiVal - 50);\n    } else {\n      $('.editorScrollDiv').css('max-height', 500 + 'px');\n\n      $('.scroll-locker').css('position', 'inherit').css('top', 'inherit').css('width', '100%').css('max-height', '100%');\n    }\n  };\n\n  common.init.push(function ($) {\n    // fakeiphone positioning hotfix\n    if ($('.iphone-position').html() || $('.iphone').html()) {\n      var startIphonePosition = parseInt($('.iphone-position').css('top').replace('px', ''), 10);\n\n      var startIphone = parseInt($('.iphone').css('top').replace('px', ''), 10);\n\n      $(window).on('scroll', function () {\n        var courseHeight = $('.courseware-height').height();\n        var courseTop = $('.courseware-height').offset().top;\n        var windowScrollTop = $(window).scrollTop();\n        var phoneHeight = $('.iphone-position').height();\n\n        if (courseHeight + courseTop - windowScrollTop - phoneHeight <= 0) {\n          $('.iphone-position').css('top', startIphonePosition + courseHeight + courseTop - windowScrollTop - phoneHeight);\n\n          $('.iphone').css('top', startIphonePosition + courseHeight + courseTop - windowScrollTop - phoneHeight + 120);\n        } else {\n          $('.iphone-position').css('top', startIphonePosition);\n          $('.iphone').css('top', startIphone);\n        }\n      });\n    }\n\n    if ($('.scroll-locker').html()) {\n\n      if ($('.scroll-locker').html()) {\n        common.lockTop();\n        $(window).on('resize', function () {\n          common.lockTop();\n        });\n        $(window).on('scroll', function () {\n          common.lockTop();\n        });\n      }\n\n      var execInProgress = false;\n\n      // why is this not $???\n      document.getElementById('scroll-locker').addEventListener('previewUpdateSpy', function (e) {\n        if (execInProgress) {\n          return null;\n        }\n        execInProgress = true;\n        return setTimeout(function () {\n          if ($($('.scroll-locker').children()[0]).height() - 800 > e.detail) {\n            $('.scroll-locker').scrollTop(e.detail);\n          } else {\n            var scrollTop = $($('.scroll-locker').children()[0]).height();\n\n            $('.scroll-locker').animate({ scrollTop: scrollTop }, 175);\n          }\n          execInProgress = false;\n        }, 750);\n      }, false);\n    }\n  });\n\n  return common;\n}(window);\n'use strict';\n\nwindow.common = function (_ref) {\n  var _ref$common = _ref.common,\n      common = _ref$common === undefined ? { init: [] } : _ref$common;\n\n  common.init.push(function ($) {\n    $('#report-issue').on('click', function () {\n      var textMessage = ['Challenge [', common.challengeName || window.location.pathname, '](', window.location.href, ') has an issue.\\n', 'User Agent is: <code>', navigator.userAgent, '</code>.\\n', 'Please describe how to reproduce this issue, and include ', 'links to screenshots if possible.\\n\\n'].join('');\n\n      if (common.editor && typeof common.editor.getValue === 'function' && common.editor.getValue().trim()) {\n        var type;\n        switch (common.challengeType) {\n          case common.challengeTypes.HTML:\n            type = 'html';\n            break;\n          case common.challengeTypes.JS:\n          case common.challengeTypes.BONFIRE:\n            type = 'javascript';\n            break;\n          default:\n            type = '';\n        }\n\n        textMessage += ['My code:\\n```', type, '\\n', common.editor.getValue(), '\\n```\\n\\n'].join('');\n      }\n\n      textMessage = encodeURIComponent(textMessage);\n\n      $('#issue-modal').modal('hide');\n      window.open('https://github.com/freecodecampchina/freecodecamp.cn/issues/new?&body=' + textMessage, '_blank');\n    });\n  });\n\n  return common;\n}(window);\n\"use strict\";\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nfunction _objectWithoutProperties(obj, keys) { var target = {}; for (var i in obj) { if (keys.indexOf(i) >= 0) continue; if (!Object.prototype.hasOwnProperty.call(obj, i)) continue; target[i] = obj[i]; } return target; }\n\nwindow.common = function (global) {\n  var Observable = global.Rx.Observable,\n      chai = global.chai,\n      _global$common = global.common,\n      common = _global$common === undefined ? { init: [] } : _global$common;\n\n\n  common.runTests$ = function runTests$(_ref) {\n    var code = _ref.code,\n        originalCode = _ref.originalCode,\n        userTests = _ref.userTests,\n        rest = _objectWithoutProperties(_ref, [\"code\", \"originalCode\", \"userTests\"]);\n\n    return Observable.from(userTests).map(function (test) {\n\n      /* eslint-disable no-unused-vars */\n      var assert = chai.assert;\n      var editor = {\n        getValue: function getValue() {\n          return originalCode;\n        }\n      };\n      /* eslint-enable no-unused-vars */\n\n      try {\n        if (test) {\n          /* eslint-disable no-eval  */\n          eval(common.reassembleTest(code, test));\n          /* eslint-enable no-eval */\n        }\n      } catch (e) {\n        test.err = e.message;\n      }\n\n      return test;\n    }).toArray().map(function (tests) {\n      return _extends({}, rest, { tests: tests });\n    });\n  };\n\n  return common;\n}(window);\n'use strict';\n\nwindow.common = function (global) {\n  var $ = global.$,\n      moment = global.moment,\n      _global$ga = global.ga,\n      ga = _global$ga === undefined ? function () {} : _global$ga,\n      _global$common = global.common,\n      common = _global$common === undefined ? { init: [] } : _global$common;\n\n\n  function submitChallengeHandler(e) {\n    e.preventDefault();\n\n    var solution = common.editor.getValue();\n\n    $('#submit-challenge').attr('disabled', 'true').removeClass('btn-primary').addClass('btn-warning disabled');\n\n    var $checkmarkContainer = $('#checkmark-container');\n    $checkmarkContainer.css({ height: $checkmarkContainer.innerHeight() });\n\n    $('#challenge-checkmark').addClass('zoomOutUp')\n    // .removeClass('zoomInDown')\n    .delay(1000).queue(function (next) {\n      $(this).replaceWith('<div id=\"challenge-spinner\" ' + 'class=\"animated zoomInUp inner-circles-loader\">' + 'submitting...</div>');\n      next();\n    });\n\n    var timezone = 'UTC';\n    try {\n      timezone = moment.tz.guess();\n    } catch (err) {\n      err.message = '\\n          known bug, see: https://github.com/moment/moment-timezone/issues/294:\\n          ' + err.message + '\\n        ';\n      console.error(err);\n    }\n    var data = JSON.stringify({\n      id: common.challengeId,\n      name: common.challengeName,\n      challengeType: +common.challengeType,\n      solution: solution,\n      timezone: timezone\n    });\n\n    $.ajax({\n      url: '/completed-challenge/',\n      type: 'POST',\n      data: data,\n      contentType: 'application/json',\n      dataType: 'json'\n    }).success(function (res) {\n      if (res) {\n        window.location = '/challenges/next-challenge?id=' + common.challengeId;\n      }\n    }).fail(function () {\n      window.location.replace(window.location.href);\n    });\n  }\n\n  common.showCompletion = function showCompletion() {\n\n    ga('send', 'event', 'Challenge', 'solved', common.gaName, true);\n\n    $('#complete-courseware-dialog').modal('show');\n    $('#complete-courseware-dialog .modal-header').click();\n\n    $('#submit-challenge').off('click');\n    $('#submit-challenge').on('click', submitChallengeHandler);\n  };\n\n  return common;\n}(window);\n'use strict';\n\nwindow.common = function (_ref) {\n  var $ = _ref.$,\n      _ref$common = _ref.common,\n      common = _ref$common === undefined ? { init: [] } : _ref$common;\n\n  var stepClass = '.challenge-step';\n  var prevBtnClass = '.challenge-step-btn-prev';\n  var nextBtnClass = '.challenge-step-btn-next';\n  var actionBtnClass = '.challenge-step-btn-action';\n  var finishBtnClass = '.challenge-step-btn-finish';\n  var submitBtnId = '#challenge-step-btn-submit';\n  var submitModalId = '#challenge-step-modal';\n\n  function getPreviousStep($challengeSteps) {\n    var $prevStep = false;\n    var prevStepIndex = 0;\n    $challengeSteps.each(function (index) {\n      var $step = $(this);\n      if (!$step.hasClass('hidden')) {\n        prevStepIndex = index - 1;\n      }\n    });\n\n    $prevStep = $challengeSteps[prevStepIndex];\n\n    return $prevStep;\n  }\n\n  function getNextStep($challengeSteps) {\n    var length = $challengeSteps.length;\n    var $nextStep = false;\n    var nextStepIndex = 0;\n    $challengeSteps.each(function (index) {\n      var $step = $(this);\n      if (!$step.hasClass('hidden') && index + 1 !== length) {\n        nextStepIndex = index + 1;\n      }\n    });\n\n    $nextStep = $challengeSteps[nextStepIndex];\n\n    return $nextStep;\n  }\n\n  function handlePrevStepClick(e) {\n    e.preventDefault();\n    var prevStep = getPreviousStep($(stepClass));\n    $(this).parent().parent().removeClass('slideInLeft slideInRight').addClass('animated fadeOutRight fast-animation').delay(250).queue(function (prev) {\n      $(this).addClass('hidden');\n      if (prevStep) {\n        $(prevStep).removeClass('hidden').removeClass('fadeOutLeft fadeOutRight').addClass('animated slideInLeft fast-animation').delay(500).queue(function (prev) {\n          prev();\n        });\n      }\n      prev();\n    });\n  }\n\n  function handleNextStepClick(e) {\n    e.preventDefault();\n    var nextStep = getNextStep($(stepClass));\n    $(this).parent().parent().removeClass('slideInRight slideInLeft').addClass('animated fadeOutLeft fast-animation').delay(250).queue(function (next) {\n      $(this).addClass('hidden');\n      if (nextStep) {\n        $(nextStep).removeClass('hidden').removeClass('fadeOutRight fadeOutLeft').addClass('animated slideInRight fast-animation').delay(500).queue(function (next) {\n          next();\n        });\n      }\n      next();\n    });\n  }\n\n  function handleActionClick(e) {\n    var props = common.challengeSeed[0] || { stepIndex: [] };\n\n    var $el = $(this);\n    var index = +$el.attr('id');\n    var propIndex = props.stepIndex.indexOf(index);\n\n    if (propIndex === -1) {\n      return $el.parent().find('.disabled').removeClass('disabled');\n    }\n\n    // an API action\n    // prevent link from opening\n    e.preventDefault();\n    var prop = props.properties[propIndex];\n    var api = props.apis[propIndex];\n    if (common[prop]) {\n      return $el.parent().find('.disabled').removeClass('disabled');\n    }\n    return $.post(api).done(function (data) {\n      // assume a boolean indicates passing\n      if (typeof data === 'boolean') {\n        return $el.parent().find('.disabled').removeClass('disabled');\n      }\n      // assume api returns string when fails\n      return $el.parent().find('.disabled').replaceWith('<p>' + data + '</p>');\n    }).fail(function () {\n      console.log('failed');\n    });\n  }\n\n  function handleFinishClick(e) {\n    e.preventDefault();\n    $(submitModalId).modal('show');\n    $(submitModalId + '.modal-header').click();\n    $(submitBtnId).click(handleSubmitClick);\n  }\n\n  function handleSubmitClick(e) {\n    e.preventDefault();\n\n    $('#submit-challenge').attr('disabled', 'true').removeClass('btn-primary').addClass('btn-warning disabled');\n\n    var $checkmarkContainer = $('#checkmark-container');\n    $checkmarkContainer.css({ height: $checkmarkContainer.innerHeight() });\n\n    $('#challenge-checkmark').addClass('zoomOutUp').delay(1000).queue(function (next) {\n      $(this).replaceWith('<div id=\"challenge-spinner\" ' + 'class=\"animated zoomInUp inner-circles-loader\">' + 'submitting...</div>');\n      next();\n    });\n\n    $.ajax({\n      url: '/completed-challenge/',\n      type: 'POST',\n      data: JSON.stringify({\n        id: common.challengeId,\n        name: common.challengeName,\n        challengeType: +common.challengeType\n      }),\n      contentType: 'application/json',\n      dataType: 'json'\n    }).success(function (res) {\n      if (res) {\n        window.location = '/challenges/next-challenge?id=' + common.challengeId;\n      }\n    }).fail(function () {\n      window.location.replace(window.location.href);\n    });\n  }\n\n  common.init.push(function ($) {\n    if (common.challengeType !== '7') {\n      return null;\n    }\n\n    $(prevBtnClass).click(handlePrevStepClick);\n    $(nextBtnClass).click(handleNextStepClick);\n    $(actionBtnClass).click(handleActionClick);\n    $(finishBtnClass).click(handleFinishClick);\n    return null;\n  });\n\n  return common;\n}(window);\n'use strict';\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nfunction _objectWithoutProperties(obj, keys) { var target = {}; for (var i in obj) { if (keys.indexOf(i) >= 0) continue; if (!Object.prototype.hasOwnProperty.call(obj, i)) continue; target[i] = obj[i]; } return target; }\n\n$(document).ready(function () {\n  var common = window.common;\n  var Observable = window.Rx.Observable;\n  var addLoopProtect = common.addLoopProtect,\n      challengeName = common.challengeName,\n      challengeType = common.challengeType,\n      challengeTypes = common.challengeTypes;\n\n\n  common.init.forEach(function (init) {\n    init($);\n  });\n\n  // only run if editor present\n  if (common.editor.getValue) {\n    var code$ = common.editorKeyUp$.debounce(750).map(function () {\n      return common.editor.getValue();\n    }).distinctUntilChanged().shareReplay();\n\n    // update storage\n    code$.subscribe(function (code) {\n      common.codeStorage.updateStorage(common.challengeName, code);\n      common.codeUri.querify(code);\n    }, function (err) {\n      return console.error(err);\n    });\n\n    code$\n    // only run for HTML\n    .filter(function () {\n      return common.challengeType === challengeTypes.HTML;\n    }).flatMap(function (code) {\n      return common.detectUnsafeCode$(code).map(function () {\n        var combinedCode = common.head + code + common.tail;\n\n        return addLoopProtect(combinedCode);\n      }).flatMap(function (code) {\n        return common.updatePreview$(code);\n      }).flatMap(function () {\n        return common.checkPreview$({ code: code });\n      }).catch(function (err) {\n        return Observable.just({ err: err });\n      });\n    }).subscribe(function (_ref) {\n      var err = _ref.err;\n\n      if (err) {\n        console.error(err);\n        return common.updatePreview$('\\n              <h1>' + err + '</h1>\\n            ').subscribe(function () {});\n      }\n      return null;\n    }, function (err) {\n      return console.error(err);\n    });\n  }\n\n  common.resetBtn$.doOnNext(function () {\n    common.editor.setValue(common.replaceSafeTags(common.seed));\n  }).flatMap(function () {\n    return common.executeChallenge$().catch(function (err) {\n      return Observable.just({ err: err });\n    });\n  }).subscribe(function (_ref2) {\n    var err = _ref2.err,\n        output = _ref2.output,\n        originalCode = _ref2.originalCode;\n\n    if (err) {\n      console.error(err);\n      return common.updateOutputDisplay('' + err);\n    }\n    common.codeStorage.updateStorage(challengeName, originalCode);\n    common.codeUri.querify(originalCode);\n    common.updateOutputDisplay(output);\n    return null;\n  }, function (err) {\n    if (err) {\n      console.error(err);\n    }\n    common.updateOutputDisplay('' + err);\n  });\n\n  Observable.merge(common.editorExecute$, common.submitBtn$).flatMap(function () {\n    common.appendToOutputDisplay('\\n// testing challenge...');\n    return common.executeChallenge$().map(function (_ref3) {\n      var tests = _ref3.tests,\n          rest = _objectWithoutProperties(_ref3, ['tests']);\n\n      var solved = tests.every(function (test) {\n        return !test.err;\n      });\n      return _extends({}, rest, { tests: tests, solved: solved });\n    }).catch(function (err) {\n      return Observable.just({ err: err });\n    });\n  }).subscribe(function (_ref4) {\n    var err = _ref4.err,\n        solved = _ref4.solved,\n        output = _ref4.output,\n        tests = _ref4.tests;\n\n    if (err) {\n      console.error(err);\n      if (common.challengeType === common.challengeTypes.HTML) {\n        return common.updatePreview$('\\n              <h1>' + err + '</h1>\\n            ').first().subscribe(function () {});\n      }\n      return common.updateOutputDisplay('' + err);\n    }\n    common.updateOutputDisplay(output);\n    common.displayTestResults(tests);\n    if (solved) {\n      common.showCompletion();\n    }\n    return null;\n  }, function (_ref5) {\n    var err = _ref5.err;\n\n    console.error(err);\n    common.updateOutputDisplay('' + err);\n  });\n\n  // initial challenge run to populate tests\n  if (challengeType === challengeTypes.HTML) {\n    var $preview = $('#preview');\n    return Observable.fromCallback($preview.ready, $preview)().delay(500).flatMap(function () {\n      return common.executeChallenge$();\n    }).catch(function (err) {\n      return Observable.just({ err: err });\n    }).subscribe(function (_ref6) {\n      var err = _ref6.err,\n          tests = _ref6.tests;\n\n      if (err) {\n        console.error(err);\n        if (common.challengeType === common.challengeTypes.HTML) {\n          return common.updatePreview$('\\n                <h1>' + err + '</h1>\\n              ').subscribe(function () {});\n        }\n        return common.updateOutputDisplay('' + err);\n      }\n      common.displayTestResults(tests);\n      return null;\n    }, function (_ref7) {\n      var err = _ref7.err;\n\n      console.error(err);\n    });\n  }\n\n  if (challengeType === challengeTypes.BONFIRE || challengeType === challengeTypes.JS) {\n    return Observable.just({}).delay(500).flatMap(function () {\n      return common.executeChallenge$();\n    }).catch(function (err) {\n      return Observable.just({ err: err });\n    }).subscribe(function (_ref8) {\n      var err = _ref8.err,\n          originalCode = _ref8.originalCode,\n          tests = _ref8.tests;\n\n      if (err) {\n        console.error(err);\n        return common.updateOutputDisplay('' + err);\n      }\n      common.codeStorage.updateStorage(challengeName, originalCode);\n      common.displayTestResults(tests);\n      return null;\n    }, function (err) {\n      console.error(err);\n      common.updateOutputDisplay('' + err);\n    });\n  }\n  return null;\n});\n//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImluaXQuanMiLCJiaW5kaW5ncy5qcyIsImNvZGUtc3RvcmFnZS5qcyIsImNvZGUtdXJpLmpzIiwiYWRkLWxvb3AtcHJvdGVjdC5qcyIsImdldC1pZnJhbWUuanMiLCJ1cGRhdGUtcHJldmlldy5qcyIsImNyZWF0ZS1lZGl0b3IuanMiLCJkZXRlY3QtdW5zYWZlLWNvZGUtc3RyZWFtLmpzIiwiZGlzcGxheS10ZXN0LXJlc3VsdHMuanMiLCJleGVjdXRlLWNoYWxsZW5nZS1zdHJlYW0uanMiLCJvdXRwdXQtZGlzcGxheS5qcyIsInBob25lLXNjcm9sbC1sb2NrLmpzIiwicmVwb3J0LWlzc3VlLmpzIiwicnVuLXRlc3RzLXN0cmVhbS5qcyIsInNob3ctY29tcGxldGlvbi5qcyIsInN0ZXAtY2hhbGxlbmdlLmpzIiwiZW5kLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQ3ZIQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQzNLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUNsREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQzVIQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUNwQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQ3pCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FDaEVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FDdEdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FDdkNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FDM0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUNwREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUNoREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQzlGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUNuQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FDL0NBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUN0RUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQzdKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsImZpbGUiOiJjb21tb25GcmFtZXdvcmsuanMiLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbndpbmRvdy5jb21tb24gPSBmdW5jdGlvbiAoZ2xvYmFsKSB7XG4gIC8vIGNvbW1vbiBuYW1lc3BhY2VcbiAgLy8gYWxsIGNsYXNzZXMgc2hvdWxkIGJlIHN0b3JlZCBoZXJlXG4gIC8vIGNhbGxlZCBhdCB0aGUgYmVnaW5uaW5nIG9mIGRvbSByZWFkeVxuICB2YXIgX2dsb2JhbCRSeCA9IGdsb2JhbC5SeCxcbiAgICAgIERpc3Bvc2FibGUgPSBfZ2xvYmFsJFJ4LkRpc3Bvc2FibGUsXG4gICAgICBPYnNlcnZhYmxlID0gX2dsb2JhbCRSeC5PYnNlcnZhYmxlLFxuICAgICAgY29uZmlnID0gX2dsb2JhbCRSeC5jb25maWcsXG4gICAgICBfZ2xvYmFsJGNvbW1vbiA9IGdsb2JhbC5jb21tb24sXG4gICAgICBjb21tb24gPSBfZ2xvYmFsJGNvbW1vbiA9PT0gdW5kZWZpbmVkID8geyBpbml0OiBbXSB9IDogX2dsb2JhbCRjb21tb247XG5cblxuICBjb25maWcubG9uZ1N0YWNrU3VwcG9ydCA9IHRydWU7XG4gIGNvbW1vbi5oZWFkID0gY29tbW9uLmhlYWQgfHwgW107XG4gIGNvbW1vbi50YWlsID0gY29tbW9uLnRhaWwgfHwgW107XG4gIGNvbW1vbi5zYWx0ID0gTWF0aC5yYW5kb20oKTtcblxuICBjb21tb24uY2hhbGxlbmdlVHlwZXMgPSB7XG4gICAgSFRNTDogJzAnLFxuICAgIEpTOiAnMScsXG4gICAgVklERU86ICcyJyxcbiAgICBaSVBMSU5FOiAnMycsXG4gICAgQkFTRUpVTVA6ICc0JyxcbiAgICBCT05GSVJFOiAnNScsXG4gICAgSElLRVM6ICc2JyxcbiAgICBTVEVQOiAnNydcbiAgfTtcblxuICBjb21tb24uYXJyYXlUb05ld0xpbmVTdHJpbmcgPSBmdW5jdGlvbiBhcnJheVRvTmV3TGluZVN0cmluZyhzZWVkRGF0YSkge1xuICAgIHNlZWREYXRhID0gQXJyYXkuaXNBcnJheShzZWVkRGF0YSkgPyBzZWVkRGF0YSA6IFtzZWVkRGF0YV07XG4gICAgcmV0dXJuIHNlZWREYXRhLnJlZHVjZShmdW5jdGlvbiAoc2VlZCwgbGluZSkge1xuICAgICAgcmV0dXJuICcnICsgc2VlZCArIGxpbmUgKyAnXFxuJztcbiAgICB9LCAnJyk7XG4gIH07XG5cbiAgY29tbW9uLnNlZWQgPSBjb21tb24uYXJyYXlUb05ld0xpbmVTdHJpbmcoY29tbW9uLmNoYWxsZW5nZVNlZWQpO1xuXG4gIGNvbW1vbi5yZXBsYWNlU2NyaXB0VGFncyA9IGZ1bmN0aW9uIHJlcGxhY2VTY3JpcHRUYWdzKHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlLnJlcGxhY2UoLzxzY3JpcHQ+L2dpLCAnZmNjc3MnKS5yZXBsYWNlKC88XFwvc2NyaXB0Pi9naSwgJ2ZjY2VzJyk7XG4gIH07XG5cbiAgY29tbW9uLnJlcGxhY2VTYWZlVGFncyA9IGZ1bmN0aW9uIHJlcGxhY2VTYWZlVGFncyh2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZS5yZXBsYWNlKC9mY2Nzcy9naSwgJzxzY3JpcHQ+JykucmVwbGFjZSgvZmNjZXMvZ2ksICc8L3NjcmlwdD4nKTtcbiAgfTtcblxuICBjb21tb24ucmVwbGFjZUZvcm1BY3Rpb25BdHRyID0gZnVuY3Rpb24gcmVwbGFjZUZvcm1BY3Rpb24odmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWUucmVwbGFjZSgvPGZvcm1bXj5dKj4vLCBmdW5jdGlvbiAodmFsKSB7XG4gICAgICByZXR1cm4gdmFsLnJlcGxhY2UoL2FjdGlvbihcXHMqPyk9LywgJ2ZjY2ZhYSQxPScpO1xuICAgIH0pO1xuICB9O1xuXG4gIGNvbW1vbi5yZXBsYWNlRmNjZmFhQXR0ciA9IGZ1bmN0aW9uIHJlcGxhY2VGY2NmYWFBdHRyKHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlLnJlcGxhY2UoLzxmb3JtW14+XSo+LywgZnVuY3Rpb24gKHZhbCkge1xuICAgICAgcmV0dXJuIHZhbC5yZXBsYWNlKC9mY2NmYWEoXFxzKj8pPS8sICdhY3Rpb24kMT0nKTtcbiAgICB9KTtcbiAgfTtcblxuICBjb21tb24uc2NvcGVqUXVlcnkgPSBmdW5jdGlvbiBzY29wZWpRdWVyeShzdHIpIHtcbiAgICByZXR1cm4gc3RyLnJlcGxhY2UoL1xcJC9naSwgJ2okJykucmVwbGFjZSgvZG9jdW1lbnQvZ2ksICdqZG9jdW1lbnQnKS5yZXBsYWNlKC9qUXVlcnkvZ2ksICdqalF1ZXJ5Jyk7XG4gIH07XG5cbiAgY29tbW9uLnVuU2NvcGVKUXVlcnkgPSBmdW5jdGlvbiB1blNjb3BlSlF1ZXJ5KHN0cikge1xuICAgIHJldHVybiBzdHIucmVwbGFjZSgvalxcJC9naSwgJyQnKS5yZXBsYWNlKC9qZG9jdW1lbnQvZ2ksICdkb2N1bWVudCcpLnJlcGxhY2UoL2pqUXVlcnkvZ2ksICdqUXVlcnknKTtcbiAgfTtcblxuICB2YXIgY29tbWVudFJlZ2V4ID0gLyhcXC9cXCpbXihcXCpcXC8pXSpcXCpcXC8pfChbIFxcbl1cXC9cXC9bXlxcbl0qKS9nO1xuICBjb21tb24ucmVtb3ZlQ29tbWVudHMgPSBmdW5jdGlvbiByZW1vdmVDb21tZW50cyhzdHIpIHtcbiAgICByZXR1cm4gc3RyLnJlcGxhY2UoY29tbWVudFJlZ2V4LCAnJyk7XG4gIH07XG5cbiAgdmFyIGxvZ1JlZ2V4ID0gLyhjb25zb2xlXFwuW1xcd10rXFxzKlxcKC4qXFw7KS9nO1xuICBjb21tb24ucmVtb3ZlTG9ncyA9IGZ1bmN0aW9uIHJlbW92ZUxvZ3Moc3RyKSB7XG4gICAgcmV0dXJuIHN0ci5yZXBsYWNlKGxvZ1JlZ2V4LCAnJyk7XG4gIH07XG5cbiAgY29tbW9uLnJlYXNzZW1ibGVUZXN0ID0gZnVuY3Rpb24gcmVhc3NlbWJsZVRlc3QoKSB7XG4gICAgdmFyIGNvZGUgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6ICcnO1xuICAgIHZhciBfcmVmID0gYXJndW1lbnRzWzFdO1xuICAgIHZhciBsaW5lID0gX3JlZi5saW5lLFxuICAgICAgICB0ZXh0ID0gX3JlZi50ZXh0O1xuXG4gICAgdmFyIHJlZ2V4cCA9IG5ldyBSZWdFeHAoJy8vJyArIGxpbmUgKyBjb21tb24uc2FsdCk7XG4gICAgcmV0dXJuIGNvZGUucmVwbGFjZShyZWdleHAsIHRleHQpO1xuICB9O1xuXG4gIGNvbW1vbi5nZXRTY3JpcHRDb250ZW50JCA9IGZ1bmN0aW9uIGdldFNjcmlwdENvbnRlbnQkKHNjcmlwdCkge1xuICAgIHJldHVybiBPYnNlcnZhYmxlLmNyZWF0ZShmdW5jdGlvbiAob2JzZXJ2ZXIpIHtcbiAgICAgIHZhciBqcVhIUiA9ICQuZ2V0KHNjcmlwdCwgbnVsbCwgbnVsbCwgJ3RleHQnKS5zdWNjZXNzKGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICAgIG9ic2VydmVyLm9uTmV4dChkYXRhKTtcbiAgICAgICAgb2JzZXJ2ZXIub25Db21wbGV0ZWQoKTtcbiAgICAgIH0pLmZhaWwoZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgcmV0dXJuIG9ic2VydmVyLm9uRXJyb3IoZSk7XG4gICAgICB9KS5hbHdheXMoZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gb2JzZXJ2ZXIub25Db21wbGV0ZWQoKTtcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gbmV3IERpc3Bvc2FibGUoZnVuY3Rpb24gKCkge1xuICAgICAgICBqcVhIUi5hYm9ydCgpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH07XG5cbiAgdmFyIG9wZW5TY3JpcHQgPSAvXFw8XFxzP3NjcmlwdFxccz9cXD4vZ2k7XG4gIHZhciBjbG9zaW5nU2NyaXB0ID0gL1xcPFxccz9cXC9cXHM/c2NyaXB0XFxzP1xcPi9naTtcblxuICAvLyBkZXRlY3RzIGlmIHRoZXJlIGlzIEphdmFTY3JpcHQgaW4gdGhlIGZpcnN0IHNjcmlwdCB0YWdcbiAgY29tbW9uLmhhc0pzID0gZnVuY3Rpb24gaGFzSnMoY29kZSkge1xuICAgIHJldHVybiAhIWNvbW1vbi5nZXRKc0Zyb21IdG1sKGNvZGUpO1xuICB9O1xuXG4gIC8vIGdyYWJzIHRoZSBjb250ZW50IGZyb20gdGhlIGZpcnN0IHNjcmlwdCB0YWcgaW4gdGhlIGNvZGVcbiAgY29tbW9uLmdldEpzRnJvbUh0bWwgPSBmdW5jdGlvbiBnZXRKc0Zyb21IdG1sKGNvZGUpIHtcbiAgICAvLyBncmFiIHVzZXIgamF2YVNjcmlwdFxuICAgIHJldHVybiAoY29kZS5zcGxpdChvcGVuU2NyaXB0KVsxXSB8fCAnJykuc3BsaXQoY2xvc2luZ1NjcmlwdClbMF0gfHwgJyc7XG4gIH07XG5cbiAgcmV0dXJuIGNvbW1vbjtcbn0od2luZG93KTsiLCIndXNlIHN0cmljdCc7XG5cbndpbmRvdy5jb21tb24gPSBmdW5jdGlvbiAoZ2xvYmFsKSB7XG4gIHZhciAkID0gZ2xvYmFsLiQsXG4gICAgICBPYnNlcnZhYmxlID0gZ2xvYmFsLlJ4Lk9ic2VydmFibGUsXG4gICAgICBfZ2xvYmFsJGNvbW1vbiA9IGdsb2JhbC5jb21tb24sXG4gICAgICBjb21tb24gPSBfZ2xvYmFsJGNvbW1vbiA9PT0gdW5kZWZpbmVkID8geyBpbml0OiBbXSB9IDogX2dsb2JhbCRjb21tb247XG5cblxuICBjb21tb24uY3RybEVudGVyQ2xpY2tIYW5kbGVyID0gZnVuY3Rpb24gY3RybEVudGVyQ2xpY2tIYW5kbGVyKGUpIHtcbiAgICAvLyBjdHJsICsgZW50ZXIgb3IgY21kICsgZW50ZXJcbiAgICBpZiAoZS5rZXlDb2RlID09PSAxMyAmJiAoZS5tZXRhS2V5IHx8IGUuY3RybEtleSkpIHtcbiAgICAgICQoJyNjb21wbGV0ZS1jb3Vyc2V3YXJlLWRpYWxvZycpLm9mZigna2V5ZG93bicsIGN0cmxFbnRlckNsaWNrSGFuZGxlcik7XG4gICAgICBpZiAoJCgnI3N1Ym1pdC1jaGFsbGVuZ2UnKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICQoJyNzdWJtaXQtY2hhbGxlbmdlJykuY2xpY2soKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHdpbmRvdy5sb2NhdGlvbiA9ICcvY2hhbGxlbmdlcy9uZXh0LWNoYWxsZW5nZT9pZD0nICsgY29tbW9uLmNoYWxsZW5nZUlkO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICBjb21tb24uaW5pdC5wdXNoKGZ1bmN0aW9uICgkKSB7XG5cbiAgICB2YXIgJG1hcmdpbkZpeCA9ICQoJy5pbm5lck1hcmdpbkZpeCcpO1xuICAgICRtYXJnaW5GaXguY3NzKCdtaW4taGVpZ2h0JywgJG1hcmdpbkZpeC5oZWlnaHQoKSk7XG5cbiAgICBjb21tb24uc3VibWl0QnRuJCA9IE9ic2VydmFibGUuZnJvbUV2ZW50KCQoJyNzdWJtaXRCdXR0b24nKSwgJ2NsaWNrJyk7XG5cbiAgICBjb21tb24ucmVzZXRCdG4kID0gT2JzZXJ2YWJsZS5mcm9tRXZlbnQoJCgnI3Jlc2V0LWJ1dHRvbicpLCAnY2xpY2snKTtcblxuICAgIC8vIGluaXQgbW9kYWwga2V5YmluZGluZ3Mgb24gb3BlblxuICAgICQoJyNjb21wbGV0ZS1jb3Vyc2V3YXJlLWRpYWxvZycpLm9uKCdzaG93bi5icy5tb2RhbCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICQoJyNjb21wbGV0ZS1jb3Vyc2V3YXJlLWRpYWxvZycpLmtleWRvd24oY29tbW9uLmN0cmxFbnRlckNsaWNrSGFuZGxlcik7XG4gICAgfSk7XG5cbiAgICAvLyByZW1vdmUgbW9kYWwga2V5YmluZHMgb24gY2xvc2VcbiAgICAkKCcjY29tcGxldGUtY291cnNld2FyZS1kaWFsb2cnKS5vbignaGlkZGVuLmJzLm1vZGFsJywgZnVuY3Rpb24gKCkge1xuICAgICAgJCgnI2NvbXBsZXRlLWNvdXJzZXdhcmUtZGlhbG9nJykub2ZmKCdrZXlkb3duJywgY29tbW9uLmN0cmxFbnRlckNsaWNrSGFuZGxlcik7XG4gICAgfSk7XG5cbiAgICAvLyB2aWRlbyBjaGVja2xpc3QgYmluZGluZ1xuICAgICQoJy5jaGFsbGVuZ2UtbGlzdC1jaGVja2JveCcpLm9uKCdjaGFuZ2UnLCBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgY2hlY2tib3hJZCA9ICQodGhpcykucGFyZW50KCkucGFyZW50KCkuYXR0cignaWQnKTtcbiAgICAgIGlmICgkKHRoaXMpLmlzKCc6Y2hlY2tlZCcpKSB7XG4gICAgICAgICQodGhpcykucGFyZW50KCkuc2libGluZ3MoKS5jaGlsZHJlbigpLmFkZENsYXNzKCdmYWRlZCcpO1xuICAgICAgICBpZiAoIWxvY2FsU3RvcmFnZSB8fCAhbG9jYWxTdG9yYWdlW2NoZWNrYm94SWRdKSB7XG4gICAgICAgICAgbG9jYWxTdG9yYWdlW2NoZWNrYm94SWRdID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoISQodGhpcykuaXMoJzpjaGVja2VkJykpIHtcbiAgICAgICAgJCh0aGlzKS5wYXJlbnQoKS5zaWJsaW5ncygpLmNoaWxkcmVuKCkucmVtb3ZlQ2xhc3MoJ2ZhZGVkJyk7XG4gICAgICAgIGlmIChsb2NhbFN0b3JhZ2VbY2hlY2tib3hJZF0pIHtcbiAgICAgICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShjaGVja2JveElkKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuXG4gICAgJCgnLmNoZWNrbGlzdC1lbGVtZW50JykuZWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgY2hlY2tsaXN0RWxlbWVudElkID0gJCh0aGlzKS5hdHRyKCdpZCcpO1xuICAgICAgaWYgKGxvY2FsU3RvcmFnZVtjaGVja2xpc3RFbGVtZW50SWRdKSB7XG4gICAgICAgICQodGhpcykuY2hpbGRyZW4oKS5jaGlsZHJlbignbGknKS5hZGRDbGFzcygnZmFkZWQnKTtcbiAgICAgICAgJCh0aGlzKS5jaGlsZHJlbigpLmNoaWxkcmVuKCdpbnB1dCcpLnRyaWdnZXIoJ2NsaWNrJyk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyB2aWRlbyBjaGFsbGVuZ2Ugc3VibWl0XG4gICAgJCgnI25leHQtY291cnNld2FyZS1idXR0b24nKS5vbignY2xpY2snLCBmdW5jdGlvbiAoKSB7XG4gICAgICAkKCcjbmV4dC1jb3Vyc2V3YXJlLWJ1dHRvbicpLnVuYmluZCgnY2xpY2snKTtcbiAgICAgIGlmICgkKCcuc2lnbnVwLWJ0bi1uYXYnKS5sZW5ndGggPCAxKSB7XG4gICAgICAgIHZhciBkYXRhO1xuICAgICAgICB2YXIgc29sdXRpb24gPSAkKCcjcHVibGljLXVybCcpLnZhbCgpIHx8IG51bGw7XG4gICAgICAgIHZhciBnaXRodWJMaW5rID0gJCgnI2dpdGh1Yi11cmwnKS52YWwoKSB8fCBudWxsO1xuICAgICAgICBzd2l0Y2ggKGNvbW1vbi5jaGFsbGVuZ2VUeXBlKSB7XG4gICAgICAgICAgY2FzZSBjb21tb24uY2hhbGxlbmdlVHlwZXMuVklERU86XG4gICAgICAgICAgICBkYXRhID0ge1xuICAgICAgICAgICAgICBpZDogY29tbW9uLmNoYWxsZW5nZUlkLFxuICAgICAgICAgICAgICBuYW1lOiBjb21tb24uY2hhbGxlbmdlTmFtZSxcbiAgICAgICAgICAgICAgY2hhbGxlbmdlVHlwZTogK2NvbW1vbi5jaGFsbGVuZ2VUeXBlXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgJC5hamF4KHtcbiAgICAgICAgICAgICAgdXJsOiAnL2NvbXBsZXRlZC1jaGFsbGVuZ2UvJyxcbiAgICAgICAgICAgICAgdHlwZTogJ1BPU1QnLFxuICAgICAgICAgICAgICBkYXRhOiBKU09OLnN0cmluZ2lmeShkYXRhKSxcbiAgICAgICAgICAgICAgY29udGVudFR5cGU6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgICAgICAgZGF0YVR5cGU6ICdqc29uJ1xuICAgICAgICAgICAgfSkuc3VjY2VzcyhmdW5jdGlvbiAocmVzKSB7XG4gICAgICAgICAgICAgIGlmICghcmVzKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gJy9jaGFsbGVuZ2VzL25leHQtY2hhbGxlbmdlP2lkPScgKyBjb21tb24uY2hhbGxlbmdlSWQ7XG4gICAgICAgICAgICB9KS5mYWlsKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLnJlcGxhY2Uod2luZG93LmxvY2F0aW9uLmhyZWYpO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgY29tbW9uLmNoYWxsZW5nZVR5cGVzLkJBU0VKVU1QOlxuICAgICAgICAgIGNhc2UgY29tbW9uLmNoYWxsZW5nZVR5cGVzLlpJUExJTkU6XG4gICAgICAgICAgICBkYXRhID0ge1xuICAgICAgICAgICAgICBpZDogY29tbW9uLmNoYWxsZW5nZUlkLFxuICAgICAgICAgICAgICBuYW1lOiBjb21tb24uY2hhbGxlbmdlTmFtZSxcbiAgICAgICAgICAgICAgY2hhbGxlbmdlVHlwZTogK2NvbW1vbi5jaGFsbGVuZ2VUeXBlLFxuICAgICAgICAgICAgICBzb2x1dGlvbjogc29sdXRpb24sXG4gICAgICAgICAgICAgIGdpdGh1Ykxpbms6IGdpdGh1YkxpbmtcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICQuYWpheCh7XG4gICAgICAgICAgICAgIHVybDogJy9jb21wbGV0ZWQtemlwbGluZS1vci1iYXNlanVtcC8nLFxuICAgICAgICAgICAgICB0eXBlOiAnUE9TVCcsXG4gICAgICAgICAgICAgIGRhdGE6IEpTT04uc3RyaW5naWZ5KGRhdGEpLFxuICAgICAgICAgICAgICBjb250ZW50VHlwZTogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICAgICAgICBkYXRhVHlwZTogJ2pzb24nXG4gICAgICAgICAgICB9KS5zdWNjZXNzKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSAnL2NoYWxsZW5nZXMvbmV4dC1jaGFsbGVuZ2U/aWQ9JyArIGNvbW1vbi5jaGFsbGVuZ2VJZDtcbiAgICAgICAgICAgIH0pLmZhaWwoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICB3aW5kb3cubG9jYXRpb24ucmVwbGFjZSh3aW5kb3cubG9jYXRpb24uaHJlZik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgY2FzZSBjb21tb24uY2hhbGxlbmdlVHlwZXMuQk9ORklSRTpcbiAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gJy9jaGFsbGVuZ2VzL25leHQtY2hhbGxlbmdlP2lkPScgKyBjb21tb24uY2hhbGxlbmdlSWQ7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnSGFwcHkgQ29kaW5nIScpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGlmIChjb21tb24uY2hhbGxlbmdlTmFtZSkge1xuICAgICAgd2luZG93LmdhKCdzZW5kJywgJ2V2ZW50JywgJ0NoYWxsZW5nZScsICdsb2FkJywgY29tbW9uLmdhTmFtZSk7XG4gICAgfVxuXG4gICAgJCgnI2NvbXBsZXRlLWNvdXJzZXdhcmUtZGlhbG9nJykub24oJ2hpZGRlbi5icy5tb2RhbCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmIChjb21tb24uZWRpdG9yLmZvY3VzKSB7XG4gICAgICAgIGNvbW1vbi5lZGl0b3IuZm9jdXMoKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgICQoJyN0cmlnZ2VyLWlzc3VlLW1vZGFsJykub24oJ2NsaWNrJywgZnVuY3Rpb24gKCkge1xuICAgICAgJCgnI2lzc3VlLW1vZGFsJykubW9kYWwoJ3Nob3cnKTtcbiAgICB9KTtcblxuICAgICQoJyN0cmlnZ2VyLWhlbHAtbW9kYWwnKS5vbignY2xpY2snLCBmdW5jdGlvbiAoKSB7XG4gICAgICAkKCcjaGVscC1tb2RhbCcpLm1vZGFsKCdzaG93Jyk7XG4gICAgfSk7XG5cbiAgICAkKCcjdHJpZ2dlci1yZXNldC1tb2RhbCcpLm9uKCdjbGljaycsIGZ1bmN0aW9uICgpIHtcbiAgICAgICQoJyNyZXNldC1tb2RhbCcpLm1vZGFsKCdzaG93Jyk7XG4gICAgfSk7XG5cbiAgICAkKCcjdHJpZ2dlci1wYWlyLW1vZGFsJykub24oJ2NsaWNrJywgZnVuY3Rpb24gKCkge1xuICAgICAgJCgnI3BhaXItbW9kYWwnKS5tb2RhbCgnc2hvdycpO1xuICAgIH0pO1xuXG4gICAgJCgnI2NvbXBsZXRlZC1jb3Vyc2V3YXJlJykub24oJ2NsaWNrJywgZnVuY3Rpb24gKCkge1xuICAgICAgJCgnI2NvbXBsZXRlLWNvdXJzZXdhcmUtZGlhbG9nJykubW9kYWwoJ3Nob3cnKTtcbiAgICB9KTtcblxuICAgICQoJyNoZWxwLWl2ZS1mb3VuZC1hLWJ1Zy13aWtpLWFydGljbGUnKS5vbignY2xpY2snLCBmdW5jdGlvbiAoKSB7XG4gICAgICB3aW5kb3cub3BlbignaHR0cHM6Ly9naXRodWIuY29tL2ZyZWVjb2RlY2FtcGNoaW5hL2ZyZWVjb2RlY2FtcC5jbi93aWtpLycgKyBcIkhlbHAtSSd2ZS1Gb3VuZC1hLUJ1Z1wiLCAnX2JsYW5rJyk7XG4gICAgfSk7XG5cbiAgICAkKCcjc2VhcmNoLWlzc3VlJykub24oJ2NsaWNrJywgZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIHF1ZXJ5SXNzdWUgPSB3aW5kb3cubG9jYXRpb24uaHJlZi50b1N0cmluZygpLnNwbGl0KCc/JylbMF0ucmVwbGFjZSgvKCMqKSQvLCAnJyk7XG4gICAgICB3aW5kb3cub3BlbignaHR0cHM6Ly9naXRodWIuY29tL2ZyZWVjb2RlY2FtcGNoaW5hL2ZyZWVjb2RlY2FtcC5jbi9pc3N1ZXM/cT0nICsgJ2lzOmlzc3VlIGlzOmFsbCAnICsgY29tbW9uLmNoYWxsZW5nZU5hbWUgKyAnIE9SICcgKyBxdWVyeUlzc3VlLnN1YnN0cihxdWVyeUlzc3VlLmxhc3RJbmRleE9mKCdjaGFsbGVuZ2VzLycpICsgMTEpLnJlcGxhY2UoJy8nLCAnJyksICdfYmxhbmsnKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgcmV0dXJuIGNvbW1vbjtcbn0od2luZG93KTsiLCIndXNlIHN0cmljdCc7XG5cbi8vIGRlcGVuZHMgb246IGNvZGVVcmlcbndpbmRvdy5jb21tb24gPSBmdW5jdGlvbiAoZ2xvYmFsKSB7XG4gIHZhciBsb2NhbFN0b3JhZ2UgPSBnbG9iYWwubG9jYWxTdG9yYWdlLFxuICAgICAgX2dsb2JhbCRjb21tb24gPSBnbG9iYWwuY29tbW9uLFxuICAgICAgY29tbW9uID0gX2dsb2JhbCRjb21tb24gPT09IHVuZGVmaW5lZCA/IHsgaW5pdDogW10gfSA6IF9nbG9iYWwkY29tbW9uO1xuXG5cbiAgdmFyIGNoYWxsZW5nZVByZWZpeCA9IFsnQm9uZmlyZTogJywgJ1dheXBvaW50OiAnLCAnWmlwbGluZTogJywgJ0Jhc2VqdW1wOiAnLCAnQ2hlY2twb2ludDogJ10sXG4gICAgICBpdGVtO1xuXG4gIHZhciBjb2RlU3RvcmFnZSA9IHtcbiAgICBnZXRTdG9yZWRWYWx1ZTogZnVuY3Rpb24gZ2V0U3RvcmVkVmFsdWUoa2V5KSB7XG4gICAgICBpZiAoIWxvY2FsU3RvcmFnZSB8fCB0eXBlb2YgbG9jYWxTdG9yYWdlLmdldEl0ZW0gIT09ICdmdW5jdGlvbicgfHwgIWtleSB8fCB0eXBlb2Yga2V5ICE9PSAnc3RyaW5nJykge1xuICAgICAgICBjb25zb2xlLmxvZygndW5hYmxlIHRvIHJlYWQgZnJvbSBzdG9yYWdlJyk7XG4gICAgICAgIHJldHVybiAnJztcbiAgICAgIH1cbiAgICAgIGlmIChsb2NhbFN0b3JhZ2UuZ2V0SXRlbShrZXkgKyAnVmFsJykpIHtcbiAgICAgICAgcmV0dXJuICcnICsgbG9jYWxTdG9yYWdlLmdldEl0ZW0oa2V5ICsgJ1ZhbCcpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPD0gY2hhbGxlbmdlUHJlZml4Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgaXRlbSA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKGNoYWxsZW5nZVByZWZpeFtpXSArIGtleSArICdWYWwnKTtcbiAgICAgICAgICBpZiAoaXRlbSkge1xuICAgICAgICAgICAgcmV0dXJuICcnICsgaXRlbTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH0sXG5cblxuICAgIGlzQWxpdmU6IGZ1bmN0aW9uIGlzQWxpdmUoa2V5KSB7XG4gICAgICB2YXIgdmFsID0gdGhpcy5nZXRTdG9yZWRWYWx1ZShrZXkpO1xuICAgICAgcmV0dXJuIHZhbCAhPT0gJ251bGwnICYmIHZhbCAhPT0gJ3VuZGVmaW5lZCcgJiYgdmFsICYmIHZhbC5sZW5ndGggPiAwO1xuICAgIH0sXG5cbiAgICB1cGRhdGVTdG9yYWdlOiBmdW5jdGlvbiB1cGRhdGVTdG9yYWdlKGtleSwgY29kZSkge1xuICAgICAgaWYgKCFsb2NhbFN0b3JhZ2UgfHwgdHlwZW9mIGxvY2FsU3RvcmFnZS5zZXRJdGVtICE9PSAnZnVuY3Rpb24nIHx8ICFrZXkgfHwgdHlwZW9mIGtleSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgY29uc29sZS5sb2coJ3VuYWJsZSB0byBzYXZlIHRvIHN0b3JhZ2UnKTtcbiAgICAgICAgcmV0dXJuIGNvZGU7XG4gICAgICB9XG4gICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShrZXkgKyAnVmFsJywgY29kZSk7XG4gICAgICByZXR1cm4gY29kZTtcbiAgICB9XG4gIH07XG5cbiAgY29tbW9uLmNvZGVTdG9yYWdlID0gY29kZVN0b3JhZ2U7XG5cbiAgcmV0dXJuIGNvbW1vbjtcbn0od2luZG93LCB3aW5kb3cuY29tbW9uKTsiLCIndXNlIHN0cmljdCc7XG5cbi8vIHN0b3JlIGNvZGUgaW4gdGhlIFVSTFxud2luZG93LmNvbW1vbiA9IGZ1bmN0aW9uIChnbG9iYWwpIHtcbiAgdmFyIF9lbmNvZGUgPSBnbG9iYWwuZW5jb2RlVVJJQ29tcG9uZW50LFxuICAgICAgX2RlY29kZSA9IGdsb2JhbC5kZWNvZGVVUklDb21wb25lbnQsXG4gICAgICBsb2NhdGlvbiA9IGdsb2JhbC5sb2NhdGlvbixcbiAgICAgIGhpc3RvcnkgPSBnbG9iYWwuaGlzdG9yeSxcbiAgICAgIF9nbG9iYWwkY29tbW9uID0gZ2xvYmFsLmNvbW1vbixcbiAgICAgIGNvbW1vbiA9IF9nbG9iYWwkY29tbW9uID09PSB1bmRlZmluZWQgPyB7IGluaXQ6IFtdIH0gOiBfZ2xvYmFsJGNvbW1vbjtcbiAgdmFyIHJlcGxhY2VTY3JpcHRUYWdzID0gY29tbW9uLnJlcGxhY2VTY3JpcHRUYWdzLFxuICAgICAgcmVwbGFjZVNhZmVUYWdzID0gY29tbW9uLnJlcGxhY2VTYWZlVGFncyxcbiAgICAgIHJlcGxhY2VGb3JtQWN0aW9uQXR0ciA9IGNvbW1vbi5yZXBsYWNlRm9ybUFjdGlvbkF0dHIsXG4gICAgICByZXBsYWNlRmNjZmFhQXR0ciA9IGNvbW1vbi5yZXBsYWNlRmNjZmFhQXR0cjtcblxuXG4gIHZhciBxdWVyeVJlZ2V4ID0gL14oXFw/fCNcXD8pLztcbiAgZnVuY3Rpb24gZW5jb2RlRmNjKHZhbCkge1xuICAgIHJldHVybiByZXBsYWNlU2NyaXB0VGFncyhyZXBsYWNlRm9ybUFjdGlvbkF0dHIodmFsKSk7XG4gIH1cblxuICBmdW5jdGlvbiBkZWNvZGVGY2ModmFsKSB7XG4gICAgcmV0dXJuIHJlcGxhY2VTYWZlVGFncyhyZXBsYWNlRmNjZmFhQXR0cih2YWwpKTtcbiAgfVxuXG4gIHZhciBjb2RlVXJpID0ge1xuICAgIGVuY29kZTogZnVuY3Rpb24gZW5jb2RlKGNvZGUpIHtcbiAgICAgIHJldHVybiBfZW5jb2RlKGNvZGUpO1xuICAgIH0sXG4gICAgZGVjb2RlOiBmdW5jdGlvbiBkZWNvZGUoY29kZSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIF9kZWNvZGUoY29kZSk7XG4gICAgICB9IGNhdGNoIChpZ25vcmUpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgfSxcbiAgICBpc0luUXVlcnk6IGZ1bmN0aW9uIGlzSW5RdWVyeShxdWVyeSkge1xuICAgICAgdmFyIGRlY29kZWQgPSBjb2RlVXJpLmRlY29kZShxdWVyeSk7XG4gICAgICBpZiAoIWRlY29kZWQgfHwgdHlwZW9mIGRlY29kZWQuc3BsaXQgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGRlY29kZWQucmVwbGFjZShxdWVyeVJlZ2V4LCAnJykuc3BsaXQoJyYnKS5yZWR1Y2UoZnVuY3Rpb24gKGZvdW5kLCBwYXJhbSkge1xuICAgICAgICB2YXIga2V5ID0gcGFyYW0uc3BsaXQoJz0nKVswXTtcbiAgICAgICAgaWYgKGtleSA9PT0gJ3NvbHV0aW9uJykge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmb3VuZDtcbiAgICAgIH0sIGZhbHNlKTtcbiAgICB9LFxuICAgIGlzQWxpdmU6IGZ1bmN0aW9uIGlzQWxpdmUoKSB7XG4gICAgICByZXR1cm4gY29kZVVyaS5lbmFibGVkICYmIGNvZGVVcmkuaXNJblF1ZXJ5KGxvY2F0aW9uLnNlYXJjaCkgfHwgY29kZVVyaS5pc0luUXVlcnkobG9jYXRpb24uaGFzaCk7XG4gICAgfSxcbiAgICBnZXRLZXlJblF1ZXJ5OiBmdW5jdGlvbiBnZXRLZXlJblF1ZXJ5KHF1ZXJ5KSB7XG4gICAgICB2YXIga2V5VG9GaW5kID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiAnJztcblxuICAgICAgcmV0dXJuIHF1ZXJ5LnNwbGl0KCcmJykucmVkdWNlKGZ1bmN0aW9uIChvbGRWYWx1ZSwgcGFyYW0pIHtcbiAgICAgICAgdmFyIGtleSA9IHBhcmFtLnNwbGl0KCc9JylbMF07XG4gICAgICAgIHZhciB2YWx1ZSA9IHBhcmFtLnNwbGl0KCc9Jykuc2xpY2UoMSkuam9pbignPScpO1xuXG4gICAgICAgIGlmIChrZXkgPT09IGtleVRvRmluZCkge1xuICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb2xkVmFsdWU7XG4gICAgICB9LCBudWxsKTtcbiAgICB9LFxuICAgIGdldFNvbHV0aW9uRnJvbVF1ZXJ5OiBmdW5jdGlvbiBnZXRTb2x1dGlvbkZyb21RdWVyeSgpIHtcbiAgICAgIHZhciBxdWVyeSA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogJyc7XG5cbiAgICAgIHJldHVybiBkZWNvZGVGY2MoY29kZVVyaS5kZWNvZGUoY29kZVVyaS5nZXRLZXlJblF1ZXJ5KHF1ZXJ5LCAnc29sdXRpb24nKSkpO1xuICAgIH0sXG5cbiAgICBwYXJzZTogZnVuY3Rpb24gcGFyc2UoKSB7XG4gICAgICBpZiAoIWNvZGVVcmkuZW5hYmxlZCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICAgIHZhciBxdWVyeTtcbiAgICAgIGlmIChsb2NhdGlvbi5zZWFyY2ggJiYgY29kZVVyaS5pc0luUXVlcnkobG9jYXRpb24uc2VhcmNoKSkge1xuICAgICAgICBxdWVyeSA9IGxvY2F0aW9uLnNlYXJjaC5yZXBsYWNlKC9eXFw/LywgJycpO1xuXG4gICAgICAgIGlmIChoaXN0b3J5ICYmIHR5cGVvZiBoaXN0b3J5LnJlcGxhY2VTdGF0ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIGhpc3RvcnkucmVwbGFjZVN0YXRlKGhpc3Rvcnkuc3RhdGUsIG51bGwsIGxvY2F0aW9uLmhyZWYuc3BsaXQoJz8nKVswXSk7XG4gICAgICAgICAgbG9jYXRpb24uaGFzaCA9ICcjPycgKyBlbmNvZGVGY2MocXVlcnkpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBxdWVyeSA9IGxvY2F0aW9uLmhhc2gucmVwbGFjZSgvXlxcI1xcPy8sICcnKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFxdWVyeSkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXMuZ2V0U29sdXRpb25Gcm9tUXVlcnkocXVlcnkpO1xuICAgIH0sXG4gICAgcXVlcmlmeTogZnVuY3Rpb24gcXVlcmlmeShzb2x1dGlvbikge1xuICAgICAgaWYgKCFjb2RlVXJpLmVuYWJsZWQpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgICBpZiAoaGlzdG9yeSAmJiB0eXBlb2YgaGlzdG9yeS5yZXBsYWNlU3RhdGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgLy8gZ3JhYiB0aGUgdXJsIHVwIHRvIHRoZSBxdWVyeVxuICAgICAgICAvLyBkZXN0cm95IGFueSBoYXNoIHN5bWJvbHMgc3RpbGwgY2xpbmdpbmcgdG8gbGlmZVxuICAgICAgICB2YXIgdXJsID0gbG9jYXRpb24uaHJlZi5zcGxpdCgnPycpWzBdLnJlcGxhY2UoLygjKikkLywgJycpO1xuICAgICAgICBoaXN0b3J5LnJlcGxhY2VTdGF0ZShoaXN0b3J5LnN0YXRlLCBudWxsLCB1cmwgKyAnIz8nICsgKGNvZGVVcmkuc2hvdWxkUnVuKCkgPyAnJyA6ICdydW49ZGlzYWJsZWQmJykgKyAnc29sdXRpb249JyArIGNvZGVVcmkuZW5jb2RlKGVuY29kZUZjYyhzb2x1dGlvbikpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxvY2F0aW9uLmhhc2ggPSAnP3NvbHV0aW9uPScgKyBjb2RlVXJpLmVuY29kZShlbmNvZGVGY2Moc29sdXRpb24pKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHNvbHV0aW9uO1xuICAgIH0sXG4gICAgZW5hYmxlZDogdHJ1ZSxcbiAgICBzaG91bGRSdW46IGZ1bmN0aW9uIHNob3VsZFJ1bigpIHtcbiAgICAgIHJldHVybiAhdGhpcy5nZXRLZXlJblF1ZXJ5KChsb2NhdGlvbi5zZWFyY2ggfHwgbG9jYXRpb24uaGFzaCkucmVwbGFjZShxdWVyeVJlZ2V4LCAnJyksICdydW4nKTtcbiAgICB9XG4gIH07XG5cbiAgY29tbW9uLmluaXQucHVzaChmdW5jdGlvbiAoKSB7XG4gICAgY29kZVVyaS5wYXJzZSgpO1xuICB9KTtcblxuICBjb21tb24uY29kZVVyaSA9IGNvZGVVcmk7XG4gIGNvbW1vbi5zaG91bGRSdW4gPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGNvZGVVcmkuc2hvdWxkUnVuKCk7XG4gIH07XG5cbiAgcmV0dXJuIGNvbW1vbjtcbn0od2luZG93KTsiLCIndXNlIHN0cmljdCc7XG5cbndpbmRvdy5jb21tb24gPSBmdW5jdGlvbiAoZ2xvYmFsKSB7XG4gIHZhciBsb29wUHJvdGVjdCA9IGdsb2JhbC5sb29wUHJvdGVjdCxcbiAgICAgIF9nbG9iYWwkY29tbW9uID0gZ2xvYmFsLmNvbW1vbixcbiAgICAgIGNvbW1vbiA9IF9nbG9iYWwkY29tbW9uID09PSB1bmRlZmluZWQgPyB7IGluaXQ6IFtdIH0gOiBfZ2xvYmFsJGNvbW1vbjtcblxuXG4gIGxvb3BQcm90ZWN0LmhpdCA9IGZ1bmN0aW9uIGhpdChsaW5lKSB7XG4gICAgdmFyIGVyciA9ICdFcnJvcjogRXhpdGluZyBwb3RlbnRpYWwgaW5maW5pdGUgbG9vcCBhdCBsaW5lICcgKyBsaW5lICsgJy4gVG8gZGlzYWJsZSBsb29wIHByb3RlY3Rpb24sIHdyaXRlOiBcXG5cXFxcL1xcXFwvIG5vcHJvdGVjdFxcbmFzIHRoZSBmaXJzdCcgKyAnbGluZS4gQmV3YXJlIHRoYXQgaWYgeW91IGRvIGhhdmUgYW4gaW5maW5pdGUgbG9vcCBpbiB5b3VyIGNvZGUnICsgJ3RoaXMgd2lsbCBjcmFzaCB5b3VyIGJyb3dzZXIuJztcbiAgICBjb25zb2xlLmVycm9yKGVycik7XG4gIH07XG5cbiAgY29tbW9uLmFkZExvb3BQcm90ZWN0ID0gZnVuY3Rpb24gYWRkTG9vcFByb3RlY3QoKSB7XG4gICAgdmFyIGNvZGUgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6ICcnO1xuXG4gICAgcmV0dXJuIGxvb3BQcm90ZWN0KGNvZGUpO1xuICB9O1xuXG4gIHJldHVybiBjb21tb247XG59KHdpbmRvdyk7IiwiJ3VzZSBzdHJpY3QnO1xuXG53aW5kb3cuY29tbW9uID0gZnVuY3Rpb24gKGdsb2JhbCkge1xuICB2YXIgX2dsb2JhbCRjb21tb24gPSBnbG9iYWwuY29tbW9uLFxuICAgICAgY29tbW9uID0gX2dsb2JhbCRjb21tb24gPT09IHVuZGVmaW5lZCA/IHsgaW5pdDogW10gfSA6IF9nbG9iYWwkY29tbW9uLFxuICAgICAgZG9jID0gZ2xvYmFsLmRvY3VtZW50O1xuXG5cbiAgY29tbW9uLmdldElmcmFtZSA9IGZ1bmN0aW9uIGdldElmcmFtZSgpIHtcbiAgICB2YXIgaWQgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6ICdwcmV2aWV3JztcblxuICAgIHZhciBwcmV2aWV3RnJhbWUgPSBkb2MuZ2V0RWxlbWVudEJ5SWQoaWQpO1xuXG4gICAgLy8gY3JlYXRlIGFuZCBhcHBlbmQgYSBoaWRkZW4gcHJldmlldyBmcmFtZVxuICAgIGlmICghcHJldmlld0ZyYW1lKSB7XG4gICAgICBwcmV2aWV3RnJhbWUgPSBkb2MuY3JlYXRlRWxlbWVudCgnaWZyYW1lJyk7XG4gICAgICBwcmV2aWV3RnJhbWUuaWQgPSBpZDtcbiAgICAgIHByZXZpZXdGcmFtZS5zZXRBdHRyaWJ1dGUoJ3N0eWxlJywgJ2Rpc3BsYXk6IG5vbmUnKTtcbiAgICAgIGRvYy5ib2R5LmFwcGVuZENoaWxkKHByZXZpZXdGcmFtZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHByZXZpZXdGcmFtZS5jb250ZW50RG9jdW1lbnQgfHwgcHJldmlld0ZyYW1lLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQ7XG4gIH07XG5cbiAgcmV0dXJuIGNvbW1vbjtcbn0od2luZG93KTsiLCIndXNlIHN0cmljdCc7XG5cbndpbmRvdy5jb21tb24gPSBmdW5jdGlvbiAoZ2xvYmFsKSB7XG4gIHZhciBfZ2xvYmFsJFJ4ID0gZ2xvYmFsLlJ4LFxuICAgICAgQmVoYXZpb3JTdWJqZWN0ID0gX2dsb2JhbCRSeC5CZWhhdmlvclN1YmplY3QsXG4gICAgICBPYnNlcnZhYmxlID0gX2dsb2JhbCRSeC5PYnNlcnZhYmxlLFxuICAgICAgX2dsb2JhbCRjb21tb24gPSBnbG9iYWwuY29tbW9uLFxuICAgICAgY29tbW9uID0gX2dsb2JhbCRjb21tb24gPT09IHVuZGVmaW5lZCA/IHsgaW5pdDogW10gfSA6IF9nbG9iYWwkY29tbW9uO1xuXG4gIC8vIHRoZSBmaXJzdCBzY3JpcHQgdGFnIGhlcmUgaXMgdG8gcHJveHkgalF1ZXJ5XG4gIC8vIFdlIHVzZSB0aGUgc2FtZSBqUXVlcnkgb24gdGhlIG1haW4gd2luZG93IGJ1dCB3ZSBjaGFuZ2UgdGhlXG4gIC8vIGNvbnRleHQgdG8gdGhhdCBvZiB0aGUgaWZyYW1lLlxuXG4gIHZhciBsaWJyYXJ5SW5jbHVkZXMgPSAnXFxuPHNjcmlwdD5cXG4gIHdpbmRvdy5sb29wUHJvdGVjdCA9IHBhcmVudC5sb29wUHJvdGVjdDtcXG4gIHdpbmRvdy5fX2VyciA9IG51bGw7XFxuICB3aW5kb3cubG9vcFByb3RlY3QuaGl0ID0gZnVuY3Rpb24obGluZSkge1xcbiAgICB3aW5kb3cuX19lcnIgPSBuZXcgRXJyb3IoXFxuICAgICAgXFwnUG90ZW50aWFsIGluZmluaXRlIGxvb3AgYXQgbGluZSBcXCcgK1xcbiAgICAgIGxpbmUgK1xcbiAgICAgIFxcJy4gVG8gZGlzYWJsZSBsb29wIHByb3RlY3Rpb24sIHdyaXRlOlxcJyArXFxuICAgICAgXFwnIFxcXFxuXFxcXC9cXFxcLyBub3Byb3RlY3RcXFxcbmFzIHRoZSBmaXJzdFxcJyArXFxuICAgICAgXFwnIGxpbmUuIEJld2FyZSB0aGF0IGlmIHlvdSBkbyBoYXZlIGFuIGluZmluaXRlIGxvb3AgaW4geW91ciBjb2RlXFwnICtcXG4gICAgICBcXCcgdGhpcyB3aWxsIGNyYXNoIHlvdXIgYnJvd3Nlci5cXCdcXG4gICAgKTtcXG4gIH07XFxuPC9zY3JpcHQ+XFxuPGxpbmtcXG4gIHJlbD1cXCdzdHlsZXNoZWV0XFwnXFxuICBocmVmPVxcJy8vY2RuLmJvb3Rjc3MuY29tL2FuaW1hdGUuY3NzLzMuMi4wL2FuaW1hdGUubWluLmNzc1xcJ1xcbiAgLz5cXG48bGlua1xcbiAgcmVsPVxcJ3N0eWxlc2hlZXRcXCdcXG4gIGhyZWY9XFwnLy9jZG4uYm9vdGNzcy5jb20vYm9vdHN0cmFwLzMuMy4xL2Nzcy9ib290c3RyYXAubWluLmNzc1xcJ1xcbiAgLz5cXG5cXG48bGlua1xcbiAgcmVsPVxcJ3N0eWxlc2hlZXRcXCdcXG4gIGhyZWY9XFwnLy9jZG4uYm9vdGNzcy5jb20vZm9udC1hd2Vzb21lLzQuMi4wL2Nzcy9mb250LWF3ZXNvbWUubWluLmNzc1xcJ1xcbiAgLz5cXG48c3R5bGU+XFxuICBib2R5IHsgcGFkZGluZzogMHB4IDNweCAwcHggM3B4OyB9XFxuPC9zdHlsZT5cXG4gICc7XG4gIHZhciBjb2RlRGlzYWJsZWRFcnJvciA9ICdcXG4gICAgPHNjcmlwdD5cXG4gICAgICB3aW5kb3cuX19lcnIgPSBuZXcgRXJyb3IoXFwnY29kZSBoYXMgYmVlbiBkaXNhYmxlZFxcJyk7XFxuICAgIDwvc2NyaXB0PlxcbiAgJztcblxuICB2YXIgaUZyYW1lU2NyaXB0JCA9IGNvbW1vbi5nZXRTY3JpcHRDb250ZW50JCgnL2pzL2lGcmFtZVNjcmlwdHMuanMnKS5zaGFyZVJlcGxheSgpO1xuICB2YXIgalF1ZXJ5U2NyaXB0JCA9IGNvbW1vbi5nZXRTY3JpcHRDb250ZW50JCgnL2Jvd2VyX2NvbXBvbmVudHMvanF1ZXJ5L2Rpc3QvanF1ZXJ5LmpzJykuc2hhcmVSZXBsYXkoKTtcblxuICAvLyBiZWhhdmlvciBzdWJqZWN0IGFsbHdheXMgcmVtZW1iZXJzIHRoZSBsYXN0IHZhbHVlXG4gIC8vIHdlIHVzZSB0aGlzIHRvIGRldGVybWluZSBpZiBydW5QcmV2aWV3VGVzdCQgaXMgZGVmaW5lZFxuICAvLyBhbmQgcHJpbWUgaXQgd2l0aCBmYWxzZVxuICBjb21tb24ucHJldmlld1JlYWR5JCA9IG5ldyBCZWhhdmlvclN1YmplY3QoZmFsc2UpO1xuXG4gIC8vIFRoZXNlIHNob3VsZCBiZSBzZXQgdXAgaW4gdGhlIHByZXZpZXcgd2luZG93XG4gIC8vIGlmIHRoaXMgZXJyb3IgaXMgc2VlbiBpdCBpcyBiZWNhdXNlIHRoZSBmdW5jdGlvbiB0cmllZCB0byBydW5cbiAgLy8gYmVmb3JlIHRoZSBpZnJhbWUgaGFzIGNvbXBsZXRlbHkgbG9hZGVkXG4gIGNvbW1vbi5ydW5QcmV2aWV3VGVzdHMkID0gY29tbW9uLmNoZWNrUHJldmlldyQgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIE9ic2VydmFibGUudGhyb3cobmV3IEVycm9yKCdQcmV2aWV3IG5vdCBmdWxseSBsb2FkZWQnKSk7XG4gIH07XG5cbiAgY29tbW9uLnVwZGF0ZVByZXZpZXckID0gZnVuY3Rpb24gdXBkYXRlUHJldmlldyQoKSB7XG4gICAgdmFyIGNvZGUgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6ICcnO1xuXG4gICAgdmFyIHByZXZpZXcgPSBjb21tb24uZ2V0SWZyYW1lKCdwcmV2aWV3Jyk7XG5cbiAgICByZXR1cm4gT2JzZXJ2YWJsZS5jb21iaW5lTGF0ZXN0KGlGcmFtZVNjcmlwdCQsIGpRdWVyeVNjcmlwdCQsIGZ1bmN0aW9uIChpZnJhbWUsIGpRdWVyeSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgaWZyYW1lU2NyaXB0OiAnPHNjcmlwdD4nICsgaWZyYW1lICsgJzwvc2NyaXB0PicsXG4gICAgICAgIGpRdWVyeTogJzxzY3JpcHQ+JyArIGpRdWVyeSArICc8L3NjcmlwdD4nXG4gICAgICB9O1xuICAgIH0pLmZpcnN0KCkuZmxhdE1hcChmdW5jdGlvbiAoX3JlZikge1xuICAgICAgdmFyIGlmcmFtZVNjcmlwdCA9IF9yZWYuaWZyYW1lU2NyaXB0LFxuICAgICAgICAgIGpRdWVyeSA9IF9yZWYualF1ZXJ5O1xuXG4gICAgICAvLyB3ZSBtYWtlIHN1cmUgdG8gb3ZlcnJpZGUgdGhlIGxhc3QgdmFsdWUgaW4gdGhlXG4gICAgICAvLyBzdWJqZWN0IHRvIGZhbHNlIGhlcmUuXG4gICAgICBjb21tb24ucHJldmlld1JlYWR5JC5vbk5leHQoZmFsc2UpO1xuICAgICAgcHJldmlldy5vcGVuKCk7XG4gICAgICBwcmV2aWV3LndyaXRlKGxpYnJhcnlJbmNsdWRlcyArIGpRdWVyeSArIChjb21tb24uc2hvdWxkUnVuKCkgPyBjb2RlIDogY29kZURpc2FibGVkRXJyb3IpICsgJzwhLS0gLS0+JyArIGlmcmFtZVNjcmlwdCk7XG4gICAgICBwcmV2aWV3LmNsb3NlKCk7XG4gICAgICAvLyBub3cgd2UgZmlsdGVyIGZhbHNlIHZhbHVlcyBhbmQgd2FpdCBmb3IgdGhlIGZpcnN0IHRydWVcbiAgICAgIHJldHVybiBjb21tb24ucHJldmlld1JlYWR5JC5maWx0ZXIoZnVuY3Rpb24gKHJlYWR5KSB7XG4gICAgICAgIHJldHVybiByZWFkeTtcbiAgICAgIH0pLmZpcnN0KClcbiAgICAgIC8vIHRoZSBkZWxheSBoZXJlIGlzIHRvIGdpdmUgY29kZSB3aXRoaW4gdGhlIGlmcmFtZVxuICAgICAgLy8gY29udHJvbCB0byBydW5cbiAgICAgIC5kZWxheSg0MDApO1xuICAgIH0pLm1hcChmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gY29kZTtcbiAgICB9KTtcbiAgfTtcblxuICByZXR1cm4gY29tbW9uO1xufSh3aW5kb3cpOyIsIid1c2Ugc3RyaWN0Jztcblxud2luZG93LmNvbW1vbiA9IGZ1bmN0aW9uIChnbG9iYWwpIHtcbiAgdmFyIF9nbG9iYWwkUnggPSBnbG9iYWwuUngsXG4gICAgICBTdWJqZWN0ID0gX2dsb2JhbCRSeC5TdWJqZWN0LFxuICAgICAgT2JzZXJ2YWJsZSA9IF9nbG9iYWwkUnguT2JzZXJ2YWJsZSxcbiAgICAgIENvZGVNaXJyb3IgPSBnbG9iYWwuQ29kZU1pcnJvcixcbiAgICAgIGVtbWV0Q29kZU1pcnJvciA9IGdsb2JhbC5lbW1ldENvZGVNaXJyb3IsXG4gICAgICBfZ2xvYmFsJGNvbW1vbiA9IGdsb2JhbC5jb21tb24sXG4gICAgICBjb21tb24gPSBfZ2xvYmFsJGNvbW1vbiA9PT0gdW5kZWZpbmVkID8geyBpbml0OiBbXSB9IDogX2dsb2JhbCRjb21tb247XG4gIHZhciBfY29tbW9uJGNoYWxsZW5nZVR5cGUgPSBjb21tb24uY2hhbGxlbmdlVHlwZSxcbiAgICAgIGNoYWxsZW5nZVR5cGUgPSBfY29tbW9uJGNoYWxsZW5nZVR5cGUgPT09IHVuZGVmaW5lZCA/ICcwJyA6IF9jb21tb24kY2hhbGxlbmdlVHlwZSxcbiAgICAgIGNoYWxsZW5nZVR5cGVzID0gY29tbW9uLmNoYWxsZW5nZVR5cGVzO1xuXG5cbiAgaWYgKCFDb2RlTWlycm9yIHx8IGNoYWxsZW5nZVR5cGUgPT09IGNoYWxsZW5nZVR5cGVzLkJBU0VKVU1QIHx8IGNoYWxsZW5nZVR5cGUgPT09IGNoYWxsZW5nZVR5cGVzLlpJUExJTkUgfHwgY2hhbGxlbmdlVHlwZSA9PT0gY2hhbGxlbmdlVHlwZXMuVklERU8gfHwgY2hhbGxlbmdlVHlwZSA9PT0gY2hhbGxlbmdlVHlwZXMuU1RFUCB8fCBjaGFsbGVuZ2VUeXBlID09PSBjaGFsbGVuZ2VUeXBlcy5ISUtFUykge1xuICAgIGNvbW1vbi5lZGl0b3IgPSB7fTtcbiAgICByZXR1cm4gY29tbW9uO1xuICB9XG5cbiAgdmFyIGVkaXRvciA9IENvZGVNaXJyb3IuZnJvbVRleHRBcmVhKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb2RlRWRpdG9yJyksIHtcbiAgICBsaW50OiB0cnVlLFxuICAgIGxpbmVOdW1iZXJzOiB0cnVlLFxuICAgIG1vZGU6ICdqYXZhc2NyaXB0JyxcbiAgICB0aGVtZTogJ21vbm9rYWknLFxuICAgIHJ1bm5hYmxlOiB0cnVlLFxuICAgIG1hdGNoQnJhY2tldHM6IHRydWUsXG4gICAgYXV0b0Nsb3NlQnJhY2tldHM6IHRydWUsXG4gICAgc2Nyb2xsYmFyU3R5bGU6ICdudWxsJyxcbiAgICBsaW5lV3JhcHBpbmc6IHRydWUsXG4gICAgZ3V0dGVyczogWydDb2RlTWlycm9yLWxpbnQtbWFya2VycyddXG4gIH0pO1xuXG4gIGVkaXRvci5zZXRTaXplKCcxMDAlJywgJ2F1dG8nKTtcblxuICBjb21tb24uZWRpdG9yRXhlY3V0ZSQgPSBuZXcgU3ViamVjdCgpO1xuICBjb21tb24uZWRpdG9yS2V5VXAkID0gT2JzZXJ2YWJsZS5mcm9tRXZlbnRQYXR0ZXJuKGZ1bmN0aW9uIChoYW5kbGVyKSB7XG4gICAgcmV0dXJuIGVkaXRvci5vbigna2V5dXAnLCBoYW5kbGVyKTtcbiAgfSwgZnVuY3Rpb24gKGhhbmRsZXIpIHtcbiAgICByZXR1cm4gZWRpdG9yLm9mZigna2V5dXAnLCBoYW5kbGVyKTtcbiAgfSk7XG5cbiAgZWRpdG9yLnNldE9wdGlvbignZXh0cmFLZXlzJywge1xuICAgIFRhYjogZnVuY3Rpb24gVGFiKGNtKSB7XG4gICAgICBpZiAoY20uc29tZXRoaW5nU2VsZWN0ZWQoKSkge1xuICAgICAgICBjbS5pbmRlbnRTZWxlY3Rpb24oJ2FkZCcpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIHNwYWNlcyA9IEFycmF5KGNtLmdldE9wdGlvbignaW5kZW50VW5pdCcpICsgMSkuam9pbignICcpO1xuICAgICAgICBjbS5yZXBsYWNlU2VsZWN0aW9uKHNwYWNlcyk7XG4gICAgICB9XG4gICAgfSxcbiAgICAnU2hpZnQtVGFiJzogZnVuY3Rpb24gU2hpZnRUYWIoY20pIHtcbiAgICAgIGlmIChjbS5zb21ldGhpbmdTZWxlY3RlZCgpKSB7XG4gICAgICAgIGNtLmluZGVudFNlbGVjdGlvbignc3VidHJhY3QnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciBzcGFjZXMgPSBBcnJheShjbS5nZXRPcHRpb24oJ2luZGVudFVuaXQnKSArIDEpLmpvaW4oJyAnKTtcbiAgICAgICAgY20ucmVwbGFjZVNlbGVjdGlvbihzcGFjZXMpO1xuICAgICAgfVxuICAgIH0sXG4gICAgJ0N0cmwtRW50ZXInOiBmdW5jdGlvbiBDdHJsRW50ZXIoKSB7XG4gICAgICBjb21tb24uZWRpdG9yRXhlY3V0ZSQub25OZXh0KCk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSxcbiAgICAnQ21kLUVudGVyJzogZnVuY3Rpb24gQ21kRW50ZXIoKSB7XG4gICAgICBjb21tb24uZWRpdG9yRXhlY3V0ZSQub25OZXh0KCk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9KTtcblxuICB2YXIgaW5mbyA9IGVkaXRvci5nZXRTY3JvbGxJbmZvKCk7XG5cbiAgdmFyIGFmdGVyID0gZWRpdG9yLmNoYXJDb29yZHMoe1xuICAgIGxpbmU6IGVkaXRvci5nZXRDdXJzb3IoKS5saW5lICsgMSxcbiAgICBjaDogMFxuICB9LCAnbG9jYWwnKS50b3A7XG5cbiAgaWYgKGluZm8udG9wICsgaW5mby5jbGllbnRIZWlnaHQgPCBhZnRlcikge1xuICAgIGVkaXRvci5zY3JvbGxUbyhudWxsLCBhZnRlciAtIGluZm8uY2xpZW50SGVpZ2h0ICsgMyk7XG4gIH1cblxuICBpZiAoZW1tZXRDb2RlTWlycm9yKSB7XG4gICAgZW1tZXRDb2RlTWlycm9yKGVkaXRvciwge1xuICAgICAgJ0NtZC1FJzogJ2VtbWV0LmV4cGFuZF9hYmJyZXZpYXRpb24nLFxuICAgICAgVGFiOiAnZW1tZXQuZXhwYW5kX2FiYnJldmlhdGlvbl93aXRoX3RhYicsXG4gICAgICBFbnRlcjogJ2VtbWV0Lmluc2VydF9mb3JtYXR0ZWRfbGluZV9icmVha19vbmx5J1xuICAgIH0pO1xuICB9XG4gIGNvbW1vbi5pbml0LnB1c2goZnVuY3Rpb24gKCkge1xuICAgIHZhciBlZGl0b3JWYWx1ZSA9IHZvaWQgMDtcbiAgICBpZiAoY29tbW9uLmNvZGVVcmkuaXNBbGl2ZSgpKSB7XG4gICAgICBlZGl0b3JWYWx1ZSA9IGNvbW1vbi5jb2RlVXJpLnBhcnNlKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGVkaXRvclZhbHVlID0gY29tbW9uLmNvZGVTdG9yYWdlLmlzQWxpdmUoY29tbW9uLmNoYWxsZW5nZU5hbWUpID8gY29tbW9uLmNvZGVTdG9yYWdlLmdldFN0b3JlZFZhbHVlKGNvbW1vbi5jaGFsbGVuZ2VOYW1lKSA6IGNvbW1vbi5zZWVkO1xuICAgIH1cblxuICAgIGVkaXRvci5zZXRWYWx1ZShjb21tb24ucmVwbGFjZVNhZmVUYWdzKGVkaXRvclZhbHVlKSk7XG4gICAgZWRpdG9yLnJlZnJlc2goKTtcbiAgfSk7XG5cbiAgY29tbW9uLmVkaXRvciA9IGVkaXRvcjtcblxuICByZXR1cm4gY29tbW9uO1xufSh3aW5kb3cpOyIsIid1c2Ugc3RyaWN0Jztcblxud2luZG93LmNvbW1vbiA9IGZ1bmN0aW9uIChnbG9iYWwpIHtcbiAgdmFyIE9ic2VydmFibGUgPSBnbG9iYWwuUnguT2JzZXJ2YWJsZSxcbiAgICAgIF9nbG9iYWwkY29tbW9uID0gZ2xvYmFsLmNvbW1vbixcbiAgICAgIGNvbW1vbiA9IF9nbG9iYWwkY29tbW9uID09PSB1bmRlZmluZWQgPyB7IGluaXQ6IFtdIH0gOiBfZ2xvYmFsJGNvbW1vbjtcblxuXG4gIHZhciBkZXRlY3RGdW5jdGlvbkNhbGwgPSAvZnVuY3Rpb25cXHMqP1xcKHxmdW5jdGlvblxccytcXHcrXFxzKj9cXCgvZ2k7XG4gIHZhciBkZXRlY3RVbnNhZmVKUSA9IC9cXCRcXHMqP1xcKFxccyo/XFwkXFxzKj9cXCkvZ2k7XG4gIHZhciBkZXRlY3RVbnNhZmVDb25zb2xlQ2FsbCA9IC9pZlxcc1xcKG51bGxcXClcXHNjb25zb2xlXFwubG9nXFwoMVxcKTsvZ2k7XG5cbiAgY29tbW9uLmRldGVjdFVuc2FmZUNvZGUkID0gZnVuY3Rpb24gZGV0ZWN0VW5zYWZlQ29kZSQoY29kZSkge1xuICAgIHZhciBvcGVuaW5nQ29tbWVudHMgPSBjb2RlLm1hdGNoKC9cXC9cXCovZ2kpO1xuICAgIHZhciBjbG9zaW5nQ29tbWVudHMgPSBjb2RlLm1hdGNoKC9cXCpcXC8vZ2kpO1xuXG4gICAgLy8gY2hlY2tzIGlmIHRoZSBudW1iZXIgb2Ygb3BlbmluZyBjb21tZW50cygvKikgbWF0Y2hlcyB0aGUgbnVtYmVyIG9mXG4gICAgLy8gY2xvc2luZyBjb21tZW50cygqLylcbiAgICBpZiAob3BlbmluZ0NvbW1lbnRzICYmICghY2xvc2luZ0NvbW1lbnRzIHx8IG9wZW5pbmdDb21tZW50cy5sZW5ndGggPiBjbG9zaW5nQ29tbWVudHMubGVuZ3RoKSkge1xuXG4gICAgICByZXR1cm4gT2JzZXJ2YWJsZS50aHJvdyhuZXcgRXJyb3IoJ1N5bnRheEVycm9yOiBVbmZpbmlzaGVkIG11bHRpLWxpbmUgY29tbWVudCcpKTtcbiAgICB9XG5cbiAgICBpZiAoY29kZS5tYXRjaChkZXRlY3RVbnNhZmVKUSkpIHtcbiAgICAgIHJldHVybiBPYnNlcnZhYmxlLnRocm93KG5ldyBFcnJvcignVW5zYWZlICQoJCknKSk7XG4gICAgfVxuXG4gICAgaWYgKGNvZGUubWF0Y2goL2Z1bmN0aW9uL2cpICYmICFjb2RlLm1hdGNoKGRldGVjdEZ1bmN0aW9uQ2FsbCkpIHtcbiAgICAgIHJldHVybiBPYnNlcnZhYmxlLnRocm93KG5ldyBFcnJvcignU3ludGF4RXJyb3I6IFVuc2FmZSBvciB1bmZpbmlzaGVkIGZ1bmN0aW9uIGRlY2xhcmF0aW9uJykpO1xuICAgIH1cblxuICAgIGlmIChjb2RlLm1hdGNoKGRldGVjdFVuc2FmZUNvbnNvbGVDYWxsKSkge1xuICAgICAgcmV0dXJuIE9ic2VydmFibGUudGhyb3cobmV3IEVycm9yKCdJbnZhbGlkIGlmIChudWxsKSBjb25zb2xlLmxvZygxKTsgZGV0ZWN0ZWQnKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIE9ic2VydmFibGUuanVzdChjb2RlKTtcbiAgfTtcblxuICByZXR1cm4gY29tbW9uO1xufSh3aW5kb3cpOyIsIid1c2Ugc3RyaWN0Jztcblxud2luZG93LmNvbW1vbiA9IGZ1bmN0aW9uIChfcmVmKSB7XG4gIHZhciAkID0gX3JlZi4kLFxuICAgICAgX3JlZiRjb21tb24gPSBfcmVmLmNvbW1vbixcbiAgICAgIGNvbW1vbiA9IF9yZWYkY29tbW9uID09PSB1bmRlZmluZWQgPyB7IGluaXQ6IFtdIH0gOiBfcmVmJGNvbW1vbjtcblxuXG4gIGNvbW1vbi5kaXNwbGF5VGVzdFJlc3VsdHMgPSBmdW5jdGlvbiBkaXNwbGF5VGVzdFJlc3VsdHMoKSB7XG4gICAgdmFyIGRhdGEgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IFtdO1xuXG4gICAgJCgnI3Rlc3RTdWl0ZScpLmNoaWxkcmVuKCkucmVtb3ZlKCk7XG4gICAgZGF0YS5mb3JFYWNoKGZ1bmN0aW9uIChfcmVmMikge1xuICAgICAgdmFyIF9yZWYyJGVyciA9IF9yZWYyLmVycixcbiAgICAgICAgICBlcnIgPSBfcmVmMiRlcnIgPT09IHVuZGVmaW5lZCA/IGZhbHNlIDogX3JlZjIkZXJyLFxuICAgICAgICAgIF9yZWYyJHRleHQgPSBfcmVmMi50ZXh0LFxuICAgICAgICAgIHRleHQgPSBfcmVmMiR0ZXh0ID09PSB1bmRlZmluZWQgPyAnJyA6IF9yZWYyJHRleHQ7XG5cbiAgICAgIHZhciBpY29uQ2xhc3MgPSBlcnIgPyAnXCJpb24tY2xvc2UtY2lyY2xlZCBiaWctZXJyb3ItaWNvblwiJyA6ICdcImlvbi1jaGVja21hcmstY2lyY2xlZCBiaWctc3VjY2Vzcy1pY29uXCInO1xuXG4gICAgICAkKCc8ZGl2PjwvZGl2PicpLmh0bWwoJ1xcbiAgICAgICAgPGRpdiBjbGFzcz1cXCdyb3dcXCc+XFxuICAgICAgICAgIDxkaXYgY2xhc3M9XFwnY29sLXhzLTIgdGV4dC1jZW50ZXJcXCc+XFxuICAgICAgICAgICAgPGkgY2xhc3M9JyArIGljb25DbGFzcyArICc+PC9pPlxcbiAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgPGRpdiBjbGFzcz1cXCdjb2wteHMtMTAgdGVzdC1vdXRwdXRcXCc+XFxuICAgICAgICAgICAgJyArIHRleHQuc3BsaXQoJ21lc3NhZ2U6ICcpLnBvcCgpLnJlcGxhY2UoL1xcJ1xcKTsvZywgJycpICsgJ1xcbiAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgPGRpdiBjbGFzcz1cXCd0ZW4tcGl4ZWwtYnJlYWtcXCcvPlxcbiAgICAgICAgPC9kaXY+XFxuICAgICAgJykuYXBwZW5kVG8oJCgnI3Rlc3RTdWl0ZScpKTtcbiAgICB9KTtcblxuICAgIHJldHVybiBkYXRhO1xuICB9O1xuXG4gIHJldHVybiBjb21tb247XG59KHdpbmRvdyk7IiwiJ3VzZSBzdHJpY3QnO1xuXG53aW5kb3cuY29tbW9uID0gZnVuY3Rpb24gKGdsb2JhbCkge1xuICB2YXIgZ2EgPSBnbG9iYWwuZ2EsXG4gICAgICBfZ2xvYmFsJGNvbW1vbiA9IGdsb2JhbC5jb21tb24sXG4gICAgICBjb21tb24gPSBfZ2xvYmFsJGNvbW1vbiA9PT0gdW5kZWZpbmVkID8geyBpbml0OiBbXSB9IDogX2dsb2JhbCRjb21tb247XG4gIHZhciBhZGRMb29wUHJvdGVjdCA9IGNvbW1vbi5hZGRMb29wUHJvdGVjdCxcbiAgICAgIGdldEpzRnJvbUh0bWwgPSBjb21tb24uZ2V0SnNGcm9tSHRtbCxcbiAgICAgIGRldGVjdFVuc2FmZUNvZGUkID0gY29tbW9uLmRldGVjdFVuc2FmZUNvZGUkLFxuICAgICAgdXBkYXRlUHJldmlldyQgPSBjb21tb24udXBkYXRlUHJldmlldyQsXG4gICAgICBjaGFsbGVuZ2VUeXBlID0gY29tbW9uLmNoYWxsZW5nZVR5cGUsXG4gICAgICBjaGFsbGVuZ2VUeXBlcyA9IGNvbW1vbi5jaGFsbGVuZ2VUeXBlcztcblxuXG4gIGNvbW1vbi5leGVjdXRlQ2hhbGxlbmdlJCA9IGZ1bmN0aW9uIGV4ZWN1dGVDaGFsbGVuZ2UkKCkge1xuICAgIHZhciBjb2RlID0gY29tbW9uLmVkaXRvci5nZXRWYWx1ZSgpO1xuICAgIHZhciBvcmlnaW5hbENvZGUgPSBjb2RlO1xuICAgIHZhciBoZWFkID0gY29tbW9uLmFycmF5VG9OZXdMaW5lU3RyaW5nKGNvbW1vbi5oZWFkKTtcbiAgICB2YXIgdGFpbCA9IGNvbW1vbi5hcnJheVRvTmV3TGluZVN0cmluZyhjb21tb24udGFpbCk7XG4gICAgdmFyIGNvbWJpbmVkQ29kZSA9IGhlYWQgKyBjb2RlICsgdGFpbDtcblxuICAgIGdhKCdzZW5kJywgJ2V2ZW50JywgJ0NoYWxsZW5nZScsICdyYW4tY29kZScsIGNvbW1vbi5nYU5hbWUpO1xuXG4gICAgLy8gcnVuIGNoZWNrcyBmb3IgdW5zYWZlIGNvZGVcbiAgICByZXR1cm4gZGV0ZWN0VW5zYWZlQ29kZSQoY29kZSlcbiAgICAvLyBhZGQgaGVhZCBhbmQgdGFpbCBhbmQgZGV0ZWN0IGxvb3BzXG4gICAgLm1hcChmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoY2hhbGxlbmdlVHlwZSAhPT0gY2hhbGxlbmdlVHlwZXMuSFRNTCkge1xuICAgICAgICByZXR1cm4gJzxzY3JpcHQ+OycgKyBhZGRMb29wUHJvdGVjdChjb21iaW5lZENvZGUpICsgJy8qKi88L3NjcmlwdD4nO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gYWRkTG9vcFByb3RlY3QoY29tYmluZWRDb2RlKTtcbiAgICB9KS5mbGF0TWFwKGZ1bmN0aW9uIChjb2RlKSB7XG4gICAgICByZXR1cm4gdXBkYXRlUHJldmlldyQoY29kZSk7XG4gICAgfSkuZmxhdE1hcChmdW5jdGlvbiAoY29kZSkge1xuICAgICAgdmFyIG91dHB1dCA9IHZvaWQgMDtcblxuICAgICAgaWYgKGNoYWxsZW5nZVR5cGUgPT09IGNoYWxsZW5nZVR5cGVzLkhUTUwgJiYgY29tbW9uLmhhc0pzKGNvZGUpKSB7XG4gICAgICAgIG91dHB1dCA9IGNvbW1vbi5nZXRKc091dHB1dChnZXRKc0Zyb21IdG1sKGNvZGUpKTtcbiAgICAgIH0gZWxzZSBpZiAoY2hhbGxlbmdlVHlwZSAhPT0gY2hhbGxlbmdlVHlwZXMuSFRNTCkge1xuICAgICAgICBvdXRwdXQgPSBjb21tb24uZ2V0SnNPdXRwdXQoYWRkTG9vcFByb3RlY3QoY29tYmluZWRDb2RlKSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBjb21tb24ucnVuUHJldmlld1Rlc3RzJCh7XG4gICAgICAgIHRlc3RzOiBjb21tb24udGVzdHMuc2xpY2UoKSxcbiAgICAgICAgb3JpZ2luYWxDb2RlOiBvcmlnaW5hbENvZGUsXG4gICAgICAgIG91dHB1dDogb3V0cHV0XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfTtcblxuICByZXR1cm4gY29tbW9uO1xufSh3aW5kb3cpOyIsIid1c2Ugc3RyaWN0Jztcblxud2luZG93LmNvbW1vbiA9IGZ1bmN0aW9uIChnbG9iYWwpIHtcbiAgdmFyIENvZGVNaXJyb3IgPSBnbG9iYWwuQ29kZU1pcnJvcixcbiAgICAgIGRvYyA9IGdsb2JhbC5kb2N1bWVudCxcbiAgICAgIF9nbG9iYWwkY29tbW9uID0gZ2xvYmFsLmNvbW1vbixcbiAgICAgIGNvbW1vbiA9IF9nbG9iYWwkY29tbW9uID09PSB1bmRlZmluZWQgPyB7IGluaXQ6IFtdIH0gOiBfZ2xvYmFsJGNvbW1vbjtcbiAgdmFyIGNoYWxsZW5nZVR5cGVzID0gY29tbW9uLmNoYWxsZW5nZVR5cGVzLFxuICAgICAgX2NvbW1vbiRjaGFsbGVuZ2VUeXBlID0gY29tbW9uLmNoYWxsZW5nZVR5cGUsXG4gICAgICBjaGFsbGVuZ2VUeXBlID0gX2NvbW1vbiRjaGFsbGVuZ2VUeXBlID09PSB1bmRlZmluZWQgPyAnMCcgOiBfY29tbW9uJGNoYWxsZW5nZVR5cGU7XG5cblxuICBpZiAoIUNvZGVNaXJyb3IgfHwgY2hhbGxlbmdlVHlwZSAhPT0gY2hhbGxlbmdlVHlwZXMuSlMgJiYgY2hhbGxlbmdlVHlwZSAhPT0gY2hhbGxlbmdlVHlwZXMuQk9ORklSRSkge1xuICAgIGNvbW1vbi51cGRhdGVPdXRwdXREaXNwbGF5ID0gZnVuY3Rpb24gKCkge307XG4gICAgY29tbW9uLmFwcGVuZFRvT3V0cHV0RGlzcGxheSA9IGZ1bmN0aW9uICgpIHt9O1xuICAgIHJldHVybiBjb21tb247XG4gIH1cblxuICB2YXIgY29kZU91dHB1dCA9IENvZGVNaXJyb3IuZnJvbVRleHRBcmVhKGRvYy5nZXRFbGVtZW50QnlJZCgnY29kZU91dHB1dCcpLCB7XG4gICAgbGluZU51bWJlcnM6IGZhbHNlLFxuICAgIG1vZGU6ICd0ZXh0JyxcbiAgICB0aGVtZTogJ21vbm9rYWknLFxuICAgIHJlYWRPbmx5OiAnbm9jdXJzb3InLFxuICAgIGxpbmVXcmFwcGluZzogdHJ1ZVxuICB9KTtcblxuICBjb2RlT3V0cHV0LnNldFZhbHVlKCcvKipcXG4gICogWW91ciBvdXRwdXQgd2lsbCBnbyBoZXJlLlxcbiAgKiBBbnkgY29uc29sZS5sb2coKSAtdHlwZVxcbiAgKiBzdGF0ZW1lbnRzIHdpbGwgYXBwZWFyIGluXFxuICAqIHlvdXIgYnJvd3NlclxcJ3MgRGV2VG9vbHNcXG4gICogSmF2YVNjcmlwdCBjb25zb2xlLlxcbiAgKi8nKTtcblxuICBjb2RlT3V0cHV0LnNldFNpemUoJzEwMCUnLCAnMTAwJScpO1xuXG4gIGNvbW1vbi51cGRhdGVPdXRwdXREaXNwbGF5ID0gZnVuY3Rpb24gdXBkYXRlT3V0cHV0RGlzcGxheSgpIHtcbiAgICB2YXIgc3RyID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiAnJztcblxuICAgIGlmICh0eXBlb2Ygc3RyICE9PSAnc3RyaW5nJykge1xuICAgICAgc3RyID0gSlNPTi5zdHJpbmdpZnkoc3RyKTtcbiAgICB9XG4gICAgY29kZU91dHB1dC5zZXRWYWx1ZShzdHIpO1xuICAgIHJldHVybiBzdHI7XG4gIH07XG5cbiAgY29tbW9uLmFwcGVuZFRvT3V0cHV0RGlzcGxheSA9IGZ1bmN0aW9uIGFwcGVuZFRvT3V0cHV0RGlzcGxheSgpIHtcbiAgICB2YXIgc3RyID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiAnJztcblxuICAgIGNvZGVPdXRwdXQuc2V0VmFsdWUoY29kZU91dHB1dC5nZXRWYWx1ZSgpICsgc3RyKTtcbiAgICByZXR1cm4gc3RyO1xuICB9O1xuXG4gIHJldHVybiBjb21tb247XG59KHdpbmRvdyk7IiwiJ3VzZSBzdHJpY3QnO1xuXG53aW5kb3cuY29tbW9uID0gZnVuY3Rpb24gKF9yZWYpIHtcbiAgdmFyIF9yZWYkY29tbW9uID0gX3JlZi5jb21tb24sXG4gICAgICBjb21tb24gPSBfcmVmJGNvbW1vbiA9PT0gdW5kZWZpbmVkID8geyBpbml0OiBbXSB9IDogX3JlZiRjb21tb247XG5cblxuICBjb21tb24ubG9ja1RvcCA9IGZ1bmN0aW9uIGxvY2tUb3AoKSB7XG4gICAgdmFyIG1hZ2lWYWw7XG5cbiAgICBpZiAoJCh3aW5kb3cpLndpZHRoKCkgPj0gOTkwKSB7XG4gICAgICBpZiAoJCgnLmVkaXRvclNjcm9sbERpdicpLmh0bWwoKSkge1xuXG4gICAgICAgIG1hZ2lWYWwgPSAkKHdpbmRvdykuaGVpZ2h0KCkgLSAkKCcubmF2YmFyJykuaGVpZ2h0KCk7XG5cbiAgICAgICAgaWYgKG1hZ2lWYWwgPCAwKSB7XG4gICAgICAgICAgbWFnaVZhbCA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgJCgnLmVkaXRvclNjcm9sbERpdicpLmNzcygnaGVpZ2h0JywgbWFnaVZhbCAtIDUwICsgJ3B4Jyk7XG4gICAgICB9XG5cbiAgICAgIG1hZ2lWYWwgPSAkKHdpbmRvdykuaGVpZ2h0KCkgLSAkKCcubmF2YmFyJykuaGVpZ2h0KCk7XG5cbiAgICAgIGlmIChtYWdpVmFsIDwgMCkge1xuICAgICAgICBtYWdpVmFsID0gMDtcbiAgICAgIH1cblxuICAgICAgJCgnLnNjcm9sbC1sb2NrZXInKS5jc3MoJ21pbi1oZWlnaHQnLCAkKCcuZWRpdG9yU2Nyb2xsRGl2JykuaGVpZ2h0KCkpLmNzcygnaGVpZ2h0JywgbWFnaVZhbCAtIDUwKTtcbiAgICB9IGVsc2Uge1xuICAgICAgJCgnLmVkaXRvclNjcm9sbERpdicpLmNzcygnbWF4LWhlaWdodCcsIDUwMCArICdweCcpO1xuXG4gICAgICAkKCcuc2Nyb2xsLWxvY2tlcicpLmNzcygncG9zaXRpb24nLCAnaW5oZXJpdCcpLmNzcygndG9wJywgJ2luaGVyaXQnKS5jc3MoJ3dpZHRoJywgJzEwMCUnKS5jc3MoJ21heC1oZWlnaHQnLCAnMTAwJScpO1xuICAgIH1cbiAgfTtcblxuICBjb21tb24uaW5pdC5wdXNoKGZ1bmN0aW9uICgkKSB7XG4gICAgLy8gZmFrZWlwaG9uZSBwb3NpdGlvbmluZyBob3RmaXhcbiAgICBpZiAoJCgnLmlwaG9uZS1wb3NpdGlvbicpLmh0bWwoKSB8fCAkKCcuaXBob25lJykuaHRtbCgpKSB7XG4gICAgICB2YXIgc3RhcnRJcGhvbmVQb3NpdGlvbiA9IHBhcnNlSW50KCQoJy5pcGhvbmUtcG9zaXRpb24nKS5jc3MoJ3RvcCcpLnJlcGxhY2UoJ3B4JywgJycpLCAxMCk7XG5cbiAgICAgIHZhciBzdGFydElwaG9uZSA9IHBhcnNlSW50KCQoJy5pcGhvbmUnKS5jc3MoJ3RvcCcpLnJlcGxhY2UoJ3B4JywgJycpLCAxMCk7XG5cbiAgICAgICQod2luZG93KS5vbignc2Nyb2xsJywgZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgY291cnNlSGVpZ2h0ID0gJCgnLmNvdXJzZXdhcmUtaGVpZ2h0JykuaGVpZ2h0KCk7XG4gICAgICAgIHZhciBjb3Vyc2VUb3AgPSAkKCcuY291cnNld2FyZS1oZWlnaHQnKS5vZmZzZXQoKS50b3A7XG4gICAgICAgIHZhciB3aW5kb3dTY3JvbGxUb3AgPSAkKHdpbmRvdykuc2Nyb2xsVG9wKCk7XG4gICAgICAgIHZhciBwaG9uZUhlaWdodCA9ICQoJy5pcGhvbmUtcG9zaXRpb24nKS5oZWlnaHQoKTtcblxuICAgICAgICBpZiAoY291cnNlSGVpZ2h0ICsgY291cnNlVG9wIC0gd2luZG93U2Nyb2xsVG9wIC0gcGhvbmVIZWlnaHQgPD0gMCkge1xuICAgICAgICAgICQoJy5pcGhvbmUtcG9zaXRpb24nKS5jc3MoJ3RvcCcsIHN0YXJ0SXBob25lUG9zaXRpb24gKyBjb3Vyc2VIZWlnaHQgKyBjb3Vyc2VUb3AgLSB3aW5kb3dTY3JvbGxUb3AgLSBwaG9uZUhlaWdodCk7XG5cbiAgICAgICAgICAkKCcuaXBob25lJykuY3NzKCd0b3AnLCBzdGFydElwaG9uZVBvc2l0aW9uICsgY291cnNlSGVpZ2h0ICsgY291cnNlVG9wIC0gd2luZG93U2Nyb2xsVG9wIC0gcGhvbmVIZWlnaHQgKyAxMjApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICQoJy5pcGhvbmUtcG9zaXRpb24nKS5jc3MoJ3RvcCcsIHN0YXJ0SXBob25lUG9zaXRpb24pO1xuICAgICAgICAgICQoJy5pcGhvbmUnKS5jc3MoJ3RvcCcsIHN0YXJ0SXBob25lKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKCQoJy5zY3JvbGwtbG9ja2VyJykuaHRtbCgpKSB7XG5cbiAgICAgIGlmICgkKCcuc2Nyb2xsLWxvY2tlcicpLmh0bWwoKSkge1xuICAgICAgICBjb21tb24ubG9ja1RvcCgpO1xuICAgICAgICAkKHdpbmRvdykub24oJ3Jlc2l6ZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBjb21tb24ubG9ja1RvcCgpO1xuICAgICAgICB9KTtcbiAgICAgICAgJCh3aW5kb3cpLm9uKCdzY3JvbGwnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgY29tbW9uLmxvY2tUb3AoKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHZhciBleGVjSW5Qcm9ncmVzcyA9IGZhbHNlO1xuXG4gICAgICAvLyB3aHkgaXMgdGhpcyBub3QgJD8/P1xuICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Njcm9sbC1sb2NrZXInKS5hZGRFdmVudExpc3RlbmVyKCdwcmV2aWV3VXBkYXRlU3B5JywgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgaWYgKGV4ZWNJblByb2dyZXNzKSB7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgZXhlY0luUHJvZ3Jlc3MgPSB0cnVlO1xuICAgICAgICByZXR1cm4gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgaWYgKCQoJCgnLnNjcm9sbC1sb2NrZXInKS5jaGlsZHJlbigpWzBdKS5oZWlnaHQoKSAtIDgwMCA+IGUuZGV0YWlsKSB7XG4gICAgICAgICAgICAkKCcuc2Nyb2xsLWxvY2tlcicpLnNjcm9sbFRvcChlLmRldGFpbCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHZhciBzY3JvbGxUb3AgPSAkKCQoJy5zY3JvbGwtbG9ja2VyJykuY2hpbGRyZW4oKVswXSkuaGVpZ2h0KCk7XG5cbiAgICAgICAgICAgICQoJy5zY3JvbGwtbG9ja2VyJykuYW5pbWF0ZSh7IHNjcm9sbFRvcDogc2Nyb2xsVG9wIH0sIDE3NSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGV4ZWNJblByb2dyZXNzID0gZmFsc2U7XG4gICAgICAgIH0sIDc1MCk7XG4gICAgICB9LCBmYWxzZSk7XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4gY29tbW9uO1xufSh3aW5kb3cpOyIsIid1c2Ugc3RyaWN0Jztcblxud2luZG93LmNvbW1vbiA9IGZ1bmN0aW9uIChfcmVmKSB7XG4gIHZhciBfcmVmJGNvbW1vbiA9IF9yZWYuY29tbW9uLFxuICAgICAgY29tbW9uID0gX3JlZiRjb21tb24gPT09IHVuZGVmaW5lZCA/IHsgaW5pdDogW10gfSA6IF9yZWYkY29tbW9uO1xuXG4gIGNvbW1vbi5pbml0LnB1c2goZnVuY3Rpb24gKCQpIHtcbiAgICAkKCcjcmVwb3J0LWlzc3VlJykub24oJ2NsaWNrJywgZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIHRleHRNZXNzYWdlID0gWydDaGFsbGVuZ2UgWycsIGNvbW1vbi5jaGFsbGVuZ2VOYW1lIHx8IHdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZSwgJ10oJywgd2luZG93LmxvY2F0aW9uLmhyZWYsICcpIGhhcyBhbiBpc3N1ZS5cXG4nLCAnVXNlciBBZ2VudCBpczogPGNvZGU+JywgbmF2aWdhdG9yLnVzZXJBZ2VudCwgJzwvY29kZT4uXFxuJywgJ1BsZWFzZSBkZXNjcmliZSBob3cgdG8gcmVwcm9kdWNlIHRoaXMgaXNzdWUsIGFuZCBpbmNsdWRlICcsICdsaW5rcyB0byBzY3JlZW5zaG90cyBpZiBwb3NzaWJsZS5cXG5cXG4nXS5qb2luKCcnKTtcblxuICAgICAgaWYgKGNvbW1vbi5lZGl0b3IgJiYgdHlwZW9mIGNvbW1vbi5lZGl0b3IuZ2V0VmFsdWUgPT09ICdmdW5jdGlvbicgJiYgY29tbW9uLmVkaXRvci5nZXRWYWx1ZSgpLnRyaW0oKSkge1xuICAgICAgICB2YXIgdHlwZTtcbiAgICAgICAgc3dpdGNoIChjb21tb24uY2hhbGxlbmdlVHlwZSkge1xuICAgICAgICAgIGNhc2UgY29tbW9uLmNoYWxsZW5nZVR5cGVzLkhUTUw6XG4gICAgICAgICAgICB0eXBlID0gJ2h0bWwnO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBjb21tb24uY2hhbGxlbmdlVHlwZXMuSlM6XG4gICAgICAgICAgY2FzZSBjb21tb24uY2hhbGxlbmdlVHlwZXMuQk9ORklSRTpcbiAgICAgICAgICAgIHR5cGUgPSAnamF2YXNjcmlwdCc7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgdHlwZSA9ICcnO1xuICAgICAgICB9XG5cbiAgICAgICAgdGV4dE1lc3NhZ2UgKz0gWydNeSBjb2RlOlxcbmBgYCcsIHR5cGUsICdcXG4nLCBjb21tb24uZWRpdG9yLmdldFZhbHVlKCksICdcXG5gYGBcXG5cXG4nXS5qb2luKCcnKTtcbiAgICAgIH1cblxuICAgICAgdGV4dE1lc3NhZ2UgPSBlbmNvZGVVUklDb21wb25lbnQodGV4dE1lc3NhZ2UpO1xuXG4gICAgICAkKCcjaXNzdWUtbW9kYWwnKS5tb2RhbCgnaGlkZScpO1xuICAgICAgd2luZG93Lm9wZW4oJ2h0dHBzOi8vZ2l0aHViLmNvbS9mcmVlY29kZWNhbXBjaGluYS9mcmVlY29kZWNhbXAuY24vaXNzdWVzL25ldz8mYm9keT0nICsgdGV4dE1lc3NhZ2UsICdfYmxhbmsnKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgcmV0dXJuIGNvbW1vbjtcbn0od2luZG93KTsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9leHRlbmRzID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07IGZvciAodmFyIGtleSBpbiBzb3VyY2UpIHsgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2UsIGtleSkpIHsgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTsgfSB9IH0gcmV0dXJuIHRhcmdldDsgfTtcblxuZnVuY3Rpb24gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKG9iaiwga2V5cykgeyB2YXIgdGFyZ2V0ID0ge307IGZvciAodmFyIGkgaW4gb2JqKSB7IGlmIChrZXlzLmluZGV4T2YoaSkgPj0gMCkgY29udGludWU7IGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwgaSkpIGNvbnRpbnVlOyB0YXJnZXRbaV0gPSBvYmpbaV07IH0gcmV0dXJuIHRhcmdldDsgfVxuXG53aW5kb3cuY29tbW9uID0gZnVuY3Rpb24gKGdsb2JhbCkge1xuICB2YXIgT2JzZXJ2YWJsZSA9IGdsb2JhbC5SeC5PYnNlcnZhYmxlLFxuICAgICAgY2hhaSA9IGdsb2JhbC5jaGFpLFxuICAgICAgX2dsb2JhbCRjb21tb24gPSBnbG9iYWwuY29tbW9uLFxuICAgICAgY29tbW9uID0gX2dsb2JhbCRjb21tb24gPT09IHVuZGVmaW5lZCA/IHsgaW5pdDogW10gfSA6IF9nbG9iYWwkY29tbW9uO1xuXG5cbiAgY29tbW9uLnJ1blRlc3RzJCA9IGZ1bmN0aW9uIHJ1blRlc3RzJChfcmVmKSB7XG4gICAgdmFyIGNvZGUgPSBfcmVmLmNvZGUsXG4gICAgICAgIG9yaWdpbmFsQ29kZSA9IF9yZWYub3JpZ2luYWxDb2RlLFxuICAgICAgICB1c2VyVGVzdHMgPSBfcmVmLnVzZXJUZXN0cyxcbiAgICAgICAgcmVzdCA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhfcmVmLCBbXCJjb2RlXCIsIFwib3JpZ2luYWxDb2RlXCIsIFwidXNlclRlc3RzXCJdKTtcblxuICAgIHJldHVybiBPYnNlcnZhYmxlLmZyb20odXNlclRlc3RzKS5tYXAoZnVuY3Rpb24gKHRlc3QpIHtcblxuICAgICAgLyogZXNsaW50LWRpc2FibGUgbm8tdW51c2VkLXZhcnMgKi9cbiAgICAgIHZhciBhc3NlcnQgPSBjaGFpLmFzc2VydDtcbiAgICAgIHZhciBlZGl0b3IgPSB7XG4gICAgICAgIGdldFZhbHVlOiBmdW5jdGlvbiBnZXRWYWx1ZSgpIHtcbiAgICAgICAgICByZXR1cm4gb3JpZ2luYWxDb2RlO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgLyogZXNsaW50LWVuYWJsZSBuby11bnVzZWQtdmFycyAqL1xuXG4gICAgICB0cnkge1xuICAgICAgICBpZiAodGVzdCkge1xuICAgICAgICAgIC8qIGVzbGludC1kaXNhYmxlIG5vLWV2YWwgICovXG4gICAgICAgICAgZXZhbChjb21tb24ucmVhc3NlbWJsZVRlc3QoY29kZSwgdGVzdCkpO1xuICAgICAgICAgIC8qIGVzbGludC1lbmFibGUgbm8tZXZhbCAqL1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHRlc3QuZXJyID0gZS5tZXNzYWdlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGVzdDtcbiAgICB9KS50b0FycmF5KCkubWFwKGZ1bmN0aW9uICh0ZXN0cykge1xuICAgICAgcmV0dXJuIF9leHRlbmRzKHt9LCByZXN0LCB7IHRlc3RzOiB0ZXN0cyB9KTtcbiAgICB9KTtcbiAgfTtcblxuICByZXR1cm4gY29tbW9uO1xufSh3aW5kb3cpOyIsIid1c2Ugc3RyaWN0Jztcblxud2luZG93LmNvbW1vbiA9IGZ1bmN0aW9uIChnbG9iYWwpIHtcbiAgdmFyICQgPSBnbG9iYWwuJCxcbiAgICAgIG1vbWVudCA9IGdsb2JhbC5tb21lbnQsXG4gICAgICBfZ2xvYmFsJGdhID0gZ2xvYmFsLmdhLFxuICAgICAgZ2EgPSBfZ2xvYmFsJGdhID09PSB1bmRlZmluZWQgPyBmdW5jdGlvbiAoKSB7fSA6IF9nbG9iYWwkZ2EsXG4gICAgICBfZ2xvYmFsJGNvbW1vbiA9IGdsb2JhbC5jb21tb24sXG4gICAgICBjb21tb24gPSBfZ2xvYmFsJGNvbW1vbiA9PT0gdW5kZWZpbmVkID8geyBpbml0OiBbXSB9IDogX2dsb2JhbCRjb21tb247XG5cblxuICBmdW5jdGlvbiBzdWJtaXRDaGFsbGVuZ2VIYW5kbGVyKGUpIHtcbiAgICBlLnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICB2YXIgc29sdXRpb24gPSBjb21tb24uZWRpdG9yLmdldFZhbHVlKCk7XG5cbiAgICAkKCcjc3VibWl0LWNoYWxsZW5nZScpLmF0dHIoJ2Rpc2FibGVkJywgJ3RydWUnKS5yZW1vdmVDbGFzcygnYnRuLXByaW1hcnknKS5hZGRDbGFzcygnYnRuLXdhcm5pbmcgZGlzYWJsZWQnKTtcblxuICAgIHZhciAkY2hlY2ttYXJrQ29udGFpbmVyID0gJCgnI2NoZWNrbWFyay1jb250YWluZXInKTtcbiAgICAkY2hlY2ttYXJrQ29udGFpbmVyLmNzcyh7IGhlaWdodDogJGNoZWNrbWFya0NvbnRhaW5lci5pbm5lckhlaWdodCgpIH0pO1xuXG4gICAgJCgnI2NoYWxsZW5nZS1jaGVja21hcmsnKS5hZGRDbGFzcygnem9vbU91dFVwJylcbiAgICAvLyAucmVtb3ZlQ2xhc3MoJ3pvb21JbkRvd24nKVxuICAgIC5kZWxheSgxMDAwKS5xdWV1ZShmdW5jdGlvbiAobmV4dCkge1xuICAgICAgJCh0aGlzKS5yZXBsYWNlV2l0aCgnPGRpdiBpZD1cImNoYWxsZW5nZS1zcGlubmVyXCIgJyArICdjbGFzcz1cImFuaW1hdGVkIHpvb21JblVwIGlubmVyLWNpcmNsZXMtbG9hZGVyXCI+JyArICdzdWJtaXR0aW5nLi4uPC9kaXY+Jyk7XG4gICAgICBuZXh0KCk7XG4gICAgfSk7XG5cbiAgICB2YXIgdGltZXpvbmUgPSAnVVRDJztcbiAgICB0cnkge1xuICAgICAgdGltZXpvbmUgPSBtb21lbnQudHouZ3Vlc3MoKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGVyci5tZXNzYWdlID0gJ1xcbiAgICAgICAgICBrbm93biBidWcsIHNlZTogaHR0cHM6Ly9naXRodWIuY29tL21vbWVudC9tb21lbnQtdGltZXpvbmUvaXNzdWVzLzI5NDpcXG4gICAgICAgICAgJyArIGVyci5tZXNzYWdlICsgJ1xcbiAgICAgICAgJztcbiAgICAgIGNvbnNvbGUuZXJyb3IoZXJyKTtcbiAgICB9XG4gICAgdmFyIGRhdGEgPSBKU09OLnN0cmluZ2lmeSh7XG4gICAgICBpZDogY29tbW9uLmNoYWxsZW5nZUlkLFxuICAgICAgbmFtZTogY29tbW9uLmNoYWxsZW5nZU5hbWUsXG4gICAgICBjaGFsbGVuZ2VUeXBlOiArY29tbW9uLmNoYWxsZW5nZVR5cGUsXG4gICAgICBzb2x1dGlvbjogc29sdXRpb24sXG4gICAgICB0aW1lem9uZTogdGltZXpvbmVcbiAgICB9KTtcblxuICAgICQuYWpheCh7XG4gICAgICB1cmw6ICcvY29tcGxldGVkLWNoYWxsZW5nZS8nLFxuICAgICAgdHlwZTogJ1BPU1QnLFxuICAgICAgZGF0YTogZGF0YSxcbiAgICAgIGNvbnRlbnRUeXBlOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICBkYXRhVHlwZTogJ2pzb24nXG4gICAgfSkuc3VjY2VzcyhmdW5jdGlvbiAocmVzKSB7XG4gICAgICBpZiAocmVzKSB7XG4gICAgICAgIHdpbmRvdy5sb2NhdGlvbiA9ICcvY2hhbGxlbmdlcy9uZXh0LWNoYWxsZW5nZT9pZD0nICsgY29tbW9uLmNoYWxsZW5nZUlkO1xuICAgICAgfVxuICAgIH0pLmZhaWwoZnVuY3Rpb24gKCkge1xuICAgICAgd2luZG93LmxvY2F0aW9uLnJlcGxhY2Uod2luZG93LmxvY2F0aW9uLmhyZWYpO1xuICAgIH0pO1xuICB9XG5cbiAgY29tbW9uLnNob3dDb21wbGV0aW9uID0gZnVuY3Rpb24gc2hvd0NvbXBsZXRpb24oKSB7XG5cbiAgICBnYSgnc2VuZCcsICdldmVudCcsICdDaGFsbGVuZ2UnLCAnc29sdmVkJywgY29tbW9uLmdhTmFtZSwgdHJ1ZSk7XG5cbiAgICAkKCcjY29tcGxldGUtY291cnNld2FyZS1kaWFsb2cnKS5tb2RhbCgnc2hvdycpO1xuICAgICQoJyNjb21wbGV0ZS1jb3Vyc2V3YXJlLWRpYWxvZyAubW9kYWwtaGVhZGVyJykuY2xpY2soKTtcblxuICAgICQoJyNzdWJtaXQtY2hhbGxlbmdlJykub2ZmKCdjbGljaycpO1xuICAgICQoJyNzdWJtaXQtY2hhbGxlbmdlJykub24oJ2NsaWNrJywgc3VibWl0Q2hhbGxlbmdlSGFuZGxlcik7XG4gIH07XG5cbiAgcmV0dXJuIGNvbW1vbjtcbn0od2luZG93KTsiLCIndXNlIHN0cmljdCc7XG5cbndpbmRvdy5jb21tb24gPSBmdW5jdGlvbiAoX3JlZikge1xuICB2YXIgJCA9IF9yZWYuJCxcbiAgICAgIF9yZWYkY29tbW9uID0gX3JlZi5jb21tb24sXG4gICAgICBjb21tb24gPSBfcmVmJGNvbW1vbiA9PT0gdW5kZWZpbmVkID8geyBpbml0OiBbXSB9IDogX3JlZiRjb21tb247XG5cbiAgdmFyIHN0ZXBDbGFzcyA9ICcuY2hhbGxlbmdlLXN0ZXAnO1xuICB2YXIgcHJldkJ0bkNsYXNzID0gJy5jaGFsbGVuZ2Utc3RlcC1idG4tcHJldic7XG4gIHZhciBuZXh0QnRuQ2xhc3MgPSAnLmNoYWxsZW5nZS1zdGVwLWJ0bi1uZXh0JztcbiAgdmFyIGFjdGlvbkJ0bkNsYXNzID0gJy5jaGFsbGVuZ2Utc3RlcC1idG4tYWN0aW9uJztcbiAgdmFyIGZpbmlzaEJ0bkNsYXNzID0gJy5jaGFsbGVuZ2Utc3RlcC1idG4tZmluaXNoJztcbiAgdmFyIHN1Ym1pdEJ0bklkID0gJyNjaGFsbGVuZ2Utc3RlcC1idG4tc3VibWl0JztcbiAgdmFyIHN1Ym1pdE1vZGFsSWQgPSAnI2NoYWxsZW5nZS1zdGVwLW1vZGFsJztcblxuICBmdW5jdGlvbiBnZXRQcmV2aW91c1N0ZXAoJGNoYWxsZW5nZVN0ZXBzKSB7XG4gICAgdmFyICRwcmV2U3RlcCA9IGZhbHNlO1xuICAgIHZhciBwcmV2U3RlcEluZGV4ID0gMDtcbiAgICAkY2hhbGxlbmdlU3RlcHMuZWFjaChmdW5jdGlvbiAoaW5kZXgpIHtcbiAgICAgIHZhciAkc3RlcCA9ICQodGhpcyk7XG4gICAgICBpZiAoISRzdGVwLmhhc0NsYXNzKCdoaWRkZW4nKSkge1xuICAgICAgICBwcmV2U3RlcEluZGV4ID0gaW5kZXggLSAxO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgJHByZXZTdGVwID0gJGNoYWxsZW5nZVN0ZXBzW3ByZXZTdGVwSW5kZXhdO1xuXG4gICAgcmV0dXJuICRwcmV2U3RlcDtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldE5leHRTdGVwKCRjaGFsbGVuZ2VTdGVwcykge1xuICAgIHZhciBsZW5ndGggPSAkY2hhbGxlbmdlU3RlcHMubGVuZ3RoO1xuICAgIHZhciAkbmV4dFN0ZXAgPSBmYWxzZTtcbiAgICB2YXIgbmV4dFN0ZXBJbmRleCA9IDA7XG4gICAgJGNoYWxsZW5nZVN0ZXBzLmVhY2goZnVuY3Rpb24gKGluZGV4KSB7XG4gICAgICB2YXIgJHN0ZXAgPSAkKHRoaXMpO1xuICAgICAgaWYgKCEkc3RlcC5oYXNDbGFzcygnaGlkZGVuJykgJiYgaW5kZXggKyAxICE9PSBsZW5ndGgpIHtcbiAgICAgICAgbmV4dFN0ZXBJbmRleCA9IGluZGV4ICsgMTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgICRuZXh0U3RlcCA9ICRjaGFsbGVuZ2VTdGVwc1tuZXh0U3RlcEluZGV4XTtcblxuICAgIHJldHVybiAkbmV4dFN0ZXA7XG4gIH1cblxuICBmdW5jdGlvbiBoYW5kbGVQcmV2U3RlcENsaWNrKGUpIHtcbiAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgdmFyIHByZXZTdGVwID0gZ2V0UHJldmlvdXNTdGVwKCQoc3RlcENsYXNzKSk7XG4gICAgJCh0aGlzKS5wYXJlbnQoKS5wYXJlbnQoKS5yZW1vdmVDbGFzcygnc2xpZGVJbkxlZnQgc2xpZGVJblJpZ2h0JykuYWRkQ2xhc3MoJ2FuaW1hdGVkIGZhZGVPdXRSaWdodCBmYXN0LWFuaW1hdGlvbicpLmRlbGF5KDI1MCkucXVldWUoZnVuY3Rpb24gKHByZXYpIHtcbiAgICAgICQodGhpcykuYWRkQ2xhc3MoJ2hpZGRlbicpO1xuICAgICAgaWYgKHByZXZTdGVwKSB7XG4gICAgICAgICQocHJldlN0ZXApLnJlbW92ZUNsYXNzKCdoaWRkZW4nKS5yZW1vdmVDbGFzcygnZmFkZU91dExlZnQgZmFkZU91dFJpZ2h0JykuYWRkQ2xhc3MoJ2FuaW1hdGVkIHNsaWRlSW5MZWZ0IGZhc3QtYW5pbWF0aW9uJykuZGVsYXkoNTAwKS5xdWV1ZShmdW5jdGlvbiAocHJldikge1xuICAgICAgICAgIHByZXYoKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBwcmV2KCk7XG4gICAgfSk7XG4gIH1cblxuICBmdW5jdGlvbiBoYW5kbGVOZXh0U3RlcENsaWNrKGUpIHtcbiAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgdmFyIG5leHRTdGVwID0gZ2V0TmV4dFN0ZXAoJChzdGVwQ2xhc3MpKTtcbiAgICAkKHRoaXMpLnBhcmVudCgpLnBhcmVudCgpLnJlbW92ZUNsYXNzKCdzbGlkZUluUmlnaHQgc2xpZGVJbkxlZnQnKS5hZGRDbGFzcygnYW5pbWF0ZWQgZmFkZU91dExlZnQgZmFzdC1hbmltYXRpb24nKS5kZWxheSgyNTApLnF1ZXVlKGZ1bmN0aW9uIChuZXh0KSB7XG4gICAgICAkKHRoaXMpLmFkZENsYXNzKCdoaWRkZW4nKTtcbiAgICAgIGlmIChuZXh0U3RlcCkge1xuICAgICAgICAkKG5leHRTdGVwKS5yZW1vdmVDbGFzcygnaGlkZGVuJykucmVtb3ZlQ2xhc3MoJ2ZhZGVPdXRSaWdodCBmYWRlT3V0TGVmdCcpLmFkZENsYXNzKCdhbmltYXRlZCBzbGlkZUluUmlnaHQgZmFzdC1hbmltYXRpb24nKS5kZWxheSg1MDApLnF1ZXVlKGZ1bmN0aW9uIChuZXh0KSB7XG4gICAgICAgICAgbmV4dCgpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIG5leHQoKTtcbiAgICB9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGhhbmRsZUFjdGlvbkNsaWNrKGUpIHtcbiAgICB2YXIgcHJvcHMgPSBjb21tb24uY2hhbGxlbmdlU2VlZFswXSB8fCB7IHN0ZXBJbmRleDogW10gfTtcblxuICAgIHZhciAkZWwgPSAkKHRoaXMpO1xuICAgIHZhciBpbmRleCA9ICskZWwuYXR0cignaWQnKTtcbiAgICB2YXIgcHJvcEluZGV4ID0gcHJvcHMuc3RlcEluZGV4LmluZGV4T2YoaW5kZXgpO1xuXG4gICAgaWYgKHByb3BJbmRleCA9PT0gLTEpIHtcbiAgICAgIHJldHVybiAkZWwucGFyZW50KCkuZmluZCgnLmRpc2FibGVkJykucmVtb3ZlQ2xhc3MoJ2Rpc2FibGVkJyk7XG4gICAgfVxuXG4gICAgLy8gYW4gQVBJIGFjdGlvblxuICAgIC8vIHByZXZlbnQgbGluayBmcm9tIG9wZW5pbmdcbiAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgdmFyIHByb3AgPSBwcm9wcy5wcm9wZXJ0aWVzW3Byb3BJbmRleF07XG4gICAgdmFyIGFwaSA9IHByb3BzLmFwaXNbcHJvcEluZGV4XTtcbiAgICBpZiAoY29tbW9uW3Byb3BdKSB7XG4gICAgICByZXR1cm4gJGVsLnBhcmVudCgpLmZpbmQoJy5kaXNhYmxlZCcpLnJlbW92ZUNsYXNzKCdkaXNhYmxlZCcpO1xuICAgIH1cbiAgICByZXR1cm4gJC5wb3N0KGFwaSkuZG9uZShmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgLy8gYXNzdW1lIGEgYm9vbGVhbiBpbmRpY2F0ZXMgcGFzc2luZ1xuICAgICAgaWYgKHR5cGVvZiBkYXRhID09PSAnYm9vbGVhbicpIHtcbiAgICAgICAgcmV0dXJuICRlbC5wYXJlbnQoKS5maW5kKCcuZGlzYWJsZWQnKS5yZW1vdmVDbGFzcygnZGlzYWJsZWQnKTtcbiAgICAgIH1cbiAgICAgIC8vIGFzc3VtZSBhcGkgcmV0dXJucyBzdHJpbmcgd2hlbiBmYWlsc1xuICAgICAgcmV0dXJuICRlbC5wYXJlbnQoKS5maW5kKCcuZGlzYWJsZWQnKS5yZXBsYWNlV2l0aCgnPHA+JyArIGRhdGEgKyAnPC9wPicpO1xuICAgIH0pLmZhaWwoZnVuY3Rpb24gKCkge1xuICAgICAgY29uc29sZS5sb2coJ2ZhaWxlZCcpO1xuICAgIH0pO1xuICB9XG5cbiAgZnVuY3Rpb24gaGFuZGxlRmluaXNoQ2xpY2soZSkge1xuICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAkKHN1Ym1pdE1vZGFsSWQpLm1vZGFsKCdzaG93Jyk7XG4gICAgJChzdWJtaXRNb2RhbElkICsgJy5tb2RhbC1oZWFkZXInKS5jbGljaygpO1xuICAgICQoc3VibWl0QnRuSWQpLmNsaWNrKGhhbmRsZVN1Ym1pdENsaWNrKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGhhbmRsZVN1Ym1pdENsaWNrKGUpIHtcbiAgICBlLnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAkKCcjc3VibWl0LWNoYWxsZW5nZScpLmF0dHIoJ2Rpc2FibGVkJywgJ3RydWUnKS5yZW1vdmVDbGFzcygnYnRuLXByaW1hcnknKS5hZGRDbGFzcygnYnRuLXdhcm5pbmcgZGlzYWJsZWQnKTtcblxuICAgIHZhciAkY2hlY2ttYXJrQ29udGFpbmVyID0gJCgnI2NoZWNrbWFyay1jb250YWluZXInKTtcbiAgICAkY2hlY2ttYXJrQ29udGFpbmVyLmNzcyh7IGhlaWdodDogJGNoZWNrbWFya0NvbnRhaW5lci5pbm5lckhlaWdodCgpIH0pO1xuXG4gICAgJCgnI2NoYWxsZW5nZS1jaGVja21hcmsnKS5hZGRDbGFzcygnem9vbU91dFVwJykuZGVsYXkoMTAwMCkucXVldWUoZnVuY3Rpb24gKG5leHQpIHtcbiAgICAgICQodGhpcykucmVwbGFjZVdpdGgoJzxkaXYgaWQ9XCJjaGFsbGVuZ2Utc3Bpbm5lclwiICcgKyAnY2xhc3M9XCJhbmltYXRlZCB6b29tSW5VcCBpbm5lci1jaXJjbGVzLWxvYWRlclwiPicgKyAnc3VibWl0dGluZy4uLjwvZGl2PicpO1xuICAgICAgbmV4dCgpO1xuICAgIH0pO1xuXG4gICAgJC5hamF4KHtcbiAgICAgIHVybDogJy9jb21wbGV0ZWQtY2hhbGxlbmdlLycsXG4gICAgICB0eXBlOiAnUE9TVCcsXG4gICAgICBkYXRhOiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgIGlkOiBjb21tb24uY2hhbGxlbmdlSWQsXG4gICAgICAgIG5hbWU6IGNvbW1vbi5jaGFsbGVuZ2VOYW1lLFxuICAgICAgICBjaGFsbGVuZ2VUeXBlOiArY29tbW9uLmNoYWxsZW5nZVR5cGVcbiAgICAgIH0pLFxuICAgICAgY29udGVudFR5cGU6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgIGRhdGFUeXBlOiAnanNvbidcbiAgICB9KS5zdWNjZXNzKGZ1bmN0aW9uIChyZXMpIHtcbiAgICAgIGlmIChyZXMpIHtcbiAgICAgICAgd2luZG93LmxvY2F0aW9uID0gJy9jaGFsbGVuZ2VzL25leHQtY2hhbGxlbmdlP2lkPScgKyBjb21tb24uY2hhbGxlbmdlSWQ7XG4gICAgICB9XG4gICAgfSkuZmFpbChmdW5jdGlvbiAoKSB7XG4gICAgICB3aW5kb3cubG9jYXRpb24ucmVwbGFjZSh3aW5kb3cubG9jYXRpb24uaHJlZik7XG4gICAgfSk7XG4gIH1cblxuICBjb21tb24uaW5pdC5wdXNoKGZ1bmN0aW9uICgkKSB7XG4gICAgaWYgKGNvbW1vbi5jaGFsbGVuZ2VUeXBlICE9PSAnNycpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgICQocHJldkJ0bkNsYXNzKS5jbGljayhoYW5kbGVQcmV2U3RlcENsaWNrKTtcbiAgICAkKG5leHRCdG5DbGFzcykuY2xpY2soaGFuZGxlTmV4dFN0ZXBDbGljayk7XG4gICAgJChhY3Rpb25CdG5DbGFzcykuY2xpY2soaGFuZGxlQWN0aW9uQ2xpY2spO1xuICAgICQoZmluaXNoQnRuQ2xhc3MpLmNsaWNrKGhhbmRsZUZpbmlzaENsaWNrKTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfSk7XG5cbiAgcmV0dXJuIGNvbW1vbjtcbn0od2luZG93KTsiLCIndXNlIHN0cmljdCc7XG5cbnZhciBfZXh0ZW5kcyA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gKHRhcmdldCkgeyBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgeyB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldOyBmb3IgKHZhciBrZXkgaW4gc291cmNlKSB7IGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc291cmNlLCBrZXkpKSB7IHRhcmdldFtrZXldID0gc291cmNlW2tleV07IH0gfSB9IHJldHVybiB0YXJnZXQ7IH07XG5cbmZ1bmN0aW9uIF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhvYmosIGtleXMpIHsgdmFyIHRhcmdldCA9IHt9OyBmb3IgKHZhciBpIGluIG9iaikgeyBpZiAoa2V5cy5pbmRleE9mKGkpID49IDApIGNvbnRpbnVlOyBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIGkpKSBjb250aW51ZTsgdGFyZ2V0W2ldID0gb2JqW2ldOyB9IHJldHVybiB0YXJnZXQ7IH1cblxuJChkb2N1bWVudCkucmVhZHkoZnVuY3Rpb24gKCkge1xuICB2YXIgY29tbW9uID0gd2luZG93LmNvbW1vbjtcbiAgdmFyIE9ic2VydmFibGUgPSB3aW5kb3cuUnguT2JzZXJ2YWJsZTtcbiAgdmFyIGFkZExvb3BQcm90ZWN0ID0gY29tbW9uLmFkZExvb3BQcm90ZWN0LFxuICAgICAgY2hhbGxlbmdlTmFtZSA9IGNvbW1vbi5jaGFsbGVuZ2VOYW1lLFxuICAgICAgY2hhbGxlbmdlVHlwZSA9IGNvbW1vbi5jaGFsbGVuZ2VUeXBlLFxuICAgICAgY2hhbGxlbmdlVHlwZXMgPSBjb21tb24uY2hhbGxlbmdlVHlwZXM7XG5cblxuICBjb21tb24uaW5pdC5mb3JFYWNoKGZ1bmN0aW9uIChpbml0KSB7XG4gICAgaW5pdCgkKTtcbiAgfSk7XG5cbiAgLy8gb25seSBydW4gaWYgZWRpdG9yIHByZXNlbnRcbiAgaWYgKGNvbW1vbi5lZGl0b3IuZ2V0VmFsdWUpIHtcbiAgICB2YXIgY29kZSQgPSBjb21tb24uZWRpdG9yS2V5VXAkLmRlYm91bmNlKDc1MCkubWFwKGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBjb21tb24uZWRpdG9yLmdldFZhbHVlKCk7XG4gICAgfSkuZGlzdGluY3RVbnRpbENoYW5nZWQoKS5zaGFyZVJlcGxheSgpO1xuXG4gICAgLy8gdXBkYXRlIHN0b3JhZ2VcbiAgICBjb2RlJC5zdWJzY3JpYmUoZnVuY3Rpb24gKGNvZGUpIHtcbiAgICAgIGNvbW1vbi5jb2RlU3RvcmFnZS51cGRhdGVTdG9yYWdlKGNvbW1vbi5jaGFsbGVuZ2VOYW1lLCBjb2RlKTtcbiAgICAgIGNvbW1vbi5jb2RlVXJpLnF1ZXJpZnkoY29kZSk7XG4gICAgfSwgZnVuY3Rpb24gKGVycikge1xuICAgICAgcmV0dXJuIGNvbnNvbGUuZXJyb3IoZXJyKTtcbiAgICB9KTtcblxuICAgIGNvZGUkXG4gICAgLy8gb25seSBydW4gZm9yIEhUTUxcbiAgICAuZmlsdGVyKGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBjb21tb24uY2hhbGxlbmdlVHlwZSA9PT0gY2hhbGxlbmdlVHlwZXMuSFRNTDtcbiAgICB9KS5mbGF0TWFwKGZ1bmN0aW9uIChjb2RlKSB7XG4gICAgICByZXR1cm4gY29tbW9uLmRldGVjdFVuc2FmZUNvZGUkKGNvZGUpLm1hcChmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBjb21iaW5lZENvZGUgPSBjb21tb24uaGVhZCArIGNvZGUgKyBjb21tb24udGFpbDtcblxuICAgICAgICByZXR1cm4gYWRkTG9vcFByb3RlY3QoY29tYmluZWRDb2RlKTtcbiAgICAgIH0pLmZsYXRNYXAoZnVuY3Rpb24gKGNvZGUpIHtcbiAgICAgICAgcmV0dXJuIGNvbW1vbi51cGRhdGVQcmV2aWV3JChjb2RlKTtcbiAgICAgIH0pLmZsYXRNYXAoZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gY29tbW9uLmNoZWNrUHJldmlldyQoeyBjb2RlOiBjb2RlIH0pO1xuICAgICAgfSkuY2F0Y2goZnVuY3Rpb24gKGVycikge1xuICAgICAgICByZXR1cm4gT2JzZXJ2YWJsZS5qdXN0KHsgZXJyOiBlcnIgfSk7XG4gICAgICB9KTtcbiAgICB9KS5zdWJzY3JpYmUoZnVuY3Rpb24gKF9yZWYpIHtcbiAgICAgIHZhciBlcnIgPSBfcmVmLmVycjtcblxuICAgICAgaWYgKGVycikge1xuICAgICAgICBjb25zb2xlLmVycm9yKGVycik7XG4gICAgICAgIHJldHVybiBjb21tb24udXBkYXRlUHJldmlldyQoJ1xcbiAgICAgICAgICAgICAgPGgxPicgKyBlcnIgKyAnPC9oMT5cXG4gICAgICAgICAgICAnKS5zdWJzY3JpYmUoZnVuY3Rpb24gKCkge30pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfSwgZnVuY3Rpb24gKGVycikge1xuICAgICAgcmV0dXJuIGNvbnNvbGUuZXJyb3IoZXJyKTtcbiAgICB9KTtcbiAgfVxuXG4gIGNvbW1vbi5yZXNldEJ0biQuZG9Pbk5leHQoZnVuY3Rpb24gKCkge1xuICAgIGNvbW1vbi5lZGl0b3Iuc2V0VmFsdWUoY29tbW9uLnJlcGxhY2VTYWZlVGFncyhjb21tb24uc2VlZCkpO1xuICB9KS5mbGF0TWFwKGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gY29tbW9uLmV4ZWN1dGVDaGFsbGVuZ2UkKCkuY2F0Y2goZnVuY3Rpb24gKGVycikge1xuICAgICAgcmV0dXJuIE9ic2VydmFibGUuanVzdCh7IGVycjogZXJyIH0pO1xuICAgIH0pO1xuICB9KS5zdWJzY3JpYmUoZnVuY3Rpb24gKF9yZWYyKSB7XG4gICAgdmFyIGVyciA9IF9yZWYyLmVycixcbiAgICAgICAgb3V0cHV0ID0gX3JlZjIub3V0cHV0LFxuICAgICAgICBvcmlnaW5hbENvZGUgPSBfcmVmMi5vcmlnaW5hbENvZGU7XG5cbiAgICBpZiAoZXJyKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGVycik7XG4gICAgICByZXR1cm4gY29tbW9uLnVwZGF0ZU91dHB1dERpc3BsYXkoJycgKyBlcnIpO1xuICAgIH1cbiAgICBjb21tb24uY29kZVN0b3JhZ2UudXBkYXRlU3RvcmFnZShjaGFsbGVuZ2VOYW1lLCBvcmlnaW5hbENvZGUpO1xuICAgIGNvbW1vbi5jb2RlVXJpLnF1ZXJpZnkob3JpZ2luYWxDb2RlKTtcbiAgICBjb21tb24udXBkYXRlT3V0cHV0RGlzcGxheShvdXRwdXQpO1xuICAgIHJldHVybiBudWxsO1xuICB9LCBmdW5jdGlvbiAoZXJyKSB7XG4gICAgaWYgKGVycikge1xuICAgICAgY29uc29sZS5lcnJvcihlcnIpO1xuICAgIH1cbiAgICBjb21tb24udXBkYXRlT3V0cHV0RGlzcGxheSgnJyArIGVycik7XG4gIH0pO1xuXG4gIE9ic2VydmFibGUubWVyZ2UoY29tbW9uLmVkaXRvckV4ZWN1dGUkLCBjb21tb24uc3VibWl0QnRuJCkuZmxhdE1hcChmdW5jdGlvbiAoKSB7XG4gICAgY29tbW9uLmFwcGVuZFRvT3V0cHV0RGlzcGxheSgnXFxuLy8gdGVzdGluZyBjaGFsbGVuZ2UuLi4nKTtcbiAgICByZXR1cm4gY29tbW9uLmV4ZWN1dGVDaGFsbGVuZ2UkKCkubWFwKGZ1bmN0aW9uIChfcmVmMykge1xuICAgICAgdmFyIHRlc3RzID0gX3JlZjMudGVzdHMsXG4gICAgICAgICAgcmVzdCA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhfcmVmMywgWyd0ZXN0cyddKTtcblxuICAgICAgdmFyIHNvbHZlZCA9IHRlc3RzLmV2ZXJ5KGZ1bmN0aW9uICh0ZXN0KSB7XG4gICAgICAgIHJldHVybiAhdGVzdC5lcnI7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBfZXh0ZW5kcyh7fSwgcmVzdCwgeyB0ZXN0czogdGVzdHMsIHNvbHZlZDogc29sdmVkIH0pO1xuICAgIH0pLmNhdGNoKGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgIHJldHVybiBPYnNlcnZhYmxlLmp1c3QoeyBlcnI6IGVyciB9KTtcbiAgICB9KTtcbiAgfSkuc3Vic2NyaWJlKGZ1bmN0aW9uIChfcmVmNCkge1xuICAgIHZhciBlcnIgPSBfcmVmNC5lcnIsXG4gICAgICAgIHNvbHZlZCA9IF9yZWY0LnNvbHZlZCxcbiAgICAgICAgb3V0cHV0ID0gX3JlZjQub3V0cHV0LFxuICAgICAgICB0ZXN0cyA9IF9yZWY0LnRlc3RzO1xuXG4gICAgaWYgKGVycikge1xuICAgICAgY29uc29sZS5lcnJvcihlcnIpO1xuICAgICAgaWYgKGNvbW1vbi5jaGFsbGVuZ2VUeXBlID09PSBjb21tb24uY2hhbGxlbmdlVHlwZXMuSFRNTCkge1xuICAgICAgICByZXR1cm4gY29tbW9uLnVwZGF0ZVByZXZpZXckKCdcXG4gICAgICAgICAgICAgIDxoMT4nICsgZXJyICsgJzwvaDE+XFxuICAgICAgICAgICAgJykuZmlyc3QoKS5zdWJzY3JpYmUoZnVuY3Rpb24gKCkge30pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGNvbW1vbi51cGRhdGVPdXRwdXREaXNwbGF5KCcnICsgZXJyKTtcbiAgICB9XG4gICAgY29tbW9uLnVwZGF0ZU91dHB1dERpc3BsYXkob3V0cHV0KTtcbiAgICBjb21tb24uZGlzcGxheVRlc3RSZXN1bHRzKHRlc3RzKTtcbiAgICBpZiAoc29sdmVkKSB7XG4gICAgICBjb21tb24uc2hvd0NvbXBsZXRpb24oKTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH0sIGZ1bmN0aW9uIChfcmVmNSkge1xuICAgIHZhciBlcnIgPSBfcmVmNS5lcnI7XG5cbiAgICBjb25zb2xlLmVycm9yKGVycik7XG4gICAgY29tbW9uLnVwZGF0ZU91dHB1dERpc3BsYXkoJycgKyBlcnIpO1xuICB9KTtcblxuICAvLyBpbml0aWFsIGNoYWxsZW5nZSBydW4gdG8gcG9wdWxhdGUgdGVzdHNcbiAgaWYgKGNoYWxsZW5nZVR5cGUgPT09IGNoYWxsZW5nZVR5cGVzLkhUTUwpIHtcbiAgICB2YXIgJHByZXZpZXcgPSAkKCcjcHJldmlldycpO1xuICAgIHJldHVybiBPYnNlcnZhYmxlLmZyb21DYWxsYmFjaygkcHJldmlldy5yZWFkeSwgJHByZXZpZXcpKCkuZGVsYXkoNTAwKS5mbGF0TWFwKGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBjb21tb24uZXhlY3V0ZUNoYWxsZW5nZSQoKTtcbiAgICB9KS5jYXRjaChmdW5jdGlvbiAoZXJyKSB7XG4gICAgICByZXR1cm4gT2JzZXJ2YWJsZS5qdXN0KHsgZXJyOiBlcnIgfSk7XG4gICAgfSkuc3Vic2NyaWJlKGZ1bmN0aW9uIChfcmVmNikge1xuICAgICAgdmFyIGVyciA9IF9yZWY2LmVycixcbiAgICAgICAgICB0ZXN0cyA9IF9yZWY2LnRlc3RzO1xuXG4gICAgICBpZiAoZXJyKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyKTtcbiAgICAgICAgaWYgKGNvbW1vbi5jaGFsbGVuZ2VUeXBlID09PSBjb21tb24uY2hhbGxlbmdlVHlwZXMuSFRNTCkge1xuICAgICAgICAgIHJldHVybiBjb21tb24udXBkYXRlUHJldmlldyQoJ1xcbiAgICAgICAgICAgICAgICA8aDE+JyArIGVyciArICc8L2gxPlxcbiAgICAgICAgICAgICAgJykuc3Vic2NyaWJlKGZ1bmN0aW9uICgpIHt9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29tbW9uLnVwZGF0ZU91dHB1dERpc3BsYXkoJycgKyBlcnIpO1xuICAgICAgfVxuICAgICAgY29tbW9uLmRpc3BsYXlUZXN0UmVzdWx0cyh0ZXN0cyk7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9LCBmdW5jdGlvbiAoX3JlZjcpIHtcbiAgICAgIHZhciBlcnIgPSBfcmVmNy5lcnI7XG5cbiAgICAgIGNvbnNvbGUuZXJyb3IoZXJyKTtcbiAgICB9KTtcbiAgfVxuXG4gIGlmIChjaGFsbGVuZ2VUeXBlID09PSBjaGFsbGVuZ2VUeXBlcy5CT05GSVJFIHx8IGNoYWxsZW5nZVR5cGUgPT09IGNoYWxsZW5nZVR5cGVzLkpTKSB7XG4gICAgcmV0dXJuIE9ic2VydmFibGUuanVzdCh7fSkuZGVsYXkoNTAwKS5mbGF0TWFwKGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBjb21tb24uZXhlY3V0ZUNoYWxsZW5nZSQoKTtcbiAgICB9KS5jYXRjaChmdW5jdGlvbiAoZXJyKSB7XG4gICAgICByZXR1cm4gT2JzZXJ2YWJsZS5qdXN0KHsgZXJyOiBlcnIgfSk7XG4gICAgfSkuc3Vic2NyaWJlKGZ1bmN0aW9uIChfcmVmOCkge1xuICAgICAgdmFyIGVyciA9IF9yZWY4LmVycixcbiAgICAgICAgICBvcmlnaW5hbENvZGUgPSBfcmVmOC5vcmlnaW5hbENvZGUsXG4gICAgICAgICAgdGVzdHMgPSBfcmVmOC50ZXN0cztcblxuICAgICAgaWYgKGVycikge1xuICAgICAgICBjb25zb2xlLmVycm9yKGVycik7XG4gICAgICAgIHJldHVybiBjb21tb24udXBkYXRlT3V0cHV0RGlzcGxheSgnJyArIGVycik7XG4gICAgICB9XG4gICAgICBjb21tb24uY29kZVN0b3JhZ2UudXBkYXRlU3RvcmFnZShjaGFsbGVuZ2VOYW1lLCBvcmlnaW5hbENvZGUpO1xuICAgICAgY29tbW9uLmRpc3BsYXlUZXN0UmVzdWx0cyh0ZXN0cyk7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9LCBmdW5jdGlvbiAoZXJyKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGVycik7XG4gICAgICBjb21tb24udXBkYXRlT3V0cHV0RGlzcGxheSgnJyArIGVycik7XG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59KTsiXSwic291cmNlUm9vdCI6Ii9jb21tb25GcmFtZXdvcmsifQ==\n"
  },
  {
    "path": "public/js/commonFramework-e9a2482e6b.js",
    "content": "'use strict';\n\nwindow.common = function (global) {\n  // common namespace\n  // all classes should be stored here\n  // called at the beginning of dom ready\n  var _global$Rx = global.Rx;\n  var Disposable = _global$Rx.Disposable;\n  var Observable = _global$Rx.Observable;\n  var config = _global$Rx.config;\n  var _global$common = global.common;\n  var common = _global$common === undefined ? { init: [] } : _global$common;\n\n\n  config.longStackSupport = true;\n  common.head = common.head || [];\n  common.tail = common.tail || [];\n  common.salt = Math.random();\n\n  common.challengeTypes = {\n    HTML: '0',\n    JS: '1',\n    VIDEO: '2',\n    ZIPLINE: '3',\n    BASEJUMP: '4',\n    BONFIRE: '5',\n    HIKES: '6',\n    STEP: '7'\n  };\n\n  common.arrayToNewLineString = function arrayToNewLineString(seedData) {\n    seedData = Array.isArray(seedData) ? seedData : [seedData];\n    return seedData.reduce(function (seed, line) {\n      return '' + seed + line + '\\n';\n    }, '');\n  };\n\n  common.seed = common.arrayToNewLineString(common.challengeSeed);\n\n  common.replaceScriptTags = function replaceScriptTags(value) {\n    return value.replace(/<script>/gi, 'fccss').replace(/<\\/script>/gi, 'fcces');\n  };\n\n  common.replaceSafeTags = function replaceSafeTags(value) {\n    return value.replace(/fccss/gi, '<script>').replace(/fcces/gi, '</script>');\n  };\n\n  common.replaceFormActionAttr = function replaceFormAction(value) {\n    return value.replace(/<form[^>]*>/, function (val) {\n      return val.replace(/action(\\s*?)=/, 'fccfaa$1=');\n    });\n  };\n\n  common.replaceFccfaaAttr = function replaceFccfaaAttr(value) {\n    return value.replace(/<form[^>]*>/, function (val) {\n      return val.replace(/fccfaa(\\s*?)=/, 'action$1=');\n    });\n  };\n\n  common.scopejQuery = function scopejQuery(str) {\n    return str.replace(/\\$/gi, 'j$').replace(/document/gi, 'jdocument').replace(/jQuery/gi, 'jjQuery');\n  };\n\n  common.unScopeJQuery = function unScopeJQuery(str) {\n    return str.replace(/j\\$/gi, '$').replace(/jdocument/gi, 'document').replace(/jjQuery/gi, 'jQuery');\n  };\n\n  var commentRegex = /(\\/\\*[^(\\*\\/)]*\\*\\/)|([ \\n]\\/\\/[^\\n]*)/g;\n  common.removeComments = function removeComments(str) {\n    return str.replace(commentRegex, '');\n  };\n\n  var logRegex = /(console\\.[\\w]+\\s*\\(.*\\;)/g;\n  common.removeLogs = function removeLogs(str) {\n    return str.replace(logRegex, '');\n  };\n\n  common.reassembleTest = function reassembleTest() {\n    var code = arguments.length <= 0 || arguments[0] === undefined ? '' : arguments[0];\n    var _ref = arguments[1];\n    var line = _ref.line;\n    var text = _ref.text;\n\n    var regexp = new RegExp('//' + line + common.salt);\n    return code.replace(regexp, text);\n  };\n\n  common.getScriptContent$ = function getScriptContent$(script) {\n    return Observable.create(function (observer) {\n      var jqXHR = $.get(script, null, null, 'text').success(function (data) {\n        observer.onNext(data);\n        observer.onCompleted();\n      }).fail(function (e) {\n        return observer.onError(e);\n      }).always(function () {\n        return observer.onCompleted();\n      });\n\n      return new Disposable(function () {\n        jqXHR.abort();\n      });\n    });\n  };\n\n  var openScript = /\\<\\s?script\\s?\\>/gi;\n  var closingScript = /\\<\\s?\\/\\s?script\\s?\\>/gi;\n\n  // detects if there is JavaScript in the first script tag\n  common.hasJs = function hasJs(code) {\n    return !!common.getJsFromHtml(code);\n  };\n\n  // grabs the content from the first script tag in the code\n  common.getJsFromHtml = function getJsFromHtml(code) {\n    // grab user javaScript\n    return (code.split(openScript)[1] || '').split(closingScript)[0] || '';\n  };\n\n  return common;\n}(window);\n'use strict';\n\nwindow.common = function (global) {\n  var $ = global.$;\n  var Observable = global.Rx.Observable;\n  var _global$common = global.common;\n  var common = _global$common === undefined ? { init: [] } : _global$common;\n\n\n  common.ctrlEnterClickHandler = function ctrlEnterClickHandler(e) {\n    // ctrl + enter or cmd + enter\n    if (e.keyCode === 13 && (e.metaKey || e.ctrlKey)) {\n      $('#complete-courseware-dialog').off('keydown', ctrlEnterClickHandler);\n      if ($('#submit-challenge').length > 0) {\n        $('#submit-challenge').click();\n      } else {\n        window.location = '/challenges/next-challenge?id=' + common.challengeId;\n      }\n    }\n  };\n\n  common.init.push(function ($) {\n\n    var $marginFix = $('.innerMarginFix');\n    $marginFix.css('min-height', $marginFix.height());\n\n    common.submitBtn$ = Observable.fromEvent($('#submitButton'), 'click');\n\n    common.resetBtn$ = Observable.fromEvent($('#reset-button'), 'click');\n\n    // init modal keybindings on open\n    $('#complete-courseware-dialog').on('shown.bs.modal', function () {\n      $('#complete-courseware-dialog').keydown(common.ctrlEnterClickHandler);\n    });\n\n    // remove modal keybinds on close\n    $('#complete-courseware-dialog').on('hidden.bs.modal', function () {\n      $('#complete-courseware-dialog').off('keydown', common.ctrlEnterClickHandler);\n    });\n\n    // video checklist binding\n    $('.challenge-list-checkbox').on('change', function () {\n      var checkboxId = $(this).parent().parent().attr('id');\n      if ($(this).is(':checked')) {\n        $(this).parent().siblings().children().addClass('faded');\n        if (!localStorage || !localStorage[checkboxId]) {\n          localStorage[checkboxId] = true;\n        }\n      }\n\n      if (!$(this).is(':checked')) {\n        $(this).parent().siblings().children().removeClass('faded');\n        if (localStorage[checkboxId]) {\n          localStorage.removeItem(checkboxId);\n        }\n      }\n    });\n\n    $('.checklist-element').each(function () {\n      var checklistElementId = $(this).attr('id');\n      if (localStorage[checklistElementId]) {\n        $(this).children().children('li').addClass('faded');\n        $(this).children().children('input').trigger('click');\n      }\n    });\n\n    // video challenge submit\n    $('#next-courseware-button').on('click', function () {\n      $('#next-courseware-button').unbind('click');\n      if ($('.signup-btn-nav').length < 1) {\n        var data;\n        var solution = $('#public-url').val() || null;\n        var githubLink = $('#github-url').val() || null;\n        switch (common.challengeType) {\n          case common.challengeTypes.VIDEO:\n            data = {\n              id: common.challengeId,\n              name: common.challengeName,\n              challengeType: +common.challengeType\n            };\n            $.ajax({\n              url: '/completed-challenge/',\n              type: 'POST',\n              data: JSON.stringify(data),\n              contentType: 'application/json',\n              dataType: 'json'\n            }).success(function (res) {\n              if (!res) {\n                return;\n              }\n              window.location.href = '/challenges/next-challenge?id=' + common.challengeId;\n            }).fail(function () {\n              window.location.replace(window.location.href);\n            });\n\n            break;\n          case common.challengeTypes.BASEJUMP:\n          case common.challengeTypes.ZIPLINE:\n            data = {\n              id: common.challengeId,\n              name: common.challengeName,\n              challengeType: +common.challengeType,\n              solution: solution,\n              githubLink: githubLink\n            };\n\n            $.ajax({\n              url: '/completed-zipline-or-basejump/',\n              type: 'POST',\n              data: JSON.stringify(data),\n              contentType: 'application/json',\n              dataType: 'json'\n            }).success(function () {\n              window.location.href = '/challenges/next-challenge?id=' + common.challengeId;\n            }).fail(function () {\n              window.location.replace(window.location.href);\n            });\n            break;\n\n          case common.challengeTypes.BONFIRE:\n            window.location.href = '/challenges/next-challenge?id=' + common.challengeId;\n            break;\n\n          default:\n            console.log('Happy Coding!');\n            break;\n        }\n      }\n    });\n\n    if (common.challengeName) {\n      window.ga('send', 'event', 'Challenge', 'load', common.gaName);\n    }\n\n    $('#complete-courseware-dialog').on('hidden.bs.modal', function () {\n      if (common.editor.focus) {\n        common.editor.focus();\n      }\n    });\n\n    $('#trigger-issue-modal').on('click', function () {\n      $('#issue-modal').modal('show');\n    });\n\n    $('#trigger-help-modal').on('click', function () {\n      $('#help-modal').modal('show');\n    });\n\n    $('#trigger-reset-modal').on('click', function () {\n      $('#reset-modal').modal('show');\n    });\n\n    $('#trigger-pair-modal').on('click', function () {\n      $('#pair-modal').modal('show');\n    });\n\n    $('#completed-courseware').on('click', function () {\n      $('#complete-courseware-dialog').modal('show');\n    });\n\n    $('#help-ive-found-a-bug-wiki-article').on('click', function () {\n      window.open('https://github.com/freecodecampchina/freecodecamp.cn/wiki/' + \"Help-I've-Found-a-Bug\", '_blank');\n    });\n\n    $('#search-issue').on('click', function () {\n      var queryIssue = window.location.href.toString().split('?')[0].replace(/(#*)$/, '');\n      window.open('https://github.com/freecodecampchina/freecodecamp.cn/issues?q=' + 'is:issue is:all ' + common.challengeName + ' OR ' + queryIssue.substr(queryIssue.lastIndexOf('challenges/') + 11).replace('/', ''), '_blank');\n    });\n  });\n\n  return common;\n}(window);\n'use strict';\n\n// depends on: codeUri\nwindow.common = function (global) {\n  var localStorage = global.localStorage;\n  var _global$common = global.common;\n  var common = _global$common === undefined ? { init: [] } : _global$common;\n\n\n  var challengePrefix = ['Bonfire: ', 'Waypoint: ', 'Zipline: ', 'Basejump: ', 'Checkpoint: '],\n      item;\n\n  var codeStorage = {\n    getStoredValue: function getStoredValue(key) {\n      if (!localStorage || typeof localStorage.getItem !== 'function' || !key || typeof key !== 'string') {\n        console.log('unable to read from storage');\n        return '';\n      }\n      if (localStorage.getItem(key + 'Val')) {\n        return '' + localStorage.getItem(key + 'Val');\n      } else {\n        for (var i = 0; i <= challengePrefix.length; i++) {\n          item = localStorage.getItem(challengePrefix[i] + key + 'Val');\n          if (item) {\n            return '' + item;\n          }\n        }\n      }\n      return null;\n    },\n\n\n    isAlive: function isAlive(key) {\n      var val = this.getStoredValue(key);\n      return val !== 'null' && val !== 'undefined' && val && val.length > 0;\n    },\n\n    updateStorage: function updateStorage(key, code) {\n      if (!localStorage || typeof localStorage.setItem !== 'function' || !key || typeof key !== 'string') {\n        console.log('unable to save to storage');\n        return code;\n      }\n      localStorage.setItem(key + 'Val', code);\n      return code;\n    }\n  };\n\n  common.codeStorage = codeStorage;\n\n  return common;\n}(window, window.common);\n'use strict';\n\n// store code in the URL\nwindow.common = function (global) {\n  var _encode = global.encodeURIComponent;\n  var _decode = global.decodeURIComponent;\n  var location = global.location;\n  var history = global.history;\n  var _global$common = global.common;\n  var common = _global$common === undefined ? { init: [] } : _global$common;\n  var replaceScriptTags = common.replaceScriptTags;\n  var replaceSafeTags = common.replaceSafeTags;\n  var replaceFormActionAttr = common.replaceFormActionAttr;\n  var replaceFccfaaAttr = common.replaceFccfaaAttr;\n\n\n  var queryRegex = /^(\\?|#\\?)/;\n  function encodeFcc(val) {\n    return replaceScriptTags(replaceFormActionAttr(val));\n  }\n\n  function decodeFcc(val) {\n    return replaceSafeTags(replaceFccfaaAttr(val));\n  }\n\n  var codeUri = {\n    encode: function encode(code) {\n      return _encode(code);\n    },\n    decode: function decode(code) {\n      try {\n        return _decode(code);\n      } catch (ignore) {\n        return null;\n      }\n    },\n    isInQuery: function isInQuery(query) {\n      var decoded = codeUri.decode(query);\n      if (!decoded || typeof decoded.split !== 'function') {\n        return false;\n      }\n      return decoded.replace(queryRegex, '').split('&').reduce(function (found, param) {\n        var key = param.split('=')[0];\n        if (key === 'solution') {\n          return true;\n        }\n        return found;\n      }, false);\n    },\n    isAlive: function isAlive() {\n      return codeUri.enabled && codeUri.isInQuery(location.search) || codeUri.isInQuery(location.hash);\n    },\n    getKeyInQuery: function getKeyInQuery(query) {\n      var keyToFind = arguments.length <= 1 || arguments[1] === undefined ? '' : arguments[1];\n\n      return query.split('&').reduce(function (oldValue, param) {\n        var key = param.split('=')[0];\n        var value = param.split('=').slice(1).join('=');\n\n        if (key === keyToFind) {\n          return value;\n        }\n        return oldValue;\n      }, null);\n    },\n    getSolutionFromQuery: function getSolutionFromQuery() {\n      var query = arguments.length <= 0 || arguments[0] === undefined ? '' : arguments[0];\n\n      return decodeFcc(codeUri.decode(codeUri.getKeyInQuery(query, 'solution')));\n    },\n\n    parse: function parse() {\n      if (!codeUri.enabled) {\n        return null;\n      }\n      var query;\n      if (location.search && codeUri.isInQuery(location.search)) {\n        query = location.search.replace(/^\\?/, '');\n\n        if (history && typeof history.replaceState === 'function') {\n          history.replaceState(history.state, null, location.href.split('?')[0]);\n          location.hash = '#?' + encodeFcc(query);\n        }\n      } else {\n        query = location.hash.replace(/^\\#\\?/, '');\n      }\n\n      if (!query) {\n        return null;\n      }\n\n      return this.getSolutionFromQuery(query);\n    },\n    querify: function querify(solution) {\n      if (!codeUri.enabled) {\n        return null;\n      }\n      if (history && typeof history.replaceState === 'function') {\n        // grab the url up to the query\n        // destroy any hash symbols still clinging to life\n        var url = location.href.split('?')[0].replace(/(#*)$/, '');\n        history.replaceState(history.state, null, url + '#?' + (codeUri.shouldRun() ? '' : 'run=disabled&') + 'solution=' + codeUri.encode(encodeFcc(solution)));\n      } else {\n        location.hash = '?solution=' + codeUri.encode(encodeFcc(solution));\n      }\n\n      return solution;\n    },\n    enabled: true,\n    shouldRun: function shouldRun() {\n      return !this.getKeyInQuery((location.search || location.hash).replace(queryRegex, ''), 'run');\n    }\n  };\n\n  common.init.push(function () {\n    codeUri.parse();\n  });\n\n  common.codeUri = codeUri;\n  common.shouldRun = function () {\n    return codeUri.shouldRun();\n  };\n\n  return common;\n}(window);\n'use strict';\n\nwindow.common = function (global) {\n  var loopProtect = global.loopProtect;\n  var _global$common = global.common;\n  var common = _global$common === undefined ? { init: [] } : _global$common;\n\n\n  loopProtect.hit = function hit(line) {\n    var err = 'Error: Exiting potential infinite loop at line ' + line + '. To disable loop protection, write: \\n\\\\/\\\\/ noprotect\\nas the first' + 'line. Beware that if you do have an infinite loop in your code' + 'this will crash your browser.';\n    console.error(err);\n  };\n\n  common.addLoopProtect = function addLoopProtect() {\n    var code = arguments.length <= 0 || arguments[0] === undefined ? '' : arguments[0];\n\n    return loopProtect(code);\n  };\n\n  return common;\n}(window);\n'use strict';\n\nwindow.common = function (global) {\n  var _global$common = global.common;\n  var common = _global$common === undefined ? { init: [] } : _global$common;\n  var doc = global.document;\n\n\n  common.getIframe = function getIframe() {\n    var id = arguments.length <= 0 || arguments[0] === undefined ? 'preview' : arguments[0];\n\n    var previewFrame = doc.getElementById(id);\n\n    // create and append a hidden preview frame\n    if (!previewFrame) {\n      previewFrame = doc.createElement('iframe');\n      previewFrame.id = id;\n      previewFrame.setAttribute('style', 'display: none');\n      doc.body.appendChild(previewFrame);\n    }\n\n    return previewFrame.contentDocument || previewFrame.contentWindow.document;\n  };\n\n  return common;\n}(window);\n'use strict';\n\nwindow.common = function (global) {\n  var _global$Rx = global.Rx;\n  var BehaviorSubject = _global$Rx.BehaviorSubject;\n  var Observable = _global$Rx.Observable;\n  var _global$common = global.common;\n  var common = _global$common === undefined ? { init: [] } : _global$common;\n\n  // the first script tag here is to proxy jQuery\n  // We use the same jQuery on the main window but we change the\n  // context to that of the iframe.\n\n  var libraryIncludes = '\\n<script>\\n  window.loopProtect = parent.loopProtect;\\n  window.__err = null;\\n  window.loopProtect.hit = function(line) {\\n    window.__err = new Error(\\n      \\'Potential infinite loop at line \\' +\\n      line +\\n      \\'. To disable loop protection, write:\\' +\\n      \\' \\\\n\\\\/\\\\/ noprotect\\\\nas the first\\' +\\n      \\' line. Beware that if you do have an infinite loop in your code\\' +\\n      \\' this will crash your browser.\\'\\n    );\\n  };\\n</script>\\n<link\\n  rel=\\'stylesheet\\'\\n  href=\\'//cdn.bootcss.com/animate.css/3.2.0/animate.min.css\\'\\n  />\\n<link\\n  rel=\\'stylesheet\\'\\n  href=\\'//cdn.bootcss.com/bootstrap/3.3.1/css/bootstrap.min.css\\'\\n  />\\n\\n<link\\n  rel=\\'stylesheet\\'\\n  href=\\'//cdn.bootcss.com/font-awesome/4.2.0/css/font-awesome.min.css\\'\\n  />\\n<style>\\n  body { padding: 0px 3px 0px 3px; }\\n</style>\\n  ';\n  var codeDisabledError = '\\n    <script>\\n      window.__err = new Error(\\'code has been disabled\\');\\n    </script>\\n  ';\n\n  var iFrameScript$ = common.getScriptContent$('/js/iFrameScripts-40fbbe6a21.js').shareReplay();\n  var jQueryScript$ = common.getScriptContent$('/bower_components/jquery/dist/jquery.js').shareReplay();\n\n  // behavior subject allways remembers the last value\n  // we use this to determine if runPreviewTest$ is defined\n  // and prime it with false\n  common.previewReady$ = new BehaviorSubject(false);\n\n  // These should be set up in the preview window\n  // if this error is seen it is because the function tried to run\n  // before the iframe has completely loaded\n  common.runPreviewTests$ = common.checkPreview$ = function () {\n    return Observable.throw(new Error('Preview not fully loaded'));\n  };\n\n  common.updatePreview$ = function updatePreview$() {\n    var code = arguments.length <= 0 || arguments[0] === undefined ? '' : arguments[0];\n\n    var preview = common.getIframe('preview');\n\n    return Observable.combineLatest(iFrameScript$, jQueryScript$, function (iframe, jQuery) {\n      return {\n        iframeScript: '<script>' + iframe + '</script>',\n        jQuery: '<script>' + jQuery + '</script>'\n      };\n    }).first().flatMap(function (_ref) {\n      var iframeScript = _ref.iframeScript;\n      var jQuery = _ref.jQuery;\n\n      // we make sure to override the last value in the\n      // subject to false here.\n      common.previewReady$.onNext(false);\n      preview.open();\n      preview.write(libraryIncludes + jQuery + (common.shouldRun() ? code : codeDisabledError) + '<!-- -->' + iframeScript);\n      preview.close();\n      // now we filter false values and wait for the first true\n      return common.previewReady$.filter(function (ready) {\n        return ready;\n      }).first()\n      // the delay here is to give code within the iframe\n      // control to run\n      .delay(400);\n    }).map(function () {\n      return code;\n    });\n  };\n\n  return common;\n}(window);\n'use strict';\n\nwindow.common = function (global) {\n  var _global$Rx = global.Rx;\n  var Subject = _global$Rx.Subject;\n  var Observable = _global$Rx.Observable;\n  var CodeMirror = global.CodeMirror;\n  var emmetCodeMirror = global.emmetCodeMirror;\n  var _global$common = global.common;\n  var common = _global$common === undefined ? { init: [] } : _global$common;\n  var _common$challengeType = common.challengeType;\n  var challengeType = _common$challengeType === undefined ? '0' : _common$challengeType;\n  var challengeTypes = common.challengeTypes;\n\n\n  if (!CodeMirror || challengeType === challengeTypes.BASEJUMP || challengeType === challengeTypes.ZIPLINE || challengeType === challengeTypes.VIDEO || challengeType === challengeTypes.STEP || challengeType === challengeTypes.HIKES) {\n    common.editor = {};\n    return common;\n  }\n\n  var editor = CodeMirror.fromTextArea(document.getElementById('codeEditor'), {\n    lint: true,\n    lineNumbers: true,\n    mode: 'javascript',\n    theme: 'monokai',\n    runnable: true,\n    matchBrackets: true,\n    autoCloseBrackets: true,\n    scrollbarStyle: 'null',\n    lineWrapping: true,\n    gutters: ['CodeMirror-lint-markers']\n  });\n\n  editor.setSize('100%', 'auto');\n\n  common.editorExecute$ = new Subject();\n  common.editorKeyUp$ = Observable.fromEventPattern(function (handler) {\n    return editor.on('keyup', handler);\n  }, function (handler) {\n    return editor.off('keyup', handler);\n  });\n\n  editor.setOption('extraKeys', {\n    Tab: function Tab(cm) {\n      if (cm.somethingSelected()) {\n        cm.indentSelection('add');\n      } else {\n        var spaces = Array(cm.getOption('indentUnit') + 1).join(' ');\n        cm.replaceSelection(spaces);\n      }\n    },\n    'Shift-Tab': function ShiftTab(cm) {\n      if (cm.somethingSelected()) {\n        cm.indentSelection('subtract');\n      } else {\n        var spaces = Array(cm.getOption('indentUnit') + 1).join(' ');\n        cm.replaceSelection(spaces);\n      }\n    },\n    'Ctrl-Enter': function CtrlEnter() {\n      common.editorExecute$.onNext();\n      return false;\n    },\n    'Cmd-Enter': function CmdEnter() {\n      common.editorExecute$.onNext();\n      return false;\n    }\n  });\n\n  var info = editor.getScrollInfo();\n\n  var after = editor.charCoords({\n    line: editor.getCursor().line + 1,\n    ch: 0\n  }, 'local').top;\n\n  if (info.top + info.clientHeight < after) {\n    editor.scrollTo(null, after - info.clientHeight + 3);\n  }\n\n  if (emmetCodeMirror) {\n    emmetCodeMirror(editor, {\n      'Cmd-E': 'emmet.expand_abbreviation',\n      Tab: 'emmet.expand_abbreviation_with_tab',\n      Enter: 'emmet.insert_formatted_line_break_only'\n    });\n  }\n  common.init.push(function () {\n    var editorValue = void 0;\n    if (common.codeUri.isAlive()) {\n      editorValue = common.codeUri.parse();\n    } else {\n      editorValue = common.codeStorage.isAlive(common.challengeName) ? common.codeStorage.getStoredValue(common.challengeName) : common.seed;\n    }\n\n    editor.setValue(common.replaceSafeTags(editorValue));\n    editor.refresh();\n  });\n\n  common.editor = editor;\n\n  return common;\n}(window);\n'use strict';\n\nwindow.common = function (global) {\n  var Observable = global.Rx.Observable;\n  var _global$common = global.common;\n  var common = _global$common === undefined ? { init: [] } : _global$common;\n\n\n  var detectFunctionCall = /function\\s*?\\(|function\\s+\\w+\\s*?\\(/gi;\n  var detectUnsafeJQ = /\\$\\s*?\\(\\s*?\\$\\s*?\\)/gi;\n  var detectUnsafeConsoleCall = /if\\s\\(null\\)\\sconsole\\.log\\(1\\);/gi;\n\n  common.detectUnsafeCode$ = function detectUnsafeCode$(code) {\n    var openingComments = code.match(/\\/\\*/gi);\n    var closingComments = code.match(/\\*\\//gi);\n\n    // checks if the number of opening comments(/*) matches the number of\n    // closing comments(*/)\n    if (openingComments && (!closingComments || openingComments.length > closingComments.length)) {\n\n      return Observable.throw(new Error('SyntaxError: Unfinished multi-line comment'));\n    }\n\n    if (code.match(detectUnsafeJQ)) {\n      return Observable.throw(new Error('Unsafe $($)'));\n    }\n\n    if (code.match(/function/g) && !code.match(detectFunctionCall)) {\n      return Observable.throw(new Error('SyntaxError: Unsafe or unfinished function declaration'));\n    }\n\n    if (code.match(detectUnsafeConsoleCall)) {\n      return Observable.throw(new Error('Invalid if (null) console.log(1); detected'));\n    }\n\n    return Observable.just(code);\n  };\n\n  return common;\n}(window);\n'use strict';\n\nwindow.common = function (_ref) {\n  var $ = _ref.$;\n  var _ref$common = _ref.common;\n  var common = _ref$common === undefined ? { init: [] } : _ref$common;\n\n\n  common.displayTestResults = function displayTestResults() {\n    var data = arguments.length <= 0 || arguments[0] === undefined ? [] : arguments[0];\n\n    $('#testSuite').children().remove();\n    data.forEach(function (_ref2) {\n      var _ref2$err = _ref2.err;\n      var err = _ref2$err === undefined ? false : _ref2$err;\n      var _ref2$text = _ref2.text;\n      var text = _ref2$text === undefined ? '' : _ref2$text;\n\n      var iconClass = err ? '\"ion-close-circled big-error-icon\"' : '\"ion-checkmark-circled big-success-icon\"';\n\n      $('<div></div>').html('\\n        <div class=\\'row\\'>\\n          <div class=\\'col-xs-2 text-center\\'>\\n            <i class=' + iconClass + '></i>\\n          </div>\\n          <div class=\\'col-xs-10 test-output\\'>\\n            ' + text.split('message: ').pop().replace(/\\'\\);/g, '') + '\\n          </div>\\n          <div class=\\'ten-pixel-break\\'/>\\n        </div>\\n      ').appendTo($('#testSuite'));\n    });\n\n    return data;\n  };\n\n  return common;\n}(window);\n'use strict';\n\nwindow.common = function (global) {\n  var ga = global.ga;\n  var _global$common = global.common;\n  var common = _global$common === undefined ? { init: [] } : _global$common;\n  var addLoopProtect = common.addLoopProtect;\n  var getJsFromHtml = common.getJsFromHtml;\n  var detectUnsafeCode$ = common.detectUnsafeCode$;\n  var updatePreview$ = common.updatePreview$;\n  var challengeType = common.challengeType;\n  var challengeTypes = common.challengeTypes;\n\n\n  common.executeChallenge$ = function executeChallenge$() {\n    var code = common.editor.getValue();\n    var originalCode = code;\n    var head = common.arrayToNewLineString(common.head);\n    var tail = common.arrayToNewLineString(common.tail);\n    var combinedCode = head + code + tail;\n\n    //ga('send', 'event', 'Challenge', 'ran-code', common.gaName);\n\n    // run checks for unsafe code\n    return detectUnsafeCode$(code)\n    // add head and tail and detect loops\n    .map(function () {\n      if (challengeType !== challengeTypes.HTML) {\n        return '<script>;' + addLoopProtect(combinedCode) + '/**/</script>';\n      }\n\n      return addLoopProtect(combinedCode);\n    }).flatMap(function (code) {\n      return updatePreview$(code);\n    }).flatMap(function (code) {\n      var output = void 0;\n\n      if (challengeType === challengeTypes.HTML && common.hasJs(code)) {\n        output = common.getJsOutput(getJsFromHtml(code));\n      } else if (challengeType !== challengeTypes.HTML) {\n        output = common.getJsOutput(addLoopProtect(combinedCode));\n      }\n\n      return common.runPreviewTests$({\n        tests: common.tests.slice(),\n        originalCode: originalCode,\n        output: output\n      });\n    });\n  };\n\n  return common;\n}(window);\n'use strict';\n\nwindow.common = function (global) {\n  var CodeMirror = global.CodeMirror;\n  var doc = global.document;\n  var _global$common = global.common;\n  var common = _global$common === undefined ? { init: [] } : _global$common;\n  var challengeTypes = common.challengeTypes;\n  var _common$challengeType = common.challengeType;\n  var challengeType = _common$challengeType === undefined ? '0' : _common$challengeType;\n\n\n  if (!CodeMirror || challengeType !== challengeTypes.JS && challengeType !== challengeTypes.BONFIRE) {\n    common.updateOutputDisplay = function () {};\n    common.appendToOutputDisplay = function () {};\n    return common;\n  }\n\n  var codeOutput = CodeMirror.fromTextArea(doc.getElementById('codeOutput'), {\n    lineNumbers: false,\n    mode: 'text',\n    theme: 'monokai',\n    readOnly: 'nocursor',\n    lineWrapping: true\n  });\n\n  codeOutput.setValue('/**\\n  * Your output will go here.\\n  * Any console.log() -type\\n  * statements will appear in\\n  * your browser\\'s DevTools\\n  * JavaScript console.\\n  */');\n\n  codeOutput.setSize('100%', '100%');\n\n  common.updateOutputDisplay = function updateOutputDisplay() {\n    var str = arguments.length <= 0 || arguments[0] === undefined ? '' : arguments[0];\n\n    if (typeof str !== 'string') {\n      str = JSON.stringify(str);\n    }\n    codeOutput.setValue(str);\n    return str;\n  };\n\n  common.appendToOutputDisplay = function appendToOutputDisplay() {\n    var str = arguments.length <= 0 || arguments[0] === undefined ? '' : arguments[0];\n\n    codeOutput.setValue(codeOutput.getValue() + str);\n    return str;\n  };\n\n  return common;\n}(window);\n'use strict';\n\nwindow.common = function (_ref) {\n  var _ref$common = _ref.common;\n  var common = _ref$common === undefined ? { init: [] } : _ref$common;\n\n\n  common.lockTop = function lockTop() {\n    var magiVal;\n\n    if ($(window).width() >= 990) {\n      if ($('.editorScrollDiv').html()) {\n\n        magiVal = $(window).height() - $('.navbar').height();\n\n        if (magiVal < 0) {\n          magiVal = 0;\n        }\n        $('.editorScrollDiv').css('height', magiVal - 50 + 'px');\n      }\n\n      magiVal = $(window).height() - $('.navbar').height();\n\n      if (magiVal < 0) {\n        magiVal = 0;\n      }\n\n      $('.scroll-locker').css('min-height', $('.editorScrollDiv').height()).css('height', magiVal - 50);\n    } else {\n      $('.editorScrollDiv').css('max-height', 500 + 'px');\n\n      $('.scroll-locker').css('position', 'inherit').css('top', 'inherit').css('width', '100%').css('max-height', '100%');\n    }\n  };\n\n  common.init.push(function ($) {\n    // fakeiphone positioning hotfix\n    if ($('.iphone-position').html() || $('.iphone').html()) {\n      var startIphonePosition = parseInt($('.iphone-position').css('top').replace('px', ''), 10);\n\n      var startIphone = parseInt($('.iphone').css('top').replace('px', ''), 10);\n\n      $(window).on('scroll', function () {\n        var courseHeight = $('.courseware-height').height();\n        var courseTop = $('.courseware-height').offset().top;\n        var windowScrollTop = $(window).scrollTop();\n        var phoneHeight = $('.iphone-position').height();\n\n        if (courseHeight + courseTop - windowScrollTop - phoneHeight <= 0) {\n          $('.iphone-position').css('top', startIphonePosition + courseHeight + courseTop - windowScrollTop - phoneHeight);\n\n          $('.iphone').css('top', startIphonePosition + courseHeight + courseTop - windowScrollTop - phoneHeight + 120);\n        } else {\n          $('.iphone-position').css('top', startIphonePosition);\n          $('.iphone').css('top', startIphone);\n        }\n      });\n    }\n\n    if ($('.scroll-locker').html()) {\n\n      if ($('.scroll-locker').html()) {\n        common.lockTop();\n        $(window).on('resize', function () {\n          common.lockTop();\n        });\n        $(window).on('scroll', function () {\n          common.lockTop();\n        });\n      }\n\n      var execInProgress = false;\n\n      // why is this not $???\n      document.getElementById('scroll-locker').addEventListener('previewUpdateSpy', function (e) {\n        if (execInProgress) {\n          return null;\n        }\n        execInProgress = true;\n        return setTimeout(function () {\n          if ($($('.scroll-locker').children()[0]).height() - 800 > e.detail) {\n            $('.scroll-locker').scrollTop(e.detail);\n          } else {\n            var scrollTop = $($('.scroll-locker').children()[0]).height();\n\n            $('.scroll-locker').animate({ scrollTop: scrollTop }, 175);\n          }\n          execInProgress = false;\n        }, 750);\n      }, false);\n    }\n  });\n\n  return common;\n}(window);\n'use strict';\n\nwindow.common = function (_ref) {\n  var _ref$common = _ref.common;\n  var common = _ref$common === undefined ? { init: [] } : _ref$common;\n\n  common.init.push(function ($) {\n    $('#report-issue').on('click', function () {\n      var textMessage = ['Challenge [', common.challengeName || window.location.pathname, '](', window.location.href, ') has an issue.\\n', 'User Agent is: <code>', navigator.userAgent, '</code>.\\n', 'Please describe how to reproduce this issue, and include ', 'links to screenshots if possible.\\n\\n'].join('');\n\n      if (common.editor && typeof common.editor.getValue === 'function' && common.editor.getValue().trim()) {\n        var type;\n        switch (common.challengeType) {\n          case common.challengeTypes.HTML:\n            type = 'html';\n            break;\n          case common.challengeTypes.JS:\n          case common.challengeTypes.BONFIRE:\n            type = 'javascript';\n            break;\n          default:\n            type = '';\n        }\n\n        textMessage += ['My code:\\n```', type, '\\n', common.editor.getValue(), '\\n```\\n\\n'].join('');\n      }\n\n      textMessage = encodeURIComponent(textMessage);\n\n      $('#issue-modal').modal('hide');\n      window.open('https://github.com/freecodecampchina/freecodecamp.cn/issues/new?&body=' + textMessage, '_blank');\n    });\n  });\n\n  return common;\n}(window);\n\"use strict\";\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nfunction _objectWithoutProperties(obj, keys) { var target = {}; for (var i in obj) { if (keys.indexOf(i) >= 0) continue; if (!Object.prototype.hasOwnProperty.call(obj, i)) continue; target[i] = obj[i]; } return target; }\n\nwindow.common = function (global) {\n  var Observable = global.Rx.Observable;\n  var chai = global.chai;\n  var _global$common = global.common;\n  var common = _global$common === undefined ? { init: [] } : _global$common;\n\n\n  common.runTests$ = function runTests$(_ref) {\n    var code = _ref.code;\n    var originalCode = _ref.originalCode;\n    var userTests = _ref.userTests;\n\n    var rest = _objectWithoutProperties(_ref, [\"code\", \"originalCode\", \"userTests\"]);\n\n    return Observable.from(userTests).map(function (test) {\n\n      /* eslint-disable no-unused-vars */\n      var assert = chai.assert;\n      var editor = {\n        getValue: function getValue() {\n          return originalCode;\n        }\n      };\n      /* eslint-enable no-unused-vars */\n\n      try {\n        if (test) {\n          /* eslint-disable no-eval  */\n          eval(common.reassembleTest(code, test));\n          /* eslint-enable no-eval */\n        }\n      } catch (e) {\n        test.err = e.message;\n      }\n\n      return test;\n    }).toArray().map(function (tests) {\n      return _extends({}, rest, { tests: tests });\n    });\n  };\n\n  return common;\n}(window);\n'use strict';\n\nwindow.common = function (global) {\n  var $ = global.$;\n  var moment = global.moment;\n  var _global$ga = global.ga;\n  var ga = _global$ga === undefined ? function () {} : _global$ga;\n  var _global$common = global.common;\n  var common = _global$common === undefined ? { init: [] } : _global$common;\n\n\n  function submitChallengeHandler(e) {\n    e.preventDefault();\n\n    var solution = common.editor.getValue();\n\n    $('#submit-challenge').attr('disabled', 'true').removeClass('btn-primary').addClass('btn-warning disabled');\n\n    var $checkmarkContainer = $('#checkmark-container');\n    $checkmarkContainer.css({ height: $checkmarkContainer.innerHeight() });\n\n    $('#challenge-checkmark').addClass('zoomOutUp')\n    // .removeClass('zoomInDown')\n    .delay(1000).queue(function (next) {\n      $(this).replaceWith('<div id=\"challenge-spinner\" ' + 'class=\"animated zoomInUp inner-circles-loader\">' + 'submitting...</div>');\n      next();\n    });\n\n    var timezone = 'UTC';\n    try {\n      timezone = moment.tz.guess();\n    } catch (err) {\n      err.message = '\\n          known bug, see: https://github.com/moment/moment-timezone/issues/294:\\n          ' + err.message + '\\n        ';\n      console.error(err);\n    }\n    var data = JSON.stringify({\n      id: common.challengeId,\n      name: common.challengeName,\n      challengeType: +common.challengeType,\n      solution: solution,\n      timezone: timezone\n    });\n\n    $.ajax({\n      url: '/completed-challenge/',\n      type: 'POST',\n      data: data,\n      contentType: 'application/json',\n      dataType: 'json'\n    }).success(function (res) {\n      if (res) {\n        window.location = '/challenges/next-challenge?id=' + common.challengeId;\n      }\n    }).fail(function () {\n      window.location.replace(window.location.href);\n    });\n  }\n\n  common.showCompletion = function showCompletion() {\n\n    ga('send', 'event', 'Challenge', 'solved', common.gaName, true);\n\n    $('#complete-courseware-dialog').modal('show');\n    $('#complete-courseware-dialog .modal-header').click();\n\n    $('#submit-challenge').off('click');\n    $('#submit-challenge').on('click', submitChallengeHandler);\n  };\n\n  return common;\n}(window);\n'use strict';\n\nwindow.common = function (_ref) {\n  var $ = _ref.$;\n  var _ref$common = _ref.common;\n  var common = _ref$common === undefined ? { init: [] } : _ref$common;\n\n  var stepClass = '.challenge-step';\n  var prevBtnClass = '.challenge-step-btn-prev';\n  var nextBtnClass = '.challenge-step-btn-next';\n  var actionBtnClass = '.challenge-step-btn-action';\n  var finishBtnClass = '.challenge-step-btn-finish';\n  var submitBtnId = '#challenge-step-btn-submit';\n  var submitModalId = '#challenge-step-modal';\n\n  function getPreviousStep($challengeSteps) {\n    var $prevStep = false;\n    var prevStepIndex = 0;\n    $challengeSteps.each(function (index) {\n      var $step = $(this);\n      if (!$step.hasClass('hidden')) {\n        prevStepIndex = index - 1;\n      }\n    });\n\n    $prevStep = $challengeSteps[prevStepIndex];\n\n    return $prevStep;\n  }\n\n  function getNextStep($challengeSteps) {\n    var length = $challengeSteps.length;\n    var $nextStep = false;\n    var nextStepIndex = 0;\n    $challengeSteps.each(function (index) {\n      var $step = $(this);\n      if (!$step.hasClass('hidden') && index + 1 !== length) {\n        nextStepIndex = index + 1;\n      }\n    });\n\n    $nextStep = $challengeSteps[nextStepIndex];\n\n    return $nextStep;\n  }\n\n  function handlePrevStepClick(e) {\n    e.preventDefault();\n    var prevStep = getPreviousStep($(stepClass));\n    $(this).parent().parent().removeClass('slideInLeft slideInRight').addClass('animated fadeOutRight fast-animation').delay(250).queue(function (prev) {\n      $(this).addClass('hidden');\n      if (prevStep) {\n        $(prevStep).removeClass('hidden').removeClass('fadeOutLeft fadeOutRight').addClass('animated slideInLeft fast-animation').delay(500).queue(function (prev) {\n          prev();\n        });\n      }\n      prev();\n    });\n  }\n\n  function handleNextStepClick(e) {\n    e.preventDefault();\n    var nextStep = getNextStep($(stepClass));\n    $(this).parent().parent().removeClass('slideInRight slideInLeft').addClass('animated fadeOutLeft fast-animation').delay(250).queue(function (next) {\n      $(this).addClass('hidden');\n      if (nextStep) {\n        $(nextStep).removeClass('hidden').removeClass('fadeOutRight fadeOutLeft').addClass('animated slideInRight fast-animation').delay(500).queue(function (next) {\n          next();\n        });\n      }\n      next();\n    });\n  }\n\n  function handleActionClick(e) {\n    var props = common.challengeSeed[0] || { stepIndex: [] };\n\n    var $el = $(this);\n    var index = +$el.attr('id');\n    var propIndex = props.stepIndex.indexOf(index);\n\n    if (propIndex === -1) {\n      return $el.parent().find('.disabled').removeClass('disabled');\n    }\n\n    // an API action\n    // prevent link from opening\n    e.preventDefault();\n    var prop = props.properties[propIndex];\n    var api = props.apis[propIndex];\n    if (common[prop]) {\n      return $el.parent().find('.disabled').removeClass('disabled');\n    }\n    return $.post(api).done(function (data) {\n      // assume a boolean indicates passing\n      if (typeof data === 'boolean') {\n        return $el.parent().find('.disabled').removeClass('disabled');\n      }\n      // assume api returns string when fails\n      return $el.parent().find('.disabled').replaceWith('<p>' + data + '</p>');\n    }).fail(function () {\n      console.log('failed');\n    });\n  }\n\n  function handleFinishClick(e) {\n    e.preventDefault();\n    $(submitModalId).modal('show');\n    $(submitModalId + '.modal-header').click();\n    $(submitBtnId).click(handleSubmitClick);\n  }\n\n  function handleSubmitClick(e) {\n    e.preventDefault();\n\n    $('#submit-challenge').attr('disabled', 'true').removeClass('btn-primary').addClass('btn-warning disabled');\n\n    var $checkmarkContainer = $('#checkmark-container');\n    $checkmarkContainer.css({ height: $checkmarkContainer.innerHeight() });\n\n    $('#challenge-checkmark').addClass('zoomOutUp').delay(1000).queue(function (next) {\n      $(this).replaceWith('<div id=\"challenge-spinner\" ' + 'class=\"animated zoomInUp inner-circles-loader\">' + 'submitting...</div>');\n      next();\n    });\n\n    $.ajax({\n      url: '/completed-challenge/',\n      type: 'POST',\n      data: JSON.stringify({\n        id: common.challengeId,\n        name: common.challengeName,\n        challengeType: +common.challengeType\n      }),\n      contentType: 'application/json',\n      dataType: 'json'\n    }).success(function (res) {\n      if (res) {\n        window.location = '/challenges/next-challenge?id=' + common.challengeId;\n      }\n    }).fail(function () {\n      window.location.replace(window.location.href);\n    });\n  }\n\n  common.init.push(function ($) {\n    if (common.challengeType !== '7') {\n      return null;\n    }\n\n    $(prevBtnClass).click(handlePrevStepClick);\n    $(nextBtnClass).click(handleNextStepClick);\n    $(actionBtnClass).click(handleActionClick);\n    $(finishBtnClass).click(handleFinishClick);\n    return null;\n  });\n\n  return common;\n}(window);\n'use strict';\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nfunction _objectWithoutProperties(obj, keys) { var target = {}; for (var i in obj) { if (keys.indexOf(i) >= 0) continue; if (!Object.prototype.hasOwnProperty.call(obj, i)) continue; target[i] = obj[i]; } return target; }\n\n$(document).ready(function () {\n  var common = window.common;\n  var Observable = window.Rx.Observable;\n  var addLoopProtect = common.addLoopProtect;\n  var challengeName = common.challengeName;\n  var challengeType = common.challengeType;\n  var challengeTypes = common.challengeTypes;\n\n\n  common.init.forEach(function (init) {\n    init($);\n  });\n\n  // only run if editor present\n  if (common.editor.getValue) {\n    var code$ = common.editorKeyUp$.debounce(750).map(function () {\n      return common.editor.getValue();\n    }).distinctUntilChanged().shareReplay();\n\n    // update storage\n    code$.subscribe(function (code) {\n      common.codeStorage.updateStorage(common.challengeName, code);\n      common.codeUri.querify(code);\n    }, function (err) {\n      return console.error(err);\n    });\n\n    code$\n    // only run for HTML\n    .filter(function () {\n      return common.challengeType === challengeTypes.HTML;\n    }).flatMap(function (code) {\n      return common.detectUnsafeCode$(code).map(function () {\n        var combinedCode = common.head + code + common.tail;\n\n        return addLoopProtect(combinedCode);\n      }).flatMap(function (code) {\n        return common.updatePreview$(code);\n      }).flatMap(function () {\n        return common.checkPreview$({ code: code });\n      }).catch(function (err) {\n        return Observable.just({ err: err });\n      });\n    }).subscribe(function (_ref) {\n      var err = _ref.err;\n\n      if (err) {\n        console.error(err);\n        return common.updatePreview$('\\n              <h1>' + err + '</h1>\\n            ').subscribe(function () {});\n      }\n      return null;\n    }, function (err) {\n      return console.error(err);\n    });\n  }\n\n  common.resetBtn$.doOnNext(function () {\n    common.editor.setValue(common.replaceSafeTags(common.seed));\n  }).flatMap(function () {\n    return common.executeChallenge$().catch(function (err) {\n      return Observable.just({ err: err });\n    });\n  }).subscribe(function (_ref2) {\n    var err = _ref2.err;\n    var output = _ref2.output;\n    var originalCode = _ref2.originalCode;\n\n    if (err) {\n      console.error(err);\n      return common.updateOutputDisplay('' + err);\n    }\n    common.codeStorage.updateStorage(challengeName, originalCode);\n    common.codeUri.querify(originalCode);\n    common.updateOutputDisplay(output);\n    return null;\n  }, function (err) {\n    if (err) {\n      console.error(err);\n    }\n    common.updateOutputDisplay('' + err);\n  });\n\n  Observable.merge(common.editorExecute$, common.submitBtn$).flatMap(function () {\n    common.appendToOutputDisplay('\\n// testing challenge...');\n    return common.executeChallenge$().map(function (_ref3) {\n      var tests = _ref3.tests;\n\n      var rest = _objectWithoutProperties(_ref3, ['tests']);\n\n      var solved = tests.every(function (test) {\n        return !test.err;\n      });\n      return _extends({}, rest, { tests: tests, solved: solved });\n    }).catch(function (err) {\n      return Observable.just({ err: err });\n    });\n  }).subscribe(function (_ref4) {\n    var err = _ref4.err;\n    var solved = _ref4.solved;\n    var output = _ref4.output;\n    var tests = _ref4.tests;\n\n    if (err) {\n      console.error(err);\n      if (common.challengeType === common.challengeTypes.HTML) {\n        return common.updatePreview$('\\n              <h1>' + err + '</h1>\\n            ').first().subscribe(function () {});\n      }\n      return common.updateOutputDisplay('' + err);\n    }\n    common.updateOutputDisplay(output);\n    common.displayTestResults(tests);\n    if (solved) {\n      common.showCompletion();\n    }\n    return null;\n  }, function (_ref5) {\n    var err = _ref5.err;\n\n    console.error(err);\n    common.updateOutputDisplay('' + err);\n  });\n\n  // initial challenge run to populate tests\n  if (challengeType === challengeTypes.HTML) {\n    var $preview = $('#preview');\n    return Observable.fromCallback($preview.ready, $preview)().delay(500).flatMap(function () {\n      return common.executeChallenge$();\n    }).catch(function (err) {\n      return Observable.just({ err: err });\n    }).subscribe(function (_ref6) {\n      var err = _ref6.err;\n      var tests = _ref6.tests;\n\n      if (err) {\n        console.error(err);\n        if (common.challengeType === common.challengeTypes.HTML) {\n          return common.updatePreview$('\\n                <h1>' + err + '</h1>\\n              ').subscribe(function () {});\n        }\n        return common.updateOutputDisplay('' + err);\n      }\n      common.displayTestResults(tests);\n      return null;\n    }, function (_ref7) {\n      var err = _ref7.err;\n\n      console.error(err);\n    });\n  }\n\n  if (challengeType === challengeTypes.BONFIRE || challengeType === challengeTypes.JS) {\n    return Observable.just({}).delay(500).flatMap(function () {\n      return common.executeChallenge$();\n    }).catch(function (err) {\n      return Observable.just({ err: err });\n    }).subscribe(function (_ref8) {\n      var err = _ref8.err;\n      var originalCode = _ref8.originalCode;\n      var tests = _ref8.tests;\n\n      if (err) {\n        console.error(err);\n        return common.updateOutputDisplay('' + err);\n      }\n      common.codeStorage.updateStorage(challengeName, originalCode);\n      common.displayTestResults(tests);\n      return null;\n    }, function (err) {\n      console.error(err);\n      common.updateOutputDisplay('' + err);\n    });\n  }\n  return null;\n});\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImluaXQuanMiLCJiaW5kaW5ncy5qcyIsImNvZGUtc3RvcmFnZS5qcyIsImNvZGUtdXJpLmpzIiwiYWRkLWxvb3AtcHJvdGVjdC5qcyIsImdldC1pZnJhbWUuanMiLCJ1cGRhdGUtcHJldmlldy5qcyIsImNyZWF0ZS1lZGl0b3IuanMiLCJkZXRlY3QtdW5zYWZlLWNvZGUtc3RyZWFtLmpzIiwiZGlzcGxheS10ZXN0LXJlc3VsdHMuanMiLCJleGVjdXRlLWNoYWxsZW5nZS1zdHJlYW0uanMiLCJvdXRwdXQtZGlzcGxheS5qcyIsInBob25lLXNjcm9sbC1sb2NrLmpzIiwicmVwb3J0LWlzc3VlLmpzIiwicnVuLXRlc3RzLXN0cmVhbS5qcyIsInNob3ctY29tcGxldGlvbi5qcyIsInN0ZXAtY2hhbGxlbmdlLmpzIiwiZW5kLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQ3ZIQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQzNLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUNsREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQzVIQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUNwQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQ3pCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FDaEVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FDdEdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FDdkNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FDM0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUNwREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUNoREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQzlGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUNuQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUNoREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQ3RFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FDN0pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJmaWxlIjoiY29tbW9uRnJhbWV3b3JrLmpzIiwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG53aW5kb3cuY29tbW9uID0gZnVuY3Rpb24gKGdsb2JhbCkge1xuICAvLyBjb21tb24gbmFtZXNwYWNlXG4gIC8vIGFsbCBjbGFzc2VzIHNob3VsZCBiZSBzdG9yZWQgaGVyZVxuICAvLyBjYWxsZWQgYXQgdGhlIGJlZ2lubmluZyBvZiBkb20gcmVhZHlcbiAgdmFyIF9nbG9iYWwkUnggPSBnbG9iYWwuUng7XG4gIHZhciBEaXNwb3NhYmxlID0gX2dsb2JhbCRSeC5EaXNwb3NhYmxlO1xuICB2YXIgT2JzZXJ2YWJsZSA9IF9nbG9iYWwkUnguT2JzZXJ2YWJsZTtcbiAgdmFyIGNvbmZpZyA9IF9nbG9iYWwkUnguY29uZmlnO1xuICB2YXIgX2dsb2JhbCRjb21tb24gPSBnbG9iYWwuY29tbW9uO1xuICB2YXIgY29tbW9uID0gX2dsb2JhbCRjb21tb24gPT09IHVuZGVmaW5lZCA/IHsgaW5pdDogW10gfSA6IF9nbG9iYWwkY29tbW9uO1xuXG5cbiAgY29uZmlnLmxvbmdTdGFja1N1cHBvcnQgPSB0cnVlO1xuICBjb21tb24uaGVhZCA9IGNvbW1vbi5oZWFkIHx8IFtdO1xuICBjb21tb24udGFpbCA9IGNvbW1vbi50YWlsIHx8IFtdO1xuICBjb21tb24uc2FsdCA9IE1hdGgucmFuZG9tKCk7XG5cbiAgY29tbW9uLmNoYWxsZW5nZVR5cGVzID0ge1xuICAgIEhUTUw6ICcwJyxcbiAgICBKUzogJzEnLFxuICAgIFZJREVPOiAnMicsXG4gICAgWklQTElORTogJzMnLFxuICAgIEJBU0VKVU1QOiAnNCcsXG4gICAgQk9ORklSRTogJzUnLFxuICAgIEhJS0VTOiAnNicsXG4gICAgU1RFUDogJzcnXG4gIH07XG5cbiAgY29tbW9uLmFycmF5VG9OZXdMaW5lU3RyaW5nID0gZnVuY3Rpb24gYXJyYXlUb05ld0xpbmVTdHJpbmcoc2VlZERhdGEpIHtcbiAgICBzZWVkRGF0YSA9IEFycmF5LmlzQXJyYXkoc2VlZERhdGEpID8gc2VlZERhdGEgOiBbc2VlZERhdGFdO1xuICAgIHJldHVybiBzZWVkRGF0YS5yZWR1Y2UoZnVuY3Rpb24gKHNlZWQsIGxpbmUpIHtcbiAgICAgIHJldHVybiAnJyArIHNlZWQgKyBsaW5lICsgJ1xcbic7XG4gICAgfSwgJycpO1xuICB9O1xuXG4gIGNvbW1vbi5zZWVkID0gY29tbW9uLmFycmF5VG9OZXdMaW5lU3RyaW5nKGNvbW1vbi5jaGFsbGVuZ2VTZWVkKTtcblxuICBjb21tb24ucmVwbGFjZVNjcmlwdFRhZ3MgPSBmdW5jdGlvbiByZXBsYWNlU2NyaXB0VGFncyh2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZS5yZXBsYWNlKC88c2NyaXB0Pi9naSwgJ2ZjY3NzJykucmVwbGFjZSgvPFxcL3NjcmlwdD4vZ2ksICdmY2NlcycpO1xuICB9O1xuXG4gIGNvbW1vbi5yZXBsYWNlU2FmZVRhZ3MgPSBmdW5jdGlvbiByZXBsYWNlU2FmZVRhZ3ModmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWUucmVwbGFjZSgvZmNjc3MvZ2ksICc8c2NyaXB0PicpLnJlcGxhY2UoL2ZjY2VzL2dpLCAnPC9zY3JpcHQ+Jyk7XG4gIH07XG5cbiAgY29tbW9uLnJlcGxhY2VGb3JtQWN0aW9uQXR0ciA9IGZ1bmN0aW9uIHJlcGxhY2VGb3JtQWN0aW9uKHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlLnJlcGxhY2UoLzxmb3JtW14+XSo+LywgZnVuY3Rpb24gKHZhbCkge1xuICAgICAgcmV0dXJuIHZhbC5yZXBsYWNlKC9hY3Rpb24oXFxzKj8pPS8sICdmY2NmYWEkMT0nKTtcbiAgICB9KTtcbiAgfTtcblxuICBjb21tb24ucmVwbGFjZUZjY2ZhYUF0dHIgPSBmdW5jdGlvbiByZXBsYWNlRmNjZmFhQXR0cih2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZS5yZXBsYWNlKC88Zm9ybVtePl0qPi8sIGZ1bmN0aW9uICh2YWwpIHtcbiAgICAgIHJldHVybiB2YWwucmVwbGFjZSgvZmNjZmFhKFxccyo/KT0vLCAnYWN0aW9uJDE9Jyk7XG4gICAgfSk7XG4gIH07XG5cbiAgY29tbW9uLnNjb3BlalF1ZXJ5ID0gZnVuY3Rpb24gc2NvcGVqUXVlcnkoc3RyKSB7XG4gICAgcmV0dXJuIHN0ci5yZXBsYWNlKC9cXCQvZ2ksICdqJCcpLnJlcGxhY2UoL2RvY3VtZW50L2dpLCAnamRvY3VtZW50JykucmVwbGFjZSgvalF1ZXJ5L2dpLCAnampRdWVyeScpO1xuICB9O1xuXG4gIGNvbW1vbi51blNjb3BlSlF1ZXJ5ID0gZnVuY3Rpb24gdW5TY29wZUpRdWVyeShzdHIpIHtcbiAgICByZXR1cm4gc3RyLnJlcGxhY2UoL2pcXCQvZ2ksICckJykucmVwbGFjZSgvamRvY3VtZW50L2dpLCAnZG9jdW1lbnQnKS5yZXBsYWNlKC9qalF1ZXJ5L2dpLCAnalF1ZXJ5Jyk7XG4gIH07XG5cbiAgdmFyIGNvbW1lbnRSZWdleCA9IC8oXFwvXFwqW14oXFwqXFwvKV0qXFwqXFwvKXwoWyBcXG5dXFwvXFwvW15cXG5dKikvZztcbiAgY29tbW9uLnJlbW92ZUNvbW1lbnRzID0gZnVuY3Rpb24gcmVtb3ZlQ29tbWVudHMoc3RyKSB7XG4gICAgcmV0dXJuIHN0ci5yZXBsYWNlKGNvbW1lbnRSZWdleCwgJycpO1xuICB9O1xuXG4gIHZhciBsb2dSZWdleCA9IC8oY29uc29sZVxcLltcXHddK1xccypcXCguKlxcOykvZztcbiAgY29tbW9uLnJlbW92ZUxvZ3MgPSBmdW5jdGlvbiByZW1vdmVMb2dzKHN0cikge1xuICAgIHJldHVybiBzdHIucmVwbGFjZShsb2dSZWdleCwgJycpO1xuICB9O1xuXG4gIGNvbW1vbi5yZWFzc2VtYmxlVGVzdCA9IGZ1bmN0aW9uIHJlYXNzZW1ibGVUZXN0KCkge1xuICAgIHZhciBjb2RlID0gYXJndW1lbnRzLmxlbmd0aCA8PSAwIHx8IGFyZ3VtZW50c1swXSA9PT0gdW5kZWZpbmVkID8gJycgOiBhcmd1bWVudHNbMF07XG4gICAgdmFyIF9yZWYgPSBhcmd1bWVudHNbMV07XG4gICAgdmFyIGxpbmUgPSBfcmVmLmxpbmU7XG4gICAgdmFyIHRleHQgPSBfcmVmLnRleHQ7XG5cbiAgICB2YXIgcmVnZXhwID0gbmV3IFJlZ0V4cCgnLy8nICsgbGluZSArIGNvbW1vbi5zYWx0KTtcbiAgICByZXR1cm4gY29kZS5yZXBsYWNlKHJlZ2V4cCwgdGV4dCk7XG4gIH07XG5cbiAgY29tbW9uLmdldFNjcmlwdENvbnRlbnQkID0gZnVuY3Rpb24gZ2V0U2NyaXB0Q29udGVudCQoc2NyaXB0KSB7XG4gICAgcmV0dXJuIE9ic2VydmFibGUuY3JlYXRlKGZ1bmN0aW9uIChvYnNlcnZlcikge1xuICAgICAgdmFyIGpxWEhSID0gJC5nZXQoc2NyaXB0LCBudWxsLCBudWxsLCAndGV4dCcpLnN1Y2Nlc3MoZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgICAgb2JzZXJ2ZXIub25OZXh0KGRhdGEpO1xuICAgICAgICBvYnNlcnZlci5vbkNvbXBsZXRlZCgpO1xuICAgICAgfSkuZmFpbChmdW5jdGlvbiAoZSkge1xuICAgICAgICByZXR1cm4gb2JzZXJ2ZXIub25FcnJvcihlKTtcbiAgICAgIH0pLmFsd2F5cyhmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBvYnNlcnZlci5vbkNvbXBsZXRlZCgpO1xuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiBuZXcgRGlzcG9zYWJsZShmdW5jdGlvbiAoKSB7XG4gICAgICAgIGpxWEhSLmFib3J0KCk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfTtcblxuICB2YXIgb3BlblNjcmlwdCA9IC9cXDxcXHM/c2NyaXB0XFxzP1xcPi9naTtcbiAgdmFyIGNsb3NpbmdTY3JpcHQgPSAvXFw8XFxzP1xcL1xccz9zY3JpcHRcXHM/XFw+L2dpO1xuXG4gIC8vIGRldGVjdHMgaWYgdGhlcmUgaXMgSmF2YVNjcmlwdCBpbiB0aGUgZmlyc3Qgc2NyaXB0IHRhZ1xuICBjb21tb24uaGFzSnMgPSBmdW5jdGlvbiBoYXNKcyhjb2RlKSB7XG4gICAgcmV0dXJuICEhY29tbW9uLmdldEpzRnJvbUh0bWwoY29kZSk7XG4gIH07XG5cbiAgLy8gZ3JhYnMgdGhlIGNvbnRlbnQgZnJvbSB0aGUgZmlyc3Qgc2NyaXB0IHRhZyBpbiB0aGUgY29kZVxuICBjb21tb24uZ2V0SnNGcm9tSHRtbCA9IGZ1bmN0aW9uIGdldEpzRnJvbUh0bWwoY29kZSkge1xuICAgIC8vIGdyYWIgdXNlciBqYXZhU2NyaXB0XG4gICAgcmV0dXJuIChjb2RlLnNwbGl0KG9wZW5TY3JpcHQpWzFdIHx8ICcnKS5zcGxpdChjbG9zaW5nU2NyaXB0KVswXSB8fCAnJztcbiAgfTtcblxuICByZXR1cm4gY29tbW9uO1xufSh3aW5kb3cpOyIsIid1c2Ugc3RyaWN0Jztcblxud2luZG93LmNvbW1vbiA9IGZ1bmN0aW9uIChnbG9iYWwpIHtcbiAgdmFyICQgPSBnbG9iYWwuJDtcbiAgdmFyIE9ic2VydmFibGUgPSBnbG9iYWwuUnguT2JzZXJ2YWJsZTtcbiAgdmFyIF9nbG9iYWwkY29tbW9uID0gZ2xvYmFsLmNvbW1vbjtcbiAgdmFyIGNvbW1vbiA9IF9nbG9iYWwkY29tbW9uID09PSB1bmRlZmluZWQgPyB7IGluaXQ6IFtdIH0gOiBfZ2xvYmFsJGNvbW1vbjtcblxuXG4gIGNvbW1vbi5jdHJsRW50ZXJDbGlja0hhbmRsZXIgPSBmdW5jdGlvbiBjdHJsRW50ZXJDbGlja0hhbmRsZXIoZSkge1xuICAgIC8vIGN0cmwgKyBlbnRlciBvciBjbWQgKyBlbnRlclxuICAgIGlmIChlLmtleUNvZGUgPT09IDEzICYmIChlLm1ldGFLZXkgfHwgZS5jdHJsS2V5KSkge1xuICAgICAgJCgnI2NvbXBsZXRlLWNvdXJzZXdhcmUtZGlhbG9nJykub2ZmKCdrZXlkb3duJywgY3RybEVudGVyQ2xpY2tIYW5kbGVyKTtcbiAgICAgIGlmICgkKCcjc3VibWl0LWNoYWxsZW5nZScpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgJCgnI3N1Ym1pdC1jaGFsbGVuZ2UnKS5jbGljaygpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgd2luZG93LmxvY2F0aW9uID0gJy9jaGFsbGVuZ2VzL25leHQtY2hhbGxlbmdlP2lkPScgKyBjb21tb24uY2hhbGxlbmdlSWQ7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIGNvbW1vbi5pbml0LnB1c2goZnVuY3Rpb24gKCQpIHtcblxuICAgIHZhciAkbWFyZ2luRml4ID0gJCgnLmlubmVyTWFyZ2luRml4Jyk7XG4gICAgJG1hcmdpbkZpeC5jc3MoJ21pbi1oZWlnaHQnLCAkbWFyZ2luRml4LmhlaWdodCgpKTtcblxuICAgIGNvbW1vbi5zdWJtaXRCdG4kID0gT2JzZXJ2YWJsZS5mcm9tRXZlbnQoJCgnI3N1Ym1pdEJ1dHRvbicpLCAnY2xpY2snKTtcblxuICAgIGNvbW1vbi5yZXNldEJ0biQgPSBPYnNlcnZhYmxlLmZyb21FdmVudCgkKCcjcmVzZXQtYnV0dG9uJyksICdjbGljaycpO1xuXG4gICAgLy8gaW5pdCBtb2RhbCBrZXliaW5kaW5ncyBvbiBvcGVuXG4gICAgJCgnI2NvbXBsZXRlLWNvdXJzZXdhcmUtZGlhbG9nJykub24oJ3Nob3duLmJzLm1vZGFsJywgZnVuY3Rpb24gKCkge1xuICAgICAgJCgnI2NvbXBsZXRlLWNvdXJzZXdhcmUtZGlhbG9nJykua2V5ZG93bihjb21tb24uY3RybEVudGVyQ2xpY2tIYW5kbGVyKTtcbiAgICB9KTtcblxuICAgIC8vIHJlbW92ZSBtb2RhbCBrZXliaW5kcyBvbiBjbG9zZVxuICAgICQoJyNjb21wbGV0ZS1jb3Vyc2V3YXJlLWRpYWxvZycpLm9uKCdoaWRkZW4uYnMubW9kYWwnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAkKCcjY29tcGxldGUtY291cnNld2FyZS1kaWFsb2cnKS5vZmYoJ2tleWRvd24nLCBjb21tb24uY3RybEVudGVyQ2xpY2tIYW5kbGVyKTtcbiAgICB9KTtcblxuICAgIC8vIHZpZGVvIGNoZWNrbGlzdCBiaW5kaW5nXG4gICAgJCgnLmNoYWxsZW5nZS1saXN0LWNoZWNrYm94Jykub24oJ2NoYW5nZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBjaGVja2JveElkID0gJCh0aGlzKS5wYXJlbnQoKS5wYXJlbnQoKS5hdHRyKCdpZCcpO1xuICAgICAgaWYgKCQodGhpcykuaXMoJzpjaGVja2VkJykpIHtcbiAgICAgICAgJCh0aGlzKS5wYXJlbnQoKS5zaWJsaW5ncygpLmNoaWxkcmVuKCkuYWRkQ2xhc3MoJ2ZhZGVkJyk7XG4gICAgICAgIGlmICghbG9jYWxTdG9yYWdlIHx8ICFsb2NhbFN0b3JhZ2VbY2hlY2tib3hJZF0pIHtcbiAgICAgICAgICBsb2NhbFN0b3JhZ2VbY2hlY2tib3hJZF0gPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmICghJCh0aGlzKS5pcygnOmNoZWNrZWQnKSkge1xuICAgICAgICAkKHRoaXMpLnBhcmVudCgpLnNpYmxpbmdzKCkuY2hpbGRyZW4oKS5yZW1vdmVDbGFzcygnZmFkZWQnKTtcbiAgICAgICAgaWYgKGxvY2FsU3RvcmFnZVtjaGVja2JveElkXSkge1xuICAgICAgICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKGNoZWNrYm94SWQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAkKCcuY2hlY2tsaXN0LWVsZW1lbnQnKS5lYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBjaGVja2xpc3RFbGVtZW50SWQgPSAkKHRoaXMpLmF0dHIoJ2lkJyk7XG4gICAgICBpZiAobG9jYWxTdG9yYWdlW2NoZWNrbGlzdEVsZW1lbnRJZF0pIHtcbiAgICAgICAgJCh0aGlzKS5jaGlsZHJlbigpLmNoaWxkcmVuKCdsaScpLmFkZENsYXNzKCdmYWRlZCcpO1xuICAgICAgICAkKHRoaXMpLmNoaWxkcmVuKCkuY2hpbGRyZW4oJ2lucHV0JykudHJpZ2dlcignY2xpY2snKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIHZpZGVvIGNoYWxsZW5nZSBzdWJtaXRcbiAgICAkKCcjbmV4dC1jb3Vyc2V3YXJlLWJ1dHRvbicpLm9uKCdjbGljaycsIGZ1bmN0aW9uICgpIHtcbiAgICAgICQoJyNuZXh0LWNvdXJzZXdhcmUtYnV0dG9uJykudW5iaW5kKCdjbGljaycpO1xuICAgICAgaWYgKCQoJy5zaWdudXAtYnRuLW5hdicpLmxlbmd0aCA8IDEpIHtcbiAgICAgICAgdmFyIGRhdGE7XG4gICAgICAgIHZhciBzb2x1dGlvbiA9ICQoJyNwdWJsaWMtdXJsJykudmFsKCkgfHwgbnVsbDtcbiAgICAgICAgdmFyIGdpdGh1YkxpbmsgPSAkKCcjZ2l0aHViLXVybCcpLnZhbCgpIHx8IG51bGw7XG4gICAgICAgIHN3aXRjaCAoY29tbW9uLmNoYWxsZW5nZVR5cGUpIHtcbiAgICAgICAgICBjYXNlIGNvbW1vbi5jaGFsbGVuZ2VUeXBlcy5WSURFTzpcbiAgICAgICAgICAgIGRhdGEgPSB7XG4gICAgICAgICAgICAgIGlkOiBjb21tb24uY2hhbGxlbmdlSWQsXG4gICAgICAgICAgICAgIG5hbWU6IGNvbW1vbi5jaGFsbGVuZ2VOYW1lLFxuICAgICAgICAgICAgICBjaGFsbGVuZ2VUeXBlOiArY29tbW9uLmNoYWxsZW5nZVR5cGVcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICAkLmFqYXgoe1xuICAgICAgICAgICAgICB1cmw6ICcvY29tcGxldGVkLWNoYWxsZW5nZS8nLFxuICAgICAgICAgICAgICB0eXBlOiAnUE9TVCcsXG4gICAgICAgICAgICAgIGRhdGE6IEpTT04uc3RyaW5naWZ5KGRhdGEpLFxuICAgICAgICAgICAgICBjb250ZW50VHlwZTogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICAgICAgICBkYXRhVHlwZTogJ2pzb24nXG4gICAgICAgICAgICB9KS5zdWNjZXNzKGZ1bmN0aW9uIChyZXMpIHtcbiAgICAgICAgICAgICAgaWYgKCFyZXMpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSAnL2NoYWxsZW5nZXMvbmV4dC1jaGFsbGVuZ2U/aWQ9JyArIGNvbW1vbi5jaGFsbGVuZ2VJZDtcbiAgICAgICAgICAgIH0pLmZhaWwoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICB3aW5kb3cubG9jYXRpb24ucmVwbGFjZSh3aW5kb3cubG9jYXRpb24uaHJlZik7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBjb21tb24uY2hhbGxlbmdlVHlwZXMuQkFTRUpVTVA6XG4gICAgICAgICAgY2FzZSBjb21tb24uY2hhbGxlbmdlVHlwZXMuWklQTElORTpcbiAgICAgICAgICAgIGRhdGEgPSB7XG4gICAgICAgICAgICAgIGlkOiBjb21tb24uY2hhbGxlbmdlSWQsXG4gICAgICAgICAgICAgIG5hbWU6IGNvbW1vbi5jaGFsbGVuZ2VOYW1lLFxuICAgICAgICAgICAgICBjaGFsbGVuZ2VUeXBlOiArY29tbW9uLmNoYWxsZW5nZVR5cGUsXG4gICAgICAgICAgICAgIHNvbHV0aW9uOiBzb2x1dGlvbixcbiAgICAgICAgICAgICAgZ2l0aHViTGluazogZ2l0aHViTGlua1xuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgJC5hamF4KHtcbiAgICAgICAgICAgICAgdXJsOiAnL2NvbXBsZXRlZC16aXBsaW5lLW9yLWJhc2VqdW1wLycsXG4gICAgICAgICAgICAgIHR5cGU6ICdQT1NUJyxcbiAgICAgICAgICAgICAgZGF0YTogSlNPTi5zdHJpbmdpZnkoZGF0YSksXG4gICAgICAgICAgICAgIGNvbnRlbnRUeXBlOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgICAgICAgIGRhdGFUeXBlOiAnanNvbidcbiAgICAgICAgICAgIH0pLnN1Y2Nlc3MoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICB3aW5kb3cubG9jYXRpb24uaHJlZiA9ICcvY2hhbGxlbmdlcy9uZXh0LWNoYWxsZW5nZT9pZD0nICsgY29tbW9uLmNoYWxsZW5nZUlkO1xuICAgICAgICAgICAgfSkuZmFpbChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5yZXBsYWNlKHdpbmRvdy5sb2NhdGlvbi5ocmVmKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBjYXNlIGNvbW1vbi5jaGFsbGVuZ2VUeXBlcy5CT05GSVJFOlxuICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSAnL2NoYWxsZW5nZXMvbmV4dC1jaGFsbGVuZ2U/aWQ9JyArIGNvbW1vbi5jaGFsbGVuZ2VJZDtcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdIYXBweSBDb2RpbmchJyk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuXG4gICAgaWYgKGNvbW1vbi5jaGFsbGVuZ2VOYW1lKSB7XG4gICAgICB3aW5kb3cuZ2EoJ3NlbmQnLCAnZXZlbnQnLCAnQ2hhbGxlbmdlJywgJ2xvYWQnLCBjb21tb24uZ2FOYW1lKTtcbiAgICB9XG5cbiAgICAkKCcjY29tcGxldGUtY291cnNld2FyZS1kaWFsb2cnKS5vbignaGlkZGVuLmJzLm1vZGFsJywgZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKGNvbW1vbi5lZGl0b3IuZm9jdXMpIHtcbiAgICAgICAgY29tbW9uLmVkaXRvci5mb2N1cygpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgJCgnI3RyaWdnZXItaXNzdWUtbW9kYWwnKS5vbignY2xpY2snLCBmdW5jdGlvbiAoKSB7XG4gICAgICAkKCcjaXNzdWUtbW9kYWwnKS5tb2RhbCgnc2hvdycpO1xuICAgIH0pO1xuXG4gICAgJCgnI3RyaWdnZXItaGVscC1tb2RhbCcpLm9uKCdjbGljaycsIGZ1bmN0aW9uICgpIHtcbiAgICAgICQoJyNoZWxwLW1vZGFsJykubW9kYWwoJ3Nob3cnKTtcbiAgICB9KTtcblxuICAgICQoJyN0cmlnZ2VyLXJlc2V0LW1vZGFsJykub24oJ2NsaWNrJywgZnVuY3Rpb24gKCkge1xuICAgICAgJCgnI3Jlc2V0LW1vZGFsJykubW9kYWwoJ3Nob3cnKTtcbiAgICB9KTtcblxuICAgICQoJyN0cmlnZ2VyLXBhaXItbW9kYWwnKS5vbignY2xpY2snLCBmdW5jdGlvbiAoKSB7XG4gICAgICAkKCcjcGFpci1tb2RhbCcpLm1vZGFsKCdzaG93Jyk7XG4gICAgfSk7XG5cbiAgICAkKCcjY29tcGxldGVkLWNvdXJzZXdhcmUnKS5vbignY2xpY2snLCBmdW5jdGlvbiAoKSB7XG4gICAgICAkKCcjY29tcGxldGUtY291cnNld2FyZS1kaWFsb2cnKS5tb2RhbCgnc2hvdycpO1xuICAgIH0pO1xuXG4gICAgJCgnI2hlbHAtaXZlLWZvdW5kLWEtYnVnLXdpa2ktYXJ0aWNsZScpLm9uKCdjbGljaycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHdpbmRvdy5vcGVuKCdodHRwczovL2dpdGh1Yi5jb20vZnJlZWNvZGVjYW1wY2hpbmEvZnJlZWNvZGVjYW1wLmNuL3dpa2kvJyArIFwiSGVscC1JJ3ZlLUZvdW5kLWEtQnVnXCIsICdfYmxhbmsnKTtcbiAgICB9KTtcblxuICAgICQoJyNzZWFyY2gtaXNzdWUnKS5vbignY2xpY2snLCBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgcXVlcnlJc3N1ZSA9IHdpbmRvdy5sb2NhdGlvbi5ocmVmLnRvU3RyaW5nKCkuc3BsaXQoJz8nKVswXS5yZXBsYWNlKC8oIyopJC8sICcnKTtcbiAgICAgIHdpbmRvdy5vcGVuKCdodHRwczovL2dpdGh1Yi5jb20vZnJlZWNvZGVjYW1wY2hpbmEvZnJlZWNvZGVjYW1wLmNuL2lzc3Vlcz9xPScgKyAnaXM6aXNzdWUgaXM6YWxsICcgKyBjb21tb24uY2hhbGxlbmdlTmFtZSArICcgT1IgJyArIHF1ZXJ5SXNzdWUuc3Vic3RyKHF1ZXJ5SXNzdWUubGFzdEluZGV4T2YoJ2NoYWxsZW5nZXMvJykgKyAxMSkucmVwbGFjZSgnLycsICcnKSwgJ19ibGFuaycpO1xuICAgIH0pO1xuICB9KTtcblxuICByZXR1cm4gY29tbW9uO1xufSh3aW5kb3cpOyIsIid1c2Ugc3RyaWN0JztcblxuLy8gZGVwZW5kcyBvbjogY29kZVVyaVxud2luZG93LmNvbW1vbiA9IGZ1bmN0aW9uIChnbG9iYWwpIHtcbiAgdmFyIGxvY2FsU3RvcmFnZSA9IGdsb2JhbC5sb2NhbFN0b3JhZ2U7XG4gIHZhciBfZ2xvYmFsJGNvbW1vbiA9IGdsb2JhbC5jb21tb247XG4gIHZhciBjb21tb24gPSBfZ2xvYmFsJGNvbW1vbiA9PT0gdW5kZWZpbmVkID8geyBpbml0OiBbXSB9IDogX2dsb2JhbCRjb21tb247XG5cblxuICB2YXIgY2hhbGxlbmdlUHJlZml4ID0gWydCb25maXJlOiAnLCAnV2F5cG9pbnQ6ICcsICdaaXBsaW5lOiAnLCAnQmFzZWp1bXA6ICcsICdDaGVja3BvaW50OiAnXSxcbiAgICAgIGl0ZW07XG5cbiAgdmFyIGNvZGVTdG9yYWdlID0ge1xuICAgIGdldFN0b3JlZFZhbHVlOiBmdW5jdGlvbiBnZXRTdG9yZWRWYWx1ZShrZXkpIHtcbiAgICAgIGlmICghbG9jYWxTdG9yYWdlIHx8IHR5cGVvZiBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSAhPT0gJ2Z1bmN0aW9uJyB8fCAha2V5IHx8IHR5cGVvZiBrZXkgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKCd1bmFibGUgdG8gcmVhZCBmcm9tIHN0b3JhZ2UnKTtcbiAgICAgICAgcmV0dXJuICcnO1xuICAgICAgfVxuICAgICAgaWYgKGxvY2FsU3RvcmFnZS5nZXRJdGVtKGtleSArICdWYWwnKSkge1xuICAgICAgICByZXR1cm4gJycgKyBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShrZXkgKyAnVmFsJyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8PSBjaGFsbGVuZ2VQcmVmaXgubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBpdGVtID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oY2hhbGxlbmdlUHJlZml4W2ldICsga2V5ICsgJ1ZhbCcpO1xuICAgICAgICAgIGlmIChpdGVtKSB7XG4gICAgICAgICAgICByZXR1cm4gJycgKyBpdGVtO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfSxcblxuXG4gICAgaXNBbGl2ZTogZnVuY3Rpb24gaXNBbGl2ZShrZXkpIHtcbiAgICAgIHZhciB2YWwgPSB0aGlzLmdldFN0b3JlZFZhbHVlKGtleSk7XG4gICAgICByZXR1cm4gdmFsICE9PSAnbnVsbCcgJiYgdmFsICE9PSAndW5kZWZpbmVkJyAmJiB2YWwgJiYgdmFsLmxlbmd0aCA+IDA7XG4gICAgfSxcblxuICAgIHVwZGF0ZVN0b3JhZ2U6IGZ1bmN0aW9uIHVwZGF0ZVN0b3JhZ2Uoa2V5LCBjb2RlKSB7XG4gICAgICBpZiAoIWxvY2FsU3RvcmFnZSB8fCB0eXBlb2YgbG9jYWxTdG9yYWdlLnNldEl0ZW0gIT09ICdmdW5jdGlvbicgfHwgIWtleSB8fCB0eXBlb2Yga2V5ICE9PSAnc3RyaW5nJykge1xuICAgICAgICBjb25zb2xlLmxvZygndW5hYmxlIHRvIHNhdmUgdG8gc3RvcmFnZScpO1xuICAgICAgICByZXR1cm4gY29kZTtcbiAgICAgIH1cbiAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKGtleSArICdWYWwnLCBjb2RlKTtcbiAgICAgIHJldHVybiBjb2RlO1xuICAgIH1cbiAgfTtcblxuICBjb21tb24uY29kZVN0b3JhZ2UgPSBjb2RlU3RvcmFnZTtcblxuICByZXR1cm4gY29tbW9uO1xufSh3aW5kb3csIHdpbmRvdy5jb21tb24pOyIsIid1c2Ugc3RyaWN0JztcblxuLy8gc3RvcmUgY29kZSBpbiB0aGUgVVJMXG53aW5kb3cuY29tbW9uID0gZnVuY3Rpb24gKGdsb2JhbCkge1xuICB2YXIgX2VuY29kZSA9IGdsb2JhbC5lbmNvZGVVUklDb21wb25lbnQ7XG4gIHZhciBfZGVjb2RlID0gZ2xvYmFsLmRlY29kZVVSSUNvbXBvbmVudDtcbiAgdmFyIGxvY2F0aW9uID0gZ2xvYmFsLmxvY2F0aW9uO1xuICB2YXIgaGlzdG9yeSA9IGdsb2JhbC5oaXN0b3J5O1xuICB2YXIgX2dsb2JhbCRjb21tb24gPSBnbG9iYWwuY29tbW9uO1xuICB2YXIgY29tbW9uID0gX2dsb2JhbCRjb21tb24gPT09IHVuZGVmaW5lZCA/IHsgaW5pdDogW10gfSA6IF9nbG9iYWwkY29tbW9uO1xuICB2YXIgcmVwbGFjZVNjcmlwdFRhZ3MgPSBjb21tb24ucmVwbGFjZVNjcmlwdFRhZ3M7XG4gIHZhciByZXBsYWNlU2FmZVRhZ3MgPSBjb21tb24ucmVwbGFjZVNhZmVUYWdzO1xuICB2YXIgcmVwbGFjZUZvcm1BY3Rpb25BdHRyID0gY29tbW9uLnJlcGxhY2VGb3JtQWN0aW9uQXR0cjtcbiAgdmFyIHJlcGxhY2VGY2NmYWFBdHRyID0gY29tbW9uLnJlcGxhY2VGY2NmYWFBdHRyO1xuXG5cbiAgdmFyIHF1ZXJ5UmVnZXggPSAvXihcXD98I1xcPykvO1xuICBmdW5jdGlvbiBlbmNvZGVGY2ModmFsKSB7XG4gICAgcmV0dXJuIHJlcGxhY2VTY3JpcHRUYWdzKHJlcGxhY2VGb3JtQWN0aW9uQXR0cih2YWwpKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGRlY29kZUZjYyh2YWwpIHtcbiAgICByZXR1cm4gcmVwbGFjZVNhZmVUYWdzKHJlcGxhY2VGY2NmYWFBdHRyKHZhbCkpO1xuICB9XG5cbiAgdmFyIGNvZGVVcmkgPSB7XG4gICAgZW5jb2RlOiBmdW5jdGlvbiBlbmNvZGUoY29kZSkge1xuICAgICAgcmV0dXJuIF9lbmNvZGUoY29kZSk7XG4gICAgfSxcbiAgICBkZWNvZGU6IGZ1bmN0aW9uIGRlY29kZShjb2RlKSB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gX2RlY29kZShjb2RlKTtcbiAgICAgIH0gY2F0Y2ggKGlnbm9yZSkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICB9LFxuICAgIGlzSW5RdWVyeTogZnVuY3Rpb24gaXNJblF1ZXJ5KHF1ZXJ5KSB7XG4gICAgICB2YXIgZGVjb2RlZCA9IGNvZGVVcmkuZGVjb2RlKHF1ZXJ5KTtcbiAgICAgIGlmICghZGVjb2RlZCB8fCB0eXBlb2YgZGVjb2RlZC5zcGxpdCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICByZXR1cm4gZGVjb2RlZC5yZXBsYWNlKHF1ZXJ5UmVnZXgsICcnKS5zcGxpdCgnJicpLnJlZHVjZShmdW5jdGlvbiAoZm91bmQsIHBhcmFtKSB7XG4gICAgICAgIHZhciBrZXkgPSBwYXJhbS5zcGxpdCgnPScpWzBdO1xuICAgICAgICBpZiAoa2V5ID09PSAnc29sdXRpb24nKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZvdW5kO1xuICAgICAgfSwgZmFsc2UpO1xuICAgIH0sXG4gICAgaXNBbGl2ZTogZnVuY3Rpb24gaXNBbGl2ZSgpIHtcbiAgICAgIHJldHVybiBjb2RlVXJpLmVuYWJsZWQgJiYgY29kZVVyaS5pc0luUXVlcnkobG9jYXRpb24uc2VhcmNoKSB8fCBjb2RlVXJpLmlzSW5RdWVyeShsb2NhdGlvbi5oYXNoKTtcbiAgICB9LFxuICAgIGdldEtleUluUXVlcnk6IGZ1bmN0aW9uIGdldEtleUluUXVlcnkocXVlcnkpIHtcbiAgICAgIHZhciBrZXlUb0ZpbmQgPSBhcmd1bWVudHMubGVuZ3RoIDw9IDEgfHwgYXJndW1lbnRzWzFdID09PSB1bmRlZmluZWQgPyAnJyA6IGFyZ3VtZW50c1sxXTtcblxuICAgICAgcmV0dXJuIHF1ZXJ5LnNwbGl0KCcmJykucmVkdWNlKGZ1bmN0aW9uIChvbGRWYWx1ZSwgcGFyYW0pIHtcbiAgICAgICAgdmFyIGtleSA9IHBhcmFtLnNwbGl0KCc9JylbMF07XG4gICAgICAgIHZhciB2YWx1ZSA9IHBhcmFtLnNwbGl0KCc9Jykuc2xpY2UoMSkuam9pbignPScpO1xuXG4gICAgICAgIGlmIChrZXkgPT09IGtleVRvRmluZCkge1xuICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb2xkVmFsdWU7XG4gICAgICB9LCBudWxsKTtcbiAgICB9LFxuICAgIGdldFNvbHV0aW9uRnJvbVF1ZXJ5OiBmdW5jdGlvbiBnZXRTb2x1dGlvbkZyb21RdWVyeSgpIHtcbiAgICAgIHZhciBxdWVyeSA9IGFyZ3VtZW50cy5sZW5ndGggPD0gMCB8fCBhcmd1bWVudHNbMF0gPT09IHVuZGVmaW5lZCA/ICcnIDogYXJndW1lbnRzWzBdO1xuXG4gICAgICByZXR1cm4gZGVjb2RlRmNjKGNvZGVVcmkuZGVjb2RlKGNvZGVVcmkuZ2V0S2V5SW5RdWVyeShxdWVyeSwgJ3NvbHV0aW9uJykpKTtcbiAgICB9LFxuXG4gICAgcGFyc2U6IGZ1bmN0aW9uIHBhcnNlKCkge1xuICAgICAgaWYgKCFjb2RlVXJpLmVuYWJsZWQpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgICB2YXIgcXVlcnk7XG4gICAgICBpZiAobG9jYXRpb24uc2VhcmNoICYmIGNvZGVVcmkuaXNJblF1ZXJ5KGxvY2F0aW9uLnNlYXJjaCkpIHtcbiAgICAgICAgcXVlcnkgPSBsb2NhdGlvbi5zZWFyY2gucmVwbGFjZSgvXlxcPy8sICcnKTtcblxuICAgICAgICBpZiAoaGlzdG9yeSAmJiB0eXBlb2YgaGlzdG9yeS5yZXBsYWNlU3RhdGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICBoaXN0b3J5LnJlcGxhY2VTdGF0ZShoaXN0b3J5LnN0YXRlLCBudWxsLCBsb2NhdGlvbi5ocmVmLnNwbGl0KCc/JylbMF0pO1xuICAgICAgICAgIGxvY2F0aW9uLmhhc2ggPSAnIz8nICsgZW5jb2RlRmNjKHF1ZXJ5KTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcXVlcnkgPSBsb2NhdGlvbi5oYXNoLnJlcGxhY2UoL15cXCNcXD8vLCAnJyk7XG4gICAgICB9XG5cbiAgICAgIGlmICghcXVlcnkpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzLmdldFNvbHV0aW9uRnJvbVF1ZXJ5KHF1ZXJ5KTtcbiAgICB9LFxuICAgIHF1ZXJpZnk6IGZ1bmN0aW9uIHF1ZXJpZnkoc29sdXRpb24pIHtcbiAgICAgIGlmICghY29kZVVyaS5lbmFibGVkKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgaWYgKGhpc3RvcnkgJiYgdHlwZW9mIGhpc3RvcnkucmVwbGFjZVN0YXRlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIC8vIGdyYWIgdGhlIHVybCB1cCB0byB0aGUgcXVlcnlcbiAgICAgICAgLy8gZGVzdHJveSBhbnkgaGFzaCBzeW1ib2xzIHN0aWxsIGNsaW5naW5nIHRvIGxpZmVcbiAgICAgICAgdmFyIHVybCA9IGxvY2F0aW9uLmhyZWYuc3BsaXQoJz8nKVswXS5yZXBsYWNlKC8oIyopJC8sICcnKTtcbiAgICAgICAgaGlzdG9yeS5yZXBsYWNlU3RhdGUoaGlzdG9yeS5zdGF0ZSwgbnVsbCwgdXJsICsgJyM/JyArIChjb2RlVXJpLnNob3VsZFJ1bigpID8gJycgOiAncnVuPWRpc2FibGVkJicpICsgJ3NvbHV0aW9uPScgKyBjb2RlVXJpLmVuY29kZShlbmNvZGVGY2Moc29sdXRpb24pKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsb2NhdGlvbi5oYXNoID0gJz9zb2x1dGlvbj0nICsgY29kZVVyaS5lbmNvZGUoZW5jb2RlRmNjKHNvbHV0aW9uKSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBzb2x1dGlvbjtcbiAgICB9LFxuICAgIGVuYWJsZWQ6IHRydWUsXG4gICAgc2hvdWxkUnVuOiBmdW5jdGlvbiBzaG91bGRSdW4oKSB7XG4gICAgICByZXR1cm4gIXRoaXMuZ2V0S2V5SW5RdWVyeSgobG9jYXRpb24uc2VhcmNoIHx8IGxvY2F0aW9uLmhhc2gpLnJlcGxhY2UocXVlcnlSZWdleCwgJycpLCAncnVuJyk7XG4gICAgfVxuICB9O1xuXG4gIGNvbW1vbi5pbml0LnB1c2goZnVuY3Rpb24gKCkge1xuICAgIGNvZGVVcmkucGFyc2UoKTtcbiAgfSk7XG5cbiAgY29tbW9uLmNvZGVVcmkgPSBjb2RlVXJpO1xuICBjb21tb24uc2hvdWxkUnVuID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBjb2RlVXJpLnNob3VsZFJ1bigpO1xuICB9O1xuXG4gIHJldHVybiBjb21tb247XG59KHdpbmRvdyk7IiwiJ3VzZSBzdHJpY3QnO1xuXG53aW5kb3cuY29tbW9uID0gZnVuY3Rpb24gKGdsb2JhbCkge1xuICB2YXIgbG9vcFByb3RlY3QgPSBnbG9iYWwubG9vcFByb3RlY3Q7XG4gIHZhciBfZ2xvYmFsJGNvbW1vbiA9IGdsb2JhbC5jb21tb247XG4gIHZhciBjb21tb24gPSBfZ2xvYmFsJGNvbW1vbiA9PT0gdW5kZWZpbmVkID8geyBpbml0OiBbXSB9IDogX2dsb2JhbCRjb21tb247XG5cblxuICBsb29wUHJvdGVjdC5oaXQgPSBmdW5jdGlvbiBoaXQobGluZSkge1xuICAgIHZhciBlcnIgPSAnRXJyb3I6IEV4aXRpbmcgcG90ZW50aWFsIGluZmluaXRlIGxvb3AgYXQgbGluZSAnICsgbGluZSArICcuIFRvIGRpc2FibGUgbG9vcCBwcm90ZWN0aW9uLCB3cml0ZTogXFxuXFxcXC9cXFxcLyBub3Byb3RlY3RcXG5hcyB0aGUgZmlyc3QnICsgJ2xpbmUuIEJld2FyZSB0aGF0IGlmIHlvdSBkbyBoYXZlIGFuIGluZmluaXRlIGxvb3AgaW4geW91ciBjb2RlJyArICd0aGlzIHdpbGwgY3Jhc2ggeW91ciBicm93c2VyLic7XG4gICAgY29uc29sZS5lcnJvcihlcnIpO1xuICB9O1xuXG4gIGNvbW1vbi5hZGRMb29wUHJvdGVjdCA9IGZ1bmN0aW9uIGFkZExvb3BQcm90ZWN0KCkge1xuICAgIHZhciBjb2RlID0gYXJndW1lbnRzLmxlbmd0aCA8PSAwIHx8IGFyZ3VtZW50c1swXSA9PT0gdW5kZWZpbmVkID8gJycgOiBhcmd1bWVudHNbMF07XG5cbiAgICByZXR1cm4gbG9vcFByb3RlY3QoY29kZSk7XG4gIH07XG5cbiAgcmV0dXJuIGNvbW1vbjtcbn0od2luZG93KTsiLCIndXNlIHN0cmljdCc7XG5cbndpbmRvdy5jb21tb24gPSBmdW5jdGlvbiAoZ2xvYmFsKSB7XG4gIHZhciBfZ2xvYmFsJGNvbW1vbiA9IGdsb2JhbC5jb21tb247XG4gIHZhciBjb21tb24gPSBfZ2xvYmFsJGNvbW1vbiA9PT0gdW5kZWZpbmVkID8geyBpbml0OiBbXSB9IDogX2dsb2JhbCRjb21tb247XG4gIHZhciBkb2MgPSBnbG9iYWwuZG9jdW1lbnQ7XG5cblxuICBjb21tb24uZ2V0SWZyYW1lID0gZnVuY3Rpb24gZ2V0SWZyYW1lKCkge1xuICAgIHZhciBpZCA9IGFyZ3VtZW50cy5sZW5ndGggPD0gMCB8fCBhcmd1bWVudHNbMF0gPT09IHVuZGVmaW5lZCA/ICdwcmV2aWV3JyA6IGFyZ3VtZW50c1swXTtcblxuICAgIHZhciBwcmV2aWV3RnJhbWUgPSBkb2MuZ2V0RWxlbWVudEJ5SWQoaWQpO1xuXG4gICAgLy8gY3JlYXRlIGFuZCBhcHBlbmQgYSBoaWRkZW4gcHJldmlldyBmcmFtZVxuICAgIGlmICghcHJldmlld0ZyYW1lKSB7XG4gICAgICBwcmV2aWV3RnJhbWUgPSBkb2MuY3JlYXRlRWxlbWVudCgnaWZyYW1lJyk7XG4gICAgICBwcmV2aWV3RnJhbWUuaWQgPSBpZDtcbiAgICAgIHByZXZpZXdGcmFtZS5zZXRBdHRyaWJ1dGUoJ3N0eWxlJywgJ2Rpc3BsYXk6IG5vbmUnKTtcbiAgICAgIGRvYy5ib2R5LmFwcGVuZENoaWxkKHByZXZpZXdGcmFtZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHByZXZpZXdGcmFtZS5jb250ZW50RG9jdW1lbnQgfHwgcHJldmlld0ZyYW1lLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQ7XG4gIH07XG5cbiAgcmV0dXJuIGNvbW1vbjtcbn0od2luZG93KTsiLCIndXNlIHN0cmljdCc7XG5cbndpbmRvdy5jb21tb24gPSBmdW5jdGlvbiAoZ2xvYmFsKSB7XG4gIHZhciBfZ2xvYmFsJFJ4ID0gZ2xvYmFsLlJ4O1xuICB2YXIgQmVoYXZpb3JTdWJqZWN0ID0gX2dsb2JhbCRSeC5CZWhhdmlvclN1YmplY3Q7XG4gIHZhciBPYnNlcnZhYmxlID0gX2dsb2JhbCRSeC5PYnNlcnZhYmxlO1xuICB2YXIgX2dsb2JhbCRjb21tb24gPSBnbG9iYWwuY29tbW9uO1xuICB2YXIgY29tbW9uID0gX2dsb2JhbCRjb21tb24gPT09IHVuZGVmaW5lZCA/IHsgaW5pdDogW10gfSA6IF9nbG9iYWwkY29tbW9uO1xuXG4gIC8vIHRoZSBmaXJzdCBzY3JpcHQgdGFnIGhlcmUgaXMgdG8gcHJveHkgalF1ZXJ5XG4gIC8vIFdlIHVzZSB0aGUgc2FtZSBqUXVlcnkgb24gdGhlIG1haW4gd2luZG93IGJ1dCB3ZSBjaGFuZ2UgdGhlXG4gIC8vIGNvbnRleHQgdG8gdGhhdCBvZiB0aGUgaWZyYW1lLlxuXG4gIHZhciBsaWJyYXJ5SW5jbHVkZXMgPSAnXFxuPHNjcmlwdD5cXG4gIHdpbmRvdy5sb29wUHJvdGVjdCA9IHBhcmVudC5sb29wUHJvdGVjdDtcXG4gIHdpbmRvdy5fX2VyciA9IG51bGw7XFxuICB3aW5kb3cubG9vcFByb3RlY3QuaGl0ID0gZnVuY3Rpb24obGluZSkge1xcbiAgICB3aW5kb3cuX19lcnIgPSBuZXcgRXJyb3IoXFxuICAgICAgXFwnUG90ZW50aWFsIGluZmluaXRlIGxvb3AgYXQgbGluZSBcXCcgK1xcbiAgICAgIGxpbmUgK1xcbiAgICAgIFxcJy4gVG8gZGlzYWJsZSBsb29wIHByb3RlY3Rpb24sIHdyaXRlOlxcJyArXFxuICAgICAgXFwnIFxcXFxuXFxcXC9cXFxcLyBub3Byb3RlY3RcXFxcbmFzIHRoZSBmaXJzdFxcJyArXFxuICAgICAgXFwnIGxpbmUuIEJld2FyZSB0aGF0IGlmIHlvdSBkbyBoYXZlIGFuIGluZmluaXRlIGxvb3AgaW4geW91ciBjb2RlXFwnICtcXG4gICAgICBcXCcgdGhpcyB3aWxsIGNyYXNoIHlvdXIgYnJvd3Nlci5cXCdcXG4gICAgKTtcXG4gIH07XFxuPC9zY3JpcHQ+XFxuPGxpbmtcXG4gIHJlbD1cXCdzdHlsZXNoZWV0XFwnXFxuICBocmVmPVxcJy8vY2RuanMuY2xvdWRmbGFyZS5jb20vYWpheC9saWJzL2FuaW1hdGUuY3NzLzMuMi4wL2FuaW1hdGUubWluLmNzc1xcJ1xcbiAgLz5cXG48bGlua1xcbiAgcmVsPVxcJ3N0eWxlc2hlZXRcXCdcXG4gIGhyZWY9XFwnLy9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9ib290c3RyYXAvMy4zLjEvY3NzL2Jvb3RzdHJhcC5taW4uY3NzXFwnXFxuICAvPlxcblxcbjxsaW5rXFxuICByZWw9XFwnc3R5bGVzaGVldFxcJ1xcbiAgaHJlZj1cXCcvL21heGNkbi5ib290c3RyYXBjZG4uY29tL2ZvbnQtYXdlc29tZS80LjIuMC9jc3MvZm9udC1hd2Vzb21lLm1pbi5jc3NcXCdcXG4gIC8+XFxuPHN0eWxlPlxcbiAgYm9keSB7IHBhZGRpbmc6IDBweCAzcHggMHB4IDNweDsgfVxcbjwvc3R5bGU+XFxuICAnO1xuICB2YXIgY29kZURpc2FibGVkRXJyb3IgPSAnXFxuICAgIDxzY3JpcHQ+XFxuICAgICAgd2luZG93Ll9fZXJyID0gbmV3IEVycm9yKFxcJ2NvZGUgaGFzIGJlZW4gZGlzYWJsZWRcXCcpO1xcbiAgICA8L3NjcmlwdD5cXG4gICc7XG5cbiAgdmFyIGlGcmFtZVNjcmlwdCQgPSBjb21tb24uZ2V0U2NyaXB0Q29udGVudCQoJy9qcy9pRnJhbWVTY3JpcHRzLmpzJykuc2hhcmVSZXBsYXkoKTtcbiAgdmFyIGpRdWVyeVNjcmlwdCQgPSBjb21tb24uZ2V0U2NyaXB0Q29udGVudCQoJy9ib3dlcl9jb21wb25lbnRzL2pxdWVyeS9kaXN0L2pxdWVyeS5qcycpLnNoYXJlUmVwbGF5KCk7XG5cbiAgLy8gYmVoYXZpb3Igc3ViamVjdCBhbGx3YXlzIHJlbWVtYmVycyB0aGUgbGFzdCB2YWx1ZVxuICAvLyB3ZSB1c2UgdGhpcyB0byBkZXRlcm1pbmUgaWYgcnVuUHJldmlld1Rlc3QkIGlzIGRlZmluZWRcbiAgLy8gYW5kIHByaW1lIGl0IHdpdGggZmFsc2VcbiAgY29tbW9uLnByZXZpZXdSZWFkeSQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0KGZhbHNlKTtcblxuICAvLyBUaGVzZSBzaG91bGQgYmUgc2V0IHVwIGluIHRoZSBwcmV2aWV3IHdpbmRvd1xuICAvLyBpZiB0aGlzIGVycm9yIGlzIHNlZW4gaXQgaXMgYmVjYXVzZSB0aGUgZnVuY3Rpb24gdHJpZWQgdG8gcnVuXG4gIC8vIGJlZm9yZSB0aGUgaWZyYW1lIGhhcyBjb21wbGV0ZWx5IGxvYWRlZFxuICBjb21tb24ucnVuUHJldmlld1Rlc3RzJCA9IGNvbW1vbi5jaGVja1ByZXZpZXckID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBPYnNlcnZhYmxlLnRocm93KG5ldyBFcnJvcignUHJldmlldyBub3QgZnVsbHkgbG9hZGVkJykpO1xuICB9O1xuXG4gIGNvbW1vbi51cGRhdGVQcmV2aWV3JCA9IGZ1bmN0aW9uIHVwZGF0ZVByZXZpZXckKCkge1xuICAgIHZhciBjb2RlID0gYXJndW1lbnRzLmxlbmd0aCA8PSAwIHx8IGFyZ3VtZW50c1swXSA9PT0gdW5kZWZpbmVkID8gJycgOiBhcmd1bWVudHNbMF07XG5cbiAgICB2YXIgcHJldmlldyA9IGNvbW1vbi5nZXRJZnJhbWUoJ3ByZXZpZXcnKTtcblxuICAgIHJldHVybiBPYnNlcnZhYmxlLmNvbWJpbmVMYXRlc3QoaUZyYW1lU2NyaXB0JCwgalF1ZXJ5U2NyaXB0JCwgZnVuY3Rpb24gKGlmcmFtZSwgalF1ZXJ5KSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBpZnJhbWVTY3JpcHQ6ICc8c2NyaXB0PicgKyBpZnJhbWUgKyAnPC9zY3JpcHQ+JyxcbiAgICAgICAgalF1ZXJ5OiAnPHNjcmlwdD4nICsgalF1ZXJ5ICsgJzwvc2NyaXB0PidcbiAgICAgIH07XG4gICAgfSkuZmlyc3QoKS5mbGF0TWFwKGZ1bmN0aW9uIChfcmVmKSB7XG4gICAgICB2YXIgaWZyYW1lU2NyaXB0ID0gX3JlZi5pZnJhbWVTY3JpcHQ7XG4gICAgICB2YXIgalF1ZXJ5ID0gX3JlZi5qUXVlcnk7XG5cbiAgICAgIC8vIHdlIG1ha2Ugc3VyZSB0byBvdmVycmlkZSB0aGUgbGFzdCB2YWx1ZSBpbiB0aGVcbiAgICAgIC8vIHN1YmplY3QgdG8gZmFsc2UgaGVyZS5cbiAgICAgIGNvbW1vbi5wcmV2aWV3UmVhZHkkLm9uTmV4dChmYWxzZSk7XG4gICAgICBwcmV2aWV3Lm9wZW4oKTtcbiAgICAgIHByZXZpZXcud3JpdGUobGlicmFyeUluY2x1ZGVzICsgalF1ZXJ5ICsgKGNvbW1vbi5zaG91bGRSdW4oKSA/IGNvZGUgOiBjb2RlRGlzYWJsZWRFcnJvcikgKyAnPCEtLSAtLT4nICsgaWZyYW1lU2NyaXB0KTtcbiAgICAgIHByZXZpZXcuY2xvc2UoKTtcbiAgICAgIC8vIG5vdyB3ZSBmaWx0ZXIgZmFsc2UgdmFsdWVzIGFuZCB3YWl0IGZvciB0aGUgZmlyc3QgdHJ1ZVxuICAgICAgcmV0dXJuIGNvbW1vbi5wcmV2aWV3UmVhZHkkLmZpbHRlcihmdW5jdGlvbiAocmVhZHkpIHtcbiAgICAgICAgcmV0dXJuIHJlYWR5O1xuICAgICAgfSkuZmlyc3QoKVxuICAgICAgLy8gdGhlIGRlbGF5IGhlcmUgaXMgdG8gZ2l2ZSBjb2RlIHdpdGhpbiB0aGUgaWZyYW1lXG4gICAgICAvLyBjb250cm9sIHRvIHJ1blxuICAgICAgLmRlbGF5KDQwMCk7XG4gICAgfSkubWFwKGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBjb2RlO1xuICAgIH0pO1xuICB9O1xuXG4gIHJldHVybiBjb21tb247XG59KHdpbmRvdyk7IiwiJ3VzZSBzdHJpY3QnO1xuXG53aW5kb3cuY29tbW9uID0gZnVuY3Rpb24gKGdsb2JhbCkge1xuICB2YXIgX2dsb2JhbCRSeCA9IGdsb2JhbC5SeDtcbiAgdmFyIFN1YmplY3QgPSBfZ2xvYmFsJFJ4LlN1YmplY3Q7XG4gIHZhciBPYnNlcnZhYmxlID0gX2dsb2JhbCRSeC5PYnNlcnZhYmxlO1xuICB2YXIgQ29kZU1pcnJvciA9IGdsb2JhbC5Db2RlTWlycm9yO1xuICB2YXIgZW1tZXRDb2RlTWlycm9yID0gZ2xvYmFsLmVtbWV0Q29kZU1pcnJvcjtcbiAgdmFyIF9nbG9iYWwkY29tbW9uID0gZ2xvYmFsLmNvbW1vbjtcbiAgdmFyIGNvbW1vbiA9IF9nbG9iYWwkY29tbW9uID09PSB1bmRlZmluZWQgPyB7IGluaXQ6IFtdIH0gOiBfZ2xvYmFsJGNvbW1vbjtcbiAgdmFyIF9jb21tb24kY2hhbGxlbmdlVHlwZSA9IGNvbW1vbi5jaGFsbGVuZ2VUeXBlO1xuICB2YXIgY2hhbGxlbmdlVHlwZSA9IF9jb21tb24kY2hhbGxlbmdlVHlwZSA9PT0gdW5kZWZpbmVkID8gJzAnIDogX2NvbW1vbiRjaGFsbGVuZ2VUeXBlO1xuICB2YXIgY2hhbGxlbmdlVHlwZXMgPSBjb21tb24uY2hhbGxlbmdlVHlwZXM7XG5cblxuICBpZiAoIUNvZGVNaXJyb3IgfHwgY2hhbGxlbmdlVHlwZSA9PT0gY2hhbGxlbmdlVHlwZXMuQkFTRUpVTVAgfHwgY2hhbGxlbmdlVHlwZSA9PT0gY2hhbGxlbmdlVHlwZXMuWklQTElORSB8fCBjaGFsbGVuZ2VUeXBlID09PSBjaGFsbGVuZ2VUeXBlcy5WSURFTyB8fCBjaGFsbGVuZ2VUeXBlID09PSBjaGFsbGVuZ2VUeXBlcy5TVEVQIHx8IGNoYWxsZW5nZVR5cGUgPT09IGNoYWxsZW5nZVR5cGVzLkhJS0VTKSB7XG4gICAgY29tbW9uLmVkaXRvciA9IHt9O1xuICAgIHJldHVybiBjb21tb247XG4gIH1cblxuICB2YXIgZWRpdG9yID0gQ29kZU1pcnJvci5mcm9tVGV4dEFyZWEoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvZGVFZGl0b3InKSwge1xuICAgIGxpbnQ6IHRydWUsXG4gICAgbGluZU51bWJlcnM6IHRydWUsXG4gICAgbW9kZTogJ2phdmFzY3JpcHQnLFxuICAgIHRoZW1lOiAnbW9ub2thaScsXG4gICAgcnVubmFibGU6IHRydWUsXG4gICAgbWF0Y2hCcmFja2V0czogdHJ1ZSxcbiAgICBhdXRvQ2xvc2VCcmFja2V0czogdHJ1ZSxcbiAgICBzY3JvbGxiYXJTdHlsZTogJ251bGwnLFxuICAgIGxpbmVXcmFwcGluZzogdHJ1ZSxcbiAgICBndXR0ZXJzOiBbJ0NvZGVNaXJyb3ItbGludC1tYXJrZXJzJ11cbiAgfSk7XG5cbiAgZWRpdG9yLnNldFNpemUoJzEwMCUnLCAnYXV0bycpO1xuXG4gIGNvbW1vbi5lZGl0b3JFeGVjdXRlJCA9IG5ldyBTdWJqZWN0KCk7XG4gIGNvbW1vbi5lZGl0b3JLZXlVcCQgPSBPYnNlcnZhYmxlLmZyb21FdmVudFBhdHRlcm4oZnVuY3Rpb24gKGhhbmRsZXIpIHtcbiAgICByZXR1cm4gZWRpdG9yLm9uKCdrZXl1cCcsIGhhbmRsZXIpO1xuICB9LCBmdW5jdGlvbiAoaGFuZGxlcikge1xuICAgIHJldHVybiBlZGl0b3Iub2ZmKCdrZXl1cCcsIGhhbmRsZXIpO1xuICB9KTtcblxuICBlZGl0b3Iuc2V0T3B0aW9uKCdleHRyYUtleXMnLCB7XG4gICAgVGFiOiBmdW5jdGlvbiBUYWIoY20pIHtcbiAgICAgIGlmIChjbS5zb21ldGhpbmdTZWxlY3RlZCgpKSB7XG4gICAgICAgIGNtLmluZGVudFNlbGVjdGlvbignYWRkJyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgc3BhY2VzID0gQXJyYXkoY20uZ2V0T3B0aW9uKCdpbmRlbnRVbml0JykgKyAxKS5qb2luKCcgJyk7XG4gICAgICAgIGNtLnJlcGxhY2VTZWxlY3Rpb24oc3BhY2VzKTtcbiAgICAgIH1cbiAgICB9LFxuICAgICdTaGlmdC1UYWInOiBmdW5jdGlvbiBTaGlmdFRhYihjbSkge1xuICAgICAgaWYgKGNtLnNvbWV0aGluZ1NlbGVjdGVkKCkpIHtcbiAgICAgICAgY20uaW5kZW50U2VsZWN0aW9uKCdzdWJ0cmFjdCcpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIHNwYWNlcyA9IEFycmF5KGNtLmdldE9wdGlvbignaW5kZW50VW5pdCcpICsgMSkuam9pbignICcpO1xuICAgICAgICBjbS5yZXBsYWNlU2VsZWN0aW9uKHNwYWNlcyk7XG4gICAgICB9XG4gICAgfSxcbiAgICAnQ3RybC1FbnRlcic6IGZ1bmN0aW9uIEN0cmxFbnRlcigpIHtcbiAgICAgIGNvbW1vbi5lZGl0b3JFeGVjdXRlJC5vbk5leHQoKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9LFxuICAgICdDbWQtRW50ZXInOiBmdW5jdGlvbiBDbWRFbnRlcigpIHtcbiAgICAgIGNvbW1vbi5lZGl0b3JFeGVjdXRlJC5vbk5leHQoKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH0pO1xuXG4gIHZhciBpbmZvID0gZWRpdG9yLmdldFNjcm9sbEluZm8oKTtcblxuICB2YXIgYWZ0ZXIgPSBlZGl0b3IuY2hhckNvb3Jkcyh7XG4gICAgbGluZTogZWRpdG9yLmdldEN1cnNvcigpLmxpbmUgKyAxLFxuICAgIGNoOiAwXG4gIH0sICdsb2NhbCcpLnRvcDtcblxuICBpZiAoaW5mby50b3AgKyBpbmZvLmNsaWVudEhlaWdodCA8IGFmdGVyKSB7XG4gICAgZWRpdG9yLnNjcm9sbFRvKG51bGwsIGFmdGVyIC0gaW5mby5jbGllbnRIZWlnaHQgKyAzKTtcbiAgfVxuXG4gIGlmIChlbW1ldENvZGVNaXJyb3IpIHtcbiAgICBlbW1ldENvZGVNaXJyb3IoZWRpdG9yLCB7XG4gICAgICAnQ21kLUUnOiAnZW1tZXQuZXhwYW5kX2FiYnJldmlhdGlvbicsXG4gICAgICBUYWI6ICdlbW1ldC5leHBhbmRfYWJicmV2aWF0aW9uX3dpdGhfdGFiJyxcbiAgICAgIEVudGVyOiAnZW1tZXQuaW5zZXJ0X2Zvcm1hdHRlZF9saW5lX2JyZWFrX29ubHknXG4gICAgfSk7XG4gIH1cbiAgY29tbW9uLmluaXQucHVzaChmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGVkaXRvclZhbHVlID0gdm9pZCAwO1xuICAgIGlmIChjb21tb24uY29kZVVyaS5pc0FsaXZlKCkpIHtcbiAgICAgIGVkaXRvclZhbHVlID0gY29tbW9uLmNvZGVVcmkucGFyc2UoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZWRpdG9yVmFsdWUgPSBjb21tb24uY29kZVN0b3JhZ2UuaXNBbGl2ZShjb21tb24uY2hhbGxlbmdlTmFtZSkgPyBjb21tb24uY29kZVN0b3JhZ2UuZ2V0U3RvcmVkVmFsdWUoY29tbW9uLmNoYWxsZW5nZU5hbWUpIDogY29tbW9uLnNlZWQ7XG4gICAgfVxuXG4gICAgZWRpdG9yLnNldFZhbHVlKGNvbW1vbi5yZXBsYWNlU2FmZVRhZ3MoZWRpdG9yVmFsdWUpKTtcbiAgICBlZGl0b3IucmVmcmVzaCgpO1xuICB9KTtcblxuICBjb21tb24uZWRpdG9yID0gZWRpdG9yO1xuXG4gIHJldHVybiBjb21tb247XG59KHdpbmRvdyk7IiwiJ3VzZSBzdHJpY3QnO1xuXG53aW5kb3cuY29tbW9uID0gZnVuY3Rpb24gKGdsb2JhbCkge1xuICB2YXIgT2JzZXJ2YWJsZSA9IGdsb2JhbC5SeC5PYnNlcnZhYmxlO1xuICB2YXIgX2dsb2JhbCRjb21tb24gPSBnbG9iYWwuY29tbW9uO1xuICB2YXIgY29tbW9uID0gX2dsb2JhbCRjb21tb24gPT09IHVuZGVmaW5lZCA/IHsgaW5pdDogW10gfSA6IF9nbG9iYWwkY29tbW9uO1xuXG5cbiAgdmFyIGRldGVjdEZ1bmN0aW9uQ2FsbCA9IC9mdW5jdGlvblxccyo/XFwofGZ1bmN0aW9uXFxzK1xcdytcXHMqP1xcKC9naTtcbiAgdmFyIGRldGVjdFVuc2FmZUpRID0gL1xcJFxccyo/XFwoXFxzKj9cXCRcXHMqP1xcKS9naTtcbiAgdmFyIGRldGVjdFVuc2FmZUNvbnNvbGVDYWxsID0gL2lmXFxzXFwobnVsbFxcKVxcc2NvbnNvbGVcXC5sb2dcXCgxXFwpOy9naTtcblxuICBjb21tb24uZGV0ZWN0VW5zYWZlQ29kZSQgPSBmdW5jdGlvbiBkZXRlY3RVbnNhZmVDb2RlJChjb2RlKSB7XG4gICAgdmFyIG9wZW5pbmdDb21tZW50cyA9IGNvZGUubWF0Y2goL1xcL1xcKi9naSk7XG4gICAgdmFyIGNsb3NpbmdDb21tZW50cyA9IGNvZGUubWF0Y2goL1xcKlxcLy9naSk7XG5cbiAgICAvLyBjaGVja3MgaWYgdGhlIG51bWJlciBvZiBvcGVuaW5nIGNvbW1lbnRzKC8qKSBtYXRjaGVzIHRoZSBudW1iZXIgb2ZcbiAgICAvLyBjbG9zaW5nIGNvbW1lbnRzKCovKVxuICAgIGlmIChvcGVuaW5nQ29tbWVudHMgJiYgKCFjbG9zaW5nQ29tbWVudHMgfHwgb3BlbmluZ0NvbW1lbnRzLmxlbmd0aCA+IGNsb3NpbmdDb21tZW50cy5sZW5ndGgpKSB7XG5cbiAgICAgIHJldHVybiBPYnNlcnZhYmxlLnRocm93KG5ldyBFcnJvcignU3ludGF4RXJyb3I6IFVuZmluaXNoZWQgbXVsdGktbGluZSBjb21tZW50JykpO1xuICAgIH1cblxuICAgIGlmIChjb2RlLm1hdGNoKGRldGVjdFVuc2FmZUpRKSkge1xuICAgICAgcmV0dXJuIE9ic2VydmFibGUudGhyb3cobmV3IEVycm9yKCdVbnNhZmUgJCgkKScpKTtcbiAgICB9XG5cbiAgICBpZiAoY29kZS5tYXRjaCgvZnVuY3Rpb24vZykgJiYgIWNvZGUubWF0Y2goZGV0ZWN0RnVuY3Rpb25DYWxsKSkge1xuICAgICAgcmV0dXJuIE9ic2VydmFibGUudGhyb3cobmV3IEVycm9yKCdTeW50YXhFcnJvcjogVW5zYWZlIG9yIHVuZmluaXNoZWQgZnVuY3Rpb24gZGVjbGFyYXRpb24nKSk7XG4gICAgfVxuXG4gICAgaWYgKGNvZGUubWF0Y2goZGV0ZWN0VW5zYWZlQ29uc29sZUNhbGwpKSB7XG4gICAgICByZXR1cm4gT2JzZXJ2YWJsZS50aHJvdyhuZXcgRXJyb3IoJ0ludmFsaWQgaWYgKG51bGwpIGNvbnNvbGUubG9nKDEpOyBkZXRlY3RlZCcpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gT2JzZXJ2YWJsZS5qdXN0KGNvZGUpO1xuICB9O1xuXG4gIHJldHVybiBjb21tb247XG59KHdpbmRvdyk7IiwiJ3VzZSBzdHJpY3QnO1xuXG53aW5kb3cuY29tbW9uID0gZnVuY3Rpb24gKF9yZWYpIHtcbiAgdmFyICQgPSBfcmVmLiQ7XG4gIHZhciBfcmVmJGNvbW1vbiA9IF9yZWYuY29tbW9uO1xuICB2YXIgY29tbW9uID0gX3JlZiRjb21tb24gPT09IHVuZGVmaW5lZCA/IHsgaW5pdDogW10gfSA6IF9yZWYkY29tbW9uO1xuXG5cbiAgY29tbW9uLmRpc3BsYXlUZXN0UmVzdWx0cyA9IGZ1bmN0aW9uIGRpc3BsYXlUZXN0UmVzdWx0cygpIHtcbiAgICB2YXIgZGF0YSA9IGFyZ3VtZW50cy5sZW5ndGggPD0gMCB8fCBhcmd1bWVudHNbMF0gPT09IHVuZGVmaW5lZCA/IFtdIDogYXJndW1lbnRzWzBdO1xuXG4gICAgJCgnI3Rlc3RTdWl0ZScpLmNoaWxkcmVuKCkucmVtb3ZlKCk7XG4gICAgZGF0YS5mb3JFYWNoKGZ1bmN0aW9uIChfcmVmMikge1xuICAgICAgdmFyIF9yZWYyJGVyciA9IF9yZWYyLmVycjtcbiAgICAgIHZhciBlcnIgPSBfcmVmMiRlcnIgPT09IHVuZGVmaW5lZCA/IGZhbHNlIDogX3JlZjIkZXJyO1xuICAgICAgdmFyIF9yZWYyJHRleHQgPSBfcmVmMi50ZXh0O1xuICAgICAgdmFyIHRleHQgPSBfcmVmMiR0ZXh0ID09PSB1bmRlZmluZWQgPyAnJyA6IF9yZWYyJHRleHQ7XG5cbiAgICAgIHZhciBpY29uQ2xhc3MgPSBlcnIgPyAnXCJpb24tY2xvc2UtY2lyY2xlZCBiaWctZXJyb3ItaWNvblwiJyA6ICdcImlvbi1jaGVja21hcmstY2lyY2xlZCBiaWctc3VjY2Vzcy1pY29uXCInO1xuXG4gICAgICAkKCc8ZGl2PjwvZGl2PicpLmh0bWwoJ1xcbiAgICAgICAgPGRpdiBjbGFzcz1cXCdyb3dcXCc+XFxuICAgICAgICAgIDxkaXYgY2xhc3M9XFwnY29sLXhzLTIgdGV4dC1jZW50ZXJcXCc+XFxuICAgICAgICAgICAgPGkgY2xhc3M9JyArIGljb25DbGFzcyArICc+PC9pPlxcbiAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgPGRpdiBjbGFzcz1cXCdjb2wteHMtMTAgdGVzdC1vdXRwdXRcXCc+XFxuICAgICAgICAgICAgJyArIHRleHQuc3BsaXQoJ21lc3NhZ2U6ICcpLnBvcCgpLnJlcGxhY2UoL1xcJ1xcKTsvZywgJycpICsgJ1xcbiAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgPGRpdiBjbGFzcz1cXCd0ZW4tcGl4ZWwtYnJlYWtcXCcvPlxcbiAgICAgICAgPC9kaXY+XFxuICAgICAgJykuYXBwZW5kVG8oJCgnI3Rlc3RTdWl0ZScpKTtcbiAgICB9KTtcblxuICAgIHJldHVybiBkYXRhO1xuICB9O1xuXG4gIHJldHVybiBjb21tb247XG59KHdpbmRvdyk7IiwiJ3VzZSBzdHJpY3QnO1xuXG53aW5kb3cuY29tbW9uID0gZnVuY3Rpb24gKGdsb2JhbCkge1xuICB2YXIgZ2EgPSBnbG9iYWwuZ2E7XG4gIHZhciBfZ2xvYmFsJGNvbW1vbiA9IGdsb2JhbC5jb21tb247XG4gIHZhciBjb21tb24gPSBfZ2xvYmFsJGNvbW1vbiA9PT0gdW5kZWZpbmVkID8geyBpbml0OiBbXSB9IDogX2dsb2JhbCRjb21tb247XG4gIHZhciBhZGRMb29wUHJvdGVjdCA9IGNvbW1vbi5hZGRMb29wUHJvdGVjdDtcbiAgdmFyIGdldEpzRnJvbUh0bWwgPSBjb21tb24uZ2V0SnNGcm9tSHRtbDtcbiAgdmFyIGRldGVjdFVuc2FmZUNvZGUkID0gY29tbW9uLmRldGVjdFVuc2FmZUNvZGUkO1xuICB2YXIgdXBkYXRlUHJldmlldyQgPSBjb21tb24udXBkYXRlUHJldmlldyQ7XG4gIHZhciBjaGFsbGVuZ2VUeXBlID0gY29tbW9uLmNoYWxsZW5nZVR5cGU7XG4gIHZhciBjaGFsbGVuZ2VUeXBlcyA9IGNvbW1vbi5jaGFsbGVuZ2VUeXBlcztcblxuXG4gIGNvbW1vbi5leGVjdXRlQ2hhbGxlbmdlJCA9IGZ1bmN0aW9uIGV4ZWN1dGVDaGFsbGVuZ2UkKCkge1xuICAgIHZhciBjb2RlID0gY29tbW9uLmVkaXRvci5nZXRWYWx1ZSgpO1xuICAgIHZhciBvcmlnaW5hbENvZGUgPSBjb2RlO1xuICAgIHZhciBoZWFkID0gY29tbW9uLmFycmF5VG9OZXdMaW5lU3RyaW5nKGNvbW1vbi5oZWFkKTtcbiAgICB2YXIgdGFpbCA9IGNvbW1vbi5hcnJheVRvTmV3TGluZVN0cmluZyhjb21tb24udGFpbCk7XG4gICAgdmFyIGNvbWJpbmVkQ29kZSA9IGhlYWQgKyBjb2RlICsgdGFpbDtcblxuICAgIGdhKCdzZW5kJywgJ2V2ZW50JywgJ0NoYWxsZW5nZScsICdyYW4tY29kZScsIGNvbW1vbi5nYU5hbWUpO1xuXG4gICAgLy8gcnVuIGNoZWNrcyBmb3IgdW5zYWZlIGNvZGVcbiAgICByZXR1cm4gZGV0ZWN0VW5zYWZlQ29kZSQoY29kZSlcbiAgICAvLyBhZGQgaGVhZCBhbmQgdGFpbCBhbmQgZGV0ZWN0IGxvb3BzXG4gICAgLm1hcChmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoY2hhbGxlbmdlVHlwZSAhPT0gY2hhbGxlbmdlVHlwZXMuSFRNTCkge1xuICAgICAgICByZXR1cm4gJzxzY3JpcHQ+OycgKyBhZGRMb29wUHJvdGVjdChjb21iaW5lZENvZGUpICsgJy8qKi88L3NjcmlwdD4nO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gYWRkTG9vcFByb3RlY3QoY29tYmluZWRDb2RlKTtcbiAgICB9KS5mbGF0TWFwKGZ1bmN0aW9uIChjb2RlKSB7XG4gICAgICByZXR1cm4gdXBkYXRlUHJldmlldyQoY29kZSk7XG4gICAgfSkuZmxhdE1hcChmdW5jdGlvbiAoY29kZSkge1xuICAgICAgdmFyIG91dHB1dCA9IHZvaWQgMDtcblxuICAgICAgaWYgKGNoYWxsZW5nZVR5cGUgPT09IGNoYWxsZW5nZVR5cGVzLkhUTUwgJiYgY29tbW9uLmhhc0pzKGNvZGUpKSB7XG4gICAgICAgIG91dHB1dCA9IGNvbW1vbi5nZXRKc091dHB1dChnZXRKc0Zyb21IdG1sKGNvZGUpKTtcbiAgICAgIH0gZWxzZSBpZiAoY2hhbGxlbmdlVHlwZSAhPT0gY2hhbGxlbmdlVHlwZXMuSFRNTCkge1xuICAgICAgICBvdXRwdXQgPSBjb21tb24uZ2V0SnNPdXRwdXQoYWRkTG9vcFByb3RlY3QoY29tYmluZWRDb2RlKSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBjb21tb24ucnVuUHJldmlld1Rlc3RzJCh7XG4gICAgICAgIHRlc3RzOiBjb21tb24udGVzdHMuc2xpY2UoKSxcbiAgICAgICAgb3JpZ2luYWxDb2RlOiBvcmlnaW5hbENvZGUsXG4gICAgICAgIG91dHB1dDogb3V0cHV0XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfTtcblxuICByZXR1cm4gY29tbW9uO1xufSh3aW5kb3cpOyIsIid1c2Ugc3RyaWN0Jztcblxud2luZG93LmNvbW1vbiA9IGZ1bmN0aW9uIChnbG9iYWwpIHtcbiAgdmFyIENvZGVNaXJyb3IgPSBnbG9iYWwuQ29kZU1pcnJvcjtcbiAgdmFyIGRvYyA9IGdsb2JhbC5kb2N1bWVudDtcbiAgdmFyIF9nbG9iYWwkY29tbW9uID0gZ2xvYmFsLmNvbW1vbjtcbiAgdmFyIGNvbW1vbiA9IF9nbG9iYWwkY29tbW9uID09PSB1bmRlZmluZWQgPyB7IGluaXQ6IFtdIH0gOiBfZ2xvYmFsJGNvbW1vbjtcbiAgdmFyIGNoYWxsZW5nZVR5cGVzID0gY29tbW9uLmNoYWxsZW5nZVR5cGVzO1xuICB2YXIgX2NvbW1vbiRjaGFsbGVuZ2VUeXBlID0gY29tbW9uLmNoYWxsZW5nZVR5cGU7XG4gIHZhciBjaGFsbGVuZ2VUeXBlID0gX2NvbW1vbiRjaGFsbGVuZ2VUeXBlID09PSB1bmRlZmluZWQgPyAnMCcgOiBfY29tbW9uJGNoYWxsZW5nZVR5cGU7XG5cblxuICBpZiAoIUNvZGVNaXJyb3IgfHwgY2hhbGxlbmdlVHlwZSAhPT0gY2hhbGxlbmdlVHlwZXMuSlMgJiYgY2hhbGxlbmdlVHlwZSAhPT0gY2hhbGxlbmdlVHlwZXMuQk9ORklSRSkge1xuICAgIGNvbW1vbi51cGRhdGVPdXRwdXREaXNwbGF5ID0gZnVuY3Rpb24gKCkge307XG4gICAgY29tbW9uLmFwcGVuZFRvT3V0cHV0RGlzcGxheSA9IGZ1bmN0aW9uICgpIHt9O1xuICAgIHJldHVybiBjb21tb247XG4gIH1cblxuICB2YXIgY29kZU91dHB1dCA9IENvZGVNaXJyb3IuZnJvbVRleHRBcmVhKGRvYy5nZXRFbGVtZW50QnlJZCgnY29kZU91dHB1dCcpLCB7XG4gICAgbGluZU51bWJlcnM6IGZhbHNlLFxuICAgIG1vZGU6ICd0ZXh0JyxcbiAgICB0aGVtZTogJ21vbm9rYWknLFxuICAgIHJlYWRPbmx5OiAnbm9jdXJzb3InLFxuICAgIGxpbmVXcmFwcGluZzogdHJ1ZVxuICB9KTtcblxuICBjb2RlT3V0cHV0LnNldFZhbHVlKCcvKipcXG4gICogWW91ciBvdXRwdXQgd2lsbCBnbyBoZXJlLlxcbiAgKiBBbnkgY29uc29sZS5sb2coKSAtdHlwZVxcbiAgKiBzdGF0ZW1lbnRzIHdpbGwgYXBwZWFyIGluXFxuICAqIHlvdXIgYnJvd3NlclxcJ3MgRGV2VG9vbHNcXG4gICogSmF2YVNjcmlwdCBjb25zb2xlLlxcbiAgKi8nKTtcblxuICBjb2RlT3V0cHV0LnNldFNpemUoJzEwMCUnLCAnMTAwJScpO1xuXG4gIGNvbW1vbi51cGRhdGVPdXRwdXREaXNwbGF5ID0gZnVuY3Rpb24gdXBkYXRlT3V0cHV0RGlzcGxheSgpIHtcbiAgICB2YXIgc3RyID0gYXJndW1lbnRzLmxlbmd0aCA8PSAwIHx8IGFyZ3VtZW50c1swXSA9PT0gdW5kZWZpbmVkID8gJycgOiBhcmd1bWVudHNbMF07XG5cbiAgICBpZiAodHlwZW9mIHN0ciAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHN0ciA9IEpTT04uc3RyaW5naWZ5KHN0cik7XG4gICAgfVxuICAgIGNvZGVPdXRwdXQuc2V0VmFsdWUoc3RyKTtcbiAgICByZXR1cm4gc3RyO1xuICB9O1xuXG4gIGNvbW1vbi5hcHBlbmRUb091dHB1dERpc3BsYXkgPSBmdW5jdGlvbiBhcHBlbmRUb091dHB1dERpc3BsYXkoKSB7XG4gICAgdmFyIHN0ciA9IGFyZ3VtZW50cy5sZW5ndGggPD0gMCB8fCBhcmd1bWVudHNbMF0gPT09IHVuZGVmaW5lZCA/ICcnIDogYXJndW1lbnRzWzBdO1xuXG4gICAgY29kZU91dHB1dC5zZXRWYWx1ZShjb2RlT3V0cHV0LmdldFZhbHVlKCkgKyBzdHIpO1xuICAgIHJldHVybiBzdHI7XG4gIH07XG5cbiAgcmV0dXJuIGNvbW1vbjtcbn0od2luZG93KTsiLCIndXNlIHN0cmljdCc7XG5cbndpbmRvdy5jb21tb24gPSBmdW5jdGlvbiAoX3JlZikge1xuICB2YXIgX3JlZiRjb21tb24gPSBfcmVmLmNvbW1vbjtcbiAgdmFyIGNvbW1vbiA9IF9yZWYkY29tbW9uID09PSB1bmRlZmluZWQgPyB7IGluaXQ6IFtdIH0gOiBfcmVmJGNvbW1vbjtcblxuXG4gIGNvbW1vbi5sb2NrVG9wID0gZnVuY3Rpb24gbG9ja1RvcCgpIHtcbiAgICB2YXIgbWFnaVZhbDtcblxuICAgIGlmICgkKHdpbmRvdykud2lkdGgoKSA+PSA5OTApIHtcbiAgICAgIGlmICgkKCcuZWRpdG9yU2Nyb2xsRGl2JykuaHRtbCgpKSB7XG5cbiAgICAgICAgbWFnaVZhbCA9ICQod2luZG93KS5oZWlnaHQoKSAtICQoJy5uYXZiYXInKS5oZWlnaHQoKTtcblxuICAgICAgICBpZiAobWFnaVZhbCA8IDApIHtcbiAgICAgICAgICBtYWdpVmFsID0gMDtcbiAgICAgICAgfVxuICAgICAgICAkKCcuZWRpdG9yU2Nyb2xsRGl2JykuY3NzKCdoZWlnaHQnLCBtYWdpVmFsIC0gNTAgKyAncHgnKTtcbiAgICAgIH1cblxuICAgICAgbWFnaVZhbCA9ICQod2luZG93KS5oZWlnaHQoKSAtICQoJy5uYXZiYXInKS5oZWlnaHQoKTtcblxuICAgICAgaWYgKG1hZ2lWYWwgPCAwKSB7XG4gICAgICAgIG1hZ2lWYWwgPSAwO1xuICAgICAgfVxuXG4gICAgICAkKCcuc2Nyb2xsLWxvY2tlcicpLmNzcygnbWluLWhlaWdodCcsICQoJy5lZGl0b3JTY3JvbGxEaXYnKS5oZWlnaHQoKSkuY3NzKCdoZWlnaHQnLCBtYWdpVmFsIC0gNTApO1xuICAgIH0gZWxzZSB7XG4gICAgICAkKCcuZWRpdG9yU2Nyb2xsRGl2JykuY3NzKCdtYXgtaGVpZ2h0JywgNTAwICsgJ3B4Jyk7XG5cbiAgICAgICQoJy5zY3JvbGwtbG9ja2VyJykuY3NzKCdwb3NpdGlvbicsICdpbmhlcml0JykuY3NzKCd0b3AnLCAnaW5oZXJpdCcpLmNzcygnd2lkdGgnLCAnMTAwJScpLmNzcygnbWF4LWhlaWdodCcsICcxMDAlJyk7XG4gICAgfVxuICB9O1xuXG4gIGNvbW1vbi5pbml0LnB1c2goZnVuY3Rpb24gKCQpIHtcbiAgICAvLyBmYWtlaXBob25lIHBvc2l0aW9uaW5nIGhvdGZpeFxuICAgIGlmICgkKCcuaXBob25lLXBvc2l0aW9uJykuaHRtbCgpIHx8ICQoJy5pcGhvbmUnKS5odG1sKCkpIHtcbiAgICAgIHZhciBzdGFydElwaG9uZVBvc2l0aW9uID0gcGFyc2VJbnQoJCgnLmlwaG9uZS1wb3NpdGlvbicpLmNzcygndG9wJykucmVwbGFjZSgncHgnLCAnJyksIDEwKTtcblxuICAgICAgdmFyIHN0YXJ0SXBob25lID0gcGFyc2VJbnQoJCgnLmlwaG9uZScpLmNzcygndG9wJykucmVwbGFjZSgncHgnLCAnJyksIDEwKTtcblxuICAgICAgJCh3aW5kb3cpLm9uKCdzY3JvbGwnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBjb3Vyc2VIZWlnaHQgPSAkKCcuY291cnNld2FyZS1oZWlnaHQnKS5oZWlnaHQoKTtcbiAgICAgICAgdmFyIGNvdXJzZVRvcCA9ICQoJy5jb3Vyc2V3YXJlLWhlaWdodCcpLm9mZnNldCgpLnRvcDtcbiAgICAgICAgdmFyIHdpbmRvd1Njcm9sbFRvcCA9ICQod2luZG93KS5zY3JvbGxUb3AoKTtcbiAgICAgICAgdmFyIHBob25lSGVpZ2h0ID0gJCgnLmlwaG9uZS1wb3NpdGlvbicpLmhlaWdodCgpO1xuXG4gICAgICAgIGlmIChjb3Vyc2VIZWlnaHQgKyBjb3Vyc2VUb3AgLSB3aW5kb3dTY3JvbGxUb3AgLSBwaG9uZUhlaWdodCA8PSAwKSB7XG4gICAgICAgICAgJCgnLmlwaG9uZS1wb3NpdGlvbicpLmNzcygndG9wJywgc3RhcnRJcGhvbmVQb3NpdGlvbiArIGNvdXJzZUhlaWdodCArIGNvdXJzZVRvcCAtIHdpbmRvd1Njcm9sbFRvcCAtIHBob25lSGVpZ2h0KTtcblxuICAgICAgICAgICQoJy5pcGhvbmUnKS5jc3MoJ3RvcCcsIHN0YXJ0SXBob25lUG9zaXRpb24gKyBjb3Vyc2VIZWlnaHQgKyBjb3Vyc2VUb3AgLSB3aW5kb3dTY3JvbGxUb3AgLSBwaG9uZUhlaWdodCArIDEyMCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgJCgnLmlwaG9uZS1wb3NpdGlvbicpLmNzcygndG9wJywgc3RhcnRJcGhvbmVQb3NpdGlvbik7XG4gICAgICAgICAgJCgnLmlwaG9uZScpLmNzcygndG9wJywgc3RhcnRJcGhvbmUpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAoJCgnLnNjcm9sbC1sb2NrZXInKS5odG1sKCkpIHtcblxuICAgICAgaWYgKCQoJy5zY3JvbGwtbG9ja2VyJykuaHRtbCgpKSB7XG4gICAgICAgIGNvbW1vbi5sb2NrVG9wKCk7XG4gICAgICAgICQod2luZG93KS5vbigncmVzaXplJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGNvbW1vbi5sb2NrVG9wKCk7XG4gICAgICAgIH0pO1xuICAgICAgICAkKHdpbmRvdykub24oJ3Njcm9sbCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBjb21tb24ubG9ja1RvcCgpO1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgdmFyIGV4ZWNJblByb2dyZXNzID0gZmFsc2U7XG5cbiAgICAgIC8vIHdoeSBpcyB0aGlzIG5vdCAkPz8/XG4gICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2Nyb2xsLWxvY2tlcicpLmFkZEV2ZW50TGlzdGVuZXIoJ3ByZXZpZXdVcGRhdGVTcHknLCBmdW5jdGlvbiAoZSkge1xuICAgICAgICBpZiAoZXhlY0luUHJvZ3Jlc3MpIHtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBleGVjSW5Qcm9ncmVzcyA9IHRydWU7XG4gICAgICAgIHJldHVybiBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBpZiAoJCgkKCcuc2Nyb2xsLWxvY2tlcicpLmNoaWxkcmVuKClbMF0pLmhlaWdodCgpIC0gODAwID4gZS5kZXRhaWwpIHtcbiAgICAgICAgICAgICQoJy5zY3JvbGwtbG9ja2VyJykuc2Nyb2xsVG9wKGUuZGV0YWlsKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdmFyIHNjcm9sbFRvcCA9ICQoJCgnLnNjcm9sbC1sb2NrZXInKS5jaGlsZHJlbigpWzBdKS5oZWlnaHQoKTtcblxuICAgICAgICAgICAgJCgnLnNjcm9sbC1sb2NrZXInKS5hbmltYXRlKHsgc2Nyb2xsVG9wOiBzY3JvbGxUb3AgfSwgMTc1KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZXhlY0luUHJvZ3Jlc3MgPSBmYWxzZTtcbiAgICAgICAgfSwgNzUwKTtcbiAgICAgIH0sIGZhbHNlKTtcbiAgICB9XG4gIH0pO1xuXG4gIHJldHVybiBjb21tb247XG59KHdpbmRvdyk7IiwiJ3VzZSBzdHJpY3QnO1xuXG53aW5kb3cuY29tbW9uID0gZnVuY3Rpb24gKF9yZWYpIHtcbiAgdmFyIF9yZWYkY29tbW9uID0gX3JlZi5jb21tb247XG4gIHZhciBjb21tb24gPSBfcmVmJGNvbW1vbiA9PT0gdW5kZWZpbmVkID8geyBpbml0OiBbXSB9IDogX3JlZiRjb21tb247XG5cbiAgY29tbW9uLmluaXQucHVzaChmdW5jdGlvbiAoJCkge1xuICAgICQoJyNyZXBvcnQtaXNzdWUnKS5vbignY2xpY2snLCBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgdGV4dE1lc3NhZ2UgPSBbJ0NoYWxsZW5nZSBbJywgY29tbW9uLmNoYWxsZW5nZU5hbWUgfHwgd2luZG93LmxvY2F0aW9uLnBhdGhuYW1lLCAnXSgnLCB3aW5kb3cubG9jYXRpb24uaHJlZiwgJykgaGFzIGFuIGlzc3VlLlxcbicsICdVc2VyIEFnZW50IGlzOiA8Y29kZT4nLCBuYXZpZ2F0b3IudXNlckFnZW50LCAnPC9jb2RlPi5cXG4nLCAnUGxlYXNlIGRlc2NyaWJlIGhvdyB0byByZXByb2R1Y2UgdGhpcyBpc3N1ZSwgYW5kIGluY2x1ZGUgJywgJ2xpbmtzIHRvIHNjcmVlbnNob3RzIGlmIHBvc3NpYmxlLlxcblxcbiddLmpvaW4oJycpO1xuXG4gICAgICBpZiAoY29tbW9uLmVkaXRvciAmJiB0eXBlb2YgY29tbW9uLmVkaXRvci5nZXRWYWx1ZSA9PT0gJ2Z1bmN0aW9uJyAmJiBjb21tb24uZWRpdG9yLmdldFZhbHVlKCkudHJpbSgpKSB7XG4gICAgICAgIHZhciB0eXBlO1xuICAgICAgICBzd2l0Y2ggKGNvbW1vbi5jaGFsbGVuZ2VUeXBlKSB7XG4gICAgICAgICAgY2FzZSBjb21tb24uY2hhbGxlbmdlVHlwZXMuSFRNTDpcbiAgICAgICAgICAgIHR5cGUgPSAnaHRtbCc7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIGNvbW1vbi5jaGFsbGVuZ2VUeXBlcy5KUzpcbiAgICAgICAgICBjYXNlIGNvbW1vbi5jaGFsbGVuZ2VUeXBlcy5CT05GSVJFOlxuICAgICAgICAgICAgdHlwZSA9ICdqYXZhc2NyaXB0JztcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICB0eXBlID0gJyc7XG4gICAgICAgIH1cblxuICAgICAgICB0ZXh0TWVzc2FnZSArPSBbJ015IGNvZGU6XFxuYGBgJywgdHlwZSwgJ1xcbicsIGNvbW1vbi5lZGl0b3IuZ2V0VmFsdWUoKSwgJ1xcbmBgYFxcblxcbiddLmpvaW4oJycpO1xuICAgICAgfVxuXG4gICAgICB0ZXh0TWVzc2FnZSA9IGVuY29kZVVSSUNvbXBvbmVudCh0ZXh0TWVzc2FnZSk7XG5cbiAgICAgICQoJyNpc3N1ZS1tb2RhbCcpLm1vZGFsKCdoaWRlJyk7XG4gICAgICB3aW5kb3cub3BlbignaHR0cHM6Ly9naXRodWIuY29tL2ZyZWVjb2RlY2FtcGNoaW5hL2ZyZWVjb2RlY2FtcC5jbi9pc3N1ZXMvbmV3PyZib2R5PScgKyB0ZXh0TWVzc2FnZSwgJ19ibGFuaycpO1xuICAgIH0pO1xuICB9KTtcblxuICByZXR1cm4gY29tbW9uO1xufSh3aW5kb3cpOyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2V4dGVuZHMgPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uICh0YXJnZXQpIHsgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXTsgZm9yICh2YXIga2V5IGluIHNvdXJjZSkgeyBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNvdXJjZSwga2V5KSkgeyB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldOyB9IH0gfSByZXR1cm4gdGFyZ2V0OyB9O1xuXG5mdW5jdGlvbiBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMob2JqLCBrZXlzKSB7IHZhciB0YXJnZXQgPSB7fTsgZm9yICh2YXIgaSBpbiBvYmopIHsgaWYgKGtleXMuaW5kZXhPZihpKSA+PSAwKSBjb250aW51ZTsgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBpKSkgY29udGludWU7IHRhcmdldFtpXSA9IG9ialtpXTsgfSByZXR1cm4gdGFyZ2V0OyB9XG5cbndpbmRvdy5jb21tb24gPSBmdW5jdGlvbiAoZ2xvYmFsKSB7XG4gIHZhciBPYnNlcnZhYmxlID0gZ2xvYmFsLlJ4Lk9ic2VydmFibGU7XG4gIHZhciBjaGFpID0gZ2xvYmFsLmNoYWk7XG4gIHZhciBfZ2xvYmFsJGNvbW1vbiA9IGdsb2JhbC5jb21tb247XG4gIHZhciBjb21tb24gPSBfZ2xvYmFsJGNvbW1vbiA9PT0gdW5kZWZpbmVkID8geyBpbml0OiBbXSB9IDogX2dsb2JhbCRjb21tb247XG5cblxuICBjb21tb24ucnVuVGVzdHMkID0gZnVuY3Rpb24gcnVuVGVzdHMkKF9yZWYpIHtcbiAgICB2YXIgY29kZSA9IF9yZWYuY29kZTtcbiAgICB2YXIgb3JpZ2luYWxDb2RlID0gX3JlZi5vcmlnaW5hbENvZGU7XG4gICAgdmFyIHVzZXJUZXN0cyA9IF9yZWYudXNlclRlc3RzO1xuXG4gICAgdmFyIHJlc3QgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMoX3JlZiwgW1wiY29kZVwiLCBcIm9yaWdpbmFsQ29kZVwiLCBcInVzZXJUZXN0c1wiXSk7XG5cbiAgICByZXR1cm4gT2JzZXJ2YWJsZS5mcm9tKHVzZXJUZXN0cykubWFwKGZ1bmN0aW9uICh0ZXN0KSB7XG5cbiAgICAgIC8qIGVzbGludC1kaXNhYmxlIG5vLXVudXNlZC12YXJzICovXG4gICAgICB2YXIgYXNzZXJ0ID0gY2hhaS5hc3NlcnQ7XG4gICAgICB2YXIgZWRpdG9yID0ge1xuICAgICAgICBnZXRWYWx1ZTogZnVuY3Rpb24gZ2V0VmFsdWUoKSB7XG4gICAgICAgICAgcmV0dXJuIG9yaWdpbmFsQ29kZTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIC8qIGVzbGludC1lbmFibGUgbm8tdW51c2VkLXZhcnMgKi9cblxuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKHRlc3QpIHtcbiAgICAgICAgICAvKiBlc2xpbnQtZGlzYWJsZSBuby1ldmFsICAqL1xuICAgICAgICAgIGV2YWwoY29tbW9uLnJlYXNzZW1ibGVUZXN0KGNvZGUsIHRlc3QpKTtcbiAgICAgICAgICAvKiBlc2xpbnQtZW5hYmxlIG5vLWV2YWwgKi9cbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICB0ZXN0LmVyciA9IGUubWVzc2FnZTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRlc3Q7XG4gICAgfSkudG9BcnJheSgpLm1hcChmdW5jdGlvbiAodGVzdHMpIHtcbiAgICAgIHJldHVybiBfZXh0ZW5kcyh7fSwgcmVzdCwgeyB0ZXN0czogdGVzdHMgfSk7XG4gICAgfSk7XG4gIH07XG5cbiAgcmV0dXJuIGNvbW1vbjtcbn0od2luZG93KTsiLCIndXNlIHN0cmljdCc7XG5cbndpbmRvdy5jb21tb24gPSBmdW5jdGlvbiAoZ2xvYmFsKSB7XG4gIHZhciAkID0gZ2xvYmFsLiQ7XG4gIHZhciBtb21lbnQgPSBnbG9iYWwubW9tZW50O1xuICB2YXIgX2dsb2JhbCRnYSA9IGdsb2JhbC5nYTtcbiAgdmFyIGdhID0gX2dsb2JhbCRnYSA9PT0gdW5kZWZpbmVkID8gZnVuY3Rpb24gKCkge30gOiBfZ2xvYmFsJGdhO1xuICB2YXIgX2dsb2JhbCRjb21tb24gPSBnbG9iYWwuY29tbW9uO1xuICB2YXIgY29tbW9uID0gX2dsb2JhbCRjb21tb24gPT09IHVuZGVmaW5lZCA/IHsgaW5pdDogW10gfSA6IF9nbG9iYWwkY29tbW9uO1xuXG5cbiAgZnVuY3Rpb24gc3VibWl0Q2hhbGxlbmdlSGFuZGxlcihlKSB7XG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgdmFyIHNvbHV0aW9uID0gY29tbW9uLmVkaXRvci5nZXRWYWx1ZSgpO1xuXG4gICAgJCgnI3N1Ym1pdC1jaGFsbGVuZ2UnKS5hdHRyKCdkaXNhYmxlZCcsICd0cnVlJykucmVtb3ZlQ2xhc3MoJ2J0bi1wcmltYXJ5JykuYWRkQ2xhc3MoJ2J0bi13YXJuaW5nIGRpc2FibGVkJyk7XG5cbiAgICB2YXIgJGNoZWNrbWFya0NvbnRhaW5lciA9ICQoJyNjaGVja21hcmstY29udGFpbmVyJyk7XG4gICAgJGNoZWNrbWFya0NvbnRhaW5lci5jc3MoeyBoZWlnaHQ6ICRjaGVja21hcmtDb250YWluZXIuaW5uZXJIZWlnaHQoKSB9KTtcblxuICAgICQoJyNjaGFsbGVuZ2UtY2hlY2ttYXJrJykuYWRkQ2xhc3MoJ3pvb21PdXRVcCcpXG4gICAgLy8gLnJlbW92ZUNsYXNzKCd6b29tSW5Eb3duJylcbiAgICAuZGVsYXkoMTAwMCkucXVldWUoZnVuY3Rpb24gKG5leHQpIHtcbiAgICAgICQodGhpcykucmVwbGFjZVdpdGgoJzxkaXYgaWQ9XCJjaGFsbGVuZ2Utc3Bpbm5lclwiICcgKyAnY2xhc3M9XCJhbmltYXRlZCB6b29tSW5VcCBpbm5lci1jaXJjbGVzLWxvYWRlclwiPicgKyAnc3VibWl0dGluZy4uLjwvZGl2PicpO1xuICAgICAgbmV4dCgpO1xuICAgIH0pO1xuXG4gICAgdmFyIHRpbWV6b25lID0gJ1VUQyc7XG4gICAgdHJ5IHtcbiAgICAgIHRpbWV6b25lID0gbW9tZW50LnR6Lmd1ZXNzKCk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBlcnIubWVzc2FnZSA9ICdcXG4gICAgICAgICAga25vd24gYnVnLCBzZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9tb21lbnQvbW9tZW50LXRpbWV6b25lL2lzc3Vlcy8yOTQ6XFxuICAgICAgICAgICcgKyBlcnIubWVzc2FnZSArICdcXG4gICAgICAgICc7XG4gICAgICBjb25zb2xlLmVycm9yKGVycik7XG4gICAgfVxuICAgIHZhciBkYXRhID0gSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgaWQ6IGNvbW1vbi5jaGFsbGVuZ2VJZCxcbiAgICAgIG5hbWU6IGNvbW1vbi5jaGFsbGVuZ2VOYW1lLFxuICAgICAgY2hhbGxlbmdlVHlwZTogK2NvbW1vbi5jaGFsbGVuZ2VUeXBlLFxuICAgICAgc29sdXRpb246IHNvbHV0aW9uLFxuICAgICAgdGltZXpvbmU6IHRpbWV6b25lXG4gICAgfSk7XG5cbiAgICAkLmFqYXgoe1xuICAgICAgdXJsOiAnL2NvbXBsZXRlZC1jaGFsbGVuZ2UvJyxcbiAgICAgIHR5cGU6ICdQT1NUJyxcbiAgICAgIGRhdGE6IGRhdGEsXG4gICAgICBjb250ZW50VHlwZTogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgZGF0YVR5cGU6ICdqc29uJ1xuICAgIH0pLnN1Y2Nlc3MoZnVuY3Rpb24gKHJlcykge1xuICAgICAgaWYgKHJlcykge1xuICAgICAgICB3aW5kb3cubG9jYXRpb24gPSAnL2NoYWxsZW5nZXMvbmV4dC1jaGFsbGVuZ2U/aWQ9JyArIGNvbW1vbi5jaGFsbGVuZ2VJZDtcbiAgICAgIH1cbiAgICB9KS5mYWlsKGZ1bmN0aW9uICgpIHtcbiAgICAgIHdpbmRvdy5sb2NhdGlvbi5yZXBsYWNlKHdpbmRvdy5sb2NhdGlvbi5ocmVmKTtcbiAgICB9KTtcbiAgfVxuXG4gIGNvbW1vbi5zaG93Q29tcGxldGlvbiA9IGZ1bmN0aW9uIHNob3dDb21wbGV0aW9uKCkge1xuXG4gICAgZ2EoJ3NlbmQnLCAnZXZlbnQnLCAnQ2hhbGxlbmdlJywgJ3NvbHZlZCcsIGNvbW1vbi5nYU5hbWUsIHRydWUpO1xuXG4gICAgJCgnI2NvbXBsZXRlLWNvdXJzZXdhcmUtZGlhbG9nJykubW9kYWwoJ3Nob3cnKTtcbiAgICAkKCcjY29tcGxldGUtY291cnNld2FyZS1kaWFsb2cgLm1vZGFsLWhlYWRlcicpLmNsaWNrKCk7XG5cbiAgICAkKCcjc3VibWl0LWNoYWxsZW5nZScpLm9mZignY2xpY2snKTtcbiAgICAkKCcjc3VibWl0LWNoYWxsZW5nZScpLm9uKCdjbGljaycsIHN1Ym1pdENoYWxsZW5nZUhhbmRsZXIpO1xuICB9O1xuXG4gIHJldHVybiBjb21tb247XG59KHdpbmRvdyk7IiwiJ3VzZSBzdHJpY3QnO1xuXG53aW5kb3cuY29tbW9uID0gZnVuY3Rpb24gKF9yZWYpIHtcbiAgdmFyICQgPSBfcmVmLiQ7XG4gIHZhciBfcmVmJGNvbW1vbiA9IF9yZWYuY29tbW9uO1xuICB2YXIgY29tbW9uID0gX3JlZiRjb21tb24gPT09IHVuZGVmaW5lZCA/IHsgaW5pdDogW10gfSA6IF9yZWYkY29tbW9uO1xuXG4gIHZhciBzdGVwQ2xhc3MgPSAnLmNoYWxsZW5nZS1zdGVwJztcbiAgdmFyIHByZXZCdG5DbGFzcyA9ICcuY2hhbGxlbmdlLXN0ZXAtYnRuLXByZXYnO1xuICB2YXIgbmV4dEJ0bkNsYXNzID0gJy5jaGFsbGVuZ2Utc3RlcC1idG4tbmV4dCc7XG4gIHZhciBhY3Rpb25CdG5DbGFzcyA9ICcuY2hhbGxlbmdlLXN0ZXAtYnRuLWFjdGlvbic7XG4gIHZhciBmaW5pc2hCdG5DbGFzcyA9ICcuY2hhbGxlbmdlLXN0ZXAtYnRuLWZpbmlzaCc7XG4gIHZhciBzdWJtaXRCdG5JZCA9ICcjY2hhbGxlbmdlLXN0ZXAtYnRuLXN1Ym1pdCc7XG4gIHZhciBzdWJtaXRNb2RhbElkID0gJyNjaGFsbGVuZ2Utc3RlcC1tb2RhbCc7XG5cbiAgZnVuY3Rpb24gZ2V0UHJldmlvdXNTdGVwKCRjaGFsbGVuZ2VTdGVwcykge1xuICAgIHZhciAkcHJldlN0ZXAgPSBmYWxzZTtcbiAgICB2YXIgcHJldlN0ZXBJbmRleCA9IDA7XG4gICAgJGNoYWxsZW5nZVN0ZXBzLmVhY2goZnVuY3Rpb24gKGluZGV4KSB7XG4gICAgICB2YXIgJHN0ZXAgPSAkKHRoaXMpO1xuICAgICAgaWYgKCEkc3RlcC5oYXNDbGFzcygnaGlkZGVuJykpIHtcbiAgICAgICAgcHJldlN0ZXBJbmRleCA9IGluZGV4IC0gMTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgICRwcmV2U3RlcCA9ICRjaGFsbGVuZ2VTdGVwc1twcmV2U3RlcEluZGV4XTtcblxuICAgIHJldHVybiAkcHJldlN0ZXA7XG4gIH1cblxuICBmdW5jdGlvbiBnZXROZXh0U3RlcCgkY2hhbGxlbmdlU3RlcHMpIHtcbiAgICB2YXIgbGVuZ3RoID0gJGNoYWxsZW5nZVN0ZXBzLmxlbmd0aDtcbiAgICB2YXIgJG5leHRTdGVwID0gZmFsc2U7XG4gICAgdmFyIG5leHRTdGVwSW5kZXggPSAwO1xuICAgICRjaGFsbGVuZ2VTdGVwcy5lYWNoKGZ1bmN0aW9uIChpbmRleCkge1xuICAgICAgdmFyICRzdGVwID0gJCh0aGlzKTtcbiAgICAgIGlmICghJHN0ZXAuaGFzQ2xhc3MoJ2hpZGRlbicpICYmIGluZGV4ICsgMSAhPT0gbGVuZ3RoKSB7XG4gICAgICAgIG5leHRTdGVwSW5kZXggPSBpbmRleCArIDE7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAkbmV4dFN0ZXAgPSAkY2hhbGxlbmdlU3RlcHNbbmV4dFN0ZXBJbmRleF07XG5cbiAgICByZXR1cm4gJG5leHRTdGVwO1xuICB9XG5cbiAgZnVuY3Rpb24gaGFuZGxlUHJldlN0ZXBDbGljayhlKSB7XG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIHZhciBwcmV2U3RlcCA9IGdldFByZXZpb3VzU3RlcCgkKHN0ZXBDbGFzcykpO1xuICAgICQodGhpcykucGFyZW50KCkucGFyZW50KCkucmVtb3ZlQ2xhc3MoJ3NsaWRlSW5MZWZ0IHNsaWRlSW5SaWdodCcpLmFkZENsYXNzKCdhbmltYXRlZCBmYWRlT3V0UmlnaHQgZmFzdC1hbmltYXRpb24nKS5kZWxheSgyNTApLnF1ZXVlKGZ1bmN0aW9uIChwcmV2KSB7XG4gICAgICAkKHRoaXMpLmFkZENsYXNzKCdoaWRkZW4nKTtcbiAgICAgIGlmIChwcmV2U3RlcCkge1xuICAgICAgICAkKHByZXZTdGVwKS5yZW1vdmVDbGFzcygnaGlkZGVuJykucmVtb3ZlQ2xhc3MoJ2ZhZGVPdXRMZWZ0IGZhZGVPdXRSaWdodCcpLmFkZENsYXNzKCdhbmltYXRlZCBzbGlkZUluTGVmdCBmYXN0LWFuaW1hdGlvbicpLmRlbGF5KDUwMCkucXVldWUoZnVuY3Rpb24gKHByZXYpIHtcbiAgICAgICAgICBwcmV2KCk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgcHJldigpO1xuICAgIH0pO1xuICB9XG5cbiAgZnVuY3Rpb24gaGFuZGxlTmV4dFN0ZXBDbGljayhlKSB7XG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIHZhciBuZXh0U3RlcCA9IGdldE5leHRTdGVwKCQoc3RlcENsYXNzKSk7XG4gICAgJCh0aGlzKS5wYXJlbnQoKS5wYXJlbnQoKS5yZW1vdmVDbGFzcygnc2xpZGVJblJpZ2h0IHNsaWRlSW5MZWZ0JykuYWRkQ2xhc3MoJ2FuaW1hdGVkIGZhZGVPdXRMZWZ0IGZhc3QtYW5pbWF0aW9uJykuZGVsYXkoMjUwKS5xdWV1ZShmdW5jdGlvbiAobmV4dCkge1xuICAgICAgJCh0aGlzKS5hZGRDbGFzcygnaGlkZGVuJyk7XG4gICAgICBpZiAobmV4dFN0ZXApIHtcbiAgICAgICAgJChuZXh0U3RlcCkucmVtb3ZlQ2xhc3MoJ2hpZGRlbicpLnJlbW92ZUNsYXNzKCdmYWRlT3V0UmlnaHQgZmFkZU91dExlZnQnKS5hZGRDbGFzcygnYW5pbWF0ZWQgc2xpZGVJblJpZ2h0IGZhc3QtYW5pbWF0aW9uJykuZGVsYXkoNTAwKS5xdWV1ZShmdW5jdGlvbiAobmV4dCkge1xuICAgICAgICAgIG5leHQoKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBuZXh0KCk7XG4gICAgfSk7XG4gIH1cblxuICBmdW5jdGlvbiBoYW5kbGVBY3Rpb25DbGljayhlKSB7XG4gICAgdmFyIHByb3BzID0gY29tbW9uLmNoYWxsZW5nZVNlZWRbMF0gfHwgeyBzdGVwSW5kZXg6IFtdIH07XG5cbiAgICB2YXIgJGVsID0gJCh0aGlzKTtcbiAgICB2YXIgaW5kZXggPSArJGVsLmF0dHIoJ2lkJyk7XG4gICAgdmFyIHByb3BJbmRleCA9IHByb3BzLnN0ZXBJbmRleC5pbmRleE9mKGluZGV4KTtcblxuICAgIGlmIChwcm9wSW5kZXggPT09IC0xKSB7XG4gICAgICByZXR1cm4gJGVsLnBhcmVudCgpLmZpbmQoJy5kaXNhYmxlZCcpLnJlbW92ZUNsYXNzKCdkaXNhYmxlZCcpO1xuICAgIH1cblxuICAgIC8vIGFuIEFQSSBhY3Rpb25cbiAgICAvLyBwcmV2ZW50IGxpbmsgZnJvbSBvcGVuaW5nXG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIHZhciBwcm9wID0gcHJvcHMucHJvcGVydGllc1twcm9wSW5kZXhdO1xuICAgIHZhciBhcGkgPSBwcm9wcy5hcGlzW3Byb3BJbmRleF07XG4gICAgaWYgKGNvbW1vbltwcm9wXSkge1xuICAgICAgcmV0dXJuICRlbC5wYXJlbnQoKS5maW5kKCcuZGlzYWJsZWQnKS5yZW1vdmVDbGFzcygnZGlzYWJsZWQnKTtcbiAgICB9XG4gICAgcmV0dXJuICQucG9zdChhcGkpLmRvbmUoZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgIC8vIGFzc3VtZSBhIGJvb2xlYW4gaW5kaWNhdGVzIHBhc3NpbmdcbiAgICAgIGlmICh0eXBlb2YgZGF0YSA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgIHJldHVybiAkZWwucGFyZW50KCkuZmluZCgnLmRpc2FibGVkJykucmVtb3ZlQ2xhc3MoJ2Rpc2FibGVkJyk7XG4gICAgICB9XG4gICAgICAvLyBhc3N1bWUgYXBpIHJldHVybnMgc3RyaW5nIHdoZW4gZmFpbHNcbiAgICAgIHJldHVybiAkZWwucGFyZW50KCkuZmluZCgnLmRpc2FibGVkJykucmVwbGFjZVdpdGgoJzxwPicgKyBkYXRhICsgJzwvcD4nKTtcbiAgICB9KS5mYWlsKGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnNvbGUubG9nKCdmYWlsZWQnKTtcbiAgICB9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGhhbmRsZUZpbmlzaENsaWNrKGUpIHtcbiAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgJChzdWJtaXRNb2RhbElkKS5tb2RhbCgnc2hvdycpO1xuICAgICQoc3VibWl0TW9kYWxJZCArICcubW9kYWwtaGVhZGVyJykuY2xpY2soKTtcbiAgICAkKHN1Ym1pdEJ0bklkKS5jbGljayhoYW5kbGVTdWJtaXRDbGljayk7XG4gIH1cblxuICBmdW5jdGlvbiBoYW5kbGVTdWJtaXRDbGljayhlKSB7XG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgJCgnI3N1Ym1pdC1jaGFsbGVuZ2UnKS5hdHRyKCdkaXNhYmxlZCcsICd0cnVlJykucmVtb3ZlQ2xhc3MoJ2J0bi1wcmltYXJ5JykuYWRkQ2xhc3MoJ2J0bi13YXJuaW5nIGRpc2FibGVkJyk7XG5cbiAgICB2YXIgJGNoZWNrbWFya0NvbnRhaW5lciA9ICQoJyNjaGVja21hcmstY29udGFpbmVyJyk7XG4gICAgJGNoZWNrbWFya0NvbnRhaW5lci5jc3MoeyBoZWlnaHQ6ICRjaGVja21hcmtDb250YWluZXIuaW5uZXJIZWlnaHQoKSB9KTtcblxuICAgICQoJyNjaGFsbGVuZ2UtY2hlY2ttYXJrJykuYWRkQ2xhc3MoJ3pvb21PdXRVcCcpLmRlbGF5KDEwMDApLnF1ZXVlKGZ1bmN0aW9uIChuZXh0KSB7XG4gICAgICAkKHRoaXMpLnJlcGxhY2VXaXRoKCc8ZGl2IGlkPVwiY2hhbGxlbmdlLXNwaW5uZXJcIiAnICsgJ2NsYXNzPVwiYW5pbWF0ZWQgem9vbUluVXAgaW5uZXItY2lyY2xlcy1sb2FkZXJcIj4nICsgJ3N1Ym1pdHRpbmcuLi48L2Rpdj4nKTtcbiAgICAgIG5leHQoKTtcbiAgICB9KTtcblxuICAgICQuYWpheCh7XG4gICAgICB1cmw6ICcvY29tcGxldGVkLWNoYWxsZW5nZS8nLFxuICAgICAgdHlwZTogJ1BPU1QnLFxuICAgICAgZGF0YTogSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICBpZDogY29tbW9uLmNoYWxsZW5nZUlkLFxuICAgICAgICBuYW1lOiBjb21tb24uY2hhbGxlbmdlTmFtZSxcbiAgICAgICAgY2hhbGxlbmdlVHlwZTogK2NvbW1vbi5jaGFsbGVuZ2VUeXBlXG4gICAgICB9KSxcbiAgICAgIGNvbnRlbnRUeXBlOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICBkYXRhVHlwZTogJ2pzb24nXG4gICAgfSkuc3VjY2VzcyhmdW5jdGlvbiAocmVzKSB7XG4gICAgICBpZiAocmVzKSB7XG4gICAgICAgIHdpbmRvdy5sb2NhdGlvbiA9ICcvY2hhbGxlbmdlcy9uZXh0LWNoYWxsZW5nZT9pZD0nICsgY29tbW9uLmNoYWxsZW5nZUlkO1xuICAgICAgfVxuICAgIH0pLmZhaWwoZnVuY3Rpb24gKCkge1xuICAgICAgd2luZG93LmxvY2F0aW9uLnJlcGxhY2Uod2luZG93LmxvY2F0aW9uLmhyZWYpO1xuICAgIH0pO1xuICB9XG5cbiAgY29tbW9uLmluaXQucHVzaChmdW5jdGlvbiAoJCkge1xuICAgIGlmIChjb21tb24uY2hhbGxlbmdlVHlwZSAhPT0gJzcnKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAkKHByZXZCdG5DbGFzcykuY2xpY2soaGFuZGxlUHJldlN0ZXBDbGljayk7XG4gICAgJChuZXh0QnRuQ2xhc3MpLmNsaWNrKGhhbmRsZU5leHRTdGVwQ2xpY2spO1xuICAgICQoYWN0aW9uQnRuQ2xhc3MpLmNsaWNrKGhhbmRsZUFjdGlvbkNsaWNrKTtcbiAgICAkKGZpbmlzaEJ0bkNsYXNzKS5jbGljayhoYW5kbGVGaW5pc2hDbGljayk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH0pO1xuXG4gIHJldHVybiBjb21tb247XG59KHdpbmRvdyk7IiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgX2V4dGVuZHMgPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uICh0YXJnZXQpIHsgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXTsgZm9yICh2YXIga2V5IGluIHNvdXJjZSkgeyBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNvdXJjZSwga2V5KSkgeyB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldOyB9IH0gfSByZXR1cm4gdGFyZ2V0OyB9O1xuXG5mdW5jdGlvbiBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMob2JqLCBrZXlzKSB7IHZhciB0YXJnZXQgPSB7fTsgZm9yICh2YXIgaSBpbiBvYmopIHsgaWYgKGtleXMuaW5kZXhPZihpKSA+PSAwKSBjb250aW51ZTsgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBpKSkgY29udGludWU7IHRhcmdldFtpXSA9IG9ialtpXTsgfSByZXR1cm4gdGFyZ2V0OyB9XG5cbiQoZG9jdW1lbnQpLnJlYWR5KGZ1bmN0aW9uICgpIHtcbiAgdmFyIGNvbW1vbiA9IHdpbmRvdy5jb21tb247XG4gIHZhciBPYnNlcnZhYmxlID0gd2luZG93LlJ4Lk9ic2VydmFibGU7XG4gIHZhciBhZGRMb29wUHJvdGVjdCA9IGNvbW1vbi5hZGRMb29wUHJvdGVjdDtcbiAgdmFyIGNoYWxsZW5nZU5hbWUgPSBjb21tb24uY2hhbGxlbmdlTmFtZTtcbiAgdmFyIGNoYWxsZW5nZVR5cGUgPSBjb21tb24uY2hhbGxlbmdlVHlwZTtcbiAgdmFyIGNoYWxsZW5nZVR5cGVzID0gY29tbW9uLmNoYWxsZW5nZVR5cGVzO1xuXG5cbiAgY29tbW9uLmluaXQuZm9yRWFjaChmdW5jdGlvbiAoaW5pdCkge1xuICAgIGluaXQoJCk7XG4gIH0pO1xuXG4gIC8vIG9ubHkgcnVuIGlmIGVkaXRvciBwcmVzZW50XG4gIGlmIChjb21tb24uZWRpdG9yLmdldFZhbHVlKSB7XG4gICAgdmFyIGNvZGUkID0gY29tbW9uLmVkaXRvcktleVVwJC5kZWJvdW5jZSg3NTApLm1hcChmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gY29tbW9uLmVkaXRvci5nZXRWYWx1ZSgpO1xuICAgIH0pLmRpc3RpbmN0VW50aWxDaGFuZ2VkKCkuc2hhcmVSZXBsYXkoKTtcblxuICAgIC8vIHVwZGF0ZSBzdG9yYWdlXG4gICAgY29kZSQuc3Vic2NyaWJlKGZ1bmN0aW9uIChjb2RlKSB7XG4gICAgICBjb21tb24uY29kZVN0b3JhZ2UudXBkYXRlU3RvcmFnZShjb21tb24uY2hhbGxlbmdlTmFtZSwgY29kZSk7XG4gICAgICBjb21tb24uY29kZVVyaS5xdWVyaWZ5KGNvZGUpO1xuICAgIH0sIGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgIHJldHVybiBjb25zb2xlLmVycm9yKGVycik7XG4gICAgfSk7XG5cbiAgICBjb2RlJFxuICAgIC8vIG9ubHkgcnVuIGZvciBIVE1MXG4gICAgLmZpbHRlcihmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gY29tbW9uLmNoYWxsZW5nZVR5cGUgPT09IGNoYWxsZW5nZVR5cGVzLkhUTUw7XG4gICAgfSkuZmxhdE1hcChmdW5jdGlvbiAoY29kZSkge1xuICAgICAgcmV0dXJuIGNvbW1vbi5kZXRlY3RVbnNhZmVDb2RlJChjb2RlKS5tYXAoZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgY29tYmluZWRDb2RlID0gY29tbW9uLmhlYWQgKyBjb2RlICsgY29tbW9uLnRhaWw7XG5cbiAgICAgICAgcmV0dXJuIGFkZExvb3BQcm90ZWN0KGNvbWJpbmVkQ29kZSk7XG4gICAgICB9KS5mbGF0TWFwKGZ1bmN0aW9uIChjb2RlKSB7XG4gICAgICAgIHJldHVybiBjb21tb24udXBkYXRlUHJldmlldyQoY29kZSk7XG4gICAgICB9KS5mbGF0TWFwKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIGNvbW1vbi5jaGVja1ByZXZpZXckKHsgY29kZTogY29kZSB9KTtcbiAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgICAgcmV0dXJuIE9ic2VydmFibGUuanVzdCh7IGVycjogZXJyIH0pO1xuICAgICAgfSk7XG4gICAgfSkuc3Vic2NyaWJlKGZ1bmN0aW9uIChfcmVmKSB7XG4gICAgICB2YXIgZXJyID0gX3JlZi5lcnI7XG5cbiAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihlcnIpO1xuICAgICAgICByZXR1cm4gY29tbW9uLnVwZGF0ZVByZXZpZXckKCdcXG4gICAgICAgICAgICAgIDxoMT4nICsgZXJyICsgJzwvaDE+XFxuICAgICAgICAgICAgJykuc3Vic2NyaWJlKGZ1bmN0aW9uICgpIHt9KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH0sIGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgIHJldHVybiBjb25zb2xlLmVycm9yKGVycik7XG4gICAgfSk7XG4gIH1cblxuICBjb21tb24ucmVzZXRCdG4kLmRvT25OZXh0KGZ1bmN0aW9uICgpIHtcbiAgICBjb21tb24uZWRpdG9yLnNldFZhbHVlKGNvbW1vbi5yZXBsYWNlU2FmZVRhZ3MoY29tbW9uLnNlZWQpKTtcbiAgfSkuZmxhdE1hcChmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGNvbW1vbi5leGVjdXRlQ2hhbGxlbmdlJCgpLmNhdGNoKGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgIHJldHVybiBPYnNlcnZhYmxlLmp1c3QoeyBlcnI6IGVyciB9KTtcbiAgICB9KTtcbiAgfSkuc3Vic2NyaWJlKGZ1bmN0aW9uIChfcmVmMikge1xuICAgIHZhciBlcnIgPSBfcmVmMi5lcnI7XG4gICAgdmFyIG91dHB1dCA9IF9yZWYyLm91dHB1dDtcbiAgICB2YXIgb3JpZ2luYWxDb2RlID0gX3JlZjIub3JpZ2luYWxDb2RlO1xuXG4gICAgaWYgKGVycikge1xuICAgICAgY29uc29sZS5lcnJvcihlcnIpO1xuICAgICAgcmV0dXJuIGNvbW1vbi51cGRhdGVPdXRwdXREaXNwbGF5KCcnICsgZXJyKTtcbiAgICB9XG4gICAgY29tbW9uLmNvZGVTdG9yYWdlLnVwZGF0ZVN0b3JhZ2UoY2hhbGxlbmdlTmFtZSwgb3JpZ2luYWxDb2RlKTtcbiAgICBjb21tb24uY29kZVVyaS5xdWVyaWZ5KG9yaWdpbmFsQ29kZSk7XG4gICAgY29tbW9uLnVwZGF0ZU91dHB1dERpc3BsYXkob3V0cHV0KTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfSwgZnVuY3Rpb24gKGVycikge1xuICAgIGlmIChlcnIpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoZXJyKTtcbiAgICB9XG4gICAgY29tbW9uLnVwZGF0ZU91dHB1dERpc3BsYXkoJycgKyBlcnIpO1xuICB9KTtcblxuICBPYnNlcnZhYmxlLm1lcmdlKGNvbW1vbi5lZGl0b3JFeGVjdXRlJCwgY29tbW9uLnN1Ym1pdEJ0biQpLmZsYXRNYXAoZnVuY3Rpb24gKCkge1xuICAgIGNvbW1vbi5hcHBlbmRUb091dHB1dERpc3BsYXkoJ1xcbi8vIHRlc3RpbmcgY2hhbGxlbmdlLi4uJyk7XG4gICAgcmV0dXJuIGNvbW1vbi5leGVjdXRlQ2hhbGxlbmdlJCgpLm1hcChmdW5jdGlvbiAoX3JlZjMpIHtcbiAgICAgIHZhciB0ZXN0cyA9IF9yZWYzLnRlc3RzO1xuXG4gICAgICB2YXIgcmVzdCA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhfcmVmMywgWyd0ZXN0cyddKTtcblxuICAgICAgdmFyIHNvbHZlZCA9IHRlc3RzLmV2ZXJ5KGZ1bmN0aW9uICh0ZXN0KSB7XG4gICAgICAgIHJldHVybiAhdGVzdC5lcnI7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBfZXh0ZW5kcyh7fSwgcmVzdCwgeyB0ZXN0czogdGVzdHMsIHNvbHZlZDogc29sdmVkIH0pO1xuICAgIH0pLmNhdGNoKGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgIHJldHVybiBPYnNlcnZhYmxlLmp1c3QoeyBlcnI6IGVyciB9KTtcbiAgICB9KTtcbiAgfSkuc3Vic2NyaWJlKGZ1bmN0aW9uIChfcmVmNCkge1xuICAgIHZhciBlcnIgPSBfcmVmNC5lcnI7XG4gICAgdmFyIHNvbHZlZCA9IF9yZWY0LnNvbHZlZDtcbiAgICB2YXIgb3V0cHV0ID0gX3JlZjQub3V0cHV0O1xuICAgIHZhciB0ZXN0cyA9IF9yZWY0LnRlc3RzO1xuXG4gICAgaWYgKGVycikge1xuICAgICAgY29uc29sZS5lcnJvcihlcnIpO1xuICAgICAgaWYgKGNvbW1vbi5jaGFsbGVuZ2VUeXBlID09PSBjb21tb24uY2hhbGxlbmdlVHlwZXMuSFRNTCkge1xuICAgICAgICByZXR1cm4gY29tbW9uLnVwZGF0ZVByZXZpZXckKCdcXG4gICAgICAgICAgICAgIDxoMT4nICsgZXJyICsgJzwvaDE+XFxuICAgICAgICAgICAgJykuZmlyc3QoKS5zdWJzY3JpYmUoZnVuY3Rpb24gKCkge30pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGNvbW1vbi51cGRhdGVPdXRwdXREaXNwbGF5KCcnICsgZXJyKTtcbiAgICB9XG4gICAgY29tbW9uLnVwZGF0ZU91dHB1dERpc3BsYXkob3V0cHV0KTtcbiAgICBjb21tb24uZGlzcGxheVRlc3RSZXN1bHRzKHRlc3RzKTtcbiAgICBpZiAoc29sdmVkKSB7XG4gICAgICBjb21tb24uc2hvd0NvbXBsZXRpb24oKTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH0sIGZ1bmN0aW9uIChfcmVmNSkge1xuICAgIHZhciBlcnIgPSBfcmVmNS5lcnI7XG5cbiAgICBjb25zb2xlLmVycm9yKGVycik7XG4gICAgY29tbW9uLnVwZGF0ZU91dHB1dERpc3BsYXkoJycgKyBlcnIpO1xuICB9KTtcblxuICAvLyBpbml0aWFsIGNoYWxsZW5nZSBydW4gdG8gcG9wdWxhdGUgdGVzdHNcbiAgaWYgKGNoYWxsZW5nZVR5cGUgPT09IGNoYWxsZW5nZVR5cGVzLkhUTUwpIHtcbiAgICB2YXIgJHByZXZpZXcgPSAkKCcjcHJldmlldycpO1xuICAgIHJldHVybiBPYnNlcnZhYmxlLmZyb21DYWxsYmFjaygkcHJldmlldy5yZWFkeSwgJHByZXZpZXcpKCkuZGVsYXkoNTAwKS5mbGF0TWFwKGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBjb21tb24uZXhlY3V0ZUNoYWxsZW5nZSQoKTtcbiAgICB9KS5jYXRjaChmdW5jdGlvbiAoZXJyKSB7XG4gICAgICByZXR1cm4gT2JzZXJ2YWJsZS5qdXN0KHsgZXJyOiBlcnIgfSk7XG4gICAgfSkuc3Vic2NyaWJlKGZ1bmN0aW9uIChfcmVmNikge1xuICAgICAgdmFyIGVyciA9IF9yZWY2LmVycjtcbiAgICAgIHZhciB0ZXN0cyA9IF9yZWY2LnRlc3RzO1xuXG4gICAgICBpZiAoZXJyKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyKTtcbiAgICAgICAgaWYgKGNvbW1vbi5jaGFsbGVuZ2VUeXBlID09PSBjb21tb24uY2hhbGxlbmdlVHlwZXMuSFRNTCkge1xuICAgICAgICAgIHJldHVybiBjb21tb24udXBkYXRlUHJldmlldyQoJ1xcbiAgICAgICAgICAgICAgICA8aDE+JyArIGVyciArICc8L2gxPlxcbiAgICAgICAgICAgICAgJykuc3Vic2NyaWJlKGZ1bmN0aW9uICgpIHt9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29tbW9uLnVwZGF0ZU91dHB1dERpc3BsYXkoJycgKyBlcnIpO1xuICAgICAgfVxuICAgICAgY29tbW9uLmRpc3BsYXlUZXN0UmVzdWx0cyh0ZXN0cyk7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9LCBmdW5jdGlvbiAoX3JlZjcpIHtcbiAgICAgIHZhciBlcnIgPSBfcmVmNy5lcnI7XG5cbiAgICAgIGNvbnNvbGUuZXJyb3IoZXJyKTtcbiAgICB9KTtcbiAgfVxuXG4gIGlmIChjaGFsbGVuZ2VUeXBlID09PSBjaGFsbGVuZ2VUeXBlcy5CT05GSVJFIHx8IGNoYWxsZW5nZVR5cGUgPT09IGNoYWxsZW5nZVR5cGVzLkpTKSB7XG4gICAgcmV0dXJuIE9ic2VydmFibGUuanVzdCh7fSkuZGVsYXkoNTAwKS5mbGF0TWFwKGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBjb21tb24uZXhlY3V0ZUNoYWxsZW5nZSQoKTtcbiAgICB9KS5jYXRjaChmdW5jdGlvbiAoZXJyKSB7XG4gICAgICByZXR1cm4gT2JzZXJ2YWJsZS5qdXN0KHsgZXJyOiBlcnIgfSk7XG4gICAgfSkuc3Vic2NyaWJlKGZ1bmN0aW9uIChfcmVmOCkge1xuICAgICAgdmFyIGVyciA9IF9yZWY4LmVycjtcbiAgICAgIHZhciBvcmlnaW5hbENvZGUgPSBfcmVmOC5vcmlnaW5hbENvZGU7XG4gICAgICB2YXIgdGVzdHMgPSBfcmVmOC50ZXN0cztcblxuICAgICAgaWYgKGVycikge1xuICAgICAgICBjb25zb2xlLmVycm9yKGVycik7XG4gICAgICAgIHJldHVybiBjb21tb24udXBkYXRlT3V0cHV0RGlzcGxheSgnJyArIGVycik7XG4gICAgICB9XG4gICAgICBjb21tb24uY29kZVN0b3JhZ2UudXBkYXRlU3RvcmFnZShjaGFsbGVuZ2VOYW1lLCBvcmlnaW5hbENvZGUpO1xuICAgICAgY29tbW9uLmRpc3BsYXlUZXN0UmVzdWx0cyh0ZXN0cyk7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9LCBmdW5jdGlvbiAoZXJyKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGVycik7XG4gICAgICBjb21tb24udXBkYXRlT3V0cHV0RGlzcGxheSgnJyArIGVycik7XG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59KTsiXSwic291cmNlUm9vdCI6Ii9jb21tb25GcmFtZXdvcmsifQ==\n"
  },
  {
    "path": "public/js/commonFramework.js",
    "content": "'use strict';\n\nwindow.common = function (global) {\n  // common namespace\n  // all classes should be stored here\n  // called at the beginning of dom ready\n  var _global$Rx = global.Rx,\n      Disposable = _global$Rx.Disposable,\n      Observable = _global$Rx.Observable,\n      config = _global$Rx.config,\n      _global$common = global.common,\n      common = _global$common === undefined ? { init: [] } : _global$common;\n\n\n  config.longStackSupport = true;\n  common.head = common.head || [];\n  common.tail = common.tail || [];\n  common.salt = Math.random();\n\n  common.challengeTypes = {\n    HTML: '0',\n    JS: '1',\n    VIDEO: '2',\n    ZIPLINE: '3',\n    BASEJUMP: '4',\n    BONFIRE: '5',\n    HIKES: '6',\n    STEP: '7'\n  };\n\n  common.arrayToNewLineString = function arrayToNewLineString(seedData) {\n    seedData = Array.isArray(seedData) ? seedData : [seedData];\n    return seedData.reduce(function (seed, line) {\n      return '' + seed + line + '\\n';\n    }, '');\n  };\n\n  common.seed = common.arrayToNewLineString(common.challengeSeed);\n\n  common.replaceScriptTags = function replaceScriptTags(value) {\n    return value.replace(/<script>/gi, 'fccss').replace(/<\\/script>/gi, 'fcces');\n  };\n\n  common.replaceSafeTags = function replaceSafeTags(value) {\n    return value.replace(/fccss/gi, '<script>').replace(/fcces/gi, '</script>');\n  };\n\n  common.replaceFormActionAttr = function replaceFormAction(value) {\n    return value.replace(/<form[^>]*>/, function (val) {\n      return val.replace(/action(\\s*?)=/, 'fccfaa$1=');\n    });\n  };\n\n  common.replaceFccfaaAttr = function replaceFccfaaAttr(value) {\n    return value.replace(/<form[^>]*>/, function (val) {\n      return val.replace(/fccfaa(\\s*?)=/, 'action$1=');\n    });\n  };\n\n  common.scopejQuery = function scopejQuery(str) {\n    return str.replace(/\\$/gi, 'j$').replace(/document/gi, 'jdocument').replace(/jQuery/gi, 'jjQuery');\n  };\n\n  common.unScopeJQuery = function unScopeJQuery(str) {\n    return str.replace(/j\\$/gi, '$').replace(/jdocument/gi, 'document').replace(/jjQuery/gi, 'jQuery');\n  };\n\n  var commentRegex = /(\\/\\*[^(\\*\\/)]*\\*\\/)|([ \\n]\\/\\/[^\\n]*)/g;\n  common.removeComments = function removeComments(str) {\n    return str.replace(commentRegex, '');\n  };\n\n  var logRegex = /(console\\.[\\w]+\\s*\\(.*\\;)/g;\n  common.removeLogs = function removeLogs(str) {\n    return str.replace(logRegex, '');\n  };\n\n  common.reassembleTest = function reassembleTest() {\n    var code = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';\n    var _ref = arguments[1];\n    var line = _ref.line,\n        text = _ref.text;\n\n    var regexp = new RegExp('//' + line + common.salt);\n    return code.replace(regexp, text);\n  };\n\n  common.getScriptContent$ = function getScriptContent$(script) {\n    return Observable.create(function (observer) {\n      var jqXHR = $.get(script, null, null, 'text').success(function (data) {\n        observer.onNext(data);\n        observer.onCompleted();\n      }).fail(function (e) {\n        return observer.onError(e);\n      }).always(function () {\n        return observer.onCompleted();\n      });\n\n      return new Disposable(function () {\n        jqXHR.abort();\n      });\n    });\n  };\n\n  var openScript = /\\<\\s?script\\s?\\>/gi;\n  var closingScript = /\\<\\s?\\/\\s?script\\s?\\>/gi;\n\n  // detects if there is JavaScript in the first script tag\n  common.hasJs = function hasJs(code) {\n    return !!common.getJsFromHtml(code);\n  };\n\n  // grabs the content from the first script tag in the code\n  common.getJsFromHtml = function getJsFromHtml(code) {\n    // grab user javaScript\n    return (code.split(openScript)[1] || '').split(closingScript)[0] || '';\n  };\n\n  return common;\n}(window);\n'use strict';\n\nwindow.common = function (global) {\n  var $ = global.$,\n      Observable = global.Rx.Observable,\n      _global$common = global.common,\n      common = _global$common === undefined ? { init: [] } : _global$common;\n\n\n  common.ctrlEnterClickHandler = function ctrlEnterClickHandler(e) {\n    // ctrl + enter or cmd + enter\n    if (e.keyCode === 13 && (e.metaKey || e.ctrlKey)) {\n      $('#complete-courseware-dialog').off('keydown', ctrlEnterClickHandler);\n      if ($('#submit-challenge').length > 0) {\n        $('#submit-challenge').click();\n      } else {\n        window.location = '/challenges/next-challenge?id=' + common.challengeId;\n      }\n    }\n  };\n\n  common.init.push(function ($) {\n\n    var $marginFix = $('.innerMarginFix');\n    $marginFix.css('min-height', $marginFix.height());\n\n    common.submitBtn$ = Observable.fromEvent($('#submitButton'), 'click');\n\n    common.resetBtn$ = Observable.fromEvent($('#reset-button'), 'click');\n\n    // init modal keybindings on open\n    $('#complete-courseware-dialog').on('shown.bs.modal', function () {\n      $('#complete-courseware-dialog').keydown(common.ctrlEnterClickHandler);\n    });\n\n    // remove modal keybinds on close\n    $('#complete-courseware-dialog').on('hidden.bs.modal', function () {\n      $('#complete-courseware-dialog').off('keydown', common.ctrlEnterClickHandler);\n    });\n\n    // video checklist binding\n    $('.challenge-list-checkbox').on('change', function () {\n      var checkboxId = $(this).parent().parent().attr('id');\n      if ($(this).is(':checked')) {\n        $(this).parent().siblings().children().addClass('faded');\n        if (!localStorage || !localStorage[checkboxId]) {\n          localStorage[checkboxId] = true;\n        }\n      }\n\n      if (!$(this).is(':checked')) {\n        $(this).parent().siblings().children().removeClass('faded');\n        if (localStorage[checkboxId]) {\n          localStorage.removeItem(checkboxId);\n        }\n      }\n    });\n\n    $('.checklist-element').each(function () {\n      var checklistElementId = $(this).attr('id');\n      if (localStorage[checklistElementId]) {\n        $(this).children().children('li').addClass('faded');\n        $(this).children().children('input').trigger('click');\n      }\n    });\n\n    // video challenge submit\n    $('#next-courseware-button').on('click', function () {\n      $('#next-courseware-button').unbind('click');\n      if ($('.signup-btn-nav').length < 1) {\n        var data;\n        var solution = $('#public-url').val() || null;\n        var githubLink = $('#github-url').val() || null;\n        switch (common.challengeType) {\n          case common.challengeTypes.VIDEO:\n            data = {\n              id: common.challengeId,\n              name: common.challengeName,\n              challengeType: +common.challengeType\n            };\n            $.ajax({\n              url: '/completed-challenge/',\n              type: 'POST',\n              data: JSON.stringify(data),\n              contentType: 'application/json',\n              dataType: 'json'\n            }).success(function (res) {\n              if (!res) {\n                return;\n              }\n              window.location.href = '/challenges/next-challenge?id=' + common.challengeId;\n            }).fail(function () {\n              window.location.replace(window.location.href);\n            });\n\n            break;\n          case common.challengeTypes.BASEJUMP:\n          case common.challengeTypes.ZIPLINE:\n            data = {\n              id: common.challengeId,\n              name: common.challengeName,\n              challengeType: +common.challengeType,\n              solution: solution,\n              githubLink: githubLink\n            };\n\n            $.ajax({\n              url: '/completed-zipline-or-basejump/',\n              type: 'POST',\n              data: JSON.stringify(data),\n              contentType: 'application/json',\n              dataType: 'json'\n            }).success(function () {\n              window.location.href = '/challenges/next-challenge?id=' + common.challengeId;\n            }).fail(function () {\n              window.location.replace(window.location.href);\n            });\n            break;\n\n          case common.challengeTypes.BONFIRE:\n            window.location.href = '/challenges/next-challenge?id=' + common.challengeId;\n            break;\n\n          default:\n            console.log('Happy Coding!');\n            break;\n        }\n      }\n    });\n\n    if (common.challengeName) {\n      window.ga('send', 'event', 'Challenge', 'load', common.gaName);\n    }\n\n    $('#complete-courseware-dialog').on('hidden.bs.modal', function () {\n      if (common.editor.focus) {\n        common.editor.focus();\n      }\n    });\n\n    $('#trigger-issue-modal').on('click', function () {\n      $('#issue-modal').modal('show');\n    });\n\n    $('#trigger-help-modal').on('click', function () {\n      $('#help-modal').modal('show');\n    });\n\n    $('#trigger-reset-modal').on('click', function () {\n      $('#reset-modal').modal('show');\n    });\n\n    $('#trigger-pair-modal').on('click', function () {\n      $('#pair-modal').modal('show');\n    });\n\n    $('#completed-courseware').on('click', function () {\n      $('#complete-courseware-dialog').modal('show');\n    });\n\n    $('#help-ive-found-a-bug-wiki-article').on('click', function () {\n      window.open('https://github.com/freecodecampchina/freecodecamp.cn/wiki/' + \"Help-I've-Found-a-Bug\", '_blank');\n    });\n\n    $('#search-issue').on('click', function () {\n      var queryIssue = window.location.href.toString().split('?')[0].replace(/(#*)$/, '');\n      window.open('https://github.com/freecodecampchina/freecodecamp.cn/issues?q=' + 'is:issue is:all ' + common.challengeName + ' OR ' + queryIssue.substr(queryIssue.lastIndexOf('challenges/') + 11).replace('/', ''), '_blank');\n    });\n  });\n\n  return common;\n}(window);\n'use strict';\n\n// depends on: codeUri\nwindow.common = function (global) {\n  var localStorage = global.localStorage,\n      _global$common = global.common,\n      common = _global$common === undefined ? { init: [] } : _global$common;\n\n\n  var challengePrefix = ['Bonfire: ', 'Waypoint: ', 'Zipline: ', 'Basejump: ', 'Checkpoint: '],\n      item;\n\n  var codeStorage = {\n    getStoredValue: function getStoredValue(key) {\n      if (!localStorage || typeof localStorage.getItem !== 'function' || !key || typeof key !== 'string') {\n        console.log('unable to read from storage');\n        return '';\n      }\n      if (localStorage.getItem(key + 'Val')) {\n        return '' + localStorage.getItem(key + 'Val');\n      } else {\n        for (var i = 0; i <= challengePrefix.length; i++) {\n          item = localStorage.getItem(challengePrefix[i] + key + 'Val');\n          if (item) {\n            return '' + item;\n          }\n        }\n      }\n      return null;\n    },\n\n\n    isAlive: function isAlive(key) {\n      var val = this.getStoredValue(key);\n      return val !== 'null' && val !== 'undefined' && val && val.length > 0;\n    },\n\n    updateStorage: function updateStorage(key, code) {\n      if (!localStorage || typeof localStorage.setItem !== 'function' || !key || typeof key !== 'string') {\n        console.log('unable to save to storage');\n        return code;\n      }\n      localStorage.setItem(key + 'Val', code);\n      return code;\n    }\n  };\n\n  common.codeStorage = codeStorage;\n\n  return common;\n}(window, window.common);\n'use strict';\n\n// store code in the URL\nwindow.common = function (global) {\n  var _encode = global.encodeURIComponent,\n      _decode = global.decodeURIComponent,\n      location = global.location,\n      history = global.history,\n      _global$common = global.common,\n      common = _global$common === undefined ? { init: [] } : _global$common;\n  var replaceScriptTags = common.replaceScriptTags,\n      replaceSafeTags = common.replaceSafeTags,\n      replaceFormActionAttr = common.replaceFormActionAttr,\n      replaceFccfaaAttr = common.replaceFccfaaAttr;\n\n\n  var queryRegex = /^(\\?|#\\?)/;\n  function encodeFcc(val) {\n    return replaceScriptTags(replaceFormActionAttr(val));\n  }\n\n  function decodeFcc(val) {\n    return replaceSafeTags(replaceFccfaaAttr(val));\n  }\n\n  var codeUri = {\n    encode: function encode(code) {\n      return _encode(code);\n    },\n    decode: function decode(code) {\n      try {\n        return _decode(code);\n      } catch (ignore) {\n        return null;\n      }\n    },\n    isInQuery: function isInQuery(query) {\n      var decoded = codeUri.decode(query);\n      if (!decoded || typeof decoded.split !== 'function') {\n        return false;\n      }\n      return decoded.replace(queryRegex, '').split('&').reduce(function (found, param) {\n        var key = param.split('=')[0];\n        if (key === 'solution') {\n          return true;\n        }\n        return found;\n      }, false);\n    },\n    isAlive: function isAlive() {\n      return codeUri.enabled && codeUri.isInQuery(location.search) || codeUri.isInQuery(location.hash);\n    },\n    getKeyInQuery: function getKeyInQuery(query) {\n      var keyToFind = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';\n\n      return query.split('&').reduce(function (oldValue, param) {\n        var key = param.split('=')[0];\n        var value = param.split('=').slice(1).join('=');\n\n        if (key === keyToFind) {\n          return value;\n        }\n        return oldValue;\n      }, null);\n    },\n    getSolutionFromQuery: function getSolutionFromQuery() {\n      var query = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';\n\n      return decodeFcc(codeUri.decode(codeUri.getKeyInQuery(query, 'solution')));\n    },\n\n    parse: function parse() {\n      if (!codeUri.enabled) {\n        return null;\n      }\n      var query;\n      if (location.search && codeUri.isInQuery(location.search)) {\n        query = location.search.replace(/^\\?/, '');\n\n        if (history && typeof history.replaceState === 'function') {\n          history.replaceState(history.state, null, location.href.split('?')[0]);\n          location.hash = '#?' + encodeFcc(query);\n        }\n      } else {\n        query = location.hash.replace(/^\\#\\?/, '');\n      }\n\n      if (!query) {\n        return null;\n      }\n\n      return this.getSolutionFromQuery(query);\n    },\n    querify: function querify(solution) {\n      if (!codeUri.enabled) {\n        return null;\n      }\n      if (history && typeof history.replaceState === 'function') {\n        // grab the url up to the query\n        // destroy any hash symbols still clinging to life\n        var url = location.href.split('?')[0].replace(/(#*)$/, '');\n        history.replaceState(history.state, null, url + '#?' + (codeUri.shouldRun() ? '' : 'run=disabled&') + 'solution=' + codeUri.encode(encodeFcc(solution)));\n      } else {\n        location.hash = '?solution=' + codeUri.encode(encodeFcc(solution));\n      }\n\n      return solution;\n    },\n    enabled: true,\n    shouldRun: function shouldRun() {\n      return !this.getKeyInQuery((location.search || location.hash).replace(queryRegex, ''), 'run');\n    }\n  };\n\n  common.init.push(function () {\n    codeUri.parse();\n  });\n\n  common.codeUri = codeUri;\n  common.shouldRun = function () {\n    return codeUri.shouldRun();\n  };\n\n  return common;\n}(window);\n'use strict';\n\nwindow.common = function (global) {\n  var loopProtect = global.loopProtect,\n      _global$common = global.common,\n      common = _global$common === undefined ? { init: [] } : _global$common;\n\n\n  loopProtect.hit = function hit(line) {\n    var err = 'Error: Exiting potential infinite loop at line ' + line + '. To disable loop protection, write: \\n\\\\/\\\\/ noprotect\\nas the first' + 'line. Beware that if you do have an infinite loop in your code' + 'this will crash your browser.';\n    console.error(err);\n  };\n\n  common.addLoopProtect = function addLoopProtect() {\n    var code = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';\n\n    return loopProtect(code);\n  };\n\n  return common;\n}(window);\n'use strict';\n\nwindow.common = function (global) {\n  var _global$common = global.common,\n      common = _global$common === undefined ? { init: [] } : _global$common,\n      doc = global.document;\n\n\n  common.getIframe = function getIframe() {\n    var id = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'preview';\n\n    var previewFrame = doc.getElementById(id);\n\n    // create and append a hidden preview frame\n    if (!previewFrame) {\n      previewFrame = doc.createElement('iframe');\n      previewFrame.id = id;\n      previewFrame.setAttribute('style', 'display: none');\n      doc.body.appendChild(previewFrame);\n    }\n\n    return previewFrame.contentDocument || previewFrame.contentWindow.document;\n  };\n\n  return common;\n}(window);\n'use strict';\n\nwindow.common = function (global) {\n  var _global$Rx = global.Rx,\n      BehaviorSubject = _global$Rx.BehaviorSubject,\n      Observable = _global$Rx.Observable,\n      _global$common = global.common,\n      common = _global$common === undefined ? { init: [] } : _global$common;\n\n  // the first script tag here is to proxy jQuery\n  // We use the same jQuery on the main window but we change the\n  // context to that of the iframe.\n\n  var libraryIncludes = '\\n<script>\\n  window.loopProtect = parent.loopProtect;\\n  window.__err = null;\\n  window.loopProtect.hit = function(line) {\\n    window.__err = new Error(\\n      \\'Potential infinite loop at line \\' +\\n      line +\\n      \\'. To disable loop protection, write:\\' +\\n      \\' \\\\n\\\\/\\\\/ noprotect\\\\nas the first\\' +\\n      \\' line. Beware that if you do have an infinite loop in your code\\' +\\n      \\' this will crash your browser.\\'\\n    );\\n  };\\n</script>\\n<link\\n  rel=\\'stylesheet\\'\\n  href=\\'//cdn.bootcss.com/animate.css/3.2.0/animate.min.css\\'\\n  />\\n<link\\n  rel=\\'stylesheet\\'\\n  href=\\'//cdn.bootcss.com/bootstrap/3.3.1/css/bootstrap.min.css\\'\\n  />\\n\\n<link\\n  rel=\\'stylesheet\\'\\n  href=\\'//cdn.bootcss.com/font-awesome/4.2.0/css/font-awesome.min.css\\'\\n  />\\n<style>\\n  body { padding: 0px 3px 0px 3px; }\\n</style>\\n  ';\n  var codeDisabledError = '\\n    <script>\\n      window.__err = new Error(\\'code has been disabled\\');\\n    </script>\\n  ';\n\n  var iFrameScript$ = common.getScriptContent$('/js/iFrameScripts-b55595ec35.js').shareReplay();\n  var jQueryScript$ = common.getScriptContent$('/bower_components/jquery/dist/jquery.js').shareReplay();\n\n  // behavior subject allways remembers the last value\n  // we use this to determine if runPreviewTest$ is defined\n  // and prime it with false\n  common.previewReady$ = new BehaviorSubject(false);\n\n  // These should be set up in the preview window\n  // if this error is seen it is because the function tried to run\n  // before the iframe has completely loaded\n  common.runPreviewTests$ = common.checkPreview$ = function () {\n    return Observable.throw(new Error('Preview not fully loaded'));\n  };\n\n  common.updatePreview$ = function updatePreview$() {\n    var code = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';\n\n    var preview = common.getIframe('preview');\n\n    return Observable.combineLatest(iFrameScript$, jQueryScript$, function (iframe, jQuery) {\n      return {\n        iframeScript: '<script>' + iframe + '</script>',\n        jQuery: '<script>' + jQuery + '</script>'\n      };\n    }).first().flatMap(function (_ref) {\n      var iframeScript = _ref.iframeScript,\n          jQuery = _ref.jQuery;\n\n      // we make sure to override the last value in the\n      // subject to false here.\n      common.previewReady$.onNext(false);\n      preview.open();\n      preview.write(libraryIncludes + jQuery + (common.shouldRun() ? code : codeDisabledError) + '<!-- -->' + iframeScript);\n      preview.close();\n      // now we filter false values and wait for the first true\n      return common.previewReady$.filter(function (ready) {\n        return ready;\n      }).first()\n      // the delay here is to give code within the iframe\n      // control to run\n      .delay(400);\n    }).map(function () {\n      return code;\n    });\n  };\n\n  return common;\n}(window);\n'use strict';\n\nwindow.common = function (global) {\n  var _global$Rx = global.Rx,\n      Subject = _global$Rx.Subject,\n      Observable = _global$Rx.Observable,\n      CodeMirror = global.CodeMirror,\n      emmetCodeMirror = global.emmetCodeMirror,\n      _global$common = global.common,\n      common = _global$common === undefined ? { init: [] } : _global$common;\n  var _common$challengeType = common.challengeType,\n      challengeType = _common$challengeType === undefined ? '0' : _common$challengeType,\n      challengeTypes = common.challengeTypes;\n\n\n  if (!CodeMirror || challengeType === challengeTypes.BASEJUMP || challengeType === challengeTypes.ZIPLINE || challengeType === challengeTypes.VIDEO || challengeType === challengeTypes.STEP || challengeType === challengeTypes.HIKES) {\n    common.editor = {};\n    return common;\n  }\n\n  var editor = CodeMirror.fromTextArea(document.getElementById('codeEditor'), {\n    lint: true,\n    lineNumbers: true,\n    mode: 'javascript',\n    theme: 'monokai',\n    runnable: true,\n    matchBrackets: true,\n    autoCloseBrackets: true,\n    scrollbarStyle: 'null',\n    lineWrapping: true,\n    gutters: ['CodeMirror-lint-markers']\n  });\n\n  editor.setSize('100%', 'auto');\n\n  common.editorExecute$ = new Subject();\n  common.editorKeyUp$ = Observable.fromEventPattern(function (handler) {\n    return editor.on('keyup', handler);\n  }, function (handler) {\n    return editor.off('keyup', handler);\n  });\n\n  editor.setOption('extraKeys', {\n    Tab: function Tab(cm) {\n      if (cm.somethingSelected()) {\n        cm.indentSelection('add');\n      } else {\n        var spaces = Array(cm.getOption('indentUnit') + 1).join(' ');\n        cm.replaceSelection(spaces);\n      }\n    },\n    'Shift-Tab': function ShiftTab(cm) {\n      if (cm.somethingSelected()) {\n        cm.indentSelection('subtract');\n      } else {\n        var spaces = Array(cm.getOption('indentUnit') + 1).join(' ');\n        cm.replaceSelection(spaces);\n      }\n    },\n    'Ctrl-Enter': function CtrlEnter() {\n      common.editorExecute$.onNext();\n      return false;\n    },\n    'Cmd-Enter': function CmdEnter() {\n      common.editorExecute$.onNext();\n      return false;\n    }\n  });\n\n  var info = editor.getScrollInfo();\n\n  var after = editor.charCoords({\n    line: editor.getCursor().line + 1,\n    ch: 0\n  }, 'local').top;\n\n  if (info.top + info.clientHeight < after) {\n    editor.scrollTo(null, after - info.clientHeight + 3);\n  }\n\n  if (emmetCodeMirror) {\n    emmetCodeMirror(editor, {\n      'Cmd-E': 'emmet.expand_abbreviation',\n      Tab: 'emmet.expand_abbreviation_with_tab',\n      Enter: 'emmet.insert_formatted_line_break_only'\n    });\n  }\n  common.init.push(function () {\n    var editorValue = void 0;\n    if (common.codeUri.isAlive()) {\n      editorValue = common.codeUri.parse();\n    } else {\n      editorValue = common.codeStorage.isAlive(common.challengeName) ? common.codeStorage.getStoredValue(common.challengeName) : common.seed;\n    }\n\n    editor.setValue(common.replaceSafeTags(editorValue));\n    editor.refresh();\n  });\n\n  common.editor = editor;\n\n  return common;\n}(window);\n'use strict';\n\nwindow.common = function (global) {\n  var Observable = global.Rx.Observable,\n      _global$common = global.common,\n      common = _global$common === undefined ? { init: [] } : _global$common;\n\n\n  var detectFunctionCall = /function\\s*?\\(|function\\s+\\w+\\s*?\\(/gi;\n  var detectUnsafeJQ = /\\$\\s*?\\(\\s*?\\$\\s*?\\)/gi;\n  var detectUnsafeConsoleCall = /if\\s\\(null\\)\\sconsole\\.log\\(1\\);/gi;\n\n  common.detectUnsafeCode$ = function detectUnsafeCode$(code) {\n    var openingComments = code.match(/\\/\\*/gi);\n    var closingComments = code.match(/\\*\\//gi);\n\n    // checks if the number of opening comments(/*) matches the number of\n    // closing comments(*/)\n    if (openingComments && (!closingComments || openingComments.length > closingComments.length)) {\n\n      return Observable.throw(new Error('SyntaxError: Unfinished multi-line comment'));\n    }\n\n    if (code.match(detectUnsafeJQ)) {\n      return Observable.throw(new Error('Unsafe $($)'));\n    }\n\n    if (code.match(/function/g) && !code.match(detectFunctionCall)) {\n      return Observable.throw(new Error('SyntaxError: Unsafe or unfinished function declaration'));\n    }\n\n    if (code.match(detectUnsafeConsoleCall)) {\n      return Observable.throw(new Error('Invalid if (null) console.log(1); detected'));\n    }\n\n    return Observable.just(code);\n  };\n\n  return common;\n}(window);\n'use strict';\n\nwindow.common = function (_ref) {\n  var $ = _ref.$,\n      _ref$common = _ref.common,\n      common = _ref$common === undefined ? { init: [] } : _ref$common;\n\n\n  common.displayTestResults = function displayTestResults() {\n    var data = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];\n\n    $('#testSuite').children().remove();\n    data.forEach(function (_ref2) {\n      var _ref2$err = _ref2.err,\n          err = _ref2$err === undefined ? false : _ref2$err,\n          _ref2$text = _ref2.text,\n          text = _ref2$text === undefined ? '' : _ref2$text;\n\n      var iconClass = err ? '\"ion-close-circled big-error-icon\"' : '\"ion-checkmark-circled big-success-icon\"';\n\n      $('<div></div>').html('\\n        <div class=\\'row\\'>\\n          <div class=\\'col-xs-2 text-center\\'>\\n            <i class=' + iconClass + '></i>\\n          </div>\\n          <div class=\\'col-xs-10 test-output\\'>\\n            ' + text.split('message: ').pop().replace(/\\'\\);/g, '') + '\\n          </div>\\n          <div class=\\'ten-pixel-break\\'/>\\n        </div>\\n      ').appendTo($('#testSuite'));\n    });\n\n    return data;\n  };\n\n  return common;\n}(window);\n'use strict';\n\nwindow.common = function (global) {\n  var ga = global.ga,\n      _global$common = global.common,\n      common = _global$common === undefined ? { init: [] } : _global$common;\n  var addLoopProtect = common.addLoopProtect,\n      getJsFromHtml = common.getJsFromHtml,\n      detectUnsafeCode$ = common.detectUnsafeCode$,\n      updatePreview$ = common.updatePreview$,\n      challengeType = common.challengeType,\n      challengeTypes = common.challengeTypes;\n\n\n  common.executeChallenge$ = function executeChallenge$() {\n    var code = common.editor.getValue();\n    var originalCode = code;\n    var head = common.arrayToNewLineString(common.head);\n    var tail = common.arrayToNewLineString(common.tail);\n    var combinedCode = head + code + tail;\n\n    ga('send', 'event', 'Challenge', 'ran-code', common.gaName);\n\n    // run checks for unsafe code\n    return detectUnsafeCode$(code)\n    // add head and tail and detect loops\n    .map(function () {\n      if (challengeType !== challengeTypes.HTML) {\n        return '<script>;' + addLoopProtect(combinedCode) + '/**/</script>';\n      }\n\n      return addLoopProtect(combinedCode);\n    }).flatMap(function (code) {\n      return updatePreview$(code);\n    }).flatMap(function (code) {\n      var output = void 0;\n\n      if (challengeType === challengeTypes.HTML && common.hasJs(code)) {\n        output = common.getJsOutput(getJsFromHtml(code));\n      } else if (challengeType !== challengeTypes.HTML) {\n        output = common.getJsOutput(addLoopProtect(combinedCode));\n      }\n\n      return common.runPreviewTests$({\n        tests: common.tests.slice(),\n        originalCode: originalCode,\n        output: output\n      });\n    });\n  };\n\n  return common;\n}(window);\n'use strict';\n\nwindow.common = function (global) {\n  var CodeMirror = global.CodeMirror,\n      doc = global.document,\n      _global$common = global.common,\n      common = _global$common === undefined ? { init: [] } : _global$common;\n  var challengeTypes = common.challengeTypes,\n      _common$challengeType = common.challengeType,\n      challengeType = _common$challengeType === undefined ? '0' : _common$challengeType;\n\n\n  if (!CodeMirror || challengeType !== challengeTypes.JS && challengeType !== challengeTypes.BONFIRE) {\n    common.updateOutputDisplay = function () {};\n    common.appendToOutputDisplay = function () {};\n    return common;\n  }\n\n  var codeOutput = CodeMirror.fromTextArea(doc.getElementById('codeOutput'), {\n    lineNumbers: false,\n    mode: 'text',\n    theme: 'monokai',\n    readOnly: 'nocursor',\n    lineWrapping: true\n  });\n\n  codeOutput.setValue('/**\\n  * Your output will go here.\\n  * Any console.log() -type\\n  * statements will appear in\\n  * your browser\\'s DevTools\\n  * JavaScript console.\\n  */');\n\n  codeOutput.setSize('100%', '100%');\n\n  common.updateOutputDisplay = function updateOutputDisplay() {\n    var str = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';\n\n    if (typeof str !== 'string') {\n      str = JSON.stringify(str);\n    }\n    codeOutput.setValue(str);\n    return str;\n  };\n\n  common.appendToOutputDisplay = function appendToOutputDisplay() {\n    var str = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';\n\n    codeOutput.setValue(codeOutput.getValue() + str);\n    return str;\n  };\n\n  return common;\n}(window);\n'use strict';\n\nwindow.common = function (_ref) {\n  var _ref$common = _ref.common,\n      common = _ref$common === undefined ? { init: [] } : _ref$common;\n\n\n  common.lockTop = function lockTop() {\n    var magiVal;\n\n    if ($(window).width() >= 990) {\n      if ($('.editorScrollDiv').html()) {\n\n        magiVal = $(window).height() - $('.navbar').height();\n\n        if (magiVal < 0) {\n          magiVal = 0;\n        }\n        $('.editorScrollDiv').css('height', magiVal - 50 + 'px');\n      }\n\n      magiVal = $(window).height() - $('.navbar').height();\n\n      if (magiVal < 0) {\n        magiVal = 0;\n      }\n\n      $('.scroll-locker').css('min-height', $('.editorScrollDiv').height()).css('height', magiVal - 50);\n    } else {\n      $('.editorScrollDiv').css('max-height', 500 + 'px');\n\n      $('.scroll-locker').css('position', 'inherit').css('top', 'inherit').css('width', '100%').css('max-height', '100%');\n    }\n  };\n\n  common.init.push(function ($) {\n    // fakeiphone positioning hotfix\n    if ($('.iphone-position').html() || $('.iphone').html()) {\n      var startIphonePosition = parseInt($('.iphone-position').css('top').replace('px', ''), 10);\n\n      var startIphone = parseInt($('.iphone').css('top').replace('px', ''), 10);\n\n      $(window).on('scroll', function () {\n        var courseHeight = $('.courseware-height').height();\n        var courseTop = $('.courseware-height').offset().top;\n        var windowScrollTop = $(window).scrollTop();\n        var phoneHeight = $('.iphone-position').height();\n\n        if (courseHeight + courseTop - windowScrollTop - phoneHeight <= 0) {\n          $('.iphone-position').css('top', startIphonePosition + courseHeight + courseTop - windowScrollTop - phoneHeight);\n\n          $('.iphone').css('top', startIphonePosition + courseHeight + courseTop - windowScrollTop - phoneHeight + 120);\n        } else {\n          $('.iphone-position').css('top', startIphonePosition);\n          $('.iphone').css('top', startIphone);\n        }\n      });\n    }\n\n    if ($('.scroll-locker').html()) {\n\n      if ($('.scroll-locker').html()) {\n        common.lockTop();\n        $(window).on('resize', function () {\n          common.lockTop();\n        });\n        $(window).on('scroll', function () {\n          common.lockTop();\n        });\n      }\n\n      var execInProgress = false;\n\n      // why is this not $???\n      document.getElementById('scroll-locker').addEventListener('previewUpdateSpy', function (e) {\n        if (execInProgress) {\n          return null;\n        }\n        execInProgress = true;\n        return setTimeout(function () {\n          if ($($('.scroll-locker').children()[0]).height() - 800 > e.detail) {\n            $('.scroll-locker').scrollTop(e.detail);\n          } else {\n            var scrollTop = $($('.scroll-locker').children()[0]).height();\n\n            $('.scroll-locker').animate({ scrollTop: scrollTop }, 175);\n          }\n          execInProgress = false;\n        }, 750);\n      }, false);\n    }\n  });\n\n  return common;\n}(window);\n'use strict';\n\nwindow.common = function (_ref) {\n  var _ref$common = _ref.common,\n      common = _ref$common === undefined ? { init: [] } : _ref$common;\n\n  common.init.push(function ($) {\n    $('#report-issue').on('click', function () {\n      var textMessage = ['Challenge [', common.challengeName || window.location.pathname, '](', window.location.href, ') has an issue.\\n', 'User Agent is: <code>', navigator.userAgent, '</code>.\\n', 'Please describe how to reproduce this issue, and include ', 'links to screenshots if possible.\\n\\n'].join('');\n\n      if (common.editor && typeof common.editor.getValue === 'function' && common.editor.getValue().trim()) {\n        var type;\n        switch (common.challengeType) {\n          case common.challengeTypes.HTML:\n            type = 'html';\n            break;\n          case common.challengeTypes.JS:\n          case common.challengeTypes.BONFIRE:\n            type = 'javascript';\n            break;\n          default:\n            type = '';\n        }\n\n        textMessage += ['My code:\\n```', type, '\\n', common.editor.getValue(), '\\n```\\n\\n'].join('');\n      }\n\n      textMessage = encodeURIComponent(textMessage);\n\n      $('#issue-modal').modal('hide');\n      window.open('https://github.com/freecodecampchina/freecodecamp.cn/issues/new?&body=' + textMessage, '_blank');\n    });\n  });\n\n  return common;\n}(window);\n\"use strict\";\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nfunction _objectWithoutProperties(obj, keys) { var target = {}; for (var i in obj) { if (keys.indexOf(i) >= 0) continue; if (!Object.prototype.hasOwnProperty.call(obj, i)) continue; target[i] = obj[i]; } return target; }\n\nwindow.common = function (global) {\n  var Observable = global.Rx.Observable,\n      chai = global.chai,\n      _global$common = global.common,\n      common = _global$common === undefined ? { init: [] } : _global$common;\n\n\n  common.runTests$ = function runTests$(_ref) {\n    var code = _ref.code,\n        originalCode = _ref.originalCode,\n        userTests = _ref.userTests,\n        rest = _objectWithoutProperties(_ref, [\"code\", \"originalCode\", \"userTests\"]);\n\n    return Observable.from(userTests).map(function (test) {\n\n      /* eslint-disable no-unused-vars */\n      var assert = chai.assert;\n      var editor = {\n        getValue: function getValue() {\n          return originalCode;\n        }\n      };\n      /* eslint-enable no-unused-vars */\n\n      try {\n        if (test) {\n          /* eslint-disable no-eval  */\n          eval(common.reassembleTest(code, test));\n          /* eslint-enable no-eval */\n        }\n      } catch (e) {\n        test.err = e.message;\n      }\n\n      return test;\n    }).toArray().map(function (tests) {\n      return _extends({}, rest, { tests: tests });\n    });\n  };\n\n  return common;\n}(window);\n'use strict';\n\nwindow.common = function (global) {\n  var $ = global.$,\n      moment = global.moment,\n      _global$ga = global.ga,\n      ga = _global$ga === undefined ? function () {} : _global$ga,\n      _global$common = global.common,\n      common = _global$common === undefined ? { init: [] } : _global$common;\n\n\n  function submitChallengeHandler(e) {\n    e.preventDefault();\n\n    var solution = common.editor.getValue();\n\n    $('#submit-challenge').attr('disabled', 'true').removeClass('btn-primary').addClass('btn-warning disabled');\n\n    var $checkmarkContainer = $('#checkmark-container');\n    $checkmarkContainer.css({ height: $checkmarkContainer.innerHeight() });\n\n    $('#challenge-checkmark').addClass('zoomOutUp')\n    // .removeClass('zoomInDown')\n    .delay(1000).queue(function (next) {\n      $(this).replaceWith('<div id=\"challenge-spinner\" ' + 'class=\"animated zoomInUp inner-circles-loader\">' + 'submitting...</div>');\n      next();\n    });\n\n    var timezone = 'UTC';\n    try {\n      timezone = moment.tz.guess();\n    } catch (err) {\n      err.message = '\\n          known bug, see: https://github.com/moment/moment-timezone/issues/294:\\n          ' + err.message + '\\n        ';\n      console.error(err);\n    }\n    var data = JSON.stringify({\n      id: common.challengeId,\n      name: common.challengeName,\n      challengeType: +common.challengeType,\n      solution: solution,\n      timezone: timezone\n    });\n\n    $.ajax({\n      url: '/completed-challenge/',\n      type: 'POST',\n      data: data,\n      contentType: 'application/json',\n      dataType: 'json'\n    }).success(function (res) {\n      if (res) {\n        window.location = '/challenges/next-challenge?id=' + common.challengeId;\n      }\n    }).fail(function () {\n      window.location.replace(window.location.href);\n    });\n  }\n\n  common.showCompletion = function showCompletion() {\n\n    ga('send', 'event', 'Challenge', 'solved', common.gaName, true);\n\n    $('#complete-courseware-dialog').modal('show');\n    $('#complete-courseware-dialog .modal-header').click();\n\n    $('#submit-challenge').off('click');\n    $('#submit-challenge').on('click', submitChallengeHandler);\n  };\n\n  return common;\n}(window);\n'use strict';\n\nwindow.common = function (_ref) {\n  var $ = _ref.$,\n      _ref$common = _ref.common,\n      common = _ref$common === undefined ? { init: [] } : _ref$common;\n\n  var stepClass = '.challenge-step';\n  var prevBtnClass = '.challenge-step-btn-prev';\n  var nextBtnClass = '.challenge-step-btn-next';\n  var actionBtnClass = '.challenge-step-btn-action';\n  var finishBtnClass = '.challenge-step-btn-finish';\n  var submitBtnId = '#challenge-step-btn-submit';\n  var submitModalId = '#challenge-step-modal';\n\n  function getPreviousStep($challengeSteps) {\n    var $prevStep = false;\n    var prevStepIndex = 0;\n    $challengeSteps.each(function (index) {\n      var $step = $(this);\n      if (!$step.hasClass('hidden')) {\n        prevStepIndex = index - 1;\n      }\n    });\n\n    $prevStep = $challengeSteps[prevStepIndex];\n\n    return $prevStep;\n  }\n\n  function getNextStep($challengeSteps) {\n    var length = $challengeSteps.length;\n    var $nextStep = false;\n    var nextStepIndex = 0;\n    $challengeSteps.each(function (index) {\n      var $step = $(this);\n      if (!$step.hasClass('hidden') && index + 1 !== length) {\n        nextStepIndex = index + 1;\n      }\n    });\n\n    $nextStep = $challengeSteps[nextStepIndex];\n\n    return $nextStep;\n  }\n\n  function handlePrevStepClick(e) {\n    e.preventDefault();\n    var prevStep = getPreviousStep($(stepClass));\n    $(this).parent().parent().removeClass('slideInLeft slideInRight').addClass('animated fadeOutRight fast-animation').delay(250).queue(function (prev) {\n      $(this).addClass('hidden');\n      if (prevStep) {\n        $(prevStep).removeClass('hidden').removeClass('fadeOutLeft fadeOutRight').addClass('animated slideInLeft fast-animation').delay(500).queue(function (prev) {\n          prev();\n        });\n      }\n      prev();\n    });\n  }\n\n  function handleNextStepClick(e) {\n    e.preventDefault();\n    var nextStep = getNextStep($(stepClass));\n    $(this).parent().parent().removeClass('slideInRight slideInLeft').addClass('animated fadeOutLeft fast-animation').delay(250).queue(function (next) {\n      $(this).addClass('hidden');\n      if (nextStep) {\n        $(nextStep).removeClass('hidden').removeClass('fadeOutRight fadeOutLeft').addClass('animated slideInRight fast-animation').delay(500).queue(function (next) {\n          next();\n        });\n      }\n      next();\n    });\n  }\n\n  function handleActionClick(e) {\n    var props = common.challengeSeed[0] || { stepIndex: [] };\n\n    var $el = $(this);\n    var index = +$el.attr('id');\n    var propIndex = props.stepIndex.indexOf(index);\n\n    if (propIndex === -1) {\n      return $el.parent().find('.disabled').removeClass('disabled');\n    }\n\n    // an API action\n    // prevent link from opening\n    e.preventDefault();\n    var prop = props.properties[propIndex];\n    var api = props.apis[propIndex];\n    if (common[prop]) {\n      return $el.parent().find('.disabled').removeClass('disabled');\n    }\n    return $.post(api).done(function (data) {\n      // assume a boolean indicates passing\n      if (typeof data === 'boolean') {\n        return $el.parent().find('.disabled').removeClass('disabled');\n      }\n      // assume api returns string when fails\n      return $el.parent().find('.disabled').replaceWith('<p>' + data + '</p>');\n    }).fail(function () {\n      console.log('failed');\n    });\n  }\n\n  function handleFinishClick(e) {\n    e.preventDefault();\n    $(submitModalId).modal('show');\n    $(submitModalId + '.modal-header').click();\n    $(submitBtnId).click(handleSubmitClick);\n  }\n\n  function handleSubmitClick(e) {\n    e.preventDefault();\n\n    $('#submit-challenge').attr('disabled', 'true').removeClass('btn-primary').addClass('btn-warning disabled');\n\n    var $checkmarkContainer = $('#checkmark-container');\n    $checkmarkContainer.css({ height: $checkmarkContainer.innerHeight() });\n\n    $('#challenge-checkmark').addClass('zoomOutUp').delay(1000).queue(function (next) {\n      $(this).replaceWith('<div id=\"challenge-spinner\" ' + 'class=\"animated zoomInUp inner-circles-loader\">' + 'submitting...</div>');\n      next();\n    });\n\n    $.ajax({\n      url: '/completed-challenge/',\n      type: 'POST',\n      data: JSON.stringify({\n        id: common.challengeId,\n        name: common.challengeName,\n        challengeType: +common.challengeType\n      }),\n      contentType: 'application/json',\n      dataType: 'json'\n    }).success(function (res) {\n      if (res) {\n        window.location = '/challenges/next-challenge?id=' + common.challengeId;\n      }\n    }).fail(function () {\n      window.location.replace(window.location.href);\n    });\n  }\n\n  common.init.push(function ($) {\n    if (common.challengeType !== '7') {\n      return null;\n    }\n\n    $(prevBtnClass).click(handlePrevStepClick);\n    $(nextBtnClass).click(handleNextStepClick);\n    $(actionBtnClass).click(handleActionClick);\n    $(finishBtnClass).click(handleFinishClick);\n    return null;\n  });\n\n  return common;\n}(window);\n'use strict';\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nfunction _objectWithoutProperties(obj, keys) { var target = {}; for (var i in obj) { if (keys.indexOf(i) >= 0) continue; if (!Object.prototype.hasOwnProperty.call(obj, i)) continue; target[i] = obj[i]; } return target; }\n\n$(document).ready(function () {\n  var common = window.common;\n  var Observable = window.Rx.Observable;\n  var addLoopProtect = common.addLoopProtect,\n      challengeName = common.challengeName,\n      challengeType = common.challengeType,\n      challengeTypes = common.challengeTypes;\n\n\n  common.init.forEach(function (init) {\n    init($);\n  });\n\n  // only run if editor present\n  if (common.editor.getValue) {\n    var code$ = common.editorKeyUp$.debounce(750).map(function () {\n      return common.editor.getValue();\n    }).distinctUntilChanged().shareReplay();\n\n    // update storage\n    code$.subscribe(function (code) {\n      common.codeStorage.updateStorage(common.challengeName, code);\n      common.codeUri.querify(code);\n    }, function (err) {\n      return console.error(err);\n    });\n\n    code$\n    // only run for HTML\n    .filter(function () {\n      return common.challengeType === challengeTypes.HTML;\n    }).flatMap(function (code) {\n      return common.detectUnsafeCode$(code).map(function () {\n        var combinedCode = common.head + code + common.tail;\n\n        return addLoopProtect(combinedCode);\n      }).flatMap(function (code) {\n        return common.updatePreview$(code);\n      }).flatMap(function () {\n        return common.checkPreview$({ code: code });\n      }).catch(function (err) {\n        return Observable.just({ err: err });\n      });\n    }).subscribe(function (_ref) {\n      var err = _ref.err;\n\n      if (err) {\n        console.error(err);\n        return common.updatePreview$('\\n              <h1>' + err + '</h1>\\n            ').subscribe(function () {});\n      }\n      return null;\n    }, function (err) {\n      return console.error(err);\n    });\n  }\n\n  common.resetBtn$.doOnNext(function () {\n    common.editor.setValue(common.replaceSafeTags(common.seed));\n  }).flatMap(function () {\n    return common.executeChallenge$().catch(function (err) {\n      return Observable.just({ err: err });\n    });\n  }).subscribe(function (_ref2) {\n    var err = _ref2.err,\n        output = _ref2.output,\n        originalCode = _ref2.originalCode;\n\n    if (err) {\n      console.error(err);\n      return common.updateOutputDisplay('' + err);\n    }\n    common.codeStorage.updateStorage(challengeName, originalCode);\n    common.codeUri.querify(originalCode);\n    common.updateOutputDisplay(output);\n    return null;\n  }, function (err) {\n    if (err) {\n      console.error(err);\n    }\n    common.updateOutputDisplay('' + err);\n  });\n\n  Observable.merge(common.editorExecute$, common.submitBtn$).flatMap(function () {\n    common.appendToOutputDisplay('\\n// testing challenge...');\n    return common.executeChallenge$().map(function (_ref3) {\n      var tests = _ref3.tests,\n          rest = _objectWithoutProperties(_ref3, ['tests']);\n\n      var solved = tests.every(function (test) {\n        return !test.err;\n      });\n      return _extends({}, rest, { tests: tests, solved: solved });\n    }).catch(function (err) {\n      return Observable.just({ err: err });\n    });\n  }).subscribe(function (_ref4) {\n    var err = _ref4.err,\n        solved = _ref4.solved,\n        output = _ref4.output,\n        tests = _ref4.tests;\n\n    if (err) {\n      console.error(err);\n      if (common.challengeType === common.challengeTypes.HTML) {\n        return common.updatePreview$('\\n              <h1>' + err + '</h1>\\n            ').first().subscribe(function () {});\n      }\n      return common.updateOutputDisplay('' + err);\n    }\n    common.updateOutputDisplay(output);\n    common.displayTestResults(tests);\n    if (solved) {\n      common.showCompletion();\n    }\n    return null;\n  }, function (_ref5) {\n    var err = _ref5.err;\n\n    console.error(err);\n    common.updateOutputDisplay('' + err);\n  });\n\n  // initial challenge run to populate tests\n  if (challengeType === challengeTypes.HTML) {\n    var $preview = $('#preview');\n    return Observable.fromCallback($preview.ready, $preview)().delay(500).flatMap(function () {\n      return common.executeChallenge$();\n    }).catch(function (err) {\n      return Observable.just({ err: err });\n    }).subscribe(function (_ref6) {\n      var err = _ref6.err,\n          tests = _ref6.tests;\n\n      if (err) {\n        console.error(err);\n        if (common.challengeType === common.challengeTypes.HTML) {\n          return common.updatePreview$('\\n                <h1>' + err + '</h1>\\n              ').subscribe(function () {});\n        }\n        return common.updateOutputDisplay('' + err);\n      }\n      common.displayTestResults(tests);\n      return null;\n    }, function (_ref7) {\n      var err = _ref7.err;\n\n      console.error(err);\n    });\n  }\n\n  if (challengeType === challengeTypes.BONFIRE || challengeType === challengeTypes.JS) {\n    return Observable.just({}).delay(500).flatMap(function () {\n      return common.executeChallenge$();\n    }).catch(function (err) {\n      return Observable.just({ err: err });\n    }).subscribe(function (_ref8) {\n      var err = _ref8.err,\n          originalCode = _ref8.originalCode,\n          tests = _ref8.tests;\n\n      if (err) {\n        console.error(err);\n        return common.updateOutputDisplay('' + err);\n      }\n      common.codeStorage.updateStorage(challengeName, originalCode);\n      common.displayTestResults(tests);\n      return null;\n    }, function (err) {\n      console.error(err);\n      common.updateOutputDisplay('' + err);\n    });\n  }\n  return null;\n});\n//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImluaXQuanMiLCJiaW5kaW5ncy5qcyIsImNvZGUtc3RvcmFnZS5qcyIsImNvZGUtdXJpLmpzIiwiYWRkLWxvb3AtcHJvdGVjdC5qcyIsImdldC1pZnJhbWUuanMiLCJ1cGRhdGUtcHJldmlldy5qcyIsImNyZWF0ZS1lZGl0b3IuanMiLCJkZXRlY3QtdW5zYWZlLWNvZGUtc3RyZWFtLmpzIiwiZGlzcGxheS10ZXN0LXJlc3VsdHMuanMiLCJleGVjdXRlLWNoYWxsZW5nZS1zdHJlYW0uanMiLCJvdXRwdXQtZGlzcGxheS5qcyIsInBob25lLXNjcm9sbC1sb2NrLmpzIiwicmVwb3J0LWlzc3VlLmpzIiwicnVuLXRlc3RzLXN0cmVhbS5qcyIsInNob3ctY29tcGxldGlvbi5qcyIsInN0ZXAtY2hhbGxlbmdlLmpzIiwiZW5kLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQ3ZIQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQzNLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUNsREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQzVIQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUNwQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQ3pCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FDaEVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FDdEdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FDdkNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FDM0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUNwREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUNoREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQzlGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUNuQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FDL0NBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUN0RUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQzdKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsImZpbGUiOiJjb21tb25GcmFtZXdvcmsuanMiLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbndpbmRvdy5jb21tb24gPSBmdW5jdGlvbiAoZ2xvYmFsKSB7XG4gIC8vIGNvbW1vbiBuYW1lc3BhY2VcbiAgLy8gYWxsIGNsYXNzZXMgc2hvdWxkIGJlIHN0b3JlZCBoZXJlXG4gIC8vIGNhbGxlZCBhdCB0aGUgYmVnaW5uaW5nIG9mIGRvbSByZWFkeVxuICB2YXIgX2dsb2JhbCRSeCA9IGdsb2JhbC5SeCxcbiAgICAgIERpc3Bvc2FibGUgPSBfZ2xvYmFsJFJ4LkRpc3Bvc2FibGUsXG4gICAgICBPYnNlcnZhYmxlID0gX2dsb2JhbCRSeC5PYnNlcnZhYmxlLFxuICAgICAgY29uZmlnID0gX2dsb2JhbCRSeC5jb25maWcsXG4gICAgICBfZ2xvYmFsJGNvbW1vbiA9IGdsb2JhbC5jb21tb24sXG4gICAgICBjb21tb24gPSBfZ2xvYmFsJGNvbW1vbiA9PT0gdW5kZWZpbmVkID8geyBpbml0OiBbXSB9IDogX2dsb2JhbCRjb21tb247XG5cblxuICBjb25maWcubG9uZ1N0YWNrU3VwcG9ydCA9IHRydWU7XG4gIGNvbW1vbi5oZWFkID0gY29tbW9uLmhlYWQgfHwgW107XG4gIGNvbW1vbi50YWlsID0gY29tbW9uLnRhaWwgfHwgW107XG4gIGNvbW1vbi5zYWx0ID0gTWF0aC5yYW5kb20oKTtcblxuICBjb21tb24uY2hhbGxlbmdlVHlwZXMgPSB7XG4gICAgSFRNTDogJzAnLFxuICAgIEpTOiAnMScsXG4gICAgVklERU86ICcyJyxcbiAgICBaSVBMSU5FOiAnMycsXG4gICAgQkFTRUpVTVA6ICc0JyxcbiAgICBCT05GSVJFOiAnNScsXG4gICAgSElLRVM6ICc2JyxcbiAgICBTVEVQOiAnNydcbiAgfTtcblxuICBjb21tb24uYXJyYXlUb05ld0xpbmVTdHJpbmcgPSBmdW5jdGlvbiBhcnJheVRvTmV3TGluZVN0cmluZyhzZWVkRGF0YSkge1xuICAgIHNlZWREYXRhID0gQXJyYXkuaXNBcnJheShzZWVkRGF0YSkgPyBzZWVkRGF0YSA6IFtzZWVkRGF0YV07XG4gICAgcmV0dXJuIHNlZWREYXRhLnJlZHVjZShmdW5jdGlvbiAoc2VlZCwgbGluZSkge1xuICAgICAgcmV0dXJuICcnICsgc2VlZCArIGxpbmUgKyAnXFxuJztcbiAgICB9LCAnJyk7XG4gIH07XG5cbiAgY29tbW9uLnNlZWQgPSBjb21tb24uYXJyYXlUb05ld0xpbmVTdHJpbmcoY29tbW9uLmNoYWxsZW5nZVNlZWQpO1xuXG4gIGNvbW1vbi5yZXBsYWNlU2NyaXB0VGFncyA9IGZ1bmN0aW9uIHJlcGxhY2VTY3JpcHRUYWdzKHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlLnJlcGxhY2UoLzxzY3JpcHQ+L2dpLCAnZmNjc3MnKS5yZXBsYWNlKC88XFwvc2NyaXB0Pi9naSwgJ2ZjY2VzJyk7XG4gIH07XG5cbiAgY29tbW9uLnJlcGxhY2VTYWZlVGFncyA9IGZ1bmN0aW9uIHJlcGxhY2VTYWZlVGFncyh2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZS5yZXBsYWNlKC9mY2Nzcy9naSwgJzxzY3JpcHQ+JykucmVwbGFjZSgvZmNjZXMvZ2ksICc8L3NjcmlwdD4nKTtcbiAgfTtcblxuICBjb21tb24ucmVwbGFjZUZvcm1BY3Rpb25BdHRyID0gZnVuY3Rpb24gcmVwbGFjZUZvcm1BY3Rpb24odmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWUucmVwbGFjZSgvPGZvcm1bXj5dKj4vLCBmdW5jdGlvbiAodmFsKSB7XG4gICAgICByZXR1cm4gdmFsLnJlcGxhY2UoL2FjdGlvbihcXHMqPyk9LywgJ2ZjY2ZhYSQxPScpO1xuICAgIH0pO1xuICB9O1xuXG4gIGNvbW1vbi5yZXBsYWNlRmNjZmFhQXR0ciA9IGZ1bmN0aW9uIHJlcGxhY2VGY2NmYWFBdHRyKHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlLnJlcGxhY2UoLzxmb3JtW14+XSo+LywgZnVuY3Rpb24gKHZhbCkge1xuICAgICAgcmV0dXJuIHZhbC5yZXBsYWNlKC9mY2NmYWEoXFxzKj8pPS8sICdhY3Rpb24kMT0nKTtcbiAgICB9KTtcbiAgfTtcblxuICBjb21tb24uc2NvcGVqUXVlcnkgPSBmdW5jdGlvbiBzY29wZWpRdWVyeShzdHIpIHtcbiAgICByZXR1cm4gc3RyLnJlcGxhY2UoL1xcJC9naSwgJ2okJykucmVwbGFjZSgvZG9jdW1lbnQvZ2ksICdqZG9jdW1lbnQnKS5yZXBsYWNlKC9qUXVlcnkvZ2ksICdqalF1ZXJ5Jyk7XG4gIH07XG5cbiAgY29tbW9uLnVuU2NvcGVKUXVlcnkgPSBmdW5jdGlvbiB1blNjb3BlSlF1ZXJ5KHN0cikge1xuICAgIHJldHVybiBzdHIucmVwbGFjZSgvalxcJC9naSwgJyQnKS5yZXBsYWNlKC9qZG9jdW1lbnQvZ2ksICdkb2N1bWVudCcpLnJlcGxhY2UoL2pqUXVlcnkvZ2ksICdqUXVlcnknKTtcbiAgfTtcblxuICB2YXIgY29tbWVudFJlZ2V4ID0gLyhcXC9cXCpbXihcXCpcXC8pXSpcXCpcXC8pfChbIFxcbl1cXC9cXC9bXlxcbl0qKS9nO1xuICBjb21tb24ucmVtb3ZlQ29tbWVudHMgPSBmdW5jdGlvbiByZW1vdmVDb21tZW50cyhzdHIpIHtcbiAgICByZXR1cm4gc3RyLnJlcGxhY2UoY29tbWVudFJlZ2V4LCAnJyk7XG4gIH07XG5cbiAgdmFyIGxvZ1JlZ2V4ID0gLyhjb25zb2xlXFwuW1xcd10rXFxzKlxcKC4qXFw7KS9nO1xuICBjb21tb24ucmVtb3ZlTG9ncyA9IGZ1bmN0aW9uIHJlbW92ZUxvZ3Moc3RyKSB7XG4gICAgcmV0dXJuIHN0ci5yZXBsYWNlKGxvZ1JlZ2V4LCAnJyk7XG4gIH07XG5cbiAgY29tbW9uLnJlYXNzZW1ibGVUZXN0ID0gZnVuY3Rpb24gcmVhc3NlbWJsZVRlc3QoKSB7XG4gICAgdmFyIGNvZGUgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6ICcnO1xuICAgIHZhciBfcmVmID0gYXJndW1lbnRzWzFdO1xuICAgIHZhciBsaW5lID0gX3JlZi5saW5lLFxuICAgICAgICB0ZXh0ID0gX3JlZi50ZXh0O1xuXG4gICAgdmFyIHJlZ2V4cCA9IG5ldyBSZWdFeHAoJy8vJyArIGxpbmUgKyBjb21tb24uc2FsdCk7XG4gICAgcmV0dXJuIGNvZGUucmVwbGFjZShyZWdleHAsIHRleHQpO1xuICB9O1xuXG4gIGNvbW1vbi5nZXRTY3JpcHRDb250ZW50JCA9IGZ1bmN0aW9uIGdldFNjcmlwdENvbnRlbnQkKHNjcmlwdCkge1xuICAgIHJldHVybiBPYnNlcnZhYmxlLmNyZWF0ZShmdW5jdGlvbiAob2JzZXJ2ZXIpIHtcbiAgICAgIHZhciBqcVhIUiA9ICQuZ2V0KHNjcmlwdCwgbnVsbCwgbnVsbCwgJ3RleHQnKS5zdWNjZXNzKGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICAgIG9ic2VydmVyLm9uTmV4dChkYXRhKTtcbiAgICAgICAgb2JzZXJ2ZXIub25Db21wbGV0ZWQoKTtcbiAgICAgIH0pLmZhaWwoZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgcmV0dXJuIG9ic2VydmVyLm9uRXJyb3IoZSk7XG4gICAgICB9KS5hbHdheXMoZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gb2JzZXJ2ZXIub25Db21wbGV0ZWQoKTtcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gbmV3IERpc3Bvc2FibGUoZnVuY3Rpb24gKCkge1xuICAgICAgICBqcVhIUi5hYm9ydCgpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH07XG5cbiAgdmFyIG9wZW5TY3JpcHQgPSAvXFw8XFxzP3NjcmlwdFxccz9cXD4vZ2k7XG4gIHZhciBjbG9zaW5nU2NyaXB0ID0gL1xcPFxccz9cXC9cXHM/c2NyaXB0XFxzP1xcPi9naTtcblxuICAvLyBkZXRlY3RzIGlmIHRoZXJlIGlzIEphdmFTY3JpcHQgaW4gdGhlIGZpcnN0IHNjcmlwdCB0YWdcbiAgY29tbW9uLmhhc0pzID0gZnVuY3Rpb24gaGFzSnMoY29kZSkge1xuICAgIHJldHVybiAhIWNvbW1vbi5nZXRKc0Zyb21IdG1sKGNvZGUpO1xuICB9O1xuXG4gIC8vIGdyYWJzIHRoZSBjb250ZW50IGZyb20gdGhlIGZpcnN0IHNjcmlwdCB0YWcgaW4gdGhlIGNvZGVcbiAgY29tbW9uLmdldEpzRnJvbUh0bWwgPSBmdW5jdGlvbiBnZXRKc0Zyb21IdG1sKGNvZGUpIHtcbiAgICAvLyBncmFiIHVzZXIgamF2YVNjcmlwdFxuICAgIHJldHVybiAoY29kZS5zcGxpdChvcGVuU2NyaXB0KVsxXSB8fCAnJykuc3BsaXQoY2xvc2luZ1NjcmlwdClbMF0gfHwgJyc7XG4gIH07XG5cbiAgcmV0dXJuIGNvbW1vbjtcbn0od2luZG93KTsiLCIndXNlIHN0cmljdCc7XG5cbndpbmRvdy5jb21tb24gPSBmdW5jdGlvbiAoZ2xvYmFsKSB7XG4gIHZhciAkID0gZ2xvYmFsLiQsXG4gICAgICBPYnNlcnZhYmxlID0gZ2xvYmFsLlJ4Lk9ic2VydmFibGUsXG4gICAgICBfZ2xvYmFsJGNvbW1vbiA9IGdsb2JhbC5jb21tb24sXG4gICAgICBjb21tb24gPSBfZ2xvYmFsJGNvbW1vbiA9PT0gdW5kZWZpbmVkID8geyBpbml0OiBbXSB9IDogX2dsb2JhbCRjb21tb247XG5cblxuICBjb21tb24uY3RybEVudGVyQ2xpY2tIYW5kbGVyID0gZnVuY3Rpb24gY3RybEVudGVyQ2xpY2tIYW5kbGVyKGUpIHtcbiAgICAvLyBjdHJsICsgZW50ZXIgb3IgY21kICsgZW50ZXJcbiAgICBpZiAoZS5rZXlDb2RlID09PSAxMyAmJiAoZS5tZXRhS2V5IHx8IGUuY3RybEtleSkpIHtcbiAgICAgICQoJyNjb21wbGV0ZS1jb3Vyc2V3YXJlLWRpYWxvZycpLm9mZigna2V5ZG93bicsIGN0cmxFbnRlckNsaWNrSGFuZGxlcik7XG4gICAgICBpZiAoJCgnI3N1Ym1pdC1jaGFsbGVuZ2UnKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICQoJyNzdWJtaXQtY2hhbGxlbmdlJykuY2xpY2soKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHdpbmRvdy5sb2NhdGlvbiA9ICcvY2hhbGxlbmdlcy9uZXh0LWNoYWxsZW5nZT9pZD0nICsgY29tbW9uLmNoYWxsZW5nZUlkO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICBjb21tb24uaW5pdC5wdXNoKGZ1bmN0aW9uICgkKSB7XG5cbiAgICB2YXIgJG1hcmdpbkZpeCA9ICQoJy5pbm5lck1hcmdpbkZpeCcpO1xuICAgICRtYXJnaW5GaXguY3NzKCdtaW4taGVpZ2h0JywgJG1hcmdpbkZpeC5oZWlnaHQoKSk7XG5cbiAgICBjb21tb24uc3VibWl0QnRuJCA9IE9ic2VydmFibGUuZnJvbUV2ZW50KCQoJyNzdWJtaXRCdXR0b24nKSwgJ2NsaWNrJyk7XG5cbiAgICBjb21tb24ucmVzZXRCdG4kID0gT2JzZXJ2YWJsZS5mcm9tRXZlbnQoJCgnI3Jlc2V0LWJ1dHRvbicpLCAnY2xpY2snKTtcblxuICAgIC8vIGluaXQgbW9kYWwga2V5YmluZGluZ3Mgb24gb3BlblxuICAgICQoJyNjb21wbGV0ZS1jb3Vyc2V3YXJlLWRpYWxvZycpLm9uKCdzaG93bi5icy5tb2RhbCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICQoJyNjb21wbGV0ZS1jb3Vyc2V3YXJlLWRpYWxvZycpLmtleWRvd24oY29tbW9uLmN0cmxFbnRlckNsaWNrSGFuZGxlcik7XG4gICAgfSk7XG5cbiAgICAvLyByZW1vdmUgbW9kYWwga2V5YmluZHMgb24gY2xvc2VcbiAgICAkKCcjY29tcGxldGUtY291cnNld2FyZS1kaWFsb2cnKS5vbignaGlkZGVuLmJzLm1vZGFsJywgZnVuY3Rpb24gKCkge1xuICAgICAgJCgnI2NvbXBsZXRlLWNvdXJzZXdhcmUtZGlhbG9nJykub2ZmKCdrZXlkb3duJywgY29tbW9uLmN0cmxFbnRlckNsaWNrSGFuZGxlcik7XG4gICAgfSk7XG5cbiAgICAvLyB2aWRlbyBjaGVja2xpc3QgYmluZGluZ1xuICAgICQoJy5jaGFsbGVuZ2UtbGlzdC1jaGVja2JveCcpLm9uKCdjaGFuZ2UnLCBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgY2hlY2tib3hJZCA9ICQodGhpcykucGFyZW50KCkucGFyZW50KCkuYXR0cignaWQnKTtcbiAgICAgIGlmICgkKHRoaXMpLmlzKCc6Y2hlY2tlZCcpKSB7XG4gICAgICAgICQodGhpcykucGFyZW50KCkuc2libGluZ3MoKS5jaGlsZHJlbigpLmFkZENsYXNzKCdmYWRlZCcpO1xuICAgICAgICBpZiAoIWxvY2FsU3RvcmFnZSB8fCAhbG9jYWxTdG9yYWdlW2NoZWNrYm94SWRdKSB7XG4gICAgICAgICAgbG9jYWxTdG9yYWdlW2NoZWNrYm94SWRdID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoISQodGhpcykuaXMoJzpjaGVja2VkJykpIHtcbiAgICAgICAgJCh0aGlzKS5wYXJlbnQoKS5zaWJsaW5ncygpLmNoaWxkcmVuKCkucmVtb3ZlQ2xhc3MoJ2ZhZGVkJyk7XG4gICAgICAgIGlmIChsb2NhbFN0b3JhZ2VbY2hlY2tib3hJZF0pIHtcbiAgICAgICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShjaGVja2JveElkKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuXG4gICAgJCgnLmNoZWNrbGlzdC1lbGVtZW50JykuZWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgY2hlY2tsaXN0RWxlbWVudElkID0gJCh0aGlzKS5hdHRyKCdpZCcpO1xuICAgICAgaWYgKGxvY2FsU3RvcmFnZVtjaGVja2xpc3RFbGVtZW50SWRdKSB7XG4gICAgICAgICQodGhpcykuY2hpbGRyZW4oKS5jaGlsZHJlbignbGknKS5hZGRDbGFzcygnZmFkZWQnKTtcbiAgICAgICAgJCh0aGlzKS5jaGlsZHJlbigpLmNoaWxkcmVuKCdpbnB1dCcpLnRyaWdnZXIoJ2NsaWNrJyk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyB2aWRlbyBjaGFsbGVuZ2Ugc3VibWl0XG4gICAgJCgnI25leHQtY291cnNld2FyZS1idXR0b24nKS5vbignY2xpY2snLCBmdW5jdGlvbiAoKSB7XG4gICAgICAkKCcjbmV4dC1jb3Vyc2V3YXJlLWJ1dHRvbicpLnVuYmluZCgnY2xpY2snKTtcbiAgICAgIGlmICgkKCcuc2lnbnVwLWJ0bi1uYXYnKS5sZW5ndGggPCAxKSB7XG4gICAgICAgIHZhciBkYXRhO1xuICAgICAgICB2YXIgc29sdXRpb24gPSAkKCcjcHVibGljLXVybCcpLnZhbCgpIHx8IG51bGw7XG4gICAgICAgIHZhciBnaXRodWJMaW5rID0gJCgnI2dpdGh1Yi11cmwnKS52YWwoKSB8fCBudWxsO1xuICAgICAgICBzd2l0Y2ggKGNvbW1vbi5jaGFsbGVuZ2VUeXBlKSB7XG4gICAgICAgICAgY2FzZSBjb21tb24uY2hhbGxlbmdlVHlwZXMuVklERU86XG4gICAgICAgICAgICBkYXRhID0ge1xuICAgICAgICAgICAgICBpZDogY29tbW9uLmNoYWxsZW5nZUlkLFxuICAgICAgICAgICAgICBuYW1lOiBjb21tb24uY2hhbGxlbmdlTmFtZSxcbiAgICAgICAgICAgICAgY2hhbGxlbmdlVHlwZTogK2NvbW1vbi5jaGFsbGVuZ2VUeXBlXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgJC5hamF4KHtcbiAgICAgICAgICAgICAgdXJsOiAnL2NvbXBsZXRlZC1jaGFsbGVuZ2UvJyxcbiAgICAgICAgICAgICAgdHlwZTogJ1BPU1QnLFxuICAgICAgICAgICAgICBkYXRhOiBKU09OLnN0cmluZ2lmeShkYXRhKSxcbiAgICAgICAgICAgICAgY29udGVudFR5cGU6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgICAgICAgZGF0YVR5cGU6ICdqc29uJ1xuICAgICAgICAgICAgfSkuc3VjY2VzcyhmdW5jdGlvbiAocmVzKSB7XG4gICAgICAgICAgICAgIGlmICghcmVzKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gJy9jaGFsbGVuZ2VzL25leHQtY2hhbGxlbmdlP2lkPScgKyBjb21tb24uY2hhbGxlbmdlSWQ7XG4gICAgICAgICAgICB9KS5mYWlsKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLnJlcGxhY2Uod2luZG93LmxvY2F0aW9uLmhyZWYpO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgY29tbW9uLmNoYWxsZW5nZVR5cGVzLkJBU0VKVU1QOlxuICAgICAgICAgIGNhc2UgY29tbW9uLmNoYWxsZW5nZVR5cGVzLlpJUExJTkU6XG4gICAgICAgICAgICBkYXRhID0ge1xuICAgICAgICAgICAgICBpZDogY29tbW9uLmNoYWxsZW5nZUlkLFxuICAgICAgICAgICAgICBuYW1lOiBjb21tb24uY2hhbGxlbmdlTmFtZSxcbiAgICAgICAgICAgICAgY2hhbGxlbmdlVHlwZTogK2NvbW1vbi5jaGFsbGVuZ2VUeXBlLFxuICAgICAgICAgICAgICBzb2x1dGlvbjogc29sdXRpb24sXG4gICAgICAgICAgICAgIGdpdGh1Ykxpbms6IGdpdGh1YkxpbmtcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICQuYWpheCh7XG4gICAgICAgICAgICAgIHVybDogJy9jb21wbGV0ZWQtemlwbGluZS1vci1iYXNlanVtcC8nLFxuICAgICAgICAgICAgICB0eXBlOiAnUE9TVCcsXG4gICAgICAgICAgICAgIGRhdGE6IEpTT04uc3RyaW5naWZ5KGRhdGEpLFxuICAgICAgICAgICAgICBjb250ZW50VHlwZTogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICAgICAgICBkYXRhVHlwZTogJ2pzb24nXG4gICAgICAgICAgICB9KS5zdWNjZXNzKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSAnL2NoYWxsZW5nZXMvbmV4dC1jaGFsbGVuZ2U/aWQ9JyArIGNvbW1vbi5jaGFsbGVuZ2VJZDtcbiAgICAgICAgICAgIH0pLmZhaWwoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICB3aW5kb3cubG9jYXRpb24ucmVwbGFjZSh3aW5kb3cubG9jYXRpb24uaHJlZik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgY2FzZSBjb21tb24uY2hhbGxlbmdlVHlwZXMuQk9ORklSRTpcbiAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gJy9jaGFsbGVuZ2VzL25leHQtY2hhbGxlbmdlP2lkPScgKyBjb21tb24uY2hhbGxlbmdlSWQ7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnSGFwcHkgQ29kaW5nIScpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGlmIChjb21tb24uY2hhbGxlbmdlTmFtZSkge1xuICAgICAgd2luZG93LmdhKCdzZW5kJywgJ2V2ZW50JywgJ0NoYWxsZW5nZScsICdsb2FkJywgY29tbW9uLmdhTmFtZSk7XG4gICAgfVxuXG4gICAgJCgnI2NvbXBsZXRlLWNvdXJzZXdhcmUtZGlhbG9nJykub24oJ2hpZGRlbi5icy5tb2RhbCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmIChjb21tb24uZWRpdG9yLmZvY3VzKSB7XG4gICAgICAgIGNvbW1vbi5lZGl0b3IuZm9jdXMoKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgICQoJyN0cmlnZ2VyLWlzc3VlLW1vZGFsJykub24oJ2NsaWNrJywgZnVuY3Rpb24gKCkge1xuICAgICAgJCgnI2lzc3VlLW1vZGFsJykubW9kYWwoJ3Nob3cnKTtcbiAgICB9KTtcblxuICAgICQoJyN0cmlnZ2VyLWhlbHAtbW9kYWwnKS5vbignY2xpY2snLCBmdW5jdGlvbiAoKSB7XG4gICAgICAkKCcjaGVscC1tb2RhbCcpLm1vZGFsKCdzaG93Jyk7XG4gICAgfSk7XG5cbiAgICAkKCcjdHJpZ2dlci1yZXNldC1tb2RhbCcpLm9uKCdjbGljaycsIGZ1bmN0aW9uICgpIHtcbiAgICAgICQoJyNyZXNldC1tb2RhbCcpLm1vZGFsKCdzaG93Jyk7XG4gICAgfSk7XG5cbiAgICAkKCcjdHJpZ2dlci1wYWlyLW1vZGFsJykub24oJ2NsaWNrJywgZnVuY3Rpb24gKCkge1xuICAgICAgJCgnI3BhaXItbW9kYWwnKS5tb2RhbCgnc2hvdycpO1xuICAgIH0pO1xuXG4gICAgJCgnI2NvbXBsZXRlZC1jb3Vyc2V3YXJlJykub24oJ2NsaWNrJywgZnVuY3Rpb24gKCkge1xuICAgICAgJCgnI2NvbXBsZXRlLWNvdXJzZXdhcmUtZGlhbG9nJykubW9kYWwoJ3Nob3cnKTtcbiAgICB9KTtcblxuICAgICQoJyNoZWxwLWl2ZS1mb3VuZC1hLWJ1Zy13aWtpLWFydGljbGUnKS5vbignY2xpY2snLCBmdW5jdGlvbiAoKSB7XG4gICAgICB3aW5kb3cub3BlbignaHR0cHM6Ly9naXRodWIuY29tL2ZyZWVjb2RlY2FtcGNoaW5hL2ZyZWVjb2RlY2FtcC5jbi93aWtpLycgKyBcIkhlbHAtSSd2ZS1Gb3VuZC1hLUJ1Z1wiLCAnX2JsYW5rJyk7XG4gICAgfSk7XG5cbiAgICAkKCcjc2VhcmNoLWlzc3VlJykub24oJ2NsaWNrJywgZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIHF1ZXJ5SXNzdWUgPSB3aW5kb3cubG9jYXRpb24uaHJlZi50b1N0cmluZygpLnNwbGl0KCc/JylbMF0ucmVwbGFjZSgvKCMqKSQvLCAnJyk7XG4gICAgICB3aW5kb3cub3BlbignaHR0cHM6Ly9naXRodWIuY29tL2ZyZWVjb2RlY2FtcGNoaW5hL2ZyZWVjb2RlY2FtcC5jbi9pc3N1ZXM/cT0nICsgJ2lzOmlzc3VlIGlzOmFsbCAnICsgY29tbW9uLmNoYWxsZW5nZU5hbWUgKyAnIE9SICcgKyBxdWVyeUlzc3VlLnN1YnN0cihxdWVyeUlzc3VlLmxhc3RJbmRleE9mKCdjaGFsbGVuZ2VzLycpICsgMTEpLnJlcGxhY2UoJy8nLCAnJyksICdfYmxhbmsnKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgcmV0dXJuIGNvbW1vbjtcbn0od2luZG93KTsiLCIndXNlIHN0cmljdCc7XG5cbi8vIGRlcGVuZHMgb246IGNvZGVVcmlcbndpbmRvdy5jb21tb24gPSBmdW5jdGlvbiAoZ2xvYmFsKSB7XG4gIHZhciBsb2NhbFN0b3JhZ2UgPSBnbG9iYWwubG9jYWxTdG9yYWdlLFxuICAgICAgX2dsb2JhbCRjb21tb24gPSBnbG9iYWwuY29tbW9uLFxuICAgICAgY29tbW9uID0gX2dsb2JhbCRjb21tb24gPT09IHVuZGVmaW5lZCA/IHsgaW5pdDogW10gfSA6IF9nbG9iYWwkY29tbW9uO1xuXG5cbiAgdmFyIGNoYWxsZW5nZVByZWZpeCA9IFsnQm9uZmlyZTogJywgJ1dheXBvaW50OiAnLCAnWmlwbGluZTogJywgJ0Jhc2VqdW1wOiAnLCAnQ2hlY2twb2ludDogJ10sXG4gICAgICBpdGVtO1xuXG4gIHZhciBjb2RlU3RvcmFnZSA9IHtcbiAgICBnZXRTdG9yZWRWYWx1ZTogZnVuY3Rpb24gZ2V0U3RvcmVkVmFsdWUoa2V5KSB7XG4gICAgICBpZiAoIWxvY2FsU3RvcmFnZSB8fCB0eXBlb2YgbG9jYWxTdG9yYWdlLmdldEl0ZW0gIT09ICdmdW5jdGlvbicgfHwgIWtleSB8fCB0eXBlb2Yga2V5ICE9PSAnc3RyaW5nJykge1xuICAgICAgICBjb25zb2xlLmxvZygndW5hYmxlIHRvIHJlYWQgZnJvbSBzdG9yYWdlJyk7XG4gICAgICAgIHJldHVybiAnJztcbiAgICAgIH1cbiAgICAgIGlmIChsb2NhbFN0b3JhZ2UuZ2V0SXRlbShrZXkgKyAnVmFsJykpIHtcbiAgICAgICAgcmV0dXJuICcnICsgbG9jYWxTdG9yYWdlLmdldEl0ZW0oa2V5ICsgJ1ZhbCcpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPD0gY2hhbGxlbmdlUHJlZml4Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgaXRlbSA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKGNoYWxsZW5nZVByZWZpeFtpXSArIGtleSArICdWYWwnKTtcbiAgICAgICAgICBpZiAoaXRlbSkge1xuICAgICAgICAgICAgcmV0dXJuICcnICsgaXRlbTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH0sXG5cblxuICAgIGlzQWxpdmU6IGZ1bmN0aW9uIGlzQWxpdmUoa2V5KSB7XG4gICAgICB2YXIgdmFsID0gdGhpcy5nZXRTdG9yZWRWYWx1ZShrZXkpO1xuICAgICAgcmV0dXJuIHZhbCAhPT0gJ251bGwnICYmIHZhbCAhPT0gJ3VuZGVmaW5lZCcgJiYgdmFsICYmIHZhbC5sZW5ndGggPiAwO1xuICAgIH0sXG5cbiAgICB1cGRhdGVTdG9yYWdlOiBmdW5jdGlvbiB1cGRhdGVTdG9yYWdlKGtleSwgY29kZSkge1xuICAgICAgaWYgKCFsb2NhbFN0b3JhZ2UgfHwgdHlwZW9mIGxvY2FsU3RvcmFnZS5zZXRJdGVtICE9PSAnZnVuY3Rpb24nIHx8ICFrZXkgfHwgdHlwZW9mIGtleSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgY29uc29sZS5sb2coJ3VuYWJsZSB0byBzYXZlIHRvIHN0b3JhZ2UnKTtcbiAgICAgICAgcmV0dXJuIGNvZGU7XG4gICAgICB9XG4gICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShrZXkgKyAnVmFsJywgY29kZSk7XG4gICAgICByZXR1cm4gY29kZTtcbiAgICB9XG4gIH07XG5cbiAgY29tbW9uLmNvZGVTdG9yYWdlID0gY29kZVN0b3JhZ2U7XG5cbiAgcmV0dXJuIGNvbW1vbjtcbn0od2luZG93LCB3aW5kb3cuY29tbW9uKTsiLCIndXNlIHN0cmljdCc7XG5cbi8vIHN0b3JlIGNvZGUgaW4gdGhlIFVSTFxud2luZG93LmNvbW1vbiA9IGZ1bmN0aW9uIChnbG9iYWwpIHtcbiAgdmFyIF9lbmNvZGUgPSBnbG9iYWwuZW5jb2RlVVJJQ29tcG9uZW50LFxuICAgICAgX2RlY29kZSA9IGdsb2JhbC5kZWNvZGVVUklDb21wb25lbnQsXG4gICAgICBsb2NhdGlvbiA9IGdsb2JhbC5sb2NhdGlvbixcbiAgICAgIGhpc3RvcnkgPSBnbG9iYWwuaGlzdG9yeSxcbiAgICAgIF9nbG9iYWwkY29tbW9uID0gZ2xvYmFsLmNvbW1vbixcbiAgICAgIGNvbW1vbiA9IF9nbG9iYWwkY29tbW9uID09PSB1bmRlZmluZWQgPyB7IGluaXQ6IFtdIH0gOiBfZ2xvYmFsJGNvbW1vbjtcbiAgdmFyIHJlcGxhY2VTY3JpcHRUYWdzID0gY29tbW9uLnJlcGxhY2VTY3JpcHRUYWdzLFxuICAgICAgcmVwbGFjZVNhZmVUYWdzID0gY29tbW9uLnJlcGxhY2VTYWZlVGFncyxcbiAgICAgIHJlcGxhY2VGb3JtQWN0aW9uQXR0ciA9IGNvbW1vbi5yZXBsYWNlRm9ybUFjdGlvbkF0dHIsXG4gICAgICByZXBsYWNlRmNjZmFhQXR0ciA9IGNvbW1vbi5yZXBsYWNlRmNjZmFhQXR0cjtcblxuXG4gIHZhciBxdWVyeVJlZ2V4ID0gL14oXFw/fCNcXD8pLztcbiAgZnVuY3Rpb24gZW5jb2RlRmNjKHZhbCkge1xuICAgIHJldHVybiByZXBsYWNlU2NyaXB0VGFncyhyZXBsYWNlRm9ybUFjdGlvbkF0dHIodmFsKSk7XG4gIH1cblxuICBmdW5jdGlvbiBkZWNvZGVGY2ModmFsKSB7XG4gICAgcmV0dXJuIHJlcGxhY2VTYWZlVGFncyhyZXBsYWNlRmNjZmFhQXR0cih2YWwpKTtcbiAgfVxuXG4gIHZhciBjb2RlVXJpID0ge1xuICAgIGVuY29kZTogZnVuY3Rpb24gZW5jb2RlKGNvZGUpIHtcbiAgICAgIHJldHVybiBfZW5jb2RlKGNvZGUpO1xuICAgIH0sXG4gICAgZGVjb2RlOiBmdW5jdGlvbiBkZWNvZGUoY29kZSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIF9kZWNvZGUoY29kZSk7XG4gICAgICB9IGNhdGNoIChpZ25vcmUpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgfSxcbiAgICBpc0luUXVlcnk6IGZ1bmN0aW9uIGlzSW5RdWVyeShxdWVyeSkge1xuICAgICAgdmFyIGRlY29kZWQgPSBjb2RlVXJpLmRlY29kZShxdWVyeSk7XG4gICAgICBpZiAoIWRlY29kZWQgfHwgdHlwZW9mIGRlY29kZWQuc3BsaXQgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGRlY29kZWQucmVwbGFjZShxdWVyeVJlZ2V4LCAnJykuc3BsaXQoJyYnKS5yZWR1Y2UoZnVuY3Rpb24gKGZvdW5kLCBwYXJhbSkge1xuICAgICAgICB2YXIga2V5ID0gcGFyYW0uc3BsaXQoJz0nKVswXTtcbiAgICAgICAgaWYgKGtleSA9PT0gJ3NvbHV0aW9uJykge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmb3VuZDtcbiAgICAgIH0sIGZhbHNlKTtcbiAgICB9LFxuICAgIGlzQWxpdmU6IGZ1bmN0aW9uIGlzQWxpdmUoKSB7XG4gICAgICByZXR1cm4gY29kZVVyaS5lbmFibGVkICYmIGNvZGVVcmkuaXNJblF1ZXJ5KGxvY2F0aW9uLnNlYXJjaCkgfHwgY29kZVVyaS5pc0luUXVlcnkobG9jYXRpb24uaGFzaCk7XG4gICAgfSxcbiAgICBnZXRLZXlJblF1ZXJ5OiBmdW5jdGlvbiBnZXRLZXlJblF1ZXJ5KHF1ZXJ5KSB7XG4gICAgICB2YXIga2V5VG9GaW5kID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiAnJztcblxuICAgICAgcmV0dXJuIHF1ZXJ5LnNwbGl0KCcmJykucmVkdWNlKGZ1bmN0aW9uIChvbGRWYWx1ZSwgcGFyYW0pIHtcbiAgICAgICAgdmFyIGtleSA9IHBhcmFtLnNwbGl0KCc9JylbMF07XG4gICAgICAgIHZhciB2YWx1ZSA9IHBhcmFtLnNwbGl0KCc9Jykuc2xpY2UoMSkuam9pbignPScpO1xuXG4gICAgICAgIGlmIChrZXkgPT09IGtleVRvRmluZCkge1xuICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb2xkVmFsdWU7XG4gICAgICB9LCBudWxsKTtcbiAgICB9LFxuICAgIGdldFNvbHV0aW9uRnJvbVF1ZXJ5OiBmdW5jdGlvbiBnZXRTb2x1dGlvbkZyb21RdWVyeSgpIHtcbiAgICAgIHZhciBxdWVyeSA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogJyc7XG5cbiAgICAgIHJldHVybiBkZWNvZGVGY2MoY29kZVVyaS5kZWNvZGUoY29kZVVyaS5nZXRLZXlJblF1ZXJ5KHF1ZXJ5LCAnc29sdXRpb24nKSkpO1xuICAgIH0sXG5cbiAgICBwYXJzZTogZnVuY3Rpb24gcGFyc2UoKSB7XG4gICAgICBpZiAoIWNvZGVVcmkuZW5hYmxlZCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICAgIHZhciBxdWVyeTtcbiAgICAgIGlmIChsb2NhdGlvbi5zZWFyY2ggJiYgY29kZVVyaS5pc0luUXVlcnkobG9jYXRpb24uc2VhcmNoKSkge1xuICAgICAgICBxdWVyeSA9IGxvY2F0aW9uLnNlYXJjaC5yZXBsYWNlKC9eXFw/LywgJycpO1xuXG4gICAgICAgIGlmIChoaXN0b3J5ICYmIHR5cGVvZiBoaXN0b3J5LnJlcGxhY2VTdGF0ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIGhpc3RvcnkucmVwbGFjZVN0YXRlKGhpc3Rvcnkuc3RhdGUsIG51bGwsIGxvY2F0aW9uLmhyZWYuc3BsaXQoJz8nKVswXSk7XG4gICAgICAgICAgbG9jYXRpb24uaGFzaCA9ICcjPycgKyBlbmNvZGVGY2MocXVlcnkpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBxdWVyeSA9IGxvY2F0aW9uLmhhc2gucmVwbGFjZSgvXlxcI1xcPy8sICcnKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFxdWVyeSkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXMuZ2V0U29sdXRpb25Gcm9tUXVlcnkocXVlcnkpO1xuICAgIH0sXG4gICAgcXVlcmlmeTogZnVuY3Rpb24gcXVlcmlmeShzb2x1dGlvbikge1xuICAgICAgaWYgKCFjb2RlVXJpLmVuYWJsZWQpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgICBpZiAoaGlzdG9yeSAmJiB0eXBlb2YgaGlzdG9yeS5yZXBsYWNlU3RhdGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgLy8gZ3JhYiB0aGUgdXJsIHVwIHRvIHRoZSBxdWVyeVxuICAgICAgICAvLyBkZXN0cm95IGFueSBoYXNoIHN5bWJvbHMgc3RpbGwgY2xpbmdpbmcgdG8gbGlmZVxuICAgICAgICB2YXIgdXJsID0gbG9jYXRpb24uaHJlZi5zcGxpdCgnPycpWzBdLnJlcGxhY2UoLygjKikkLywgJycpO1xuICAgICAgICBoaXN0b3J5LnJlcGxhY2VTdGF0ZShoaXN0b3J5LnN0YXRlLCBudWxsLCB1cmwgKyAnIz8nICsgKGNvZGVVcmkuc2hvdWxkUnVuKCkgPyAnJyA6ICdydW49ZGlzYWJsZWQmJykgKyAnc29sdXRpb249JyArIGNvZGVVcmkuZW5jb2RlKGVuY29kZUZjYyhzb2x1dGlvbikpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxvY2F0aW9uLmhhc2ggPSAnP3NvbHV0aW9uPScgKyBjb2RlVXJpLmVuY29kZShlbmNvZGVGY2Moc29sdXRpb24pKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHNvbHV0aW9uO1xuICAgIH0sXG4gICAgZW5hYmxlZDogdHJ1ZSxcbiAgICBzaG91bGRSdW46IGZ1bmN0aW9uIHNob3VsZFJ1bigpIHtcbiAgICAgIHJldHVybiAhdGhpcy5nZXRLZXlJblF1ZXJ5KChsb2NhdGlvbi5zZWFyY2ggfHwgbG9jYXRpb24uaGFzaCkucmVwbGFjZShxdWVyeVJlZ2V4LCAnJyksICdydW4nKTtcbiAgICB9XG4gIH07XG5cbiAgY29tbW9uLmluaXQucHVzaChmdW5jdGlvbiAoKSB7XG4gICAgY29kZVVyaS5wYXJzZSgpO1xuICB9KTtcblxuICBjb21tb24uY29kZVVyaSA9IGNvZGVVcmk7XG4gIGNvbW1vbi5zaG91bGRSdW4gPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGNvZGVVcmkuc2hvdWxkUnVuKCk7XG4gIH07XG5cbiAgcmV0dXJuIGNvbW1vbjtcbn0od2luZG93KTsiLCIndXNlIHN0cmljdCc7XG5cbndpbmRvdy5jb21tb24gPSBmdW5jdGlvbiAoZ2xvYmFsKSB7XG4gIHZhciBsb29wUHJvdGVjdCA9IGdsb2JhbC5sb29wUHJvdGVjdCxcbiAgICAgIF9nbG9iYWwkY29tbW9uID0gZ2xvYmFsLmNvbW1vbixcbiAgICAgIGNvbW1vbiA9IF9nbG9iYWwkY29tbW9uID09PSB1bmRlZmluZWQgPyB7IGluaXQ6IFtdIH0gOiBfZ2xvYmFsJGNvbW1vbjtcblxuXG4gIGxvb3BQcm90ZWN0LmhpdCA9IGZ1bmN0aW9uIGhpdChsaW5lKSB7XG4gICAgdmFyIGVyciA9ICdFcnJvcjogRXhpdGluZyBwb3RlbnRpYWwgaW5maW5pdGUgbG9vcCBhdCBsaW5lICcgKyBsaW5lICsgJy4gVG8gZGlzYWJsZSBsb29wIHByb3RlY3Rpb24sIHdyaXRlOiBcXG5cXFxcL1xcXFwvIG5vcHJvdGVjdFxcbmFzIHRoZSBmaXJzdCcgKyAnbGluZS4gQmV3YXJlIHRoYXQgaWYgeW91IGRvIGhhdmUgYW4gaW5maW5pdGUgbG9vcCBpbiB5b3VyIGNvZGUnICsgJ3RoaXMgd2lsbCBjcmFzaCB5b3VyIGJyb3dzZXIuJztcbiAgICBjb25zb2xlLmVycm9yKGVycik7XG4gIH07XG5cbiAgY29tbW9uLmFkZExvb3BQcm90ZWN0ID0gZnVuY3Rpb24gYWRkTG9vcFByb3RlY3QoKSB7XG4gICAgdmFyIGNvZGUgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6ICcnO1xuXG4gICAgcmV0dXJuIGxvb3BQcm90ZWN0KGNvZGUpO1xuICB9O1xuXG4gIHJldHVybiBjb21tb247XG59KHdpbmRvdyk7IiwiJ3VzZSBzdHJpY3QnO1xuXG53aW5kb3cuY29tbW9uID0gZnVuY3Rpb24gKGdsb2JhbCkge1xuICB2YXIgX2dsb2JhbCRjb21tb24gPSBnbG9iYWwuY29tbW9uLFxuICAgICAgY29tbW9uID0gX2dsb2JhbCRjb21tb24gPT09IHVuZGVmaW5lZCA/IHsgaW5pdDogW10gfSA6IF9nbG9iYWwkY29tbW9uLFxuICAgICAgZG9jID0gZ2xvYmFsLmRvY3VtZW50O1xuXG5cbiAgY29tbW9uLmdldElmcmFtZSA9IGZ1bmN0aW9uIGdldElmcmFtZSgpIHtcbiAgICB2YXIgaWQgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6ICdwcmV2aWV3JztcblxuICAgIHZhciBwcmV2aWV3RnJhbWUgPSBkb2MuZ2V0RWxlbWVudEJ5SWQoaWQpO1xuXG4gICAgLy8gY3JlYXRlIGFuZCBhcHBlbmQgYSBoaWRkZW4gcHJldmlldyBmcmFtZVxuICAgIGlmICghcHJldmlld0ZyYW1lKSB7XG4gICAgICBwcmV2aWV3RnJhbWUgPSBkb2MuY3JlYXRlRWxlbWVudCgnaWZyYW1lJyk7XG4gICAgICBwcmV2aWV3RnJhbWUuaWQgPSBpZDtcbiAgICAgIHByZXZpZXdGcmFtZS5zZXRBdHRyaWJ1dGUoJ3N0eWxlJywgJ2Rpc3BsYXk6IG5vbmUnKTtcbiAgICAgIGRvYy5ib2R5LmFwcGVuZENoaWxkKHByZXZpZXdGcmFtZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHByZXZpZXdGcmFtZS5jb250ZW50RG9jdW1lbnQgfHwgcHJldmlld0ZyYW1lLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQ7XG4gIH07XG5cbiAgcmV0dXJuIGNvbW1vbjtcbn0od2luZG93KTsiLCIndXNlIHN0cmljdCc7XG5cbndpbmRvdy5jb21tb24gPSBmdW5jdGlvbiAoZ2xvYmFsKSB7XG4gIHZhciBfZ2xvYmFsJFJ4ID0gZ2xvYmFsLlJ4LFxuICAgICAgQmVoYXZpb3JTdWJqZWN0ID0gX2dsb2JhbCRSeC5CZWhhdmlvclN1YmplY3QsXG4gICAgICBPYnNlcnZhYmxlID0gX2dsb2JhbCRSeC5PYnNlcnZhYmxlLFxuICAgICAgX2dsb2JhbCRjb21tb24gPSBnbG9iYWwuY29tbW9uLFxuICAgICAgY29tbW9uID0gX2dsb2JhbCRjb21tb24gPT09IHVuZGVmaW5lZCA/IHsgaW5pdDogW10gfSA6IF9nbG9iYWwkY29tbW9uO1xuXG4gIC8vIHRoZSBmaXJzdCBzY3JpcHQgdGFnIGhlcmUgaXMgdG8gcHJveHkgalF1ZXJ5XG4gIC8vIFdlIHVzZSB0aGUgc2FtZSBqUXVlcnkgb24gdGhlIG1haW4gd2luZG93IGJ1dCB3ZSBjaGFuZ2UgdGhlXG4gIC8vIGNvbnRleHQgdG8gdGhhdCBvZiB0aGUgaWZyYW1lLlxuXG4gIHZhciBsaWJyYXJ5SW5jbHVkZXMgPSAnXFxuPHNjcmlwdD5cXG4gIHdpbmRvdy5sb29wUHJvdGVjdCA9IHBhcmVudC5sb29wUHJvdGVjdDtcXG4gIHdpbmRvdy5fX2VyciA9IG51bGw7XFxuICB3aW5kb3cubG9vcFByb3RlY3QuaGl0ID0gZnVuY3Rpb24obGluZSkge1xcbiAgICB3aW5kb3cuX19lcnIgPSBuZXcgRXJyb3IoXFxuICAgICAgXFwnUG90ZW50aWFsIGluZmluaXRlIGxvb3AgYXQgbGluZSBcXCcgK1xcbiAgICAgIGxpbmUgK1xcbiAgICAgIFxcJy4gVG8gZGlzYWJsZSBsb29wIHByb3RlY3Rpb24sIHdyaXRlOlxcJyArXFxuICAgICAgXFwnIFxcXFxuXFxcXC9cXFxcLyBub3Byb3RlY3RcXFxcbmFzIHRoZSBmaXJzdFxcJyArXFxuICAgICAgXFwnIGxpbmUuIEJld2FyZSB0aGF0IGlmIHlvdSBkbyBoYXZlIGFuIGluZmluaXRlIGxvb3AgaW4geW91ciBjb2RlXFwnICtcXG4gICAgICBcXCcgdGhpcyB3aWxsIGNyYXNoIHlvdXIgYnJvd3Nlci5cXCdcXG4gICAgKTtcXG4gIH07XFxuPC9zY3JpcHQ+XFxuPGxpbmtcXG4gIHJlbD1cXCdzdHlsZXNoZWV0XFwnXFxuICBocmVmPVxcJy8vY2RuLmJvb3Rjc3MuY29tL2FuaW1hdGUuY3NzLzMuMi4wL2FuaW1hdGUubWluLmNzc1xcJ1xcbiAgLz5cXG48bGlua1xcbiAgcmVsPVxcJ3N0eWxlc2hlZXRcXCdcXG4gIGhyZWY9XFwnLy9jZG4uYm9vdGNzcy5jb20vYm9vdHN0cmFwLzMuMy4xL2Nzcy9ib290c3RyYXAubWluLmNzc1xcJ1xcbiAgLz5cXG5cXG48bGlua1xcbiAgcmVsPVxcJ3N0eWxlc2hlZXRcXCdcXG4gIGhyZWY9XFwnLy9jZG4uYm9vdGNzcy5jb20vZm9udC1hd2Vzb21lLzQuMi4wL2Nzcy9mb250LWF3ZXNvbWUubWluLmNzc1xcJ1xcbiAgLz5cXG48c3R5bGU+XFxuICBib2R5IHsgcGFkZGluZzogMHB4IDNweCAwcHggM3B4OyB9XFxuPC9zdHlsZT5cXG4gICc7XG4gIHZhciBjb2RlRGlzYWJsZWRFcnJvciA9ICdcXG4gICAgPHNjcmlwdD5cXG4gICAgICB3aW5kb3cuX19lcnIgPSBuZXcgRXJyb3IoXFwnY29kZSBoYXMgYmVlbiBkaXNhYmxlZFxcJyk7XFxuICAgIDwvc2NyaXB0PlxcbiAgJztcblxuICB2YXIgaUZyYW1lU2NyaXB0JCA9IGNvbW1vbi5nZXRTY3JpcHRDb250ZW50JCgnL2pzL2lGcmFtZVNjcmlwdHMuanMnKS5zaGFyZVJlcGxheSgpO1xuICB2YXIgalF1ZXJ5U2NyaXB0JCA9IGNvbW1vbi5nZXRTY3JpcHRDb250ZW50JCgnL2Jvd2VyX2NvbXBvbmVudHMvanF1ZXJ5L2Rpc3QvanF1ZXJ5LmpzJykuc2hhcmVSZXBsYXkoKTtcblxuICAvLyBiZWhhdmlvciBzdWJqZWN0IGFsbHdheXMgcmVtZW1iZXJzIHRoZSBsYXN0IHZhbHVlXG4gIC8vIHdlIHVzZSB0aGlzIHRvIGRldGVybWluZSBpZiBydW5QcmV2aWV3VGVzdCQgaXMgZGVmaW5lZFxuICAvLyBhbmQgcHJpbWUgaXQgd2l0aCBmYWxzZVxuICBjb21tb24ucHJldmlld1JlYWR5JCA9IG5ldyBCZWhhdmlvclN1YmplY3QoZmFsc2UpO1xuXG4gIC8vIFRoZXNlIHNob3VsZCBiZSBzZXQgdXAgaW4gdGhlIHByZXZpZXcgd2luZG93XG4gIC8vIGlmIHRoaXMgZXJyb3IgaXMgc2VlbiBpdCBpcyBiZWNhdXNlIHRoZSBmdW5jdGlvbiB0cmllZCB0byBydW5cbiAgLy8gYmVmb3JlIHRoZSBpZnJhbWUgaGFzIGNvbXBsZXRlbHkgbG9hZGVkXG4gIGNvbW1vbi5ydW5QcmV2aWV3VGVzdHMkID0gY29tbW9uLmNoZWNrUHJldmlldyQgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIE9ic2VydmFibGUudGhyb3cobmV3IEVycm9yKCdQcmV2aWV3IG5vdCBmdWxseSBsb2FkZWQnKSk7XG4gIH07XG5cbiAgY29tbW9uLnVwZGF0ZVByZXZpZXckID0gZnVuY3Rpb24gdXBkYXRlUHJldmlldyQoKSB7XG4gICAgdmFyIGNvZGUgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6ICcnO1xuXG4gICAgdmFyIHByZXZpZXcgPSBjb21tb24uZ2V0SWZyYW1lKCdwcmV2aWV3Jyk7XG5cbiAgICByZXR1cm4gT2JzZXJ2YWJsZS5jb21iaW5lTGF0ZXN0KGlGcmFtZVNjcmlwdCQsIGpRdWVyeVNjcmlwdCQsIGZ1bmN0aW9uIChpZnJhbWUsIGpRdWVyeSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgaWZyYW1lU2NyaXB0OiAnPHNjcmlwdD4nICsgaWZyYW1lICsgJzwvc2NyaXB0PicsXG4gICAgICAgIGpRdWVyeTogJzxzY3JpcHQ+JyArIGpRdWVyeSArICc8L3NjcmlwdD4nXG4gICAgICB9O1xuICAgIH0pLmZpcnN0KCkuZmxhdE1hcChmdW5jdGlvbiAoX3JlZikge1xuICAgICAgdmFyIGlmcmFtZVNjcmlwdCA9IF9yZWYuaWZyYW1lU2NyaXB0LFxuICAgICAgICAgIGpRdWVyeSA9IF9yZWYualF1ZXJ5O1xuXG4gICAgICAvLyB3ZSBtYWtlIHN1cmUgdG8gb3ZlcnJpZGUgdGhlIGxhc3QgdmFsdWUgaW4gdGhlXG4gICAgICAvLyBzdWJqZWN0IHRvIGZhbHNlIGhlcmUuXG4gICAgICBjb21tb24ucHJldmlld1JlYWR5JC5vbk5leHQoZmFsc2UpO1xuICAgICAgcHJldmlldy5vcGVuKCk7XG4gICAgICBwcmV2aWV3LndyaXRlKGxpYnJhcnlJbmNsdWRlcyArIGpRdWVyeSArIChjb21tb24uc2hvdWxkUnVuKCkgPyBjb2RlIDogY29kZURpc2FibGVkRXJyb3IpICsgJzwhLS0gLS0+JyArIGlmcmFtZVNjcmlwdCk7XG4gICAgICBwcmV2aWV3LmNsb3NlKCk7XG4gICAgICAvLyBub3cgd2UgZmlsdGVyIGZhbHNlIHZhbHVlcyBhbmQgd2FpdCBmb3IgdGhlIGZpcnN0IHRydWVcbiAgICAgIHJldHVybiBjb21tb24ucHJldmlld1JlYWR5JC5maWx0ZXIoZnVuY3Rpb24gKHJlYWR5KSB7XG4gICAgICAgIHJldHVybiByZWFkeTtcbiAgICAgIH0pLmZpcnN0KClcbiAgICAgIC8vIHRoZSBkZWxheSBoZXJlIGlzIHRvIGdpdmUgY29kZSB3aXRoaW4gdGhlIGlmcmFtZVxuICAgICAgLy8gY29udHJvbCB0byBydW5cbiAgICAgIC5kZWxheSg0MDApO1xuICAgIH0pLm1hcChmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gY29kZTtcbiAgICB9KTtcbiAgfTtcblxuICByZXR1cm4gY29tbW9uO1xufSh3aW5kb3cpOyIsIid1c2Ugc3RyaWN0Jztcblxud2luZG93LmNvbW1vbiA9IGZ1bmN0aW9uIChnbG9iYWwpIHtcbiAgdmFyIF9nbG9iYWwkUnggPSBnbG9iYWwuUngsXG4gICAgICBTdWJqZWN0ID0gX2dsb2JhbCRSeC5TdWJqZWN0LFxuICAgICAgT2JzZXJ2YWJsZSA9IF9nbG9iYWwkUnguT2JzZXJ2YWJsZSxcbiAgICAgIENvZGVNaXJyb3IgPSBnbG9iYWwuQ29kZU1pcnJvcixcbiAgICAgIGVtbWV0Q29kZU1pcnJvciA9IGdsb2JhbC5lbW1ldENvZGVNaXJyb3IsXG4gICAgICBfZ2xvYmFsJGNvbW1vbiA9IGdsb2JhbC5jb21tb24sXG4gICAgICBjb21tb24gPSBfZ2xvYmFsJGNvbW1vbiA9PT0gdW5kZWZpbmVkID8geyBpbml0OiBbXSB9IDogX2dsb2JhbCRjb21tb247XG4gIHZhciBfY29tbW9uJGNoYWxsZW5nZVR5cGUgPSBjb21tb24uY2hhbGxlbmdlVHlwZSxcbiAgICAgIGNoYWxsZW5nZVR5cGUgPSBfY29tbW9uJGNoYWxsZW5nZVR5cGUgPT09IHVuZGVmaW5lZCA/ICcwJyA6IF9jb21tb24kY2hhbGxlbmdlVHlwZSxcbiAgICAgIGNoYWxsZW5nZVR5cGVzID0gY29tbW9uLmNoYWxsZW5nZVR5cGVzO1xuXG5cbiAgaWYgKCFDb2RlTWlycm9yIHx8IGNoYWxsZW5nZVR5cGUgPT09IGNoYWxsZW5nZVR5cGVzLkJBU0VKVU1QIHx8IGNoYWxsZW5nZVR5cGUgPT09IGNoYWxsZW5nZVR5cGVzLlpJUExJTkUgfHwgY2hhbGxlbmdlVHlwZSA9PT0gY2hhbGxlbmdlVHlwZXMuVklERU8gfHwgY2hhbGxlbmdlVHlwZSA9PT0gY2hhbGxlbmdlVHlwZXMuU1RFUCB8fCBjaGFsbGVuZ2VUeXBlID09PSBjaGFsbGVuZ2VUeXBlcy5ISUtFUykge1xuICAgIGNvbW1vbi5lZGl0b3IgPSB7fTtcbiAgICByZXR1cm4gY29tbW9uO1xuICB9XG5cbiAgdmFyIGVkaXRvciA9IENvZGVNaXJyb3IuZnJvbVRleHRBcmVhKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb2RlRWRpdG9yJyksIHtcbiAgICBsaW50OiB0cnVlLFxuICAgIGxpbmVOdW1iZXJzOiB0cnVlLFxuICAgIG1vZGU6ICdqYXZhc2NyaXB0JyxcbiAgICB0aGVtZTogJ21vbm9rYWknLFxuICAgIHJ1bm5hYmxlOiB0cnVlLFxuICAgIG1hdGNoQnJhY2tldHM6IHRydWUsXG4gICAgYXV0b0Nsb3NlQnJhY2tldHM6IHRydWUsXG4gICAgc2Nyb2xsYmFyU3R5bGU6ICdudWxsJyxcbiAgICBsaW5lV3JhcHBpbmc6IHRydWUsXG4gICAgZ3V0dGVyczogWydDb2RlTWlycm9yLWxpbnQtbWFya2VycyddXG4gIH0pO1xuXG4gIGVkaXRvci5zZXRTaXplKCcxMDAlJywgJ2F1dG8nKTtcblxuICBjb21tb24uZWRpdG9yRXhlY3V0ZSQgPSBuZXcgU3ViamVjdCgpO1xuICBjb21tb24uZWRpdG9yS2V5VXAkID0gT2JzZXJ2YWJsZS5mcm9tRXZlbnRQYXR0ZXJuKGZ1bmN0aW9uIChoYW5kbGVyKSB7XG4gICAgcmV0dXJuIGVkaXRvci5vbigna2V5dXAnLCBoYW5kbGVyKTtcbiAgfSwgZnVuY3Rpb24gKGhhbmRsZXIpIHtcbiAgICByZXR1cm4gZWRpdG9yLm9mZigna2V5dXAnLCBoYW5kbGVyKTtcbiAgfSk7XG5cbiAgZWRpdG9yLnNldE9wdGlvbignZXh0cmFLZXlzJywge1xuICAgIFRhYjogZnVuY3Rpb24gVGFiKGNtKSB7XG4gICAgICBpZiAoY20uc29tZXRoaW5nU2VsZWN0ZWQoKSkge1xuICAgICAgICBjbS5pbmRlbnRTZWxlY3Rpb24oJ2FkZCcpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIHNwYWNlcyA9IEFycmF5KGNtLmdldE9wdGlvbignaW5kZW50VW5pdCcpICsgMSkuam9pbignICcpO1xuICAgICAgICBjbS5yZXBsYWNlU2VsZWN0aW9uKHNwYWNlcyk7XG4gICAgICB9XG4gICAgfSxcbiAgICAnU2hpZnQtVGFiJzogZnVuY3Rpb24gU2hpZnRUYWIoY20pIHtcbiAgICAgIGlmIChjbS5zb21ldGhpbmdTZWxlY3RlZCgpKSB7XG4gICAgICAgIGNtLmluZGVudFNlbGVjdGlvbignc3VidHJhY3QnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciBzcGFjZXMgPSBBcnJheShjbS5nZXRPcHRpb24oJ2luZGVudFVuaXQnKSArIDEpLmpvaW4oJyAnKTtcbiAgICAgICAgY20ucmVwbGFjZVNlbGVjdGlvbihzcGFjZXMpO1xuICAgICAgfVxuICAgIH0sXG4gICAgJ0N0cmwtRW50ZXInOiBmdW5jdGlvbiBDdHJsRW50ZXIoKSB7XG4gICAgICBjb21tb24uZWRpdG9yRXhlY3V0ZSQub25OZXh0KCk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSxcbiAgICAnQ21kLUVudGVyJzogZnVuY3Rpb24gQ21kRW50ZXIoKSB7XG4gICAgICBjb21tb24uZWRpdG9yRXhlY3V0ZSQub25OZXh0KCk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9KTtcblxuICB2YXIgaW5mbyA9IGVkaXRvci5nZXRTY3JvbGxJbmZvKCk7XG5cbiAgdmFyIGFmdGVyID0gZWRpdG9yLmNoYXJDb29yZHMoe1xuICAgIGxpbmU6IGVkaXRvci5nZXRDdXJzb3IoKS5saW5lICsgMSxcbiAgICBjaDogMFxuICB9LCAnbG9jYWwnKS50b3A7XG5cbiAgaWYgKGluZm8udG9wICsgaW5mby5jbGllbnRIZWlnaHQgPCBhZnRlcikge1xuICAgIGVkaXRvci5zY3JvbGxUbyhudWxsLCBhZnRlciAtIGluZm8uY2xpZW50SGVpZ2h0ICsgMyk7XG4gIH1cblxuICBpZiAoZW1tZXRDb2RlTWlycm9yKSB7XG4gICAgZW1tZXRDb2RlTWlycm9yKGVkaXRvciwge1xuICAgICAgJ0NtZC1FJzogJ2VtbWV0LmV4cGFuZF9hYmJyZXZpYXRpb24nLFxuICAgICAgVGFiOiAnZW1tZXQuZXhwYW5kX2FiYnJldmlhdGlvbl93aXRoX3RhYicsXG4gICAgICBFbnRlcjogJ2VtbWV0Lmluc2VydF9mb3JtYXR0ZWRfbGluZV9icmVha19vbmx5J1xuICAgIH0pO1xuICB9XG4gIGNvbW1vbi5pbml0LnB1c2goZnVuY3Rpb24gKCkge1xuICAgIHZhciBlZGl0b3JWYWx1ZSA9IHZvaWQgMDtcbiAgICBpZiAoY29tbW9uLmNvZGVVcmkuaXNBbGl2ZSgpKSB7XG4gICAgICBlZGl0b3JWYWx1ZSA9IGNvbW1vbi5jb2RlVXJpLnBhcnNlKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGVkaXRvclZhbHVlID0gY29tbW9uLmNvZGVTdG9yYWdlLmlzQWxpdmUoY29tbW9uLmNoYWxsZW5nZU5hbWUpID8gY29tbW9uLmNvZGVTdG9yYWdlLmdldFN0b3JlZFZhbHVlKGNvbW1vbi5jaGFsbGVuZ2VOYW1lKSA6IGNvbW1vbi5zZWVkO1xuICAgIH1cblxuICAgIGVkaXRvci5zZXRWYWx1ZShjb21tb24ucmVwbGFjZVNhZmVUYWdzKGVkaXRvclZhbHVlKSk7XG4gICAgZWRpdG9yLnJlZnJlc2goKTtcbiAgfSk7XG5cbiAgY29tbW9uLmVkaXRvciA9IGVkaXRvcjtcblxuICByZXR1cm4gY29tbW9uO1xufSh3aW5kb3cpOyIsIid1c2Ugc3RyaWN0Jztcblxud2luZG93LmNvbW1vbiA9IGZ1bmN0aW9uIChnbG9iYWwpIHtcbiAgdmFyIE9ic2VydmFibGUgPSBnbG9iYWwuUnguT2JzZXJ2YWJsZSxcbiAgICAgIF9nbG9iYWwkY29tbW9uID0gZ2xvYmFsLmNvbW1vbixcbiAgICAgIGNvbW1vbiA9IF9nbG9iYWwkY29tbW9uID09PSB1bmRlZmluZWQgPyB7IGluaXQ6IFtdIH0gOiBfZ2xvYmFsJGNvbW1vbjtcblxuXG4gIHZhciBkZXRlY3RGdW5jdGlvbkNhbGwgPSAvZnVuY3Rpb25cXHMqP1xcKHxmdW5jdGlvblxccytcXHcrXFxzKj9cXCgvZ2k7XG4gIHZhciBkZXRlY3RVbnNhZmVKUSA9IC9cXCRcXHMqP1xcKFxccyo/XFwkXFxzKj9cXCkvZ2k7XG4gIHZhciBkZXRlY3RVbnNhZmVDb25zb2xlQ2FsbCA9IC9pZlxcc1xcKG51bGxcXClcXHNjb25zb2xlXFwubG9nXFwoMVxcKTsvZ2k7XG5cbiAgY29tbW9uLmRldGVjdFVuc2FmZUNvZGUkID0gZnVuY3Rpb24gZGV0ZWN0VW5zYWZlQ29kZSQoY29kZSkge1xuICAgIHZhciBvcGVuaW5nQ29tbWVudHMgPSBjb2RlLm1hdGNoKC9cXC9cXCovZ2kpO1xuICAgIHZhciBjbG9zaW5nQ29tbWVudHMgPSBjb2RlLm1hdGNoKC9cXCpcXC8vZ2kpO1xuXG4gICAgLy8gY2hlY2tzIGlmIHRoZSBudW1iZXIgb2Ygb3BlbmluZyBjb21tZW50cygvKikgbWF0Y2hlcyB0aGUgbnVtYmVyIG9mXG4gICAgLy8gY2xvc2luZyBjb21tZW50cygqLylcbiAgICBpZiAob3BlbmluZ0NvbW1lbnRzICYmICghY2xvc2luZ0NvbW1lbnRzIHx8IG9wZW5pbmdDb21tZW50cy5sZW5ndGggPiBjbG9zaW5nQ29tbWVudHMubGVuZ3RoKSkge1xuXG4gICAgICByZXR1cm4gT2JzZXJ2YWJsZS50aHJvdyhuZXcgRXJyb3IoJ1N5bnRheEVycm9yOiBVbmZpbmlzaGVkIG11bHRpLWxpbmUgY29tbWVudCcpKTtcbiAgICB9XG5cbiAgICBpZiAoY29kZS5tYXRjaChkZXRlY3RVbnNhZmVKUSkpIHtcbiAgICAgIHJldHVybiBPYnNlcnZhYmxlLnRocm93KG5ldyBFcnJvcignVW5zYWZlICQoJCknKSk7XG4gICAgfVxuXG4gICAgaWYgKGNvZGUubWF0Y2goL2Z1bmN0aW9uL2cpICYmICFjb2RlLm1hdGNoKGRldGVjdEZ1bmN0aW9uQ2FsbCkpIHtcbiAgICAgIHJldHVybiBPYnNlcnZhYmxlLnRocm93KG5ldyBFcnJvcignU3ludGF4RXJyb3I6IFVuc2FmZSBvciB1bmZpbmlzaGVkIGZ1bmN0aW9uIGRlY2xhcmF0aW9uJykpO1xuICAgIH1cblxuICAgIGlmIChjb2RlLm1hdGNoKGRldGVjdFVuc2FmZUNvbnNvbGVDYWxsKSkge1xuICAgICAgcmV0dXJuIE9ic2VydmFibGUudGhyb3cobmV3IEVycm9yKCdJbnZhbGlkIGlmIChudWxsKSBjb25zb2xlLmxvZygxKTsgZGV0ZWN0ZWQnKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIE9ic2VydmFibGUuanVzdChjb2RlKTtcbiAgfTtcblxuICByZXR1cm4gY29tbW9uO1xufSh3aW5kb3cpOyIsIid1c2Ugc3RyaWN0Jztcblxud2luZG93LmNvbW1vbiA9IGZ1bmN0aW9uIChfcmVmKSB7XG4gIHZhciAkID0gX3JlZi4kLFxuICAgICAgX3JlZiRjb21tb24gPSBfcmVmLmNvbW1vbixcbiAgICAgIGNvbW1vbiA9IF9yZWYkY29tbW9uID09PSB1bmRlZmluZWQgPyB7IGluaXQ6IFtdIH0gOiBfcmVmJGNvbW1vbjtcblxuXG4gIGNvbW1vbi5kaXNwbGF5VGVzdFJlc3VsdHMgPSBmdW5jdGlvbiBkaXNwbGF5VGVzdFJlc3VsdHMoKSB7XG4gICAgdmFyIGRhdGEgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IFtdO1xuXG4gICAgJCgnI3Rlc3RTdWl0ZScpLmNoaWxkcmVuKCkucmVtb3ZlKCk7XG4gICAgZGF0YS5mb3JFYWNoKGZ1bmN0aW9uIChfcmVmMikge1xuICAgICAgdmFyIF9yZWYyJGVyciA9IF9yZWYyLmVycixcbiAgICAgICAgICBlcnIgPSBfcmVmMiRlcnIgPT09IHVuZGVmaW5lZCA/IGZhbHNlIDogX3JlZjIkZXJyLFxuICAgICAgICAgIF9yZWYyJHRleHQgPSBfcmVmMi50ZXh0LFxuICAgICAgICAgIHRleHQgPSBfcmVmMiR0ZXh0ID09PSB1bmRlZmluZWQgPyAnJyA6IF9yZWYyJHRleHQ7XG5cbiAgICAgIHZhciBpY29uQ2xhc3MgPSBlcnIgPyAnXCJpb24tY2xvc2UtY2lyY2xlZCBiaWctZXJyb3ItaWNvblwiJyA6ICdcImlvbi1jaGVja21hcmstY2lyY2xlZCBiaWctc3VjY2Vzcy1pY29uXCInO1xuXG4gICAgICAkKCc8ZGl2PjwvZGl2PicpLmh0bWwoJ1xcbiAgICAgICAgPGRpdiBjbGFzcz1cXCdyb3dcXCc+XFxuICAgICAgICAgIDxkaXYgY2xhc3M9XFwnY29sLXhzLTIgdGV4dC1jZW50ZXJcXCc+XFxuICAgICAgICAgICAgPGkgY2xhc3M9JyArIGljb25DbGFzcyArICc+PC9pPlxcbiAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgPGRpdiBjbGFzcz1cXCdjb2wteHMtMTAgdGVzdC1vdXRwdXRcXCc+XFxuICAgICAgICAgICAgJyArIHRleHQuc3BsaXQoJ21lc3NhZ2U6ICcpLnBvcCgpLnJlcGxhY2UoL1xcJ1xcKTsvZywgJycpICsgJ1xcbiAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgPGRpdiBjbGFzcz1cXCd0ZW4tcGl4ZWwtYnJlYWtcXCcvPlxcbiAgICAgICAgPC9kaXY+XFxuICAgICAgJykuYXBwZW5kVG8oJCgnI3Rlc3RTdWl0ZScpKTtcbiAgICB9KTtcblxuICAgIHJldHVybiBkYXRhO1xuICB9O1xuXG4gIHJldHVybiBjb21tb247XG59KHdpbmRvdyk7IiwiJ3VzZSBzdHJpY3QnO1xuXG53aW5kb3cuY29tbW9uID0gZnVuY3Rpb24gKGdsb2JhbCkge1xuICB2YXIgZ2EgPSBnbG9iYWwuZ2EsXG4gICAgICBfZ2xvYmFsJGNvbW1vbiA9IGdsb2JhbC5jb21tb24sXG4gICAgICBjb21tb24gPSBfZ2xvYmFsJGNvbW1vbiA9PT0gdW5kZWZpbmVkID8geyBpbml0OiBbXSB9IDogX2dsb2JhbCRjb21tb247XG4gIHZhciBhZGRMb29wUHJvdGVjdCA9IGNvbW1vbi5hZGRMb29wUHJvdGVjdCxcbiAgICAgIGdldEpzRnJvbUh0bWwgPSBjb21tb24uZ2V0SnNGcm9tSHRtbCxcbiAgICAgIGRldGVjdFVuc2FmZUNvZGUkID0gY29tbW9uLmRldGVjdFVuc2FmZUNvZGUkLFxuICAgICAgdXBkYXRlUHJldmlldyQgPSBjb21tb24udXBkYXRlUHJldmlldyQsXG4gICAgICBjaGFsbGVuZ2VUeXBlID0gY29tbW9uLmNoYWxsZW5nZVR5cGUsXG4gICAgICBjaGFsbGVuZ2VUeXBlcyA9IGNvbW1vbi5jaGFsbGVuZ2VUeXBlcztcblxuXG4gIGNvbW1vbi5leGVjdXRlQ2hhbGxlbmdlJCA9IGZ1bmN0aW9uIGV4ZWN1dGVDaGFsbGVuZ2UkKCkge1xuICAgIHZhciBjb2RlID0gY29tbW9uLmVkaXRvci5nZXRWYWx1ZSgpO1xuICAgIHZhciBvcmlnaW5hbENvZGUgPSBjb2RlO1xuICAgIHZhciBoZWFkID0gY29tbW9uLmFycmF5VG9OZXdMaW5lU3RyaW5nKGNvbW1vbi5oZWFkKTtcbiAgICB2YXIgdGFpbCA9IGNvbW1vbi5hcnJheVRvTmV3TGluZVN0cmluZyhjb21tb24udGFpbCk7XG4gICAgdmFyIGNvbWJpbmVkQ29kZSA9IGhlYWQgKyBjb2RlICsgdGFpbDtcblxuICAgIGdhKCdzZW5kJywgJ2V2ZW50JywgJ0NoYWxsZW5nZScsICdyYW4tY29kZScsIGNvbW1vbi5nYU5hbWUpO1xuXG4gICAgLy8gcnVuIGNoZWNrcyBmb3IgdW5zYWZlIGNvZGVcbiAgICByZXR1cm4gZGV0ZWN0VW5zYWZlQ29kZSQoY29kZSlcbiAgICAvLyBhZGQgaGVhZCBhbmQgdGFpbCBhbmQgZGV0ZWN0IGxvb3BzXG4gICAgLm1hcChmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoY2hhbGxlbmdlVHlwZSAhPT0gY2hhbGxlbmdlVHlwZXMuSFRNTCkge1xuICAgICAgICByZXR1cm4gJzxzY3JpcHQ+OycgKyBhZGRMb29wUHJvdGVjdChjb21iaW5lZENvZGUpICsgJy8qKi88L3NjcmlwdD4nO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gYWRkTG9vcFByb3RlY3QoY29tYmluZWRDb2RlKTtcbiAgICB9KS5mbGF0TWFwKGZ1bmN0aW9uIChjb2RlKSB7XG4gICAgICByZXR1cm4gdXBkYXRlUHJldmlldyQoY29kZSk7XG4gICAgfSkuZmxhdE1hcChmdW5jdGlvbiAoY29kZSkge1xuICAgICAgdmFyIG91dHB1dCA9IHZvaWQgMDtcblxuICAgICAgaWYgKGNoYWxsZW5nZVR5cGUgPT09IGNoYWxsZW5nZVR5cGVzLkhUTUwgJiYgY29tbW9uLmhhc0pzKGNvZGUpKSB7XG4gICAgICAgIG91dHB1dCA9IGNvbW1vbi5nZXRKc091dHB1dChnZXRKc0Zyb21IdG1sKGNvZGUpKTtcbiAgICAgIH0gZWxzZSBpZiAoY2hhbGxlbmdlVHlwZSAhPT0gY2hhbGxlbmdlVHlwZXMuSFRNTCkge1xuICAgICAgICBvdXRwdXQgPSBjb21tb24uZ2V0SnNPdXRwdXQoYWRkTG9vcFByb3RlY3QoY29tYmluZWRDb2RlKSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBjb21tb24ucnVuUHJldmlld1Rlc3RzJCh7XG4gICAgICAgIHRlc3RzOiBjb21tb24udGVzdHMuc2xpY2UoKSxcbiAgICAgICAgb3JpZ2luYWxDb2RlOiBvcmlnaW5hbENvZGUsXG4gICAgICAgIG91dHB1dDogb3V0cHV0XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfTtcblxuICByZXR1cm4gY29tbW9uO1xufSh3aW5kb3cpOyIsIid1c2Ugc3RyaWN0Jztcblxud2luZG93LmNvbW1vbiA9IGZ1bmN0aW9uIChnbG9iYWwpIHtcbiAgdmFyIENvZGVNaXJyb3IgPSBnbG9iYWwuQ29kZU1pcnJvcixcbiAgICAgIGRvYyA9IGdsb2JhbC5kb2N1bWVudCxcbiAgICAgIF9nbG9iYWwkY29tbW9uID0gZ2xvYmFsLmNvbW1vbixcbiAgICAgIGNvbW1vbiA9IF9nbG9iYWwkY29tbW9uID09PSB1bmRlZmluZWQgPyB7IGluaXQ6IFtdIH0gOiBfZ2xvYmFsJGNvbW1vbjtcbiAgdmFyIGNoYWxsZW5nZVR5cGVzID0gY29tbW9uLmNoYWxsZW5nZVR5cGVzLFxuICAgICAgX2NvbW1vbiRjaGFsbGVuZ2VUeXBlID0gY29tbW9uLmNoYWxsZW5nZVR5cGUsXG4gICAgICBjaGFsbGVuZ2VUeXBlID0gX2NvbW1vbiRjaGFsbGVuZ2VUeXBlID09PSB1bmRlZmluZWQgPyAnMCcgOiBfY29tbW9uJGNoYWxsZW5nZVR5cGU7XG5cblxuICBpZiAoIUNvZGVNaXJyb3IgfHwgY2hhbGxlbmdlVHlwZSAhPT0gY2hhbGxlbmdlVHlwZXMuSlMgJiYgY2hhbGxlbmdlVHlwZSAhPT0gY2hhbGxlbmdlVHlwZXMuQk9ORklSRSkge1xuICAgIGNvbW1vbi51cGRhdGVPdXRwdXREaXNwbGF5ID0gZnVuY3Rpb24gKCkge307XG4gICAgY29tbW9uLmFwcGVuZFRvT3V0cHV0RGlzcGxheSA9IGZ1bmN0aW9uICgpIHt9O1xuICAgIHJldHVybiBjb21tb247XG4gIH1cblxuICB2YXIgY29kZU91dHB1dCA9IENvZGVNaXJyb3IuZnJvbVRleHRBcmVhKGRvYy5nZXRFbGVtZW50QnlJZCgnY29kZU91dHB1dCcpLCB7XG4gICAgbGluZU51bWJlcnM6IGZhbHNlLFxuICAgIG1vZGU6ICd0ZXh0JyxcbiAgICB0aGVtZTogJ21vbm9rYWknLFxuICAgIHJlYWRPbmx5OiAnbm9jdXJzb3InLFxuICAgIGxpbmVXcmFwcGluZzogdHJ1ZVxuICB9KTtcblxuICBjb2RlT3V0cHV0LnNldFZhbHVlKCcvKipcXG4gICogWW91ciBvdXRwdXQgd2lsbCBnbyBoZXJlLlxcbiAgKiBBbnkgY29uc29sZS5sb2coKSAtdHlwZVxcbiAgKiBzdGF0ZW1lbnRzIHdpbGwgYXBwZWFyIGluXFxuICAqIHlvdXIgYnJvd3NlclxcJ3MgRGV2VG9vbHNcXG4gICogSmF2YVNjcmlwdCBjb25zb2xlLlxcbiAgKi8nKTtcblxuICBjb2RlT3V0cHV0LnNldFNpemUoJzEwMCUnLCAnMTAwJScpO1xuXG4gIGNvbW1vbi51cGRhdGVPdXRwdXREaXNwbGF5ID0gZnVuY3Rpb24gdXBkYXRlT3V0cHV0RGlzcGxheSgpIHtcbiAgICB2YXIgc3RyID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiAnJztcblxuICAgIGlmICh0eXBlb2Ygc3RyICE9PSAnc3RyaW5nJykge1xuICAgICAgc3RyID0gSlNPTi5zdHJpbmdpZnkoc3RyKTtcbiAgICB9XG4gICAgY29kZU91dHB1dC5zZXRWYWx1ZShzdHIpO1xuICAgIHJldHVybiBzdHI7XG4gIH07XG5cbiAgY29tbW9uLmFwcGVuZFRvT3V0cHV0RGlzcGxheSA9IGZ1bmN0aW9uIGFwcGVuZFRvT3V0cHV0RGlzcGxheSgpIHtcbiAgICB2YXIgc3RyID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiAnJztcblxuICAgIGNvZGVPdXRwdXQuc2V0VmFsdWUoY29kZU91dHB1dC5nZXRWYWx1ZSgpICsgc3RyKTtcbiAgICByZXR1cm4gc3RyO1xuICB9O1xuXG4gIHJldHVybiBjb21tb247XG59KHdpbmRvdyk7IiwiJ3VzZSBzdHJpY3QnO1xuXG53aW5kb3cuY29tbW9uID0gZnVuY3Rpb24gKF9yZWYpIHtcbiAgdmFyIF9yZWYkY29tbW9uID0gX3JlZi5jb21tb24sXG4gICAgICBjb21tb24gPSBfcmVmJGNvbW1vbiA9PT0gdW5kZWZpbmVkID8geyBpbml0OiBbXSB9IDogX3JlZiRjb21tb247XG5cblxuICBjb21tb24ubG9ja1RvcCA9IGZ1bmN0aW9uIGxvY2tUb3AoKSB7XG4gICAgdmFyIG1hZ2lWYWw7XG5cbiAgICBpZiAoJCh3aW5kb3cpLndpZHRoKCkgPj0gOTkwKSB7XG4gICAgICBpZiAoJCgnLmVkaXRvclNjcm9sbERpdicpLmh0bWwoKSkge1xuXG4gICAgICAgIG1hZ2lWYWwgPSAkKHdpbmRvdykuaGVpZ2h0KCkgLSAkKCcubmF2YmFyJykuaGVpZ2h0KCk7XG5cbiAgICAgICAgaWYgKG1hZ2lWYWwgPCAwKSB7XG4gICAgICAgICAgbWFnaVZhbCA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgJCgnLmVkaXRvclNjcm9sbERpdicpLmNzcygnaGVpZ2h0JywgbWFnaVZhbCAtIDUwICsgJ3B4Jyk7XG4gICAgICB9XG5cbiAgICAgIG1hZ2lWYWwgPSAkKHdpbmRvdykuaGVpZ2h0KCkgLSAkKCcubmF2YmFyJykuaGVpZ2h0KCk7XG5cbiAgICAgIGlmIChtYWdpVmFsIDwgMCkge1xuICAgICAgICBtYWdpVmFsID0gMDtcbiAgICAgIH1cblxuICAgICAgJCgnLnNjcm9sbC1sb2NrZXInKS5jc3MoJ21pbi1oZWlnaHQnLCAkKCcuZWRpdG9yU2Nyb2xsRGl2JykuaGVpZ2h0KCkpLmNzcygnaGVpZ2h0JywgbWFnaVZhbCAtIDUwKTtcbiAgICB9IGVsc2Uge1xuICAgICAgJCgnLmVkaXRvclNjcm9sbERpdicpLmNzcygnbWF4LWhlaWdodCcsIDUwMCArICdweCcpO1xuXG4gICAgICAkKCcuc2Nyb2xsLWxvY2tlcicpLmNzcygncG9zaXRpb24nLCAnaW5oZXJpdCcpLmNzcygndG9wJywgJ2luaGVyaXQnKS5jc3MoJ3dpZHRoJywgJzEwMCUnKS5jc3MoJ21heC1oZWlnaHQnLCAnMTAwJScpO1xuICAgIH1cbiAgfTtcblxuICBjb21tb24uaW5pdC5wdXNoKGZ1bmN0aW9uICgkKSB7XG4gICAgLy8gZmFrZWlwaG9uZSBwb3NpdGlvbmluZyBob3RmaXhcbiAgICBpZiAoJCgnLmlwaG9uZS1wb3NpdGlvbicpLmh0bWwoKSB8fCAkKCcuaXBob25lJykuaHRtbCgpKSB7XG4gICAgICB2YXIgc3RhcnRJcGhvbmVQb3NpdGlvbiA9IHBhcnNlSW50KCQoJy5pcGhvbmUtcG9zaXRpb24nKS5jc3MoJ3RvcCcpLnJlcGxhY2UoJ3B4JywgJycpLCAxMCk7XG5cbiAgICAgIHZhciBzdGFydElwaG9uZSA9IHBhcnNlSW50KCQoJy5pcGhvbmUnKS5jc3MoJ3RvcCcpLnJlcGxhY2UoJ3B4JywgJycpLCAxMCk7XG5cbiAgICAgICQod2luZG93KS5vbignc2Nyb2xsJywgZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgY291cnNlSGVpZ2h0ID0gJCgnLmNvdXJzZXdhcmUtaGVpZ2h0JykuaGVpZ2h0KCk7XG4gICAgICAgIHZhciBjb3Vyc2VUb3AgPSAkKCcuY291cnNld2FyZS1oZWlnaHQnKS5vZmZzZXQoKS50b3A7XG4gICAgICAgIHZhciB3aW5kb3dTY3JvbGxUb3AgPSAkKHdpbmRvdykuc2Nyb2xsVG9wKCk7XG4gICAgICAgIHZhciBwaG9uZUhlaWdodCA9ICQoJy5pcGhvbmUtcG9zaXRpb24nKS5oZWlnaHQoKTtcblxuICAgICAgICBpZiAoY291cnNlSGVpZ2h0ICsgY291cnNlVG9wIC0gd2luZG93U2Nyb2xsVG9wIC0gcGhvbmVIZWlnaHQgPD0gMCkge1xuICAgICAgICAgICQoJy5pcGhvbmUtcG9zaXRpb24nKS5jc3MoJ3RvcCcsIHN0YXJ0SXBob25lUG9zaXRpb24gKyBjb3Vyc2VIZWlnaHQgKyBjb3Vyc2VUb3AgLSB3aW5kb3dTY3JvbGxUb3AgLSBwaG9uZUhlaWdodCk7XG5cbiAgICAgICAgICAkKCcuaXBob25lJykuY3NzKCd0b3AnLCBzdGFydElwaG9uZVBvc2l0aW9uICsgY291cnNlSGVpZ2h0ICsgY291cnNlVG9wIC0gd2luZG93U2Nyb2xsVG9wIC0gcGhvbmVIZWlnaHQgKyAxMjApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICQoJy5pcGhvbmUtcG9zaXRpb24nKS5jc3MoJ3RvcCcsIHN0YXJ0SXBob25lUG9zaXRpb24pO1xuICAgICAgICAgICQoJy5pcGhvbmUnKS5jc3MoJ3RvcCcsIHN0YXJ0SXBob25lKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKCQoJy5zY3JvbGwtbG9ja2VyJykuaHRtbCgpKSB7XG5cbiAgICAgIGlmICgkKCcuc2Nyb2xsLWxvY2tlcicpLmh0bWwoKSkge1xuICAgICAgICBjb21tb24ubG9ja1RvcCgpO1xuICAgICAgICAkKHdpbmRvdykub24oJ3Jlc2l6ZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBjb21tb24ubG9ja1RvcCgpO1xuICAgICAgICB9KTtcbiAgICAgICAgJCh3aW5kb3cpLm9uKCdzY3JvbGwnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgY29tbW9uLmxvY2tUb3AoKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHZhciBleGVjSW5Qcm9ncmVzcyA9IGZhbHNlO1xuXG4gICAgICAvLyB3aHkgaXMgdGhpcyBub3QgJD8/P1xuICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Njcm9sbC1sb2NrZXInKS5hZGRFdmVudExpc3RlbmVyKCdwcmV2aWV3VXBkYXRlU3B5JywgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgaWYgKGV4ZWNJblByb2dyZXNzKSB7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgZXhlY0luUHJvZ3Jlc3MgPSB0cnVlO1xuICAgICAgICByZXR1cm4gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgaWYgKCQoJCgnLnNjcm9sbC1sb2NrZXInKS5jaGlsZHJlbigpWzBdKS5oZWlnaHQoKSAtIDgwMCA+IGUuZGV0YWlsKSB7XG4gICAgICAgICAgICAkKCcuc2Nyb2xsLWxvY2tlcicpLnNjcm9sbFRvcChlLmRldGFpbCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHZhciBzY3JvbGxUb3AgPSAkKCQoJy5zY3JvbGwtbG9ja2VyJykuY2hpbGRyZW4oKVswXSkuaGVpZ2h0KCk7XG5cbiAgICAgICAgICAgICQoJy5zY3JvbGwtbG9ja2VyJykuYW5pbWF0ZSh7IHNjcm9sbFRvcDogc2Nyb2xsVG9wIH0sIDE3NSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGV4ZWNJblByb2dyZXNzID0gZmFsc2U7XG4gICAgICAgIH0sIDc1MCk7XG4gICAgICB9LCBmYWxzZSk7XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4gY29tbW9uO1xufSh3aW5kb3cpOyIsIid1c2Ugc3RyaWN0Jztcblxud2luZG93LmNvbW1vbiA9IGZ1bmN0aW9uIChfcmVmKSB7XG4gIHZhciBfcmVmJGNvbW1vbiA9IF9yZWYuY29tbW9uLFxuICAgICAgY29tbW9uID0gX3JlZiRjb21tb24gPT09IHVuZGVmaW5lZCA/IHsgaW5pdDogW10gfSA6IF9yZWYkY29tbW9uO1xuXG4gIGNvbW1vbi5pbml0LnB1c2goZnVuY3Rpb24gKCQpIHtcbiAgICAkKCcjcmVwb3J0LWlzc3VlJykub24oJ2NsaWNrJywgZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIHRleHRNZXNzYWdlID0gWydDaGFsbGVuZ2UgWycsIGNvbW1vbi5jaGFsbGVuZ2VOYW1lIHx8IHdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZSwgJ10oJywgd2luZG93LmxvY2F0aW9uLmhyZWYsICcpIGhhcyBhbiBpc3N1ZS5cXG4nLCAnVXNlciBBZ2VudCBpczogPGNvZGU+JywgbmF2aWdhdG9yLnVzZXJBZ2VudCwgJzwvY29kZT4uXFxuJywgJ1BsZWFzZSBkZXNjcmliZSBob3cgdG8gcmVwcm9kdWNlIHRoaXMgaXNzdWUsIGFuZCBpbmNsdWRlICcsICdsaW5rcyB0byBzY3JlZW5zaG90cyBpZiBwb3NzaWJsZS5cXG5cXG4nXS5qb2luKCcnKTtcblxuICAgICAgaWYgKGNvbW1vbi5lZGl0b3IgJiYgdHlwZW9mIGNvbW1vbi5lZGl0b3IuZ2V0VmFsdWUgPT09ICdmdW5jdGlvbicgJiYgY29tbW9uLmVkaXRvci5nZXRWYWx1ZSgpLnRyaW0oKSkge1xuICAgICAgICB2YXIgdHlwZTtcbiAgICAgICAgc3dpdGNoIChjb21tb24uY2hhbGxlbmdlVHlwZSkge1xuICAgICAgICAgIGNhc2UgY29tbW9uLmNoYWxsZW5nZVR5cGVzLkhUTUw6XG4gICAgICAgICAgICB0eXBlID0gJ2h0bWwnO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBjb21tb24uY2hhbGxlbmdlVHlwZXMuSlM6XG4gICAgICAgICAgY2FzZSBjb21tb24uY2hhbGxlbmdlVHlwZXMuQk9ORklSRTpcbiAgICAgICAgICAgIHR5cGUgPSAnamF2YXNjcmlwdCc7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgdHlwZSA9ICcnO1xuICAgICAgICB9XG5cbiAgICAgICAgdGV4dE1lc3NhZ2UgKz0gWydNeSBjb2RlOlxcbmBgYCcsIHR5cGUsICdcXG4nLCBjb21tb24uZWRpdG9yLmdldFZhbHVlKCksICdcXG5gYGBcXG5cXG4nXS5qb2luKCcnKTtcbiAgICAgIH1cblxuICAgICAgdGV4dE1lc3NhZ2UgPSBlbmNvZGVVUklDb21wb25lbnQodGV4dE1lc3NhZ2UpO1xuXG4gICAgICAkKCcjaXNzdWUtbW9kYWwnKS5tb2RhbCgnaGlkZScpO1xuICAgICAgd2luZG93Lm9wZW4oJ2h0dHBzOi8vZ2l0aHViLmNvbS9mcmVlY29kZWNhbXBjaGluYS9mcmVlY29kZWNhbXAuY24vaXNzdWVzL25ldz8mYm9keT0nICsgdGV4dE1lc3NhZ2UsICdfYmxhbmsnKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgcmV0dXJuIGNvbW1vbjtcbn0od2luZG93KTsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9leHRlbmRzID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07IGZvciAodmFyIGtleSBpbiBzb3VyY2UpIHsgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2UsIGtleSkpIHsgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTsgfSB9IH0gcmV0dXJuIHRhcmdldDsgfTtcblxuZnVuY3Rpb24gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKG9iaiwga2V5cykgeyB2YXIgdGFyZ2V0ID0ge307IGZvciAodmFyIGkgaW4gb2JqKSB7IGlmIChrZXlzLmluZGV4T2YoaSkgPj0gMCkgY29udGludWU7IGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwgaSkpIGNvbnRpbnVlOyB0YXJnZXRbaV0gPSBvYmpbaV07IH0gcmV0dXJuIHRhcmdldDsgfVxuXG53aW5kb3cuY29tbW9uID0gZnVuY3Rpb24gKGdsb2JhbCkge1xuICB2YXIgT2JzZXJ2YWJsZSA9IGdsb2JhbC5SeC5PYnNlcnZhYmxlLFxuICAgICAgY2hhaSA9IGdsb2JhbC5jaGFpLFxuICAgICAgX2dsb2JhbCRjb21tb24gPSBnbG9iYWwuY29tbW9uLFxuICAgICAgY29tbW9uID0gX2dsb2JhbCRjb21tb24gPT09IHVuZGVmaW5lZCA/IHsgaW5pdDogW10gfSA6IF9nbG9iYWwkY29tbW9uO1xuXG5cbiAgY29tbW9uLnJ1blRlc3RzJCA9IGZ1bmN0aW9uIHJ1blRlc3RzJChfcmVmKSB7XG4gICAgdmFyIGNvZGUgPSBfcmVmLmNvZGUsXG4gICAgICAgIG9yaWdpbmFsQ29kZSA9IF9yZWYub3JpZ2luYWxDb2RlLFxuICAgICAgICB1c2VyVGVzdHMgPSBfcmVmLnVzZXJUZXN0cyxcbiAgICAgICAgcmVzdCA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhfcmVmLCBbXCJjb2RlXCIsIFwib3JpZ2luYWxDb2RlXCIsIFwidXNlclRlc3RzXCJdKTtcblxuICAgIHJldHVybiBPYnNlcnZhYmxlLmZyb20odXNlclRlc3RzKS5tYXAoZnVuY3Rpb24gKHRlc3QpIHtcblxuICAgICAgLyogZXNsaW50LWRpc2FibGUgbm8tdW51c2VkLXZhcnMgKi9cbiAgICAgIHZhciBhc3NlcnQgPSBjaGFpLmFzc2VydDtcbiAgICAgIHZhciBlZGl0b3IgPSB7XG4gICAgICAgIGdldFZhbHVlOiBmdW5jdGlvbiBnZXRWYWx1ZSgpIHtcbiAgICAgICAgICByZXR1cm4gb3JpZ2luYWxDb2RlO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgLyogZXNsaW50LWVuYWJsZSBuby11bnVzZWQtdmFycyAqL1xuXG4gICAgICB0cnkge1xuICAgICAgICBpZiAodGVzdCkge1xuICAgICAgICAgIC8qIGVzbGludC1kaXNhYmxlIG5vLWV2YWwgICovXG4gICAgICAgICAgZXZhbChjb21tb24ucmVhc3NlbWJsZVRlc3QoY29kZSwgdGVzdCkpO1xuICAgICAgICAgIC8qIGVzbGludC1lbmFibGUgbm8tZXZhbCAqL1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHRlc3QuZXJyID0gZS5tZXNzYWdlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGVzdDtcbiAgICB9KS50b0FycmF5KCkubWFwKGZ1bmN0aW9uICh0ZXN0cykge1xuICAgICAgcmV0dXJuIF9leHRlbmRzKHt9LCByZXN0LCB7IHRlc3RzOiB0ZXN0cyB9KTtcbiAgICB9KTtcbiAgfTtcblxuICByZXR1cm4gY29tbW9uO1xufSh3aW5kb3cpOyIsIid1c2Ugc3RyaWN0Jztcblxud2luZG93LmNvbW1vbiA9IGZ1bmN0aW9uIChnbG9iYWwpIHtcbiAgdmFyICQgPSBnbG9iYWwuJCxcbiAgICAgIG1vbWVudCA9IGdsb2JhbC5tb21lbnQsXG4gICAgICBfZ2xvYmFsJGdhID0gZ2xvYmFsLmdhLFxuICAgICAgZ2EgPSBfZ2xvYmFsJGdhID09PSB1bmRlZmluZWQgPyBmdW5jdGlvbiAoKSB7fSA6IF9nbG9iYWwkZ2EsXG4gICAgICBfZ2xvYmFsJGNvbW1vbiA9IGdsb2JhbC5jb21tb24sXG4gICAgICBjb21tb24gPSBfZ2xvYmFsJGNvbW1vbiA9PT0gdW5kZWZpbmVkID8geyBpbml0OiBbXSB9IDogX2dsb2JhbCRjb21tb247XG5cblxuICBmdW5jdGlvbiBzdWJtaXRDaGFsbGVuZ2VIYW5kbGVyKGUpIHtcbiAgICBlLnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICB2YXIgc29sdXRpb24gPSBjb21tb24uZWRpdG9yLmdldFZhbHVlKCk7XG5cbiAgICAkKCcjc3VibWl0LWNoYWxsZW5nZScpLmF0dHIoJ2Rpc2FibGVkJywgJ3RydWUnKS5yZW1vdmVDbGFzcygnYnRuLXByaW1hcnknKS5hZGRDbGFzcygnYnRuLXdhcm5pbmcgZGlzYWJsZWQnKTtcblxuICAgIHZhciAkY2hlY2ttYXJrQ29udGFpbmVyID0gJCgnI2NoZWNrbWFyay1jb250YWluZXInKTtcbiAgICAkY2hlY2ttYXJrQ29udGFpbmVyLmNzcyh7IGhlaWdodDogJGNoZWNrbWFya0NvbnRhaW5lci5pbm5lckhlaWdodCgpIH0pO1xuXG4gICAgJCgnI2NoYWxsZW5nZS1jaGVja21hcmsnKS5hZGRDbGFzcygnem9vbU91dFVwJylcbiAgICAvLyAucmVtb3ZlQ2xhc3MoJ3pvb21JbkRvd24nKVxuICAgIC5kZWxheSgxMDAwKS5xdWV1ZShmdW5jdGlvbiAobmV4dCkge1xuICAgICAgJCh0aGlzKS5yZXBsYWNlV2l0aCgnPGRpdiBpZD1cImNoYWxsZW5nZS1zcGlubmVyXCIgJyArICdjbGFzcz1cImFuaW1hdGVkIHpvb21JblVwIGlubmVyLWNpcmNsZXMtbG9hZGVyXCI+JyArICdzdWJtaXR0aW5nLi4uPC9kaXY+Jyk7XG4gICAgICBuZXh0KCk7XG4gICAgfSk7XG5cbiAgICB2YXIgdGltZXpvbmUgPSAnVVRDJztcbiAgICB0cnkge1xuICAgICAgdGltZXpvbmUgPSBtb21lbnQudHouZ3Vlc3MoKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGVyci5tZXNzYWdlID0gJ1xcbiAgICAgICAgICBrbm93biBidWcsIHNlZTogaHR0cHM6Ly9naXRodWIuY29tL21vbWVudC9tb21lbnQtdGltZXpvbmUvaXNzdWVzLzI5NDpcXG4gICAgICAgICAgJyArIGVyci5tZXNzYWdlICsgJ1xcbiAgICAgICAgJztcbiAgICAgIGNvbnNvbGUuZXJyb3IoZXJyKTtcbiAgICB9XG4gICAgdmFyIGRhdGEgPSBKU09OLnN0cmluZ2lmeSh7XG4gICAgICBpZDogY29tbW9uLmNoYWxsZW5nZUlkLFxuICAgICAgbmFtZTogY29tbW9uLmNoYWxsZW5nZU5hbWUsXG4gICAgICBjaGFsbGVuZ2VUeXBlOiArY29tbW9uLmNoYWxsZW5nZVR5cGUsXG4gICAgICBzb2x1dGlvbjogc29sdXRpb24sXG4gICAgICB0aW1lem9uZTogdGltZXpvbmVcbiAgICB9KTtcblxuICAgICQuYWpheCh7XG4gICAgICB1cmw6ICcvY29tcGxldGVkLWNoYWxsZW5nZS8nLFxuICAgICAgdHlwZTogJ1BPU1QnLFxuICAgICAgZGF0YTogZGF0YSxcbiAgICAgIGNvbnRlbnRUeXBlOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICBkYXRhVHlwZTogJ2pzb24nXG4gICAgfSkuc3VjY2VzcyhmdW5jdGlvbiAocmVzKSB7XG4gICAgICBpZiAocmVzKSB7XG4gICAgICAgIHdpbmRvdy5sb2NhdGlvbiA9ICcvY2hhbGxlbmdlcy9uZXh0LWNoYWxsZW5nZT9pZD0nICsgY29tbW9uLmNoYWxsZW5nZUlkO1xuICAgICAgfVxuICAgIH0pLmZhaWwoZnVuY3Rpb24gKCkge1xuICAgICAgd2luZG93LmxvY2F0aW9uLnJlcGxhY2Uod2luZG93LmxvY2F0aW9uLmhyZWYpO1xuICAgIH0pO1xuICB9XG5cbiAgY29tbW9uLnNob3dDb21wbGV0aW9uID0gZnVuY3Rpb24gc2hvd0NvbXBsZXRpb24oKSB7XG5cbiAgICBnYSgnc2VuZCcsICdldmVudCcsICdDaGFsbGVuZ2UnLCAnc29sdmVkJywgY29tbW9uLmdhTmFtZSwgdHJ1ZSk7XG5cbiAgICAkKCcjY29tcGxldGUtY291cnNld2FyZS1kaWFsb2cnKS5tb2RhbCgnc2hvdycpO1xuICAgICQoJyNjb21wbGV0ZS1jb3Vyc2V3YXJlLWRpYWxvZyAubW9kYWwtaGVhZGVyJykuY2xpY2soKTtcblxuICAgICQoJyNzdWJtaXQtY2hhbGxlbmdlJykub2ZmKCdjbGljaycpO1xuICAgICQoJyNzdWJtaXQtY2hhbGxlbmdlJykub24oJ2NsaWNrJywgc3VibWl0Q2hhbGxlbmdlSGFuZGxlcik7XG4gIH07XG5cbiAgcmV0dXJuIGNvbW1vbjtcbn0od2luZG93KTsiLCIndXNlIHN0cmljdCc7XG5cbndpbmRvdy5jb21tb24gPSBmdW5jdGlvbiAoX3JlZikge1xuICB2YXIgJCA9IF9yZWYuJCxcbiAgICAgIF9yZWYkY29tbW9uID0gX3JlZi5jb21tb24sXG4gICAgICBjb21tb24gPSBfcmVmJGNvbW1vbiA9PT0gdW5kZWZpbmVkID8geyBpbml0OiBbXSB9IDogX3JlZiRjb21tb247XG5cbiAgdmFyIHN0ZXBDbGFzcyA9ICcuY2hhbGxlbmdlLXN0ZXAnO1xuICB2YXIgcHJldkJ0bkNsYXNzID0gJy5jaGFsbGVuZ2Utc3RlcC1idG4tcHJldic7XG4gIHZhciBuZXh0QnRuQ2xhc3MgPSAnLmNoYWxsZW5nZS1zdGVwLWJ0bi1uZXh0JztcbiAgdmFyIGFjdGlvbkJ0bkNsYXNzID0gJy5jaGFsbGVuZ2Utc3RlcC1idG4tYWN0aW9uJztcbiAgdmFyIGZpbmlzaEJ0bkNsYXNzID0gJy5jaGFsbGVuZ2Utc3RlcC1idG4tZmluaXNoJztcbiAgdmFyIHN1Ym1pdEJ0bklkID0gJyNjaGFsbGVuZ2Utc3RlcC1idG4tc3VibWl0JztcbiAgdmFyIHN1Ym1pdE1vZGFsSWQgPSAnI2NoYWxsZW5nZS1zdGVwLW1vZGFsJztcblxuICBmdW5jdGlvbiBnZXRQcmV2aW91c1N0ZXAoJGNoYWxsZW5nZVN0ZXBzKSB7XG4gICAgdmFyICRwcmV2U3RlcCA9IGZhbHNlO1xuICAgIHZhciBwcmV2U3RlcEluZGV4ID0gMDtcbiAgICAkY2hhbGxlbmdlU3RlcHMuZWFjaChmdW5jdGlvbiAoaW5kZXgpIHtcbiAgICAgIHZhciAkc3RlcCA9ICQodGhpcyk7XG4gICAgICBpZiAoISRzdGVwLmhhc0NsYXNzKCdoaWRkZW4nKSkge1xuICAgICAgICBwcmV2U3RlcEluZGV4ID0gaW5kZXggLSAxO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgJHByZXZTdGVwID0gJGNoYWxsZW5nZVN0ZXBzW3ByZXZTdGVwSW5kZXhdO1xuXG4gICAgcmV0dXJuICRwcmV2U3RlcDtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldE5leHRTdGVwKCRjaGFsbGVuZ2VTdGVwcykge1xuICAgIHZhciBsZW5ndGggPSAkY2hhbGxlbmdlU3RlcHMubGVuZ3RoO1xuICAgIHZhciAkbmV4dFN0ZXAgPSBmYWxzZTtcbiAgICB2YXIgbmV4dFN0ZXBJbmRleCA9IDA7XG4gICAgJGNoYWxsZW5nZVN0ZXBzLmVhY2goZnVuY3Rpb24gKGluZGV4KSB7XG4gICAgICB2YXIgJHN0ZXAgPSAkKHRoaXMpO1xuICAgICAgaWYgKCEkc3RlcC5oYXNDbGFzcygnaGlkZGVuJykgJiYgaW5kZXggKyAxICE9PSBsZW5ndGgpIHtcbiAgICAgICAgbmV4dFN0ZXBJbmRleCA9IGluZGV4ICsgMTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgICRuZXh0U3RlcCA9ICRjaGFsbGVuZ2VTdGVwc1tuZXh0U3RlcEluZGV4XTtcblxuICAgIHJldHVybiAkbmV4dFN0ZXA7XG4gIH1cblxuICBmdW5jdGlvbiBoYW5kbGVQcmV2U3RlcENsaWNrKGUpIHtcbiAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgdmFyIHByZXZTdGVwID0gZ2V0UHJldmlvdXNTdGVwKCQoc3RlcENsYXNzKSk7XG4gICAgJCh0aGlzKS5wYXJlbnQoKS5wYXJlbnQoKS5yZW1vdmVDbGFzcygnc2xpZGVJbkxlZnQgc2xpZGVJblJpZ2h0JykuYWRkQ2xhc3MoJ2FuaW1hdGVkIGZhZGVPdXRSaWdodCBmYXN0LWFuaW1hdGlvbicpLmRlbGF5KDI1MCkucXVldWUoZnVuY3Rpb24gKHByZXYpIHtcbiAgICAgICQodGhpcykuYWRkQ2xhc3MoJ2hpZGRlbicpO1xuICAgICAgaWYgKHByZXZTdGVwKSB7XG4gICAgICAgICQocHJldlN0ZXApLnJlbW92ZUNsYXNzKCdoaWRkZW4nKS5yZW1vdmVDbGFzcygnZmFkZU91dExlZnQgZmFkZU91dFJpZ2h0JykuYWRkQ2xhc3MoJ2FuaW1hdGVkIHNsaWRlSW5MZWZ0IGZhc3QtYW5pbWF0aW9uJykuZGVsYXkoNTAwKS5xdWV1ZShmdW5jdGlvbiAocHJldikge1xuICAgICAgICAgIHByZXYoKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBwcmV2KCk7XG4gICAgfSk7XG4gIH1cblxuICBmdW5jdGlvbiBoYW5kbGVOZXh0U3RlcENsaWNrKGUpIHtcbiAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgdmFyIG5leHRTdGVwID0gZ2V0TmV4dFN0ZXAoJChzdGVwQ2xhc3MpKTtcbiAgICAkKHRoaXMpLnBhcmVudCgpLnBhcmVudCgpLnJlbW92ZUNsYXNzKCdzbGlkZUluUmlnaHQgc2xpZGVJbkxlZnQnKS5hZGRDbGFzcygnYW5pbWF0ZWQgZmFkZU91dExlZnQgZmFzdC1hbmltYXRpb24nKS5kZWxheSgyNTApLnF1ZXVlKGZ1bmN0aW9uIChuZXh0KSB7XG4gICAgICAkKHRoaXMpLmFkZENsYXNzKCdoaWRkZW4nKTtcbiAgICAgIGlmIChuZXh0U3RlcCkge1xuICAgICAgICAkKG5leHRTdGVwKS5yZW1vdmVDbGFzcygnaGlkZGVuJykucmVtb3ZlQ2xhc3MoJ2ZhZGVPdXRSaWdodCBmYWRlT3V0TGVmdCcpLmFkZENsYXNzKCdhbmltYXRlZCBzbGlkZUluUmlnaHQgZmFzdC1hbmltYXRpb24nKS5kZWxheSg1MDApLnF1ZXVlKGZ1bmN0aW9uIChuZXh0KSB7XG4gICAgICAgICAgbmV4dCgpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIG5leHQoKTtcbiAgICB9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGhhbmRsZUFjdGlvbkNsaWNrKGUpIHtcbiAgICB2YXIgcHJvcHMgPSBjb21tb24uY2hhbGxlbmdlU2VlZFswXSB8fCB7IHN0ZXBJbmRleDogW10gfTtcblxuICAgIHZhciAkZWwgPSAkKHRoaXMpO1xuICAgIHZhciBpbmRleCA9ICskZWwuYXR0cignaWQnKTtcbiAgICB2YXIgcHJvcEluZGV4ID0gcHJvcHMuc3RlcEluZGV4LmluZGV4T2YoaW5kZXgpO1xuXG4gICAgaWYgKHByb3BJbmRleCA9PT0gLTEpIHtcbiAgICAgIHJldHVybiAkZWwucGFyZW50KCkuZmluZCgnLmRpc2FibGVkJykucmVtb3ZlQ2xhc3MoJ2Rpc2FibGVkJyk7XG4gICAgfVxuXG4gICAgLy8gYW4gQVBJIGFjdGlvblxuICAgIC8vIHByZXZlbnQgbGluayBmcm9tIG9wZW5pbmdcbiAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgdmFyIHByb3AgPSBwcm9wcy5wcm9wZXJ0aWVzW3Byb3BJbmRleF07XG4gICAgdmFyIGFwaSA9IHByb3BzLmFwaXNbcHJvcEluZGV4XTtcbiAgICBpZiAoY29tbW9uW3Byb3BdKSB7XG4gICAgICByZXR1cm4gJGVsLnBhcmVudCgpLmZpbmQoJy5kaXNhYmxlZCcpLnJlbW92ZUNsYXNzKCdkaXNhYmxlZCcpO1xuICAgIH1cbiAgICByZXR1cm4gJC5wb3N0KGFwaSkuZG9uZShmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgLy8gYXNzdW1lIGEgYm9vbGVhbiBpbmRpY2F0ZXMgcGFzc2luZ1xuICAgICAgaWYgKHR5cGVvZiBkYXRhID09PSAnYm9vbGVhbicpIHtcbiAgICAgICAgcmV0dXJuICRlbC5wYXJlbnQoKS5maW5kKCcuZGlzYWJsZWQnKS5yZW1vdmVDbGFzcygnZGlzYWJsZWQnKTtcbiAgICAgIH1cbiAgICAgIC8vIGFzc3VtZSBhcGkgcmV0dXJucyBzdHJpbmcgd2hlbiBmYWlsc1xuICAgICAgcmV0dXJuICRlbC5wYXJlbnQoKS5maW5kKCcuZGlzYWJsZWQnKS5yZXBsYWNlV2l0aCgnPHA+JyArIGRhdGEgKyAnPC9wPicpO1xuICAgIH0pLmZhaWwoZnVuY3Rpb24gKCkge1xuICAgICAgY29uc29sZS5sb2coJ2ZhaWxlZCcpO1xuICAgIH0pO1xuICB9XG5cbiAgZnVuY3Rpb24gaGFuZGxlRmluaXNoQ2xpY2soZSkge1xuICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAkKHN1Ym1pdE1vZGFsSWQpLm1vZGFsKCdzaG93Jyk7XG4gICAgJChzdWJtaXRNb2RhbElkICsgJy5tb2RhbC1oZWFkZXInKS5jbGljaygpO1xuICAgICQoc3VibWl0QnRuSWQpLmNsaWNrKGhhbmRsZVN1Ym1pdENsaWNrKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGhhbmRsZVN1Ym1pdENsaWNrKGUpIHtcbiAgICBlLnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAkKCcjc3VibWl0LWNoYWxsZW5nZScpLmF0dHIoJ2Rpc2FibGVkJywgJ3RydWUnKS5yZW1vdmVDbGFzcygnYnRuLXByaW1hcnknKS5hZGRDbGFzcygnYnRuLXdhcm5pbmcgZGlzYWJsZWQnKTtcblxuICAgIHZhciAkY2hlY2ttYXJrQ29udGFpbmVyID0gJCgnI2NoZWNrbWFyay1jb250YWluZXInKTtcbiAgICAkY2hlY2ttYXJrQ29udGFpbmVyLmNzcyh7IGhlaWdodDogJGNoZWNrbWFya0NvbnRhaW5lci5pbm5lckhlaWdodCgpIH0pO1xuXG4gICAgJCgnI2NoYWxsZW5nZS1jaGVja21hcmsnKS5hZGRDbGFzcygnem9vbU91dFVwJykuZGVsYXkoMTAwMCkucXVldWUoZnVuY3Rpb24gKG5leHQpIHtcbiAgICAgICQodGhpcykucmVwbGFjZVdpdGgoJzxkaXYgaWQ9XCJjaGFsbGVuZ2Utc3Bpbm5lclwiICcgKyAnY2xhc3M9XCJhbmltYXRlZCB6b29tSW5VcCBpbm5lci1jaXJjbGVzLWxvYWRlclwiPicgKyAnc3VibWl0dGluZy4uLjwvZGl2PicpO1xuICAgICAgbmV4dCgpO1xuICAgIH0pO1xuXG4gICAgJC5hamF4KHtcbiAgICAgIHVybDogJy9jb21wbGV0ZWQtY2hhbGxlbmdlLycsXG4gICAgICB0eXBlOiAnUE9TVCcsXG4gICAgICBkYXRhOiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgIGlkOiBjb21tb24uY2hhbGxlbmdlSWQsXG4gICAgICAgIG5hbWU6IGNvbW1vbi5jaGFsbGVuZ2VOYW1lLFxuICAgICAgICBjaGFsbGVuZ2VUeXBlOiArY29tbW9uLmNoYWxsZW5nZVR5cGVcbiAgICAgIH0pLFxuICAgICAgY29udGVudFR5cGU6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgIGRhdGFUeXBlOiAnanNvbidcbiAgICB9KS5zdWNjZXNzKGZ1bmN0aW9uIChyZXMpIHtcbiAgICAgIGlmIChyZXMpIHtcbiAgICAgICAgd2luZG93LmxvY2F0aW9uID0gJy9jaGFsbGVuZ2VzL25leHQtY2hhbGxlbmdlP2lkPScgKyBjb21tb24uY2hhbGxlbmdlSWQ7XG4gICAgICB9XG4gICAgfSkuZmFpbChmdW5jdGlvbiAoKSB7XG4gICAgICB3aW5kb3cubG9jYXRpb24ucmVwbGFjZSh3aW5kb3cubG9jYXRpb24uaHJlZik7XG4gICAgfSk7XG4gIH1cblxuICBjb21tb24uaW5pdC5wdXNoKGZ1bmN0aW9uICgkKSB7XG4gICAgaWYgKGNvbW1vbi5jaGFsbGVuZ2VUeXBlICE9PSAnNycpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgICQocHJldkJ0bkNsYXNzKS5jbGljayhoYW5kbGVQcmV2U3RlcENsaWNrKTtcbiAgICAkKG5leHRCdG5DbGFzcykuY2xpY2soaGFuZGxlTmV4dFN0ZXBDbGljayk7XG4gICAgJChhY3Rpb25CdG5DbGFzcykuY2xpY2soaGFuZGxlQWN0aW9uQ2xpY2spO1xuICAgICQoZmluaXNoQnRuQ2xhc3MpLmNsaWNrKGhhbmRsZUZpbmlzaENsaWNrKTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfSk7XG5cbiAgcmV0dXJuIGNvbW1vbjtcbn0od2luZG93KTsiLCIndXNlIHN0cmljdCc7XG5cbnZhciBfZXh0ZW5kcyA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gKHRhcmdldCkgeyBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgeyB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldOyBmb3IgKHZhciBrZXkgaW4gc291cmNlKSB7IGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc291cmNlLCBrZXkpKSB7IHRhcmdldFtrZXldID0gc291cmNlW2tleV07IH0gfSB9IHJldHVybiB0YXJnZXQ7IH07XG5cbmZ1bmN0aW9uIF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhvYmosIGtleXMpIHsgdmFyIHRhcmdldCA9IHt9OyBmb3IgKHZhciBpIGluIG9iaikgeyBpZiAoa2V5cy5pbmRleE9mKGkpID49IDApIGNvbnRpbnVlOyBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIGkpKSBjb250aW51ZTsgdGFyZ2V0W2ldID0gb2JqW2ldOyB9IHJldHVybiB0YXJnZXQ7IH1cblxuJChkb2N1bWVudCkucmVhZHkoZnVuY3Rpb24gKCkge1xuICB2YXIgY29tbW9uID0gd2luZG93LmNvbW1vbjtcbiAgdmFyIE9ic2VydmFibGUgPSB3aW5kb3cuUnguT2JzZXJ2YWJsZTtcbiAgdmFyIGFkZExvb3BQcm90ZWN0ID0gY29tbW9uLmFkZExvb3BQcm90ZWN0LFxuICAgICAgY2hhbGxlbmdlTmFtZSA9IGNvbW1vbi5jaGFsbGVuZ2VOYW1lLFxuICAgICAgY2hhbGxlbmdlVHlwZSA9IGNvbW1vbi5jaGFsbGVuZ2VUeXBlLFxuICAgICAgY2hhbGxlbmdlVHlwZXMgPSBjb21tb24uY2hhbGxlbmdlVHlwZXM7XG5cblxuICBjb21tb24uaW5pdC5mb3JFYWNoKGZ1bmN0aW9uIChpbml0KSB7XG4gICAgaW5pdCgkKTtcbiAgfSk7XG5cbiAgLy8gb25seSBydW4gaWYgZWRpdG9yIHByZXNlbnRcbiAgaWYgKGNvbW1vbi5lZGl0b3IuZ2V0VmFsdWUpIHtcbiAgICB2YXIgY29kZSQgPSBjb21tb24uZWRpdG9yS2V5VXAkLmRlYm91bmNlKDc1MCkubWFwKGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBjb21tb24uZWRpdG9yLmdldFZhbHVlKCk7XG4gICAgfSkuZGlzdGluY3RVbnRpbENoYW5nZWQoKS5zaGFyZVJlcGxheSgpO1xuXG4gICAgLy8gdXBkYXRlIHN0b3JhZ2VcbiAgICBjb2RlJC5zdWJzY3JpYmUoZnVuY3Rpb24gKGNvZGUpIHtcbiAgICAgIGNvbW1vbi5jb2RlU3RvcmFnZS51cGRhdGVTdG9yYWdlKGNvbW1vbi5jaGFsbGVuZ2VOYW1lLCBjb2RlKTtcbiAgICAgIGNvbW1vbi5jb2RlVXJpLnF1ZXJpZnkoY29kZSk7XG4gICAgfSwgZnVuY3Rpb24gKGVycikge1xuICAgICAgcmV0dXJuIGNvbnNvbGUuZXJyb3IoZXJyKTtcbiAgICB9KTtcblxuICAgIGNvZGUkXG4gICAgLy8gb25seSBydW4gZm9yIEhUTUxcbiAgICAuZmlsdGVyKGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBjb21tb24uY2hhbGxlbmdlVHlwZSA9PT0gY2hhbGxlbmdlVHlwZXMuSFRNTDtcbiAgICB9KS5mbGF0TWFwKGZ1bmN0aW9uIChjb2RlKSB7XG4gICAgICByZXR1cm4gY29tbW9uLmRldGVjdFVuc2FmZUNvZGUkKGNvZGUpLm1hcChmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBjb21iaW5lZENvZGUgPSBjb21tb24uaGVhZCArIGNvZGUgKyBjb21tb24udGFpbDtcblxuICAgICAgICByZXR1cm4gYWRkTG9vcFByb3RlY3QoY29tYmluZWRDb2RlKTtcbiAgICAgIH0pLmZsYXRNYXAoZnVuY3Rpb24gKGNvZGUpIHtcbiAgICAgICAgcmV0dXJuIGNvbW1vbi51cGRhdGVQcmV2aWV3JChjb2RlKTtcbiAgICAgIH0pLmZsYXRNYXAoZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gY29tbW9uLmNoZWNrUHJldmlldyQoeyBjb2RlOiBjb2RlIH0pO1xuICAgICAgfSkuY2F0Y2goZnVuY3Rpb24gKGVycikge1xuICAgICAgICByZXR1cm4gT2JzZXJ2YWJsZS5qdXN0KHsgZXJyOiBlcnIgfSk7XG4gICAgICB9KTtcbiAgICB9KS5zdWJzY3JpYmUoZnVuY3Rpb24gKF9yZWYpIHtcbiAgICAgIHZhciBlcnIgPSBfcmVmLmVycjtcblxuICAgICAgaWYgKGVycikge1xuICAgICAgICBjb25zb2xlLmVycm9yKGVycik7XG4gICAgICAgIHJldHVybiBjb21tb24udXBkYXRlUHJldmlldyQoJ1xcbiAgICAgICAgICAgICAgPGgxPicgKyBlcnIgKyAnPC9oMT5cXG4gICAgICAgICAgICAnKS5zdWJzY3JpYmUoZnVuY3Rpb24gKCkge30pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfSwgZnVuY3Rpb24gKGVycikge1xuICAgICAgcmV0dXJuIGNvbnNvbGUuZXJyb3IoZXJyKTtcbiAgICB9KTtcbiAgfVxuXG4gIGNvbW1vbi5yZXNldEJ0biQuZG9Pbk5leHQoZnVuY3Rpb24gKCkge1xuICAgIGNvbW1vbi5lZGl0b3Iuc2V0VmFsdWUoY29tbW9uLnJlcGxhY2VTYWZlVGFncyhjb21tb24uc2VlZCkpO1xuICB9KS5mbGF0TWFwKGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gY29tbW9uLmV4ZWN1dGVDaGFsbGVuZ2UkKCkuY2F0Y2goZnVuY3Rpb24gKGVycikge1xuICAgICAgcmV0dXJuIE9ic2VydmFibGUuanVzdCh7IGVycjogZXJyIH0pO1xuICAgIH0pO1xuICB9KS5zdWJzY3JpYmUoZnVuY3Rpb24gKF9yZWYyKSB7XG4gICAgdmFyIGVyciA9IF9yZWYyLmVycixcbiAgICAgICAgb3V0cHV0ID0gX3JlZjIub3V0cHV0LFxuICAgICAgICBvcmlnaW5hbENvZGUgPSBfcmVmMi5vcmlnaW5hbENvZGU7XG5cbiAgICBpZiAoZXJyKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGVycik7XG4gICAgICByZXR1cm4gY29tbW9uLnVwZGF0ZU91dHB1dERpc3BsYXkoJycgKyBlcnIpO1xuICAgIH1cbiAgICBjb21tb24uY29kZVN0b3JhZ2UudXBkYXRlU3RvcmFnZShjaGFsbGVuZ2VOYW1lLCBvcmlnaW5hbENvZGUpO1xuICAgIGNvbW1vbi5jb2RlVXJpLnF1ZXJpZnkob3JpZ2luYWxDb2RlKTtcbiAgICBjb21tb24udXBkYXRlT3V0cHV0RGlzcGxheShvdXRwdXQpO1xuICAgIHJldHVybiBudWxsO1xuICB9LCBmdW5jdGlvbiAoZXJyKSB7XG4gICAgaWYgKGVycikge1xuICAgICAgY29uc29sZS5lcnJvcihlcnIpO1xuICAgIH1cbiAgICBjb21tb24udXBkYXRlT3V0cHV0RGlzcGxheSgnJyArIGVycik7XG4gIH0pO1xuXG4gIE9ic2VydmFibGUubWVyZ2UoY29tbW9uLmVkaXRvckV4ZWN1dGUkLCBjb21tb24uc3VibWl0QnRuJCkuZmxhdE1hcChmdW5jdGlvbiAoKSB7XG4gICAgY29tbW9uLmFwcGVuZFRvT3V0cHV0RGlzcGxheSgnXFxuLy8gdGVzdGluZyBjaGFsbGVuZ2UuLi4nKTtcbiAgICByZXR1cm4gY29tbW9uLmV4ZWN1dGVDaGFsbGVuZ2UkKCkubWFwKGZ1bmN0aW9uIChfcmVmMykge1xuICAgICAgdmFyIHRlc3RzID0gX3JlZjMudGVzdHMsXG4gICAgICAgICAgcmVzdCA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhfcmVmMywgWyd0ZXN0cyddKTtcblxuICAgICAgdmFyIHNvbHZlZCA9IHRlc3RzLmV2ZXJ5KGZ1bmN0aW9uICh0ZXN0KSB7XG4gICAgICAgIHJldHVybiAhdGVzdC5lcnI7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBfZXh0ZW5kcyh7fSwgcmVzdCwgeyB0ZXN0czogdGVzdHMsIHNvbHZlZDogc29sdmVkIH0pO1xuICAgIH0pLmNhdGNoKGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgIHJldHVybiBPYnNlcnZhYmxlLmp1c3QoeyBlcnI6IGVyciB9KTtcbiAgICB9KTtcbiAgfSkuc3Vic2NyaWJlKGZ1bmN0aW9uIChfcmVmNCkge1xuICAgIHZhciBlcnIgPSBfcmVmNC5lcnIsXG4gICAgICAgIHNvbHZlZCA9IF9yZWY0LnNvbHZlZCxcbiAgICAgICAgb3V0cHV0ID0gX3JlZjQub3V0cHV0LFxuICAgICAgICB0ZXN0cyA9IF9yZWY0LnRlc3RzO1xuXG4gICAgaWYgKGVycikge1xuICAgICAgY29uc29sZS5lcnJvcihlcnIpO1xuICAgICAgaWYgKGNvbW1vbi5jaGFsbGVuZ2VUeXBlID09PSBjb21tb24uY2hhbGxlbmdlVHlwZXMuSFRNTCkge1xuICAgICAgICByZXR1cm4gY29tbW9uLnVwZGF0ZVByZXZpZXckKCdcXG4gICAgICAgICAgICAgIDxoMT4nICsgZXJyICsgJzwvaDE+XFxuICAgICAgICAgICAgJykuZmlyc3QoKS5zdWJzY3JpYmUoZnVuY3Rpb24gKCkge30pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGNvbW1vbi51cGRhdGVPdXRwdXREaXNwbGF5KCcnICsgZXJyKTtcbiAgICB9XG4gICAgY29tbW9uLnVwZGF0ZU91dHB1dERpc3BsYXkob3V0cHV0KTtcbiAgICBjb21tb24uZGlzcGxheVRlc3RSZXN1bHRzKHRlc3RzKTtcbiAgICBpZiAoc29sdmVkKSB7XG4gICAgICBjb21tb24uc2hvd0NvbXBsZXRpb24oKTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH0sIGZ1bmN0aW9uIChfcmVmNSkge1xuICAgIHZhciBlcnIgPSBfcmVmNS5lcnI7XG5cbiAgICBjb25zb2xlLmVycm9yKGVycik7XG4gICAgY29tbW9uLnVwZGF0ZU91dHB1dERpc3BsYXkoJycgKyBlcnIpO1xuICB9KTtcblxuICAvLyBpbml0aWFsIGNoYWxsZW5nZSBydW4gdG8gcG9wdWxhdGUgdGVzdHNcbiAgaWYgKGNoYWxsZW5nZVR5cGUgPT09IGNoYWxsZW5nZVR5cGVzLkhUTUwpIHtcbiAgICB2YXIgJHByZXZpZXcgPSAkKCcjcHJldmlldycpO1xuICAgIHJldHVybiBPYnNlcnZhYmxlLmZyb21DYWxsYmFjaygkcHJldmlldy5yZWFkeSwgJHByZXZpZXcpKCkuZGVsYXkoNTAwKS5mbGF0TWFwKGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBjb21tb24uZXhlY3V0ZUNoYWxsZW5nZSQoKTtcbiAgICB9KS5jYXRjaChmdW5jdGlvbiAoZXJyKSB7XG4gICAgICByZXR1cm4gT2JzZXJ2YWJsZS5qdXN0KHsgZXJyOiBlcnIgfSk7XG4gICAgfSkuc3Vic2NyaWJlKGZ1bmN0aW9uIChfcmVmNikge1xuICAgICAgdmFyIGVyciA9IF9yZWY2LmVycixcbiAgICAgICAgICB0ZXN0cyA9IF9yZWY2LnRlc3RzO1xuXG4gICAgICBpZiAoZXJyKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyKTtcbiAgICAgICAgaWYgKGNvbW1vbi5jaGFsbGVuZ2VUeXBlID09PSBjb21tb24uY2hhbGxlbmdlVHlwZXMuSFRNTCkge1xuICAgICAgICAgIHJldHVybiBjb21tb24udXBkYXRlUHJldmlldyQoJ1xcbiAgICAgICAgICAgICAgICA8aDE+JyArIGVyciArICc8L2gxPlxcbiAgICAgICAgICAgICAgJykuc3Vic2NyaWJlKGZ1bmN0aW9uICgpIHt9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29tbW9uLnVwZGF0ZU91dHB1dERpc3BsYXkoJycgKyBlcnIpO1xuICAgICAgfVxuICAgICAgY29tbW9uLmRpc3BsYXlUZXN0UmVzdWx0cyh0ZXN0cyk7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9LCBmdW5jdGlvbiAoX3JlZjcpIHtcbiAgICAgIHZhciBlcnIgPSBfcmVmNy5lcnI7XG5cbiAgICAgIGNvbnNvbGUuZXJyb3IoZXJyKTtcbiAgICB9KTtcbiAgfVxuXG4gIGlmIChjaGFsbGVuZ2VUeXBlID09PSBjaGFsbGVuZ2VUeXBlcy5CT05GSVJFIHx8IGNoYWxsZW5nZVR5cGUgPT09IGNoYWxsZW5nZVR5cGVzLkpTKSB7XG4gICAgcmV0dXJuIE9ic2VydmFibGUuanVzdCh7fSkuZGVsYXkoNTAwKS5mbGF0TWFwKGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBjb21tb24uZXhlY3V0ZUNoYWxsZW5nZSQoKTtcbiAgICB9KS5jYXRjaChmdW5jdGlvbiAoZXJyKSB7XG4gICAgICByZXR1cm4gT2JzZXJ2YWJsZS5qdXN0KHsgZXJyOiBlcnIgfSk7XG4gICAgfSkuc3Vic2NyaWJlKGZ1bmN0aW9uIChfcmVmOCkge1xuICAgICAgdmFyIGVyciA9IF9yZWY4LmVycixcbiAgICAgICAgICBvcmlnaW5hbENvZGUgPSBfcmVmOC5vcmlnaW5hbENvZGUsXG4gICAgICAgICAgdGVzdHMgPSBfcmVmOC50ZXN0cztcblxuICAgICAgaWYgKGVycikge1xuICAgICAgICBjb25zb2xlLmVycm9yKGVycik7XG4gICAgICAgIHJldHVybiBjb21tb24udXBkYXRlT3V0cHV0RGlzcGxheSgnJyArIGVycik7XG4gICAgICB9XG4gICAgICBjb21tb24uY29kZVN0b3JhZ2UudXBkYXRlU3RvcmFnZShjaGFsbGVuZ2VOYW1lLCBvcmlnaW5hbENvZGUpO1xuICAgICAgY29tbW9uLmRpc3BsYXlUZXN0UmVzdWx0cyh0ZXN0cyk7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9LCBmdW5jdGlvbiAoZXJyKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGVycik7XG4gICAgICBjb21tb24udXBkYXRlT3V0cHV0RGlzcGxheSgnJyArIGVycik7XG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59KTsiXSwic291cmNlUm9vdCI6Ii9jb21tb25GcmFtZXdvcmsifQ==\n"
  },
  {
    "path": "public/js/dashboard.js",
    "content": "var app = angular.module('app',[]);\napp.controller('dashboard',['$scope','$http', function($scope,$http){\n  $http.post('/dashboard').then(function(res){\n    var out = res.data;\n    $scope.items = out;\n  },function(err){\n    console.log(err);\n  })\n}])\n"
  },
  {
    "path": "public/js/echarts-all-3.js",
    "content": "!function(t,e){\"object\"==typeof exports&&\"object\"==typeof module?module.exports=e():\"function\"==typeof define&&define.amd?define([],e):\"object\"==typeof exports?exports.echarts=e():t.echarts=e()}(this,function(){return function(t){function e(n){if(i[n])return i[n].exports;var r=i[n]={exports:{},id:n,loaded:!1};return t[n].call(r.exports,r,r.exports,e),r.loaded=!0,r.exports}var i={};return e.m=t,e.c=i,e.p=\"\",e(0)}([function(t,e,i){t.exports=i(2),i(94),i(88),i(99),i(175),i(300),i(289),i(310),i(264),i(260),i(256),i(296),i(305),i(242),i(247),i(253),i(285),i(277),i(36),i(188),i(211),i(333),i(330),i(229),i(337),i(323),i(202),i(178),i(348),i(195),i(194),i(193),i(338),i(203),i(219)},function(t,e){function i(t){if(\"object\"==typeof t&&null!==t){var e=t;if(t instanceof Array){e=[];for(var n=0,r=t.length;r>n;n++)e[n]=i(t[n])}else if(!M(t)&&!T(t)){e={};for(var o in t)t.hasOwnProperty(o)&&(e[o]=i(t[o]))}return e}return t}function n(t,e,r){if(!S(e)||!S(t))return r?i(e):t;for(var o in e)if(e.hasOwnProperty(o)){var a=t[o],s=e[o];!S(s)||!S(a)||_(s)||_(a)||T(s)||T(a)||M(s)||M(a)?!r&&o in t||(t[o]=i(e[o],!0)):n(a,s,r)}return t}function r(t,e){for(var i=t[0],r=1,o=t.length;o>r;r++)i=n(i,t[r],e);return i}function o(t,e){for(var i in e)e.hasOwnProperty(i)&&(t[i]=e[i]);return t}function a(t,e,i){for(var n in e)e.hasOwnProperty(n)&&(i?null!=e[n]:null==t[n])&&(t[n]=e[n]);return t}function s(){return document.createElement(\"canvas\")}function l(){return C||(C=V.createCanvas().getContext(\"2d\")),C}function u(t,e){if(t){if(t.indexOf)return t.indexOf(e);for(var i=0,n=t.length;n>i;i++)if(t[i]===e)return i}return-1}function h(t,e){function i(){}var n=t.prototype;i.prototype=e.prototype,t.prototype=new i;for(var r in n)t.prototype[r]=n[r];t.prototype.constructor=t,t.superClass=e}function c(t,e,i){t=\"prototype\"in t?t.prototype:t,e=\"prototype\"in e?e.prototype:e,a(t,e,i)}function d(t){return t?\"string\"==typeof t?!1:\"number\"==typeof t.length:void 0}function f(t,e,i){if(t&&e)if(t.forEach&&t.forEach===z)t.forEach(e,i);else if(t.length===+t.length)for(var n=0,r=t.length;r>n;n++)e.call(i,t[n],n,t);else for(var o in t)t.hasOwnProperty(o)&&e.call(i,t[o],o,t)}function p(t,e,i){if(t&&e){if(t.map&&t.map===R)return t.map(e,i);for(var n=[],r=0,o=t.length;o>r;r++)n.push(e.call(i,t[r],r,t));return n}}function g(t,e,i,n){if(t&&e){if(t.reduce&&t.reduce===N)return t.reduce(e,i,n);for(var r=0,o=t.length;o>r;r++)i=e.call(n,i,t[r],r,t);return i}}function v(t,e,i){if(t&&e){if(t.filter&&t.filter===O)return t.filter(e,i);for(var n=[],r=0,o=t.length;o>r;r++)e.call(i,t[r],r,t)&&n.push(t[r]);return n}}function m(t,e,i){if(t&&e)for(var n=0,r=t.length;r>n;n++)if(e.call(i,t[n],n,t))return t[n]}function y(t,e){var i=E.call(arguments,2);return function(){return t.apply(e,i.concat(E.call(arguments)))}}function x(t){var e=E.call(arguments,1);return function(){return t.apply(this,e.concat(E.call(arguments)))}}function _(t){return\"[object Array]\"===P.call(t)}function b(t){return\"function\"==typeof t}function w(t){return\"[object String]\"===P.call(t)}function S(t){var e=typeof t;return\"function\"===e||!!t&&\"object\"==e}function M(t){return!!D[P.call(t)]}function T(t){return t&&1===t.nodeType&&\"string\"==typeof t.nodeName}function A(t){for(var e=0,i=arguments.length;i>e;e++)if(null!=arguments[e])return arguments[e]}function I(){return Function.call.apply(E,arguments)}function L(t,e){if(!t)throw new Error(e)}var C,D={\"[object Function]\":1,\"[object RegExp]\":1,\"[object Date]\":1,\"[object Error]\":1,\"[object CanvasGradient]\":1,\"[object CanvasPattern]\":1,\"[object Image]\":1},P=Object.prototype.toString,k=Array.prototype,z=k.forEach,O=k.filter,E=k.slice,R=k.map,N=k.reduce,V={inherits:h,mixin:c,clone:i,merge:n,mergeAll:r,extend:o,defaults:a,getContext:l,createCanvas:s,indexOf:u,slice:I,find:m,isArrayLike:d,each:f,map:p,reduce:g,filter:v,bind:y,curry:x,isArray:_,isString:w,isObject:S,isFunction:b,isBuildInObject:M,isDom:T,retrieve:A,assert:L,noop:function(){}};t.exports=V},function(t,e,i){function n(t){return function(e,i,n){e=e&&e.toLowerCase(),P.prototype[t].call(this,e,i,n)}}function r(){P.call(this)}function o(t,e,i){function n(t,e){return t.prio-e.prio}i=i||{},\"string\"==typeof e&&(e=K[e]),this.id,this.group,this._dom=t,this._zr=L.init(t,{renderer:i.renderer||\"canvas\",devicePixelRatio:i.devicePixelRatio}),this._theme=C.clone(e),this._chartsViews=[],this._chartsMap={},this._componentsViews=[],this._componentsMap={},this._api=new _(this),this._coordSysMgr=new b,P.call(this),this._messageCenter=new r,this._initEvents(),this.resize=C.bind(this.resize,this),this._pendingActions=[],k(Q,n),k(Y,n),this._zr.animation.on(\"frame\",this._onframe,this)}function a(t,e){var i=this._model;i&&i.eachComponent({mainType:\"series\",query:e},function(n,r){var o=this._chartsMap[n.__viewId];o&&o.__alive&&o[t](n,i,this._api,e)},this)}function s(t,e,i){var n=this._api;z(this._componentsViews,function(r){var o=r.__model;r[t](o,e,n,i),v(o,r)},this),e.eachSeries(function(r,o){var a=this._chartsMap[r.__viewId];a[t](r,e,n,i),v(r,a),g(r,a)},this),p(this._zr,e)}function l(t,e){for(var i=\"component\"===t,n=i?this._componentsViews:this._chartsViews,r=i?this._componentsMap:this._chartsMap,o=this._zr,a=0;a<n.length;a++)n[a].__alive=!1;e[i?\"eachComponent\":\"eachSeries\"](function(t,a){if(i){if(\"series\"===t)return}else a=t;var s=a.id+\"_\"+a.type,l=r[s];if(!l){var u=S.parseClassType(a.type),h=i?T.getClass(u.main,u.sub):A.getClass(u.sub);if(!h)return;l=new h,l.init(e,this._api),r[s]=l,n.push(l),o.add(l.group)}a.__viewId=s,l.__alive=!0,l.__id=s,l.__model=a},this);for(var a=0;a<n.length;){var s=n[a];s.__alive?a++:(o.remove(s.group),s.dispose(e,this._api),n.splice(a,1),delete r[s.__id])}}function u(t,e){z(Y,function(i){i.func(t,e)})}function h(t){var e={};t.eachSeries(function(t){var i=t.get(\"stack\"),n=t.getData();if(i&&\"list\"===n.type){var r=e[i];r&&(n.stackedOn=r),e[i]=n}})}function c(t,e){var i=this._api;z(Q,function(n){n.isLayout&&n.func(t,i,e)})}function d(t,e){var i=this._api;t.clearColorPalette(),t.eachSeries(function(t){t.clearColorPalette()}),z(Q,function(n){n.func(t,i,e)})}function f(t,e){var i=this._api;z(this._componentsViews,function(n){var r=n.__model;n.render(r,t,i,e),v(r,n)},this),z(this._chartsViews,function(t){t.__alive=!1},this),t.eachSeries(function(n,r){var o=this._chartsMap[n.__viewId];o.__alive=!0,o.render(n,t,i,e),o.group.silent=!!n.get(\"silent\"),v(n,o),g(n,o)},this),p(this._zr,t),z(this._chartsViews,function(e){e.__alive||e.remove(t,i)},this)}function p(t,e){var i=t.storage,n=0;i.traverse(function(t){t.isGroup||n++}),n>e.get(\"hoverLayerThreshold\")&&!y.node&&i.traverse(function(t){t.isGroup||(t.useHoverLayer=!0)})}function g(t,e){var i=0;e.group.traverse(function(t){\"group\"===t.type||t.ignore||i++});var n=+t.get(\"progressive\"),r=i>t.get(\"progressiveThreshold\")&&n&&!y.node;r&&e.group.traverse(function(t){t.isGroup||(t.progressive=r?Math.floor(i++/n):-1,r&&t.stopAnimation(!0))});var o=t.get(\"blendMode\")||null;e.group.traverse(function(t){t.isGroup||t.setStyle(\"blend\",o)})}function v(t,e){var i=t.get(\"z\"),n=t.get(\"zlevel\");e.group.traverse(function(t){\"group\"!==t.type&&(null!=i&&(t.z=i),null!=n&&(t.zlevel=n))})}function m(t){function e(t,e){for(var i=0;i<t.length;i++){var n=t[i];n[o]=e}}var i=0,n=1,r=2,o=\"__connectUpdateStatus\";C.each(X,function(a,s){t._messageCenter.on(s,function(a){if(et[t.group]&&t[o]!==i){var s=t.makeActionFromEvent(a),l=[];for(var u in tt){var h=tt[u];h!==t&&h.group===t.group&&l.push(h)}e(l,i),z(l,function(t){t[o]!==n&&t.dispatchAction(s)}),e(l,r)}})})}/*!\n\t * ECharts, a javascript interactive chart library.\n\t *\n\t * Copyright (c) 2015, Baidu Inc.\n\t * All rights reserved.\n\t *\n\t * LICENSE\n\t * https://github.com/ecomfe/echarts/blob/master/LICENSE.txt\n\t */\nvar y=i(12),x=i(122),_=i(87),b=i(23),w=i(123),S=i(10),M=i(15),T=i(57),A=i(27),I=i(3),L=i(76),C=i(1),D=i(18),P=i(20),k=i(44),z=C.each,O=1e3,E=5e3,R=1e3,N=2e3,V=3e3,B=4e3,G=5e3,F=\"__flag_in_main_process\",H=\"_hasGradientOrPatternBg\",W=\"_optionUpdated\";r.prototype.on=n(\"on\"),r.prototype.off=n(\"off\"),r.prototype.one=n(\"one\"),C.mixin(r,P);var Z=o.prototype;Z._onframe=function(){this[W]&&(this[F]=!0,q.prepareAndUpdate.call(this),this[F]=!1,this[W]=!1)},Z.getDom=function(){return this._dom},Z.getZr=function(){return this._zr},Z.setOption=function(t,e,i){if(this[F]=!0,!this._model||e){var n=new w(this._api),r=this._theme,o=this._model=new x(null,null,r,n);o.init(null,null,r,n)}this._model.setOption(t,$),i?this[W]=!0:(q.prepareAndUpdate.call(this),this._zr.refreshImmediately(),this[W]=!1),this[F]=!1,this._flushPendingActions()},Z.setTheme=function(){console.log(\"ECharts#setTheme() is DEPRECATED in ECharts 3.0\")},Z.getModel=function(){return this._model},Z.getOption=function(){return this._model&&this._model.getOption()},Z.getWidth=function(){return this._zr.getWidth()},Z.getHeight=function(){return this._zr.getHeight()},Z.getRenderedCanvas=function(t){if(y.canvasSupported){t=t||{},t.pixelRatio=t.pixelRatio||1,t.backgroundColor=t.backgroundColor||this._model.get(\"backgroundColor\");var e=this._zr,i=e.storage.getDisplayList();return C.each(i,function(t){t.stopAnimation(!0)}),e.painter.getRenderedCanvas(t)}},Z.getDataURL=function(t){t=t||{};var e=t.excludeComponents,i=this._model,n=[],r=this;z(e,function(t){i.eachComponent({mainType:t},function(t){var e=r._componentsMap[t.__viewId];e.group.ignore||(n.push(e),e.group.ignore=!0)})});var o=this.getRenderedCanvas(t).toDataURL(\"image/\"+(t&&t.type||\"png\"));return z(n,function(t){t.group.ignore=!1}),o},Z.getConnectedDataURL=function(t){if(y.canvasSupported){var e=this.group,i=Math.min,n=Math.max,r=1/0;if(et[e]){var o=r,a=r,s=-r,l=-r,u=[],h=t&&t.pixelRatio||1;for(var c in tt){var d=tt[c];if(d.group===e){var f=d.getRenderedCanvas(C.clone(t)),p=d.getDom().getBoundingClientRect();o=i(p.left,o),a=i(p.top,a),s=n(p.right,s),l=n(p.bottom,l),u.push({dom:f,left:p.left,top:p.top})}}o*=h,a*=h,s*=h,l*=h;var g=s-o,v=l-a,m=C.createCanvas();m.width=g,m.height=v;var x=L.init(m);return z(u,function(t){var e=new I.Image({style:{x:t.left*h-o,y:t.top*h-a,image:t.dom}});x.add(e)}),x.refreshImmediately(),m.toDataURL(\"image/\"+(t&&t.type||\"png\"))}return this.getDataURL(t)}};var q={update:function(t){var e=this._model,i=this._api,n=this._coordSysMgr,r=this._zr;if(e){e.restoreData(),n.create(this._model,this._api),u.call(this,e,i),h.call(this,e),n.update(e,i),d.call(this,e,t),f.call(this,e,t);var o=e.get(\"backgroundColor\")||\"transparent\",a=r.painter;if(a.isSingleCanvas&&a.isSingleCanvas())r.configLayer(0,{clearColor:o});else{if(!y.canvasSupported){var s=D.parse(o);o=D.stringify(s,\"rgb\"),0===s[3]&&(o=\"transparent\")}o.colorStops||o.image?(r.configLayer(0,{clearColor:o}),this[H]=!0,this._dom.style.background=\"transparent\"):(this[H]&&r.configLayer(0,{clearColor:null}),this[H]=!1,this._dom.style.background=o)}}},updateView:function(t){var e=this._model;e&&(e.eachSeries(function(t){t.getData().clearAllVisual()}),d.call(this,e,t),s.call(this,\"updateView\",e,t))},updateVisual:function(t){var e=this._model;e&&(e.eachSeries(function(t){t.getData().clearAllVisual()}),d.call(this,e,t),s.call(this,\"updateVisual\",e,t))},updateLayout:function(t){var e=this._model;e&&(c.call(this,e,t),s.call(this,\"updateLayout\",e,t))},highlight:function(t){a.call(this,\"highlight\",t)},downplay:function(t){a.call(this,\"downplay\",t)},prepareAndUpdate:function(t){var e=this._model;l.call(this,\"component\",e),l.call(this,\"chart\",e),q.update.call(this,t)}};Z.resize=function(){this[F]=!0,this._zr.resize();var t=this._model&&this._model.resetOption(\"media\");q[t?\"prepareAndUpdate\":\"update\"].call(this),this._loadingFX&&this._loadingFX.resize(),this[F]=!1,this._flushPendingActions()},Z.showLoading=function(t,e){if(C.isObject(t)&&(e=t,t=\"\"),t=t||\"default\",this.hideLoading(),J[t]){var i=J[t](this._api,e),n=this._zr;this._loadingFX=i,n.add(i)}},Z.hideLoading=function(){this._loadingFX&&this._zr.remove(this._loadingFX),this._loadingFX=null},Z.makeActionFromEvent=function(t){var e=C.extend({},t);return e.type=X[t.type],e},Z.dispatchAction=function(t,e){var i=U[t.type];if(i){var n=i.actionInfo,r=n.update||\"update\";if(this[F])return void this._pendingActions.push(t);this[F]=!0;var o=[t],a=!1;t.batch&&(a=!0,o=C.map(t.batch,function(e){return e=C.defaults(C.extend({},e),t),e.batch=null,e}));for(var s,l=[],u=\"highlight\"===t.type||\"downplay\"===t.type,h=0;h<o.length;h++){var c=o[h];s=i.action(c,this._model),s=s||C.extend({},c),s.type=n.event||s.type,l.push(s),u&&q[r].call(this,c)}\"none\"===r||u||(this[W]?(q.prepareAndUpdate.call(this,t),this[W]=!1):q[r].call(this,t)),s=a?{type:n.event||t.type,batch:l}:l[0],this[F]=!1,!e&&this._messageCenter.trigger(s.type,s),this._flushPendingActions()}},Z._flushPendingActions=function(){for(var t=this._pendingActions;t.length;){var e=t.shift();this.dispatchAction(e)}},Z.on=n(\"on\"),Z.off=n(\"off\"),Z.one=n(\"one\");var j=[\"click\",\"dblclick\",\"mouseover\",\"mouseout\",\"mousemove\",\"mousedown\",\"mouseup\",\"globalout\"];Z._initEvents=function(){z(j,function(t){this._zr.on(t,function(e){var i=this.getModel(),n=e.target;if(n&&null!=n.dataIndex){var r=n.dataModel||i.getSeriesByIndex(n.seriesIndex),o=r&&r.getDataParams(n.dataIndex,n.dataType)||{};o.event=e,o.type=t,this.trigger(t,o)}else n&&n.eventData&&this.trigger(t,n.eventData)},this)},this),z(X,function(t,e){this._messageCenter.on(e,function(t){this.trigger(e,t)},this)},this)},Z.isDisposed=function(){return this._disposed},Z.clear=function(){this.setOption({series:[]},!0)},Z.dispose=function(){if(!this._disposed){this._disposed=!0;var t=this._api,e=this._model;z(this._componentsViews,function(i){i.dispose(e,t)}),z(this._chartsViews,function(i){i.dispose(e,t)}),this._zr.dispose(),delete tt[this.id]}},C.mixin(o,P);var U=[],X={},Y=[],$=[],Q=[],K={},J={},tt={},et={},it=new Date-0,nt=new Date-0,rt=\"_echarts_instance_\",ot={version:\"3.2.3\",dependencies:{zrender:\"3.1.3\"}};ot.init=function(t,e,i){var n=new o(t,e,i);return n.id=\"ec_\"+it++,tt[n.id]=n,t.setAttribute&&t.setAttribute(rt,n.id),m(n),n},ot.connect=function(t){if(C.isArray(t)){var e=t;t=null,C.each(e,function(e){null!=e.group&&(t=e.group)}),t=t||\"g_\"+nt++,C.each(e,function(e){e.group=t})}return et[t]=!0,t},ot.disConnect=function(t){et[t]=!1},ot.dispose=function(t){C.isDom(t)?t=ot.getInstanceByDom(t):\"string\"==typeof t&&(t=tt[t]),t instanceof o&&!t.isDisposed()&&t.dispose()},ot.getInstanceByDom=function(t){var e=t.getAttribute(rt);return tt[e]},ot.getInstanceById=function(t){return tt[t]},ot.registerTheme=function(t,e){K[t]=e},ot.registerPreprocessor=function(t){$.push(t)},ot.registerProcessor=function(t,e){\"function\"==typeof t&&(e=t,t=O),Y.push({prio:t,func:e})},ot.registerAction=function(t,e,i){\"function\"==typeof e&&(i=e,e=\"\");var n=C.isObject(t)?t.type:[t,t={event:e}][0];t.event=(t.event||n).toLowerCase(),e=t.event,U[n]||(U[n]={action:i,actionInfo:t}),X[e]=n},ot.registerCoordinateSystem=function(t,e){b.register(t,e)},ot.registerLayout=function(t,e){\"function\"==typeof t&&(e=t,t=R),Q.push({prio:t,func:e,isLayout:!0})},ot.registerVisual=function(t,e){\"function\"==typeof t&&(e=t,t=V),Q.push({prio:t,func:e})},ot.registerLoading=function(t,e){J[t]=e};var at=S.parseClassType;ot.extendComponentModel=function(t,e){var i=S;if(e){var n=at(e);i=S.getClass(n.main,n.sub,!0)}return i.extend(t)},ot.extendComponentView=function(t,e){var i=T;if(e){var n=at(e);i=T.getClass(n.main,n.sub,!0)}return i.extend(t)},ot.extendSeriesModel=function(t,e){var i=M;if(e){e=\"series.\"+e.replace(\"series.\",\"\");var n=at(e);i=M.getClass(n.main,n.sub,!0)}return i.extend(t)},ot.extendChartView=function(t,e){var i=A;if(e){e.replace(\"series.\",\"\");var n=at(e);i=A.getClass(n.main,!0)}return i.extend(t)},ot.setCanvasCreator=function(t){C.createCanvas=t},ot.registerVisual(N,i(136)),ot.registerPreprocessor(i(130)),ot.registerLoading(\"default\",i(121)),ot.registerAction({type:\"highlight\",event:\"highlight\",update:\"highlight\"},C.noop),ot.registerAction({type:\"downplay\",event:\"downplay\",update:\"downplay\"},C.noop),ot.List=i(14),ot.Model=i(9),ot.graphic=i(3),ot.number=i(4),ot.format=i(8),ot.matrix=i(19),ot.vector=i(5),ot.color=i(18),ot.util={},z([\"map\",\"each\",\"filter\",\"indexOf\",\"inherits\",\"reduce\",\"filter\",\"bind\",\"curry\",\"isArray\",\"isString\",\"isObject\",\"isFunction\",\"extend\",\"defaults\"],function(t){ot.util[t]=C[t]}),ot.PRIORITY={PROCESSOR:{FILTER:O,STATISTIC:E},VISUAL:{LAYOUT:R,GLOBAL:N,CHART:V,COMPONENT:B,BRUSH:G}},t.exports=ot},function(t,e,i){\"use strict\";function n(t){return null!=t&&\"none\"!=t}function r(t){return\"string\"==typeof t?_.lift(t,-.1):t}function o(t){if(t.__hoverStlDirty){var e=t.style.stroke,i=t.style.fill,o=t.__hoverStl;o.fill=o.fill||(n(i)?r(i):null),o.stroke=o.stroke||(n(e)?r(e):null);var a={};for(var s in o)o.hasOwnProperty(s)&&(a[s]=t.style[s]);t.__normalStl=a,t.__hoverStlDirty=!1}}function a(t){t.__isHover||(o(t),t.useHoverLayer?t.__zr&&t.__zr.addHover(t,t.__hoverStl):(t.setStyle(t.__hoverStl),t.z2+=1),t.__isHover=!0)}function s(t){if(t.__isHover){var e=t.__normalStl;t.useHoverLayer?t.__zr&&t.__zr.removeHover(t):(e&&t.setStyle(e),t.z2-=1),t.__isHover=!1}}function l(t){\"group\"===t.type?t.traverse(function(t){\"group\"!==t.type&&a(t)}):a(t)}function u(t){\"group\"===t.type?t.traverse(function(t){\"group\"!==t.type&&s(t)}):s(t)}function h(t,e){t.__hoverStl=t.hoverStyle||e||{},t.__hoverStlDirty=!0,t.__isHover&&o(t)}function c(){!this.__isEmphasis&&l(this)}function d(){!this.__isEmphasis&&u(this)}function f(){this.__isEmphasis=!0,l(this)}function p(){this.__isEmphasis=!1,u(this)}function g(t,e,i,n,r,o){\"function\"==typeof r&&(o=r,r=null);var a=n&&(n.ifEnableAnimation?n.ifEnableAnimation():n.getShallow(\"animation\"));if(a){var s=t?\"Update\":\"\",l=n&&n.getShallow(\"animationDuration\"+s),u=n&&n.getShallow(\"animationEasing\"+s),h=n&&n.getShallow(\"animationDelay\"+s);\"function\"==typeof h&&(h=h(r)),l>0?e.animateTo(i,l,h||0,u,o):(e.attr(i),o&&o())}else e.attr(i),o&&o()}var v=i(1),m=i(166),y=Math.round,x=i(6),_=i(18),b=i(19),w=i(5),S=(i(29),{});S.Group=i(34),S.Image=i(48),S.Text=i(74),S.Circle=i(157),S.Sector=i(163),S.Ring=i(162),S.Polygon=i(159),S.Polyline=i(160),S.Rect=i(161),S.Line=i(158),S.BezierCurve=i(156),S.Arc=i(155),S.CompoundPath=i(150),S.LinearGradient=i(85),S.RadialGradient=i(151),S.BoundingRect=i(7),S.extendShape=function(t){return x.extend(t)},S.extendPath=function(t,e){return m.extendFromString(t,e)},S.makePath=function(t,e,i,n){var r=m.createFromString(t,e),o=r.getBoundingRect();if(i){var a=o.width/o.height;if(\"center\"===n){var s,l=i.height*a;l<=i.width?s=i.height:(l=i.width,s=l/a);var u=i.x+i.width/2,h=i.y+i.height/2;i.x=u-l/2,i.y=h-s/2,i.width=l,i.height=s}this.resizePath(r,i)}return r},S.mergePath=m.mergePath,S.resizePath=function(t,e){if(t.applyTransform){var i=t.getBoundingRect(),n=i.calculateTransform(e);t.applyTransform(n)}},S.subPixelOptimizeLine=function(t){var e=S.subPixelOptimize,i=t.shape,n=t.style.lineWidth;return y(2*i.x1)===y(2*i.x2)&&(i.x1=i.x2=e(i.x1,n,!0)),y(2*i.y1)===y(2*i.y2)&&(i.y1=i.y2=e(i.y1,n,!0)),t},S.subPixelOptimizeRect=function(t){var e=S.subPixelOptimize,i=t.shape,n=t.style.lineWidth,r=i.x,o=i.y,a=i.width,s=i.height;return i.x=e(i.x,n,!0),i.y=e(i.y,n,!0),i.width=Math.max(e(r+a,n,!1)-i.x,0===a?0:1),i.height=Math.max(e(o+s,n,!1)-i.y,0===s?0:1),t},S.subPixelOptimize=function(t,e,i){var n=y(2*t);return(n+y(e))%2===0?n/2:(n+(i?1:-1))/2},S.setHoverStyle=function(t,e){\"group\"===t.type?t.traverse(function(t){\"group\"!==t.type&&h(t,e)}):h(t,e),t.on(\"mouseover\",c).on(\"mouseout\",d),t.on(\"emphasis\",f).on(\"normal\",p)},S.setText=function(t,e,i){var n=e.getShallow(\"position\")||\"inside\",r=n.indexOf(\"inside\")>=0?\"white\":i,o=e.getModel(\"textStyle\");v.extend(t,{textDistance:e.getShallow(\"distance\")||5,textFont:o.getFont(),textPosition:n,textFill:o.getTextColor()||r})},S.updateProps=function(t,e,i,n,r){g(!0,t,e,i,n,r)},S.initProps=function(t,e,i,n,r){g(!1,t,e,i,n,r)},S.getTransform=function(t,e){for(var i=b.identity([]);t&&t!==e;)b.mul(i,t.getLocalTransform(),i),t=t.parent;return i},S.applyTransform=function(t,e,i){return i&&(e=b.invert([],e)),w.applyTransform([],t,e)},S.transformDirection=function(t,e,i){var n=0===e[4]||0===e[5]||0===e[0]?1:Math.abs(2*e[4]/e[0]),r=0===e[4]||0===e[5]||0===e[2]?1:Math.abs(2*e[4]/e[2]),o=[\"left\"===t?-n:\"right\"===t?n:0,\"top\"===t?-r:\"bottom\"===t?r:0];return o=S.applyTransform(o,e,i),Math.abs(o[0])>Math.abs(o[1])?o[0]>0?\"right\":\"left\":o[1]>0?\"bottom\":\"top\"},S.groupTransition=function(t,e,i,n){function r(t){var e={};return t.traverse(function(t){!t.isGroup&&t.anid&&(e[t.anid]=t)}),e}function o(t){var e={position:w.clone(t.position),rotation:t.rotation};return t.shape&&(e.shape=v.extend({},t.shape)),e}if(t&&e){var a=r(t);e.traverse(function(t){if(!t.isGroup&&t.anid){var e=a[t.anid];if(e){var n=o(t);t.attr(o(e)),S.updateProps(t,n,i,t.dataIndex)}}})}},t.exports=S},function(t,e){function i(t){return t.replace(/^\\s+/,\"\").replace(/\\s+$/,\"\")}var n={},r=1e-4;n.linearMap=function(t,e,i,n){var r=e[1]-e[0],o=i[1]-i[0];if(0===r)return 0===o?i[0]:(i[0]+i[1])/2;if(n)if(r>0){if(t<=e[0])return i[0];if(t>=e[1])return i[1]}else{if(t>=e[0])return i[0];if(t<=e[1])return i[1]}else{if(t===e[0])return i[0];if(t===e[1])return i[1]}return(t-e[0])/r*o+i[0]},n.parsePercent=function(t,e){switch(t){case\"center\":case\"middle\":t=\"50%\";break;case\"left\":case\"top\":t=\"0%\";break;case\"right\":case\"bottom\":t=\"100%\"}return\"string\"==typeof t?i(t).match(/%$/)?parseFloat(t)/100*e:parseFloat(t):null==t?NaN:+t},n.round=function(t,e){return null==e&&(e=10),+(+t).toFixed(e)},n.asc=function(t){return t.sort(function(t,e){return t-e}),t},n.getPrecision=function(t){if(t=+t,isNaN(t))return 0;for(var e=1,i=0;Math.round(t*e)/e!==t;)e*=10,i++;return i},n.getPrecisionSafe=function(t){var e=t.toString(),i=e.indexOf(\".\");return 0>i?0:e.length-1-i},n.getPixelPrecision=function(t,e){var i=Math.log,n=Math.LN10,r=Math.floor(i(t[1]-t[0])/n),o=Math.round(i(Math.abs(e[1]-e[0]))/n);return Math.max(-r+o,0)},n.MAX_SAFE_INTEGER=9007199254740991,n.remRadian=function(t){var e=2*Math.PI;return(t%e+e)%e},n.isRadianAroundZero=function(t){return t>-r&&r>t},n.parseDate=function(t){if(t instanceof Date)return t;if(\"string\"==typeof t){var e=new Date(t);return isNaN(+e)&&(e=new Date(new Date(t.replace(/-/g,\"/\"))-new Date(\"1970/01/01\"))),e}return new Date(Math.round(t))},n.quantity=function(t){return Math.pow(10,Math.floor(Math.log(t)/Math.LN10))},n.nice=function(t,e){var i,r=n.quantity(t),o=t/r;return i=e?1.5>o?1:2.5>o?2:4>o?3:7>o?5:10:1>o?1:2>o?2:3>o?3:5>o?5:10,i*r},t.exports=n},function(t,e){var i=\"undefined\"==typeof Float32Array?Array:Float32Array,n={create:function(t,e){var n=new i(2);return null==t&&(t=0),null==e&&(e=0),n[0]=t,n[1]=e,n},copy:function(t,e){return t[0]=e[0],t[1]=e[1],t},clone:function(t){var e=new i(2);return e[0]=t[0],e[1]=t[1],e},set:function(t,e,i){return t[0]=e,t[1]=i,t},add:function(t,e,i){return t[0]=e[0]+i[0],t[1]=e[1]+i[1],t},scaleAndAdd:function(t,e,i,n){return t[0]=e[0]+i[0]*n,t[1]=e[1]+i[1]*n,t},sub:function(t,e,i){return t[0]=e[0]-i[0],t[1]=e[1]-i[1],t},len:function(t){return Math.sqrt(this.lenSquare(t))},lenSquare:function(t){return t[0]*t[0]+t[1]*t[1]},mul:function(t,e,i){return t[0]=e[0]*i[0],t[1]=e[1]*i[1],t},div:function(t,e,i){return t[0]=e[0]/i[0],t[1]=e[1]/i[1],t},dot:function(t,e){return t[0]*e[0]+t[1]*e[1]},scale:function(t,e,i){return t[0]=e[0]*i,t[1]=e[1]*i,t},normalize:function(t,e){var i=n.len(e);return 0===i?(t[0]=0,t[1]=0):(t[0]=e[0]/i,t[1]=e[1]/i),t},distance:function(t,e){return Math.sqrt((t[0]-e[0])*(t[0]-e[0])+(t[1]-e[1])*(t[1]-e[1]))},distanceSquare:function(t,e){return(t[0]-e[0])*(t[0]-e[0])+(t[1]-e[1])*(t[1]-e[1])},negate:function(t,e){return t[0]=-e[0],t[1]=-e[1],t},lerp:function(t,e,i,n){return t[0]=e[0]+n*(i[0]-e[0]),t[1]=e[1]+n*(i[1]-e[1]),t},applyTransform:function(t,e,i){var n=e[0],r=e[1];return t[0]=i[0]*n+i[2]*r+i[4],t[1]=i[1]*n+i[3]*r+i[5],t},min:function(t,e,i){return t[0]=Math.min(e[0],i[0]),t[1]=Math.min(e[1],i[1]),t},max:function(t,e,i){return t[0]=Math.max(e[0],i[0]),t[1]=Math.max(e[1],i[1]),t}};n.length=n.len,n.lengthSquare=n.lenSquare,n.dist=n.distance,n.distSquare=n.distanceSquare,t.exports=n},function(t,e,i){function n(t){r.call(this,t),this.path=new a}var r=i(37),o=i(1),a=i(28),s=i(146),l=i(63),u=l.prototype.getCanvasPattern,h=Math.abs;n.prototype={constructor:n,type:\"path\",__dirtyPath:!0,strokeContainThreshold:5,brush:function(t,e){var i=this.style,n=this.path,r=i.hasStroke(),o=i.hasFill(),a=i.fill,s=i.stroke,l=o&&!!a.colorStops,h=r&&!!s.colorStops,c=o&&!!a.image,d=r&&!!s.image;if(i.bind(t,this,e),this.setTransform(t),this.__dirty){var f=this.getBoundingRect();l&&(this._fillGradient=i.getGradient(t,a,f)),h&&(this._strokeGradient=i.getGradient(t,s,f))}l?t.fillStyle=this._fillGradient:c&&(t.fillStyle=u.call(a,t)),h?t.strokeStyle=this._strokeGradient:d&&(t.strokeStyle=u.call(s,t));var p=i.lineDash,g=i.lineDashOffset,v=!!t.setLineDash,m=this.getGlobalScale();n.setScale(m[0],m[1]),this.__dirtyPath||p&&!v&&r?(n=this.path.beginPath(t),p&&!v&&(n.setLineDash(p),n.setLineDashOffset(g)),this.buildPath(n,this.shape,!1),this.__dirtyPath=!1):(t.beginPath(),this.path.rebuildPath(t)),o&&n.fill(t),p&&v&&(t.setLineDash(p),t.lineDashOffset=g),r&&n.stroke(t),p&&v&&t.setLineDash([]),this.restoreTransform(t),(i.text||0===i.text)&&this.drawRectText(t,this.getBoundingRect())},buildPath:function(t,e,i){},getBoundingRect:function(){var t=this._rect,e=this.style,i=!t;if(i){var n=this.path;this.__dirtyPath&&(n.beginPath(),this.buildPath(n,this.shape,!1)),t=n.getBoundingRect()}if(this._rect=t,e.hasStroke()){var r=this._rectWithStroke||(this._rectWithStroke=t.clone());if(this.__dirty||i){r.copy(t);var o=e.lineWidth,a=e.strokeNoScale?this.getLineScale():1;e.hasFill()||(o=Math.max(o,this.strokeContainThreshold||4)),a>1e-10&&(r.width+=o/a,r.height+=o/a,r.x-=o/a/2,r.y-=o/a/2)}return r}return t},contain:function(t,e){var i=this.transformCoordToLocal(t,e),n=this.getBoundingRect(),r=this.style;if(t=i[0],e=i[1],n.contain(t,e)){var o=this.path.data;if(r.hasStroke()){var a=r.lineWidth,l=r.strokeNoScale?this.getLineScale():1;if(l>1e-10&&(r.hasFill()||(a=Math.max(a,this.strokeContainThreshold)),s.containStroke(o,a/l,t,e)))return!0}if(r.hasFill())return s.contain(o,t,e)}return!1},dirty:function(t){null==t&&(t=!0),t&&(this.__dirtyPath=t,this._rect=null),this.__dirty=!0,this.__zr&&this.__zr.refresh(),this.__clipTarget&&this.__clipTarget.dirty()},animateShape:function(t){return this.animate(\"shape\",t)},attrKV:function(t,e){\"shape\"===t?(this.setShape(e),this.__dirtyPath=!0,this._rect=null):r.prototype.attrKV.call(this,t,e)},setShape:function(t,e){var i=this.shape;if(i){if(o.isObject(t))for(var n in t)i[n]=t[n];else i[t]=e;this.dirty(!0)}return this},getLineScale:function(){var t=this.transform;return t&&h(t[0]-1)>1e-10&&h(t[3]-1)>1e-10?Math.sqrt(h(t[0]*t[3]-t[2]*t[1])):1}},n.extend=function(t){var e=function(e){n.call(this,e),t.style&&this.style.extendFrom(t.style,!1);var i=t.shape;if(i){this.shape=this.shape||{};var r=this.shape;for(var o in i)!r.hasOwnProperty(o)&&i.hasOwnProperty(o)&&(r[o]=i[o])}t.init&&t.init.call(this,e)};o.inherits(e,n);for(var i in t)\"style\"!==i&&\"shape\"!==i&&(e.prototype[i]=t[i]);return e},o.inherits(n,r),t.exports=n},function(t,e,i){\"use strict\";function n(t,e,i,n){this.x=t,this.y=e,this.width=i,this.height=n}var r=i(5),o=i(19),a=r.applyTransform,s=Math.min,l=Math.abs,u=Math.max;n.prototype={constructor:n,union:function(t){var e=s(t.x,this.x),i=s(t.y,this.y);this.width=u(t.x+t.width,this.x+this.width)-e,this.height=u(t.y+t.height,this.y+this.height)-i,this.x=e,this.y=i},applyTransform:function(){var t=[],e=[];return function(i){i&&(t[0]=this.x,t[1]=this.y,e[0]=this.x+this.width,e[1]=this.y+this.height,a(t,t,i),a(e,e,i),this.x=s(t[0],e[0]),this.y=s(t[1],e[1]),this.width=l(e[0]-t[0]),this.height=l(e[1]-t[1]))}}(),calculateTransform:function(t){var e=this,i=t.width/e.width,n=t.height/e.height,r=o.create();return o.translate(r,r,[-e.x,-e.y]),o.scale(r,r,[i,n]),o.translate(r,r,[t.x,t.y]),r},intersect:function(t){var e=this,i=e.x,n=e.x+e.width,r=e.y,o=e.y+e.height,a=t.x,s=t.x+t.width,l=t.y,u=t.y+t.height;return!(a>n||i>s||l>o||r>u)},contain:function(t,e){var i=this;return t>=i.x&&t<=i.x+i.width&&e>=i.y&&e<=i.y+i.height},clone:function(){return new n(this.x,this.y,this.width,this.height)},copy:function(t){this.x=t.x,this.y=t.y,this.width=t.width,this.height=t.height}},t.exports=n},function(t,e,i){var n=i(1),r=i(4),o=i(16),a={};a.addCommas=function(t){return isNaN(t)?\"-\":(t=(t+\"\").split(\".\"),t[0].replace(/(\\d{1,3})(?=(?:\\d{3})+(?!\\d))/g,\"$1,\")+(t.length>1?\".\"+t[1]:\"\"))},a.toCamelCase=function(t){return t.toLowerCase().replace(/-(.)/g,function(t,e){return e.toUpperCase()})},a.normalizeCssArray=function(t){var e=t.length;return\"number\"==typeof t?[t,t,t,t]:2===e?[t[0],t[1],t[0],t[1]]:3===e?[t[0],t[1],t[2],t[1]]:t},a.encodeHTML=function(t){return String(t).replace(/&/g,\"&amp;\").replace(/</g,\"&lt;\").replace(/>/g,\"&gt;\").replace(/\"/g,\"&quot;\").replace(/'/g,\"&#39;\")};var s=[\"a\",\"b\",\"c\",\"d\",\"e\",\"f\",\"g\"],l=function(t,e){return\"{\"+t+(null==e?\"\":e)+\"}\"};a.formatTpl=function(t,e){n.isArray(e)||(e=[e]);var i=e.length;if(!i)return\"\";for(var r=e[0].$vars||[],o=0;o<r.length;o++){var a=s[o];t=t.replace(l(a),l(a,0))}for(var u=0;i>u;u++)for(var h=0;h<r.length;h++)t=t.replace(l(s[h],u),e[u][r[h]]);return t};var u=function(t){return 10>t?\"0\"+t:t};a.formatTime=function(t,e){\"week\"!==t&&\"month\"!==t&&\"quarter\"!==t&&\"half-year\"!==t&&\"year\"!==t||(t=\"MM-dd\\nyyyy\");var i=r.parseDate(e),n=i.getFullYear(),o=i.getMonth()+1,a=i.getDate(),s=i.getHours(),l=i.getMinutes(),h=i.getSeconds();return t=t.replace(\"MM\",u(o)).toLowerCase().replace(\"yyyy\",n).replace(\"yy\",n%100).replace(\"dd\",u(a)).replace(\"d\",a).replace(\"hh\",u(s)).replace(\"h\",s).replace(\"mm\",u(l)).replace(\"m\",l).replace(\"ss\",u(h)).replace(\"s\",h)},a.capitalFirst=function(t){return t?t.charAt(0).toUpperCase()+t.substr(1):t},a.truncateText=o.truncateText,t.exports=a},function(t,e,i){function n(t,e,i){this.parentModel=e,this.ecModel=i,this.option=t}var r=i(1),o=i(21);n.prototype={constructor:n,init:null,mergeOption:function(t){r.merge(this.option,t,!0)},get:function(t,e){if(!t)return this.option;\"string\"==typeof t&&(t=t.split(\".\"));for(var i=this.option,n=this.parentModel,r=0;r<t.length&&(!t[r]||(i=i&&\"object\"==typeof i?i[t[r]]:null,null!=i));r++);return null==i&&n&&!e&&(i=n.get(t)),i},getShallow:function(t,e){var i=this.option,n=null==i?i:i[t],r=this.parentModel;return null==n&&r&&!e&&(n=r.getShallow(t)),n},getModel:function(t,e){var i=this.get(t,!0),r=this.parentModel,o=new n(i,e||r&&r.getModel(t),this.ecModel);return o},isEmpty:function(){return null==this.option},restoreData:function(){},clone:function(){var t=this.constructor;return new t(r.clone(this.option))},setReadOnly:function(t){o.setReadOnly(this,t)}},o.enableClassExtend(n);var a=r.mixin;a(n,i(128)),a(n,i(125)),a(n,i(129)),a(n,i(127)),t.exports=n},function(t,e,i){function n(t){var e=[];return o.each(h.getClassesByMainType(t),function(t){a.apply(e,t.prototype.dependencies||[])}),o.map(e,function(t){return l.parseClassType(t).main})}var r=i(9),o=i(1),a=Array.prototype.push,s=i(43),l=i(21),u=i(13),h=r.extend({type:\"component\",id:\"\",name:\"\",mainType:\"\",subType:\"\",componentIndex:0,defaultOption:null,ecModel:null,dependentModels:[],uid:null,layoutMode:null,$constructor:function(t,e,i,n){r.call(this,t,e,i,n),o.extend(this,n),this.uid=s.getUID(\"componentModel\")},init:function(t,e,i,n){this.mergeDefaultAndTheme(t,i)},mergeDefaultAndTheme:function(t,e){var i=this.layoutMode,n=i?u.getLayoutParams(t):{},r=e.getTheme();o.merge(t,r.get(this.mainType)),o.merge(t,this.getDefaultOption()),i&&u.mergeLayoutParam(t,n,i)},mergeOption:function(t){o.merge(this.option,t,!0);var e=this.layoutMode;e&&u.mergeLayoutParam(this.option,t,e)},optionUpdated:function(t,e){},getDefaultOption:function(){if(!this.hasOwnProperty(\"__defaultOption\")){for(var t=[],e=this.constructor;e;){var i=e.prototype.defaultOption;i&&t.push(i),e=e.superClass}for(var n={},r=t.length-1;r>=0;r--)n=o.merge(n,t[r],!0);this.__defaultOption=n}return this.__defaultOption}});l.enableClassManagement(h,{registerWhenExtend:!0}),s.enableSubTypeDefaulter(h),s.enableTopologicalTravel(h,n),o.mixin(h,i(126)),t.exports=h},function(t,e,i){var n=i(8),r=i(4),o=i(9),a=i(1),s={};s.normalizeToArray=function(t){return t instanceof Array?t:null==t?[]:[t]},s.defaultEmphasis=function(t,e){if(t){var i=t.emphasis=t.emphasis||{},n=t.normal=t.normal||{};a.each(e,function(t){var e=a.retrieve(i[t],n[t]);null!=e&&(i[t]=e)})}},s.LABEL_OPTIONS=[\"position\",\"show\",\"textStyle\",\"distance\",\"formatter\"],s.getDataItemValue=function(t){return t&&(null==t.value?t:t.value)},s.isDataItemOption=function(t){return a.isObject(t)&&!(t instanceof Array)},s.converDataValue=function(t,e){var i=e&&e.type;return\"ordinal\"===i?t:(\"time\"!==i||isFinite(t)||null==t||\"-\"===t||(t=+r.parseDate(t)),null==t||\"\"===t?NaN:+t)},s.createDataFormatModel=function(t,e){var i=new o;return a.mixin(i,s.dataFormatMixin),i.seriesIndex=e.seriesIndex,i.name=e.name||\"\",i.mainType=e.mainType,i.subType=e.subType,i.getData=function(){return t},i},s.dataFormatMixin={getDataParams:function(t,e){var i=this.getData(e),n=this.seriesIndex,r=this.name,o=this.getRawValue(t,e),a=i.getRawIndex(t),s=i.getName(t,!0),l=i.getRawDataItem(t);return{componentType:this.mainType,componentSubType:this.subType,seriesType:\"series\"===this.mainType?this.subType:null,seriesIndex:n,seriesName:r,name:s,dataIndex:a,data:l,dataType:e,value:o,color:i.getItemVisual(t,\"color\"),$vars:[\"seriesName\",\"name\",\"value\"]}},getFormattedLabel:function(t,e,i,r){e=e||\"normal\";var o=this.getData(i),a=o.getItemModel(t),s=this.getDataParams(t,i);null!=r&&s.value instanceof Array&&(s.value=s.value[r]);var l=a.get([\"label\",e,\"formatter\"]);return\"function\"==typeof l?(s.status=e,l(s)):\"string\"==typeof l?n.formatTpl(l,s):void 0},getRawValue:function(t,e){var i=this.getData(e),n=i.getRawDataItem(t);return null!=n?!a.isObject(n)||n instanceof Array?n:n.value:void 0},formatTooltip:a.noop},s.mappingToExists=function(t,e){e=(e||[]).slice();var i=a.map(t||[],function(t,e){return{exist:t}});return a.each(e,function(t,n){if(a.isObject(t)){for(var r=0;r<i.length;r++)if(!i[r].option&&null!=t.id&&i[r].exist.id===t.id+\"\")return i[r].option=t,void(e[n]=null);for(var r=0;r<i.length;r++){var o=i[r].exist;if(!(i[r].option||null!=o.id&&null!=t.id||null==t.name||s.isIdInner(t)||s.isIdInner(o)||o.name!==t.name+\"\"))return i[r].option=t,void(e[n]=null)}}}),a.each(e,function(t,e){if(a.isObject(t)){for(var n=0;n<i.length;n++){var r=i[n].exist;if(!i[n].option&&!s.isIdInner(r)&&null==t.id){i[n].option=t;break}}n>=i.length&&i.push({option:t})}}),i},s.isIdInner=function(t){return a.isObject(t)&&t.id&&0===(t.id+\"\").indexOf(\"\\x00_ec_\\x00\")},s.compressBatches=function(t,e){function i(t,e,i){for(var n=0,r=t.length;r>n;n++)for(var o=t[n].seriesId,a=s.normalizeToArray(t[n].dataIndex),l=i&&i[o],u=0,h=a.length;h>u;u++){var c=a[u];l&&l[c]?l[c]=null:(e[o]||(e[o]={}))[c]=1}}function n(t,e){var i=[];for(var r in t)if(t.hasOwnProperty(r)&&null!=t[r])if(e)i.push(+r);else{var o=n(t[r],!0);o.length&&i.push({seriesId:r,dataIndex:o})}return i}var r={},o={};return i(t||[],r),i(e||[],o,r),[n(r),n(o)]},t.exports=s},function(t,e){function i(t){var e={},i={},n=t.match(/Firefox\\/([\\d.]+)/),r=t.match(/MSIE\\s([\\d.]+)/)||t.match(/Trident\\/.+?rv:(([\\d.]+))/),o=t.match(/Edge\\/([\\d.]+)/);return n&&(i.firefox=!0,i.version=n[1]),r&&(i.ie=!0,i.version=r[1]),r&&(i.ie=!0,i.version=r[1]),o&&(i.edge=!0,i.version=o[1]),{browser:i,os:e,node:!1,canvasSupported:!!document.createElement(\"canvas\").getContext,touchEventsSupported:\"ontouchstart\"in window&&!i.ie&&!i.edge,pointerEventsSupported:\"onpointerdown\"in window&&(i.edge||i.ie&&i.version>=10)}}var n={};n=\"undefined\"==typeof navigator?{browser:{},os:{},node:!0,canvasSupported:!0}:i(navigator.userAgent),t.exports=n},function(t,e,i){\"use strict\";function n(t,e,i,n,r){var o=0,a=0;null==n&&(n=1/0),null==r&&(r=1/0);var s=0;e.eachChild(function(l,u){var h,c,d=l.position,f=l.getBoundingRect(),p=e.childAt(u+1),g=p&&p.getBoundingRect();if(\"horizontal\"===t){var v=f.width+(g?-g.x+f.x:0);h=o+v,h>n||l.newline?(o=0,h=v,a+=s+i,s=f.height):s=Math.max(s,f.height)}else{var m=f.height+(g?-g.y+f.y:0);c=a+m,c>r||l.newline?(o+=s+i,a=0,c=m,s=f.width):s=Math.max(s,f.width)}l.newline||(d[0]=o,d[1]=a,\"horizontal\"===t?o=h+i:a=c+i)})}var r=i(1),o=i(7),a=i(4),s=i(8),l=a.parsePercent,u=r.each,h={},c=[\"left\",\"right\",\"top\",\"bottom\",\"width\",\"height\"];h.box=n,h.vbox=r.curry(n,\"vertical\"),h.hbox=r.curry(n,\"horizontal\"),h.getAvailableSize=function(t,e,i){var n=e.width,r=e.height,o=l(t.x,n),a=l(t.y,r),u=l(t.x2,n),h=l(t.y2,r);return(isNaN(o)||isNaN(parseFloat(t.x)))&&(o=0),(isNaN(u)||isNaN(parseFloat(t.x2)))&&(u=n),(isNaN(a)||isNaN(parseFloat(t.y)))&&(a=0),(isNaN(h)||isNaN(parseFloat(t.y2)))&&(h=r),i=s.normalizeCssArray(i||0),{width:Math.max(u-o-i[1]-i[3],0),height:Math.max(h-a-i[0]-i[2],0)}},h.getLayoutRect=function(t,e,i){i=s.normalizeCssArray(i||0);var n=e.width,r=e.height,a=l(t.left,n),u=l(t.top,r),h=l(t.right,n),c=l(t.bottom,r),d=l(t.width,n),f=l(t.height,r),p=i[2]+i[0],g=i[1]+i[3],v=t.aspect;switch(isNaN(d)&&(d=n-h-g-a),isNaN(f)&&(f=r-c-p-u),isNaN(d)&&isNaN(f)&&(v>n/r?d=.8*n:f=.8*r),null!=v&&(isNaN(d)&&(d=v*f),isNaN(f)&&(f=d/v)),isNaN(a)&&(a=n-h-d-g),isNaN(u)&&(u=r-c-f-p),t.left||t.right){case\"center\":a=n/2-d/2-i[3];break;case\"right\":a=n-d-g}switch(t.top||t.bottom){case\"middle\":case\"center\":u=r/2-f/2-i[0];break;case\"bottom\":u=r-f-p}a=a||0,u=u||0,isNaN(d)&&(d=n-a-(h||0)),isNaN(f)&&(f=r-u-(c||0));var m=new o(a+i[3],u+i[0],d,f);return m.margin=i,m},h.positionGroup=function(t,e,i,n){var o=t.getBoundingRect();e=r.extend(r.clone(e),{width:o.width,height:o.height}),e=h.getLayoutRect(e,i,n),t.attr(\"position\",[e.x-o.x,e.y-o.y])},h.mergeLayoutParam=function(t,e,i){function n(n){var r={},s=0,l={},h=0,c=i.ignoreSize?1:2;if(u(n,function(e){l[e]=t[e]}),u(n,function(t){o(e,t)&&(r[t]=l[t]=e[t]),a(r,t)&&s++,a(l,t)&&h++}),h!==c&&s){if(s>=c)return r;for(var d=0;d<n.length;d++){var f=n[d];if(!o(r,f)&&o(t,f)){r[f]=t[f];break}}return r}return l}function o(t,e){return t.hasOwnProperty(e)}function a(t,e){return null!=t[e]&&\"auto\"!==t[e]}function s(t,e,i){u(t,function(t){e[t]=i[t]})}!r.isObject(i)&&(i={});var l=[\"width\",\"left\",\"right\"],h=[\"height\",\"top\",\"bottom\"],c=n(l),d=n(h);s(l,t,c),s(h,t,d)},h.getLayoutParams=function(t){return h.copyLayoutParams({},t)},h.copyLayoutParams=function(t,e){return e&&t&&u(c,function(i){e.hasOwnProperty(i)&&(t[i]=e[i])}),t},t.exports=h},function(t,e,i){(function(e){function n(t){return d.isArray(t)||(t=[t]),t}function r(t,e){var i=t.dimensions,n=new m(d.map(i,t.getDimensionInfo,t),t.hostModel);v(n,t);for(var r=n._storage={},o=t._storage,a=0;a<i.length;a++){var s=i[a],l=o[s];d.indexOf(e,s)>=0?r[s]=new l.constructor(o[s].length):r[s]=o[s]}return n}var o=\"undefined\",a=\"undefined\"==typeof window?e:window,s=typeof a.Float64Array===o?Array:a.Float64Array,l=typeof a.Int32Array===o?Array:a.Int32Array,u={\"float\":s,\"int\":l,ordinal:Array,number:Array,time:Array},h=i(9),c=i(45),d=i(1),f=i(11),p=d.isObject,g=[\"stackedOn\",\"hasItemOption\",\"_nameList\",\"_idList\",\"_rawData\"],v=function(t,e){d.each(g.concat(e.__wrappedMethods||[]),function(i){e.hasOwnProperty(i)&&(t[i]=e[i])}),t.__wrappedMethods=e.__wrappedMethods},m=function(t,e){t=t||[\"x\",\"y\"];for(var i={},n=[],r=0;r<t.length;r++){var o,a={};\"string\"==typeof t[r]?(o=t[r],a={name:o,stackable:!1,type:\"number\"}):(a=t[r],o=a.name,a.type=a.type||\"number\"),n.push(o),i[o]=a}this.dimensions=n,this._dimensionInfos=i,this.hostModel=e,this.dataType,this.indices=[],this._storage={},this._nameList=[],this._idList=[],this._optionModels=[],this.stackedOn=null,this._visual={},this._layout={},this._itemVisuals=[],this._itemLayouts=[],this._graphicEls=[],this._rawData,this._extent},y=m.prototype;y.type=\"list\",y.hasItemOption=!0,y.getDimension=function(t){return isNaN(t)||(t=this.dimensions[t]||t),\nt},y.getDimensionInfo=function(t){return d.clone(this._dimensionInfos[this.getDimension(t)])},y.initData=function(t,e,i){t=t||[],this._rawData=t;var n=this._storage={},r=this.indices=[],o=this.dimensions,a=t.length,s=this._dimensionInfos,l=[],h={};e=e||[];for(var c=0;c<o.length;c++){var d=s[o[c]],p=u[d.type];n[o[c]]=new p(a)}var g=this;i||(g.hasItemOption=!1),i=i||function(t,e,i,n){var r=f.getDataItemValue(t);return f.isDataItemOption(t)&&(g.hasItemOption=!0),f.converDataValue(r instanceof Array?r[n]:r,s[e])};for(var v=0;v<t.length;v++){for(var m=t[v],y=0;y<o.length;y++){var x=o[y],_=n[x];_[v]=i(m,x,v,y)}r.push(v)}for(var c=0;c<t.length;c++){e[c]||t[c]&&null!=t[c].name&&(e[c]=t[c].name);var b=e[c]||\"\",w=t[c]&&t[c].id;!w&&b&&(h[b]=h[b]||0,w=b,h[b]>0&&(w+=\"__ec__\"+h[b]),h[b]++),w&&(l[c]=w)}this._nameList=e,this._idList=l},y.count=function(){return this.indices.length},y.get=function(t,e,i){var n=this._storage,r=this.indices[e];if(null==r)return NaN;var o=n[t]&&n[t][r];if(i){var a=this._dimensionInfos[t];if(a&&a.stackable)for(var s=this.stackedOn;s;){var l=s.get(t,e);(o>=0&&l>0||0>=o&&0>l)&&(o+=l),s=s.stackedOn}}return o},y.getValues=function(t,e,i){var n=[];d.isArray(t)||(i=e,e=t,t=this.dimensions);for(var r=0,o=t.length;o>r;r++)n.push(this.get(t[r],e,i));return n},y.hasValue=function(t){for(var e=this.dimensions,i=this._dimensionInfos,n=0,r=e.length;r>n;n++)if(\"ordinal\"!==i[e[n]].type&&isNaN(this.get(e[n],t)))return!1;return!0},y.getDataExtent=function(t,e){t=this.getDimension(t);var i=this._storage[t],n=this.getDimensionInfo(t);e=n&&n.stackable&&e;var r,o=(this._extent||(this._extent={}))[t+!!e];if(o)return o;if(i){for(var a=1/0,s=-(1/0),l=0,u=this.count();u>l;l++)r=this.get(t,l,e),a>r&&(a=r),r>s&&(s=r);return this._extent[t+!!e]=[a,s]}return[1/0,-(1/0)]},y.getSum=function(t,e){var i=this._storage[t],n=0;if(i)for(var r=0,o=this.count();o>r;r++){var a=this.get(t,r,e);isNaN(a)||(n+=a)}return n},y.indexOf=function(t,e){var i=this._storage,n=i[t],r=this.indices;if(n)for(var o=0,a=r.length;a>o;o++){var s=r[o];if(n[s]===e)return o}return-1},y.indexOfName=function(t){for(var e=this.indices,i=this._nameList,n=0,r=e.length;r>n;n++){var o=e[n];if(i[o]===t)return n}return-1},y.indexOfRawIndex=function(t){for(var e=this.indices,i=0,n=e.length-1;n>=i;){var r=(i+n)/2|0;if(e[r]<t)i=r+1;else{if(!(e[r]>t))return r;n=r-1}}return-1},y.indexOfNearest=function(t,e,i,n){var r=this._storage,o=r[t];null==n&&(n=1/0);var a=-1;if(o)for(var s=Number.MAX_VALUE,l=0,u=this.count();u>l;l++){var h=e-this.get(t,l,i),c=Math.abs(h);n>=h&&(s>c||c===s&&h>0)&&(s=c,a=l)}return a},y.getRawIndex=function(t){var e=this.indices[t];return null==e?-1:e},y.getRawDataItem=function(t){return this._rawData[this.getRawIndex(t)]},y.getName=function(t){return this._nameList[this.indices[t]]||\"\"},y.getId=function(t){return this._idList[this.indices[t]]||this.getRawIndex(t)+\"\"},y.each=function(t,e,i,r){\"function\"==typeof t&&(r=i,i=e,e=t,t=[]),t=d.map(n(t),this.getDimension,this);var o=[],a=t.length,s=this.indices;r=r||this;for(var l=0;l<s.length;l++)switch(a){case 0:e.call(r,l);break;case 1:e.call(r,this.get(t[0],l,i),l);break;case 2:e.call(r,this.get(t[0],l,i),this.get(t[1],l,i),l);break;default:for(var u=0;a>u;u++)o[u]=this.get(t[u],l,i);o[u]=l,e.apply(r,o)}},y.filterSelf=function(t,e,i,r){\"function\"==typeof t&&(r=i,i=e,e=t,t=[]),t=d.map(n(t),this.getDimension,this);var o=[],a=[],s=t.length,l=this.indices;r=r||this;for(var u=0;u<l.length;u++){var h;if(1===s)h=e.call(r,this.get(t[0],u,i),u);else{for(var c=0;s>c;c++)a[c]=this.get(t[c],u,i);a[c]=u,h=e.apply(r,a)}h&&o.push(l[u])}return this.indices=o,this._extent={},this},y.mapArray=function(t,e,i,n){\"function\"==typeof t&&(n=i,i=e,e=t,t=[]);var r=[];return this.each(t,function(){r.push(e&&e.apply(this,arguments))},i,n),r},y.map=function(t,e,i,o){t=d.map(n(t),this.getDimension,this);var a=r(this,t),s=a.indices=this.indices,l=a._storage,u=[];return this.each(t,function(){var i=arguments[arguments.length-1],n=e&&e.apply(this,arguments);if(null!=n){\"number\"==typeof n&&(u[0]=n,n=u);for(var r=0;r<n.length;r++){var o=t[r],a=l[o],h=s[i];a&&(a[h]=n[r])}}},i,o),a},y.downSample=function(t,e,i,n){for(var o=r(this,[t]),a=this._storage,s=o._storage,l=this.indices,u=o.indices=[],h=[],c=[],d=Math.floor(1/e),f=s[t],p=this.count(),g=0;g<a[t].length;g++)s[t][g]=a[t][g];for(var g=0;p>g;g+=d){d>p-g&&(d=p-g,h.length=d);for(var v=0;d>v;v++){var m=l[g+v];h[v]=f[m],c[v]=m}var y=i(h),m=c[n(h,y)||0];f[m]=y,u.push(m)}return o},y.getItemModel=function(t){var e=this.hostModel;return t=this.indices[t],new h(this._rawData[t],e,e&&e.ecModel)},y.diff=function(t){var e=this._idList,i=t&&t._idList;return new c(t?t.indices:[],this.indices,function(t){return i[t]||t+\"\"},function(t){return e[t]||t+\"\"})},y.getVisual=function(t){var e=this._visual;return e&&e[t]},y.setVisual=function(t,e){if(p(t))for(var i in t)t.hasOwnProperty(i)&&this.setVisual(i,t[i]);else this._visual=this._visual||{},this._visual[t]=e},y.setLayout=function(t,e){if(p(t))for(var i in t)t.hasOwnProperty(i)&&this.setLayout(i,t[i]);else this._layout[t]=e},y.getLayout=function(t){return this._layout[t]},y.getItemLayout=function(t){return this._itemLayouts[t]},y.setItemLayout=function(t,e,i){this._itemLayouts[t]=i?d.extend(this._itemLayouts[t]||{},e):e},y.clearItemLayouts=function(){this._itemLayouts.length=0},y.getItemVisual=function(t,e,i){var n=this._itemVisuals[t],r=n&&n[e];return null!=r||i?r:this.getVisual(e)},y.setItemVisual=function(t,e,i){var n=this._itemVisuals[t]||{};if(this._itemVisuals[t]=n,p(e))for(var r in e)e.hasOwnProperty(r)&&(n[r]=e[r]);else n[e]=i},y.clearAllVisual=function(){this._visual={},this._itemVisuals=[]};var x=function(t){t.seriesIndex=this.seriesIndex,t.dataIndex=this.dataIndex,t.dataType=this.dataType};y.setItemGraphicEl=function(t,e){var i=this.hostModel;e&&(e.dataIndex=t,e.dataType=this.dataType,e.seriesIndex=i&&i.seriesIndex,\"group\"===e.type&&e.traverse(x,e)),this._graphicEls[t]=e},y.getItemGraphicEl=function(t){return this._graphicEls[t]},y.eachItemGraphicEl=function(t,e){d.each(this._graphicEls,function(i,n){i&&t&&t.call(e,i,n)})},y.cloneShallow=function(){var t=d.map(this.dimensions,this.getDimensionInfo,this),e=new m(t,this.hostModel);return e._storage=this._storage,v(e,this),e.indices=this.indices.slice(),this._extent&&(e._extent=d.extend({},this._extent)),e},y.wrapMethod=function(t,e){var i=this[t];\"function\"==typeof i&&(this.__wrappedMethods=this.__wrappedMethods||[],this.__wrappedMethods.push(t),this[t]=function(){var t=i.apply(this,arguments);return e.apply(this,[t].concat(d.slice(arguments)))})},y.TRANSFERABLE_METHODS=[\"cloneShallow\",\"downSample\",\"map\"],y.CHANGABLE_METHODS=[\"filterSelf\"],t.exports=m}).call(e,function(){return this}())},function(t,e,i){\"use strict\";var n=i(1),r=i(8),o=i(11),a=i(10),s=i(56),l=i(12),u=r.encodeHTML,h=r.addCommas,c=a.extend({type:\"series.__base__\",seriesIndex:0,coordinateSystem:null,defaultOption:null,legendDataProvider:null,visualColorAccessPath:\"itemStyle.normal.color\",init:function(t,e,i,n){this.seriesIndex=this.componentIndex,this.mergeDefaultAndTheme(t,i),this._dataBeforeProcessed=this.getInitialData(t,i),this._data=this._dataBeforeProcessed.cloneShallow()},mergeDefaultAndTheme:function(t,e){n.merge(t,e.getTheme().get(this.subType)),n.merge(t,this.getDefaultOption()),o.defaultEmphasis(t.label,o.LABEL_OPTIONS),this.fillDataTextStyle(t.data)},mergeOption:function(t,e){t=n.merge(this.option,t,!0),this.fillDataTextStyle(t.data);var i=this.getInitialData(t,e);i&&(this._data=i,this._dataBeforeProcessed=i.cloneShallow())},fillDataTextStyle:function(t){if(t)for(var e=0;e<t.length;e++)t[e]&&t[e].label&&o.defaultEmphasis(t[e].label,o.LABEL_OPTIONS)},getInitialData:function(){},getData:function(t){return null==t?this._data:this._data.getLinkedData(t)},setData:function(t){this._data=t},getRawData:function(){return this._dataBeforeProcessed},coordDimToDataDim:function(t){return[t]},dataDimToCoordDim:function(t){return t},getBaseAxis:function(){var t=this.coordinateSystem;return t&&t.getBaseAxis&&t.getBaseAxis()},formatTooltip:function(t,e,i){function o(t){return n.map(t,function(t,i){var n=a.getDimensionInfo(i),o=n&&n.type;return\"ordinal\"===o?t:\"time\"===o?e?\"\":r.formatTime(\"yyyy/mm/dd hh:mm:ss\",t):h(t)}).filter(function(t){return!!t}).join(\", \")}var a=this._data,s=this.getRawValue(t),l=n.isArray(s)?o(s):h(s),c=a.getName(t),d=a.getItemVisual(t,\"color\"),f='<span style=\"display:inline-block;margin-right:5px;border-radius:10px;width:9px;height:9px;background-color:'+d+'\"></span>',p=this.name;return\"\\x00-\"===p&&(p=\"\"),e?f+u(this.name)+\" : \"+l:(p&&u(p)+\"<br />\")+f+(c?u(c)+\" : \"+l:l)},ifEnableAnimation:function(){if(l.node)return!1;var t=this.getShallow(\"animation\");return t&&this.getData().count()>this.getShallow(\"animationThreshold\")&&(t=!1),t},restoreData:function(){this._data=this._dataBeforeProcessed.cloneShallow()},getColorFromPalette:function(t,e){var i=this.ecModel,n=s.getColorFromPalette.call(this,t,e);return n||(n=i.getColorFromPalette(t,e)),n},getAxisTooltipDataIndex:null});n.mixin(c,o.dataFormatMixin),n.mixin(c,s),t.exports=c},function(t,e,i){function n(t,e){var i=t+\":\"+e;if(l[i])return l[i];for(var n=(t+\"\").split(\"\\n\"),r=0,o=0,a=n.length;a>o;o++)r=Math.max(p.measureText(n[o],e).width,r);return u>h&&(u=0,l={}),u++,l[i]=r,r}function r(t,e,i,r){var o=((t||\"\")+\"\").split(\"\\n\").length,a=n(t,e),s=n(\"国\",e),l=o*s,u=new d(0,0,a,l);switch(u.lineHeight=s,r){case\"bottom\":case\"alphabetic\":u.y-=s;break;case\"middle\":u.y-=s/2}switch(i){case\"end\":case\"right\":u.x-=u.width;break;case\"center\":u.x-=u.width/2}return u}function o(t,e,i,n){var r=e.x,o=e.y,a=e.height,s=e.width,l=i.height,u=a/2-l/2,h=\"left\";switch(t){case\"left\":r-=n,o+=u,h=\"right\";break;case\"right\":r+=n+s,o+=u,h=\"left\";break;case\"top\":r+=s/2,o-=n+l,h=\"center\";break;case\"bottom\":r+=s/2,o+=a+n,h=\"center\";break;case\"inside\":r+=s/2,o+=u,h=\"center\";break;case\"insideLeft\":r+=n,o+=u,h=\"left\";break;case\"insideRight\":r+=s-n,o+=u,h=\"right\";break;case\"insideTop\":r+=s/2,o+=n,h=\"center\";break;case\"insideBottom\":r+=s/2,o+=a-l-n,h=\"center\";break;case\"insideTopLeft\":r+=n,o+=n,h=\"left\";break;case\"insideTopRight\":r+=s-n,o+=n,h=\"right\";break;case\"insideBottomLeft\":r+=n,o+=a-l-n;break;case\"insideBottomRight\":r+=s-n,o+=a-l-n,h=\"right\"}return{x:r,y:o,textAlign:h,textBaseline:\"top\"}}function a(t,e,i,r,o){if(!e)return\"\";o=o||{},r=f(r,\"...\");for(var a=f(o.maxIterations,2),l=f(o.minChar,0),u=n(\"国\",i),h=n(\"a\",i),c=f(o.placeholder,\"\"),d=e=Math.max(0,e-1),p=0;l>p&&d>=h;p++)d-=h;var g=n(r);g>d&&(r=\"\",g=0),d=e-g;for(var v=(t+\"\").split(\"\\n\"),p=0,m=v.length;m>p;p++){var y=v[p],x=n(y,i);if(!(e>=x)){for(var _=0;;_++){if(d>=x||_>=a){y+=r;break}var b=0===_?s(y,d,h,u):x>0?Math.floor(y.length*d/x):0;y=y.substr(0,b),x=n(y,i)}\"\"===y&&(y=c),v[p]=y}}return v.join(\"\\n\")}function s(t,e,i,n){for(var r=0,o=0,a=t.length;a>o&&e>r;o++){var s=t.charCodeAt(o);r+=s>=0&&127>=s?i:n}return o}var l={},u=0,h=5e3,c=i(1),d=i(7),f=c.retrieve,p={getWidth:n,getBoundingRect:r,adjustTextPositionOnRect:o,truncateText:a,measureText:function(t,e){var i=c.getContext();return i.font=e||\"12px sans-serif\",i.measureText(t)}};t.exports=p},function(t,e,i){\"use strict\";function n(t){return t>-w&&w>t}function r(t){return t>w||-w>t}function o(t,e,i,n,r){var o=1-r;return o*o*(o*t+3*r*e)+r*r*(r*n+3*o*i)}function a(t,e,i,n,r){var o=1-r;return 3*(((e-t)*o+2*(i-e)*r)*o+(n-i)*r*r)}function s(t,e,i,r,o,a){var s=r+3*(e-i)-t,l=3*(i-2*e+t),u=3*(e-t),h=t-o,c=l*l-3*s*u,d=l*u-9*s*h,f=u*u-3*l*h,p=0;if(n(c)&&n(d))if(n(l))a[0]=0;else{var g=-u/l;g>=0&&1>=g&&(a[p++]=g)}else{var v=d*d-4*c*f;if(n(v)){var m=d/c,g=-l/s+m,y=-m/2;g>=0&&1>=g&&(a[p++]=g),y>=0&&1>=y&&(a[p++]=y)}else if(v>0){var x=b(v),w=c*l+1.5*s*(-d+x),S=c*l+1.5*s*(-d-x);w=0>w?-_(-w,T):_(w,T),S=0>S?-_(-S,T):_(S,T);var g=(-l-(w+S))/(3*s);g>=0&&1>=g&&(a[p++]=g)}else{var A=(2*c*l-3*s*d)/(2*b(c*c*c)),I=Math.acos(A)/3,L=b(c),C=Math.cos(I),g=(-l-2*L*C)/(3*s),y=(-l+L*(C+M*Math.sin(I)))/(3*s),D=(-l+L*(C-M*Math.sin(I)))/(3*s);g>=0&&1>=g&&(a[p++]=g),y>=0&&1>=y&&(a[p++]=y),D>=0&&1>=D&&(a[p++]=D)}}return p}function l(t,e,i,o,a){var s=6*i-12*e+6*t,l=9*e+3*o-3*t-9*i,u=3*e-3*t,h=0;if(n(l)){if(r(s)){var c=-u/s;c>=0&&1>=c&&(a[h++]=c)}}else{var d=s*s-4*l*u;if(n(d))a[0]=-s/(2*l);else if(d>0){var f=b(d),c=(-s+f)/(2*l),p=(-s-f)/(2*l);c>=0&&1>=c&&(a[h++]=c),p>=0&&1>=p&&(a[h++]=p)}}return h}function u(t,e,i,n,r,o){var a=(e-t)*r+t,s=(i-e)*r+e,l=(n-i)*r+i,u=(s-a)*r+a,h=(l-s)*r+s,c=(h-u)*r+u;o[0]=t,o[1]=a,o[2]=u,o[3]=c,o[4]=c,o[5]=h,o[6]=l,o[7]=n}function h(t,e,i,n,r,a,s,l,u,h,c){var d,f,p,g,v,m=.005,y=1/0;A[0]=u,A[1]=h;for(var _=0;1>_;_+=.05)I[0]=o(t,i,r,s,_),I[1]=o(e,n,a,l,_),g=x(A,I),y>g&&(d=_,y=g);y=1/0;for(var w=0;32>w&&!(S>m);w++)f=d-m,p=d+m,I[0]=o(t,i,r,s,f),I[1]=o(e,n,a,l,f),g=x(I,A),f>=0&&y>g?(d=f,y=g):(L[0]=o(t,i,r,s,p),L[1]=o(e,n,a,l,p),v=x(L,A),1>=p&&y>v?(d=p,y=v):m*=.5);return c&&(c[0]=o(t,i,r,s,d),c[1]=o(e,n,a,l,d)),b(y)}function c(t,e,i,n){var r=1-n;return r*(r*t+2*n*e)+n*n*i}function d(t,e,i,n){return 2*((1-n)*(e-t)+n*(i-e))}function f(t,e,i,o,a){var s=t-2*e+i,l=2*(e-t),u=t-o,h=0;if(n(s)){if(r(l)){var c=-u/l;c>=0&&1>=c&&(a[h++]=c)}}else{var d=l*l-4*s*u;if(n(d)){var c=-l/(2*s);c>=0&&1>=c&&(a[h++]=c)}else if(d>0){var f=b(d),c=(-l+f)/(2*s),p=(-l-f)/(2*s);c>=0&&1>=c&&(a[h++]=c),p>=0&&1>=p&&(a[h++]=p)}}return h}function p(t,e,i){var n=t+i-2*e;return 0===n?.5:(t-e)/n}function g(t,e,i,n,r){var o=(e-t)*n+t,a=(i-e)*n+e,s=(a-o)*n+o;r[0]=t,r[1]=o,r[2]=s,r[3]=s,r[4]=a,r[5]=i}function v(t,e,i,n,r,o,a,s,l){var u,h=.005,d=1/0;A[0]=a,A[1]=s;for(var f=0;1>f;f+=.05){I[0]=c(t,i,r,f),I[1]=c(e,n,o,f);var p=x(A,I);d>p&&(u=f,d=p)}d=1/0;for(var g=0;32>g&&!(S>h);g++){var v=u-h,m=u+h;I[0]=c(t,i,r,v),I[1]=c(e,n,o,v);var p=x(I,A);if(v>=0&&d>p)u=v,d=p;else{L[0]=c(t,i,r,m),L[1]=c(e,n,o,m);var y=x(L,A);1>=m&&d>y?(u=m,d=y):h*=.5}}return l&&(l[0]=c(t,i,r,u),l[1]=c(e,n,o,u)),b(d)}var m=i(5),y=m.create,x=m.distSquare,_=Math.pow,b=Math.sqrt,w=1e-8,S=1e-4,M=b(3),T=1/3,A=y(),I=y(),L=y();t.exports={cubicAt:o,cubicDerivativeAt:a,cubicRootAt:s,cubicExtrema:l,cubicSubdivide:u,cubicProjectPoint:h,quadraticAt:c,quadraticDerivativeAt:d,quadraticRootAt:f,quadraticExtremum:p,quadraticSubdivide:g,quadraticProjectPoint:v}},function(t,e){function i(t){return t=Math.round(t),0>t?0:t>255?255:t}function n(t){return t=Math.round(t),0>t?0:t>360?360:t}function r(t){return 0>t?0:t>1?1:t}function o(t){return i(t.length&&\"%\"===t.charAt(t.length-1)?parseFloat(t)/100*255:parseInt(t,10))}function a(t){return r(t.length&&\"%\"===t.charAt(t.length-1)?parseFloat(t)/100:parseFloat(t))}function s(t,e,i){return 0>i?i+=1:i>1&&(i-=1),1>6*i?t+(e-t)*i*6:1>2*i?e:2>3*i?t+(e-t)*(2/3-i)*6:t}function l(t,e,i){return t+(e-t)*i}function u(t){if(t){t+=\"\";var e=t.replace(/ /g,\"\").toLowerCase();if(e in x)return x[e].slice();if(\"#\"!==e.charAt(0)){var i=e.indexOf(\"(\"),n=e.indexOf(\")\");if(-1!==i&&n+1===e.length){var r=e.substr(0,i),s=e.substr(i+1,n-(i+1)).split(\",\"),l=1;switch(r){case\"rgba\":if(4!==s.length)return;l=a(s.pop());case\"rgb\":if(3!==s.length)return;return[o(s[0]),o(s[1]),o(s[2]),l];case\"hsla\":if(4!==s.length)return;return s[3]=a(s[3]),h(s);case\"hsl\":if(3!==s.length)return;return h(s);default:return}}}else{if(4===e.length){var u=parseInt(e.substr(1),16);if(!(u>=0&&4095>=u))return;return[(3840&u)>>4|(3840&u)>>8,240&u|(240&u)>>4,15&u|(15&u)<<4,1]}if(7===e.length){var u=parseInt(e.substr(1),16);if(!(u>=0&&16777215>=u))return;return[(16711680&u)>>16,(65280&u)>>8,255&u,1]}}}}function h(t){var e=(parseFloat(t[0])%360+360)%360/360,n=a(t[1]),r=a(t[2]),o=.5>=r?r*(n+1):r+n-r*n,l=2*r-o,u=[i(255*s(l,o,e+1/3)),i(255*s(l,o,e)),i(255*s(l,o,e-1/3))];return 4===t.length&&(u[3]=t[3]),u}function c(t){if(t){var e,i,n=t[0]/255,r=t[1]/255,o=t[2]/255,a=Math.min(n,r,o),s=Math.max(n,r,o),l=s-a,u=(s+a)/2;if(0===l)e=0,i=0;else{i=.5>u?l/(s+a):l/(2-s-a);var h=((s-n)/6+l/2)/l,c=((s-r)/6+l/2)/l,d=((s-o)/6+l/2)/l;n===s?e=d-c:r===s?e=1/3+h-d:o===s&&(e=2/3+c-h),0>e&&(e+=1),e>1&&(e-=1)}var f=[360*e,i,u];return null!=t[3]&&f.push(t[3]),f}}function d(t,e){var i=u(t);if(i){for(var n=0;3>n;n++)0>e?i[n]=i[n]*(1-e)|0:i[n]=(255-i[n])*e+i[n]|0;return y(i,4===i.length?\"rgba\":\"rgb\")}}function f(t,e){var i=u(t);return i?((1<<24)+(i[0]<<16)+(i[1]<<8)+ +i[2]).toString(16).slice(1):void 0}function p(t,e,n){if(e&&e.length&&t>=0&&1>=t){n=n||[0,0,0,0];var r=t*(e.length-1),o=Math.floor(r),a=Math.ceil(r),s=e[o],u=e[a],h=r-o;return n[0]=i(l(s[0],u[0],h)),n[1]=i(l(s[1],u[1],h)),n[2]=i(l(s[2],u[2],h)),n[3]=i(l(s[3],u[3],h)),n}}function g(t,e,n){if(e&&e.length&&t>=0&&1>=t){var o=t*(e.length-1),a=Math.floor(o),s=Math.ceil(o),h=u(e[a]),c=u(e[s]),d=o-a,f=y([i(l(h[0],c[0],d)),i(l(h[1],c[1],d)),i(l(h[2],c[2],d)),r(l(h[3],c[3],d))],\"rgba\");return n?{color:f,leftIndex:a,rightIndex:s,value:o}:f}}function v(t,e,i,r){return t=u(t),t?(t=c(t),null!=e&&(t[0]=n(e)),null!=i&&(t[1]=a(i)),null!=r&&(t[2]=a(r)),y(h(t),\"rgba\")):void 0}function m(t,e){return t=u(t),t&&null!=e?(t[3]=r(e),y(t,\"rgba\")):void 0}function y(t,e){var i=t[0]+\",\"+t[1]+\",\"+t[2];return\"rgba\"!==e&&\"hsva\"!==e&&\"hsla\"!==e||(i+=\",\"+t[3]),e+\"(\"+i+\")\"}var x={transparent:[0,0,0,0],aliceblue:[240,248,255,1],antiquewhite:[250,235,215,1],aqua:[0,255,255,1],aquamarine:[127,255,212,1],azure:[240,255,255,1],beige:[245,245,220,1],bisque:[255,228,196,1],black:[0,0,0,1],blanchedalmond:[255,235,205,1],blue:[0,0,255,1],blueviolet:[138,43,226,1],brown:[165,42,42,1],burlywood:[222,184,135,1],cadetblue:[95,158,160,1],chartreuse:[127,255,0,1],chocolate:[210,105,30,1],coral:[255,127,80,1],cornflowerblue:[100,149,237,1],cornsilk:[255,248,220,1],crimson:[220,20,60,1],cyan:[0,255,255,1],darkblue:[0,0,139,1],darkcyan:[0,139,139,1],darkgoldenrod:[184,134,11,1],darkgray:[169,169,169,1],darkgreen:[0,100,0,1],darkgrey:[169,169,169,1],darkkhaki:[189,183,107,1],darkmagenta:[139,0,139,1],darkolivegreen:[85,107,47,1],darkorange:[255,140,0,1],darkorchid:[153,50,204,1],darkred:[139,0,0,1],darksalmon:[233,150,122,1],darkseagreen:[143,188,143,1],darkslateblue:[72,61,139,1],darkslategray:[47,79,79,1],darkslategrey:[47,79,79,1],darkturquoise:[0,206,209,1],darkviolet:[148,0,211,1],deeppink:[255,20,147,1],deepskyblue:[0,191,255,1],dimgray:[105,105,105,1],dimgrey:[105,105,105,1],dodgerblue:[30,144,255,1],firebrick:[178,34,34,1],floralwhite:[255,250,240,1],forestgreen:[34,139,34,1],fuchsia:[255,0,255,1],gainsboro:[220,220,220,1],ghostwhite:[248,248,255,1],gold:[255,215,0,1],goldenrod:[218,165,32,1],gray:[128,128,128,1],green:[0,128,0,1],greenyellow:[173,255,47,1],grey:[128,128,128,1],honeydew:[240,255,240,1],hotpink:[255,105,180,1],indianred:[205,92,92,1],indigo:[75,0,130,1],ivory:[255,255,240,1],khaki:[240,230,140,1],lavender:[230,230,250,1],lavenderblush:[255,240,245,1],lawngreen:[124,252,0,1],lemonchiffon:[255,250,205,1],lightblue:[173,216,230,1],lightcoral:[240,128,128,1],lightcyan:[224,255,255,1],lightgoldenrodyellow:[250,250,210,1],lightgray:[211,211,211,1],lightgreen:[144,238,144,1],lightgrey:[211,211,211,1],lightpink:[255,182,193,1],lightsalmon:[255,160,122,1],lightseagreen:[32,178,170,1],lightskyblue:[135,206,250,1],lightslategray:[119,136,153,1],lightslategrey:[119,136,153,1],lightsteelblue:[176,196,222,1],lightyellow:[255,255,224,1],lime:[0,255,0,1],limegreen:[50,205,50,1],linen:[250,240,230,1],magenta:[255,0,255,1],maroon:[128,0,0,1],mediumaquamarine:[102,205,170,1],mediumblue:[0,0,205,1],mediumorchid:[186,85,211,1],mediumpurple:[147,112,219,1],mediumseagreen:[60,179,113,1],mediumslateblue:[123,104,238,1],mediumspringgreen:[0,250,154,1],mediumturquoise:[72,209,204,1],mediumvioletred:[199,21,133,1],midnightblue:[25,25,112,1],mintcream:[245,255,250,1],mistyrose:[255,228,225,1],moccasin:[255,228,181,1],navajowhite:[255,222,173,1],navy:[0,0,128,1],oldlace:[253,245,230,1],olive:[128,128,0,1],olivedrab:[107,142,35,1],orange:[255,165,0,1],orangered:[255,69,0,1],orchid:[218,112,214,1],palegoldenrod:[238,232,170,1],palegreen:[152,251,152,1],paleturquoise:[175,238,238,1],palevioletred:[219,112,147,1],papayawhip:[255,239,213,1],peachpuff:[255,218,185,1],peru:[205,133,63,1],pink:[255,192,203,1],plum:[221,160,221,1],powderblue:[176,224,230,1],purple:[128,0,128,1],red:[255,0,0,1],rosybrown:[188,143,143,1],royalblue:[65,105,225,1],saddlebrown:[139,69,19,1],salmon:[250,128,114,1],sandybrown:[244,164,96,1],seagreen:[46,139,87,1],seashell:[255,245,238,1],sienna:[160,82,45,1],silver:[192,192,192,1],skyblue:[135,206,235,1],slateblue:[106,90,205,1],slategray:[112,128,144,1],slategrey:[112,128,144,1],snow:[255,250,250,1],springgreen:[0,255,127,1],steelblue:[70,130,180,1],tan:[210,180,140,1],teal:[0,128,128,1],thistle:[216,191,216,1],tomato:[255,99,71,1],turquoise:[64,224,208,1],violet:[238,130,238,1],wheat:[245,222,179,1],white:[255,255,255,1],whitesmoke:[245,245,245,1],yellow:[255,255,0,1],yellowgreen:[154,205,50,1]};t.exports={parse:u,lift:d,toHex:f,fastMapToColor:p,mapToColor:g,modifyHSL:v,modifyAlpha:m,stringify:y}},function(t,e){var i=\"undefined\"==typeof Float32Array?Array:Float32Array,n={create:function(){var t=new i(6);return n.identity(t),t},identity:function(t){return t[0]=1,t[1]=0,t[2]=0,t[3]=1,t[4]=0,t[5]=0,t},copy:function(t,e){return t[0]=e[0],t[1]=e[1],t[2]=e[2],t[3]=e[3],t[4]=e[4],t[5]=e[5],t},mul:function(t,e,i){var n=e[0]*i[0]+e[2]*i[1],r=e[1]*i[0]+e[3]*i[1],o=e[0]*i[2]+e[2]*i[3],a=e[1]*i[2]+e[3]*i[3],s=e[0]*i[4]+e[2]*i[5]+e[4],l=e[1]*i[4]+e[3]*i[5]+e[5];return t[0]=n,t[1]=r,t[2]=o,t[3]=a,t[4]=s,t[5]=l,t},translate:function(t,e,i){return t[0]=e[0],t[1]=e[1],t[2]=e[2],t[3]=e[3],t[4]=e[4]+i[0],t[5]=e[5]+i[1],t},rotate:function(t,e,i){var n=e[0],r=e[2],o=e[4],a=e[1],s=e[3],l=e[5],u=Math.sin(i),h=Math.cos(i);return t[0]=n*h+a*u,t[1]=-n*u+a*h,t[2]=r*h+s*u,t[3]=-r*u+h*s,t[4]=h*o+u*l,t[5]=h*l-u*o,t},scale:function(t,e,i){var n=i[0],r=i[1];return t[0]=e[0]*n,t[1]=e[1]*r,t[2]=e[2]*n,t[3]=e[3]*r,t[4]=e[4]*n,t[5]=e[5]*r,t},invert:function(t,e){var i=e[0],n=e[2],r=e[4],o=e[1],a=e[3],s=e[5],l=i*a-o*n;return l?(l=1/l,t[0]=a*l,t[1]=-o*l,t[2]=-n*l,t[3]=i*l,t[4]=(n*s-a*r)*l,t[5]=(o*r-i*s)*l,t):null}};t.exports=n},function(t,e){var i=Array.prototype.slice,n=function(){this._$handlers={}};n.prototype={constructor:n,one:function(t,e,i){var n=this._$handlers;if(!e||!t)return this;n[t]||(n[t]=[]);for(var r=0;r<n[t].length;r++)if(n[t][r].h===e)return this;return n[t].push({h:e,one:!0,ctx:i||this}),this},on:function(t,e,i){var n=this._$handlers;if(!e||!t)return this;n[t]||(n[t]=[]);for(var r=0;r<n[t].length;r++)if(n[t][r].h===e)return this;return n[t].push({h:e,one:!1,ctx:i||this}),this},isSilent:function(t){var e=this._$handlers;return e[t]&&e[t].length},off:function(t,e){var i=this._$handlers;if(!t)return this._$handlers={},this;if(e){if(i[t]){for(var n=[],r=0,o=i[t].length;o>r;r++)i[t][r].h!=e&&n.push(i[t][r]);i[t]=n}i[t]&&0===i[t].length&&delete i[t]}else delete i[t];return this},trigger:function(t){if(this._$handlers[t]){var e=arguments,n=e.length;n>3&&(e=i.call(e,1));for(var r=this._$handlers[t],o=r.length,a=0;o>a;){switch(n){case 1:r[a].h.call(r[a].ctx);break;case 2:r[a].h.call(r[a].ctx,e[1]);break;case 3:r[a].h.call(r[a].ctx,e[1],e[2]);break;default:r[a].h.apply(r[a].ctx,e)}r[a].one?(r.splice(a,1),o--):a++}}return this},triggerWithContext:function(t){if(this._$handlers[t]){var e=arguments,n=e.length;n>4&&(e=i.call(e,1,e.length-1));for(var r=e[e.length-1],o=this._$handlers[t],a=o.length,s=0;a>s;){switch(n){case 1:o[s].h.call(r);break;case 2:o[s].h.call(r,e[1]);break;case 3:o[s].h.call(r,e[1],e[2]);break;default:o[s].h.apply(r,e)}o[s].one?(o.splice(s,1),a--):s++}}return this}},t.exports=n},function(t,e,i){function n(t,e){var i=o.slice(arguments,2);return this.superClass.prototype[e].apply(t,i)}function r(t,e,i){return this.superClass.prototype[e].apply(t,i)}var o=i(1),a={},s=\".\",l=\"___EC__COMPONENT__CONTAINER___\",u=a.parseClassType=function(t){var e={main:\"\",sub:\"\"};return t&&(t=t.split(s),e.main=t[0]||\"\",e.sub=t[1]||\"\"),e};a.enableClassExtend=function(t){t.$constructor=t,t.extend=function(t){var e=this,i=function(){t.$constructor?t.$constructor.apply(this,arguments):e.apply(this,arguments)};return o.extend(i.prototype,t),i.extend=this.extend,i.superCall=n,i.superApply=r,o.inherits(i,this),i.superClass=e,i}},a.enableClassManagement=function(t,e){function i(t){var e=n[t.main];return e&&e[l]||(e=n[t.main]={},e[l]=!0),e}e=e||{};var n={};if(t.registerClass=function(t,e){if(e)if(e=u(e),e.sub){if(e.sub!==l){var r=i(e);r[e.sub]=t}}else n[e.main]=t;return t},t.getClass=function(t,e,i){var r=n[t];if(r&&r[l]&&(r=e?r[e]:null),i&&!r)throw new Error(\"Component \"+t+\".\"+(e||\"\")+\" not exists. Load it first.\");return r},t.getClassesByMainType=function(t){t=u(t);var e=[],i=n[t.main];return i&&i[l]?o.each(i,function(t,i){i!==l&&e.push(t)}):e.push(i),e},t.hasClass=function(t){return t=u(t),!!n[t.main]},t.getAllClassMainTypes=function(){var t=[];return o.each(n,function(e,i){t.push(i)}),t},t.hasSubTypes=function(t){t=u(t);var e=n[t.main];return e&&e[l]},t.parseClassType=u,e.registerWhenExtend){var r=t.extend;r&&(t.extend=function(e){var i=r.call(this,e);return t.registerClass(i,e.type)})}return t},a.setReadOnly=function(t,e){},t.exports=a},function(t,e,i){var n=i(134),r=i(38);i(135),i(133);var o=i(32),a=i(4),s=i(1),l=i(16),u={};u.getScaleExtent=function(t,e){var i=t.scale,n=i.getExtent(),r=n[1]-n[0];if(\"ordinal\"===i.type)return isFinite(r)?n:[0,0];var o=e.getMin?e.getMin():e.get(\"min\"),l=e.getMax?e.getMax():e.get(\"max\"),u=e.getNeedCrossZero?e.getNeedCrossZero():!e.get(\"scale\"),h=e.get(\"boundaryGap\");s.isArray(h)||(h=[h||0,h||0]),h[0]=a.parsePercent(h[0],1),h[1]=a.parsePercent(h[1],1);var c=!0,d=!0;return null==o&&(o=n[0]-h[0]*r,c=!1),null==l&&(l=n[1]+h[1]*r,d=!1),\"dataMin\"===o&&(o=n[0]),\"dataMax\"===l&&(l=n[1]),u&&(o>0&&l>0&&!c&&(o=0),0>o&&0>l&&!d&&(l=0)),[o,l]},u.niceScaleExtent=function(t,e){var i=t.scale,n=u.getScaleExtent(t,e),r=null!=(e.getMin?e.getMin():e.get(\"min\")),o=null!=(e.getMax?e.getMax():e.get(\"max\")),a=e.get(\"splitNumber\");\"log\"===i.type&&(i.base=e.get(\"logBase\")),i.setExtent(n[0],n[1]),i.niceExtent(a,r,o);var s=e.get(\"minInterval\");if(isFinite(s)&&!r&&!o&&\"interval\"===i.type){var l=i.getInterval(),h=Math.max(Math.abs(l),s)/l;n=i.getExtent(),i.setExtent(h*n[0],n[1]*h),i.niceExtent(a)}var l=e.get(\"interval\");null!=l&&i.setInterval&&i.setInterval(l)},u.createScaleByModel=function(t,e){if(e=e||t.get(\"type\"))switch(e){case\"category\":return new n(t.getCategories(),[1/0,-(1/0)]);case\"value\":return new r;default:return(o.getClass(e)||r).create(t)}},u.ifAxisCrossZero=function(t){var e=t.scale.getExtent(),i=e[0],n=e[1];return!(i>0&&n>0||0>i&&0>n)},u.getAxisLabelInterval=function(t,e,i,n){var r,o=0,a=0,s=1;e.length>40&&(s=Math.floor(e.length/40));for(var u=0;u<t.length;u+=s){var h=t[u],c=l.getBoundingRect(e[u],i,\"center\",\"top\");c[n?\"x\":\"y\"]+=h,c[n?\"width\":\"height\"]*=1.3,r?r.intersect(c)?(a++,o=Math.max(o,a)):(r.union(c),a=0):r=c.clone()}return 0===o&&s>1?s:(o+1)*s-1},u.getFormattedLabels=function(t,e){var i=t.scale,n=i.getTicksLabels(),r=i.getTicks();return\"string\"==typeof e?(e=function(t){return function(e){return t.replace(\"{value}\",e)}}(e),s.map(n,e)):\"function\"==typeof e?s.map(r,function(n,r){return e(\"category\"===t.type?i.getLabel(n):n,r)},this):n},t.exports=u},function(t,e){\"use strict\";function i(){this._coordinateSystems=[]}var n={};i.prototype={constructor:i,create:function(t,e){var i=[];for(var r in n){var o=n[r].create(t,e);o&&(i=i.concat(o))}this._coordinateSystems=i},update:function(t,e){for(var i=this._coordinateSystems,n=0;n<i.length;n++)i[n].update&&i[n].update(t,e)}},i.register=function(t,e){n[t]=e},i.get=function(t){return n[t]},t.exports=i},function(t,e,i){\"use strict\";function n(t){return t.getBoundingClientRect?t.getBoundingClientRect():{left:0,top:0}}function r(t,e,i){var r=n(t);return i=i||{},i.zrX=e.clientX-r.left,i.zrY=e.clientY-r.top,i}function o(t,e){if(e=e||window.event,null!=e.zrX)return e;var i=e.type,n=i&&i.indexOf(\"touch\")>=0;if(n){var o=\"touchend\"!=i?e.targetTouches[0]:e.changedTouches[0];o&&r(t,o,e)}else r(t,e,e),e.zrDelta=e.wheelDelta?e.wheelDelta/120:-(e.detail||0)/3;return e}function a(t,e,i){u?t.addEventListener(e,i):t.attachEvent(\"on\"+e,i)}function s(t,e,i){u?t.removeEventListener(e,i):t.detachEvent(\"on\"+e,i)}var l=i(20),u=\"undefined\"!=typeof window&&!!window.addEventListener,h=u?function(t){t.preventDefault(),t.stopPropagation(),t.cancelBubble=!0}:function(t){t.returnValue=!1,t.cancelBubble=!0};t.exports={clientToLocal:r,normalizeEvent:o,addEventListener:a,removeEventListener:s,stop:h,Dispatcher:l}},function(t,e){\"use strict\";var i={};t.exports={register:function(t,e){i[t]=e},get:function(t){return i[t]}}},function(t,e,i){\"use strict\";var n=i(3),r=i(7),o=n.extendShape({type:\"triangle\",shape:{cx:0,cy:0,width:0,height:0},buildPath:function(t,e){var i=e.cx,n=e.cy,r=e.width/2,o=e.height/2;t.moveTo(i,n-o),t.lineTo(i+r,n+o),t.lineTo(i-r,n+o),t.closePath()}}),a=n.extendShape({type:\"diamond\",shape:{cx:0,cy:0,width:0,height:0},buildPath:function(t,e){var i=e.cx,n=e.cy,r=e.width/2,o=e.height/2;t.moveTo(i,n-o),t.lineTo(i+r,n),t.lineTo(i,n+o),t.lineTo(i-r,n),t.closePath()}}),s=n.extendShape({type:\"pin\",shape:{x:0,y:0,width:0,height:0},buildPath:function(t,e){var i=e.x,n=e.y,r=e.width/5*3,o=Math.max(r,e.height),a=r/2,s=a*a/(o-a),l=n-o+a+s,u=Math.asin(s/a),h=Math.cos(u)*a,c=Math.sin(u),d=Math.cos(u);t.arc(i,l,a,Math.PI-u,2*Math.PI+u);var f=.6*a,p=.7*a;t.bezierCurveTo(i+h-c*f,l+s+d*f,i,n-p,i,n),t.bezierCurveTo(i,n-p,i-h+c*f,l+s+d*f,i-h,l+s),t.closePath()}}),l=n.extendShape({type:\"arrow\",shape:{x:0,y:0,width:0,height:0},buildPath:function(t,e){var i=e.height,n=e.width,r=e.x,o=e.y,a=n/3*2;t.moveTo(r,o),t.lineTo(r+a,o+i),t.lineTo(r,o+i/4*3),t.lineTo(r-a,o+i),t.lineTo(r,o),t.closePath()}}),u={line:n.Line,rect:n.Rect,roundRect:n.Rect,square:n.Rect,circle:n.Circle,diamond:a,pin:s,arrow:l,triangle:o},h={line:function(t,e,i,n,r){r.x1=t,r.y1=e+n/2,r.x2=t+i,r.y2=e+n/2},rect:function(t,e,i,n,r){r.x=t,r.y=e,r.width=i,r.height=n},roundRect:function(t,e,i,n,r){r.x=t,r.y=e,r.width=i,r.height=n,r.r=Math.min(i,n)/4},square:function(t,e,i,n,r){var o=Math.min(i,n);r.x=t,r.y=e,r.width=o,r.height=o},circle:function(t,e,i,n,r){r.cx=t+i/2,r.cy=e+n/2,r.r=Math.min(i,n)/2},diamond:function(t,e,i,n,r){r.cx=t+i/2,r.cy=e+n/2,r.width=i,r.height=n},pin:function(t,e,i,n,r){r.x=t+i/2,r.y=e+n/2,r.width=i,r.height=n},arrow:function(t,e,i,n,r){r.x=t+i/2,r.y=e+n/2,r.width=i,r.height=n},triangle:function(t,e,i,n,r){r.cx=t+i/2,r.cy=e+n/2,r.width=i,r.height=n}},c={};for(var d in u)c[d]=new u[d];var f=n.extendShape({type:\"symbol\",shape:{symbolType:\"\",x:0,y:0,width:0,height:0},beforeBrush:function(){var t=this.style,e=this.shape;\"pin\"===e.symbolType&&\"inside\"===t.textPosition&&(t.textPosition=[\"50%\",\"40%\"],t.textAlign=\"center\",t.textVerticalAlign=\"middle\")},buildPath:function(t,e,i){var n=e.symbolType,r=c[n];\"none\"!==e.symbolType&&(r||(n=\"rect\",r=c[n]),h[n](e.x,e.y,e.width,e.height,r.shape),r.buildPath(t,r.shape,i))}}),p=function(t){if(\"image\"!==this.type){var e=this.style,i=this.shape;i&&\"line\"===i.symbolType?e.stroke=t:this.__isEmptyBrush?(e.stroke=t,e.fill=\"#fff\"):(e.fill&&(e.fill=t),e.stroke&&(e.stroke=t)),this.dirty(!1)}},g={createSymbol:function(t,e,i,o,a,s){var l=0===t.indexOf(\"empty\");l&&(t=t.substr(5,1).toLowerCase()+t.substr(6));var u;return u=0===t.indexOf(\"image://\")?new n.Image({style:{image:t.slice(8),x:e,y:i,width:o,height:a}}):0===t.indexOf(\"path://\")?n.makePath(t.slice(7),{},new r(e,i,o,a)):new f({shape:{symbolType:t,x:e,y:i,width:o,height:a}}),u.__isEmptyBrush=l,u.setColor=p,u.setColor(s),u}};t.exports=g},function(t,e,i){function n(){this.group=new a,this.uid=s.getUID(\"viewChart\")}function r(t,e){if(t&&(t.trigger(e),\"group\"===t.type))for(var i=0;i<t.childCount();i++)r(t.childAt(i),e)}function o(t,e,i){var n=e&&e.dataIndex,o=e&&e.name;if(null!=n)for(var a=n instanceof Array?n:[n],s=0,l=a.length;l>s;s++)r(t.getItemGraphicEl(a[s]),i);else if(o)for(var u=o instanceof Array?o:[o],s=0,l=u.length;l>s;s++){var n=t.indexOfName(u[s]);r(t.getItemGraphicEl(n),i)}else t.eachItemGraphicEl(function(t){r(t,i)})}var a=i(34),s=i(43),l=i(21);n.prototype={type:\"chart\",init:function(t,e){},render:function(t,e,i,n){},highlight:function(t,e,i,n){o(t.getData(),n,\"emphasis\");\n},downplay:function(t,e,i,n){o(t.getData(),n,\"normal\")},remove:function(t,e){this.group.removeAll()},dispose:function(){}};var u=n.prototype;u.updateView=u.updateLayout=u.updateVisual=function(t,e,i,n){this.render(t,e,i,n)},l.enableClassExtend(n),l.enableClassManagement(n,{registerWhenExtend:!0}),t.exports=n},function(t,e,i){\"use strict\";var n=i(17),r=i(5),o=i(73),a=i(7),s=i(33).devicePixelRatio,l={M:1,L:2,C:3,Q:4,A:5,Z:6,R:7},u=[],h=[],c=[],d=[],f=Math.min,p=Math.max,g=Math.cos,v=Math.sin,m=Math.sqrt,y=Math.abs,x=\"undefined\"!=typeof Float32Array,_=function(){this.data=[],this._len=0,this._ctx=null,this._xi=0,this._yi=0,this._x0=0,this._y0=0,this._ux=0,this._uy=0};_.prototype={constructor:_,_lineDash:null,_dashOffset:0,_dashIdx:0,_dashSum:0,setScale:function(t,e){this._ux=y(1/s/t)||0,this._uy=y(1/s/e)||0},getContext:function(){return this._ctx},beginPath:function(t){return this._ctx=t,t&&t.beginPath(),t&&(this.dpr=t.dpr),this._len=0,this._lineDash&&(this._lineDash=null,this._dashOffset=0),this},moveTo:function(t,e){return this.addData(l.M,t,e),this._ctx&&this._ctx.moveTo(t,e),this._x0=t,this._y0=e,this._xi=t,this._yi=e,this},lineTo:function(t,e){var i=y(t-this._xi)>this._ux||y(e-this._yi)>this._uy||this._len<5;return this.addData(l.L,t,e),this._ctx&&i&&(this._needsDash()?this._dashedLineTo(t,e):this._ctx.lineTo(t,e)),i&&(this._xi=t,this._yi=e),this},bezierCurveTo:function(t,e,i,n,r,o){return this.addData(l.C,t,e,i,n,r,o),this._ctx&&(this._needsDash()?this._dashedBezierTo(t,e,i,n,r,o):this._ctx.bezierCurveTo(t,e,i,n,r,o)),this._xi=r,this._yi=o,this},quadraticCurveTo:function(t,e,i,n){return this.addData(l.Q,t,e,i,n),this._ctx&&(this._needsDash()?this._dashedQuadraticTo(t,e,i,n):this._ctx.quadraticCurveTo(t,e,i,n)),this._xi=i,this._yi=n,this},arc:function(t,e,i,n,r,o){return this.addData(l.A,t,e,i,i,n,r-n,0,o?0:1),this._ctx&&this._ctx.arc(t,e,i,n,r,o),this._xi=g(r)*i+t,this._xi=v(r)*i+t,this},arcTo:function(t,e,i,n,r){return this._ctx&&this._ctx.arcTo(t,e,i,n,r),this},rect:function(t,e,i,n){return this._ctx&&this._ctx.rect(t,e,i,n),this.addData(l.R,t,e,i,n),this},closePath:function(){this.addData(l.Z);var t=this._ctx,e=this._x0,i=this._y0;return t&&(this._needsDash()&&this._dashedLineTo(e,i),t.closePath()),this._xi=e,this._yi=i,this},fill:function(t){t&&t.fill(),this.toStatic()},stroke:function(t){t&&t.stroke(),this.toStatic()},setLineDash:function(t){if(t instanceof Array){this._lineDash=t,this._dashIdx=0;for(var e=0,i=0;i<t.length;i++)e+=t[i];this._dashSum=e}return this},setLineDashOffset:function(t){return this._dashOffset=t,this},len:function(){return this._len},setData:function(t){var e=t.length;this.data&&this.data.length==e||!x||(this.data=new Float32Array(e));for(var i=0;e>i;i++)this.data[i]=t[i];this._len=e},appendPath:function(t){t instanceof Array||(t=[t]);for(var e=t.length,i=0,n=this._len,r=0;e>r;r++)i+=t[r].len();x&&this.data instanceof Float32Array&&(this.data=new Float32Array(n+i));for(var r=0;e>r;r++)for(var o=t[r].data,a=0;a<o.length;a++)this.data[n++]=o[a];this._len=n},addData:function(t){var e=this.data;this._len+arguments.length>e.length&&(this._expandData(),e=this.data);for(var i=0;i<arguments.length;i++)e[this._len++]=arguments[i];this._prevCmd=t},_expandData:function(){if(!(this.data instanceof Array)){for(var t=[],e=0;e<this._len;e++)t[e]=this.data[e];this.data=t}},_needsDash:function(){return this._lineDash},_dashedLineTo:function(t,e){var i,n,r=this._dashSum,o=this._dashOffset,a=this._lineDash,s=this._ctx,l=this._xi,u=this._yi,h=t-l,c=e-u,d=m(h*h+c*c),g=l,v=u,y=a.length;for(h/=d,c/=d,0>o&&(o=r+o),o%=r,g-=o*h,v-=o*c;h>0&&t>=g||0>h&&g>=t||0==h&&(c>0&&e>=v||0>c&&v>=e);)n=this._dashIdx,i=a[n],g+=h*i,v+=c*i,this._dashIdx=(n+1)%y,h>0&&l>g||0>h&&g>l||c>0&&u>v||0>c&&v>u||s[n%2?\"moveTo\":\"lineTo\"](h>=0?f(g,t):p(g,t),c>=0?f(v,e):p(v,e));h=g-t,c=v-e,this._dashOffset=-m(h*h+c*c)},_dashedBezierTo:function(t,e,i,r,o,a){var s,l,u,h,c,d=this._dashSum,f=this._dashOffset,p=this._lineDash,g=this._ctx,v=this._xi,y=this._yi,x=n.cubicAt,_=0,b=this._dashIdx,w=p.length,S=0;for(0>f&&(f=d+f),f%=d,s=0;1>s;s+=.1)l=x(v,t,i,o,s+.1)-x(v,t,i,o,s),u=x(y,e,r,a,s+.1)-x(y,e,r,a,s),_+=m(l*l+u*u);for(;w>b&&(S+=p[b],!(S>f));b++);for(s=(S-f)/_;1>=s;)h=x(v,t,i,o,s),c=x(y,e,r,a,s),b%2?g.moveTo(h,c):g.lineTo(h,c),s+=p[b]/_,b=(b+1)%w;b%2!==0&&g.lineTo(o,a),l=o-h,u=a-c,this._dashOffset=-m(l*l+u*u)},_dashedQuadraticTo:function(t,e,i,n){var r=i,o=n;i=(i+2*t)/3,n=(n+2*e)/3,t=(this._xi+2*t)/3,e=(this._yi+2*e)/3,this._dashedBezierTo(t,e,i,n,r,o)},toStatic:function(){var t=this.data;t instanceof Array&&(t.length=this._len,x&&(this.data=new Float32Array(t)))},getBoundingRect:function(){u[0]=u[1]=c[0]=c[1]=Number.MAX_VALUE,h[0]=h[1]=d[0]=d[1]=-Number.MAX_VALUE;for(var t=this.data,e=0,i=0,n=0,s=0,f=0;f<t.length;){var p=t[f++];switch(1==f&&(e=t[f],i=t[f+1],n=e,s=i),p){case l.M:n=t[f++],s=t[f++],e=n,i=s,c[0]=n,c[1]=s,d[0]=n,d[1]=s;break;case l.L:o.fromLine(e,i,t[f],t[f+1],c,d),e=t[f++],i=t[f++];break;case l.C:o.fromCubic(e,i,t[f++],t[f++],t[f++],t[f++],t[f],t[f+1],c,d),e=t[f++],i=t[f++];break;case l.Q:o.fromQuadratic(e,i,t[f++],t[f++],t[f],t[f+1],c,d),e=t[f++],i=t[f++];break;case l.A:var m=t[f++],y=t[f++],x=t[f++],_=t[f++],b=t[f++],w=t[f++]+b,S=(t[f++],1-t[f++]);1==f&&(n=g(b)*x+m,s=v(b)*_+y),o.fromArc(m,y,x,_,b,w,S,c,d),e=g(w)*x+m,i=v(w)*_+y;break;case l.R:n=e=t[f++],s=i=t[f++];var M=t[f++],T=t[f++];o.fromLine(n,s,n+M,s+T,c,d);break;case l.Z:e=n,i=s}r.min(u,u,c),r.max(h,h,d)}return 0===f&&(u[0]=u[1]=h[0]=h[1]=0),new a(u[0],u[1],h[0]-u[0],h[1]-u[1])},rebuildPath:function(t){for(var e,i,n,r,o,a,s=this.data,u=this._ux,h=this._uy,c=this._len,d=0;c>d;){var f=s[d++];switch(1==d&&(n=s[d],r=s[d+1],e=n,i=r),f){case l.M:e=n=s[d++],i=r=s[d++],t.moveTo(n,r);break;case l.L:o=s[d++],a=s[d++],(y(o-n)>u||y(a-r)>h||d===c-1)&&(t.lineTo(o,a),n=o,r=a);break;case l.C:t.bezierCurveTo(s[d++],s[d++],s[d++],s[d++],s[d++],s[d++]),n=s[d-2],r=s[d-1];break;case l.Q:t.quadraticCurveTo(s[d++],s[d++],s[d++],s[d++]),n=s[d-2],r=s[d-1];break;case l.A:var p=s[d++],m=s[d++],x=s[d++],_=s[d++],b=s[d++],w=s[d++],S=s[d++],M=s[d++],T=x>_?x:_,A=x>_?1:x/_,I=x>_?_/x:1,L=Math.abs(x-_)>.001,C=b+w;L?(t.translate(p,m),t.rotate(S),t.scale(A,I),t.arc(0,0,T,b,C,1-M),t.scale(1/A,1/I),t.rotate(-S),t.translate(-p,-m)):t.arc(p,m,T,b,C,1-M),1==d&&(e=g(b)*x+p,i=v(b)*_+m),n=g(C)*x+p,r=v(C)*_+m;break;case l.R:e=n=s[d],i=r=s[d+1],t.rect(s[d++],s[d++],s[d++],s[d++]);break;case l.Z:t.closePath(),n=e,r=i}}}},_.CMD=l,t.exports=_},function(t,e){var i=function(t){this.colorStops=t||[]};i.prototype={constructor:i,addColorStop:function(t,e){this.colorStops.push({offset:t,color:e})}},t.exports=i},function(t,e,i){function n(t,e,i,n){if(!e)return t;var s=r(e[0]),l=o.isArray(s)&&s.length||1;i=i||[],n=n||\"extra\";for(var u=0;l>u;u++)if(!t[u]){var h=i[u]||n+(u-i.length);t[u]=a(e,u)?{type:\"ordinal\",name:h}:h}return t}function r(t){return o.isArray(t)?t:o.isObject(t)?t.value:t}var o=i(1),a=n.guessOrdinal=function(t,e){for(var i=0,n=t.length;n>i;i++){var a=r(t[i]);if(!o.isArray(a))return!1;var a=a[e];if(null!=a&&isFinite(a))return!1;if(o.isString(a)&&\"-\"!==a)return!0}return!1};t.exports=n},function(t,e,i){var n=i(1);t.exports=function(t){for(var e=0;e<t.length;e++)t[e][1]||(t[e][1]=t[e][0]);return function(e){for(var i={},r=0;r<t.length;r++){var o=t[r][1];if(!(e&&n.indexOf(e,o)>=0)){var a=this.getShallow(o);null!=a&&(i[t[r][0]]=a)}}return i}}},function(t,e,i){function n(){this._extent=[1/0,-(1/0)],this._interval=0,this.init&&this.init.apply(this,arguments)}var r=i(21),o=n.prototype;o.parse=function(t){return t},o.contain=function(t){var e=this._extent;return t>=e[0]&&t<=e[1]},o.normalize=function(t){var e=this._extent;return e[1]===e[0]?.5:(t-e[0])/(e[1]-e[0])},o.scale=function(t){var e=this._extent;return t*(e[1]-e[0])+e[0]},o.unionExtent=function(t){var e=this._extent;t[0]<e[0]&&(e[0]=t[0]),t[1]>e[1]&&(e[1]=t[1])},o.getExtent=function(){return this._extent.slice()},o.setExtent=function(t,e){var i=this._extent;isNaN(t)||(i[0]=t),isNaN(e)||(i[1]=e)},o.getTicksLabels=function(){for(var t=[],e=this.getTicks(),i=0;i<e.length;i++)t.push(this.getLabel(e[i]));return t},r.enableClassExtend(n),r.enableClassManagement(n,{registerWhenExtend:!0}),t.exports=n},function(t,e){var i=1;\"undefined\"!=typeof window&&(i=Math.max(window.devicePixelRatio||1,1));var n={debugMode:0,devicePixelRatio:i};t.exports=n},function(t,e,i){var n=i(1),r=i(58),o=i(7),a=function(t){t=t||{},r.call(this,t);for(var e in t)this[e]=t[e];this._children=[],this.__storage=null,this.__dirty=!0};a.prototype={constructor:a,isGroup:!0,type:\"group\",silent:!1,children:function(){return this._children.slice()},childAt:function(t){return this._children[t]},childOfName:function(t){for(var e=this._children,i=0;i<e.length;i++)if(e[i].name===t)return e[i]},childCount:function(){return this._children.length},add:function(t){return t&&t!==this&&t.parent!==this&&(this._children.push(t),this._doAdd(t)),this},addBefore:function(t,e){if(t&&t!==this&&t.parent!==this&&e&&e.parent===this){var i=this._children,n=i.indexOf(e);n>=0&&(i.splice(n,0,t),this._doAdd(t))}return this},_doAdd:function(t){t.parent&&t.parent.remove(t),t.parent=this;var e=this.__storage,i=this.__zr;e&&e!==t.__storage&&(e.addToMap(t),t instanceof a&&t.addChildrenToStorage(e)),i&&i.refresh()},remove:function(t){var e=this.__zr,i=this.__storage,r=this._children,o=n.indexOf(r,t);return 0>o?this:(r.splice(o,1),t.parent=null,i&&(i.delFromMap(t.id),t instanceof a&&t.delChildrenFromStorage(i)),e&&e.refresh(),this)},removeAll:function(){var t,e,i=this._children,n=this.__storage;for(e=0;e<i.length;e++)t=i[e],n&&(n.delFromMap(t.id),t instanceof a&&t.delChildrenFromStorage(n)),t.parent=null;return i.length=0,this},eachChild:function(t,e){for(var i=this._children,n=0;n<i.length;n++){var r=i[n];t.call(e,r,n)}return this},traverse:function(t,e){for(var i=0;i<this._children.length;i++){var n=this._children[i];t.call(e,n),\"group\"===n.type&&n.traverse(t,e)}return this},addChildrenToStorage:function(t){for(var e=0;e<this._children.length;e++){var i=this._children[e];t.addToMap(i),i instanceof a&&i.addChildrenToStorage(t)}},delChildrenFromStorage:function(t){for(var e=0;e<this._children.length;e++){var i=this._children[e];t.delFromMap(i.id),i instanceof a&&i.delChildrenFromStorage(t)}},dirty:function(){return this.__dirty=!0,this.__zr&&this.__zr.refresh(),this},getBoundingRect:function(t){for(var e=null,i=new o(0,0,0,0),n=t||this._children,r=[],a=0;a<n.length;a++){var s=n[a];if(!s.ignore&&!s.invisible){var l=s.getBoundingRect(),u=s.getLocalTransform(r);u?(i.copy(l),i.applyTransform(u),e=e||i.clone(),e.union(i)):(e=e||l.clone(),e.union(l))}}return e||i}},n.inherits(a,r),t.exports=a},function(t,e,i){\"use strict\";function n(t){for(var e=0;e<t.length&&null==t[e];)e++;return t[e]}function r(t){var e=n(t);return null!=e&&!c.isArray(p(e))}function o(t,e,i){t=t||[];var n=e.get(\"coordinateSystem\"),o=v[n],a=f.get(n),s=o&&o(t,e,i),m=s&&s.dimensions;m||(m=a&&a.dimensions||[\"x\",\"y\"],m=h(m,t,m.concat([\"value\"])));var y=s?s.categoryIndex:-1,x=new u(m,e),_=l(s,t),b={},w=y>=0&&r(t)?function(t,e,i,n){return d.isDataItemOption(t)&&(x.hasItemOption=!0),n===y?i:g(p(t),m[n])}:function(t,e,i,n){var r=p(t),o=g(r&&r[n],m[n]);d.isDataItemOption(t)&&(x.hasItemOption=!0);var a=s&&s.categoryAxesModels;return a&&a[e]&&\"string\"==typeof o&&(b[e]=b[e]||a[e].getCategories(),o=c.indexOf(b[e],o),0>o&&!isNaN(o)&&(o=+o)),o};return x.hasItemOption=!1,x.initData(t,_,w),x}function a(t){return\"category\"!==t&&\"time\"!==t}function s(t){return\"category\"===t?\"ordinal\":\"time\"===t?\"time\":\"float\"}function l(t,e){var i,n=[],r=t&&t.dimensions[t.categoryIndex];if(r&&(i=t.categoryAxesModels[r.name]),i){var o=i.getCategories();if(o){var a=e.length;if(c.isArray(e[0])&&e[0].length>1){n=[];for(var s=0;a>s;s++)n[s]=o[e[s][t.categoryIndex||0]]}else n=o.slice(0)}}return n}var u=i(14),h=i(30),c=i(1),d=i(11),f=i(23),p=d.getDataItemValue,g=d.converDataValue,v={cartesian2d:function(t,e,i){var n=c.map([\"xAxis\",\"yAxis\"],function(t){return i.queryComponents({mainType:t,index:e.get(t+\"Index\"),id:e.get(t+\"Id\")})[0]}),r=n[0],o=n[1],l=r.get(\"type\"),u=o.get(\"type\"),d=[{name:\"x\",type:s(l),stackable:a(l)},{name:\"y\",type:s(u),stackable:a(u)}],f=\"category\"===l,p=\"category\"===u;h(d,t,[\"x\",\"y\",\"z\"]);var g={};return f&&(g.x=r),p&&(g.y=o),{dimensions:d,categoryIndex:f?0:p?1:-1,categoryAxesModels:g}},polar:function(t,e,i){var n=i.queryComponents({mainType:\"polar\",index:e.get(\"polarIndex\"),id:e.get(\"polarId\")})[0],r=n.findAxisModel(\"angleAxis\"),o=n.findAxisModel(\"radiusAxis\"),l=o.get(\"type\"),u=r.get(\"type\"),c=[{name:\"radius\",type:s(l),stackable:a(l)},{name:\"angle\",type:s(u),stackable:a(u)}],d=\"category\"===u,f=\"category\"===l;h(c,t,[\"radius\",\"angle\",\"value\"]);var p={};return f&&(p.radius=o),d&&(p.angle=r),{dimensions:c,categoryIndex:d?1:f?0:-1,categoryAxesModels:p}},geo:function(t,e,i){return{dimensions:h([{name:\"lng\"},{name:\"lat\"}],t,[\"lng\",\"lat\",\"value\"])}}};t.exports=o},function(t,e,i){\"use strict\";var n=i(3),r=i(1),o=i(2);i(54),i(104),o.extendComponentView({type:\"grid\",render:function(t,e){this.group.removeAll(),t.get(\"show\")&&this.group.add(new n.Rect({shape:t.coordinateSystem.getRect(),style:r.defaults({fill:t.get(\"backgroundColor\")},t.getItemStyle()),silent:!0}))}}),o.registerPreprocessor(function(t){t.xAxis&&t.yAxis&&!t.grid&&(t.grid={})})},function(t,e,i){function n(t){t=t||{},a.call(this,t);for(var e in t)t.hasOwnProperty(e)&&\"style\"!==e&&(this[e]=t[e]);this.style=new o(t.style),this._rect=null,this.__clipPaths=[]}var r=i(1),o=i(64),a=i(58),s=i(75);n.prototype={constructor:n,type:\"displayable\",__dirty:!0,invisible:!1,z:0,z2:0,zlevel:0,draggable:!1,dragging:!1,silent:!1,culling:!1,cursor:\"pointer\",rectHover:!1,progressive:-1,beforeBrush:function(t){},afterBrush:function(t){},brush:function(t,e){},getBoundingRect:function(){},contain:function(t,e){return this.rectContain(t,e)},traverse:function(t,e){t.call(e,this)},rectContain:function(t,e){var i=this.transformCoordToLocal(t,e),n=this.getBoundingRect();return n.contain(i[0],i[1])},dirty:function(){this.__dirty=!0,this._rect=null,this.__zr&&this.__zr.refresh()},animateStyle:function(t){return this.animate(\"style\",t)},attrKV:function(t,e){\"style\"!==t?a.prototype.attrKV.call(this,t,e):this.style.set(e)},setStyle:function(t,e){return this.style.set(t,e),this.dirty(!1),this},useStyle:function(t){return this.style=new o(t),this.dirty(!1),this}},r.inherits(n,a),r.mixin(n,s),t.exports=n},function(t,e,i){var n=i(4),r=i(8),o=i(32),a=Math.floor,s=Math.ceil,l=n.getPrecisionSafe,u=n.round,h=o.extend({type:\"interval\",_interval:0,setExtent:function(t,e){var i=this._extent;isNaN(t)||(i[0]=parseFloat(t)),isNaN(e)||(i[1]=parseFloat(e))},unionExtent:function(t){var e=this._extent;t[0]<e[0]&&(e[0]=t[0]),t[1]>e[1]&&(e[1]=t[1]),h.prototype.setExtent.call(this,e[0],e[1])},getInterval:function(){return this._interval||this.niceTicks(),this._interval},setInterval:function(t){this._interval=t,this._niceExtent=this._extent.slice()},getTicks:function(){this._interval||this.niceTicks();var t=this._interval,e=this._extent,i=[],n=1e4;if(t){var r=this._niceExtent,o=l(t)+2;e[0]<r[0]&&i.push(e[0]);for(var a=r[0];a<=r[1];)if(i.push(a),a=u(a+t,o),i.length>n)return[];e[1]>r[1]&&i.push(e[1])}return i},getTicksLabels:function(){for(var t=[],e=this.getTicks(),i=0;i<e.length;i++)t.push(this.getLabel(e[i]));return t},getLabel:function(t){return r.addCommas(t)},niceTicks:function(t){t=t||5;var e=this._extent,i=e[1]-e[0];if(isFinite(i)){0>i&&(i=-i,e.reverse());var r=u(n.nice(i/t,!0),Math.max(l(e[0]),l(e[1]))+2),o=l(r)+2,h=[u(s(e[0]/r)*r,o),u(a(e[1]/r)*r,o)];this._interval=r,this._niceExtent=h}},niceExtent:function(t,e,i){var n=this._extent;if(n[0]===n[1])if(0!==n[0]){var r=n[0];i?n[0]-=r/2:(n[1]+=r/2,n[0]-=r/2)}else n[1]=1;var o=n[1]-n[0];isFinite(o)||(n[0]=0,n[1]=1),this.niceTicks(t);var l=this._interval;e||(n[0]=u(a(n[0]/l)*l)),i||(n[1]=u(s(n[1]/l)*l))}});h.create=function(){return new h},t.exports=h},function(t,e,i){function n(t){this.group=new o.Group,this._symbolCtor=t||a}function r(t,e,i){var n=t.getItemLayout(e);return n&&!isNaN(n[0])&&!isNaN(n[1])&&!(i&&i(e))&&\"none\"!==t.getItemVisual(e,\"symbol\")}var o=i(3),a=i(49),s=n.prototype;s.updateData=function(t,e){var i=this.group,n=t.hostModel,a=this._data,s=this._symbolCtor,l={itemStyle:n.getModel(\"itemStyle.normal\").getItemStyle([\"color\"]),hoverItemStyle:n.getModel(\"itemStyle.emphasis\").getItemStyle(),symbolRotate:n.get(\"symbolRotate\"),symbolOffset:n.get(\"symbolOffset\"),hoverAnimation:n.get(\"hoverAnimation\"),labelModel:n.getModel(\"label.normal\"),hoverLabelModel:n.getModel(\"label.emphasis\")};t.diff(a).add(function(n){var o=t.getItemLayout(n);if(r(t,n,e)){var a=new s(t,n,l);a.attr(\"position\",o),t.setItemGraphicEl(n,a),i.add(a)}}).update(function(u,h){var c=a.getItemGraphicEl(h),d=t.getItemLayout(u);return r(t,u,e)?(c?(c.updateData(t,u,l),o.updateProps(c,{position:d},n)):(c=new s(t,u),c.attr(\"position\",d)),i.add(c),void t.setItemGraphicEl(u,c)):void i.remove(c)}).remove(function(t){var e=a.getItemGraphicEl(t);e&&e.fadeOut(function(){i.remove(e)})}).execute(),this._data=t},s.updateLayout=function(){var t=this._data;t&&t.eachItemGraphicEl(function(e,i){var n=t.getItemLayout(i);e.attr(\"position\",n)})},s.remove=function(t){var e=this.group,i=this._data;i&&(t?i.eachItemGraphicEl(function(t){t.fadeOut(function(){e.remove(t)})}):e.removeAll())},t.exports=n},function(t,e,i){function n(t){var e={};return c([\"start\",\"end\",\"startValue\",\"endValue\",\"throttle\"],function(i){t.hasOwnProperty(i)&&(e[i]=t[i])}),e}function r(t,e,i,n){null!=i[e]&&null==i[t]&&(n[t]=null)}var o=i(1),a=i(12),s=i(2),l=i(11),u=i(108),h=i(179),c=o.each,d=u.eachAxisDim,f=s.extendComponentModel({type:\"dataZoom\",dependencies:[\"xAxis\",\"yAxis\",\"zAxis\",\"radiusAxis\",\"angleAxis\",\"series\"],defaultOption:{zlevel:0,z:4,orient:null,xAxisIndex:null,yAxisIndex:null,filterMode:\"filter\",throttle:null,start:0,end:100,startValue:null,endValue:null},init:function(t,e,i){this._dataIntervalByAxis={},this._dataInfo={},this._axisProxies={},this.textStyleModel,this._autoThrottle=!0;var r=n(t);this.mergeDefaultAndTheme(t,i),this.doInit(r)},mergeOption:function(t){var e=n(t);o.merge(this.option,t,!0),this.doInit(e)},doInit:function(t){var e=this.option;a.canvasSupported||(e.realtime=!1),this._setDefaultThrottle(t),r(\"start\",\"startValue\",t,e),r(\"end\",\"endValue\",t,e),this.textStyleModel=this.getModel(\"textStyle\"),this._resetTarget(),this._giveAxisProxies()},_giveAxisProxies:function(){var t=this._axisProxies;this.eachTargetAxis(function(e,i,n,r){var o=this.dependentModels[e.axis][i],a=o.__dzAxisProxy||(o.__dzAxisProxy=new h(e.name,i,this,r));t[e.name+\"_\"+i]=a},this)},_resetTarget:function(){var t=this.option,e=this._judgeAutoMode();d(function(e){var i=e.axisIndex;t[i]=l.normalizeToArray(t[i])},this),\"axisIndex\"===e?this._autoSetAxisIndex():\"orient\"===e&&this._autoSetOrient()},_judgeAutoMode:function(){var t=this.option,e=!1;d(function(i){null!=t[i.axisIndex]&&(e=!0)},this);var i=t.orient;return null==i&&e?\"orient\":e?void 0:(null==i&&(t.orient=\"horizontal\"),\"axisIndex\")},_autoSetAxisIndex:function(){var t=!0,e=this.get(\"orient\",!0),i=this.option;if(t){var n=\"vertical\"===e?{dim:\"y\",axisIndex:\"yAxisIndex\",axis:\"yAxis\"}:{dim:\"x\",axisIndex:\"xAxisIndex\",axis:\"xAxis\"};this.dependentModels[n.axis].length&&(i[n.axisIndex]=[0],t=!1)}t&&d(function(e){if(t){var n=[],r=this.dependentModels[e.axis];if(r.length&&!n.length)for(var o=0,a=r.length;a>o;o++)\"category\"===r[o].get(\"type\")&&n.push(o);i[e.axisIndex]=n,n.length&&(t=!1)}},this),t&&this.ecModel.eachSeries(function(t){this._isSeriesHasAllAxesTypeOf(t,\"value\")&&d(function(e){var n=i[e.axisIndex],r=t.get(e.axisIndex),a=t.get(e.axisId),s=t.ecModel.queryComponents({mainType:e.axis,index:r,id:a})[0];r=s.componentIndex,o.indexOf(n,r)<0&&n.push(r)})},this)},_autoSetOrient:function(){var t;this.eachTargetAxis(function(e){!t&&(t=e.name)},this),this.option.orient=\"y\"===t?\"vertical\":\"horizontal\"},_isSeriesHasAllAxesTypeOf:function(t,e){var i=!0;return d(function(n){var r=t.get(n.axisIndex),o=this.dependentModels[n.axis][r];o&&o.get(\"type\")===e||(i=!1)},this),i},_setDefaultThrottle:function(t){if(t.hasOwnProperty(\"throttle\")&&(this._autoThrottle=!1),this._autoThrottle){var e=this.ecModel.option;this.option.throttle=e.animation&&e.animationDurationUpdate>0?100:20}},getFirstTargetAxisModel:function(){var t;return d(function(e){if(null==t){var i=this.get(e.axisIndex);i.length&&(t=this.dependentModels[e.axis][i[0]])}},this),t},eachTargetAxis:function(t,e){var i=this.ecModel;d(function(n){c(this.get(n.axisIndex),function(r){t.call(e,n,r,this,i)},this)},this)},getAxisProxy:function(t,e){return this._axisProxies[t+\"_\"+e]},setRawRange:function(t){c([\"start\",\"end\",\"startValue\",\"endValue\"],function(e){this.option[e]=t[e]},this)},getPercentRange:function(){var t=this.findRepresentativeAxisProxy();return t?t.getDataPercentWindow():void 0},getValueRange:function(t,e){if(null!=t||null!=e)return this.getAxisProxy(t,e).getDataValueWindow();var i=this.findRepresentativeAxisProxy();return i?i.getDataValueWindow():void 0},findRepresentativeAxisProxy:function(){var t=this._axisProxies;for(var e in t)if(t.hasOwnProperty(e)&&t[e].hostedBy(this))return t[e];for(var e in t)if(t.hasOwnProperty(e)&&!t[e].hostedBy(this))return t[e]}});t.exports=f},function(t,e,i){var n=i(57);t.exports=n.extend({type:\"dataZoom\",render:function(t,e,i,n){this.dataZoomModel=t,this.ecModel=e,this.api=i},getTargetInfo:function(){function t(t,e,i,n){for(var r,o=0;o<i.length;o++)if(i[o].model===t){r=i[o];break}r||i.push(r={model:t,axisModels:[],coordIndex:n}),r.axisModels.push(e)}var e=this.dataZoomModel,i=this.ecModel,n=[],r=[],o=[];return e.eachTargetAxis(function(e,a){var s=i.getComponent(e.axis,a);if(s){o.push(s);var l;l=\"xAxis\"===e.axis||\"yAxis\"===e.axis?\"grid\":\"polar\";var u=i.queryComponents({mainType:l,index:s.get(l+\"Index\"),id:s.get(l+\"Id\")})[0];null!=u&&t(u,s,\"grid\"===l?n:r,u.componentIndex)}},this),{cartesians:n,polars:r,axisModels:o}}})},function(t,e,i){function n(t,e){var i=t[1]-t[0],n=e,r=i/n/2;t[0]+=r,t[1]-=r}var r=i(4),o=r.linearMap,a=i(1),s=[0,1],l=function(t,e,i){this.dim=t,this.scale=e,this._extent=i||[0,0],this.inverse=!1,this.onBand=!1};l.prototype={constructor:l,contain:function(t){var e=this._extent,i=Math.min(e[0],e[1]),n=Math.max(e[0],e[1]);return t>=i&&n>=t},containData:function(t){return this.contain(this.dataToCoord(t))},getExtent:function(){var t=this._extent.slice();return t},getPixelPrecision:function(t){return r.getPixelPrecision(t||this.scale.getExtent(),this._extent)},setExtent:function(t,e){var i=this._extent;i[0]=t,i[1]=e},dataToCoord:function(t,e){var i=this._extent,r=this.scale;return t=r.normalize(t),this.onBand&&\"ordinal\"===r.type&&(i=i.slice(),n(i,r.count())),o(t,s,i,e)},coordToData:function(t,e){var i=this._extent,r=this.scale;this.onBand&&\"ordinal\"===r.type&&(i=i.slice(),n(i,r.count()));var a=o(t,i,s,e);return this.scale.scale(a)},getTicksCoords:function(t){if(this.onBand&&!t){for(var e=this.getBands(),i=[],n=0;n<e.length;n++)i.push(e[n][0]);return e[n-1]&&i.push(e[n-1][1]),i}return a.map(this.scale.getTicks(),this.dataToCoord,this)},getLabelsCoords:function(){return a.map(this.scale.getTicks(),this.dataToCoord,this)},getBands:function(){for(var t=this.getExtent(),e=[],i=this.scale.count(),n=t[0],r=t[1],o=r-n,a=0;i>a;a++)e.push([o*a/i+n,o*(a+1)/i+n]);return e},getBandWidth:function(){var t=this._extent,e=this.scale.getExtent(),i=e[1]-e[0]+(this.onBand?1:0);0===i&&(i=1);var n=Math.abs(t[1]-t[0]);return Math.abs(n)/i}},t.exports=l},function(t,e,i){var n=i(1),r=i(21),o=r.parseClassType,a=0,s={},l=\"_\";s.getUID=function(t){return[t||\"\",a++,Math.random()].join(l)},s.enableSubTypeDefaulter=function(t){var e={};return t.registerSubTypeDefaulter=function(t,i){t=o(t),e[t.main]=i},t.determineSubType=function(i,n){var r=n.type;if(!r){var a=o(i).main;t.hasSubTypes(i)&&e[a]&&(r=e[a](n))}return r},t},s.enableTopologicalTravel=function(t,e){function i(t){var i={},a=[];return n.each(t,function(s){var l=r(i,s),u=l.originalDeps=e(s),h=o(u,t);l.entryCount=h.length,0===l.entryCount&&a.push(s),n.each(h,function(t){n.indexOf(l.predecessor,t)<0&&l.predecessor.push(t);var e=r(i,t);n.indexOf(e.successor,t)<0&&e.successor.push(s)})}),{graph:i,noEntryList:a}}function r(t,e){return t[e]||(t[e]={predecessor:[],successor:[]}),t[e]}function o(t,e){var i=[];return n.each(t,function(t){n.indexOf(e,t)>=0&&i.push(t)}),i}t.topologicalTravel=function(t,e,r,o){function a(t){u[t].entryCount--,0===u[t].entryCount&&h.push(t)}function s(t){c[t]=!0,a(t)}if(t.length){var l=i(e),u=l.graph,h=l.noEntryList,c={};for(n.each(t,function(t){c[t]=!0});h.length;){var d=h.pop(),f=u[d],p=!!c[d];p&&(r.call(o,d,f.originalDeps.slice()),delete c[d]),n.each(f.successor,p?s:a)}n.each(c,function(){throw new Error(\"Circle dependency may exists\")})}}},t.exports=s},function(t,e){function i(t){for(var e=0;t>=h;)e|=1&t,t>>=1;return t+e}function n(t,e,i,n){var o=e+1;if(o===i)return 1;if(n(t[o++],t[e])<0){for(;i>o&&n(t[o],t[o-1])<0;)o++;r(t,e,o)}else for(;i>o&&n(t[o],t[o-1])>=0;)o++;return o-e}function r(t,e,i){for(i--;i>e;){var n=t[e];t[e++]=t[i],t[i--]=n}}function o(t,e,i,n,r){for(n===e&&n++;i>n;n++){for(var o,a=t[n],s=e,l=n;l>s;)o=s+l>>>1,r(a,t[o])<0?l=o:s=o+1;var u=n-s;switch(u){case 3:t[s+3]=t[s+2];case 2:t[s+2]=t[s+1];case 1:t[s+1]=t[s];break;default:for(;u>0;)t[s+u]=t[s+u-1],u--}t[s]=a}}function a(t,e,i,n,r,o){var a=0,s=0,l=1;if(o(t,e[i+r])>0){for(s=n-r;s>l&&o(t,e[i+r+l])>0;)a=l,l=(l<<1)+1,0>=l&&(l=s);l>s&&(l=s),a+=r,l+=r}else{for(s=r+1;s>l&&o(t,e[i+r-l])<=0;)a=l,l=(l<<1)+1,0>=l&&(l=s);l>s&&(l=s);var u=a;a=r-l,l=r-u}for(a++;l>a;){var h=a+(l-a>>>1);o(t,e[i+h])>0?a=h+1:l=h}return l}function s(t,e,i,n,r,o){var a=0,s=0,l=1;if(o(t,e[i+r])<0){for(s=r+1;s>l&&o(t,e[i+r-l])<0;)a=l,l=(l<<1)+1,0>=l&&(l=s);l>s&&(l=s);var u=a;a=r-l,l=r-u}else{for(s=n-r;s>l&&o(t,e[i+r+l])>=0;)a=l,l=(l<<1)+1,0>=l&&(l=s);l>s&&(l=s),a+=r,l+=r}for(a++;l>a;){var h=a+(l-a>>>1);o(t,e[i+h])<0?l=h:a=h+1}return l}function l(t,e){function i(t,e){h[y]=t,f[y]=e,y+=1}function n(){for(;y>1;){var t=y-2;if(t>=1&&f[t-1]<=f[t]+f[t+1]||t>=2&&f[t-2]<=f[t]+f[t-1])f[t-1]<f[t+1]&&t--;else if(f[t]>f[t+1])break;o(t)}}function r(){for(;y>1;){var t=y-2;t>0&&f[t-1]<f[t+1]&&t--,o(t)}}function o(i){var n=h[i],r=f[i],o=h[i+1],c=f[i+1];f[i]=r+c,i===y-3&&(h[i+1]=h[i+2],f[i+1]=f[i+2]),y--;var d=s(t[o],t,n,r,0,e);n+=d,r-=d,0!==r&&(c=a(t[n+r-1],t,o,c,c-1,e),0!==c&&(c>=r?l(n,r,o,c):u(n,r,o,c)))}function l(i,n,r,o){var l=0;for(l=0;n>l;l++)x[l]=t[i+l];var u=0,h=r,d=i;if(t[d++]=t[h++],0!==--o){if(1===n){for(l=0;o>l;l++)t[d+l]=t[h+l];return void(t[d+o]=x[u])}for(var f,g,v,m=p;;){f=0,g=0,v=!1;do if(e(t[h],x[u])<0){if(t[d++]=t[h++],g++,f=0,0===--o){v=!0;break}}else if(t[d++]=x[u++],f++,g=0,1===--n){v=!0;break}while(m>(f|g));if(v)break;do{if(f=s(t[h],x,u,n,0,e),0!==f){for(l=0;f>l;l++)t[d+l]=x[u+l];if(d+=f,u+=f,n-=f,1>=n){v=!0;break}}if(t[d++]=t[h++],0===--o){v=!0;break}if(g=a(x[u],t,h,o,0,e),0!==g){for(l=0;g>l;l++)t[d+l]=t[h+l];if(d+=g,h+=g,o-=g,0===o){v=!0;break}}if(t[d++]=x[u++],1===--n){v=!0;break}m--}while(f>=c||g>=c);if(v)break;0>m&&(m=0),m+=2}if(p=m,1>p&&(p=1),1===n){for(l=0;o>l;l++)t[d+l]=t[h+l];t[d+o]=x[u]}else{if(0===n)throw new Error;for(l=0;n>l;l++)t[d+l]=x[u+l]}}else for(l=0;n>l;l++)t[d+l]=x[u+l]}function u(i,n,r,o){var l=0;for(l=0;o>l;l++)x[l]=t[r+l];var u=i+n-1,h=o-1,d=r+o-1,f=0,g=0;if(t[d--]=t[u--],0!==--n){if(1===o){for(d-=n,u-=n,g=d+1,f=u+1,l=n-1;l>=0;l--)t[g+l]=t[f+l];return void(t[d]=x[h])}for(var v=p;;){var m=0,y=0,_=!1;do if(e(x[h],t[u])<0){if(t[d--]=t[u--],m++,y=0,0===--n){_=!0;break}}else if(t[d--]=x[h--],y++,m=0,1===--o){_=!0;break}while(v>(m|y));if(_)break;do{if(m=n-s(x[h],t,i,n,n-1,e),0!==m){for(d-=m,u-=m,n-=m,g=d+1,f=u+1,l=m-1;l>=0;l--)t[g+l]=t[f+l];if(0===n){_=!0;break}}if(t[d--]=x[h--],1===--o){_=!0;break}if(y=o-a(t[u],x,0,o,o-1,e),0!==y){for(d-=y,h-=y,o-=y,g=d+1,f=h+1,l=0;y>l;l++)t[g+l]=x[f+l];if(1>=o){_=!0;break}}if(t[d--]=t[u--],0===--n){_=!0;break}v--}while(m>=c||y>=c);if(_)break;0>v&&(v=0),v+=2}if(p=v,1>p&&(p=1),1===o){for(d-=n,u-=n,g=d+1,f=u+1,l=n-1;l>=0;l--)t[g+l]=t[f+l];t[d]=x[h]}else{if(0===o)throw new Error;for(f=d-(o-1),l=0;o>l;l++)t[f+l]=x[l]}}else for(f=d-(o-1),l=0;o>l;l++)t[f+l]=x[l]}var h,f,p=c,g=0,v=d,m=0,y=0;g=t.length,2*d>g&&(v=g>>>1);var x=[];m=120>g?5:1542>g?10:119151>g?19:40,h=[],f=[],this.mergeRuns=n,this.forceMergeRuns=r,this.pushRun=i}function u(t,e,r,a){r||(r=0),a||(a=t.length);var s=a-r;if(!(2>s)){var u=0;if(h>s)return u=n(t,r,a,e),void o(t,r,a,r+u,e);var c=new l(t,e),d=i(s);do{if(u=n(t,r,a,e),d>u){var f=s;f>d&&(f=d),o(t,r,r+f,r+u,e),u=f}c.pushRun(r,u),c.mergeRuns(),s-=u,r+=u}while(0!==s);c.forceMergeRuns()}}var h=32,c=7,d=256;t.exports=u},function(t,e){\"use strict\";function i(t){return t}function n(t,e,n,r){this._old=t,this._new=e,this._oldKeyGetter=n||i,this._newKeyGetter=r||i}function r(t,e,i,n){for(var r=0;r<t.length;r++){var o=n(t[r],r),a=e[o];null==a?(i.push(o),e[o]=r):(a.length||(e[o]=a=[a]),a.push(r))}}n.prototype={constructor:n,add:function(t){return this._add=t,this},update:function(t){return this._update=t,this},remove:function(t){return this._remove=t,this},execute:function(){var t,e=this._old,i=this._new,n=this._oldKeyGetter,o=this._newKeyGetter,a={},s={},l=[],u=[];for(r(e,a,l,n),r(i,s,u,o),t=0;t<e.length;t++){var h=l[t],c=s[h];if(null!=c){var d=c.length;d?(1===d&&(s[h]=null),c=c.unshift()):s[h]=null,this._update&&this._update(c,t)}else this._remove&&this._remove(t)}for(var t=0;t<u.length;t++){var h=u[t];if(s.hasOwnProperty(h)){var c=s[h];if(null==c)continue;if(c.length)for(var f=0,d=c.length;d>f;f++)this._add&&this._add(c[f]);else this._add&&this._add(c)}}}},t.exports=n},function(t,e){t.exports=function(t,e,i,n,r){n.eachRawSeriesByType(t,function(t){var r=t.getData(),o=t.get(\"symbol\")||e,a=t.get(\"symbolSize\");r.setVisual({legendSymbol:i||o,symbol:o,symbolSize:a}),n.isSeriesFiltered(t)||(\"function\"==typeof a&&r.each(function(e){var i=t.getRawValue(e),n=t.getDataParams(e);r.setItemVisual(e,\"symbolSize\",a(i,n))}),r.each(function(t){var e=r.getItemModel(t),i=e.getShallow(\"symbol\",!0),n=e.getShallow(\"symbolSize\",!0);null!=i&&r.setItemVisual(t,\"symbol\",i),null!=n&&r.setItemVisual(t,\"symbolSize\",n)}))})}},function(t,e,i){var n=i(33);t.exports=function(){if(0!==n.debugMode)if(1==n.debugMode)for(var t in arguments)throw new Error(arguments[t]);else if(n.debugMode>1)for(var t in arguments)console.log(arguments[t])}},function(t,e,i){function n(t){r.call(this,t)}var r=i(37),o=i(7),a=i(1),s=i(148),l=new s(50);n.prototype={constructor:n,type:\"image\",brush:function(t,e){var i,n=this.style,r=n.image;if(n.bind(t,this,e),i=\"string\"==typeof r?this._image:r,!i&&r){var o=l.get(r);if(!o)return i=new Image,i.onload=function(){i.onload=null;for(var t=0;t<o.pending.length;t++)o.pending[t].dirty()},o={image:i,pending:[this]},i.src=r,l.put(r,o),void(this._image=i);if(i=o.image,this._image=i,!i.width||!i.height)return void o.pending.push(this)}if(i){var a=n.width||i.width,s=n.height||i.height,u=n.x||0,h=n.y||0;if(!i.width||!i.height)return;if(this.setTransform(t),n.sWidth&&n.sHeight){var c=n.sx||0,d=n.sy||0;t.drawImage(i,c,d,n.sWidth,n.sHeight,u,h,a,s)}else if(n.sx&&n.sy){var c=n.sx,d=n.sy,f=a-c,p=s-d;t.drawImage(i,c,d,f,p,u,h,a,s)}else t.drawImage(i,u,h,a,s);null==n.width&&(n.width=a),null==n.height&&(n.height=s),this.restoreTransform(t),null!=n.text&&this.drawRectText(t,this.getBoundingRect())}},getBoundingRect:function(){var t=this.style;return this._rect||(this._rect=new o(t.x||0,t.y||0,t.width||0,t.height||0)),this._rect}},a.inherits(n,r),t.exports=n},function(t,e,i){function n(t){return t instanceof Array||(t=[+t,+t]),t}function r(t,e,i){l.Group.call(this),this.updateData(t,e,i)}function o(t,e){this.parent.drift(t,e)}var a=i(1),s=i(26),l=i(3),u=i(4),h=r.prototype;h._createSymbol=function(t,e,i){this.removeAll();var r=e.hostModel,a=e.getItemVisual(i,\"color\"),u=s.createSymbol(t,-.5,-.5,1,1,a);u.attr({z2:100,culling:!0,scale:[0,0]}),u.drift=o;var h=n(e.getItemVisual(i,\"symbolSize\"));l.initProps(u,{scale:h},r,i),this._symbolType=t,this.add(u)},h.stopSymbolAnimation=function(t){\nthis.childAt(0).stopAnimation(t)},h.getSymbolPath=function(){return this.childAt(0)},h.getScale=function(){return this.childAt(0).scale},h.highlight=function(){this.childAt(0).trigger(\"emphasis\")},h.downplay=function(){this.childAt(0).trigger(\"normal\")},h.setZ=function(t,e){var i=this.childAt(0);i.zlevel=t,i.z=e},h.setDraggable=function(t){var e=this.childAt(0);e.draggable=t,e.cursor=t?\"move\":\"pointer\"},h.updateData=function(t,e,i){this.silent=!1;var r=t.getItemVisual(e,\"symbol\")||\"circle\",o=t.hostModel,a=n(t.getItemVisual(e,\"symbolSize\"));if(r!==this._symbolType)this._createSymbol(r,t,e);else{var s=this.childAt(0);l.updateProps(s,{scale:a},o,e)}this._updateCommon(t,e,a,i),this._seriesModel=o};var c=[\"itemStyle\",\"normal\"],d=[\"itemStyle\",\"emphasis\"],f=[\"label\",\"normal\"],p=[\"label\",\"emphasis\"];h._updateCommon=function(t,e,i,r){var o=this.childAt(0),s=t.hostModel,h=t.getItemVisual(e,\"color\");\"image\"!==o.type&&o.useStyle({strokeNoScale:!0}),r=r||null;var g=r&&r.itemStyle,v=r&&r.hoverItemStyle,m=r&&r.symbolRotate,y=r&&r.symbolOffset,x=r&&r.labelModel,_=r&&r.hoverLabelModel,b=r&&r.hoverAnimation;if(!r||t.hasItemOption){var w=t.getItemModel(e);g=w.getModel(c).getItemStyle([\"color\"]),v=w.getModel(d).getItemStyle(),m=w.getShallow(\"symbolRotate\"),y=w.getShallow(\"symbolOffset\"),x=w.getModel(f),_=w.getModel(p),b=w.getShallow(\"hoverAnimation\")}else v=a.extend({},v);var S=o.style;o.rotation=(m||0)*Math.PI/180||0,y&&o.attr(\"position\",[u.parsePercent(y[0],i[0]),u.parsePercent(y[1],i[1])]),o.setColor(h),o.setStyle(g);var M=t.getItemVisual(e,\"opacity\");null!=M&&(S.opacity=M);for(var T,A,I=t.dimensions.slice();I.length&&(T=I.pop(),A=t.getDimensionInfo(T).type,\"ordinal\"===A||\"time\"===A););null!=T&&x.getShallow(\"show\")?(l.setText(S,x,h),S.text=a.retrieve(s.getFormattedLabel(e,\"normal\"),t.get(T,e))):S.text=\"\",null!=T&&_.getShallow(\"show\")?(l.setText(v,_,h),v.text=a.retrieve(s.getFormattedLabel(e,\"emphasis\"),t.get(T,e))):v.text=\"\";var L=n(t.getItemVisual(e,\"symbolSize\"));if(o.off(\"mouseover\").off(\"mouseout\").off(\"emphasis\").off(\"normal\"),o.hoverStyle=v,l.setHoverStyle(o),b&&s.ifEnableAnimation()){var C=function(){var t=L[1]/L[0];this.animateTo({scale:[Math.max(1.1*L[0],L[0]+3),Math.max(1.1*L[1],L[1]+3*t)]},400,\"elasticOut\")},D=function(){this.animateTo({scale:L},400,\"elasticOut\")};o.on(\"mouseover\",C).on(\"mouseout\",D).on(\"emphasis\",C).on(\"normal\",D)}},h.fadeOut=function(t){var e=this.childAt(0);this.silent=!0,e.style.text=\"\",l.updateProps(e,{scale:[0,0]},this._seriesModel,this.dataIndex,t)},a.inherits(r,l.Group),t.exports=r},function(t,e,i){function n(t){var e={componentType:t.mainType};return e[t.mainType+\"Index\"]=t.componentIndex,e}function r(t,e,i){var n,r,o=d(e-t.rotation);return f(o)?(r=i>0?\"top\":\"bottom\",n=\"center\"):f(o-m)?(r=i>0?\"bottom\":\"top\",n=\"center\"):(r=\"middle\",n=o>0&&m>o?i>0?\"right\":\"left\":i>0?\"left\":\"right\"),{rotation:o,textAlign:n,verticalAlign:r}}function o(t,e,i,n){var r,o,a=d(i-t.rotation),s=n[0]>n[1],l=\"start\"===e&&!s||\"start\"!==e&&s;return f(a-m/2)?(o=l?\"bottom\":\"top\",r=\"center\"):f(a-1.5*m)?(o=l?\"top\":\"bottom\",r=\"center\"):(o=\"middle\",r=1.5*m>a&&a>m/2?l?\"left\":\"right\":l?\"right\":\"left\"),{rotation:a,textAlign:r,verticalAlign:o}}function a(t){var e=t.get(\"tooltip\");return t.get(\"silent\")||!(t.get(\"triggerEvent\")||e&&e.show)}var s=i(1),l=i(8),u=i(3),h=i(9),c=i(4),d=c.remRadian,f=c.isRadianAroundZero,p=i(5),g=p.applyTransform,v=s.retrieve,m=Math.PI,y=function(t,e){this.opt=e,this.axisModel=t,s.defaults(e,{labelOffset:0,nameDirection:1,tickDirection:1,labelDirection:1,silent:!0}),this.group=new u.Group;var i=new u.Group({position:e.position.slice(),rotation:e.rotation});i.updateTransform(),this._transform=i.transform,this._dumbGroup=i};y.prototype={constructor:y,hasBuilder:function(t){return!!x[t]},add:function(t){x[t].call(this)},getGroup:function(){return this.group}};var x={axisLine:function(){var t=this.opt,e=this.axisModel;if(e.get(\"axisLine.show\")){var i=this.axisModel.axis.getExtent(),n=this._transform,r=[i[0],0],o=[i[1],0];n&&(g(r,r,n),g(o,o,n)),this.group.add(new u.Line(u.subPixelOptimizeLine({anid:\"line\",shape:{x1:r[0],y1:r[1],x2:o[0],y2:o[1]},style:s.extend({lineCap:\"round\"},e.getModel(\"axisLine.lineStyle\").getLineStyle()),strokeContainThreshold:t.strokeContainThreshold||5,silent:!0,z2:1})))}},axisTick:function(){var t=this.axisModel;if(t.get(\"axisTick.show\"))for(var e=t.axis,i=t.getModel(\"axisTick\"),n=this.opt,r=i.getModel(\"lineStyle\"),o=i.get(\"length\"),a=b(i,n.labelInterval),l=e.getTicksCoords(i.get(\"alignWithLabel\")),h=e.scale.getTicks(),c=[],d=[],f=this._transform,p=0;p<l.length;p++)if(!_(e,p,a)){var v=l[p];c[0]=v,c[1]=0,d[0]=v,d[1]=n.tickDirection*o,f&&(g(c,c,f),g(d,d,f)),this.group.add(new u.Line(u.subPixelOptimizeLine({anid:\"tick_\"+h[p],shape:{x1:c[0],y1:c[1],x2:d[0],y2:d[1]},style:s.defaults(r.getLineStyle(),{stroke:t.get(\"axisLine.lineStyle.color\")}),z2:2,silent:!0})))}},axisLabel:function(){function t(t,e){var i=t&&t.getBoundingRect().clone(),n=e&&e.getBoundingRect().clone();return i&&n?(i.applyTransform(t.getLocalTransform()),n.applyTransform(e.getLocalTransform()),i.intersect(n)):void 0}var e=this.opt,i=this.axisModel,o=v(e.axisLabelShow,i.get(\"axisLabel.show\"));if(o){var s=i.axis,l=i.getModel(\"axisLabel\"),c=l.getModel(\"textStyle\"),d=l.get(\"margin\"),f=s.scale.getTicks(),p=i.getFormattedLabels(),g=v(e.labelRotation,l.get(\"rotate\"))||0;g=g*m/180;for(var y=r(e,g,e.labelDirection),x=i.get(\"data\"),b=[],w=a(i),S=i.get(\"triggerEvent\"),M=0;M<f.length;M++)if(!_(s,M,e.labelInterval)){var T=c;x&&x[M]&&x[M].textStyle&&(T=new h(x[M].textStyle,c,i.ecModel));var A=T.getTextColor()||i.get(\"axisLine.lineStyle.color\"),I=s.dataToCoord(f[M]),L=[I,e.labelOffset+e.labelDirection*d],C=s.scale.getLabel(f[M]),D=new u.Text({anid:\"label_\"+f[M],style:{text:p[M],textAlign:T.get(\"align\",!0)||y.textAlign,textVerticalAlign:T.get(\"baseline\",!0)||y.verticalAlign,textFont:T.getFont(),fill:\"function\"==typeof A?A(C):A},position:L,rotation:y.rotation,silent:w,z2:10});S&&(D.eventData=n(i),D.eventData.targetType=\"axisLabel\",D.eventData.value=C),this._dumbGroup.add(D),D.updateTransform(),b.push(D),this.group.add(D),D.decomposeTransform()}if(\"category\"!==s.type){if(i.getMin?i.getMin():i.get(\"min\")){var P=b[0],k=b[1];t(P,k)&&(P.ignore=!0)}if(i.getMax?i.getMax():i.get(\"max\")){var z=b[b.length-1],O=b[b.length-2];t(O,z)&&(z.ignore=!0)}}}},axisName:function(){var t=this.opt,e=this.axisModel,i=v(t.axisName,e.get(\"name\"));if(i){var h,c=e.get(\"nameLocation\"),d=t.nameDirection,f=e.getModel(\"nameTextStyle\"),p=e.get(\"nameGap\")||0,g=this.axisModel.axis.getExtent(),y=g[0]>g[1]?-1:1,x=[\"start\"===c?g[0]-y*p:\"end\"===c?g[1]+y*p:(g[0]+g[1])/2,\"middle\"===c?t.labelOffset+d*p:0],_=e.get(\"nameRotate\");null!=_&&(_=_*m/180);var b;\"middle\"===c?h=r(t,null!=_?_:t.rotation,d):(h=o(t,c,_||0,g),b=t.axisNameAvailableWidth,null!=b&&(b=Math.abs(b/Math.sin(h.rotation)),!isFinite(b)&&(b=null)));var w=f.getFont(),S=e.get(\"nameTruncate\",!0)||{},M=S.ellipsis,T=v(S.maxWidth,b),A=null!=M&&null!=T?l.truncateText(i,T,w,M,{minChar:2,placeholder:S.placeholder}):i,I=e.get(\"tooltip\",!0),L=e.mainType,C={componentType:L,name:i,$vars:[\"name\"]};C[L+\"Index\"]=e.componentIndex;var D=new u.Text({anid:\"name\",__fullText:i,__truncatedText:A,style:{text:A,textFont:w,fill:f.getTextColor()||e.get(\"axisLine.lineStyle.color\"),textAlign:h.textAlign,textVerticalAlign:h.verticalAlign},position:x,rotation:h.rotation,silent:a(e),z2:1,tooltip:I&&I.show?s.extend({content:i,formatter:function(){return i},formatterParams:C},I):null});e.get(\"triggerEvent\")&&(D.eventData=n(e),D.eventData.targetType=\"axisName\",D.eventData.name=i),this._dumbGroup.add(D),D.updateTransform(),this.group.add(D),D.decomposeTransform()}}},_=y.ifIgnoreOnTick=function(t,e,i){var n,r=t.scale;return\"ordinal\"===r.type&&(\"function\"==typeof i?(n=r.getTicks()[e],!i(n,r.getLabel(n))):e%(i+1))},b=y.getInterval=function(t,e){var i=t.get(\"interval\");return null!=i&&\"auto\"!=i||(i=e),i};t.exports=y},function(t,e,i){function n(t){return a.isObject(t)&&null!=t.value?t.value:t}function r(){return\"category\"===this.get(\"type\")&&a.map(this.get(\"data\"),n)}function o(){return s.getFormattedLabels(this.axis,this.get(\"axisLabel.formatter\"))}var a=i(1),s=i(22);t.exports={getFormattedLabels:o,getCategories:r}},function(t,e,i){var n=i(80),r=i(1),o=i(10),a=i(13),s=[\"value\",\"category\",\"time\",\"log\"];t.exports=function(t,e,i,l){r.each(s,function(o){e.extend({type:t+\"Axis.\"+o,mergeDefaultAndTheme:function(e,n){var s=this.layoutMode,l=s?a.getLayoutParams(e):{},u=n.getTheme();r.merge(e,u.get(o+\"Axis\")),r.merge(e,this.getDefaultOption()),e.type=i(t,e),s&&a.mergeLayoutParam(e,l,s)},defaultOption:r.mergeAll([{},n[o+\"Axis\"],l],!0)})}),o.registerSubTypeDefaulter(t+\"Axis\",r.curry(i,t))}},function(t,e,i){\"use strict\";function n(t,e){return e.type||(e.data?\"category\":\"value\")}var r=i(10),o=i(1),a=i(52),s=r.extend({type:\"cartesian2dAxis\",axis:null,init:function(){s.superApply(this,\"init\",arguments),this._resetRange()},mergeOption:function(){s.superApply(this,\"mergeOption\",arguments),this._resetRange()},restoreData:function(){s.superApply(this,\"restoreData\",arguments),this._resetRange()},setRange:function(t,e){this.option.rangeStart=t,this.option.rangeEnd=e},getMin:function(){var t=this.option;return null!=t.rangeStart?t.rangeStart:t.min},getMax:function(){var t=this.option;return null!=t.rangeEnd?t.rangeEnd:t.max},getNeedCrossZero:function(){var t=this.option;return null!=t.rangeStart||null!=t.rangeEnd?!1:!t.scale},findGridModel:function(){return this.ecModel.queryComponents({mainType:\"grid\",index:this.get(\"gridIndex\"),id:this.get(\"gridId\")})[0]},_resetRange:function(){this.option.rangeStart=this.option.rangeEnd=null}});o.merge(s.prototype,i(51));var l={offset:0};a(\"x\",s,n,l),a(\"y\",s,n,l),t.exports=s},function(t,e,i){function n(t,e,i){return t.findGridModel()===e}function r(t){var e,i=t.model,n=i.getFormattedLabels(),r=1,o=n.length;o>40&&(r=Math.ceil(o/40));for(var a=0;o>a;a+=r)if(!t.isLabelIgnored(a)){var s=i.getTextRect(n[a]);e?e.union(s):e=s}return e}function o(t,e,i){this._coordsMap={},this._coordsList=[],this._axesMap={},this._axesList=[],this._initCartesian(t,e,i),this._model=t}function a(t,e){var i=t.getExtent(),n=i[0]+i[1];t.toGlobalCoord=\"x\"===t.dim?function(t){return t+e}:function(t){return n-t+e},t.toLocalCoord=\"x\"===t.dim?function(t){return t-e}:function(t){return n-t+e}}function s(t,e){return c.map(y,function(i){var n=e.queryComponents({mainType:i,index:t.get(i+\"Index\"),id:t.get(i+\"Id\")})[0];return n})}function l(t){return\"cartesian2d\"===t.get(\"coordinateSystem\")}var u=i(13),h=i(22),c=i(1),d=i(117),f=i(115),p=c.each,g=h.ifAxisCrossZero,v=h.niceScaleExtent;i(118);var m=o.prototype;m.type=\"grid\",m.getRect=function(){return this._rect},m.update=function(t,e){function i(t){var e=n[t];for(var i in e){var r=e[i];if(r&&(\"category\"===r.type||!g(r)))return!0}return!1}var n=this._axesMap;this._updateScale(t,this._model),p(n.x,function(t){v(t,t.model)}),p(n.y,function(t){v(t,t.model)}),p(n.x,function(t){i(\"y\")&&(t.onZero=!1)}),p(n.y,function(t){i(\"x\")&&(t.onZero=!1)}),this.resize(this._model,e)},m.resize=function(t,e){function i(){p(o,function(t){var e=t.isHorizontal(),i=e?[0,n.width]:[0,n.height],r=t.inverse?1:0;t.setExtent(i[r],i[1-r]),a(t,e?n.x:n.y)})}var n=u.getLayoutRect(t.getBoxLayoutParams(),{width:e.getWidth(),height:e.getHeight()});this._rect=n;var o=this._axesList;i(),t.get(\"containLabel\")&&(p(o,function(t){if(!t.model.get(\"axisLabel.inside\")){var e=r(t);if(e){var i=t.isHorizontal()?\"height\":\"width\",o=t.model.get(\"axisLabel.margin\");n[i]-=e[i]+o,\"top\"===t.position?n.y+=e.height+o:\"left\"===t.position&&(n.x+=e.width+o)}}}),i())},m.getAxis=function(t,e){var i=this._axesMap[t];if(null!=i){if(null==e)for(var n in i)return i[n];return i[e]}},m.getCartesian=function(t,e){if(null!=t&&null!=e){var i=\"x\"+t+\"y\"+e;return this._coordsMap[i]}for(var n=0,r=this._coordsList;n<r.length;n++)if(r[n].getAxis(\"x\").index===t||r[n].getAxis(\"y\").index===e)return r[n]},m._initCartesian=function(t,e,i){function r(i){return function(r,l){if(n(r,t,e)){var u=r.get(\"position\");\"x\"===i?\"top\"!==u&&\"bottom\"!==u&&(u=\"bottom\",o[u]&&(u=\"top\"===u?\"bottom\":\"top\")):\"left\"!==u&&\"right\"!==u&&(u=\"left\",o[u]&&(u=\"left\"===u?\"right\":\"left\")),o[u]=!0;var c=new f(i,h.createScaleByModel(r),[0,0],r.get(\"type\"),u),d=\"category\"===c.type;c.onBand=d&&r.get(\"boundaryGap\"),c.inverse=r.get(\"inverse\"),c.onZero=r.get(\"axisLine.onZero\"),r.axis=c,c.model=r,c.grid=this,c.index=l,this._axesList.push(c),a[i][l]=c,s[i]++}}}var o={left:!1,right:!1,top:!1,bottom:!1},a={x:{},y:{}},s={x:0,y:0};return e.eachComponent(\"xAxis\",r(\"x\"),this),e.eachComponent(\"yAxis\",r(\"y\"),this),s.x&&s.y?(this._axesMap=a,void p(a.x,function(t,e){p(a.y,function(i,n){var r=\"x\"+e+\"y\"+n,o=new d(r);o.grid=this,this._coordsMap[r]=o,this._coordsList.push(o),o.addAxis(t),o.addAxis(i)},this)},this)):(this._axesMap={},void(this._axesList=[]))},m._updateScale=function(t,e){function i(t,e,i){p(i.coordDimToDataDim(e.dim),function(i){e.scale.unionExtent(t.getDataExtent(i,\"ordinal\"!==e.scale.type))})}c.each(this._axesList,function(t){t.scale.setExtent(1/0,-(1/0))}),t.eachSeries(function(r){if(l(r)){var o=s(r,t),a=o[0],u=o[1];if(!n(a,e,t)||!n(u,e,t))return;var h=this.getCartesian(a.componentIndex,u.componentIndex),c=r.getData(),d=h.getAxis(\"x\"),f=h.getAxis(\"y\");\"list\"===c.type&&(i(c,d,r),i(c,f,r))}},this)};var y=[\"xAxis\",\"yAxis\"];o.create=function(t,e){var i=[];return t.eachComponent(\"grid\",function(n,r){var a=new o(n,t,e);a.name=\"grid_\"+r,a.resize(n,e),n.coordinateSystem=a,i.push(a)}),t.eachSeries(function(e){if(l(e)){var i=s(e,t),n=i[0],r=i[1],o=n.findGridModel(),a=o.coordinateSystem;e.coordinateSystem=a.getCartesian(n.componentIndex,r.componentIndex)}}),i},o.dimensions=d.prototype.dimensions,i(23).register(\"cartesian2d\",o),t.exports=o},function(t,e){t.exports=function(t,e){e.eachSeriesByType(t,function(t){var e=t.getData(),i=t.coordinateSystem;if(i){var n=i.dimensions;\"singleAxis\"===i.type?e.each(n[0],function(t,n){e.setItemLayout(n,isNaN(t)?[NaN,NaN]:i.dataToPoint(t))}):e.each(n,function(t,n,r){e.setItemLayout(r,isNaN(t)||isNaN(n)?[NaN,NaN]:i.dataToPoint([t,n]))},!0)}})}},function(t,e){t.exports={clearColorPalette:function(){this._colorIdx=0,this._colorNameMap={}},getColorFromPalette:function(t,e){e=e||this;var i=e._colorIdx||0,n=e._colorNameMap||(e._colorNameMap={});if(n[t])return n[t];var r=this.get(\"color\",!0)||[];if(r.length){var o=r[i];return t&&(n[t]=o),e._colorIdx=(i+1)%r.length,o}}}},function(t,e,i){var n=i(34),r=i(43),o=i(21),a=function(){this.group=new n,this.uid=r.getUID(\"viewComponent\")};a.prototype={constructor:a,init:function(t,e){},render:function(t,e,i,n){},dispose:function(){}};var s=a.prototype;s.updateView=s.updateLayout=s.updateVisual=function(t,e,i,n){},o.enableClassExtend(a),o.enableClassManagement(a,{registerWhenExtend:!0}),t.exports=a},function(t,e,i){\"use strict\";var n=i(62),r=i(20),o=i(86),a=i(164),s=i(1),l=function(t){o.call(this,t),r.call(this,t),a.call(this,t),this.id=t.id||n()};l.prototype={type:\"element\",name:\"\",__zr:null,ignore:!1,clipPath:null,drift:function(t,e){switch(this.draggable){case\"horizontal\":e=0;break;case\"vertical\":t=0}var i=this.transform;i||(i=this.transform=[1,0,0,1,0,0]),i[4]+=t,i[5]+=e,this.decomposeTransform(),this.dirty(!1)},beforeUpdate:function(){},afterUpdate:function(){},update:function(){this.updateTransform()},traverse:function(t,e){},attrKV:function(t,e){if(\"position\"===t||\"scale\"===t||\"origin\"===t){if(e){var i=this[t];i||(i=this[t]=[]),i[0]=e[0],i[1]=e[1]}}else this[t]=e},hide:function(){this.ignore=!0,this.__zr&&this.__zr.refresh()},show:function(){this.ignore=!1,this.__zr&&this.__zr.refresh()},attr:function(t,e){if(\"string\"==typeof t)this.attrKV(t,e);else if(s.isObject(t))for(var i in t)t.hasOwnProperty(i)&&this.attrKV(i,t[i]);return this.dirty(!1),this},setClipPath:function(t){var e=this.__zr;e&&t.addSelfToZr(e),this.clipPath&&this.clipPath!==t&&this.removeClipPath(),this.clipPath=t,t.__zr=e,t.__clipTarget=this,this.dirty(!1)},removeClipPath:function(){var t=this.clipPath;t&&(t.__zr&&t.removeSelfFromZr(t.__zr),t.__zr=null,t.__clipTarget=null,this.clipPath=null,this.dirty(!1))},addSelfToZr:function(t){this.__zr=t;var e=this.animators;if(e)for(var i=0;i<e.length;i++)t.animation.addAnimator(e[i]);this.clipPath&&this.clipPath.addSelfToZr(t)},removeSelfFromZr:function(t){this.__zr=null;var e=this.animators;if(e)for(var i=0;i<e.length;i++)t.animation.removeAnimator(e[i]);this.clipPath&&this.clipPath.removeSelfFromZr(t)}},s.mixin(l,a),s.mixin(l,o),s.mixin(l,r),t.exports=l},function(t,e,i){function n(t,e){return t[e]}function r(t,e,i){t[e]=i}function o(t,e,i){return(e-t)*i+t}function a(t,e,i){return i>.5?e:t}function s(t,e,i,n,r){var a=t.length;if(1==r)for(var s=0;a>s;s++)n[s]=o(t[s],e[s],i);else for(var l=t[0].length,s=0;a>s;s++)for(var u=0;l>u;u++)n[s][u]=o(t[s][u],e[s][u],i)}function l(t,e,i){var n=t.length,r=e.length;if(n!==r){var o=n>r;if(o)t.length=r;else for(var a=n;r>a;a++)t.push(1===i?e[a]:x.call(e[a]))}for(var s=t[0]&&t[0].length,a=0;a<t.length;a++)if(1===i)isNaN(t[a])&&(t[a]=e[a]);else for(var l=0;s>l;l++)isNaN(t[a][l])&&(t[a][l]=e[a][l])}function u(t,e,i){if(t===e)return!0;var n=t.length;if(n!==e.length)return!1;if(1===i){for(var r=0;n>r;r++)if(t[r]!==e[r])return!1}else for(var o=t[0].length,r=0;n>r;r++)for(var a=0;o>a;a++)if(t[r][a]!==e[r][a])return!1;return!0}function h(t,e,i,n,r,o,a,s,l){var u=t.length;if(1==l)for(var h=0;u>h;h++)s[h]=c(t[h],e[h],i[h],n[h],r,o,a);else for(var d=t[0].length,h=0;u>h;h++)for(var f=0;d>f;f++)s[h][f]=c(t[h][f],e[h][f],i[h][f],n[h][f],r,o,a)}function c(t,e,i,n,r,o,a){var s=.5*(i-t),l=.5*(n-e);return(2*(e-i)+s+l)*a+(-3*(e-i)-2*s-l)*o+s*r+e}function d(t){if(y(t)){var e=t.length;if(y(t[0])){for(var i=[],n=0;e>n;n++)i.push(x.call(t[n]));return i}return x.call(t)}return t}function f(t){return t[0]=Math.floor(t[0]),t[1]=Math.floor(t[1]),t[2]=Math.floor(t[2]),\"rgba(\"+t.join(\",\")+\")\"}function p(t,e,i,n,r){var d=t._getter,p=t._setter,m=\"spline\"===e,x=n.length;if(x){var _,b=n[0].value,w=y(b),S=!1,M=!1,T=w&&y(b[0])?2:1;n.sort(function(t,e){return t.time-e.time}),_=n[x-1].time;for(var A=[],I=[],L=n[0].value,C=!0,D=0;x>D;D++){A.push(n[D].time/_);var P=n[D].value;if(w&&u(P,L,T)||!w&&P===L||(C=!1),L=P,\"string\"==typeof P){var k=v.parse(P);k?(P=k,S=!0):M=!0}I.push(P)}if(!C){for(var z=I[x-1],D=0;x-1>D;D++)w?l(I[D],z,T):!isNaN(I[D])||isNaN(z)||M||S||(I[D]=z);w&&l(d(t._target,r),z,T);var O,E,R,N,V,B,G=0,F=0;if(S)var H=[0,0,0,0];var W=function(t,e){var i;if(0>e)i=0;else if(F>e){for(O=Math.min(G+1,x-1),i=O;i>=0&&!(A[i]<=e);i--);i=Math.min(i,x-2)}else{for(i=G;x>i&&!(A[i]>e);i++);i=Math.min(i-1,x-2)}G=i,F=e;var n=A[i+1]-A[i];if(0!==n)if(E=(e-A[i])/n,m)if(N=I[i],R=I[0===i?i:i-1],V=I[i>x-2?x-1:i+1],B=I[i>x-3?x-1:i+2],w)h(R,N,V,B,E,E*E,E*E*E,d(t,r),T);else{var l;if(S)l=h(R,N,V,B,E,E*E,E*E*E,H,1),l=f(H);else{if(M)return a(N,V,E);l=c(R,N,V,B,E,E*E,E*E*E)}p(t,r,l)}else if(w)s(I[i],I[i+1],E,d(t,r),T);else{var l;if(S)s(I[i],I[i+1],E,H,1),l=f(H);else{if(M)return a(I[i],I[i+1],E);l=o(I[i],I[i+1],E)}p(t,r,l)}},Z=new g({target:t._target,life:_,loop:t._loop,delay:t._delay,onframe:W,ondestroy:i});return e&&\"spline\"!==e&&(Z.easing=e),Z}}}var g=i(142),v=i(18),m=i(1),y=m.isArrayLike,x=Array.prototype.slice,_=function(t,e,i,o){this._tracks={},this._target=t,this._loop=e||!1,this._getter=i||n,this._setter=o||r,this._clipCount=0,this._delay=0,this._doneList=[],this._onframeList=[],this._clipList=[]};_.prototype={when:function(t,e){var i=this._tracks;for(var n in e){if(!i[n]){i[n]=[];var r=this._getter(this._target,n);if(null==r)continue;0!==t&&i[n].push({time:0,value:d(r)})}i[n].push({time:t,value:e[n]})}return this},during:function(t){return this._onframeList.push(t),this},_doneCallback:function(){this._tracks={},this._clipList.length=0;for(var t=this._doneList,e=t.length,i=0;e>i;i++)t[i].call(this)},start:function(t){var e,i=this,n=0,r=function(){n--,n||i._doneCallback()};for(var o in this._tracks){var a=p(this,t,r,this._tracks[o],o);a&&(this._clipList.push(a),n++,this.animation&&this.animation.addClip(a),e=a)}if(e){var s=e.onframe;e.onframe=function(t,e){s(t,e);for(var n=0;n<i._onframeList.length;n++)i._onframeList[n](t,e)}}return n||this._doneCallback(),this},stop:function(t){for(var e=this._clipList,i=this.animation,n=0;n<e.length;n++){var r=e[n];t&&r.onframe(this._target,1),i&&i.removeClip(r)}e.length=0},delay:function(t){return this._delay=t,this},done:function(t){return t&&this._doneList.push(t),this},getClips:function(){return this._clipList}},t.exports=_},function(t,e){t.exports=\"undefined\"!=typeof window&&(window.requestAnimationFrame||window.msRequestAnimationFrame||window.mozRequestAnimationFrame||window.webkitRequestAnimationFrame)||function(t){setTimeout(t,16)}},function(t,e){var i=2*Math.PI;t.exports={normalizeRadian:function(t){return t%=i,0>t&&(t+=i),t}}},function(t,e){var i=2311;t.exports=function(){return i++}},function(t,e){var i=function(t,e){this.image=t,this.repeat=e,this.type=\"pattern\"};i.prototype.getCanvasPattern=function(t){return this._canvasPattern||(this._canvasPattern=t.createPattern(this.image,this.repeat))},t.exports=i},function(t,e){function i(t,e,i){var n=e.x,r=e.x2,o=e.y,a=e.y2;e.global||(n=n*i.width+i.x,r=r*i.width+i.x,o=o*i.height+i.y,a=a*i.height+i.y);var s=t.createLinearGradient(n,o,r,a);return s}function n(t,e,i){var n=i.width,r=i.height,o=Math.min(n,r),a=e.x,s=e.y,l=e.r;e.global||(a=a*n+i.x,s=s*r+i.y,l*=o);var u=t.createRadialGradient(a,s,0,a,s,l);return u}var r=[[\"shadowBlur\",0],[\"shadowOffsetX\",0],[\"shadowOffsetY\",0],[\"shadowColor\",\"#000\"],[\"lineCap\",\"butt\"],[\"lineJoin\",\"miter\"],[\"miterLimit\",10]],o=function(t){this.extendFrom(t)};o.prototype={constructor:o,fill:\"#000000\",stroke:null,opacity:1,lineDash:null,lineDashOffset:0,shadowBlur:0,shadowOffsetX:0,shadowOffsetY:0,lineWidth:1,strokeNoScale:!1,text:null,textFill:\"#000\",textStroke:null,textPosition:\"inside\",textBaseline:null,textAlign:null,textVerticalAlign:null,textDistance:5,textShadowBlur:0,textShadowOffsetX:0,textShadowOffsetY:0,textTransform:!1,textRotation:0,blend:null,bind:function(t,e,i){for(var n=this,o=i&&i.style,a=!o,s=0;s<r.length;s++){var l=r[s],u=l[0];(a||n[u]!==o[u])&&(t[u]=n[u]||l[1])}if((a||n.fill!==o.fill)&&(t.fillStyle=n.fill),(a||n.stroke!==o.stroke)&&(t.strokeStyle=n.stroke),(a||n.opacity!==o.opacity)&&(t.globalAlpha=null==n.opacity?1:n.opacity),(a||n.blend!==o.blend)&&(t.globalCompositeOperation=n.blend||\"source-over\"),this.hasStroke()){var h=n.lineWidth;t.lineWidth=h/(this.strokeNoScale&&e&&e.getLineScale?e.getLineScale():1)}},hasFill:function(){var t=this.fill;return null!=t&&\"none\"!==t},hasStroke:function(){var t=this.stroke;return null!=t&&\"none\"!==t&&this.lineWidth>0},extendFrom:function(t,e){if(t){var i=this;for(var n in t)!t.hasOwnProperty(n)||!e&&i.hasOwnProperty(n)||(i[n]=t[n])}},set:function(t,e){\"string\"==typeof t?this[t]=e:this.extendFrom(t,!0)},clone:function(){var t=new this.constructor;return t.extendFrom(this,!0),t},getGradient:function(t,e,r){for(var o=\"radial\"===e.type?n:i,a=o(t,e,r),s=e.colorStops,l=0;l<s.length;l++)a.addColorStop(s[l].offset,s[l].color);return a}};for(var a=o.prototype,s=0;s<r.length;s++){var l=r[s];l[0]in a||(a[l[0]]=l[1])}o.getGradient=a.getGradient,t.exports=o},function(t,e,i){var n=i(154),r=i(153);t.exports={buildPath:function(t,e,i){var o=e.points,a=e.smooth;if(o&&o.length>=2){if(a&&\"spline\"!==a){var s=r(o,a,i,e.smoothConstraint);t.moveTo(o[0][0],o[0][1]);for(var l=o.length,u=0;(i?l:l-1)>u;u++){var h=s[2*u],c=s[2*u+1],d=o[(u+1)%l];t.bezierCurveTo(h[0],h[1],c[0],c[1],d[0],d[1])}}else{\"spline\"===a&&(o=n(o,i)),t.moveTo(o[0][0],o[0][1]);for(var u=1,f=o.length;f>u;u++)t.lineTo(o[u][0],o[u][1])}i&&t.closePath()}}}},function(t,e,i){var n=i(1);t.exports={updateSelectedMap:function(t){this._selectTargetMap=n.reduce(t||[],function(t,e){return t[e.name]=e,t},{})},select:function(t){var e=this._selectTargetMap,i=e[t],r=this.get(\"selectedMode\");\"single\"===r&&n.each(e,function(t){t.selected=!1}),i&&(i.selected=!0)},unSelect:function(t){var e=this._selectTargetMap[t];e&&(e.selected=!1)},toggleSelected:function(t){var e=this._selectTargetMap[t];return null!=e?(this[e.selected?\"unSelect\":\"select\"](t),e.selected):void 0},isSelected:function(t){var e=this._selectTargetMap[t];return e&&e.selected}}},function(t,e,i){function n(t){r.defaultEmphasis(t.label,r.LABEL_OPTIONS)}var r=i(11),o=i(1),a=i(12),s=i(8),l=s.addCommas,u=s.encodeHTML,h=i(2).extendComponentModel({type:\"marker\",dependencies:[\"series\",\"grid\",\"polar\",\"geo\"],init:function(t,e,i,n){this.mergeDefaultAndTheme(t,i),this.mergeOption(t,i,n.createdBySelf,!0)},ifEnableAnimation:function(){if(a.node)return!1;var t=this.__hostSeries;return this.getShallow(\"animation\")&&t&&t.ifEnableAnimation()},mergeOption:function(t,e,i,r){var a=this.constructor,s=this.mainType+\"Model\";i||e.eachSeries(function(t){var i=t.get(this.mainType),l=t[s];if(!i||!i.data)return void(t[s]=null);if(l)l.mergeOption(i,e,!0);else{r&&n(i),o.each(i.data,function(t){t instanceof Array?(n(t[0]),n(t[1])):n(t)});var u={mainType:this.mainType,seriesIndex:t.seriesIndex,name:t.name,createdBySelf:!0};l=new a(i,this,e,u),l.__hostSeries=t}t[s]=l},this)},formatTooltip:function(t){var e=this.getData(),i=this.getRawValue(t),n=o.isArray(i)?o.map(i,l).join(\", \"):l(i),r=e.getName(t),a=this.name;return(null!=i||r)&&(a+=\"<br />\"),r&&(a+=u(r),null!=i&&(a+=\" : \")),null!=i&&(a+=n),a},getData:function(){return this._data},setData:function(t){this._data=t}});o.mixin(h,r.dataFormatMixin),t.exports=h},function(t,e,i){t.exports=i(2).extendComponentView({type:\"marker\",init:function(){this.markerGroupMap={}},render:function(t,e,i){var n=this.markerGroupMap;for(var r in n)n[r].__keep=!1;var o=this.type+\"Model\";e.eachSeries(function(t){var n=t[o];n&&this.renderSeries(t,n,e,i)},this);for(var r in n)n[r].__keep||this.group.remove(n[r].group)},renderSeries:function(){}})},function(t,e,i){function n(t){return!(isNaN(parseFloat(t.x))&&isNaN(parseFloat(t.y)))}function r(t){return!isNaN(parseFloat(t.x))&&!isNaN(parseFloat(t.y))}function o(t,e,i){var n=-1;do n=Math.max(l.getPrecision(t.get(e,i)),n),t=t.stackedOn;while(t);return n}function a(t,e,i,n,r,a){var s=[],l=v(e,n,t),u=e.indexOfNearest(n,l,!0);s[r]=e.get(i,u,!0),s[a]=e.get(n,u,!0);var h=o(e,n,u);return h>=0&&(s[a]=+s[a].toFixed(h)),s}var s=i(1),l=i(4),u=s.indexOf,h=s.curry,c={min:h(a,\"min\"),max:h(a,\"max\"),average:h(a,\"average\")},d=function(t,e){var i=t.getData(),n=t.coordinateSystem;if(e&&!r(e)&&!s.isArray(e.coord)&&n){var o=n.dimensions,a=f(e,i,n,t);if(e=s.clone(e),e.type&&c[e.type]&&a.baseAxis&&a.valueAxis){var l=u(o,a.baseAxis.dim),h=u(o,a.valueAxis.dim);e.coord=c[e.type](i,a.baseDataDim,a.valueDataDim,l,h),e.value=e.coord[h]}else{for(var d=[null!=e.xAxis?e.xAxis:e.radiusAxis,null!=e.yAxis?e.yAxis:e.angleAxis],p=0;2>p;p++)if(c[d[p]]){var g=t.coordDimToDataDim(o[p])[0];d[p]=v(i,g,d[p])}e.coord=d}}return e},f=function(t,e,i,n){var r={};return null!=t.valueIndex||null!=t.valueDim?(r.valueDataDim=null!=t.valueIndex?e.getDimension(t.valueIndex):t.valueDim,r.valueAxis=i.getAxis(n.dataDimToCoordDim(r.valueDataDim)),r.baseAxis=i.getOtherAxis(r.valueAxis),r.baseDataDim=n.coordDimToDataDim(r.baseAxis.dim)[0]):(r.baseAxis=n.getBaseAxis(),r.valueAxis=i.getOtherAxis(r.baseAxis),r.baseDataDim=n.coordDimToDataDim(r.baseAxis.dim)[0],r.valueDataDim=n.coordDimToDataDim(r.valueAxis.dim)[0]),r},p=function(t,e){return t&&t.containData&&e.coord&&!n(e)?t.containData(e.coord):!0},g=function(t,e,i,n){return 2>n?t.coord&&t.coord[n]:t.value},v=function(t,e,i){if(\"average\"===i){var n=0,r=0;return t.each(e,function(t,e){isNaN(t)||(n+=t,r++)},!0),n/r}return t.getDataExtent(e,!0)[\"max\"===i?1:0]};t.exports={dataTransform:d,dataFilter:p,dimValueGetter:g,getAxisInfo:f,numCalculate:v}},function(t,e){t.exports=function(t,e){var i=e.findComponents({mainType:\"legend\"});i&&i.length&&e.eachSeriesByType(t,function(t){var e=t.getData();e.filterSelf(function(t){for(var n=e.getName(t),r=0;r<i.length;r++)if(!i[r].isSelected(n))return!1;return!0},this)},this)}},function(t,e,i){function n(t){var e=t.pieceList;t.hasSpecialVisual=!1,p.each(e,function(e,i){e.originIndex=i,null!=e.visual&&(t.hasSpecialVisual=!0)})}function r(t){var e=t.categories,i=t.visual,n=t.categoryMap={};if(m(e,function(t,e){n[t]=e}),!p.isArray(i)){var r=[];p.isObject(i)?m(i,function(t,e){var i=n[e];r[null!=i?i:x]=t}):r[x]=i,i=t.visual=r}for(var o=e.length-1;o>=0;o--)null==i[o]&&(delete n[e[o]],e.pop())}function o(t,e){var i=t.visual,n=[];p.isObject(i)?m(i,function(t){n.push(t)}):null!=i&&n.push(i);var r={color:1,symbol:1};e||1!==n.length||t.type in r||(n[1]=n[0]),t.visual=n}function a(t){return{applyVisual:function(e,i,n){e=this.mapValueToVisual(e),n(\"color\",t(i(\"color\"),e))},_doMap:c([0,1])}}function s(t,e){var i=this.option.visual;return i[Math.round(v(e,[0,1],[0,i.length-1],!0))]||{}}function l(t){return function(e,i,n){n(t,this.mapValueToVisual(e))}}function u(t){var e=this.option.visual;return e[this.option.loop&&t!==x?t%e.length:t]}function h(){return this.option.visual[0]}function c(t){return{linear:function(e){return v(e,t,this.option.visual,!0)},category:u,piecewise:function(e,i){var n=d.call(this,i);return null==n&&(n=v(e,t,this.option.visual,!0)),n},fixed:h}}function d(t){var e=this.option,i=e.pieceList;if(e.hasSpecialVisual){var n=_.findPieceIndex(t,i),r=i[n];if(r&&r.visual)return r.visual[this.type]}}function f(t,e,i){return t?i>=e:i>e}var p=i(1),g=i(18),v=i(4).linearMap,m=p.each,y=p.isObject,x=-1,_=function(t){var e=t.mappingMethod,i=t.type,a=this.option=p.clone(t);this.type=i,this.mappingMethod=e,this._normalizeData=w[e];var s=b[i];this.applyVisual=s.applyVisual,this.getColorMapper=s.getColorMapper,this._doMap=s._doMap[e],\"piecewise\"===e?(o(a),n(a)):\"category\"===e?a.categories?r(a):o(a,!0):(p.assert(\"linear\"!==e||a.dataExtent),o(a))};_.prototype={constructor:_,mapValueToVisual:function(t){var e=this._normalizeData(t);return this._doMap(e,t)},getNormalizer:function(){return p.bind(this._normalizeData,this)}};var b=_.visualHandlers={color:{applyVisual:l(\"color\"),getColorMapper:function(){var t=this.option,e=p.map(t.visual,g.parse);return p.bind(\"category\"===t.mappingMethod?function(t,e){return!e&&(t=this._normalizeData(t)),u(this,t)}:function(t,i,n){var r=!!n;return!i&&(t=this._normalizeData(t)),n=g.fastMapToColor(t,e,n),r?n:p.stringify(n,\"rgba\")},this)},_doMap:{linear:function(t){return g.mapToColor(t,this.option.visual)},category:u,piecewise:function(t,e){var i=d.call(this,e);return null==i&&(i=g.mapToColor(t,this.option.visual)),i},fixed:h}},colorHue:a(function(t,e){return g.modifyHSL(t,e)}),colorSaturation:a(function(t,e){return g.modifyHSL(t,null,e)}),colorLightness:a(function(t,e){return g.modifyHSL(t,null,null,e)}),colorAlpha:a(function(t,e){return g.modifyAlpha(t,e)}),opacity:{applyVisual:l(\"opacity\"),_doMap:c([0,1])},symbol:{applyVisual:function(t,e,i){var n=this.mapValueToVisual(t);if(p.isString(n))i(\"symbol\",n);else if(y(n))for(var r in n)n.hasOwnProperty(r)&&i(r,n[r])},_doMap:{linear:s,category:u,piecewise:function(t,e){var i=d.call(this,e);return null==i&&(i=s.call(this,t)),i},fixed:h}},symbolSize:{applyVisual:l(\"symbolSize\"),_doMap:c([0,1])}},w={linear:function(t){return v(t,this.option.dataExtent,[0,1],!0)},piecewise:function(t){var e=this.option.pieceList,i=_.findPieceIndex(t,e,!0);return null!=i?v(i,[0,e.length-1],[0,1],!0):void 0},category:function(t){var e=this.option.categories?this.option.categoryMap[t]:t;return null==e?x:e},fixed:p.noop};_.addVisualHandler=function(t,e){b[t]=e},_.isValidType=function(t){return b.hasOwnProperty(t)},_.eachVisual=function(t,e,i){p.isObject(t)?p.each(t,e,i):e.call(i,t)},_.mapVisual=function(t,e,i){var n,r=p.isArray(t)?[]:p.isObject(t)?{}:(n=!0,null);return _.eachVisual(t,function(t,o){var a=e.call(i,t,o);n?r=a:r[o]=a}),r},_.retrieveVisuals=function(t){var e,i={};return t&&m(b,function(n,r){t.hasOwnProperty(r)&&(i[r]=t[r],e=!0)}),e?i:null},_.prepareVisualTypes=function(t){if(y(t)){var e=[];m(t,function(t,i){e.push(i)}),t=e}else{if(!p.isArray(t))return[];t=t.slice()}return t.sort(function(t,e){return\"color\"===e&&\"color\"!==t&&0===t.indexOf(\"color\")?1:-1;\n}),t},_.dependsOn=function(t,e){return\"color\"===e?!(!t||0!==t.indexOf(e)):t===e},_.findPieceIndex=function(t,e,i){function n(e,i){var n=Math.abs(e-t);o>n&&(o=n,r=i)}for(var r,o=1/0,a=0,s=e.length;s>a;a++){var l=e[a].value;if(null!=l){if(l===t)return a;i&&n(l,a)}}for(var a=0,s=e.length;s>a;a++){var u=e[a],h=u.interval,c=u.close;if(h){if(h[0]===-(1/0)){if(f(c[1],t,h[1]))return a}else if(h[1]===1/0){if(f(c[0],h[0],t))return a}else if(f(c[0],h[0],t)&&f(c[1],t,h[1]))return a;i&&n(h[0],a),i&&n(h[1],a)}}return i?t===1/0?e.length-1:t===-(1/0)?0:r:void 0},t.exports=_},function(t,e){t.exports=function(t,e){var i={};e.eachRawSeriesByType(t,function(t){var n=t.getRawData(),r={};if(!e.isSeriesFiltered(t)){var o=t.getData();o.each(function(t){var e=o.getRawIndex(t);r[e]=t}),n.each(function(e){var a=n.getItemModel(e),s=r[e],l=null!=s&&o.getItemVisual(s,\"color\",!0);if(l)n.setItemVisual(e,\"color\",l);else{var u=a.get(\"itemStyle.normal.color\")||t.getColorFromPalette(n.getName(e),i);n.setItemVisual(e,\"color\",u),null!=s&&o.setItemVisual(s,\"color\",u)}})}})}},function(t,e,i){var n=i(5),r=i(17),o={},a=Math.min,s=Math.max,l=Math.sin,u=Math.cos,h=n.create(),c=n.create(),d=n.create(),f=2*Math.PI;o.fromPoints=function(t,e,i){if(0!==t.length){var n,r=t[0],o=r[0],l=r[0],u=r[1],h=r[1];for(n=1;n<t.length;n++)r=t[n],o=a(o,r[0]),l=s(l,r[0]),u=a(u,r[1]),h=s(h,r[1]);e[0]=o,e[1]=u,i[0]=l,i[1]=h}},o.fromLine=function(t,e,i,n,r,o){r[0]=a(t,i),r[1]=a(e,n),o[0]=s(t,i),o[1]=s(e,n)};var p=[],g=[];o.fromCubic=function(t,e,i,n,o,l,u,h,c,d){var f,v=r.cubicExtrema,m=r.cubicAt,y=v(t,i,o,u,p);for(c[0]=1/0,c[1]=1/0,d[0]=-(1/0),d[1]=-(1/0),f=0;y>f;f++){var x=m(t,i,o,u,p[f]);c[0]=a(x,c[0]),d[0]=s(x,d[0])}for(y=v(e,n,l,h,g),f=0;y>f;f++){var _=m(e,n,l,h,g[f]);c[1]=a(_,c[1]),d[1]=s(_,d[1])}c[0]=a(t,c[0]),d[0]=s(t,d[0]),c[0]=a(u,c[0]),d[0]=s(u,d[0]),c[1]=a(e,c[1]),d[1]=s(e,d[1]),c[1]=a(h,c[1]),d[1]=s(h,d[1])},o.fromQuadratic=function(t,e,i,n,o,l,u,h){var c=r.quadraticExtremum,d=r.quadraticAt,f=s(a(c(t,i,o),1),0),p=s(a(c(e,n,l),1),0),g=d(t,i,o,f),v=d(e,n,l,p);u[0]=a(t,o,g),u[1]=a(e,l,v),h[0]=s(t,o,g),h[1]=s(e,l,v)},o.fromArc=function(t,e,i,r,o,a,s,p,g){var v=n.min,m=n.max,y=Math.abs(o-a);if(1e-4>y%f&&y>1e-4)return p[0]=t-i,p[1]=e-r,g[0]=t+i,void(g[1]=e+r);if(h[0]=u(o)*i+t,h[1]=l(o)*r+e,c[0]=u(a)*i+t,c[1]=l(a)*r+e,v(p,h,c),m(g,h,c),o%=f,0>o&&(o+=f),a%=f,0>a&&(a+=f),o>a&&!s?a+=f:a>o&&s&&(o+=f),s){var x=a;a=o,o=x}for(var _=0;a>_;_+=Math.PI/2)_>o&&(d[0]=u(_)*i+t,d[1]=l(_)*r+e,v(p,d,p),m(g,d,g))},t.exports=o},function(t,e,i){var n=i(37),r=i(1),o=i(16),a=function(t){n.call(this,t)};a.prototype={constructor:a,type:\"text\",brush:function(t,e){var i=this.style,n=i.x||0,r=i.y||0,a=i.text;if(null!=a&&(a+=\"\"),i.bind(t,this,e),a){this.setTransform(t);var s,l=i.textAlign,u=i.textFont||i.font;if(i.textVerticalAlign){var h=o.getBoundingRect(a,u,i.textAlign,\"top\");switch(s=\"middle\",i.textVerticalAlign){case\"middle\":r-=h.height/2-h.lineHeight/2;break;case\"bottom\":r-=h.height-h.lineHeight/2;break;default:r+=h.lineHeight/2}}else s=i.textBaseline;t.font=u||\"12px sans-serif\",t.textAlign=l||\"left\",t.textAlign!==l&&(t.textAlign=\"left\"),t.textBaseline=s||\"alphabetic\",t.textBaseline!==s&&(t.textBaseline=\"alphabetic\");for(var c=o.measureText(\"国\",t.font).width,d=a.split(\"\\n\"),f=0;f<d.length;f++)i.hasFill()&&t.fillText(d[f],n,r),i.hasStroke()&&t.strokeText(d[f],n,r),r+=c;this.restoreTransform(t)}},getBoundingRect:function(){if(!this._rect){var t=this.style,e=t.textVerticalAlign,i=o.getBoundingRect(t.text+\"\",t.textFont||t.font,t.textAlign,e?\"top\":t.textBaseline);switch(e){case\"middle\":i.y-=i.height/2;break;case\"bottom\":i.y-=i.height}i.x+=t.x||0,i.y+=t.y||0,this._rect=i}return this._rect}},r.inherits(a,n),t.exports=a},function(t,e,i){function n(t,e){return\"string\"==typeof t?t.lastIndexOf(\"%\")>=0?parseFloat(t)/100*e:parseFloat(t):t}var r=i(16),o=i(7),a=new o,s=function(){};s.prototype={constructor:s,drawRectText:function(t,e,i){var o=this.style,s=o.text;if(null!=s&&(s+=\"\"),s){t.save();var l,u,h=o.textPosition,c=o.textDistance,d=o.textAlign,f=o.textFont||o.font,p=o.textBaseline,g=o.textVerticalAlign;i=i||r.getBoundingRect(s,f,d,p);var v=this.transform;if(o.textTransform?this.setTransform(t):v&&(a.copy(e),a.applyTransform(v),e=a),h instanceof Array){if(l=e.x+n(h[0],e.width),u=e.y+n(h[1],e.height),d=d||\"left\",p=p||\"top\",g){switch(g){case\"middle\":u-=i.height/2-i.lineHeight/2;break;case\"bottom\":u-=i.height-i.lineHeight/2;break;default:u+=i.lineHeight/2}p=\"middle\"}}else{var m=r.adjustTextPositionOnRect(h,e,i,c);l=m.x,u=m.y,d=d||m.textAlign,p=p||m.textBaseline}t.textAlign=d||\"left\",t.textBaseline=p||\"alphabetic\";var y=o.textFill,x=o.textStroke;y&&(t.fillStyle=y),x&&(t.strokeStyle=x),t.font=f||\"12px sans-serif\",t.shadowBlur=o.textShadowBlur,t.shadowColor=o.textShadowColor||\"transparent\",t.shadowOffsetX=o.textShadowOffsetX,t.shadowOffsetY=o.textShadowOffsetY;var _=s.split(\"\\n\");o.textRotation&&(v&&t.translate(v[4],v[5]),t.rotate(o.textRotation),v&&t.translate(-v[4],-v[5]));for(var b=0;b<_.length;b++)y&&t.fillText(_[b],l,u),x&&t.strokeText(_[b],l,u),u+=i.lineHeight;t.restore()}}},t.exports=s},function(t,e,i){function n(t){delete d[t]}/*!\n\t * ZRender, a high performance 2d drawing library.\n\t *\n\t * Copyright (c) 2013, Baidu Inc.\n\t * All rights reserved.\n\t *\n\t * LICENSE\n\t * https://github.com/ecomfe/zrender/blob/master/LICENSE.txt\n\t */\nvar r=i(62),o=i(12),a=i(137),s=i(140),l=i(141),u=i(149),h=!o.canvasSupported,c={canvas:i(139)},d={},f={};f.version=\"3.1.3\",f.init=function(t,e){var i=new p(r(),t,e);return d[i.id]=i,i},f.dispose=function(t){if(t)t.dispose();else{for(var e in d)d[e].dispose();d={}}return f},f.getInstance=function(t){return d[t]},f.registerPainter=function(t,e){c[t]=e};var p=function(t,e,i){i=i||{},this.dom=e,this.id=t;var n=this,r=new s,d=i.renderer;if(h){if(!c.vml)throw new Error(\"You need to require 'zrender/vml/vml' to support IE8\");d=\"vml\"}else d&&c[d]||(d=\"canvas\");var f=new c[d](e,r,i);this.storage=r,this.painter=f;var p=o.node?null:new u(f.getViewportRoot());this.handler=new a(r,f,p),this.animation=new l({stage:{update:function(){n._needsRefresh&&n.refreshImmediately(),n._needsRefreshHover&&n.refreshHoverImmediately()}}}),this.animation.start(),this._needsRefresh;var g=r.delFromMap,v=r.addToMap;r.delFromMap=function(t){var e=r.get(t);g.call(r,t),e&&e.removeSelfFromZr(n)},r.addToMap=function(t){v.call(r,t),t.addSelfToZr(n)}};p.prototype={constructor:p,getId:function(){return this.id},add:function(t){this.storage.addRoot(t),this._needsRefresh=!0},remove:function(t){this.storage.delRoot(t),this._needsRefresh=!0},configLayer:function(t,e){this.painter.configLayer(t,e),this._needsRefresh=!0},refreshImmediately:function(){this._needsRefresh=!1,this.painter.refresh(),this._needsRefresh=!1},refresh:function(){this._needsRefresh=!0},addHover:function(t,e){this.painter.addHover&&(this.painter.addHover(t,e),this.refreshHover())},removeHover:function(t){this.painter.removeHover&&(this.painter.removeHover(t),this.refreshHover())},clearHover:function(){this.painter.clearHover&&(this.painter.clearHover(),this.refreshHover())},refreshHover:function(){this._needsRefreshHover=!0},refreshHoverImmediately:function(){this._needsRefreshHover=!1,this.painter.refreshHover&&this.painter.refreshHover()},resize:function(){this.painter.resize(),this.handler.resize()},clearAnimation:function(){this.animation.clear()},getWidth:function(){return this.painter.getWidth()},getHeight:function(){return this.painter.getHeight()},pathToImage:function(t,e,i){var n=r();return this.painter.pathToImage(n,t,e,i)},setCursorStyle:function(t){this.handler.setCursorStyle(t)},on:function(t,e,i){this.handler.on(t,e,i)},off:function(t,e){this.handler.off(t,e)},trigger:function(t,e){this.handler.trigger(t,e)},clear:function(){this.storage.delRoot(),this.painter.clear()},dispose:function(){this.animation.stop(),this.clear(),this.storage.dispose(),this.painter.dispose(),this.handler.dispose(),this.animation=this.storage=this.painter=this.handler=null,n(this.id)}},t.exports=f},function(t,e,i){var n=i(2),r=i(1);t.exports=function(t,e){r.each(e,function(e){e.update=\"updateView\",n.registerAction(e,function(i,n){var r={};return n.eachComponent({mainType:\"series\",subType:t,query:i},function(t){t[e.method]&&t[e.method](i.name);var n=t.getData();n.each(function(e){var i=n.getName(e);r[i]=t.isSelected(i)||!1})}),{name:i.name,selected:r}})})}},function(t,e,i){function n(t){if(!t.target||!t.target.draggable){var e=t.offsetX,i=t.offsetY,n=this.rectProvider&&this.rectProvider();n&&n.contain(e,i)&&(this._x=e,this._y=i,this._dragging=!0)}}function r(t){if(this._dragging&&(d.stop(t.event),\"pinch\"!==t.gestureEvent)){if(f.isTaken(this._zr,\"globalPan\"))return;var e=t.offsetX,i=t.offsetY,n=e-this._x,r=i-this._y;this._x=e,this._y=i;var o=this.target;if(o){var a=o.position;a[0]+=n,a[1]+=r,o.dirty()}d.stop(t.event),this.trigger(\"pan\",n,r)}}function o(t){this._dragging=!1}function a(t){var e=t.wheelDelta>0?1.1:1/1.1;l.call(this,t,e,t.offsetX,t.offsetY)}function s(t){if(!f.isTaken(this._zr,\"globalPan\")){var e=t.pinchScale>1?1.1:1/1.1;l.call(this,t,e,t.pinchX,t.pinchY)}}function l(t,e,i,n){var r=this.rectProvider&&this.rectProvider();if(r&&r.contain(i,n)){d.stop(t.event);var o=this.target,a=this.zoomLimit;if(o){var s=o.position,l=o.scale,u=this.zoom=this.zoom||1;if(u*=e,a){var h=a.min||0,c=a.max||1/0;u=Math.max(Math.min(c,u),h)}var f=u/this.zoom;this.zoom=u,s[0]-=(i-s[0])*(f-1),s[1]-=(n-s[1])*(f-1),l[0]*=f,l[1]*=f,o.dirty()}this.trigger(\"zoom\",e,i,n)}}function u(t,e,i){this.target=e,this.rectProvider=i,this.zoomLimit,this.zoom,this._zr=t;var l=c.bind,u=l(n,this),d=l(r,this),f=l(o,this),p=l(a,this),g=l(s,this);h.call(this),this.enable=function(e){this.disable(),null==e&&(e=!0),e!==!0&&\"move\"!==e&&\"pan\"!==e||(t.on(\"mousedown\",u),t.on(\"mousemove\",d),t.on(\"mouseup\",f)),e!==!0&&\"scale\"!==e&&\"zoom\"!==e||(t.on(\"mousewheel\",p),t.on(\"pinch\",g))},this.disable=function(){t.off(\"mousedown\",u),t.off(\"mousemove\",d),t.off(\"mouseup\",f),t.off(\"mousewheel\",p),t.off(\"pinch\",g)},this.dispose=this.disable,this.isDragging=function(){return this._dragging},this.isPinching=function(){return this._pinching}}var h=i(20),c=i(1),d=i(24),f=i(113);c.mixin(u,h),t.exports=u},function(t,e){t.exports=function(t,e,i,n,r){function o(t,e,i){var n=e.length?e.slice():[e,e];return e[0]>e[1]&&n.reverse(),0>t&&n[0]+t<i[0]&&(t=i[0]-n[0]),t>0&&n[1]+t>i[1]&&(t=i[1]-n[1]),t}return t?(\"rigid\"===n?(t=o(t,e,i),e[0]+=t,e[1]+=t):(t=o(t,e[r],i),e[r]+=t,\"push\"===n&&e[0]>e[1]&&(e[1-r]=e[r])),e):e}},function(t,e,i){var n=i(1),r={show:!0,zlevel:0,z:0,inverse:!1,name:\"\",nameLocation:\"end\",nameRotate:null,nameTruncate:{maxWidth:null,ellipsis:\"...\",placeholder:\".\"},nameTextStyle:{},nameGap:15,silent:!1,triggerEvent:!1,tooltip:{show:!1},axisLine:{show:!0,onZero:!0,lineStyle:{color:\"#333\",width:1,type:\"solid\"}},axisTick:{show:!0,inside:!1,length:5,lineStyle:{width:1}},axisLabel:{show:!0,inside:!1,rotate:0,margin:8,textStyle:{fontSize:12}},splitLine:{show:!0,lineStyle:{color:[\"#ccc\"],width:1,type:\"solid\"}},splitArea:{show:!1,areaStyle:{color:[\"rgba(250,250,250,0.3)\",\"rgba(200,200,200,0.3)\"]}}},o=n.merge({boundaryGap:!0,splitLine:{show:!1},axisTick:{alignWithLabel:!1,interval:\"auto\"},axisLabel:{interval:\"auto\"}},r),a=n.merge({boundaryGap:[0,0],splitNumber:5},r),s=n.defaults({scale:!0,min:\"dataMin\",max:\"dataMax\"},a),l=n.defaults({logBase:10},a);l.scale=!0,t.exports={categoryAxis:o,valueAxis:a,timeAxis:s,logAxis:l}},function(t,e){var i={},n=\"\\x00__throttleOriginMethod\",r=\"\\x00__throttleRate\",o=\"\\x00__throttleType\";i.throttle=function(t,e,i){function n(){u=(new Date).getTime(),h=null,t.apply(a,s||[])}var r,o,a,s,l=0,u=0,h=null;e=e||0;var c=function(){r=(new Date).getTime(),a=this,s=arguments,o=r-(i?l:u)-e,clearTimeout(h),i?h=setTimeout(n,e):o>=0?n():h=setTimeout(n,-o),l=r};return c.clear=function(){h&&(clearTimeout(h),h=null)},c},i.createOrUpdate=function(t,e,a,s){var l=t[e];if(l){var u=l[n]||l,h=l[o],c=l[r];if(c!==a||h!==s){if(null==a||!s)return t[e]=u;l=t[e]=i.throttle(u,a,\"debounce\"===s),l[n]=u,l[o]=s,l[r]=a}return l}},i.clear=function(t,e){var i=t[e];i&&i[n]&&(t[e]=i[n])},t.exports=i},function(t,e){t.exports={containStroke:function(t,e,i,n,r,o,a){if(0===r)return!1;var s=r,l=0,u=t;if(a>e+s&&a>n+s||e-s>a&&n-s>a||o>t+s&&o>i+s||t-s>o&&i-s>o)return!1;if(t===i)return Math.abs(o-t)<=s/2;l=(e-n)/(t-i),u=(t*n-i*e)/(t-i);var h=l*o-a+u,c=h*h/(l*l+1);return s/2*s/2>=c}}},function(t,e,i){var n=i(17);t.exports={containStroke:function(t,e,i,r,o,a,s,l,u){if(0===s)return!1;var h=s;if(u>e+h&&u>r+h&&u>a+h||e-h>u&&r-h>u&&a-h>u||l>t+h&&l>i+h&&l>o+h||t-h>l&&i-h>l&&o-h>l)return!1;var c=n.quadraticProjectPoint(t,e,i,r,o,a,l,u,null);return h/2>=c}}},function(t,e){t.exports=function(t,e,i,n,r,o){if(o>e&&o>n||e>o&&n>o)return 0;if(n===e)return 0;var a=e>n?1:-1,s=(o-e)/(n-e);1!==s&&0!==s||(a=e>n?.5:-.5);var l=s*(i-t)+t;return l>r?a:0}},function(t,e,i){\"use strict\";var n=i(1),r=i(29),o=function(t,e,i,n,o,a){this.x=null==t?0:t,this.y=null==e?0:e,this.x2=null==i?1:i,this.y2=null==n?0:n,this.type=\"linear\",this.global=a||!1,r.call(this,o)};o.prototype={constructor:o},n.inherits(o,r),t.exports=o},function(t,e,i){\"use strict\";function n(t){return t>s||-s>t}var r=i(19),o=i(5),a=r.identity,s=5e-5,l=function(t){t=t||{},t.position||(this.position=[0,0]),null==t.rotation&&(this.rotation=0),t.scale||(this.scale=[1,1]),this.origin=this.origin||null},u=l.prototype;u.transform=null,u.needLocalTransform=function(){return n(this.rotation)||n(this.position[0])||n(this.position[1])||n(this.scale[0]-1)||n(this.scale[1]-1)},u.updateTransform=function(){var t=this.parent,e=t&&t.transform,i=this.needLocalTransform(),n=this.transform;return i||e?(n=n||r.create(),i?this.getLocalTransform(n):a(n),e&&(i?r.mul(n,t.transform,n):r.copy(n,t.transform)),this.transform=n,this.invTransform=this.invTransform||r.create(),void r.invert(this.invTransform,n)):void(n&&a(n))},u.getLocalTransform=function(t){t=t||[],a(t);var e=this.origin,i=this.scale,n=this.rotation,o=this.position;return e&&(t[4]-=e[0],t[5]-=e[1]),r.scale(t,t,i),n&&r.rotate(t,t,n),e&&(t[4]+=e[0],t[5]+=e[1]),t[4]+=o[0],t[5]+=o[1],t},u.setTransform=function(t){var e=this.transform,i=t.dpr||1;e?t.setTransform(i*e[0],i*e[1],i*e[2],i*e[3],i*e[4],i*e[5]):t.setTransform(i,0,0,i,0,0)},u.restoreTransform=function(t){var e=(this.transform,t.dpr||1);t.setTransform(e,0,0,e,0,0)};var h=[];u.decomposeTransform=function(){if(this.transform){var t=this.parent,e=this.transform;t&&t.transform&&(r.mul(h,t.invTransform,e),e=h);var i=e[0]*e[0]+e[1]*e[1],o=e[2]*e[2]+e[3]*e[3],a=this.position,s=this.scale;n(i-1)&&(i=Math.sqrt(i)),n(o-1)&&(o=Math.sqrt(o)),e[0]<0&&(i=-i),e[3]<0&&(o=-o),a[0]=e[4],a[1]=e[5],s[0]=i,s[1]=o,this.rotation=Math.atan2(-e[1]/o,e[0]/i)}},u.getGlobalScale=function(){var t=this.transform;if(!t)return[1,1];var e=Math.sqrt(t[0]*t[0]+t[1]*t[1]),i=Math.sqrt(t[2]*t[2]+t[3]*t[3]);return t[0]<0&&(e=-e),t[3]<0&&(i=-i),[e,i]},u.transformCoordToLocal=function(t,e){var i=[t,e],n=this.invTransform;return n&&o.applyTransform(i,i,n),i},u.transformCoordToGlobal=function(t,e){var i=[t,e],n=this.transform;return n&&o.applyTransform(i,i,n),i},t.exports=l},function(t,e,i){\"use strict\";function n(t){r.each(o,function(e){this[e]=r.bind(t[e],t)},this)}var r=i(1),o=[\"getDom\",\"getZr\",\"getWidth\",\"getHeight\",\"dispatchAction\",\"isDisposed\",\"on\",\"off\",\"getDataURL\",\"getConnectedDataURL\",\"getModel\",\"getOption\"];t.exports=n},function(t,e,i){var n=i(1);i(54),i(89),i(90);var r=i(120),o=i(2);o.registerLayout(n.curry(r,\"bar\")),o.registerVisual(function(t){t.eachSeriesByType(\"bar\",function(t){var e=t.getData();e.setVisual(\"legendSymbol\",\"roundRect\")})}),i(36)},function(t,e,i){\"use strict\";var n=i(15),r=i(35);t.exports=n.extend({type:\"series.bar\",dependencies:[\"grid\",\"polar\"],getInitialData:function(t,e){return r(t.data,this,e)},getMarkerPosition:function(t){var e=this.coordinateSystem;if(e){var i=e.dataToPoint(t,!0),n=this.getData(),r=n.getLayout(\"offset\"),o=n.getLayout(\"size\"),a=e.getBaseAxis().isHorizontal()?0:1;return i[a]+=r+o/2,i}return[NaN,NaN]},brushSelector:\"rect\",defaultOption:{zlevel:0,z:2,coordinateSystem:\"cartesian2d\",legendHoverLink:!0,barMinHeight:0,itemStyle:{normal:{},emphasis:{}}}})},function(t,e,i){\"use strict\";function n(t,e){var i=t.width>0?1:-1,n=t.height>0?1:-1;e=Math.min(e,Math.abs(t.width),Math.abs(t.height)),t.x+=i*e/2,t.y+=n*e/2,t.width-=i*e,t.height-=n*e}var r=i(1),o=i(3);r.extend(i(9).prototype,i(91)),t.exports=i(2).extendChartView({type:\"bar\",render:function(t,e,i){var n=t.get(\"coordinateSystem\");return\"cartesian2d\"===n&&this._renderOnCartesian(t,e,i),this.group},_renderOnCartesian:function(t,e,i){function a(e,i){var a=l.getItemLayout(e),s=l.getItemModel(e).get(p)||0;n(a,s);var u=new o.Rect({shape:r.extend({},a)});if(f){var h=u.shape,c=d?\"height\":\"width\",g={};h[c]=0,g[c]=a[c],o[i?\"updateProps\":\"initProps\"](u,{shape:g},t,e)}return u}var s=this.group,l=t.getData(),u=this._data,h=t.coordinateSystem,c=h.getBaseAxis(),d=c.isHorizontal(),f=t.get(\"animation\"),p=[\"itemStyle\",\"normal\",\"barBorderWidth\"];l.diff(u).add(function(t){if(l.hasValue(t)){var e=a(t);l.setItemGraphicEl(t,e),s.add(e)}}).update(function(e,i){var r=u.getItemGraphicEl(i);if(!l.hasValue(e))return void s.remove(r);r||(r=a(e,!0));var h=l.getItemLayout(e),c=l.getItemModel(e).get(p)||0;n(h,c),o.updateProps(r,{shape:h},t,e),l.setItemGraphicEl(e,r),s.add(r)}).remove(function(e){var i=u.getItemGraphicEl(e);i&&(i.style.text=\"\",o.updateProps(i,{shape:{width:0}},t,e,function(){s.remove(i)}))}).execute(),this._updateStyle(t,l,d),this._data=l},_updateStyle:function(t,e,i){function n(t,e,i,n,r){o.setText(t,e,i),t.text=n,\"outside\"===t.textPosition&&(t.textPosition=r)}e.eachItemGraphicEl(function(a,s){var l=e.getItemModel(s),u=e.getItemVisual(s,\"color\"),h=e.getItemVisual(s,\"opacity\"),c=e.getItemLayout(s),d=l.getModel(\"itemStyle.normal\"),f=l.getModel(\"itemStyle.emphasis\").getBarItemStyle();a.setShape(\"r\",d.get(\"barBorderRadius\")||0),a.useStyle(r.defaults({fill:u,opacity:h},d.getBarItemStyle()));var p=i?c.height>0?\"bottom\":\"top\":c.width>0?\"left\":\"right\",g=l.getModel(\"label.normal\"),v=l.getModel(\"label.emphasis\"),m=a.style;g.get(\"show\")?n(m,g,u,r.retrieve(t.getFormattedLabel(s,\"normal\"),t.getRawValue(s)),p):m.text=\"\",v.get(\"show\")?n(f,v,u,r.retrieve(t.getFormattedLabel(s,\"emphasis\"),t.getRawValue(s)),p):f.text=\"\",o.setHoverStyle(a,f)})},remove:function(t,e){var i=this.group;t.get(\"animation\")?this._data&&this._data.eachItemGraphicEl(function(e){e.style.text=\"\",o.updateProps(e,{shape:{width:0}},t,e.dataIndex,function(){i.remove(e)})}):i.removeAll()}})},function(t,e,i){var n=i(31)([[\"fill\",\"color\"],[\"stroke\",\"borderColor\"],[\"lineWidth\",\"borderWidth\"],[\"stroke\",\"barBorderColor\"],[\"lineWidth\",\"barBorderWidth\"],[\"opacity\"],[\"shadowBlur\"],[\"shadowOffsetX\"],[\"shadowOffsetY\"],[\"shadowColor\"]]);t.exports={getBarItemStyle:function(t){var e=n.call(this,t);if(this.getBorderLineDash){var i=this.getBorderLineDash();i&&(e.lineDash=i)}return e}}},function(t,e,i){function n(t){return\"_\"+t+\"Type\"}function r(t,e,i){var n=e.getItemVisual(i,\"color\"),r=e.getItemVisual(i,t),o=e.getItemVisual(i,t+\"Size\");if(r&&\"none\"!==r){f.isArray(o)||(o=[o,o]);var a=u.createSymbol(r,-o[0]/2,-o[1]/2,o[0],o[1],n);return a.name=t,a}}function o(t){var e=new c({name:\"line\"});return a(e.shape,t),e}function a(t,e){var i=e[0],n=e[1],r=e[2];t.x1=i[0],t.y1=i[1],t.x2=n[0],t.y2=n[1],t.percent=1,r?(t.cpx1=r[0],t.cpy1=r[1]):(t.cpx1=NaN,t.cpy1=NaN)}function s(){var t=this,e=t.childOfName(\"fromSymbol\"),i=t.childOfName(\"toSymbol\"),n=t.childOfName(\"label\");if(e||i||!n.ignore){for(var r=1,o=this.parent;o;)o.scale&&(r/=o.scale[0]),o=o.parent;var a=t.childOfName(\"line\");if(this.__dirty||a.__dirty){var s=a.shape.percent,l=a.pointAt(0),u=a.pointAt(s),c=h.sub([],u,l);if(h.normalize(c,c),e){e.attr(\"position\",l);var d=a.tangentAt(0);e.attr(\"rotation\",Math.PI/2-Math.atan2(d[1],d[0])),e.attr(\"scale\",[r*s,r*s])}if(i){i.attr(\"position\",u);var d=a.tangentAt(1);i.attr(\"rotation\",-Math.PI/2-Math.atan2(d[1],d[0])),i.attr(\"scale\",[r*s,r*s])}if(!n.ignore){n.attr(\"position\",u);var f,p,g,v=5*r;if(\"end\"===n.__position)f=[c[0]*v+u[0],c[1]*v+u[1]],p=c[0]>.8?\"left\":c[0]<-.8?\"right\":\"center\",g=c[1]>.8?\"top\":c[1]<-.8?\"bottom\":\"middle\";else if(\"middle\"===n.__position){var m=s/2,d=a.tangentAt(m),y=[d[1],-d[0]],x=a.pointAt(m);y[1]>0&&(y[0]=-y[0],y[1]=-y[1]),f=[x[0]+y[0]*v,x[1]+y[1]*v],p=\"center\",g=\"bottom\";var _=-Math.atan2(d[1],d[0]);u[0]<l[0]&&(_=Math.PI+_),n.attr(\"rotation\",_)}else f=[-c[0]*v+l[0],-c[1]*v+l[1]],p=c[0]>.8?\"right\":c[0]<-.8?\"left\":\"center\",g=c[1]>.8?\"bottom\":c[1]<-.8?\"top\":\"middle\";n.attr({style:{textVerticalAlign:n.__verticalAlign||g,textAlign:n.__textAlign||p},position:f,scale:[r,r]})}}}}function l(t,e,i){d.Group.call(this),this._createLine(t,e,i)}var u=i(26),h=i(5),c=i(174),d=i(3),f=i(1),p=i(4),g=[\"fromSymbol\",\"toSymbol\"],v=l.prototype;v.beforeUpdate=s,v._createLine=function(t,e,i){var a=t.hostModel,s=t.getItemLayout(e),l=o(s);l.shape.percent=0,d.initProps(l,{shape:{percent:1}},a,e),this.add(l);var u=new d.Text({name:\"label\"});this.add(u),f.each(g,function(i){var o=r(i,t,e);this.add(o),this[n(i)]=t.getItemVisual(e,i)},this),this._updateCommonStl(t,e,i)},v.updateData=function(t,e,i){var o=t.hostModel,s=this.childOfName(\"line\"),l=t.getItemLayout(e),u={shape:{}};a(u.shape,l),d.updateProps(s,u,o,e),f.each(g,function(i){var o=t.getItemVisual(e,i),a=n(i);if(this[a]!==o){this.remove(this.childOfName(i));var s=r(i,t,e);this.add(s)}this[a]=o},this),this._updateCommonStl(t,e,i)},v._updateCommonStl=function(t,e,i){var n=t.hostModel,r=this.childOfName(\"line\"),o=i&&i.lineStyle,a=i&&i.hoverLineStyle,s=i&&i.labelModel,l=i&&i.hoverLabelModel;if(!i||t.hasItemOption){var u=t.getItemModel(e);o=u.getModel(\"lineStyle.normal\").getLineStyle(),a=u.getModel(\"lineStyle.emphasis\").getLineStyle(),s=u.getModel(\"label.normal\"),l=u.getModel(\"label.emphasis\")}var h=t.getItemVisual(e,\"color\"),c=f.retrieve(t.getItemVisual(e,\"opacity\"),o.opacity,1);isNaN(v)&&(v=t.getName(e)),r.useStyle(f.defaults({strokeNoScale:!0,fill:\"none\",stroke:h,opacity:c},o)),r.hoverStyle=a,f.each(g,function(t){var e=this.childOfName(t);e&&(e.setColor(h),e.setStyle({opacity:c}))},this);var v,m,y=s.getShallow(\"show\"),x=l.getShallow(\"show\"),_=this.childOfName(\"label\");if((y||x)&&(v=p.round(n.getRawValue(e)),m=h||\"#000\"),y){var b=s.getModel(\"textStyle\");_.setStyle({text:f.retrieve(n.getFormattedLabel(e,\"normal\",t.dataType),v),textFont:b.getFont(),fill:b.getTextColor()||m}),_.__textAlign=b.get(\"align\"),_.__verticalAlign=b.get(\"baseline\"),_.__position=s.get(\"position\")}else _.setStyle(\"text\",\"\");if(x){var w=l.getModel(\"textStyle\");_.hoverStyle={text:f.retrieve(n.getFormattedLabel(e,\"emphasis\",t.dataType),v),textFont:w.getFont(),fill:w.getTextColor()||m}}else _.hoverStyle={text:\"\"};_.ignore=!y&&!x,d.setHoverStyle(this)},v.updateLayout=function(t,e){this.setLinePoints(t.getItemLayout(e))},v.setLinePoints=function(t){var e=this.childOfName(\"line\");a(e.shape,t),e.dirty()},f.inherits(l,d.Group),t.exports=l},function(t,e,i){function n(t){return isNaN(t[0])||isNaN(t[1])}function r(t){return!n(t[0])&&!n(t[1])}function o(t){this._ctor=t||s,this.group=new a.Group}var a=i(3),s=i(92),l=o.prototype;l.updateData=function(t){var e=this._lineData,i=this.group,n=this._ctor,o=t.hostModel,a={lineStyle:o.getModel(\"lineStyle.normal\").getLineStyle(),hoverLineStyle:o.getModel(\"lineStyle.emphasis\").getLineStyle(),labelModel:o.getModel(\"label.normal\"),hoverLabelModel:o.getModel(\"label.emphasis\")};t.diff(e).add(function(e){if(r(t.getItemLayout(e))){var o=new n(t,e,a);t.setItemGraphicEl(e,o),i.add(o)}}).update(function(o,s){var l=e.getItemGraphicEl(s);return r(t.getItemLayout(o))?(l?l.updateData(t,o,a):l=new n(t,o,a),t.setItemGraphicEl(o,l),void i.add(l)):void i.remove(l)}).remove(function(t){i.remove(e.getItemGraphicEl(t))}).execute(),this._lineData=t},l.updateLayout=function(){var t=this._lineData;t.eachItemGraphicEl(function(e,i){e.updateLayout(t,i)},this)},l.remove=function(){this.group.removeAll()},t.exports=o},function(t,e,i){var n=i(1),r=i(2),o=r.PRIORITY;i(95),i(96),r.registerVisual(n.curry(i(46),\"line\",\"circle\",\"line\")),r.registerLayout(n.curry(i(55),\"line\")),r.registerProcessor(o.PROCESSOR.STATISTIC,n.curry(i(132),\"line\")),i(36)},function(t,e,i){\"use strict\";var n=i(35),r=i(15);t.exports=r.extend({type:\"series.line\",dependencies:[\"grid\",\"polar\"],getInitialData:function(t,e){return n(t.data,this,e)},defaultOption:{zlevel:0,z:2,coordinateSystem:\"cartesian2d\",legendHoverLink:!0,hoverAnimation:!0,clipOverflow:!0,label:{normal:{position:\"top\"}},lineStyle:{normal:{width:2,type:\"solid\"}},step:!1,smooth:!1,smoothMonotone:null,symbol:\"emptyCircle\",symbolSize:4,symbolRotate:null,showSymbol:!0,showAllSymbol:!1,connectNulls:!1,sampling:\"none\",animationEasing:\"linear\",progressive:0,hoverLayerThreshold:1/0}})},function(t,e,i){\"use strict\";function n(t,e){if(t.length===e.length){for(var i=0;i<t.length;i++){var n=t[i],r=e[i];if(n[0]!==r[0]||n[1]!==r[1])return}return!0}}function r(t){return\"number\"==typeof t?t:t?.3:0}function o(t){var e=t.getGlobalExtent();if(t.onBand){var i=t.getBandWidth()/2-1,n=e[1]>e[0]?1:-1;e[0]+=n*i,e[1]-=n*i}return e}function a(t){return t>=0?1:-1}function s(t,e){var i=t.getBaseAxis(),n=t.getOtherAxis(i),r=i.onZero?0:n.scale.getExtent()[0],o=n.dim,s=\"x\"===o||\"radius\"===o?1:0;return e.mapArray([o],function(n,l){for(var u,h=e.stackedOn;h&&a(h.get(o,l))===a(n);){u=h;break}var c=[];return c[s]=e.get(i.dim,l),c[1-s]=u?u.get(o,l,!0):r,t.dataToPoint(c)},!0)}function l(t,e){return null!=e.dataIndex?e.dataIndex:null!=e.name?t.indexOfName(e.name):void 0}function u(t,e,i){var n=o(t.getAxis(\"x\")),r=o(t.getAxis(\"y\")),a=t.getBaseAxis().isHorizontal(),s=Math.min(n[0],n[1]),l=Math.min(r[0],r[1]),u=Math.max(n[0],n[1])-s,h=Math.max(r[0],r[1])-l,c=i.get(\"lineStyle.normal.width\")||2,d=i.get(\"clipOverflow\")?c/2:Math.max(u,h);a?(l-=d,h+=2*d):(s-=d,u+=2*d);var f=new x.Rect({shape:{x:s,y:l,width:u,height:h}});return e&&(f.shape[a?\"width\":\"height\"]=0,x.initProps(f,{shape:{width:u,height:h}},i)),f}function h(t,e,i){var n=t.getAngleAxis(),r=t.getRadiusAxis(),o=r.getExtent(),a=n.getExtent(),s=Math.PI/180,l=new x.Sector({shape:{cx:t.cx,cy:t.cy,r0:o[0],r:o[1],startAngle:-a[0]*s,endAngle:-a[1]*s,clockwise:n.inverse}});return e&&(l.shape.endAngle=-a[0]*s,x.initProps(l,{shape:{endAngle:-a[1]*s}},i)),l}function c(t,e,i){return\"polar\"===t.type?h(t,e,i):u(t,e,i)}function d(t,e,i){for(var n=e.getBaseAxis(),r=\"x\"===n.dim||\"radius\"===n.dim?0:1,o=[],a=0;a<t.length-1;a++){var s=t[a+1],l=t[a];o.push(l);var u=[];switch(i){case\"end\":u[r]=s[r],u[1-r]=l[1-r],o.push(u);break;case\"middle\":var h=(l[r]+s[r])/2,c=[];u[r]=c[r]=h,u[1-r]=l[1-r],c[1-r]=s[1-r],o.push(u),o.push(c);break;default:u[r]=l[r],u[1-r]=s[1-r],o.push(u)}}return t[a]&&o.push(t[a]),o}function f(t,e){return Math.max(Math.min(t,e[1]),e[0])}function p(t,e){var i=t.getVisual(\"visualMeta\");if(i&&i.length){for(var n,r=i.length-1;r>=0;r--)if(i[r].dimension<2){n=i[r];break}if(n&&\"cartesian2d\"===e.type){var o=n.dimension,a=t.dimensions[o],s=t.getDataExtent(a),l=n.stops,u=[];l[0].interval&&l.sort(function(t,e){return t.interval[0]-e.interval[0]});var h=l[0],c=l[l.length-1],d=h.interval?f(h.interval[0],s):h.value,p=c.interval?f(c.interval[1],s):c.value,g=p-d;if(0===g)return t.getItemVisual(0,\"color\");for(var r=0;r<l.length;r++)if(l[r].interval){if(l[r].interval[1]===l[r].interval[0])continue;u.push({offset:(f(l[r].interval[0],s)-d)/g,color:l[r].color},{offset:(f(l[r].interval[1],s)-d)/g,color:l[r].color})}else u.push({offset:(l[r].value-d)/g,color:l[r].color});var v=new x.LinearGradient(0,0,0,0,u,!0),m=e.getAxis(a),y=Math.round(m.toGlobalCoord(m.dataToCoord(d))),_=Math.round(m.toGlobalCoord(m.dataToCoord(p)));return v[a]=y,v[a+\"2\"]=_,v}}}var g=i(1),v=i(39),m=i(49),y=i(97),x=i(3),_=i(98),b=i(27);t.exports=b.extend({type:\"line\",init:function(){var t=new x.Group,e=new v;this.group.add(e.group),this._symbolDraw=e,this._lineGroup=t},render:function(t,e,i){var o=t.coordinateSystem,a=this.group,l=t.getData(),u=t.getModel(\"lineStyle.normal\"),h=t.getModel(\"areaStyle.normal\"),f=l.mapArray(l.getItemLayout,!0),v=\"polar\"===o.type,m=this._coordSys,y=this._symbolDraw,x=this._polyline,_=this._polygon,b=this._lineGroup,w=t.get(\"animation\"),S=!h.isEmpty(),M=s(o,l),T=t.get(\"showSymbol\"),A=T&&!v&&!t.get(\"showAllSymbol\")&&this._getSymbolIgnoreFunc(l,o),I=this._data;I&&I.eachItemGraphicEl(function(t,e){t.__temp&&(a.remove(t),I.setItemGraphicEl(e,null))}),T||y.remove(),a.add(b);var L=!v&&t.get(\"step\");x&&m.type===o.type&&L===this._step?(S&&!_?_=this._newPolygon(f,M,o,w):_&&!S&&(b.remove(_),_=this._polygon=null),b.setClipPath(c(o,!1,t)),T&&y.updateData(l,A),l.eachItemGraphicEl(function(t){t.stopAnimation(!0)}),n(this._stackedOnPoints,M)&&n(this._points,f)||(w?this._updateAnimation(l,M,o,i,L):(L&&(f=d(f,o,L),M=d(M,o,L)),x.setShape({points:f}),_&&_.setShape({points:f,stackedOnPoints:M})))):(T&&y.updateData(l,A),L&&(f=d(f,o,L),M=d(M,o,L)),x=this._newPolyline(f,o,w),S&&(_=this._newPolygon(f,M,o,w)),b.setClipPath(c(o,!0,t)));var C=p(l,o)||l.getVisual(\"color\");x.useStyle(g.defaults(u.getLineStyle(),{fill:\"none\",stroke:C,lineJoin:\"bevel\"}));var D=t.get(\"smooth\");if(D=r(t.get(\"smooth\")),x.setShape({smooth:D,smoothMonotone:t.get(\"smoothMonotone\"),connectNulls:t.get(\"connectNulls\")}),_){var P=l.stackedOn,k=0;if(_.useStyle(g.defaults(h.getAreaStyle(),{fill:C,opacity:.7,lineJoin:\"bevel\"})),P){var z=P.hostModel;k=r(z.get(\"smooth\"))}_.setShape({smooth:D,stackedOnSmooth:k,smoothMonotone:t.get(\"smoothMonotone\"),connectNulls:t.get(\"connectNulls\")})}this._data=l,this._coordSys=o,this._stackedOnPoints=M,this._points=f,this._step=L},highlight:function(t,e,i,n){var r=t.getData(),o=l(r,n);if(!(o instanceof Array)&&null!=o&&o>=0){var a=r.getItemGraphicEl(o);if(!a){var s=r.getItemLayout(o);a=new m(r,o),a.position=s,a.setZ(t.get(\"zlevel\"),t.get(\"z\")),a.ignore=isNaN(s[0])||isNaN(s[1]),a.__temp=!0,r.setItemGraphicEl(o,a),a.stopSymbolAnimation(!0),this.group.add(a)}a.highlight()}else b.prototype.highlight.call(this,t,e,i,n)},downplay:function(t,e,i,n){var r=t.getData(),o=l(r,n);if(null!=o&&o>=0){var a=r.getItemGraphicEl(o);a&&(a.__temp?(r.setItemGraphicEl(o,null),this.group.remove(a)):a.downplay())}else b.prototype.downplay.call(this,t,e,i,n)},_newPolyline:function(t){var e=this._polyline;return e&&this._lineGroup.remove(e),e=new _.Polyline({shape:{points:t},silent:!0,z2:10}),this._lineGroup.add(e),this._polyline=e,e},_newPolygon:function(t,e){var i=this._polygon;return i&&this._lineGroup.remove(i),i=new _.Polygon({shape:{points:t,stackedOnPoints:e},silent:!0}),this._lineGroup.add(i),this._polygon=i,i},_getSymbolIgnoreFunc:function(t,e){var i=e.getAxesByScale(\"ordinal\")[0];return i&&i.isLabelIgnored?g.bind(i.isLabelIgnored,i):void 0},_updateAnimation:function(t,e,i,n,r){var o=this._polyline,a=this._polygon,s=t.hostModel,l=y(this._data,t,this._stackedOnPoints,e,this._coordSys,i),u=l.current,h=l.stackedOnCurrent,c=l.next,f=l.stackedOnNext;r&&(u=d(l.current,i,r),h=d(l.stackedOnCurrent,i,r),c=d(l.next,i,r),f=d(l.stackedOnNext,i,r)),o.shape.__points=l.current,o.shape.points=u,x.updateProps(o,{shape:{points:c}},s),a&&(a.setShape({points:u,stackedOnPoints:h}),x.updateProps(a,{shape:{points:c,stackedOnPoints:f,__points:l.next}},s));for(var p=[],g=l.status,v=0;v<g.length;v++){var m=g[v].cmd;if(\"=\"===m){var _=t.getItemGraphicEl(g[v].idx1);_&&p.push({el:_,ptIdx:v})}}o.animators&&o.animators.length&&o.animators[0].during(function(){for(var t=0;t<p.length;t++){var e=p[t].el;e.attr(\"position\",o.shape.__points[p[t].ptIdx])}})},remove:function(t){var e=this.group,i=this._data;this._lineGroup.removeAll(),this._symbolDraw.remove(!0),i&&i.eachItemGraphicEl(function(t,n){t.__temp&&(e.remove(t),i.setItemGraphicEl(n,null))}),this._polyline=this._polygon=this._coordSys=this._points=this._stackedOnPoints=this._data=null}})},function(t,e){function i(t){return t>=0?1:-1}function n(t,e,n){for(var r,o=t.getBaseAxis(),a=t.getOtherAxis(o),s=o.onZero?0:a.scale.getExtent()[0],l=a.dim,u=\"x\"===l||\"radius\"===l?1:0,h=e.stackedOn,c=e.get(l,n);h&&i(h.get(l,n))===i(c);){r=h;break}var d=[];return d[u]=e.get(o.dim,n),d[1-u]=r?r.get(l,n,!0):s,t.dataToPoint(d)}function r(t,e){var i=[];return e.diff(t).add(function(t){i.push({cmd:\"+\",idx:t})}).update(function(t,e){i.push({cmd:\"=\",idx:e,idx1:t})}).remove(function(t){i.push({cmd:\"-\",idx:t})}).execute(),i}t.exports=function(t,e,i,o,a,s){for(var l=r(t,e),u=[],h=[],c=[],d=[],f=[],p=[],g=[],v=s.dimensions,m=0;m<l.length;m++){var y=l[m],x=!0;switch(y.cmd){case\"=\":var _=t.getItemLayout(y.idx),b=e.getItemLayout(y.idx1);(isNaN(_[0])||isNaN(_[1]))&&(_=b.slice()),u.push(_),h.push(b),c.push(i[y.idx]),d.push(o[y.idx1]),g.push(e.getRawIndex(y.idx1));break;case\"+\":var w=y.idx;u.push(a.dataToPoint([e.get(v[0],w,!0),e.get(v[1],w,!0)])),h.push(e.getItemLayout(w).slice()),c.push(n(a,e,w)),d.push(o[w]),g.push(e.getRawIndex(w));break;case\"-\":var w=y.idx,S=t.getRawIndex(w);S!==w?(u.push(t.getItemLayout(w)),h.push(s.dataToPoint([t.get(v[0],w,!0),t.get(v[1],w,!0)])),c.push(i[w]),d.push(n(s,t,w)),g.push(S)):x=!1}x&&(f.push(y),p.push(p.length))}p.sort(function(t,e){return g[t]-g[e]});for(var M=[],T=[],A=[],I=[],L=[],m=0;m<p.length;m++){var w=p[m];M[m]=u[w],T[m]=h[w],A[m]=c[w],I[m]=d[w],L[m]=f[w]}return{current:M,next:T,stackedOnCurrent:A,stackedOnNext:I,status:L}}},function(t,e,i){function n(t){return isNaN(t[0])||isNaN(t[1])}function r(t,e,i,r,o,a,g,v,m,y,x){for(var _=0,b=i,w=0;r>w;w++){var S=e[b];if(b>=o||0>b)break;if(n(S)){if(x){b+=a;continue}break}if(b===i)t[a>0?\"moveTo\":\"lineTo\"](S[0],S[1]),c(f,S);else if(m>0){var M=b+a,T=e[M];if(x)for(;T&&n(e[M]);)M+=a,T=e[M];var A=.5,I=e[_],T=e[M];if(!T||n(T))c(p,S);else{n(T)&&!x&&(T=S),s.sub(d,T,I);var L,C;if(\"x\"===y||\"y\"===y){var D=\"x\"===y?0:1;L=Math.abs(S[D]-I[D]),C=Math.abs(S[D]-T[D])}else L=s.dist(S,I),C=s.dist(S,T);A=C/(C+L),h(p,S,d,-m*(1-A))}l(f,f,v),u(f,f,g),l(p,p,v),u(p,p,g),t.bezierCurveTo(f[0],f[1],p[0],p[1],S[0],S[1]),h(f,S,d,m*A)}else t.lineTo(S[0],S[1]);_=b,b+=a}return w}function o(t,e){var i=[1/0,1/0],n=[-(1/0),-(1/0)];if(e)for(var r=0;r<t.length;r++){var o=t[r];o[0]<i[0]&&(i[0]=o[0]),o[1]<i[1]&&(i[1]=o[1]),o[0]>n[0]&&(n[0]=o[0]),o[1]>n[1]&&(n[1]=o[1])}return{min:e?i:n,max:e?n:i}}var a=i(6),s=i(5),l=s.min,u=s.max,h=s.scaleAndAdd,c=s.copy,d=[],f=[],p=[];t.exports={Polyline:a.extend({type:\"ec-polyline\",shape:{points:[],smooth:0,smoothConstraint:!0,smoothMonotone:null,connectNulls:!1},style:{fill:null,stroke:\"#000\"},buildPath:function(t,e){var i=e.points,a=0,s=i.length,l=o(i,e.smoothConstraint);if(e.connectNulls){for(;s>0&&n(i[s-1]);s--);for(;s>a&&n(i[a]);a++);}for(;s>a;)a+=r(t,i,a,s,s,1,l.min,l.max,e.smooth,e.smoothMonotone,e.connectNulls)+1}}),Polygon:a.extend({type:\"ec-polygon\",shape:{points:[],stackedOnPoints:[],smooth:0,stackedOnSmooth:0,smoothConstraint:!0,smoothMonotone:null,connectNulls:!1},buildPath:function(t,e){var i=e.points,a=e.stackedOnPoints,s=0,l=i.length,u=e.smoothMonotone,h=o(i,e.smoothConstraint),c=o(a,e.smoothConstraint);if(e.connectNulls){for(;l>0&&n(i[l-1]);l--);for(;l>s&&n(i[s]);s++);}for(;l>s;){var d=r(t,i,s,l,l,1,h.min,h.max,e.smooth,u,e.connectNulls);r(t,a,s+d-1,d,l,-1,c.min,c.max,e.stackedOnSmooth,u,e.connectNulls),s+=d+1,t.closePath()}}})}},function(t,e,i){var n=i(1),r=i(2);i(100),i(101),i(77)(\"pie\",[{type:\"pieToggleSelect\",event:\"pieselectchanged\",method:\"toggleSelected\"},{type:\"pieSelect\",event:\"pieselected\",method:\"select\"},{type:\"pieUnSelect\",event:\"pieunselected\",method:\"unSelect\"}]),r.registerVisual(n.curry(i(72),\"pie\")),r.registerLayout(n.curry(i(103),\"pie\")),r.registerProcessor(n.curry(i(70),\"pie\"))},function(t,e,i){\"use strict\";var n=i(14),r=i(1),o=i(11),a=i(30),s=i(66),l=i(2).extendSeriesModel({type:\"series.pie\",init:function(t){l.superApply(this,\"init\",arguments),this.legendDataProvider=function(){return this._dataBeforeProcessed},this.updateSelectedMap(t.data),this._defaultLabelLine(t)},mergeOption:function(t){l.superCall(this,\"mergeOption\",t),this.updateSelectedMap(this.option.data)},getInitialData:function(t,e){var i=a([\"value\"],t.data),r=new n(i,this);return r.initData(t.data),r},getDataParams:function(t){var e=this._data,i=l.superCall(this,\"getDataParams\",t),n=e.getSum(\"value\");return i.percent=n?+(e.get(\"value\",t)/n*100).toFixed(2):0,i.$vars.push(\"percent\"),i},_defaultLabelLine:function(t){o.defaultEmphasis(t.labelLine,[\"show\"]);var e=t.labelLine.normal,i=t.labelLine.emphasis;e.show=e.show&&t.label.normal.show,i.show=i.show&&t.label.emphasis.show},defaultOption:{zlevel:0,z:2,legendHoverLink:!0,hoverAnimation:!0,center:[\"50%\",\"50%\"],radius:[0,\"75%\"],clockwise:!0,startAngle:90,minAngle:0,selectedOffset:10,avoidLabelOverlap:!0,label:{normal:{rotate:!1,show:!0,position:\"outer\"},emphasis:{}},labelLine:{normal:{show:!0,length:15,length2:15,smooth:!1,lineStyle:{width:1,type:\"solid\"}}},itemStyle:{normal:{borderWidth:1},emphasis:{}},animationEasing:\"cubicOut\",data:[]}});r.mixin(l,s),t.exports=l},function(t,e,i){function n(t,e,i,n){var o=e.getData(),a=this.dataIndex,s=o.getName(a),l=e.get(\"selectedOffset\");n.dispatchAction({type:\"pieToggleSelect\",from:t,name:s,seriesId:e.id}),o.each(function(t){r(o.getItemGraphicEl(t),o.getItemLayout(t),e.isSelected(o.getName(t)),l,i)})}function r(t,e,i,n,r){var o=(e.startAngle+e.endAngle)/2,a=Math.cos(o),s=Math.sin(o),l=i?n:0,u=[a*l,s*l];r?t.animate().when(200,{position:u}).start(\"bounceOut\"):t.attr(\"position\",u)}function o(t,e){function i(){o.ignore=o.hoverIgnore,a.ignore=a.hoverIgnore;\n}function n(){o.ignore=o.normalIgnore,a.ignore=a.normalIgnore}s.Group.call(this);var r=new s.Sector({z2:2}),o=new s.Polyline,a=new s.Text;this.add(r),this.add(o),this.add(a),this.updateData(t,e,!0),this.on(\"emphasis\",i).on(\"normal\",n).on(\"mouseover\",i).on(\"mouseout\",n)}function a(t,e,i,n,r){var o=n.getModel(\"textStyle\"),a=\"inside\"===r||\"inner\"===r;return{fill:o.getTextColor()||(a?\"#fff\":t.getItemVisual(e,\"color\")),opacity:t.getItemVisual(e,\"opacity\"),textFont:o.getFont(),text:l.retrieve(t.hostModel.getFormattedLabel(e,i),t.getName(e))}}var s=i(3),l=i(1),u=o.prototype;u.updateData=function(t,e,i){function n(){a.stopAnimation(!0),a.animateTo({shape:{r:c.r+10}},300,\"elasticOut\")}function o(){a.stopAnimation(!0),a.animateTo({shape:{r:c.r}},300,\"elasticOut\")}var a=this.childAt(0),u=t.hostModel,h=t.getItemModel(e),c=t.getItemLayout(e),d=l.extend({},c);d.label=null,i?(a.setShape(d),a.shape.endAngle=c.startAngle,s.updateProps(a,{shape:{endAngle:c.endAngle}},u,e)):s.updateProps(a,{shape:d},u,e);var f=h.getModel(\"itemStyle\"),p=t.getItemVisual(e,\"color\");a.useStyle(l.defaults({lineJoin:\"bevel\",fill:p},f.getModel(\"normal\").getItemStyle())),a.hoverStyle=f.getModel(\"emphasis\").getItemStyle(),r(this,t.getItemLayout(e),h.get(\"selected\"),u.get(\"selectedOffset\"),u.get(\"animation\")),a.off(\"mouseover\").off(\"mouseout\").off(\"emphasis\").off(\"normal\"),h.get(\"hoverAnimation\")&&u.ifEnableAnimation()&&a.on(\"mouseover\",n).on(\"mouseout\",o).on(\"emphasis\",n).on(\"normal\",o),this._updateLabel(t,e),s.setHoverStyle(this)},u._updateLabel=function(t,e){var i=this.childAt(1),n=this.childAt(2),r=t.hostModel,o=t.getItemModel(e),l=t.getItemLayout(e),u=l.label,h=t.getItemVisual(e,\"color\");s.updateProps(i,{shape:{points:u.linePoints||[[u.x,u.y],[u.x,u.y],[u.x,u.y]]}},r,e),s.updateProps(n,{style:{x:u.x,y:u.y}},r,e),n.attr({style:{textVerticalAlign:u.verticalAlign,textAlign:u.textAlign,textFont:u.font},rotation:u.rotation,origin:[u.x,u.y],z2:10});var c=o.getModel(\"label.normal\"),d=o.getModel(\"label.emphasis\"),f=o.getModel(\"labelLine.normal\"),p=o.getModel(\"labelLine.emphasis\"),g=c.get(\"position\")||d.get(\"position\");n.setStyle(a(t,e,\"normal\",c,g)),n.ignore=n.normalIgnore=!c.get(\"show\"),n.hoverIgnore=!d.get(\"show\"),i.ignore=i.normalIgnore=!f.get(\"show\"),i.hoverIgnore=!p.get(\"show\"),i.setStyle({stroke:h,opacity:t.getItemVisual(e,\"opacity\")}),i.setStyle(f.getModel(\"lineStyle\").getLineStyle()),n.hoverStyle=a(t,e,\"emphasis\",d,g),i.hoverStyle=p.getModel(\"lineStyle\").getLineStyle();var v=f.get(\"smooth\");v&&v===!0&&(v=.4),i.setShape({smooth:v})},l.inherits(o,s.Group);var h=i(27).extend({type:\"pie\",init:function(){var t=new s.Group;this._sectorGroup=t},render:function(t,e,i,r){if(!r||r.from!==this.uid){var a=t.getData(),s=this._data,u=this.group,h=e.get(\"animation\"),c=!s,d=l.curry(n,this.uid,t,h,i),f=t.get(\"selectedMode\");if(a.diff(s).add(function(t){var e=new o(a,t);c&&e.eachChild(function(t){t.stopAnimation(!0)}),f&&e.on(\"click\",d),a.setItemGraphicEl(t,e),u.add(e)}).update(function(t,e){var i=s.getItemGraphicEl(e);i.updateData(a,t),i.off(\"click\"),f&&i.on(\"click\",d),u.add(i),a.setItemGraphicEl(t,i)}).remove(function(t){var e=s.getItemGraphicEl(t);u.remove(e)}).execute(),h&&c&&a.count()>0){var p=a.getItemLayout(0),g=Math.max(i.getWidth(),i.getHeight())/2,v=l.bind(u.removeClipPath,u);u.setClipPath(this._createClipPath(p.cx,p.cy,g,p.startAngle,p.clockwise,v,t))}this._data=a}},_createClipPath:function(t,e,i,n,r,o,a){var l=new s.Sector({shape:{cx:t,cy:e,r0:0,r:i,startAngle:n,endAngle:n,clockwise:r}});return s.initProps(l,{shape:{endAngle:n+(r?1:-1)*Math.PI*2}},a,o),l}});t.exports=h},function(t,e,i){\"use strict\";function n(t,e,i,n,r,o,a){function s(e,i,n,r){for(var o=e;i>o;o++)if(t[o].y+=n,o>e&&i>o+1&&t[o+1].y>t[o].y+t[o].height)return void l(o,n/2);l(i-1,n/2)}function l(e,i){for(var n=e;n>=0&&(t[n].y-=i,!(n>0&&t[n].y>t[n-1].y+t[n-1].height));n--);}function u(t,e,i,n,r,o){for(var a=o>0?e?Number.MAX_VALUE:0:e?Number.MAX_VALUE:0,s=0,l=t.length;l>s;s++)if(\"center\"!==t[s].position){var u=Math.abs(t[s].y-n),h=t[s].len,c=t[s].len2,d=r+h>u?Math.sqrt((r+h+c)*(r+h+c)-u*u):Math.abs(t[s].x-i);e&&d>=a&&(d=a-10),!e&&a>=d&&(d=a+10),t[s].x=i+d*o,a=d}}t.sort(function(t,e){return t.y-e.y});for(var h,c=0,d=t.length,f=[],p=[],g=0;d>g;g++)h=t[g].y-c,0>h&&s(g,d,-h,r),c=t[g].y+t[g].height;0>a-c&&l(d-1,c-a);for(var g=0;d>g;g++)t[g].y>=i?p.push(t[g]):f.push(t[g]);u(f,!1,e,i,n,r),u(p,!0,e,i,n,r)}function r(t,e,i,r,o,a){for(var s=[],l=[],u=0;u<t.length;u++)t[u].x<e?s.push(t[u]):l.push(t[u]);n(l,e,i,r,1,o,a),n(s,e,i,r,-1,o,a);for(var u=0;u<t.length;u++){var h=t[u].linePoints;if(h){var c=h[1][0]-h[2][0];t[u].x<e?h[2][0]=t[u].x+3:h[2][0]=t[u].x-3,h[1][1]=h[2][1]=t[u].y,h[1][0]=h[2][0]+c}}}var o=i(16);t.exports=function(t,e,i,n){var a,s,l=t.getData(),u=[],h=!1;l.each(function(i){var n,r,c,d,f=l.getItemLayout(i),p=l.getItemModel(i),g=p.getModel(\"label.normal\"),v=g.get(\"position\")||p.get(\"label.emphasis.position\"),m=p.getModel(\"labelLine.normal\"),y=m.get(\"length\"),x=m.get(\"length2\"),_=(f.startAngle+f.endAngle)/2,b=Math.cos(_),w=Math.sin(_);a=f.cx,s=f.cy;var S=\"inside\"===v||\"inner\"===v;if(\"center\"===v)n=f.cx,r=f.cy,d=\"center\";else{var M=(S?(f.r+f.r0)/2*b:f.r*b)+a,T=(S?(f.r+f.r0)/2*w:f.r*w)+s;if(n=M+3*b,r=T+3*w,!S){var A=M+b*(y+e-f.r),I=T+w*(y+e-f.r),L=A+(0>b?-1:1)*x,C=I;n=L+(0>b?-5:5),r=C,c=[[M,T],[A,I],[L,C]]}d=S?\"center\":b>0?\"left\":\"right\"}var D=g.getModel(\"textStyle\").getFont(),P=g.get(\"rotate\")?0>b?-_+Math.PI:-_:0,k=t.getFormattedLabel(i,\"normal\")||l.getName(i),z=o.getBoundingRect(k,D,d,\"top\");h=!!P,f.label={x:n,y:r,position:v,height:z.height,len:y,len2:x,linePoints:c,textAlign:d,verticalAlign:\"middle\",font:D,rotation:P},S||u.push(f.label)}),!h&&t.get(\"avoidLabelOverlap\")&&r(u,a,s,e,i,n)}},function(t,e,i){var n=i(4),r=n.parsePercent,o=i(102),a=i(1),s=2*Math.PI,l=Math.PI/180;t.exports=function(t,e,i,u){e.eachSeriesByType(t,function(t){var e=t.get(\"center\"),u=t.get(\"radius\");a.isArray(u)||(u=[0,u]),a.isArray(e)||(e=[e,e]);var h=i.getWidth(),c=i.getHeight(),d=Math.min(h,c),f=r(e[0],h),p=r(e[1],c),g=r(u[0],d/2),v=r(u[1],d/2),m=t.getData(),y=-t.get(\"startAngle\")*l,x=t.get(\"minAngle\")*l,_=m.getSum(\"value\"),b=Math.PI/(_||m.count())*2,w=t.get(\"clockwise\"),S=t.get(\"roseType\"),M=m.getDataExtent(\"value\");M[0]=0;var T=s,A=0,I=y,L=w?1:-1;if(m.each(\"value\",function(t,e){var i;i=\"area\"!==S?0===_?b:t*b:s/(m.count()||1),x>i?(i=x,T-=x):A+=t;var r=I+L*i;m.setItemLayout(e,{angle:i,startAngle:I,endAngle:r,clockwise:w,cx:f,cy:p,r0:g,r:S?n.linearMap(t,M,[g,v]):v}),I=r},!0),s>T)if(.001>=T){var C=s/m.count();m.each(function(t){var e=m.getItemLayout(t);e.startAngle=y+L*t*C,e.endAngle=y+L*(t+1)*C})}else b=T/A,I=y,m.each(\"value\",function(t,e){var i=m.getItemLayout(e),n=i.angle===x?x:t*b;i.startAngle=I,i.endAngle=I+L*n,I+=n});o(t,v,h,c)})}},function(t,e,i){\"use strict\";i(53),i(105)},function(t,e,i){function n(t,e){function i(t,e){var i=n.getAxis(t);return i.toGlobalCoord(i.dataToCoord(0))}var n=t.coordinateSystem,r=e.axis,o={},a=r.position,s=r.onZero?\"onZero\":a,l=r.dim,u=n.getRect(),h=[u.x,u.x+u.width,u.y,u.y+u.height],c=e.get(\"offset\")||0,d={x:{top:h[2]-c,bottom:h[3]+c},y:{left:h[0]-c,right:h[1]+c}};d.x.onZero=Math.max(Math.min(i(\"y\"),d.x.bottom),d.x.top),d.y.onZero=Math.max(Math.min(i(\"x\"),d.y.right),d.y.left),o.position=[\"y\"===l?d.y[s]:h[0],\"x\"===l?d.x[s]:h[3]],o.rotation=Math.PI/2*(\"x\"===l?0:1);var f={top:-1,bottom:1,left:-1,right:1};o.labelDirection=o.tickDirection=o.nameDirection=f[a],r.onZero&&(o.labelOffset=d[l][a]-d[l].onZero),e.getModel(\"axisTick\").get(\"inside\")&&(o.tickDirection=-o.tickDirection),e.getModel(\"axisLabel\").get(\"inside\")&&(o.labelDirection=-o.labelDirection);var p=e.getModel(\"axisLabel\").get(\"rotate\");return o.labelRotation=\"top\"===s?-p:p,o.labelInterval=r.getLabelInterval(),o.z2=1,o}var r=i(1),o=i(3),a=i(50),s=a.ifIgnoreOnTick,l=a.getInterval,u=[\"axisLine\",\"axisLabel\",\"axisTick\",\"axisName\"],h=[\"splitArea\",\"splitLine\"],c=i(2).extendComponentView({type:\"axis\",render:function(t,e){this.group.removeAll();var i=this._axisGroup;if(this._axisGroup=new o.Group,this.group.add(this._axisGroup),t.get(\"show\")){var s=t.findGridModel(),l=n(s,t),c=new a(t,l);r.each(u,c.add,c),this._axisGroup.add(c.getGroup()),r.each(h,function(e){t.get(e+\".show\")&&this[\"_\"+e](t,s,l.labelInterval)},this),o.groupTransition(i,this._axisGroup,t)}},_splitLine:function(t,e,i){var n=t.axis,a=t.getModel(\"splitLine\"),u=a.getModel(\"lineStyle\"),h=u.get(\"color\"),c=l(a,i);h=r.isArray(h)?h:[h];for(var d=e.coordinateSystem.getRect(),f=n.isHorizontal(),p=0,g=n.getTicksCoords(),v=n.scale.getTicks(),m=[],y=[],x=u.getLineStyle(),_=0;_<g.length;_++)if(!s(n,_,c)){var b=n.toGlobalCoord(g[_]);f?(m[0]=b,m[1]=d.y,y[0]=b,y[1]=d.y+d.height):(m[0]=d.x,m[1]=b,y[0]=d.x+d.width,y[1]=b);var w=p++%h.length;this._axisGroup.add(new o.Line(o.subPixelOptimizeLine({anid:\"line_\"+v[_],shape:{x1:m[0],y1:m[1],x2:y[0],y2:y[1]},style:r.defaults({stroke:h[w]},x),silent:!0})))}},_splitArea:function(t,e,i){var n=t.axis,a=t.getModel(\"splitArea\"),u=a.getModel(\"areaStyle\"),h=u.get(\"color\"),c=e.coordinateSystem.getRect(),d=n.getTicksCoords(),f=n.scale.getTicks(),p=n.toGlobalCoord(d[0]),g=n.toGlobalCoord(d[0]),v=0,m=l(a,i),y=u.getAreaStyle();h=r.isArray(h)?h:[h];for(var x=1;x<d.length;x++)if(!s(n,x,m)){var _,b,w,S,M=n.toGlobalCoord(d[x]);n.isHorizontal()?(_=p,b=c.y,w=M-_,S=c.height):(_=c.x,b=g,w=c.width,S=M-b);var T=v++%h.length;this._axisGroup.add(new o.Rect({anid:\"area_\"+f[x],shape:{x:_,y:b,width:w,height:S},style:r.defaults({fill:h[T]},y),silent:!0})),p=_+w,g=b+S}}});c.extend({type:\"xAxis\"}),c.extend({type:\"yAxis\"})},function(t,e,i){var n=i(1),r=i(108),o=i(2);o.registerAction(\"dataZoom\",function(t,e){var i=r.createLinkedNodesFinder(n.bind(e.eachComponent,e,\"dataZoom\"),r.eachAxisDim,function(t,e){return t.get(e.axisIndex)}),o=[];e.eachComponent({mainType:\"dataZoom\",query:t},function(t,e){o.push.apply(o,i(t).nodes)}),n.each(o,function(e,i){e.setRawRange({start:t.start,end:t.end,startValue:t.startValue,endValue:t.endValue})})})},function(t,e,i){function n(t,e,i){i.getAxisProxy(t.name,e).reset(i)}function r(t,e,i){i.getAxisProxy(t.name,e).filterData(i)}var o=i(2);o.registerProcessor(function(t,e){t.eachComponent(\"dataZoom\",function(t){t.eachTargetAxis(n),t.eachTargetAxis(r)}),t.eachComponent(\"dataZoom\",function(t){var e=t.findRepresentativeAxisProxy(),i=e.getDataPercentWindow(),n=e.getDataValueWindow();t.setRawRange({start:i[0],end:i[1],startValue:n[0],endValue:n[1]})})})},function(t,e,i){var n=i(8),r=i(1),o={},a=[\"x\",\"y\",\"z\",\"radius\",\"angle\"];o.createNameEach=function(t,e){t=t.slice();var i=r.map(t,n.capitalFirst);e=(e||[]).slice();var o=r.map(e,n.capitalFirst);return function(n,a){r.each(t,function(t,r){for(var s={name:t,capital:i[r]},l=0;l<e.length;l++)s[e[l]]=t+o[l];n.call(a,s)})}},o.eachAxisDim=o.createNameEach(a,[\"axisIndex\",\"axis\",\"index\",\"id\"]),o.createLinkedNodesFinder=function(t,e,i){function n(t,e){return r.indexOf(e.nodes,t)>=0}function o(t,n){var o=!1;return e(function(e){r.each(i(t,e)||[],function(t){n.records[e.name][t]&&(o=!0)})}),o}function a(t,n){n.nodes.push(t),e(function(e){r.each(i(t,e)||[],function(t){n.records[e.name][t]=!0})})}return function(i){function r(t){!n(t,s)&&o(t,s)&&(a(t,s),l=!0)}var s={nodes:[],records:{}};if(e(function(t){s.records[t.name]={}}),!i)return s;a(i,s);var l;do l=!1,t(r);while(l);return s}},t.exports=o},function(t,e,i){function n(t){var e=t[a];return e||(e=t[a]=[{}]),e}var r=i(1),o=r.each,a=\"\\x00_ec_hist_store\",s={push:function(t,e){var i=n(t);o(e,function(e,n){for(var r=i.length-1;r>=0;r--){var o=i[r];if(o[n])break}if(0>r){var a=t.queryComponents({mainType:\"dataZoom\",subType:\"select\",id:n})[0];if(a){var s=a.getPercentRange();i[0][n]={dataZoomId:n,start:s[0],end:s[1]}}}}),i.push(e)},pop:function(t){var e=n(t),i=e[e.length-1];e.length>1&&e.pop();var r={};return o(i,function(t,i){for(var n=e.length-1;n>=0;n--){var t=e[n][i];if(t){r[i]=t;break}}}),r},clear:function(t){t[a]=null},count:function(t){return n(t).length}};t.exports=s},function(t,e,i){i(10).registerSubTypeDefaulter(\"dataZoom\",function(t){return\"slider\"})},function(t,e,i){function n(t){N.call(this),this._zr=t,this.group=new B.Group,this._brushType,this._brushOption,this._panels,this._track=[],this._dragging,this._covers=[],this._creatingCover,this._creatingPanel,this._enableGlobalPan,this._uid=\"brushController_\"+et++,this._handlers={},W(it,function(t,e){this._handlers[e]=V.bind(t,this)},this)}function r(t,e){var i=t._zr;t._enableGlobalPan||G.take(i,Q,t._uid),W(t._handlers,function(t,e){i.on(e,t)}),t._brushType=e.brushType,t._brushOption=V.merge(V.clone(tt),e,!0)}function o(t){var e=t._zr;G.release(e,Q,t._uid),W(t._handlers,function(t,i){e.off(i,t)}),t._brushType=t._brushOption=null}function a(t,e){var i=nt[e.brushType].createCover(t,e);return u(i),i.__brushOption=e,t.group.add(i),i}function s(t,e){var i=c(e);return i.endCreating&&(i.endCreating(t,e),u(e)),e}function l(t,e){var i=e.__brushOption;c(e).updateCoverShape(t,e,i.range,i)}function u(t){t.traverse(function(t){t.z=X,t.z2=X})}function h(t,e){c(e).updateCommon(t,e),l(t,e)}function c(t){return nt[t.__brushOption.brushType]}function d(t,e,i){var n=t._panels;if(!n)return!0;var r;return W(n,function(t){t.contain(e,i)&&(r=t)}),r}function f(t,e){var i=t._panels;if(!i)return!0;var n=e.__brushOption.panelId;return null!=n?i[n]:!0}function p(t){var e=t._covers,i=e.length;return W(e,function(e){t.group.remove(e)},t),e.length=0,!!i}function g(t,e){var i=Z(t._covers,function(t){var e=t.__brushOption,i=V.clone(e.range);return{brushType:e.brushType,panelId:e.panelId,range:i}});t.trigger(\"brush\",i,{isEnd:!!e.isEnd,removeOnClick:!!e.removeOnClick})}function v(t){var e=t._track;if(!e.length)return!1;var i=e[e.length-1],n=e[0],r=i[0]-n[0],o=i[1]-n[1],a=U(r*r+o*o,.5);return a>Y}function m(t){var e=t.length-1;return 0>e&&(e=0),[t[0],t[e]]}function y(t,e,i,n){var r=new B.Group;return r.add(new B.Rect({name:\"main\",style:w(i),silent:!0,draggable:!0,cursor:\"move\",drift:H(t,e,r,\"nswe\"),ondragend:H(g,e,{isEnd:!0})})),W(n,function(i){r.add(new B.Rect({name:i,style:{opacity:0},draggable:!0,silent:!0,invisible:!0,drift:H(t,e,r,i),ondragend:H(g,e,{isEnd:!0})}))}),r}function x(t,e,i,n){var r=n.brushStyle.lineWidth||0,o=j(r,$),a=i[0][0],s=i[1][0],l=a-r/2,u=s-r/2,h=i[0][1],c=i[1][1],d=h-o+r/2,f=c-o+r/2,p=h-a,g=c-s,v=p+r,m=g+r;b(t,e,\"main\",a,s,p,g),n.transformable&&(b(t,e,\"w\",l,u,o,m),b(t,e,\"e\",d,u,o,m),b(t,e,\"n\",l,u,v,o),b(t,e,\"s\",l,f,v,o),b(t,e,\"nw\",l,u,o,o),b(t,e,\"ne\",d,u,o,o),b(t,e,\"sw\",l,f,o,o),b(t,e,\"se\",d,f,o,o))}function _(t,e){var i=e.__brushOption,n=i.transformable,r=e.childAt(0);r.useStyle(w(i)),r.attr({silent:!n,cursor:n?\"move\":\"default\"}),W([\"w\",\"e\",\"n\",\"s\",\"se\",\"sw\",\"ne\",\"nw\"],function(i){var r=e.childOfName(i),o=T(t,i);r&&r.attr({silent:!n,invisible:!n,cursor:n?J[o]+\"-resize\":null})})}function b(t,e,i,n,r,o,a){var s=e.childOfName(i);s&&s.setShape(D(C(t,e,[[n,r],[n+o,r+a]])))}function w(t){return V.defaults({strokeNoScale:!0},t.brushStyle)}function S(t,e,i,n){var r=[q(t,i),q(e,n)],o=[j(t,i),j(e,n)];return[[r[0],o[0]],[r[1],o[1]]]}function M(t){return B.getTransform(t.group)}function T(t,e){if(e.length>1){e=e.split(\"\");var i=[T(t,e[0]),T(t,e[1])];return(\"e\"===i[0]||\"w\"===i[0])&&i.reverse(),i.join(\"\")}var n={w:\"left\",e:\"right\",n:\"top\",s:\"bottom\"},r={left:\"w\",right:\"e\",top:\"n\",bottom:\"s\"},i=B.transformDirection(n[e],M(t));return r[i]}function A(t,e,i,n,r,o,a,s){var l=n.__brushOption,u=t(l.range),c=L(i,o,a);W(r.split(\"\"),function(t){var e=K[t];u[e[0]][e[1]]+=c[e[0]]}),l.range=e(S(u[0][0],u[1][0],u[0][1],u[1][1])),h(i,n),g(i,{isEnd:!1})}function I(t,e,i,n,r){var o=e.__brushOption.range,a=L(t,i,n);W(o,function(t){t[0]+=a[0],t[1]+=a[1]}),h(t,e),g(t,{isEnd:!1})}function L(t,e,i){var n=t.group,r=n.transformCoordToLocal(e,i),o=n.transformCoordToLocal(0,0);return[r[0]-o[0],r[1]-o[1]]}function C(t,e,i){var n=f(t,e);if(n===!0)return V.clone(i);var r=n.getBoundingRect();return V.map(i,function(t){var e=t[0];e=j(e,r.x),e=q(e,r.x+r.width);var i=t[1];return i=j(i,r.y),i=q(i,r.y+r.height),[e,i]})}function D(t){var e=q(t[0][0],t[1][0]),i=q(t[0][1],t[1][1]),n=j(t[0][0],t[1][0]),r=j(t[0][1],t[1][1]);return{x:e,y:i,width:n-e,height:r-i}}function P(t,e){var i=e.offsetX,n=e.offsetY,r=t._zr;if(t._brushType){for(var o,a=t._panels,s=t._covers,l=0;l<s.length;l++)if(nt[s[l].__brushOption.brushType].contain(s[l],i,n)){o=!0;break}o||(a?W(a,function(t){t.contain(i,n)&&r.setCursorStyle(\"crosshair\")}):r.setCursorStyle(\"crosshair\"))}}function k(t){var e=t.event;e.preventDefault&&e.preventDefault()}function z(t,e,i){return t.childOfName(\"main\").contain(e,i)}function O(t,e,i){var n,r=e.offsetX,o=e.offsetY,u=t._creatingCover,h=t._creatingPanel,c=t._brushOption;if(t._track.push(t.group.transformCoordToLocal(r,o)),v(t)||u){if(h&&!u){\"single\"===c.brushMode&&p(t);var f=V.clone(c);f.panelId=h===!0?null:h.__brushPanelId,u=t._creatingCover=a(t,f),t._covers.push(u)}if(u){var g=nt[t._brushType],m=u.__brushOption;m.range=g.getCreatingRange(C(t,u,t._track)),i&&(s(t,u),g.updateCommon(t,u)),l(t,u),n={isEnd:i}}}else i&&\"single\"===c.brushMode&&c.removeOnClick&&d(t,r,o)&&p(t)&&(n={isEnd:i,removeOnClick:!0});return n}function E(t){if(this._dragging){k(t);var e=O(this,t,!0);this._dragging=!1,this._track=[],this._creatingCover=null,e&&g(this,e)}}function R(t){return{createCover:function(e,i){return y(H(A,function(e){var i=[e,[0,100]];return t&&i.reverse(),i},function(e){return e[t]}),e,i,[[\"w\",\"e\"],[\"n\",\"s\"]][t])},getCreatingRange:function(e){var i=m(e),n=q(i[0][t],i[1][t]),r=j(i[0][t],i[1][t]);return[n,r]},updateCoverShape:function(e,i,n,r){var o,a=r.brushStyle.width;if(null==a){var s=f(e,i),l=0;if(s!==!0){var u=s.getBoundingRect();a=t?u.width:u.height,l=t?u.x:u.y}o=[l,l+(a||0)]}else o=[-a/2,a/2];var h=[n,o];t&&h.reverse(),x(e,i,h,r)},updateCommon:_,contain:z}}var N=i(20),V=i(1),B=i(3),G=i(113),F=i(45),H=V.curry,W=V.each,Z=V.map,q=Math.min,j=Math.max,U=Math.pow,X=1e4,Y=6,$=6,Q=\"globalPan\",K={w:[0,0],e:[0,1],n:[1,0],s:[1,1]},J={w:\"ew\",e:\"ew\",n:\"ns\",s:\"ns\",ne:\"nesw\",sw:\"nesw\",nw:\"nwse\",se:\"nwse\"},tt={brushStyle:{lineWidth:2,stroke:\"rgba(0,0,0,0.3)\",fill:\"rgba(0,0,0,0.1)\"},transformable:!0,brushMode:\"single\",removeOnClick:!1},et=0;n.prototype={constructor:n,enableBrush:function(t){return this._brushType&&o(this),t.brushType&&r(this,t),this},setPanels:function(t){var e=this._panels||{},i=this._panels=t&&t.length&&{},n=this.group;return i&&W(t,function(t){var r=t.panelId,o=e[r];o||(o=new B.Rect({silent:!0,invisible:!0}),n.add(o)),o.attr(\"shape\",t.rect),o.__brushPanelId=r,i[r]=o,e[r]=null}),W(e,function(t){t&&n.remove(t)}),this},mount:function(t){t=t||{},this._enableGlobalPan=t.enableGlobalPan;var e=this.group;return this._zr.add(e),e.attr({position:t.position||[0,0],rotation:t.rotation||0,scale:t.scale||[1,1]}),this},eachCover:function(t,e){W(this._covers,t,e)},updateCovers:function(t){function e(t,e){return(null!=t.id?t.id:o+e)+\"-\"+t.brushType}function i(t,i){return e(t.__brushOption,i)}function n(e,i){var n=t[e];if(null!=i&&l[i]===d)u[e]=l[i];else{var r=u[e]=null!=i?(l[i].__brushOption=n,l[i]):s(c,a(c,n));h(c,r)}}function r(t){l[t]!==d&&c.group.remove(l[t])}t=V.map(t,function(t){return V.merge(V.clone(tt),t,!0)});var o=\"\\x00-brush-index-\",l=this._covers,u=this._covers=[],c=this,d=this._creatingCover;return new F(l,t,i,e).add(n).update(n).remove(r).execute(),this},unmount:function(){return this.enableBrush(!1),p(this),this._zr.remove(this.group),this},dispose:function(){this.unmount(),this.off()}},V.mixin(n,N);var it={mousedown:function(t){if(this._dragging)E.call(this,t);else if(!t.target||!t.target.draggable){k(t);var e=t.offsetX,i=t.offsetY;this._creatingCover=null;var n=this._creatingPanel=d(this,e,i);n&&(this._dragging=!0,this._track=[this.group.transformCoordToLocal(e,i)])}},mousemove:function(t){if(P(this,t),this._dragging){k(t);var e=O(this,t,!1);e&&g(this,e)}},mouseup:E},nt={lineX:R(0),lineY:R(1),rect:{createCover:function(t,e){return y(H(A,function(t){return t},function(t){return t}),t,e,[\"w\",\"e\",\"n\",\"s\",\"se\",\"sw\",\"ne\",\"nw\"])},getCreatingRange:function(t){var e=m(t);return S(e[1][0],e[1][1],e[0][0],e[0][1])},updateCoverShape:function(t,e,i,n){x(t,e,i,n)},updateCommon:_,contain:z},polygon:{createCover:function(t,e){var i=new B.Group;return i.add(new B.Polyline({name:\"main\",style:w(e),silent:!0})),i},getCreatingRange:function(t){return t},endCreating:function(t,e){e.remove(e.childAt(0)),e.add(new B.Polygon({name:\"main\",draggable:!0,drift:H(I,t,e),ondragend:H(g,t,{isEnd:!0})}))},updateCoverShape:function(t,e,i,n){e.childAt(0).setShape({points:C(t,e,i)})},updateCommon:_,contain:z}};t.exports=n},function(t,e,i){function n(t){return t[0]>t[1]&&t.reverse(),t}function r(t,e){for(var i=!0,n=0;n<h.length;n++){var r=h[n]+\"Index\";if(t[r]>=0){i=!1;for(var o=0;o<e.length;o++)if(e[o][r]===t[r])return e[o]}}return i}function o(t,e,i,r){var o=i.coordSys.getAxis(t);return n(a.map([0,1],function(t){return e?o.coordToData(o.toLocalCoord(r[t])):o.toGlobalCoord(o.dataToCoord(r[t]))}))}var a=i(1),s=i(3),l=a.each,u={},h=[\"geo\",\"xAxis\",\"yAxis\"],c=\"--\",d=[\"dataToPoint\",\"pointToData\"];u.parseOutputRanges=function(t,e,i,n){l(t,function(t,i){var o=t.panelId;if(o){o=o.split(c),t[o[0]+\"Index\"]=+o[1];var a=r(t,e);t.coordRange=f[t.brushType](1,a,t.range),n&&(n[i]=a)}})},u.parseInputRanges=function(t,e){l(t.areas,function(e){var i=r(e,t.coordInfoList);e.range=e.range||[],i&&i!==!0&&(e.range=f[e.brushType](0,i,e.coordRange),e.panelId=i.panelId)})},u.makePanelOpts=function(t){var e=[];return l(t,function(t){var i,n=t.coordSys;t.geoIndex>=0?(i=n.getBoundingRect().clone(),i.applyTransform(s.getTransform(n))):i=n.grid.getRect().clone(),e.push({panelId:t.panelId,rect:i})}),e},u.makeCoordInfoList=function(t,e){var i=[];return l(h,function(n){var r=t[n+\"Index\"];null!=r&&\"none\"!==r&&(\"all\"===r||a.isArray(r)||(r=[r]),e.eachComponent({mainType:n},function(t,e){if(!(\"all\"!==r&&a.indexOf(r,e)<0)){var o,s;\"xAxis\"===n||\"yAxis\"===n?o=t.axis.grid:s=t.coordinateSystem;for(var l,u=0,h=i.length;h>u;u++){var d=i[u];if(\"yAxis\"===n&&!d.yAxis&&d.xAxis){var f=o.getCartesian(d.xAxisIndex,e);if(f){s=f,l=d;break}}}!l&&i.push(l={}),l[n]=t,l[n+\"Index\"]=e,l.panelId=n+c+e,l.coordSys=s||o.getCartesian(l.xAxisIndex,l.yAxisIndex),l.coordSys?i[n+\"Has\"]=!0:i.pop()}}))}),i},u.controlSeries=function(t,e,i){var n=r(t,e.coordInfoList);return n===!0||n&&n.coordSys===i.coordinateSystem};var f={lineX:a.curry(o,\"x\"),lineY:a.curry(o,\"y\"),rect:function(t,e,i){var r=e.coordSys,o=r[d[t]]([i[0][0],i[1][0]]),a=r[d[t]]([i[0][1],i[1][1]]);return[n([o[0],a[0]]),n([o[1],a[1]])]},polygon:function(t,e,i){var n=e.coordSys;return a.map(i,n[d[t]],n)}};t.exports=u},function(t,e,i){function n(t){return t[r]||(t[r]={})}var r=\"\\x00_ec_interaction_mutex\",o={take:function(t,e,i){var r=n(t);r[e]=i},release:function(t,e,i){var r=n(t),o=r[e];o===i&&(r[e]=null)},isTaken:function(t,e){return!!n(t)[e]}};i(2).registerAction({type:\"takeGlobalCursor\",event:\"globalCursorTaken\",update:\"update\"},function(){}),t.exports=o},function(t,e,i){function n(t,e,i){r.positionGroup(t,e.getBoxLayoutParams(),{width:i.getWidth(),height:i.getHeight()},e.get(\"padding\"))}var r=i(13),o=i(8),a=i(3);t.exports={layout:function(t,e,i){var o=r.getLayoutRect(e.getBoxLayoutParams(),{width:i.getWidth(),height:i.getHeight()},e.get(\"padding\"));r.box(e.get(\"orient\"),t,e.get(\"itemGap\"),o.width,o.height),n(t,e,i)},addBackground:function(t,e){var i=o.normalizeCssArray(e.get(\"padding\")),n=t.getBoundingRect(),r=e.getItemStyle([\"color\",\"opacity\"]);r.fill=e.get(\"backgroundColor\");var s=new a.Rect({shape:{x:n.x-i[3],y:n.y-i[0],width:n.width+i[1]+i[3],height:n.height+i[0]+i[2]},style:r,silent:!0,z2:-1});a.subPixelOptimizeRect(s),t.add(s)}}},function(t,e,i){var n=i(1),r=i(42),o=i(119),a=function(t,e,i,n,o){r.call(this,t,e,i),this.type=n||\"value\",this.position=o||\"bottom\"};a.prototype={constructor:a,index:0,onZero:!1,model:null,isHorizontal:function(){var t=this.position;return\"top\"===t||\"bottom\"===t},getGlobalExtent:function(){var t=this.getExtent();return t[0]=this.toGlobalCoord(t[0]),t[1]=this.toGlobalCoord(t[1]),t},getLabelInterval:function(){var t=this._labelInterval;return t||(t=this._labelInterval=o(this)),t},isLabelIgnored:function(t){if(\"category\"===this.type){var e=this.getLabelInterval();return\"function\"==typeof e&&!e(t,this.scale.getLabel(t))||t%(e+1)}},toLocalCoord:null,toGlobalCoord:null},n.inherits(a,r),t.exports=a},function(t,e,i){\"use strict\";function n(t){return this._axes[t]}var r=i(1),o=function(t){this._axes={},this._dimList=[],this.name=t||\"\"};o.prototype={constructor:o,type:\"cartesian\",getAxis:function(t){return this._axes[t]},getAxes:function(){return r.map(this._dimList,n,this)},getAxesByScale:function(t){return t=t.toLowerCase(),r.filter(this.getAxes(),function(e){return e.scale.type===t})},addAxis:function(t){var e=t.dim;this._axes[e]=t,this._dimList.push(e)},dataToCoord:function(t){return this._dataCoordConvert(t,\"dataToCoord\")},coordToData:function(t){return this._dataCoordConvert(t,\"coordToData\")},_dataCoordConvert:function(t,e){for(var i=this._dimList,n=t instanceof Array?[]:{},r=0;r<i.length;r++){var o=i[r],a=this._axes[o];n[o]=a[e](t[o])}return n}},t.exports=o},function(t,e,i){\"use strict\";function n(t){o.call(this,t)}var r=i(1),o=i(116);n.prototype={constructor:n,type:\"cartesian2d\",dimensions:[\"x\",\"y\"],getBaseAxis:function(){return this.getAxesByScale(\"ordinal\")[0]||this.getAxesByScale(\"time\")[0]||this.getAxis(\"x\")},containPoint:function(t){var e=this.getAxis(\"x\"),i=this.getAxis(\"y\");return e.contain(e.toLocalCoord(t[0]))&&i.contain(i.toLocalCoord(t[1]))},containData:function(t){return this.getAxis(\"x\").containData(t[0])&&this.getAxis(\"y\").containData(t[1])},dataToPoints:function(t,e){return t.mapArray([\"x\",\"y\"],function(t,e){return this.dataToPoint([t,e])},e,this)},dataToPoint:function(t,e){var i=this.getAxis(\"x\"),n=this.getAxis(\"y\");return[i.toGlobalCoord(i.dataToCoord(t[0],e)),n.toGlobalCoord(n.dataToCoord(t[1],e))]},pointToData:function(t,e){var i=this.getAxis(\"x\"),n=this.getAxis(\"y\");return[i.coordToData(i.toLocalCoord(t[0]),e),n.coordToData(n.toLocalCoord(t[1]),e)]},getOtherAxis:function(t){return this.getAxis(\"x\"===t.dim?\"y\":\"x\")}},r.inherits(n,o),t.exports=n},function(t,e,i){\"use strict\";i(53);var n=i(10);t.exports=n.extend({type:\"grid\",dependencies:[\"xAxis\",\"yAxis\"],layoutMode:\"box\",coordinateSystem:null,defaultOption:{show:!1,zlevel:0,z:0,left:\"10%\",top:60,right:\"10%\",bottom:60,containLabel:!1,backgroundColor:\"rgba(0,0,0,0)\",borderWidth:1,borderColor:\"#ccc\"}})},function(t,e,i){\"use strict\";var n=i(1),r=i(22);t.exports=function(t){var e=t.model,i=e.getModel(\"axisLabel\"),o=i.get(\"interval\");return\"category\"!==t.type||\"auto\"!==o?\"auto\"===o?0:o:r.getAxisLabelInterval(n.map(t.scale.getTicks(),t.dataToCoord,t),e.getFormattedLabels(),i.getModel(\"textStyle\").getFont(),t.isHorizontal())}},function(t,e,i){\"use strict\";function n(t){return t.get(\"stack\")||\"__ec_stack_\"+t.seriesIndex}function r(t){return t.dim+t.index}function o(t,e){var i={};s.each(t,function(t,e){var o=t.getData(),a=t.coordinateSystem,s=a.getBaseAxis(),l=s.getExtent(),h=\"category\"===s.type?s.getBandWidth():Math.abs(l[1]-l[0])/o.count(),c=i[r(s)]||{bandWidth:h,remainedWidth:h,autoWidthCount:0,categoryGap:\"20%\",gap:\"30%\",stacks:{}},d=c.stacks;i[r(s)]=c;var f=n(t);d[f]||c.autoWidthCount++,d[f]=d[f]||{width:0,maxWidth:0};var p=u(t.get(\"barWidth\"),h),g=u(t.get(\"barMaxWidth\"),h),v=t.get(\"barGap\"),m=t.get(\"barCategoryGap\");p&&!d[f].width&&(p=Math.min(c.remainedWidth,p),d[f].width=p,c.remainedWidth-=p),g&&(d[f].maxWidth=g),null!=v&&(c.gap=v),null!=m&&(c.categoryGap=m)});var o={};return s.each(i,function(t,e){o[e]={};var i=t.stacks,n=t.bandWidth,r=u(t.categoryGap,n),a=u(t.gap,1),l=t.remainedWidth,h=t.autoWidthCount,c=(l-r)/(h+(h-1)*a);c=Math.max(c,0),s.each(i,function(t,e){var i=t.maxWidth;!t.width&&i&&c>i&&(i=Math.min(i,l),l-=i,t.width=i,h--)}),c=(l-r)/(h+(h-1)*a),c=Math.max(c,0);var d,f=0;s.each(i,function(t,e){t.width||(t.width=c),d=t,f+=t.width*(1+a)}),d&&(f-=d.width*a);var p=-f/2;s.each(i,function(t,i){o[e][i]=o[e][i]||{offset:p,width:t.width},p+=t.width*(1+a)})}),o}function a(t,e,i){var a=o(s.filter(e.getSeriesByType(t),function(t){return!e.isSeriesFiltered(t)&&t.coordinateSystem&&\"cartesian2d\"===t.coordinateSystem.type})),l={};e.eachSeriesByType(t,function(t){var e=t.getData(),i=t.coordinateSystem,o=i.getBaseAxis(),s=n(t),u=a[r(o)][s],h=u.offset,c=u.width,d=i.getOtherAxis(o),f=t.get(\"barMinHeight\")||0,p=o.onZero?d.toGlobalCoord(d.dataToCoord(0)):d.getGlobalExtent()[0],g=i.dataToPoints(e,!0);l[s]=l[s]||[],e.setLayout({offset:h,size:c}),e.each(d.dim,function(t,i){if(!isNaN(t)){l[s][i]||(l[s][i]={p:p,n:p});var n,r,o,a,u=t>=0?\"p\":\"n\",v=g[i],m=l[s][i][u];d.isHorizontal()?(n=m,r=v[1]+h,o=v[0]-m,a=c,Math.abs(o)<f&&(o=(0>o?-1:1)*f),l[s][i][u]+=o):(n=v[0]+h,r=m,o=c,a=v[1]-m,Math.abs(a)<f&&(a=(0>=a?-1:1)*f),l[s][i][u]+=a),e.setItemLayout(i,{x:n,y:r,width:o,height:a})}},!0)},this)}var s=i(1),l=i(4),u=l.parsePercent;t.exports=a},function(t,e,i){var n=i(3),r=i(1),o=Math.PI;t.exports=function(t,e){e=e||{},r.defaults(e,{text:\"loading\",color:\"#c23531\",textColor:\"#000\",maskColor:\"rgba(255, 255, 255, 0.8)\",zlevel:0});var i=new n.Rect({style:{fill:e.maskColor},zlevel:e.zlevel,z:1e4}),a=new n.Arc({shape:{startAngle:-o/2,endAngle:-o/2+.1,r:10},style:{stroke:e.color,lineCap:\"round\",lineWidth:5},zlevel:e.zlevel,z:10001}),s=new n.Rect({style:{fill:\"none\",text:e.text,textPosition:\"right\",textDistance:10,textFill:e.textColor},zlevel:e.zlevel,z:10001});a.animateShape(!0).when(1e3,{endAngle:3*o/2}).start(\"circularInOut\"),a.animateShape(!0).when(1e3,{startAngle:3*o/2}).delay(300).start(\"circularInOut\");var l=new n.Group;return l.add(a),l.add(s),l.add(i),l.resize=function(){var e=t.getWidth()/2,n=t.getHeight()/2;a.setShape({cx:e,cy:n});var r=a.shape.r;s.setShape({x:e-r,y:n-r,width:2*r,height:2*r}),i.setShape({x:0,y:0,width:t.getWidth(),height:t.getHeight()})},l.resize(),l}},function(t,e,i){function n(t,e){for(var i in e)_.hasClass(i)||(\"object\"==typeof e[i]?t[i]=t[i]?c.merge(t[i],e[i],!1):c.clone(e[i]):null==t[i]&&(t[i]=e[i]))}function r(t){t=t,this.option={},this.option[w]=1,this._componentsMap={},this._seriesIndices=null,n(t,this._theme.option),c.merge(t,b,!1),this.mergeOption(t)}function o(t,e){c.isArray(e)||(e=e?[e]:[]);var i={};return p(e,function(e){i[e]=(t[e]||[]).slice()}),i}function a(t,e){var i={};p(e,function(t,e){var n=t.exist;n&&(i[n.id]=t)}),p(e,function(e,n){var r=e.option;if(c.assert(!r||null==r.id||!i[r.id]||i[r.id]===e,\"id duplicates: \"+(r&&r.id)),r&&null!=r.id&&(i[r.id]=e),x(r)){var o=s(t,r,e.exist);e.keyInfo={mainType:t,subType:o}}}),p(e,function(t,e){var n=t.exist,r=t.option,o=t.keyInfo;if(x(r)){if(o.name=null!=r.name?r.name+\"\":n?n.name:\"\\x00-\",n)o.id=n.id;else if(null!=r.id)o.id=r.id+\"\";else{var a=0;do o.id=\"\\x00\"+o.name+\"\\x00\"+a++;while(i[o.id])}i[o.id]=t}})}function s(t,e,i){var n=e.type?e.type:i?i.subType:_.determineSubType(t,e);return n}function l(t){return v(t,function(t){return t.componentIndex})||[]}function u(t,e){return e.hasOwnProperty(\"subType\")?g(t,function(t){return t.subType===e.subType}):t}function h(t){}var c=i(1),d=i(11),f=i(9),p=c.each,g=c.filter,v=c.map,m=c.isArray,y=c.indexOf,x=c.isObject,_=i(10),b=i(124),w=\"\\x00_ec_inner\",S=f.extend({constructor:S,init:function(t,e,i,n){i=i||{},this.option=null,this._theme=new f(i),this._optionManager=n},setOption:function(t,e){c.assert(!(w in t),\"please use chart.getOption()\"),this._optionManager.setOption(t,e),this.resetOption()},resetOption:function(t){var e=!1,i=this._optionManager;if(!t||\"recreate\"===t){var n=i.mountOption(\"recreate\"===t);this.option&&\"recreate\"!==t?(this.restoreData(),this.mergeOption(n)):r.call(this,n),e=!0}if(\"timeline\"!==t&&\"media\"!==t||this.restoreData(),!t||\"recreate\"===t||\"timeline\"===t){var o=i.getTimelineOption(this);o&&(this.mergeOption(o),e=!0)}if(!t||\"recreate\"===t||\"media\"===t){var a=i.getMediaOption(this,this._api);a.length&&p(a,function(t){this.mergeOption(t,e=!0)},this)}return e},mergeOption:function(t){function e(e,r){var s=d.normalizeToArray(t[e]),u=d.mappingToExists(n[e],s);a(e,u);var h=o(n,r);i[e]=[],n[e]=[],p(u,function(t,r){var o=t.exist,a=t.option;\nif(c.assert(x(a)||o,\"Empty component definition\"),a){var s=_.getClass(e,t.keyInfo.subType,!0);if(o&&o instanceof s)o.mergeOption(a,this),o.optionUpdated(a,!1);else{var l=c.extend({dependentModels:h,componentIndex:r},t.keyInfo);o=new s(a,this,this,l),o.init(a,this,this,l),o.optionUpdated(null,!0)}}else o.mergeOption({},this),o.optionUpdated({},!1);n[e][r]=o,i[e][r]=o.option},this),\"series\"===e&&(this._seriesIndices=l(n.series))}var i=this.option,n=this._componentsMap,r=[];p(t,function(t,e){null!=t&&(_.hasClass(e)?r.push(e):i[e]=null==i[e]?c.clone(t):c.merge(i[e],t,!0))}),_.topologicalTravel(r,_.getAllClassMainTypes(),e,this),this._seriesIndices=this._seriesIndices||[]},getOption:function(){var t=c.clone(this.option);return p(t,function(e,i){if(_.hasClass(i)){for(var e=d.normalizeToArray(e),n=e.length-1;n>=0;n--)d.isIdInner(e[n])&&e.splice(n,1);t[i]=e}}),delete t[w],t},getTheme:function(){return this._theme},getComponent:function(t,e){var i=this._componentsMap[t];return i?i[e||0]:void 0},queryComponents:function(t){var e=t.mainType;if(!e)return[];var i=t.index,n=t.id,r=t.name,o=this._componentsMap[e];if(!o||!o.length)return[];var a;if(null!=i)m(i)||(i=[i]),a=g(v(i,function(t){return o[t]}),function(t){return!!t});else if(null!=n){var s=m(n);a=g(o,function(t){return s&&y(n,t.id)>=0||!s&&t.id===n})}else if(null!=r){var l=m(r);a=g(o,function(t){return l&&y(r,t.name)>=0||!l&&t.name===r})}else a=o;return u(a,t)},findComponents:function(t){function e(t){var e=r+\"Index\",i=r+\"Id\",n=r+\"Name\";return t&&(t.hasOwnProperty(e)||t.hasOwnProperty(i)||t.hasOwnProperty(n))?{mainType:r,index:t[e],id:t[i],name:t[n]}:null}function i(e){return t.filter?g(e,t.filter):e}var n=t.query,r=t.mainType,o=e(n),a=o?this.queryComponents(o):this._componentsMap[r];return i(u(a,t))},eachComponent:function(t,e,i){var n=this._componentsMap;if(\"function\"==typeof t)i=e,e=t,p(n,function(t,n){p(t,function(t,r){e.call(i,n,t,r)})});else if(c.isString(t))p(n[t],e,i);else if(x(t)){var r=this.findComponents(t);p(r,e,i)}},getSeriesByName:function(t){var e=this._componentsMap.series;return g(e,function(e){return e.name===t})},getSeriesByIndex:function(t){return this._componentsMap.series[t]},getSeriesByType:function(t){var e=this._componentsMap.series;return g(e,function(e){return e.subType===t})},getSeries:function(){return this._componentsMap.series.slice()},eachSeries:function(t,e){h(this),p(this._seriesIndices,function(i){var n=this._componentsMap.series[i];t.call(e,n,i)},this)},eachRawSeries:function(t,e){p(this._componentsMap.series,t,e)},eachSeriesByType:function(t,e,i){h(this),p(this._seriesIndices,function(n){var r=this._componentsMap.series[n];r.subType===t&&e.call(i,r,n)},this)},eachRawSeriesByType:function(t,e,i){return p(this.getSeriesByType(t),e,i)},isSeriesFiltered:function(t){return h(this),c.indexOf(this._seriesIndices,t.componentIndex)<0},filterSeries:function(t,e){h(this);var i=g(this._componentsMap.series,t,e);this._seriesIndices=l(i)},restoreData:function(){var t=this._componentsMap;this._seriesIndices=l(t.series);var e=[];p(t,function(t,i){e.push(i)}),_.topologicalTravel(e,_.getAllClassMainTypes(),function(e,i){p(t[e],function(t){t.restoreData()})})}});c.mixin(S,i(56)),t.exports=S},function(t,e,i){function n(t){this._api=t,this._timelineOptions=[],this._mediaList=[],this._mediaDefault,this._currentMediaIndices=[],this._optionBackup,this._newBaseOption}function r(t,e,i){var n,r,o=[],a=[],s=t.timeline;if(t.baseOption&&(r=t.baseOption),(s||t.options)&&(r=r||{},o=(t.options||[]).slice()),t.media){r=r||{};var l=t.media;d(l,function(t){t&&t.option&&(t.query?a.push(t):n||(n=t))})}return r||(r=t),r.timeline||(r.timeline=s),d([r].concat(o).concat(u.map(a,function(t){return t.option})),function(t){d(e,function(e){e(t,i)})}),{baseOption:r,timelineOptions:o,mediaDefault:n,mediaList:a}}function o(t,e,i){var n={width:e,height:i,aspectratio:e/i},r=!0;return u.each(t,function(t,e){var i=e.match(v);if(i&&i[1]&&i[2]){var o=i[1],s=i[2].toLowerCase();a(n[s],t,o)||(r=!1)}}),r}function a(t,e,i){return\"min\"===i?t>=e:\"max\"===i?e>=t:t===e}function s(t,e){return t.join(\",\")===e.join(\",\")}function l(t,e){e=e||{},d(e,function(e,i){if(null!=e){var n=t[i];if(c.hasClass(i)){e=h.normalizeToArray(e),n=h.normalizeToArray(n);var r=h.mappingToExists(n,e);t[i]=p(r,function(t){return t.option&&t.exist?g(t.exist,t.option,!0):t.exist||t.option})}else t[i]=g(n,e,!0)}})}var u=i(1),h=i(11),c=i(10),d=u.each,f=u.clone,p=u.map,g=u.merge,v=/^(min|max)?(.+)$/;n.prototype={constructor:n,setOption:function(t,e){t=f(t,!0);var i=this._optionBackup,n=r.call(this,t,e,!i);this._newBaseOption=n.baseOption,i?(l(i.baseOption,n.baseOption),n.timelineOptions.length&&(i.timelineOptions=n.timelineOptions),n.mediaList.length&&(i.mediaList=n.mediaList),n.mediaDefault&&(i.mediaDefault=n.mediaDefault)):this._optionBackup=n},mountOption:function(t){var e=this._optionBackup;return this._timelineOptions=p(e.timelineOptions,f),this._mediaList=p(e.mediaList,f),this._mediaDefault=f(e.mediaDefault),this._currentMediaIndices=[],f(t?e.baseOption:this._newBaseOption)},getTimelineOption:function(t){var e,i=this._timelineOptions;if(i.length){var n=t.getComponent(\"timeline\");n&&(e=f(i[n.getCurrentIndex()],!0))}return e},getMediaOption:function(t){var e=this._api.getWidth(),i=this._api.getHeight(),n=this._mediaList,r=this._mediaDefault,a=[],l=[];if(!n.length&&!r)return l;for(var u=0,h=n.length;h>u;u++)o(n[u].query,e,i)&&a.push(u);return!a.length&&r&&(a=[-1]),a.length&&!s(a,this._currentMediaIndices)&&(l=p(a,function(t){return f(-1===t?r.option:n[t].option)})),this._currentMediaIndices=a,l}},t.exports=n},function(t,e){var i=\"\";\"undefined\"!=typeof navigator&&(i=navigator.platform||\"\"),t.exports={color:[\"#c23531\",\"#2f4554\",\"#61a0a8\",\"#d48265\",\"#91c7ae\",\"#749f83\",\"#ca8622\",\"#bda29a\",\"#6e7074\",\"#546570\",\"#c4ccd3\"],textStyle:{fontFamily:i.match(/^Win/)?\"Microsoft YaHei\":\"sans-serif\",fontSize:12,fontStyle:\"normal\",fontWeight:\"normal\"},blendMode:null,animation:!0,animationDuration:1e3,animationDurationUpdate:300,animationEasing:\"exponentialOut\",animationEasingUpdate:\"cubicOut\",animationThreshold:2e3,progressiveThreshold:3e3,progressive:400,hoverLayerThreshold:3e3}},function(t,e,i){t.exports={getAreaStyle:i(31)([[\"fill\",\"color\"],[\"shadowBlur\"],[\"shadowOffsetX\"],[\"shadowOffsetY\"],[\"opacity\"],[\"shadowColor\"]])}},function(t,e){t.exports={getBoxLayoutParams:function(){return{left:this.get(\"left\"),top:this.get(\"top\"),right:this.get(\"right\"),bottom:this.get(\"bottom\"),width:this.get(\"width\"),height:this.get(\"height\")}}}},function(t,e,i){var n=i(31)([[\"fill\",\"color\"],[\"stroke\",\"borderColor\"],[\"lineWidth\",\"borderWidth\"],[\"opacity\"],[\"shadowBlur\"],[\"shadowOffsetX\"],[\"shadowOffsetY\"],[\"shadowColor\"]]);t.exports={getItemStyle:function(t){var e=n.call(this,t),i=this.getBorderLineDash();return i&&(e.lineDash=i),e},getBorderLineDash:function(){var t=this.get(\"borderType\");return\"solid\"===t||null==t?null:\"dashed\"===t?[5,5]:[1,1]}}},function(t,e,i){var n=i(31)([[\"lineWidth\",\"width\"],[\"stroke\",\"color\"],[\"opacity\"],[\"shadowBlur\"],[\"shadowOffsetX\"],[\"shadowOffsetY\"],[\"shadowColor\"]]);t.exports={getLineStyle:function(t){var e=n.call(this,t),i=this.getLineDash();return i&&(e.lineDash=i),e},getLineDash:function(){var t=this.get(\"type\");return\"solid\"===t||null==t?null:\"dashed\"===t?[5,5]:[2,2]}}},function(t,e,i){function n(t,e){return t&&t.getShallow(e)}var r=i(16);t.exports={getTextColor:function(){var t=this.ecModel;return this.getShallow(\"color\")||t&&t.get(\"textStyle.color\")},getFont:function(){var t=this.ecModel,e=t&&t.getModel(\"textStyle\");return[this.getShallow(\"fontStyle\")||n(e,\"fontStyle\"),this.getShallow(\"fontWeight\")||n(e,\"fontWeight\"),(this.getShallow(\"fontSize\")||n(e,\"fontSize\")||12)+\"px\",this.getShallow(\"fontFamily\")||n(e,\"fontFamily\")||\"sans-serif\"].join(\" \")},getTextRect:function(t){var e=this.get(\"textStyle\")||{};return r.getBoundingRect(t,this.getFont(),e.align,e.baseline)},truncateText:function(t,e,i,n){return r.truncateText(t,e,this.getFont(),i,n)}}},function(t,e,i){function n(t,e){e=e.split(\",\");for(var i=t,n=0;n<e.length&&(i=i&&i[e[n]],null!=i);n++);return i}function r(t,e,i,n){e=e.split(\",\");for(var r,o=t,a=0;a<e.length-1;a++)r=e[a],null==o[r]&&(o[r]={}),o=o[r];(n||null==o[e[a]])&&(o[e[a]]=i)}function o(t){c(l,function(e){e[0]in t&&!(e[1]in t)&&(t[e[1]]=t[e[0]])})}var a=i(1),s=i(131),l=[[\"x\",\"left\"],[\"y\",\"top\"],[\"x2\",\"right\"],[\"y2\",\"bottom\"]],u=[\"grid\",\"geo\",\"parallel\",\"legend\",\"toolbox\",\"title\",\"visualMap\",\"dataZoom\",\"timeline\"],h=[\"bar\",\"boxplot\",\"candlestick\",\"chord\",\"effectScatter\",\"funnel\",\"gauge\",\"lines\",\"graph\",\"heatmap\",\"line\",\"map\",\"parallel\",\"pie\",\"radar\",\"sankey\",\"scatter\",\"treemap\"],c=a.each;t.exports=function(t){c(t.series,function(t){if(a.isObject(t)){var e=t.type;if(s(t),\"pie\"!==e&&\"gauge\"!==e||null!=t.clockWise&&(t.clockwise=t.clockWise),\"gauge\"===e){var i=n(t,\"pointer.color\");null!=i&&r(t,\"itemStyle.normal.color\",i)}for(var l=0;l<h.length;l++)if(h[l]===t.type){o(t);break}}}),t.dataRange&&(t.visualMap=t.dataRange),c(u,function(e){var i=t[e];i&&(a.isArray(i)||(i=[i]),c(i,function(t){o(t)}))})}},function(t,e,i){function n(t){var e=t&&t.itemStyle;e&&r.each(o,function(i){var n=e.normal,o=e.emphasis;n&&n[i]&&(t[i]=t[i]||{},t[i].normal?r.merge(t[i].normal,n[i]):t[i].normal=n[i],n[i]=null),o&&o[i]&&(t[i]=t[i]||{},t[i].emphasis?r.merge(t[i].emphasis,o[i]):t[i].emphasis=o[i],o[i]=null)})}var r=i(1),o=[\"areaStyle\",\"lineStyle\",\"nodeStyle\",\"linkStyle\",\"chordStyle\",\"label\",\"labelLine\"];t.exports=function(t){if(t){n(t),n(t.markPoint),n(t.markLine);var e=t.data;if(e){for(var i=0;i<e.length;i++)n(e[i]);var o=t.markPoint;if(o&&o.data)for(var a=o.data,i=0;i<a.length;i++)n(a[i]);var s=t.markLine;if(s&&s.data)for(var l=s.data,i=0;i<l.length;i++)r.isArray(l[i])?(n(l[i][0]),n(l[i][1])):n(l[i])}}}},function(t,e){var i={average:function(t){for(var e=0,i=0,n=0;n<t.length;n++)isNaN(t[n])||(e+=t[n],i++);return 0===i?NaN:e/i},sum:function(t){for(var e=0,i=0;i<t.length;i++)e+=t[i]||0;return e},max:function(t){for(var e=-(1/0),i=0;i<t.length;i++)t[i]>e&&(e=t[i]);return e},min:function(t){for(var e=1/0,i=0;i<t.length;i++)t[i]<e&&(e=t[i]);return e},nearest:function(t){return t[0]}},n=function(t,e){return Math.round(t.length/2)};t.exports=function(t,e,r){e.eachSeriesByType(t,function(t){var e=t.getData(),r=t.get(\"sampling\"),o=t.coordinateSystem;if(\"cartesian2d\"===o.type&&r){var a=o.getBaseAxis(),s=o.getOtherAxis(a),l=a.getExtent(),u=l[1]-l[0],h=Math.round(e.count()/u);if(h>1){var c;\"string\"==typeof r?c=i[r]:\"function\"==typeof r&&(c=r),c&&(e=e.downSample(s.dim,1/h,c,n),t.setData(e))}}},this)}},function(t,e,i){var n=i(1),r=i(32),o=i(4),a=i(38),s=r.prototype,l=a.prototype,u=Math.floor,h=Math.ceil,c=Math.pow,d=Math.log,f=r.extend({type:\"log\",base:10,getTicks:function(){return n.map(l.getTicks.call(this),function(t){return o.round(c(this.base,t))},this)},getLabel:l.getLabel,scale:function(t){return t=s.scale.call(this,t),c(this.base,t)},setExtent:function(t,e){var i=this.base;t=d(t)/d(i),e=d(e)/d(i),l.setExtent.call(this,t,e)},getExtent:function(){var t=this.base,e=s.getExtent.call(this);return e[0]=c(t,e[0]),e[1]=c(t,e[1]),e},unionExtent:function(t){var e=this.base;t[0]=d(t[0])/d(e),t[1]=d(t[1])/d(e),s.unionExtent.call(this,t)},niceTicks:function(t){t=t||10;var e=this._extent,i=e[1]-e[0];if(!(i===1/0||0>=i)){var n=o.quantity(i),r=t/i*n;for(.5>=r&&(n*=10);!isNaN(n)&&Math.abs(n)<1&&Math.abs(n)>0;)n*=10;var a=[o.round(h(e[0]/n)*n),o.round(u(e[1]/n)*n)];this._interval=n,this._niceExtent=a}},niceExtent:l.niceExtent});n.each([\"contain\",\"normalize\"],function(t){f.prototype[t]=function(e){return e=d(e)/d(this.base),s[t].call(this,e)}}),f.create=function(){return new f},t.exports=f},function(t,e,i){var n=i(1),r=i(32),o=r.prototype,a=r.extend({type:\"ordinal\",init:function(t,e){this._data=t,this._extent=e||[0,t.length-1]},parse:function(t){return\"string\"==typeof t?n.indexOf(this._data,t):Math.round(t)},contain:function(t){return t=this.parse(t),o.contain.call(this,t)&&null!=this._data[t]},normalize:function(t){return o.normalize.call(this,this.parse(t))},scale:function(t){return Math.round(o.scale.call(this,t))},getTicks:function(){for(var t=[],e=this._extent,i=e[0];i<=e[1];)t.push(i),i++;return t},getLabel:function(t){return this._data[t]},count:function(){return this._extent[1]-this._extent[0]+1},niceTicks:n.noop,niceExtent:n.noop});a.create=function(){return new a},t.exports=a},function(t,e,i){var n=i(1),r=i(4),o=i(8),a=i(38),s=a.prototype,l=Math.ceil,u=Math.floor,h=1e3,c=60*h,d=60*c,f=24*d,p=function(t,e,i,n){for(;n>i;){var r=i+n>>>1;t[r][2]<e?i=r+1:n=r}return i},g=a.extend({type:\"time\",getLabel:function(t){var e=this._stepLvl,i=new Date(t);return o.formatTime(e[0],i)},niceExtent:function(t,e,i){var n=this._extent;if(n[0]===n[1]&&(n[0]-=f,n[1]+=f),n[1]===-(1/0)&&n[0]===1/0){var o=new Date;n[1]=new Date(o.getFullYear(),o.getMonth(),o.getDate()),n[0]=n[1]-f}this.niceTicks(t);var a=this._interval;e||(n[0]=r.round(u(n[0]/a)*a)),i||(n[1]=r.round(l(n[1]/a)*a))},niceTicks:function(t){t=t||10;var e=this._extent,i=e[1]-e[0],n=i/t,o=v.length,a=p(v,n,0,o),s=v[Math.min(a,o-1)],h=s[2];if(\"year\"===s[0]){var c=i/h,d=r.nice(c/t,!0);h*=d}var f=[l(e[0]/h)*h,u(e[1]/h)*h];this._stepLvl=s,this._interval=h,this._niceExtent=f},parse:function(t){return+r.parseDate(t)}});n.each([\"contain\",\"normalize\"],function(t){g.prototype[t]=function(e){return s[t].call(this,this.parse(e))}});var v=[[\"hh:mm:ss\",1,h],[\"hh:mm:ss\",5,5*h],[\"hh:mm:ss\",10,10*h],[\"hh:mm:ss\",15,15*h],[\"hh:mm:ss\",30,30*h],[\"hh:mm\\nMM-dd\",1,c],[\"hh:mm\\nMM-dd\",5,5*c],[\"hh:mm\\nMM-dd\",10,10*c],[\"hh:mm\\nMM-dd\",15,15*c],[\"hh:mm\\nMM-dd\",30,30*c],[\"hh:mm\\nMM-dd\",1,d],[\"hh:mm\\nMM-dd\",2,2*d],[\"hh:mm\\nMM-dd\",6,6*d],[\"hh:mm\\nMM-dd\",12,12*d],[\"MM-dd\\nyyyy\",1,f],[\"week\",7,7*f],[\"month\",1,31*f],[\"quarter\",3,380*f/4],[\"half-year\",6,380*f/2],[\"year\",1,380*f]];g.create=function(){return new g},t.exports=g},function(t,e,i){var n=i(29);t.exports=function(t){function e(e){var i=(e.visualColorAccessPath||\"itemStyle.normal.color\").split(\".\"),r=e.getData(),o=e.get(i)||e.getColorFromPalette(e.get(\"name\"));r.setVisual(\"color\",o),t.isSeriesFiltered(e)||(\"function\"!=typeof o||o instanceof n||r.each(function(t){r.setItemVisual(t,\"color\",o(e.getDataParams(t)))}),r.each(function(t){var e=r.getItemModel(t),n=e.get(i,!0);null!=n&&r.setItemVisual(t,\"color\",n)}))}t.eachRawSeries(e)}},function(t,e,i){\"use strict\";function n(t,e,i){return{type:t,event:i,target:e,cancelBubble:!1,offsetX:i.zrX,offsetY:i.zrY,gestureEvent:i.gestureEvent,pinchX:i.pinchX,pinchY:i.pinchY,pinchScale:i.pinchScale,wheelDelta:i.zrDelta}}function r(){}function o(t,e,i){if(t[t.rectHover?\"rectContain\":\"contain\"](e,i)){for(var n=t;n;){if(n.silent||n.clipPath&&!n.clipPath.contain(e,i))return!1;n=n.parent}return!0}return!1}var a=i(1),s=i(165),l=i(20);r.prototype.dispose=function(){};var u=[\"click\",\"dblclick\",\"mousewheel\",\"mouseout\",\"mouseup\",\"mousedown\",\"mousemove\"],h=function(t,e,i){l.call(this),this.storage=t,this.painter=e,i=i||new r,this.proxy=i,i.handler=this,this._hovered,this._lastTouchMoment,this._lastX,this._lastY,s.call(this),a.each(u,function(t){i.on&&i.on(t,this[t],this)},this)};h.prototype={constructor:h,mousemove:function(t){var e=t.zrX,i=t.zrY,n=this.findHover(e,i,null),r=this._hovered,o=this.proxy;this._hovered=n,o.setCursor&&o.setCursor(n?n.cursor:\"default\"),r&&n!==r&&r.__zr&&this.dispatchToElement(r,\"mouseout\",t),this.dispatchToElement(n,\"mousemove\",t),n&&n!==r&&this.dispatchToElement(n,\"mouseover\",t)},mouseout:function(t){this.dispatchToElement(this._hovered,\"mouseout\",t),this.trigger(\"globalout\",{event:t})},resize:function(t){this._hovered=null},dispatch:function(t,e){var i=this[t];i&&i.call(this,e)},dispose:function(){this.proxy.dispose(),this.storage=this.proxy=this.painter=null},setCursorStyle:function(t){var e=this.proxy;e.setCursor&&e.setCursor(t)},dispatchToElement:function(t,e,i){for(var r=\"on\"+e,o=n(e,t,i),a=t;a&&(a[r]&&(o.cancelBubble=a[r].call(a,o)),a.trigger(e,o),a=a.parent,!o.cancelBubble););o.cancelBubble||(this.trigger(e,o),this.painter&&this.painter.eachOtherLayer(function(t){\"function\"==typeof t[r]&&t[r].call(t,o),t.trigger&&t.trigger(e,o)}))},findHover:function(t,e,i){for(var n=this.storage.getDisplayList(),r=n.length-1;r>=0;r--)if(!n[r].silent&&n[r]!==i&&!n[r].ignore&&o(n[r],t,e))return n[r]}},a.each([\"click\",\"mousedown\",\"mouseup\",\"mousewheel\",\"dblclick\"],function(t){h.prototype[t]=function(e){var i=this.findHover(e.zrX,e.zrY,null);if(\"mousedown\"===t)this._downel=i,this._upel=i;else if(\"mosueup\"===t)this._upel=i;else if(\"click\"===t&&this._downel!==this._upel)return;this.dispatchToElement(i,t,e)}}),a.mixin(h,l),a.mixin(h,s),t.exports=h},function(t,e,i){function n(){return!1}function r(t,e,i,n){var r=document.createElement(e),o=i.getWidth(),a=i.getHeight(),s=r.style;return s.position=\"absolute\",s.left=0,s.top=0,s.width=o+\"px\",s.height=a+\"px\",r.width=o*n,r.height=a*n,r.setAttribute(\"data-zr-dom-id\",t),r}var o=i(1),a=i(33),s=i(64),l=i(63),u=function(t,e,i){var s;i=i||a.devicePixelRatio,\"string\"==typeof t?s=r(t,\"canvas\",e,i):o.isObject(t)&&(s=t,t=s.id),this.id=t,this.dom=s;var l=s.style;l&&(s.onselectstart=n,l[\"-webkit-user-select\"]=\"none\",l[\"user-select\"]=\"none\",l[\"-webkit-touch-callout\"]=\"none\",l[\"-webkit-tap-highlight-color\"]=\"rgba(0,0,0,0)\"),this.domBack=null,this.ctxBack=null,this.painter=e,this.config=null,this.clearColor=0,this.motionBlur=!1,this.lastFrameAlpha=.7,this.dpr=i};u.prototype={constructor:u,elCount:0,__dirty:!0,initContext:function(){this.ctx=this.dom.getContext(\"2d\"),this.ctx.dpr=this.dpr},createBackBuffer:function(){var t=this.dpr;this.domBack=r(\"back-\"+this.id,\"canvas\",this.painter,t),this.ctxBack=this.domBack.getContext(\"2d\"),1!=t&&this.ctxBack.scale(t,t)},resize:function(t,e){var i=this.dpr,n=this.dom,r=n.style,o=this.domBack;r.width=t+\"px\",r.height=e+\"px\",n.width=t*i,n.height=e*i,o&&(o.width=t*i,o.height=e*i,1!=i&&this.ctxBack.scale(i,i))},clear:function(t){var e=this.dom,i=this.ctx,n=e.width,r=e.height,o=this.clearColor,a=this.motionBlur&&!t,u=this.lastFrameAlpha,h=this.dpr;if(a&&(this.domBack||this.createBackBuffer(),this.ctxBack.globalCompositeOperation=\"copy\",this.ctxBack.drawImage(e,0,0,n/h,r/h)),i.clearRect(0,0,n,r),o){var c;o.colorStops?(c=o.__canvasGradient||s.getGradient(i,o,{x:0,y:0,width:n,height:r}),o.__canvasGradient=c):o.image&&(c=l.prototype.getCanvasPattern.call(o,i)),i.save(),i.fillStyle=c||o,i.fillRect(0,0,n,r),i.restore()}if(a){var d=this.domBack;i.save(),i.globalAlpha=u,i.drawImage(d,0,0,n,r),i.restore()}}},t.exports=u},function(t,e,i){\"use strict\";function n(t){return parseInt(t,10)}function r(t){return t?t.isBuildin?!0:\"function\"==typeof t.resize&&\"function\"==typeof t.refresh:!1}function o(t){t.__unusedCount++}function a(t){1==t.__unusedCount&&t.clear()}function s(t,e,i){return x.copy(t.getBoundingRect()),t.transform&&x.applyTransform(t.transform),_.width=e,_.height=i,!x.intersect(_)}function l(t,e){if(t==e)return!1;if(!t||!e||t.length!==e.length)return!0;for(var i=0;i<t.length;i++)if(t[i]!==e[i])return!0}function u(t,e){for(var i=0;i<t.length;i++){var n=t[i],r=n.path;n.setTransform(e),r.beginPath(e),n.buildPath(r,n.shape),e.clip(),n.restoreTransform(e)}}function h(t,e){var i=document.createElement(\"div\"),n=i.style;return n.position=\"relative\",n.overflow=\"hidden\",n.width=t+\"px\",n.height=e+\"px\",i}var c=i(33),d=i(1),f=i(47),p=i(7),g=i(44),v=i(138),m=i(60),y=5,x=new p(0,0,0,0),_=new p(0,0,0,0),b=function(t,e,i){var n=!t.nodeName||\"CANVAS\"===t.nodeName.toUpperCase();i=i||{},this.dpr=i.devicePixelRatio||c.devicePixelRatio,this._singleCanvas=n,this.root=t;var r=t.style;r&&(r[\"-webkit-tap-highlight-color\"]=\"transparent\",r[\"-webkit-user-select\"]=r[\"user-select\"]=r[\"-webkit-touch-callout\"]=\"none\",t.innerHTML=\"\"),this.storage=e;var o=this._zlevelList=[],a=this._layers={};if(this._layerConfig={},n){var s=t.width,l=t.height;this._width=s,this._height=l;var u=new v(t,this,1);u.initContext(),a[0]=u,o.push(0)}else{this._width=this._getWidth(),this._height=this._getHeight();var d=this._domRoot=h(this._width,this._height);t.appendChild(d)}this.pathToImage=this._createPathToImage(),this._progressiveLayers=[],this._hoverlayer,this._hoverElements=[]};b.prototype={constructor:b,isSingleCanvas:function(){return this._singleCanvas},getViewportRoot:function(){return this._singleCanvas?this._layers[0].dom:this._domRoot},refresh:function(t){var e=this.storage.getDisplayList(!0),i=this._zlevelList;this._paintList(e,t);for(var n=0;n<i.length;n++){var r=i[n],o=this._layers[r];!o.isBuildin&&o.refresh&&o.refresh()}return this.refreshHover(),this._progressiveLayers.length&&this._startProgessive(),this},addHover:function(t,e){if(!t.__hoverMir){var i=new t.constructor({style:t.style,shape:t.shape});i.__from=t,t.__hoverMir=i,i.setStyle(e),this._hoverElements.push(i)}},removeHover:function(t){var e=t.__hoverMir,i=this._hoverElements,n=d.indexOf(i,e);n>=0&&i.splice(n,1),t.__hoverMir=null},clearHover:function(t){for(var e=this._hoverElements,i=0;i<e.length;i++){var n=e[i].__from;n&&(n.__hoverMir=null)}e.length=0},refreshHover:function(){var t=this._hoverElements,e=t.length,i=this._hoverlayer;if(i&&i.clear(),e){g(t,this.storage.displayableSortFunc),i||(i=this._hoverlayer=this.getLayer(1e5));var n={};i.ctx.save();for(var r=0;e>r;){var o=t[r],a=o.__from;a&&a.__zr?(r++,a.invisible||(o.transform=a.transform,o.invTransform=a.invTransform,o.__clipPaths=a.__clipPaths,this._doPaintEl(o,i,!0,n))):(t.splice(r,1),a.__hoverMir=null,e--)}i.ctx.restore()}},_startProgessive:function(){function t(){i===e._progressiveToken&&e.storage&&(e._doPaintList(e.storage.getDisplayList()),e._furtherProgressive?(e._progress++,m(t)):e._progressiveToken=-1)}var e=this;if(e._furtherProgressive){var i=e._progressiveToken=+new Date;e._progress++,m(t)}},_clearProgressive:function(){this._progressiveToken=-1,this._progress=0,d.each(this._progressiveLayers,function(t){t.__dirty&&t.clear()})},_paintList:function(t,e){null==e&&(e=!1),this._updateLayerStatus(t),this._clearProgressive(),this.eachBuildinLayer(o),this._doPaintList(t,e),this.eachBuildinLayer(a)},_doPaintList:function(t,e){function i(t){var e=o.dpr||1;o.save(),o.globalAlpha=1,o.shadowBlur=0,n.__dirty=!0,o.setTransform(1,0,0,1,0,0),o.drawImage(t.dom,0,0,h*e,c*e),o.restore()}for(var n,r,o,a,s,l,u=0,h=this._width,c=this._height,p=this._progress,g=0,v=t.length;v>g;g++){var m=t[g],x=this._singleCanvas?0:m.zlevel,_=m.__frame;if(0>_&&s&&(i(s),s=null),r!==x&&(o&&o.restore(),a={},r=x,n=this.getLayer(r),n.isBuildin||f(\"ZLevel \"+r+\" has been used by unkown layer \"+n.id),o=n.ctx,o.save(),n.__unusedCount=0,(n.__dirty||e)&&n.clear()),n.__dirty||e){if(_>=0){if(!s){if(s=this._progressiveLayers[Math.min(u++,y-1)],s.ctx.save(),s.renderScope={},s&&s.__progress>s.__maxProgress){g=s.__nextIdxNotProg-1;continue}l=s.__progress,s.__dirty||(p=l),s.__progress=p+1}_===p&&this._doPaintEl(m,s,!0,s.renderScope)}else this._doPaintEl(m,n,e,a);m.__dirty=!1}}s&&i(s),o&&o.restore(),this._furtherProgressive=!1,d.each(this._progressiveLayers,function(t){t.__maxProgress>=t.__progress&&(this._furtherProgressive=!0)},this)},_doPaintEl:function(t,e,i,n){var r=e.ctx,o=t.transform;if((e.__dirty||i)&&!t.invisible&&0!==t.style.opacity&&(!o||o[0]||o[3])&&(!t.culling||!s(t,this._width,this._height))){var a=t.__clipPaths;(n.prevClipLayer!==e||l(a,n.prevElClipPaths))&&(n.prevElClipPaths&&(n.prevClipLayer.ctx.restore(),n.prevClipLayer=n.prevElClipPaths=null,n.prevEl=null),a&&(r.save(),u(a,r),n.prevClipLayer=e,n.prevElClipPaths=a)),t.beforeBrush&&t.beforeBrush(r),t.brush(r,n.prevEl||null),n.prevEl=t,t.afterBrush&&t.afterBrush(r)}},getLayer:function(t){if(this._singleCanvas)return this._layers[0];var e=this._layers[t];return e||(e=new v(\"zr_\"+t,this,this.dpr),e.isBuildin=!0,this._layerConfig[t]&&d.merge(e,this._layerConfig[t],!0),this.insertLayer(t,e),e.initContext()),e},insertLayer:function(t,e){var i=this._layers,n=this._zlevelList,o=n.length,a=null,s=-1,l=this._domRoot;if(i[t])return void f(\"ZLevel \"+t+\" has been used already\");if(!r(e))return void f(\"Layer of zlevel \"+t+\" is not valid\");if(o>0&&t>n[0]){for(s=0;o-1>s&&!(n[s]<t&&n[s+1]>t);s++);a=i[n[s]]}if(n.splice(s+1,0,t),a){var u=a.dom;u.nextSibling?l.insertBefore(e.dom,u.nextSibling):l.appendChild(e.dom)}else l.firstChild?l.insertBefore(e.dom,l.firstChild):l.appendChild(e.dom);i[t]=e},eachLayer:function(t,e){var i,n,r=this._zlevelList;for(n=0;n<r.length;n++)i=r[n],t.call(e,this._layers[i],i)},eachBuildinLayer:function(t,e){var i,n,r,o=this._zlevelList;for(r=0;r<o.length;r++)n=o[r],i=this._layers[n],i.isBuildin&&t.call(e,i,n)},eachOtherLayer:function(t,e){var i,n,r,o=this._zlevelList;for(r=0;r<o.length;r++)n=o[r],i=this._layers[n],i.isBuildin||t.call(e,i,n)},getLayers:function(){return this._layers},_updateLayerStatus:function(t){var e=this._layers,i=this._progressiveLayers,n={},r={};this.eachBuildinLayer(function(t,e){n[e]=t.elCount,t.elCount=0,t.__dirty=!1}),d.each(i,function(t,e){r[e]=t.elCount,t.elCount=0,t.__dirty=!1});for(var o,a,s=0,l=0,u=0,h=t.length;h>u;u++){var c=t[u],f=this._singleCanvas?0:c.zlevel,p=e[f],g=c.progressive;if(p&&(p.elCount++,p.__dirty=p.__dirty||c.__dirty),g>=0){a!==g&&(a=g,l++);var m=c.__frame=l-1;if(!o){var x=Math.min(s,y-1);o=i[x],o||(o=i[x]=new v(\"progressive\",this,this.dpr),o.initContext()),o.__maxProgress=0}o.__dirty=o.__dirty||c.__dirty,o.elCount++,o.__maxProgress=Math.max(o.__maxProgress,m),o.__maxProgress>=o.__progress&&(p.__dirty=!0)}else c.__frame=-1,o&&(o.__nextIdxNotProg=u,s++,o=null)}o&&(s++,o.__nextIdxNotProg=u),this.eachBuildinLayer(function(t,e){n[e]!==t.elCount&&(t.__dirty=!0)}),i.length=Math.min(s,y),d.each(i,function(t,e){r[e]!==t.elCount&&(c.__dirty=!0),t.__dirty&&(t.__progress=0)})},clear:function(){return this.eachBuildinLayer(this._clearLayer),this},_clearLayer:function(t){t.clear()},configLayer:function(t,e){if(e){var i=this._layerConfig;i[t]?d.merge(i[t],e,!0):i[t]=e;var n=this._layers[t];n&&d.merge(n,i[t],!0)}},delLayer:function(t){var e=this._layers,i=this._zlevelList,n=e[t];n&&(n.dom.parentNode.removeChild(n.dom),delete e[t],i.splice(d.indexOf(i,t),1))},resize:function(t,e){var i=this._domRoot;if(i.style.display=\"none\",t=t||this._getWidth(),e=e||this._getHeight(),i.style.display=\"\",this._width!=t||e!=this._height){i.style.width=t+\"px\",i.style.height=e+\"px\";for(var n in this._layers)this._layers[n].resize(t,e);this.refresh(!0)}return this._width=t,this._height=e,this},clearLayer:function(t){var e=this._layers[t];e&&e.clear()},dispose:function(){this.root.innerHTML=\"\",this.root=this.storage=this._domRoot=this._layers=null},getRenderedCanvas:function(t){if(t=t||{},this._singleCanvas)return this._layers[0].dom;var e=new v(\"image\",this,t.pixelRatio||this.dpr);e.initContext(),e.clearColor=t.backgroundColor,e.clear();for(var i=this.storage.getDisplayList(!0),n={},r=0;r<i.length;r++){var o=i[r];this._doPaintEl(o,e,!0,n)}return e.dom},getWidth:function(){return this._width},getHeight:function(){return this._height},_getWidth:function(){var t=this.root,e=document.defaultView.getComputedStyle(t);return(t.clientWidth||n(e.width)||n(t.style.width))-(n(e.paddingLeft)||0)-(n(e.paddingRight)||0)|0},_getHeight:function(){var t=this.root,e=document.defaultView.getComputedStyle(t);return(t.clientHeight||n(e.height)||n(t.style.height))-(n(e.paddingTop)||0)-(n(e.paddingBottom)||0)|0},_pathToImage:function(t,e,n,r,o){var a=document.createElement(\"canvas\"),s=a.getContext(\"2d\");a.width=n*o,a.height=r*o,s.clearRect(0,0,n*o,r*o);var l={position:e.position,rotation:e.rotation,scale:e.scale};e.position=[0,0,0],e.rotation=0,e.scale=[1,1],e&&e.brush(s);var u=i(48),h=new u({id:t,style:{x:0,y:0,image:a}});return null!=l.position&&(h.position=e.position=l.position),null!=l.rotation&&(h.rotation=e.rotation=l.rotation),null!=l.scale&&(h.scale=e.scale=l.scale),h},_createPathToImage:function(){var t=this;return function(e,i,n,r){return t._pathToImage(e,i,n,r,t.dpr)}}},t.exports=b},function(t,e,i){\"use strict\";function n(t,e){return t.zlevel===e.zlevel?t.z===e.z?t.z2-e.z2:t.z-e.z:t.zlevel-e.zlevel}var r=i(1),o=i(12),a=i(34),s=i(44),l=function(){this._elements={},this._roots=[],this._displayList=[],this._displayListLen=0};l.prototype={constructor:l,traverse:function(t,e){for(var i=0;i<this._roots.length;i++)this._roots[i].traverse(t,e)},getDisplayList:function(t,e){return e=e||!1,t&&this.updateDisplayList(e),this._displayList},updateDisplayList:function(t){this._displayListLen=0;for(var e=this._roots,i=this._displayList,r=0,a=e.length;a>r;r++)this._updateAndAddDisplayable(e[r],null,t);i.length=this._displayListLen,o.canvasSupported&&s(i,n)},_updateAndAddDisplayable:function(t,e,i){if(!t.ignore||i){t.beforeUpdate(),t.__dirty&&t.update(),t.afterUpdate();var n=t.clipPath;if(n&&(n.parent=t,n.updateTransform(),e?(e=e.slice(),e.push(n)):e=[n]),t.isGroup){for(var r=t._children,o=0;o<r.length;o++){var a=r[o];t.__dirty&&(a.__dirty=!0),this._updateAndAddDisplayable(a,e,i)}t.__dirty=!1}else t.__clipPaths=e,this._displayList[this._displayListLen++]=t}},addRoot:function(t){this._elements[t.id]||(t instanceof a&&t.addChildrenToStorage(this),this.addToMap(t),this._roots.push(t))},delRoot:function(t){if(null==t){for(var e=0;e<this._roots.length;e++){var i=this._roots[e];i instanceof a&&i.delChildrenFromStorage(this)}return this._elements={},this._roots=[],this._displayList=[],void(this._displayListLen=0)}if(t instanceof Array)for(var e=0,n=t.length;n>e;e++)this.delRoot(t[e]);else{var o;o=\"string\"==typeof t?this._elements[t]:t;var s=r.indexOf(this._roots,o);s>=0&&(this.delFromMap(o.id),this._roots.splice(s,1),o instanceof a&&o.delChildrenFromStorage(this))}},addToMap:function(t){return t instanceof a&&(t.__storage=this),t.dirty(!1),this._elements[t.id]=t,this},get:function(t){return this._elements[t]},delFromMap:function(t){var e=this._elements,i=e[t];return i&&(delete e[t],i instanceof a&&(i.__storage=null)),this},dispose:function(){this._elements=this._renderList=this._roots=null},displayableSortFunc:n},t.exports=l},function(t,e,i){\"use strict\";var n=i(1),r=i(24).Dispatcher,o=i(60),a=i(59),s=function(t){t=t||{},this.stage=t.stage||{},this.onframe=t.onframe||function(){},this._clips=[],this._running=!1,this._time,this._pausedTime,this._pauseStart,this._paused=!1,r.call(this)};s.prototype={constructor:s,addClip:function(t){this._clips.push(t)},addAnimator:function(t){t.animation=this;for(var e=t.getClips(),i=0;i<e.length;i++)this.addClip(e[i])},removeClip:function(t){var e=n.indexOf(this._clips,t);e>=0&&this._clips.splice(e,1)},removeAnimator:function(t){for(var e=t.getClips(),i=0;i<e.length;i++)this.removeClip(e[i]);t.animation=null},_update:function(){for(var t=(new Date).getTime()-this._pausedTime,e=t-this._time,i=this._clips,n=i.length,r=[],o=[],a=0;n>a;a++){var s=i[a],l=s.step(t);l&&(r.push(l),o.push(s))}for(var a=0;n>a;)i[a]._needsRemove?(i[a]=i[n-1],i.pop(),n--):a++;n=r.length;for(var a=0;n>a;a++)o[a].fire(r[a]);this._time=t,this.onframe(e),this.trigger(\"frame\",e),this.stage.update&&this.stage.update()},_startLoop:function(){function t(){e._running&&(o(t),!e._paused&&e._update())}var e=this;this._running=!0,o(t)},start:function(){this._time=(new Date).getTime(),this._pausedTime=0,this._startLoop()},stop:function(){this._running=!1},pause:function(){this._paused||(this._pauseStart=(new Date).getTime(),this._paused=!0)},resume:function(){this._paused&&(this._pausedTime+=(new Date).getTime()-this._pauseStart,this._paused=!1)},clear:function(){this._clips=[]},animate:function(t,e){e=e||{};var i=new a(t,e.loop,e.getter,e.setter);return i}},n.mixin(s,r),t.exports=s},function(t,e,i){function n(t){this._target=t.target,this._life=t.life||1e3,this._delay=t.delay||0,this._initialized=!1,this.loop=null==t.loop?!1:t.loop,this.gap=t.gap||0,this.easing=t.easing||\"Linear\",this.onframe=t.onframe,this.ondestroy=t.ondestroy,this.onrestart=t.onrestart}var r=i(143);n.prototype={constructor:n,step:function(t){this._initialized||(this._startTime=t+this._delay,this._initialized=!0);var e=(t-this._startTime)/this._life;if(!(0>e)){e=Math.min(e,1);var i=this.easing,n=\"string\"==typeof i?r[i]:i,o=\"function\"==typeof n?n(e):e;\nreturn this.fire(\"frame\",o),1==e?this.loop?(this.restart(t),\"restart\"):(this._needsRemove=!0,\"destroy\"):null}},restart:function(t){var e=(t-this._startTime)%this._life;this._startTime=t-e+this.gap,this._needsRemove=!1},fire:function(t,e){t=\"on\"+t,this[t]&&this[t](this._target,e)}},t.exports=n},function(t,e){var i={linear:function(t){return t},quadraticIn:function(t){return t*t},quadraticOut:function(t){return t*(2-t)},quadraticInOut:function(t){return(t*=2)<1?.5*t*t:-.5*(--t*(t-2)-1)},cubicIn:function(t){return t*t*t},cubicOut:function(t){return--t*t*t+1},cubicInOut:function(t){return(t*=2)<1?.5*t*t*t:.5*((t-=2)*t*t+2)},quarticIn:function(t){return t*t*t*t},quarticOut:function(t){return 1- --t*t*t*t},quarticInOut:function(t){return(t*=2)<1?.5*t*t*t*t:-.5*((t-=2)*t*t*t-2)},quinticIn:function(t){return t*t*t*t*t},quinticOut:function(t){return--t*t*t*t*t+1},quinticInOut:function(t){return(t*=2)<1?.5*t*t*t*t*t:.5*((t-=2)*t*t*t*t+2)},sinusoidalIn:function(t){return 1-Math.cos(t*Math.PI/2)},sinusoidalOut:function(t){return Math.sin(t*Math.PI/2)},sinusoidalInOut:function(t){return.5*(1-Math.cos(Math.PI*t))},exponentialIn:function(t){return 0===t?0:Math.pow(1024,t-1)},exponentialOut:function(t){return 1===t?1:1-Math.pow(2,-10*t)},exponentialInOut:function(t){return 0===t?0:1===t?1:(t*=2)<1?.5*Math.pow(1024,t-1):.5*(-Math.pow(2,-10*(t-1))+2)},circularIn:function(t){return 1-Math.sqrt(1-t*t)},circularOut:function(t){return Math.sqrt(1- --t*t)},circularInOut:function(t){return(t*=2)<1?-.5*(Math.sqrt(1-t*t)-1):.5*(Math.sqrt(1-(t-=2)*t)+1)},elasticIn:function(t){var e,i=.1,n=.4;return 0===t?0:1===t?1:(!i||1>i?(i=1,e=n/4):e=n*Math.asin(1/i)/(2*Math.PI),-(i*Math.pow(2,10*(t-=1))*Math.sin((t-e)*(2*Math.PI)/n)))},elasticOut:function(t){var e,i=.1,n=.4;return 0===t?0:1===t?1:(!i||1>i?(i=1,e=n/4):e=n*Math.asin(1/i)/(2*Math.PI),i*Math.pow(2,-10*t)*Math.sin((t-e)*(2*Math.PI)/n)+1)},elasticInOut:function(t){var e,i=.1,n=.4;return 0===t?0:1===t?1:(!i||1>i?(i=1,e=n/4):e=n*Math.asin(1/i)/(2*Math.PI),(t*=2)<1?-.5*(i*Math.pow(2,10*(t-=1))*Math.sin((t-e)*(2*Math.PI)/n)):i*Math.pow(2,-10*(t-=1))*Math.sin((t-e)*(2*Math.PI)/n)*.5+1)},backIn:function(t){var e=1.70158;return t*t*((e+1)*t-e)},backOut:function(t){var e=1.70158;return--t*t*((e+1)*t+e)+1},backInOut:function(t){var e=2.5949095;return(t*=2)<1?.5*(t*t*((e+1)*t-e)):.5*((t-=2)*t*((e+1)*t+e)+2)},bounceIn:function(t){return 1-i.bounceOut(1-t)},bounceOut:function(t){return 1/2.75>t?7.5625*t*t:2/2.75>t?7.5625*(t-=1.5/2.75)*t+.75:2.5/2.75>t?7.5625*(t-=2.25/2.75)*t+.9375:7.5625*(t-=2.625/2.75)*t+.984375},bounceInOut:function(t){return.5>t?.5*i.bounceIn(2*t):.5*i.bounceOut(2*t-1)+.5}};t.exports=i},function(t,e,i){var n=i(61).normalizeRadian,r=2*Math.PI;t.exports={containStroke:function(t,e,i,o,a,s,l,u,h){if(0===l)return!1;var c=l;u-=t,h-=e;var d=Math.sqrt(u*u+h*h);if(d-c>i||i>d+c)return!1;if(Math.abs(o-a)%r<1e-4)return!0;if(s){var f=o;o=n(a),a=n(f)}else o=n(o),a=n(a);o>a&&(a+=r);var p=Math.atan2(h,u);return 0>p&&(p+=r),p>=o&&a>=p||p+r>=o&&a>=p+r}}},function(t,e,i){var n=i(17);t.exports={containStroke:function(t,e,i,r,o,a,s,l,u,h,c){if(0===u)return!1;var d=u;if(c>e+d&&c>r+d&&c>a+d&&c>l+d||e-d>c&&r-d>c&&a-d>c&&l-d>c||h>t+d&&h>i+d&&h>o+d&&h>s+d||t-d>h&&i-d>h&&o-d>h&&s-d>h)return!1;var f=n.cubicProjectPoint(t,e,i,r,o,a,s,l,h,c,null);return d/2>=f}}},function(t,e,i){\"use strict\";function n(t,e){return Math.abs(t-e)<x}function r(){var t=b[0];b[0]=b[1],b[1]=t}function o(t,e,i,n,o,a,s,l,u,h){if(h>e&&h>n&&h>a&&h>l||e>h&&n>h&&a>h&&l>h)return 0;var c=g.cubicRootAt(e,n,a,l,h,_);if(0===c)return 0;for(var d,f,p=0,v=-1,m=0;c>m;m++){var y=_[m],x=0===y||1===y?.5:1,w=g.cubicAt(t,i,o,s,y);u>w||(0>v&&(v=g.cubicExtrema(e,n,a,l,b),b[1]<b[0]&&v>1&&r(),d=g.cubicAt(e,n,a,l,b[0]),v>1&&(f=g.cubicAt(e,n,a,l,b[1]))),p+=2==v?y<b[0]?e>d?x:-x:y<b[1]?d>f?x:-x:f>l?x:-x:y<b[0]?e>d?x:-x:d>l?x:-x)}return p}function a(t,e,i,n,r,o,a,s){if(s>e&&s>n&&s>o||e>s&&n>s&&o>s)return 0;var l=g.quadraticRootAt(e,n,o,s,_);if(0===l)return 0;var u=g.quadraticExtremum(e,n,o);if(u>=0&&1>=u){for(var h=0,c=g.quadraticAt(e,n,o,u),d=0;l>d;d++){var f=0===_[d]||1===_[d]?.5:1,p=g.quadraticAt(t,i,r,_[d]);a>p||(h+=_[d]<u?e>c?f:-f:c>o?f:-f)}return h}var f=0===_[0]||1===_[0]?.5:1,p=g.quadraticAt(t,i,r,_[0]);return a>p?0:e>o?f:-f}function s(t,e,i,n,r,o,a,s){if(s-=e,s>i||-i>s)return 0;var l=Math.sqrt(i*i-s*s);_[0]=-l,_[1]=l;var u=Math.abs(n-r);if(1e-4>u)return 0;if(1e-4>u%y){n=0,r=y;var h=o?1:-1;return a>=_[0]+t&&a<=_[1]+t?h:0}if(o){var l=n;n=p(r),r=p(l)}else n=p(n),r=p(r);n>r&&(r+=y);for(var c=0,d=0;2>d;d++){var f=_[d];if(f+t>a){var g=Math.atan2(s,f),h=o?1:-1;0>g&&(g=y+g),(g>=n&&r>=g||g+y>=n&&r>=g+y)&&(g>Math.PI/2&&g<1.5*Math.PI&&(h=-h),c+=h)}}return c}function l(t,e,i,r,l){for(var h=0,p=0,g=0,y=0,x=0,_=0;_<t.length;){var b=t[_++];switch(b===u.M&&_>1&&(i||(h+=v(p,g,y,x,r,l))),1==_&&(p=t[_],g=t[_+1],y=p,x=g),b){case u.M:y=t[_++],x=t[_++],p=y,g=x;break;case u.L:if(i){if(m(p,g,t[_],t[_+1],e,r,l))return!0}else h+=v(p,g,t[_],t[_+1],r,l)||0;p=t[_++],g=t[_++];break;case u.C:if(i){if(c.containStroke(p,g,t[_++],t[_++],t[_++],t[_++],t[_],t[_+1],e,r,l))return!0}else h+=o(p,g,t[_++],t[_++],t[_++],t[_++],t[_],t[_+1],r,l)||0;p=t[_++],g=t[_++];break;case u.Q:if(i){if(d.containStroke(p,g,t[_++],t[_++],t[_],t[_+1],e,r,l))return!0}else h+=a(p,g,t[_++],t[_++],t[_],t[_+1],r,l)||0;p=t[_++],g=t[_++];break;case u.A:var w=t[_++],S=t[_++],M=t[_++],T=t[_++],A=t[_++],I=t[_++],L=(t[_++],1-t[_++]),C=Math.cos(A)*M+w,D=Math.sin(A)*T+S;_>1?h+=v(p,g,C,D,r,l):(y=C,x=D);var P=(r-w)*T/M+w;if(i){if(f.containStroke(w,S,T,A,A+I,L,e,P,l))return!0}else h+=s(w,S,T,A,A+I,L,P,l);p=Math.cos(A+I)*M+w,g=Math.sin(A+I)*T+S;break;case u.R:y=p=t[_++],x=g=t[_++];var k=t[_++],z=t[_++],C=y+k,D=x+z;if(i){if(m(y,x,C,x,e,r,l)||m(C,x,C,D,e,r,l)||m(C,D,y,D,e,r,l)||m(y,D,y,x,e,r,l))return!0}else h+=v(C,x,C,D,r,l),h+=v(y,D,y,x,r,l);break;case u.Z:if(i){if(m(p,g,y,x,e,r,l))return!0}else h+=v(p,g,y,x,r,l);p=y,g=x}}return i||n(g,x)||(h+=v(p,g,y,x,r,l)||0),0!==h}var u=i(28).CMD,h=i(82),c=i(145),d=i(83),f=i(144),p=i(61).normalizeRadian,g=i(17),v=i(84),m=h.containStroke,y=2*Math.PI,x=1e-4,_=[-1,-1,-1],b=[-1,-1];t.exports={contain:function(t,e,i){return l(t,0,!1,e,i)},containStroke:function(t,e,i,n){return l(t,e,!0,i,n)}}},function(t,e,i){\"use strict\";function n(t){var e=t[1][0]-t[0][0],i=t[1][1]-t[0][1];return Math.sqrt(e*e+i*i)}function r(t){return[(t[0][0]+t[1][0])/2,(t[0][1]+t[1][1])/2]}var o=i(24),a=function(){this._track=[]};a.prototype={constructor:a,recognize:function(t,e,i){return this._doTrack(t,e,i),this._recognize(t)},clear:function(){return this._track.length=0,this},_doTrack:function(t,e,i){var n=t.touches;if(n){for(var r={points:[],touches:[],target:e,event:t},a=0,s=n.length;s>a;a++){var l=n[a],u=o.clientToLocal(i,l);r.points.push([u.zrX,u.zrY]),r.touches.push(l)}this._track.push(r)}},_recognize:function(t){for(var e in s)if(s.hasOwnProperty(e)){var i=s[e](this._track,t);if(i)return i}}};var s={pinch:function(t,e){var i=t.length;if(i){var o=(t[i-1]||{}).points,a=(t[i-2]||{}).points||o;if(a&&a.length>1&&o&&o.length>1){var s=n(o)/n(a);!isFinite(s)&&(s=1),e.pinchScale=s;var l=r(o);return e.pinchX=l[0],e.pinchY=l[1],{type:\"pinch\",target:t[0].target,event:e}}}}};t.exports=a},function(t,e){var i=function(){this.head=null,this.tail=null,this._len=0},n=i.prototype;n.insert=function(t){var e=new r(t);return this.insertEntry(e),e},n.insertEntry=function(t){this.head?(this.tail.next=t,t.prev=this.tail,this.tail=t):this.head=this.tail=t,this._len++},n.remove=function(t){var e=t.prev,i=t.next;e?e.next=i:this.head=i,i?i.prev=e:this.tail=e,t.next=t.prev=null,this._len--},n.len=function(){return this._len};var r=function(t){this.value=t,this.next,this.prev},o=function(t){this._list=new i,this._map={},this._maxSize=t||10},a=o.prototype;a.put=function(t,e){var i=this._list,n=this._map;if(null==n[t]){var r=i.len();if(r>=this._maxSize&&r>0){var o=i.head;i.remove(o),delete n[o.key]}var a=i.insert(e);a.key=t,n[t]=a}},a.get=function(t){var e=this._map[t],i=this._list;return null!=e?(e!==i.tail&&(i.remove(e),i.insertEntry(e)),e.value):void 0},a.clear=function(){this._list.clear(),this._map={}},t.exports=o},function(t,e,i){function n(t){return\"mousewheel\"===t&&d.browser.firefox?\"DOMMouseScroll\":t}function r(t,e,i){var n=t._gestureMgr;\"start\"===i&&n.clear();var r=n.recognize(e,t.handler.findHover(e.zrX,e.zrY,null),t.dom);if(\"end\"===i&&n.clear(),r){var o=r.type;e.gestureEvent=o,t.handler.dispatchToElement(r.target,o,r.event)}}function o(t){t._touching=!0,clearTimeout(t._touchTimer),t._touchTimer=setTimeout(function(){t._touching=!1},700)}function a(){return d.touchEventsSupported}function s(t){function e(t,e){return function(){return e._touching?void 0:t.apply(e,arguments)}}for(var i=0;i<x.length;i++){var n=x[i];t._handlers[n]=h.bind(_[n],t)}for(var i=0;i<y.length;i++){var n=y[i];t._handlers[n]=e(_[n],t)}}function l(t){function e(e,i){h.each(e,function(e){p(t,n(e),i._handlers[e])},i)}c.call(this),this.dom=t,this._touching=!1,this._touchTimer,this._gestureMgr=new f,this._handlers={},s(this),a()&&e(x,this),e(y,this)}var u=i(24),h=i(1),c=i(20),d=i(12),f=i(147),p=u.addEventListener,g=u.removeEventListener,v=u.normalizeEvent,m=300,y=[\"click\",\"dblclick\",\"mousewheel\",\"mouseout\",\"mouseup\",\"mousedown\",\"mousemove\"],x=[\"touchstart\",\"touchend\",\"touchmove\"],_={mousemove:function(t){t=v(this.dom,t),this.trigger(\"mousemove\",t)},mouseout:function(t){t=v(this.dom,t);var e=t.toElement||t.relatedTarget;if(e!=this.dom)for(;e&&9!=e.nodeType;){if(e===this.dom)return;e=e.parentNode}this.trigger(\"mouseout\",t)},touchstart:function(t){t=v(this.dom,t),this._lastTouchMoment=new Date,r(this,t,\"start\"),_.mousemove.call(this,t),_.mousedown.call(this,t),o(this)},touchmove:function(t){t=v(this.dom,t),r(this,t,\"change\"),_.mousemove.call(this,t),o(this)},touchend:function(t){t=v(this.dom,t),r(this,t,\"end\"),_.mouseup.call(this,t),+new Date-this._lastTouchMoment<m&&_.click.call(this,t),o(this)}};h.each([\"click\",\"mousedown\",\"mouseup\",\"mousewheel\",\"dblclick\"],function(t){_[t]=function(e){e=v(this.dom,e),this.trigger(t,e)}});var b=l.prototype;b.dispose=function(){for(var t=y.concat(x),e=0;e<t.length;e++){var i=t[e];g(this.dom,n(i),this._handlers[i])}},b.setCursor=function(t){this.dom.style.cursor=t||\"default\"},h.mixin(l,c),t.exports=l},function(t,e,i){var n=i(6);t.exports=n.extend({type:\"compound\",shape:{paths:null},_updatePathDirty:function(){for(var t=this.__dirtyPath,e=this.shape.paths,i=0;i<e.length;i++)t=t||e[i].__dirtyPath;this.__dirtyPath=t,this.__dirty=this.__dirty||t},beforeBrush:function(){this._updatePathDirty();for(var t=this.shape.paths||[],e=this.getGlobalScale(),i=0;i<t.length;i++)t[i].path.setScale(e[0],e[1])},buildPath:function(t,e){for(var i=e.paths||[],n=0;n<i.length;n++)i[n].buildPath(t,i[n].shape,!0)},afterBrush:function(){for(var t=this.shape.paths,e=0;e<t.length;e++)t[e].__dirtyPath=!1},getBoundingRect:function(){return this._updatePathDirty(),n.prototype.getBoundingRect.call(this)}})},function(t,e,i){\"use strict\";var n=i(1),r=i(29),o=function(t,e,i,n,o){this.x=null==t?.5:t,this.y=null==e?.5:e,this.r=null==i?.5:i,this.type=\"radial\",this.global=o||!1,r.call(this,n)};o.prototype={constructor:o},n.inherits(o,r),t.exports=o},function(t,e){t.exports={buildPath:function(t,e){var i,n,r,o,a=e.x,s=e.y,l=e.width,u=e.height,h=e.r;0>l&&(a+=l,l=-l),0>u&&(s+=u,u=-u),\"number\"==typeof h?i=n=r=o=h:h instanceof Array?1===h.length?i=n=r=o=h[0]:2===h.length?(i=r=h[0],n=o=h[1]):3===h.length?(i=h[0],n=o=h[1],r=h[2]):(i=h[0],n=h[1],r=h[2],o=h[3]):i=n=r=o=0;var c;i+n>l&&(c=i+n,i*=l/c,n*=l/c),r+o>l&&(c=r+o,r*=l/c,o*=l/c),n+r>u&&(c=n+r,n*=u/c,r*=u/c),i+o>u&&(c=i+o,i*=u/c,o*=u/c),t.moveTo(a+i,s),t.lineTo(a+l-n,s),0!==n&&t.quadraticCurveTo(a+l,s,a+l,s+n),t.lineTo(a+l,s+u-r),0!==r&&t.quadraticCurveTo(a+l,s+u,a+l-r,s+u),t.lineTo(a+o,s+u),0!==o&&t.quadraticCurveTo(a,s+u,a,s+u-o),t.lineTo(a,s+i),0!==i&&t.quadraticCurveTo(a,s,a+i,s)}}},function(t,e,i){var n=i(5),r=n.min,o=n.max,a=n.scale,s=n.distance,l=n.add;t.exports=function(t,e,i,u){var h,c,d,f,p=[],g=[],v=[],m=[];if(u){d=[1/0,1/0],f=[-(1/0),-(1/0)];for(var y=0,x=t.length;x>y;y++)r(d,d,t[y]),o(f,f,t[y]);r(d,d,u[0]),o(f,f,u[1])}for(var y=0,x=t.length;x>y;y++){var _=t[y];if(i)h=t[y?y-1:x-1],c=t[(y+1)%x];else{if(0===y||y===x-1){p.push(n.clone(t[y]));continue}h=t[y-1],c=t[y+1]}n.sub(g,c,h),a(g,g,e);var b=s(_,h),w=s(_,c),S=b+w;0!==S&&(b/=S,w/=S),a(v,g,-b),a(m,g,w);var M=l([],_,v),T=l([],_,m);u&&(o(M,M,d),r(M,M,f),o(T,T,d),r(T,T,f)),p.push(M),p.push(T)}return i&&p.push(p.shift()),p}},function(t,e,i){function n(t,e,i,n,r,o,a){var s=.5*(i-t),l=.5*(n-e);return(2*(e-i)+s+l)*a+(-3*(e-i)-2*s-l)*o+s*r+e}var r=i(5);t.exports=function(t,e){for(var i=t.length,o=[],a=0,s=1;i>s;s++)a+=r.distance(t[s-1],t[s]);var l=a/2;l=i>l?i:l;for(var s=0;l>s;s++){var u,h,c,d=s/(l-1)*(e?i:i-1),f=Math.floor(d),p=d-f,g=t[f%i];e?(u=t[(f-1+i)%i],h=t[(f+1)%i],c=t[(f+2)%i]):(u=t[0===f?f:f-1],h=t[f>i-2?i-1:f+1],c=t[f>i-3?i-1:f+2]);var v=p*p,m=p*v;o.push([n(u[0],g[0],h[0],c[0],p,v,m),n(u[1],g[1],h[1],c[1],p,v,m)])}return o}},function(t,e,i){t.exports=i(6).extend({type:\"arc\",shape:{cx:0,cy:0,r:0,startAngle:0,endAngle:2*Math.PI,clockwise:!0},style:{stroke:\"#000\",fill:null},buildPath:function(t,e){var i=e.cx,n=e.cy,r=Math.max(e.r,0),o=e.startAngle,a=e.endAngle,s=e.clockwise,l=Math.cos(o),u=Math.sin(o);t.moveTo(l*r+i,u*r+n),t.arc(i,n,r,o,a,!s)}})},function(t,e,i){\"use strict\";function n(t,e,i){var n=t.cpx2,r=t.cpy2;return null===n||null===r?[(i?c:u)(t.x1,t.cpx1,t.cpx2,t.x2,e),(i?c:u)(t.y1,t.cpy1,t.cpy2,t.y2,e)]:[(i?h:l)(t.x1,t.cpx1,t.x2,e),(i?h:l)(t.y1,t.cpy1,t.y2,e)]}var r=i(17),o=i(5),a=r.quadraticSubdivide,s=r.cubicSubdivide,l=r.quadraticAt,u=r.cubicAt,h=r.quadraticDerivativeAt,c=r.cubicDerivativeAt,d=[];t.exports=i(6).extend({type:\"bezier-curve\",shape:{x1:0,y1:0,x2:0,y2:0,cpx1:0,cpy1:0,percent:1},style:{stroke:\"#000\",fill:null},buildPath:function(t,e){var i=e.x1,n=e.y1,r=e.x2,o=e.y2,l=e.cpx1,u=e.cpy1,h=e.cpx2,c=e.cpy2,f=e.percent;0!==f&&(t.moveTo(i,n),null==h||null==c?(1>f&&(a(i,l,r,f,d),l=d[1],r=d[2],a(n,u,o,f,d),u=d[1],o=d[2]),t.quadraticCurveTo(l,u,r,o)):(1>f&&(s(i,l,h,r,f,d),l=d[1],h=d[2],r=d[3],s(n,u,c,o,f,d),u=d[1],c=d[2],o=d[3]),t.bezierCurveTo(l,u,h,c,r,o)))},pointAt:function(t){return n(this.shape,t,!1)},tangentAt:function(t){var e=n(this.shape,t,!0);return o.normalize(e,e)}})},function(t,e,i){\"use strict\";t.exports=i(6).extend({type:\"circle\",shape:{cx:0,cy:0,r:0},buildPath:function(t,e,i){i&&t.moveTo(e.cx+e.r,e.cy),t.arc(e.cx,e.cy,e.r,0,2*Math.PI,!0)}})},function(t,e,i){t.exports=i(6).extend({type:\"line\",shape:{x1:0,y1:0,x2:0,y2:0,percent:1},style:{stroke:\"#000\",fill:null},buildPath:function(t,e){var i=e.x1,n=e.y1,r=e.x2,o=e.y2,a=e.percent;0!==a&&(t.moveTo(i,n),1>a&&(r=i*(1-a)+r*a,o=n*(1-a)+o*a),t.lineTo(r,o))},pointAt:function(t){var e=this.shape;return[e.x1*(1-t)+e.x2*t,e.y1*(1-t)+e.y2*t]}})},function(t,e,i){var n=i(65);t.exports=i(6).extend({type:\"polygon\",shape:{points:null,smooth:!1,smoothConstraint:null},buildPath:function(t,e){n.buildPath(t,e,!0)}})},function(t,e,i){var n=i(65);t.exports=i(6).extend({type:\"polyline\",shape:{points:null,smooth:!1,smoothConstraint:null},style:{stroke:\"#000\",fill:null},buildPath:function(t,e){n.buildPath(t,e,!1)}})},function(t,e,i){var n=i(152);t.exports=i(6).extend({type:\"rect\",shape:{r:0,x:0,y:0,width:0,height:0},buildPath:function(t,e){var i=e.x,r=e.y,o=e.width,a=e.height;e.r?n.buildPath(t,e):t.rect(i,r,o,a),t.closePath()}})},function(t,e,i){t.exports=i(6).extend({type:\"ring\",shape:{cx:0,cy:0,r:0,r0:0},buildPath:function(t,e){var i=e.cx,n=e.cy,r=2*Math.PI;t.moveTo(i+e.r,n),t.arc(i,n,e.r,0,r,!1),t.moveTo(i+e.r0,n),t.arc(i,n,e.r0,0,r,!0)}})},function(t,e,i){t.exports=i(6).extend({type:\"sector\",shape:{cx:0,cy:0,r0:0,r:0,startAngle:0,endAngle:2*Math.PI,clockwise:!0},buildPath:function(t,e){var i=e.cx,n=e.cy,r=Math.max(e.r0||0,0),o=Math.max(e.r,0),a=e.startAngle,s=e.endAngle,l=e.clockwise,u=Math.cos(a),h=Math.sin(a);t.moveTo(u*r+i,h*r+n),t.lineTo(u*o+i,h*o+n),t.arc(i,n,o,a,s,!l),t.lineTo(Math.cos(s)*r+i,Math.sin(s)*r+n),0!==r&&t.arc(i,n,r,s,a,l),t.closePath()}})},function(t,e,i){\"use strict\";var n=i(59),r=i(1),o=r.isString,a=r.isFunction,s=r.isObject,l=i(47),u=function(){this.animators=[]};u.prototype={constructor:u,animate:function(t,e){var i,o=!1,a=this,s=this.__zr;if(t){var u=t.split(\".\"),h=a;o=\"shape\"===u[0];for(var c=0,d=u.length;d>c;c++)h&&(h=h[u[c]]);h&&(i=h)}else i=a;if(!i)return void l('Property \"'+t+'\" is not existed in element '+a.id);var f=a.animators,p=new n(i,e);return p.during(function(t){a.dirty(o)}).done(function(){f.splice(r.indexOf(f,p),1)}),f.push(p),s&&s.animation.addAnimator(p),p},stopAnimation:function(t){for(var e=this.animators,i=e.length,n=0;i>n;n++)e[n].stop(t);return e.length=0,this},animateTo:function(t,e,i,n,r){function s(){u--,u||r&&r()}o(i)?(r=n,n=i,i=0):a(n)?(r=n,n=\"linear\",i=0):a(i)?(r=i,i=0):a(e)?(r=e,e=500):e||(e=500),this.stopAnimation(),this._animateToShallow(\"\",this,t,e,i,n,r);var l=this.animators.slice(),u=l.length;u||r&&r();for(var h=0;h<l.length;h++)l[h].done(s).start(n)},_animateToShallow:function(t,e,i,n,o){var a={},l=0;for(var u in i)if(null!=e[u])s(i[u])&&!r.isArrayLike(i[u])?this._animateToShallow(t?t+\".\"+u:u,e[u],i[u],n,o):(a[u]=i[u],l++);else if(null!=i[u])if(t){var h={};h[t]={},h[t][u]=i[u],this.attr(h)}else this.attr(u,i[u]);return l>0&&this.animate(t,!1).when(null==n?500:n,a).delay(o||0),this}},t.exports=u},function(t,e){function i(){this.on(\"mousedown\",this._dragStart,this),this.on(\"mousemove\",this._drag,this),this.on(\"mouseup\",this._dragEnd,this),this.on(\"globalout\",this._dragEnd,this)}i.prototype={constructor:i,_dragStart:function(t){var e=t.target;e&&e.draggable&&(this._draggingTarget=e,e.dragging=!0,this._x=t.offsetX,this._y=t.offsetY,this.dispatchToElement(e,\"dragstart\",t.event))},_drag:function(t){var e=this._draggingTarget;if(e){var i=t.offsetX,n=t.offsetY,r=i-this._x,o=n-this._y;this._x=i,this._y=n,e.drift(r,o,t),this.dispatchToElement(e,\"drag\",t.event);var a=this.findHover(i,n,e),s=this._dropTarget;this._dropTarget=a,e!==a&&(s&&a!==s&&this.dispatchToElement(s,\"dragleave\",t.event),a&&a!==s&&this.dispatchToElement(a,\"dragenter\",t.event))}},_dragEnd:function(t){var e=this._draggingTarget;e&&(e.dragging=!1),this.dispatchToElement(e,\"dragend\",t.event),this._dropTarget&&this.dispatchToElement(this._dropTarget,\"drop\",t.event),this._draggingTarget=null,this._dropTarget=null}},t.exports=i},function(t,e,i){function n(t,e,i,n,r,o,a,s,l,u,h){var g=l*(p/180),y=f(g)*(t-i)/2+d(g)*(e-n)/2,x=-1*d(g)*(t-i)/2+f(g)*(e-n)/2,_=y*y/(a*a)+x*x/(s*s);_>1&&(a*=c(_),s*=c(_));var b=(r===o?-1:1)*c((a*a*(s*s)-a*a*(x*x)-s*s*(y*y))/(a*a*(x*x)+s*s*(y*y)))||0,w=b*a*x/s,S=b*-s*y/a,M=(t+i)/2+f(g)*w-d(g)*S,T=(e+n)/2+d(g)*w+f(g)*S,A=m([1,0],[(y-w)/a,(x-S)/s]),I=[(y-w)/a,(x-S)/s],L=[(-1*y-w)/a,(-1*x-S)/s],C=m(I,L);v(I,L)<=-1&&(C=p),v(I,L)>=1&&(C=0),0===o&&C>0&&(C-=2*p),1===o&&0>C&&(C+=2*p),h.addData(u,M,T,a,s,A,C,g,o)}function r(t){if(!t)return[];var e,i=t.replace(/-/g,\" -\").replace(/  /g,\" \").replace(/ /g,\",\").replace(/,,/g,\",\");for(e=0;e<h.length;e++)i=i.replace(new RegExp(h[e],\"g\"),\"|\"+h[e]);var r,o=i.split(\"|\"),a=0,l=0,u=new s,c=s.CMD;for(e=1;e<o.length;e++){var d,f=o[e],p=f.charAt(0),g=0,v=f.slice(1).replace(/e,-/g,\"e-\").split(\",\");v.length>0&&\"\"===v[0]&&v.shift();for(var m=0;m<v.length;m++)v[m]=parseFloat(v[m]);for(;g<v.length&&!isNaN(v[g])&&!isNaN(v[0]);){var y,x,_,b,w,S,M,T=a,A=l;switch(p){case\"l\":a+=v[g++],l+=v[g++],d=c.L,u.addData(d,a,l);break;case\"L\":a=v[g++],l=v[g++],d=c.L,u.addData(d,a,l);break;case\"m\":a+=v[g++],l+=v[g++],d=c.M,u.addData(d,a,l),p=\"l\";break;case\"M\":a=v[g++],l=v[g++],d=c.M,u.addData(d,a,l),p=\"L\";break;case\"h\":a+=v[g++],d=c.L,u.addData(d,a,l);break;case\"H\":a=v[g++],d=c.L,u.addData(d,a,l);break;case\"v\":l+=v[g++],d=c.L,u.addData(d,a,l);break;case\"V\":l=v[g++],d=c.L,u.addData(d,a,l);break;case\"C\":d=c.C,u.addData(d,v[g++],v[g++],v[g++],v[g++],v[g++],v[g++]),a=v[g-2],l=v[g-1];break;case\"c\":d=c.C,u.addData(d,v[g++]+a,v[g++]+l,v[g++]+a,v[g++]+l,v[g++]+a,v[g++]+l),a+=v[g-2],l+=v[g-1];break;case\"S\":y=a,x=l;var I=u.len(),L=u.data;r===c.C&&(y+=a-L[I-4],x+=l-L[I-3]),d=c.C,T=v[g++],A=v[g++],a=v[g++],l=v[g++],u.addData(d,y,x,T,A,a,l);break;case\"s\":y=a,x=l;var I=u.len(),L=u.data;r===c.C&&(y+=a-L[I-4],x+=l-L[I-3]),d=c.C,T=a+v[g++],A=l+v[g++],a+=v[g++],l+=v[g++],u.addData(d,y,x,T,A,a,l);break;case\"Q\":T=v[g++],A=v[g++],a=v[g++],l=v[g++],d=c.Q,u.addData(d,T,A,a,l);break;case\"q\":T=v[g++]+a,A=v[g++]+l,a+=v[g++],l+=v[g++],d=c.Q,u.addData(d,T,A,a,l);break;case\"T\":y=a,x=l;var I=u.len(),L=u.data;r===c.Q&&(y+=a-L[I-4],x+=l-L[I-3]),a=v[g++],l=v[g++],d=c.Q,u.addData(d,y,x,a,l);break;case\"t\":y=a,x=l;var I=u.len(),L=u.data;r===c.Q&&(y+=a-L[I-4],x+=l-L[I-3]),a+=v[g++],l+=v[g++],d=c.Q,u.addData(d,y,x,a,l);break;case\"A\":_=v[g++],b=v[g++],w=v[g++],S=v[g++],M=v[g++],T=a,A=l,a=v[g++],l=v[g++],d=c.A,n(T,A,a,l,S,M,_,b,w,d,u);break;case\"a\":_=v[g++],b=v[g++],w=v[g++],S=v[g++],M=v[g++],T=a,A=l,a+=v[g++],l+=v[g++],d=c.A,n(T,A,a,l,S,M,_,b,w,d,u)}}\"z\"!==p&&\"Z\"!==p||(d=c.Z,u.addData(d)),r=d}return u.toStatic(),u}function o(t,e){var i,n=r(t);return e=e||{},e.buildPath=function(t){t.setData(n.data),i&&l(t,i);var e=t.getContext();e&&t.rebuildPath(e)},e.applyTransform=function(t){i||(i=u.create()),u.mul(i,t,i),this.dirty(!0)},e}var a=i(6),s=i(28),l=i(167),u=i(19),h=[\"m\",\"M\",\"l\",\"L\",\"v\",\"V\",\"h\",\"H\",\"z\",\"Z\",\"c\",\"C\",\"q\",\"Q\",\"t\",\"T\",\"s\",\"S\",\"a\",\"A\"],c=Math.sqrt,d=Math.sin,f=Math.cos,p=Math.PI,g=function(t){return Math.sqrt(t[0]*t[0]+t[1]*t[1])},v=function(t,e){return(t[0]*e[0]+t[1]*e[1])/(g(t)*g(e))},m=function(t,e){return(t[0]*e[1]<t[1]*e[0]?-1:1)*Math.acos(v(t,e))};t.exports={createFromString:function(t,e){return new a(o(t,e))},extendFromString:function(t,e){return a.extend(o(t,e))},mergePath:function(t,e){for(var i=[],n=t.length,r=0;n>r;r++){var o=t[r];o.__dirty&&o.buildPath(o.path,o.shape,!0),i.push(o.path)}var s=new a(e);return s.buildPath=function(t){t.appendPath(i);var e=t.getContext();e&&t.rebuildPath(e)},s}}},function(t,e,i){function n(t,e){var i,n,o,h,c,d,f=t.data,p=r.M,g=r.C,v=r.L,m=r.R,y=r.A,x=r.Q;for(o=0,h=0;o<f.length;){switch(i=f[o++],h=o,n=0,i){case p:n=1;break;case v:n=1;break;case g:n=3;break;case x:n=2;break;case y:var _=e[4],b=e[5],w=l(e[0]*e[0]+e[1]*e[1]),S=l(e[2]*e[2]+e[3]*e[3]),M=u(-e[1]/S,e[0]/w);f[o++]+=_,f[o++]+=b,f[o++]*=w,f[o++]*=S,f[o++]+=M,f[o++]+=M,o+=2,h=o;break;case m:d[0]=f[o++],d[1]=f[o++],a(d,d,e),f[h++]=d[0],f[h++]=d[1],d[0]+=f[o++],d[1]+=f[o++],a(d,d,e),f[h++]=d[0],f[h++]=d[1]}for(c=0;n>c;c++){var d=s[c];d[0]=f[o++],d[1]=f[o++],a(d,d,e),f[h++]=d[0],f[h++]=d[1]}}}var r=i(28).CMD,o=i(5),a=o.applyTransform,s=[[],[],[]],l=Math.sqrt,u=Math.atan2;t.exports=n},function(t,e,i){if(!i(12).canvasSupported){var n,r=\"urn:schemas-microsoft-com:vml\",o=window,a=o.document,s=!1;try{!a.namespaces.zrvml&&a.namespaces.add(\"zrvml\",r),n=function(t){return a.createElement(\"<zrvml:\"+t+' class=\"zrvml\">')}}catch(l){n=function(t){return a.createElement(\"<\"+t+' xmlns=\"'+r+'\" class=\"zrvml\">')}}var u=function(){if(!s){s=!0;var t=a.styleSheets;t.length<31?a.createStyleSheet().addRule(\".zrvml\",\"behavior:url(#default#VML)\"):t[0].addRule(\".zrvml\",\"behavior:url(#default#VML)\")}};t.exports={doc:a,initVML:u,createNode:n}}},function(t,e,i){\"use strict\";function n(t){return null==t.value?t:t.value}var r=i(14),o=i(30),a=i(284),s=i(1),l={_baseAxisDim:null,getInitialData:function(t,e){var i,a,s=e.getComponent(\"xAxis\",this.get(\"xAxisIndex\")),l=e.getComponent(\"yAxis\",this.get(\"yAxisIndex\")),u=s.get(\"type\"),h=l.get(\"type\");\"category\"===u?(t.layout=\"horizontal\",i=s.getCategories(),a=!0):\"category\"===h?(t.layout=\"vertical\",i=l.getCategories(),a=!0):t.layout=t.layout||\"horizontal\",this._baseAxisDim=\"horizontal\"===t.layout?\"x\":\"y\";var c=t.data,d=this.dimensions=[\"base\"].concat(this.valueDimensions);o(d,c);var f=new r(d,this);return f.initData(c,i?i.slice():null,function(t,e,i,r){var o=n(t);return a?\"base\"===e?i:o[r-1]:o[r]}),f},coordDimToDataDim:function(t){var e=this.valueDimensions.slice(),i=[\"base\"],n={horizontal:{x:i,y:e},vertical:{x:e,y:i}};return n[this.get(\"layout\")][t]},dataDimToCoordDim:function(t){var e;return s.each([\"x\",\"y\"],function(i,n){var r=this.coordDimToDataDim(i);s.indexOf(r,t)>=0&&(e=i)},this),e},getBaseAxis:function(){var t=this._baseAxisDim;return this.ecModel.getComponent(t+\"Axis\",this.get(t+\"AxisIndex\")).axis}},u={init:function(){var t=this._whiskerBoxDraw=new a(this.getStyleUpdater());this.group.add(t.group)},render:function(t,e,i){this._whiskerBoxDraw.updateData(t.getData())},remove:function(t){this._whiskerBoxDraw.remove()}};t.exports={seriesModelMixin:l,viewMixin:u}},function(t,e,i){var n=i(1),r={retrieveTargetInfo:function(t,e){if(t&&(\"treemapZoomToNode\"===t.type||\"treemapRootToNode\"===t.type)){var i=e.getData().tree.root,n=t.targetNode;if(n&&i.contains(n))return{node:n};var r=t.targetNodeId;if(null!=r&&(n=i.getNodeById(r)))return{node:n}}},getPathToRoot:function(t){for(var e=[];t;)t=t.parentNode,t&&e.push(t);return e.reverse()},aboveViewRoot:function(t,e){var i=r.getPathToRoot(t);return n.indexOf(i,e)>=0}};t.exports=r},function(t,e,i){function n(t,e){var i,n=this.getBoundingRect(),r=t.get(\"layoutCenter\"),o=t.get(\"layoutSize\"),s=e.getWidth(),u=e.getHeight(),h=t.get(\"aspectScale\")||.75,c=n.width/n.height*h,d=!1;r&&o&&(r=[l.parsePercent(r[0],s),l.parsePercent(r[1],u)],o=l.parsePercent(o,Math.min(s,u)),isNaN(r[0])||isNaN(r[1])||isNaN(o)||(d=!0));var f;if(d){var f={};c>1?(f.width=o,f.height=o/c):(f.height=o,f.width=o*c),f.y=r[1]-f.height/2,f.x=r[0]-f.width/2}else i=t.getBoxLayoutParams(),i.aspect=c,f=a.getLayoutRect(i,{width:s,height:u});this.setViewRect(f.x,f.y,f.width,f.height),this.setCenter(t.get(\"center\")),this.setZoom(t.get(\"zoom\"))}function r(t,e){s.each(e.get(\"geoCoord\"),function(e,i){t.addGeoCoord(i,e)})}var o=i(355),a=i(13),s=i(1),l=i(4),u={},h={dimensions:o.prototype.dimensions,create:function(t,e){var i=[];t.eachComponent(\"geo\",function(t,a){var s=t.get(\"map\"),l=u[s],h=new o(s+a,s,l&&l.geoJson,l&&l.specialAreas,t.get(\"nameMap\"));h.zoomLimit=t.get(\"scaleLimit\"),i.push(h),r(h,t),t.coordinateSystem=h,h.model=t,h.resize=n,h.resize(t,e)}),t.eachSeries(function(t){var e=t.get(\"coordinateSystem\");if(\"geo\"===e){var n=t.get(\"geoIndex\")||0;t.coordinateSystem=i[n]}});var a={};return t.eachSeriesByType(\"map\",function(t){var e=t.get(\"map\");a[e]=a[e]||[],a[e].push(t)}),s.each(a,function(t,a){var l=u[a],h=s.map(t,function(t){return t.get(\"nameMap\")}),c=new o(a,a,l&&l.geoJson,l&&l.specialAreas,s.mergeAll(h));c.zoomLimit=s.retrieve.apply(null,s.map(t,function(t){return t.get(\"scaleLimit\")})),i.push(c),c.resize=n,c.resize(t[0],e),s.each(t,function(t){t.coordinateSystem=c,r(c,t)})}),i},registerMap:function(t,e,i){e.geoJson&&!e.features&&(i=e.specialAreas,e=e.geoJson),\"string\"==typeof e&&(e=\"undefined\"!=typeof JSON&&JSON.parse?JSON.parse(e):new Function(\"return (\"+e+\");\")()),u[t]={geoJson:e,specialAreas:i}},getMap:function(t){return u[t]},getFilledRegions:function(t,e){var i=(t||[]).slice(),n=h.getMap(e),r=n&&n.geoJson;if(!r)return t;for(var o={},a=r.features,s=0;s<i.length;s++)o[i[s].name]=i[s];for(var s=0;s<a.length;s++){var l=a[s].properties.name;o[l]||i.push({name:l})}return i}},c=i(2);c.registerMap=h.registerMap,c.getMap=h.getMap,c.loadMap=function(){},c.registerCoordinateSystem(\"geo\",h),t.exports=h},function(t,e,i){function n(t){if(t)for(var e in t)if(t.hasOwnProperty(e))return!0}var r=i(1),o=i(71),a=r.each,s={createVisualMappings:function(t,e,i){function n(){var t=function(){};t.prototype.__hidden=t.prototype;var e=new t;return e}var s={};return a(e,function(e){var l=s[e]=n();a(t[e],function(t,n){if(o.isValidType(n)){var a={type:n,visual:t};i&&i(a,e),l[n]=new o(a),\"opacity\"===n&&(a=r.clone(a),a.type=\"colorAlpha\",l.__hidden.__alphaForOpacity=new o(a))}})}),s},replaceVisualOption:function(t,e,i){var o;r.each(i,function(t){e.hasOwnProperty(t)&&n(e[t])&&(o=!0)}),o&&r.each(i,function(i){e.hasOwnProperty(i)&&n(e[i])?t[i]=r.clone(e[i]):delete t[i]})},applyVisual:function(t,e,i,n,a,s){function l(t){return i.getItemVisual(d,t)}function u(t,e){i.setItemVisual(d,t,e)}function h(t,i){d=null==s?t:i;for(var r=n.call(a,t),o=e[r],h=c[r],f=0,p=h.length;p>f;f++){var g=h[f];o[g]&&o[g].applyVisual(t,l,u)}}var c={};r.each(t,function(t){var i=o.prepareVisualTypes(e[t]);c[t]=i});var d;null==s?i.each(h,!0):i.each([s],h,!0)}};t.exports=s},function(t,e,i){function n(){this.group=new r.Group,this._symbolEl=new a({})}var r=i(3),o=i(26),a=r.extendShape({shape:{points:null,sizes:null},symbolProxy:null,buildPath:function(t,e){for(var i=e.points,n=e.sizes,r=this.symbolProxy,o=r.shape,a=0;a<i.length;a++){var s=i[a],l=n[a];l[0]<4?t.rect(s[0]-l[0]/2,s[1]-l[1]/2,l[0],l[1]):(o.x=s[0]-l[0]/2,o.y=s[1]-l[1]/2,o.width=l[0],o.height=l[1],r.buildPath(t,o,!0))}},findDataIndex:function(t,e){for(var i=this.shape,n=i.points,r=i.sizes,o=n.length-1;o>=0;o--){var a=n[o],s=r[o],l=a[0]-s[0]/2,u=a[1]-s[1]/2;if(t>=l&&e>=u&&t<=l+s[0]&&e<=u+s[1])return o}return-1}}),s=n.prototype;s.updateData=function(t){this.group.removeAll();var e=this._symbolEl,i=t.hostModel;e.setShape({points:t.mapArray(t.getItemLayout),sizes:t.mapArray(function(e){var i=t.getItemVisual(e,\"symbolSize\");return i instanceof Array||(i=[i,i]),i})}),e.symbolProxy=o.createSymbol(t.getVisual(\"symbol\"),0,0,0,0),e.setColor=e.symbolProxy.setColor,e.useStyle(i.getModel(\"itemStyle.normal\").getItemStyle([\"color\"]));var n=t.getVisual(\"color\");n&&e.setColor(n),e.seriesIndex=i.seriesIndex,e.on(\"mousemove\",function(t){e.dataIndex=null;var i=e.findDataIndex(t.offsetX,t.offsetY);i>0&&(e.dataIndex=i)}),this.group.add(e)},s.updateLayout=function(t){var e=t.getData();this._symbolEl.setShape({points:e.mapArray(e.getItemLayout)})},s.remove=function(){this.group.removeAll()},t.exports=n},function(t,e,i){function n(t){return isNaN(+t.cpx1)||isNaN(+t.cpy1)}var r=i(3),o=i(5),a=r.Line.prototype,s=r.BezierCurve.prototype;t.exports=r.extendShape({type:\"ec-line\",style:{stroke:\"#000\",fill:null},shape:{x1:0,y1:0,x2:0,y2:0,percent:1,cpx1:null,cpy1:null},buildPath:function(t,e){(n(e)?a:s).buildPath(t,e)},pointAt:function(t){return n(this.shape)?a.pointAt.call(this,t):s.pointAt.call(this,t)},tangentAt:function(t){var e=this.shape,i=n(e)?[e.x2-e.x1,e.y2-e.y1]:s.tangentAt.call(this,t);return o.normalize(i,i)}})},function(t,e,i){var n=i(1),r=i(2);i(176),i(177),r.registerVisual(n.curry(i(46),\"scatter\",\"circle\",null)),r.registerLayout(n.curry(i(55),\"scatter\")),i(36)},function(t,e,i){\"use strict\";var n=i(35),r=i(15);t.exports=r.extend({type:\"series.scatter\",dependencies:[\"grid\",\"polar\"],getInitialData:function(t,e){var i=n(t.data,this,e);return i},brushSelector:\"point\",defaultOption:{coordinateSystem:\"cartesian2d\",zlevel:0,z:2,legendHoverLink:!0,hoverAnimation:!0,symbolSize:10,large:!1,largeThreshold:2e3,itemStyle:{normal:{opacity:.8}}}})},function(t,e,i){var n=i(39),r=i(173);i(2).extendChartView({type:\"scatter\",init:function(){this._normalSymbolDraw=new n,this._largeSymbolDraw=new r},render:function(t,e,i){var n=t.getData(),r=this._largeSymbolDraw,o=this._normalSymbolDraw,a=this.group,s=t.get(\"large\")&&n.count()>t.get(\"largeThreshold\")?r:o;this._symbolDraw=s,s.updateData(n),a.add(s.group),a.remove(s===r?o.group:r.group)},updateLayout:function(t){this._symbolDraw.updateLayout(t)},remove:function(t,e){this._symbolDraw&&this._symbolDraw.remove(e,!0)}})},function(t,e,i){i(110),i(40),i(41),i(184),i(185),i(180),i(181),i(107),i(106)},function(t,e,i){function n(t,e){var i=[1/0,-(1/0)];return u(e,function(e){var n=e.getData();n&&u(e.coordDimToDataDim(t),function(t){var e=n.getDataExtent(t);e[0]<i[0]&&(i[0]=e[0]),e[1]>i[1]&&(i[1]=e[1])})},this),i}function r(t,e,i){var n=i.getAxisModel(),r=n.axis.scale,a=[0,100],s=[t.start,t.end],c=[];return e=e.slice(),o(e,n,r),u([\"startValue\",\"endValue\"],function(e){c.push(null!=t[e]?r.parse(t[e]):null)}),u([0,1],function(t){var i=c[t],n=s[t];null!=n||null==i?(null==n&&(n=a[t]),i=r.parse(l.linearMap(n,a,e,!0))):n=l.linearMap(i,e,a,!0),c[t]=i,s[t]=n}),{valueWindow:h(c),percentWindow:h(s)}}function o(t,e,i){return u([\"min\",\"max\"],function(n,r){var o=e.get(n,!0);null!=o&&(o+\"\").toLowerCase()!==\"data\"+n&&(t[r]=i.parse(o));\n}),e.get(\"scale\",!0)||(t[0]>0&&(t[0]=0),t[1]<0&&(t[1]=0)),t}function a(t,e){var i=t.getAxisModel(),n=t._percentWindow,r=t._valueWindow;if(n){var o=e||0===n[0]&&100===n[1],a=!e&&l.getPixelPrecision(r,[0,500]),s=!(e||20>a&&a>=0),u=e||o||s;i.setRange&&i.setRange(u?null:+r[0].toFixed(a),u?null:+r[1].toFixed(a))}}var s=i(1),l=i(4),u=s.each,h=l.asc,c=function(t,e,i,n){this._dimName=t,this._axisIndex=e,this._valueWindow,this._percentWindow,this._dataExtent,this.ecModel=n,this._dataZoomModel=i};c.prototype={constructor:c,hostedBy:function(t){return this._dataZoomModel===t},getDataExtent:function(){return this._dataExtent.slice()},getDataValueWindow:function(){return this._valueWindow.slice()},getDataPercentWindow:function(){return this._percentWindow.slice()},getTargetSeriesModels:function(){var t=[],e=this.ecModel;return e.eachSeries(function(i){var n=this._dimName,r=e.queryComponents({mainType:n+\"Axis\",index:i.get(n+\"AxisIndex\"),id:i.get(n+\"AxisId\")})[0];this._axisIndex===(r&&r.componentIndex)&&t.push(i)},this),t},getAxisModel:function(){return this.ecModel.getComponent(this._dimName+\"Axis\",this._axisIndex)},getOtherAxisModel:function(){var t,e,i=this._dimName,n=this.ecModel,r=this.getAxisModel(),o=\"x\"===i||\"y\"===i;o?(e=\"gridIndex\",t=\"x\"===i?\"y\":\"x\"):(e=\"polarIndex\",t=\"angle\"===i?\"radius\":\"angle\");var a;return n.eachComponent(t+\"Axis\",function(t){(t.get(e)||0)===(r.get(e)||0)&&(a=t)}),a},reset:function(t){if(t===this._dataZoomModel){var e=this._dataExtent=n(this._dimName,this.getTargetSeriesModels()),i=r(t.option,e,this);this._valueWindow=i.valueWindow,this._percentWindow=i.percentWindow,a(this)}},restore:function(t){t===this._dataZoomModel&&(this._valueWindow=this._percentWindow=null,a(this,!0))},filterData:function(t){function e(t){return t>=o[0]&&t<=o[1]}if(t===this._dataZoomModel){var i=this._dimName,n=this.getTargetSeriesModels(),r=t.get(\"filterMode\"),o=this._valueWindow,a=this.getOtherAxisModel();t.get(\"$fromToolbox\")&&a&&\"category\"===a.get(\"type\")&&(r=\"empty\"),u(n,function(t){var n=t.getData();n&&u(t.coordDimToDataDim(i),function(i){\"empty\"===r?t.setData(n.map(i,function(t){return e(t)?t:NaN})):n.filterSelf(i,e)})})}}},t.exports=c},function(t,e,i){t.exports=i(40).extend({type:\"dataZoom.inside\",defaultOption:{zoomLock:!1}})},function(t,e,i){function n(t,e,i,n){e=e.slice();var r=n.axisModels[0];if(r){var a=o(t,r,i),s=a.signal*(e[1]-e[0])*a.pixel/a.pixelLength;return u(s,e,[0,100],\"rigid\"),e}}function r(t,e,i,n,r,s){i=i.slice();var l=r.axisModels[0];if(l){var u=o(e,l,n),h=u.pixel-u.pixelStart,c=h/u.pixelLength*(i[1]-i[0])+i[0];return t=Math.max(t,0),i[0]=(i[0]-c)*t+c,i[1]=(i[1]-c)*t+c,a(i)}}function o(t,e,i){var n=e.axis,r=i.rectProvider(),o={};return\"x\"===n.dim?(o.pixel=t[0],o.pixelLength=r.width,o.pixelStart=r.x,o.signal=n.inverse?1:-1):(o.pixel=t[1],o.pixelLength=r.height,o.pixelStart=r.y,o.signal=n.inverse?-1:1),o}function a(t){var e=[0,100];return!(t[0]<=e[1])&&(t[0]=e[1]),!(t[1]<=e[1])&&(t[1]=e[1]),!(t[0]>=e[0])&&(t[0]=e[0]),!(t[1]>=e[0])&&(t[1]=e[0]),t}var s=i(41),l=i(1),u=i(79),h=i(186),c=l.bind,d=s.extend({type:\"dataZoom.inside\",init:function(t,e){this._range},render:function(t,e,i,n){d.superApply(this,\"render\",arguments),h.shouldRecordRange(n,t.id)&&(this._range=t.getPercentRange());var r=this.getTargetInfo().cartesians,o=l.map(r,function(t){return h.generateCoordId(t.model)});l.each(r,function(e){var n=e.model;h.register(i,{coordId:h.generateCoordId(n),allCoordIds:o,coordinateSystem:n.coordinateSystem,dataZoomId:t.id,throttleRate:t.get(\"throttle\",!0),panGetRange:c(this._onPan,this,e),zoomGetRange:c(this._onZoom,this,e)})},this)},dispose:function(){h.unregister(this.api,this.dataZoomModel.id),d.superApply(this,\"dispose\",arguments),this._range=null},_onPan:function(t,e,i,r){return this._range=n([i,r],this._range,e,t)},_onZoom:function(t,e,i,n,o){var a=this.dataZoomModel;return a.option.zoomLock?this._range:this._range=r(1/i,[n,o],this._range,e,t,a)}});t.exports=d},function(t,e,i){var n=i(40);t.exports=n.extend({type:\"dataZoom.select\"})},function(t,e,i){t.exports=i(41).extend({type:\"dataZoom.select\"})},function(t,e,i){var n=i(40),r=n.extend({type:\"dataZoom.slider\",layoutMode:\"box\",defaultOption:{show:!0,right:\"ph\",top:\"ph\",width:\"ph\",height:\"ph\",left:null,bottom:null,backgroundColor:\"rgba(47,69,84,0)\",dataBackground:{lineStyle:{color:\"#2f4554\",width:.5,opacity:.3},areaStyle:{color:\"rgba(47,69,84,0.3)\",opacity:.3}},borderColor:\"#ddd\",fillerColor:\"rgba(167,183,204,0.4)\",handleIcon:\"M8.2,13.6V3.9H6.3v9.7H3.1v14.9h3.3v9.7h1.8v-9.7h3.3V13.6H8.2z M9.7,24.4H4.8v-1.4h4.9V24.4z M9.7,19.1H4.8v-1.4h4.9V19.1z\",handleSize:\"100%\",handleStyle:{color:\"#a7b7cc\"},labelPrecision:null,labelFormatter:null,showDetail:!0,showDataShadow:\"auto\",realtime:!0,zoomLock:!1,textStyle:{color:\"#333\"}}});t.exports=r},function(t,e,i){function n(t){return\"x\"===t?\"y\":\"x\"}var r=i(1),o=i(3),a=i(81),s=i(41),l=o.Rect,u=i(4),h=u.linearMap,c=i(13),d=i(79),f=u.asc,p=r.bind,g=r.each,v=7,m=1,y=30,x=\"horizontal\",_=\"vertical\",b=5,w=[\"line\",\"bar\",\"candlestick\",\"scatter\"],S=s.extend({type:\"dataZoom.slider\",init:function(t,e){this._displayables={},this._orient,this._range,this._handleEnds,this._size,this._handleWidth,this._handleHeight,this._location,this._dragging,this._dataShadowInfo,this.api=e},render:function(t,e,i,n){return S.superApply(this,\"render\",arguments),a.createOrUpdate(this,\"_dispatchZoomAction\",this.dataZoomModel.get(\"throttle\"),\"fixRate\"),this._orient=t.get(\"orient\"),this.dataZoomModel.get(\"show\")===!1?void this.group.removeAll():(n&&\"dataZoom\"===n.type&&n.from===this.uid||this._buildView(),void this._updateView())},remove:function(){S.superApply(this,\"remove\",arguments),a.clear(this,\"_dispatchZoomAction\")},dispose:function(){S.superApply(this,\"dispose\",arguments),a.clear(this,\"_dispatchZoomAction\")},_buildView:function(){var t=this.group;t.removeAll(),this._resetLocation(),this._resetInterval();var e=this._displayables.barGroup=new o.Group;this._renderBackground(),this._renderHandle(),this._renderDataShadow(),t.add(e),this._positionGroup()},_resetLocation:function(){var t=this.dataZoomModel,e=this.api,i=this._findCoordRect(),n={width:e.getWidth(),height:e.getHeight()},o=this._orient===x?{right:n.width-i.x-i.width,top:n.height-y-v,width:i.width,height:y}:{right:v,top:i.y,width:y,height:i.height},a=c.getLayoutParams(t.option);r.each([\"right\",\"top\",\"width\",\"height\"],function(t){\"ph\"===a[t]&&(a[t]=o[t])});var s=c.getLayoutRect(a,n,t.padding);this._location={x:s.x,y:s.y},this._size=[s.width,s.height],this._orient===_&&this._size.reverse()},_positionGroup:function(){var t=this.group,e=this._location,i=this._orient,n=this.dataZoomModel.getFirstTargetAxisModel(),r=n&&n.get(\"inverse\"),o=this._displayables.barGroup,a=(this._dataShadowInfo||{}).otherAxisInverse;o.attr(i!==x||r?i===x&&r?{scale:a?[-1,1]:[-1,-1]}:i!==_||r?{scale:a?[-1,-1]:[-1,1],rotation:Math.PI/2}:{scale:a?[1,-1]:[1,1],rotation:Math.PI/2}:{scale:a?[1,1]:[1,-1]});var s=t.getBoundingRect([o]);t.attr(\"position\",[e.x-s.x,e.y-s.y])},_getViewExtent:function(){return[0,this._size[0]]},_renderBackground:function(){var t=this.dataZoomModel,e=this._size;this._displayables.barGroup.add(new l({silent:!0,shape:{x:0,y:0,width:e[0],height:e[1]},style:{fill:t.get(\"backgroundColor\")},z2:-40}))},_renderDataShadow:function(){var t=this._dataShadowInfo=this._prepareDataShadowInfo();if(t){var e=this._size,i=t.series,n=i.getRawData(),a=i.getShadowDim?i.getShadowDim():t.otherDim,s=n.getDataExtent(a),l=.3*(s[1]-s[0]);s=[s[0]-l,s[1]+l];var u=[0,e[1]],c=[0,e[0]],d=[[e[0],0],[0,0]],f=[],p=c[1]/(n.count()-1),g=0,v=Math.round(n.count()/e[0]);n.each([a],function(t,e){if(v>0&&e%v)return void(g+=p);var i=null==t||isNaN(t)||\"\"===t?null:h(t,s,u,!0);null!=i&&(d.push([g,i]),f.push([g,i])),g+=p});var m=this.dataZoomModel;this._displayables.barGroup.add(new o.Polygon({shape:{points:d},style:r.defaults({fill:m.get(\"dataBackgroundColor\")},m.getModel(\"dataBackground.areaStyle\").getAreaStyle()),silent:!0,z2:-20})),this._displayables.barGroup.add(new o.Polyline({shape:{points:f},style:m.getModel(\"dataBackground.lineStyle\").getLineStyle(),silent:!0,z2:-19}))}},_prepareDataShadowInfo:function(){var t=this.dataZoomModel,e=t.get(\"showDataShadow\");if(e!==!1){var i,o=this.ecModel;return t.eachTargetAxis(function(a,s){var l=t.getAxisProxy(a.name,s).getTargetSeriesModels();r.each(l,function(t){if(!(i||e!==!0&&r.indexOf(w,t.get(\"type\"))<0)){var l=n(a.name),u=o.getComponent(a.axis,s).axis;i={thisAxis:u,series:t,thisDim:a.name,otherDim:l,otherAxisInverse:t.coordinateSystem.getOtherAxis(u).inverse}}},this)},this),i}},_renderHandle:function(){var t=this._displayables,e=t.handles=[],i=t.handleLabels=[],n=this._displayables.barGroup,r=this._size,a=this.dataZoomModel;n.add(t.filler=new l({draggable:!0,cursor:\"move\",drift:p(this._onDragMove,this,\"all\"),ondragstart:p(this._showDataInfo,this,!0),ondragend:p(this._onDragEnd,this),onmouseover:p(this._showDataInfo,this,!0),onmouseout:p(this._showDataInfo,this,!1),style:{fill:a.get(\"fillerColor\"),textPosition:\"inside\"}})),n.add(new l(o.subPixelOptimizeRect({silent:!0,shape:{x:0,y:0,width:r[0],height:r[1]},style:{stroke:a.get(\"dataBackgroundColor\")||a.get(\"borderColor\"),lineWidth:m,fill:\"rgba(0,0,0,0)\"}})));var s=a.get(\"handleIcon\");g([0,1],function(t){var r=o.makePath(s,{style:{strokeNoScale:!0},rectHover:!0,cursor:\"vertical\"===this._orient?\"ns-resize\":\"ew-resize\",draggable:!0,drift:p(this._onDragMove,this,t),ondragend:p(this._onDragEnd,this),onmouseover:p(this._showDataInfo,this,!0),onmouseout:p(this._showDataInfo,this,!1)},{x:-.5,y:0,width:1,height:1},\"center\"),l=r.getBoundingRect();this._handleHeight=u.parsePercent(a.get(\"handleSize\"),this._size[1]),this._handleWidth=l.width/l.height*this._handleHeight,r.setStyle(a.getModel(\"handleStyle\").getItemStyle());var h=a.get(\"handleColor\");null!=h&&(r.style.fill=h),n.add(e[t]=r);var c=a.textStyleModel;this.group.add(i[t]=new o.Text({silent:!0,invisible:!0,style:{x:0,y:0,text:\"\",textVerticalAlign:\"middle\",textAlign:\"center\",fill:c.getTextColor(),textFont:c.getFont()},z2:10}))},this)},_resetInterval:function(){var t=this._range=this.dataZoomModel.getPercentRange(),e=this._getViewExtent();this._handleEnds=[h(t[0],[0,100],e,!0),h(t[1],[0,100],e,!0)]},_updateInterval:function(t,e){var i=this._handleEnds,n=this._getViewExtent();d(e,i,n,\"all\"===t||this.dataZoomModel.get(\"zoomLock\")?\"rigid\":\"cross\",t),this._range=f([h(i[0],n,[0,100],!0),h(i[1],n,[0,100],!0)])},_updateView:function(){var t=this._displayables,e=this._handleEnds,i=f(e.slice()),n=this._size;g([0,1],function(i){var r=t.handles[i],o=this._handleHeight;r.attr({scale:[o,o],position:[e[i],n[1]/2-o/2]})},this),t.filler.setShape({x:i[0],y:0,width:i[1]-i[0],height:n[1]}),this._updateDataInfo()},_updateDataInfo:function(){function t(t){var e=o.getTransform(i.handles[t].parent,this.group),s=o.transformDirection(0===t?\"right\":\"left\",e),l=this._handleWidth/2+b,h=o.applyTransform([u[t]+(0===t?-l:l),this._size[1]/2],e);n[t].setStyle({x:h[0],y:h[1],textVerticalAlign:r===x?\"middle\":s,textAlign:r===x?s:\"center\",text:a[t]})}var e=this.dataZoomModel,i=this._displayables,n=i.handleLabels,r=this._orient,a=[\"\",\"\"];if(e.get(\"showDetail\")){var s,l;e.eachTargetAxis(function(t,i){s||(s=e.getAxisProxy(t.name,i).getDataValueWindow(),l=this.ecModel.getComponent(t.axis,i).axis)},this),s&&(a=[this._formatLabel(s[0],l),this._formatLabel(s[1],l)])}var u=f(this._handleEnds.slice());t.call(this,0),t.call(this,1)},_formatLabel:function(t,e){var i=this.dataZoomModel,n=i.get(\"labelFormatter\");if(r.isFunction(n))return n(t);var o=i.get(\"labelPrecision\");return null!=o&&\"auto\"!==o||(o=e.getPixelPrecision()),t=null==t&&isNaN(t)?\"\":\"category\"===e.type||\"time\"===e.type?e.scale.getLabel(Math.round(t)):t.toFixed(Math.min(o,20)),r.isString(n)&&(t=n.replace(\"{value}\",t)),t},_showDataInfo:function(t){t=this._dragging||t;var e=this._displayables.handleLabels;e[0].attr(\"invisible\",!t),e[1].attr(\"invisible\",!t)},_onDragMove:function(t,e,i){this._dragging=!0;var n=this._applyBarTransform([e,i],!0);this._updateInterval(t,n[0]),this._updateView(),this.dataZoomModel.get(\"realtime\")&&this._dispatchZoomAction()},_onDragEnd:function(){this._dragging=!1,this._showDataInfo(!1),this._dispatchZoomAction()},_dispatchZoomAction:function(){var t=this._range;this.api.dispatchAction({type:\"dataZoom\",from:this.uid,dataZoomId:this.dataZoomModel.id,start:t[0],end:t[1]})},_applyBarTransform:function(t,e){var i=this._displayables.barGroup.getLocalTransform();return o.applyTransform(t,i,e)},_findCoordRect:function(){var t,e=this.getTargetInfo();if(e.cartesians.length)t=e.cartesians[0].model.coordinateSystem.getRect();else{var i=this.api.getWidth(),n=this.api.getHeight();t={x:.2*i,y:.2*n,width:.6*i,height:.6*n}}return t}});t.exports=S},function(t,e,i){function n(t){var e=t.getZr();return e[p]||(e[p]={})}function r(t,e,i){var n=new c(t.getZr());return n.enable(),n.on(\"pan\",f(a,i)),n.on(\"zoom\",f(s,i)),n}function o(t){h.each(t,function(e,i){e.count||(e.controller.off(\"pan\").off(\"zoom\"),delete t[i])})}function a(t,e,i){l(t,function(n){return n.panGetRange(t.controller,e,i)})}function s(t,e,i,n){l(t,function(r){return r.zoomGetRange(t.controller,e,i,n)})}function l(t,e){var i=[];h.each(t.dataZoomInfos,function(t){var n=e(t);n&&i.push({dataZoomId:t.dataZoomId,start:n[0],end:n[1]})}),t.dispatchAction(i)}function u(t,e){t.dispatchAction({type:\"dataZoom\",batch:e})}var h=i(1),c=i(78),d=i(81),f=h.curry,p=\"\\x00_ec_dataZoom_roams\",g={register:function(t,e){var i=n(t),a=e.dataZoomId,s=e.coordId;h.each(i,function(t,i){var n=t.dataZoomInfos;n[a]&&h.indexOf(e.allCoordIds,s)<0&&(delete n[a],t.count--)}),o(i);var l=i[s];l||(l=i[s]={coordId:s,dataZoomInfos:{},count:0},l.controller=r(t,e,l),l.dispatchAction=h.curry(u,t));var c=e.coordinateSystem.getRect().clone();l.controller.rectProvider=function(){return c},d.createOrUpdate(l,\"dispatchAction\",e.throttleRate,\"fixRate\"),!l.dataZoomInfos[a]&&l.count++,l.dataZoomInfos[a]=e},unregister:function(t,e){var i=n(t);h.each(i,function(t){var i=t.dataZoomInfos;i[e]&&(delete i[e],t.count--)}),o(i)},shouldRecordRange:function(t,e){if(t&&\"dataZoom\"===t.type&&t.batch)for(var i=0,n=t.batch.length;n>i;i++)if(t.batch[i].dataZoomId===e)return!1;return!0},generateCoordId:function(t){return t.type+\"\\x00_\"+t.id}};t.exports=g},function(t,e,i){i(110),i(40),i(41),i(182),i(183),i(107),i(106)},function(t,e,i){i(189),i(191),i(190);var n=i(2);n.registerProcessor(i(192))},function(t,e,i){\"use strict\";var n=i(1),r=i(9),o=i(2).extendComponentModel({type:\"legend\",dependencies:[\"series\"],layoutMode:{type:\"box\",ignoreSize:!0},init:function(t,e,i){this.mergeDefaultAndTheme(t,i),t.selected=t.selected||{}},mergeOption:function(t){o.superCall(this,\"mergeOption\",t)},optionUpdated:function(){this._updateData(this.ecModel);var t=this._data;if(t[0]&&\"single\"===this.get(\"selectedMode\")){for(var e=!1,i=0;i<t.length;i++){var n=t[i].get(\"name\");if(this.isSelected(n)){this.select(n),e=!0;break}}!e&&this.select(t[0].get(\"name\"))}},_updateData:function(t){var e=n.map(this.get(\"data\")||[],function(t){return\"string\"!=typeof t&&\"number\"!=typeof t||(t={name:t}),new r(t,this,this.ecModel)},this);this._data=e;var i=n.map(t.getSeries(),function(t){return t.name});t.eachSeries(function(t){if(t.legendDataProvider){var e=t.legendDataProvider();i=i.concat(e.mapArray(e.getName))}}),this._availableNames=i},getData:function(){return this._data},select:function(t){var e=this.option.selected,i=this.get(\"selectedMode\");if(\"single\"===i){var r=this._data;n.each(r,function(t){e[t.get(\"name\")]=!1})}e[t]=!0},unSelect:function(t){\"single\"!==this.get(\"selectedMode\")&&(this.option.selected[t]=!1)},toggleSelected:function(t){var e=this.option.selected;t in e||(e[t]=!0),this[e[t]?\"unSelect\":\"select\"](t)},isSelected:function(t){var e=this.option.selected;return!(t in e&&!e[t])&&n.indexOf(this._availableNames,t)>=0},defaultOption:{zlevel:0,z:4,show:!0,orient:\"horizontal\",left:\"center\",top:\"top\",align:\"auto\",backgroundColor:\"rgba(0,0,0,0)\",borderColor:\"#ccc\",borderWidth:0,padding:5,itemGap:10,itemWidth:25,itemHeight:14,inactiveColor:\"#ccc\",textStyle:{color:\"#333\"},selectedMode:!0,tooltip:{show:!1}}});t.exports=o},function(t,e,i){function n(t,e){e.dispatchAction({type:\"legendToggleSelect\",name:t})}function r(t,e,i){var n=i.getZr().storage.getDisplayList()[0];n&&n.useHoverLayer||t.get(\"legendHoverLink\")&&i.dispatchAction({type:\"highlight\",seriesName:t.name,name:e})}function o(t,e,i){var n=i.getZr().storage.getDisplayList()[0];n&&n.useHoverLayer||t.get(\"legendHoverLink\")&&i.dispatchAction({type:\"downplay\",seriesName:t.name,name:e})}var a=i(1),s=i(26),l=i(3),u=i(114),h=a.curry;t.exports=i(2).extendComponentView({type:\"legend\",init:function(){this._symbolTypeStore={}},render:function(t,e,i){var s=this.group;if(s.removeAll(),t.get(\"show\")){var c=t.get(\"selectedMode\"),d=t.get(\"align\");\"auto\"===d&&(d=\"right\"===t.get(\"left\")&&\"vertical\"===t.get(\"orient\")?\"right\":\"left\");var f={};a.each(t.getData(),function(a){var u=a.get(\"name\");if(\"\"===u||\"\\n\"===u)return void s.add(new l.Group({newline:!0}));var p=e.getSeriesByName(u)[0];if(!f[u])if(p){var g=p.getData(),v=g.getVisual(\"color\");\"function\"==typeof v&&(v=v(p.getDataParams(0)));var m=g.getVisual(\"legendSymbol\")||\"roundRect\",y=g.getVisual(\"symbol\"),x=this._createItem(u,a,t,m,y,d,v,c);x.on(\"click\",h(n,u,i)).on(\"mouseover\",h(r,p,\"\",i)).on(\"mouseout\",h(o,p,\"\",i)),f[u]=!0}else e.eachRawSeries(function(e){if(!f[u]&&e.legendDataProvider){var s=e.legendDataProvider(),l=s.indexOfName(u);if(0>l)return;var p=s.getItemVisual(l,\"color\"),g=\"roundRect\",v=this._createItem(u,a,t,g,null,d,p,c);v.on(\"click\",h(n,u,i)).on(\"mouseover\",h(r,e,u,i)).on(\"mouseout\",h(o,e,u,i)),f[u]=!0}},this)},this),u.layout(s,t,i),u.addBackground(s,t)}},_createItem:function(t,e,i,n,r,o,u,h){var c=i.get(\"itemWidth\"),d=i.get(\"itemHeight\"),f=i.get(\"inactiveColor\"),p=i.isSelected(t),g=new l.Group,v=e.getModel(\"textStyle\"),m=e.get(\"icon\"),y=e.getModel(\"tooltip\");if(n=m||n,g.add(s.createSymbol(n,0,0,c,d,p?u:f)),!m&&r&&(r!==n||\"none\"==r)){var x=.8*d;\"none\"===r&&(r=\"circle\"),g.add(s.createSymbol(r,(c-x)/2,(d-x)/2,x,x,p?u:f))}var _=\"left\"===o?c+5:-5,b=o,w=i.get(\"formatter\"),S=t;\"string\"==typeof w&&w?S=w.replace(\"{name}\",t):\"function\"==typeof w&&(S=w(t));var M=new l.Text({style:{text:S,x:_,y:d/2,fill:p?v.getTextColor():f,textFont:v.getFont(),textAlign:b,textVerticalAlign:\"middle\"}});g.add(M);var T=new l.Rect({shape:g.getBoundingRect(),invisible:!0,tooltip:y.get(\"show\")?a.extend({content:t,formatter:function(){return t},formatterParams:{componentType:\"legend\",legendIndex:i.componentIndex,name:t,$vars:[\"name\"]}},y.option):null});return g.add(T),g.eachChild(function(t){t.silent=!0}),T.silent=!h,this.group.add(g),l.setHoverStyle(g),g}})},function(t,e,i){function n(t,e,i){var n,r={},a=\"toggleSelected\"===t;return i.eachComponent(\"legend\",function(i){a&&null!=n?i[n?\"select\":\"unSelect\"](e.name):(i[t](e.name),n=i.isSelected(e.name));var s=i.getData();o.each(s,function(t){var e=t.get(\"name\");if(\"\\n\"!==e&&\"\"!==e){var n=i.isSelected(e);e in r?r[e]=r[e]&&n:r[e]=n}})}),{name:e.name,selected:r}}var r=i(2),o=i(1);r.registerAction(\"legendToggleSelect\",\"legendselectchanged\",o.curry(n,\"toggleSelected\")),r.registerAction(\"legendSelect\",\"legendselected\",o.curry(n,\"select\")),r.registerAction(\"legendUnSelect\",\"legendunselected\",o.curry(n,\"unSelect\"))},function(t,e){t.exports=function(t){var e=t.findComponents({mainType:\"legend\"});e&&e.length&&t.filterSeries(function(t){for(var i=0;i<e.length;i++)if(!e[i].isSelected(t.name))return!1;return!0})}},function(t,e,i){i(196),i(197),i(2).registerPreprocessor(function(t){t.markArea=t.markArea||{}})},function(t,e,i){i(198),i(199),i(2).registerPreprocessor(function(t){t.markLine=t.markLine||{}})},function(t,e,i){i(200),i(201),i(2).registerPreprocessor(function(t){t.markPoint=t.markPoint||{}})},function(t,e,i){t.exports=i(67).extend({type:\"markArea\",defaultOption:{zlevel:0,z:1,tooltip:{trigger:\"item\"},animation:!1,label:{normal:{show:!0,position:\"top\"},emphasis:{show:!0,position:\"top\"}},itemStyle:{normal:{borderWidth:0}}}})},function(t,e,i){function n(t){return!isNaN(t)&&!isFinite(t)}function r(t,e,i,r){var o=1-t;return n(e[o])&&n(i[o])}function o(t,e){var i=e.coord[0],n=e.coord[1];return\"cartesian2d\"===t.type&&i&&n&&(r(1,i,n,t)||r(0,i,n,t))?!0:f.dataFilter(t,{coord:i,x:e.x0,y:e.y0})||f.dataFilter(t,{coord:n,x:e.x1,y:e.y1})}function a(t,e,i,r,o){var a,s=r.coordinateSystem,l=t.getItemModel(e),u=h.parsePercent(l.get(i[0]),o.getWidth()),c=h.parsePercent(l.get(i[1]),o.getHeight());if(isNaN(u)||isNaN(c)){if(r.getMarkerPosition)a=r.getMarkerPosition(t.getValues(i,e));else{var d=t.get(i[0],e),f=t.get(i[1],e);a=s.dataToPoint([d,f],!0)}if(\"cartesian2d\"===s.type){var p=s.getAxis(\"x\"),g=s.getAxis(\"y\"),d=t.get(i[0],e),f=t.get(i[1],e);n(d)?a[0]=p.toGlobalCoord(p.getExtent()[\"x0\"===i[0]?0:1]):n(f)&&(a[1]=g.toGlobalCoord(g.getExtent()[\"y0\"===i[1]?0:1]))}isNaN(u)||(a[0]=u),isNaN(c)||(a[1]=c)}else a=[u,c];return a}function s(t,e,i){var n,r,a=[\"x0\",\"y0\",\"x1\",\"y1\"];t?(n=l.map(t&&t.dimensions,function(t){var i=e.getData().getDimensionInfo(e.coordDimToDataDim(t)[0])||{};return i.name=t,i}),r=new u(l.map(a,function(t,e){return{name:t,type:n[e%2].type}}),i)):(n=[{name:\"value\",type:\"float\"}],r=new u(n,i));var s=l.map(i.get(\"data\"),l.curry(p,e,t,i));t&&(s=l.filter(s,l.curry(o,t)));var h=t?function(t,e,i,n){return t.coord[Math.floor(n/2)][n%2]}:function(t){return t.value};return r.initData(s,null,h),r.hasItemOption=!0,r}var l=i(1),u=i(14),h=i(4),c=i(3),d=i(18),f=i(69),p=function(t,e,i,n){var r=f.dataTransform(t,n[0]),o=f.dataTransform(t,n[1]),a=l.retrieve,s=r.coord,u=o.coord;s[0]=a(s[0],-(1/0)),s[1]=a(s[1],-(1/0)),u[0]=a(u[0],1/0),u[1]=a(u[1],1/0);var h=l.mergeAll([{},r,o]);return h.coord=[r.coord,o.coord],h.x0=r.x,h.y0=r.y,h.x1=o.x,h.y1=o.y,h},g=[[\"x0\",\"y0\"],[\"x1\",\"y0\"],[\"x1\",\"y1\"],[\"x0\",\"y1\"]];i(68).extend({type:\"markArea\",updateLayout:function(t,e,i){e.eachSeries(function(t){var e=t.markAreaModel;if(e){var n=e.getData();n.each(function(e){var r=l.map(g,function(r){return a(n,e,r,t,i)});n.setItemLayout(e,r);var o=n.getItemGraphicEl(e);o.setShape(\"points\",r)})}},this)},renderSeries:function(t,e,i,n){var r=t.coordinateSystem,o=t.name,u=t.getData(),h=this.markerGroupMap,f=h[o];f||(f=h[o]={group:new c.Group}),this.group.add(f.group),f.__keep=!0;var p=s(r,t,e);e.setData(p),p.each(function(e){p.setItemLayout(e,l.map(g,function(i){return a(p,e,i,t,n)})),p.setItemVisual(e,{color:u.getVisual(\"color\")})}),p.diff(f.__data).add(function(t){var e=new c.Polygon({shape:{points:p.getItemLayout(t)}});p.setItemGraphicEl(t,e),f.group.add(e)}).update(function(t,i){var n=f.__data.getItemGraphicEl(i);c.updateProps(n,{shape:{points:p.getItemLayout(t)}},e,t),f.group.add(n),p.setItemGraphicEl(t,n)}).remove(function(t){var e=f.__data.getItemGraphicEl(t);f.group.remove(e)}).execute(),p.eachItemGraphicEl(function(t,i){var n=p.getItemModel(i),r=n.getModel(\"label.normal\"),o=n.getModel(\"label.emphasis\"),a=p.getItemVisual(i,\"color\");t.useStyle(l.defaults(n.getModel(\"itemStyle.normal\").getItemStyle(),{fill:d.modifyAlpha(a,.4),stroke:a})),t.hoverStyle=n.getModel(\"itemStyle.normal\").getItemStyle();var s=p.getName(i)||\"\",u=a||t.style.fill;c.setText(t.style,r,u),t.style.text=l.retrieve(e.getFormattedLabel(i,\"normal\"),s),c.setText(t.hoverStyle,o,u),t.hoverStyle.text=l.retrieve(e.getFormattedLabel(i,\"emphasis\"),s),c.setHoverStyle(t,{}),t.dataModel=e}),f.__data=p,f.group.silent=e.get(\"silent\")||t.get(\"silent\")}})},function(t,e,i){t.exports=i(67).extend({type:\"markLine\",defaultOption:{zlevel:0,z:5,symbol:[\"circle\",\"arrow\"],symbolSize:[8,16],precision:2,tooltip:{trigger:\"item\"},label:{normal:{show:!0,position:\"end\"},emphasis:{show:!0}},lineStyle:{normal:{type:\"dashed\"},emphasis:{width:3}},animationEasing:\"linear\"}})},function(t,e,i){function n(t){return!isNaN(t)&&!isFinite(t)}function r(t,e,i,r){var o=1-t,a=r.dimensions[t];return n(e[o])&&n(i[o])&&e[t]===i[t]&&r.getAxis(a).containData(e[t])}function o(t,e){if(\"cartesian2d\"===t.type){var i=e[0].coord,n=e[1].coord;if(i&&n&&(r(1,i,n,t)||r(0,i,n,t)))return!0}return c.dataFilter(t,e[0])&&c.dataFilter(t,e[1])}function a(t,e,i,r,o){var a,s=r.coordinateSystem,l=t.getItemModel(e),u=h.parsePercent(l.get(\"x\"),o.getWidth()),c=h.parsePercent(l.get(\"y\"),o.getHeight());if(isNaN(u)||isNaN(c)){if(r.getMarkerPosition)a=r.getMarkerPosition(t.getValues(t.dimensions,e));else{var d=s.dimensions,f=t.get(d[0],e),p=t.get(d[1],e);a=s.dataToPoint([f,p])}if(\"cartesian2d\"===s.type){var g=s.getAxis(\"x\"),v=s.getAxis(\"y\"),d=s.dimensions;n(t.get(d[0],e))?a[0]=g.toGlobalCoord(g.getExtent()[i?0:1]):n(t.get(d[1],e))&&(a[1]=v.toGlobalCoord(v.getExtent()[i?0:1]))}isNaN(u)||(a[0]=u),isNaN(c)||(a[1]=c)}else a=[u,c];t.setItemLayout(e,a)}function s(t,e,i){var n;n=t?l.map(t&&t.dimensions,function(t){var i=e.getData().getDimensionInfo(e.coordDimToDataDim(t)[0])||{};return i.name=t,i}):[{name:\"value\",type:\"float\"}];var r=new u(n,i),a=new u(n,i),s=new u([],i),h=l.map(i.get(\"data\"),l.curry(f,e,t,i));t&&(h=l.filter(h,l.curry(o,t)));var d=t?c.dimValueGetter:function(t){return t.value};return r.initData(l.map(h,function(t){return t[0]}),null,d),a.initData(l.map(h,function(t){return t[1]}),null,d),s.initData(l.map(h,function(t){return t[2]})),s.hasItemOption=!0,{from:r,to:a,line:s}}var l=i(1),u=i(14),h=i(4),c=i(69),d=i(93),f=function(t,e,i,n){var r=t.getData(),o=n.type;if(!l.isArray(n)&&(\"min\"===o||\"max\"===o||\"average\"===o||null!=n.xAxis||null!=n.yAxis)){var a,s,u;if(null!=n.yAxis||null!=n.xAxis)s=null!=n.yAxis?\"y\":\"x\",a=e.getAxis(s),u=l.retrieve(n.yAxis,n.xAxis);else{var h=c.getAxisInfo(n,r,e,t);s=h.valueDataDim,a=h.valueAxis,u=c.numCalculate(r,s,o)}var d=\"x\"===s?0:1,f=1-d,p=l.clone(n),g={};p.type=null,p.coord=[],g.coord=[],p.coord[f]=-(1/0),g.coord[f]=1/0;var v=i.get(\"precision\");v>=0&&(u=+u.toFixed(v)),p.coord[d]=g.coord[d]=u,n=[p,g,{type:o,valueIndex:n.valueIndex,value:u}]}return n=[c.dataTransform(t,n[0]),c.dataTransform(t,n[1]),l.extend({},n[2])],n[2].type=n[2].type||\"\",l.merge(n[2],n[0]),l.merge(n[2],n[1]),n};i(68).extend({type:\"markLine\",updateLayout:function(t,e,i){e.eachSeries(function(t){var e=t.markLineModel;if(e){var n=e.getData(),r=e.__from,o=e.__to;r.each(function(e){a(r,e,!0,t,i),a(o,e,!1,t,i)}),n.each(function(t){n.setItemLayout(t,[r.getItemLayout(t),o.getItemLayout(t)])}),this.markerGroupMap[t.name].updateLayout()}},this)},renderSeries:function(t,e,i,n){function r(e,i,r){var o=e.getItemModel(i);a(e,i,r,t,n),e.setItemVisual(i,{symbolSize:o.get(\"symbolSize\")||x[r?0:1],symbol:o.get(\"symbol\",!0)||y[r?0:1],color:o.get(\"itemStyle.normal.color\")||h.getVisual(\"color\")})}var o=t.coordinateSystem,u=t.name,h=t.getData(),c=this.markerGroupMap,f=c[u];f||(f=c[u]=new d),this.group.add(f.group);var p=s(o,t,e),g=p.from,v=p.to,m=p.line;e.__from=g,e.__to=v,e.setData(m);var y=e.get(\"symbol\"),x=e.get(\"symbolSize\");l.isArray(y)||(y=[y,y]),\"number\"==typeof x&&(x=[x,x]),p.from.each(function(t){r(g,t,!0),r(v,t,!1)}),m.each(function(t){var e=m.getItemModel(t).get(\"lineStyle.normal.color\");m.setItemVisual(t,{color:e||g.getItemVisual(t,\"color\")}),m.setItemLayout(t,[g.getItemLayout(t),v.getItemLayout(t)]),m.setItemVisual(t,{fromSymbolSize:g.getItemVisual(t,\"symbolSize\"),fromSymbol:g.getItemVisual(t,\"symbol\"),toSymbolSize:v.getItemVisual(t,\"symbolSize\"),toSymbol:v.getItemVisual(t,\"symbol\")})}),f.updateData(m),p.line.eachItemGraphicEl(function(t,i){t.traverse(function(t){t.dataModel=e})}),f.__keep=!0,f.group.silent=e.get(\"silent\")||t.get(\"silent\")}})},function(t,e,i){t.exports=i(67).extend({type:\"markPoint\",defaultOption:{zlevel:0,z:5,symbol:\"pin\",symbolSize:50,tooltip:{trigger:\"item\"},label:{normal:{show:!0,position:\"inside\"},emphasis:{show:!0}},itemStyle:{normal:{borderWidth:2}}}})},function(t,e,i){function n(t,e,i){var n=e.coordinateSystem;t.each(function(r){var o,a=t.getItemModel(r),l=s.parsePercent(a.get(\"x\"),i.getWidth()),u=s.parsePercent(a.get(\"y\"),i.getHeight());if(isNaN(l)||isNaN(u)){if(e.getMarkerPosition)o=e.getMarkerPosition(t.getValues(t.dimensions,r));else if(n){var h=t.get(n.dimensions[0],r),c=t.get(n.dimensions[1],r);o=n.dataToPoint([h,c])}}else o=[l,u];isNaN(l)||(o[0]=l),isNaN(u)||(o[1]=u),t.setItemLayout(r,o)})}function r(t,e,i){var n;n=t?a.map(t&&t.dimensions,function(t){var i=e.getData().getDimensionInfo(e.coordDimToDataDim(t)[0])||{};return i.name=t,i}):[{name:\"value\",type:\"float\"}];var r=new l(n,i),o=a.map(i.get(\"data\"),a.curry(u.dataTransform,e));return t&&(o=a.filter(o,a.curry(u.dataFilter,t))),r.initData(o,null,t?u.dimValueGetter:function(t){return t.value}),r}var o=i(39),a=i(1),s=i(4),l=i(14),u=i(69);i(68).extend({type:\"markPoint\",updateLayout:function(t,e,i){e.eachSeries(function(t){var e=t.markPointModel;e&&(n(e.getData(),t,i),this.markerGroupMap[t.name].updateLayout(e))},this)},renderSeries:function(t,e,i,a){var s=t.coordinateSystem,l=t.name,u=t.getData(),h=this.markerGroupMap,c=h[l];c||(c=h[l]=new o);var d=r(s,t,e);e.setData(d),n(e.getData(),t,a),d.each(function(t){var i=d.getItemModel(t),n=i.getShallow(\"symbolSize\");\"function\"==typeof n&&(n=n(e.getRawValue(t),e.getDataParams(t))),d.setItemVisual(t,{symbolSize:n,color:i.get(\"itemStyle.normal.color\")||u.getVisual(\"color\"),symbol:i.getShallow(\"symbol\")})}),c.updateData(d),this.group.add(c.group),d.eachItemGraphicEl(function(t){t.traverse(function(t){t.dataModel=e})}),c.__keep=!0,c.group.silent=e.get(\"silent\")||t.get(\"silent\")}})},function(t,e,i){\"use strict\";var n=i(2),r=i(3),o=i(13);n.extendComponentModel({type:\"title\",layoutMode:{type:\"box\",ignoreSize:!0},defaultOption:{zlevel:0,z:6,show:!0,text:\"\",target:\"blank\",subtext:\"\",subtarget:\"blank\",left:0,top:0,backgroundColor:\"rgba(0,0,0,0)\",borderColor:\"#ccc\",borderWidth:0,padding:5,itemGap:10,textStyle:{fontSize:18,fontWeight:\"bolder\",color:\"#333\"},subtextStyle:{color:\"#aaa\"}}}),n.extendComponentView({type:\"title\",render:function(t,e,i){if(this.group.removeAll(),t.get(\"show\")){var n=this.group,a=t.getModel(\"textStyle\"),s=t.getModel(\"subtextStyle\"),l=t.get(\"textAlign\"),u=t.get(\"textBaseline\"),h=new r.Text({style:{text:t.get(\"text\"),textFont:a.getFont(),fill:a.getTextColor()},z2:10}),c=h.getBoundingRect(),d=t.get(\"subtext\"),f=new r.Text({style:{text:d,textFont:s.getFont(),fill:s.getTextColor(),y:c.height+t.get(\"itemGap\"),textBaseline:\"top\"},z2:10}),p=t.get(\"link\"),g=t.get(\"sublink\");h.silent=!p,f.silent=!g,p&&h.on(\"click\",function(){window.open(p,\"_\"+t.get(\"target\"))}),g&&f.on(\"click\",function(){window.open(g,\"_\"+t.get(\"subtarget\"))}),n.add(h),d&&n.add(f);var v=n.getBoundingRect(),m=t.getBoxLayoutParams();m.width=v.width,m.height=v.height;var y=o.getLayoutRect(m,{width:i.getWidth(),height:i.getHeight()},t.get(\"padding\"));l||(l=t.get(\"left\")||t.get(\"right\"),\"middle\"===l&&(l=\"center\"),\"right\"===l?y.x+=y.width:\"center\"===l&&(y.x+=y.width/2)),u||(u=t.get(\"top\")||t.get(\"bottom\"),\"center\"===u&&(u=\"middle\"),\"bottom\"===u?y.y+=y.height:\"middle\"===u&&(y.y+=y.height/2),u=u||\"top\"),n.attr(\"position\",[y.x,y.y]);var x={textAlign:l,textVerticalAlign:u};h.setStyle(x),f.setStyle(x),v=n.getBoundingRect();var _=y.margin,b=t.getItemStyle([\"color\",\"opacity\"]);b.fill=t.get(\"backgroundColor\");var w=new r.Rect({shape:{x:v.x-_[3],y:v.y-_[0],width:v.width+_[1]+_[3],height:v.height+_[0]+_[2]},style:b,silent:!0});r.subPixelOptimizeRect(w),n.add(w)}}})},function(t,e,i){i(204),i(205),i(210),i(208),i(206),i(207),i(209)},function(t,e,i){var n=i(25),r=i(1),o=i(2).extendComponentModel({type:\"toolbox\",layoutMode:{type:\"box\",ignoreSize:!0},mergeDefaultAndTheme:function(t){o.superApply(this,\"mergeDefaultAndTheme\",arguments),r.each(this.option.feature,function(t,e){var i=n.get(e);i&&r.merge(t,i.defaultOption)})},defaultOption:{show:!0,z:6,zlevel:0,orient:\"horizontal\",left:\"right\",top:\"top\",backgroundColor:\"transparent\",borderColor:\"#ccc\",borderWidth:0,padding:5,itemSize:15,itemGap:8,showTitle:!0,iconStyle:{normal:{borderColor:\"#666\",color:\"none\"},emphasis:{borderColor:\"#3E98C5\"}}}});t.exports=o},function(t,e,i){(function(e){function n(t){return 0===t.indexOf(\"my\")}var r=i(25),o=i(1),a=i(3),s=i(9),l=i(45),u=i(114),h=i(16);t.exports=i(2).extendComponentView({type:\"toolbox\",render:function(t,e,i,c){\nfunction d(o,a){var l,u=y[o],h=y[a],d=v[u],p=new s(d,t,t.ecModel);if(u&&!h){if(n(u))l={model:p,onclick:p.option.onclick,featureName:u};else{var g=r.get(u);if(!g)return;l=new g(p,e,i)}m[u]=l}else{if(l=m[h],!l)return;l.model=p,l.ecModel=e,l.api=i}return!u&&h?void(l.dispose&&l.dispose(e,i)):!p.get(\"show\")||l.unusable?void(l.remove&&l.remove(e,i)):(f(p,l,u),p.setIconStatus=function(t,e){var i=this.option,n=this.iconPaths;i.iconStatus=i.iconStatus||{},i.iconStatus[t]=e,n[t]&&n[t].trigger(e)},void(l.render&&l.render(p,e,i,c)))}function f(n,r,s){var l=n.getModel(\"iconStyle\"),u=r.getIcons?r.getIcons():n.get(\"icon\"),h=n.get(\"title\")||{};if(\"string\"==typeof u){var c=u,d=h;u={},h={},u[s]=c,h[s]=d}var f=n.iconPaths={};o.each(u,function(s,u){var c=l.getModel(\"normal\").getItemStyle(),d=l.getModel(\"emphasis\").getItemStyle(),v={x:-g/2,y:-g/2,width:g,height:g},m=0===s.indexOf(\"image://\")?(v.image=s.slice(8),new a.Image({style:v})):a.makePath(s.replace(\"path://\",\"\"),{style:c,hoverStyle:d,rectHover:!0},v,\"center\");a.setHoverStyle(m),t.get(\"showTitle\")&&(m.__title=h[u],m.on(\"mouseover\",function(){m.setStyle({text:h[u],textPosition:d.textPosition||\"bottom\",textFill:d.fill||d.stroke||\"#000\",textAlign:d.textAlign||\"center\"})}).on(\"mouseout\",function(){m.setStyle({textFill:null})})),m.trigger(n.get(\"iconStatus.\"+u)||\"normal\"),p.add(m),m.on(\"click\",o.bind(r.onclick,r,e,i,u)),f[u]=m})}var p=this.group;if(p.removeAll(),t.get(\"show\")){var g=+t.get(\"itemSize\"),v=t.get(\"feature\")||{},m=this._features||(this._features={}),y=[];o.each(v,function(t,e){y.push(e)}),new l(this._featureNames||[],y).add(d).update(d).remove(o.curry(d,null)).execute(),this._featureNames=y,u.layout(p,t,i),u.addBackground(p,t),p.eachChild(function(t){var e=t.__title,n=t.hoverStyle;if(n&&e){var r=h.getBoundingRect(e,n.font),o=t.position[0]+p.position[0],a=t.position[1]+p.position[1]+g,s=!1;a+r.height>i.getHeight()&&(n.textPosition=\"top\",s=!0);var l=s?-5-r.height:g+8;o+r.width/2>i.getWidth()?(n.textPosition=[\"100%\",l],n.textAlign=\"right\"):o-r.width/2<0&&(n.textPosition=[0,l],n.textAlign=\"left\")}})}},updateView:function(t,e,i,n){o.each(this._features,function(t){t.updateView&&t.updateView(t.model,e,i,n)})},updateLayout:function(t,e,i,n){o.each(this._features,function(t){t.updateLayout&&t.updateLayout(t.model,e,i,n)})},remove:function(t,e){o.each(this._features,function(i){i.remove&&i.remove(t,e)}),this.group.removeAll()},dispose:function(t,e){o.each(this._features,function(i){i.dispose&&i.dispose(t,e)})}})}).call(e,i(216))},function(t,e,i){function n(t){var e={},i=[],n=[];return t.eachRawSeries(function(t){var r=t.coordinateSystem;if(!r||\"cartesian2d\"!==r.type&&\"polar\"!==r.type)i.push(t);else{var o=r.getBaseAxis();if(\"category\"===o.type){var a=o.dim+\"_\"+o.index;e[a]||(e[a]={categoryAxis:o,valueAxis:r.getOtherAxis(o),series:[]},n.push({axisDim:o.dim,axisIndex:o.index})),e[a].series.push(t)}else i.push(t)}}),{seriesGroupByCategoryAxis:e,other:i,meta:n}}function r(t){var e=[];return p.each(t,function(t,i){var n=t.categoryAxis,r=t.valueAxis,o=r.dim,a=[\" \"].concat(p.map(t.series,function(t){return t.name})),s=[n.model.getCategories()];p.each(t.series,function(t){s.push(t.getRawData().mapArray(o,function(t){return t}))});for(var l=[a.join(m)],u=0;u<s[0].length;u++){for(var h=[],c=0;c<s.length;c++)h.push(s[c][u]);l.push(h.join(m))}e.push(l.join(\"\\n\"))}),e.join(\"\\n\\n\"+v+\"\\n\\n\")}function o(t){return p.map(t,function(t){var e=t.getRawData(),i=[t.name],n=[];return e.each(e.dimensions,function(){for(var t=arguments.length,r=arguments[t-1],o=e.getName(r),a=0;t-1>a;a++)n[a]=arguments[a];i.push((o?o+m:\"\")+n.join(m))}),i.join(\"\\n\")}).join(\"\\n\\n\"+v+\"\\n\\n\")}function a(t){var e=n(t);return{value:p.filter([r(e.seriesGroupByCategoryAxis),o(e.other)],function(t){return t.replace(/[\\n\\t\\s]/g,\"\")}).join(\"\\n\\n\"+v+\"\\n\\n\"),meta:e.meta}}function s(t){return t.replace(/^\\s\\s*/,\"\").replace(/\\s\\s*$/,\"\")}function l(t){var e=t.slice(0,t.indexOf(\"\\n\"));return e.indexOf(m)>=0?!0:void 0}function u(t){for(var e=t.split(/\\n+/g),i=s(e.shift()).split(y),n=[],r=p.map(i,function(t){return{name:t,data:[]}}),o=0;o<e.length;o++){var a=s(e[o]).split(y);n.push(a.shift());for(var l=0;l<a.length;l++)r[l]&&(r[l].data[o]=a[l])}return{series:r,categories:n}}function h(t){for(var e=t.split(/\\n+/g),i=s(e.shift()),n=[],r=0;r<e.length;r++){var o,a=s(e[r]).split(y),l=\"\",u=!1;isNaN(a[0])?(u=!0,l=a[0],a=a.slice(1),n[r]={name:l,value:[]},o=n[r].value):o=n[r]=[];for(var h=0;h<a.length;h++)o.push(+a[h]);1===o.length&&(u?n[r].value=o[0]:n[r]=o[0])}return{name:i,data:n}}function c(t,e){var i=t.split(new RegExp(\"\\n*\"+v+\"\\n*\",\"g\")),n={series:[]};return p.each(i,function(t,i){if(l(t)){var r=u(t),o=e[i],a=o.axisDim+\"Axis\";o&&(n[a]=n[a]||[],n[a][o.axisIndex]={data:r.categories},n.series=n.series.concat(r.series))}else{var r=h(t);n.series.push(r)}}),n}function d(t){this._dom=null,this.model=t}function f(t,e){return p.map(t,function(t,i){var n=e&&e[i];return p.isObject(n)&&!p.isArray(n)?(p.isObject(t)&&!p.isArray(t)&&(t=t.value),p.defaults({value:t},n)):t})}var p=i(1),g=i(24),v=new Array(60).join(\"-\"),m=\"\t\",y=new RegExp(\"[\"+m+\"]+\",\"g\");d.defaultOption={show:!0,readOnly:!1,optionToContent:null,contentToOption:null,icon:\"M17.5,17.3H33 M17.5,17.3H33 M45.4,29.5h-28 M11.5,2v56H51V14.8L38.4,2H11.5z M38.4,2.2v12.7H51 M45.4,41.7h-28\",title:\"数据视图\",lang:[\"数据视图\",\"关闭\",\"刷新\"],backgroundColor:\"#fff\",textColor:\"#000\",textareaColor:\"#fff\",textareaBorderColor:\"#333\",buttonColor:\"#c23531\",buttonTextColor:\"#fff\"},d.prototype.onclick=function(t,e){function i(){n.removeChild(o),M._dom=null}var n=e.getDom(),r=this.model;this._dom&&n.removeChild(this._dom);var o=document.createElement(\"div\");o.style.cssText=\"position:absolute;left:5px;top:5px;bottom:5px;right:5px;\",o.style.backgroundColor=r.get(\"backgroundColor\")||\"#fff\";var s=document.createElement(\"h4\"),l=r.get(\"lang\")||[];s.innerHTML=l[0]||r.get(\"title\"),s.style.cssText=\"margin: 10px 20px;\",s.style.color=r.get(\"textColor\");var u=document.createElement(\"div\"),h=document.createElement(\"textarea\");u.style.cssText=\"display:block;width:100%;overflow:hidden;\";var d=r.get(\"optionToContent\"),f=r.get(\"contentToOption\"),v=a(t);if(\"function\"==typeof d){var y=d(e.getOption());\"string\"==typeof y?u.innerHTML=y:p.isDom(y)&&u.appendChild(y)}else u.appendChild(h),h.readOnly=r.get(\"readOnly\"),h.style.cssText=\"width:100%;height:100%;font-family:monospace;font-size:14px;line-height:1.6rem;\",h.style.color=r.get(\"textColor\"),h.style.borderColor=r.get(\"textareaBorderColor\"),h.style.backgroundColor=r.get(\"textareaColor\"),h.value=v.value;var x=v.meta,_=document.createElement(\"div\");_.style.cssText=\"position:absolute;bottom:0;left:0;right:0;\";var b=\"float:right;margin-right:20px;border:none;cursor:pointer;padding:2px 5px;font-size:12px;border-radius:3px\",w=document.createElement(\"div\"),S=document.createElement(\"div\");b+=\";background-color:\"+r.get(\"buttonColor\"),b+=\";color:\"+r.get(\"buttonTextColor\");var M=this;g.addEventListener(w,\"click\",i),g.addEventListener(S,\"click\",function(){var t;try{t=\"function\"==typeof f?f(u,e.getOption()):c(h.value,x)}catch(n){throw i(),new Error(\"Data view format error \"+n)}t&&e.dispatchAction({type:\"changeDataView\",newOption:t}),i()}),w.innerHTML=l[1],S.innerHTML=l[2],S.style.cssText=b,w.style.cssText=b,!r.get(\"readOnly\")&&_.appendChild(S),_.appendChild(w),g.addEventListener(h,\"keydown\",function(t){if(9===(t.keyCode||t.which)){var e=this.value,i=this.selectionStart,n=this.selectionEnd;this.value=e.substring(0,i)+m+e.substring(n),this.selectionStart=this.selectionEnd=i+1,g.stop(t)}}),o.appendChild(s),o.appendChild(u),o.appendChild(_),u.style.height=n.clientHeight-80+\"px\",n.appendChild(o),this._dom=o},d.prototype.remove=function(t,e){this._dom&&e.getDom().removeChild(this._dom)},d.prototype.dispose=function(t,e){this.remove(t,e)},i(25).register(\"dataView\",d),i(2).registerAction({type:\"changeDataView\",event:\"dataViewChanged\",update:\"prepareAndUpdate\"},function(t,e){var i=[];p.each(t.newOption.series,function(t){var n=e.getSeriesByName(t.name)[0];if(n){var r=n.get(\"data\");i.push({name:t.name,data:f(t.data,r)})}else i.push(p.extend({type:\"scatter\"},t))}),e.mergeOption(p.defaults({series:i},t.newOption))}),t.exports=d},function(t,e,i){\"use strict\";function n(t,e,i){(this._brushController=new l(i.getZr())).on(\"brush\",s.bind(this._onBrush,this)).mount(),this._isZoomActive}function r(t){var e={};return s.each([\"xAxisIndex\",\"yAxisIndex\"],function(i){e[i]=t[i],null==e[i]&&(e[i]=\"all\"),(e[i]===!1||\"none\"===e[i])&&(e[i]=[])}),e}function o(t,e){t.setIconStatus(\"back\",h.count(e)>1?\"emphasis\":\"normal\")}function a(t,e,i,n){var o=i._isZoomActive;n&&\"takeGlobalCursor\"===n.type&&(o=\"dataZoomSelect\"===n.key?n.dataZoomSelectActive:!1),i._isZoomActive=o,t.setIconStatus(\"zoom\",o?\"emphasis\":\"normal\");var a=u.makeCoordInfoList(r(t.option),e),s=a.xAxisHas&&!a.yAxisHas?\"lineX\":!a.xAxisHas&&a.yAxisHas?\"lineY\":\"rect\";i._brushController.setPanels(u.makePanelOpts(a)).enableBrush(o?{brushType:s,brushStyle:{lineWidth:0,fill:\"rgba(0,0,0,0.2)\"}}:!1)}var s=i(1),l=i(111),u=i(112),h=i(109),c=s.each;i(187);var d=\"\\x00_ec_\\x00toolbox-dataZoom_\";n.defaultOption={show:!0,icon:{zoom:\"M0,13.5h26.9 M13.5,26.9V0 M32.1,13.5H58V58H13.5 V32.1\",back:\"M22,1.4L9.9,13.5l12.3,12.3 M10.3,13.5H54.9v44.6 H10.3v-26\"},title:{zoom:\"区域缩放\",back:\"区域缩放还原\"}};var f=n.prototype;f.render=function(t,e,i,n){this.model=t,this.ecModel=e,this.api=i,a(t,e,this,n),o(t,e)},f.onclick=function(t,e,i){p[i].call(this)},f.remove=function(t,e){this._brushController.unmount()},f.dispose=function(t,e){this._brushController.dispose()};var p={zoom:function(){var t=!this._isZoomActive;this.api.dispatchAction({type:\"takeGlobalCursor\",key:\"dataZoomSelect\",dataZoomSelectActive:t})},back:function(){this._dispatchZoomAction(h.pop(this.ecModel))}};f._onBrush=function(t,e){function i(t,e,i){var r=n(t,i[t],a);r&&(o[r.id]={dataZoomId:r.id,startValue:e[0],endValue:e[1]})}function n(t,e,i){var n;return i.eachComponent({mainType:\"dataZoom\",subType:\"select\"},function(r,o){var a=r.get(t+\"Index\");null!=a&&i.getComponent(t,a)===e&&(n=r)}),n}if(e.isEnd&&t.length){var o={},a=this.ecModel;this._brushController.updateCovers([]);var s=u.makeCoordInfoList(r(this.model.option),a),l=[];u.parseOutputRanges(t,s,a,l);var c=t[0],d=l[0],f=c.coordRange,p=c.brushType;if(d&&f)if(\"rect\"===p)i(\"xAxis\",f[0],d),i(\"yAxis\",f[1],d);else{var g={lineX:\"xAxis\",lineY:\"yAxis\"};i(g[p],f,d)}h.push(a,o),this._dispatchZoomAction(o)}},f._dispatchZoomAction=function(t){var e=[];c(t,function(t,i){e.push(s.clone(t))}),e.length&&this.api.dispatchAction({type:\"dataZoom\",from:this.uid,batch:e})},i(25).register(\"dataZoom\",n),i(2).registerPreprocessor(function(t){function e(t,e){if(e){var r=t+\"Index\",o=e[r];null==o||\"all\"==o||s.isArray(o)||(o=o===!1||\"none\"===o?[]:[o]),i(t,function(e,i){if(null==o||\"all\"==o||-1!==s.indexOf(o,i)){var a={type:\"select\",$fromToolbox:!0,id:d+t+i};a[r]=i,n.push(a)}})}}function i(e,i){var n=t[e];s.isArray(n)||(n=n?[n]:[]),c(n,i)}if(t){var n=t.dataZoom||(t.dataZoom=[]);s.isArray(n)||(t.dataZoom=n=[n]);var r=t.toolbox;if(r&&(s.isArray(r)&&(r=r[0]),r&&r.feature)){var o=r.feature.dataZoom;e(\"xAxis\",o),e(\"yAxis\",o)}}}),t.exports=n},function(t,e,i){\"use strict\";function n(t){this.model=t}var r=i(1);n.defaultOption={show:!0,type:[],icon:{line:\"M4.1,28.9h7.1l9.3-22l7.4,38l9.7-19.7l3,12.8h14.9M4.1,58h51.4\",bar:\"M6.7,22.9h10V48h-10V22.9zM24.9,13h10v35h-10V13zM43.2,2h10v46h-10V2zM3.1,58h53.7\",stack:\"M8.2,38.4l-8.4,4.1l30.6,15.3L60,42.5l-8.1-4.1l-21.5,11L8.2,38.4z M51.9,30l-8.1,4.2l-13.4,6.9l-13.9-6.9L8.2,30l-8.4,4.2l8.4,4.2l22.2,11l21.5-11l8.1-4.2L51.9,30z M51.9,21.7l-8.1,4.2L35.7,30l-5.3,2.8L24.9,30l-8.4-4.1l-8.3-4.2l-8.4,4.2L8.2,30l8.3,4.2l13.9,6.9l13.4-6.9l8.1-4.2l8.1-4.1L51.9,21.7zM30.4,2.2L-0.2,17.5l8.4,4.1l8.3,4.2l8.4,4.2l5.5,2.7l5.3-2.7l8.1-4.2l8.1-4.2l8.1-4.1L30.4,2.2z\",tiled:\"M2.3,2.2h22.8V25H2.3V2.2z M35,2.2h22.8V25H35V2.2zM2.3,35h22.8v22.8H2.3V35z M35,35h22.8v22.8H35V35z\"},title:{line:\"切换为折线图\",bar:\"切换为柱状图\",stack:\"切换为堆叠\",tiled:\"切换为平铺\"},option:{},seriesIndex:{}};var o=n.prototype;o.getIcons=function(){var t=this.model,e=t.get(\"icon\"),i={};return r.each(t.get(\"type\"),function(t){e[t]&&(i[t]=e[t])}),i};var a={line:function(t,e,i,n){return\"bar\"===t?r.merge({id:e,type:\"line\",data:i.get(\"data\"),stack:i.get(\"stack\"),markPoint:i.get(\"markPoint\"),markLine:i.get(\"markLine\")},n.get(\"option.line\")||{},!0):void 0},bar:function(t,e,i,n){return\"line\"===t?r.merge({id:e,type:\"bar\",data:i.get(\"data\"),stack:i.get(\"stack\"),markPoint:i.get(\"markPoint\"),markLine:i.get(\"markLine\")},n.get(\"option.bar\")||{},!0):void 0},stack:function(t,e,i,n){return\"line\"===t||\"bar\"===t?r.merge({id:e,stack:\"__ec_magicType_stack__\"},n.get(\"option.stack\")||{},!0):void 0},tiled:function(t,e,i,n){return\"line\"===t||\"bar\"===t?r.merge({id:e,stack:\"\"},n.get(\"option.tiled\")||{},!0):void 0}},s=[[\"line\",\"bar\"],[\"stack\",\"tiled\"]];o.onclick=function(t,e,i){var n=this.model,o=n.get(\"seriesIndex.\"+i);if(a[i]){var l={series:[]},u=function(e){var o=e.subType,s=e.id,u=a[i](o,s,e,n);u&&(r.defaults(u,e.option),l.series.push(u));var h=e.coordinateSystem;if(h&&\"cartesian2d\"===h.type&&(\"line\"===i||\"bar\"===i)){var c=h.getAxesByScale(\"ordinal\")[0];if(c){var d=c.dim,f=d+\"Axis\",p=t.queryComponents({mainType:f,index:e.get(name+\"Index\"),id:e.get(name+\"Id\")})[0],g=p.componentIndex;l[f]=l[f]||[];for(var v=0;g>=v;v++)l[f][g]=l[f][g]||{};l[f][g].boundaryGap=\"bar\"===i}}};r.each(s,function(t){r.indexOf(t,i)>=0&&r.each(t,function(t){n.setIconStatus(t,\"normal\")})}),n.setIconStatus(i,\"emphasis\"),t.eachComponent({mainType:\"series\",query:null==o?null:{seriesIndex:o}},u),e.dispatchAction({type:\"changeMagicType\",currentType:i,newOption:l})}};var l=i(2);l.registerAction({type:\"changeMagicType\",event:\"magicTypeChanged\",update:\"prepareAndUpdate\"},function(t,e){e.mergeOption(t.newOption)}),i(25).register(\"magicType\",n),t.exports=n},function(t,e,i){\"use strict\";function n(t){this.model=t}var r=i(109);n.defaultOption={show:!0,icon:\"M3.8,33.4 M47,18.9h9.8V8.7 M56.3,20.1 C52.1,9,40.5,0.6,26.8,2.1C12.6,3.7,1.6,16.2,2.1,30.6 M13,41.1H3.1v10.2 M3.7,39.9c4.2,11.1,15.8,19.5,29.5,18 c14.2-1.6,25.2-14.1,24.7-28.5\",title:\"还原\"};var o=n.prototype;o.onclick=function(t,e,i){r.clear(t),e.dispatchAction({type:\"restore\",from:this.uid})},i(25).register(\"restore\",n),i(2).registerAction({type:\"restore\",event:\"restore\",update:\"prepareAndUpdate\"},function(t,e){e.resetOption(\"recreate\")}),t.exports=n},function(t,e,i){function n(t){this.model=t}var r=i(12);n.defaultOption={show:!0,icon:\"M4.7,22.9L29.3,45.5L54.7,23.4M4.6,43.6L4.6,58L53.8,58L53.8,43.6M29.2,45.1L29.2,0\",title:\"保存为图片\",type:\"png\",name:\"\",excludeComponents:[\"toolbox\"],pixelRatio:1,lang:[\"右键另存为图片\"]},n.prototype.unusable=!r.canvasSupported;var o=n.prototype;o.onclick=function(t,e){var i=this.model,n=i.get(\"name\")||t.get(\"title.0.text\")||\"echarts\",r=document.createElement(\"a\"),o=i.get(\"type\",!0)||\"png\";r.download=n+\".\"+o,r.target=\"_blank\";var a=e.getConnectedDataURL({type:o,backgroundColor:i.get(\"backgroundColor\",!0)||t.get(\"backgroundColor\")||\"#fff\",excludeComponents:i.get(\"excludeComponents\"),pixelRatio:i.get(\"pixelRatio\")});if(r.href=a,\"function\"==typeof MouseEvent){var s=new MouseEvent(\"click\",{view:window,bubbles:!0,cancelable:!1});r.dispatchEvent(s)}else{var l=i.get(\"lang\"),u='<body style=\"margin:0;\"><img src=\"'+a+'\" style=\"max-width:100%;\" title=\"'+(l&&l[0]||\"\")+'\" /></body>',h=window.open();h.document.write(u)}},i(25).register(\"saveAsImage\",n),t.exports=n},function(t,e,i){i(213),i(214),i(2).registerAction({type:\"showTip\",event:\"showTip\",update:\"none\"},function(){}),i(2).registerAction({type:\"hideTip\",event:\"hideTip\",update:\"none\"},function(){})},function(t,e,i){function n(t){var e=\"cubic-bezier(0.23, 1, 0.32, 1)\",i=\"left \"+t+\"s \"+e+\",top \"+t+\"s \"+e;return l.map(g,function(t){return t+\"transition:\"+i}).join(\";\")}function r(t){var e=[],i=t.get(\"fontSize\"),n=t.getTextColor();return n&&e.push(\"color:\"+n),e.push(\"font:\"+t.getFont()),i&&e.push(\"line-height:\"+Math.round(3*i/2)+\"px\"),d([\"decoration\",\"align\"],function(i){var n=t.get(i);n&&e.push(\"text-\"+i+\":\"+n)}),e.join(\";\")}function o(t){t=t;var e=[],i=t.get(\"transitionDuration\"),o=t.get(\"backgroundColor\"),a=t.getModel(\"textStyle\"),s=t.get(\"padding\");return i&&e.push(n(i)),o&&(p.canvasSupported?e.push(\"background-Color:\"+o):(e.push(\"background-Color:#\"+u.toHex(o)),e.push(\"filter:alpha(opacity=70)\"))),d([\"width\",\"color\",\"radius\"],function(i){var n=\"border-\"+i,r=f(n),o=t.get(r);null!=o&&e.push(n+\":\"+o+(\"color\"===i?\"\":\"px\"))}),e.push(r(a)),null!=s&&e.push(\"padding:\"+c.normalizeCssArray(s).join(\"px \")+\"px\"),e.join(\";\")+\";\"}function a(t,e){var i=document.createElement(\"div\"),n=e.getZr();this.el=i,this._x=e.getWidth()/2,this._y=e.getHeight()/2,t.appendChild(i),this._container=t,this._show=!1,this._hideTimeout;var r=this;i.onmouseenter=function(){r.enterable&&(clearTimeout(r._hideTimeout),r._show=!0),r._inContent=!0},i.onmousemove=function(e){if(!r.enterable){var i=n.handler;h.normalizeEvent(t,e),i.dispatch(\"mousemove\",e)}},i.onmouseleave=function(){r.enterable&&r._show&&r.hideLater(r._hideDelay),r._inContent=!1},s(i,t)}function s(t,e){function i(t){n(t.target)&&t.preventDefault()}function n(i){for(;i&&i!==e;){if(i===t)return!0;i=i.parentNode}}h.addEventListener(e,\"touchstart\",i),h.addEventListener(e,\"touchmove\",i),h.addEventListener(e,\"touchend\",i)}var l=i(1),u=i(18),h=i(24),c=i(8),d=l.each,f=c.toCamelCase,p=i(12),g=[\"\",\"-webkit-\",\"-moz-\",\"-o-\"],v=\"position:absolute;display:block;border-style:solid;white-space:nowrap;z-index:9999999;\";a.prototype={constructor:a,enterable:!0,update:function(){var t=this._container,e=t.currentStyle||document.defaultView.getComputedStyle(t),i=t.style;\"absolute\"!==i.position&&\"absolute\"!==e.position&&(i.position=\"relative\")},show:function(t){clearTimeout(this._hideTimeout);var e=this.el;e.style.cssText=v+o(t)+\";left:\"+this._x+\"px;top:\"+this._y+\"px;\"+(t.get(\"extraCssText\")||\"\"),e.style.display=e.innerHTML?\"block\":\"none\",this._show=!0},setContent:function(t){var e=this.el;e.innerHTML=t,e.style.display=t?\"block\":\"none\"},moveTo:function(t,e){var i=this.el.style;i.left=t+\"px\",i.top=e+\"px\",this._x=t,this._y=e},hide:function(){this.el.style.display=\"none\",this._show=!1},hideLater:function(t){!this._show||this._inContent&&this.enterable||(t?(this._hideDelay=t,this._show=!1,this._hideTimeout=setTimeout(l.bind(this.hide,this),t)):this.hide())},isShow:function(){return this._show}},t.exports=a},function(t,e,i){i(2).extendComponentModel({type:\"tooltip\",defaultOption:{zlevel:0,z:8,show:!0,showContent:!0,trigger:\"item\",triggerOn:\"mousemove\",alwaysShowContent:!1,showDelay:0,hideDelay:100,transitionDuration:.4,enterable:!1,backgroundColor:\"rgba(50,50,50,0.7)\",borderColor:\"#333\",borderRadius:4,borderWidth:0,padding:5,extraCssText:\"\",axisPointer:{type:\"line\",axis:\"auto\",animation:!0,animationDurationUpdate:200,animationEasingUpdate:\"exponentialOut\",lineStyle:{color:\"#555\",width:1,type:\"solid\"},crossStyle:{color:\"#555\",width:1,type:\"dashed\",textStyle:{}},shadowStyle:{color:\"rgba(150,150,150,0.3)\"}},textStyle:{color:\"#fff\",fontSize:14}}})},function(t,e,i){function n(t,e){if(!t||!e)return!1;var i=g.round;return i(t[0])===i(e[0])&&i(t[1])===i(e[1])}function r(t,e,i,n){return{x1:t,y1:e,x2:i,y2:n}}function o(t,e,i,n){return{x:t,y:e,width:i,height:n}}function a(t,e,i,n,r,o){return{cx:t,cy:e,r0:i,r:n,startAngle:r,endAngle:o,clockwise:!0}}function s(t,e,i,n,r){var o=i.clientWidth,a=i.clientHeight,s=20;return t+o+s>n?t-=o+s:t+=s,e+a+s>r?e-=a+s:e+=s,[t,e]}function l(t,e,i){var n=i.clientWidth,r=i.clientHeight,o=5,a=0,s=0,l=e.width,u=e.height;switch(t){case\"inside\":a=e.x+l/2-n/2,s=e.y+u/2-r/2;break;case\"top\":a=e.x+l/2-n/2,s=e.y-r-o;break;case\"bottom\":a=e.x+l/2-n/2,s=e.y+u+o;break;case\"left\":a=e.x-n-o,s=e.y+u/2-r/2;break;case\"right\":a=e.x+l+o,s=e.y+u/2-r/2}return[a,s]}function u(t,e,i,n,r,o,a){var u=a.getWidth(),h=a.getHeight(),c=o&&o.getBoundingRect().clone();if(o&&c.applyTransform(o.transform),\"function\"==typeof t&&(t=t([e,i],r,n.el,c)),f.isArray(t))e=v(t[0],u),i=v(t[1],h);else if(\"string\"==typeof t&&o){var d=l(t,c,n.el);e=d[0],i=d[1]}else{var d=s(e,i,n.el,u,h);e=d[0],i=d[1]}n.moveTo(e,i)}function h(t){var e=t.coordinateSystem,i=t.get(\"tooltip.trigger\",!0);return!(!e||\"cartesian2d\"!==e.type&&\"polar\"!==e.type&&\"singleAxis\"!==e.type||\"item\"===i)}var c=i(212),d=i(3),f=i(1),p=i(8),g=i(4),v=g.parsePercent,m=i(12),y=i(9);i(2).extendComponentView({type:\"tooltip\",_axisPointers:{},init:function(t,e){if(!m.node){var i=new c(e.getDom(),e);this._tooltipContent=i,e.on(\"showTip\",this._manuallyShowTip,this),e.on(\"hideTip\",this._manuallyHideTip,this)}},render:function(t,e,i){if(!m.node){this.group.removeAll(),this._axisPointers={},this._tooltipModel=t,this._ecModel=e,this._api=i,this._lastHover={};var n=this._tooltipContent;n.update(),n.enterable=t.get(\"enterable\"),this._alwaysShowContent=t.get(\"alwaysShowContent\"),this._seriesGroupByAxis=this._prepareAxisTriggerData(t,e);var r=this._crossText;if(r&&this.group.add(r),null!=this._lastX&&null!=this._lastY){var o=this;clearTimeout(this._refreshUpdateTimeout),this._refreshUpdateTimeout=setTimeout(function(){o._manuallyShowTip({x:o._lastX,y:o._lastY})})}var a=this._api.getZr();a.off(\"click\",this._tryShow),a.off(\"mousemove\",this._mousemove),a.off(\"mouseout\",this._hide),a.off(\"globalout\",this._hide),\"click\"===t.get(\"triggerOn\")?a.on(\"click\",this._tryShow,this):(a.on(\"mousemove\",this._mousemove,this),a.on(\"mouseout\",this._hide,this),a.on(\"globalout\",this._hide,this))}},_mousemove:function(t){var e=this._tooltipModel.get(\"showDelay\"),i=this;clearTimeout(this._showTimeout),e>0?this._showTimeout=setTimeout(function(){i._tryShow(t)},e):this._tryShow(t)},_manuallyShowTip:function(t){if(t.from!==this.uid){var e=this._ecModel,i=t.seriesIndex,n=t.dataIndex,r=e.getSeriesByIndex(i),o=this._api;if(null==t.x||null==t.y){if(r||e.eachSeries(function(t){h(t)&&!r&&(r=t)}),r){var a=r.getData();null==n&&(n=a.indexOfName(t.name));var s,l,u=a.getItemGraphicEl(n),c=r.coordinateSystem;if(c&&c.dataToPoint){var d=c.dataToPoint(a.getValues(f.map(c.dimensions,function(t){return r.coordDimToDataDim(t)[0]}),n,!0));s=d&&d[0],l=d&&d[1]}else if(u){var p=u.getBoundingRect().clone();p.applyTransform(u.transform),s=p.x+p.width/2,l=p.y+p.height/2}null!=s&&null!=l&&this._tryShow({offsetX:s,offsetY:l,target:u,event:{}})}}else{var u=o.getZr().handler.findHover(t.x,t.y);this._tryShow({offsetX:t.x,offsetY:t.y,target:u,event:{}})}}},_manuallyHideTip:function(t){t.from!==this.uid&&this._hide()},_prepareAxisTriggerData:function(t,e){var i={};return e.eachSeries(function(t){if(h(t)){var e,n,r=t.coordinateSystem;\"cartesian2d\"===r.type?(e=r.getBaseAxis(),n=e.dim+e.index):\"singleAxis\"===r.type?(e=r.getAxis(),n=e.dim+e.type):(e=r.getBaseAxis(),n=e.dim+r.name),i[n]=i[n]||{coordSys:[],series:[]},i[n].coordSys.push(r),i[n].series.push(t)}},this),i},_tryShow:function(t){var e=t.target,i=this._tooltipModel,n=i.get(\"trigger\"),r=this._ecModel,o=this._api;if(i)if(this._lastX=t.offsetX,this._lastY=t.offsetY,e&&null!=e.dataIndex){var a=e.dataModel||r.getSeriesByIndex(e.seriesIndex),s=e.dataIndex,l=a.getData().getItemModel(s);\"axis\"===(l.get(\"tooltip.trigger\")||n)?this._showAxisTooltip(i,r,t):(this._ticket=\"\",this._hideAxisPointer(),this._resetLastHover(),this._showItemTooltipContent(a,s,e.dataType,t)),o.dispatchAction({type:\"showTip\",from:this.uid,dataIndex:e.dataIndex,seriesIndex:e.seriesIndex})}else if(e&&e.tooltip){var u=e.tooltip;if(\"string\"==typeof u){var h=u;u={content:h,formatter:h}}var c=new y(u,i),d=c.get(\"content\"),f=Math.random();this._showTooltipContent(c,d,c.get(\"formatterParams\")||{},f,t.offsetX,t.offsetY,e,o)}else\"item\"===n?this._hide():this._showAxisTooltip(i,r,t),\"cross\"===i.get(\"axisPointer.type\")&&o.dispatchAction({type:\"showTip\",from:this.uid,x:t.offsetX,y:t.offsetY})},_showAxisTooltip:function(t,e,i){var r=t.getModel(\"axisPointer\"),o=r.get(\"type\");if(\"cross\"===o){var a=i.target;if(a&&null!=a.dataIndex){var s=e.getSeriesByIndex(a.seriesIndex),l=a.dataIndex;this._showItemTooltipContent(s,l,a.dataType,i)}}this._showAxisPointer();var u=!0;f.each(this._seriesGroupByAxis,function(t){var e=t.coordSys,a=e[0],s=[i.offsetX,i.offsetY];if(!a.containPoint(s))return void this._hideAxisPointer(a.name);u=!1;var l=a.dimensions,h=a.pointToData(s,!0);s=a.dataToPoint(h);var c=a.getBaseAxis(),d=r.get(\"axis\");\"auto\"===d&&(d=c.dim);var p=!1,g=this._lastHover;if(\"cross\"===o)n(g.data,h)&&(p=!0),g.data=h;else{var v=f.indexOf(l,d);g.data===h[v]&&(p=!0),g.data=h[v]}\"cartesian2d\"!==a.type||p?\"polar\"!==a.type||p?\"singleAxis\"!==a.type||p||this._showSinglePointer(r,a,d,s):this._showPolarPointer(r,a,d,s):this._showCartesianPointer(r,a,d,s),\"cross\"!==o&&this._dispatchAndShowSeriesTooltipContent(a,t.series,s,h,p)},this),this._tooltipModel.get(\"show\")||this._hideAxisPointer(),u&&this._hide()},_showCartesianPointer:function(t,e,i,n){function a(i,n,o){var a=\"x\"===i?r(n[0],o[0],n[0],o[1]):r(o[0],n[1],o[1],n[1]),s=l._getPointerElement(e,t,i,a);d.subPixelOptimizeLine({shape:a,style:s.style}),c?d.updateProps(s,{shape:a},t):s.attr({shape:a})}function s(i,n,r){var a=e.getAxis(i),s=a.getBandWidth(),u=r[1]-r[0],h=\"x\"===i?o(n[0]-s/2,r[0],s,u):o(r[0],n[1]-s/2,u,s),f=l._getPointerElement(e,t,i,h);c?d.updateProps(f,{shape:h},t):f.attr({shape:h})}var l=this,u=t.get(\"type\"),h=e.getBaseAxis(),c=\"cross\"!==u&&\"category\"===h.type&&h.getBandWidth()>20;if(\"cross\"===u)a(\"x\",n,e.getAxis(\"y\").getGlobalExtent()),a(\"y\",n,e.getAxis(\"x\").getGlobalExtent()),this._updateCrossText(e,n,t);else{var f=e.getAxis(\"x\"===i?\"y\":\"x\"),p=f.getGlobalExtent();\"cartesian2d\"===e.type&&(\"line\"===u?a:s)(i,n,p)}},_showSinglePointer:function(t,e,i,n){function o(i,n,o){var s=e.getAxis(),u=s.orient,h=\"horizontal\"===u?r(n[0],o[0],n[0],o[1]):r(o[0],n[1],o[1],n[1]),c=a._getPointerElement(e,t,i,h);l?d.updateProps(c,{shape:h},t):c.attr({shape:h})}var a=this,s=t.get(\"type\"),l=\"cross\"!==s&&\"category\"===e.getBaseAxis().type,u=e.getRect(),h=[u.y,u.y+u.height];o(i,n,h)},_showPolarPointer:function(t,e,i,n){function o(i,n,o){var a,s=e.pointToCoord(n);if(\"angle\"===i){var u=e.coordToPoint([o[0],s[1]]),h=e.coordToPoint([o[1],s[1]]);a=r(u[0],u[1],h[0],h[1])}else a={cx:e.cx,cy:e.cy,r:s[0]};var c=l._getPointerElement(e,t,i,a);f?d.updateProps(c,{shape:a},t):c.attr({shape:a})}function s(i,n,r){var o,s=e.getAxis(i),u=s.getBandWidth(),h=e.pointToCoord(n),c=Math.PI/180;o=\"angle\"===i?a(e.cx,e.cy,r[0],r[1],(-h[1]-u/2)*c,(-h[1]+u/2)*c):a(e.cx,e.cy,h[0]-u/2,h[0]+u/2,0,2*Math.PI);var p=l._getPointerElement(e,t,i,o);f?d.updateProps(p,{shape:o},t):p.attr({shape:o})}var l=this,u=t.get(\"type\"),h=e.getAngleAxis(),c=e.getRadiusAxis(),f=\"cross\"!==u&&\"category\"===e.getBaseAxis().type;if(\"cross\"===u)o(\"angle\",n,c.getExtent()),o(\"radius\",n,h.getExtent()),this._updateCrossText(e,n,t);else{var p=e.getAxis(\"radius\"===i?\"angle\":\"radius\"),g=p.getExtent();(\"line\"===u?o:s)(i,n,g)}},_updateCrossText:function(t,e,i){var n=i.getModel(\"crossStyle\"),r=n.getModel(\"textStyle\"),o=this._tooltipModel,a=this._crossText;a||(a=this._crossText=new d.Text({style:{textAlign:\"left\",textVerticalAlign:\"bottom\"}}),this.group.add(a));var s=t.pointToData(e),l=t.dimensions;s=f.map(s,function(e,i){var n=t.getAxis(l[i]);return e=\"category\"===n.type||\"time\"===n.type?n.scale.getLabel(e):p.addCommas(e.toFixed(n.getPixelPrecision()))}),a.setStyle({fill:r.getTextColor()||n.get(\"color\"),textFont:r.getFont(),text:s.join(\", \"),x:e[0]+5,y:e[1]-5}),a.z=o.get(\"z\"),a.zlevel=o.get(\"zlevel\")},_getPointerElement:function(t,e,i,n){var r=this._tooltipModel,o=r.get(\"z\"),a=r.get(\"zlevel\"),s=this._axisPointers,l=t.name;if(s[l]=s[l]||{},s[l][i])return s[l][i];var u=e.get(\"type\"),h=e.getModel(u+\"Style\"),c=\"shadow\"===u,f=h[c?\"getAreaStyle\":\"getLineStyle\"](),p=\"polar\"===t.type?c?\"Sector\":\"radius\"===i?\"Circle\":\"Line\":c?\"Rect\":\"Line\";c?f.stroke=null:f.fill=null;var g=s[l][i]=new d[p]({style:f,z:o,zlevel:a,silent:!0,shape:n});return this.group.add(g),g},_dispatchAndShowSeriesTooltipContent:function(t,e,i,n,r){var o=this._tooltipModel,a=t.getBaseAxis(),s=\"x\"===a.dim||\"radius\"===a.dim?0:1,l=f.map(e,function(t){return{seriesIndex:t.seriesIndex,dataIndex:t.getAxisTooltipDataIndex?t.getAxisTooltipDataIndex(t.coordDimToDataDim(a.dim),n,a):t.getData().indexOfNearest(t.coordDimToDataDim(a.dim)[0],n[s],!1,\"category\"===a.type?.5:null)}}),h=this._lastHover,c=this._api;if(h.payloadBatch&&!r&&c.dispatchAction({type:\"downplay\",batch:h.payloadBatch}),r||(c.dispatchAction({type:\"highlight\",batch:l}),h.payloadBatch=l),c.dispatchAction({type:\"showTip\",dataIndex:l[0].dataIndex,seriesIndex:l[0].seriesIndex,from:this.uid}),a&&o.get(\"showContent\")&&o.get(\"show\")){var d=f.map(e,function(t,e){return t.getDataParams(l[e].dataIndex)});if(r)u(o.get(\"position\"),i[0],i[1],this._tooltipContent,d,null,c);else{var p=l[0].dataIndex,g=\"time\"===a.type?a.scale.getLabel(n[s]):e[0].getData().getName(p),v=(g?g+\"<br />\":\"\")+f.map(e,function(t,e){return t.formatTooltip(l[e].dataIndex,!0)}).join(\"<br />\"),m=\"axis_\"+t.name+\"_\"+p;this._showTooltipContent(o,v,d,m,i[0],i[1],null,c)}}},_showItemTooltipContent:function(t,e,i,n){var r=this._api,o=t.getData(i),a=o.getItemModel(e),s=a.get(\"tooltip\",!0);if(\"string\"==typeof s){var l=s;s={formatter:l}}var u=this._tooltipModel,h=t.getModel(\"tooltip\",u),c=new y(s,h,h.ecModel),d=t.getDataParams(e,i),f=t.formatTooltip(e,!1,i),p=\"item_\"+t.name+\"_\"+e;this._showTooltipContent(c,f,d,p,n.offsetX,n.offsetY,n.target,r)},_showTooltipContent:function(t,e,i,n,r,o,a,s){if(this._ticket=\"\",t.get(\"showContent\")&&t.get(\"show\")){var l=this._tooltipContent,h=t.get(\"formatter\"),c=t.get(\"position\"),d=e;if(h)if(\"string\"==typeof h)d=p.formatTpl(h,i);else if(\"function\"==typeof h){var f=this,g=n,v=function(t,e){t===f._ticket&&(l.setContent(e),u(c,r,o,l,i,a,s))};f._ticket=g,d=h(i,g,v)}l.show(t),l.setContent(d),u(c,r,o,l,i,a,s)}},_showAxisPointer:function(t){if(t){var e=this._axisPointers[t];e&&f.each(e,function(t){t.show()})}else this.group.eachChild(function(t){t.show()}),this.group.show()},_resetLastHover:function(){var t=this._lastHover;t.payloadBatch&&this._api.dispatchAction({type:\"downplay\",batch:t.payloadBatch}),this._lastHover={}},_hideAxisPointer:function(t){if(t){var e=this._axisPointers[t];e&&f.each(e,function(t){t.hide()})}else this.group.children().length&&this.group.hide()},_hide:function(){clearTimeout(this._showTimeout),this._hideAxisPointer(),this._resetLastHover(),this._alwaysShowContent||this._tooltipContent.hideLater(this._tooltipModel.get(\"hideDelay\")),this._api.dispatchAction({type:\"hideTip\",from:this.uid}),this._lastX=this._lastY=null},dispose:function(t,e){if(!m.node){var i=e.getZr();this._tooltipContent.hide(),i.off(\"click\",this._tryShow),i.off(\"mousemove\",this._mousemove),i.off(\"mouseout\",this._hide),i.off(\"globalout\",this._hide),e.off(\"showTip\",this._manuallyShowTip),e.off(\"hideTip\",this._manuallyHideTip)}}})},function(t,e,i){function n(t,e){var i=t.get(\"center\"),n=t.get(\"radius\"),r=e.getWidth(),o=e.getHeight(),a=s.parsePercent;this.cx=a(i[0],r),this.cy=a(i[1],o);var l=this.getRadiusAxis(),u=Math.min(r,o)/2;l.setExtent(0,a(n,u))}function r(t,e){var i=this,n=i.getAngleAxis(),r=i.getRadiusAxis();if(n.scale.setExtent(1/0,-(1/0)),r.scale.setExtent(1/0,-(1/0)),t.eachSeries(function(t){if(t.coordinateSystem===i){var e=t.getData();r.scale.unionExtent(e.getDataExtent(\"radius\",\"category\"!==r.type)),n.scale.unionExtent(e.getDataExtent(\"angle\",\"category\"!==n.type))}}),u(n,n.model),u(r,r.model),\"category\"===n.type&&!n.onBand){var o=n.getExtent(),a=360/n.scale.count();n.inverse?o[1]+=a:o[1]-=a,n.setExtent(o[0],o[1])}}function o(t,e){if(t.type=e.get(\"type\"),t.scale=l.createScaleByModel(e),t.onBand=e.get(\"boundaryGap\")&&\"category\"===t.type,\"angleAxis\"===e.mainType){var i=e.get(\"startAngle\");t.inverse=e.get(\"inverse\")^e.get(\"clockwise\"),t.setExtent(i,i+(t.inverse?-360:360))}e.axis=t,t.model=e}var a=i(368),s=i(4),l=(i(1),i(22)),u=l.niceScaleExtent;i(369);var h={dimensions:a.prototype.dimensions,create:function(t,e){var i=[];return t.eachComponent(\"polar\",function(t,s){var l=new a(s);l.resize=n,l.update=r;var u=l.getRadiusAxis(),h=l.getAngleAxis(),c=t.findAxisModel(\"radiusAxis\"),d=t.findAxisModel(\"angleAxis\");o(u,c),\no(h,d),l.resize(t,e),i.push(l),t.coordinateSystem=l}),t.eachSeries(function(e){if(\"polar\"===e.get(\"coordinateSystem\")){var i=t.queryComponents({mainType:\"polar\",index:e.get(\"polarIndex\"),id:e.get(\"polarId\")})[0];e.coordinateSystem=i.coordinateSystem}}),i}};i(23).register(\"polar\",h)},function(t,e){function i(){c&&u&&(c=!1,u.length?h=u.concat(h):d=-1,h.length&&n())}function n(){if(!c){var t=a(i);c=!0;for(var e=h.length;e;){for(u=h,h=[];++d<e;)u&&u[d].run();d=-1,e=h.length}u=null,c=!1,s(t)}}function r(t,e){this.fun=t,this.array=e}function o(){}var a,s,l=t.exports={};!function(){try{a=setTimeout}catch(t){a=function(){throw new Error(\"setTimeout is not defined\")}}try{s=clearTimeout}catch(t){s=function(){throw new Error(\"clearTimeout is not defined\")}}}();var u,h=[],c=!1,d=-1;l.nextTick=function(t){var e=new Array(arguments.length-1);if(arguments.length>1)for(var i=1;i<arguments.length;i++)e[i-1]=arguments[i];h.push(new r(t,e)),1!==h.length||c||a(n,0)},r.prototype.run=function(){this.fun.apply(null,this.array)},l.title=\"browser\",l.browser=!0,l.env={},l.argv=[],l.version=\"\",l.versions={},l.on=o,l.addListener=o,l.once=o,l.off=o,l.removeListener=o,l.removeAllListeners=o,l.emit=o,l.binding=function(t){throw new Error(\"process.binding is not supported\")},l.cwd=function(){return\"/\"},l.chdir=function(t){throw new Error(\"process.chdir is not supported\")},l.umask=function(){return 0}},function(t,e,i){function n(t){return parseInt(t,10)}function r(t,e){s.initVML(),this.root=t,this.storage=e;var i=document.createElement(\"div\"),n=document.createElement(\"div\");i.style.cssText=\"display:inline-block;overflow:hidden;position:relative;width:300px;height:150px;\",n.style.cssText=\"position:absolute;left:0;top:0;\",t.appendChild(i),this._vmlRoot=n,this._vmlViewport=i,this.resize();var r=e.delFromMap,o=e.addToMap;e.delFromMap=function(t){var i=e.get(t);r.call(e,t),i&&i.onRemove&&i.onRemove(n)},e.addToMap=function(t){t.onAdd&&t.onAdd(n),o.call(e,t)},this._firstPaint=!0}function o(t){return function(){a('In IE8.0 VML mode painter not support method \"'+t+'\"')}}var a=i(47),s=i(168);r.prototype={constructor:r,getViewportRoot:function(){return this._vmlViewport},refresh:function(){var t=this.storage.getDisplayList(!0,!0);this._paintList(t)},_paintList:function(t){for(var e=this._vmlRoot,i=0;i<t.length;i++){var n=t[i];n.invisible||n.ignore?(n.__alreadyNotVisible||n.onRemove(e),n.__alreadyNotVisible=!0):(n.__alreadyNotVisible&&n.onAdd(e),n.__alreadyNotVisible=!1,n.__dirty&&(n.beforeBrush&&n.beforeBrush(),(n.brushVML||n.brush).call(n,e),n.afterBrush&&n.afterBrush())),n.__dirty=!1}this._firstPaint&&(this._vmlViewport.appendChild(e),this._firstPaint=!1)},resize:function(){var t=this._getWidth(),e=this._getHeight();if(this._width!=t&&this._height!=e){this._width=t,this._height=e;var i=this._vmlViewport.style;i.width=t+\"px\",i.height=e+\"px\"}},dispose:function(){this.root.innerHTML=\"\",this._vmlRoot=this._vmlViewport=this.storage=null},getWidth:function(){return this._width},getHeight:function(){return this._height},clear:function(){this.root.removeChild(this.vmlViewport)},_getWidth:function(){var t=this.root,e=t.currentStyle;return(t.clientWidth||n(e.width))-n(e.paddingLeft)-n(e.paddingRight)|0},_getHeight:function(){var t=this.root,e=t.currentStyle;return(t.clientHeight||n(e.height))-n(e.paddingTop)-n(e.paddingBottom)|0}};for(var l=[\"getLayer\",\"insertLayer\",\"eachLayer\",\"eachBuildinLayer\",\"eachOtherLayer\",\"getLayers\",\"modLayer\",\"delLayer\",\"clearLayer\",\"toDataURL\",\"pathToImage\"],u=0;u<l.length;u++){var h=l[u];r.prototype[h]=o(h)}t.exports=r},function(t,e,i){if(!i(12).canvasSupported){var n=i(5),r=i(7),o=i(28).CMD,a=i(18),s=i(16),l=i(75),u=i(37),h=i(48),c=i(74),d=i(6),f=i(29),p=i(168),g=Math.round,v=Math.sqrt,m=Math.abs,y=Math.cos,x=Math.sin,_=Math.max,b=n.applyTransform,w=\",\",S=\"progid:DXImageTransform.Microsoft\",M=21600,T=M/2,A=1e5,I=1e3,L=function(t){t.style.cssText=\"position:absolute;left:0;top:0;width:1px;height:1px;\",t.coordsize=M+\",\"+M,t.coordorigin=\"0,0\"},C=function(t){return String(t).replace(/&/g,\"&amp;\").replace(/\"/g,\"&quot;\")},D=function(t,e,i){return\"rgb(\"+[t,e,i].join(\",\")+\")\"},P=function(t,e){e&&t&&e.parentNode!==t&&t.appendChild(e)},k=function(t,e){e&&t&&e.parentNode===t&&t.removeChild(e)},z=function(t,e,i){return(parseFloat(t)||0)*A+(parseFloat(e)||0)*I+i},O=function(t,e){return\"string\"==typeof t?t.lastIndexOf(\"%\")>=0?parseFloat(t)/100*e:parseFloat(t):t},E=function(t,e,i){var n=a.parse(e);i=+i,isNaN(i)&&(i=1),n&&(t.color=D(n[0],n[1],n[2]),t.opacity=i*n[3])},R=function(t){var e=a.parse(t);return[D(e[0],e[1],e[2]),e[3]]},N=function(t,e,i){var n=e.fill;if(null!=n)if(n instanceof f){var r,o=0,a=[0,0],s=0,l=1,u=i.getBoundingRect(),h=u.width,c=u.height;if(\"linear\"===n.type){r=\"gradient\";var d=i.transform,p=[n.x*h,n.y*c],g=[n.x2*h,n.y2*c];d&&(b(p,p,d),b(g,g,d));var v=g[0]-p[0],m=g[1]-p[1];o=180*Math.atan2(v,m)/Math.PI,0>o&&(o+=360),1e-6>o&&(o=0)}else{r=\"gradientradial\";var p=[n.x*h,n.y*c],d=i.transform,y=i.scale,x=h,w=c;a=[(p[0]-u.x)/x,(p[1]-u.y)/w],d&&b(p,p,d),x/=y[0]*M,w/=y[1]*M;var S=_(x,w);s=0/S,l=2*n.r/S-s}var T=n.colorStops.slice();T.sort(function(t,e){return t.offset-e.offset});for(var A=T.length,I=[],L=[],C=0;A>C;C++){var D=T[C],P=R(D.color);L.push(D.offset*l+s+\" \"+P[0]),0!==C&&C!==A-1||I.push(P)}if(A>=2){var k=I[0][0],z=I[1][0],O=I[0][1]*e.opacity,N=I[1][1]*e.opacity;t.type=r,t.method=\"none\",t.focus=\"100%\",t.angle=o,t.color=k,t.color2=z,t.colors=L.join(\",\"),t.opacity=N,t.opacity2=O}\"radial\"===r&&(t.focusposition=a.join(\",\"))}else E(t,n,e.opacity)},V=function(t,e){null!=e.lineDash&&(t.dashstyle=e.lineDash.join(\" \")),null==e.stroke||e.stroke instanceof f||E(t,e.stroke,e.opacity)},B=function(t,e,i,n){var r=\"fill\"==e,o=t.getElementsByTagName(e)[0];null!=i[e]&&\"none\"!==i[e]&&(r||!r&&i.lineWidth)?(t[r?\"filled\":\"stroked\"]=\"true\",i[e]instanceof f&&k(t,o),o||(o=p.createNode(e)),r?N(o,i,n):V(o,i),P(t,o)):(t[r?\"filled\":\"stroked\"]=\"false\",k(t,o))},G=[[],[],[]],F=function(t,e){var i,n,r,a,s,l,u=o.M,h=o.C,c=o.L,d=o.A,f=o.Q,p=[];for(a=0;a<t.length;){switch(r=t[a++],n=\"\",i=0,r){case u:n=\" m \",i=1,s=t[a++],l=t[a++],G[0][0]=s,G[0][1]=l;break;case c:n=\" l \",i=1,s=t[a++],l=t[a++],G[0][0]=s,G[0][1]=l;break;case f:case h:n=\" c \",i=3;var m,_,S=t[a++],A=t[a++],I=t[a++],L=t[a++];r===f?(m=I,_=L,I=(I+2*S)/3,L=(L+2*A)/3,S=(s+2*S)/3,A=(l+2*A)/3):(m=t[a++],_=t[a++]),G[0][0]=S,G[0][1]=A,G[1][0]=I,G[1][1]=L,G[2][0]=m,G[2][1]=_,s=m,l=_;break;case d:var C=0,D=0,P=1,k=1,z=0;e&&(C=e[4],D=e[5],P=v(e[0]*e[0]+e[1]*e[1]),k=v(e[2]*e[2]+e[3]*e[3]),z=Math.atan2(-e[1]/k,e[0]/P));var O=t[a++],E=t[a++],R=t[a++],N=t[a++],V=t[a++]+z,B=t[a++]+V+z;a++;var F=t[a++],H=O+y(V)*R,W=E+x(V)*N,S=O+y(B)*R,A=E+x(B)*N,Z=F?\" wa \":\" at \";Math.abs(H-S)<1e-10&&(Math.abs(B-V)>.01?F&&(H+=270/M):Math.abs(W-E)<1e-10?F&&O>H||!F&&H>O?A-=270/M:A+=270/M:F&&E>W||!F&&W>E?S+=270/M:S-=270/M),p.push(Z,g(((O-R)*P+C)*M-T),w,g(((E-N)*k+D)*M-T),w,g(((O+R)*P+C)*M-T),w,g(((E+N)*k+D)*M-T),w,g((H*P+C)*M-T),w,g((W*k+D)*M-T),w,g((S*P+C)*M-T),w,g((A*k+D)*M-T)),s=S,l=A;break;case o.R:var q=G[0],j=G[1];q[0]=t[a++],q[1]=t[a++],j[0]=q[0]+t[a++],j[1]=q[1]+t[a++],e&&(b(q,q,e),b(j,j,e)),q[0]=g(q[0]*M-T),j[0]=g(j[0]*M-T),q[1]=g(q[1]*M-T),j[1]=g(j[1]*M-T),p.push(\" m \",q[0],w,q[1],\" l \",j[0],w,q[1],\" l \",j[0],w,j[1],\" l \",q[0],w,j[1]);break;case o.Z:p.push(\" x \")}if(i>0){p.push(n);for(var U=0;i>U;U++){var X=G[U];e&&b(X,X,e),p.push(g(X[0]*M-T),w,g(X[1]*M-T),i-1>U?w:\"\")}}}return p.join(\"\")};d.prototype.brushVML=function(t){var e=this.style,i=this._vmlEl;i||(i=p.createNode(\"shape\"),L(i),this._vmlEl=i),B(i,\"fill\",e,this),B(i,\"stroke\",e,this);var n=this.transform,r=null!=n,o=i.getElementsByTagName(\"stroke\")[0];if(o){var a=e.lineWidth;if(r&&!e.strokeNoScale){var s=n[0]*n[3]-n[1]*n[2];a*=v(m(s))}o.weight=a+\"px\"}var l=this.path;this.__dirtyPath&&(l.beginPath(),this.buildPath(l,this.shape),l.toStatic(),this.__dirtyPath=!1),i.path=F(l.data,this.transform),i.style.zIndex=z(this.zlevel,this.z,this.z2),P(t,i),e.text?this.drawRectText(t,this.getBoundingRect()):this.removeRectText(t)},d.prototype.onRemove=function(t){k(t,this._vmlEl),this.removeRectText(t)},d.prototype.onAdd=function(t){P(t,this._vmlEl),this.appendRectText(t)};var H=function(t){return\"object\"==typeof t&&t.tagName&&\"IMG\"===t.tagName.toUpperCase()};h.prototype.brushVML=function(t){var e,i,n=this.style,r=n.image;if(H(r)){var o=r.src;if(o===this._imageSrc)e=this._imageWidth,i=this._imageHeight;else{var a=r.runtimeStyle,s=a.width,l=a.height;a.width=\"auto\",a.height=\"auto\",e=r.width,i=r.height,a.width=s,a.height=l,this._imageSrc=o,this._imageWidth=e,this._imageHeight=i}r=o}else r===this._imageSrc&&(e=this._imageWidth,i=this._imageHeight);if(r){var u=n.x||0,h=n.y||0,c=n.width,d=n.height,f=n.sWidth,m=n.sHeight,y=n.sx||0,x=n.sy||0,M=f&&m,T=this._vmlEl;T||(T=p.doc.createElement(\"div\"),L(T),this._vmlEl=T);var A,I=T.style,C=!1,D=1,k=1;if(this.transform&&(A=this.transform,D=v(A[0]*A[0]+A[1]*A[1]),k=v(A[2]*A[2]+A[3]*A[3]),C=A[1]||A[2]),C){var O=[u,h],E=[u+c,h],R=[u,h+d],N=[u+c,h+d];b(O,O,A),b(E,E,A),b(R,R,A),b(N,N,A);var V=_(O[0],E[0],R[0],N[0]),B=_(O[1],E[1],R[1],N[1]),G=[];G.push(\"M11=\",A[0]/D,w,\"M12=\",A[2]/k,w,\"M21=\",A[1]/D,w,\"M22=\",A[3]/k,w,\"Dx=\",g(u*D+A[4]),w,\"Dy=\",g(h*k+A[5])),I.padding=\"0 \"+g(V)+\"px \"+g(B)+\"px 0\",I.filter=S+\".Matrix(\"+G.join(\"\")+\", SizingMethod=clip)\"}else A&&(u=u*D+A[4],h=h*k+A[5]),I.filter=\"\",I.left=g(u)+\"px\",I.top=g(h)+\"px\";var F=this._imageEl,W=this._cropEl;F||(F=p.doc.createElement(\"div\"),this._imageEl=F);var Z=F.style;if(M){if(e&&i)Z.width=g(D*e*c/f)+\"px\",Z.height=g(k*i*d/m)+\"px\";else{var q=new Image,j=this;q.onload=function(){q.onload=null,e=q.width,i=q.height,Z.width=g(D*e*c/f)+\"px\",Z.height=g(k*i*d/m)+\"px\",j._imageWidth=e,j._imageHeight=i,j._imageSrc=r},q.src=r}W||(W=p.doc.createElement(\"div\"),W.style.overflow=\"hidden\",this._cropEl=W);var U=W.style;U.width=g((c+y*c/f)*D),U.height=g((d+x*d/m)*k),U.filter=S+\".Matrix(Dx=\"+-y*c/f*D+\",Dy=\"+-x*d/m*k+\")\",W.parentNode||T.appendChild(W),F.parentNode!=W&&W.appendChild(F)}else Z.width=g(D*c)+\"px\",Z.height=g(k*d)+\"px\",T.appendChild(F),W&&W.parentNode&&(T.removeChild(W),this._cropEl=null);var X=\"\",Y=n.opacity;1>Y&&(X+=\".Alpha(opacity=\"+g(100*Y)+\") \"),X+=S+\".AlphaImageLoader(src=\"+r+\", SizingMethod=scale)\",Z.filter=X,T.style.zIndex=z(this.zlevel,this.z,this.z2),P(t,T),n.text&&this.drawRectText(t,this.getBoundingRect())}},h.prototype.onRemove=function(t){k(t,this._vmlEl),this._vmlEl=null,this._cropEl=null,this._imageEl=null,this.removeRectText(t)},h.prototype.onAdd=function(t){P(t,this._vmlEl),this.appendRectText(t)};var W,Z=\"normal\",q={},j=0,U=100,X=document.createElement(\"div\"),Y=function(t){var e=q[t];if(!e){j>U&&(j=0,q={});var i,n=X.style;try{n.font=t,i=n.fontFamily.split(\",\")[0]}catch(r){}e={style:n.fontStyle||Z,variant:n.fontVariant||Z,weight:n.fontWeight||Z,size:0|parseFloat(n.fontSize||12),family:i||\"Microsoft YaHei\"},q[t]=e,j++}return e};s.measureText=function(t,e){var i=p.doc;W||(W=i.createElement(\"div\"),W.style.cssText=\"position:absolute;top:-20000px;left:0;padding:0;margin:0;border:none;white-space:pre;\",p.doc.body.appendChild(W));try{W.style.font=e}catch(n){}return W.innerHTML=\"\",W.appendChild(i.createTextNode(t)),{width:W.offsetWidth}};for(var $=new r,Q=function(t,e,i,n){var r=this.style,o=r.text;if(o){var a,l,u=r.textAlign,h=Y(r.textFont),c=h.style+\" \"+h.variant+\" \"+h.weight+\" \"+h.size+'px \"'+h.family+'\"',d=r.textBaseline,f=r.textVerticalAlign;i=i||s.getBoundingRect(o,c,u,d);var v=this.transform;if(v&&!n&&($.copy(e),$.applyTransform(v),e=$),n)a=e.x,l=e.y;else{var m=r.textPosition,y=r.textDistance;if(m instanceof Array)a=e.x+O(m[0],e.width),l=e.y+O(m[1],e.height),u=u||\"left\",d=d||\"top\";else{var x=s.adjustTextPositionOnRect(m,e,i,y);a=x.x,l=x.y,u=u||x.textAlign,d=d||x.textBaseline}}if(f){switch(f){case\"middle\":l-=i.height/2;break;case\"bottom\":l-=i.height}d=\"top\"}var _=h.size;switch(d){case\"hanging\":case\"top\":l+=_/1.75;break;case\"middle\":break;default:l-=_/2.25}switch(u){case\"left\":break;case\"center\":a-=i.width/2;break;case\"right\":a-=i.width}var S,M,T,A=p.createNode,I=this._textVmlEl;I?(T=I.firstChild,S=T.nextSibling,M=S.nextSibling):(I=A(\"line\"),S=A(\"path\"),M=A(\"textpath\"),T=A(\"skew\"),M.style[\"v-text-align\"]=\"left\",L(I),S.textpathok=!0,M.on=!0,I.from=\"0 0\",I.to=\"1000 0.05\",P(I,T),P(I,S),P(I,M),this._textVmlEl=I);var D=[a,l],k=I.style;v&&n?(b(D,D,v),T.on=!0,T.matrix=v[0].toFixed(3)+w+v[2].toFixed(3)+w+v[1].toFixed(3)+w+v[3].toFixed(3)+\",0,0\",T.offset=(g(D[0])||0)+\",\"+(g(D[1])||0),T.origin=\"0 0\",k.left=\"0px\",k.top=\"0px\"):(T.on=!1,k.left=g(a)+\"px\",k.top=g(l)+\"px\"),M.string=C(o);try{M.style.font=c}catch(E){}B(I,\"fill\",{fill:n?r.fill:r.textFill,opacity:r.opacity},this),B(I,\"stroke\",{stroke:n?r.stroke:r.textStroke,opacity:r.opacity,lineDash:r.lineDash},this),I.style.zIndex=z(this.zlevel,this.z,this.z2),P(t,I)}},K=function(t){k(t,this._textVmlEl),this._textVmlEl=null},J=function(t){P(t,this._textVmlEl)},tt=[l,u,h,d,c],et=0;et<tt.length;et++){var it=tt[et].prototype;it.drawRectText=Q,it.removeRectText=K,it.appendRectText=J}c.prototype.brushVML=function(t){var e=this.style;e.text?this.drawRectText(t,{x:e.x||0,y:e.y||0,width:0,height:0},this.getBoundingRect(),!0):this.removeRectText(t)},c.prototype.onRemove=function(t){this.removeRectText(t)},c.prototype.onAdd=function(t){this.appendRectText(t)}}},function(t,e,i){i(218),i(76).registerPainter(\"vml\",i(217))},function(t,e,i){var n=i(1),r=i(221),o=i(2);o.registerAction({type:\"geoRoam\",event:\"geoRoam\",update:\"updateLayout\"},function(t,e){var i=t.componentType||\"series\";e.eachComponent({mainType:i,query:t},function(e){var o=e.coordinateSystem;if(\"geo\"===o.type){var a=r.updateCenterAndZoom(o,t,e.get(\"scaleLimit\"));e.setCenter&&e.setCenter(a.center),e.setZoom&&e.setZoom(a.zoom),\"series\"===i&&n.each(e.seriesGroup,function(t){t.setCenter(a.center),t.setZoom(a.zoom)})}})})},function(t,e){var i={};i.updateCenterAndZoom=function(t,e,i){var n=t.getZoom(),r=t.getCenter(),o=e.zoom,a=t.dataToPoint(r);if(null!=e.dx&&null!=e.dy){a[0]-=e.dx,a[1]-=e.dy;var r=t.pointToData(a);t.setCenter(r)}if(null!=o){if(i){var s=i.min||0,l=i.max||1/0;o=Math.max(Math.min(n*o,l),s)/n}t.scale[0]*=o,t.scale[1]*=o;var u=t.position,h=(e.originX-u[0])*(o-1),c=(e.originY-u[1])*(o-1);u[0]-=h,u[1]-=c,t.updateTransform();var r=t.pointToData(a);t.setCenter(r),t.setZoom(o*n)}return{center:t.getCenter(),zoom:t.getZoom()}},t.exports=i},function(t,e,i){var n=i(5);t.exports=function(t){var e=t.coordinateSystem;if(!e||\"view\"===e.type){var i=e.getBoundingRect(),r=t.getData(),o=r.graph,a=0,s=r.getSum(\"value\"),l=2*Math.PI/(s||r.count()),u=i.width/2+i.x,h=i.height/2+i.y,c=Math.min(i.width,i.height)/2;o.eachNode(function(t){var e=t.getValue(\"value\");a+=l*(s?e:2)/2,t.setLayout([c*Math.cos(a)+u,c*Math.sin(a)+h]),a+=l*(s?e:2)/2}),r.setLayout({cx:u,cy:h}),o.eachEdge(function(t){var e,i=t.getModel().get(\"lineStyle.normal.curveness\")||0,r=n.clone(t.node1.getLayout()),o=n.clone(t.node2.getLayout()),a=(r[0]+o[0])/2,s=(r[1]+o[1])/2;+i&&(i*=3,e=[u*i+a*(1-i),h*i+s*(1-i)]),t.setLayout([r,o,e])})}}},function(t,e,i){var n=i(5);t.exports=function(t){t.eachEdge(function(t){var e=t.getModel().get(\"lineStyle.normal.curveness\")||0,i=n.clone(t.node1.getLayout()),r=n.clone(t.node2.getLayout()),o=[i,r];+e&&o.push([(i[0]+r[0])/2-(i[1]-r[1])*e,(i[1]+r[1])/2-(r[0]-i[0])*e]),t.setLayout(o)})}},function(t,e,i){var n=i(223);t.exports=function(t){var e=t.coordinateSystem;if(!e||\"view\"===e.type){var i=t.getGraph();i.eachNode(function(t){var e=t.getModel();t.setLayout([+e.get(\"x\"),+e.get(\"y\")])}),n(i)}}},function(t,e,i){function n(t,e,i){r.Group.call(this),this.add(this.createLine(t,e,i)),this._updateEffectSymbol(t,e)}var r=i(3),o=i(92),a=i(1),s=i(26),l=i(5),u=i(17),h=n.prototype;h.createLine=function(t,e,i){return new o(t,e,i)},h._updateEffectSymbol=function(t,e){var i=t.getItemModel(e),n=i.getModel(\"effect\"),r=n.get(\"symbolSize\"),o=n.get(\"symbol\");a.isArray(r)||(r=[r,r]);var l=n.get(\"color\")||t.getItemVisual(e,\"color\"),u=this.childAt(1);this._symbolType!==o&&(this.remove(u),u=s.createSymbol(o,-.5,-.5,1,1,l),u.z2=100,u.culling=!0,this.add(u)),u&&(u.setStyle(\"shadowColor\",l),u.setStyle(n.getItemStyle([\"color\"])),u.attr(\"scale\",r),u.setColor(l),u.attr(\"scale\",r),this._symbolType=o,this._updateEffectAnimation(t,n,e))},h._updateEffectAnimation=function(t,e,i){var n=this.childAt(1);if(n){var r=this,o=t.getItemLayout(i),a=1e3*e.get(\"period\"),s=e.get(\"loop\"),l=e.get(\"constantSpeed\"),u=e.get(\"delay\")||function(e){return e/t.count()*a/3},h=\"function\"==typeof u;if(n.ignore=!0,this.updateAnimationPoints(n,o),l>0&&(a=this.getLineLength(n)/l*1e3),a!==this._period||s!==this._loop){n.stopAnimation();var c=u;h&&(c=u(i)),n.__t>0&&(c=-a*n.__t),n.__t=0;var d=n.animate(\"\",s).when(a,{__t:1}).delay(c).during(function(){r.updateSymbolPosition(n)});s||d.done(function(){r.remove(n)}),d.start()}this._period=a,this._loop=s}},h.getLineLength=function(t){return l.dist(t.__p1,t.__cp1)+l.dist(t.__cp1,t.__p2)},h.updateAnimationPoints=function(t,e){t.__p1=e[0],t.__p2=e[1],t.__cp1=e[2]||[(e[0][0]+e[1][0])/2,(e[0][1]+e[1][1])/2]},h.updateData=function(t,e,i){this.childAt(0).updateData(t,e,i),this._updateEffectSymbol(t,e)},h.updateSymbolPosition=function(t){var e=t.__p1,i=t.__p2,n=t.__cp1,r=t.__t,o=t.position,a=u.quadraticAt,s=u.quadraticDerivativeAt;o[0]=a(e[0],n[0],i[0],r),o[1]=a(e[1],n[1],i[1],r);var l=s(e[0],n[0],i[0],r),h=s(e[1],n[1],i[1],r);t.rotation=-Math.atan2(h,l)-Math.PI/2,t.ignore=!1},h.updateLayout=function(t,e){this.childAt(0).updateLayout(t,e);var i=t.getItemModel(e).getModel(\"effect\");this._updateEffectAnimation(t,i,e)},a.inherits(n,r.Group),t.exports=n},function(t,e,i){function n(t,e,i){r.Group.call(this),this._createPolyline(t,e,i)}var r=i(3),o=i(1),a=n.prototype;a._createPolyline=function(t,e,i){var n=t.getItemLayout(e),o=new r.Polyline({shape:{points:n}});this.add(o),this._updateCommonStl(t,e,i)},a.updateData=function(t,e,i){var n=t.hostModel,o=this.childAt(0),a={shape:{points:t.getItemLayout(e)}};r.updateProps(o,a,n,e),this._updateCommonStl(t,e,i)},a._updateCommonStl=function(t,e,i){var n=this.childAt(0),a=t.getItemModel(e),s=t.getItemVisual(e,\"color\"),l=i&&i.lineStyle,u=i&&i.hoverLineStyle;i&&!t.hasItemOption||(l=a.getModel(\"lineStyle.normal\").getLineStyle(),u=a.getModel(\"lineStyle.emphasis\").getLineStyle()),n.useStyle(o.defaults({strokeNoScale:!0,fill:\"none\",stroke:s},l)),n.hoverStyle=u,r.setHoverStyle(this)},a.updateLayout=function(t,e){var i=this.childAt(0);i.setShape(\"points\",t.getItemLayout(e))},o.inherits(n,r.Group),t.exports=n},function(t,e,i){var n=i(14),r=i(378),o=i(240),a=i(30),s=i(23),l=i(1),u=i(35);t.exports=function(t,e,i,h,c){for(var d=new r(h),f=0;f<t.length;f++)d.addNode(l.retrieve(t[f].id,t[f].name,f),f);for(var p=[],g=[],v=0,f=0;f<e.length;f++){var m=e[f],y=m.source,x=m.target;d.addEdge(y,x,v)&&(g.push(m),p.push(l.retrieve(m.id,y+\" > \"+x)),v++)}var _,b=i.get(\"coordinateSystem\");if(\"cartesian2d\"===b||\"polar\"===b)_=u(t,i,i.ecModel);else{var w=s.get(b),S=a((w&&\"view\"!==w.type?w.dimensions||[]:[]).concat([\"value\"]),t);_=new n(S,i),_.initData(t)}var M=new n([\"value\"],i);return M.initData(g,p),c&&c(_,M),o({mainData:_,struct:d,structAttr:\"graph\",datas:{node:_,edge:M},datasAttr:{node:\"data\",edge:\"edgeData\"}}),d.update(),d}},function(t,e,i){function n(t,e){var i=t.getItemStyle(),n=t.get(\"areaColor\");return n&&(i.fill=n),i}function r(t,e,i,n){e.off(\"click\"),t.get(\"selectedMode\")&&e.on(\"click\",function(r){for(var a=r.target;!a.__region;)a=a.parent;if(a){var s=a.__region,l={type:(\"geo\"===t.mainType?\"geo\":\"map\")+\"ToggleSelect\",name:s.name,from:n.uid};l[t.mainType+\"Id\"]=t.id,i.dispatchAction(l),o(t,e)}})}function o(t,e){e.eachChild(function(e){e.__region&&e.trigger(t.isSelected(e.__region.name)?\"emphasis\":\"normal\")})}function a(t,e){var i=new l.Group;this._controller=new s(t.getZr(),e?i:null,null),this.group=i,this._updateGroup=e}var s=i(78),l=i(3),u=i(1);a.prototype={constructor:a,draw:function(t,e,i,a,s){var h=t.getData&&t.getData(),c=t.coordinateSystem,d=this.group,f=c.scale,p={position:c.position,scale:f};!d.childAt(0)||s?d.attr(p):l.updateProps(d,p,t),d.removeAll();var g=[\"itemStyle\",\"normal\"],v=[\"itemStyle\",\"emphasis\"],m=[\"label\",\"normal\"],y=[\"label\",\"emphasis\"];u.each(c.regions,function(e){var i=new l.Group,r=new l.CompoundPath({shape:{paths:[]}});i.add(r);var o,a=t.getRegionModel(e.name)||t,s=a.getModel(g),c=a.getModel(v),p=n(s,f),x=n(c,f),_=a.getModel(m),b=a.getModel(y);if(h){o=h.indexOfName(e.name);var w=h.getItemVisual(o,\"color\",!0);w&&(p.fill=w)}var S=_.getModel(\"textStyle\"),M=b.getModel(\"textStyle\");u.each(e.contours,function(t){var e=new l.Polygon({shape:{points:t}});r.shape.paths.push(e)}),r.setStyle(p),r.style.strokeNoScale=!0,r.culling=!0;var T=_.get(\"show\"),A=b.get(\"show\"),I=h&&isNaN(h.get(\"value\",o)),L=h&&h.getItemLayout(o);if(!h||I&&(T||A)||L&&L.showLabel){var C=h?o:e.name,D=t.getFormattedLabel(C,\"normal\"),P=t.getFormattedLabel(C,\"emphasis\"),k=new l.Text({style:{text:T?D||e.name:\"\",fill:S.getTextColor(),textFont:S.getFont(),textAlign:\"center\",textVerticalAlign:\"middle\"},hoverStyle:{text:A?P||e.name:\"\",fill:M.getTextColor(),textFont:M.getFont()},position:e.center.slice(),scale:[1/f[0],1/f[1]],z2:10,silent:!0});i.add(k)}if(h)h.setItemGraphicEl(o,i);else{var a=t.getRegionModel(e.name);r.eventData={componentType:\"geo\",geoIndex:t.componentIndex,name:e.name,region:a&&a.option||{}}}i.__region=e,l.setHoverStyle(i,x),d.add(i)}),this._updateController(t,e,i),r(t,d,i,a),o(t,d)},remove:function(){this.group.removeAll(),this._controller.dispose()},_updateController:function(t,e,i){function n(){var e={type:\"geoRoam\",componentType:a};return e[a+\"Id\"]=t.id,e}var r=t.coordinateSystem,o=this._controller;o.zoomLimit=t.get(\"scaleLimit\"),o.zoom=r.getZoom(),o.enable(t.get(\"roam\")||!1);var a=t.mainType;o.off(\"pan\").on(\"pan\",function(t,e){i.dispatchAction(u.extend(n(),{dx:t,dy:e}))}),o.off(\"zoom\").on(\"zoom\",function(t,e,r){if(i.dispatchAction(u.extend(n(),{zoom:t,originX:e,originY:r})),this._updateGroup){var o=this.group,a=o.scale;o.traverse(function(t){\"text\"===t.type&&t.attr(\"scale\",[1/a[0],1/a[1]])})}},this),o.rectProvider=function(){return r.getViewRectAfterRoam()}}},t.exports=a},function(t,e,i){i(239),i(364),i(332);var n=i(2),r=i(1),o=5;n.extendComponentView({type:\"parallel\",render:function(t,e,i){var n=i.getZr();if(!this.__onMouseDown){var a;n.on(\"mousedown\",this.__onMouseDown=function(t){a=[t.offsetX,t.offsetY]}),n.on(\"mouseup\",this.__onMouseUp=function(e){var n=[e.offsetX,e.offsetY],s=Math.pow(a[0]-n[0],2)+Math.pow(a[1]-n[1],2);if(t.get(\"axisExpandable\")&&!(s>o)){var l=t.coordinateSystem,u=l.findClosestAxisDim(n);if(u){var h=r.indexOf(l.dimensions,u);i.dispatchAction({type:\"parallelAxisExpand\",axisExpandCenter:h})}}})}},dispose:function(t,e){e.getZr().off(this.__onMouseDown),e.getZr().off(this.__onMouseUp)}}),n.registerPreprocessor(i(365))},function(t,e,i){var n=i(2),r=i(1),o=i(12),a=i(382),s=i(71),l=i(172),u=s.mapVisual,h=i(11),c=s.eachVisual,d=i(4),f=r.isArray,p=r.each,g=d.asc,v=d.linearMap,m=r.noop,y=[\"#f6efa6\",\"#d88273\",\"#bf444c\"],x=n.extendComponentModel({type:\"visualMap\",dependencies:[\"series\"],stateList:[\"inRange\",\"outOfRange\"],replacableOptionKeys:[\"inRange\",\"outOfRange\",\"target\",\"controller\",\"color\"],dataBound:[-(1/0),1/0],layoutMode:{type:\"box\",ignoreSize:!0},defaultOption:{show:!0,zlevel:0,z:4,seriesIndex:null,min:0,max:200,dimension:null,inRange:null,outOfRange:null,left:0,right:null,top:null,bottom:0,itemWidth:null,itemHeight:null,inverse:!1,orient:\"vertical\",backgroundColor:\"rgba(0,0,0,0)\",borderColor:\"#ccc\",contentColor:\"#5793f3\",inactiveColor:\"#aaa\",borderWidth:0,padding:5,textGap:10,precision:0,color:null,formatter:null,text:null,textStyle:{color:\"#333\"}},init:function(t,e,i){this._dataExtent,this.targetVisuals={},this.controllerVisuals={},this.textStyleModel,this.itemSize,this.mergeDefaultAndTheme(t,i)},optionUpdated:function(t,e){var i=this.option;o.canvasSupported||(i.realtime=!1),!e&&l.replaceVisualOption(i,t,this.replacableOptionKeys),this.textStyleModel=this.getModel(\"textStyle\"),this.resetItemSize(),this.completeVisualOption()},resetVisual:function(t){var e=this.stateList;t=r.bind(t,this),this.controllerVisuals=l.createVisualMappings(this.option.controller,e,t),this.targetVisuals=l.createVisualMappings(this.option.target,e,t)},resetTargetSeries:function(){var t=this.option,e=null==t.seriesIndex;t.seriesIndex=e?[]:h.normalizeToArray(t.seriesIndex),e&&this.ecModel.eachSeries(function(e,i){t.seriesIndex.push(i)})},eachTargetSeries:function(t,e){r.each(this.option.seriesIndex,function(i){t.call(e,this.ecModel.getSeriesByIndex(i))},this)},isTargetSeries:function(t){var e=!1;return this.eachTargetSeries(function(i){i===t&&(e=!0)}),e},formatValueText:function(t,e,i){function n(t){return t===u[0]?\"min\":t===u[1]?\"max\":(+t).toFixed(l)}var o,a,s=this.option,l=s.precision,u=this.dataBound,h=s.formatter;return i=i||[\"<\",\">\"],r.isArray(t)&&(t=t.slice(),o=!0),a=e?t:o?[n(t[0]),n(t[1])]:n(t),r.isString(h)?h.replace(\"{value}\",o?a[0]:a).replace(\"{value2}\",o?a[1]:a):r.isFunction(h)?o?h(t[0],t[1]):h(t):o?t[0]===u[0]?i[0]+\" \"+a[1]:t[1]===u[1]?i[1]+\" \"+a[0]:a[0]+\" - \"+a[1]:a},resetExtent:function(){var t=this.option,e=g([t.min,t.max]);this._dataExtent=e},getDataDimension:function(t){var e=this.option.dimension;return null!=e?e:t.dimensions.length-1},getExtent:function(){return this._dataExtent.slice()},completeVisualOption:function(){function t(t){f(n.color)&&!t.inRange&&(t.inRange={color:n.color.slice().reverse()}),t.inRange=t.inRange||{color:y},p(this.stateList,function(e){var i=t[e];if(r.isString(i)){var n=a.get(i,\"active\",d);n?(t[e]={},t[e][i]=n):delete t[e]}},this)}function e(t,e,i){var n=t[e],r=t[i];n&&!r&&(r=t[i]={},p(n,function(t,e){if(s.isValidType(e)){var i=a.get(e,\"inactive\",d);null!=i&&(r[e]=i,\"color\"!==e||r.hasOwnProperty(\"opacity\")||r.hasOwnProperty(\"colorAlpha\")||(r.opacity=[0,0]))}}))}function i(t){var e=(t.inRange||{}).symbol||(t.outOfRange||{}).symbol,i=(t.inRange||{}).symbolSize||(t.outOfRange||{}).symbolSize,n=this.get(\"inactiveColor\");p(this.stateList,function(o){var a=this.itemSize,s=t[o];s||(s=t[o]={color:d?n:[n]}),null==s.symbol&&(s.symbol=e&&r.clone(e)||(d?\"roundRect\":[\"roundRect\"])),null==s.symbolSize&&(s.symbolSize=i&&r.clone(i)||(d?a[0]:[a[0],a[0]])),s.symbol=u(s.symbol,function(t){return\"none\"===t||\"square\"===t?\"roundRect\":t});var l=s.symbolSize;if(null!=l){var h=-(1/0);c(l,function(t){t>h&&(h=t)}),s.symbolSize=u(l,function(t){return v(t,[0,h],[0,a[0]],!0)})}},this)}var n=this.option,o={inRange:n.inRange,outOfRange:n.outOfRange},l=n.target||(n.target={}),h=n.controller||(n.controller={});r.merge(l,o),r.merge(h,o);var d=this.isCategory();t.call(this,l),t.call(this,h),e.call(this,l,\"inRange\",\"outOfRange\"),i.call(this,h)},resetItemSize:function(){this.itemSize=[parseFloat(this.get(\"itemWidth\")),parseFloat(this.get(\"itemHeight\"))]},isCategory:function(){return!!this.option.categories},setSelected:m,getValueState:m});t.exports=x},function(t,e,i){var n=i(1),r=i(3),o=i(8),a=i(13),s=i(2),l=i(71);t.exports=s.extendComponentView({type:\"visualMap\",autoPositionValues:{left:1,right:1,top:1,bottom:1},init:function(t,e){this.ecModel=t,this.api=e,this.visualMapModel},render:function(t,e,i,n){return this.visualMapModel=t,t.get(\"show\")===!1?void this.group.removeAll():void this.doRender.apply(this,arguments)},renderBackground:function(t){var e=this.visualMapModel,i=o.normalizeCssArray(e.get(\"padding\")||0),n=t.getBoundingRect();t.add(new r.Rect({z2:-1,silent:!0,shape:{x:n.x-i[3],y:n.y-i[0],width:n.width+i[3]+i[1],height:n.height+i[0]+i[2]},style:{fill:e.get(\"backgroundColor\"),stroke:e.get(\"borderColor\"),lineWidth:e.get(\"borderWidth\")}}))},getControllerVisual:function(t,e,i){function r(t){return u[t]}function o(t,e){u[t]=e}i=i||{};var a=i.forceState,s=this.visualMapModel,u={};if(\"symbol\"===e&&(u.symbol=s.get(\"itemSymbol\")),\"color\"===e){var h=s.get(\"contentColor\");u.color=h}var c=s.controllerVisuals[a||s.getValueState(t)],d=l.prepareVisualTypes(c);return n.each(d,function(n){var a=c[n];i.convertOpacityToAlpha&&\"opacity\"===n&&(n=\"colorAlpha\",a=c.__alphaForOpacity),l.dependsOn(n,e)&&a&&a.applyVisual(t,r,o)}),u[e]},positionGroup:function(t){var e=this.visualMapModel,i=this.api;a.positionGroup(t,e.getBoxLayoutParams(),{width:i.getWidth(),height:i.getHeight()})},doRender:n.noop})},function(t,e,i){var n=i(13),r={getItemAlign:function(t,e,i){var r=t.option,o=r.align;if(null!=o&&\"auto\"!==o)return o;for(var a={width:e.getWidth(),height:e.getHeight()},s=\"horizontal\"===r.orient?1:0,l=[[\"left\",\"right\",\"width\"],[\"top\",\"bottom\",\"height\"]],u=l[s],h=[0,null,10],c={},d=0;3>d;d++)c[l[1-s][d]]=h[d],c[u[d]]=2===d?i[0]:r[u[d]];var f=[[\"x\",\"width\",3],[\"y\",\"height\",0]][s],p=n.getLayoutRect(c,a,r.padding);return u[(p.margin[f[2]]||0)+p[f[0]]+.5*p[f[1]]<.5*a[f[1]]?0:1]}};t.exports=r},function(t,e,i){function n(t,e){return t&&t.hasOwnProperty&&t.hasOwnProperty(e)}var r=i(1),o=r.each;t.exports=function(t){var e=t&&t.visualMap;r.isArray(e)||(e=e?[e]:[]),o(e,function(t){if(t){n(t,\"splitList\")&&!n(t,\"pieces\")&&(t.pieces=t.splitList,delete t.splitList);var e=t.pieces;e&&r.isArray(e)&&o(e,function(t){r.isObject(t)&&(n(t,\"start\")&&!n(t,\"min\")&&(t.min=t.start),n(t,\"end\")&&!n(t,\"max\")&&(t.max=t.end))})}})}},function(t,e,i){i(10).registerSubTypeDefaulter(\"visualMap\",function(t){return t.categories||(t.pieces?t.pieces.length>0:t.splitNumber>0)&&!t.calculable?\"piecewise\":\"continuous\"})},function(t,e,i){function n(t,e){t.eachTargetSeries(function(e){var i=e.getData();s.applyVisual(t.stateList,t.targetVisuals,i,t.getValueState,t,t.getDataDimension(i))})}function r(t){t.eachSeries(function(e){var i=e.getData(),n=[];t.eachComponent(\"visualMap\",function(t){if(t.isTargetSeries(e)){var r={};n.push(r),r.stops=t.getStops(e,o),r.dimension=t.getDataDimension(i)}}),e.getData().setVisual(\"visualMeta\",n)})}function o(t,e,i){function n(t){return s[t]}function r(t,e){s[t]=e}for(var o=t.targetVisuals[i],a=l.prepareVisualTypes(o),s={},u=0,h=a.length;h>u;u++){var c=a[u],d=o[\"colorAlpha\"===c?\"__alphaForOpacity\":c];d&&d.applyVisual(e,n,r)}return s.color}var a=i(2),s=i(172),l=i(71);a.registerVisual(a.PRIORITY.VISUAL.COMPONENT,function(t){t.eachComponent(\"visualMap\",function(e){n(e,t)}),r(t)})},function(t,e,i){var n=i(2),r={type:\"selectDataRange\",event:\"dataRangeSelected\",update:\"update\"};n.registerAction(r,function(t,e){e.eachComponent({mainType:\"visualMap\",query:t},function(e){e.setSelected(t.selected)})})},function(t,e,i){function n(){s.call(this)}function r(t){this.name=t,this.zoomLimit,s.call(this),this._roamTransform=new n,this._viewTransform=new n,this._center,this._zoom}var o=i(5),a=i(19),s=i(86),l=i(1),u=i(7),h=o.applyTransform;l.mixin(n,s),r.prototype={constructor:r,type:\"view\",dimensions:[\"x\",\"y\"],setBoundingRect:function(t,e,i,n){return this._rect=new u(t,e,i,n),this._rect},getBoundingRect:function(){return this._rect},setViewRect:function(t,e,i,n){i=i,n=n,this.transformTo(t,e,i,n),this._viewRect=new u(t,e,i,n)},transformTo:function(t,e,i,n){var r=this.getBoundingRect(),o=this._viewTransform;o.transform=r.calculateTransform(new u(t,e,i,n)),o.decomposeTransform(),this._updateTransform()},setCenter:function(t){t&&(this._center=t,this._updateCenterAndZoom())},setZoom:function(t){t=t||1;var e=this.zoomLimit;e&&(null!=e.max&&(t=Math.min(e.max,t)),null!=e.min&&(t=Math.max(e.min,t))),this._zoom=t,this._updateCenterAndZoom()},getDefaultCenter:function(){var t=this.getBoundingRect(),e=t.x+t.width/2,i=t.y+t.height/2;return[e,i]},getCenter:function(){return this._center||this.getDefaultCenter()},getZoom:function(){return this._zoom||1},getRoamTransform:function(){return this._roamTransform},_updateCenterAndZoom:function(){var t=this._viewTransform.getLocalTransform(),e=this._roamTransform,i=this.getDefaultCenter(),n=this.getCenter(),r=this.getZoom();n=o.applyTransform([],n,t),i=o.applyTransform([],i,t),e.origin=n,e.position=[i[0]-n[0],i[1]-n[1]],e.scale=[r,r],this._updateTransform()},_updateTransform:function(){var t=this._roamTransform,e=this._viewTransform;e.parent=t,t.updateTransform(),e.updateTransform(),e.transform&&a.copy(this.transform||(this.transform=[]),e.transform),this.transform?(this.invTransform=this.invTransform||[],\na.invert(this.invTransform,this.transform)):this.invTransform=null,this.decomposeTransform()},getViewRect:function(){return this._viewRect},getViewRectAfterRoam:function(){var t=this.getBoundingRect().clone();return t.applyTransform(this.transform),t},dataToPoint:function(t){var e=this.transform;return e?h([],t,e):[t[0],t[1]]},pointToData:function(t){var e=this.invTransform;return e?h([],t,e):[t[0],t[1]]}},l.mixin(r,s),t.exports=r},function(t,e,i){function n(t,e,i){if(this.name=t,this.contours=e,i)i=[i[0],i[1]];else{var n=this.getBoundingRect();i=[n.x+n.width/2,n.y+n.height/2]}this.center=i}var r=i(241),o=i(7),a=i(73),s=i(5);n.prototype={constructor:n,getBoundingRect:function(){var t=this._rect;if(t)return t;for(var e=Number.MAX_VALUE,i=[e,e],n=[-e,-e],r=[],l=[],u=this.contours,h=0;h<u.length;h++)a.fromPoints(u[h],r,l),s.min(i,i,r),s.max(n,n,l);return 0===h&&(i[0]=i[1]=n[0]=n[1]=0),this._rect=new o(i[0],i[1],n[0]-i[0],n[1]-i[1])},contain:function(t){var e=this.getBoundingRect(),i=this.contours;if(e.contain(t[0],t[1]))for(var n=0,o=i.length;o>n;n++)if(r.contain(i[n],t[0],t[1]))return!0;return!1},transformTo:function(t,e,i,n){var r=this.getBoundingRect(),a=r.width/r.height;i?n||(n=i/a):i=a*n;for(var l=new o(t,e,i,n),u=r.calculateTransform(l),h=this.contours,c=0;c<h.length;c++)for(var d=0;d<h[c].length;d++)s.applyTransform(h[c][d],h[c][d],u);r=this._rect,r.copy(l),this.center=[r.x+r.width/2,r.y+r.height/2]}},t.exports=n},function(t,e,i){function n(t,e){var i=[];return t.eachComponent(\"parallel\",function(n,o){var a=new r(n,t,e);a.name=\"parallel_\"+o,a.resize(n,e),n.coordinateSystem=a,a.model=n,i.push(a)}),t.eachSeries(function(e){if(\"parallel\"===e.get(\"coordinateSystem\")){var i=t.queryComponents({mainType:\"parallel\",index:e.get(\"parallelIndex\"),id:e.get(\"parallelId\")})[0];e.coordinateSystem=i.coordinateSystem}}),i}var r=i(362);i(23).register(\"parallel\",{create:n})},function(t,e,i){function n(t){var e=t.mainData,i=t.datas;i||(i={main:e},t.datasAttr={main:\"data\"}),t.datas=t.mainData=null,u(e,i,t),d(i,function(i){d(e.TRANSFERABLE_METHODS,function(e){i.wrapMethod(e,c.curry(r,t))})}),e.wrapMethod(\"cloneShallow\",c.curry(a,t)),d(e.CHANGABLE_METHODS,function(i){e.wrapMethod(i,c.curry(o,t))}),c.assert(i[e.dataType]===e)}function r(t,e){if(l(this)){var i=c.extend({},this[f]);i[this.dataType]=e,u(e,i,t)}else h(e,this.dataType,this[p],t);return e}function o(t,e){return t.struct&&t.struct.update(this),e}function a(t,e){return d(e[f],function(i,n){i!==e&&h(i.cloneShallow(),n,e,t)}),e}function s(t){var e=this[p];return null==t||null==e?e:e[f][t]}function l(t){return t[p]===t}function u(t,e,i){t[f]={},d(e,function(e,n){h(e,n,t,i)})}function h(t,e,i,n){i[f][e]=t,t[p]=i,t.dataType=e,n.struct&&(t[n.structAttr]=n.struct,n.struct[n.datasAttr[e]]=t),t.getLinkedData=s}var c=i(1),d=c.each,f=\"\\x00__link_datas\",p=\"\\x00__link_mainData\";t.exports=n},function(t,e,i){function n(t,e){return Math.abs(t-e)<a}function r(t,e,i){var r=0,a=t[0];if(!a)return!1;for(var s=1;s<t.length;s++){var l=t[s];r+=o(a[0],a[1],l[0],l[1],e,i),a=l}var u=t[0];return n(a[0],u[0])&&n(a[1],u[1])||(r+=o(a[0],a[1],u[0],u[1],e,i)),0!==r}var o=i(84),a=1e-8;t.exports={contain:r}},function(t,e,i){var n=i(2);i(243),i(244),n.registerVisual(i(246)),n.registerLayout(i(245))},function(t,e,i){\"use strict\";var n=i(1),r=i(15),o=i(169),a=r.extend({type:\"series.boxplot\",dependencies:[\"xAxis\",\"yAxis\",\"grid\"],valueDimensions:[\"min\",\"Q1\",\"median\",\"Q3\",\"max\"],dimensions:null,defaultOption:{zlevel:0,z:2,coordinateSystem:\"cartesian2d\",legendHoverLink:!0,hoverAnimation:!0,layout:null,boxWidth:[7,50],itemStyle:{normal:{color:\"#fff\",borderWidth:1},emphasis:{borderWidth:2,shadowBlur:5,shadowOffsetX:2,shadowOffsetY:2,shadowColor:\"rgba(0,0,0,0.4)\"}},animationEasing:\"elasticOut\",animationDuration:800}});n.mixin(a,o.seriesModelMixin,!0),t.exports=a},function(t,e,i){\"use strict\";function n(t,e,i){var n=e.getItemModel(i),r=n.getModel(u),o=e.getItemVisual(i,\"color\"),s=r.getItemStyle([\"borderColor\"]),l=t.childAt(t.whiskerIndex);l.style.set(s),l.style.stroke=o,l.dirty();var c=t.childAt(t.bodyIndex);c.style.set(s),c.style.stroke=o,c.dirty();var d=n.getModel(h).getItemStyle();a.setHoverStyle(t,d)}var r=i(1),o=i(27),a=i(3),s=i(169),l=o.extend({type:\"boxplot\",getStyleUpdater:function(){return n}});r.mixin(l,s.viewMixin,!0);var u=[\"itemStyle\",\"normal\"],h=[\"itemStyle\",\"emphasis\"];t.exports=l},function(t,e,i){function n(t){var e=[],i=[];return t.eachSeriesByType(\"boxplot\",function(t){var n=t.getBaseAxis(),r=a.indexOf(i,n);0>r&&(r=i.length,i[r]=n,e[r]={axis:n,seriesModels:[]}),e[r].seriesModels.push(t)}),e}function r(t){var e,i,n=t.axis,r=t.seriesModels,o=r.length,s=t.boxWidthList=[],h=t.boxOffsetList=[],c=[];if(\"category\"===n.type)i=n.getBandWidth();else{var d=0;u(r,function(t){d=Math.max(d,t.getData().count())}),e=n.getExtent(),Math.abs(e[1]-e[0])/d}u(r,function(t){var e=t.get(\"boxWidth\");a.isArray(e)||(e=[e,e]),c.push([l(e[0],i)||0,l(e[1],i)||0])});var f=.8*i-2,p=f/o*.3,g=(f-p*(o-1))/o,v=g/2-f/2;u(r,function(t,e){h.push(v),v+=p+g,s.push(Math.min(Math.max(g,c[e][0]),c[e][1]))})}function o(t,e,i){var n=t.coordinateSystem,r=t.getData(),o=t.dimensions,a=t.get(\"layout\"),s=i/2;r.each(o,function(){function t(t){var i=[];i[f]=c,i[p]=t;var r;return isNaN(c)||isNaN(t)?r=[NaN,NaN]:(r=n.dataToPoint(i),r[f]+=e),r}function i(t,e){var i=t.slice(),n=t.slice();i[f]+=s,n[f]-=s,e?x.push(i,n):x.push(n,i)}function l(t){var e=[t.slice(),t.slice()];e[0][f]-=s,e[1][f]+=s,y.push(e)}var u=arguments,h=o.length,c=u[0],d=u[h],f=\"horizontal\"===a?0:1,p=1-f,g=t(u[3]),v=t(u[1]),m=t(u[5]),y=[[v,t(u[2])],[m,t(u[4])]];l(v),l(m),l(g);var x=[];i(y[0][1],0),i(y[1][1],1),r.setItemLayout(d,{chartLayout:a,initBaseline:g[p],median:g,bodyEnds:x,whiskerEnds:y})})}var a=i(1),s=i(4),l=s.parsePercent,u=a.each;t.exports=function(t){var e=n(t);u(e,function(t){var e=t.seriesModels;e.length&&(r(t),u(e,function(e,i){o(e,t.boxOffsetList[i],t.boxWidthList[i])}))})}},function(t,e){var i=[\"itemStyle\",\"normal\",\"borderColor\"];t.exports=function(t,e){var n=t.get(\"color\");t.eachRawSeriesByType(\"boxplot\",function(e){var r=n[e.seriesIndex%n.length],o=e.getData();o.setVisual({legendSymbol:\"roundRect\",color:e.get(i)||r}),t.isSeriesFiltered(e)||o.each(function(t){var e=o.getItemModel(t);o.setItemVisual(t,{color:e.get(i,!0)})})})}},function(t,e,i){var n=i(2);i(248),i(249),n.registerPreprocessor(i(252)),n.registerVisual(i(251)),n.registerLayout(i(250))},function(t,e,i){\"use strict\";var n=i(1),r=i(15),o=i(169),a=i(8),s=a.encodeHTML,l=a.addCommas,u=r.extend({type:\"series.candlestick\",dependencies:[\"xAxis\",\"yAxis\",\"grid\"],valueDimensions:[\"open\",\"close\",\"lowest\",\"highest\"],dimensions:null,defaultOption:{zlevel:0,z:2,coordinateSystem:\"cartesian2d\",legendHoverLink:!0,hoverAnimation:!0,layout:null,itemStyle:{normal:{color:\"#c23531\",color0:\"#314656\",borderWidth:1,borderColor:\"#c23531\",borderColor0:\"#314656\"},emphasis:{borderWidth:2}},animationUpdate:!1,animationEasing:\"linear\",animationDuration:300},getShadowDim:function(){return\"open\"},formatTooltip:function(t,e){var i=n.map(this.valueDimensions,function(e){return e+\": \"+l(this._data.get(e,t))},this);return s(this.name)+\"<br />\"+i.join(\"<br />\")},brushSelector:function(t,e){return e.rect(t.brushRect)}});n.mixin(u,o.seriesModelMixin,!0),t.exports=u},function(t,e,i){\"use strict\";function n(t,e,i){var n=e.getItemModel(i),r=n.getModel(u),o=e.getItemVisual(i,\"color\"),s=e.getItemVisual(i,\"borderColor\")||o,l=r.getItemStyle([\"color\",\"color0\",\"borderColor\",\"borderColor0\"]),c=t.childAt(t.whiskerIndex);c.useStyle(l),c.style.stroke=s;var d=t.childAt(t.bodyIndex);d.useStyle(l),d.style.fill=o,d.style.stroke=s;var f=n.getModel(h).getItemStyle();a.setHoverStyle(t,f)}var r=i(1),o=i(27),a=i(3),s=i(169),l=o.extend({type:\"candlestick\",getStyleUpdater:function(){return n}});r.mixin(l,s.viewMixin,!0);var u=[\"itemStyle\",\"normal\"],h=[\"itemStyle\",\"emphasis\"];t.exports=l},function(t,e){function i(t,e){var i,a=t.getBaseAxis(),s=\"category\"===a.type?a.getBandWidth():(i=a.getExtent(),Math.abs(i[1]-i[0])/e.count());return s/2-2>r?s/2-2:s-r>o?r:Math.max(s-o,n)}var n=2,r=5,o=4;t.exports=function(t){t.eachSeriesByType(\"candlestick\",function(t){var e=t.coordinateSystem,n=t.getData(),r=t.dimensions,o=t.get(\"layout\"),a=i(t,n);n.each(r,function(){function t(t){var i=[];return i[d]=h,i[f]=t,isNaN(h)||isNaN(t)?[NaN,NaN]:e.dataToPoint(i)}function i(t,e){var i=t.slice(),n=t.slice();i[d]+=a/2,n[d]-=a/2,e?T.push(i,n):T.push(n,i)}function s(){var e=t(Math.min(p,g,v,m)),i=t(Math.max(p,g,v,m));return e[d]-=a/2,i[d]-=a/2,{x:e[0],y:e[1],width:f?a:i[0]-e[0],height:f?i[1]-e[1]:a}}var l=arguments,u=r.length,h=l[0],c=l[u],d=\"horizontal\"===o?0:1,f=1-d,p=l[1],g=l[2],v=l[3],m=l[4],y=Math.min(p,g),x=Math.max(p,g),_=t(y),b=t(x),w=t(v),S=t(m),M=[[S,b],[w,_]],T=[];i(b,0),i(_,1),n.setItemLayout(c,{chartLayout:o,sign:p>g?-1:g>p?1:0,initBaseline:p>g?b[f]:_[f],bodyEnds:T,whiskerEnds:M,brushRect:s()})},!0)})}},function(t,e){var i=[\"itemStyle\",\"normal\",\"borderColor\"],n=[\"itemStyle\",\"normal\",\"borderColor0\"],r=[\"itemStyle\",\"normal\",\"color\"],o=[\"itemStyle\",\"normal\",\"color0\"];t.exports=function(t,e){t.eachRawSeriesByType(\"candlestick\",function(e){var a=e.getData();a.setVisual({legendSymbol:\"roundRect\"}),t.isSeriesFiltered(e)||a.each(function(t){var e=a.getItemModel(t),s=a.getItemLayout(t).sign;a.setItemVisual(t,{color:e.get(s>0?r:o),borderColor:e.get(s>0?i:n)})})})}},function(t,e,i){var n=i(1);t.exports=function(t){t&&n.isArray(t.series)&&n.each(t.series,function(t){n.isObject(t)&&\"k\"===t.type&&(t.type=\"candlestick\")})}},function(t,e,i){var n=i(1),r=i(2);i(254),i(255),r.registerVisual(n.curry(i(46),\"effectScatter\",\"circle\",null)),r.registerLayout(n.curry(i(55),\"effectScatter\"))},function(t,e,i){\"use strict\";var n=i(35),r=i(15);t.exports=r.extend({type:\"series.effectScatter\",dependencies:[\"grid\",\"polar\"],getInitialData:function(t,e){var i=n(t.data,this,e);return i},brushSelector:\"point\",defaultOption:{coordinateSystem:\"cartesian2d\",zlevel:0,z:2,legendHoverLink:!0,effectType:\"ripple\",showEffectOn:\"render\",rippleEffect:{period:4,scale:2.5,brushType:\"fill\"},symbolSize:10}})},function(t,e,i){var n=i(39),r=i(282);i(2).extendChartView({type:\"effectScatter\",init:function(){this._symbolDraw=new n(r)},render:function(t,e,i){var n=t.getData(),r=this._symbolDraw;r.updateData(n),this.group.add(r.group)},updateLayout:function(){this._symbolDraw.updateLayout()},remove:function(t,e){this._symbolDraw&&this._symbolDraw.remove(e)}})},function(t,e,i){var n=i(1),r=i(2);i(257),i(258),r.registerVisual(n.curry(i(72),\"funnel\")),r.registerLayout(i(259)),r.registerProcessor(n.curry(i(70),\"funnel\"))},function(t,e,i){\"use strict\";var n=i(14),r=i(11),o=i(30),a=i(2).extendSeriesModel({type:\"series.funnel\",init:function(t){a.superApply(this,\"init\",arguments),this.legendDataProvider=function(){return this._dataBeforeProcessed},this._defaultLabelLine(t)},getInitialData:function(t,e){var i=o([\"value\"],t.data),r=new n(i,this);return r.initData(t.data),r},_defaultLabelLine:function(t){r.defaultEmphasis(t.labelLine,[\"show\"]);var e=t.labelLine.normal,i=t.labelLine.emphasis;e.show=e.show&&t.label.normal.show,i.show=i.show&&t.label.emphasis.show},defaultOption:{zlevel:0,z:2,legendHoverLink:!0,left:80,top:60,right:80,bottom:60,minSize:\"0%\",maxSize:\"100%\",sort:\"descending\",gap:0,funnelAlign:\"center\",label:{normal:{show:!0,position:\"outer\"},emphasis:{show:!0}},labelLine:{normal:{show:!0,length:20,lineStyle:{width:1,type:\"solid\"}},emphasis:{}},itemStyle:{normal:{borderColor:\"#fff\",borderWidth:1},emphasis:{}}}});t.exports=a},function(t,e,i){function n(t,e){function i(){a.ignore=a.hoverIgnore,s.ignore=s.hoverIgnore}function n(){a.ignore=a.normalIgnore,s.ignore=s.normalIgnore}o.Group.call(this);var r=new o.Polygon,a=new o.Polyline,s=new o.Text;this.add(r),this.add(a),this.add(s),this.updateData(t,e,!0),this.on(\"emphasis\",i).on(\"normal\",n).on(\"mouseover\",i).on(\"mouseout\",n)}function r(t,e,i,n){var r=n.getModel(\"textStyle\"),o=n.get(\"position\"),s=\"inside\"===o||\"inner\"===o||\"center\"===o;return{fill:r.getTextColor()||(s?\"#fff\":t.getItemVisual(e,\"color\")),textFont:r.getFont(),text:a.retrieve(t.hostModel.getFormattedLabel(e,i),t.getName(e))}}var o=i(3),a=i(1),s=n.prototype,l=[\"itemStyle\",\"normal\",\"opacity\"];s.updateData=function(t,e,i){var n=this.childAt(0),r=t.hostModel,s=t.getItemModel(e),u=t.getItemLayout(e),h=t.getItemModel(e).get(l);h=null==h?1:h,n.useStyle({}),i?(n.setShape({points:u.points}),n.setStyle({opacity:0}),o.initProps(n,{style:{opacity:h}},r,e)):o.updateProps(n,{style:{opacity:h},shape:{points:u.points}},r,e);var c=s.getModel(\"itemStyle\"),d=t.getItemVisual(e,\"color\");n.setStyle(a.defaults({lineJoin:\"round\",fill:d},c.getModel(\"normal\").getItemStyle([\"opacity\"]))),n.hoverStyle=c.getModel(\"emphasis\").getItemStyle(),this._updateLabel(t,e),o.setHoverStyle(this)},s._updateLabel=function(t,e){var i=this.childAt(1),n=this.childAt(2),a=t.hostModel,s=t.getItemModel(e),l=t.getItemLayout(e),u=l.label,h=t.getItemVisual(e,\"color\");o.updateProps(i,{shape:{points:u.linePoints||u.linePoints}},a,e),o.updateProps(n,{style:{x:u.x,y:u.y}},a,e),n.attr({style:{textAlign:u.textAlign,textVerticalAlign:u.verticalAlign,textFont:u.font},rotation:u.rotation,origin:[u.x,u.y],z2:10});var c=s.getModel(\"label.normal\"),d=s.getModel(\"label.emphasis\"),f=s.getModel(\"labelLine.normal\"),p=s.getModel(\"labelLine.emphasis\");n.setStyle(r(t,e,\"normal\",c)),n.ignore=n.normalIgnore=!c.get(\"show\"),n.hoverIgnore=!d.get(\"show\"),i.ignore=i.normalIgnore=!f.get(\"show\"),i.hoverIgnore=!p.get(\"show\"),i.setStyle({stroke:h}),i.setStyle(f.getModel(\"lineStyle\").getLineStyle()),n.hoverStyle=r(t,e,\"emphasis\",d),i.hoverStyle=p.getModel(\"lineStyle\").getLineStyle()},a.inherits(n,o.Group);var u=i(27).extend({type:\"funnel\",render:function(t,e,i){var r=t.getData(),o=this._data,a=this.group;r.diff(o).add(function(t){var e=new n(r,t);r.setItemGraphicEl(t,e),a.add(e)}).update(function(t,e){var i=o.getItemGraphicEl(e);i.updateData(r,t),a.add(i),r.setItemGraphicEl(t,i)}).remove(function(t){var e=o.getItemGraphicEl(t);a.remove(e)}).execute(),this._data=r},remove:function(){this.group.removeAll(),this._data=null}});t.exports=u},function(t,e,i){function n(t,e){return a.getLayoutRect(t.getBoxLayoutParams(),{width:e.getWidth(),height:e.getHeight()})}function r(t,e){for(var i=t.mapArray(\"value\",function(t){return t}),n=[],r=\"ascending\"===e,o=0,a=t.count();a>o;o++)n[o]=o;return n.sort(function(t,e){return r?i[t]-i[e]:i[e]-i[t]}),n}function o(t){t.each(function(e){var i,n,r,o,a=t.getItemModel(e),s=a.getModel(\"label.normal\"),l=s.get(\"position\"),u=a.getModel(\"labelLine.normal\"),h=t.getItemLayout(e),c=h.points,d=\"inner\"===l||\"inside\"===l||\"center\"===l;if(d)n=(c[0][0]+c[1][0]+c[2][0]+c[3][0])/4,r=(c[0][1]+c[1][1]+c[2][1]+c[3][1])/4,i=\"center\",o=[[n,r],[n,r]];else{var f,p,g,v=u.get(\"length\");\"left\"===l?(f=(c[3][0]+c[0][0])/2,p=(c[3][1]+c[0][1])/2,g=f-v,n=g-5,i=\"right\"):(f=(c[1][0]+c[2][0])/2,p=(c[1][1]+c[2][1])/2,g=f+v,n=g+5,i=\"left\");var m=p;o=[[f,p],[g,m]],r=m}h.label={linePoints:o,x:n,y:r,verticalAlign:\"middle\",textAlign:i,inside:d}})}var a=i(13),s=i(4),l=s.parsePercent;t.exports=function(t,e,i){t.eachSeriesByType(\"funnel\",function(t){var i=t.getData(),a=t.get(\"sort\"),u=n(t,e),h=r(i,a),c=[l(t.get(\"minSize\"),u.width),l(t.get(\"maxSize\"),u.width)],d=i.getDataExtent(\"value\"),f=t.get(\"min\"),p=t.get(\"max\");null==f&&(f=Math.min(d[0],0)),null==p&&(p=d[1]);var g=t.get(\"funnelAlign\"),v=t.get(\"gap\"),m=(u.height-v*(i.count()-1))/i.count(),y=u.y,x=function(t,e){var n,r=i.get(\"value\",t)||0,o=s.linearMap(r,[f,p],c,!0);switch(g){case\"left\":n=u.x;break;case\"center\":n=u.x+(u.width-o)/2;break;case\"right\":n=u.x+u.width-o}return[[n,e],[n+o,e]]};\"ascending\"===a&&(m=-m,v=-v,y+=u.height,h=h.reverse());for(var _=0;_<h.length;_++){var b=h[_],w=h[_+1],S=x(b,y),M=x(w,y+m);y+=m+v,i.setItemLayout(b,{points:S.concat(M.slice().reverse())})}o(i)})}},function(t,e,i){i(261),i(262)},function(t,e,i){var n=i(14),r=i(15),o=i(1),a=r.extend({type:\"series.gauge\",getInitialData:function(t,e){var i=new n([\"value\"],this),r=t.data||[];return o.isArray(r)||(r=[r]),i.initData(r),i},defaultOption:{zlevel:0,z:2,center:[\"50%\",\"50%\"],legendHoverLink:!0,radius:\"75%\",startAngle:225,endAngle:-45,clockwise:!0,min:0,max:100,splitNumber:10,axisLine:{show:!0,lineStyle:{color:[[.2,\"#91c7ae\"],[.8,\"#63869e\"],[1,\"#c23531\"]],width:30}},splitLine:{show:!0,length:30,lineStyle:{color:\"#eee\",width:2,type:\"solid\"}},axisTick:{show:!0,splitNumber:5,length:8,lineStyle:{color:\"#eee\",width:1,type:\"solid\"}},axisLabel:{show:!0,distance:5,textStyle:{color:\"auto\"}},pointer:{show:!0,length:\"80%\",width:8},itemStyle:{normal:{color:\"auto\"}},title:{show:!0,offsetCenter:[0,\"-40%\"],textStyle:{color:\"#333\",fontSize:15}},detail:{show:!0,backgroundColor:\"rgba(0,0,0,0)\",borderWidth:0,borderColor:\"#ccc\",width:100,height:40,offsetCenter:[0,\"40%\"],textStyle:{color:\"auto\",fontSize:30}}}});t.exports=a},function(t,e,i){function n(t,e){var i=t.get(\"center\"),n=e.getWidth(),r=e.getHeight(),o=Math.min(n,r),a=l(i[0],e.getWidth()),s=l(i[1],e.getHeight()),u=l(t.get(\"radius\"),o/2);return{cx:a,cy:s,r:u}}function r(t,e){return e&&(\"string\"==typeof e?t=e.replace(\"{value}\",t):\"function\"==typeof e&&(t=e(t))),t}var o=i(263),a=i(3),s=i(4),l=s.parsePercent,u=2*Math.PI,h=i(27).extend({type:\"gauge\",render:function(t,e,i){this.group.removeAll();var r=t.get(\"axisLine.lineStyle.color\"),o=n(t,i);this._renderMain(t,e,i,r,o)},_renderMain:function(t,e,i,n,r){for(var o=this.group,s=t.getModel(\"axisLine\"),l=s.getModel(\"lineStyle\"),h=t.get(\"clockwise\"),c=-t.get(\"startAngle\")/180*Math.PI,d=-t.get(\"endAngle\")/180*Math.PI,f=(d-c)%u,p=c,g=l.get(\"width\"),v=0;v<n.length;v++){var m=Math.min(Math.max(n[v][0],0),1),d=c+f*m,y=new a.Sector({shape:{startAngle:p,endAngle:d,cx:r.cx,cy:r.cy,clockwise:h,r0:r.r-g,r:r.r},silent:!0});y.setStyle({fill:n[v][1]}),y.setStyle(l.getLineStyle([\"color\",\"borderWidth\",\"borderColor\"])),o.add(y),p=d}var x=function(t){if(0>=t)return n[0][1];for(var e=0;e<n.length;e++)if(n[e][0]>=t&&(0===e?0:n[e-1][0])<t)return n[e][1];return n[e-1][1]};if(!h){var _=c;c=d,d=_}this._renderTicks(t,e,i,x,r,c,d,h),this._renderPointer(t,e,i,x,r,c,d,h),this._renderTitle(t,e,i,x,r),this._renderDetail(t,e,i,x,r)},_renderTicks:function(t,e,i,n,o,u,h,c){for(var d=this.group,f=o.cx,p=o.cy,g=o.r,v=t.get(\"min\"),m=t.get(\"max\"),y=t.getModel(\"splitLine\"),x=t.getModel(\"axisTick\"),_=t.getModel(\"axisLabel\"),b=t.get(\"splitNumber\"),w=x.get(\"splitNumber\"),S=l(y.get(\"length\"),g),M=l(x.get(\"length\"),g),T=u,A=(h-u)/b,I=A/w,L=y.getModel(\"lineStyle\").getLineStyle(),C=x.getModel(\"lineStyle\").getLineStyle(),D=_.getModel(\"textStyle\"),P=0;b>=P;P++){var k=Math.cos(T),z=Math.sin(T);if(y.get(\"show\")){var O=new a.Line({shape:{x1:k*g+f,y1:z*g+p,x2:k*(g-S)+f,y2:z*(g-S)+p},style:L,silent:!0});\"auto\"===L.stroke&&O.setStyle({stroke:n(P/b)}),d.add(O)}if(_.get(\"show\")){var E=r(s.round(P/b*(m-v)+v),_.get(\"formatter\")),R=_.get(\"distance\"),N=new a.Text({style:{text:E,x:k*(g-S-R)+f,y:z*(g-S-R)+p,fill:D.getTextColor(),textFont:D.getFont(),textVerticalAlign:-.4>z?\"top\":z>.4?\"bottom\":\"middle\",textAlign:-.4>k?\"left\":k>.4?\"right\":\"center\"},silent:!0});\"auto\"===N.style.fill&&N.setStyle({fill:n(P/b)}),d.add(N)}if(x.get(\"show\")&&P!==b){for(var V=0;w>=V;V++){var k=Math.cos(T),z=Math.sin(T),B=new a.Line({shape:{x1:k*g+f,y1:z*g+p,x2:k*(g-M)+f,y2:z*(g-M)+p},silent:!0,style:C});\"auto\"===C.stroke&&B.setStyle({stroke:n((P+V/w)/b)}),d.add(B),T+=I}T-=I}else T+=A}},_renderPointer:function(t,e,i,n,r,u,h,c){var d=[+t.get(\"min\"),+t.get(\"max\")],f=[u,h];c||(f=f.reverse());var p=t.getData(),g=this._data,v=this.group;p.diff(g).add(function(e){var i=new o({shape:{angle:u}});a.updateProps(i,{shape:{angle:s.linearMap(p.get(\"value\",e),d,f,!0)}},t),v.add(i),p.setItemGraphicEl(e,i)}).update(function(e,i){var n=g.getItemGraphicEl(i);a.updateProps(n,{shape:{angle:s.linearMap(p.get(\"value\",e),d,f,!0)}},t),v.add(n),p.setItemGraphicEl(e,n)}).remove(function(t){var e=g.getItemGraphicEl(t);v.remove(e)}).execute(),p.eachItemGraphicEl(function(t,e){var i=p.getItemModel(e),o=i.getModel(\"pointer\");t.setShape({x:r.cx,y:r.cy,width:l(o.get(\"width\"),r.r),r:l(o.get(\"length\"),r.r)}),t.useStyle(i.getModel(\"itemStyle.normal\").getItemStyle()),\"auto\"===t.style.fill&&t.setStyle(\"fill\",n((p.get(\"value\",e)-d[0])/(d[1]-d[0]))),a.setHoverStyle(t,i.getModel(\"itemStyle.emphasis\").getItemStyle())}),this._data=p},_renderTitle:function(t,e,i,n,r){var o=t.getModel(\"title\");if(o.get(\"show\")){var s=o.getModel(\"textStyle\"),u=o.get(\"offsetCenter\"),h=r.cx+l(u[0],r.r),c=r.cy+l(u[1],r.r),d=new a.Text({style:{x:h,y:c,text:t.getData().getName(0),fill:s.getTextColor(),textFont:s.getFont(),textAlign:\"center\",textVerticalAlign:\"middle\"}});this.group.add(d)}},_renderDetail:function(t,e,i,n,o){var u=t.getModel(\"detail\"),h=t.get(\"min\"),c=t.get(\"max\");if(u.get(\"show\")){var d=u.getModel(\"textStyle\"),f=u.get(\"offsetCenter\"),p=o.cx+l(f[0],o.r),g=o.cy+l(f[1],o.r),v=l(u.get(\"width\"),o.r),m=l(u.get(\"height\"),o.r),y=t.getData().get(\"value\",0),x=new a.Rect({shape:{x:p-v/2,y:g-m/2,width:v,height:m},style:{text:r(y,u.get(\"formatter\")),fill:u.get(\"backgroundColor\"),textFill:d.getTextColor(),textFont:d.getFont()}});\"auto\"===x.style.textFill&&x.setStyle(\"textFill\",n(s.linearMap(y,[h,c],[0,1],!0))),x.setStyle(u.getItemStyle([\"color\"])),this.group.add(x)}}});t.exports=h},function(t,e,i){t.exports=i(6).extend({type:\"echartsGaugePointer\",shape:{angle:0,width:10,r:10,x:0,y:0},buildPath:function(t,e){var i=Math.cos,n=Math.sin,r=e.r,o=e.width,a=e.angle,s=e.x-i(a)*o*(o>=r/3?1:2),l=e.y-n(a)*o*(o>=r/3?1:2);a=e.angle-Math.PI/2,t.moveTo(s,l),t.lineTo(e.x+i(a)*o,e.y+n(a)*o),t.lineTo(e.x+i(e.angle)*r,e.y+n(e.angle)*r),t.lineTo(e.x-i(a)*o,e.y-n(a)*o),t.lineTo(s,l)}})},function(t,e,i){var n=i(2),r=i(1);i(265),i(266),i(275),n.registerProcessor(i(268)),n.registerVisual(r.curry(i(46),\"graph\",\"circle\",null)),n.registerVisual(i(269)),n.registerVisual(i(272)),n.registerLayout(i(276)),n.registerLayout(i(270)),n.registerLayout(i(274)),n.registerCoordinateSystem(\"graphView\",{create:i(271)})},function(t,e,i){\"use strict\";var n=i(14),r=i(1),o=i(11),a=i(9),s=i(227),l=i(2).extendSeriesModel({type:\"series.graph\",init:function(t){l.superApply(this,\"init\",arguments),this.legendDataProvider=function(){return this._categoriesData},this.fillDataTextStyle(t.edges||t.links),this._updateCategoriesData()},mergeOption:function(t){l.superApply(this,\"mergeOption\",arguments),this.fillDataTextStyle(t.edges||t.links),this._updateCategoriesData()},mergeDefaultAndTheme:function(t){l.superApply(this,\"mergeDefaultAndTheme\",arguments),o.defaultEmphasis(t.edgeLabel,o.LABEL_OPTIONS)},getInitialData:function(t,e){function i(t,e){t.wrapMethod(\"getItemModel\",function(t){var e=o._categoriesModels,i=t.getShallow(\"category\"),n=e[i];return n&&(n.parentModel=t.parentModel,t.parentModel=n),t});var i=o.getModel(\"edgeLabel\"),n=function(t,e){var r=(t||\"\").split(\".\");\"label\"===r[0]&&(e=e||i.getModel(r.slice(1)));var o=a.prototype.getModel.call(this,r,e);return o.getModel=n,o};e.wrapMethod(\"getItemModel\",function(t){return t.getModel=n,t})}var n=t.edges||t.links||[],r=t.data||t.nodes||[],o=this;return r&&n?s(r,n,this,!0,i).data:void 0},getGraph:function(){return this.getData().graph},getEdgeData:function(){return this.getGraph().edgeData},getCategoriesData:function(){return this._categoriesData},formatTooltip:function(t,e,i){if(\"edge\"===i){var n=this.getData(),r=this.getDataParams(t,i),o=n.graph.getEdgeByIndex(t),a=n.getName(o.node1.dataIndex),s=n.getName(o.node2.dataIndex),u=a+\" > \"+s;return r.value&&(u+=\" : \"+r.value),u}return l.superApply(this,\"formatTooltip\",arguments)},_updateCategoriesData:function(){var t=r.map(this.option.categories||[],function(t){return null!=t.value?t:r.extend({value:0},t)}),e=new n([\"value\"],this);e.initData(t),this._categoriesData=e,this._categoriesModels=e.mapArray(function(t){return e.getItemModel(t,!0)})},setZoom:function(t){this.option.zoom=t},setCenter:function(t){this.option.center=t},ifEnableAnimation:function(){return l.superCall(this,\"ifEnableAnimation\")&&!(\"force\"===this.get(\"layout\")&&this.get(\"force.layoutAnimation\"))},defaultOption:{zlevel:0,z:2,coordinateSystem:\"view\",legendHoverLink:!0,hoverAnimation:!0,layout:null,focusNodeAdjacency:!1,circular:{rotateLabel:!1},force:{initLayout:null,repulsion:[0,50],gravity:.1,edgeLength:30,layoutAnimation:!0},left:\"center\",top:\"center\",symbol:\"circle\",symbolSize:10,edgeSymbol:[\"none\",\"none\"],edgeSymbolSize:10,edgeLabel:{normal:{position:\"middle\"},emphasis:{}},draggable:!1,roam:!1,center:null,zoom:1,nodeScaleRatio:.6,label:{normal:{show:!1,formatter:\"{b}\"},emphasis:{show:!0}},itemStyle:{normal:{},emphasis:{}},lineStyle:{normal:{color:\"#aaa\",width:1,curveness:0,opacity:.5},emphasis:{}}}});t.exports=l},function(t,e,i){function n(t,e){return t.getVisual(\"opacity\")||t.getModel().get(e)}var r=i(39),o=i(93),a=i(78),s=i(3),l=i(267),u=i(1),h=[\"itemStyle\",\"normal\",\"opacity\"],c=[\"lineStyle\",\"normal\",\"opacity\"];i(2).extendChartView({type:\"graph\",init:function(t,e){var i=new r,n=new o,s=this.group,l=new a(e.getZr(),s);s.add(i.group),s.add(n.group),this._symbolDraw=i,this._lineDraw=n,this._controller=l,this._firstRender=!0},render:function(t,e,i){var n=t.coordinateSystem;this._model=t,this._nodeScaleRatio=t.get(\"nodeScaleRatio\");var r=this._symbolDraw,o=this._lineDraw,a=this.group;if(\"view\"===n.type){var u={position:n.position,scale:n.scale};this._firstRender?a.attr(u):s.updateProps(a,u,t)}l(t.getGraph(),this._getNodeGlobalScale(t));var h=t.getData();r.updateData(h);var c=t.getEdgeData();o.updateData(c),this._updateNodeAndLinkScale(),this._updateController(t,i),clearTimeout(this._layoutTimeout);var d=t.forceLayout,f=t.get(\"force.layoutAnimation\");d&&this._startForceLayoutIteration(d,f),h.eachItemGraphicEl(function(t,e){var i=h.getItemModel(e);t.off(\"drag\").off(\"dragend\");var n=h.getItemModel(e).get(\"draggable\");n&&t.on(\"drag\",function(){d&&(d.warmUp(),!this._layouting&&this._startForceLayoutIteration(d,f),d.setFixed(e),h.setItemLayout(e,t.position))},this).on(\"dragend\",function(){d&&d.setUnfixed(e)},this),t.setDraggable(n&&d),t.off(\"mouseover\",this._focusNodeAdjacency),t.off(\"mouseout\",this._unfocusAll),i.get(\"focusNodeAdjacency\")&&(t.on(\"mouseover\",this._focusNodeAdjacency,this),t.on(\"mouseout\",this._unfocusAll,this))},this);var p=\"circular\"===t.get(\"layout\")&&t.get(\"circular.rotateLabel\"),g=h.getLayout(\"cx\"),v=h.getLayout(\"cy\");h.eachItemGraphicEl(function(t,e){var i=t.getSymbolPath();if(p){var n=h.getItemLayout(e),r=Math.atan2(n[1]-v,n[0]-g);0>r&&(r=2*Math.PI+r);var o=n[0]<g;o&&(r-=Math.PI);var a=o?\"left\":\"right\";i.setStyle({textRotation:r,textPosition:a}),i.hoverStyle&&(i.hoverStyle.textPosition=a)}else i.setStyle({textRotation:0})}),this._firstRender=!1},_focusNodeAdjacency:function(t){function e(t,e){var i=n(t,e),r=t.getGraphicEl();null==i&&(i=1),r.traverse(function(t){t.trigger(\"normal\"),\"group\"!==t.type&&t.setStyle(\"opacity\",.1*i)})}function i(t,e){var i=n(t,e),r=t.getGraphicEl();r.traverse(function(t){t.trigger(\"emphasis\"),\"group\"!==t.type&&t.setStyle(\"opacity\",i)})}var r=this._model.getData(),o=r.graph,a=t.target,s=a.dataIndex,l=a.dataType;if(null!==s&&\"edge\"!==l){o.eachNode(function(t){e(t,h)}),o.eachEdge(function(t){e(t,c)});var d=o.getNodeByIndex(s);i(d,h),u.each(d.edges,function(t){t.dataIndex<0||(i(t,c),i(t.node1,h),i(t.node2,h))})}},_unfocusAll:function(){var t=this._model.getData(),e=t.graph;e.eachNode(function(t){var e=n(t,h);t.getGraphicEl().traverse(function(t){t.trigger(\"normal\"),\"group\"!==t.type&&t.setStyle(\"opacity\",e)})}),e.eachEdge(function(t){var e=n(t,c);t.getGraphicEl().traverse(function(t){t.trigger(\"normal\"),\"group\"!==t.type&&t.setStyle(\"opacity\",e)})})},_startForceLayoutIteration:function(t,e){var i=this;!function n(){t.step(function(t){i.updateLayout(i._model),(i._layouting=!t)&&(e?i._layoutTimeout=setTimeout(n,16):n())})}()},_updateController:function(t,e){var i=this._controller,n=this.group;return i.rectProvider=function(){var t=n.getBoundingRect();return t.applyTransform(n.transform),t},\"view\"!==t.coordinateSystem.type?void i.disable():(i.enable(t.get(\"roam\")),i.zoomLimit=t.get(\"scaleLimit\"),i.zoom=t.coordinateSystem.getZoom(),void i.off(\"pan\").off(\"zoom\").on(\"pan\",function(i,n){e.dispatchAction({seriesId:t.id,type:\"graphRoam\",dx:i,dy:n})}).on(\"zoom\",function(i,n,r){e.dispatchAction({seriesId:t.id,type:\"graphRoam\",zoom:i,originX:n,originY:r}),this._updateNodeAndLinkScale(),l(t.getGraph(),this._getNodeGlobalScale(t)),this._lineDraw.updateLayout()},this))},_updateNodeAndLinkScale:function(){var t=this._model,e=t.getData(),i=this._getNodeGlobalScale(t),n=[i,i];e.eachItemGraphicEl(function(t,e){t.attr(\"scale\",n)})},_getNodeGlobalScale:function(t){var e=t.coordinateSystem;if(\"view\"!==e.type)return 1;var i=this._nodeScaleRatio,n=e.scale,r=n&&n[0]||1,o=e.getZoom(),a=(o-1)*i+1;return a/r},updateLayout:function(t){l(t.getGraph(),this._getNodeGlobalScale(t)),this._symbolDraw.updateLayout(),this._lineDraw.updateLayout()},remove:function(t,e){this._symbolDraw&&this._symbolDraw.remove(),this._lineDraw&&this._lineDraw.remove()}})},function(t,e,i){function n(t,e,i){for(var n,r=t[0],o=t[1],d=t[2],f=1/0,p=i*i,g=.1,v=.1;.9>=v;v+=.1){a[0]=u(r[0],o[0],d[0],v),a[1]=u(r[1],o[1],d[1],v);var m=c(h(a,e)-p);f>m&&(f=m,n=v)}for(var y=0;32>y;y++){var x=n+g;s[0]=u(r[0],o[0],d[0],n),s[1]=u(r[1],o[1],d[1],n),l[0]=u(r[0],o[0],d[0],x),l[1]=u(r[1],o[1],d[1],x);var m=h(s,e)-p;if(c(m)<.01)break;var _=h(l,e)-p;g/=2,0>m?_>=0?n+=g:n-=g:_>=0?n-=g:n+=g}return n}var r=i(17),o=i(5),a=[],s=[],l=[],u=r.quadraticAt,h=o.distSquare,c=Math.abs;t.exports=function(t,e){function i(t){var e=t.getVisual(\"symbolSize\");return e instanceof Array&&(e=(e[0]+e[1])/2),e}var a=[],s=r.quadraticSubdivide,l=[[],[],[]],u=[[],[]],h=[];e/=2,t.eachEdge(function(t,r){var c=t.getLayout(),d=t.getVisual(\"fromSymbol\"),f=t.getVisual(\"toSymbol\");c.__original||(c.__original=[o.clone(c[0]),o.clone(c[1])],c[2]&&c.__original.push(o.clone(c[2])));var p=c.__original;if(null!=c[2]){if(o.copy(l[0],p[0]),o.copy(l[1],p[2]),o.copy(l[2],p[1]),d&&\"none\"!=d){var g=i(t.node1),v=n(l,p[0],g*e);s(l[0][0],l[1][0],l[2][0],v,a),l[0][0]=a[3],l[1][0]=a[4],s(l[0][1],l[1][1],l[2][1],v,a),l[0][1]=a[3],l[1][1]=a[4]}if(f&&\"none\"!=f){var g=i(t.node2),v=n(l,p[1],g*e);s(l[0][0],l[1][0],l[2][0],v,a),l[1][0]=a[1],l[2][0]=a[2],s(l[0][1],l[1][1],l[2][1],v,a),l[1][1]=a[1],l[2][1]=a[2]}o.copy(c[0],l[0]),o.copy(c[1],l[2]),o.copy(c[2],l[1])}else{if(o.copy(u[0],p[0]),o.copy(u[1],p[1]),o.sub(h,u[1],u[0]),o.normalize(h,h),d&&\"none\"!=d){var g=i(t.node1);o.scaleAndAdd(u[0],u[0],h,g*e)}if(f&&\"none\"!=f){var g=i(t.node2);o.scaleAndAdd(u[1],u[1],h,-g*e)}o.copy(c[0],u[0]),o.copy(c[1],u[1])}})}},function(t,e){t.exports=function(t){var e=t.findComponents({mainType:\"legend\"});e&&e.length&&t.eachSeriesByType(\"graph\",function(t){var i=t.getCategoriesData(),n=t.getGraph(),r=n.data,o=i.mapArray(i.getName);r.filterSelf(function(t){var i=r.getItemModel(t),n=i.getShallow(\"category\");if(null!=n){\"number\"==typeof n&&(n=o[n]);for(var a=0;a<e.length;a++)if(!e[a].isSelected(n))return!1}return!0})},this)}},function(t,e){t.exports=function(t){var e={};t.eachSeriesByType(\"graph\",function(t){var i=t.getCategoriesData(),n=t.getData(),r={};i.each(function(n){var o=i.getName(n);r[o]=n;var a=i.getItemModel(n),s=a.get(\"itemStyle.normal.color\")||t.getColorFromPalette(o,e);i.setItemVisual(n,\"color\",s)}),i.count()&&n.each(function(t){var e=n.getItemModel(t),o=e.getShallow(\"category\");null!=o&&(\"string\"==typeof o&&(o=r[o]),n.getItemVisual(t,\"color\",!0)||n.setItemVisual(t,\"color\",i.getItemVisual(o,\"color\")))})})}},function(t,e,i){var n=i(222);t.exports=function(t){t.eachSeriesByType(\"graph\",function(t){\"circular\"===t.get(\"layout\")&&n(t)})}},function(t,e,i){function n(t,e,i){var n=t.getBoxLayoutParams();return n.aspect=i,o.getLayoutRect(n,{width:e.getWidth(),height:e.getHeight()})}var r=i(237),o=i(13),a=i(73);t.exports=function(t,e){var i=[];return t.eachSeriesByType(\"graph\",function(t){var o=t.get(\"coordinateSystem\");if(!o||\"view\"===o){var s=new r;i.push(s);var l=t.getData(),u=l.mapArray(function(t){var e=l.getItemModel(t);return[+e.get(\"x\"),+e.get(\"y\")]}),h=[],c=[];\na.fromPoints(u,h,c),c[0]-h[0]===0&&(c[0]+=1,h[0]-=1),c[1]-h[1]===0&&(c[1]+=1,h[1]-=1);var d=(c[0]-h[0])/(c[1]-h[1]),f=n(t,e,d);isNaN(d)&&(h=[f.x,f.y],c=[f.x+f.width,f.y+f.height]);var p=c[0]-h[0],g=c[1]-h[1],v=f.width,m=f.height;s=t.coordinateSystem=new r,s.zoomLimit=t.get(\"scaleLimit\"),s.setBoundingRect(h[0],h[1],p,g),s.setViewRect(f.x,f.y,v,m),s.setCenter(t.get(\"center\")),s.setZoom(t.get(\"zoom\"))}}),i}},function(t,e){function i(t){return t instanceof Array||(t=[t,t]),t}t.exports=function(t){t.eachSeriesByType(\"graph\",function(t){var e=t.getGraph(),n=t.getEdgeData(),r=i(t.get(\"edgeSymbol\")),o=i(t.get(\"edgeSymbolSize\")),a=\"lineStyle.normal.color\".split(\".\"),s=\"lineStyle.normal.opacity\".split(\".\");n.setVisual(\"fromSymbol\",r&&r[0]),n.setVisual(\"toSymbol\",r&&r[1]),n.setVisual(\"fromSymbolSize\",o&&o[0]),n.setVisual(\"toSymbolSize\",o&&o[1]),n.setVisual(\"color\",t.get(a)),n.setVisual(\"opacity\",t.get(s)),n.each(function(t){var r=n.getItemModel(t),o=e.getEdgeByIndex(t),l=i(r.getShallow(\"symbol\",!0)),u=i(r.getShallow(\"symbolSize\",!0)),h=r.get(a),c=r.get(s);switch(h){case\"source\":h=o.node1.getVisual(\"color\");break;case\"target\":h=o.node2.getVisual(\"color\")}l[0]&&o.setVisual(\"fromSymbol\",l[0]),l[1]&&o.setVisual(\"toSymbol\",l[1]),u[0]&&o.setVisual(\"fromSymbolSize\",u[0]),u[1]&&o.setVisual(\"toSymbolSize\",u[1]),o.setVisual(\"color\",h),o.setVisual(\"opacity\",c)})})}},function(t,e,i){var n=i(5),r=n.scaleAndAdd;t.exports=function(t,e,i){for(var o=i.rect,a=o.width,s=o.height,l=[o.x+a/2,o.y+s/2],u=null==i.gravity?.1:i.gravity,h=0;h<t.length;h++){var c=t[h];c.p||(c.p=n.create(a*(Math.random()-.5)+l[0],s*(Math.random()-.5)+l[1])),c.pp=n.clone(c.p),c.edges=null}var d=.6;return{warmUp:function(){d=.5},setFixed:function(e){t[e].fixed=!0},setUnfixed:function(e){t[e].fixed=!1},step:function(i){for(var o=[],a=t.length,s=0;s<e.length;s++){var h=e[s],c=h.n1,f=h.n2;n.sub(o,f.p,c.p);var p=n.len(o)-h.d,g=f.w/(c.w+f.w);n.normalize(o,o),!c.fixed&&r(c.p,c.p,o,g*p*d),!f.fixed&&r(f.p,f.p,o,-(1-g)*p*d)}for(var s=0;a>s;s++){var v=t[s];v.fixed||(n.sub(o,l,v.p),n.scaleAndAdd(v.p,v.p,o,u*d))}for(var s=0;a>s;s++)for(var c=t[s],m=s+1;a>m;m++){var f=t[m];n.sub(o,f.p,c.p);var p=n.len(o);0===p&&(n.set(o,Math.random()-.5,Math.random()-.5),p=1);var y=(c.rep+f.rep)/p/p;!c.fixed&&r(c.pp,c.pp,o,y),!f.fixed&&r(f.pp,f.pp,o,-y)}for(var x=[],s=0;a>s;s++){var v=t[s];v.fixed||(n.sub(x,v.p,v.pp),n.scaleAndAdd(v.p,v.p,x,d),n.copy(v.pp,v.p))}d=.992*d,i&&i(t,e,.01>d)}}}},function(t,e,i){var n=i(273),r=i(4),o=i(224),a=i(222),s=i(5),l=i(1);t.exports=function(t){t.eachSeriesByType(\"graph\",function(t){var e=t.coordinateSystem;if(!e||\"view\"===e.type)if(\"force\"===t.get(\"layout\")){var i=t.preservedPoints||{},u=t.getGraph(),h=u.data,c=u.edgeData,d=t.getModel(\"force\"),f=d.get(\"initLayout\");t.preservedPoints?h.each(function(t){var e=h.getId(t);h.setItemLayout(t,i[e]||[NaN,NaN])}):f&&\"none\"!==f?\"circular\"===f&&a(t):o(t);var p=h.getDataExtent(\"value\"),g=c.getDataExtent(\"value\"),v=d.get(\"repulsion\"),m=d.get(\"edgeLength\");l.isArray(v)||(v=[v,v]),l.isArray(m)||(m=[m,m]),m=[m[1],m[0]];var y=h.mapArray(\"value\",function(t,e){var i=h.getItemLayout(e),n=r.linearMap(t,p,v);return isNaN(n)&&(n=(v[0]+v[1])/2),{w:n,rep:n,p:!i||isNaN(i[0])||isNaN(i[1])?null:i}}),x=c.mapArray(\"value\",function(t,e){var i=u.getEdgeByIndex(e),n=r.linearMap(t,g,m);return isNaN(n)&&(n=(m[0]+m[1])/2),{n1:y[i.node1.dataIndex],n2:y[i.node2.dataIndex],d:n,curveness:i.getModel().get(\"lineStyle.normal.curveness\")||0}}),e=t.coordinateSystem,_=e.getBoundingRect(),b=n(y,x,{rect:_,gravity:d.get(\"gravity\")}),w=b.step;b.step=function(t){for(var e=0,n=y.length;n>e;e++)y[e].fixed&&s.copy(y[e].p,u.getNodeByIndex(e).getLayout());w(function(e,n,r){for(var o=0,a=e.length;a>o;o++)e[o].fixed||u.getNodeByIndex(o).setLayout(e[o].p),i[h.getId(o)]=e[o].p;for(var o=0,a=n.length;a>o;o++){var l=n[o],c=u.getEdgeByIndex(o),d=l.n1.p,f=l.n2.p,p=c.getLayout();p=p?p.slice():[],p[0]=p[0]||[],p[1]=p[1]||[],s.copy(p[0],d),s.copy(p[1],f),+l.curveness&&(p[2]=[(d[0]+f[0])/2-(d[1]-f[1])*l.curveness,(d[1]+f[1])/2-(f[0]-d[0])*l.curveness]),c.setLayout(p)}t&&t(r)})},t.forceLayout=b,t.preservedPoints=i,b.step()}else t.forceLayout=null})}},function(t,e,i){var n=i(2),r=i(221),o={type:\"graphRoam\",event:\"graphRoam\",update:\"none\"};n.registerAction(o,function(t,e){e.eachComponent({mainType:\"series\",query:t},function(e){var i=e.coordinateSystem,n=r.updateCenterAndZoom(i,t);e.setCenter&&e.setCenter(n.center),e.setZoom&&e.setZoom(n.zoom)})})},function(t,e,i){var n=i(224),r=i(223);t.exports=function(t,e){t.eachSeriesByType(\"graph\",function(t){var e=t.get(\"layout\"),i=t.coordinateSystem;if(i&&\"view\"!==i.type){var o=t.getData();o.each(i.dimensions,function(t,e,n){isNaN(t)||isNaN(e)?o.setItemLayout(n,[NaN,NaN]):o.setItemLayout(n,i.dataToPoint([t,e]))}),r(o.graph)}else e&&\"none\"!==e||n(t)})}},function(t,e,i){i(279),i(280)},function(t,e,i){function n(){var t=o.createCanvas();this.canvas=t,this.blurSize=30,this.pointSize=20,this.maxOpacity=1,this.minOpacity=0,this._gradientPixels={}}var r=256,o=i(1);n.prototype={update:function(t,e,i,n,o,a){var s=this._getBrush(),l=this._getGradient(t,o,\"inRange\"),u=this._getGradient(t,o,\"outOfRange\"),h=this.pointSize+this.blurSize,c=this.canvas,d=c.getContext(\"2d\"),f=t.length;c.width=e,c.height=i;for(var p=0;f>p;++p){var g=t[p],v=g[0],m=g[1],y=g[2],x=n(y);d.globalAlpha=x,d.drawImage(s,v-h,m-h)}for(var _=d.getImageData(0,0,c.width,c.height),b=_.data,w=0,S=b.length,M=this.minOpacity,T=this.maxOpacity,A=T-M;S>w;){var x=b[w+3]/256,I=4*Math.floor(x*(r-1));if(x>0){var L=a(x)?l:u;x>0&&(x=x*A+M),b[w++]=L[I],b[w++]=L[I+1],b[w++]=L[I+2],b[w++]=L[I+3]*x*256}else w+=4}return d.putImageData(_,0,0),c},_getBrush:function(){var t=this._brushCanvas||(this._brushCanvas=o.createCanvas()),e=this.pointSize+this.blurSize,i=2*e;t.width=i,t.height=i;var n=t.getContext(\"2d\");return n.clearRect(0,0,i,i),n.shadowOffsetX=i,n.shadowBlur=this.blurSize,n.shadowColor=\"#000\",n.beginPath(),n.arc(-e,e,this.pointSize,0,2*Math.PI,!0),n.closePath(),n.fill(),t},_getGradient:function(t,e,i){for(var n=this._gradientPixels,r=n[i]||(n[i]=new Uint8ClampedArray(1024)),o=[],a=0,s=0;256>s;s++)e[i](s/255,!0,o),r[a++]=o[0],r[a++]=o[1],r[a++]=o[2],r[a++]=o[3];return r}},t.exports=n},function(t,e,i){var n=i(15),r=i(35);t.exports=n.extend({type:\"series.heatmap\",getInitialData:function(t,e){return r(t.data,this,e)},defaultOption:{coordinateSystem:\"cartesian2d\",zlevel:0,z:2,geoIndex:0,blurSize:30,pointSize:20,maxOpacity:1,minOpacity:0}})},function(t,e,i){function n(t,e,i){var n=t[1]-t[0];e=l.map(e,function(e){return{interval:[(e.interval[0]-t[0])/n,(e.interval[1]-t[0])/n]}});var r=e.length,o=0;return function(t){for(var n=o;r>n;n++){var a=e[n].interval;if(a[0]<=t&&t<=a[1]){o=n;break}}if(n===r)for(var n=o-1;n>=0;n--){var a=e[n].interval;if(a[0]<=t&&t<=a[1]){o=n;break}}return n>=0&&r>n&&i[n]}}function r(t,e){var i=t[1]-t[0];return e=[(e[0]-t[0])/i,(e[1]-t[0])/i],function(t){return t>=e[0]&&t<=e[1]}}function o(t){var e=t.dimensions;return\"lng\"===e[0]&&\"lat\"===e[1]}var a=i(3),s=i(278),l=i(1);t.exports=i(2).extendChartView({type:\"heatmap\",render:function(t,e,i){var n;e.eachComponent(\"visualMap\",function(e){e.eachTargetSeries(function(i){i===t&&(n=e)})}),this.group.removeAll();var r=t.coordinateSystem;\"cartesian2d\"===r.type?this._renderOnCartesian(r,t,i):o(r)&&this._renderOnGeo(r,t,n,i)},_renderOnCartesian:function(t,e,i){var n=t.getAxis(\"x\"),r=t.getAxis(\"y\"),o=this.group,s=n.getBandWidth(),u=r.getBandWidth(),h=e.getData(),c=\"itemStyle.normal\",d=\"itemStyle.emphasis\",f=\"label.normal\",p=\"label.emphasis\",g=e.getModel(c).getItemStyle([\"color\"]),v=e.getModel(d).getItemStyle(),m=e.getModel(\"label.normal\"),y=e.getModel(\"label.emphasis\");h.each([\"x\",\"y\",\"z\"],function(i,n,r,x){var _=h.getItemModel(x),b=t.dataToPoint([i,n]);if(!isNaN(r)){var w=new a.Rect({shape:{x:b[0]-s/2,y:b[1]-u/2,width:s,height:u},style:{fill:h.getItemVisual(x,\"color\"),opacity:h.getItemVisual(x,\"opacity\")}});h.hasItemOption&&(g=_.getModel(c).getItemStyle([\"color\"]),v=_.getModel(d).getItemStyle(),m=_.getModel(f),y=_.getModel(p));var S=e.getRawValue(x),M=\"-\";S&&null!=S[2]&&(M=S[2]),m.getShallow(\"show\")&&(a.setText(g,m),g.text=e.getFormattedLabel(x,\"normal\")||M),y.getShallow(\"show\")&&(a.setText(v,y),v.text=e.getFormattedLabel(x,\"emphasis\")||M),w.setStyle(g),a.setHoverStyle(w,h.hasItemOption?v:l.extend({},v)),o.add(w),h.setItemGraphicEl(x,w)}})},_renderOnGeo:function(t,e,i,o){var l=i.targetVisuals.inRange,u=i.targetVisuals.outOfRange,h=e.getData(),c=this._hmLayer||this._hmLayer||new s;c.blurSize=e.get(\"blurSize\"),c.pointSize=e.get(\"pointSize\"),c.minOpacity=e.get(\"minOpacity\"),c.maxOpacity=e.get(\"maxOpacity\");var d=t.getViewRect().clone(),f=t.getRoamTransform().transform;d.applyTransform(f);var p=Math.max(d.x,0),g=Math.max(d.y,0),v=Math.min(d.width+d.x,o.getWidth()),m=Math.min(d.height+d.y,o.getHeight()),y=v-p,x=m-g,_=h.mapArray([\"lng\",\"lat\",\"value\"],function(e,i,n){var r=t.dataToPoint([e,i]);return r[0]-=p,r[1]-=g,r.push(n),r}),b=i.getExtent(),w=\"visualMap.continuous\"===i.type?r(b,i.option.range):n(b,i.getPieceList(),i.option.selected);c.update(_,y,x,l.color.getNormalizer(),{inRange:l.color.getColorMapper(),outOfRange:u.color.getColorMapper()},w);var S=new a.Image({style:{width:y,height:x,x:p,y:g,image:c.canvas},silent:!0});this.group.add(S)}})},function(t,e,i){function n(t,e,i){a.call(this,t,e,i),this._lastFrame=0,this._lastFramePercent=0}var r=i(226),o=i(1),a=i(225),s=i(5),l=n.prototype;l.createLine=function(t,e,i){return new r(t,e,i)},l.updateAnimationPoints=function(t,e){this._points=e;for(var i=[0],n=0,r=1;r<e.length;r++){var o=e[r-1],a=e[r];n+=s.dist(o,a),i.push(n)}if(0!==n){for(var r=0;r<i.length;r++)i[r]/=n;this._offsets=i,this._length=n}},l.getLineLength=function(t){return this._length},l.updateSymbolPosition=function(t){var e=t.__t,i=this._points,n=this._offsets,r=i.length;if(n){var o,a=this._lastFrame;if(e<this._lastFramePercent){var l=Math.min(a+1,r-1);for(o=l;o>=0&&!(n[o]<=e);o--);o=Math.min(o,r-2)}else{for(var o=a;r>o&&!(n[o]>e);o++);o=Math.min(o-1,r-2)}s.lerp(t.position,i[o],i[o+1],(e-n[o])/(n[o+1]-n[o])),this._lastFrame=o,this._lastFramePercent=e,t.ignore=!1}},o.inherits(n,a),t.exports=n},function(t,e,i){function n(t){return a.isArray(t)||(t=[+t,+t]),t}function r(t,e){t.eachChild(function(t){t.attr({z:e.z,zlevel:e.zlevel,style:{stroke:\"stroke\"===e.brushType?e.color:null,fill:\"fill\"===e.brushType?e.color:null}})})}function o(t,e){c.call(this);var i=new h(t,e),n=new c;this.add(i),this.add(n),n.beforeUpdate=function(){this.attr(i.getScale())},this.updateData(t,e)}var a=i(1),s=i(26),l=i(3),u=i(4),h=i(49),c=l.Group,d=3,f=o.prototype;f.stopEffectAnimation=function(){this.childAt(1).removeAll()},f.startEffectAnimation=function(t){for(var e=t.symbolType,i=t.color,n=this.childAt(1),o=0;d>o;o++){var a=s.createSymbol(e,-.5,-.5,1,1,i);a.attr({style:{strokeNoScale:!0},z2:99,silent:!0,scale:[1,1]});var l=-o/d*t.period+t.effectOffset;a.animate(\"\",!0).when(t.period,{scale:[t.rippleScale,t.rippleScale]}).delay(l).start(),a.animateStyle(!0).when(t.period,{opacity:0}).delay(l).start(),n.add(a)}r(n,t)},f.updateEffectAnimation=function(t){for(var e=this._effectCfg,i=this.childAt(1),n=[\"symbolType\",\"period\",\"rippleScale\"],o=0;n>o;o++){var a=n[o];if(e[a]!==t[a])return this.stopEffectAnimation(),void this.startEffectAnimation(t)}r(i,t)},f.highlight=function(){this.trigger(\"emphasis\")},f.downplay=function(){this.trigger(\"normal\")},f.updateData=function(t,e){var i=t.hostModel;this.childAt(0).updateData(t,e);var r=this.childAt(1),o=t.getItemModel(e),a=t.getItemVisual(e,\"symbol\"),s=n(t.getItemVisual(e,\"symbolSize\")),l=t.getItemVisual(e,\"color\");r.attr(\"scale\",s),r.traverse(function(t){t.attr({fill:l})});var h=o.getShallow(\"symbolOffset\");if(h){var c=r.position;c[0]=u.parsePercent(h[0],s[0]),c[1]=u.parsePercent(h[1],s[1])}r.rotation=(o.getShallow(\"symbolRotate\")||0)*Math.PI/180||0;var d={};if(d.showEffectOn=i.get(\"showEffectOn\"),d.rippleScale=o.get(\"rippleEffect.scale\"),d.brushType=o.get(\"rippleEffect.brushType\"),d.period=1e3*o.get(\"rippleEffect.period\"),d.effectOffset=e/t.count(),d.z=o.getShallow(\"z\")||0,d.zlevel=o.getShallow(\"zlevel\")||0,d.symbolType=a,d.color=l,this.off(\"mouseover\").off(\"mouseout\").off(\"emphasis\").off(\"normal\"),\"render\"===d.showEffectOn)this._effectCfg?this.updateEffectAnimation(d):this.startEffectAnimation(d),this._effectCfg=d;else{this._effectCfg=null,this.stopEffectAnimation();var f=this.childAt(0),p=function(){f.trigger(\"emphasis\"),\"render\"!==d.showEffectOn&&this.startEffectAnimation(d)},g=function(){f.trigger(\"normal\"),\"render\"!==d.showEffectOn&&this.stopEffectAnimation()};this.on(\"mouseover\",p,this).on(\"mouseout\",g,this).on(\"emphasis\",p,this).on(\"normal\",g,this)}this._effectCfg=d},f.fadeOut=function(t){this.off(\"mouseover\").off(\"mouseout\").off(\"emphasis\").off(\"normal\"),t&&t()},a.inherits(o,c),t.exports=o},function(t,e,i){function n(){this.group=new r.Group,this._lineEl=new s}var r=i(3),o=i(83),a=i(82),s=r.extendShape({shape:{polyline:!1,segs:[]},buildPath:function(t,e){for(var i=e.segs,n=e.polyline,r=0;r<i.length;r++){var o=i[r];if(n){t.moveTo(o[0][0],o[0][1]);for(var a=1;a<o.length;a++)t.lineTo(o[a][0],o[a][1])}else t.moveTo(o[0][0],o[0][1]),o.length>2?t.quadraticCurveTo(o[2][0],o[2][1],o[1][0],o[1][1]):t.lineTo(o[1][0],o[1][1])}},findDataIndex:function(t,e){for(var i=this.shape,n=i.segs,r=i.polyline,s=Math.max(this.style.lineWidth,1),l=0;l<n.length;l++){var u=n[l];if(r){for(var h=1;h<u.length;h++)if(a.containStroke(u[h-1][0],u[h-1][1],u[h][0],u[h][1],s,t,e))return l}else if(u.length>2){if(o.containStroke(u[0][0],u[0][1],u[2][0],u[2][1],u[1][0],u[1][1],s,t,e))return l}else if(a.containStroke(u[0][0],u[0][1],u[1][0],u[1][1],s,t,e))return l}return-1}}),l=n.prototype;l.updateData=function(t){this.group.removeAll();var e=this._lineEl,i=t.hostModel;e.setShape({segs:t.mapArray(t.getItemLayout),polyline:i.get(\"polyline\")}),e.useStyle(i.getModel(\"lineStyle.normal\").getLineStyle());var n=t.getVisual(\"color\");n&&e.setStyle(\"stroke\",n),e.setStyle(\"fill\"),e.seriesIndex=i.seriesIndex,e.on(\"mousemove\",function(t){e.dataIndex=null;var i=e.findDataIndex(t.offsetX,t.offsetY);i>0&&(e.dataIndex=i)}),this.group.add(e)},l.updateLayout=function(t){var e=t.getData();this._lineEl.setShape({segs:e.mapArray(e.getItemLayout)})},l.remove=function(){this.group.removeAll()},t.exports=n},function(t,e,i){function n(t,e,i,n){l.Group.call(this),this.bodyIndex,this.whiskerIndex,this.styleUpdater=i,this._createContent(t,e,n),this.updateData(t,e,n),this._seriesModel}function r(t,e,i){return s.map(t,function(t){return t=t.slice(),t[e]=i.initBaseline,t})}function o(t){var e={};return s.each(t,function(t,i){e[\"ends\"+i]=t}),e}function a(t){this.group=new l.Group,this.styleUpdater=t}var s=i(1),l=i(3),u=i(6),h=u.extend({type:\"whiskerInBox\",shape:{},buildPath:function(t,e){for(var i in e)if(0===i.indexOf(\"ends\")){var n=e[i];t.moveTo(n[0][0],n[0][1]),t.lineTo(n[1][0],n[1][1])}}}),c=n.prototype;c._createContent=function(t,e,i){var n=t.getItemLayout(e),a=\"horizontal\"===n.chartLayout?1:0,u=0;this.add(new l.Polygon({shape:{points:i?r(n.bodyEnds,a,n):n.bodyEnds},style:{strokeNoScale:!0},z2:100})),this.bodyIndex=u++;var c=s.map(n.whiskerEnds,function(t){return i?r(t,a,n):t});this.add(new h({shape:o(c),style:{strokeNoScale:!0},z2:100})),this.whiskerIndex=u++},c.updateData=function(t,e,i){var n=this._seriesModel=t.hostModel,r=t.getItemLayout(e),a=l[i?\"initProps\":\"updateProps\"];a(this.childAt(this.bodyIndex),{shape:{points:r.bodyEnds}},n,e),a(this.childAt(this.whiskerIndex),{shape:o(r.whiskerEnds)},n,e),this.styleUpdater.call(null,this,t,e)},s.inherits(n,l.Group);var d=a.prototype;d.updateData=function(t){var e=this.group,i=this._data,r=this.styleUpdater;t.diff(i).add(function(i){if(t.hasValue(i)){var o=new n(t,i,r,!0);t.setItemGraphicEl(i,o),e.add(o)}}).update(function(o,a){var s=i.getItemGraphicEl(a);return t.hasValue(o)?(s?s.updateData(t,o):s=new n(t,o,r),e.add(s),void t.setItemGraphicEl(o,s)):void e.remove(s)}).remove(function(t){var n=i.getItemGraphicEl(t);n&&e.remove(n)}).execute(),this._data=t},d.remove=function(){var t=this.group,e=this._data;this._data=null,e&&e.eachItemGraphicEl(function(e){e&&t.remove(e)})},t.exports=a},function(t,e,i){i(286),i(287);var n=i(2);n.registerLayout(i(288))},function(t,e,i){\"use strict\";function n(t){var e=t.data;e&&e[0]&&e[0][0]&&e[0][0].coord&&(t.data=a.map(e,function(t){var e=[t[0].coord,t[1].coord],i={coords:e};return t[0].name&&(i.fromName=t[0].name),t[1].name&&(i.toName=t[1].name),a.mergeAll([i,t[0],t[1]])}))}var r=i(15),o=i(14),a=i(1),s=(i(23),r.extend({type:\"series.lines\",dependencies:[\"grid\",\"polar\"],visualColorAccessPath:\"lineStyle.normal.color\",init:function(t){n(t),s.superApply(this,\"init\",arguments)},mergeOption:function(t){n(t),s.superApply(this,\"mergeOption\",arguments)},getInitialData:function(t,e){var i=new o([\"value\"],this);return i.hasItemOption=!1,i.initData(t.data,[],function(t,e,n,r){if(t instanceof Array)return NaN;i.hasItemOption=!0;var o=t.value;return o?o instanceof Array?o[r]:o:void 0}),i},formatTooltip:function(t){var e=this.getData(),i=e.getItemModel(t),n=i.get(\"name\");if(n)return n;var r=i.get(\"fromName\"),o=i.get(\"toName\");return r+\" > \"+o},defaultOption:{coordinateSystem:\"geo\",zlevel:0,z:2,legendHoverLink:!0,hoverAnimation:!0,xAxisIndex:0,yAxisIndex:0,geoIndex:0,effect:{show:!1,period:4,constantSpeed:0,symbol:\"circle\",symbolSize:3,loop:!0,trailLength:.2},large:!1,largeThreshold:2e3,polyline:!1,label:{normal:{show:!1,position:\"end\"}},lineStyle:{normal:{opacity:.5}}}}))},function(t,e,i){var n=i(93),r=i(225),o=i(92),a=i(226),s=i(281),l=i(283);i(2).extendChartView({type:\"lines\",init:function(){},render:function(t,e,i){var u=t.getData(),h=this._lineDraw,c=t.get(\"effect.show\"),d=t.get(\"polyline\"),f=t.get(\"large\")&&u.count()>=t.get(\"largeThreshold\");c===this._hasEffet&&d===this._isPolyline&&f===this._isLarge||(h&&h.remove(),h=this._lineDraw=f?new l:new n(d?c?s:a:c?r:o),this._hasEffet=c,this._isPolyline=d,this._isLarge=f);var p=t.get(\"zlevel\"),g=t.get(\"effect.trailLength\"),v=i.getZr();if(v.painter.getLayer(p).clear(!0),null!=this._lastZlevel&&v.configLayer(this._lastZlevel,{motionBlur:!1}),c&&g){v.configLayer(p,{motionBlur:!0,lastFrameAlpha:Math.max(Math.min(g/10+.9,1),0)})}this.group.add(h.group),h.updateData(u),this._lastZlevel=p},updateLayout:function(t,e,i){this._lineDraw.updateLayout(t);var n=i.getZr();n.painter.getLayer(this._lastZlevel).clear(!0)},remove:function(t,e){this._lineDraw&&this._lineDraw.remove(e,!0)}})},function(t,e,i){t.exports=function(t){t.eachSeriesByType(\"lines\",function(t){var e=t.coordinateSystem,i=t.getData();i.each(function(n){var r=i.getItemModel(n),o=r.option instanceof Array?r.option:r.get(\"coords\"),a=[];if(t.get(\"polyline\"))for(var s=0;s<o.length;s++)a.push(e.dataToPoint(o[s]));else{a[0]=e.dataToPoint(o[0]),a[1]=e.dataToPoint(o[1]);var l=r.get(\"lineStyle.normal.curveness\");+l&&(a[2]=[(a[0][0]+a[1][0])/2-(a[0][1]-a[1][1])*l,(a[0][1]+a[1][1])/2-(a[1][0]-a[0][0])*l])}i.setItemLayout(n,a)})})}},function(t,e,i){var n=i(2),r=n.PRIORITY;i(290),i(291),i(220),i(171),n.registerLayout(i(294)),n.registerVisual(i(295)),n.registerProcessor(r.PROCESSOR.STATISTIC,i(293)),n.registerPreprocessor(i(292)),i(77)(\"map\",[{type:\"mapToggleSelect\",event:\"mapselectchanged\",method:\"toggleSelected\"},{type:\"mapSelect\",event:\"mapselected\",method:\"select\"},{type:\"mapUnSelect\",event:\"mapunselected\",method:\"unSelect\"}])},function(t,e,i){var n=i(14),r=i(15),o=i(1),a=i(30),s=i(8),l=s.encodeHTML,u=s.addCommas,h=i(66),c=i(171),d=r.extend({type:\"series.map\",layoutMode:\"box\",needsDrawMap:!1,seriesGroup:[],init:function(t){t=this._fillOption(t,t.map),this.option=t,d.superApply(this,\"init\",arguments),this.updateSelectedMap(t.data)},getInitialData:function(t){var e=a([\"value\"],t.data||[]),i=new n(e,this);return i.initData(t.data),i},mergeOption:function(t){t.data&&(t=this._fillOption(t,this.option.map)),d.superCall(this,\"mergeOption\",t),this.updateSelectedMap(this.option.data)},_fillOption:function(t,e){return t=o.extend({},t),t.data=c.getFilledRegions(t.data,e),t},getRawValue:function(t){return this._data.get(\"value\",t)},getRegionModel:function(t){var e=this.getData();return e.getItemModel(e.indexOfName(t))},formatTooltip:function(t){for(var e=this.getData(),i=u(this.getRawValue(t)),n=e.getName(t),r=this.seriesGroup,o=[],a=0;a<r.length;a++){var s=r[a].originalData.indexOfName(n);isNaN(r[a].originalData.get(\"value\",s))||o.push(l(r[a].name))}return o.join(\", \")+\"<br />\"+n+\" : \"+i},defaultOption:{zlevel:0,z:2,coordinateSystem:\"geo\",map:\"china\",left:\"center\",top:\"center\",aspectScale:.75,showLegendSymbol:!0,dataRangeHoverLink:!0,center:null,zoom:1,scaleLimit:null,label:{normal:{show:!1,textStyle:{color:\"#000\"}},emphasis:{show:!0,textStyle:{color:\"rgb(100,0,0)\"}}},itemStyle:{normal:{borderWidth:.5,borderColor:\"#444\",areaColor:\"#eee\"},emphasis:{areaColor:\"rgba(255,215,0,0.8)\"}}},setZoom:function(t){this.option.zoom=t},setCenter:function(t){this.option.center=t}});o.mixin(d,h),t.exports=d},function(t,e,i){var n=i(3),r=i(228);i(2).extendChartView({type:\"map\",render:function(t,e,i,n){if(!n||\"mapToggleSelect\"!==n.type||n.from!==this.uid){var o=this.group;if(o.removeAll(),n&&\"geoRoam\"===n.type&&\"series\"===n.componentType&&n.seriesId===t.id){var a=this._mapDraw;a&&o.add(a.group)}else if(t.needsDrawMap){var a=this._mapDraw||new r(i,!0);o.add(a.group),a.draw(t,e,i,this,n),this._mapDraw=a}else this._mapDraw&&this._mapDraw.remove(),this._mapDraw=null;t.get(\"showLegendSymbol\")&&e.getComponent(\"legend\")&&this._renderSymbols(t,e,i)}},remove:function(){this._mapDraw&&this._mapDraw.remove(),this._mapDraw=null,this.group.removeAll()},_renderSymbols:function(t,e,i){var r=t.originalData,o=this.group;r.each(\"value\",function(e,i){if(!isNaN(e)){var a=r.getItemLayout(i);if(a&&a.point){var s=a.point,l=a.offset,u=new n.Circle({style:{fill:t.getData().getVisual(\"color\")},shape:{cx:s[0]+9*l,cy:s[1],r:3},silent:!0,z2:10});if(!l){var h=t.mainSeries.getData(),c=r.getName(i),d=c,f=h.indexOfName(c),p=r.getItemModel(i),g=p.getModel(\"label.normal\"),v=p.getModel(\"label.emphasis\"),m=g.getModel(\"textStyle\"),y=v.getModel(\"textStyle\"),x=h.getItemGraphicEl(f);u.setStyle({textPosition:\"bottom\"});var _=function(){u.setStyle({text:v.get(\"show\")?d:\"\",textFill:y.getTextColor(),textFont:y.getFont()})},b=function(){u.setStyle({text:g.get(\"show\")?d:\"\",textFill:m.getTextColor(),textFont:m.getFont()})};x.on(\"mouseover\",_).on(\"mouseout\",b).on(\"emphasis\",_).on(\"normal\",b),b()}o.add(u)}}})}})},function(t,e,i){var n=i(1);t.exports=function(t){var e=[];n.each(t.series,function(t){\"map\"===t.type&&e.push(t)}),n.each(e,function(t){t.map=t.map||t.mapType,n.defaults(t,t.mapLocation)})}},function(t,e,i){function n(t,e){for(var i={},n=[\"value\"],r=0;r<t.length;r++)t[r].each(n,function(e,n){var o=t[r].getName(n);i[o]=i[o]||[],isNaN(e)||i[o].push(e)});return t[0].map(n,function(n,r){for(var o=t[0].getName(r),a=0,s=1/0,l=-(1/0),u=i[o].length,h=0;u>h;h++)s=Math.min(s,i[o][h]),l=Math.max(l,i[o][h]),a+=i[o][h];var c;return c=\"min\"===e?s:\"max\"===e?l:\"average\"===e?a/u:a,0===u?NaN:c})}var r=i(1);t.exports=function(t){var e={};t.eachSeriesByType(\"map\",function(t){var i=t.get(\"map\");e[i]=e[i]||[],e[i].push(t)}),r.each(e,function(t,e){for(var i=n(r.map(t,function(t){return t.getData()}),t[0].get(\"mapValueCalculation\")),o=0;o<t.length;o++)t[o].originalData=t[o].getData();for(var o=0;o<t.length;o++)t[o].seriesGroup=t,t[o].needsDrawMap=0===o,t[o].setData(i.cloneShallow()),t[o].mainSeries=t[0]})}},function(t,e,i){var n=i(1);t.exports=function(t){var e={};t.eachSeriesByType(\"map\",function(i){var r=i.get(\"map\");if(!e[r]){var o={};n.each(i.seriesGroup,function(e){var i=e.coordinateSystem,n=e.originalData;e.get(\"showLegendSymbol\")&&t.getComponent(\"legend\")&&n.each(\"value\",function(t,e){var r=n.getName(e),a=i.getRegion(r);if(a&&!isNaN(t)){var s=o[r]||0,l=i.dataToPoint(a.center);o[r]=s+1,n.setItemLayout(e,{point:l,offset:s})}})});var a=i.getData();a.each(function(t){var e=a.getName(t),i=a.getItemLayout(t)||{};i.showLabel=!o[e],a.setItemLayout(t,i)}),e[r]=!0}})}},function(t,e){t.exports=function(t){t.eachSeriesByType(\"map\",function(t){var e=t.get(\"color\"),i=t.getModel(\"itemStyle.normal\"),n=i.get(\"areaColor\"),r=i.get(\"color\")||e[t.seriesIndex%e.length];t.getData().setVisual({areaColor:n,color:r})})}},function(t,e,i){var n=i(2);i(229),i(297),i(298),n.registerVisual(i(299))},function(t,e,i){function n(t,e,i){var n=t.get(\"data\"),o=r(e);n&&n.length&&s.each(i,function(t){if(t){var e=s.indexOf(n,t[o]);t[o]=e>=0?e:NaN}})}function r(t){return+t.replace(\"dim\",\"\")}function o(t,e){var i=0;s.each(t,function(t){var e=r(t);e>i&&(i=e)});var n=e[0];n&&n.length-1>i&&(i=n.length-1);for(var o=[],a=0;i>=a;a++)o.push(\"dim\"+a);return o}var a=i(14),s=i(1),l=i(15),u=i(30);t.exports=l.extend({type:\"series.parallel\",dependencies:[\"parallel\"],getInitialData:function(t,e){var i=e.getComponent(\"parallel\",this.get(\"parallelIndex\")),r=i.parallelAxisIndex,l=t.data,h=i.dimensions,c=o(h,l),d=s.map(c,function(t,i){var o=s.indexOf(h,t),a=o>=0&&e.getComponent(\"parallelAxis\",r[o]);return a&&\"category\"===a.get(\"type\")?(n(a,t,l),{name:t,type:\"ordinal\"}):0>o&&u.guessOrdinal(l,i)?{name:t,type:\"ordinal\"}:t}),f=new a(d,this);return f.initData(l),this.option.progressive&&(this.option.animation=!1),f},getRawIndicesByActiveState:function(t){var e=this.coordinateSystem,i=this.getData(),n=[];return e.eachActiveState(i,function(e,r){t===e&&n.push(i.getRawIndex(r))}),n},defaultOption:{zlevel:0,z:2,coordinateSystem:\"parallel\",parallelIndex:0,label:{normal:{show:!1},emphasis:{show:!1}},inactiveOpacity:.05,activeOpacity:1,lineStyle:{normal:{width:1,opacity:.45,type:\"solid\"}},progressive:!1,smooth:!1,animationEasing:\"linear\"}})},function(t,e,i){function n(t,e,i){var n=t.model,r=t.getRect(),o=new l.Rect({shape:{x:r.x,y:r.y,width:r.width,height:r.height}}),a=\"horizontal\"===n.get(\"layout\")?\"width\":\"height\";return o.setShape(a,0),l.initProps(o,{shape:{width:r.width,height:r.height}},e,i),o}function r(t,e,i,n){for(var r=[],o=0;o<i.length;o++){var a=i[o],l=t.get(a,e);s(l,n.getAxis(a).type)||r.push(n.dataToPoint(l,a))}return r}function o(t,e,i,n,o){var a=r(t,i,n,o),s=new l.Polyline({shape:{points:a},silent:!0,z2:10});e.add(s),t.setItemGraphicEl(i,s)}function a(t,e){var i=t.hostModel.getModel(\"lineStyle.normal\"),n=i.getLineStyle();t.eachItemGraphicEl(function(r,o){if(t.hasItemOption){var a=t.getItemModel(o),s=a.getModel(\"lineStyle.normal\",i);n=s.getLineStyle()}r.useStyle(u.extend(n,{fill:null,stroke:t.getItemVisual(o,\"color\"),opacity:t.getItemVisual(o,\"opacity\")})),r.shape.smooth=e})}function s(t,e){return\"category\"===e?null==t:null==t||isNaN(t)}var l=i(3),u=i(1),h=.3,c=i(27).extend({type:\"parallel\",init:function(){this._dataGroup=new l.Group,this.group.add(this._dataGroup),this._data},render:function(t,e,i,n){this._renderForNormal(t)},_renderForNormal:function(t){function e(t){o(c,u,t,p,f,null,v)}function i(e,i){var n=d.getItemGraphicEl(i),o=r(c,e,p,f);c.setItemGraphicEl(e,n),l.updateProps(n,{shape:{points:o}},t,e)}function s(t){var e=d.getItemGraphicEl(t);u.remove(e)}var u=this._dataGroup,c=t.getData(),d=this._data,f=t.coordinateSystem,p=f.dimensions,g=t.option,v=g.smooth?h:null;if(c.diff(d).add(e).update(i).remove(s).execute(),a(c,v),!this._data){var m=n(f,t,function(){setTimeout(function(){u.removeClipPath()})});u.setClipPath(m)}this._data=c},remove:function(){this._dataGroup&&this._dataGroup.removeAll(),this._data=null}});t.exports=c},function(t,e){t.exports=function(t){t.eachSeriesByType(\"parallel\",function(e){var i=e.getModel(\"itemStyle.normal\"),n=e.getModel(\"lineStyle.normal\"),r=t.get(\"color\"),o=n.get(\"color\")||i.get(\"color\")||r[e.seriesIndex%r.length],a=e.get(\"inactiveOpacity\"),s=e.get(\"activeOpacity\"),l=e.getModel(\"lineStyle.normal\").getLineStyle(),u=e.coordinateSystem,h=e.getData(),c={normal:l.opacity,active:s,inactive:a};u.eachActiveState(h,function(t,e){h.setItemVisual(e,\"opacity\",c[t])}),h.setVisual(\"color\",o)})}},function(t,e,i){var n=i(1),r=i(2);i(334),i(301),i(302),r.registerVisual(n.curry(i(72),\"radar\")),r.registerVisual(n.curry(i(46),\"radar\",\"circle\",null)),r.registerLayout(i(304)),r.registerProcessor(n.curry(i(70),\"radar\")),r.registerPreprocessor(i(303))},function(t,e,i){\"use strict\";var n=i(15),r=i(14),o=i(30),a=i(1),s=n.extend({type:\"series.radar\",dependencies:[\"radar\"],init:function(t){s.superApply(this,\"init\",arguments),this.legendDataProvider=function(){return this._dataBeforeProcessed}},getInitialData:function(t,e){var i=t.data||[],n=o([],i,[],\"indicator_\"),a=new r(n,this);return a.initData(i),a},formatTooltip:function(t){var e=this.getRawValue(t),i=this.coordinateSystem,n=i.getIndicatorAxes();return(\"\"==this._data.getName(t)?this.name:this._data.getName(t))+\"<br/>\"+a.map(n,function(t,i){return t.name+\" : \"+e[i]}).join(\"<br />\")},defaultOption:{zlevel:0,z:2,coordinateSystem:\"radar\",legendHoverLink:!0,radarIndex:0,lineStyle:{normal:{width:2,type:\"solid\"}},label:{normal:{position:\"top\"}},symbol:\"emptyCircle\",symbolSize:4}});t.exports=s},function(t,e,i){function n(t){return o.isArray(t)||(t=[+t,+t]),t}var r=i(3),o=i(1),a=i(26);t.exports=i(2).extendChartView({type:\"radar\",render:function(t,e,i){function s(t,e){var i=t.getItemVisual(e,\"symbol\")||\"circle\",r=t.getItemVisual(e,\"color\");if(\"none\"!==i){var o=a.createSymbol(i,-.5,-.5,1,1,r);return o.attr({style:{strokeNoScale:!0},z2:100,scale:n(t.getItemVisual(e,\"symbolSize\"))}),o}}function l(e,i,n,o,a,l){n.removeAll();for(var u=0;u<i.length-1;u++){var h=s(o,a);h&&(h.__dimIdx=u,e[u]?(h.attr(\"position\",e[u]),r[l?\"initProps\":\"updateProps\"](h,{position:i[u]},t,a)):h.attr(\"position\",i[u]),n.add(h))}}function u(t){return o.map(t,function(t){return[h.cx,h.cy]})}var h=t.coordinateSystem,c=this.group,d=t.getData(),f=this._data;d.diff(f).add(function(e){var i=d.getItemLayout(e);if(i){var n=new r.Polygon,o=new r.Polyline,a={shape:{points:i}};n.shape.points=u(i),o.shape.points=u(i),r.initProps(n,a,t,e),r.initProps(o,a,t,e);var s=new r.Group,h=new r.Group;s.add(o),s.add(n),s.add(h),l(o.shape.points,i,h,d,e,!0),d.setItemGraphicEl(e,s)}}).update(function(e,i){var n=f.getItemGraphicEl(i),o=n.childAt(0),a=n.childAt(1),s=n.childAt(2),u={shape:{points:d.getItemLayout(e)}};u.shape.points&&(l(o.shape.points,u.shape.points,s,d,e,!1),r.updateProps(o,u,t),r.updateProps(a,u,t),d.setItemGraphicEl(e,n))}).remove(function(t){c.remove(f.getItemGraphicEl(t))}).execute(),d.eachItemGraphicEl(function(e,i){function n(){u.attr(\"ignore\",m)}function a(){u.attr(\"ignore\",v)}var s=d.getItemModel(i),l=e.childAt(0),u=e.childAt(1),h=e.childAt(2),f=d.getItemVisual(i,\"color\");c.add(e),l.useStyle(o.defaults(s.getModel(\"lineStyle.normal\").getLineStyle(),{fill:\"none\",stroke:f})),l.hoverStyle=s.getModel(\"lineStyle.emphasis\").getLineStyle();var p=s.getModel(\"areaStyle.normal\"),g=s.getModel(\"areaStyle.emphasis\"),v=p.isEmpty()&&p.parentModel.isEmpty(),m=g.isEmpty()&&g.parentModel.isEmpty();m=m&&v,u.ignore=v,u.useStyle(o.defaults(p.getAreaStyle(),{fill:f,opacity:.7})),u.hoverStyle=g.getAreaStyle();var y=s.getModel(\"itemStyle.normal\").getItemStyle([\"color\"]),x=s.getModel(\"itemStyle.emphasis\").getItemStyle(),_=s.getModel(\"label.normal\"),b=s.getModel(\"label.emphasis\");h.eachChild(function(e){e.setStyle(y),e.hoverStyle=o.clone(x);var n=d.get(d.dimensions[e.__dimIdx],i);r.setText(e.style,_,f),e.setStyle({text:_.get(\"show\")?o.retrieve(t.getFormattedLabel(i,\"normal\",null,e.__dimIdx),n):\"\"}),r.setText(e.hoverStyle,b,f),e.hoverStyle.text=b.get(\"show\")?o.retrieve(t.getFormattedLabel(i,\"emphasis\",null,e.__dimIdx),n):\"\"}),e.off(\"mouseover\").off(\"mouseout\").off(\"normal\").off(\"emphasis\"),e.on(\"emphasis\",n).on(\"mouseover\",n).on(\"normal\",a).on(\"mouseout\",a),r.setHoverStyle(e)}),this._data=d},remove:function(){this.group.removeAll(),this._data=null}})},function(t,e,i){var n=i(1);t.exports=function(t){var e=t.polar;if(e){n.isArray(e)||(e=[e]);var i=[];n.each(e,function(e,r){e.indicator?(e.type&&!e.shape&&(e.shape=e.type),t.radar=t.radar||[],n.isArray(t.radar)||(t.radar=[t.radar]),t.radar.push(e)):i.push(e)}),t.polar=i}n.each(t.series,function(t){\"radar\"===t.type&&t.polarIndex&&(t.radarIndex=t.polarIndex);\n})}},function(t,e){t.exports=function(t){t.eachSeriesByType(\"radar\",function(t){function e(t,e){n[e]=n[e]||[],n[e][o]=r.dataToPoint(t,o)}var i=t.getData(),n=[],r=t.coordinateSystem;if(r){for(var o=0;o<r.getIndicatorAxes().length;o++){var a=i.dimensions[o];i.each(a,e)}i.each(function(t){n[t][0]&&n[t].push(n[t][0].slice()),i.setItemLayout(t,n[t])})}})}},function(t,e,i){var n=i(2);i(306),i(307),n.registerLayout(i(308)),n.registerVisual(i(309))},function(t,e,i){var n=i(15),r=i(227),o=n.extend({type:\"series.sankey\",layoutInfo:null,getInitialData:function(t){var e=t.edges||t.links,i=t.data||t.nodes;if(i&&e){var n=r(i,e,this,!0);return n.data}},getGraph:function(){return this.getData().graph},getEdgeData:function(){return this.getGraph().edgeData},formatTooltip:function(t,e,i){if(\"edge\"===i){var n=this.getDataParams(t,i),r=n.data,a=r.source+\" -- \"+r.target;return n.value&&(a+=\" : \"+n.value),a}return o.superCall(this,\"formatTooltip\",t,e)},defaultOption:{zlevel:0,z:2,coordinateSystem:\"view\",layout:null,left:\"5%\",top:\"5%\",right:\"20%\",bottom:\"5%\",nodeWidth:20,nodeGap:8,layoutIterations:32,label:{normal:{show:!0,position:\"right\",textStyle:{color:\"#000\",fontSize:12}},emphasis:{show:!0}},itemStyle:{normal:{borderWidth:1,borderColor:\"#333\"}},lineStyle:{normal:{color:\"#314656\",opacity:.2,curveness:.5},emphasis:{opacity:.6}},animationEasing:\"linear\",animationDuration:1e3}});t.exports=o},function(t,e,i){function n(t,e,i){var n=new r.Rect({shape:{x:t.x-10,y:t.y-10,width:0,height:t.height+20}});return r.initProps(n,{shape:{width:t.width+20,height:t.height+20}},e,i),n}var r=i(3),o=i(1),a=r.extendShape({shape:{x1:0,y1:0,x2:0,y2:0,cpx1:0,cpy1:0,cpx2:0,cpy2:0,extent:0},buildPath:function(t,e){var i=e.extent/2;t.moveTo(e.x1,e.y1-i),t.bezierCurveTo(e.cpx1,e.cpy1-i,e.cpx2,e.cpy2-i,e.x2,e.y2-i),t.lineTo(e.x2,e.y2+i),t.bezierCurveTo(e.cpx2,e.cpy2+i,e.cpx1,e.cpy1+i,e.x1,e.y1+i),t.closePath()}});t.exports=i(2).extendChartView({type:\"sankey\",_model:null,render:function(t,e,i){var s=t.getGraph(),l=this.group,u=t.layoutInfo,h=t.getData(),c=t.getData(\"edge\");this._model=t,l.removeAll(),l.position=[u.x,u.y],s.eachEdge(function(e){var i=new a;i.dataIndex=e.dataIndex,i.seriesIndex=t.seriesIndex,i.dataType=\"edge\";var n=e.getModel(\"lineStyle.normal\"),o=n.get(\"curveness\"),s=e.node1.getLayout(),u=e.node2.getLayout(),h=e.getLayout();i.shape.extent=Math.max(1,h.dy);var d=s.x+s.dx,f=s.y+h.sy+h.dy/2,p=u.x,g=u.y+h.ty+h.dy/2,v=d*(1-o)+p*o,m=f,y=d*o+p*(1-o),x=g;switch(i.setShape({x1:d,y1:f,x2:p,y2:g,cpx1:v,cpy1:m,cpx2:y,cpy2:x}),i.setStyle(n.getItemStyle()),i.style.fill){case\"source\":i.style.fill=e.node1.getVisual(\"color\");break;case\"target\":i.style.fill=e.node2.getVisual(\"color\")}r.setHoverStyle(i,e.getModel(\"lineStyle.emphasis\").getItemStyle()),l.add(i),c.setItemGraphicEl(e.dataIndex,i)}),s.eachNode(function(e){var i=e.getLayout(),n=e.getModel(),a=n.getModel(\"label.normal\"),s=a.getModel(\"textStyle\"),u=n.getModel(\"label.emphasis\"),c=u.getModel(\"textStyle\"),d=new r.Rect({shape:{x:i.x,y:i.y,width:e.getLayout().dx,height:e.getLayout().dy},style:{text:a.get(\"show\")?t.getFormattedLabel(e.dataIndex,\"normal\")||e.id:\"\",textFont:s.getFont(),textFill:s.getTextColor(),textPosition:a.get(\"position\")}});d.setStyle(o.defaults({fill:e.getVisual(\"color\")},n.getModel(\"itemStyle.normal\").getItemStyle())),r.setHoverStyle(d,o.extend(e.getModel(\"itemStyle.emphasis\"),{text:u.get(\"show\")?t.getFormattedLabel(e.dataIndex,\"emphasis\")||e.id:\"\",textFont:c.getFont(),textFill:c.getTextColor(),textPosition:u.get(\"position\")})),l.add(d),h.setItemGraphicEl(e.dataIndex,d),d.dataType=\"node\"}),!this._data&&t.get(\"animation\")&&l.setClipPath(n(l.getBoundingRect(),t,function(){l.removeClipPath()})),this._data=t.getData()}})},function(t,e,i){function n(t,e){return M.getLayoutRect(t.getBoxLayoutParams(),{width:e.getWidth(),height:e.getHeight()})}function r(t,e,i,n,r,o,s){a(t,i,r),u(t,e,o,n,s),v(t)}function o(t){A.each(t,function(t){var e=x(t.outEdges,S),i=x(t.inEdges,S),n=Math.max(e,i);t.setLayout({value:n},!0)})}function a(t,e,i){for(var n=t,r=null,o=0,a=0;n.length;){r=[];for(var u=0,h=n.length;h>u;u++){var c=n[u];c.setLayout({x:o},!0),c.setLayout({dx:e},!0);for(var d=0,f=c.outEdges.length;f>d;d++)r.push(c.outEdges[d].node2)}n=r,++o}s(t,o),a=(i-e)/(o-1),l(t,a)}function s(t,e){A.each(t,function(t){t.outEdges.length||t.setLayout({x:e-1},!0)})}function l(t,e){A.each(t,function(t){var i=t.getLayout().x*e;t.setLayout({x:i},!0)})}function u(t,e,i,n,r){var o=T().key(function(t){return t.getLayout().x}).sortKeys(w).entries(t).map(function(t){return t.values});h(t,o,e,i,n),c(o,n,i);for(var a=1;r>0;r--)a*=.99,d(o,a),c(o,n,i),p(o,a),c(o,n,i)}function h(t,e,i,n,r){var o=[];A.each(e,function(t){var e=t.length,i=0;A.each(t,function(t){i+=t.getLayout().value});var a=(n-(e-1)*r)/i;o.push(a)}),o.sort(function(t,e){return t-e});var a=o[0];A.each(e,function(t){A.each(t,function(t,e){t.setLayout({y:e},!0);var i=t.getLayout().value*a;t.setLayout({dy:i},!0)})}),A.each(i,function(t){var e=+t.getValue()*a;t.setLayout({dy:e},!0)})}function c(t,e,i){A.each(t,function(t){var n,r,o,a=0,s=t.length;for(t.sort(b),o=0;s>o;o++){if(n=t[o],r=a-n.getLayout().y,r>0){var l=n.getLayout().y+r;n.setLayout({y:l},!0)}a=n.getLayout().y+n.getLayout().dy+e}if(r=a-e-i,r>0){var l=n.getLayout().y-r;for(n.setLayout({y:l},!0),a=n.getLayout().y,o=s-2;o>=0;--o)n=t[o],r=n.getLayout().y+n.getLayout().dy+e-a,r>0&&(l=n.getLayout().y-r,n.setLayout({y:l},!0)),a=n.getLayout().y}})}function d(t,e){A.each(t.slice().reverse(),function(t){A.each(t,function(t){if(t.outEdges.length){var i=x(t.outEdges,f)/x(t.outEdges,S),n=t.getLayout().y+(i-_(t))*e;t.setLayout({y:n},!0)}})})}function f(t){return _(t.node2)*t.getValue()}function p(t,e){A.each(t,function(t){A.each(t,function(t){if(t.inEdges.length){var i=x(t.inEdges,g)/x(t.inEdges,S),n=t.getLayout().y+(i-_(t))*e;t.setLayout({y:n},!0)}})})}function g(t){return _(t.node1)*t.getValue()}function v(t){A.each(t,function(t){t.outEdges.sort(m),t.inEdges.sort(y)}),A.each(t,function(t){var e=0,i=0;A.each(t.outEdges,function(t){t.setLayout({sy:e},!0),e+=t.getLayout().dy}),A.each(t.inEdges,function(t){t.setLayout({ty:i},!0),i+=t.getLayout().dy})})}function m(t,e){return t.node2.getLayout().y-e.node2.getLayout().y}function y(t,e){return t.node1.getLayout().y-e.node1.getLayout().y}function x(t,e){for(var i=0,n=t.length,r=-1;++r<n;){var o=+e.call(t,t[r],r);isNaN(o)||(i+=o)}return i}function _(t){return t.getLayout().y+t.getLayout().dy/2}function b(t,e){return t.getLayout().y-e.getLayout().y}function w(t,e){return e>t?-1:t>e?1:t===e?0:NaN}function S(t){return t.getValue()}var M=i(13),T=i(381),A=i(1);t.exports=function(t,e,i){t.eachSeriesByType(\"sankey\",function(t){var i=t.get(\"nodeWidth\"),a=t.get(\"nodeGap\"),s=n(t,e);t.layoutInfo=s;var l=s.width,u=s.height,h=t.getGraph(),c=h.nodes,d=h.edges;o(c);var f=c.filter(function(t){return 0===t.getLayout().value}),p=0!==f.length?0:t.get(\"layoutIterations\");r(c,d,i,a,l,u,p)})}},function(t,e,i){var n=i(71);t.exports=function(t,e){t.eachSeriesByType(\"sankey\",function(t){var e=t.getGraph(),i=e.nodes;i.sort(function(t,e){return t.getLayout().value-e.getLayout().value});var r=i[0].getLayout().value,o=i[i.length-1].getLayout().value;i.forEach(function(e){var i=new n({type:\"color\",mappingMethod:\"linear\",dataExtent:[r,o],visual:t.get(\"color\")}),a=i.mapValueToVisual(e.getLayout().value);e.setVisual(\"color\",a);var s=e.getModel(),l=s.get(\"itemStyle.normal.color\");null!=l&&e.setVisual(\"color\",l)})})}},function(t,e,i){var n=i(2);i(312),i(313),i(314),n.registerVisual(i(316)),n.registerLayout(i(315))},function(t,e,i){function n(t,e){this.group=new o.Group,t.add(this.group),this._onSelect=e||s.noop}function r(t,e,i,n,r,o){var a=[[r?t:t-h,e],[t+i,e],[t+i,e+n],[r?t:t-h,e+n]];return!o&&a.splice(2,0,[t+i+h,e+n/2]),!r&&a.push([t,e+n/2]),a}var o=i(3),a=i(13),s=i(1),l=8,u=8,h=5;n.prototype={constructor:n,render:function(t,e,i){var n=t.getModel(\"breadcrumb\"),r=this.group;if(r.removeAll(),n.get(\"show\")&&i){var o=n.getModel(\"itemStyle.normal\"),s=o.getModel(\"textStyle\"),l={pos:{left:n.get(\"left\"),right:n.get(\"right\"),top:n.get(\"top\"),bottom:n.get(\"bottom\")},box:{width:e.getWidth(),height:e.getHeight()},emptyItemWidth:n.get(\"emptyItemWidth\"),totalWidth:0,renderList:[]};this._prepare(n,i,l,s),this._renderContent(n,i,l,o,s),a.positionGroup(r,l.pos,l.box)}},_prepare:function(t,e,i,n){for(var r=e;r;r=r.parentNode){var o=r.getModel().get(\"name\"),a=n.getTextRect(o),s=Math.max(a.width+2*l,i.emptyItemWidth);i.totalWidth+=s+u,i.renderList.push({node:r,text:o,width:s})}},_renderContent:function(t,e,i,n,l){for(var h=0,c=i.emptyItemWidth,d=t.get(\"height\"),f=a.getAvailableSize(i.pos,i.box),p=i.totalWidth,g=i.renderList,v=g.length-1;v>=0;v--){var m=g[v],y=m.width,x=m.text;p>f.width&&(p-=y-c,y=c,x=\"\"),this.group.add(new o.Polygon({shape:{points:r(h,0,y,d,v===g.length-1,0===v)},style:s.defaults(n.getItemStyle(),{lineJoin:\"bevel\",text:x,textFill:l.getTextColor(),textFont:l.getFont()}),z:10,onclick:s.bind(this._onSelect,this,m.node)})),h+=y+u}},remove:function(){this.group.removeAll()}},t.exports=n},function(t,e,i){function n(t,e){var i=0;s.each(t.children,function(t){n(t,e);var r=t.value;s.isArray(r)&&(r=r[0]),i+=r});var r=t.value;e>=0&&(s.isArray(r)?r=r[0]:t.value=new Array(e)),(null==r||isNaN(r))&&(r=i),0>r&&(r=0),e>=0?t.value[0]=r:t.value=r}function r(t,e){var i=e.get(\"color\");if(i){t=t||[];var n;if(s.each(t,function(t){var e=new l(t),i=e.get(\"color\");(e.get(\"itemStyle.normal.color\")||i&&\"none\"!==i)&&(n=!0)}),!n){var r=t[0]||(t[0]={});r.color=i.slice()}return t}}var o=i(15),a=i(379),s=i(1),l=i(9),u=i(8),h=u.encodeHTML,c=u.addCommas;t.exports=o.extend({type:\"series.treemap\",dependencies:[\"grid\",\"polar\"],_viewRoot:null,defaultOption:{progressive:0,hoverLayerThreshold:1/0,left:\"center\",top:\"middle\",right:null,bottom:null,width:\"80%\",height:\"80%\",sort:!0,clipWindow:\"origin\",squareRatio:.5*(1+Math.sqrt(5)),leafDepth:null,drillDownIcon:\"▶\",visualDimension:0,zoomToNodeRatio:.1024,roam:!0,nodeClick:\"zoomToNode\",animation:!0,animationDurationUpdate:900,animationEasing:\"quinticInOut\",breadcrumb:{show:!0,height:22,left:\"center\",top:\"bottom\",emptyItemWidth:25,itemStyle:{normal:{color:\"rgba(0,0,0,0.7)\",borderColor:\"rgba(255,255,255,0.7)\",borderWidth:1,shadowColor:\"rgba(150,150,150,1)\",shadowBlur:3,shadowOffsetX:0,shadowOffsetY:0,textStyle:{color:\"#fff\"}},emphasis:{textStyle:{}}}},label:{normal:{show:!0,position:\"inside\",textStyle:{color:\"#fff\",ellipsis:!0}}},itemStyle:{normal:{color:null,colorAlpha:null,colorSaturation:null,borderWidth:0,gapWidth:0,borderColor:\"#fff\",borderColorSaturation:null},emphasis:{}},color:[],colorAlpha:null,colorSaturation:null,colorMappingBy:\"index\",visibleMin:10,childrenVisibleMin:null,levels:[]},getInitialData:function(t,e){var i=t.data||[],o=t.name;null==o&&(o=t.name);var l={name:o,children:t.data},u=(i[0]||{}).value;n(l,s.isArray(u)?u.length:-1);var h=t.levels||[];return h=t.levels=r(h,e),a.createTree(l,this,h).data},optionUpdated:function(){this.resetViewRoot()},formatTooltip:function(t){var e=this.getData(),i=this.getRawValue(t),n=c(s.isArray(i)?i[0]:i),r=e.getName(t);return h(r)+\": \"+n},getDataParams:function(t){for(var e=o.prototype.getDataParams.apply(this,arguments),i=this.getData(),n=i.tree.getNodeByDataIndex(t),r=e.treePathInfo=[];n;){var a=n.dataIndex;r.push({name:n.name,dataIndex:a,value:this.getRawValue(a)}),n=n.parentNode}return r.reverse(),e},setLayoutInfo:function(t){this.layoutInfo=this.layoutInfo||{},s.extend(this.layoutInfo,t)},mapIdToIndex:function(t){var e=this._idIndexMap;e||(e=this._idIndexMap={},this._idIndexMapCount=0);var i=e[t];return null==i&&(e[t]=i=this._idIndexMapCount++),i},getViewRoot:function(){return this._viewRoot},resetViewRoot:function(t){t?this._viewRoot=t:t=this._viewRoot;var e=this.getData().tree.root;t&&(t===e||e.contains(t))||(this._viewRoot=e)}})},function(t,e,i){function n(){return{nodeGroup:[],background:[],content:[]}}function r(t,e,i,n,r,l,u,h,c,d){function f(e){E.dataIndex=u.dataIndex,E.seriesIndex=t.seriesIndex;var i=A.borderWidth,n=Math.max(I-2*i,0),r=Math.max(L-2*i,0);E.culling=!0,E.setShape({x:i,y:i,width:n,height:r});var o=u.getVisual(\"color\",!0);p(E,function(){var t={fill:o},e=u.getModel(\"itemStyle.emphasis\").getItemStyle();g(t,e,o,n,r),E.setStyle(t),s.setHoverStyle(E,e)}),e.add(E)}function p(t,e){C?!t.invisible&&l.push(t):(e(),t.__tmWillVisible||(t.invisible=!1))}function g(e,i,n,r,o){var a=u.getModel(),s=a.get(\"name\");if(A.isLeafRoot){var l=t.get(\"drillDownIcon\",!0);s=l?l+\" \"+s:test}y(s,e,a,_,n,r,o),y(s,i,a,b,n,r,o)}function y(t,e,i,n,r,o,a){var l=i.getModel(n),u=l.getModel(\"textStyle\");s.setText(e,l,r),e.textAlign=u.get(\"align\"),e.textVerticalAlign=u.get(\"baseline\");var h=u.getTextRect(t);!l.getShallow(\"show\")||h.height>a?e.text=\"\":h.width>o?e.text=u.get(\"ellipsis\")?u.truncateText(t,o,null,{minChar:2}):\"\":e.text=t}function x(t,n,a,s){var l=null!=P&&i[t][P],u=r[t];return l?(i[t][P]=null,w(u,l,t)):C||(l=new n({z:o(a,s)}),l.__tmDepth=a,l.__tmStorageName=t,T(u,l,t)),e[t][D]=l}function w(t,e,i){var n=t[D]={};n.old=\"nodeGroup\"===i?e.position.slice():a.extend({},e.shape)}function T(t,e,i){var o=t[D]={},a=u.parentNode;if(a&&(!n||\"drillDown\"===n.direction)){var s=0,l=0,h=r.background[a.getRawIndex()];!n&&h&&h.old&&(s=h.old.width,l=h.old.height),o.old=\"nodeGroup\"===i?[0,l]:{x:s,y:l,width:0,height:0}}o.fadein=\"nodeGroup\"!==i}if(u){var A=u.getLayout();if(A&&A.isInView){var I=A.width,L=A.height,C=A.invisible,D=u.getRawIndex(),P=h&&h.getRawIndex(),k=x(\"nodeGroup\",v);if(k){if(c.add(k),k.attr(\"position\",[A.x||0,A.y||0]),k.__tmNodeWidth=I,k.__tmNodeHeight=L,A.isAboveViewRoot)return k;var z=x(\"background\",m,d,S);z&&(z.setShape({x:0,y:0,width:I,height:L}),p(z,function(){z.setStyle(\"fill\",u.getVisual(\"borderColor\",!0))}),k.add(z));var O=u.viewChildren;if(!O||!O.length){var E=x(\"content\",m,d,M);E&&f(k)}return k}}}}function o(t,e){var i=t*w+e;return(i-1)/i}var a=i(1),s=i(3),l=i(45),u=i(170),h=i(311),c=i(78),d=i(7),f=i(19),p=i(380),g=a.bind,v=s.Group,m=s.Rect,y=a.each,x=3,_=[\"label\",\"normal\"],b=[\"label\",\"emphasis\"],w=10,S=1,M=2;t.exports=i(2).extendChartView({type:\"treemap\",init:function(t,e){this._containerGroup,this._storage=n(),this._oldTree,this._breadcrumb,this._controller,this._state=\"ready\",this._mayClick},render:function(t,e,i,n){var r=e.findComponents({mainType:\"series\",subType:\"treemap\",query:n});if(!(a.indexOf(r,t)<0)){this.seriesModel=t,this.api=i,this.ecModel=e;var o=u.retrieveTargetInfo(n,t),s=n&&n.type,l=t.layoutInfo,h=!this._oldTree,c=this._storage,d=\"treemapRootToNode\"===s&&o&&c?{rootNodeGroup:c.nodeGroup[o.node.getRawIndex()],direction:n.direction}:null,f=this._giveContainerGroup(l),p=this._doRender(f,t,d);h||s&&\"treemapZoomToNode\"!==s&&\"treemapRootToNode\"!==s?p.renderFinally():this._doAnimation(f,p,t,d),this._resetController(i),this._renderBreadcrumb(t,i,o)}},_giveContainerGroup:function(t){var e=this._containerGroup;return e||(e=this._containerGroup=new v,this._initEvents(e),this.group.add(e)),e.attr(\"position\",[t.x,t.y]),e},_doRender:function(t,e,i){function o(t,e,i,n,r){function s(t){return t.getId()}function u(a,s){var l=null!=a?t[a]:null,u=null!=s?e[s]:null,h=v(l,u,i,r);h&&o(l&&l.viewChildren||[],u&&u.viewChildren||[],h,n,r+1)}n?(e=t,y(t,function(t,e){!t.isRemoved()&&u(e,e)})):new l(e,t,s,s).add(u).update(u).remove(a.curry(u,null)).execute()}function s(t){var e=n();return t&&y(t,function(t,i){var n=e[i];y(t,function(t){t&&(n.push(t),t.__tmWillDelete=1)})}),e}function u(){y(m,function(t){y(t,function(t){t.parent&&t.parent.remove(t)})}),y(g,function(t){t.invisible=!0,t.dirty()})}var h=e.getData().tree,c=this._oldTree,d=n(),f=n(),p=this._storage,g=[],v=a.curry(r,e,f,p,i,d,g);o(h.root?[h.root]:[],c&&c.root?[c.root]:[],t,h===c||!c,0);var m=s(p);return this._oldTree=h,this._storage=f,{lastsForAnimation:d,willDeleteEls:m,renderFinally:u}},_doAnimation:function(t,e,i,n){if(i.get(\"animation\")){var r=i.get(\"animationDurationUpdate\"),o=i.get(\"animationEasing\"),s=p.createWrap();y(e.willDeleteEls,function(t,e){y(t,function(t,i){if(!t.invisible){var a,l=t.parent;if(n&&\"drillDown\"===n.direction)a=l===n.rootNodeGroup?{shape:{x:0,y:0,width:l.__tmNodeWidth,height:l.__tmNodeHeight},style:{opacity:0}}:{style:{opacity:0}};else{var u=0,h=0;l.__tmWillDelete||(u=l.__tmNodeWidth/2,h=l.__tmNodeHeight/2),a=\"nodeGroup\"===e?{position:[u,h],style:{opacity:0}}:{shape:{x:u,y:h,width:0,height:0},style:{opacity:0}}}a&&s.add(t,a,r,o)}})}),y(this._storage,function(t,i){y(t,function(t,n){var l=e.lastsForAnimation[i][n],u={};l&&(\"nodeGroup\"===i?l.old&&(u.position=t.position.slice(),t.attr(\"position\",l.old)):(l.old&&(u.shape=a.extend({},t.shape),t.setShape(l.old)),l.fadein?(t.setStyle(\"opacity\",0),u.style={opacity:1}):1!==t.style.opacity&&(u.style={opacity:1})),s.add(t,u,r,o))})},this),this._state=\"animating\",s.done(g(function(){this._state=\"ready\",e.renderFinally()},this)).start()}},_resetController:function(t){var e=this._controller;e||(e=this._controller=new c(t.getZr()),e.enable(this.seriesModel.get(\"roam\")),e.on(\"pan\",g(this._onPan,this)),e.on(\"zoom\",g(this._onZoom,this)));var i=new d(0,0,t.getWidth(),t.getHeight());e.rectProvider=function(){return i}},_clearController:function(){var t=this._controller;t&&(t.off(\"pan\").off(\"zoom\"),t=null)},_onPan:function(t,e){if(this._mayClick=!1,\"animating\"!==this._state&&(Math.abs(t)>x||Math.abs(e)>x)){var i=this.seriesModel.getData().tree.root;if(!i)return;var n=i.getLayout();if(!n)return;this.api.dispatchAction({type:\"treemapMove\",from:this.uid,seriesId:this.seriesModel.id,rootRect:{x:n.x+t,y:n.y+e,width:n.width,height:n.height}})}},_onZoom:function(t,e,i){if(this._mayClick=!1,\"animating\"!==this._state){var n=this.seriesModel.getData().tree.root;if(!n)return;var r=n.getLayout();if(!r)return;var o=new d(r.x,r.y,r.width,r.height),a=this.seriesModel.layoutInfo;e-=a.x,i-=a.y;var s=f.create();f.translate(s,s,[-e,-i]),f.scale(s,s,[t,t]),f.translate(s,s,[e,i]),o.applyTransform(s),this.api.dispatchAction({type:\"treemapRender\",from:this.uid,seriesId:this.seriesModel.id,rootRect:{x:o.x,y:o.y,width:o.width,height:o.height}})}},_initEvents:function(t){function e(t){var e=this.seriesModel.get(\"nodeClick\",!0);if(e){var i=this.findTarget(t.offsetX,t.offsetY);if(i){var n=i.node;if(n.getLayout().isLeafRoot)this._rootToNode(i);else if(\"zoomToNode\"===e)this._zoomToNode(i);else if(\"link\"===e){var r=n.hostTree.data.getItemModel(n.dataIndex),o=r.get(\"link\",!0),a=r.get(\"target\",!0)||\"blank\";o&&window.open(o,a)}}}}t.on(\"mousedown\",function(t){\"ready\"===this._state&&(this._mayClick=!0)},this),t.on(\"mouseup\",function(t){this._mayClick&&(this._mayClick=!1,\"ready\"===this._state&&e.call(this,t))},this)},_renderBreadcrumb:function(t,e,i){function n(e){\"animating\"!==this._state&&(u.aboveViewRoot(t.getViewRoot(),e)?this._rootToNode({node:e}):this._zoomToNode({node:e}))}i||(i=this.findTarget(e.getWidth()/2,e.getHeight()/2),i||(i={node:t.getData().tree.root})),(this._breadcrumb||(this._breadcrumb=new h(this.group,g(n,this)))).render(t,e,i.node)},remove:function(){this._clearController(),this._containerGroup&&this._containerGroup.removeAll(),this._storage=n(),this._state=\"ready\",this._breadcrumb&&this._breadcrumb.remove()},dispose:function(){this._clearController()},_zoomToNode:function(t){this.api.dispatchAction({type:\"treemapZoomToNode\",from:this.uid,seriesId:this.seriesModel.id,targetNode:t.node})},_rootToNode:function(t){this.api.dispatchAction({type:\"treemapRootToNode\",from:this.uid,seriesId:this.seriesModel.id,targetNode:t.node})},findTarget:function(t,e){var i,n=this.seriesModel.getViewRoot();return n.eachNode({attr:\"viewChildren\",order:\"preorder\"},function(n){var r=this._storage.background[n.getRawIndex()];if(r){var o=r.transformCoordToLocal(t,e),a=r.shape;if(!(a.x<=o[0]&&o[0]<=a.x+a.width&&a.y<=o[1]&&o[1]<=a.y+a.height))return!1;i={node:n,offsetX:o[0],offsetY:o[1]}}},this),i}})},function(t,e,i){for(var n=i(2),r=i(170),o=function(){},a=[\"treemapZoomToNode\",\"treemapRender\",\"treemapMove\"],s=0;s<a.length;s++)n.registerAction({type:a[s],update:\"updateView\"},o);n.registerAction({type:\"treemapRootToNode\",update:\"updateView\"},function(t,e){function i(e,i){var n=r.retrieveTargetInfo(t,e);if(n){var o=e.getViewRoot();o&&(t.direction=r.aboveViewRoot(o,n.node)?\"rollUp\":\"drillDown\"),e.resetViewRoot(n.node)}}e.eachComponent({mainType:\"series\",subType:\"treemap\",query:t},i)})},function(t,e,i){function n(t,e,i){var n={mainType:\"series\",subType:\"treemap\",query:i};t.eachComponent(n,function(t){var n=e.getWidth(),o=e.getHeight(),a=t.option,s=a.size||[],l=b(w(a.width,s[0]),n),u=b(w(a.height,s[1]),o),h=v.getLayoutRect(t.getBoxLayoutParams(),{width:e.getWidth(),height:e.getHeight()}),g=i&&i.type,x=m.retrieveTargetInfo(i,t),_=\"treemapRender\"===g||\"treemapMove\"===g?i.rootRect:null,M=t.getViewRoot(),T=m.getPathToRoot(M);if(\"treemapMove\"!==g){var A=\"treemapZoomToNode\"===g?c(t,x,M,l,u):_?[_.width,_.height]:[l,u],I=a.sort;I&&\"asc\"!==I&&\"desc\"!==I&&(I=\"desc\");var L={squareRatio:a.squareRatio,sort:I,leafDepth:a.leafDepth};M.hostTree.clearLayouts();var C={x:0,y:0,width:A[0],height:A[1],area:A[0]*A[1]};M.setLayout(C),r(M,L,!1,0);var C=M.getLayout();S(T,function(t,e){var i=(T[e+1]||M).getValue();t.setLayout(p.extend({dataExtent:[i,i],borderWidth:0},C))})}var D=t.getData().tree.root;D.setLayout(d(h,_,x),!0),t.setLayoutInfo(h),f(D,new y(-h.x,-h.y,n,o),T,M,0)})}function r(t,e,i,n){var a,s;if(!t.isRemoved()){var l=t.getLayout();a=l.width,s=l.height;var c=t.getModel(\"itemStyle.normal\"),d=c.get(\"borderWidth\"),f=c.get(\"gapWidth\")/2,p=d-f,g=t.getModel();t.setLayout({borderWidth:d},!0),a=x(a-2*p,0),s=x(s-2*p,0);var v=a*s,m=o(t,g,v,e,i,n);if(m.length){var y={x:p,y:p,width:a,height:s},b=_(a,s),w=1/0,S=[];S.area=0;for(var M=0,T=m.length;T>M;){var A=m[M];S.push(A),S.area+=A.getLayout().area;var I=u(S,b,e.squareRatio);w>=I?(M++,w=I):(S.area-=S.pop().getLayout().area,h(S,b,y,f,!1),b=_(y.width,y.height),S.length=S.area=0,w=1/0)}if(S.length&&h(S,b,y,f,!0),!i){var L=g.get(\"childrenVisibleMin\");null!=L&&L>v&&(i=!0)}for(var M=0,T=m.length;T>M;M++)r(m[M],e,i,n+1)}}}function o(t,e,i,n,r,o){var u=t.children||[],h=n.sort;\"asc\"!==h&&\"desc\"!==h&&(h=null);var c=null!=n.leafDepth&&n.leafDepth<=o;if(r&&!c)return t.viewChildren=[];u=p.filter(u,function(t){return!t.isRemoved()}),s(u,h);var d=l(e,u,h);if(0===d.sum)return t.viewChildren=[];if(d.sum=a(e,i,d.sum,h,u),0===d.sum)return t.viewChildren=[];for(var f=0,g=u.length;g>f;f++){var v=u[f].getValue()/d.sum*i;u[f].setLayout({area:v})}return c&&(u.length&&t.setLayout({isLeafRoot:!0},!0),u.length=0),t.viewChildren=u,t.setLayout({dataExtent:d.dataExtent},!0),u}function a(t,e,i,n,r){if(!n)return i;for(var o=t.get(\"visibleMin\"),a=r.length,s=a,l=a-1;l>=0;l--){var u=r[\"asc\"===n?a-l-1:l].getValue();o>u/i*e&&(s=l,i-=u)}return\"asc\"===n?r.splice(0,a-s):r.splice(s,a-s),i}function s(t,e){return e&&t.sort(function(t,i){return\"asc\"===e?t.getValue()-i.getValue():i.getValue()-t.getValue()}),t}function l(t,e,i){for(var n=0,r=0,o=e.length;o>r;r++)n+=e[r].getValue();var a,s=t.get(\"visualDimension\");if(e&&e.length)if(\"value\"===s&&i)a=[e[e.length-1].getValue(),e[0].getValue()],\"asc\"===i&&a.reverse();else{var a=[1/0,-(1/0)];S(e,function(t){var e=t.getValue(s);e<a[0]&&(a[0]=e),e>a[1]&&(a[1]=e)})}else a=[NaN,NaN];return{sum:n,dataExtent:a}}function u(t,e,i){for(var n,r=0,o=1/0,a=0,s=t.length;s>a;a++)n=t[a].getLayout().area,n&&(o>n&&(o=n),n>r&&(r=n));var l=t.area*t.area,u=e*e*i;return l?x(u*r/l,l/(u*o)):1/0}function h(t,e,i,n,r){var o=e===i.width?0:1,a=1-o,s=[\"x\",\"y\"],l=[\"width\",\"height\"],u=i[s[o]],h=e?t.area/e:0;(r||h>i[l[a]])&&(h=i[l[a]]);for(var c=0,d=t.length;d>c;c++){var f=t[c],p={},g=h?f.getLayout().area/h:0,v=p[l[a]]=x(h-2*n,0),m=i[s[o]]+i[l[o]]-u,y=c===d-1||g>m?m:g,b=p[l[o]]=x(y-2*n,0);p[s[a]]=i[s[a]]+_(n,v/2),p[s[o]]=u+_(n,b/2),u+=y,f.setLayout(p,!0)}i[s[a]]+=h,i[l[a]]-=h}function c(t,e,i,n,r){var o=(e||{}).node,a=[n,r];if(!o||o===i)return a;for(var s,l=n*r,u=l*t.option.zoomToNodeRatio;s=o.parentNode;){for(var h=0,c=s.children,d=0,f=c.length;f>d;d++)h+=c[d].getValue();var p=o.getValue();if(0===p)return a;u*=h/p;var v=s.getModel(\"itemStyle.normal\").get(\"borderWidth\");isFinite(v)&&(u+=4*v*v+4*v*Math.pow(u,.5)),u>g.MAX_SAFE_INTEGER&&(u=g.MAX_SAFE_INTEGER),o=s}l>u&&(u=l);var m=Math.pow(u/l,.5);return[n*m,r*m]}function d(t,e,i){if(e)return{x:e.x,y:e.y};var n={x:0,y:0};if(!i)return n;var r=i.node,o=r.getLayout();if(!o)return n;for(var a=[o.width/2,o.height/2],s=r;s;){var l=s.getLayout();a[0]+=l.x,a[1]+=l.y,s=s.parentNode}return{x:t.width/2-a[0],y:t.height/2-a[1]}}function f(t,e,i,n,r){var o=t.getLayout(),a=i[r],s=a&&a===t;if(!(a&&!s||r===i.length&&t!==n)){t.setLayout({isInView:!0,invisible:!s&&!e.intersect(o),isAboveViewRoot:s},!0);var l=new y(e.x-o.x,e.y-o.y,e.width,e.height);S(t.viewChildren||[],function(t){f(t,l,i,n,r+1)})}}var p=i(1),g=i(4),v=i(13),m=i(170),y=i(7),m=i(170),x=Math.max,_=Math.min,b=g.parsePercent,w=p.retrieve,S=p.each;t.exports=n},function(t,e,i){function n(t,e,i,s,u,c){var d=t.getModel(),p=t.getLayout();if(p&&!p.invisible&&p.isInView){var v,m=t.getModel(g),y=i[t.depth],x=r(m,e,y,s),_=m.get(\"borderColor\"),b=m.get(\"borderColorSaturation\");null!=b&&(v=o(x,t),_=a(b,v)),t.setVisual(\"borderColor\",_);var w=t.viewChildren;if(w&&w.length){var S=l(t,d,p,m,x,w);f.each(w,function(t,e){if(t.depth>=u.length||t===u[t.depth]){var r=h(d,x,t,e,S,c);n(t,r,i,s,u,c)}})}else v=o(x,t),t.setVisual(\"color\",v)}}function r(t,e,i,n){var r=f.extend({},e);return f.each([\"color\",\"colorAlpha\",\"colorSaturation\"],function(o){var a=t.get(o,!0);null==a&&i&&(a=i[o]),null==a&&(a=e[o]),null==a&&(a=n.get(o)),null!=a&&(r[o]=a)}),r}function o(t){var e=s(t,\"color\");if(e){var i=s(t,\"colorAlpha\"),n=s(t,\"colorSaturation\");return n&&(e=d.modifyHSL(e,null,null,n)),i&&(e=d.modifyAlpha(e,i)),e}}function a(t,e){return null!=e?d.modifyHSL(e,null,null,t):null}function s(t,e){var i=t[e];return null!=i&&\"none\"!==i?i:void 0}function l(t,e,i,n,r,o){if(o&&o.length){var a=u(e,\"color\")||null!=r.color&&\"none\"!==r.color&&(u(e,\"colorAlpha\")||u(e,\"colorSaturation\"));if(a){var s=e.get(\"colorMappingBy\"),l={type:a.name,dataExtent:i.dataExtent,visual:a.range};\"color\"!==l.type||\"index\"!==s&&\"id\"!==s?l.mappingMethod=\"linear\":(l.mappingMethod=\"category\",l.loop=!0);var h=new c(l);return h.__drColorMappingBy=s,h}}}function u(t,e){var i=t.get(e);return p(i)&&i.length?{name:e,range:i}:null}function h(t,e,i,n,r,o){var a=f.extend({},e);if(r){var s=r.type,l=\"color\"===s&&r.__drColorMappingBy,u=\"index\"===l?n:\"id\"===l?o.mapIdToIndex(i.getId()):i.getValue(t.get(\"visualDimension\"));a[s]=r.mapValueToVisual(u)}return a}var c=i(71),d=i(18),f=i(1),p=f.isArray,g=\"itemStyle.normal\";t.exports=function(t,e,i){var r={mainType:\"series\",subType:\"treemap\",query:i};t.eachComponent(r,function(t){var e=t.getData().tree,i=e.root,r=t.getModel(g);if(!i.isRemoved()){var o=f.map(e.levelModels,function(t){return t?t.get(g):null});n(i,{},o,r,t.getViewRoot().getAncestors(),t)}})}},function(t,e,i){\"use strict\";i(215),i(318)},function(t,e,i){\"use strict\";function n(t,e,i,n){var r=t.coordToPoint([e,n]),o=t.coordToPoint([i,n]);return{x1:r[0],y1:r[1],x2:o[0],y2:o[1]}}var r=i(1),o=i(3),a=i(9),s=[\"axisLine\",\"axisLabel\",\"axisTick\",\"splitLine\",\"splitArea\"];i(2).extendComponentView({type:\"angleAxis\",render:function(t,e){if(this.group.removeAll(),t.get(\"show\")){var i=e.getComponent(\"polar\",t.get(\"polarIndex\")),n=t.axis,o=i.coordinateSystem,a=o.getRadiusAxis().getExtent(),l=n.getTicksCoords();\"category\"!==n.type&&l.pop(),r.each(s,function(e){t.get(e+\".show\")&&this[\"_\"+e](t,o,l,a)},this)}},_axisLine:function(t,e,i,n){var r=t.getModel(\"axisLine.lineStyle\"),a=new o.Circle({shape:{cx:e.cx,cy:e.cy,r:n[1]},style:r.getLineStyle(),z2:1,silent:!0});a.style.fill=null,this.group.add(a)},_axisTick:function(t,e,i,a){var s=t.getModel(\"axisTick\"),l=(s.get(\"inside\")?-1:1)*s.get(\"length\"),u=r.map(i,function(t){return new o.Line({shape:n(e,a[1],a[1]+l,t)})});this.group.add(o.mergePath(u,{style:r.defaults(s.getModel(\"lineStyle\").getLineStyle(),{stroke:t.get(\"axisLine.lineStyle.color\")})}))},_axisLabel:function(t,e,i,n){for(var r=t.axis,s=t.get(\"data\"),l=t.getModel(\"axisLabel\"),u=l.getModel(\"textStyle\"),h=t.getFormattedLabels(),c=l.get(\"margin\"),d=r.getLabelsCoords(),f=0;f<i.length;f++){var p=n[1],g=e.coordToPoint([p+c,d[f]]),v=e.cx,m=e.cy,y=Math.abs(g[0]-v)/p<.3?\"center\":g[0]>v?\"left\":\"right\",x=Math.abs(g[1]-m)/p<.3?\"middle\":g[1]>m?\"top\":\"bottom\",_=u;s&&s[f]&&s[f].textStyle&&(_=new a(s[f].textStyle,u)),this.group.add(new o.Text({style:{x:g[0],y:g[1],fill:_.getTextColor()||t.get(\"axisLine.lineStyle.color\"),text:h[f],textAlign:y,textVerticalAlign:x,textFont:_.getFont()},silent:!0}))}},_splitLine:function(t,e,i,a){var s=t.getModel(\"splitLine\"),l=s.getModel(\"lineStyle\"),u=l.get(\"color\"),h=0;u=u instanceof Array?u:[u];for(var c=[],d=0;d<i.length;d++){var f=h++%u.length;c[f]=c[f]||[],c[f].push(new o.Line({shape:n(e,a[0],a[1],i[d])}))}for(var d=0;d<c.length;d++)this.group.add(o.mergePath(c[d],{style:r.defaults({stroke:u[d%u.length]},l.getLineStyle()),silent:!0,z:t.get(\"z\")}))},_splitArea:function(t,e,i,n){var a=t.getModel(\"splitArea\"),s=a.getModel(\"areaStyle\"),l=s.get(\"color\"),u=0;l=l instanceof Array?l:[l];for(var h=[],c=Math.PI/180,d=-i[0]*c,f=Math.min(n[0],n[1]),p=Math.max(n[0],n[1]),g=t.get(\"clockwise\"),v=1;v<i.length;v++){var m=u++%l.length;h[m]=h[m]||[],h[m].push(new o.Sector({shape:{cx:e.cx,cy:e.cy,r0:f,r:p,startAngle:d,endAngle:-i[v]*c,clockwise:g},silent:!0})),d=-i[v]*c}for(var v=0;v<h.length;v++)this.group.add(o.mergePath(h[v],{style:r.defaults({fill:l[v%l.length]},s.getAreaStyle()),silent:!0}))}})},function(t,e,i){function n(t,e,i){return i&&\"axisAreaSelect\"===i.type&&e.findComponents({mainType:\"parallelAxis\",query:i})[0]===t}var r=i(1),o=i(50),a=i(111),s=i(3),l=[\"axisLine\",\"axisLabel\",\"axisTick\",\"axisName\"],u=i(2).extendComponentView({type:\"parallelAxis\",init:function(t,e){u.superApply(this,\"init\",arguments),(this._brushController=new a(e.getZr())).on(\"brush\",r.bind(this._onBrush,this))},render:function(t,e,i,a){if(!n(t,e,a)){this.axisModel=t,this.api=i,this.group.removeAll();var u=this._axisGroup;if(this._axisGroup=new s.Group,this.group.add(this._axisGroup),t.get(\"show\")){var h,c=e.getComponent(\"parallel\",t.get(\"parallelIndex\")).coordinateSystem,d=t.getAreaSelectStyle(),f=d.width,p=t.axis.dim,g=c.getAxisLayout(p),v=r.indexOf(c.dimensions,p),m=g.axisExpandWindow;m&&(v<=m[0]||v>=m[1])&&(h=!1);var y=r.extend({axisLabelShow:h,strokeContainThreshold:f},g),x=new o(t,y);r.each(l,x.add,x),this._axisGroup.add(x.getGroup()),this._refreshBrushController(y,d,t,f),s.groupTransition(u,this._axisGroup,t)}}},_refreshBrushController:function(t,e,i,n){var o=i.axis,a=r.map(i.activeIntervals,function(t){return{brushType:\"lineX\",panelId:\"pl\",range:[o.dataToCoord(t[0],!0),o.dataToCoord(t[1],!0)]}}),s=o.getExtent(),l=30,u={x:s[0]-l,y:-n/2,width:s[1]-s[0]+2*l,height:n};this._brushController.mount({enableGlobalPan:!0,rotation:t.rotation,position:t.position}).setPanels([{panelId:\"pl\",rect:u}]).enableBrush({brushType:\"lineX\",brushStyle:e,removeOnClick:!0}).updateCovers(a)},_onBrush:function(t,e){var i=this.axisModel,n=i.axis,o=r.map(t,function(t){return[n.coordToData(t.range[0],!0),n.coordToData(t.range[1],!0)]});(!i.option.realtime===e.isEnd||e.removeOnClick)&&this.api.dispatchAction({type:\"axisAreaSelect\",parallelAxisId:i.id,intervals:o})},dispose:function(){this._brushController.dispose()}});t.exports=u},function(t,e,i){\"use strict\";function n(t,e,i){return{position:[t.cx,t.cy],rotation:i/180*Math.PI,labelDirection:-1,tickDirection:-1,nameDirection:1,labelRotation:e.getModel(\"axisLabel\").get(\"rotate\"),z2:1}}var r=i(1),o=i(3),a=i(50),s=[\"axisLine\",\"axisLabel\",\"axisTick\",\"axisName\"],l=[\"splitLine\",\"splitArea\"];i(2).extendComponentView({type:\"radiusAxis\",render:function(t,e){if(this.group.removeAll(),t.get(\"show\")){var i=e.getComponent(\"polar\",t.get(\"polarIndex\")),o=i.coordinateSystem.getAngleAxis(),u=t.axis,h=i.coordinateSystem,c=u.getTicksCoords(),d=o.getExtent()[0],f=u.getExtent(),p=n(h,t,d),g=new a(t,p);r.each(s,g.add,g),this.group.add(g.getGroup()),r.each(l,function(e){t.get(e+\".show\")&&this[\"_\"+e](t,h,d,f,c)},this);\n}},_splitLine:function(t,e,i,n,a){var s=t.getModel(\"splitLine\"),l=s.getModel(\"lineStyle\"),u=l.get(\"color\"),h=0;u=u instanceof Array?u:[u];for(var c=[],d=0;d<a.length;d++){var f=h++%u.length;c[f]=c[f]||[],c[f].push(new o.Circle({shape:{cx:e.cx,cy:e.cy,r:a[d]},silent:!0}))}for(var d=0;d<c.length;d++)this.group.add(o.mergePath(c[d],{style:r.defaults({stroke:u[d%u.length],fill:null},l.getLineStyle()),silent:!0}))},_splitArea:function(t,e,i,n,a){var s=t.getModel(\"splitArea\"),l=s.getModel(\"areaStyle\"),u=l.get(\"color\"),h=0;u=u instanceof Array?u:[u];for(var c=[],d=a[0],f=1;f<a.length;f++){var p=h++%u.length;c[p]=c[p]||[],c[p].push(new o.Sector({shape:{cx:e.cx,cy:e.cy,r0:d,r:a[f],startAngle:0,endAngle:2*Math.PI},silent:!0})),d=a[f]}for(var f=0;f<c.length;f++)this.group.add(o.mergePath(c[f],{style:r.defaults({fill:u[f%u.length]},l.getAreaStyle()),silent:!0}))}})},function(t,e,i){function n(t){var e=t.coordinateSystem,i=t.axis,n={},r=i.position,o=i.orient,a=e.getRect(),s=[a.x,a.x+a.width,a.y,a.y+a.height],l={horizontal:{top:s[2],bottom:s[3]},vertical:{left:s[0],right:s[1]}};n.position=[\"vertical\"===o?l.vertical[r]:s[0],\"horizontal\"===o?l.horizontal[r]:s[3]];var u={horizontal:0,vertical:1};n.rotation=Math.PI/2*u[o];var h={top:-1,bottom:1,right:1,left:-1};n.labelDirection=n.tickDirection=n.nameDirection=h[r],t.getModel(\"axisTick\").get(\"inside\")&&(n.tickDirection=-n.tickDirection),t.getModel(\"axisLabel\").get(\"inside\")&&(n.labelDirection=-n.labelDirection);var c=t.getModel(\"axisLabel\").get(\"rotate\");return n.labelRotation=\"top\"===r?-c:c,n.labelInterval=i.getLabelInterval(),n.z2=1,n}var r=i(50),o=i(1),a=i(3),s=r.getInterval,l=r.ifIgnoreOnTick,u=[\"axisLine\",\"axisLabel\",\"axisTick\",\"axisName\"],h=\"splitLine\",c=i(2).extendComponentView({type:\"singleAxis\",render:function(t,e){var i=this.group;i.removeAll();var a=n(t),s=new r(t,a);o.each(u,s.add,s),i.add(s.getGroup()),t.get(h+\".show\")&&this[\"_\"+h](t,a.labelInterval)},_splitLine:function(t,e){var i=t.axis,n=t.getModel(\"splitLine\"),r=n.getModel(\"lineStyle\"),o=r.get(\"width\"),u=r.get(\"color\"),h=s(n,e);u=u instanceof Array?u:[u];for(var c=t.coordinateSystem.getRect(),d=i.isHorizontal(),f=[],p=0,g=i.getTicksCoords(),v=[],m=[],y=0;y<g.length;++y)if(!l(i,y,h)){var x=i.toGlobalCoord(g[y]);d?(v[0]=x,v[1]=c.y,m[0]=x,m[1]=c.y+c.height):(v[0]=c.x,v[1]=x,m[0]=c.x+c.width,m[1]=x);var _=p++%u.length;f[_]=f[_]||[],f[_].push(new a.Line(a.subPixelOptimizeLine({shape:{x1:v[0],y1:v[1],x2:m[0],y2:m[1]},style:{lineWidth:o},silent:!0})))}for(var y=0;y<f.length;++y)this.group.add(a.mergePath(f[y],{style:{stroke:u[y%u.length],lineDash:r.getLineDash(),lineWidth:o},silent:!0}))}});t.exports=c},function(t,e,i){var n=i(2),r={type:\"axisAreaSelect\",event:\"axisAreaSelected\",update:\"updateVisual\"};n.registerAction(r,function(t,e){e.eachComponent({mainType:\"parallelAxis\",query:t},function(e){e.axis.model.setActiveIntervals(t.intervals)})}),n.registerAction(\"parallelAxisExpand\",function(t,e){e.eachComponent({mainType:\"parallel\",query:t},function(e){e.setAxisExpand(t)})})},function(t,e,i){i(2).registerPreprocessor(i(327)),i(329),i(324),i(325),i(326),i(347)},function(t,e,i){var n=i(2),r=i(1),o=i(172),a=i(9),s=[\"#ddd\"],l=n.extendComponentModel({type:\"brush\",dependencies:[\"geo\",\"grid\",\"xAxis\",\"yAxis\",\"parallel\",\"series\"],defaultOption:{toolbox:null,brushLink:null,seriesIndex:\"all\",geoIndex:null,xAxisIndex:null,yAxisIndex:null,brushType:\"rect\",brushMode:\"single\",transformable:!0,brushStyle:{borderWidth:1,color:\"rgba(120,140,180,0.3)\",borderColor:\"rgba(120,140,180,0.8)\",width:null},throttleType:\"fixRate\",throttleDelay:0,removeOnClick:!0},areas:[],brushType:null,brushOption:{},coordInfoList:[],optionUpdated:function(t,e){var i=this.option;!e&&o.replaceVisualOption(i,t,[\"inBrush\",\"outOfBrush\"]),i.inBrush=i.inBrush||{},i.outOfBrush=i.outOfBrush||{color:s}},setAreas:function(t){t&&(this.areas=r.map(t,function(t){return this._mergeBrushOption(t)},this))},setBrushOption:function(t){this.brushOption=this._mergeBrushOption(t),this.brushType=this.brushOption.brushType},_mergeBrushOption:function(t){var e=this.option;return r.merge({brushType:e.brushType,brushMode:e.brushMode,transformable:e.transformable,brushStyle:new a(e.brushStyle).getItemStyle(),removeOnClick:e.removeOnClick},t,!0)}});t.exports=l},function(t,e,i){function n(t,e,i,n){(!n||n.$from!==t.id)&&this._brushController.setPanels(s.makePanelOpts(t.coordInfoList)).enableBrush(t.brushOption).updateCovers(t.areas.slice())}var r=i(1),o=i(111),a=i(2),s=i(112);t.exports=a.extendComponentView({type:\"brush\",init:function(t,e){this.ecModel=t,this.api=e,this.model,(this._brushController=new o(e.getZr())).on(\"brush\",r.bind(this._onBrush,this)).mount()},render:function(t){return this.model=t,n.apply(this,arguments)},updateView:n,updateLayout:n,updateVisual:n,dispose:function(){this._brushController.dispose()},_onBrush:function(t,e){var i=this.model.id;s.parseOutputRanges(t,this.model.coordInfoList,this.ecModel),(!e.isEnd||e.removeOnClick)&&this.api.dispatchAction({type:\"brush\",brushId:i,areas:r.clone(t),$from:i})}})},function(t,e,i){var n=i(2);n.registerAction({type:\"brush\",event:\"brush\",update:\"updateView\"},function(t,e){e.eachComponent({mainType:\"brush\",query:t},function(e){e.setAreas(t.areas)})}),n.registerAction({type:\"brushSelect\",event:\"brushSelected\",update:\"none\"},function(){})},function(t,e,i){function n(t){var e={};r.each(t,function(t){e[t]=1}),t.length=0,r.each(e,function(e,i){t.push(i)})}var r=i(1),o=[\"rect\",\"polygon\",\"keep\",\"clear\"];t.exports=function(t,e){var i=t&&t.brush;if(r.isArray(i)||(i=i?[i]:[]),i.length){var a=[];r.each(i,function(t){var e=t.hasOwnProperty(\"toolbox\")?t.toolbox:[];e instanceof Array&&(a=a.concat(e))});var s=t&&t.toolbox;r.isArray(s)&&(s=s[0]),s||(s={feature:{}},t.toolbox=[s]);var l=s.feature||(s.feature={}),u=l.brush||(l.brush={}),h=u.type||(u.type=[]);h.push.apply(h,a),n(h),e&&!h.length&&h.push.apply(h,o)}}},function(t,e,i){function n(t){var e=[\"x\",\"y\"],i=[\"width\",\"height\"];return{point:function(e,i,n){var o=n.range,a=e[t];return r(a,o)},rect:function(n,o,a){var s=a.range;return r(n[e[t]],s)||r(n[e[t]]+n[i[t]],s)}}}function r(t,e){return e[0]<=t&&t<=e[1]}function o(t,e,i,n,r){for(var o=0,s=r[r.length-1];o<r.length;o++){var l=r[o];if(a(t,e,i,n,l[0],l[1],s[0],s[1]))return!0;s=l}}function a(t,e,i,n,r,o,a,u){var h=l(i-t,r-a,n-e,o-u);if(s(h))return!1;var c=l(r-t,r-a,o-e,o-u)/h;if(0>c||c>1)return!1;var d=l(i-t,r-t,n-e,o-e)/h;return!(0>d||d>1)}function s(t){return 1e-6>=t&&t>=-1e-6}function l(t,e,i,n){return t*n-e*i}function u(t){var e=t.x,i=t.y,n=t.width,r=t.height;return 0>n&&(e+=n,n=-n),0>r&&(i+=r,r=-r),new c(e,i,n,r)}var h=i(241).contain,c=i(7),d={lineX:n(0),lineY:n(1),rect:{point:function(t,e,i){return i.boundingRect.contain(t[0],t[1])},rect:function(t,e,i){return i.boundingRect.intersect(u(t))}},polygon:{point:function(t,e,i){return i.boundingRect.contain(t[0],t[1])&&h(i.range,t[0],t[1])},rect:function(t,e,i){var n=i.range;if(n.length<=1)return!1;var r=t.x,a=t.y,s=t.width,l=t.height,c=n[0];return h(n,r,a)||h(n,r+s,a)||h(n,r,a+l)||h(n,r+s,a+l)||u(t).contain(c[0],c[1])||o(r,a,r+s,a,n)||o(r,a,r,a+l,n)||o(r+s,a,r+s,a+l,n)||o(r,a+l,r+s,a+l,n)?!0:void 0}}};t.exports=d},function(t,e,i){function n(t,e,i,n,o){if(o){var a=t.getZr();if(!a[x]){a[y]||(a[y]=r);var s=g.createOrUpdate(a,y,i,e);s(t,n)}}}function r(t,e){if(!t.isDisposed()){var i=t.getZr();i[x]=!0,t.dispatchAction({type:\"brushSelect\",batch:e}),i[x]=!1}}function o(t,e,i,n){for(var r=i.getItemLayout(n),o=0,a=e.length;a>o;o++){var s=e[o];if(t[s.brushType](r,s.selectors,s))return!0}}function a(t){var e=t.brushSelector;if(d.isString(e)){var i=[];return d.each(p,function(t,n){i[n]=t[e]}),i}if(d.isFunction(e)){var n={};return d.each(p,function(t,i){n[i]=e}),n}return e}function s(t,e){var i=t.option.seriesIndex;return null!=i&&\"all\"!==i&&(d.isArray(i)?d.indexOf(i,e)<0:e!==i)}function l(t){var e=t.selectors={};return d.each(p[t.brushType],function(i,n){e[n]=function(n){return i(n,e,t)}}),t}function u(t){return new f(t[0][0],t[1][0],t[0][1]-t[0][0],t[1][1]-t[1][0])}var h=i(2),c=i(172),d=i(1),f=i(7),p=i(328),g=i(81),v=i(112),m=[\"inBrush\",\"outOfBrush\"],y=\"__ecBrushSelect\",x=\"__ecInBrushSelectEvent\",_=h.PRIORITY.VISUAL.BRUSH;h.registerLayout(_,function(t,e,i){t.eachComponent({mainType:\"brush\"},function(e){i&&\"takeGlobalCursor\"===i.type&&e.setBrushOption(\"brush\"===i.key?i.brushOption:{brushType:!1}),e.coordInfoList=v.makeCoordInfoList(e.option,t),v.parseInputRanges(e,t)})}),h.registerVisual(_,function(t,e,i){var r,u,h=[];t.eachComponent({mainType:\"brush\"},function(e,i){function n(t){return\"all\"===_||w[t]}function f(t){return!!t.length}function p(t,e){var i=t.coordinateSystem;T|=i.hasAxisbrushed(),n(e)&&i.eachActiveState(t.getData(),function(t,e){\"active\"===t&&(S[e]=1)})}function g(t,i,r){var l=a(t);if(l&&!s(e,i)&&(d.each(A,function(i){l[i.brushType]&&v.controlSeries(i,e,t)&&r.push(i),T|=f(r)}),n(i)&&f(r))){var u=t.getData();u.each(function(t){o(l,r,u,t)&&(S[t]=1)})}}var y={brushId:e.id,brushIndex:i,brushName:e.name,areas:d.clone(e.areas),selected:[]};h.push(y);var x=e.option,_=x.brushLink,w=[],S=[],M=[],T=0;i||(r=x.throttleType,u=x.throttleDelay);var A=d.map(e.areas,function(t){return l(d.defaults({boundingRect:b[t.brushType](t)},t))}),I=c.createVisualMappings(e.option,m,function(t){t.mappingMethod=\"fixed\"});d.isArray(_)&&d.each(_,function(t){w[t]=1}),t.eachSeries(function(t,e){var i=M[e]=[];\"parallel\"===t.subType?p(t,e,i):g(t,e,i)}),t.eachSeries(function(t,e){var i={seriesId:t.id,seriesIndex:e,seriesName:t.name,dataIndex:[]};y.selected.push(i);var r=a(t),s=M[e],l=t.getData(),u=n(e)?function(t){return S[t]?(i.dataIndex.push(l.getRawIndex(t)),\"inBrush\"):\"outOfBrush\"}:function(t){return o(r,s,l,t)?(i.dataIndex.push(l.getRawIndex(t)),\"inBrush\"):\"outOfBrush\"};(n(e)?T:f(s))&&c.applyVisual(m,I,l,u)})}),n(e,r,u,h,i)});var b={lineX:d.noop,lineY:d.noop,rect:function(t){return u(t.range)},polygon:function(t){for(var e,i=t.range,n=0,r=i.length;r>n;n++){e=e||[[1/0,-(1/0)],[1/0,-(1/0)]];var o=i[n];o[0]<e[0][0]&&(e[0][0]=o[0]),o[0]>e[0][1]&&(e[0][1]=o[0]),o[1]<e[1][0]&&(e[1][0]=o[1]),o[1]>e[1][1]&&(e[1][1]=o[1])}return e&&u(e)}}},function(t,e,i){function n(t,e){e.update=\"updateView\",r.registerAction(e,function(e,i){var n={};return i.eachComponent({mainType:\"geo\",query:e},function(i){i[t](e.name);var r=i.coordinateSystem;o.each(r.regions,function(t){n[t.name]=i.isSelected(t.name)||!1})}),{selected:n,name:e.name}})}i(356),i(171),i(331),i(220);var r=i(2),o=i(1);n(\"toggleSelected\",{type:\"geoToggleSelect\",event:\"geoselectchanged\"}),n(\"select\",{type:\"geoSelect\",event:\"geoselected\"}),n(\"unSelect\",{type:\"geoUnSelect\",event:\"geounselected\"})},function(t,e,i){\"use strict\";var n=i(228);t.exports=i(2).extendComponentView({type:\"geo\",init:function(t,e){var i=new n(e,!0);this._mapDraw=i,this.group.add(i.group)},render:function(t,e,i,n){if(!n||\"geoToggleSelect\"!==n.type||n.from!==this.uid){var r=this._mapDraw;t.get(\"show\")?r.draw(t,e,i,this,n):this._mapDraw.group.removeAll(),this.group.silent=t.get(\"silent\")}}})},function(t,e,i){i(239),i(322),i(319)},function(t,e,i){\"use strict\";i(215),i(317),i(336),i(2).extendComponentView({type:\"polar\"})},function(t,e,i){i(372),i(373),i(335)},function(t,e,i){var n=i(50),r=i(1),o=i(3),a=[\"axisLine\",\"axisLabel\",\"axisTick\",\"axisName\"];t.exports=i(2).extendComponentView({type:\"radar\",render:function(t,e,i){var n=this.group;n.removeAll(),this._buildAxes(t),this._buildSplitLineAndArea(t)},_buildAxes:function(t){var e=t.coordinateSystem,i=e.getIndicatorAxes(),o=r.map(i,function(t){var i=new n(t.model,{position:[e.cx,e.cy],rotation:t.angle,labelDirection:-1,tickDirection:-1,nameDirection:1});return i});r.each(o,function(t){r.each(a,t.add,t),this.group.add(t.getGroup())},this)},_buildSplitLineAndArea:function(t){function e(t,e,i){var n=i%e.length;return t[n]=t[n]||[],n}var i=t.coordinateSystem,n=t.get(\"splitNumber\"),a=i.getIndicatorAxes();if(a.length){var s=t.get(\"shape\"),l=t.getModel(\"splitLine\"),u=t.getModel(\"splitArea\"),h=l.getModel(\"lineStyle\"),c=u.getModel(\"areaStyle\"),d=l.get(\"show\"),f=u.get(\"show\"),p=h.get(\"color\"),g=c.get(\"color\");p=r.isArray(p)?p:[p],g=r.isArray(g)?g:[g];var v=[],m=[];if(\"circle\"===s)for(var y=a[0].getTicksCoords(),x=i.cx,_=i.cy,b=0;b<y.length;b++){if(d){var w=e(v,p,b);v[w].push(new o.Circle({shape:{cx:x,cy:_,r:y[b]}}))}if(f&&b<y.length-1){var w=e(m,g,b);m[w].push(new o.Ring({shape:{cx:x,cy:_,r0:y[b],r:y[b+1]}}))}}else for(var S=r.map(a,function(t,e){var n=t.getTicksCoords();return r.map(n,function(t){return i.coordToPoint(t,e)})}),M=[],b=0;n>=b;b++){for(var T=[],A=0;A<a.length;A++)T.push(S[A][b]);if(T[0]&&T.push(T[0].slice()),d){var w=e(v,p,b);v[w].push(new o.Polyline({shape:{points:T}}))}if(f&&M){var w=e(m,g,b-1);m[w].push(new o.Polygon({shape:{points:T.concat(M)}}))}M=T.slice().reverse()}var I=h.getLineStyle(),L=c.getAreaStyle();r.each(m,function(t,e){this.group.add(o.mergePath(t,{style:r.defaults({stroke:\"none\",fill:g[e%g.length]},L),silent:!0}))},this),r.each(v,function(t,e){this.group.add(o.mergePath(t,{style:r.defaults({fill:\"none\",stroke:p[e%p.length]},I),silent:!0}))},this)}}})},function(t,e,i){i(215),i(320)},function(t,e,i){i(377),i(321),i(374);var n=i(2);n.extendComponentView({type:\"single\"})},function(t,e,i){var n=i(2);n.registerPreprocessor(i(344)),i(346),i(345),i(339),i(340)},function(t,e,i){var n=i(342),r=i(1),o=i(11),a=n.extend({type:\"timeline.slider\",defaultOption:{backgroundColor:\"rgba(0,0,0,0)\",borderColor:\"#ccc\",borderWidth:0,orient:\"horizontal\",inverse:!1,tooltip:{trigger:\"item\"},symbol:\"emptyCircle\",symbolSize:10,lineStyle:{show:!0,width:2,color:\"#304654\"},label:{position:\"auto\",normal:{show:!0,interval:\"auto\",rotate:0,textStyle:{color:\"#304654\"}},emphasis:{show:!0,textStyle:{color:\"#c23531\"}}},itemStyle:{normal:{color:\"#304654\",borderWidth:1},emphasis:{color:\"#c23531\"}},checkpointStyle:{symbol:\"circle\",symbolSize:13,color:\"#c23531\",borderWidth:5,borderColor:\"rgba(194,53,49, 0.5)\",animation:!0,animationDuration:300,animationEasing:\"quinticInOut\"},controlStyle:{show:!0,showPlayBtn:!0,showPrevBtn:!0,showNextBtn:!0,itemSize:22,itemGap:12,position:\"left\",playIcon:\"path://M31.6,53C17.5,53,6,41.5,6,27.4S17.5,1.8,31.6,1.8C45.7,1.8,57.2,13.3,57.2,27.4S45.7,53,31.6,53z M31.6,3.3 C18.4,3.3,7.5,14.1,7.5,27.4c0,13.3,10.8,24.1,24.1,24.1C44.9,51.5,55.7,40.7,55.7,27.4C55.7,14.1,44.9,3.3,31.6,3.3z M24.9,21.3 c0-2.2,1.6-3.1,3.5-2l10.5,6.1c1.899,1.1,1.899,2.9,0,4l-10.5,6.1c-1.9,1.1-3.5,0.2-3.5-2V21.3z\",stopIcon:\"path://M30.9,53.2C16.8,53.2,5.3,41.7,5.3,27.6S16.8,2,30.9,2C45,2,56.4,13.5,56.4,27.6S45,53.2,30.9,53.2z M30.9,3.5C17.6,3.5,6.8,14.4,6.8,27.6c0,13.3,10.8,24.1,24.101,24.1C44.2,51.7,55,40.9,55,27.6C54.9,14.4,44.1,3.5,30.9,3.5z M36.9,35.8c0,0.601-0.4,1-0.9,1h-1.3c-0.5,0-0.9-0.399-0.9-1V19.5c0-0.6,0.4-1,0.9-1H36c0.5,0,0.9,0.4,0.9,1V35.8z M27.8,35.8 c0,0.601-0.4,1-0.9,1h-1.3c-0.5,0-0.9-0.399-0.9-1V19.5c0-0.6,0.4-1,0.9-1H27c0.5,0,0.9,0.4,0.9,1L27.8,35.8L27.8,35.8z\",nextIcon:\"path://M18.6,50.8l22.5-22.5c0.2-0.2,0.3-0.4,0.3-0.7c0-0.3-0.1-0.5-0.3-0.7L18.7,4.4c-0.1-0.1-0.2-0.3-0.2-0.5 c0-0.4,0.3-0.8,0.8-0.8c0.2,0,0.5,0.1,0.6,0.3l23.5,23.5l0,0c0.2,0.2,0.3,0.4,0.3,0.7c0,0.3-0.1,0.5-0.3,0.7l-0.1,0.1L19.7,52 c-0.1,0.1-0.3,0.2-0.5,0.2c-0.4,0-0.8-0.3-0.8-0.8C18.4,51.2,18.5,51,18.6,50.8z\",prevIcon:\"path://M43,52.8L20.4,30.3c-0.2-0.2-0.3-0.4-0.3-0.7c0-0.3,0.1-0.5,0.3-0.7L42.9,6.4c0.1-0.1,0.2-0.3,0.2-0.5 c0-0.4-0.3-0.8-0.8-0.8c-0.2,0-0.5,0.1-0.6,0.3L18.3,28.8l0,0c-0.2,0.2-0.3,0.4-0.3,0.7c0,0.3,0.1,0.5,0.3,0.7l0.1,0.1L41.9,54 c0.1,0.1,0.3,0.2,0.5,0.2c0.4,0,0.8-0.3,0.8-0.8C43.2,53.2,43.1,53,43,52.8z\",normal:{color:\"#304654\",borderColor:\"#304654\",borderWidth:1},emphasis:{color:\"#c23531\",borderColor:\"#c23531\",borderWidth:2}},data:[]}});r.mixin(a,o.dataFormatMixin),t.exports=a},function(t,e,i){function n(t,e){return u.getLayoutRect(t.getBoxLayoutParams(),{width:e.getWidth(),height:e.getHeight()},t.get(\"padding\"))}function r(t,e,i,n){var r=l.makePath(t.get(e).replace(/^path:\\/\\//,\"\"),s.clone(n||{}),new p(i[0],i[1],i[2],i[3]),\"center\");return r}function o(t,e,i,n,r,o){var a=t.get(\"symbol\"),l=e.get(\"color\"),u=t.get(\"symbolSize\"),h=u/2,c=e.getItemStyle([\"color\",\"symbol\",\"symbolSize\"]);return r?(r.setStyle(c),r.setColor(l),i.add(r),o&&o.onUpdate(r)):(r=d.createSymbol(a,-h,-h,u,u,l),i.add(r),o&&o.onCreate(r)),n=s.merge({rectHover:!0,style:c,z2:100},n,!0),r.attr(n),r}function a(t,e,i,n,r){if(!t.dragging){var o=n.getModel(\"checkpointStyle\"),a=i.dataToCoord(n.getData().get([\"value\"],e));r||!o.get(\"animation\",!0)?t.attr({position:[a,0]}):(t.stopAnimation(!0),t.animateTo({position:[a,0]},o.get(\"animationDuration\",!0),o.get(\"animationEasing\",!0)))}}var s=i(1),l=i(3),u=i(13),h=i(343),c=i(341),d=i(26),f=i(22),p=i(7),g=i(19),v=i(4),m=i(8),y=m.encodeHTML,x=s.bind,_=s.each,b=Math.PI;t.exports=h.extend({type:\"timeline.slider\",init:function(t,e){this.api=e,this._axis,this._viewRect,this._timer,this._currentPointer,this._mainGroup,this._labelGroup},render:function(t,e,i,n){if(this.model=t,this.api=i,this.ecModel=e,this.group.removeAll(),t.get(\"show\",!0)){var r=this._layout(t,i),o=this._createGroup(\"mainGroup\"),a=this._createGroup(\"labelGroup\"),s=this._axis=this._createAxis(r,t);t.formatTooltip=function(t){return y(s.scale.getLabel(t))},_([\"AxisLine\",\"AxisTick\",\"Control\",\"CurrentPointer\"],function(e){this[\"_render\"+e](r,o,s,t)},this),this._renderAxisLabel(r,a,s,t),this._position(r,t)}this._doPlayStop()},remove:function(){this._clearTimer(),this.group.removeAll()},dispose:function(){this._clearTimer()},_layout:function(t,e){var i=t.get(\"label.normal.position\"),r=t.get(\"orient\"),o=n(t,e);null==i||\"auto\"===i?i=\"horizontal\"===r?o.y+o.height/2<e.getHeight()/2?\"-\":\"+\":o.x+o.width/2<e.getWidth()/2?\"+\":\"-\":isNaN(i)&&(i={horizontal:{top:\"-\",bottom:\"+\"},vertical:{left:\"-\",right:\"+\"}}[r][i]);var a={horizontal:\"center\",vertical:i>=0||\"+\"===i?\"left\":\"right\"},s={horizontal:i>=0||\"+\"===i?\"top\":\"bottom\",vertical:\"middle\"},l={horizontal:0,vertical:b/2},u=\"vertical\"===r?o.height:o.width,h=t.getModel(\"controlStyle\"),c=h.get(\"show\"),d=c?h.get(\"itemSize\"):0,f=c?h.get(\"itemGap\"):0,p=d+f,g=t.get(\"label.normal.rotate\")||0;g=g*b/180;var v,m,y,x,_=h.get(\"position\",!0),c=h.get(\"show\",!0),w=c&&h.get(\"showPlayBtn\",!0),S=c&&h.get(\"showPrevBtn\",!0),M=c&&h.get(\"showNextBtn\",!0),T=0,A=u;return\"left\"===_||\"bottom\"===_?(w&&(v=[0,0],T+=p),S&&(m=[T,0],T+=p),M&&(y=[A-d,0],A-=p)):(w&&(v=[A-d,0],A-=p),S&&(m=[0,0],T+=p),M&&(y=[A-d,0],A-=p)),x=[T,A],t.get(\"inverse\")&&x.reverse(),{viewRect:o,mainLength:u,orient:r,rotation:l[r],labelRotation:g,labelPosOpt:i,labelAlign:a[r],labelBaseline:s[r],playPosition:v,prevBtnPosition:m,nextBtnPosition:y,axisExtent:x,controlSize:d,controlGap:f}},_position:function(t,e){function i(t){var e=t.position;t.origin=[c[0][0]-e[0],c[1][0]-e[1]]}function n(t){return[[t.x,t.x+t.width],[t.y,t.y+t.height]]}function r(t,e,i,n,r){t[n]+=i[n][r]-e[n][r]}var o=this._mainGroup,a=this._labelGroup,s=t.viewRect;if(\"vertical\"===t.orient){var l=g.create(),u=s.x,h=s.y+s.height;g.translate(l,l,[-u,-h]),g.rotate(l,l,-b/2),g.translate(l,l,[u,h]),s=s.clone(),s.applyTransform(l)}var c=n(s),d=n(o.getBoundingRect()),f=n(a.getBoundingRect()),p=o.position,v=a.position;v[0]=p[0]=c[0][0];var m=t.labelPosOpt;if(isNaN(m)){var y=\"+\"===m?0:1;r(p,d,c,1,y),r(v,f,c,1,1-y)}else{var y=m>=0?0:1;r(p,d,c,1,y),v[1]=p[1]+m}o.attr(\"position\",p),a.attr(\"position\",v),o.rotation=a.rotation=t.rotation,i(o),i(a)},_createAxis:function(t,e){var i=e.getData(),n=e.get(\"axisType\"),r=f.createScaleByModel(e,n),o=i.getDataExtent(\"value\");r.setExtent(o[0],o[1]),this._customizeScale(r,i),r.niceTicks();var a=new c(\"value\",r,t.axisExtent,n);return a.model=e,a},_customizeScale:function(t,e){t.getTicks=function(){return e.mapArray([\"value\"],function(t){return t})},t.getTicksLabels=function(){return s.map(this.getTicks(),t.getLabel,t)}},_createGroup:function(t){var e=this[\"_\"+t]=new l.Group;return this.group.add(e),e},_renderAxisLine:function(t,e,i,n){var r=i.getExtent();n.get(\"lineStyle.show\")&&e.add(new l.Line({shape:{x1:r[0],y1:0,x2:r[1],y2:0},style:s.extend({lineCap:\"round\"},n.getModel(\"lineStyle\").getLineStyle()),silent:!0,z2:1}))},_renderAxisTick:function(t,e,i,n){var r=n.getData(),a=i.scale.getTicks();_(a,function(t,a){var s=i.dataToCoord(t),u=r.getItemModel(a),h=u.getModel(\"itemStyle.normal\"),c=u.getModel(\"itemStyle.emphasis\"),d={position:[s,0],onclick:x(this._changeTimeline,this,a)},f=o(u,h,e,d);l.setHoverStyle(f,c.getItemStyle()),u.get(\"tooltip\")?(f.dataIndex=a,f.dataModel=n):f.dataIndex=f.dataModel=null},this)},_renderAxisLabel:function(t,e,i,n){var r=n.getModel(\"label.normal\");if(r.get(\"show\")){var o=n.getData(),a=i.scale.getTicks(),s=f.getFormattedLabels(i,r.get(\"formatter\")),u=i.getLabelInterval();_(a,function(n,r){if(!i.isLabelIgnored(r,u)){var a=o.getItemModel(r),h=a.getModel(\"label.normal.textStyle\"),c=a.getModel(\"label.emphasis.textStyle\"),d=i.dataToCoord(n),f=new l.Text({style:{text:s[r],textAlign:t.labelAlign,textVerticalAlign:t.labelBaseline,textFont:h.getFont(),fill:h.getTextColor()},position:[d,0],rotation:t.labelRotation-t.rotation,onclick:x(this._changeTimeline,this,r),silent:!1});e.add(f),l.setHoverStyle(f,c.getItemStyle())}},this)}},_renderControl:function(t,e,i,n){function o(t,i,o,d){if(t){var f={position:t,origin:[a/2,0],rotation:d?-s:0,rectHover:!0,style:u,onclick:o},p=r(n,i,c,f);e.add(p),l.setHoverStyle(p,h)}}var a=t.controlSize,s=t.rotation,u=n.getModel(\"controlStyle.normal\").getItemStyle(),h=n.getModel(\"controlStyle.emphasis\").getItemStyle(),c=[0,-a/2,a,a],d=n.getPlayState(),f=n.get(\"inverse\",!0);o(t.nextBtnPosition,\"controlStyle.nextIcon\",x(this._changeTimeline,this,f?\"-\":\"+\")),o(t.prevBtnPosition,\"controlStyle.prevIcon\",x(this._changeTimeline,this,f?\"+\":\"-\")),o(t.playPosition,\"controlStyle.\"+(d?\"stopIcon\":\"playIcon\"),x(this._handlePlayClick,this,!d),!0)},_renderCurrentPointer:function(t,e,i,n){var r=n.getData(),s=n.getCurrentIndex(),l=r.getItemModel(s).getModel(\"checkpointStyle\"),u=this,h={onCreate:function(t){t.draggable=!0,t.drift=x(u._handlePointerDrag,u),t.ondragend=x(u._handlePointerDragend,u),a(t,s,i,n,!0)},onUpdate:function(t){a(t,s,i,n)}};this._currentPointer=o(l,l,this._mainGroup,{},this._currentPointer,h)},_handlePlayClick:function(t){this._clearTimer(),this.api.dispatchAction({type:\"timelinePlayChange\",playState:t,from:this.uid})},_handlePointerDrag:function(t,e,i){this._clearTimer(),this._pointerChangeTimeline([i.offsetX,i.offsetY])},_handlePointerDragend:function(t){this._pointerChangeTimeline([t.offsetX,t.offsetY],!0)},_pointerChangeTimeline:function(t,e){var i=this._toAxisCoord(t)[0],n=this._axis,r=v.asc(n.getExtent().slice());i>r[1]&&(i=r[1]),i<r[0]&&(i=r[0]),this._currentPointer.position[0]=i,this._currentPointer.dirty();var o=this._findNearestTick(i),a=this.model;(e||o!==a.getCurrentIndex()&&a.get(\"realtime\"))&&this._changeTimeline(o)},_doPlayStop:function(){function t(){var t=this.model;this._changeTimeline(t.getCurrentIndex()+(t.get(\"rewind\",!0)?-1:1))}this._clearTimer(),this.model.getPlayState()&&(this._timer=setTimeout(x(t,this),this.model.get(\"playInterval\")))},_toAxisCoord:function(t){var e=this._mainGroup.getLocalTransform();return l.applyTransform(t,e,!0)},_findNearestTick:function(t){var e,i=this.model.getData(),n=1/0,r=this._axis;return i.each([\"value\"],function(i,o){var a=r.dataToCoord(i),s=Math.abs(a-t);n>s&&(n=s,e=o)}),e},_clearTimer:function(){this._timer&&(clearTimeout(this._timer),this._timer=null)},_changeTimeline:function(t){var e=this.model.getCurrentIndex();\"+\"===t?t=e+1:\"-\"===t&&(t=e-1),this.api.dispatchAction({type:\"timelineChange\",currentIndex:t,from:this.uid})}})},function(t,e,i){var n=i(1),r=i(42),o=i(22),a=function(t,e,i,n){r.call(this,t,e,i),this.type=n||\"value\",this._autoLabelInterval,this.model=null};a.prototype={constructor:a,getLabelInterval:function(){var t=this.model,e=t.getModel(\"label.normal\"),i=e.get(\"interval\");if(null!=i&&\"auto\"!=i)return i;var i=this._autoLabelInterval;return i||(i=this._autoLabelInterval=o.getAxisLabelInterval(n.map(this.scale.getTicks(),this.dataToCoord,this),o.getFormattedLabels(this,e.get(\"formatter\")),e.getModel(\"textStyle\").getFont(),\"horizontal\"===t.get(\"orient\"))),i},isLabelIgnored:function(t){if(\"category\"===this.type){var e=this.getLabelInterval();return\"function\"==typeof e&&!e(t,this.scale.getLabel(t))||t%(e+1)}}},n.inherits(a,r),t.exports=a},function(t,e,i){var n=i(10),r=i(14),o=i(1),a=i(11),s=n.extend({type:\"timeline\",layoutMode:\"box\",defaultOption:{zlevel:0,z:4,show:!0,axisType:\"time\",realtime:!0,left:\"20%\",top:null,right:\"20%\",bottom:0,width:null,height:40,padding:5,controlPosition:\"left\",autoPlay:!1,rewind:!1,loop:!0,playInterval:2e3,currentIndex:0,itemStyle:{normal:{},emphasis:{}},label:{normal:{textStyle:{color:\"#000\"}},emphasis:{}},data:[]},init:function(t,e,i){this._data,this._names,this.mergeDefaultAndTheme(t,i),this._initData()},mergeOption:function(t){s.superApply(this,\"mergeOption\",arguments),this._initData()},setCurrentIndex:function(t){null==t&&(t=this.option.currentIndex);var e=this._data.count();this.option.loop?t=(t%e+e)%e:(t>=e&&(t=e-1),0>t&&(t=0)),this.option.currentIndex=t},getCurrentIndex:function(){return this.option.currentIndex},isIndexMax:function(){return this.getCurrentIndex()>=this._data.count()-1},setPlayState:function(t){this.option.autoPlay=!!t},getPlayState:function(){return!!this.option.autoPlay},_initData:function(){var t=this.option,e=t.data||[],i=t.axisType,n=this._names=[];if(\"category\"===i){var s=[];o.each(e,function(t,e){var i,r=a.getDataItemValue(t);o.isObject(t)?(i=o.clone(t),i.value=e):i=e,s.push(i),o.isString(r)||null!=r&&!isNaN(r)||(r=\"\"),n.push(r+\"\")}),e=s}var l={category:\"ordinal\",time:\"time\"}[i]||\"number\",u=this._data=new r([{name:\"value\",type:l}],this);u.initData(e,n)},getData:function(){return this._data},getCategories:function(){return\"category\"===this.get(\"axisType\")?this._names.slice():void 0}});t.exports=s},function(t,e,i){var n=i(57);t.exports=n.extend({type:\"timeline\"})},function(t,e,i){function n(t){var e=t.type,i={number:\"value\",time:\"time\"};if(i[e]&&(t.axisType=i[e],delete t.type),r(t),o(t,\"controlPosition\")){var n=t.controlStyle||(t.controlStyle={});o(n,\"position\")||(n.position=t.controlPosition),\"none\"!==n.position||o(n,\"show\")||(n.show=!1,delete n.position),delete t.controlPosition}a.each(t.data||[],function(t){a.isObject(t)&&!a.isArray(t)&&(!o(t,\"value\")&&o(t,\"name\")&&(t.value=t.name),r(t))})}function r(t){var e=t.itemStyle||(t.itemStyle={}),i=e.emphasis||(e.emphasis={}),n=t.label||t.label||{},r=n.normal||(n.normal={}),s={normal:1,emphasis:1};a.each(n,function(t,e){s[e]||o(r,e)||(r[e]=t)}),i.label&&!o(n,\"emphasis\")&&(n.emphasis=i.label,delete i.label)}function o(t,e){return t.hasOwnProperty(e)}var a=i(1);t.exports=function(t){var e=t&&t.timeline;a.isArray(e)||(e=e?[e]:[]),a.each(e,function(t){t&&n(t)})}},function(t,e,i){var n=i(2);n.registerAction({type:\"timelineChange\",event:\"timelineChanged\",update:\"prepareAndUpdate\"},function(t,e){var i=e.getComponent(\"timeline\");i&&null!=t.currentIndex&&(i.setCurrentIndex(t.currentIndex),!i.get(\"loop\",!0)&&i.isIndexMax()&&i.setPlayState(!1)),e.resetOption(\"timeline\")}),n.registerAction({type:\"timelinePlayChange\",event:\"timelinePlayChanged\",update:\"update\"},function(t,e){var i=e.getComponent(\"timeline\");i&&null!=t.playState&&i.setPlayState(t.playState)})},function(t,e,i){i(10).registerSubTypeDefaulter(\"timeline\",function(){return\"slider\"})},function(t,e,i){\"use strict\";function n(t,e,i){this.model=t,this.ecModel=e,this.api=i,this._brushType,this._brushMode}var r=i(25),o=i(1);n.defaultOption={show:!0,type:[\"rect\",\"polygon\",\"lineX\",\"lineY\",\"keep\",\"clear\"],icon:{rect:\"M7.3,34.7 M0.4,10V-0.2h9.8 M89.6,10V-0.2h-9.8 M0.4,60v10.2h9.8 M89.6,60v10.2h-9.8 M12.3,22.4V10.5h13.1 M33.6,10.5h7.8 M49.1,10.5h7.8 M77.5,22.4V10.5h-13 M12.3,31.1v8.2 M77.7,31.1v8.2 M12.3,47.6v11.9h13.1 M33.6,59.5h7.6 M49.1,59.5 h7.7 M77.5,47.6v11.9h-13\",polygon:\"M55.2,34.9c1.7,0,3.1,1.4,3.1,3.1s-1.4,3.1-3.1,3.1 s-3.1-1.4-3.1-3.1S53.5,34.9,55.2,34.9z M50.4,51c1.7,0,3.1,1.4,3.1,3.1c0,1.7-1.4,3.1-3.1,3.1c-1.7,0-3.1-1.4-3.1-3.1 C47.3,52.4,48.7,51,50.4,51z M55.6,37.1l1.5-7.8 M60.1,13.5l1.6-8.7l-7.8,4 M59,19l-1,5.3 M24,16.1l6.4,4.9l6.4-3.3 M48.5,11.6 l-5.9,3.1 M19.1,12.8L9.7,5.1l1.1,7.7 M13.4,29.8l1,7.3l6.6,1.6 M11.6,18.4l1,6.1 M32.8,41.9 M26.6,40.4 M27.3,40.2l6.1,1.6 M49.9,52.1l-5.6-7.6l-4.9-1.2\",lineX:\"M15.2,30 M19.7,15.6V1.9H29 M34.8,1.9H40.4 M55.3,15.6V1.9H45.9 M19.7,44.4V58.1H29 M34.8,58.1H40.4 M55.3,44.4 V58.1H45.9 M12.5,20.3l-9.4,9.6l9.6,9.8 M3.1,29.9h16.5 M62.5,20.3l9.4,9.6L62.3,39.7 M71.9,29.9H55.4\",lineY:\"M38.8,7.7 M52.7,12h13.2v9 M65.9,26.6V32 M52.7,46.3h13.2v-9 M24.9,12H11.8v9 M11.8,26.6V32 M24.9,46.3H11.8v-9 M48.2,5.1l-9.3-9l-9.4,9.2 M38.9-3.9V12 M48.2,53.3l-9.3,9l-9.4-9.2 M38.9,62.3V46.4\",keep:\"M4,10.5V1h10.3 M20.7,1h6.1 M33,1h6.1 M55.4,10.5V1H45.2 M4,17.3v6.6 M55.6,17.3v6.6 M4,30.5V40h10.3 M20.7,40 h6.1 M33,40h6.1 M55.4,30.5V40H45.2 M21,18.9h62.9v48.6H21V18.9z\",clear:\"M22,14.7l30.9,31 M52.9,14.7L22,45.7 M4.7,16.8V4.2h13.1 M26,4.2h7.8 M41.6,4.2h7.8 M70.3,16.8V4.2H57.2 M4.7,25.9v8.6 M70.3,25.9v8.6 M4.7,43.2v12.6h13.1 M26,55.8h7.8 M41.6,55.8h7.8 M70.3,43.2v12.6H57.2\"},title:{rect:\"矩形选择\",polygon:\"圈选\",lineX:\"横向选择\",lineY:\"纵向选择\",keep:\"保持选择\",clear:\"清除选择\"}};var a=n.prototype;a.render=a.updateView=a.updateLayout=function(t,e,i){var n,r,a;e.eachComponent({mainType:\"brush\"},function(t){n=t.brushType,r=t.brushOption.brushMode||\"single\",a|=t.areas.length}),this._brushType=n,this._brushMode=r,o.each(t.get(\"type\",!0),function(e){t.setIconStatus(e,(\"keep\"===e?\"multiple\"===r:\"clear\"===e?a:e===n)?\"emphasis\":\"normal\")})},a.getIcons=function(){var t=this.model,e=t.get(\"icon\",!0),i={};return o.each(t.get(\"type\",!0),function(t){e[t]&&(i[t]=e[t])}),i},a.onclick=function(t,e,i){var e=this.api,n=this._brushType,r=this._brushMode;\"clear\"===i?e.dispatchAction({type:\"brush\",areas:[]}):e.dispatchAction({type:\"takeGlobalCursor\",key:\"brush\",brushOption:{brushType:\"keep\"===i?n:n===i?!1:i,brushMode:\"keep\"===i?\"multiple\"===r?\"single\":\"multiple\":r}})},r.register(\"brush\",n),t.exports=n},function(t,e,i){i(353),i(354)},function(t,e,i){function n(t,e,i){var n=t.targetVisuals[e].color;if(!n)return i.slice();var r=n.option.visual.length;if(1>=r||i[0]===i[1])return i.slice();for(var o=(i[1]-i[0])/(r-1),a=i[0],s=[],l=0;r>l&&a<i[1];l++)s.push(a),a+=o;return s.push(i[1]),s}function r(t,e,i,r){var o=n(t,e,i);a.each(o,function(t){for(var i={value:t,valueState:e},n=0,o=0;o<r.length;o++){if(n|=\"inRange\"===r[o].valueState,t<r[o].value)return void r.splice(o,0,i);n&&(r[o].valueState=\"inRange\")}r.push(i)})}var o=i(230),a=i(1),s=i(4),l=[20,140],u=o.extend({type:\"visualMap.continuous\",defaultOption:{align:\"auto\",calculable:!1,range:null,realtime:!0,itemHeight:null,itemWidth:null,hoverLink:!0,hoverLinkDataSize:null,hoverLinkOnHandle:!0},optionUpdated:function(t,e){u.superApply(this,\"optionUpdated\",arguments),this.resetTargetSeries(),this.resetExtent(),this.resetVisual(function(t){t.mappingMethod=\"linear\",t.dataExtent=this.getExtent()}),this._resetRange()},resetItemSize:function(){u.superApply(this,\"resetItemSize\",arguments);var t=this.itemSize;\"horizontal\"===this._orient&&t.reverse(),(null==t[0]||isNaN(t[0]))&&(t[0]=l[0]),(null==t[1]||isNaN(t[1]))&&(t[1]=l[1])},_resetRange:function(){var t=this.getExtent(),e=this.option.range;!e||e.auto?(t.auto=1,this.option.range=t):a.isArray(e)&&(e[0]>e[1]&&e.reverse(),e[0]=Math.max(e[0],t[0]),e[1]=Math.min(e[1],t[1]))},completeVisualOption:function(){o.prototype.completeVisualOption.apply(this,arguments),a.each(this.stateList,function(t){var e=this.option.controller[t].symbolSize;e&&e[0]!==e[1]&&(e[0]=0)},this)},setSelected:function(t){this.option.range=t.slice(),this._resetRange()},getSelected:function(){var t=this.getExtent(),e=s.asc((this.get(\"range\")||[]).slice());return e[0]>t[1]&&(e[0]=t[1]),e[1]>t[1]&&(e[1]=t[1]),e[0]<t[0]&&(e[0]=t[0]),e[1]<t[0]&&(e[1]=t[0]),e},getValueState:function(t){var e=this.option.range,i=this.getExtent();return(e[0]<=i[0]||e[0]<=t)&&(e[1]>=i[1]||t<=e[1])?\"inRange\":\"outOfRange\"},findTargetDataIndices:function(t){var e=[];return this.eachTargetSeries(function(i){var n=[],r=i.getData();\nr.each(this.getDataDimension(r),function(e,i){t[0]<=e&&e<=t[1]&&n.push(i)},!0,this),e.push({seriesId:i.id,dataIndex:n})},this),e},getStops:function(t,e){var i=[];return r(this,\"outOfRange\",this.getExtent(),i),r(this,\"inRange\",this.option.range.slice(),i),a.each(i,function(t){t.color=e(this,t.value,t.valueState)},this),i}});t.exports=u},function(t,e,i){function n(t,e,i,n){return new u.Polygon({shape:{points:t},draggable:!!i,cursor:e,drift:i,ondragend:n})}function r(t,e){return 0===t?[[0,0],[e,0],[e,-e]]:[[0,0],[e,0],[e,e]]}function o(t,e,i,n){return t?[[0,-y(e,x(i,0))],[b,0],[0,y(e,x(n-i,0))]]:[[0,0],[5,-5],[5,5]]}function a(t,e,i){var n=_/2,r=t.get(\"hoverLinkDataSize\");return r&&(n=v(r,e,i,!0)/2),n}function s(t){return!t.get(\"realtime\")&&t.get(\"hoverLinkOnHandle\")}var l=i(231),u=i(3),h=i(1),c=i(4),d=i(79),f=i(85),p=i(232),g=i(11),v=c.linearMap,m=h.each,y=Math.min,x=Math.max,_=12,b=6,w=l.extend({type:\"visualMap.continuous\",init:function(){w.superApply(this,\"init\",arguments),this._shapes={},this._dataInterval=[],this._handleEnds=[],this._orient,this._useHandle,this._hoverLinkDataIndices=[],this._dragging,this._hovering},doRender:function(t,e,i,n){n&&\"selectDataRange\"===n.type&&n.from===this.uid||this._buildView()},_buildView:function(){this.group.removeAll();var t=this.visualMapModel,e=this.group;this._orient=t.get(\"orient\"),this._useHandle=t.get(\"calculable\"),this._resetInterval(),this._renderBar(e);var i=t.get(\"text\");this._renderEndsText(e,i,0),this._renderEndsText(e,i,1),this._updateView(!0),this.renderBackground(e),this._updateView(),this._enableHoverLinkToSeries(),this._enableHoverLinkFromSeries(),this.positionGroup(e)},_renderEndsText:function(t,e,i){if(e){var n=e[1-i];n=null!=n?n+\"\":\"\";var r=this.visualMapModel,o=r.get(\"textGap\"),a=r.itemSize,s=this._shapes.barGroup,l=this._applyTransform([a[0]/2,0===i?-o:a[1]+o],s),h=this._applyTransform(0===i?\"bottom\":\"top\",s),c=this._orient,d=this.visualMapModel.textStyleModel;this.group.add(new u.Text({style:{x:l[0],y:l[1],textVerticalAlign:\"horizontal\"===c?\"middle\":h,textAlign:\"horizontal\"===c?h:\"center\",text:n,textFont:d.getFont(),fill:d.getTextColor()}}))}},_renderBar:function(t){var e=this.visualMapModel,i=this._shapes,r=e.itemSize,o=this._orient,a=this._useHandle,s=p.getItemAlign(e,this.api,r),l=i.barGroup=this._createBarGroup(s);l.add(i.outOfRange=n()),l.add(i.inRange=n(null,a?\"move\":null,h.bind(this._dragHandle,this,\"all\",!1),h.bind(this._dragHandle,this,\"all\",!0)));var u=e.textStyleModel.getTextRect(\"国\"),c=x(u.width,u.height);a&&(i.handleThumbs=[],i.handleLabels=[],i.handleLabelPoints=[],this._createHandle(l,0,r,c,o,s),this._createHandle(l,1,r,c,o,s)),this._createIndicator(l,r,c,o),t.add(l)},_createHandle:function(t,e,i,o,a){var s=h.bind(this._dragHandle,this,e,!1),l=h.bind(this._dragHandle,this,e,!0),c=n(r(e,o),\"move\",s,l);c.position[0]=i[0],t.add(c);var d=this.visualMapModel.textStyleModel,f=new u.Text({draggable:!0,drift:s,ondragend:l,style:{x:0,y:0,text:\"\",textFont:d.getFont(),fill:d.getTextColor()}});this.group.add(f);var p=[\"horizontal\"===a?o/2:1.5*o,\"horizontal\"===a?0===e?-(1.5*o):1.5*o:0===e?-o/2:o/2],g=this._shapes;g.handleThumbs[e]=c,g.handleLabelPoints[e]=p,g.handleLabels[e]=f},_createIndicator:function(t,e,i,r){var o=n([[0,0]],\"move\");o.position[0]=e[0],o.attr({invisible:!0,silent:!0}),t.add(o);var a=this.visualMapModel.textStyleModel,s=new u.Text({silent:!0,invisible:!0,style:{x:0,y:0,text:\"\",textFont:a.getFont(),fill:a.getTextColor()}});this.group.add(s);var l=[\"horizontal\"===r?i/2:b+3,0],h=this._shapes;h.indicator=o,h.indicatorLabel=s,h.indicatorLabelPoint=l},_dragHandle:function(t,e,i,n){if(this._useHandle){if(this._dragging=!e,!e){var r=this._applyTransform([i,n],this._shapes.barGroup,!0);this._updateInterval(t,r[1]),this._updateView()}e===!this.visualMapModel.get(\"realtime\")&&this.api.dispatchAction({type:\"selectDataRange\",from:this.uid,visualMapId:this.visualMapModel.id,selected:this._dataInterval.slice()}),e?!this._hovering&&this._clearHoverLinkToSeries():s(this.visualMapModel)&&this._doHoverLinkToSeries(this._handleEnds[t],!1)}},_resetInterval:function(){var t=this.visualMapModel,e=this._dataInterval=t.getSelected(),i=t.getExtent(),n=[0,t.itemSize[1]];this._handleEnds=[v(e[0],i,n,!0),v(e[1],i,n,!0)]},_updateInterval:function(t,e){e=e||0;var i=this.visualMapModel,n=this._handleEnds;d(e,n,[0,i.itemSize[1]],\"all\"===t?\"rigid\":\"push\",t);var r=i.getExtent(),o=[0,i.itemSize[1]];this._dataInterval=[v(n[0],o,r,!0),v(n[1],o,r,!0)]},_updateView:function(t){var e=this.visualMapModel,i=e.getExtent(),n=this._shapes,r=[0,e.itemSize[1]],o=t?r:this._handleEnds,a=this._createBarVisual(this._dataInterval,i,o,\"inRange\"),s=this._createBarVisual(i,i,r,\"outOfRange\");n.inRange.setStyle({fill:a.barColor,opacity:a.opacity}).setShape(\"points\",a.barPoints),n.outOfRange.setStyle({fill:s.barColor,opacity:s.opacity}).setShape(\"points\",s.barPoints),this._updateHandle(o,a)},_createBarVisual:function(t,e,i,n){var r={forceState:n,convertOpacityToAlpha:!0},o=this._makeColorGradient(t,r),a=[this.getControllerVisual(t[0],\"symbolSize\",r),this.getControllerVisual(t[1],\"symbolSize\",r)],s=this._createBarPoints(i,a);return{barColor:new f(0,0,0,1,o),barPoints:s,handlesColor:[o[0].color,o[o.length-1].color]}},_makeColorGradient:function(t,e){var i=100,n=[],r=(t[1]-t[0])/i;n.push({color:this.getControllerVisual(t[0],\"color\",e),offset:0});for(var o=1;i>o;o++){var a=t[0]+r*o;if(a>t[1])break;n.push({color:this.getControllerVisual(a,\"color\",e),offset:o/i})}return n.push({color:this.getControllerVisual(t[1],\"color\",e),offset:1}),n},_createBarPoints:function(t,e){var i=this.visualMapModel.itemSize;return[[i[0]-e[0],t[0]],[i[0],t[0]],[i[0],t[1]],[i[0]-e[1],t[1]]]},_createBarGroup:function(t){var e=this._orient,i=this.visualMapModel.get(\"inverse\");return new u.Group(\"horizontal\"!==e||i?\"horizontal\"===e&&i?{scale:\"bottom\"===t?[-1,1]:[1,1],rotation:-Math.PI/2}:\"vertical\"!==e||i?{scale:\"left\"===t?[1,1]:[-1,1]}:{scale:\"left\"===t?[1,-1]:[-1,-1]}:{scale:\"bottom\"===t?[1,1]:[-1,1],rotation:Math.PI/2})},_updateHandle:function(t,e){if(this._useHandle){var i=this._shapes,n=this.visualMapModel,r=i.handleThumbs,o=i.handleLabels;m([0,1],function(a){var s=r[a];s.setStyle(\"fill\",e.handlesColor[a]),s.position[1]=t[a];var l=u.applyTransform(i.handleLabelPoints[a],u.getTransform(s,this.group));o[a].setStyle({x:l[0],y:l[1],text:n.formatValueText(this._dataInterval[a]),textVerticalAlign:\"middle\",textAlign:this._applyTransform(\"horizontal\"===this._orient?0===a?\"bottom\":\"top\":\"left\",i.barGroup)})},this)}},_showIndicator:function(t,e,i,n){var r=this.visualMapModel,a=r.getExtent(),s=r.itemSize,l=[0,s[1]],h=v(t,a,l,!0),c=this._shapes,d=c.indicator;if(d){d.position[1]=h,d.attr(\"invisible\",!1),d.setShape(\"points\",o(!!i,n,h,s[1]));var f={convertOpacityToAlpha:!0},p=this.getControllerVisual(t,\"color\",f);d.setStyle(\"fill\",p);var g=u.applyTransform(c.indicatorLabelPoint,u.getTransform(d,this.group)),m=c.indicatorLabel;m.attr(\"invisible\",!1);var y=this._applyTransform(\"left\",c.barGroup),x=this._orient;m.setStyle({text:(i?i:\"\")+r.formatValueText(e),textVerticalAlign:\"horizontal\"===x?y:\"middle\",textAlign:\"horizontal\"===x?\"center\":y,x:g[0],y:g[1]})}},_enableHoverLinkToSeries:function(){var t=this;this._shapes.barGroup.on(\"mousemove\",function(e){if(t._hovering=!0,!t._dragging){var i=t.visualMapModel.itemSize,n=t._applyTransform([e.offsetX,e.offsetY],t._shapes.barGroup,!0,!0);n[1]=y(x(0,n[1]),i[1]),t._doHoverLinkToSeries(n[1],0<=n[0]&&n[0]<=i[0])}}).on(\"mouseout\",function(){t._hovering=!1,!t._dragging&&t._clearHoverLinkToSeries()})},_enableHoverLinkFromSeries:function(){var t=this.api.getZr();this.visualMapModel.option.hoverLink?(t.on(\"mouseover\",this._hoverLinkFromSeriesMouseOver,this),t.on(\"mouseout\",this._hideIndicator,this)):this._clearHoverLinkFromSeries()},_doHoverLinkToSeries:function(t,e){var i=this.visualMapModel,n=i.itemSize;if(i.option.hoverLink){var r=[0,n[1]],o=i.getExtent();t=y(x(r[0],t),r[1]);var l=a(i,o,r),u=[t-l,t+l],h=v(t,r,o,!0),c=[v(u[0],r,o,!0),v(u[1],r,o,!0)];u[0]<r[0]&&(c[0]=-(1/0)),u[1]>r[1]&&(c[1]=1/0),e&&(c[0]===-(1/0)?this._showIndicator(h,c[1],\"< \",l):c[1]===1/0?this._showIndicator(h,c[0],\"> \",l):this._showIndicator(h,h,\"≈ \",l));var d=this._hoverLinkDataIndices,f=[];(e||s(i))&&(f=this._hoverLinkDataIndices=i.findTargetDataIndices(c));var p=g.compressBatches(d,f);this._dispatchHighDown(\"downplay\",p[0]),this._dispatchHighDown(\"highlight\",p[1])}},_hoverLinkFromSeriesMouseOver:function(t){var e=t.target;if(e&&null!=e.dataIndex){var i=e.dataModel||this.ecModel.getSeriesByIndex(e.seriesIndex),n=i.getData(e.dataType),r=n.getDimension(this.visualMapModel.getDataDimension(n)),o=n.get(r,e.dataIndex,!0);isNaN(o)||this._showIndicator(o,o)}},_hideIndicator:function(){var t=this._shapes;t.indicator&&t.indicator.attr(\"invisible\",!0),t.indicatorLabel&&t.indicatorLabel.attr(\"invisible\",!0)},_clearHoverLinkToSeries:function(){this._hideIndicator();var t=this._hoverLinkDataIndices;this._dispatchHighDown(\"downplay\",t),t.length=0},_clearHoverLinkFromSeries:function(){this._hideIndicator();var t=this.api.getZr();t.off(\"mouseover\",this._hoverLinkFromSeriesMouseOver),t.off(\"mouseout\",this._hideIndicator)},_applyTransform:function(t,e,i,n){var r=u.getTransform(e,n?null:this.group);return u[h.isArray(t)?\"applyTransform\":\"transformDirection\"](t,r,i)},_dispatchHighDown:function(t,e){e&&e.length&&this.api.dispatchAction({type:t,batch:e})},dispose:function(){this._clearHoverLinkFromSeries(),this._clearHoverLinkToSeries()},remove:function(){this._clearHoverLinkFromSeries(),this._clearHoverLinkToSeries()}});t.exports=w},function(t,e,i){function n(t,e){var i=t.inverse;(\"vertical\"===t.orient?!i:i)&&e.reverse()}function r(t){function e(t,i,n){return n=n||0,t.interval[n]<i.interval[n]||t.interval[n]===i.interval[n]&&(+t.close[n]>i.close[n]||e(t,i,1))}t.sort(function(t,i){return e(t,i)?-1:1});for(var i=-(1/0),n=0;n<t.length;n++)for(var r=t[n].interval,o=t[n].close,a=0;2>a;a++)r[a]<i&&(r[a]=i,o[a]=1-a),i=r[a]}var o=i(230),a=i(1),s=i(71),l=o.extend({type:\"visualMap.piecewise\",defaultOption:{selected:null,align:\"auto\",itemWidth:20,itemHeight:14,itemSymbol:\"roundRect\",pieceList:null,categories:null,splitNumber:5,selectedMode:\"multiple\",itemGap:10,hoverLink:!0},optionUpdated:function(t,e){l.superApply(this,\"optionUpdated\",arguments),this._pieceList=[],this.resetTargetSeries(),this.resetExtent();var i=this._mode=this._determineMode();u[this._mode].call(this),this._resetSelected(t,e);var n=this.option.categories;this.resetVisual(function(t,e){\"categories\"===i?(t.mappingMethod=\"category\",t.categories=a.clone(n)):(t.dataExtent=this.getExtent(),t.mappingMethod=\"piecewise\",t.pieceList=a.map(this._pieceList,function(t){var t=a.clone(t);return\"inRange\"!==e&&(t.visual=null),t}))})},_resetSelected:function(t,e){var i=this.option,n=this._pieceList,r=(e?i:t).selected||{};if(i.selected=r,a.each(n,function(t,e){var i=this.getSelectedMapKey(t);i in r||(r[i]=!0)},this),\"single\"===i.selectedMode){var o=!1;a.each(n,function(t,e){var i=this.getSelectedMapKey(t);r[i]&&(o?r[i]=!1:o=!0)},this)}},getSelectedMapKey:function(t){return\"categories\"===this._mode?t.value+\"\":t.index+\"\"},getPieceList:function(){return this._pieceList},_determineMode:function(){var t=this.option;return t.pieces&&t.pieces.length>0?\"pieces\":this.option.categories?\"categories\":\"splitNumber\"},setSelected:function(t){this.option.selected=a.clone(t)},getValueState:function(t){var e=s.findPieceIndex(t,this._pieceList);return null!=e&&this.option.selected[this.getSelectedMapKey(this._pieceList[e])]?\"inRange\":\"outOfRange\"},findTargetDataIndices:function(t){var e=[];return this.eachTargetSeries(function(i){var n=[],r=i.getData();r.each(this.getDataDimension(r),function(e,i){var r=s.findPieceIndex(e,this._pieceList);r===t&&n.push(i)},!0,this),e.push({seriesId:i.id,dataIndex:n})},this),e},getRepresentValue:function(t){var e;if(this.isCategory())e=t.value;else if(null!=t.value)e=t.value;else{var i=t.interval||[];e=(i[0]+i[1])/2}return e},getStops:function(t,e){function i(t){n.push(t),t.color=e(r,r.getRepresentValue(t),t.valueState)}var n=[],r=this,o=-(1/0);return a.each(this._pieceList,function(t){var e=t.interval;e&&(e[0]>o&&i({interval:[o,e[0]],valueState:\"outOfRange\"}),i({interval:e.slice(),valueState:this.getValueState((e[0]+e[1])/2)}),o=e[1])},this),n}}),u={splitNumber:function(){var t=this.option,e=this._pieceList,i=t.precision,n=this.getExtent(),o=t.splitNumber;o=Math.max(parseInt(o,10),1),t.splitNumber=o;for(var s=(n[1]-n[0])/o;+s.toFixed(i)!==s&&5>i;)i++;t.precision=i,s=+s.toFixed(i);for(var l=0,u=n[0];o>l;l++,u+=s){var h=l===o-1?n[1]:u+s;e.push({index:l,interval:[u,h],close:[1,1]})}r(e),a.each(e,function(t){t.text=this.formatValueText(t.interval)},this)},categories:function(){var t=this.option;a.each(t.categories,function(t){this._pieceList.push({text:this.formatValueText(t,!0),value:t})},this),n(t,this._pieceList)},pieces:function(){var t=this.option,e=this._pieceList;a.each(t.pieces,function(t,i){a.isObject(t)||(t={value:t});var n={text:\"\",index:i};if(null!=t.label&&(n.text=t.label),t.hasOwnProperty(\"value\")){var r=n.value=t.value;n.interval=[r,r],n.close=[1,1]}else{for(var o=n.interval=[],l=n.close=[0,0],u=[1,0,1],h=[-(1/0),1/0],c=[],d=0;2>d;d++){for(var f=[[\"gte\",\"gt\",\"min\"],[\"lte\",\"lt\",\"max\"]][d],p=0;3>p&&null==o[d];p++)o[d]=t[f[p]],l[d]=u[p],c[d]=2===p;null==o[d]&&(o[d]=h[d])}c[0]&&o[1]===1/0&&(l[0]=0),c[1]&&o[0]===-(1/0)&&(l[1]=0),o[0]===o[1]&&l[0]&&l[1]&&(n.value=o[0])}n.visual=s.retrieveVisuals(t),e.push(n)},this),n(t,e),r(e),a.each(e,function(t){var e=t.close,i=[[\"<\",\"≤\"][e[1]],[\">\",\"≥\"][e[0]]];t.text=t.text||this.formatValueText(null!=t.value?t.value:t.interval,!1,i)},this)}};t.exports=l},function(t,e,i){var n=i(231),r=i(1),o=i(3),a=i(26),s=i(13),l=i(232),u=n.extend({type:\"visualMap.piecewise\",doRender:function(){function t(t){var a=t.piece,s=new o.Group;s.onclick=r.bind(this._onItemClick,this,a),this._enableHoverLink(s,t.indexInModelPieceList);var d=i.getRepresentValue(a);if(this._createItemSymbol(s,d,[0,0,c[0],c[1]]),f){var p=this.visualMapModel.getValueState(d);s.add(new o.Text({style:{x:\"right\"===h?-n:c[0]+n,y:c[1]/2,text:a.text,textVerticalAlign:\"middle\",textAlign:h,textFont:l,fill:u,opacity:\"outOfRange\"===p?.5:1}}))}e.add(s)}var e=this.group;e.removeAll();var i=this.visualMapModel,n=i.get(\"textGap\"),a=i.textStyleModel,l=a.getFont(),u=a.getTextColor(),h=this._getItemAlign(),c=i.itemSize,d=this._getViewData(),f=!d.endsText,p=!f;p&&this._renderEndsText(e,d.endsText[0],c),r.each(d.viewPieceList,t,this),p&&this._renderEndsText(e,d.endsText[1],c),s.box(i.get(\"orient\"),e,i.get(\"itemGap\")),this.renderBackground(e),this.positionGroup(e)},_enableHoverLink:function(t,e){function i(t){var i=this.visualMapModel;i.option.hoverLink&&this.api.dispatchAction({type:t,batch:i.findTargetDataIndices(e)})}t.on(\"mouseover\",r.bind(i,this,\"highlight\")).on(\"mouseout\",r.bind(i,this,\"downplay\"))},_getItemAlign:function(){var t=this.visualMapModel,e=t.option;if(\"vertical\"===e.orient)return l.getItemAlign(t,this.api,t.itemSize);var i=e.align;return i&&\"auto\"!==i||(i=\"left\"),i},_renderEndsText:function(t,e,i){if(e){var n=new o.Group,r=this.visualMapModel.textStyleModel;n.add(new o.Text({style:{x:i[0]/2,y:i[1]/2,textVerticalAlign:\"middle\",textAlign:\"center\",text:e,textFont:r.getFont(),fill:r.getTextColor()}})),t.add(n)}},_getViewData:function(){var t=this.visualMapModel,e=r.map(t.getPieceList(),function(t,e){return{piece:t,indexInModelPieceList:e}}),i=t.get(\"text\"),n=t.get(\"orient\"),o=t.get(\"inverse\");return(\"horizontal\"===n?o:!o)?e.reverse():i&&(i=i.slice().reverse()),{viewPieceList:e,endsText:i}},_createItemSymbol:function(t,e,i){t.add(a.createSymbol(this.getControllerVisual(e,\"symbol\"),i[0],i[1],i[2],i[3],this.getControllerVisual(e,\"color\")))},_onItemClick:function(t){var e=this.visualMapModel,i=e.option,n=r.clone(i.selected),o=e.getSelectedMapKey(t);\"single\"===i.selectedMode?(n[o]=!0,r.each(n,function(t,e){n[e]=e===o})):n[o]=!n[o],this.api.dispatchAction({type:\"selectDataRange\",from:this.uid,visualMapId:this.visualMapModel.id,selected:n})}});t.exports=u},function(t,e,i){i(2).registerPreprocessor(i(233)),i(234),i(235),i(349),i(350),i(236)},function(t,e,i){i(2).registerPreprocessor(i(233)),i(234),i(235),i(351),i(352),i(236)},function(t,e,i){function n(t,e,i,n,r){s.call(this,t),this.map=e,this._nameCoordMap={},this.loadGeoJson(i,n,r)}var r=i(360),o=i(1),a=i(7),s=i(237),l=[i(358),i(359),i(357)];n.prototype={constructor:n,type:\"geo\",dimensions:[\"lng\",\"lat\"],containCoord:function(t){for(var e=this.regions,i=0;i<e.length;i++)if(e[i].contain(t))return!0;return!1},loadGeoJson:function(t,e,i){try{this.regions=t?r(t):[]}catch(n){throw\"Invalid geoJson format\\n\"+n}e=e||{},i=i||{};for(var a=this.regions,s={},u=0;u<a.length;u++){var h=a[u].name;h=i[h]||h,a[u].name=h,s[h]=a[u],this.addGeoCoord(h,a[u].center);var c=e[h];c&&a[u].transformTo(c.left,c.top,c.width,c.height)}this._regionsMap=s,this._rect=null,o.each(l,function(t){t(this)},this)},transformTo:function(t,e,i,n){var r=this.getBoundingRect();r=r.clone(),r.y=-r.y-r.height;var o=this._viewTransform;o.transform=r.calculateTransform(new a(t,e,i,n)),o.decomposeTransform();var s=o.scale;s[1]=-s[1],o.updateTransform(),this._updateTransform()},getRegion:function(t){return this._regionsMap[t]},getRegionByCoord:function(t){for(var e=this.regions,i=0;i<e.length;i++)if(e[i].contain(t))return e[i]},addGeoCoord:function(t,e){this._nameCoordMap[t]=e},getGeoCoord:function(t){return this._nameCoordMap[t]},getBoundingRect:function(){if(this._rect)return this._rect;for(var t,e=this.regions,i=0;i<e.length;i++){var n=e[i].getBoundingRect();t=t||n.clone(),t.union(n)}return this._rect=t||new a(0,0,0,0)},dataToPoints:function(t){var e=[];return t.mapArray([\"lng\",\"lat\"],function(t,i){return e[0]=t,e[1]=i,this.dataToPoint(e)},this)},dataToPoint:function(t){return\"string\"==typeof t&&(t=this.getGeoCoord(t)),t?s.prototype.dataToPoint.call(this,t):void 0}},o.mixin(n,s),t.exports=n},function(t,e,i){\"use strict\";var n=i(11),r=i(10),o=i(9),a=i(1),s=i(66),l=i(171),u=r.extend({type:\"geo\",coordinateSystem:null,layoutMode:\"box\",init:function(t){r.prototype.init.apply(this,arguments),n.defaultEmphasis(t.label,[\"position\",\"show\",\"textStyle\",\"distance\",\"formatter\"])},optionUpdated:function(){var t=this.option,e=this;t.regions=l.getFilledRegions(t.regions,t.map),this._optionModelMap=a.reduce(t.regions||[],function(t,i){return i.name&&(t[i.name]=new o(i,e)),t},{}),this.updateSelectedMap(t.regions)},defaultOption:{zlevel:0,z:0,show:!0,left:\"center\",top:\"center\",aspectScale:.75,silent:!1,map:\"\",center:null,zoom:1,scaleLimit:null,label:{normal:{show:!1,textStyle:{color:\"#000\"}},emphasis:{show:!0,textStyle:{color:\"rgb(100,0,0)\"}}},itemStyle:{normal:{borderWidth:.5,borderColor:\"#444\",color:\"#eee\"},emphasis:{color:\"rgba(255,215,0,0.8)\"}},regions:[]},getRegionModel:function(t){return this._optionModelMap[t]},getFormattedLabel:function(t,e){var i=this.get(\"label.\"+e+\".formatter\"),n={name:t};return\"function\"==typeof i?(n.status=e,i(n)):\"string\"==typeof i?i.replace(\"{a}\",n.seriesName):void 0},setZoom:function(t){this.option.zoom=t},setCenter:function(t){this.option.center=t}});a.mixin(u,s),t.exports=u},function(t,e,i){var n=i(1),r={Russia:[100,60],\"United States of America\":[-99,38]};t.exports=function(t){n.each(t.regions,function(t){var e=r[t.name];if(e){var i=t.center;i[0]=e[0],i[1]=e[1]}})}},function(t,e,i){for(var n=i(238),r=[126,25],o=[[[0,3.5],[7,11.2],[15,11.9],[30,7],[42,.7],[52,.7],[56,7.7],[59,.7],[64,.7],[64,0],[5,0],[0,3.5]],[[13,16.1],[19,14.7],[16,21.7],[11,23.1],[13,16.1]],[[12,32.2],[14,38.5],[15,38.5],[13,32.2],[12,32.2]],[[16,47.6],[12,53.2],[13,53.2],[18,47.6],[16,47.6]],[[6,64.4],[8,70],[9,70],[8,64.4],[6,64.4]],[[23,82.6],[29,79.8],[30,79.8],[25,82.6],[23,82.6]],[[37,70.7],[43,62.3],[44,62.3],[39,70.7],[37,70.7]],[[48,51.1],[51,45.5],[53,45.5],[50,51.1],[48,51.1]],[[51,35],[51,28.7],[53,28.7],[53,35],[51,35]],[[52,22.4],[55,17.5],[56,17.5],[53,22.4],[52,22.4]],[[58,12.6],[62,7],[63,7],[60,12.6],[58,12.6]],[[0,3.5],[0,93.1],[64,93.1],[64,0],[63,0],[63,92.4],[1,92.4],[1,3.5],[0,3.5]]],a=0;a<o.length;a++)for(var s=0;s<o[a].length;s++)o[a][s][0]/=10.5,o[a][s][1]/=-14,o[a][s][0]+=r[0],o[a][s][1]+=r[1];t.exports=function(t){\"china\"===t.map&&t.regions.push(new n(\"南海诸岛\",o,r))}},function(t,e,i){var n=i(1),r={\"南海诸岛\":[32,80],\"广东\":[0,-10],\"香港\":[10,5],\"澳门\":[-10,10],\"天津\":[5,5]};t.exports=function(t){n.each(t.regions,function(t){var e=r[t.name];if(e){var i=t.center;i[0]+=e[0]/10.5,i[1]+=-e[1]/14}})}},function(t,e,i){function n(t){if(!t.UTF8Encoding)return t;for(var e=t.features,i=0;i<e.length;i++)for(var n=e[i],o=n.geometry,a=o.coordinates,s=o.encodeOffsets,l=0;l<a.length;l++){var u=a[l];if(\"Polygon\"===o.type)a[l]=r(u,s[l]);else if(\"MultiPolygon\"===o.type)for(var h=0;h<u.length;h++){var c=u[h];u[h]=r(c,s[l][h])}}return t.UTF8Encoding=!1,t}function r(t,e){for(var i=[],n=e[0],r=e[1],o=0;o<t.length;o+=2){var a=t.charCodeAt(o)-64,s=t.charCodeAt(o+1)-64;a=a>>1^-(1&a),s=s>>1^-(1&s),a+=n,s+=r,n=a,r=s,i.push([a/1024,s/1024])}return i}function o(t){for(var e=[],i=0;i<t.length;i++)for(var n=0;n<t[i].length;n++)e.push(t[i][n]);return e}var a=i(1),s=i(238);t.exports=function(t){return n(t),a.map(a.filter(t.features,function(t){return t.geometry&&t.properties}),function(t){var e=t.properties,i=t.geometry,n=i.coordinates;return\"MultiPolygon\"===i.type&&(n=o(n)),new s(e.name,n,e.cp)})}},function(t,e,i){function n(t,e){return e.type||(e.data?\"category\":\"value\")}var r=i(10),o=i(1),a=i(31),s=i(52),l=i(4),u=r.extend({type:\"baseParallelAxis\",axis:null,activeIntervals:[],getAreaSelectStyle:function(){return a([[\"fill\",\"color\"],[\"lineWidth\",\"borderWidth\"],[\"stroke\",\"borderColor\"],[\"width\",\"width\"],[\"opacity\",\"opacity\"]]).call(this.getModel(\"areaSelectStyle\"))},setActiveIntervals:function(t){var e=this.activeIntervals=o.clone(t);if(e)for(var i=e.length-1;i>=0;i--)l.asc(e[i])},getActiveState:function(t){var e=this.activeIntervals;if(!e.length)return\"normal\";if(null==t)return\"inactive\";for(var i=0,n=e.length;n>i;i++)if(e[i][0]<=t&&t<=e[i][1])return\"active\";return\"inactive\"}}),h={type:\"value\",dim:null,areaSelectStyle:{width:20,borderWidth:1,borderColor:\"rgba(160,197,232)\",color:\"rgba(160,197,232)\",opacity:.3},realtime:!0,z:10};o.merge(u.prototype,i(51)),s(\"parallel\",u,n,h),t.exports=u},function(t,e,i){function n(t,e,i){this._axesMap={},this._axesLayout={},this.dimensions=t.dimensions,this._rect,this._model=t,this._init(t,e,i)}var r=i(13),o=i(22),a=i(1),s=i(363),l=i(3),u=i(19),h=a.each,c=Math.PI;n.prototype={type:\"parallel\",constructor:n,_init:function(t,e,i){var n=t.dimensions,r=t.parallelAxisIndex;h(n,function(t,i){var n=r[i],a=e.getComponent(\"parallelAxis\",n),l=this._axesMap[t]=new s(t,o.createScaleByModel(a),[0,0],a.get(\"type\"),n),u=\"category\"===l.type;l.onBand=u&&a.get(\"boundaryGap\"),l.inverse=a.get(\"inverse\"),a.axis=l,l.model=a},this)},update:function(t,e){this._updateAxesFromSeries(this._model,t)},_updateAxesFromSeries:function(t,e){e.eachSeries(function(i){if(t.contains(i,e)){var n=i.getData();h(this.dimensions,function(t){var e=this._axesMap[t];e.scale.unionExtent(n.getDataExtent(t)),o.niceScaleExtent(e,e.model)},this)}},this)},resize:function(t,e){this._rect=r.getLayoutRect(t.getBoxLayoutParams(),{width:e.getWidth(),height:e.getHeight()}),this._layoutAxes(t)},getRect:function(){return this._rect},_layoutAxes:function(t){var e=this._rect,i=t.get(\"layout\"),n=this._axesMap,r=this.dimensions,o=[e.width,e.height],a=\"horizontal\"===i?0:1,s=o[a],l=o[1-a],d=[0,l];h(n,function(t){var e=t.inverse?1:0;t.setExtent(d[e],d[1-e])});var f,p=t.get(\"axisExpandable\"),g=t.get(\"axisExpandWidth\"),v=t.get(\"axisExpandCenter\"),m=t.get(\"axisExpandCount\")||0;if(null!=v){var y=Math.max(0,Math.floor(v-(m-1)/2)),x=y+m-1;x>=r.length&&(x=r.length-1,y=Math.max(0,Math.floor(x-m+1))),f=[y,x]}var _=p&&f&&g?function(t,e,i){var n,r=f[1]-f[0],o=(e-g*r)/(i-1-r);return n=t<f[0]?(t-1)*o:t<=f[1]?f[0]*o+(t-f[0])*g:t===i-1?e:f[0]*o+r*g+(t-f[1])*o,{position:n,axisNameAvailableWidth:f[0]<t&&t<f[1]?g:o}}:function(t,e,i){var n=e/(i-1);return{position:n*t,axisNameAvailableWidth:n}};h(r,function(t,n){var o=_(n,s,r.length),a={horizontal:{x:o.position,y:l},vertical:{x:0,y:o.position}},h={horizontal:c/2,vertical:0},d=[a[i].x+e.x,a[i].y+e.y],p=h[i],g=u.create();u.rotate(g,g,p),u.translate(g,g,d),this._axesLayout[t]={position:d,rotation:p,transform:g,axisNameAvailableWidth:o.axisNameAvailableWidth,tickDirection:1,labelDirection:1,axisExpandWindow:f}},this)},getAxis:function(t){return this._axesMap[t]},dataToPoint:function(t,e){return this.axisCoordToPoint(this._axesMap[e].dataToCoord(t),e)},eachActiveState:function(t,e,i){for(var n=this.dimensions,r=this._axesMap,o=this.hasAxisbrushed(),a=0,s=t.count();s>a;a++){var l,u=t.getValues(n,a);if(o){l=\"active\";for(var h=0,c=n.length;c>h;h++){var d=n[h],f=r[d].model.getActiveState(u[h],h);if(\"inactive\"===f){l=\"inactive\";break}}}else l=\"normal\";e.call(i,l,a)}},hasAxisbrushed:function(){for(var t=this.dimensions,e=this._axesMap,i=!1,n=0,r=t.length;r>n;n++)\"normal\"!==e[t[n]].model.getActiveState()&&(i=!0);return i},axisCoordToPoint:function(t,e){var i=this._axesLayout[e];return l.applyTransform([t,0],i.transform)},getAxisLayout:function(t){return a.clone(this._axesLayout[t])},findClosestAxisDim:function(t){var e,i=1/0;return a.each(this._axesLayout,function(n,r){var o=l.applyTransform(t,n.transform,!0),a=this._axesMap[r].getExtent();if(!(o[0]<a[0]||o[0]>a[1])){var s=Math.abs(o[1]);i>s&&(i=s,e=r)}},this),e}},t.exports=n},function(t,e,i){var n=i(1),r=i(42),o=function(t,e,i,n,o){r.call(this,t,e,i),this.type=n||\"value\",this.axisIndex=o};o.prototype={constructor:o,model:null},n.inherits(o,r),t.exports=o},function(t,e,i){var n=i(1),r=i(10);i(361),r.extend({type:\"parallel\",dependencies:[\"parallelAxis\"],coordinateSystem:null,dimensions:null,parallelAxisIndex:null,layoutMode:\"box\",defaultOption:{zlevel:0,z:0,left:80,top:60,right:80,bottom:60,layout:\"horizontal\",axisExpandable:!1,axisExpandCenter:null,axisExpandCount:0,axisExpandWidth:50,parallelAxisDefault:null},init:function(){r.prototype.init.apply(this,arguments),this.mergeOption({})},mergeOption:function(t){var e=this.option;t&&n.merge(e,t,!0),this._initDimensions()},contains:function(t,e){var i=t.get(\"parallelIndex\");return null!=i&&e.getComponent(\"parallel\",i)===this},setAxisExpand:function(t){n.each([\"axisExpandable\",\"axisExpandCenter\",\"axisExpandCount\",\"axisExpandWidth\"],function(e){t.hasOwnProperty(e)&&(this.option[e]=t[e])},this)},_initDimensions:function(){var t=this.dimensions=[],e=this.parallelAxisIndex=[],i=n.filter(this.dependentModels.parallelAxis,function(t){return t.get(\"parallelIndex\")===this.componentIndex});n.each(i,function(i){t.push(\"dim\"+i.get(\"dim\")),e.push(i.componentIndex)})}})},function(t,e,i){function n(t){if(!t.parallel){var e=!1;o.each(t.series,function(t){t&&\"parallel\"===t.type&&(e=!0)}),e&&(t.parallel=[{}])}}function r(t){var e=a.normalizeToArray(t.parallelAxis);o.each(e,function(e){if(o.isObject(e)){var i=e.parallelIndex||0,n=a.normalizeToArray(t.parallel)[i];n&&n.parallelAxisDefault&&o.merge(e,n.parallelAxisDefault,!1)}})}var o=i(1),a=i(11);t.exports=function(t){n(t),r(t)}},function(t,e,i){\"use strict\";function n(t,e){e=e||[0,360],o.call(this,\"angle\",t,e),this.type=\"category\"}var r=i(1),o=i(42);n.prototype={constructor:n,dataToAngle:o.prototype.dataToCoord,angleToData:o.prototype.coordToData},r.inherits(n,o),t.exports=n},function(t,e,i){\"use strict\";function n(t,e){return e.type||(e.data?\"category\":\"value\")}var r=i(1),o=i(10),a=i(52),s=o.extend({type:\"polarAxis\",axis:null});r.merge(s.prototype,i(51));var l={angle:{startAngle:90,clockwise:!0,splitNumber:12,axisLabel:{rotate:!1}},radius:{splitNumber:5}};a(\"angle\",s,n,l.angle),a(\"radius\",s,n,l.radius)},function(t,e,i){\"use strict\";var n=i(370),r=i(366),o=function(t){this.name=t||\"\",this.cx=0,this.cy=0,this._radiusAxis=new n,this._angleAxis=new r};o.prototype={constructor:o,type:\"polar\",dimensions:[\"radius\",\"angle\"],containPoint:function(t){var e=this.pointToCoord(t);return this._radiusAxis.contain(e[0])&&this._angleAxis.contain(e[1])},containData:function(t){return this._radiusAxis.containData(t[0])&&this._angleAxis.containData(t[1])},getAxis:function(t){return this[\"_\"+t+\"Axis\"]},getAxesByScale:function(t){var e=[],i=this._angleAxis,n=this._radiusAxis;return i.scale.type===t&&e.push(i),n.scale.type===t&&e.push(n),e},getAngleAxis:function(){return this._angleAxis},getRadiusAxis:function(){return this._radiusAxis},getOtherAxis:function(t){var e=this._angleAxis;return t===e?this._radiusAxis:e},getBaseAxis:function(){return this.getAxesByScale(\"ordinal\")[0]||this.getAxesByScale(\"time\")[0]||this.getAngleAxis()},dataToPoints:function(t){return t.mapArray(this.dimensions,function(t,e){return this.dataToPoint([t,e])},this)},dataToPoint:function(t,e){return this.coordToPoint([this._radiusAxis.dataToRadius(t[0],e),this._angleAxis.dataToAngle(t[1],e)])},pointToData:function(t,e){var i=this.pointToCoord(t);return[this._radiusAxis.radiusToData(i[0],e),this._angleAxis.angleToData(i[1],e)]},pointToCoord:function(t){var e=t[0]-this.cx,i=t[1]-this.cy,n=this.getAngleAxis(),r=n.getExtent(),o=Math.min(r[0],r[1]),a=Math.max(r[0],r[1]);n.inverse?o=a-360:a=o+360;var s=Math.sqrt(e*e+i*i);e/=s,i/=s;for(var l=Math.atan2(-i,e)/Math.PI*180,u=o>l?1:-1;o>l||l>a;)l+=360*u;return[s,l]},coordToPoint:function(t){var e=t[0],i=t[1]/180*Math.PI,n=Math.cos(i)*e+this.cx,r=-Math.sin(i)*e+this.cy;return[n,r]}},t.exports=o},function(t,e,i){\"use strict\";i(367),i(2).extendComponentModel({type:\"polar\",dependencies:[\"polarAxis\",\"angleAxis\"],coordinateSystem:null,findAxisModel:function(t){var e,i=this.ecModel;return i.eachComponent(t,function(t){var n=i.queryComponents({mainType:\"polar\",index:t.getShallow(\"polarIndex\"),id:t.getShallow(\"polarId\")})[0];n===this&&(e=t)},this),e},defaultOption:{zlevel:0,z:0,center:[\"50%\",\"50%\"],radius:\"80%\"}})},function(t,e,i){\"use strict\";function n(t,e){o.call(this,\"radius\",t,e),this.type=\"category\"}var r=i(1),o=i(42);n.prototype={constructor:n,dataToRadius:o.prototype.dataToCoord,radiusToData:o.prototype.coordToData},r.inherits(n,o),t.exports=n},function(t,e,i){function n(t,e,i){o.call(this,t,e,i),this.type=\"value\",this.angle=0,this.name=\"\",this.model}var r=i(1),o=i(42);r.inherits(n,o),t.exports=n},function(t,e,i){function n(t,e,i){this._model=t,this.dimensions=[],this._indicatorAxes=r.map(t.getIndicatorModels(),function(t,e){var i=\"indicator_\"+e,n=new o(i,new a);return n.name=t.get(\"name\"),n.model=t,t.axis=n,this.dimensions.push(i),n},this),this.resize(t,i),this.cx,this.cy,this.r,this.startAngle}var r=i(1),o=i(371),a=i(38),s=i(4),l=i(22);n.prototype.getIndicatorAxes=function(){return this._indicatorAxes},n.prototype.dataToPoint=function(t,e){var i=this._indicatorAxes[e];return this.coordToPoint(i.dataToCoord(t),e)},n.prototype.coordToPoint=function(t,e){var i=this._indicatorAxes[e],n=i.angle,r=this.cx+t*Math.cos(n),o=this.cy-t*Math.sin(n);return[r,o]},n.prototype.pointToData=function(t){var e=t[0]-this.cx,i=t[1]-this.cy,n=Math.sqrt(e*e+i*i);e/=n,i/=n;for(var r,o=Math.atan2(-i,e),a=1/0,s=-1,l=0;l<this._indicatorAxes.length;l++){var u=this._indicatorAxes[l],h=Math.abs(o-u.angle);a>h&&(r=u,s=l,a=h)}return[s,+(r&&r.coodToData(n))]},n.prototype.resize=function(t,e){var i=t.get(\"center\"),n=e.getWidth(),o=e.getHeight(),a=Math.min(n,o)/2;this.cx=s.parsePercent(i[0],n),this.cy=s.parsePercent(i[1],o),this.startAngle=t.get(\"startAngle\")*Math.PI/180,this.r=s.parsePercent(t.get(\"radius\"),a),r.each(this._indicatorAxes,function(t,e){t.setExtent(0,this.r);var i=this.startAngle+e*Math.PI*2/this._indicatorAxes.length;i=Math.atan2(Math.sin(i),Math.cos(i)),t.angle=i},this)},n.prototype.update=function(t,e){function i(t){var e=Math.pow(10,Math.floor(Math.log(t)/Math.LN10)),i=t/e;return 2===i?i=5:i*=2,i*e}var n=this._indicatorAxes,o=this._model;r.each(n,function(t){t.scale.setExtent(1/0,-(1/0))}),t.eachSeriesByType(\"radar\",function(e,i){if(\"radar\"===e.get(\"coordinateSystem\")&&t.getComponent(\"radar\",e.get(\"radarIndex\"))===o){\nvar a=e.getData();r.each(n,function(t){t.scale.unionExtent(a.getDataExtent(t.dim))})}},this);var a=o.get(\"splitNumber\");r.each(n,function(t,e){var n=l.getScaleExtent(t,t.model);l.niceScaleExtent(t,t.model);var r=t.model,o=t.scale,u=r.get(\"min\"),h=r.get(\"max\"),c=o.getInterval();if(null!=u&&null!=h)o.setInterval((h-u)/a);else if(null!=u){var d;do d=u+c*a,o.setExtent(+u,d),o.setInterval(c),c=i(c);while(d<n[1]&&isFinite(d)&&isFinite(n[1]))}else if(null!=h){var f;do f=h-c*a,o.setExtent(f,+h),o.setInterval(c),c=i(c);while(f>n[0]&&isFinite(f)&&isFinite(n[0]))}else{var p=o.getTicks().length-1;p>a&&(c=i(c));var g=Math.round((n[0]+n[1])/2/c)*c,v=Math.round(a/2);o.setExtent(s.round(g-v*c),s.round(g+(a-v)*c)),o.setInterval(c)}})},n.dimensions=[],n.create=function(t,e){var i=[];return t.eachComponent(\"radar\",function(r){var o=new n(r,t,e);i.push(o),r.coordinateSystem=o}),t.eachSeriesByType(\"radar\",function(t){\"radar\"===t.get(\"coordinateSystem\")&&(t.coordinateSystem=i[t.get(\"radarIndex\")||0])}),i},i(23).register(\"radar\",n),t.exports=n},function(t,e,i){function n(t,e){return s.defaults({show:e},t)}var r=i(80),o=r.valueAxis,a=i(9),s=i(1),l=i(51),u=i(2).extendComponentModel({type:\"radar\",optionUpdated:function(){var t=this.get(\"boundaryGap\"),e=this.get(\"splitNumber\"),i=this.get(\"scale\"),n=this.get(\"axisLine\"),r=this.get(\"axisTick\"),o=this.get(\"axisLabel\"),u=this.get(\"name.textStyle\"),h=this.get(\"name.show\"),c=this.get(\"name.formatter\"),d=this.get(\"nameGap\"),f=s.map(this.get(\"indicator\")||[],function(f){return null!=f.max&&f.max>0&&!f.min?f.min=0:null!=f.min&&f.min<0&&!f.max&&(f.max=0),f=s.merge(s.clone(f),{boundaryGap:t,splitNumber:e,scale:i,axisLine:n,axisTick:r,axisLabel:o,name:f.text,nameLocation:\"end\",nameGap:d,nameTextStyle:u},!1),h||(f.name=\"\"),\"string\"==typeof c?f.name=c.replace(\"{value}\",f.name):\"function\"==typeof c&&(f.name=c(f.name,f)),s.extend(new a(f,null,this.ecModel),l)},this);this.getIndicatorModels=function(){return f}},defaultOption:{zlevel:0,z:0,center:[\"50%\",\"50%\"],radius:\"75%\",startAngle:90,name:{show:!0},boundaryGap:[0,0],splitNumber:5,nameGap:15,scale:!1,shape:\"polygon\",axisLine:s.merge({lineStyle:{color:\"#bbb\"}},o.axisLine),axisLabel:n(o.axisLabel,!1),axisTick:n(o.axisTick,!1),splitLine:n(o.splitLine,!0),splitArea:n(o.splitArea,!0),indicator:[]}});t.exports=u},function(t,e,i){function n(t,e){return e.type||(e.data?\"category\":\"value\")}var r=i(10),o=i(52),a=i(1),s=r.extend({type:\"singleAxis\",layoutMode:\"box\",axis:null,coordinateSystem:null}),l={left:\"5%\",top:\"5%\",right:\"5%\",bottom:\"5%\",type:\"value\",position:\"bottom\",orient:\"horizontal\",axisLine:{show:!0,lineStyle:{width:2,type:\"solid\"}},axisTick:{show:!0,length:6,lineStyle:{width:2}},axisLabel:{show:!0,interval:\"auto\"},splitLine:{show:!0,lineStyle:{type:\"dashed\",opacity:.2}}};a.merge(s.prototype,i(51)),o(\"single\",s,n,l),t.exports=s},function(t,e,i){function n(t,e,i){this.dimension=\"x\",this.dimensions=[\"x\"],this._axis=null,this._rect,this._init(t,e,i),this._model=t}var r=i(376),o=i(22),a=i(13);n.prototype={type:\"singleAxis\",constructor:n,_init:function(t,e,i){var n=this.dimension,a=new r(n,o.createScaleByModel(t),[0,0],t.get(\"type\"),t.get(\"position\")),s=\"category\"===a.type;a.onBand=s&&t.get(\"boundaryGap\"),a.inverse=t.get(\"inverse\"),a.orient=t.get(\"orient\"),t.axis=a,a.model=t,this._axis=a},update:function(t,e){this._updateAxisFromSeries(t)},_updateAxisFromSeries:function(t){t.eachSeries(function(t){var e=t.getData(),i=this.dimension;this._axis.scale.unionExtent(e.getDataExtent(t.coordDimToDataDim(i))),o.niceScaleExtent(this._axis,this._axis.model)},this)},resize:function(t,e){this._rect=a.getLayoutRect({left:t.get(\"left\"),top:t.get(\"top\"),right:t.get(\"right\"),bottom:t.get(\"bottom\"),width:t.get(\"width\"),height:t.get(\"height\")},{width:e.getWidth(),height:e.getHeight()}),this._adjustAxis()},getRect:function(){return this._rect},_adjustAxis:function(){var t=this._rect,e=this._axis,i=e.isHorizontal(),n=i?[0,t.width]:[0,t.height],r=e.reverse?1:0;e.setExtent(n[r],n[1-r]),this._updateAxisTransform(e,i?t.x:t.y)},_updateAxisTransform:function(t,e){var i=t.getExtent(),n=i[0]+i[1],r=t.isHorizontal();t.toGlobalCoord=r?function(t){return t+e}:function(t){return n-t+e},t.toLocalCoord=r?function(t){return t-e}:function(t){return n-t+e}},getAxis:function(){return this._axis},getBaseAxis:function(){return this._axis},containPoint:function(t){var e=this.getRect(),i=this.getAxis(),n=i.orient;return\"horizontal\"===n?i.contain(i.toLocalCoord(t[0]))&&t[1]>=e.y&&t[1]<=e.y+e.height:i.contain(i.toLocalCoord(t[1]))&&t[0]>=e.y&&t[0]<=e.y+e.height},pointToData:function(t){var e=this.getAxis();return[e.coordToData(e.toLocalCoord(t[\"horizontal\"===e.orient?0:1]))]},dataToPoint:function(t){var e=this.getAxis(),i=this.getRect(),n=[],r=\"horizontal\"===e.orient?0:1;return n[r]=e.toGlobalCoord(e.dataToCoord(+t)),n[1-r]=0===r?i.y+i.height/2:i.x+i.width/2,n}},t.exports=n},function(t,e,i){var n=i(1),r=i(42),o=i(22),a=function(t,e,i,n,o){r.call(this,t,e,i),this.type=n||\"value\",this.position=o||\"bottom\",this.orient=null,this._labelInterval=null};a.prototype={constructor:a,model:null,isHorizontal:function(){var t=this.position;return\"top\"===t||\"bottom\"===t},getLabelInterval:function(){var t=this._labelInterval;if(!t){var e=this.model,i=e.getModel(\"axisLabel\"),r=i.get(\"interval\");if(\"category\"!==this.type||\"auto\"!==r)return t=this._labelInterval=\"auto\"===r?0:r;t=this._labelInterval=o.getAxisLabelInterval(n.map(this.scale.getTicks(),this.dataToCoord,this),e.getFormattedLabels(),i.getModel(\"textStyle\").getFont(),this.isHorizontal())}return t},toGlobalCoord:null,toLocalCoord:null},n.inherits(a,r),t.exports=a},function(t,e,i){function n(t,e){var i=[];return t.eachComponent(\"singleAxis\",function(n,o){var a=new r(n,t,e);a.name=\"single_\"+o,a.resize(n,e),n.coordinateSystem=a,i.push(a)}),t.eachSeries(function(e){if(\"singleAxis\"===e.get(\"coordinateSystem\")){var i=t.queryComponents({mainType:\"singleAxis\",index:e.get(\"singleAxisIndex\"),id:e.get(\"singleAxisId\")})[0];e.coordinateSystem=i.coordinateSystem}}),i}var r=i(375);i(23).register(\"single\",{create:n,dimensions:r.prototype.dimensions})},function(t,e,i){\"use strict\";function n(t,e){this.id=null==t?\"\":t,this.inEdges=[],this.outEdges=[],this.edges=[],this.hostGraph,this.dataIndex=null==e?-1:e}function r(t,e,i){this.node1=t,this.node2=e,this.dataIndex=null==i?-1:i}var o=i(1),a=function(t){this._directed=t||!1,this.nodes=[],this.edges=[],this._nodesMap={},this._edgesMap={},this.data,this.edgeData},s=a.prototype;s.type=\"graph\",s.isDirected=function(){return this._directed},s.addNode=function(t,e){t=t||\"\"+e;var i=this._nodesMap;if(!i[t]){var r=new n(t,e);return r.hostGraph=this,this.nodes.push(r),i[t]=r,r}},s.getNodeByIndex=function(t){var e=this.data.getRawIndex(t);return this.nodes[e]},s.getNodeById=function(t){return this._nodesMap[t]},s.addEdge=function(t,e,i){var o=this._nodesMap,a=this._edgesMap;if(\"number\"==typeof t&&(t=this.nodes[t]),\"number\"==typeof e&&(e=this.nodes[e]),t instanceof n||(t=o[t]),e instanceof n||(e=o[e]),t&&e){var s=t.id+\"-\"+e.id;if(!a[s]){var l=new r(t,e,i);return l.hostGraph=this,this._directed&&(t.outEdges.push(l),e.inEdges.push(l)),t.edges.push(l),t!==e&&e.edges.push(l),this.edges.push(l),a[s]=l,l}}},s.getEdgeByIndex=function(t){var e=this.edgeData.getRawIndex(t);return this.edges[e]},s.getEdge=function(t,e){t instanceof n&&(t=t.id),e instanceof n&&(e=e.id);var i=this._edgesMap;return this._directed?i[t+\"-\"+e]:i[t+\"-\"+e]||i[e+\"-\"+t]},s.eachNode=function(t,e){for(var i=this.nodes,n=i.length,r=0;n>r;r++)i[r].dataIndex>=0&&t.call(e,i[r],r)},s.eachEdge=function(t,e){for(var i=this.edges,n=i.length,r=0;n>r;r++)i[r].dataIndex>=0&&i[r].node1.dataIndex>=0&&i[r].node2.dataIndex>=0&&t.call(e,i[r],r)},s.breadthFirstTraverse=function(t,e,i,r){if(e instanceof n||(e=this._nodesMap[e]),e){for(var o=\"out\"===i?\"outEdges\":\"in\"===i?\"inEdges\":\"edges\",a=0;a<this.nodes.length;a++)this.nodes[a].__visited=!1;if(!t.call(r,e,null))for(var s=[e];s.length;)for(var l=s.shift(),u=l[o],a=0;a<u.length;a++){var h=u[a],c=h.node1===l?h.node2:h.node1;if(!c.__visited){if(t.call(c,c,l))return;s.push(c),c.__visited=!0}}}},s.update=function(){for(var t=this.data,e=this.edgeData,i=this.nodes,n=this.edges,r=0,o=i.length;o>r;r++)i[r].dataIndex=-1;for(var r=0,o=t.count();o>r;r++)i[t.getRawIndex(r)].dataIndex=r;e.filterSelf(function(t){var i=n[e.getRawIndex(t)];return i.node1.dataIndex>=0&&i.node2.dataIndex>=0});for(var r=0,o=n.length;o>r;r++)n[r].dataIndex=-1;for(var r=0,o=e.count();o>r;r++)n[e.getRawIndex(r)].dataIndex=r},s.clone=function(){for(var t=new a(this._directed),e=this.nodes,i=this.edges,n=0;n<e.length;n++)t.addNode(e[n].id,e[n].dataIndex);for(var n=0;n<i.length;n++){var r=i[n];t.addEdge(r.node1.id,r.node2.id,r.dataIndex)}return t},n.prototype={constructor:n,degree:function(){return this.edges.length},inDegree:function(){return this.inEdges.length},outDegree:function(){return this.outEdges.length},getModel:function(t){if(!(this.dataIndex<0)){var e=this.hostGraph,i=e.data.getItemModel(this.dataIndex);return i.getModel(t)}}},r.prototype.getModel=function(t){if(!(this.dataIndex<0)){var e=this.hostGraph,i=e.edgeData.getItemModel(this.dataIndex);return i.getModel(t)}};var l=function(t,e){return{getValue:function(i){var n=this[t][e];return n.get(n.getDimension(i||\"value\"),this.dataIndex)},setVisual:function(i,n){this.dataIndex>=0&&this[t][e].setItemVisual(this.dataIndex,i,n)},getVisual:function(i,n){return this[t][e].getItemVisual(this.dataIndex,i,n)},setLayout:function(i,n){this.dataIndex>=0&&this[t][e].setItemLayout(this.dataIndex,i,n)},getLayout:function(){return this[t][e].getItemLayout(this.dataIndex)},getGraphicEl:function(){return this[t][e].getItemGraphicEl(this.dataIndex)},getRawIndex:function(){return this[t][e].getRawIndex(this.dataIndex)}}};o.mixin(n,l(\"hostGraph\",\"data\")),o.mixin(r,l(\"hostGraph\",\"edgeData\")),a.Node=n,a.Edge=r,t.exports=a},function(t,e,i){function n(t,e){this.root,this.data,this._nodes=[],this.hostModel=t,this.levelModels=o.map(e||[],function(e){return new a(e,t,t.ecModel)})}function r(t,e){var i=e.children;t.parentNode!==e&&(i.push(t),t.parentNode=e)}var o=i(1),a=i(9),s=i(14),l=i(240),u=i(30),h=function(t,e){this.name=t||\"\",this.depth=0,this.height=0,this.parentNode=null,this.dataIndex=-1,this.children=[],this.viewChildren=[],this.hostTree=e};h.prototype={constructor:h,isRemoved:function(){return this.dataIndex<0},eachNode:function(t,e,i){\"function\"==typeof t&&(i=e,e=t,t=null),t=t||{},o.isString(t)&&(t={order:t});var n,r=t.order||\"preorder\",a=this[t.attr||\"children\"];\"preorder\"===r&&(n=e.call(i,this));for(var s=0;!n&&s<a.length;s++)a[s].eachNode(t,e,i);\"postorder\"===r&&e.call(i,this)},updateDepthAndHeight:function(t){var e=0;this.depth=t;for(var i=0;i<this.children.length;i++){var n=this.children[i];n.updateDepthAndHeight(t+1),n.height>e&&(e=n.height)}this.height=e+1},getNodeById:function(t){if(this.getId()===t)return this;for(var e=0,i=this.children,n=i.length;n>e;e++){var r=i[e].getNodeById(t);if(r)return r}},contains:function(t){if(t===this)return!0;for(var e=0,i=this.children,n=i.length;n>e;e++){var r=i[e].contains(t);if(r)return r}},getAncestors:function(t){for(var e=[],i=t?this:this.parentNode;i;)e.push(i),i=i.parentNode;return e.reverse(),e},getValue:function(t){var e=this.hostTree.data;return e.get(e.getDimension(t||\"value\"),this.dataIndex)},setLayout:function(t,e){this.dataIndex>=0&&this.hostTree.data.setItemLayout(this.dataIndex,t,e)},getLayout:function(){return this.hostTree.data.getItemLayout(this.dataIndex)},getModel:function(t){if(!(this.dataIndex<0)){var e=this.hostTree,i=e.data.getItemModel(this.dataIndex),n=this.getLevelModel();return i.getModel(t,(n||e.hostModel).getModel(t))}},getLevelModel:function(){return(this.hostTree.levelModels||[])[this.depth]},setVisual:function(t,e){this.dataIndex>=0&&this.hostTree.data.setItemVisual(this.dataIndex,t,e)},getVisual:function(t,e){return this.hostTree.data.getItemVisual(this.dataIndex,t,e)},getRawIndex:function(){return this.hostTree.data.getRawIndex(this.dataIndex)},getId:function(){return this.hostTree.data.getId(this.dataIndex)}},n.prototype={constructor:n,type:\"tree\",eachNode:function(t,e,i){this.root.eachNode(t,e,i)},getNodeByDataIndex:function(t){var e=this.data.getRawIndex(t);return this._nodes[e]},getNodeByName:function(t){return this.root.getNodeByName(t)},update:function(){for(var t=this.data,e=this._nodes,i=0,n=e.length;n>i;i++)e[i].dataIndex=-1;for(var i=0,n=t.count();n>i;i++)e[t.getRawIndex(i)].dataIndex=i},clearLayouts:function(){this.data.clearItemLayouts()}},n.createTree=function(t,e,i){function o(t,e){c.push(t);var i=new h(t.name,a);e?r(i,e):a.root=i,a._nodes.push(i);var n=t.children;if(n)for(var s=0;s<n.length;s++)o(n[s],i)}var a=new n(e,i),c=[];o(t),a.root.updateDepthAndHeight(0);var d=u([{name:\"value\"}],c),f=new s(d,e);return f.initData(c),l({mainData:f,struct:a,structAttr:\"tree\"}),a.update(),a},t.exports=n},function(t,e,i){function n(){var t,e=[],i={};return{add:function(t,n,o,a,s){return r.isString(a)&&(s=a,a=0),i[t.id]?!1:(i[t.id]=1,e.push({el:t,target:n,time:o,delay:a,easing:s}),!0)},done:function(e){return t=e,this},start:function(){function n(){r--,r||(e.length=0,i={},t&&t())}for(var r=e.length,o=0,a=e.length;a>o;o++){var s=e[o];s.el.animateTo(s.target,s.time,s.delay,s.easing,n)}return this}}}var r=i(1);t.exports={createWrap:n}},function(t,e,i){function n(){function t(e,n){if(n>=i.length)return e;for(var o=-1,a=e.length,s=i[n++],l={},u={};++o<a;){var h=s(e[o]),c=u[h];c?c.push(e[o]):u[h]=[e[o]]}return r.each(u,function(e,i){l[i]=t(e,n)}),l}function e(t,o){if(o>=i.length)return t;var a=[],s=n[o++];return r.each(t,function(t,i){a.push({key:i,values:e(t,o)})}),s?a.sort(function(t,e){return s(t.key,e.key)}):a}var i=[],n=[];return{key:function(t){return i.push(t),this},sortKeys:function(t){return n[i.length-1]=t,this},entries:function(i){return e(t(i,0),0)}}}var r=i(1);t.exports=n},function(t,e,i){var n=i(1),r={get:function(t,e,i){var r=n.clone((o[t]||{})[e]);return i&&n.isArray(r)?r[r.length-1]:r}},o={color:{active:[\"#006edd\",\"#e0ffff\"],inactive:[\"rgba(0,0,0,0)\"]},colorHue:{active:[0,360],inactive:[0,0]},colorSaturation:{active:[.3,1],inactive:[0,0]},colorLightness:{active:[.9,.5],inactive:[0,0]},colorAlpha:{active:[.3,1],inactive:[0,0]},opacity:{active:[.3,1],inactive:[0,0]},symbol:{active:[\"circle\",\"roundRect\",\"diamond\"],inactive:[\"none\"]},symbolSize:{active:[10,50],inactive:[0,0]}};t.exports=r}])});"
  },
  {
    "path": "public/js/greensock.js",
    "content": "(function(t, e) {\n    \"use strict\";\n    var i = t.GreenSockGlobals = t.GreenSockGlobals || t;\n    if (!i.TweenLite) {\n        var n, s, r, o, a, l = function(t) {\n            var e, n = t.split(\".\"), s = i;\n            for (e = 0; n.length > e; e++)\n                s[n[e]] = s = s[n[e]] || {};\n            return s\n        }\n        , h = l(\"com.greensock\"), u = 1e-10, _ = function(t) {\n            var e, i = [], n = t.length;\n            for (e = 0; e !== n; i.push(t[e++]))\n                ;\n            return i\n        }\n        , c = function() {}\n        , f = function() {\n            var t = Object.prototype.toString\n              , e = t.call([]);\n            return function(i) {\n                return null  != i && (i instanceof Array || \"object\" == typeof i && !!i.push && t.call(i) === e)\n            }\n        }(), p = {}, d = function(n, s, r, o) {\n            this.sc = p[n] ? p[n].sc : [],\n            p[n] = this,\n            this.gsClass = null ,\n            this.func = r;\n            var a = [];\n            this.check = function(h) {\n                for (var u, _, c, f, m = s.length, v = m; --m > -1; )\n                    (u = p[s[m]] || new d(s[m],[])).gsClass ? (a[m] = u.gsClass,\n                    v--) : h && u.sc.push(this);\n                if (0 === v && r)\n                    for (_ = (\"com.greensock.\" + n).split(\".\"),\n                    c = _.pop(),\n                    f = l(_.join(\".\"))[c] = this.gsClass = r.apply(r, a),\n                    o && (i[c] = f,\n                    \"function\" == typeof define && define.amd ? define((t.GreenSockAMDPath ? t.GreenSockAMDPath + \"/\" : \"\") + n.split(\".\").pop(), [], function() {\n                        return f\n                    }) : n === e && \"undefined\" != typeof module && module.exports && (module.exports = f)),\n                    m = 0; this.sc.length > m; m++)\n                        this.sc[m].check()\n            }\n            ,\n            this.check(!0)\n        }\n        , m = t._gsDefine = function(t, e, i, n) {\n            return new d(t,e,i,n)\n        }\n        , v = h._class = function(t, e, i) {\n            return e = e || function() {}\n            ,\n            m(t, [], function() {\n                return e\n            }, i),\n            e\n        }\n        ;\n        m.globals = i;\n        var g = [0, 0, 1, 1]\n          , w = []\n          , y = v(\"easing.Ease\", function(t, e, i, n) {\n            this._func = t,\n            this._type = i || 0,\n            this._power = n || 0,\n            this._params = e ? g.concat(e) : g\n        }, !0)\n          , T = y.map = {}\n          , P = y.register = function(t, e, i, n) {\n            for (var s, r, o, a, l = e.split(\",\"), u = l.length, _ = (i || \"easeIn,easeOut,easeInOut\").split(\",\"); --u > -1; )\n                for (r = l[u],\n                s = n ? v(\"easing.\" + r, null , !0) : h.easing[r] || {},\n                o = _.length; --o > -1; )\n                    a = _[o],\n                    T[r + \".\" + a] = T[a + r] = s[a] = t.getRatio ? t : t[a] || new t\n        }\n        ;\n        for (r = y.prototype,\n        r._calcEnd = !1,\n        r.getRatio = function(t) {\n            if (this._func)\n                return this._params[0] = t,\n                this._func.apply(null , this._params);\n            var e = this._type\n              , i = this._power\n              , n = 1 === e ? 1 - t : 2 === e ? t : .5 > t ? 2 * t : 2 * (1 - t);\n            return 1 === i ? n *= n : 2 === i ? n *= n * n : 3 === i ? n *= n * n * n : 4 === i && (n *= n * n * n * n),\n            1 === e ? 1 - n : 2 === e ? n : .5 > t ? n / 2 : 1 - n / 2\n        }\n        ,\n        n = [\"Linear\", \"Quad\", \"Cubic\", \"Quart\", \"Quint,Strong\"],\n        s = n.length; --s > -1; )\n            r = n[s] + \",Power\" + s,\n            P(new y(null ,null ,1,s), r, \"easeOut\", !0),\n            P(new y(null ,null ,2,s), r, \"easeIn\" + (0 === s ? \",easeNone\" : \"\")),\n            P(new y(null ,null ,3,s), r, \"easeInOut\");\n        T.linear = h.easing.Linear.easeIn,\n        T.swing = h.easing.Quad.easeInOut;\n        var b = v(\"events.EventDispatcher\", function(t) {\n            this._listeners = {},\n            this._eventTarget = t || this\n        });\n        r = b.prototype,\n        r.addEventListener = function(t, e, i, n, s) {\n            s = s || 0;\n            var r, l, h = this._listeners[t], u = 0;\n            for (null  == h && (this._listeners[t] = h = []),\n            l = h.length; --l > -1; )\n                r = h[l],\n                r.c === e && r.s === i ? h.splice(l, 1) : 0 === u && s > r.pr && (u = l + 1);\n            h.splice(u, 0, {\n                c: e,\n                s: i,\n                up: n,\n                pr: s\n            }),\n            this !== o || a || o.wake()\n        }\n        ,\n        r.removeEventListener = function(t, e) {\n            var i, n = this._listeners[t];\n            if (n)\n                for (i = n.length; --i > -1; )\n                    if (n[i].c === e)\n                        return n.splice(i, 1),\n                        void 0\n        }\n        ,\n        r.dispatchEvent = function(t) {\n            var e, i, n, s = this._listeners[t];\n            if (s)\n                for (e = s.length,\n                i = this._eventTarget; --e > -1; )\n                    n = s[e],\n                    n.up ? n.c.call(n.s || i, {\n                        type: t,\n                        target: i\n                    }) : n.c.call(n.s || i)\n        }\n        ;\n        var S = t.requestAnimationFrame\n          , x = t.cancelAnimationFrame\n          , k = Date.now || function() {\n            return (new Date).getTime()\n        }\n          , A = k();\n        for (n = [\"ms\", \"moz\", \"webkit\", \"o\"],\n        s = n.length; --s > -1 && !S; )\n            S = t[n[s] + \"RequestAnimationFrame\"],\n            x = t[n[s] + \"CancelAnimationFrame\"] || t[n[s] + \"CancelRequestAnimationFrame\"];\n        v(\"Ticker\", function(t, e) {\n            var i, n, s, r, l, h = this, _ = k(), f = e !== !1 && S, p = 500, d = 33, m = function(t) {\n                var e, o, a = k() - A;\n                a > p && (_ += a - d),\n                A += a,\n                h.time = (A - _) / 1e3,\n                e = h.time - l,\n                (!i || e > 0 || t === !0) && (h.frame++,\n                l += e + (e >= r ? .004 : r - e),\n                o = !0),\n                t !== !0 && (s = n(m)),\n                o && h.dispatchEvent(\"tick\")\n            }\n            ;\n            b.call(h),\n            h.time = h.frame = 0,\n            h.tick = function() {\n                m(!0)\n            }\n            ,\n            h.lagSmoothing = function(t, e) {\n                p = t || 1 / u,\n                d = Math.min(e, p, 0)\n            }\n            ,\n            h.sleep = function() {\n                null  != s && (f && x ? x(s) : clearTimeout(s),\n                n = c,\n                s = null ,\n                h === o && (a = !1))\n            }\n            ,\n            h.wake = function() {\n                null  !== s ? h.sleep() : h.frame > 10 && (A = k() - p + 5),\n                n = 0 === i ? c : f && S ? S : function(t) {\n                    return setTimeout(t, 0 | 1e3 * (l - h.time) + 1)\n                }\n                ,\n                h === o && (a = !0),\n                m(2)\n            }\n            ,\n            h.fps = function(t) {\n                return arguments.length ? (i = t,\n                r = 1 / (i || 60),\n                l = this.time + r,\n                h.wake(),\n                void 0) : i\n            }\n            ,\n            h.useRAF = function(t) {\n                return arguments.length ? (h.sleep(),\n                f = t,\n                h.fps(i),\n                void 0) : f\n            }\n            ,\n            h.fps(t),\n            setTimeout(function() {\n                f && (!s || 5 > h.frame) && h.useRAF(!1)\n            }, 1500)\n        }),\n        r = h.Ticker.prototype = new h.events.EventDispatcher,\n        r.constructor = h.Ticker;\n        var E = v(\"core.Animation\", function(t, e) {\n            if (this.vars = e = e || {},\n            this._duration = this._totalDuration = t || 0,\n            this._delay = Number(e.delay) || 0,\n            this._timeScale = 1,\n            this._active = e.immediateRender === !0,\n            this.data = e.data,\n            this._reversed = e.reversed === !0,\n            G) {\n                a || o.wake();\n                var i = this.vars.useFrames ? F : G;\n                i.add(this, i._time),\n                this.vars.paused && this.paused(!0)\n            }\n        });\n        o = E.ticker = new h.Ticker,\n        r = E.prototype,\n        r._dirty = r._gc = r._initted = r._paused = !1,\n        r._totalTime = r._time = 0,\n        r._rawPrevTime = -1,\n        r._next = r._last = r._onUpdate = r._timeline = r.timeline = null ,\n        r._paused = !1;\n        var R = function() {\n            a && k() - A > 2e3 && o.wake(),\n            setTimeout(R, 2e3)\n        }\n        ;\n        R(),\n        r.play = function(t, e) {\n            return null  != t && this.seek(t, e),\n            this.reversed(!1).paused(!1)\n        }\n        ,\n        r.pause = function(t, e) {\n            return null  != t && this.seek(t, e),\n            this.paused(!0)\n        }\n        ,\n        r.resume = function(t, e) {\n            return null  != t && this.seek(t, e),\n            this.paused(!1)\n        }\n        ,\n        r.seek = function(t, e) {\n            return this.totalTime(Number(t), e !== !1)\n        }\n        ,\n        r.restart = function(t, e) {\n            return this.reversed(!1).paused(!1).totalTime(t ? -this._delay : 0, e !== !1, !0)\n        }\n        ,\n        r.reverse = function(t, e) {\n            return null  != t && this.seek(t || this.totalDuration(), e),\n            this.reversed(!0).paused(!1)\n        }\n        ,\n        r.render = function() {}\n        ,\n        r.invalidate = function() {\n            return this\n        }\n        ,\n        r.isActive = function() {\n            var t, e = this._timeline, i = this._startTime;\n            return !e || !this._gc && !this._paused && e.isActive() && (t = e.rawTime()) >= i && i + this.totalDuration() / this._timeScale > t\n        }\n        ,\n        r._enabled = function(t, e) {\n            return a || o.wake(),\n            this._gc = !t,\n            this._active = this.isActive(),\n            e !== !0 && (t && !this.timeline ? this._timeline.add(this, this._startTime - this._delay) : !t && this.timeline && this._timeline._remove(this, !0)),\n            !1\n        }\n        ,\n        r._kill = function() {\n            return this._enabled(!1, !1)\n        }\n        ,\n        r.kill = function(t, e) {\n            return this._kill(t, e),\n            this\n        }\n        ,\n        r._uncache = function(t) {\n            for (var e = t ? this : this.timeline; e; )\n                e._dirty = !0,\n                e = e.timeline;\n            return this\n        }\n        ,\n        r._swapSelfInParams = function(t) {\n            for (var e = t.length, i = t.concat(); --e > -1; )\n                \"{self}\" === t[e] && (i[e] = this);\n            return i\n        }\n        ,\n        r.eventCallback = function(t, e, i, n) {\n            if (\"on\" === (t || \"\").substr(0, 2)) {\n                var s = this.vars;\n                if (1 === arguments.length)\n                    return s[t];\n                null  == e ? delete s[t] : (s[t] = e,\n                s[t + \"Params\"] = f(i) && -1 !== i.join(\"\").indexOf(\"{self}\") ? this._swapSelfInParams(i) : i,\n                s[t + \"Scope\"] = n),\n                \"onUpdate\" === t && (this._onUpdate = e)\n            }\n            return this\n        }\n        ,\n        r.delay = function(t) {\n            return arguments.length ? (this._timeline.smoothChildTiming && this.startTime(this._startTime + t - this._delay),\n            this._delay = t,\n            this) : this._delay\n        }\n        ,\n        r.duration = function(t) {\n            return arguments.length ? (this._duration = this._totalDuration = t,\n            this._uncache(!0),\n            this._timeline.smoothChildTiming && this._time > 0 && this._time < this._duration && 0 !== t && this.totalTime(this._totalTime * (t / this._duration), !0),\n            this) : (this._dirty = !1,\n            this._duration)\n        }\n        ,\n        r.totalDuration = function(t) {\n            return this._dirty = !1,\n            arguments.length ? this.duration(t) : this._totalDuration\n        }\n        ,\n        r.time = function(t, e) {\n            return arguments.length ? (this._dirty && this.totalDuration(),\n            this.totalTime(t > this._duration ? this._duration : t, e)) : this._time\n        }\n        ,\n        r.totalTime = function(t, e, i) {\n            if (a || o.wake(),\n            !arguments.length)\n                return this._totalTime;\n            if (this._timeline) {\n                if (0 > t && !i && (t += this.totalDuration()),\n                this._timeline.smoothChildTiming) {\n                    this._dirty && this.totalDuration();\n                    var n = this._totalDuration\n                      , s = this._timeline;\n                    if (t > n && !i && (t = n),\n                    this._startTime = (this._paused ? this._pauseTime : s._time) - (this._reversed ? n - t : t) / this._timeScale,\n                    s._dirty || this._uncache(!1),\n                    s._timeline)\n                        for (; s._timeline; )\n                            s._timeline._time !== (s._startTime + s._totalTime) / s._timeScale && s.totalTime(s._totalTime, !0),\n                            s = s._timeline\n                }\n                this._gc && this._enabled(!0, !1),\n                (this._totalTime !== t || 0 === this._duration) && (this.render(t, e, !1),\n                D.length && Q())\n            }\n            return this\n        }\n        ,\n        r.progress = r.totalProgress = function(t, e) {\n            return arguments.length ? this.totalTime(this.duration() * t, e) : this._time / this.duration()\n        }\n        ,\n        r.startTime = function(t) {\n            return arguments.length ? (t !== this._startTime && (this._startTime = t,\n            this.timeline && this.timeline._sortChildren && this.timeline.add(this, t - this._delay)),\n            this) : this._startTime\n        }\n        ,\n        r.timeScale = function(t) {\n            if (!arguments.length)\n                return this._timeScale;\n            if (t = t || u,\n            this._timeline && this._timeline.smoothChildTiming) {\n                var e = this._pauseTime\n                  , i = e || 0 === e ? e : this._timeline.totalTime();\n                this._startTime = i - (i - this._startTime) * this._timeScale / t\n            }\n            return this._timeScale = t,\n            this._uncache(!1)\n        }\n        ,\n        r.reversed = function(t) {\n            return arguments.length ? (t != this._reversed && (this._reversed = t,\n            this.totalTime(this._timeline && !this._timeline.smoothChildTiming ? this.totalDuration() - this._totalTime : this._totalTime, !0)),\n            this) : this._reversed\n        }\n        ,\n        r.paused = function(t) {\n            if (!arguments.length)\n                return this._paused;\n            if (t != this._paused && this._timeline) {\n                a || t || o.wake();\n                var e = this._timeline\n                  , i = e.rawTime()\n                  , n = i - this._pauseTime;\n                !t && e.smoothChildTiming && (this._startTime += n,\n                this._uncache(!1)),\n                this._pauseTime = t ? i : null ,\n                this._paused = t,\n                this._active = this.isActive(),\n                !t && 0 !== n && this._initted && this.duration() && this.render(e.smoothChildTiming ? this._totalTime : (i - this._startTime) / this._timeScale, !0, !0)\n            }\n            return this._gc && !t && this._enabled(!0, !1),\n            this\n        }\n        ;\n        var C = v(\"core.SimpleTimeline\", function(t) {\n            E.call(this, 0, t),\n            this.autoRemoveChildren = this.smoothChildTiming = !0\n        });\n        r = C.prototype = new E,\n        r.constructor = C,\n        r.kill()._gc = !1,\n        r._first = r._last = null ,\n        r._sortChildren = !1,\n        r.add = r.insert = function(t, e) {\n            var i, n;\n            if (t._startTime = Number(e || 0) + t._delay,\n            t._paused && this !== t._timeline && (t._pauseTime = t._startTime + (this.rawTime() - t._startTime) / t._timeScale),\n            t.timeline && t.timeline._remove(t, !0),\n            t.timeline = t._timeline = this,\n            t._gc && t._enabled(!0, !0),\n            i = this._last,\n            this._sortChildren)\n                for (n = t._startTime; i && i._startTime > n; )\n                    i = i._prev;\n            return i ? (t._next = i._next,\n            i._next = t) : (t._next = this._first,\n            this._first = t),\n            t._next ? t._next._prev = t : this._last = t,\n            t._prev = i,\n            this._timeline && this._uncache(!0),\n            this\n        }\n        ,\n        r._remove = function(t, e) {\n            return t.timeline === this && (e || t._enabled(!1, !0),\n            t._prev ? t._prev._next = t._next : this._first === t && (this._first = t._next),\n            t._next ? t._next._prev = t._prev : this._last === t && (this._last = t._prev),\n            t._next = t._prev = t.timeline = null ,\n            this._timeline && this._uncache(!0)),\n            this\n        }\n        ,\n        r.render = function(t, e, i) {\n            var n, s = this._first;\n            for (this._totalTime = this._time = this._rawPrevTime = t; s; )\n                n = s._next,\n                (s._active || t >= s._startTime && !s._paused) && (s._reversed ? s.render((s._dirty ? s.totalDuration() : s._totalDuration) - (t - s._startTime) * s._timeScale, e, i) : s.render((t - s._startTime) * s._timeScale, e, i)),\n                s = n\n        }\n        ,\n        r.rawTime = function() {\n            return a || o.wake(),\n            this._totalTime\n        }\n        ;\n        var I = v(\"TweenLite\", function(e, i, n) {\n            if (E.call(this, i, n),\n            this.render = I.prototype.render,\n            null  == e)\n                throw \"Cannot tween a null target.\";\n            this.target = e = \"string\" != typeof e ? e : I.selector(e) || e;\n            var s, r, o, a = e.jquery || e.length && e !== t && e[0] && (e[0] === t || e[0].nodeType && e[0].style && !e.nodeType), l = this.vars.overwrite;\n            if (this._overwrite = l = null  == l ? q[I.defaultOverwrite] : \"number\" == typeof l ? l >> 0 : q[l],\n            (a || e instanceof Array || e.push && f(e)) && \"number\" != typeof e[0])\n                for (this._targets = o = _(e),\n                this._propLookup = [],\n                this._siblings = [],\n                s = 0; o.length > s; s++)\n                    r = o[s],\n                    r ? \"string\" != typeof r ? r.length && r !== t && r[0] && (r[0] === t || r[0].nodeType && r[0].style && !r.nodeType) ? (o.splice(s--, 1),\n                    this._targets = o = o.concat(_(r))) : (this._siblings[s] = $(r, this, !1),\n                    1 === l && this._siblings[s].length > 1 && X(r, this, null , 1, this._siblings[s])) : (r = o[s--] = I.selector(r),\n                    \"string\" == typeof r && o.splice(s + 1, 1)) : o.splice(s--, 1);\n            else\n                this._propLookup = {},\n                this._siblings = $(e, this, !1),\n                1 === l && this._siblings.length > 1 && X(e, this, null , 1, this._siblings);\n            (this.vars.immediateRender || 0 === i && 0 === this._delay && this.vars.immediateRender !== !1) && (this._time = -u,\n            this.render(-this._delay))\n        }, !0)\n          , M = function(e) {\n            return e.length && e !== t && e[0] && (e[0] === t || e[0].nodeType && e[0].style && !e.nodeType)\n        }\n          , O = function(t, e) {\n            var i, n = {};\n            for (i in t)\n                B[i] || i in e && \"transform\" !== i && \"x\" !== i && \"y\" !== i && \"width\" !== i && \"height\" !== i && \"className\" !== i && \"border\" !== i || !(!N[i] || N[i] && N[i]._autoCSS) || (n[i] = t[i],\n                delete t[i]);\n            t.css = n\n        }\n        ;\n        r = I.prototype = new E,\n        r.constructor = I,\n        r.kill()._gc = !1,\n        r.ratio = 0,\n        r._firstPT = r._targets = r._overwrittenProps = r._startAt = null ,\n        r._notifyPluginsOfEnabled = r._lazy = !1,\n        I.version = \"1.13.1\",\n        I.defaultEase = r._ease = new y(null ,null ,1,1),\n        I.defaultOverwrite = \"auto\",\n        I.ticker = o,\n        I.autoSleep = !0,\n        I.lagSmoothing = function(t, e) {\n            o.lagSmoothing(t, e)\n        }\n        ,\n        I.selector = t.$ || t.jQuery || function(e) {\n            var i = t.$ || t.jQuery;\n            return i ? (I.selector = i,\n            i(e)) : \"undefined\" == typeof document ? e : document.querySelectorAll ? document.querySelectorAll(e) : document.getElementById(\"#\" === e.charAt(0) ? e.substr(1) : e)\n        }\n        ;\n        var D = []\n          , L = {}\n          , z = I._internals = {\n            isArray: f,\n            isSelector: M,\n            lazyTweens: D\n        }\n          , N = I._plugins = {}\n          , U = z.tweenLookup = {}\n          , j = 0\n          , B = z.reservedProps = {\n            ease: 1,\n            delay: 1,\n            overwrite: 1,\n            onComplete: 1,\n            onCompleteParams: 1,\n            onCompleteScope: 1,\n            useFrames: 1,\n            runBackwards: 1,\n            startAt: 1,\n            onUpdate: 1,\n            onUpdateParams: 1,\n            onUpdateScope: 1,\n            onStart: 1,\n            onStartParams: 1,\n            onStartScope: 1,\n            onReverseComplete: 1,\n            onReverseCompleteParams: 1,\n            onReverseCompleteScope: 1,\n            onRepeat: 1,\n            onRepeatParams: 1,\n            onRepeatScope: 1,\n            easeParams: 1,\n            yoyo: 1,\n            immediateRender: 1,\n            repeat: 1,\n            repeatDelay: 1,\n            data: 1,\n            paused: 1,\n            reversed: 1,\n            autoCSS: 1,\n            lazy: 1\n        }\n          , q = {\n            none: 0,\n            all: 1,\n            auto: 2,\n            concurrent: 3,\n            allOnStart: 4,\n            preexisting: 5,\n            \"true\": 1,\n            \"false\": 0\n        }\n          , F = E._rootFramesTimeline = new C\n          , G = E._rootTimeline = new C\n          , Q = z.lazyRender = function() {\n            var t = D.length;\n            for (L = {}; --t > -1; )\n                n = D[t],\n                n && n._lazy !== !1 && (n.render(n._lazy, !1, !0),\n                n._lazy = !1);\n            D.length = 0\n        }\n        ;\n        G._startTime = o.time,\n        F._startTime = o.frame,\n        G._active = F._active = !0,\n        setTimeout(Q, 1),\n        E._updateRoot = I.render = function() {\n            var t, e, i;\n            if (D.length && Q(),\n            G.render((o.time - G._startTime) * G._timeScale, !1, !1),\n            F.render((o.frame - F._startTime) * F._timeScale, !1, !1),\n            D.length && Q(),\n            !(o.frame % 120)) {\n                for (i in U) {\n                    for (e = U[i].tweens,\n                    t = e.length; --t > -1; )\n                        e[t]._gc && e.splice(t, 1);\n                    0 === e.length && delete U[i]\n                }\n                if (i = G._first,\n                (!i || i._paused) && I.autoSleep && !F._first && 1 === o._listeners.tick.length) {\n                    for (; i && i._paused; )\n                        i = i._next;\n                    i || o.sleep()\n                }\n            }\n        }\n        ,\n        o.addEventListener(\"tick\", E._updateRoot);\n        var $ = function(t, e, i) {\n            var n, s, r = t._gsTweenID;\n            if (U[r || (t._gsTweenID = r = \"t\" + j++)] || (U[r] = {\n                target: t,\n                tweens: []\n            }),\n            e && (n = U[r].tweens,\n            n[s = n.length] = e,\n            i))\n                for (; --s > -1; )\n                    n[s] === e && n.splice(s, 1);\n            return U[r].tweens\n        }\n          , X = function(t, e, i, n, s) {\n            var r, o, a, l;\n            if (1 === n || n >= 4) {\n                for (l = s.length,\n                r = 0; l > r; r++)\n                    if ((a = s[r]) !== e)\n                        a._gc || a._enabled(!1, !1) && (o = !0);\n                    else if (5 === n)\n                        break;\n                return o\n            }\n            var h, _ = e._startTime + u, c = [], f = 0, p = 0 === e._duration;\n            for (r = s.length; --r > -1; )\n                (a = s[r]) === e || a._gc || a._paused || (a._timeline !== e._timeline ? (h = h || Y(e, 0, p),\n                0 === Y(a, h, p) && (c[f++] = a)) : _ >= a._startTime && a._startTime + a.totalDuration() / a._timeScale > _ && ((p || !a._initted) && 2e-10 >= _ - a._startTime || (c[f++] = a)));\n            for (r = f; --r > -1; )\n                a = c[r],\n                2 === n && a._kill(i, t) && (o = !0),\n                (2 !== n || !a._firstPT && a._initted) && a._enabled(!1, !1) && (o = !0);\n            return o\n        }\n          , Y = function(t, e, i) {\n            for (var n = t._timeline, s = n._timeScale, r = t._startTime; n._timeline; ) {\n                if (r += n._startTime,\n                s *= n._timeScale,\n                n._paused)\n                    return -100;\n                n = n._timeline\n            }\n            return r /= s,\n            r > e ? r - e : i && r === e || !t._initted && 2 * u > r - e ? u : (r += t.totalDuration() / t._timeScale / s) > e + u ? 0 : r - e - u\n        }\n        ;\n        r._init = function() {\n            var t, e, i, n, s, r = this.vars, o = this._overwrittenProps, a = this._duration, l = !!r.immediateRender, h = r.ease;\n            if (r.startAt) {\n                this._startAt && (this._startAt.render(-1, !0),\n                this._startAt.kill()),\n                s = {};\n                for (n in r.startAt)\n                    s[n] = r.startAt[n];\n                if (s.overwrite = !1,\n                s.immediateRender = !0,\n                s.lazy = l && r.lazy !== !1,\n                s.startAt = s.delay = null ,\n                this._startAt = I.to(this.target, 0, s),\n                l)\n                    if (this._time > 0)\n                        this._startAt = null ;\n                    else if (0 !== a)\n                        return\n            } else if (r.runBackwards && 0 !== a)\n                if (this._startAt)\n                    this._startAt.render(-1, !0),\n                    this._startAt.kill(),\n                    this._startAt = null ;\n                else {\n                    i = {};\n                    for (n in r)\n                        B[n] && \"autoCSS\" !== n || (i[n] = r[n]);\n                    if (i.overwrite = 0,\n                    i.data = \"isFromStart\",\n                    i.lazy = l && r.lazy !== !1,\n                    i.immediateRender = l,\n                    this._startAt = I.to(this.target, 0, i),\n                    l) {\n                        if (0 === this._time)\n                            return\n                    } else\n                        this._startAt._init(),\n                        this._startAt._enabled(!1)\n                }\n            if (this._ease = h = h ? h instanceof y ? h : \"function\" == typeof h ? new y(h,r.easeParams) : T[h] || I.defaultEase : I.defaultEase,\n            r.easeParams instanceof Array && h.config && (this._ease = h.config.apply(h, r.easeParams)),\n            this._easeType = this._ease._type,\n            this._easePower = this._ease._power,\n            this._firstPT = null ,\n            this._targets)\n                for (t = this._targets.length; --t > -1; )\n                    this._initProps(this._targets[t], this._propLookup[t] = {}, this._siblings[t], o ? o[t] : null ) && (e = !0);\n            else\n                e = this._initProps(this.target, this._propLookup, this._siblings, o);\n            if (e && I._onPluginEvent(\"_onInitAllProps\", this),\n            o && (this._firstPT || \"function\" != typeof this.target && this._enabled(!1, !1)),\n            r.runBackwards)\n                for (i = this._firstPT; i; )\n                    i.s += i.c,\n                    i.c = -i.c,\n                    i = i._next;\n            this._onUpdate = r.onUpdate,\n            this._initted = !0\n        }\n        ,\n        r._initProps = function(e, i, n, s) {\n            var r, o, a, l, h, u;\n            if (null  == e)\n                return !1;\n            L[e._gsTweenID] && Q(),\n            this.vars.css || e.style && e !== t && e.nodeType && N.css && this.vars.autoCSS !== !1 && O(this.vars, e);\n            for (r in this.vars) {\n                if (u = this.vars[r],\n                B[r])\n                    u && (u instanceof Array || u.push && f(u)) && -1 !== u.join(\"\").indexOf(\"{self}\") && (this.vars[r] = u = this._swapSelfInParams(u, this));\n                else if (N[r] && (l = new N[r])._onInitTween(e, this.vars[r], this)) {\n                    for (this._firstPT = h = {\n                        _next: this._firstPT,\n                        t: l,\n                        p: \"setRatio\",\n                        s: 0,\n                        c: 1,\n                        f: !0,\n                        n: r,\n                        pg: !0,\n                        pr: l._priority\n                    },\n                    o = l._overwriteProps.length; --o > -1; )\n                        i[l._overwriteProps[o]] = this._firstPT;\n                    (l._priority || l._onInitAllProps) && (a = !0),\n                    (l._onDisable || l._onEnable) && (this._notifyPluginsOfEnabled = !0)\n                } else\n                    this._firstPT = i[r] = h = {\n                        _next: this._firstPT,\n                        t: e,\n                        p: r,\n                        f: \"function\" == typeof e[r],\n                        n: r,\n                        pg: !1,\n                        pr: 0\n                    },\n                    h.s = h.f ? e[r.indexOf(\"set\") || \"function\" != typeof e[\"get\" + r.substr(3)] ? r : \"get\" + r.substr(3)]() : parseFloat(e[r]),\n                    h.c = \"string\" == typeof u && \"=\" === u.charAt(1) ? parseInt(u.charAt(0) + \"1\", 10) * Number(u.substr(2)) : Number(u) - h.s || 0;\n                h && h._next && (h._next._prev = h)\n            }\n            return s && this._kill(s, e) ? this._initProps(e, i, n, s) : this._overwrite > 1 && this._firstPT && n.length > 1 && X(e, this, i, this._overwrite, n) ? (this._kill(i, e),\n            this._initProps(e, i, n, s)) : (this._firstPT && (this.vars.lazy !== !1 && this._duration || this.vars.lazy && !this._duration) && (L[e._gsTweenID] = !0),\n            a)\n        }\n        ,\n        r.render = function(t, e, i) {\n            var n, s, r, o, a = this._time, l = this._duration, h = this._rawPrevTime;\n            if (t >= l)\n                this._totalTime = this._time = l,\n                this.ratio = this._ease._calcEnd ? this._ease.getRatio(1) : 1,\n                this._reversed || (n = !0,\n                s = \"onComplete\"),\n                0 === l && (this._initted || !this.vars.lazy || i) && (this._startTime === this._timeline._duration && (t = 0),\n                (0 === t || 0 > h || h === u) && h !== t && (i = !0,\n                h > u && (s = \"onReverseComplete\")),\n                this._rawPrevTime = o = !e || t || h === t ? t : u);\n            else if (1e-7 > t)\n                this._totalTime = this._time = 0,\n                this.ratio = this._ease._calcEnd ? this._ease.getRatio(0) : 0,\n                (0 !== a || 0 === l && h > 0 && h !== u) && (s = \"onReverseComplete\",\n                n = this._reversed),\n                0 > t ? (this._active = !1,\n                0 === l && (this._initted || !this.vars.lazy || i) && (h >= 0 && (i = !0),\n                this._rawPrevTime = o = !e || t || h === t ? t : u)) : this._initted || (i = !0);\n            else if (this._totalTime = this._time = t,\n            this._easeType) {\n                var _ = t / l\n                  , c = this._easeType\n                  , f = this._easePower;\n                (1 === c || 3 === c && _ >= .5) && (_ = 1 - _),\n                3 === c && (_ *= 2),\n                1 === f ? _ *= _ : 2 === f ? _ *= _ * _ : 3 === f ? _ *= _ * _ * _ : 4 === f && (_ *= _ * _ * _ * _),\n                this.ratio = 1 === c ? 1 - _ : 2 === c ? _ : .5 > t / l ? _ / 2 : 1 - _ / 2\n            } else\n                this.ratio = this._ease.getRatio(t / l);\n            if (this._time !== a || i) {\n                if (!this._initted) {\n                    if (this._init(),\n                    !this._initted || this._gc)\n                        return;\n                    if (!i && this._firstPT && (this.vars.lazy !== !1 && this._duration || this.vars.lazy && !this._duration))\n                        return this._time = this._totalTime = a,\n                        this._rawPrevTime = h,\n                        D.push(this),\n                        this._lazy = t,\n                        void 0;\n                    this._time && !n ? this.ratio = this._ease.getRatio(this._time / l) : n && this._ease._calcEnd && (this.ratio = this._ease.getRatio(0 === this._time ? 0 : 1))\n                }\n                for (this._lazy !== !1 && (this._lazy = !1),\n                this._active || !this._paused && this._time !== a && t >= 0 && (this._active = !0),\n                0 === a && (this._startAt && (t >= 0 ? this._startAt.render(t, e, i) : s || (s = \"_dummyGS\")),\n                this.vars.onStart && (0 !== this._time || 0 === l) && (e || this.vars.onStart.apply(this.vars.onStartScope || this, this.vars.onStartParams || w))),\n                r = this._firstPT; r; )\n                    r.f ? r.t[r.p](r.c * this.ratio + r.s) : r.t[r.p] = r.c * this.ratio + r.s,\n                    r = r._next;\n                this._onUpdate && (0 > t && this._startAt && this._startTime && this._startAt.render(t, e, i),\n                e || (this._time !== a || n) && this._onUpdate.apply(this.vars.onUpdateScope || this, this.vars.onUpdateParams || w)),\n                s && (!this._gc || i) && (0 > t && this._startAt && !this._onUpdate && this._startTime && this._startAt.render(t, e, i),\n                n && (this._timeline.autoRemoveChildren && this._enabled(!1, !1),\n                this._active = !1),\n                !e && this.vars[s] && this.vars[s].apply(this.vars[s + \"Scope\"] || this, this.vars[s + \"Params\"] || w),\n                0 === l && this._rawPrevTime === u && o !== u && (this._rawPrevTime = 0))\n            }\n        }\n        ,\n        r._kill = function(t, e) {\n            if (\"all\" === t && (t = null ),\n            null  == t && (null  == e || e === this.target))\n                return this._lazy = !1,\n                this._enabled(!1, !1);\n            e = \"string\" != typeof e ? e || this._targets || this.target : I.selector(e) || e;\n            var i, n, s, r, o, a, l, h;\n            if ((f(e) || M(e)) && \"number\" != typeof e[0])\n                for (i = e.length; --i > -1; )\n                    this._kill(t, e[i]) && (a = !0);\n            else {\n                if (this._targets) {\n                    for (i = this._targets.length; --i > -1; )\n                        if (e === this._targets[i]) {\n                            o = this._propLookup[i] || {},\n                            this._overwrittenProps = this._overwrittenProps || [],\n                            n = this._overwrittenProps[i] = t ? this._overwrittenProps[i] || {} : \"all\";\n                            break\n                        }\n                } else {\n                    if (e !== this.target)\n                        return !1;\n                    o = this._propLookup,\n                    n = this._overwrittenProps = t ? this._overwrittenProps || {} : \"all\"\n                }\n                if (o) {\n                    l = t || o,\n                    h = t !== n && \"all\" !== n && t !== o && (\"object\" != typeof t || !t._tempKill);\n                    for (s in l)\n                        (r = o[s]) && (r.pg && r.t._kill(l) && (a = !0),\n                        r.pg && 0 !== r.t._overwriteProps.length || (r._prev ? r._prev._next = r._next : r === this._firstPT && (this._firstPT = r._next),\n                        r._next && (r._next._prev = r._prev),\n                        r._next = r._prev = null ),\n                        delete o[s]),\n                        h && (n[s] = 1);\n                    !this._firstPT && this._initted && this._enabled(!1, !1)\n                }\n            }\n            return a\n        }\n        ,\n        r.invalidate = function() {\n            return this._notifyPluginsOfEnabled && I._onPluginEvent(\"_onDisable\", this),\n            this._firstPT = null ,\n            this._overwrittenProps = null ,\n            this._onUpdate = null ,\n            this._startAt = null ,\n            this._initted = this._active = this._notifyPluginsOfEnabled = this._lazy = !1,\n            this._propLookup = this._targets ? {} : [],\n            this\n        }\n        ,\n        r._enabled = function(t, e) {\n            if (a || o.wake(),\n            t && this._gc) {\n                var i, n = this._targets;\n                if (n)\n                    for (i = n.length; --i > -1; )\n                        this._siblings[i] = $(n[i], this, !0);\n                else\n                    this._siblings = $(this.target, this, !0)\n            }\n            return E.prototype._enabled.call(this, t, e),\n            this._notifyPluginsOfEnabled && this._firstPT ? I._onPluginEvent(t ? \"_onEnable\" : \"_onDisable\", this) : !1\n        }\n        ,\n        I.to = function(t, e, i) {\n            return new I(t,e,i)\n        }\n        ,\n        I.from = function(t, e, i) {\n            return i.runBackwards = !0,\n            i.immediateRender = 0 != i.immediateRender,\n            new I(t,e,i)\n        }\n        ,\n        I.fromTo = function(t, e, i, n) {\n            return n.startAt = i,\n            n.immediateRender = 0 != n.immediateRender && 0 != i.immediateRender,\n            new I(t,e,n)\n        }\n        ,\n        I.delayedCall = function(t, e, i, n, s) {\n            return new I(e,0,{\n                delay: t,\n                onComplete: e,\n                onCompleteParams: i,\n                onCompleteScope: n,\n                onReverseComplete: e,\n                onReverseCompleteParams: i,\n                onReverseCompleteScope: n,\n                immediateRender: !1,\n                useFrames: s,\n                overwrite: 0\n            })\n        }\n        ,\n        I.set = function(t, e) {\n            return new I(t,0,e)\n        }\n        ,\n        I.getTweensOf = function(t, e) {\n            if (null  == t)\n                return [];\n            t = \"string\" != typeof t ? t : I.selector(t) || t;\n            var i, n, s, r;\n            if ((f(t) || M(t)) && \"number\" != typeof t[0]) {\n                for (i = t.length,\n                n = []; --i > -1; )\n                    n = n.concat(I.getTweensOf(t[i], e));\n                for (i = n.length; --i > -1; )\n                    for (r = n[i],\n                    s = i; --s > -1; )\n                        r === n[s] && n.splice(i, 1)\n            } else\n                for (n = $(t).concat(),\n                i = n.length; --i > -1; )\n                    (n[i]._gc || e && !n[i].isActive()) && n.splice(i, 1);\n            return n\n        }\n        ,\n        I.killTweensOf = I.killDelayedCallsTo = function(t, e, i) {\n            \"object\" == typeof e && (i = e,\n            e = !1);\n            for (var n = I.getTweensOf(t, e), s = n.length; --s > -1; )\n                n[s]._kill(i, t)\n        }\n        ;\n        var V = v(\"plugins.TweenPlugin\", function(t, e) {\n            this._overwriteProps = (t || \"\").split(\",\"),\n            this._propName = this._overwriteProps[0],\n            this._priority = e || 0,\n            this._super = V.prototype\n        }, !0);\n        if (r = V.prototype,\n        V.version = \"1.10.1\",\n        V.API = 2,\n        r._firstPT = null ,\n        r._addTween = function(t, e, i, n, s, r) {\n            var o, a;\n            return null  != n && (o = \"number\" == typeof n || \"=\" !== n.charAt(1) ? Number(n) - i : parseInt(n.charAt(0) + \"1\", 10) * Number(n.substr(2))) ? (this._firstPT = a = {\n                _next: this._firstPT,\n                t: t,\n                p: e,\n                s: i,\n                c: o,\n                f: \"function\" == typeof t[e],\n                n: s || e,\n                r: r\n            },\n            a._next && (a._next._prev = a),\n            a) : void 0\n        }\n        ,\n        r.setRatio = function(t) {\n            for (var e, i = this._firstPT, n = 1e-6; i; )\n                e = i.c * t + i.s,\n                i.r ? e = Math.round(e) : n > e && e > -n && (e = 0),\n                i.f ? i.t[i.p](e) : i.t[i.p] = e,\n                i = i._next\n        }\n        ,\n        r._kill = function(t) {\n            var e, i = this._overwriteProps, n = this._firstPT;\n            if (null  != t[this._propName])\n                this._overwriteProps = [];\n            else\n                for (e = i.length; --e > -1; )\n                    null  != t[i[e]] && i.splice(e, 1);\n            for (; n; )\n                null  != t[n.n] && (n._next && (n._next._prev = n._prev),\n                n._prev ? (n._prev._next = n._next,\n                n._prev = null ) : this._firstPT === n && (this._firstPT = n._next)),\n                n = n._next;\n            return !1\n        }\n        ,\n        r._roundProps = function(t, e) {\n            for (var i = this._firstPT; i; )\n                (t[this._propName] || null  != i.n && t[i.n.split(this._propName + \"_\").join(\"\")]) && (i.r = e),\n                i = i._next\n        }\n        ,\n        I._onPluginEvent = function(t, e) {\n            var i, n, s, r, o, a = e._firstPT;\n            if (\"_onInitAllProps\" === t) {\n                for (; a; ) {\n                    for (o = a._next,\n                    n = s; n && n.pr > a.pr; )\n                        n = n._next;\n                    (a._prev = n ? n._prev : r) ? a._prev._next = a : s = a,\n                    (a._next = n) ? n._prev = a : r = a,\n                    a = o\n                }\n                a = e._firstPT = s\n            }\n            for (; a; )\n                a.pg && \"function\" == typeof a.t[t] && a.t[t]() && (i = !0),\n                a = a._next;\n            return i\n        }\n        ,\n        V.activate = function(t) {\n            for (var e = t.length; --e > -1; )\n                t[e].API === V.API && (N[(new t[e])._propName] = t[e]);\n            return !0\n        }\n        ,\n        m.plugin = function(t) {\n            if (!(t && t.propName && t.init && t.API))\n                throw \"illegal plugin definition.\";\n            var e, i = t.propName, n = t.priority || 0, s = t.overwriteProps, r = {\n                init: \"_onInitTween\",\n                set: \"setRatio\",\n                kill: \"_kill\",\n                round: \"_roundProps\",\n                initAll: \"_onInitAllProps\"\n            }, o = v(\"plugins.\" + i.charAt(0).toUpperCase() + i.substr(1) + \"Plugin\", function() {\n                V.call(this, i, n),\n                this._overwriteProps = s || []\n            }, t.global === !0), a = o.prototype = new V(i);\n            a.constructor = o,\n            o.API = t.API;\n            for (e in r)\n                \"function\" == typeof t[e] && (a[r[e]] = t[e]);\n            return o.version = t.version,\n            V.activate([o]),\n            o\n        }\n        ,\n        n = t._gsQueue) {\n            for (s = 0; n.length > s; s++)\n                n[s]();\n            for (r in p)\n                p[r].func || t.console.log(\"GSAP encountered missing dependency: com.greensock.\" + r)\n        }\n        a = !1\n    }\n})(\"undefined\" != typeof module && module.exports && \"undefined\" != typeof global ? global : this || window, \"TweenLite\");\nvar _gsScope = \"undefined\" != typeof module && module.exports && \"undefined\" != typeof global ? global : this || window;\n(_gsScope._gsQueue || (_gsScope._gsQueue = [])).push(function() {\n    \"use strict\";\n    _gsScope._gsDefine(\"easing.Back\", [\"easing.Ease\"], function(t) {\n        var e, i, n, s = _gsScope.GreenSockGlobals || _gsScope, r = s.com.greensock, o = 2 * Math.PI, a = Math.PI / 2, l = r._class, h = function(e, i) {\n            var n = l(\"easing.\" + e, function() {}, !0)\n              , s = n.prototype = new t;\n            return s.constructor = n,\n            s.getRatio = i,\n            n\n        }\n        , u = t.register || function() {}\n        , _ = function(t, e, i, n) {\n            var s = l(\"easing.\" + t, {\n                easeOut: new e,\n                easeIn: new i,\n                easeInOut: new n\n            }, !0);\n            return u(s, t),\n            s\n        }\n        , c = function(t, e, i) {\n            this.t = t,\n            this.v = e,\n            i && (this.next = i,\n            i.prev = this,\n            this.c = i.v - e,\n            this.gap = i.t - t)\n        }\n        , f = function(e, i) {\n            var n = l(\"easing.\" + e, function(t) {\n                this._p1 = t || 0 === t ? t : 1.70158,\n                this._p2 = 1.525 * this._p1\n            }, !0)\n              , s = n.prototype = new t;\n            return s.constructor = n,\n            s.getRatio = i,\n            s.config = function(t) {\n                return new n(t)\n            }\n            ,\n            n\n        }\n        , p = _(\"Back\", f(\"BackOut\", function(t) {\n            return (t -= 1) * t * ((this._p1 + 1) * t + this._p1) + 1\n        }), f(\"BackIn\", function(t) {\n            return t * t * ((this._p1 + 1) * t - this._p1)\n        }), f(\"BackInOut\", function(t) {\n            return 1 > (t *= 2) ? .5 * t * t * ((this._p2 + 1) * t - this._p2) : .5 * ((t -= 2) * t * ((this._p2 + 1) * t + this._p2) + 2)\n        })), d = l(\"easing.SlowMo\", function(t, e, i) {\n            e = e || 0 === e ? e : .7,\n            null  == t ? t = .7 : t > 1 && (t = 1),\n            this._p = 1 !== t ? e : 0,\n            this._p1 = (1 - t) / 2,\n            this._p2 = t,\n            this._p3 = this._p1 + this._p2,\n            this._calcEnd = i === !0\n        }, !0), m = d.prototype = new t;\n        return m.constructor = d,\n        m.getRatio = function(t) {\n            var e = t + (.5 - t) * this._p;\n            return this._p1 > t ? this._calcEnd ? 1 - (t = 1 - t / this._p1) * t : e - (t = 1 - t / this._p1) * t * t * t * e : t > this._p3 ? this._calcEnd ? 1 - (t = (t - this._p3) / this._p1) * t : e + (t - e) * (t = (t - this._p3) / this._p1) * t * t * t : this._calcEnd ? 1 : e\n        }\n        ,\n        d.ease = new d(.7,.7),\n        m.config = d.config = function(t, e, i) {\n            return new d(t,e,i)\n        }\n        ,\n        e = l(\"easing.SteppedEase\", function(t) {\n            t = t || 1,\n            this._p1 = 1 / t,\n            this._p2 = t + 1\n        }, !0),\n        m = e.prototype = new t,\n        m.constructor = e,\n        m.getRatio = function(t) {\n            return 0 > t ? t = 0 : t >= 1 && (t = .999999999),\n            (this._p2 * t >> 0) * this._p1\n        }\n        ,\n        m.config = e.config = function(t) {\n            return new e(t)\n        }\n        ,\n        i = l(\"easing.RoughEase\", function(e) {\n            e = e || {};\n            for (var i, n, s, r, o, a, l = e.taper || \"none\", h = [], u = 0, _ = 0 | (e.points || 20), f = _, p = e.randomize !== !1, d = e.clamp === !0, m = e.template instanceof t ? e.template : null , v = \"number\" == typeof e.strength ? .4 * e.strength : .4; --f > -1; )\n                i = p ? Math.random() : 1 / _ * f,\n                n = m ? m.getRatio(i) : i,\n                \"none\" === l ? s = v : \"out\" === l ? (r = 1 - i,\n                s = r * r * v) : \"in\" === l ? s = i * i * v : .5 > i ? (r = 2 * i,\n                s = .5 * r * r * v) : (r = 2 * (1 - i),\n                s = .5 * r * r * v),\n                p ? n += Math.random() * s - .5 * s : f % 2 ? n += .5 * s : n -= .5 * s,\n                d && (n > 1 ? n = 1 : 0 > n && (n = 0)),\n                h[u++] = {\n                    x: i,\n                    y: n\n                };\n            for (h.sort(function(t, e) {\n                return t.x - e.x\n            }),\n            a = new c(1,1,null ),\n            f = _; --f > -1; )\n                o = h[f],\n                a = new c(o.x,o.y,a);\n            this._prev = new c(0,0,0 !== a.t ? a : a.next)\n        }, !0),\n        m = i.prototype = new t,\n        m.constructor = i,\n        m.getRatio = function(t) {\n            var e = this._prev;\n            if (t > e.t) {\n                for (; e.next && t >= e.t; )\n                    e = e.next;\n                e = e.prev\n            } else\n                for (; e.prev && e.t >= t; )\n                    e = e.prev;\n            return this._prev = e,\n            e.v + (t - e.t) / e.gap * e.c\n        }\n        ,\n        m.config = function(t) {\n            return new i(t)\n        }\n        ,\n        i.ease = new i,\n        _(\"Bounce\", h(\"BounceOut\", function(t) {\n            return 1 / 2.75 > t ? 7.5625 * t * t : 2 / 2.75 > t ? 7.5625 * (t -= 1.5 / 2.75) * t + .75 : 2.5 / 2.75 > t ? 7.5625 * (t -= 2.25 / 2.75) * t + .9375 : 7.5625 * (t -= 2.625 / 2.75) * t + .984375\n        }), h(\"BounceIn\", function(t) {\n            return 1 / 2.75 > (t = 1 - t) ? 1 - 7.5625 * t * t : 2 / 2.75 > t ? 1 - (7.5625 * (t -= 1.5 / 2.75) * t + .75) : 2.5 / 2.75 > t ? 1 - (7.5625 * (t -= 2.25 / 2.75) * t + .9375) : 1 - (7.5625 * (t -= 2.625 / 2.75) * t + .984375)\n        }), h(\"BounceInOut\", function(t) {\n            var e = .5 > t;\n            return t = e ? 1 - 2 * t : 2 * t - 1,\n            t = 1 / 2.75 > t ? 7.5625 * t * t : 2 / 2.75 > t ? 7.5625 * (t -= 1.5 / 2.75) * t + .75 : 2.5 / 2.75 > t ? 7.5625 * (t -= 2.25 / 2.75) * t + .9375 : 7.5625 * (t -= 2.625 / 2.75) * t + .984375,\n            e ? .5 * (1 - t) : .5 * t + .5\n        })),\n        _(\"Circ\", h(\"CircOut\", function(t) {\n            return Math.sqrt(1 - (t -= 1) * t)\n        }), h(\"CircIn\", function(t) {\n            return -(Math.sqrt(1 - t * t) - 1)\n        }), h(\"CircInOut\", function(t) {\n            return 1 > (t *= 2) ? -.5 * (Math.sqrt(1 - t * t) - 1) : .5 * (Math.sqrt(1 - (t -= 2) * t) + 1)\n        })),\n        n = function(e, i, n) {\n            var s = l(\"easing.\" + e, function(t, e) {\n                this._p1 = t || 1,\n                this._p2 = e || n,\n                this._p3 = this._p2 / o * (Math.asin(1 / this._p1) || 0)\n            }, !0)\n              , r = s.prototype = new t;\n            return r.constructor = s,\n            r.getRatio = i,\n            r.config = function(t, e) {\n                return new s(t,e)\n            }\n            ,\n            s\n        }\n        ,\n        _(\"Elastic\", n(\"ElasticOut\", function(t) {\n            return this._p1 * Math.pow(2, -10 * t) * Math.sin((t - this._p3) * o / this._p2) + 1\n        }, .3), n(\"ElasticIn\", function(t) {\n            return -(this._p1 * Math.pow(2, 10 * (t -= 1)) * Math.sin((t - this._p3) * o / this._p2))\n        }, .3), n(\"ElasticInOut\", function(t) {\n            return 1 > (t *= 2) ? -.5 * this._p1 * Math.pow(2, 10 * (t -= 1)) * Math.sin((t - this._p3) * o / this._p2) : .5 * this._p1 * Math.pow(2, -10 * (t -= 1)) * Math.sin((t - this._p3) * o / this._p2) + 1\n        }, .45)),\n        _(\"Expo\", h(\"ExpoOut\", function(t) {\n            return 1 - Math.pow(2, -10 * t)\n        }), h(\"ExpoIn\", function(t) {\n            return Math.pow(2, 10 * (t - 1)) - .001\n        }), h(\"ExpoInOut\", function(t) {\n            return 1 > (t *= 2) ? .5 * Math.pow(2, 10 * (t - 1)) : .5 * (2 - Math.pow(2, -10 * (t - 1)))\n        })),\n        _(\"Sine\", h(\"SineOut\", function(t) {\n            return Math.sin(t * a)\n        }), h(\"SineIn\", function(t) {\n            return -Math.cos(t * a) + 1\n        }), h(\"SineInOut\", function(t) {\n            return -.5 * (Math.cos(Math.PI * t) - 1)\n        })),\n        l(\"easing.EaseLookup\", {\n            find: function(e) {\n                return t.map[e]\n            }\n        }, !0),\n        u(s.SlowMo, \"SlowMo\", \"ease,\"),\n        u(i, \"RoughEase\", \"ease,\"),\n        u(e, \"SteppedEase\", \"ease,\"),\n        p\n    }, !0)\n}),\n_gsScope._gsDefine && _gsScope._gsQueue.pop()();\n(function() {\n    var t, e, i, n, s, r, o = true;\n    a();\n    _();\n    l();\n    function a() {\n        t = $(\"#banner\").width();\n        e = $(\"#banner\").height();\n        r = {\n            x: t / 2,\n            y: e / 2\n        };\n        i = document.getElementById(\"animate-net\");\n        i.width = t;\n        i.height = e;\n        n = i.getContext(\"2d\");\n        s = [];\n        for (var o = 0; o < t - t / 10; o = o + t / 10) {\n            for (var a = 0; a < e - e / 10; a = a + e / 10) {\n                var l = o + Math.random() * t / 10;\n                var h = a + Math.random() * e / 10;\n                var u = {\n                    x: l,\n                    originX: l,\n                    y: h,\n                    originY: h\n                };\n                s.push(u)\n            }\n        }\n        for (var _ = 0; _ < s.length; _++) {\n            var c = [];\n            var f = s[_];\n            for (var p = 0; p < s.length; p++) {\n                var v = s[p];\n                if (!(f == v)) {\n                    var g = false;\n                    for (var w = 0; w < 5; w++) {\n                        if (!g) {\n                            if (c[w] == undefined) {\n                                c[w] = v;\n                                g = true\n                            }\n                        }\n                    }\n                    for (var w = 0; w < 5; w++) {\n                        if (!g) {\n                            if (m(f, v) < m(f, c[w])) {\n                                c[w] = v;\n                                g = true\n                            }\n                        }\n                    }\n                }\n            }\n            f.closest = c\n        }\n        for (var _ in s) {\n            var y = new d(s[_],2 + Math.random() * 2,\"rgba(255,255,255,0.3)\");\n            s[_].circle = y\n        }\n    }\n    function l() {\n        if (!(\"ontouchstart\" in window)) {\n            window.addEventListener(\"mousemove\", h)\n        }\n        window.addEventListener(\"scroll\", u)\n    }\n    function h(t) {\n        var e = posy = 0;\n        if (t.pageX || t.pageY) {\n            e = t.pageX;\n            posy = t.pageY\n        } else if (t.clientX || t.clientY) {\n            e = t.clientX + document.body.scrollLeft + document.documentElement.scrollLeft;\n            posy = t.clientY + document.body.scrollTop + document.documentElement.scrollTop\n        }\n        r.x = e;\n        r.y = posy\n    }\n    function u() {\n        if (document.body.scrollTop > e)\n            o = false;\n        else\n            o = true\n    }\n    function _() {\n        c();\n        for (var t in s) {\n            f(s[t])\n        }\n    }\n    function c() {\n        if (o) {\n            n.clearRect(0, 0, t, e);\n            for (var i in s) {\n                if (Math.abs(m(r, s[i])) < 2e3) {\n                    s[i].active = .2;\n                    s[i].circle.active = .6\n                } else if (Math.abs(m(r, s[i])) < 2e4) {\n                    s[i].active = .1;\n                    s[i].circle.active = .3\n                } else if (Math.abs(m(r, s[i])) < 5e4) {\n                    s[i].active = .07;\n                    s[i].circle.active = .1\n                } else if (Math.abs(m(r, s[i])) < 2e5) {\n                    s[i].active = .05;\n                    s[i].circle.active = .05\n                } else {\n                    s[i].active = 0;\n                    s[i].circle.active = 0\n                }\n                p(s[i]);\n                s[i].circle.draw()\n            }\n        }\n        requestAnimationFrame(c)\n    }\n    function f(t) {\n        TweenLite.to(t, 1 + 1 * Math.random(), {\n            x: t.originX - 50 + Math.random() * 100,\n            y: t.originY - 50 + Math.random() * 100,\n            ease: Circ.easeInOut,\n            onComplete: function() {\n                f(t)\n            }\n        })\n    }\n    function p(t) {\n        if (!t.active)\n            return;\n        for (var e in t.closest) {\n            n.beginPath();\n            n.moveTo(t.x, t.y);\n            n.lineTo(t.closest[e].x, t.closest[e].y);\n            n.strokeStyle = \"rgba(156,217,249,\" + t.active + \")\";\n            n.stroke()\n        }\n    }\n    function d(t, e, i) {\n        var s = this;\n        (function() {\n            s.pos = t || null ;\n            s.radius = e || null ;\n            s.color = i || null\n        })();\n        this.draw = function() {\n            if (!s.active)\n                return;\n            n.beginPath();\n            n.arc(s.pos.x, s.pos.y, s.radius, 0, 2 * Math.PI, false);\n            n.fillStyle = \"rgba(255,255,255,\" + s.active + \")\";\n            n.fill()\n        }\n    }\n    function m(t, e) {\n        return Math.pow(t.x - e.x, 2) + Math.pow(t.y - e.y, 2)\n    }\n})();\n"
  },
  {
    "path": "public/js/join-group.js",
    "content": "var fullname = document.getElementById(\"fullname\");\nvar telphoneRegex = /^0?(13[0-9]|15[0-9]|17[0-9]|18[0-9]|14[0-9])[0-9]{8}$/;\nvar emailRegex = /^(\\w)+(\\.\\w+)*@(\\w)+((\\.\\w+)+)$/;\nvar telphone = document.getElementById(\"telphone\");\nvar email = document.getElementById(\"email\");\nvar commit= document.getElementById(\"commit\");\nvar app = angular.module('app',[]);\napp.controller('group',['$scope','$http', function($scope,$http){\n  $scope.commit=function(){\n    if(validator()){\n      $http.post('/update-profile',{email:$scope.email,username:$('#username').val(),fullname:$scope.fullname,telphone:$scope.telphone,wechat:$scope.wechat,location:$(\"#location\").val(),background:$('#background').val(),group:true}).then(function(res){\n        if(res.status == 200){\n          $(\"form\").html(\"<h3 class='text-center'>恭喜你，报名成功！我们稍后会把你拉到对应城市的学习群，也会在你的城市举办线下活动，敬请期待！</h3><h3 class='text-center'>你也可以直接添加微信号:<span style='color:#4CAF50;'>fcczhongguo</span> 来申请入群（记得备注姓名和所在城市哦 ^_^）。</h3><img class='text-center center-block img-responsive' src='/images/fcczhongguo.jpg'>\")\n          //alert(\"恭喜你，报名成功！我们后续会把你拉到对应的学习群，也会在你的城市举办线下活动，敬请期待！\")\n        }\n      },function(err){\n        console.log(err);\n      })\n    }\n  }\n}])\nfunction validator(){\n  if(!$(\"#fullname\").val().replace(/(^s*)|(s*$)/g,'')){\n    alert(\"用户名为空，请重新输入！\")\n    return false;\n  }else if(!$(\"#email\").val().replace(/(^s*)|(s*$)/g,'')){\n    alert(\"邮箱为空，请重新输入！\")\n    return false;\n  }else if(!emailRegex.test($(\"#email\").val())){\n    alert(\"邮箱不合法，请重新输入！\")\n  }else if(!$(\"#telphone\").val().replace(/(^s*)|(s*$)/g,'')){\n    alert(\"手机号为空，请重新输入！\")\n    return false;\n  }else if(!telphoneRegex.test($(\"#telphone\").val())){\n    alert(\"手机号错误，请重新输入！\")\n    return false;\n  }else if(!$(\"#location\").val()){\n    alert(\"请先选择城市，再提交！\");\n    return false;\n  }else if(!$(\"#background\").val()){\n    alert(\"请先选择背景，再提交！\");\n    return false;\n  }else{\n    return true;\n  }\n}\n"
  },
  {
    "path": "public/js/join-race.js",
    "content": "$('#iwantjoin').click(function(){\n  $(\".btn-lg\").click();\n})\n$('.carousel').carousel({\n  interval: 5000\n});\nvar username = document.getElementById(\"username\");\nvar telphoneRegex = /^0?(13[0-9]|15[0-9]|17[0-9]|18[0-9]|14[0-9])[0-9]{8}$/;\nvar emailRegex = /^(\\w)+(\\.\\w+)*@(\\w)+((\\.\\w+)+)$/;\nvar telphone = document.getElementById(\"telphone\");\nvar email = document.getElementById(\"email\");\nvar commit= document.getElementById(\"commit\");\nvar app = angular.module('app',[]);\napp.controller('modal',['$scope','$http', function($scope,$http){\n  $scope.commit=function(){\n    if(validator()){\n      $http.post('/has-username',{username:$scope.username}).then(function(res){\n        var out = res.data;\n        if(out.status == 404){\n          alert(\"用户名不存在，请先注册FCC！\")\n        }else{\n          $http.post('/has-join',{username:$scope.username,telphone:$scope.telphone}).then(function(res){\n            var out = res.data;\n            if(out.status == 200){\n              alert(\"你已报名成功，请勿重复报名！\");\n              $(\".close\").click();\n              $('.btn-lg').text('报名成功').attr('disabled',true);\n              window.open(\"/progress\");\n            }else{\n              $http.post('/add-telphone',{username:$scope.username,telphone:$scope.telphone,category:$(\"select\").val()}).then(function(res){\n                var out = res.data;\n                if(out.status == 200){\n                  alert(\"恭喜你，报名成功！\");\n                  $(\".close\").click();\n                  $('.btn-lg').text('报名成功').attr('disabled',true);\n                  window.open(\"/progress\");\n                }else{\n                  alert(\"提交数据有误，请重新输入！\")\n                }\n              },function(err){\n                console.log(err);\n              })\n            }\n          },function(err){\n            console.log(err);\n          })\n        }\n      },function(err){\n        console.log(err);\n      })\n    }\n  }\n}])\nfunction validator(){\n  if(!$(\"#username\").val().replace(/(^s*)|(s*$)/g,'')){\n    alert(\"用户名为空，请重新输入！\")\n    return false;\n  }else if(!$(\"#telphone\").val().replace(/(^s*)|(s*$)/g,'')){\n    alert(\"手机号为空，请重新输入！\")\n    return false;\n  }else if(!telphoneRegex.test($(\"#telphone\").val())){\n    alert(\"手机号错误，请重新输入！\")\n    return false;\n  }else if(!$(\"select\").val()){\n    alert(\"请先选组，再提交！\");\n    return false;\n  }else{\n    return true;\n  }\n}\n"
  },
  {
    "path": "public/js/lib/jailed/_JailedSite.js",
    "content": "\n/**\n * Contains the JailedSite object used both by the application\n * site, and by each plugin\n */\n\n(function(){\n     \n    /**\n     * JailedSite object represents a single site in the\n     * communication protocol between the application and the plugin\n     * \n     * @param {Object} connection a special object allowing to send\n     * and receive messages from the opposite site (basically it\n     * should only provide send() and onMessage() methods)\n     */\n    JailedSite = function(connection) {\n        this._interface = {};\n        this._remote = null;\n        this._remoteUpdateHandler = function(){};\n        this._getInterfaceHandler = function(){};\n        this._interfaceSetAsRemoteHandler = function(){};\n        this._disconnectHandler = function(){};\n        this._store = new ReferenceStore;\n\n        var me = this;\n        this._connection = connection;\n        this._connection.onMessage(\n            function(data){ me._processMessage(data); }\n        );\n\n        this._connection.onDisconnect(\n            function(m){\n                me._disconnectHandler(m);\n            }\n        );\n    }\n\n\n    /**\n     * Set a handler to be called when the remote site updates its\n     * interface\n     * \n     * @param {Function} handler\n     */\n    JailedSite.prototype.onRemoteUpdate = function(handler) {\n        this._remoteUpdateHandler = handler;\n    }\n\n\n    /**\n     * Set a handler to be called when received a responce from the\n     * remote site reporting that the previously provided interface\n     * has been succesfully set as remote for that site\n     * \n     * @param {Function} handler\n     */\n    JailedSite.prototype.onInterfaceSetAsRemote = function(handler) {\n        this._interfaceSetAsRemoteHandler = handler;\n    }\n\n\n    /**\n     * Set a handler to be called when the remote site requests to\n     * (re)send the interface. Used to detect an initialzation\n     * completion without sending additional request, since in fact\n     * 'getInterface' request is only sent by application at the last\n     * step of the plugin initialization\n     * \n     * @param {Function} handler\n     */\n    JailedSite.prototype.onGetInterface = function(handler) {\n        this._getInterfaceHandler = handler;\n    }\n\n\n    /**\n     * @returns {Object} set of remote interface methods\n     */\n    JailedSite.prototype.getRemote = function() {\n        return this._remote;\n    }\n\n\n    /**\n     * Sets the interface of this site making it available to the\n     * remote site by sending a message with a set of methods names\n     * \n     * @param {Object} _interface to set\n     */\n    JailedSite.prototype.setInterface = function(_interface) {\n        this._interface = _interface;\n        this._sendInterface();\n    }\n\n\n    /**\n     * Sends the actual interface to the remote site upon it was\n     * updated or by a special request of the remote site\n     */\n    JailedSite.prototype._sendInterface = function() {\n        var names = [];\n        for (var name in this._interface) {\n            if (this._interface.hasOwnProperty(name)) {\n                names.push(name);\n            }\n        }\n\n        this._connection.send({type:'setInterface', api: names});\n    }\n\n\n    /**\n     * Handles a message from the remote site\n     */\n    JailedSite.prototype._processMessage = function(data) {\n         switch(data.type) {\n         case 'method':\n             var method = this._interface[data.name];\n             var args = this._unwrap(data.args);\n             method.apply(null, args);\n             break;\n         case 'callback':\n             var method = this._store.fetch(data.id)[data.num];\n             var args = this._unwrap(data.args);\n             method.apply(null, args);\n             break;\n         case 'setInterface':\n             this._setRemote(data.api);\n             break;\n         case 'getInterface':\n             this._sendInterface();\n             this._getInterfaceHandler();\n             break;\n         case 'interfaceSetAsRemote':\n             this._interfaceSetAsRemoteHandler();\n             break;\n         case 'disconnect':\n             this._disconnectHandler();\n             this._connection.disconnect();\n             break;\n         }\n    }\n\n\n    /**\n     * Sends a requests to the remote site asking it to provide its\n     * current interface\n     */\n    JailedSite.prototype.requestRemote = function() {\n        this._connection.send({type:'getInterface'});\n    }\n\n\n    /**\n     * Sets the new remote interface provided by the other site\n     * \n     * @param {Array} names list of function names\n     */\n    JailedSite.prototype._setRemote = function(names) {\n        this._remote = {};\n        var i, name;\n        for (i = 0; i < names.length; i++) {\n            name = names[i];\n            this._remote[name] = this._genRemoteMethod(name);\n        }\n\n        this._remoteUpdateHandler();\n        this._reportRemoteSet();\n    }\n     \n     \n    /**\n     * Generates the wrapped function corresponding to a single remote\n     * method. When the generated function is called, it will send the\n     * corresponding message to the remote site asking it to execute\n     * the particular method of its interface\n     * \n     * @param {String} name of the remote method\n     * \n     * @returns {Function} wrapped remote method\n     */\n    JailedSite.prototype._genRemoteMethod = function(name) {\n        var me = this;\n        var remoteMethod = function() {\n            me._connection.send({\n                type: 'method',\n                name: name,\n                args: me._wrap(arguments)\n            });\n        };\n\n        return remoteMethod;\n    }\n\n\n    /**\n     * Sends a responce reporting that interface just provided by the\n     * remote site was sucessfully set by this site as remote\n     */\n    JailedSite.prototype._reportRemoteSet = function() {\n        this._connection.send({type:'interfaceSetAsRemote'});\n    }\n\n\n    /**\n     * Prepares the provided set of remote method arguments for\n     * sending to the remote site, replaces all the callbacks with\n     * identifiers\n     * \n     * @param {Array} args to wrap \n     * \n     * @returns {Array} wrapped arguments\n     */\n    JailedSite.prototype._wrap = function(args) {\n        var wrapped = [];\n        var callbacks = {};\n        var callbacksPresent = false;\n        for (var i = 0; i < args.length; i++) {\n            if (typeof args[i] == 'function') {\n                callbacks[i] = args[i];\n                wrapped[i] = {type: 'callback', num : i};\n                callbacksPresent = true;\n            } else {\n                wrapped[i] = {type: 'argument', value : args[i]};\n            }\n        }\n\n        var result = {args: wrapped};\n\n        if (callbacksPresent) {\n            result.callbackId = this._store.put(callbacks);\n        }\n\n        return result;\n    }\n\n\n    /**\n     * Unwraps the set of arguments delivered from the remote site,\n     * replaces all callback identifiers with a function which will\n     * initiate sending that callback identifier back to other site\n     * \n     * @param {Object} args to unwrap\n     * \n     * @returns {Array} unwrapped args\n     */\n    JailedSite.prototype._unwrap = function(args) {\n        var called = false;\n        \n        // wraps each callback so that the only one could be called\n        var once = function(cb) {\n            return function() {\n                if (!called) {\n                    called = true;\n                    cb.apply(this, arguments);\n                } else {\n                    var msg =\n                      'A callback from this set has already been executed';\n                    throw new Error(msg);\n                }\n            };\n        }\n        \n        var result = [];\n        var i, arg, cb, me = this;\n        for (i = 0; i < args.args.length; i++) {\n            arg = args.args[i];\n            if (arg.type == 'argument') {\n                result.push(arg.value);\n            } else {\n                cb = once(\n                    this._genRemoteCallback(args.callbackId, i)\n                );\n                result.push(cb);\n            }\n        }\n\n        return result;\n    }\n     \n     \n    /**\n     * Generates the wrapped function corresponding to a single remote\n     * callback. When the generated function is called, it will send\n     * the corresponding message to the remote site asking it to\n     * execute the particular callback previously saved during a call\n     * by the remote site a method from the interface of this site\n     * \n     * @param {Number} id of the remote callback to execute\n     * @param {Number} argNum argument index of the callback\n     * \n     * @returns {Function} wrapped remote callback\n     */\n    JailedSite.prototype._genRemoteCallback = function(id, argNum) {\n        var me = this;\n        var remoteCallback = function() {\n            me._connection.send({\n                type : 'callback',\n                id   : id,\n                num  : argNum,\n                args : me._wrap(arguments)\n            });\n        };\n\n        return remoteCallback;\n    }\n\n     \n    /**\n     * Sends the notification message and breaks the connection\n     */\n    JailedSite.prototype.disconnect = function() {\n        this._connection.send({type: 'disconnect'});\n        this._connection.disconnect();\n    }\n    \n     \n    /**\n     * Set a handler to be called when received a disconnect message\n     * from the remote site\n     * \n     * @param {Function} handler\n     */\n    JailedSite.prototype.onDisconnect = function(handler) {\n        this._disconnectHandler = handler;\n    }\n     \n     \n     \n\n    /**\n     * ReferenceStore is a special object which stores other objects\n     * and provides the references (number) instead. This reference\n     * may then be sent over a json-based communication channel (IPC\n     * to another Node.js process or a message to the Worker). Other\n     * site may then provide the reference in the responce message\n     * implying the given object should be activated.\n     * \n     * Primary usage for the ReferenceStore is a storage for the\n     * callbacks, which therefore makes it possible to initiate a\n     * callback execution by the opposite site (which normally cannot\n     * directly execute functions over the communication channel).\n     * \n     * Each stored object can only be fetched once and is not\n     * available for the second time. Each stored object must be\n     * fetched, since otherwise it will remain stored forever and\n     * consume memory.\n     * \n     * Stored object indeces are simply the numbers, which are however\n     * released along with the objects, and are later reused again (in\n     * order to postpone the overflow, which should not likely happen,\n     * but anyway).\n     */\n    var ReferenceStore = function() {\n        this._store = {};    // stored object\n        this._indices = [0]; // smallest available indices\n    }\n\n\n    /**\n     * @function _genId() generates the new reference id\n     * \n     * @returns {Number} smallest available id and reserves it\n     */\n    ReferenceStore.prototype._genId = function() {\n        var id;\n        if (this._indices.length == 1) {\n            id = this._indices[0]++;\n        } else {\n            id = this._indices.shift();\n        }\n\n        return id;\n    }\n\n\n    /**\n     * Releases the given reference id so that it will be available by\n     * another object stored\n     * \n     * @param {Number} id to release\n     */\n    ReferenceStore.prototype._releaseId = function(id) {\n        for (var i = 0; i < this._indices.length; i++) {\n            if (id < this._indices[i]) {\n                this._indices.splice(i, 0, id);\n                break;\n            }\n        }\n\n        // cleaning-up the sequence tail\n        for (i = this._indices.length-1; i >= 0; i--) {\n            if (this._indices[i]-1 == this._indices[i-1]) {\n                this._indices.pop();\n            } else {\n                break;\n            }\n        }\n    }\n\n\n    /**\n     * Stores the given object and returns the refernce id instead\n     * \n     * @param {Object} obj to store\n     * \n     * @returns {Number} reference id of the stored object\n     */\n    ReferenceStore.prototype.put = function(obj) {\n        var id = this._genId();\n        this._store[id] = obj;\n        return id;\n    }\n\n\n    /**\n     * Retrieves previously stored object and releases its reference\n     * \n     * @param {Number} id of an object to retrieve\n     */\n    ReferenceStore.prototype.fetch = function(id) {\n        var obj = this._store[id];\n        this._store[id] = null;\n        delete this._store[id];\n        this._releaseId(id);\n        return obj;\n    }\n\n\n})();\n\n"
  },
  {
    "path": "public/js/lib/jailed/_frame.html",
    "content": "<script sandbox=\"allow-same-origin allow-scripts\" src=\"_frame.js\"></script>\n"
  },
  {
    "path": "public/js/lib/jailed/_frame.js",
    "content": "\n/**\n * Contains the code executed in the sandboxed frame under web-browser\n * \n * Creates a Web-Worker inside the frame, sets up the communication\n * between the worker and the parent window\n */\n\n\nvar scripts = document.getElementsByTagName('script');\nvar __jailed__path__ = scripts[scripts.length-1].src\n    .split('?')[0]\n    .split('/')\n    .slice(0, -1)\n    .join('/') + '/';\n\n// creating worker as a blob enables import of local files\nvar blobCode = [\n  ' self.addEventListener(\"message\", function(m){          ',\n  '     if (m.data.type == \"initImport\") {                 ',\n  '         importScripts(m.data.url);                     ',\n  '         self.postMessage({type: \"initialized\"});       ',\n  '     }                                                  ',\n  ' });                                                    '\n].join('\\n');\n\nvar blobUrl;\ntry {\n  blobUrl = new Blob([blobCode], {type: 'application/javascript'});\n} catch (e) {\n  window.BlobBuilder = window.BlobBuilder\n    || window.WebKitBlobBuilder\n    || window.MozBlobBuilder;\n  blobUrl = new BlobBuilder();\n  blobUrl.append(blobCode);\n  blobUrl = blobUrl.getBlob();\n}\n\nvar worker = new Worker(URL.createObjectURL(blobUrl));\n\n// telling worker to load _pluginWeb.js (see blob code above)\nworker.postMessage({\n    type: 'initImport',\n    url: __jailed__path__ + '_pluginWeb.js'\n});\n\n\n// forwarding messages between the worker and parent window\nworker.addEventListener('message', function(m) {\n    parent.postMessage(m.data, '*');\n});\n\nwindow.addEventListener('message', function(m) {\n    worker.postMessage(m.data);\n});\n\n"
  },
  {
    "path": "public/js/lib/jailed/_pluginCore.js",
    "content": "\n/**\n * Core plugin script loaded into the plugin process/thread.\n * \n * Initializes the plugin-site API global methods.\n */\n\n(function(){\n     \n    // localize\n    var site = new JailedSite(connection);\n    delete JailedSite;\n    delete connection;\n     \n    site.onGetInterface(function(){\n        launchConnected();\n    });\n     \n    site.onRemoteUpdate(function(){\n        application.remote = site.getRemote();\n    });\n     \n     \n\n    /**\n     * Simplified clone of Whenable instance (the object can not be\n     * placed into a shared script, because the main library needs it\n     * before the additional scripts may load)\n     */\n    var connected = false;\n    var connectedHandlers = [];\n     \n    var launchConnected = function() {\n        if (!connected) {\n            connected = true;\n\n            var handler;\n            while(handler = connectedHandlers.pop()) {\n                handler();\n            }\n        }\n    }\n     \n    var checkHandler = function(handler){\n        var type = typeof handler;\n        if (type != 'function') {\n            var msg =\n                'A function may only be subsribed to the event, '\n                + type\n                + ' was provided instead'\n            throw new Error(msg);\n        }\n\n        return handler;\n    }\n    \n     \n    /**\n     * Sets a function executed after the connection to the\n     * application is estaplished, and the initial interface-exchange\n     * messaging is completed\n     * \n     * @param {Function} handler to be called upon initialization\n     */\n    application.whenConnected = function(handler) {\n        handler = checkHandler(handler);\n        if (connected) {\n            handler();\n        } else {\n            connectedHandlers.push(handler);\n        }\n    }\n\n\n    /**\n     * Sets the plugin interface available to the application\n     * \n     * @param {Object} _interface to set\n     */\n    application.setInterface = function(_interface) {\n        site.setInterface(_interface);\n    }\n\n \n \n    /**\n     * Disconnects the plugin from the application (sending\n     * notification message) and destroys itself\n     */\n    application.disconnect = function(_interface) {\n        site.disconnect();\n    }\n\n})();\n\n"
  },
  {
    "path": "public/js/lib/jailed/_pluginNode.js",
    "content": "\n/**\n * Contains the routines loaded by the plugin process under Node.js\n * \n * Initializes the Node.js environment version of the\n * platform-dependent connection object for the plugin site\n */\n\napplication = {};\nconnection = {};\n\n\n/**\n * Prints error message and its stack\n * \n * @param {Object} msg stack provided by error.stack or a message\n */\nvar printError = function(msg) {\n    console.error();\n    console.error(msg);\n}\n\n\n/**\n * Event lisener for the plugin message\n */\nprocess.on('message', function(m) {\n    switch(m.type){\n    case 'import':\n        importScript(m.url);\n        break;\n    case 'importJailed':\n        importScriptJailed(m.url);\n        break;\n    case 'execute':\n        execute(m.code);\n        break;\n    case 'message':\n        // unhandled exception would break the IPC channel\n        try {\n            conn._messageHandler(m.data);\n        } catch(e) {\n            printError(e.stack);\n        }\n        break;\n    }\n});\n\n\n/**\n * Checks if the given path is remote\n * \n * @param {String} path to check\n * @returns {Boolean} true if path is remote\n */\nvar isRemote = function(path) {\n    return (path.substr(0,7).toLowerCase() == 'http://' ||\n            path.substr(0,8).toLowerCase() == 'https://');\n}\n\n\n/**\n * Loads and executes the JavaScript file with the given url\n *\n * @param {String} url of the script to load\n */\nvar importScript = function(url) {\n    var sCb = function() {\n       process.send({type: 'importSuccess', url: url});\n    }\n\n    var fCb = function() {\n        process.send({type: 'importFailure', url: url});\n    }\n\n    var run = function(code) {\n        executeNormal(code, url, sCb, fCb);\n    }\n    \n    if (isRemote(url)) {\n        loadRemote(url, run, fCb);\n    } else {\n        try {\n            run(loadLocal(url));\n        } catch(e) {\n            printError(e.stack);\n            fCb();\n        }\n    }\n\n}\n\n\n/**\n * Loads and executes the JavaScript file with the given url in a\n * jailed environment\n *\n * @param {String} url of the script to load\n */\nvar importScriptJailed = function(url) {\n    var sCb = function() {\n       process.send({type: 'importSuccess', url: url});\n    }\n\n    var fCb = function() {\n       process.send({type: 'importFailure', url: url});\n    }\n\n    var run = function(code) {\n        executeJailed(code, url, sCb, fCb);\n    }\n    \n    if (isRemote(url)) {\n        loadRemote(url, run, fCb);\n    } else {\n        try {\n            run(loadLocal(url));\n        } catch (e) {\n            printError(e.stack);\n            fCb();\n        }\n\n    }\n\n}\n\n\n/**\n * Executes the given code in the jailed environment, sends the\n * corresponding message to the application site when succeeded/failed\n * \n * @param {String} code to execute\n */\nvar execute = function(code) {\n    var sCb = function() {\n        process.send({type: 'executeSuccess'});\n    }\n\n    var fCb = function() {\n        process.send({type: 'executeFailure'});\n    }\n\n    executeJailed(code, 'DYNAMIC PLUGIN', sCb, fCb);\n}\n\n\n/**\n * Executes the given code in the current environment / scope, runs\n * the corresponding callback when done\n * \n * @param {String} code to execute\n * @param {String} url of the script (for displaying the stack)\n * @param {Function} sCb\n * @param {Function} fCb\n */\nvar executeNormal = function(code, url, sCb, fCb) {\n    var err = null;\n    try {\n        require('vm').runInThisContext(code, url);\n        sCb();\n    } catch (e) {\n        printError(e.stack);\n        fCb();\n    }\n}\n\n\n/**\n * Executes the given code in a jailed environment, runs the\n * corresponding callback when done\n * \n * @param {String} code to execute\n * @param {String} url of the script (for displaying the stack)\n * @param {Function} sCb\n * @param {Function} fCb\n */\nvar executeJailed = function(code, url, sCb, fCb) {\n    var vm  = require('vm');\n    var sandbox = {};\n    var expose = [\n        'application',\n        'setTimeout',\n        'setInterval',\n        'clearTimeout',\n        'clearInterval'\n    ];\n\n    for (var i = 0; i < expose.length; i++) {\n        sandbox[expose[i]] = global[expose[i]];\n    }\n\n    code = '\"use strict\";\\n'+code;\n    try {\n        vm.runInNewContext(code, vm.createContext(sandbox), url);\n        sCb();\n    } catch (e) {\n        printError(e.stack);\n        fCb();\n    }\n}\n\n\n/**\n * Loads local file and \n * \n * @param {String} path of the file to read\n * \n * @returns {String} file contents\n */\nvar loadLocal = function(path) {\n    return require(\"fs\").readFileSync(path).toString();\n}\n\n\n/**\n * Downloads the script by remote url and provides its content as a\n * string to the callback\n * \n * @param {String} url of the remote module to load\n * @param {Function} sCb success callback\n * @param {Function} fCb failure callback\n */\nvar loadRemote = function(url, sCb, fCb) {\n    var receive = function(res) {\n        if (res.statusCode != 200) {\n            var msg = 'Failed to load ' + url + '\\n' +\n                'HTTP responce status code: ' + res.statusCode;\n            printError(msg);\n            fCb();\n        } else {\n            var content = '';\n            res.on('end', function(){ sCb(content); });\n            res.on(\n                'readable',\n                function() {\n                    var chunk = res.read();\n                    content += chunk.toString();\n                }\n           );\n        }\n    }\n\n    try {\n        require('http').get(url, receive).on('error', fCb);\n    } catch (e) {\n        printError(e.stack);\n        fCb();\n    }\n}\n\n\n/**\n * Connection object provided to the SandboxedSite constructor, plugin\n * site implementation for the Node.js environment\n */\nvar conn = {\n    disconnect: function(){ process.exit(); },\n    send: function(data) {\n        process.send({type: 'message', data: data});\n    },\n    onMessage: function(h){ conn._messageHandler = h; },\n    _messageHandler: function(){},\n    onDisconnect: function() {}\n};\n \nconnection = conn;\n\n"
  },
  {
    "path": "public/js/lib/jailed/_pluginWeb.js",
    "content": "\n/**\n * Contains the routines loaded by the plugin Worker under web-browser.\n * \n * Initializes the web environment version of the platform-dependent\n * connection object for the plugin site\n */\n\nself.application = {};\nself.connection = {};\n\n\n(function(){\n     \n    /**\n     * Event lisener for the plugin message\n     */\n    self.addEventListener('message', function(e){\n        var m = e.data.data;\n        switch (m.type) {\n        case 'import':\n        case 'importJailed':  // already jailed in the Worker\n            importScript(m.url);\n            break;\n        case 'execute':\n            execute(m.code);\n            break;\n        case 'message':\n            conn._messageHandler(m.data);\n            break;\n        }\n     });\n\n\n    /**\n     * Loads and executes the JavaScript file with the given url\n     *\n     * @param {String} url to load\n     */\n    var importScript = function(url) {\n        var error = null;\n        try {\n            importScripts(url);\n        } catch (e) {\n            error = e;\n        }\n\n        if (error) {\n           self.postMessage({type: 'importFailure', url: url});\n           throw error;\n        } else {\n           self.postMessage({type: 'importSuccess', url: url});\n        }\n\n    }\n\n\n    /**\n     * Executes the given code in a jailed environment. For web\n     * implementation, we're already jailed in the worker, so simply\n     * eval()\n     * \n     * @param {String} code code to execute\n     */\n    var execute = function(code) {\n        try {\n            eval(code);\n        } catch (e) {\n            self.postMessage({type: 'executeFailure'});\n            throw e;\n        }\n\n        self.postMessage({type: 'executeSuccess'});\n    }\n\n     \n    /**\n     * Connection object provided to the JailedSite constructor,\n     * plugin site implementation for the web-based environment.\n     * Global will be then cleared to prevent exposure into the\n     * Worker, so we put this local connection object into a closure\n     */\n    var conn = {\n        disconnect: function(){ self.close(); },\n        send: function(data) {\n            self.postMessage({type: 'message', data: data});\n        },\n        onMessage: function(h){ conn._messageHandler = h; },\n        _messageHandler: function(){},\n        onDisconnect: function() {}\n    };\n     \n    connection = conn;\n     \n})();\n\n"
  },
  {
    "path": "public/js/lib/jailed/jailed.js",
    "content": "/**\n * @fileoverview Jailed - safe yet flexible sandbox\n * @version 0.2.0\n * \n * @license MIT, see http://github.com/asvd/jailed\n * Copyright (c) 2014 asvd <heliosframework@gmail.com> \n * \n * Main library script, the only one to be loaded by a developer into\n * the application. Other scrips shipped along will be loaded by the\n * library either here (application site), or into the plugin site\n * (Worker/child process):\n *\n *  _JailedSite.js    loaded into both applicaiton and plugin sites\n *  _frame.html       sandboxed frame (web)\n *  _frame.js         sandboxed frame code (web)\n *  _pluginWeb.js     platform-dependent plugin routines (web)\n *  _pluginNode.js    platform-dependent plugin routines (Node.js)\n *  _pluginCore.js    common plugin site protocol implementation\n */\n\n\nvar __jailed__path__;\nif (typeof window == 'undefined') {\n    // Node.js\n    __jailed__path__ = __dirname + '/';\n} else {\n    // web\n    var scripts = document.getElementsByTagName('script');\n    __jailed__path__ = scripts[scripts.length-1].src\n        .split('?')[0]\n        .split('/')\n        .slice(0, -1)\n        .join('/')+'/';\n}\n\n\n(function (root, factory) {\n    if (typeof define === 'function' && define.amd) {\n        define(['exports'], factory);\n    } else if (typeof exports !== 'undefined') {\n        factory(exports);\n    } else {\n        factory((root.jailed = {}));\n    }\n}(this, function (exports) {\n    var isNode = typeof window == 'undefined';\n      \n\n    /**\n     * A special kind of event:\n     *  - which can only be emitted once;\n     *  - executes a set of subscribed handlers upon emission;\n     *  - if a handler is subscribed after the event was emitted, it\n     *    will be invoked immideately.\n     * \n     * Used for the events which only happen once (or do not happen at\n     * all) during a single plugin lifecycle - connect, disconnect and\n     * connection failure\n     */\n    var Whenable = function() {\n        this._emitted = false;\n        this._handlers = [];\n    }\n\n\n    /**\n     * Emits the Whenable event, calls all the handlers already\n     * subscribed, switches the object to the 'emitted' state (when\n     * all future subscibed listeners will be immideately issued\n     * instead of being stored)\n     */\n    Whenable.prototype.emit = function(){\n        if (!this._emitted) {\n            this._emitted = true;\n\n            var handler;\n            while(handler = this._handlers.pop()) {\n                setTimeout(handler,0);\n            }\n        }\n    }\n     \n     \n    /**\n     * Saves the provided function as a handler for the Whenable\n     * event. This handler will then be called upon the event emission\n     * (if it has not been emitted yet), or will be scheduled for\n     * immediate issue (if the event has already been emmitted before)\n     * \n     * @param {Function} handler to subscribe for the event\n     */\n    Whenable.prototype.whenEmitted = function(handler){\n        handler = this._checkHandler(handler);\n        if (this._emitted) {\n            setTimeout(handler, 0);\n        } else {\n            this._handlers.push(handler);\n        }\n    }\n\n     \n    /**\n     * Checks if the provided object is suitable for being subscribed\n     * to the event (= is a function), throws an exception if not\n     * \n     * @param {Object} obj to check for being subscribable\n     * \n     * @throws {Exception} if object is not suitable for subscription\n     * \n     * @returns {Object} the provided object if yes\n     */\n    Whenable.prototype._checkHandler = function(handler){\n        var type = typeof handler;\n        if (type != 'function') {\n            var msg =\n                'A function may only be subsribed to the event, '\n                + type\n                + ' was provided instead'\n            throw new Error(msg);\n        }\n\n        return handler;\n    }\n      \n      \n      \n    /**\n     * Initializes the library site for Node.js environment (loads\n     * _JailedSite.js)\n     */\n    var initNode = function() {\n        require('./_JailedSite.js');\n    }\n      \n      \n    /**\n     * Initializes the library site for web environment (loads\n     * _JailedSite.js)\n     */\n    var platformInit;\n    var initWeb = function() {\n        // loads additional script to the application environment\n        var load = function(path, cb) {\n            var script = document.createElement('script');\n            script.src = path;\n\n            var clear = function() {\n                script.onload = null;\n                script.onerror = null;\n                script.onreadystatechange = null;\n                script.parentNode.removeChild(script);\n            }\n\n            var success = function() {\n                clear();\n                cb();\n            }\n\n            script.onerror = clear;\n            script.onload = success;\n            script.onreadystatechange = function() {\n                var state = script.readyState;\n                if (state==='loaded' || state==='complete') {\n                    success();\n                }\n            }\n\n            document.body.appendChild(script);\n        }\n\n        platformInit = new Whenable;\n        var origOnload = window.onload || function(){};\n\n        window.onload = function(){\n            origOnload();\n            load(\n                __jailed__path__+'_JailedSite.js',\n                function(){ platformInit.emit(); }\n            );\n        }\n    }\n\n\n    var BasicConnection;\n      \n    /**\n     * Creates the platform-dependent BasicConnection object in the\n     * Node.js environment\n     */\n    var basicConnectionNode = function() {\n        var childProcess = require('child_process');\n\n        /**\n         * Platform-dependent implementation of the BasicConnection\n         * object, initializes the plugin site and provides the basic\n         * messaging-based connection with it\n         * \n         * For Node.js the plugin is created as a forked process\n         */\n        BasicConnection = function() {\n            this._disconnected = false;\n            this._messageHandler = function(){};\n            this._disconnectHandler = function(){};\n            this._process = childProcess.fork(\n                __jailed__path__+'_pluginNode.js'\n            );\n\n            var me = this;\n            this._process.on('message', function(m){\n                me._messageHandler(m);\n            });\n\n            this._process.on('exit', function(m){\n                me._disconnected = true;\n                me._disconnectHandler(m);\n            });\n        }\n\n\n        /**\n         * Sets-up the handler to be called upon the BasicConnection\n         * initialization is completed.\n         * \n         * For Node.js the connection is fully initialized within the\n         * constructor, so simply calls the provided handler.\n         * \n         * @param {Function} handler to be called upon connection init\n         */\n        BasicConnection.prototype.whenInit = function(handler) {\n            handler();\n        }\n\n\n        /**\n         * Sends a message to the plugin site\n         * \n         * @param {Object} data to send\n         */\n        BasicConnection.prototype.send = function(data) {\n            if (!this._disconnected) {\n                this._process.send(data);\n            }\n        }\n\n\n        /**\n         * Adds a handler for a message received from the plugin site\n         * \n         * @param {Function} handler to call upon a message\n         */\n        BasicConnection.prototype.onMessage = function(handler) {\n            this._messageHandler = function(data) {\n                // broken stack would break the IPC in Node.js\n                try {\n                    handler(data);\n                } catch (e) {\n                    console.error();\n                    console.error(e.stack);\n                }\n            }\n        }\n\n\n        /**\n         * Adds a handler for the event of plugin disconnection\n         * (= plugin process exit)\n         * \n         * @param {Function} handler to call upon a disconnect\n         */\n        BasicConnection.prototype.onDisconnect = function(handler) {\n            this._disconnectHandler = handler;\n        }\n\n\n        /**\n         * Disconnects the plugin (= kills the forked process)\n         */\n        BasicConnection.prototype.disconnect = function() {\n            this._process.kill('SIGKILL');\n            this._disconnected = true;\n        }\n\n    }\n\n\n    /**\n     * Creates the platform-dependent BasicConnection object in the\n     * web-browser environment\n     */\n    var basicConnectionWeb = function() {\n        var perm = ['allow-scripts'];\n\n        if (__jailed__path__.substr(0,7).toLowerCase() == 'file://') {\n            // local instance requires extra permission\n            perm.push('allow-same-origin');\n        }\n\n        // frame element to be cloned\n        var sample = document.createElement('iframe');\n        sample.src = __jailed__path__ + '_frame.html';\n        sample.sandbox = perm.join(' ');\n        sample.style.display = 'none';\n\n\n        /**\n         * Platform-dependent implementation of the BasicConnection\n         * object, initializes the plugin site and provides the basic\n         * messaging-based connection with it\n         * \n         * For the web-browser environment, the plugin is created as a\n         * Worker in a sandbaxed frame\n         */\n        BasicConnection = function() {\n            this._init = new Whenable;\n            this._disconnected = false;\n\n            var me = this;\n            platformInit.whenEmitted(function() {\n                if (!me._disconnected) {\n                    me._frame = sample.cloneNode(false);\n                    document.body.appendChild(me._frame);\n\n                    window.addEventListener('message', function (e) {\n                        if (e.origin === \"null\" &&\n                            e.source === me._frame.contentWindow) {\n                            if (e.data.type == 'initialized') {\n                                me._init.emit();\n                            } else {\n                                me._messageHandler(e.data);\n                            }\n                        }\n                    });\n                }\n            });\n        }\n        \n        \n        /**\n         * Sets-up the handler to be called upon the BasicConnection\n         * initialization is completed.\n         * \n         * For the web-browser environment, the handler is issued when\n         * the plugin worker successfully imported and executed the\n         * _pluginWeb.js, and replied to the application site with the\n         * initImprotSuccess message.\n         * \n         * @param {Function} handler to be called upon connection init\n         */\n        BasicConnection.prototype.whenInit = function(handler) {\n            this._init.whenEmitted(handler);\n        }\n\n\n        /**\n         * Sends a message to the plugin site\n         * \n         * @param {Object} data to send\n         */\n        BasicConnection.prototype.send = function(data) {\n            this._frame.contentWindow.postMessage(\n                {type: 'message', data: data}, '*'\n            );\n        }\n\n\n        /**\n         * Adds a handler for a message received from the plugin site\n         * \n         * @param {Function} handler to call upon a message\n         */\n        BasicConnection.prototype.onMessage = function(handler) {\n            this._messageHandler = handler;\n        }\n\n\n        /**\n         * Adds a handler for the event of plugin disconnection\n         * (not used in case of Worker)\n         * \n         * @param {Function} handler to call upon a disconnect\n         */\n        BasicConnection.prototype.onDisconnect = function(){};\n\n\n        /**\n         * Disconnects the plugin (= kills the frame)\n         */\n        BasicConnection.prototype.disconnect = function() {\n            if (!this._disconnected) {\n                this._disconnected = true;\n                if (typeof this._frame != 'undefined') {\n                    this._frame.parentNode.removeChild(this._frame);\n                }  // otherwise farme is not yet created\n            }\n        }\n\n    }\n\n\n    if (isNode) {\n        initNode();\n        basicConnectionNode();\n    } else {\n        initWeb();\n        basicConnectionWeb();\n    }\n\n\n      \n    /**\n     * Application-site Connection object constructon, reuses the\n     * platform-dependent BasicConnection declared above in order to\n     * communicate with the plugin environment, implements the\n     * application-site protocol of the interraction: provides some\n     * methods for loading scripts and executing the given code in the\n     * plugin\n     */\n    var Connection = function(){\n        this._platformConnection = new BasicConnection;\n\n        this._importCallbacks = {};\n        this._executeSCb = function(){};\n        this._executeFCb = function(){};\n        this._messageHandler = function(){};\n\n        var me = this;\n        this.whenInit = function(cb){\n            me._platformConnection.whenInit(cb);\n        };\n\n        this._platformConnection.onMessage(function(m) {\n            switch(m.type) {\n            case 'message':\n                me._messageHandler(m.data);\n                break;\n            case 'importSuccess':\n                me._handleImportSuccess(m.url);\n                break;\n            case 'importFailure':\n                me._handleImportFailure(m.url);\n                break;\n            case 'executeSuccess':\n                me._executeSCb();\n                break;\n            case 'executeFailure':\n                me._executeFCb();\n                break;\n            }\n        });\n    }\n\n\n    /**\n     * Tells the plugin to load a script with the given path, and to\n     * execute it. Callbacks executed upon the corresponding responce\n     * message from the plugin site\n     * \n     * @param {String} path of a script to load\n     * @param {Function} sCb to call upon success\n     * @param {Function} fCb to call upon failure\n     */\n    Connection.prototype.importScript = function(path, sCb, fCb) {\n        var f = function(){};\n        this._importCallbacks[path] = {sCb: sCb||f, fCb: fCb||f};\n        this._platformConnection.send({type: 'import', url: path});\n    }\n      \n\n    /**\n     * Tells the plugin to load a script with the given path, and to\n     * execute it in the JAILED environment. Callbacks executed upon\n     * the corresponding responce message from the plugin site\n     * \n     * @param {String} path of a script to load\n     * @param {Function} sCb to call upon success\n     * @param {Function} fCb to call upon failure\n     */\n    Connection.prototype.importJailedScript = function(path, sCb, fCb) {\n        var f = function(){};\n        this._importCallbacks[path] = {sCb: sCb||f, fCb: fCb||f};\n        this._platformConnection.send({type: 'importJailed', url: path});\n    }\n\n\n    /**\n     * Sends the code to the plugin site in order to have it executed\n     * in the JAILED enviroment. Assuming the execution may only be\n     * requested once by the Plugin object, which means a single set\n     * of callbacks is enough (unlike importing additional scripts)\n     * \n     * @param {String} code code to execute\n     * @param {Function} sCb to call upon success\n     * @param {Function} fCb to call upon failure\n     */\n    Connection.prototype.execute = function(code, sCb, fCb) {\n        this._executeSCb = sCb||function(){};\n        this._executeFCb = fCb||function(){};\n        this._platformConnection.send({type: 'execute', code: code});\n    }\n\n\n    /**\n     * Adds a handler for a message received from the plugin site\n     * \n     * @param {Function} handler to call upon a message\n     */\n    Connection.prototype.onMessage = function(handler) {\n        this._messageHandler = handler;\n    }\n      \n      \n    /**\n     * Adds a handler for a disconnect message received from the\n     * plugin site\n     * \n     * @param {Function} handler to call upon disconnect\n     */\n    Connection.prototype.onDisconnect = function(handler) {\n        this._platformConnection.onDisconnect(handler);\n    }\n\n\n    /**\n     * Sends a message to the plugin\n     * \n     * @param {Object} data of the message to send\n     */\n    Connection.prototype.send = function(data) {\n        this._platformConnection.send({\n            type: 'message',\n            data: data\n        });\n    }\n\n\n    /**\n     * Handles import succeeded message from the plugin\n     * \n     * @param {String} url of a script loaded by the plugin\n     */\n    Connection.prototype._handleImportSuccess = function(url) {\n        var sCb = this._importCallbacks[url].sCb;\n        this._importCallbacks[url] = null;\n        delete this._importCallbacks[url];\n        sCb();\n    }\n\n\n    /**\n     * Handles import failure message from the plugin\n     * \n     * @param {String} url of a script loaded by the plugin\n     */\n    Connection.prototype._handleImportFailure = function(url) {\n        var fCb = this._importCallbacks[url].fCb;\n        this._importCallbacks[url] = null;\n        delete this._importCallbacks[url];\n        fCb();\n    }\n\n\n    /**\n     * Disconnects the plugin when it is not needed anymore\n     */\n    Connection.prototype.disconnect = function() {\n        this._platformConnection.disconnect();\n    }\n\n\n\n\n    /**\n     * Plugin constructor, represents a plugin initialized by a script\n     * with the given path\n     * \n     * @param {String} url of a plugin source\n     * @param {Object} _interface to provide for the plugin\n     */\n    var Plugin = function(url, _interface) {\n        this._path = url;\n        this._initialInterface = _interface||{};\n        this._connect();\n    }\n      \n      \n    /**\n     * DynamicPlugin constructor, represents a plugin initialized by a\n     * string containing the code to be executed\n     * \n     * @param {String} code of the plugin\n     * @param {Object} _interface to provide to the plugin\n     */\n    var DynamicPlugin = function(code, _interface) {\n        this._code = code;\n        this._initialInterface = _interface||{};\n        this._connect();\n    }\n      \n      \n    /**\n     * Creates the connection to the plugin site\n     */\n    DynamicPlugin.prototype._connect =\n           Plugin.prototype._connect = function() {\n        this.remote = null;\n\n        this._connect    = new Whenable;\n        this._fail       = new Whenable;\n        this._disconnect = new Whenable;\n               \n        var me = this;\n               \n        // binded failure callback\n        this._fCb = function(){\n            me._fail.emit();\n            me.disconnect();\n        }\n               \n        this._connection = new Connection;\n        this._connection.whenInit(function(){\n            me._init();\n        });\n    }\n\n\n    /**\n     * Creates the Site object for the plugin, and then loads the\n     * common routines (_JailedSite.js)\n     */\n    DynamicPlugin.prototype._init =\n           Plugin.prototype._init = function() {\n        this._site = new JailedSite(this._connection);\n               \n        var me = this;\n        this._site.onDisconnect(function() {\n            me._disconnect.emit();\n        });\n\n        var sCb = function() {\n            me._loadCore();\n        }\n\n        this._connection.importScript(\n            __jailed__path__+'_JailedSite.js', sCb, this._fCb\n        );\n    }\n\n\n    /**\n     * Loads the core scirpt into the plugin\n     */\n    DynamicPlugin.prototype._loadCore =\n           Plugin.prototype._loadCore = function() {\n        var me = this;\n        var sCb = function() {\n            me._sendInterface();\n        }\n\n        this._connection.importScript(\n            __jailed__path__+'_pluginCore.js', sCb, this._fCb\n        );\n    }\n    \n    \n    /**\n     * Sends to the remote site a signature of the interface provided\n     * upon the Plugin creation\n     */\n    DynamicPlugin.prototype._sendInterface =\n           Plugin.prototype._sendInterface = function() {\n        var me = this;\n        this._site.onInterfaceSetAsRemote(function() {\n            if (!me._connected) {\n                me._loadPlugin();\n            }\n        });\n\n        this._site.setInterface(this._initialInterface);\n    }\n    \n    \n    /**\n     * Loads the plugin body (loads the plugin url in case of the\n     * Plugin)\n     */\n    Plugin.prototype._loadPlugin = function() {\n        var me = this;\n        var sCb = function() {\n            me._requestRemote();\n        }\n\n        this._connection.importJailedScript(this._path, sCb, this._fCb);\n    }\n    \n    \n    /**\n     * Loads the plugin body (executes the code in case of the\n     * DynamicPlugin)\n     */\n    DynamicPlugin.prototype._loadPlugin = function() {\n        var me = this;\n        var sCb = function() {\n            me._requestRemote();\n        }\n\n        this._connection.execute(this._code, sCb, this._fCb);\n    }\n    \n    \n    /**\n     * Requests the remote interface from the plugin (which was\n     * probably set by the plugin during its initialization), emits\n     * the connect event when done, then the plugin is fully usable\n     * (meaning both the plugin and the application can use the\n     * interfaces provided to each other)\n     */\n    DynamicPlugin.prototype._requestRemote = \n           Plugin.prototype._requestRemote = function() {\n        var me = this;\n        this._site.onRemoteUpdate(function(){\n            me.remote = me._site.getRemote();\n            me._connect.emit();\n        });\n\n        this._site.requestRemote();\n    }\n\n    \n    /**\n     * Disconnects the plugin immideately\n     */\n    DynamicPlugin.prototype.disconnect = \n           Plugin.prototype.disconnect = function() {\n        this._connection.disconnect();\n        this._disconnect.emit();\n    }\n   \n    \n    /**\n     * Saves the provided function as a handler for the connection\n     * failure Whenable event\n     * \n     * @param {Function} handler to be issued upon disconnect\n     */\n    DynamicPlugin.prototype.whenFailed = \n           Plugin.prototype.whenFailed = function(handler) {\n        this._fail.whenEmitted(handler);\n    }\n\n\n    /**\n     * Saves the provided function as a handler for the connection\n     * success Whenable event\n     * \n     * @param {Function} handler to be issued upon connection\n     */\n    DynamicPlugin.prototype.whenConnected = \n           Plugin.prototype.whenConnected = function(handler) {\n        this._connect.whenEmitted(handler);\n    }\n    \n    \n    /**\n     * Saves the provided function as a handler for the connection\n     * failure Whenable event\n     * \n     * @param {Function} handler to be issued upon connection failure\n     */\n    DynamicPlugin.prototype.whenDisconnected = \n           Plugin.prototype.whenDisconnected = function(handler) {\n        this._disconnect.whenEmitted(handler);\n    }\n    \n    \n    \n    exports.Plugin = Plugin;\n    exports.DynamicPlugin = DynamicPlugin;\n  \n}));\n\n"
  },
  {
    "path": "public/js/lib/loop-protect/LICENSE.md",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2014 JS Bin Ltd\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "public/js/lib/loop-protect/loop-protect.js",
    "content": "if (typeof DEBUG === 'undefined') { DEBUG = true; }\n\n(function (root, factory) {\n  'use strict';\n  /*global define*/\n  if (typeof define === 'function' && define.amd) {\n    define(factory(root));\n  } else if (typeof exports === 'object') {\n    module.exports = factory(root);\n  } else {\n    root.loopProtect = factory(root);\n  }\n})(this, function loopProtectModule(root) {\n  /*global DEBUG*/\n  'use strict';\n  var debug = null;\n\n  // the standard loops - note that recursive is not supported\n  var re = /\\b(for|while|do)\\b/g;\n  var reSingle = /\\b(for|while|do)\\b/;\n  var labelRe = /\\b(?!default:)([a-z_]{1}\\w+:)/i;\n  var comments = /(?:\\/\\*(?:[\\s\\S]*?)\\*\\/)|(?:([\\s;])+\\/\\/(?:.*)$)/gm;\n  var loopTimeout = 1000;\n\n  var loopProtect = rewriteLoops;\n\n  // used in the loop detection\n  loopProtect.counters = {};\n\n  // expose debug info\n  loopProtect.debug = function debugSwitch(state) {\n    debug = state ? function () {\n      console.log.apply(console, [].slice.apply(arguments));\n    } : function () {};\n  };\n\n  loopProtect.debug(false); // off by default\n\n  // the method - as this could be aliased to something else\n  loopProtect.alias = 'loopProtect';\n\n  function inMultilineComment(lineNum, lines) {\n    if (lineNum === 0) {\n      return false;\n    }\n\n    var j = lineNum;\n    var closeCommentTags = 1; // let's assume we're inside a comment\n    var closePos = -1;\n    var openPos = -1;\n\n    do {\n      DEBUG && debug('looking backwards ' + lines[j]); // jshint ignore:line\n      closePos = lines[j].indexOf('*/');\n      openPos = lines[j].indexOf('/*');\n\n      if (closePos !== -1) {\n        closeCommentTags++;\n      }\n\n      // check for single line /* comment */ formatted comments\n      if (closePos === lines[j].length - 2 && openPos !== -1) {\n        closeCommentTags--;\n      }\n\n      if (openPos !== -1) {\n        closeCommentTags--;\n\n        if (closeCommentTags === 0) {\n          DEBUG && debug('- exit: part of a multiline comment'); // jshint ignore:line\n          return true;\n        }\n      }\n      j -= 1;\n    } while (j !== 0);\n\n    return false;\n  }\n\n  function inCommentOrString(index, line) {\n    var character;\n    while (--index > -1) {\n      character = line.substr(index, 1);\n      if (character === '\"' || character === '\\'' || character === '.') {\n        // our loop keyword was actually either in a string or a property, so let's exit and ignore this line\n        DEBUG && debug('- exit: matched inside a string or property key'); // jshint ignore:line\n        return true;\n      }\n      if (character === '/' || character === '*') {\n        // looks like a comment, go back one to confirm or not\n        --index;\n        if (character === '/') {\n          // we've found a comment, so let's exit and ignore this line\n          DEBUG && debug('- exit: part of a comment'); // jshint ignore:line\n          return true;\n        }\n      }\n    }\n    return false;\n  }\n\n  function directlyBeforeLoop(index, lineNum, lines) {\n    reSingle.lastIndex = 0;\n    labelRe.lastIndex = 0;\n    var beforeLoop = false;\n\n    var theRest = lines.slice(lineNum).join('\\n').substr(index).replace(labelRe, '');\n    theRest.replace(reSingle, function commentStripper(match, capture, i) {\n      var target = theRest.substr(0, i).replace(comments, '').trim();\n      DEBUG && debug('- directlyBeforeLoop: ' + target); // jshint ignore:line\n      if (target.length === 0) {\n        beforeLoop = true;\n      }\n      // strip comments out of the target, and if there's nothing else\n      // it's a valid label...I hope!\n    });\n\n    return beforeLoop;\n  }\n\n  /**\n   * Look for for, while and do loops, and inserts *just* at the start of the\n   * loop, a check function.\n   */\n  function rewriteLoops(code, offset) {\n    var recompiled = [];\n    var lines = code.split('\\n');\n    var disableLoopProtection = false;\n    var method = loopProtect.alias + '.protect';\n    var ignore = {};\n    var pushonly = {};\n    var labelPostion = null;\n\n    function insertReset(lineNum, line, matchPosition) {\n      // recompile the line with the reset **just** before the actual loop\n      // so that we insert in to the correct location (instead of possibly\n      // outside the logic\n      return line.slice(0, matchPosition) + ';' + method + '({ line: ' + lineNum + ', reset: true }); ' + line.slice(matchPosition);\n    }\n\n    if (!offset) {\n      offset = 0;\n    }\n\n    lines.forEach(function eachLine(line, lineNum) {\n      // reset our regexp each time.\n      re.lastIndex = 0;\n      labelRe.lastIndex = 0;\n\n      if (disableLoopProtection) {\n        return;\n      }\n\n      if (line.toLowerCase().indexOf('noprotect') !== -1) {\n        disableLoopProtection = true;\n      }\n\n      var index = -1;\n      var matchPosition = -1;\n      var originalLineNum = lineNum;\n      // +1 since we're humans and don't read lines numbers from zero\n      var printLineNumber = lineNum - offset + 1;\n      var character = '';\n      // special case for `do` loops, as they're end with `while`\n      var dofound = false;\n      var findwhile = false;\n      var terminator = false;\n      var matches = line.match(re) || [];\n      var match = matches.length ? matches[0] : '';\n      var labelMatch = line.match(labelRe) || [];\n      var openBrackets = 0;\n      var openBraces = 0;\n\n      if (labelMatch.length) {\n        DEBUG && debug('- label match'); // jshint ignore:line\n        index = line.indexOf(labelMatch[1]);\n        if (!inCommentOrString(index, line)) {\n          if (!inMultilineComment(lineNum, lines)) {\n            if (directlyBeforeLoop(index, lineNum, lines)) {\n              DEBUG && debug('- found a label: \"' + labelMatch[0] + '\"'); // jshint ignore:line\n              labelPostion = lineNum;\n            } else {\n              DEBUG && debug('- ignored \"label\", false positive'); // jshint ignore:line\n            }\n          } else {\n            DEBUG && debug('- ignored label in multline comment'); // jshint ignore:line\n          }\n        } else {\n          DEBUG && debug('- ignored label in string or comment'); // jshint ignore:line\n        }\n      }\n\n      if (ignore[lineNum]) {\n        DEBUG && debug(' -exit: ignoring line ' + lineNum +': ' + line); // jshint ignore:line\n        return;\n      }\n\n      if (pushonly[lineNum]) {\n        DEBUG && debug('- exit: ignoring, but adding line ' + lineNum + ': ' + line); // jshint ignore:line\n        recompiled.push(line);\n        return;\n      }\n\n      // if there's more than one match, we just ignore this kind of loop\n      // otherwise I'm going to be writing a full JavaScript lexer...and god\n      // knows I've got better things to be doing.\n      if (match && matches.length === 1 && line.indexOf('jsbin') === -1) {\n        DEBUG && debug('match on ' + match + '\\n'); // jshint ignore:line\n\n        // there's a special case for protecting `do` loops, we need to first\n        // prtect the `do`, but then ignore the closing `while` statement, so\n        // we reset the search state for this special case.\n        dofound = match === 'do';\n\n        // make sure this is an actual loop command by searching backwards\n        // to ensure it's not a string, comment or object property\n        matchPosition = index = line.indexOf(match);\n\n        // first we need to walk backwards to ensure that our match isn't part\n        // of a string or part of a comment\n        if (inCommentOrString(index, line)) {\n          recompiled.push(line);\n          return;\n        }\n\n        // it's quite possible we're in the middle of a multiline\n        // comment, so we'll cycle up looking for an opening comment,\n        // and if there's one (and not a closing `*/`), then we'll\n        // ignore this line as a comment\n        if (inMultilineComment(lineNum, lines)) {\n          recompiled.push(line);\n          return;\n        }\n\n        // now work our way forward to look for '{'\n        index = line.indexOf(match) + match.length;\n\n        if (index === line.length) {\n          if (index === line.length && lineNum < (lines.length-1)) {\n            // move to the next line\n            DEBUG && debug('- moving to next line'); // jshint ignore:line\n            recompiled.push(line);\n            lineNum++;\n            line = lines[lineNum];\n            ignore[lineNum] = true;\n            index = 0;\n          }\n\n        }\n\n        while (index < line.length) {\n          character = line.substr(index, 1);\n          // DEBUG && debug(character, index); // jshint ignore:line\n\n          if (character === '(') {\n            openBrackets++;\n          }\n\n          if (character === ')') {\n            openBrackets--;\n\n            if (openBrackets === 0 && terminator === false) {\n              terminator = index;\n            }\n          }\n\n          if (character === '{') {\n            openBraces++;\n          }\n\n          if (character === '}') {\n            openBraces--;\n          }\n\n          if (openBrackets === 0 && (character === ';' || character === '{')) {\n            // if we're a non-curlies loop, then convert to curlies to get our code inserted\n            if (character === ';') {\n              if (lineNum !== originalLineNum) {\n                DEBUG && debug('- multiline inline loop'); // jshint ignore:line\n                // affect the compiled line\n                recompiled[originalLineNum] = recompiled[originalLineNum].substring(0, terminator + 1) + '{\\nif (' + method + '({ line: ' + printLineNumber + ' })) break;\\n' + recompiled[originalLineNum].substring(terminator + 1);\n                line += '\\n}\\n';\n              } else {\n                // simpler\n                DEBUG && debug('- single line inline loop'); // jshint ignore:line\n                line = line.substring(0, terminator + 1) + '{\\nif (' + method + '({ line: ' + printLineNumber + ' })) break;\\n' + line.substring(terminator + 1) + '\\n}\\n';\n              }\n\n            } else if (character === '{') {\n              DEBUG && debug('- multiline with braces'); // jshint ignore:line\n              var insert = ';\\nif (' + method + '({ line: ' + printLineNumber + ' })) break;\\n';\n              line = line.substring(0, index + 1) + insert + line.substring(index + 1);\n\n              index += insert.length;\n            }\n\n            // work out where to put the reset\n            if (lineNum === originalLineNum && labelPostion === null) {\n              DEBUG && debug('- simple reset insert'); // jshint ignore:line\n              line = insertReset(printLineNumber, line, matchPosition);\n              index += (';' + method + '({ line: ' + lineNum + ', reset: true }); ').length;\n            } else {\n              // insert the reset above the originalLineNum OR if this loop used\n              // a label, we have to insert the reset *above* the label\n              if (labelPostion === null) {\n                DEBUG && debug('- reset inserted above original line'); // jshint ignore:line\n                recompiled[originalLineNum] = insertReset(printLineNumber, recompiled[originalLineNum], matchPosition);\n              } else {\n                DEBUG && debug('- reset inserted above matched label on line ' + labelPostion); // jshint ignore:line\n                if (recompiled[labelPostion] === undefined) {\n                  labelPostion--;\n                  matchPosition = 0;\n                }\n                recompiled[labelPostion] = insertReset(printLineNumber, recompiled[labelPostion], matchPosition);\n                labelPostion = null;\n              }\n            }\n\n            recompiled.push(line);\n\n            if (!dofound) {\n              return;\n            } else {\n              DEBUG && debug('searching for closing `while` statement for: ' + line); // jshint ignore:line\n              // cycle forward until we find the close brace, after which should\n              // be our while statement to ignore\n              findwhile = false;\n              while (index < line.length) {\n                character = line.substr(index, 1);\n\n                if (character === '{') {\n                  openBraces++;\n                }\n\n                if (character === '}') {\n                  openBraces--;\n                }\n\n                if (openBraces === 0) {\n                  findwhile = true;\n                } else {\n                  findwhile = false;\n                }\n\n                if (openBraces === 0) {\n                  DEBUG && debug('outside of closure, looking for `while` statement: ' + line); // jshint ignore:line\n                }\n\n                if (findwhile && line.indexOf('while') !== -1) {\n                  DEBUG && debug('- exit as we found `while`: ' + line); // jshint ignore:line\n                  pushonly[lineNum] = true;\n                  return;\n                }\n\n                index++;\n\n                if (index === line.length && lineNum < (lines.length-1)) {\n                  lineNum++;\n                  line = lines[lineNum];\n                  DEBUG && debug(line); // jshint ignore:line\n                  index = 0;\n                }\n              }\n              return;\n            }\n          }\n\n          index++;\n\n          if (index === line.length && lineNum < (lines.length-1)) {\n            // move to the next line\n            DEBUG && debug('- moving to next line'); // jshint ignore:line\n            recompiled.push(line);\n            lineNum++;\n            line = lines[lineNum];\n            ignore[lineNum] = true;\n            index = 0;\n          }\n        }\n      } else {\n        // else we're a regular line, and we shouldn't be touched\n        DEBUG && debug('regular line ' + line); // jshint ignore:line\n        recompiled.push(line);\n      }\n    });\n\n    DEBUG && debug('---- source ----'); // jshint ignore:line\n    DEBUG && debug(code); // jshint ignore:line\n    DEBUG && debug('---- rewrite ---'); // jshint ignore:line\n    DEBUG && debug(recompiled.join('\\n')); // jshint ignore:line\n    DEBUG && debug(''); // jshint ignore:line\n\n    return disableLoopProtection ? code : recompiled.join('\\n');\n  };\n\n  /**\n   * Injected code in to user's code to **try** to protect against infinite\n   * loops cropping up in the code, and killing the browser. Returns true\n   * when the loops has been running for more than 100ms.\n   */\n  loopProtect.protect = function protect(state) {\n    loopProtect.counters[state.line] = loopProtect.counters[state.line] || {};\n    var line = loopProtect.counters[state.line];\n    var now = (new Date()).getTime();\n\n    if (state.reset) {\n      line.time = now;\n      line.hit = 0;\n      line.last = 0;\n    }\n\n    line.hit++;\n    if ((now - line.time) > loopTimeout) {//} && line.hit !== line.last+1) {\n      loopProtect.hit(state.line);\n      // Returning true prevents the loop running again\n      return true;\n    }\n    line.last++;\n    return false;\n  };\n\n  loopProtect.hit = function hit(line) {\n    var msg = 'Exiting potential infinite loop at line ' + line + '. To disable loop protection: add \"// noprotect\" to your code';\n    if (root.proxyConsole) {\n      root.proxyConsole.error(msg);\n    } else {\n      console.error(msg);\n    }\n  };\n\n  loopProtect.reset = function reset() {\n    // reset the counters\n    loopProtect.counters = {};\n  };\n\n  return loopProtect;\n});\n"
  },
  {
    "path": "public/js/sidecar.v1.js",
    "content": "/*!\n * Gitter Sidecar v1.2.4\n * https://sidecar.gitter.im/\n */\nvar sidecar=function(t){function e(n){if(r[n])return r[n].exports;var o=r[n]={exports:{},id:n,loaded:!1};return t[n].call(o.exports,o,o.exports,e),o.loaded=!0,o.exports}var r={};return e.m=t,e.c=r,e.p=\"\",e(0)}([function(t,e,r){\"use strict\";function n(t){return t&&t.__esModule?t:{\"default\":t}}Object.defineProperty(e,\"__esModule\",{value:!0});var o=r(3),i=n(o),a=r(12),u=n(a),c=r(29),s=n(c),l=function(t,e){return t[e]||function(){return t[e]={},t[e]}()},f=l(window,\"gitter\"),b={Chat:s[\"default\"]};(0,i[\"default\"])(f,b);var y=new u[\"default\"](\"gitter-sidecar-ready\",{detail:b});if(document.dispatchEvent(y),!((f.chat||{}).options||{}).disableDefaultChat){var p=l(f,\"chat\");p.defaultChat=new s[\"default\"](p.options||{})}e[\"default\"]=b},function(t,e,r){\"use strict\";var n=r(15),o=r(14),i=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol(),a=Object.prototype.toString,u=function(t){return\"function\"==typeof t&&\"[object Function]\"===a.call(t)},c=function(){var t={};try{Object.defineProperty(t,\"x\",{enumerable:!1,value:t});for(var e in t)return!1;return t.x===t}catch(r){return!1}},s=Object.defineProperty&&c(),l=function(t,e,r,n){(!(e in t)||u(n)&&n())&&(s?Object.defineProperty(t,e,{configurable:!0,enumerable:!1,value:r,writable:!0}):t[e]=r)},f=function(t,e){var r=arguments.length>2?arguments[2]:{},a=n(e);i&&(a=a.concat(Object.getOwnPropertySymbols(e))),o(a,function(n){l(t,n,e[n],r[n])})};f.supportsDescriptors=!!s,t.exports=f},function(t,e){\"use strict\";var r=Function.prototype.toString,n=/^\\s*class /,o=function(t){try{var e=r.call(t),o=e.replace(/\\/\\/.*\\n/g,\"\"),i=o.replace(/\\/\\*[.\\s\\S]*\\*\\//g,\"\"),a=i.replace(/\\n/gm,\" \").replace(/ {2}/g,\" \");return n.test(a)}catch(u){return!1}},i=function(t){try{return o(t)?!1:(r.call(t),!0)}catch(e){return!1}},a=Object.prototype.toString,u=\"[object Function]\",c=\"[object GeneratorFunction]\",s=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.toStringTag;t.exports=function(t){if(!t)return!1;if(\"function\"!=typeof t&&\"object\"!=typeof t)return!1;if(s)return i(t);if(o(t))return!1;var e=a.call(t);return e===u||e===c}},function(t,e){\"use strict\";function r(t){if(null===t||void 0===t)throw new TypeError(\"Object.assign cannot be called with null or undefined\");return Object(t)}function n(){try{if(!Object.assign)return!1;var t=new String(\"abc\");if(t[5]=\"de\",\"5\"===Object.getOwnPropertyNames(t)[0])return!1;for(var e={},r=0;10>r;r++)e[\"_\"+String.fromCharCode(r)]=r;var n=Object.getOwnPropertyNames(e).map(function(t){return e[t]});if(\"0123456789\"!==n.join(\"\"))return!1;var o={};return\"abcdefghijklmnopqrst\".split(\"\").forEach(function(t){o[t]=t}),\"abcdefghijklmnopqrst\"===Object.keys(Object.assign({},o)).join(\"\")}catch(i){return!1}}var o=Object.prototype.hasOwnProperty,i=Object.prototype.propertyIsEnumerable;t.exports=n()?Object.assign:function(t,e){for(var n,a,u=r(t),c=1;c<arguments.length;c++){n=Object(arguments[c]);for(var s in n)o.call(n,s)&&(u[s]=n[s]);if(Object.getOwnPropertySymbols){a=Object.getOwnPropertySymbols(n);for(var l=0;l<a.length;l++)i.call(n,a[l])&&(u[a[l]]=n[a[l]])}}return u}},function(t,e,r){\"use strict\";var n=r(5),o=r(1).supportsDescriptors;/*! https://mths.be/array-from v0.2.0 by @mathias */\nt.exports=function(t){var e=o?Object.defineProperty:function(t,e,r){t[e]=r.value},r=this;if(null===t||\"undefined\"==typeof t)throw new TypeError(\"`Array.from` requires an array-like object, not `null` or `undefined`\");var i,a,u=n.ToObject(t);if(arguments.length>1){if(i=arguments[1],!n.IsCallable(i))throw new TypeError(\"When provided, the second argument to `Array.from` must be a function\");arguments.length>2&&(a=arguments[2])}for(var c,s,l=n.ToLength(u.length),f=n.IsCallable(r)?n.ToObject(new r(l)):new Array(l),b=0;l>b;)c=u[b],s=i?\"undefined\"==typeof a?i(c,b):n.Call(i,a,[c,b]):c,e(f,b,{value:s,configurable:!0,enumerable:!0,writable:!0}),b+=1;return f.length=l,f}},function(t,e,r){\"use strict\";var n=Object.prototype.toString,o=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator,i=o?Symbol.prototype.toString:n,a=r(7),u=r(6),c=Number.MAX_SAFE_INTEGER||Math.pow(2,53)-1,s=r(18),l=r(9),f=r(8),b=r(19),y=r(21),p=parseInt,d=r(25),M=d.call(Function.call,String.prototype.slice),g=d.call(Function.call,RegExp.prototype.test,/^0b[01]+$/i),h=d.call(Function.call,RegExp.prototype.test,/^0o[0-7]+$/i),m=[\"\",\"​\",\"￾\"].join(\"\"),N=new RegExp(\"[\"+m+\"]\",\"g\"),j=d.call(Function.call,RegExp.prototype.test,N),w=/^[\\-\\+]0x[0-9a-f]+$/i,x=d.call(Function.call,RegExp.prototype.test,w),L=[\"\t\\n\\x0B\\f\\r   ᠎    \",\"         　\\u2028\",\"\\u2029\\ufeff\"].join(\"\"),T=new RegExp(\"(^[\"+L+\"]+)|([\"+L+\"]+$)\",\"g\"),v=d.call(Function.call,String.prototype.replace),E=function(t){return v(t,T,\"\")},D=r(17),S=r(26),z=s(s({},D),{Call:function(t,e){var r=arguments.length>2?arguments[2]:[];if(!this.IsCallable(t))throw new TypeError(t+\" is not a function\");return t.apply(e,r)},ToPrimitive:y,ToNumber:function(t){var e=b(t)?t:y(t,\"number\");if(\"symbol\"==typeof e)throw new TypeError(\"Cannot convert a Symbol value to a number\");if(\"string\"==typeof e){if(g(e))return this.ToNumber(p(M(e,2),2));if(h(e))return this.ToNumber(p(M(e,2),8));if(j(e)||x(e))return NaN;var r=E(e);if(r!==e)return this.ToNumber(r)}return Number(e)},ToInt16:function(t){var e=this.ToUint16(t);return e>=32768?e-65536:e},ToInt8:function(t){var e=this.ToUint8(t);return e>=128?e-256:e},ToUint8:function(t){var e=this.ToNumber(t);if(a(e)||0===e||!u(e))return 0;var r=l(e)*Math.floor(Math.abs(e));return f(r,256)},ToUint8Clamp:function(t){var e=this.ToNumber(t);if(a(e)||0>=e)return 0;if(e>=255)return 255;var r=Math.floor(t);return e>r+.5?r+1:r+.5>e?r:r%2!==0?r+1:r},ToString:function(t){if(\"symbol\"==typeof t)throw new TypeError(\"Cannot convert a Symbol value to a string\");return String(t)},ToObject:function(t){return this.RequireObjectCoercible(t),Object(t)},ToPropertyKey:function(t){var e=this.ToPrimitive(t,String);return\"symbol\"==typeof e?i.call(e):this.ToString(e)},ToLength:function(t){var e=this.ToInteger(t);return 0>=e?0:e>c?c:e},CanonicalNumericIndexString:function(t){if(\"[object String]\"!==n.call(t))throw new TypeError(\"must be a string\");if(\"-0\"===t)return-0;var e=this.ToNumber(t);return this.SameValue(this.ToString(e),t)?e:void 0},RequireObjectCoercible:D.CheckObjectCoercible,IsArray:Array.isArray||function(t){return\"[object Array]\"===n.call(t)},IsConstructor:function(t){return this.IsCallable(t)},IsExtensible:function(t){return Object.preventExtensions?b(t)?!1:Object.isExtensible(t):!0},IsInteger:function(t){if(\"number\"!=typeof t||a(t)||!u(t))return!1;var e=Math.abs(t);return Math.floor(e)===e},IsPropertyKey:function(t){return\"string\"==typeof t||\"symbol\"==typeof t},IsRegExp:function(t){if(!t||\"object\"!=typeof t)return!1;if(o){var e=t[Symbol.match];if(\"undefined\"!=typeof e)return D.ToBoolean(e)}return S(t)},SameValueZero:function(t,e){return t===e||a(t)&&a(e)}});delete z.CheckObjectCoercible,t.exports=z},function(t,e){var r=Number.isNaN||function(t){return t!==t};t.exports=Number.isFinite||function(t){return\"number\"==typeof t&&!r(t)&&t!==1/0&&t!==-(1/0)}},function(t,e){t.exports=Number.isNaN||function(t){return t!==t}},function(t,e){t.exports=function(t,e){var r=t%e;return Math.floor(r>=0?r:r+e)}},function(t,e){t.exports=function(t){return t>=0?1:-1}},function(t,e){t.exports=function(t){return null===t||\"function\"!=typeof t&&\"object\"!=typeof t}},function(t,e,r){\"use strict\";var n=r(5),o=r(4),i=function(t){try{return t(),!0}catch(e){return!1}};t.exports=function(){var t=n.IsCallable(Array.from)&&i(function(){Array.from({length:-(1/0)})})&&!i(function(){Array.from([],void 0)});return t?Array.from:o}},function(t,e){\"use strict\";function r(t,e){var r=e.bubbles,n=void 0===r?!1:r,o=e.cancelable,i=void 0===o?!1:o,a=e.detail,u=void 0===a?void 0:a,c=void 0;try{c=new window.CustomEvent(t,{bubbles:n,cancelable:i,detail:u})}catch(s){c=document.createEvent(\"CustomEvent\"),c.initCustomEvent(t,n,i,u)}return c}Object.defineProperty(e,\"__esModule\",{value:!0}),e[\"default\"]=r,r.prototype=window.Event.prototype},function(t,e,r){\"use strict\";var n=r(1),o=r(4),i=r(11),a=r(27),u=function(t){return o.call(Array,arguments)};n(u,{implementation:o,getPolyfill:i,shim:a}),t.exports=u},function(t,e){var r=Object.prototype.hasOwnProperty,n=Object.prototype.toString;t.exports=function(t,e,o){if(\"[object Function]\"!==n.call(e))throw new TypeError(\"iterator must be a function\");var i=t.length;if(i===+i)for(var a=0;i>a;a++)e.call(o,t[a],a,t);else for(var u in t)r.call(t,u)&&e.call(o,t[u],u,t)}},function(t,e,r){\"use strict\";var n=Object.prototype.hasOwnProperty,o=Object.prototype.toString,i=Array.prototype.slice,a=r(16),u=!{toString:null}.propertyIsEnumerable(\"toString\"),c=function(){}.propertyIsEnumerable(\"prototype\"),s=[\"toString\",\"toLocaleString\",\"valueOf\",\"hasOwnProperty\",\"isPrototypeOf\",\"propertyIsEnumerable\",\"constructor\"],l=function(t){var e=t.constructor;return e&&e.prototype===t},f={$console:!0,$frame:!0,$frameElement:!0,$frames:!0,$parent:!0,$self:!0,$webkitIndexedDB:!0,$webkitStorageInfo:!0,$window:!0},b=function(){if(\"undefined\"==typeof window)return!1;for(var t in window)try{if(!f[\"$\"+t]&&n.call(window,t)&&null!==window[t]&&\"object\"==typeof window[t])try{l(window[t])}catch(e){return!0}}catch(e){return!0}return!1}(),y=function(t){if(\"undefined\"==typeof window||!b)return l(t);try{return l(t)}catch(e){return!1}},p=function(t){var e=null!==t&&\"object\"==typeof t,r=\"[object Function]\"===o.call(t),i=a(t),l=e&&\"[object String]\"===o.call(t),f=[];if(!e&&!r&&!i)throw new TypeError(\"Object.keys called on a non-object\");var b=c&&r;if(l&&t.length>0&&!n.call(t,0))for(var p=0;p<t.length;++p)f.push(String(p));if(i&&t.length>0)for(var d=0;d<t.length;++d)f.push(String(d));else for(var M in t)b&&\"prototype\"===M||!n.call(t,M)||f.push(String(M));if(u)for(var g=y(t),h=0;h<s.length;++h)g&&\"constructor\"===s[h]||!n.call(t,s[h])||f.push(s[h]);return f};p.shim=function(){if(Object.keys){var t=function(){return 2===(Object.keys(arguments)||\"\").length}(1,2);if(!t){var e=Object.keys;Object.keys=function(t){return e(a(t)?i.call(t):t)}}}else Object.keys=p;return Object.keys||p},t.exports=p},function(t,e){\"use strict\";var r=Object.prototype.toString;t.exports=function(t){var e=r.call(t),n=\"[object Arguments]\"===e;return n||(n=\"[object Array]\"!==e&&null!==t&&\"object\"==typeof t&&\"number\"==typeof t.length&&t.length>=0&&\"[object Function]\"===r.call(t.callee)),n}},function(t,e,r){\"use strict\";var n=r(7),o=r(6),i=r(9),a=r(8),u=r(2),c=r(20),s={ToPrimitive:c,ToBoolean:function(t){return Boolean(t)},ToNumber:function(t){return Number(t)},ToInteger:function(t){var e=this.ToNumber(t);return n(e)?0:0!==e&&o(e)?i(e)*Math.floor(Math.abs(e)):e},ToInt32:function(t){return this.ToNumber(t)>>0},ToUint32:function(t){return this.ToNumber(t)>>>0},ToUint16:function(t){var e=this.ToNumber(t);if(n(e)||0===e||!o(e))return 0;var r=i(e)*Math.floor(Math.abs(e));return a(r,65536)},ToString:function(t){return String(t)},ToObject:function(t){return this.CheckObjectCoercible(t),Object(t)},CheckObjectCoercible:function(t,e){if(null==t)throw new TypeError(e||\"Cannot call method on \"+t);return t},IsCallable:u,SameValue:function(t,e){return t===e?0===t?1/t===1/e:!0:n(t)&&n(e)}};t.exports=s},function(t,e){var r=Object.prototype.hasOwnProperty;t.exports=Object.assign||function(t,e){for(var n in e)r.call(e,n)&&(t[n]=e[n]);return t}},function(t,e){t.exports=function(t){return null===t||\"function\"!=typeof t&&\"object\"!=typeof t}},function(t,e,r){\"use strict\";var n=Object.prototype.toString,o=r(10),i=r(2),a={\"[[DefaultValue]]\":function(t,e){var r=e||(\"[object Date]\"===n.call(t)?String:Number);if(r===String||r===Number){var a,u,c=r===String?[\"toString\",\"valueOf\"]:[\"valueOf\",\"toString\"];for(u=0;u<c.length;++u)if(i(t[c[u]])&&(a=t[c[u]](),o(a)))return a;throw new TypeError(\"No default value\")}throw new TypeError(\"invalid [[DefaultValue]] hint supplied\")}};t.exports=function(t,e){return o(t)?t:a[\"[[DefaultValue]]\"](t,e)}},function(t,e,r){\"use strict\";var n=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator,o=r(10),i=r(2),a=r(22),u=r(23),c=function(t,e){if(\"undefined\"==typeof t||null===t)throw new TypeError(\"Cannot call method on \"+t);if(\"string\"!=typeof e||\"number\"!==e&&\"string\"!==e)throw new TypeError('hint must be \"string\" or \"number\"');var r,n,a,u=\"string\"===e?[\"toString\",\"valueOf\"]:[\"valueOf\",\"toString\"];for(a=0;a<u.length;++a)if(r=t[u[a]],i(r)&&(n=r.call(t),o(n)))return n;throw new TypeError(\"No default value\")},s=function(t,e){var r=t[e];if(null!==r&&\"undefined\"!=typeof r){if(!i(r))throw new TypeError(r+\" returned for property \"+e+\" of object \"+t+\" is not a function\");return r}};t.exports=function(t,e){if(o(t))return t;var r=\"default\";arguments.length>1&&(e===String?r=\"string\":e===Number&&(r=\"number\"));var i;if(n&&(Symbol.toPrimitive?i=s(t,Symbol.toPrimitive):u(t)&&(i=Symbol.prototype.valueOf)),\"undefined\"!=typeof i){var l=i.call(t,r);if(o(l))return l;throw new TypeError(\"unable to convert exotic object to primitive\")}return\"default\"===r&&(a(t)||u(t))&&(r=\"string\"),c(t,\"default\"===r?\"number\":r)}},function(t,e){\"use strict\";var r=Date.prototype.getDay,n=function(t){try{return r.call(t),!0}catch(e){return!1}},o=Object.prototype.toString,i=\"[object Date]\",a=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.toStringTag;t.exports=function(t){return\"object\"!=typeof t||null===t?!1:a?n(t):o.call(t)===i}},function(t,e){\"use strict\";var r=Object.prototype.toString,n=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol();if(n){var o=Symbol.prototype.toString,i=/^Symbol\\(.*\\)$/,a=function(t){return\"symbol\"!=typeof t.valueOf()?!1:i.test(o.call(t))};t.exports=function(t){if(\"symbol\"==typeof t)return!0;if(\"[object Symbol]\"!==r.call(t))return!1;try{return a(t)}catch(e){return!1}}}else t.exports=function(t){return!1}},function(t,e){var r=\"Function.prototype.bind called on incompatible \",n=Array.prototype.slice,o=Object.prototype.toString,i=\"[object Function]\";t.exports=function(t){var e=this;if(\"function\"!=typeof e||o.call(e)!==i)throw new TypeError(r+e);for(var a,u=n.call(arguments,1),c=function(){if(this instanceof a){var r=e.apply(this,u.concat(n.call(arguments)));return Object(r)===r?r:this}return e.apply(t,u.concat(n.call(arguments)))},s=Math.max(0,e.length-u.length),l=[],f=0;s>f;f++)l.push(\"$\"+f);if(a=Function(\"binder\",\"return function (\"+l.join(\",\")+\"){ return binder.apply(this,arguments); }\")(c),e.prototype){var b=function(){};b.prototype=e.prototype,a.prototype=new b,b.prototype=null}return a}},function(t,e,r){var n=r(24);t.exports=Function.prototype.bind||n},function(t,e){\"use strict\";var r=RegExp.prototype.exec,n=function(t){try{return r.call(t),!0}catch(e){return!1}},o=Object.prototype.toString,i=\"[object RegExp]\",a=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.toStringTag;t.exports=function(t){return\"object\"!=typeof t?!1:a?n(t):o.call(t)===i}},function(t,e,r){\"use strict\";var n=r(1),o=r(11);t.exports=function(){var t=o();return n(Array,{from:t},{from:function(){return Array.from!==t}}),t}},function(t,e){\"use strict\";function r(t){if(\"function\"==typeof Symbol)return Symbol(t);var e=Math.random().toString(36).substr(2,8);return t+e}Object.defineProperty(e,\"__esModule\",{value:!0}),e[\"default\"]=r},function(t,e,r){\"use strict\";function n(t){if(t&&t.__esModule)return t;var e={};if(null!=t)for(var r in t)Object.prototype.hasOwnProperty.call(t,r)&&(e[r]=t[r]);return e[\"default\"]=t,e}function o(t){return t&&t.__esModule?t:{\"default\":t}}function i(t,e){if(!(t instanceof e))throw new TypeError(\"Cannot call a class as a function\")}Object.defineProperty(e,\"__esModule\",{value:!0});var a=function(){function t(t,e){for(var r=0;r<e.length;r++){var n=e[r];n.enumerable=n.enumerable||!1,n.configurable=!0,\"value\"in n&&(n.writable=!0),Object.defineProperty(t,n.key,n)}}return function(e,r,n){return r&&t(e.prototype,r),n&&t(e,n),e}}(),u=r(13),c=r(3),s=o(c),l=(r(35),r(28)),f=o(l),b=r(12),y=o(b),p=r(31),d=o(p),M=r(33),g=o(M),h=r(30),m=n(h),N=r(32),j=o(N);(0,u.shim)();var w=function(t){if(t){var e=t.trim().toLowerCase();if(\"true\"===e||\"1\"===e)return!0;if(\"false\"===e||\"0\"===e)return!1}return t},x=function(t,e){if(!e)return t;var r={};return Object.keys(t).forEach(function(t){var n=\"data-\"+t;if(e.hasAttribute(n)){var o=e.getAttribute(n);r[t]=o}}),(0,s[\"default\"])({},t,r)},L=32,T=13,v=function(t,e){t=(0,m[\"default\"])(t);var r=function(t){if(\"click\"===t.type||\"keydown\"===t.type&&(t.keyCode===L||t.keyCode===T)){for(var r=arguments.length,n=Array(r>1?r-1:0),o=1;r>o;o++)n[o-1]=arguments[o];e.call.apply(e,[this,t].concat(n))}};return m.on(t,\"click keydown\",r),function(){m.off(t,\"click keydown\",r)}},E=function(){var t=new d[\"default\"],e=t.createElement(\"style\");return e.innerHTML=g[\"default\"],m.prependElementTo(e,(0,m[\"default\"])(\"head\")[0]),t},D=function(t){var e=new d[\"default\"],r=t.targetElement;return r.forEach(function(r){var n=x(t,r);if(n.room){var o=e.createElement(\"iframe\");o.setAttribute(\"frameborder\",\"0\"),o.src=\"\"+t.host+n.room+\"/~embed\",r.appendChild(o)}else console.error(\"Gitter Sidecar: No room specified for targetElement\",r)}),e},S=function(t){var e=t.options,r=new d[\"default\"];return e.targetElement.forEach(function(n){var o=r.createElement(\"div\");o.classList.add(\"gitter-chat-embed-action-bar\"),n.insertBefore(o,n.firstChild);var i=r.createElement(\"a\");i.classList.add(\"gitter-chat-embed-action-bar-item\"),i.classList.add(\"gitter-chat-embed-action-bar-item-pop-out\"),i.setAttribute(\"aria-label\",\"Open Chat in Gitter.im\"),i.setAttribute(\"href\",\"\"+e.host+e.room),i.setAttribute(\"target\",\"_blank\"),o.appendChild(i);var a=r.createElement(\"button\");a.classList.add(\"gitter-chat-embed-action-bar-item\"),a.classList.add(\"gitter-chat-embed-action-bar-item-collapse-chat\"),a.setAttribute(\"aria-label\",\"Collapse Gitter Chat\"),v(a,function(e){t.toggleChat(!1),e.preventDefault()}),o.appendChild(a)}),r},z=document.body||document.documentElement,O={room:void 0,targetElement:void 0,activationElement:void 0,showChatByDefault:!1,preload:!1,useStyles:!0,layout:\"fixed\",host:\"https://gitter.im/\"},A=(0,f[\"default\"])(\"DEFAULTS\"),I=(0,f[\"default\"])(\"OPTIONS\"),C=(0,f[\"default\"])(\"ELEMENTSTORE\"),k=(0,f[\"default\"])(\"EVENTHANDLESTORE\"),U=(0,f[\"default\"])(\"INIT\"),_=(0,f[\"default\"])(\"ISEMBEDDED\"),Y=(0,f[\"default\"])(\"EMBEDCHATONCE\"),Q=(0,f[\"default\"])(\"TOGGLETARGETELEMENTS\"),P=function(){function t(){var e=arguments.length<=0||void 0===arguments[0]?{}:arguments[0];i(this,t),this[C]=new d[\"default\"],this[k]=[],this[A]=(0,s[\"default\"])({},O),this[I]=(0,s[\"default\"])({},this[A],e),this[U]()}return a(t,[{key:U,value:function(){var t=this,e=this[I];e.useStyles&&this[C].add(E()),e.targetElement=(0,m[\"default\"])(e.targetElement||function(){var e=t[C].createElement(\"aside\");return e.classList.add(\"gitter-chat-embed\"),e.classList.add(\"is-collapsed\"),z.appendChild(e),e}()),e.targetElement.forEach(function(e){var r=t[C].createElement(\"div\");r.classList.add(\"gitter-chat-embed-loading-wrapper\"),r.innerHTML='\\n        <div class=\"gitter-chat-embed-loading-indicator gitter-icon\"></div>\\n      ',e.insertBefore(r,e.firstChild)}),S(this),e.preload&&this.toggleChat(!1),e.showChatByDefault?this.toggleChat(!0):(void 0===e.activationElement||e.activationElement===!0?e.activationElement=(0,m[\"default\"])(function(){var r=t[C].createElement(\"a\");return r.href=\"\"+e.host+e.room,r.innerHTML=\"Open Chat\",r.classList.add(\"gitter-open-chat-button\"),z.appendChild(r),r}()):e.activationElement&&(e.activationElement=(0,m[\"default\"])(e.activationElement)),e.activationElement&&(v(e.activationElement,function(e){t.toggleChat(!0),e.preventDefault()}),e.targetElement.forEach(function(t){m.on(t,\"gitter-chat-toggle\",function(t){var r=t.detail.state;e.activationElement.forEach(function(t){m.toggleClass(t,\"is-collapsed\",r)})})})));var r=v((0,m[\"default\"])(\".js-gitter-toggle-chat-button\"),function(e){var r=w(e.target.getAttribute(\"data-gitter-toggle-chat-state\"));t.toggleChat(null!==r?r:\"toggle\"),e.preventDefault()});this[k].push(r),e.targetElement.forEach(function(e){var r=new y[\"default\"](\"gitter-chat-started\",{detail:{chat:t}});e.dispatchEvent(r)});var n=new y[\"default\"](\"gitter-sidecar-instance-started\",{detail:{chat:this}});document.dispatchEvent(n)}},{key:Y,value:function(){if(!this[_]){var t=this[I],e=D(t);this[C].add(e)}this[_]=!0}},{key:Q,value:function(t){var e=this[I];e.targetElement||console.warn(\"Gitter Sidecar: No chat embed elements to toggle visibility on\");var r=e.targetElement;r.forEach(function(e){\"toggle\"===t?m.toggleClass(e,\"is-collapsed\"):m.toggleClass(e,\"is-collapsed\",!t);var r=new y[\"default\"](\"gitter-chat-toggle\",{detail:{state:t}});e.dispatchEvent(r)})}},{key:\"toggleChat\",value:function(t){var e=this,r=this[I];t&&!this[_]?!function(){var n=r.targetElement;n.forEach(function(t){t.classList.add(\"is-loading\")}),setTimeout(function(){e[Y](),e[Q](t),n.forEach(function(t){t.classList.remove(\"is-loading\")})},300)}():(this[Y](),this[Q](t))}},{key:\"destroy\",value:function(){this[k].forEach(function(t){t()}),this[C].destroy()}},{key:\"options\",get:function(){return(0,j[\"default\"])(this[I])}}]),t}();e[\"default\"]=P},function(t,e){\"use strict\";function r(t){if(Array.isArray(t)){for(var e=0,r=Array(t.length);e<t.length;e++)r[e]=t[e];return r}return Array.from(t)}function n(t,e){return c(t).forEach(function(){e&&e.apply(void 0,arguments)}),this}function o(t,e,r){return e.split(/\\s/).forEach(function(e){n(t,function(t){t.addEventListener(e,r)})}),this}function i(t,e,r){return e.split(/\\s/).forEach(function(e){n(t,function(t){t.removeEventListener(e,r)})}),this}function a(t,e){var r=(e.children||[])[0];r?e.insertBefore(t,r):e.appendChild(t)}function u(t,e,r){return void 0!==r?r?t.classList.add(e):t.classList.remove(e):t.classList.toggle(e),r}Object.defineProperty(e,\"__esModule\",{value:!0}),e.forEach=n,e.on=o,e.off=i,e.prependElementTo=a,e.toggleClass=u;var c=function(){for(var t=arguments.length,e=Array(t),r=0;t>r;r++)e[r]=arguments[r];return e.reduce(function(t,e){return!e||void 0===e.length||Array.isArray(e)||window&&(!window||e instanceof window.constructor)||(e=Array.prototype.slice.call(e)),t.concat(e)},[])},s=function(){for(var t=arguments.length,e=Array(t),n=0;t>n;n++)e[n]=arguments[n];var o=e;if(\"string\"==typeof e[0]){var i;o=(i=document.querySelectorAll).call.apply(i,[document].concat(e))}return c.apply(void 0,r(o))},l=function(){return s.apply(void 0,arguments)};e[\"default\"]=l},function(t,e,r){\"use strict\";function n(t){return t&&t.__esModule?t:{\"default\":t}}function o(t,e){if(!(t instanceof e))throw new TypeError(\"Cannot call a class as a function\")}Object.defineProperty(e,\"__esModule\",{value:!0});var i=function(){function t(t,e){for(var r=0;r<e.length;r++){var n=e[r];n.enumerable=n.enumerable||!1,n.configurable=!0,\"value\"in n&&(n.writable=!0),Object.defineProperty(t,n.key,n)}}return function(e,r,n){return r&&t(e.prototype,r),n&&t(e,n),e}}(),a=r(3),u=(n(a),function(t){t&&t.parentElement.removeChild(t)}),c=function(){function t(){o(this,t),this.elements=[]}return i(t,[{key:\"createElement\",value:function(){for(var t=arguments.length,e=Array(t),r=0;t>r;r++)e[r]=arguments[r];var n=document.createElement.apply(document,e);return this.add(n),n}},{key:\"add\",value:function(){for(var e=arguments.length,r=Array(e),n=0;e>n;n++)r[n]=arguments[n];var o=[].concat(r).reduce(function(e,r){return r?r instanceof t?e.concat(r.elements):e.concat(r):e},[]);this.elements=this.elements.concat(o)}},{key:\"destroy\",value:function(){this.elements.forEach(function(t){return u(t)}),this.elements=[]}}]),t}();e[\"default\"]=c},function(t,e){\"use strict\";function r(t){var e={};return Object.keys(t).forEach(function(r){Object.defineProperty(e,r,{value:t[r],writable:!1,configurable:!1})}),e}Object.defineProperty(e,\"__esModule\",{value:!0}),e[\"default\"]=r},function(t,e,r){e=t.exports=r(34)(),e.push([t.id,\".gitter-hidden{box-sizing:border-box;display:none}.gitter-icon{box-sizing:border-box;width:22px;height:22px;fill:currentColor}.gitter-chat-embed{box-sizing:border-box;z-index:100;position:fixed;top:0;left:60%;bottom:0;right:0;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;background-color:#fff;border-left:1px solid #333;box-shadow:-12px 0 18px 0 rgba(50,50,50,.3);-webkit-transition:-webkit-transform .3s cubic-bezier(.16,.22,.22,1.7);transition:-webkit-transform .3s cubic-bezier(.16,.22,.22,1.7);transition:transform .3s cubic-bezier(.16,.22,.22,1.7);transition:transform .3s cubic-bezier(.16,.22,.22,1.7),-webkit-transform .3s cubic-bezier(.16,.22,.22,1.7)}@context border-box{.gitter-chat-embed{box-sizing:border-box;background-color:#fff}}.gitter-chat-embed.is-collapsed:not(.is-loading){box-sizing:border-box;-webkit-transform:translateX(110%);transform:translateX(110%)}.gitter-chat-embed:after{box-sizing:border-box;content:'';z-index:-1;position:absolute;top:0;left:100%;bottom:0;right:-100%;background-color:#fff}@context border-box{.gitter-chat-embed:after{box-sizing:border-box;background-color:#fff}}@media(max-width:1150px){.gitter-chat-embed{box-sizing:border-box;left:45%}}@media(max-width:944px){.gitter-chat-embed{box-sizing:border-box;left:30%}}@media(max-width:600px){.gitter-chat-embed{box-sizing:border-box;left:15%}}@media(max-width:500px){.gitter-chat-embed{box-sizing:border-box;left:0;border-left:none}}.gitter-chat-embed>iframe{box-sizing:border-box;-webkit-box-flex:1;-ms-flex:1;flex:1;width:100%;height:100%;border:0}.gitter-chat-embed-loading-wrapper{box-sizing:border-box;position:absolute;top:0;left:0;bottom:0;right:0;display:none;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-align:center;-ms-flex-align:center;-ms-grid-row-align:center;align-items:center}.is-loading .gitter-chat-embed-loading-wrapper{box-sizing:border-box;display:-webkit-box;display:-ms-flexbox;display:flex}.gitter-chat-embed-loading-indicator{box-sizing:border-box;opacity:.75;background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAxNzkyIDE3OTIiIGZpbGw9IiMzYTMxMzMiPjxwYXRoIGQ9Ik01MjYgMTM5NHEwIDUzLTM3LjUgOTAuNXQtOTAuNSAzNy41cS01MiAwLTkwLTM4dC0zOC05MHEwLTUzIDM3LjUtOTAuNXQ5MC41LTM3LjUgOTAuNSAzNy41IDM3LjUgOTAuNXptNDk4IDIwNnEwIDUzLTM3LjUgOTAuNXQtOTAuNSAzNy41LTkwLjUtMzcuNS0zNy41LTkwLjUgMzcuNS05MC41IDkwLjUtMzcuNSA5MC41IDM3LjUgMzcuNSA5MC41em0tNzA0LTcwNHEwIDUzLTM3LjUgOTAuNXQtOTAuNSAzNy41LTkwLjUtMzcuNS0zNy41LTkwLjUgMzcuNS05MC41IDkwLjUtMzcuNSA5MC41IDM3LjUgMzcuNSA5MC41em0xMjAyIDQ5OHEwIDUyLTM4IDkwdC05MCAzOHEtNTMgMC05MC41LTM3LjV0LTM3LjUtOTAuNSAzNy41LTkwLjUgOTAuNS0zNy41IDkwLjUgMzcuNSAzNy41IDkwLjV6bS05NjQtOTk2cTAgNjYtNDcgMTEzdC0xMTMgNDctMTEzLTQ3LTQ3LTExMyA0Ny0xMTMgMTEzLTQ3IDExMyA0NyA0NyAxMTN6bTExNzAgNDk4cTAgNTMtMzcuNSA5MC41dC05MC41IDM3LjUtOTAuNS0zNy41LTM3LjUtOTAuNSAzNy41LTkwLjUgOTAuNS0zNy41IDkwLjUgMzcuNSAzNy41IDkwLjV6bS02NDAtNzA0cTAgODAtNTYgMTM2dC0xMzYgNTYtMTM2LTU2LTU2LTEzNiA1Ni0xMzYgMTM2LTU2IDEzNiA1NiA1NiAxMzZ6bTUzMCAyMDZxMCA5My02NiAxNTguNXQtMTU4IDY1LjVxLTkzIDAtMTU4LjUtNjUuNXQtNjUuNS0xNTguNXEwLTkyIDY1LjUtMTU4dDE1OC41LTY2cTkyIDAgMTU4IDY2dDY2IDE1OHoiLz48L3N2Zz4=);-webkit-animation:spin 2s infinite linear;animation:spin 2s infinite linear}@-webkit-keyframes spin{0%{box-sizing:border-box;-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{box-sizing:border-box;-webkit-transform:rotate(359.9deg);transform:rotate(359.9deg)}}@keyframes spin{0%{box-sizing:border-box;-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{box-sizing:border-box;-webkit-transform:rotate(359.9deg);transform:rotate(359.9deg)}}.gitter-chat-embed-action-bar{position:absolute;top:0;left:0;right:0;-webkit-box-pack:end;-ms-flex-pack:end;justify-content:flex-end;padding-bottom:.7em;background:-webkit-linear-gradient(top,#fff,#fff 50%,hsla(0,0%,100%,0));background:linear-gradient(180deg,#fff 0,#fff 50%,hsla(0,0%,100%,0))}.gitter-chat-embed-action-bar,.gitter-chat-embed-action-bar-item{box-sizing:border-box;display:-webkit-box;display:-ms-flexbox;display:flex}.gitter-chat-embed-action-bar-item{-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;width:40px;height:40px;padding-left:0;padding-right:0;opacity:.65;background:none;background-position:50%;background-repeat:no-repeat;background-size:22px 22px;border:0;outline:none;cursor:pointer;cursor:hand;-webkit-transition:all .2s ease;transition:all .2s ease}.gitter-chat-embed-action-bar-item:focus,.gitter-chat-embed-action-bar-item:hover{box-sizing:border-box;opacity:1}.gitter-chat-embed-action-bar-item:active{box-sizing:border-box;-webkit-filter:hue-rotate(80deg) saturate(150);filter:hue-rotate(80deg) saturate(150)}.gitter-chat-embed-action-bar-item-pop-out{box-sizing:border-box;margin-right:-4px;background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMDAgMTcxLjQyOSIgZmlsbD0iIzNhMzEzMyI+PHBhdGggZD0iTTE1Ny4xNDMsMTAzLjU3MXYzNS43MTRjMCw4Ljg1NC0zLjE0NCwxNi40MjYtOS40MzEsMjIuNzEzcy0xMy44NTgsOS40MzEtMjIuNzEyLDkuNDMxSDMyLjE0MyBjLTguODU0LDAtMTYuNDI1LTMuMTQ0LTIyLjcxMi05LjQzMVMwLDE0OC4xNCwwLDEzOS4yODVWNDYuNDI5YzAtOC44NTQsMy4xNDQtMTYuNDI1LDkuNDMxLTIyLjcxMiBjNi4yODctNi4yODcsMTMuODU4LTkuNDMxLDIyLjcxMi05LjQzMWg3OC41NzJjMS4wNDEsMCwxLjg5NiwwLjMzNSwyLjU2NiwxLjAwNGMwLjY3LDAuNjcsMS4wMDQsMS41MjUsMS4wMDQsMi41NjdWMjUgYzAsMS4wNDItMC4zMzQsMS44OTctMS4wMDQsMi41NjdjLTAuNjcsMC42Ny0xLjUyNSwxLjAwNC0yLjU2NiwxLjAwNEgzMi4xNDNjLTQuOTExLDAtOS4xMTUsMS43NDktMTIuNjEyLDUuMjQ2IHMtNS4yNDYsNy43MDEtNS4yNDYsMTIuNjEydjkyLjg1NmMwLDQuOTExLDEuNzQ5LDkuMTE1LDUuMjQ2LDEyLjYxMnM3LjcwMSw1LjI0NSwxMi42MTIsNS4yNDVIMTI1YzQuOTEsMCw5LjExNS0xLjc0OCwxMi42MTEtNS4yNDUgYzMuNDk3LTMuNDk3LDUuMjQ2LTcuNzAxLDUuMjQ2LTEyLjYxMnYtMzUuNzE0YzAtMS4wNDIsMC4zMzQtMS44OTcsMS4wMDQtMi41NjdjMC42Ny0wLjY2OSwxLjUyNS0xLjAwNCwyLjU2Ny0xLjAwNGg3LjE0MyBjMS4wNDIsMCwxLjg5NywwLjMzNSwyLjU2NywxLjAwNEMxNTYuODA5LDEwMS42NzQsMTU3LjE0MywxMDIuNTI5LDE1Ny4xNDMsMTAzLjU3MXogTTIwMCw3LjE0M3Y1Ny4xNDMgYzAsMS45MzUtMC43MDcsMy42MDktMi4xMjEsNS4wMjJjLTEuNDEzLDEuNDE0LTMuMDg4LDIuMTIxLTUuMDIxLDIuMTIxYy0xLjkzNSwwLTMuNjA5LTAuNzA3LTUuMDIyLTIuMTIxbC0xOS42NDQtMTkuNjQzIGwtNzIuNzY3LDcyLjc2OWMtMC43NDQsMC43NDQtMS42LDEuMTE1LTIuNTY3LDEuMTE1cy0xLjgyMy0wLjM3MS0yLjU2Ny0xLjExNUw3Ny41NjcsMTA5LjcxYy0wLjc0NC0wLjc0NC0xLjExNi0xLjYtMS4xMTYtMi41NjcgYzAtMC45NjcsMC4zNzItMS44MjIsMS4xMTYtMi41NjZsNzIuNzY4LTcyLjc2OGwtMTkuNjQ0LTE5LjY0M2MtMS40MTMtMS40MTQtMi4xMi0zLjA4OC0yLjEyLTUuMDIyYzAtMS45MzUsMC43MDctMy42MDksMi4xMi01LjAyMiBDMTMyLjEwNSwwLjcwNywxMzMuNzc5LDAsMTM1LjcxNSwwaDU3LjE0M2MxLjkzNCwwLDMuNjA4LDAuNzA3LDUuMDIxLDIuMTIxQzE5OS4yOTMsMy41MzQsMjAwLDUuMjA4LDIwMCw3LjE0M3oiLz48L3N2Zz4=)}.gitter-chat-embed-action-bar-item-collapse-chat{box-sizing:border-box;background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAxNzEuNDI5IDE3MS40MjkiIGZpbGw9IiMzYTMxMzMiPjxwYXRoIGQ9Ik0xMjIuNDMzLDEwNi4xMzhsLTE2LjI5NSwxNi4yOTVjLTAuNzQ0LDAuNzQ0LTEuNiwxLjExNi0yLjU2NiwxLjExNmMtMC45NjgsMC0xLjgyMy0wLjM3Mi0yLjU2Ny0xLjExNmwtMTUuMjktMTUuMjkgbC0xNS4yOSwxNS4yOWMtMC43NDQsMC43NDQtMS42LDEuMTE2LTIuNTY3LDEuMTE2cy0xLjgyMy0wLjM3Mi0yLjU2Ny0xLjExNmwtMTYuMjk0LTE2LjI5NWMtMC43NDQtMC43NDQtMS4xMTYtMS42LTEuMTE2LTIuNTY2IGMwLTAuOTY4LDAuMzcyLTEuODIzLDEuMTE2LTIuNTY3bDE1LjI5LTE1LjI5bC0xNS4yOS0xNS4yOWMtMC43NDQtMC43NDQtMS4xMTYtMS42LTEuMTE2LTIuNTY3czAuMzcyLTEuODIzLDEuMTE2LTIuNTY3IEw2NS4yOSw0OC45OTZjMC43NDQtMC43NDQsMS42LTEuMTE2LDIuNTY3LTEuMTE2czEuODIzLDAuMzcyLDIuNTY3LDEuMTE2bDE1LjI5LDE1LjI5bDE1LjI5LTE1LjI5IGMwLjc0NC0wLjc0NCwxLjYtMS4xMTYsMi41NjctMS4xMTZjMC45NjcsMCwxLjgyMiwwLjM3MiwyLjU2NiwxLjExNmwxNi4yOTUsMTYuMjk0YzAuNzQ0LDAuNzQ0LDEuMTE2LDEuNiwxLjExNiwyLjU2NyBzLTAuMzcyLDEuODIzLTEuMTE2LDIuNTY3bC0xNS4yOSwxNS4yOWwxNS4yOSwxNS4yOWMwLjc0NCwwLjc0NCwxLjExNiwxLjYsMS4xMTYsMi41NjcgQzEyMy41NDksMTA0LjUzOSwxMjMuMTc3LDEwNS4zOTQsMTIyLjQzMywxMDYuMTM4eiBNMTQ2LjQyOSw4NS43MTRjMC0xMS4wMTItMi43MTctMjEuMTY4LTguMTQ4LTMwLjQ2OSBzLTEyLjc5Ny0xNi42NjctMjIuMDk4LTIyLjA5OFM5Ni43MjYsMjUsODUuNzE0LDI1cy0yMS4xNjgsMi43MTYtMzAuNDY5LDguMTQ3UzM4LjU3OSw0NS45NDUsMzMuMTQ3LDU1LjI0NlMyNSw3NC43MDMsMjUsODUuNzE0IHMyLjcxNiwyMS4xNjgsOC4xNDcsMzAuNDY5czEyLjc5NywxNi42NjYsMjIuMDk4LDIyLjA5OHMxOS40NTcsOC4xNDgsMzAuNDY5LDguMTQ4czIxLjE2OC0yLjcxNywzMC40NjktOC4xNDggczE2LjY2Ni0xMi43OTcsMjIuMDk4LTIyLjA5OFMxNDYuNDI5LDk2LjcyNiwxNDYuNDI5LDg1LjcxNHogTTE3MS40MjksODUuNzE0YzAsMTUuNTUxLTMuODMyLDI5Ljg5My0xMS40OTYsNDMuMDI0IGMtNy42NjQsMTMuMTMzLTE4LjA2MiwyMy41My0zMS4xOTQsMzEuMTk0Yy0xMy4xMzIsNy42NjQtMjcuNDc0LDExLjQ5Ni00My4wMjQsMTEuNDk2cy0yOS44OTItMy44MzItNDMuMDI0LTExLjQ5NiBjLTEzLjEzMy03LjY2NC0yMy41MzEtMTguMDYyLTMxLjE5NC0zMS4xOTRDMy44MzIsMTE1LjYwNywwLDEwMS4yNjUsMCw4NS43MTRTMy44MzIsNTUuODIyLDExLjQ5Niw0Mi42OSBjNy42NjQtMTMuMTMzLDE4LjA2Mi0yMy41MzEsMzEuMTk0LTMxLjE5NEM1NS44MjIsMy44MzIsNzAuMTY0LDAsODUuNzE0LDBzMjkuODkzLDMuODMyLDQzLjAyNCwxMS40OTYgYzEzLjEzMyw3LjY2NCwyMy41MywxOC4wNjIsMzEuMTk0LDMxLjE5NEMxNjcuNTk3LDU1LjgyMiwxNzEuNDI5LDcwLjE2NCwxNzEuNDI5LDg1LjcxNHoiLz48L3N2Zz4=)}.gitter-open-chat-button{z-index:100;position:fixed;bottom:0;right:10px;padding:1em 3em;background-color:#36bc98;border:0;border-top-left-radius:.5em;border-top-right-radius:.5em;font-family:sans-serif;font-size:12px;letter-spacing:1px;text-transform:uppercase;text-align:center;text-decoration:none;cursor:pointer;cursor:hand;-webkit-transition:all .3s ease;transition:all .3s ease}.gitter-open-chat-button,.gitter-open-chat-button:visited{box-sizing:border-box;color:#fff}.gitter-open-chat-button:focus,.gitter-open-chat-button:hover{box-sizing:border-box;background-color:#3ea07f;color:#fff}.gitter-open-chat-button:focus{box-sizing:border-box;box-shadow:0 0 8px rgba(62,160,127,.6);outline:none}.gitter-open-chat-button:active{box-sizing:border-box;color:#eee}.gitter-open-chat-button.is-collapsed{box-sizing:border-box;-webkit-transform:translateY(120%);transform:translateY(120%)}\",\"\"])},function(t,e){t.exports=function(){var t=[];return t.toString=function(){for(var t=[],e=0;e<this.length;e++){var r=this[e];r[2]?t.push(\"@media \"+r[2]+\"{\"+r[1]+\"}\"):t.push(r[1])}return t.join(\"\")},t.i=function(e,r){\"string\"==typeof e&&(e=[[null,e,\"\"]]);for(var n={},o=0;o<this.length;o++){var i=this[o][0];\"number\"==typeof i&&(n[i]=!0)}for(o=0;o<e.length;o++){var a=e[o];\"number\"==typeof a[0]&&n[a[0]]||(r&&!a[2]?a[2]=r:r&&(a[2]=\"(\"+a[2]+\") and (\"+r+\")\"),t.push(a))}},t}},function(t,e,r){var n;(function(t,o,i){/*!\n\t * @overview es6-promise - a tiny implementation of Promises/A+.\n\t * @copyright Copyright (c) 2014 Yehuda Katz, Tom Dale, Stefan Penner and contributors (Conversion to ES6 API by Jake Archibald)\n\t * @license   Licensed under MIT license\n\t *            See https://raw.githubusercontent.com/jakearchibald/es6-promise/master/LICENSE\n\t * @version   3.2.1\n\t */\n(function(){\"use strict\";function a(t){return\"function\"==typeof t||\"object\"==typeof t&&null!==t}function u(t){return\"function\"==typeof t}function c(t){W=t}function s(t){tt=t}function l(){return function(){t.nextTick(d)}}function f(){return function(){V(d)}}function b(){var t=0,e=new nt(d),r=document.createTextNode(\"\");return e.observe(r,{characterData:!0}),function(){r.data=t=++t%2}}function y(){var t=new MessageChannel;return t.port1.onmessage=d,function(){t.port2.postMessage(0)}}function p(){return function(){setTimeout(d,1)}}function d(){for(var t=0;J>t;t+=2){var e=at[t],r=at[t+1];e(r),at[t]=void 0,at[t+1]=void 0}J=0}function M(){try{var t=r(39);return V=t.runOnLoop||t.runOnContext,f()}catch(e){return p()}}function g(t,e){var r=this,n=new this.constructor(m);void 0===n[st]&&Y(n);var o=r._state;if(o){var i=arguments[o-1];tt(function(){k(o,n,i,r._result)})}else O(r,n,t,e);return n}function h(t){var e=this;if(t&&\"object\"==typeof t&&t.constructor===e)return t;var r=new e(m);return E(r,t),r}function m(){}function N(){return new TypeError(\"You cannot resolve a promise with itself\")}function j(){return new TypeError(\"A promises callback cannot return that same promise.\")}function w(t){try{return t.then}catch(e){return yt.error=e,yt}}function x(t,e,r,n){try{t.call(e,r,n)}catch(o){return o}}function L(t,e,r){tt(function(t){var n=!1,o=x(r,e,function(r){n||(n=!0,e!==r?E(t,r):S(t,r))},function(e){n||(n=!0,z(t,e))},\"Settle: \"+(t._label||\" unknown promise\"));!n&&o&&(n=!0,z(t,o))},t)}function T(t,e){e._state===ft?S(t,e._result):e._state===bt?z(t,e._result):O(e,void 0,function(e){E(t,e)},function(e){z(t,e)})}function v(t,e,r){e.constructor===t.constructor&&r===ut&&constructor.resolve===ct?T(t,e):r===yt?z(t,yt.error):void 0===r?S(t,e):u(r)?L(t,e,r):S(t,e)}function E(t,e){t===e?z(t,N()):a(e)?v(t,e,w(e)):S(t,e)}function D(t){t._onerror&&t._onerror(t._result),A(t)}function S(t,e){t._state===lt&&(t._result=e,t._state=ft,0!==t._subscribers.length&&tt(A,t))}function z(t,e){t._state===lt&&(t._state=bt,t._result=e,tt(D,t))}function O(t,e,r,n){var o=t._subscribers,i=o.length;t._onerror=null,o[i]=e,o[i+ft]=r,o[i+bt]=n,0===i&&t._state&&tt(A,t)}function A(t){var e=t._subscribers,r=t._state;if(0!==e.length){for(var n,o,i=t._result,a=0;a<e.length;a+=3)n=e[a],o=e[a+r],n?k(r,n,o,i):o(i);t._subscribers.length=0}}function I(){this.error=null}function C(t,e){try{return t(e)}catch(r){return pt.error=r,pt}}function k(t,e,r,n){var o,i,a,c,s=u(r);if(s){if(o=C(r,n),o===pt?(c=!0,i=o.error,o=null):a=!0,e===o)return void z(e,j())}else o=n,a=!0;e._state!==lt||(s&&a?E(e,o):c?z(e,i):t===ft?S(e,o):t===bt&&z(e,o))}function U(t,e){try{e(function(e){E(t,e)},function(e){z(t,e)})}catch(r){z(t,r)}}function _(){return dt++}function Y(t){t[st]=dt++,t._state=void 0,t._result=void 0,t._subscribers=[]}function Q(t){return new Nt(this,t).promise}function P(t){var e=this;return new e(K(t)?function(r,n){for(var o=t.length,i=0;o>i;i++)e.resolve(t[i]).then(r,n)}:function(t,e){e(new TypeError(\"You must pass an array to race.\"))})}function B(t){var e=this,r=new e(m);return z(r,t),r}function H(){throw new TypeError(\"You must pass a resolver function as the first argument to the promise constructor\")}function F(){throw new TypeError(\"Failed to construct 'Promise': Please use the 'new' operator, this object constructor cannot be called as a function.\")}function R(t){this[st]=_(),this._result=this._state=void 0,this._subscribers=[],m!==t&&(\"function\"!=typeof t&&H(),this instanceof R?U(this,t):F())}function G(t,e){this._instanceConstructor=t,this.promise=new t(m),this.promise[st]||Y(this.promise),K(e)?(this._input=e,this.length=e.length,this._remaining=e.length,this._result=new Array(this.length),0===this.length?S(this.promise,this._result):(this.length=this.length||0,this._enumerate(),0===this._remaining&&S(this.promise,this._result))):z(this.promise,Z())}function Z(){return new Error(\"Array Methods must be provided an Array\")}function X(){var t;if(\"undefined\"!=typeof o)t=o;else if(\"undefined\"!=typeof self)t=self;else try{t=Function(\"return this\")()}catch(e){throw new Error(\"polyfill failed because global object is unavailable in this environment\")}var r=t.Promise;r&&\"[object Promise]\"===Object.prototype.toString.call(r.resolve())&&!r.cast||(t.Promise=mt)}var $;$=Array.isArray?Array.isArray:function(t){return\"[object Array]\"===Object.prototype.toString.call(t)};var V,W,q,K=$,J=0,tt=function(t,e){at[J]=t,at[J+1]=e,J+=2,2===J&&(W?W(d):q())},et=\"undefined\"!=typeof window?window:void 0,rt=et||{},nt=rt.MutationObserver||rt.WebKitMutationObserver,ot=\"undefined\"==typeof self&&\"undefined\"!=typeof t&&\"[object process]\"==={}.toString.call(t),it=\"undefined\"!=typeof Uint8ClampedArray&&\"undefined\"!=typeof importScripts&&\"undefined\"!=typeof MessageChannel,at=new Array(1e3);q=ot?l():nt?b():it?y():void 0===et?M():p();var ut=g,ct=h,st=Math.random().toString(36).substring(16),lt=void 0,ft=1,bt=2,yt=new I,pt=new I,dt=0,Mt=Q,gt=P,ht=B,mt=R;R.all=Mt,R.race=gt,R.resolve=ct,R.reject=ht,R._setScheduler=c,R._setAsap=s,R._asap=tt,R.prototype={constructor:R,then:ut,\"catch\":function(t){return this.then(null,t)}};var Nt=G;G.prototype._enumerate=function(){for(var t=this.length,e=this._input,r=0;this._state===lt&&t>r;r++)this._eachEntry(e[r],r)},G.prototype._eachEntry=function(t,e){var r=this._instanceConstructor,n=r.resolve;if(n===ct){var o=w(t);if(o===ut&&t._state!==lt)this._settledAt(t._state,e,t._result);else if(\"function\"!=typeof o)this._remaining--,this._result[e]=t;else if(r===mt){var i=new r(m);v(i,t,o),this._willSettleAt(i,e)}else this._willSettleAt(new r(function(e){e(t)}),e)}else this._willSettleAt(n(t),e)},G.prototype._settledAt=function(t,e,r){var n=this.promise;n._state===lt&&(this._remaining--,t===bt?z(n,r):this._result[e]=r),0===this._remaining&&S(n,this._result)},G.prototype._willSettleAt=function(t,e){var r=this;O(t,void 0,function(t){r._settledAt(ft,e,t)},function(t){r._settledAt(bt,e,t)})};var jt=X,wt={Promise:mt,polyfill:jt};r(36).amd?(n=function(){return wt}.call(e,r,e,i),!(void 0!==n&&(i.exports=n))):\"undefined\"!=typeof i&&i.exports?i.exports=wt:\"undefined\"!=typeof this&&(this.ES6Promise=wt),jt()}).call(this)}).call(e,r(38),function(){return this}(),r(37)(t))},function(t,e){t.exports=function(){throw new Error(\"define cannot be used indirect\")}},function(t,e){t.exports=function(t){return t.webpackPolyfill||(t.deprecate=function(){},t.paths=[],t.children=[],t.webpackPolyfill=1),t}},function(t,e){function r(){s&&a&&(s=!1,a.length?c=a.concat(c):l=-1,c.length&&n())}function n(){if(!s){var t=setTimeout(r);s=!0;for(var e=c.length;e;){for(a=c,c=[];++l<e;)a&&a[l].run();l=-1,e=c.length}a=null,s=!1,clearTimeout(t)}}function o(t,e){this.fun=t,this.array=e}function i(){}var a,u=t.exports={},c=[],s=!1,l=-1;u.nextTick=function(t){var e=new Array(arguments.length-1);if(arguments.length>1)for(var r=1;r<arguments.length;r++)e[r-1]=arguments[r];c.push(new o(t,e)),1!==c.length||s||setTimeout(n,0)},o.prototype.run=function(){this.fun.apply(null,this.array)},u.title=\"browser\",u.browser=!0,u.env={},u.argv=[],u.version=\"\",u.versions={},u.on=i,u.addListener=i,u.once=i,u.off=i,u.removeListener=i,u.removeAllListeners=i,u.emit=i,u.binding=function(t){throw new Error(\"process.binding is not supported\")},u.cwd=function(){return\"/\"},u.chdir=function(t){throw new Error(\"process.chdir is not supported\")},u.umask=function(){return 0}},function(t,e){}]);\n//# sourceMappingURL=sidecar.js.map"
  },
  {
    "path": "public/json/bootcamps.json",
    "content": "[\n{\n  \"name\": \"Hack Reactor\",\n  \"cost\": \"17780\",\n  \"housing\": \"500\",\n  \"weeks\": \"12\",\n  \"finance\": true,\n  \"cities\": [\n    \"new-york-city\",\n    \"san-francisco\"\n  ]\n}, {\n  \"name\": \"Hack Reactor Online\",\n  \"cost\": \"17780\",\n  \"housing\": \"0\",\n  \"weeks\": \"12\",\n  \"finance\": true,\n  \"cities\": [\n    \"online\"\n  ]\n}, {\n  \"name\": \"Hackbright Academy\",\n  \"cost\": \"15000\",\n  \"housing\": \"500\",\n  \"weeks\": \"10\",\n  \"finance\": true,\n  \"cities\": [\n    \"san-francisco\"\n  ]\n}, {\n  \"name\": \"Dev Bootcamp\",\n  \"cost\": \"13950\",\n  \"finance\": true,\n  \"housing\": \"500\",\n  \"weeks\": \"19\",\n  \"cities\": [\n    \"new-york-city\",\n    \"san-francisco\",\n    \"chicago\"\n  ]\n}, {\n  \"name\": \"General Asssembly\",\n  \"cost\": \"11500\",\n  \"housing\": \"500\",\n  \"finance\": true,\n  \"weeks\": \"12\",\n  \"cities\": [\n    \"washington-dc\",\n    \"austin\",\n    \"boston\",\n    \"chicago\",\n    \"hong-kong\",\n    \"london\",\n    \"los-angeles\",\n    \"melbourne\",\n    \"new-york-city\",\n    \"san-francisco\",\n    \"seattle\",\n    \"singapore\"\n  ]\n}, {\n  \"name\": \"Angel Hack\",\n  \"cost\": \"14250\",\n  \"housing\": \"500\",\n  \"finance\": true,\n  \"weeks\": \"12\",\n  \"cities\": [\n    \"san-francisco\"\n  ]\n}, {\n  \"name\": \"Bitmaker Labs\",\n  \"cost\": \"12000\",\n  \"housing\": \"500\",\n  \"finance\": true,\n  \"weeks\": \"12\",\n  \"cities\": [\n    \"toronto\"\n  ]\n}, {\n  \"name\": \"CoderVox\",\n  \"cost\": \"9980\",\n  \"housing\": \"400\",\n  \"finance\": true,\n  \"weeks\": \"12\",\n  \"cities\": [\n    \"austin\"\n  ]\n}, {\n  \"name\": \"Coding Dojo\",\n  \"cost\": \"12500\",\n  \"housing\": \"500\",\n  \"finance\": true,\n  \"weeks\": \"12\",\n  \"cities\": [\n    \"new-york-city\",\n    \"san-francisco\",\n    \"chicago\"\n  ]\n}, {\n  \"name\": \"DevMountain\",\n  \"cost\": \"8900\",\n  \"housing\": \"0\",\n  \"finance\": true,\n  \"weeks\": \"12\",\n  \"cities\": [\n    \"provo\",\n    \"salt-lake-city\",\n    \"dallas\"\n  ]\n}, {\n  \"name\": \"Epicodus\",\n  \"cost\": \"4500\",\n  \"housing\": \"400\",\n  \"finance\": false,\n  \"weeks\": \"15\",\n  \"cities\": [\n    \"portland\"\n  ]\n}, {\n  \"name\": \"Flat Iron School\",\n  \"cost\": \"15000\",\n  \"housing\": \"500\",\n  \"finance\": true,\n  \"weeks\": \"12\",\n  \"cities\": [\n    \"new-york-city\"\n  ]\n}, {\n  \"name\": \"Galvanize\",\n  \"cost\": \"21000\",\n  \"housing\": \"500\",\n  \"finance\": true,\n  \"weeks\": \"24\",\n  \"cities\": [\n    \"boulder\",\n    \"denver\",\n    \"seattle\",\n    \"san-francisco\"\n  ]\n}, {\n  \"name\": \"The Iron Yard\",\n  \"cost\": \"12000\",\n  \"housing\": \"500\",\n  \"finance\": true,\n  \"weeks\": \"19\",\n  \"cities\": [\n    \"austin\",\n    \"washington-dc\",\n    \"raleigh-durham\",\n    \"atlanta\"\n  ]\n}, {\n  \"name\": \"Launch Academy\",\n  \"cost\": \"12500\",\n  \"housing\": \"500\",\n  \"finance\": true,\n  \"weeks\": \"10\",\n  \"cities\": [\n    \"boston\"\n  ]\n}, {\n  \"name\": \"Maker Square\",\n  \"cost\": \"16920\",\n  \"housing\": \"500\",\n  \"finance\": true,\n  \"weeks\": \"12\",\n  \"cities\": [\n    \"los-angeles\",\n    \"san-francisco\",\n    \"austin\"\n  ]\n}, {\n  \"name\": \"Refactor U\",\n  \"cost\": \"13500\",\n  \"housing\": \"400\",\n  \"finance\": true,\n  \"weeks\": \"10\",\n  \"cities\": [\n    \"boulder\"\n  ]\n}, {\n  \"name\": \"Rocket U\",\n  \"cost\": \"12500\",\n  \"housing\": \"500\",\n  \"finance\": true,\n  \"weeks\": \"12\",\n  \"cities\": [\n    \"new-york-city\",\n    \"san-francisco\",\n    \"chicago\"\n  ]\n}, {\n  \"name\": \"Sabio\",\n  \"cost\": \"13450\",\n  \"housing\": \"500\",\n  \"finance\": true,\n  \"weeks\": \"12\",\n  \"cities\": [\n    \"los-angeles\"\n  ]\n}, {\n  \"name\": \"Shillington School\",\n  \"cost\": \"12950\",\n  \"housing\": \"500\",\n  \"finance\": true,\n  \"weeks\": \"12\",\n  \"cities\": [\n    \"new-york-city\",\n    \"sydney\",\n    \"brisbane\",\n    \"london\",\n    \"manchester\",\n    \"melbourne\"\n  ]\n}, {\n  \"name\": \"The Tech Academy\",\n  \"cost\": \"9000\",\n  \"housing\": \"400\",\n  \"finance\": true,\n  \"weeks\": \"20\",\n  \"cities\": [\n    \"portland\"\n  ]\n},\n  {\n    \"name\": \"Viking Code School\",\n    \"cost\": \"18000\",\n    \"housing\": \"0\",\n    \"finance\": false,\n    \"weeks\": \"16\",\n    \"cities\": [\n      \"online\"\n    ]\n  },\n  {\n    \"name\": \"App Academy\",\n    \"cost\": \"18000\",\n    \"housing\": \"500\",\n    \"finance\": false,\n    \"weeks\": \"12\",\n    \"cities\": [\n      \"san-francisco\"\n    ]\n  },\n  {\n  \"name\": \"Turing School\",\n  \"cost\": \"17500\",\n  \"housing\": \"400\",\n  \"finance\": true,\n  \"weeks\": \"27\",\n  \"cities\": [\n    \"denver\"\n  ]\n}]\n"
  },
  {
    "path": "public/json/cats.json",
    "content": "[\n  {\n    \"id\": 0,\n    \"imageLink\": \"/images/funny-cat.jpg\",\n    \"codeNames\": [\n      \"Juggernaut\",\n      \"Mrs. Wallace\",\n      \"Buttercup\"\n    ]\n  },\n  {\n    \"id\": 1,\n    \"imageLink\": \"/images/grumpy-cat.jpg\",\n    \"codeNames\": [\n      \"Oscar\",\n      \"Scrooge\",\n      \"Tyrion\"\n    ]\n  },\n  {\n    \"id\": 2,\n    \"imageLink\": \"/images/mischievous-cat.jpg\",\n    \"codeNames\": [\n      \"The Doctor\",\n      \"Loki\",\n      \"Joker\"\n    ]\n  }\n]\n"
  },
  {
    "path": "public/leader-board.html",
    "content": "<!DOCTYPE html>\n<html ng-app=\"app\">\n<head>\n  <meta charset=\"UTF-8\">\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0, user-scalable=no\">\n  <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">\n  <title>学习进度排行榜</title>\n  <style>\n  h2{padding-left: 10px;}\n  table,th,td{\n    padding-left: 5px;\n    text-align:center;\n  }\n  tr:nth-child(even){\n    background-color: #FAEBD7;\n  }\n  tr:nth-child(odd){\n    background-color: white;\n  }\n  th, tr{\n    padding:10px;\n  }\n  div{margin:0 auto;}\n  </style>\n  <base target=\"_blank\" />\n  <script src=\"/js/angular.js\"></script>\n</head>\n<body>\n  <div>\n    <h2>学习进度排行榜(最新)</h2>\n    <input type=\"text\" placeholder=\"用户名\" ng-model=\"items\">\n    <table ng-controller=\"leaderboard\" >\n      <tr>\n        <th>排名</th>\n        <th>用户名</th>\n        <th>用户头像</th>\n        <th>总得分</th>\n      </tr>\n      <tr ng-repeat=\"item in items | orderBy:'-score'  \" >\n        <td ng-bind=\"$index+1\"></td>\n        <td ng-bind=\"item.username\"></td>\n        <td><img ng-src=\"{{item.picture}}\" width=\"64px\"></td>\n        <td ng-bind=\"item.score\"></td>\n      </tr>\n    </table>\n  </div>\n<script>\n  var app = angular.module('app',[]);\n  app.controller('leaderboard',['$scope','$http', function($scope,$http){\n    $http.get('/leader-board').then(function(res){\n      var out = res.data;\n      for(var i=0;i<out.length;i++){\n          delete out[i].progressTimestamps;\n      }\n      $scope.items = out;\n    },function(err){\n      console.log(err);\n    })\n  }])\n</script>\n</body>\n</html>\n"
  },
  {
    "path": "public/progress.html",
    "content": "<!DOCTYPE html>\n<html ng-app=\"app\">\n<head>\n  <meta charset=\"UTF-8\">\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0, user-scalable=no\">\n  <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">\n  <title>学习进度排行榜</title>\n  <style>\n  h2,table,th,td{\n    text-align:center;\n    border-spacing: 0px;\n    font-size:15px;\n  }\n  tr:nth-child(even){\n    background-color: #FAEBD7;\n  }\n  tr:nth-child(odd){\n    background-color: white;\n  }\n  th, tr{\n    padding:5px;\n  }\n  #left{\n    float:left;\n    margin-right:20px;\n  }\n  #center{\n    float:left;\n    margin-right:20px;\n  }\n  #right{\n    float:left;\n  }\n  p{text-align:center;}\n  </style>\n  <base target=\"_blank\" />\n  <script src=\"/js/angular.min.js\"></script>\n</head>\n<body>\n  <p>排行榜改版了，快去<a href=\"/code.html\">报名参加比赛</a>，这样就能实时看到其他同学的学习进度哦。</p>\n  <p>各组排行靠前的同学请注意，针对项目部分全部copy的同学，项目分全部取消，后期会一一审核。</p>\n  <p>希望大家自觉，遵守项目文档的规则。</p>\n  <div id=\"left\">\n    <h2>专业组排行榜</h2>\n    <table ng-controller=\"left\" >\n      <tr>\n        <th>排名</th>\n        <th>用户名</th>\n        <th>头像</th>\n        <th>基础分</th>\n        <th>项目分</th>\n        <th>总分</th>\n      </tr>\n      <tr ng-repeat=\"item in items | orderBy:'-totalScore' \" >\n        <td ng-bind=\"$index+1\"></td>\n        <td ng-bind=\"item.username\"></td>\n        <td><img ng-src=\"{{item.picture}}\" width=\"64px\"></td>\n        <td ng-bind=\"item.score\"></td>\n        <td ng-bind=\"item.projectScore\"></td>\n        <td ng-bind=\"item.totalScore = item.score + item.projectScore\"></td>\n      </tr>\n    </table>\n  </div>\n  <div id=\"center\">\n    <h2>业余组排行榜</h2>\n    <table ng-controller=\"center\" >\n      <tr>\n        <th>排名</th>\n        <th>用户名</th>\n        <th>头像</th>\n        <th>基础分</th>\n        <th>项目分</th>\n        <th>总分</th>\n      </tr>\n      <tr ng-repeat=\"item in items | orderBy:'-totalScore' \" >\n        <td ng-bind=\"$index+1\"></td>\n        <td ng-bind=\"item.username\"></td>\n        <td><img ng-src=\"{{item.picture}}\" width=\"64px\"></td>\n        <td ng-bind=\"item.score\"></td>\n        <td ng-bind=\"item.projectScore\"></td>\n        <td ng-bind=\"item.totalScore = item.score + item.projectScore\"></td>\n      </tr>\n    </table>\n  </div>\n  <div id=\"right\">\n    <h2>程序媛新秀组排行榜</h2>\n    <table ng-controller=\"right\" >\n      <tr>\n        <th>排名</th>\n        <th>用户名</th>\n        <th>头像</th>\n        <th>基础分</th>\n        <th>项目分</th>\n        <th>总分</th>\n      </tr>\n      <tr ng-repeat=\"item in items | orderBy:'-totalScore' \" >\n        <td ng-bind=\"$index+1\"></td>\n        <td ng-bind=\"item.username\"></td>\n        <td><img ng-src=\"{{item.picture}}\" width=\"64px\"></td>\n        <td ng-bind=\"item.score\"></td>\n        <td ng-bind=\"item.projectScore\"></td>\n        <td ng-bind=\"item.totalScore = item.score + item.projectScore\"></td>\n      </tr>\n    </table>\n  </div>\n<script>\n  var project1 = ['bd7158d8c442eddfbeb5bd1f','bd7158d8c442eddfaeb5bd18','bd7158d8c242eddfaeb5bd13','bd7158d8c242eddfaeb5be13'];\n  var project2 = ['bd7158d8c442eddfaeb5bd13','bd7158d8c442eddfaeb5bd10','bd7158d8c442eddfaeb5bd19','bd7158d8c442eddfaeb5bd1f'];\n  var project3 = ['bd7158d8c442eddfaeb5bd17','bd7158d8c442eddfaeb5bd0f','bd7158d8c442eedfaeb5bd1c','bd7158d8c442eddfaeb5bd1c'];\n  var app = angular.module('app',[]);\n  app.controller('left',['$scope','$http', function($scope,$http){\n    $http.get('/master').then(function(res){\n      var out = res.data;\n      for(var i=0;i<out.length;i++){\n          for(var j=0;j<out[i].progressTimestamps.length;j++){\n            if(out[i].progressTimestamps[j].hasOwnProperty('completedChallenge')){\n              for(var k=0;k<4;k++){\n                if(out[i].progressTimestamps[j].completedChallenge == project1[k]){\n                  out[i].projectScore +=20;\n                  out[i].score -=1;\n                }\n                if(out[i].progressTimestamps[j].completedChallenge == project2[k]){\n                  out[i].projectScore +=30;\n                  out[i].score -=1;\n                }\n                if(out[i].progressTimestamps[j].completedChallenge == project3[k]){\n                  console.log(project3[k]);\n                  out[i].projectScore +=40;\n                  out[i].score -=1;\n                }\n              }\n            }\n          }\n      }\n      $scope.items = out;\n    },function(err){\n      console.log(err);\n    })\n  }]);\n\n  app.controller('center',['$scope','$http', function($scope,$http){\n    $http.get('/newer').then(function(res){\n      var out = res.data;\n      for(var i=0;i<out.length;i++){\n          for(var j=0;j<out[i].progressTimestamps.length;j++){\n            if(out[i].progressTimestamps[j].hasOwnProperty('completedChallenge')){\n              for(var k=0;k<4;k++){\n                if(out[i].progressTimestamps[j].completedChallenge == project1[k]){\n                  out[i].projectScore +=20;\n                  out[i].score -=1;\n                }\n                if(out[i].progressTimestamps[j].completedChallenge == project2[k]){\n                  out[i].projectScore +=30;\n                  out[i].score -=1;\n                }\n                if(out[i].progressTimestamps[j].completedChallenge == project3[k]){\n                  out[i].projectScore +=40;\n                  out[i].score -=1;\n                }\n              }\n            }\n          }\n      }\n      $scope.items = out;\n    },function(err){\n      console.log(err);\n    })\n  }])\n  app.controller('right',['$scope','$http', function($scope,$http){\n    $http.get('/women').then(function(res){\n      var out = res.data;\n      for(var i=0;i<out.length;i++){\n          for(var j=0;j<out[i].progressTimestamps.length;j++){\n            if(out[i].progressTimestamps[j].hasOwnProperty('completedChallenge')){\n              for(var k=0;k<4;k++){\n                if(out[i].progressTimestamps[j].completedChallenge == project1[k]){\n                  out[i].projectScore +=20;\n                  out[i].score -=1;\n                }\n                if(out[i].progressTimestamps[j].completedChallenge == project2[k]){\n                  out[i].projectScore +=30;\n                  out[i].score -=1;\n                }\n                if(out[i].progressTimestamps[j].completedChallenge == project3[k]){\n                  out[i].projectScore +=40;\n                  out[i].score -=1;\n                }\n              }\n            }\n          }\n      }\n      $scope.items = out;\n    },function(err){\n      console.log(err);\n    })\n  }])\n</script>\n</body>\n</html>\n"
  },
  {
    "path": "public/robots.txt",
    "content": "User-agent: *\nAllow: /\nSitemap: http://www.freecodecamp.cn/sitemap.xml\n"
  },
  {
    "path": "seed/bonfireMDNlinks.js",
    "content": "/**\n * MDN Links\n *\n * These links are for Bonfires. Each key/value pair is used to render a Bonfire with appropriate links.\n * The text of the key is what the link text will be, e.g. <a href=\"https://developer ...\">Global Array Object</a>\n * General convention is to use the page title of the MDN reference page.\n *\n **/\n\nvar links = {\n  // ========= NON MDN REFS\n  \"Currying\": \"https://leanpub.com/javascript-allonge/read#pabc\",\n  \"Smallest Common Multiple\": \"https://www.mathsisfun.com/least-common-multiple.html\",\n  \"Permutations\": \"https://www.mathsisfun.com/combinatorics/combinations-permutations.html\",\n  \"HTML Entities\": \"http://dev.w3.org/html5/html-author/charref\",\n  \"Symmetric Difference\": \"https://www.youtube.com/watch?v=PxffSUQRkG4\",\n  \"Roman Numerals\": \"http://www.mathsisfun.com/roman-numerals.html\",\n\n  // ========= GLOBAL OBJECTS\n  \"Global Array Object\": \"https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array\",\n  \"Global Object\": \"https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object\",\n  \"Global String Object\": \"https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/String\",\n  \"Boolean Objects\": \"https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Boolean\",\n  \"RegExp\": \"https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/RegExp\",\n  \"Global Function Object\": \"https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Function\",\n  \"Arguments object\": \"https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Functions/arguments\",\n  \"Closures\": \"https://developer.mozilla.org/zh-CN/docs/\" +\n  \"Web/JavaScript/Closures\",\n\n  // ========= GLOBAL OBJECT METHODS\n  \"parseInt()\": \"https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/parseInt\",\n\n\n  // =========  PROPERTIES/MISC\n  \"String.length\": \"https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/String/length\",\n\n\n  // ========== OBJECT METHODS\n  \"Object.getOwnPropertyNames()\": \"https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object/getOwnPropertyNames\",\n  \"Object.keys()\": \"https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object/keys\",\n  \"Object.hasOwnProperty()\": \"https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object/hasOwnProperty\",\n\n\n  // ======== STRING METHODS\n  \"String.charAt()\": \"https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/String/charAt\",\n  \"String.charCodeAt()\": \"https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/String/charCodeAt\",\n  \"String.concat()\": \"https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/String/concat\",\n  \"String.indexOf()\": \"https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/String/indexOf\",\n  \"String.fromCharCode()\": \"https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/String/fromCharCode\",\n  \"String.lastIndexOf()\": \"https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/String/lastIndexOf\",\n  \"String.match()\": \"https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/String/match\",\n  \"String.replace()\": \"https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/String/replace\",\n  \"String.slice()\": \"https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/String/slice\",\n  \"String.split()\": \"https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/String/split\",\n  \"String.substring()\": \"https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/String/substring\",\n  \"String.substr()\": \"https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/String/substr\",\n  \"String.toLowerCase()\": \"https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/String/toLowerCase\",\n  \"String.toString()\": \"https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/String/toString\",\n  \"String.toUpperCase()\": \"https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/String/toUpperCase\",\n\n  // ======== ARRAY METHODS\n  \"Array.concat()\": \"https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array/concat\",\n  \"Array.every()\": \"https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array/every\",\n  \"Array.filter()\": \"https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array/filter\",\n  \"Array.forEach()\": \"https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach\",\n  \"Array.indexOf()\": \"https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array/indexOf\",\n  \"Array.isArray()\": \"https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array/isArray\",\n  \"Array.join()\": \"https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array/join\",\n  \"Array.lastIndexOf()\": \"https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array/lastIndexOf\",\n  \"Array.map()\": \"https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array/map\",\n  \"Array.pop()\": \"https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array/pop\",\n  \"Array.push()\": \"https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array/push\",\n  \"Array.reduce()\": \"https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce\",\n  \"Array.reverse()\": \"https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array/reverse\",\n  \"Array.shift()\": \"https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array/shift\",\n  \"Array.slice()\": \"https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array/slice\",\n  \"Array.some()\": \"https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array/some\",\n  \"Array.sort()\": \"https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array/sort\",\n  \"Array.splice()\": \"https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array/splice\",\n  \"Array.toString()\": \"https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array/toString\",\n\n  // ======== MATH METHODS\n  \"Math.max()\": \"https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Math/max\",\n  \"Math.min()\": \"https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Math/min\",\n  \"Math.pow()\": \"https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Math/pow\",\n  \"Remainder\": \"https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Arithmetic_Operators#Remainder_(.25)\",\n\n  // ======== GENERAL JAVASCRIPT REFERENCES\n  \"Arithmetic Operators\": \"https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Arithmetic_Operators\",\n  \"Comparison Operators\": \"https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Comparison_Operators\",\n  \"Details of the Object Model\": \"https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Guide/Details_of_the_Object_Model\",\n  \"For Loops\": \"https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Statements/for\"\n};\n\nmodule.exports = links;\n"
  },
  {
    "path": "seed/challenges/00-getting-started/getting-started.json",
    "content": "{\n  \"name\": \"Join to Free Code Camp\",\n  \"order\": 1,\n  \"time\": \"15 miniutes\",\n  \"helpRoom\": \"chinese\",\n  \"challenges\": [\n    {\n      \"id\": \"560add10cb82ac38a17513be\",\n      \"title\": \"Learn how Free Code Camp Works\",\n      \"description\": [\n        [\n          \"/images/fcc-code.png\",\n          \"A picture of Free Code Camp's 4 benefits: Get connected, Learn JavaScript, Build your Portfolio, Help nonprofits\",\n          \"欢迎关注微信公众号：FreeCodeCamp，这里不仅有很多高质量的自学编程心得、经验、资料分享，还有备受欢迎的线下活动预告，千万不要错过哦。\",\n          \"\"\n        ],\n        [\n          \"/images/fcc-weibo.png\",\n          \"A picture of Free Code Camp's 4 benefits: Get connected, Learn JavaScript, Build your Portfolio, Help nonprofits\",\n          \"欢迎关注微博账号：FreeCodeCamp，这里不仅有很多高质量的自学编程心得、经验、资料分享，还有备受欢迎的线下活动预告，千万不要错过哦。\",\n          \"http://weibo.com/FreeCodeCamp\"\n        ],\n        [\n          \"/images/Elb3dfj.jpg\",\n          \"A screenshot of some of our campers coding together in Toronto.\",\n          \"自学编程不是一件容易的事情。要想取得成功，需要大量的学习和实践，所以我们的课程非常强调实战。\",\n          \"\"\n        ],\n        [\n          \"/images/D7Y5luw.jpg\",\n          \"A graph of the rate of job growth against growth in computer science degree graduates. There are 1.4 million jobs and only 400 thousand people to fill them.\",\n          \"互联网已经深入到各行各业，每年对程序猿的需求与日俱增。\",\n          \"\"\n        ],\n        [\n          \"/images/threepeople.png\",\n          \"Photos of three campers who've gotten jobs after learning to code at Free Code Camp.\",\n          \"FreeCodeCamp是成为程序猿的最有效路径。事实上，没有人完成了所有课程，因为他们在毕业前都找到了工作。\",\n          \"\"\n        ],\n        [\n          \"/images/eightskills.png\",\n          \"An illustration showing that you will learn HTML5, CSS3, JavaScript, Databases, Git, Node.js, React and D3.\",\n          \"我们会通过几百个编程挑战来让你逐渐掌握这些Web开发技术。\",\n          \"\"\n        ],\n        [\n          \"/images/UVB9hxp.jpg\",\n          \"An image of a camper at a cafe building projects on Free Code Camp.\",\n          \"我们相信人类学习的最好方式就是实践，你会花费大量的时间来做项目。\",\n          \"\"\n        ],\n        [\n          \"/images/pbW7K5S.jpg\",\n          \"An image of showing our front end, back end, and data visualization certifications (400 hours each), our nonprofit projects (800 hours), and interview prep (80 hours) for a total of 2,080 hours of coding experience.\",\n          \"全部通过我们的课程挑战可以获得四个证书，这些证书非常受到企业的认可。前三个证书每个大约花费400个小时，最后一个证书将花费800个小时，我们推荐你按照顺序完成他们，当然你也可以自由跳跃。\",\n          \"\"\n        ],\n        [\n          \"/images/k8btNUB.jpg\",\n          \"A screenshot of our Front End Development Certificate\",\n          \"如果你用HTML+CSS+jQuery+JavaScript完成了10个项目，你就可以获得我们的前端开发证书。\",\n          \"\"\n        ],\n        [\n          \"/images/Et3iD74.jpg\",\n          \"A screenshot of our Data Visualization Certificate\",\n          \"如果你用React+Sass+D3.js完成了10个项目，你就可以获得我们的数据可视化证书。\",\n          \"\"\n        ],\n        [\n          \"/images/8v3t84p.jpg\",\n          \"A screenshot of our Back End Development Certificate\",\n          \"如果你用Node.js,+Express+MongoDB完成了10个项目，你就可以获得我们的后端开发证书，你还可以通过Git和Heroku把项目部署到云上，让所有人都可以访问。\",\n          \"\"\n        ],\n        [\n          \"/images/yXyxbDd.jpg\",\n          \"A screen shot of our nonprofit project directory.\",\n          \"当你完成了获得了前面三个证书后，你就可以和你的同学一起组队运用敏捷软件开发技术完成两个真实项目，同时你被要求给两个陈旧的项目添加功能。当你完成这些后，你就拥有了一个作品集，里面包含人们每天都在使用的作品。\",\n          \"\"\n        ],\n        [\n          \"/images/PDGQ9ZM.jpg\",\n          \"An image of campers building projects together in a cafe in Seoul.\",\n          \"如果你完成了2080个小时的挑战和项目，你会获得我们的全栈开发证书。我们还给你提供了免费的代码面试练习和工作机会信息，满足你面试和找工作的需求。\",\n          \"\"\n        ]\n      ],\n      \"challengeSeed\": [],\n      \"tests\": [],\n      \"type\": \"Waypoint\",\n      \"challengeType\": 7\n    },\n    {\n      \"id\": \"560add37cb82ac38a17513bf\",\n      \"title\": \"Create a GitHub Account and Join our Chat Rooms\",\n      \"description\": [\n        [\n          \"/images/gitter.png\",\n          \"A screenshot of our one of our Gitter chat rooms.\",\n          \"在我们开始编程前，让我们先加入FreeCodeCamp聊天室，你可以在这里闲逛、提问或者寻找同学一起结对编程，当然首先你得有一个GitHub账户。\",\n          \"\"\n        ],\n        [\n          \"//i.imgur.com/n6GeSEm.gif\",\n          \"A gif showing you to click the link below to go to GitHub. Fill in the necessary fields and click submit. Then check your email inbox for an email from GitHub so you can verify your account.\",\n          \"请按照上图的步骤来注册GitHub，这是考验你是否具备自我学习能力的基本前提。\",\n          \"https://github.com/join\"\n        ],\n        [\n          \"//i.imgur.com/hFqAEr8.gif\",\n          \"A gif showing you how to click the profile image in the upper right hand corner of GitHub. Upload a photo of yourself or you will continue to use the automatically generated pixel art. Then fill in the remaining form fields and click submit.\",\n          \"点击GitHub右上角的像素头像，然后点击设置。上传一张你最帅或最靓的头像，写上你所在的姓名、邮箱、城市以便他人能第一时间联系上你，很多人的工作都是这么来的。\",\n          \"https://github.com/settings/profile\"\n        ],\n        [\n          \"//i.imgur.com/pYk0wOk.gif\",\n          \"A gif showing how you can star a GitHub repo.\",\n          \"打开FreeCodeCamp的开源仓库，这里是我们的志愿者一起协作搭建FreeCodeCamp的地方。你可以\\\"Star\\\"我们的仓库，\\\"star\\\"在GitHub的意思就是赞👍。\",\n          \"https://github.com/freecodecampchina/freecodecamp.cn\"\n        ],\n        [\n          \"//i.imgur.com/OmRmLB4.gif\",\n          \"A gif showing you how to click the link below to go to our chat room and click the \\\"sign in with GitHub\\\" button. Then you can click into the text input field and type a message to your fellow campers.\",\n          \"之前你已经注册了GitHub账户了，现在可以通过登录GitHub来加入我们的聊天室。通过\\\"Hello World\\\"的方式向大家介绍你自己，你是如何发现FreeCodeCamp的，你为什么想要学编程。\",\n          \"https://gitter.im/FreeCodeCamp/chinese\"\n        ],\n        [\n          \"//i.imgur.com/Ecs5XAd.gif\",\n          \"A gif showing you how you can click the settings button in the upper right hand corner and modify your notification settings.\",\n          \"我们的聊天室非常活跃，你可以更改你的隐私设置，这样只会在有人@你时才会提醒你。\",\n          \"\"\n        ],\n        [\n          \"//i.imgur.com/T0bGJPe.gif\",\n          \"A gif showing how you can click on a user profile image to initiate a private message with that user.\",\n          \"请记住所有的聊天室都是公开的，所以请你不要分享一些敏感信息，例如邮箱地址、手机号、QQ号，如果你想分享自己的个人信息给他人，请私聊。\",\n          \"\"\n        ],\n        [\n          \"//i.imgur.com/vDTMJSh.gif\",\n          \"A gif showing that you can tab back and forth between challenges and our chat rooms.\",\n          \"在你通过我们的挑战过程中，请保持聊天室常开。这样当你困惑了可以及时询问来获得帮助，还可以在休息时和其他同学聊聊天。\",\n          \"\"\n        ],\n        [\n          \"//i.imgur.com/WvQvNGN.gif\",\n          \"A gif showing how you can click the link below to download a native chat room app for your computer.\",\n          \"gitter是免费、开放的程序员沟通方式，所有的信息都可以免费永久保存。强烈推荐你在电脑或者手机下载这个APP。\",\n          \"https://gitter.im/apps\"\n        ]\n      ],\n      \"challengeSeed\": [],\n      \"tests\": [],\n      \"type\": \"Waypoint\",\n      \"challengeType\": 7\n    },\n    {\n      \"id\": \"560add56cb82ac38a17513c0\",\n      \"title\": \"Configure your Code Portfolio\",\n      \"description\": [\n        [\n          \"//i.imgur.com/tP2ccTE.gif\",\n          \"A gif showing how you can click your profile image in your upper right hand corner to your code portfolio and connect GitHub.\",\n          \"如果你是通过邮箱注册的账户，你可以点击右上角的头像，切换到代码记录区。然后点击“连接GitHub账户”来同步你的GitHub账户。你的代码记录区清晰地显示了你的每天学习进度。每完成了一个挑战时，你会获得一个奖励积分。如果你连续一周都获得了积分，你会获得一条彩带。\",\n          \"\"\n        ]\n      ],\n      \"challengeSeed\": [],\n      \"tests\": [],\n      \"type\": \"Waypoint\",\n      \"challengeType\": 7\n    },\n    {\n      \"id\": \"560add71cb82ac38a17513c2\",\n      \"title\": \"Join a Campsite in Your City\",\n      \"description\": [\n        [\n          \"//i.imgur.com/XugIMb4.jpg\",\n          \"A picture of some of our campers meeting in a local cafe.\",\n          \"我们的营地是微信公众号:freecodecamp，它可以帮助你遇到和你同一个城市的小伙伴。你还可以基于微信群去策划或者参加“Coffee and Code”活动，在那里你会遇到更多志同道合的FCC小伙伴，一起交流学习心得，解疑答惑。\",\n          \"\"\n        ],\n        [\n          \"//i.imgur.com/fTFMjwf.gif\",\n          \"A gif showing how you can click the link below, find your city on the list of Campsites, then click on the Facebook link for your city and join your city's Facebook group.\",\n          \"在这个列表找到你的城市，然后点击它，这样就这些跳转到你所在城市的Facebook群组，点击\\\"Join group\\\"按钮申请加入，很快就有人批准你通过。如果你的城市不在这个列表，滑到页面的最下面，按照Wiki的提示来创建自己城市的营地。\",\n          \"https://github.com/FreeCodeCamp/FreeCodeCamp/wiki/LocalGroups-List\"\n        ]\n      ],\n      \"challengeSeed\": [],\n      \"tests\": [],\n      \"type\": \"Waypoint\",\n      \"challengeType\": 7\n    },\n    {\n      \"id\": \"560add8ccb82ac38a17513c4\",\n      \"title\": \"Learn What to Do If You Get Stuck\",\n      \"description\": [\n        [\n          \"//i.imgur.com/lzKvwU2.jpg\",\n          \"The text \\\"Coding is hard.\\\"\",\n          \"编程是个困难的事情，你总会遇到困惑。即使是有经验的高手也会困惑，关键点是他们懂得如何解决困惑。\",\n          \"\"\n        ],\n        [\n          \"//i.imgur.com/sfsidp6.jpg\",\n          \"The text \\\"It takes time to get good at coding.\\\"\",\n          \"要想成为高手需要花费大量的时间，你不可能学习象棋三个月就打败象棋大师，更不要期望学习编程三个月就可以构建下一个Facebook。\",\n          \"\"\n        ],\n        [\n          \"//i.imgur.com/EoTfOyC.jpg\",\n          \"An image of some of our campers coding together in Montreal.\",\n          \"每天坚持写代码，并和其他小伙伴一起交流，感受程序猿这个宇宙最先进物种的气质。\",\n          \"\"\n        ],\n        [\n          \"//i.imgur.com/EWWZBag.jpg\",\n          \"An image with the text \\\"1. Read the error 2. Search Google 3. Ask for help.\",\n          \"当你遇到困惑不知道该怎么办，永远记住:Read-Search-Ask。\",\n          \"\"\n        ],\n        [\n          \"//i.imgur.com/99BfAcK.jpg\",\n          \"An image showing jQuery documentation\",\n          \"首先，查阅文档或错误信息。这是程序猿三大必备技能之一：Read\",\n          \"\"\n        ],\n        [\n          \"//i.imgur.com/GxvrsFb.gif\",\n          \"A gif showing you how to do an advanced Google search. First, we enter the query \\\"jquery doesn't run when my page loads\\\". Then we click search tools button and change the \\\"Any time\\\" select box to \\\"within the last year\\\". Then we click on a result and read through the article and find our answer.\",\n          \"如果Read解决不了问题，试试谷歌搜索。当你用谷歌搜索时，记得输入你正在用的语言或框架，你还可以限制返回结果的日期。这是程序猿三大必备技能之二：Search\",\n          \"\"\n        ],\n        [\n          \"//i.imgur.com/LZYU7p2.gif\",\n          \"A gif showing us following the link below to go to the help chat room and ask \\\"jquery doesn't run when my page loads\\\".\",\n          \"如果Search找不到答案，可以问问你的朋友。如果你身边没有朋友，你可以在聊天室问FCC的小伙伴，他们都是很热心的。这是程序猿三大必备技能之二：Ask\",\n          \"https://gitter.im/FreeCodeCamp/chinese\"\n        ],\n        [\n          \"//i.imgur.com/ZRgXraT.gif\",\n          \"A gif showing us scrolling through our challenge map.\",\n          \"现在你已经准备好开始编程之路了，请点击页面上面的\\\"学习路径\\\"开始挑战。我们会持续更新课程内容的，所以看到章节变化别感到奇怪，Keep Moving、永不止步！\",\n          \"\"\n        ]\n      ],\n      \"challengeSeed\": [],\n      \"tests\": [],\n      \"type\": \"Waypoint\",\n      \"challengeType\": 7\n    }\n  ]\n}\n"
  },
  {
    "path": "seed/challenges/01-front-end-development-certification/advanced-bonfires.json",
    "content": "{\n  \"name\": \"Advanced Algorithm Scripting\",\n  \"order\": 12,\n  \"time\": \"50 hours\",\n  \"helpRoom\": \"chinese\",\n  \"challenges\": [\n    {\n      \"id\": \"aff0395860f5d3034dc0bfc9\",\n      \"title\": \"Validate US Telephone Numbers\",\n      \"description\": [\n        \"如果传入字符串是一个有效的美国电话号码，则返回 <code>true</code>.\",\n        \"用户可以在表单中填入一个任意有效美国电话号码. 下面是一些有效号码的例子(还有下面测试时用到的一些变体写法):\",\n        \"<blockquote>555-555-5555\\n(555)555-5555\\n(555) 555-5555\\n555 555 5555\\n5555555555\\n1 555 555 5555</blockquote>\",\n        \"在本节中你会看见如 <code>800-692-7753</code> or <code>8oo-six427676;laskdjf</code>这样的字符串. 你的任务就是验证前面给出的字符串是否是有效的美国电话号码. 区号是必须有的. 如果字符串中给出了国家代码, 你必须验证其是 <code>1</code>.  如果号码有效就返回 <code>true</code> ; 否则返回 <code>false</code>.\",\n        \"当你遇到困难的时候，记得查看错误提示、阅读文档、搜索、提问。\"\n      ],\n      \"challengeSeed\": [\n        \"function telephoneCheck(str) {\",\n        \"  // 祝你好运\",\n        \"  return true;\",\n        \"}\",\n        \"\",\n        \"\",\n        \"\",\n        \"telephoneCheck(\\\"555-555-5555\\\");\"\n      ],\n      \"solutions\": [\n        \"var re = /^(?:(?:\\\\+?1\\\\s*(?:[.-]\\\\s*)?)?(?:\\\\(\\\\s*([2-9]1[02-9]|[2-9][02-8]1|[2-9][02-8][02-9])\\\\s*\\\\)|([2-9]1[02-9]|[2-9][02-8]1|[2-9][02-8][02-9]))\\\\s*(?:[.-]\\\\s*)?)?([2-9]1[02-9]|[2-9][02-9]1|[2-9][02-9]{2})\\\\s*(?:[.-]\\\\s*)?([0-9]{4})$/;\\n\\nfunction telephoneCheck(str) {\\n  return !!str.match(re);\\n}\\n\\ntelephoneCheck(\\\"555-555-5555\\\");\"\n      ],\n      \"tests\": [\n        \"assert(typeof telephoneCheck(\\\"555-555-5555\\\") === \\\"boolean\\\", 'message: <code>telephoneCheck(\\\"555-555-5555\\\")</code> 应该返回一个布尔值.');\",\n        \"assert(telephoneCheck(\\\"1 555-555-5555\\\") === true, 'message: <code>telephoneCheck(\\\"1 555-555-5555\\\")</code> 应该返回 true.');\",\n        \"assert(telephoneCheck(\\\"1 (555) 555-5555\\\") === true, 'message: <code>telephoneCheck(\\\"1 (555) 555-5555\\\")</code> 应该返回 true.');\",\n        \"assert(telephoneCheck(\\\"5555555555\\\") === true, 'message: <code>telephoneCheck(\\\"5555555555\\\")</code> 应该返回 true.');\",\n        \"assert(telephoneCheck(\\\"555-555-5555\\\") === true, 'message: <code>telephoneCheck(\\\"555-555-5555\\\")</code> 应该返回 true.');\",\n        \"assert(telephoneCheck(\\\"(555)555-5555\\\") === true, 'message: <code>telephoneCheck(\\\"(555)555-5555\\\")</code> 应该返回 true.');\",\n        \"assert(telephoneCheck(\\\"1(555)555-5555\\\") === true, 'message: <code>telephoneCheck(\\\"1(555)555-5555\\\")</code> 应该返回 true.');\",\n        \"assert(telephoneCheck(\\\"1 555)555-5555\\\") === false, 'message: <code>telephoneCheck(\\\"1 555)555-5555\\\")</code> 应该返回 false.');\",\n        \"assert(telephoneCheck(\\\"1 555 555 5555\\\") === true, 'message: <code>telephoneCheck(\\\"1 555 555 5555\\\")</code> 应该返回 true.');\",\n        \"assert(telephoneCheck(\\\"1 456 789 4444\\\") === true, 'message: <code>telephoneCheck(\\\"1 456 789 4444\\\")</code> 应该返回 true.');\",\n        \"assert(telephoneCheck(\\\"123**&!!asdf#\\\") === false, 'message: <code>telephoneCheck(\\\"123**&!!asdf#\\\")</code> 应该返回 false.');\",\n        \"assert(telephoneCheck(\\\"55555555\\\") === false, 'message: <code>telephoneCheck(\\\"55555555\\\")</code> 应该返回 false.');\",\n        \"assert(telephoneCheck(\\\"(6505552368)\\\") === false, 'message: <code>telephoneCheck(\\\"(6505552368)\\\")</code> 应该返回 false');\",\n        \"assert(telephoneCheck(\\\"2 (757) 622-7382\\\") === false, 'message: <code>telephoneCheck(\\\"2 (757) 622-7382\\\")</code> 应该返回 false.');\",\n        \"assert(telephoneCheck(\\\"0 (757) 622-7382\\\") === false, 'message: <code>telephoneCheck(\\\"0 (757) 622-7382\\\")</code> 应该返回 false.');\",\n        \"assert(telephoneCheck(\\\"-1 (757) 622-7382\\\") === false, 'message: <code>telephoneCheck(\\\"-1 (757) 622-7382\\\")</code> 应该返回 false');\",\n        \"assert(telephoneCheck(\\\"2 757 622-7382\\\") === false, 'message: <code>telephoneCheck(\\\"2 757 622-7382\\\")</code> 应该返回 false.');\",\n        \"assert(telephoneCheck(\\\"10 (757) 622-7382\\\") === false, 'message: <code>telephoneCheck(\\\"10 (757) 622-7382\\\")</code> 应该返回 false.');\",\n        \"assert(telephoneCheck(\\\"27576227382\\\") === false, 'message: <code>telephoneCheck(\\\"27576227382\\\")</code> 应该返回 false.');\",\n        \"assert(telephoneCheck(\\\"(275)76227382\\\") === false, 'message: <code>telephoneCheck(\\\"(275)76227382\\\")</code> 应该返回 false.');\",\n        \"assert(telephoneCheck(\\\"2(757)6227382\\\") === false, 'message: <code>telephoneCheck(\\\"2(757)6227382\\\")</code> 应该返回 false.');\",\n        \"assert(telephoneCheck(\\\"2(757)622-7382\\\") === false, 'message: <code>telephoneCheck(\\\"2(757)622-7382\\\")</code> 应该返回 false.');\",\n        \"assert(telephoneCheck(\\\"555)-555-5555\\\") === false, 'message: <code>telephoneCheck(\\\"555)-555-5555\\\")</code> 应该返回 false.');\",\n        \"assert(telephoneCheck(\\\"(555-555-5555\\\") === false, 'message: <code>telephoneCheck(\\\"(555-555-5555\\\")</code> 应该返回 false.');\"\n      ],\n      \"type\": \"bonfire\",\n      \"MDNlinks\": [\n        \"RegExp\"\n      ],\n      \"challengeType\": 5\n    },\n    {\n      \"id\": \"56533eb9ac21ba0edf2244cf\",\n      \"title\": \"Record Collection\",\n      \"description\": [\n        \"右边有一个JSON对象，代表多张音乐专辑。每一张专辑都有一个唯一的 <code>id</code> 标识以及其他有多种属性。但有些专辑可能会少一些属性。\",\n        \"请写一个函数，这个函数接收三个与专辑相关的参数，分别是 <code>id</code>（比如 <code>2548</code>）、<code>prop</code>（比如 <code>\\\"artist\\\"</code>）以及 <code>value</code>（比如 <code>\\\"Addicted to Love\\\"</code>）。这些参数都是用来修改专辑中数据的。\",\n        \"如果 <code>prop</code> 不是 <code>\\\"tracks\\\"</code> 且 <code>value</code> 不为空字符串 <code>\\\"\\\"</code>，则需要将这张专辑的对应属性添加或更新成这个 <code>value</code>。\",\n        \"注意：<code>update</code> 函数返回的永远是整个 JSON 对象。\",\n        \"以下为处理缺失信息的方法：\",\n        \"如果 <code>prop</code> 是 <code>\\\"tracks\\\"</code>，但这个专辑中没有 <code>\\\"tracks\\\"</code> 属性，则需要先把这个属性的值设置为空数组。\",\n        \"如果 <code>prop</code> 是 <code>\\\"tracks\\\"</code> 且 <code>value</code> 不为空字符串 <code>\\\"\\\"</code>，那么就把 <code>value</code> 添加到当前专辑 <code>tracks</code> 数组的末尾。\",\n        \"如果 <code>value</code> 是空字符串 <code>\\\"\\\"</code>，则需要把对应的 <code>prop</code> 属性从专辑中删除。\",\n        \"<strong>提示</strong>\",\n        \"使用中括号操作符来 <a href=\\\"accessing-objects-properties-with-variables\\\" target=\\\"_blank\\\">访问对象的变量属性</a>。\",\n        \"可以先去 MDN 了解一下数组的 <code>push</code> 方法。\"\n      ],\n      \"releasedOn\": \"January 1, 2016\",\n      \"challengeSeed\": [\n        \"// 初始化变量\",\n        \"var collection = {\",\n        \"    2548: {\",\n        \"      album: \\\"Slippery When Wet\\\",\",\n        \"      artist: \\\"Bon Jovi\\\",\",\n        \"      tracks: [ \",\n        \"        \\\"Let It Rock\\\", \",\n        \"        \\\"You Give Love a Bad Name\\\" \",\n        \"      ]\",\n        \"    },\",\n        \"    2468: {\",\n        \"      album: \\\"1999\\\",\",\n        \"      artist: \\\"Prince\\\",\",\n        \"      tracks: [ \",\n        \"        \\\"1999\\\", \",\n        \"        \\\"Little Red Corvette\\\" \",\n        \"      ]\",\n        \"    },\",\n        \"    1245: {\",\n        \"      artist: \\\"Robert Palmer\\\",\",\n        \"      tracks: [ ]\",\n        \"    },\",\n        \"    5439: {\",\n        \"      album: \\\"ABBA Gold\\\"\",\n        \"    }\",\n        \"};\",\n        \"// 深拷贝 collection，用于测试\",\n        \"var collectionCopy = JSON.parse(JSON.stringify(collection));\",\n        \"\",\n        \"// 请只修改这条注释以下的代码\",\n        \"function update(id, prop, value) {\",\n        \"\",\n        \"\",\n        \"  return collection;\",\n        \"}\",\n        \"\",\n        \"// 你可以修改这一行来测试你的代码\",\n        \"update(5439, \\\"artist\\\", \\\"ABBA\\\");\",\n        \"\"\n      ],\n      \"tail\": [\n        \";(function(x) { return \\\"collection = \\\\n\\\" + JSON.stringify(x, '\\\\n', 2); })(collection);\"\n      ],\n      \"solutions\": [\n        \"var collection = {\\n    2548: {\\n      album: \\\"Slippery When Wet\\\",\\n      artist: \\\"Bon Jovi\\\",\\n      tracks: [ \\n        \\\"Let It Rock\\\", \\n        \\\"You Give Love a Bad Name\\\" \\n      ]\\n    },\\n    2468: {\\n      album: \\\"1999\\\",\\n      artist: \\\"Prince\\\",\\n      tracks: [ \\n        \\\"1999\\\", \\n        \\\"Little Red Corvette\\\" \\n      ]\\n    },\\n    1245: {\\n      artist: \\\"Robert Palmer\\\",\\n      tracks: [ ]\\n    },\\n    5439: {\\n      album: \\\"ABBA Gold\\\"\\n    }\\n};\\n// Keep a copy of the collection for tests\\nvar collectionCopy = JSON.parse(JSON.stringify(collection));\\n\\n// Only change code below this line\\nfunction update(id, prop, value) {\\n  if(value !== \\\"\\\") {\\n    if(prop === \\\"tracks\\\") {\\n      collection[id][prop] = [].concat.call(collection[id][prop] || [], value);\\n    } else {\\n      collection[id][prop] = value;\\n    }\\n  } else {\\n    delete collection[id][prop];\\n  }\\n\\n  return collection;\\n}\"\n      ],\n      \"tests\": [\n        \"collection = collectionCopy; assert(update(5439, \\\"artist\\\", \\\"ABBA\\\")[5439][\\\"artist\\\"] === \\\"ABBA\\\", 'message: <code>update(5439, \\\"artist\\\", \\\"ABBA\\\")</code> 之后, <code>artist</code> 应该为 <code>\\\"ABBA\\\"</code>');\",\n        \"assert(update(5439, \\\"tracks\\\", \\\"Take a Chance on Me\\\")[5439][\\\"tracks\\\"].pop() === \\\"Take a Chance on Me\\\", 'message: <code>update(5439, \\\"tracks\\\", \\\"Take a Chance on Me\\\")</code> 之后, <code>tracks</code> 的最后的一个元素应该是 <code>\\\"Take a Chance on Me\\\"</code>');\",\n        \"update(2548, \\\"artist\\\", \\\"\\\"); assert(!collection[2548].hasOwnProperty(\\\"artist\\\"), 'message: <code>update(2548, \\\"artist\\\", \\\"\\\")</code> 之后, <code>artist</code> 应该不存在');\",\n        \"assert(update(1245, \\\"tracks\\\", \\\"Addicted to Love\\\")[1245][\\\"tracks\\\"].pop() === \\\"Addicted to Love\\\", 'message: <code>update(1245, \\\"tracks\\\", \\\"Addicted to Love\\\")</code> 之后, <code>tracks</code> 的最后一个元素应该是 <code>\\\"Addicted to Love\\\"</code>');\",\n        \"assert(update(2468, \\\"tracks\\\", \\\"Free\\\")[2468][\\\"tracks\\\"][0] === \\\"1999\\\", 'message: <code>update(2468, \\\"tracks\\\", \\\"Free\\\")</code> 之后, <code>tracks</code> 的第一个元素应为  <code>\\\"1999\\\"</code>');\",\n        \"update(2548, \\\"tracks\\\", \\\"\\\"); assert(!collection[2548].hasOwnProperty(\\\"tracks\\\"), 'message: <code>update(2548, \\\"tracks\\\", \\\"\\\")</code> 之后, <code>tracks</code> 应该不存在');\"\n      ],\n      \"type\": \"bonfire\",\n      \"challengeType\": 5\n    },\n    {\n      \"id\": \"a3f503de51cf954ede28891d\",\n      \"title\": \"Symmetric Difference\",\n      \"description\": [\n        \"创建一个函数，接受两个或多个数组，返回所给数组的 <dfn>对等差分(symmetric difference)</dfn> (<code>&xutri;</code> or <code>&oplus;</code>)数组.\",\n        \"给出两个集合 (如集合 <code>A = {1, 2, 3}</code> 和集合 <code>B = {2, 3, 4}</code>), 而数学术语 \\\"对等差分\\\" 的集合就是指由所有只在两个集合其中之一的元素组成的集合(<code>A &xutri; B = C = {1, 4}</code>). 对于传入的额外集合 (如 <code>D = {2, 3}</code>), 你应该安装前面原则求前两个集合的结果与新集合的对等差分集合 (<code>C &xutri; D = {1, 4} &xutri; {2, 3} = {1, 2, 3, 4}</code>).\",\n        \"当你遇到困难的时候，记得查看错误提示、阅读文档、搜索、提问。\"\n      ],\n      \"challengeSeed\": [\n        \"function sym(args) {\",\n        \"  return args;\",\n        \"}\",\n        \"\",\n        \"sym([1, 2, 3], [5, 2, 1, 4]);\"\n      ],\n      \"solutions\": [\n        \"function sym(args) {\\n  var index = -1;\\n  var length = arguments.length;\\n  var result;\\n  while (++index < length) {\\n    var array = arguments[index];\\n    result = result ? diff(result, array).concat(diff(array, result)) : array;\\n  }\\n  return result ? uniq(result) : [];\\n}\\n\\nfunction uniq(arr) {\\n  var h = Object.create(null);\\n  var u = [];\\n  arr.forEach(function(v) {\\n    if (v in h) return;\\n    h[v] = true;\\n    u.push(v);\\n  });\\n  return u;\\n}\\n\\nfunction diff(a, b) {\\n  var h = Object.create(null);\\n  b.forEach(function(v) {\\n    h[v] = true;  \\n  });\\n  return a.filter(function(v) { return !(v in h);});\\n}\\nsym([1, 2, 3], [5, 2, 1, 4]);\\n\"\n      ],\n      \"tests\": [\n        \"assert.sameMembers(sym([1, 2, 3], [5, 2, 1, 4]), [3, 4, 5], 'message: <code>sym([1, 2, 3], [5, 2, 1, 4])</code> 应该返回 <code>[3, 4, 5]</code>.');\",\n        \"assert.equal(sym([1, 2, 3], [5, 2, 1, 4]).length, 3, 'message: <code>sym([1, 2, 3], [5, 2, 1, 4])</code> 应该只包含三个元素.');\",\n        \"assert.sameMembers(sym([1, 2, 5], [2, 3, 5], [3, 4, 5]), [1, 4, 5], 'message: <code>sym([1, 2, 5], [2, 3, 5], [3, 4, 5])</code> 应该返回 <code>[1, 4, 5]</code>');\",\n        \"assert.equal(sym([1, 2, 5], [2, 3, 5], [3, 4, 5]).length, 3, 'message: <code>sym([1, 2, 5], [2, 3, 5], [3, 4, 5])</code> 应该只包含三个元素.');\",\n        \"assert.sameMembers(sym([1, 1, 2, 5], [2, 2, 3, 5], [3, 4, 5, 5]), [1, 4, 5], 'message: <code>sym([1, 1, 2, 5], [2, 2, 3, 5], [3, 4, 5, 5])</code> 应该返回 <code>[1, 4, 5]</code>.');\",\n        \"assert.equal(sym([1, 1, 2, 5], [2, 2, 3, 5], [3, 4, 5, 5]).length, 3, 'message: <code>sym([1, 1, 2, 5], [2, 2, 3, 5], [3, 4, 5, 5])</code> 应该只包含三个元素.');\",\n        \"assert.sameMembers(sym([3, 3, 3, 2, 5], [2, 1, 5, 7], [3, 4, 6, 6], [1, 2, 3]), [2, 3, 4, 6, 7], 'message: <code>sym([3, 3, 3, 2, 5], [2, 1, 5, 7], [3, 4, 6, 6], [1, 2, 3])</code> 应该返回 <code>[2, 3, 4, 6, 7]</code>.');\",\n        \"assert.equal(sym([3, 3, 3, 2, 5], [2, 1, 5, 7], [3, 4, 6, 6], [1, 2, 3]).length, 5, 'message: <code>sym([3, 3, 3, 2, 5], [2, 1, 5, 7], [3, 4, 6, 6], [1, 2, 3])</code> 应该只包含五个元素.');\",\n        \"assert.sameMembers(sym([3, 3, 3, 2, 5], [2, 1, 5, 7], [3, 4, 6, 6], [1, 2, 3], [5, 3, 9, 8], [1]), [1, 2, 4, 5, 6, 7, 8, 9], 'message: <code>sym([3, 3, 3, 2, 5], [2, 1, 5, 7], [3, 4, 6, 6], [1, 2, 3], [5, 3, 9, 8], [1])</code> 应该返回 <code>[1, 2, 4, 5, 6, 7, 8, 9]</code>.');\",\n        \"assert.equal(sym([3, 3, 3, 2, 5], [2, 1, 5, 7], [3, 4, 6, 6], [1, 2, 3], [5, 3, 9, 8], [1]).length, 8, 'message: <code>sym([3, 3, 3, 2, 5], [2, 1, 5, 7], [3, 4, 6, 6], [1, 2, 3], [5, 3, 9, 8], [1])</code> 应该只包含八个元素.');\"\n      ],\n      \"type\": \"bonfire\",\n      \"MDNlinks\": [\n        \"Array.reduce()\",\n        \"Symmetric Difference\"\n      ],\n      \"challengeType\": 5\n    },\n    {\n      \"id\": \"aa2e6f85cab2ab736c9a9b24\",\n      \"title\": \"Exact Change\",\n      \"description\": [\n        \"设计一个收银机找零函数 <code>checkCashRegister()</code>，它接收三个参数，分别是购买总价 (<code>price</code>)、付款金额 (<code>cash</code>) 和收银机中可用的零钱 (<code>cid</code>)。\",\n        \"<code>cid</code> 是一个二维数组，存着当前可用的找零。每个子数组中的第一个元素代表币种，第二个元素代表这个币种的可用总额。比如，<code>[\\\"FIVE\\\", 20.00]</code> 表示五元纸币的可用总额是 <code>20</code>，也就是有四张五元纸币。\",\n        \"其中，<code>\\\"PENNY\\\"</code> 表示一分 (0.01)，<code>\\\"NICKLE\\\"</code> 表示五分 (0.05)，<code>\\\"DIME\\\"</code> 表示一角 (0.1)，<code>\\\"QUARTER\\\"</code> 表示两毛五 (0.25)。<code>\\\"ONE\\\"</code> 表示一元，<code>\\\"FIVE\\\"</code> 表示五元，其余的以此类推。\",\n        \"当收银机中的钱不够找零时返回字符串 <code>\\\"Insufficient Funds\\\"</code>。如果正好则返回字符串 <code>\\\"Closed\\\"</code>。\",\n        \"否则, 返回应找回的零钱列表,且由大到小存在二维数组中。\",\n        \"当你遇到困难的时候，记得查看错误提示、阅读文档、搜索、提问。\"\n      ],\n      \"challengeSeed\": [\n        \"function checkCashRegister(price, cash, cid) {\",\n        \"  var change;\",\n        \"  return change;\",\n        \"}\",\n        \"\",\n        \"// cid 参数示例:\",\n        \"// [[\\\"PENNY\\\", 1.01],\",\n        \"// [\\\"NICKEL\\\", 2.05],\",\n        \"// [\\\"DIME\\\", 3.10],\",\n        \"// [\\\"QUARTER\\\", 4.25],\",\n        \"// [\\\"ONE\\\", 90.00],\",\n        \"// [\\\"FIVE\\\", 55.00],\",\n        \"// [\\\"TEN\\\", 20.00],\",\n        \"// [\\\"TWENTY\\\", 60.00],\",\n        \"// [\\\"ONE HUNDRED\\\", 100.00]]\",\n        \"\",\n        \"checkCashRegister(19.50, 20.00, [[\\\"PENNY\\\", 1.01], [\\\"NICKEL\\\", 2.05], [\\\"DIME\\\", 3.10], [\\\"QUARTER\\\", 4.25], [\\\"ONE\\\", 90.00], [\\\"FIVE\\\", 55.00], [\\\"TEN\\\", 20.00], [\\\"TWENTY\\\", 60.00], [\\\"ONE HUNDRED\\\", 100.00]]);\"\n      ],\n      \"solutions\": [\n        \"var denom = [\\n\\t{ name: 'ONE HUNDRED', val: 100.00},\\n\\t{ name: 'TWENTY', val: 20.00},\\n\\t{ name: 'TEN', val: 10.00},\\n\\t{ name: 'FIVE', val: 5.00},\\n\\t{ name: 'ONE', val: 1.00},\\n\\t{ name: 'QUARTER', val: 0.25},\\n\\t{ name: 'DIME', val: 0.10},\\n\\t{ name: 'NICKEL', val: 0.05},\\n\\t{ name: 'PENNY', val: 0.01}\\n];\\n\\nfunction checkCashRegister(price, cash, cid) {\\n    var change = cash - price;\\n    var register = cid.reduce(function(acc, curr) {\\n        acc.total += curr[1];\\n        acc[curr[0]] = curr[1];\\n        return acc;\\n    }, {total: 0});\\n    if(register.total === change) {\\n        return 'Closed';\\n    }\\n    if(register.total < change) {\\n        return 'Insufficient Funds';\\n    }\\n    var change_arr = denom.reduce(function(acc, curr) {\\n        var value = 0;\\n        while(register[curr.name] > 0 && change >= curr.val) {\\n           change -= curr.val;\\n           register[curr.name] -= curr.val;\\n           value += curr.val;\\n           change = Math.round(change * 100) / 100;\\n        }\\n        if(value > 0) {\\n            acc.push([ curr.name, value ]);\\n        }\\n        return acc;\\n    }, []);\\n  if(change_arr.length < 1 || change > 0) {\\n    return \\\"Insufficient Funds\\\";\\n  }\\n  return change_arr;\\n}\"\n      ],\n      \"tests\": [\n        \"assert.isArray(checkCashRegister(19.50, 20.00, [[\\\"PENNY\\\", 1.01], [\\\"NICKEL\\\", 2.05], [\\\"DIME\\\", 3.10], [\\\"QUARTER\\\", 4.25], [\\\"ONE\\\", 90.00], [\\\"FIVE\\\", 55.00], [\\\"TEN\\\", 20.00], [\\\"TWENTY\\\", 60.00], [\\\"ONE HUNDRED\\\", 100.00]]), 'message: <code>checkCashRegister(19.50, 20.00, [[\\\"PENNY\\\", 1.01], [\\\"NICKEL\\\", 2.05], [\\\"DIME\\\", 3.10], [\\\"QUARTER\\\", 4.25], [\\\"ONE\\\", 90.00], [\\\"FIVE\\\", 55.00], [\\\"TEN\\\", 20.00], [\\\"TWENTY\\\", 60.00], [\\\"ONE HUNDRED\\\", 100.00]])</code> 应该返回一个数组.');\",\n        \"assert.isString(checkCashRegister(19.50, 20.00, [[\\\"PENNY\\\", 0.01], [\\\"NICKEL\\\", 0], [\\\"DIME\\\", 0], [\\\"QUARTER\\\", 0], [\\\"ONE\\\", 0], [\\\"FIVE\\\", 0], [\\\"TEN\\\", 0], [\\\"TWENTY\\\", 0], [\\\"ONE HUNDRED\\\", 0]]), 'message: <code>checkCashRegister(19.50, 20.00, [[\\\"PENNY\\\", 0.01], [\\\"NICKEL\\\", 0], [\\\"DIME\\\", 0], [\\\"QUARTER\\\", 0], [\\\"ONE\\\", 0], [\\\"FIVE\\\", 0], [\\\"TEN\\\", 0], [\\\"TWENTY\\\", 0], [\\\"ONE HUNDRED\\\", 0]])</code> 应该返回一个字符串.');\",\n        \"assert.isString(checkCashRegister(19.50, 20.00, [[\\\"PENNY\\\", 0.50], [\\\"NICKEL\\\", 0], [\\\"DIME\\\", 0], [\\\"QUARTER\\\", 0], [\\\"ONE\\\", 0], [\\\"FIVE\\\", 0], [\\\"TEN\\\", 0], [\\\"TWENTY\\\", 0], [\\\"ONE HUNDRED\\\", 0]]), 'message: <code>checkCashRegister(19.50, 20.00, [[\\\"PENNY\\\", 0.50], [\\\"NICKEL\\\", 0], [\\\"DIME\\\", 0], [\\\"QUARTER\\\", 0], [\\\"ONE\\\", 0], [\\\"FIVE\\\", 0], [\\\"TEN\\\", 0], [\\\"TWENTY\\\", 0], [\\\"ONE HUNDRED\\\", 0]])</code> 应该返回一个字符串.');\",\n        \"assert.deepEqual(checkCashRegister(19.50, 20.00, [[\\\"PENNY\\\", 1.01], [\\\"NICKEL\\\", 2.05], [\\\"DIME\\\", 3.10], [\\\"QUARTER\\\", 4.25], [\\\"ONE\\\", 90.00], [\\\"FIVE\\\", 55.00], [\\\"TEN\\\", 20.00], [\\\"TWENTY\\\", 60.00], [\\\"ONE HUNDRED\\\", 100.00]]), [[\\\"QUARTER\\\", 0.50]], 'message: <code>checkCashRegister(19.50, 20.00, [[\\\"PENNY\\\", 1.01], [\\\"NICKEL\\\", 2.05], [\\\"DIME\\\", 3.10], [\\\"QUARTER\\\", 4.25], [\\\"ONE\\\", 90.00], [\\\"FIVE\\\", 55.00], [\\\"TEN\\\", 20.00], [\\\"TWENTY\\\", 60.00], [\\\"ONE HUNDRED\\\", 100.00]])</code> 应该返回 <code>[[\\\"QUARTER\\\", 0.50]]</code>.');\",\n        \"assert.deepEqual(checkCashRegister(3.26, 100.00, [[\\\"PENNY\\\", 1.01], [\\\"NICKEL\\\", 2.05], [\\\"DIME\\\", 3.10], [\\\"QUARTER\\\", 4.25], [\\\"ONE\\\", 90.00], [\\\"FIVE\\\", 55.00], [\\\"TEN\\\", 20.00], [\\\"TWENTY\\\", 60.00], [\\\"ONE HUNDRED\\\", 100.00]]), [[\\\"TWENTY\\\", 60.00], [\\\"TEN\\\", 20.00], [\\\"FIVE\\\", 15], [\\\"ONE\\\", 1], [\\\"QUARTER\\\", 0.50], [\\\"DIME\\\", 0.20], [\\\"PENNY\\\", 0.04]], 'message: <code>checkCashRegister(3.26, 100.00, [[\\\"PENNY\\\", 1.01], [\\\"NICKEL\\\", 2.05], [\\\"DIME\\\", 3.10], [\\\"QUARTER\\\", 4.25], [\\\"ONE\\\", 90.00], [\\\"FIVE\\\", 55.00], [\\\"TEN\\\", 20.00], [\\\"TWENTY\\\", 60.00], [\\\"ONE HUNDRED\\\", 100.00]])</code> 应该返回 <code>[[\\\"TWENTY\\\", 60.00], [\\\"TEN\\\", 20.00], [\\\"FIVE\\\", 15], [\\\"ONE\\\", 1], [\\\"QUARTER\\\", 0.50], [\\\"DIME\\\", 0.20], [\\\"PENNY\\\", 0.04]]</code>.');\",\n        \"assert.deepEqual(checkCashRegister(19.50, 20.00, [[\\\"PENNY\\\", 0.01], [\\\"NICKEL\\\", 0], [\\\"DIME\\\", 0], [\\\"QUARTER\\\", 0], [\\\"ONE\\\", 0], [\\\"FIVE\\\", 0], [\\\"TEN\\\", 0], [\\\"TWENTY\\\", 0], [\\\"ONE HUNDRED\\\", 0]]), \\\"Insufficient Funds\\\", 'message: <code>checkCashRegister(19.50, 20.00, [[\\\"PENNY\\\", 0.01], [\\\"NICKEL\\\", 0], [\\\"DIME\\\", 0], [\\\"QUARTER\\\", 0], [\\\"ONE\\\", 0], [\\\"FIVE\\\", 0], [\\\"TEN\\\", 0], [\\\"TWENTY\\\", 0], [\\\"ONE HUNDRED\\\", 0]])</code> 应该返回 \\\"Insufficient Funds\\\".');\",\n        \"assert.deepEqual(checkCashRegister(19.50, 20.00, [[\\\"PENNY\\\", 0.01], [\\\"NICKEL\\\", 0], [\\\"DIME\\\", 0], [\\\"QUARTER\\\", 0], [\\\"ONE\\\", 1.00], [\\\"FIVE\\\", 0], [\\\"TEN\\\", 0], [\\\"TWENTY\\\", 0], [\\\"ONE HUNDRED\\\", 0]]), \\\"Insufficient Funds\\\", 'message: <code>checkCashRegister(19.50, 20.00, [[\\\"PENNY\\\", 0.01], [\\\"NICKEL\\\", 0], [\\\"DIME\\\", 0], [\\\"QUARTER\\\", 0], [\\\"ONE\\\", 1.00], [\\\"FIVE\\\", 0], [\\\"TEN\\\", 0], [\\\"TWENTY\\\", 0], [\\\"ONE HUNDRED\\\", 0]])</code> 应该返回 \\\"Insufficient Funds\\\".');\",\n        \"assert.deepEqual(checkCashRegister(19.50, 20.00, [[\\\"PENNY\\\", 0.50], [\\\"NICKEL\\\", 0], [\\\"DIME\\\", 0], [\\\"QUARTER\\\", 0], [\\\"ONE\\\", 0], [\\\"FIVE\\\", 0], [\\\"TEN\\\", 0], [\\\"TWENTY\\\", 0], [\\\"ONE HUNDRED\\\", 0]]), \\\"Closed\\\", 'message: <code>checkCashRegister(19.50, 20.00, [[\\\"PENNY\\\", 0.50], [\\\"NICKEL\\\", 0], [\\\"DIME\\\", 0], [\\\"QUARTER\\\", 0], [\\\"ONE\\\", 0], [\\\"FIVE\\\", 0], [\\\"TEN\\\", 0], [\\\"TWENTY\\\", 0], [\\\"ONE HUNDRED\\\", 0]])</code> 应该返回 \\\"Closed\\\".');\"\n      ],\n      \"type\": \"bonfire\",\n      \"MDNlinks\": [\n        \"Global Object\"\n      ],\n      \"challengeType\": 5\n    },\n    {\n      \"id\": \"a56138aff60341a09ed6c480\",\n      \"title\": \"Inventory Update\",\n      \"description\": [\n        \"依照一个存着新进货物的二维数组，更新存着现有库存(在 <code>arr1</code> 中)的二维数组. 如果货物已存在则更新数量 . 如果没有对应货物则把其加入到数组中，更新最新的数量. 返回当前的库存数组，且按货物名称的字母顺序排列.\",\n        \"当你遇到困难的时候，记得查看错误提示、阅读文档、搜索、提问。\"\n      ],\n      \"challengeSeed\": [\n        \"function updateInventory(arr1, arr2) {\",\n        \"    // 请保证你的代码考虑到所有情况\",\n        \"    return arr1;\",\n        \"}\",\n        \"\",\n        \"// 仓库库存示例\",\n        \"var curInv = [\",\n        \"    [21, \\\"Bowling Ball\\\"],\",\n        \"    [2, \\\"Dirty Sock\\\"],\",\n        \"    [1, \\\"Hair Pin\\\"],\",\n        \"    [5, \\\"Microphone\\\"]\",\n        \"];\",\n        \"\",\n        \"var newInv = [\",\n        \"    [2, \\\"Hair Pin\\\"],\",\n        \"    [3, \\\"Half-Eaten Apple\\\"],\",\n        \"    [67, \\\"Bowling Ball\\\"],\",\n        \"    [7, \\\"Toothpaste\\\"]\",\n        \"];\",\n        \"\",\n        \"updateInventory(curInv, newInv);\"\n      ],\n      \"solutions\": [\n        \"function updateInventory(arr1, arr2) {\\n  arr2.forEach(function(item) {\\n    createOrUpdate(arr1, item);\\n  });\\n  // All inventory must be accounted for or you're fired!\\n  return arr1;\\n}\\n\\nfunction createOrUpdate(arr1, item) {\\n  var index = -1;\\n  while (++index < arr1.length) {\\n    if (arr1[index][1] === item[1]) {\\n      arr1[index][0] += item[0];\\n      return;\\n    }\\n    if (arr1[index][1] > item[1]) {\\n      break;\\n    }\\n  }\\n  arr1.splice(index, 0, item);\\n}\\n\\n// Example inventory lists\\nvar curInv = [\\n    [21, 'Bowling Ball'],\\n    [2, 'Dirty Sock'],\\n    [1, 'Hair Pin'],\\n    [5, 'Microphone']\\n];\\n\\nvar newInv = [\\n    [2, 'Hair Pin'],\\n    [3, 'Half-Eaten Apple'],\\n    [67, 'Bowling Ball'],\\n    [7, 'Toothpaste']\\n];\\n\\nupdateInventory(curInv, newInv);\\n\"\n      ],\n      \"tests\": [\n        \"assert.isArray(updateInventory([[21, \\\"Bowling Ball\\\"], [2, \\\"Dirty Sock\\\"], [1, \\\"Hair Pin\\\"], [5, \\\"Microphone\\\"]], [[2, \\\"Hair Pin\\\"], [3, \\\"Half-Eaten Apple\\\"], [67, \\\"Bowling Ball\\\"], [7, \\\"Toothpaste\\\"]]), 'message: <code>updateInventory()</code> 应该返回一个数组.');\",\n        \"assert.equal(updateInventory([[21, \\\"Bowling Ball\\\"], [2, \\\"Dirty Sock\\\"], [1, \\\"Hair Pin\\\"], [5, \\\"Microphone\\\"]], [[2, \\\"Hair Pin\\\"], [3, \\\"Half-Eaten Apple\\\"], [67, \\\"Bowling Ball\\\"], [7, \\\"Toothpaste\\\"]]).length, 6, 'message: <code>updateInventory([[21, \\\"Bowling Ball\\\"], [2, \\\"Dirty Sock\\\"], [1, \\\"Hair Pin\\\"], [5, \\\"Microphone\\\"]], [[2, \\\"Hair Pin\\\"], [3, \\\"Half-Eaten Apple\\\"], [67, \\\"Bowling Ball\\\"], [7, \\\"Toothpaste\\\"]]).length</code> 应该返回一个长度为6的数组.');\",\n        \"assert.deepEqual(updateInventory([[21, \\\"Bowling Ball\\\"], [2, \\\"Dirty Sock\\\"], [1, \\\"Hair Pin\\\"], [5, \\\"Microphone\\\"]], [[2, \\\"Hair Pin\\\"], [3, \\\"Half-Eaten Apple\\\"], [67, \\\"Bowling Ball\\\"], [7, \\\"Toothpaste\\\"]]), [[88, \\\"Bowling Ball\\\"], [2, \\\"Dirty Sock\\\"], [3, \\\"Hair Pin\\\"], [3, \\\"Half-Eaten Apple\\\"], [5, \\\"Microphone\\\"], [7, \\\"Toothpaste\\\"]], 'message: <code>updateInventory([[21, \\\"Bowling Ball\\\"], [2, \\\"Dirty Sock\\\"], [1, \\\"Hair Pin\\\"], [5, \\\"Microphone\\\"]], [[2, \\\"Hair Pin\\\"], [3, \\\"Half-Eaten Apple\\\"], [67, \\\"Bowling Ball\\\"], [7, \\\"Toothpaste\\\"]])</code> 应该返回 <code>[[88, \\\"Bowling Ball\\\"], [2, \\\"Dirty Sock\\\"], [3, \\\"Hair Pin\\\"], [3, \\\"Half-Eaten Apple\\\"], [5, \\\"Microphone\\\"], [7, \\\"Toothpaste\\\"]]</code>.');\",\n        \"assert.deepEqual(updateInventory([[21, \\\"Bowling Ball\\\"], [2, \\\"Dirty Sock\\\"], [1, \\\"Hair Pin\\\"], [5, \\\"Microphone\\\"]], []), [[21, \\\"Bowling Ball\\\"], [2, \\\"Dirty Sock\\\"], [1, \\\"Hair Pin\\\"], [5, \\\"Microphone\\\"]], 'message: <code>updateInventory([[21, \\\"Bowling Ball\\\"], [2, \\\"Dirty Sock\\\"], [1, \\\"Hair Pin\\\"], [5, \\\"Microphone\\\"]], [])</code> 应该返回 <code>[[21, \\\"Bowling Ball\\\"], [2, \\\"Dirty Sock\\\"], [1, \\\"Hair Pin\\\"], [5, \\\"Microphone\\\"]]</code>.');\",\n        \"assert.deepEqual(updateInventory([], [[2, \\\"Hair Pin\\\"], [3, \\\"Half-Eaten Apple\\\"], [67, \\\"Bowling Ball\\\"], [7, \\\"Toothpaste\\\"]]), [[67, \\\"Bowling Ball\\\"], [2, \\\"Hair Pin\\\"], [3, \\\"Half-Eaten Apple\\\"], [7, \\\"Toothpaste\\\"]], 'message: <code>updateInventory([], [[2, \\\"Hair Pin\\\"], [3, \\\"Half-Eaten Apple\\\"], [67, \\\"Bowling Ball\\\"], [7, \\\"Toothpaste\\\"]])</code> 应该返回 <code>[[67, \\\"Bowling Ball\\\"], [2, \\\"Hair Pin\\\"], [3, \\\"Half-Eaten Apple\\\"], [7, \\\"Toothpaste\\\"]]</code>.');\",\n        \"assert.deepEqual(updateInventory([[0, \\\"Bowling Ball\\\"], [0, \\\"Dirty Sock\\\"], [0, \\\"Hair Pin\\\"], [0, \\\"Microphone\\\"]], [[1, \\\"Hair Pin\\\"], [1, \\\"Half-Eaten Apple\\\"], [1, \\\"Bowling Ball\\\"], [1, \\\"Toothpaste\\\"]]), [[1, \\\"Bowling Ball\\\"], [0, \\\"Dirty Sock\\\"], [1, \\\"Hair Pin\\\"], [1, \\\"Half-Eaten Apple\\\"], [0, \\\"Microphone\\\"], [1, \\\"Toothpaste\\\"]], 'message: <code>updateInventory([[0, \\\"Bowling Ball\\\"], [0, \\\"Dirty Sock\\\"], [0, \\\"Hair Pin\\\"], [0, \\\"Microphone\\\"]], [[1, \\\"Hair Pin\\\"], [1, \\\"Half-Eaten Apple\\\"], [1, \\\"Bowling Ball\\\"], [1, \\\"Toothpaste\\\"]])</code> 应该返回 <code>[[1, \\\"Bowling Ball\\\"], [0, \\\"Dirty Sock\\\"], [1, \\\"Hair Pin\\\"], [1, \\\"Half-Eaten Apple\\\"], [0, \\\"Microphone\\\"], [1, \\\"Toothpaste\\\"]]</code>.');\"\n      ],\n      \"type\": \"bonfire\",\n      \"MDNlinks\": [\n        \"Global Array Object\"\n      ],\n      \"challengeType\": 5\n    },\n    {\n      \"id\": \"a7bf700cd123b9a54eef01d5\",\n      \"title\": \"No repeats please\",\n      \"description\": [\n        \"把一个字符串中的字符重新排列生成新的字符串，返回新生成的字符串里没有连续重复字符的字符串个数.连续重复只以单个字符为准\",\n        \"例如, <code>aab</code> 应该返回 2 因为它总共有 6 种排列 (<code>aab</code>, <code>aab</code>, <code>aba</code>, <code>aba</code>, <code>baa</code>, <code>baa</code>), 但是只有两个 (<code>aba</code> and <code>aba</code>)没有连续重复的字符 (在本例中是 <code>a</code>).\",\n        \"当你遇到困难的时候，记得查看错误提示、阅读文档、搜索、提问。\"\n      ],\n      \"challengeSeed\": [\n        \"function permAlone(str) {\",\n        \"  return str;\",\n        \"}\",\n        \"\",\n        \"permAlone('aab');\"\n      ],\n      \"solutions\": [\n        \"function permAlone(str) {\\n  return permutor(str).filter(function(perm) {\\n    return !perm.match(/(.)\\\\1/g);\\n  }).length;\\n}\\n\\nfunction permutor(str) {\\n  // http://staff.roguecc.edu/JMiller/JavaScript/permute.html\\n  //permArr: Global array which holds the list of permutations\\n  //usedChars: Global utility array which holds a list of \\\"currently-in-use\\\" characters\\n  var permArr = [], usedChars = [];\\n  function permute(input) {\\n    //convert input into a char array (one element for each character)\\n    var i, ch, chars = input.split(\\\"\\\");\\n    for (i = 0; i < chars.length; i++) {\\n      //get and remove character at index \\\"i\\\" from char array\\n      ch = chars.splice(i, 1);\\n      //add removed character to the end of used characters\\n      usedChars.push(ch);\\n      //when there are no more characters left in char array to add, add used chars to list of permutations\\n      if (chars.length === 0) permArr[permArr.length] = usedChars.join(\\\"\\\");\\n      //send characters (minus the removed one from above) from char array to be permuted\\n      permute(chars.join(\\\"\\\"));\\n      //add removed character back into char array in original position\\n      chars.splice(i, 0, ch);\\n      //remove the last character used off the end of used characters array\\n      usedChars.pop();\\n    }\\n  }\\n  permute(str);\\n  return permArr;\\n}\\n\\npermAlone('aab');\\n\"\n      ],\n      \"tests\": [\n        \"assert.isNumber(permAlone('aab'), 'message: <code>permAlone(\\\"aab\\\")</code> 应该返回一个数字.');\",\n        \"assert.strictEqual(permAlone('aab'), 2, 'message: <code>permAlone(\\\"aab\\\")</code> 应该返回 2.');\",\n        \"assert.strictEqual(permAlone('aaa'), 0, 'message: <code>permAlone(\\\"aaa\\\")</code> 应该返回 0.');\",\n        \"assert.strictEqual(permAlone('aabb'), 8, 'message: <code>permAlone(\\\"aabb\\\")</code> 应该返回 8.');\",\n        \"assert.strictEqual(permAlone('abcdefa'), 3600, 'message: <code>permAlone(\\\"abcdefa\\\")</code> 应该返回 3600.');\",\n        \"assert.strictEqual(permAlone('abfdefa'), 2640, 'message: <code>permAlone(\\\"abfdefa\\\")</code> 应该返回 2640.');\",\n        \"assert.strictEqual(permAlone('zzzzzzzz'), 0, 'message: <code>permAlone(\\\"zzzzzzzz\\\")</code> 应该返回 0.');\"\n      ],\n      \"type\": \"bonfire\",\n      \"MDNlinks\": [\n        \"Permutations\",\n        \"RegExp\"\n      ],\n      \"challengeType\": 5\n    },\n    {\n      \"id\": \"a19f0fbe1872186acd434d5a\",\n      \"title\": \"Friendly Date Ranges\",\n      \"description\": [\n        \"<strong>让日期区间更友好！</strong>\",\n        \"把常见的日期格式如：<code>YYYY-MM-DD</code> 转换成一种更易读的格式。\",\n        \"易读格式应该是用月份名称代替月份数字，用序数词代替数字来表示天 (<code>1st</code> 代替 <code>1</code>).\",\n        \"记住不要显示那些可以被推测出来的信息: 如果一个日期区间里结束日期与开始日期相差小于一年，则结束日期就不用写年份了；在这种情况下，如果月份开始和结束日期如果在同一个月，则结束日期月份也不用写了。\",\n        \"另外, 如果开始日期年份是当前年份，且结束日期与开始日期小于一年，则开始日期的年份也不用写。\",\n        \"例如:\",\n        \"包含当前年份和相同月份的时候，<code>makeFriendlyDates([\\\"2017-01-02\\\", \\\"2017-01-05\\\"])</code> 应该返回 <code>[\\\"January 2nd\\\",\\\"5th\\\"]</code>\",\n        \"不包含当前年份，<code>makeFriendlyDates([\\\"2003-08-15\\\", \\\"2009-09-21\\\"])</code> 应该返回 <code>[\\\"August 15th, 2003\\\", \\\"September 21st, 2009\\\"]</code>。\",\n        \"请考虑清楚所有可能出现的情况，包括传入的日期区间是否合理。对于不合理的日期区间，直接返回 <code>undefined</code> 即可\",\n        \"当你遇到困难的时候，记得查看错误提示、阅读文档、搜索、提问。\"\n      ],\n      \"challengeSeed\": [\n        \"function makeFriendlyDates(arr) {\",\n        \"  return arr;\",\n        \"}\",\n        \"\",\n        \"makeFriendlyDates(['2017-01-02', '2017-01-05']);\"\n      ],\n      \"solutions\": [\n        \"function makeFriendlyDates(arr) {\\n    if (getDiff('unixTime', parseDateString(arr[0]), parseDateString(arr[1])) < 0) {\\n        return;\\n    }\\n    var current = new Date();\\n    var currentYear = current.getFullYear();\\n    var monthArr = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'];\\n    function ordinalDay(day){\\n        if (day !== 11 && day.toString().slice(-1) === '1') {\\n            return day + 'st';\\n        } else if (day !== 12 && day.toString().slice(-1) === '2') {\\n            return day + 'nd';\\n        } else if (day !== 13 && day.toString().slice(-1) === '3') {\\n            return day + 'rd';\\n        }\\n        return day + 'th';\\n    }\\n    function getDiff(attr, firstDate, secondDate) {\\n        var attrMap = {\\n            year: 'getFullYear',\\n            month: 'getMonth',\\n            date: 'getDate',\\n            unixTime: 'getTime'\\n        }\\n        return secondDate[attrMap[attr]]() - firstDate[attrMap[attr]]();\\n    }\\n    function parseDateString(dateStr) {\\n        var dateArr = dateStr.split('-');\\n        return new Date(dateArr[0], dateArr[1] - 1, dateArr[2]);\\n    }\\n    function composeOutput(dateObj) {\\n        var output = '';\\n        if (dateObj.month) {\\n            output += dateObj.month;\\n        }\\n        if (dateObj.date) {\\n            output += (output ? ' ' : '') + dateObj.date;\\n        }\\n        if (dateObj.year) {\\n            output += ', ' + dateObj.year;\\n        }\\n        return output ? [output] : undefined;\\n    }\\n    function transformDate(dateString) {\\n        var date = parseDateString(dateString);\\n        return {\\n            month: monthArr[date.getMonth()],\\n            date: ordinalDay(date.getDate()),\\n            year: date.getFullYear()\\n        }\\n    }\\n    function getResult(firstDate, secondDate) {\\n        var parsedFirst = parseDateString(firstDate);\\n        var parsedSecond = parseDateString(secondDate);\\n        var firstObject = transformDate(firstDate);\\n        var secondObject = transformDate(secondDate);\\n        if (firstObject.year === currentYear) {\\n            firstObject.year = false;\\n        }\\n        if (getDiff('year', parsedFirst, parsedSecond) === 0) {\\n            secondObject.year = false;\\n            if (getDiff('month', parsedFirst, parsedSecond) === 0) {\\n                secondObject.month = false;\\n            }\\n            if (getDiff('date', parsedFirst, parsedSecond) === 0) {\\n                secondObject.date = false;\\n            }\\n        } else if (getDiff('year', parsedFirst, parsedSecond) === 1) {\\n            if (getDiff('unixTime', parsedFirst, parsedSecond) / (1000 * 3600 * 24) < 365) {\\n                secondObject.year = false;\\n            }\\n        }\\n        return [].concat.apply(composeOutput(firstObject), composeOutput(secondObject))\\n    }\\n    return getResult(arr[0], arr[1])\\n}\"\n      ],\n      \"tests\": [\n        \"assert.deepEqual(makeFriendlyDates(['2017-01-02', '2017-01-05']), ['January 2nd', '5th'], 'message: <code>makeFriendlyDates([\\\"2017-01-02\\\", \\\"2017-01-05\\\"])</code> 应该返回 <code>[\\\"January 2nd\\\",\\\"5th\\\"]</code>.');\",\n        \"assert.deepEqual(makeFriendlyDates(['2017-02-01', '2017-03-03']), ['February 1st', 'March 3rd'], 'message: <code>makeFriendlyDates([\\\"2017-02-01\\\", \\\"2017-03-03\\\"])</code> 应该返回 <code>[\\\"February 1st\\\",\\\"March 3rd\\\"]</code>.');\",\n        \"assert.deepEqual(makeFriendlyDates(['2016-05-11', '2017-04-04']), ['May 11th, 2016', 'April 4th'], 'message: <code>makeFriendlyDates([\\\"2016-05-11\\\", \\\"2017-04-04\\\"])</code> 应该返回 <code>[\\\"May 11th, 2016\\\",\\\"April 4th\\\"]</code>.');\",\n        \"assert.deepEqual(makeFriendlyDates(['2017-07-12', '2018-06-13']), ['July 12th', 'June 13th'], 'message: <code>makeFriendlyDates([\\\"2017-07-12\\\", \\\"2018-06-13\\\"])</code> 应该返回 <code>[\\\"July 12th\\\",\\\"June 13th\\\"]</code>');\",\n        \"assert.deepEqual(makeFriendlyDates(['2003-08-15', '2009-09-21']), ['August 15th, 2003', 'September 21st, 2009'], 'message: <code>makeFriendlyDates([\\\"2003-08-15\\\", \\\"2009-09-21\\\"])</code> 应该返回 <code>[\\\"August 15th, 2003\\\", \\\"September 21st, 2009\\\"]</code>.');\",\n        \"assert.deepEqual(makeFriendlyDates(['2010-10-23', '2011-10-22']), ['October 23rd, 2010', 'October 22nd'], 'message: <code>makeFriendlyDates([\\\"2010-10-23\\\", \\\"2011-10-22\\\"])</code> 应该返回 <code>[\\\"October 23rd, 2010\\\",\\\"October 22nd\\\"]</code>.');\",\n        \"assert.deepEqual(makeFriendlyDates(['2008-10-31', '2009-10-31']), ['October 31st, 2008', 'October 31st, 2009'], 'message: <code>makeFriendlyDates([\\\"2008-10-31\\\", \\\"2009-10-31\\\"])</code> 应该返回 <code>[\\\"October 31st, 2008\\\",\\\"October 31st, 2009\\\"]</code>.');\",\n        \"assert.deepEqual(makeFriendlyDates(['2004-11-17', '2005-12-25']), ['November 17th, 2004', 'December 25th, 2005'], 'message: <code>makeFriendlyDates([\\\"2004-11-17\\\", \\\"2005-12-25\\\"])</code> 应该返回 <code>[\\\"November 17th, 2004\\\",\\\"December 25th, 2005\\\"]</code>.');\",\n        \"assert.deepEqual(makeFriendlyDates(['2001-12-20', '2001-12-20']), ['December 20th, 2001'], 'message: <code>makeFriendlyDates([\\\"2001-12-20\\\", \\\"2001-12-20\\\"])</code> 应该返回 <code>[\\\"December 20th, 2001\\\"]</code>.');\",\n        \"assert.isUndefined(makeFriendlyDates(['2002-12-20', '2001-12-20']), 'message: <code>makeFriendlyDates([\\\"2002-12-20\\\", \\\"2001-12-20\\\"])</code> 应该返回 <code>undefined</code>');\"\n      ],\n      \"type\": \"bonfire\",\n      \"MDNlinks\": [\n        \"String.split()\",\n        \"String.substr()\",\n        \"parseInt()\"\n      ],\n      \"challengeType\": 5\n    },\n    {\n      \"id\": \"a2f1d72d9b908d0bd72bb9f6\",\n      \"title\": \"Make a Person\",\n      \"description\": [\n        \"用下面给定的方法构造一个对象.\",\n        \"方法有 getFirstName(), getLastName(), getFullName(), setFirstName(first), setLastName(last), and setFullName(firstAndLast).\",\n        \"所有有参数的方法只接受一个字符串参数.\",\n        \"所有的方法只与实体对象交互.\",\n        \"当你遇到困难的时候，记得查看错误提示、阅读文档、搜索、提问。\"\n      ],\n      \"challengeSeed\": [\n        \"var Person = function(firstAndLast) {\",\n        \"    return firstAndLast;\",\n        \"};\",\n        \"\",\n        \"var bob = new Person('Bob Ross');\",\n        \"bob.getFullName();\"\n      ],\n      \"solutions\": [\n        \"var Person = function(firstAndLast) {\\n\\n  var firstName, lastName;\\n\\n  function updateName(str) {    \\n    firstName = str.split(\\\" \\\")[0];\\n    lastName = str.split(\\\" \\\")[1];    \\n  }\\n\\n  updateName(firstAndLast);\\n\\n  this.getFirstName = function(){\\n    return firstName;\\n  };\\n  \\n  this.getLastName = function(){\\n    return lastName;\\n  };\\n  \\n  this.getFullName = function(){\\n    return firstName + \\\" \\\" + lastName;\\n  };\\n  \\n  this.setFirstName = function(str){\\n    firstName = str;\\n  };\\n  \\n\\n  this.setLastName = function(str){\\n    lastName = str;\\n  };\\n  \\n  this.setFullName = function(str){\\n    updateName(str);\\n  };\\n};\\n\\nvar bob = new Person('Bob Ross');\\nbob.getFullName();\"\n      ],\n      \"tests\": [\n        \"assert.deepEqual(Object.keys(bob).length, 6, 'message: <code>Object.keys(bob).length</code> 应该返回 6.');\",\n        \"assert.deepEqual(bob instanceof Person, true, 'message: <code>bob instanceof Person</code> 应该返回 true.');\",\n        \"assert.deepEqual(bob.firstName, undefined, 'message: <code>bob.firstName</code> 应该返回 undefined.');\",\n        \"assert.deepEqual(bob.lastName, undefined, 'message: <code>bob.lastName</code> 应该返回 undefined.');\",\n        \"assert.deepEqual(bob.getFirstName(), 'Bob', 'message: <code>bob.getFirstName()</code> 应该返回 \\\"Bob\\\".');\",\n        \"assert.deepEqual(bob.getLastName(), 'Ross', 'message: <code>bob.getLastName()</code> 应该返回 \\\"Ross\\\".');\",\n        \"assert.deepEqual(bob.getFullName(), 'Bob Ross', 'message: <code>bob.getFullName()</code> 应该返回 \\\"Bob Ross\\\".');\",\n        \"assert.strictEqual((function () { bob.setFirstName(\\\"Haskell\\\"); return bob.getFullName(); })(), 'Haskell Ross', 'message: <code>bob.getFullName()</code> 应该返回 \\\"Haskell Ross\\\" after <code>bob.setFirstName(\\\"Haskell\\\")</code>.');\",\n        \"assert.strictEqual((function () { var _bob=new Person('Haskell Ross'); _bob.setLastName(\\\"Curry\\\"); return _bob.getFullName(); })(), 'Haskell Curry', 'message: <code>bob.getFullName()</code> 应该返回 \\\"Haskell Curry\\\" after <code>bob.setLastName(\\\"Curry\\\")</code>.');\",\n        \"assert.strictEqual((function () { bob.setFullName(\\\"Haskell Curry\\\"); return bob.getFullName(); })(), 'Haskell Curry', 'message: <code>bob.getFullName()</code> 应该返回 \\\"Haskell Curry\\\" 在 <code>bob.setFullName(\\\"Haskell Curry\\\")</code> 之后.');\",\n        \"assert.strictEqual((function () { bob.setFullName(\\\"Haskell Curry\\\"); return bob.getFirstName(); })(), 'Haskell', 'message: <code>bob.getFirstName()</code> 应该返回 \\\"Haskell\\\" 在 <code>bob.setFullName(\\\"Haskell Curry\\\")</code> 之后.');\",\n        \"assert.strictEqual((function () { bob.setFullName(\\\"Haskell Curry\\\"); return bob.getLastName(); })(), 'Curry', 'message: <code>bob.getLastName()</code> 应该返回 \\\"Curry\\\" 在 <code>bob.setFullName(\\\"Haskell Curry\\\")</code> 之后.');\"\n      ],\n      \"type\": \"bonfire\",\n      \"MDNlinks\": [\n        \"Closures\",\n        \"Details of the Object Model\"\n      ],\n      \"challengeType\": 5\n    },\n    {\n      \"id\": \"af4afb223120f7348cdfc9fd\",\n      \"title\": \"Map the Debris\",\n      \"description\": [\n        \"返回一个数组，其内容是把原数组中对应元素的平均海拔转换成其对应的轨道周期.\",\n        \"原数组中会包含格式化的对象内容，像这样 <code>{name: 'name', avgAlt: avgAlt}</code>.\",\n        \"至于轨道周期怎么求，戳这里 <a href=\\\"http://en.wikipedia.org/wiki/Orbital_period\\\" target='_blank'>on wikipedia</a> (不想看英文的话可以自行搜索以轨道高度计算轨道周期的公式).\",\n        \"求得的值应该是一个与其最接近的整数，轨道是以地球为基准的.\",\n        \"地球半径是 6367.4447 kilometers, 地球的GM值是 398600.4418, 圆周率为Math.PI\",\n        \"当你遇到困难的时候，记得查看错误提示、阅读文档、搜索、提问。\"\n      ],\n      \"challengeSeed\": [\n        \"function orbitalPeriod(arr) {\",\n        \"  var GM = 398600.4418;\",\n        \"  var earthRadius = 6367.4447;\",\n        \"  return arr;\",\n        \"}\",\n        \"\",\n        \"orbitalPeriod([{name : \\\"sputnik\\\", avgAlt : 35873.5553}]);\"\n      ],\n      \"solutions\": [\n        \"function orbitalPeriod(arr) {\\n  var GM = 398600.4418;\\n  var earthRadius = 6367.4447;\\n  var TAU = 2 * Math.PI; \\n  return arr.map(function(obj) {\\n    return {\\n      name: obj.name,\\n      orbitalPeriod: Math.round(TAU * Math.sqrt(Math.pow(obj.avgAlt+earthRadius, 3)/GM))\\n    };\\n  });\\n}\\n\\norbitalPeriod([{name : \\\"sputkin\\\", avgAlt : 35873.5553}]);\\n\"\n      ],\n      \"tests\": [\n        \"assert.deepEqual(orbitalPeriod([{name : \\\"sputnik\\\", avgAlt : 35873.5553}]), [{name: \\\"sputnik\\\", orbitalPeriod: 86400}], 'message: <code>orbitalPeriod([{name : \\\"sputnik\\\", avgAlt : 35873.5553}])</code> 应该返回 <code>[{name: \\\"sputnik\\\", orbitalPeriod: 86400}]</code>.');\",\n        \"assert.deepEqual(orbitalPeriod([{name: \\\"iss\\\", avgAlt: 413.6}, {name: \\\"hubble\\\", avgAlt: 556.7}, {name: \\\"moon\\\", avgAlt: 378632.553}]), [{name : \\\"iss\\\", orbitalPeriod: 5557}, {name: \\\"hubble\\\", orbitalPeriod: 5734}, {name: \\\"moon\\\", orbitalPeriod: 2377399}], 'message: <code>orbitalPeriod([{name: \\\"iss\\\", avgAlt: 413.6}, {name: \\\"hubble\\\", avgAlt: 556.7}, {name: \\\"moon\\\", avgAlt: 378632.553}])</code> 应该返回 <code>[{name : \\\"iss\\\", orbitalPeriod: 5557}, {name: \\\"hubble\\\", orbitalPeriod: 5734}, {name: \\\"moon\\\", orbitalPeriod: 2377399}]</code>.');\"\n      ],\n      \"type\": \"bonfire\",\n      \"MDNlinks\": [\n        \"Math.pow()\"\n      ],\n      \"challengeType\": 5\n    },\n    {\n      \"id\": \"a3f503de51cfab748ff001aa\",\n      \"title\": \"Pairwise\",\n      \"description\": [\n        \"<strong>找到你的另一半</strong>\",\n        \"都说优秀的程序员擅长面向对象编程，但却经常找不到另一半，这是为什么呢？因为你总是把自己局限成为一个程序员，没有打开自己的思维。\",\n        \"这是一个社群的时代啊，在这里你应该找到与你有相同价值观但又互补的另一半。\",\n        \"譬如：你编程能力强，估值11分，如果以20分为最佳情侣来计算，你应该找一个设计能力强，估值为9分的女生。\",\n        \"那么当你遇到一个设计能力为9分的女生，千万别犹豫，大胆去表白。千万别以为后面的瓜比前面的甜哦。\",\n        \"举个例子：有一个能力数组<code>[7,9,11,13,15]</code>，按照最佳组合值为20来计算，只有7+13和9+11两种组合。而7在数组的索引为0，13在数组的索引为3，9在数组的索引为1，11在数组的索引为2。\",\n        \"所以我们说函数：<code>pairwise([7,9,11,13,15],20)</code> 的返回值应该是0+3+1+2的和，即6。\",\n        \"我们可以通过表格来更直观地查看数组中索引和值的关系：\",\n        \"<table class=\\\"table\\\"><tr><th><b>Index</b></th><th>0</th><th>1</th><th>2</th><th>3</th><th>4</th></tr><tr><td>Value</td><td>7</td><td>9</td><td>11</td><td>13</td><td>15</td></tr></table>\",\n        \"任务：帮右边的pairwise函数实现上面的功能。\",\n        \"当你遇到困难的时候，记得开大招'Read-Search-Ask'。\"\n      ],\n      \"challengeSeed\": [\n        \"function pairwise(arr, arg) {\",\n        \"  return arg;\",\n        \"}\",\n        \"\",\n        \"pairwise([1,4,2,3,0,5], 7);\"\n      ],\n      \"solutions\": [\n        \"function pairwise(arr, arg) {\\n  var sum = 0;\\n  arr.forEach(function(e, i, a) {\\n    if (e != null) {      \\n      var diff = arg-e;\\n      a[i] = null;\\n      var dix = a.indexOf(diff);\\n      if (dix !== -1) {\\n        sum += dix;\\n        sum += i;\\n        a[dix] = null;\\n      }  \\n    }\\n  });\\n  return sum;\\n}\\n\\npairwise([1,4,2,3,0,5], 7);\\n\"\n      ],\n      \"tests\": [\n        \"assert.deepEqual(pairwise([1, 4, 2, 3, 0, 5], 7), 11, 'message: <code>pairwise([1, 4, 2, 3, 0, 5], 7)</code> 应该返回 11.');\",\n        \"assert.deepEqual(pairwise([1, 3, 2, 4], 4), 1, 'message: <code>pairwise([1, 3, 2, 4], 4)</code> 应该返回 1.');\",\n        \"assert.deepEqual(pairwise([1, 1, 1], 2), 1, 'message: <code>pairwise([1, 1, 1], 2)</code> 应该返回 1.');\",\n        \"assert.deepEqual(pairwise([0, 0, 0, 0, 1, 1], 1), 10, 'message: <code>pairwise([0, 0, 0, 0, 1, 1], 1)</code> 应该返回 10.');\",\n        \"assert.deepEqual(pairwise([], 100), 0, 'message: <code>pairwise([], 100)</code> 应该返回 0.');\"\n      ],\n      \"type\": \"bonfire\",\n      \"MDNlinks\": [\n        \"Array.reduce()\"\n      ],\n      \"challengeType\": 5\n    }\n  ]\n}\n"
  },
  {
    "path": "seed/challenges/01-front-end-development-certification/advanced-ziplines.json",
    "content": "{\n  \"name\": \"Advanced Front End Development Projects\",\n  \"order\": 12.5,\n  \"time\": \"150 hours\",\n  \"helpRoom\": \"chinese\",\n  \"challenges\": [\n    {\n      \"id\": \"bd7158d8c442eddfaeb5bd17\",\n      \"title\": \"Build a JavaScript Calculator\",\n      \"description\": [\n        \"<strong>目标:</strong> 在 <a href='http://codepen.io' target='_blank'>CodePen.io</a> 上做一个类似于 <a href='http://codepen.io/FreeCodeCamp/full/zrRzMR' target='_blank'>http://codepen.io/FreeCodeCamp/full/zrRzMR</a> 的 APP.\",\n        \"<strong>规则 #1:</strong> 代码是开源的，你可以借鉴，但请不要抄袭。\",\n        \"<strong>规则 #2:</strong> 可以使用你喜爱的任何库来定制属于你自己的风格，实现下面的功能.\",\n        \"<strong>功能:</strong> 可以对两个数字进行加、减、乘、除的运算.\",\n        \"<strong>功能:</strong> 可以使用清除按钮清空当前的所有输入内容.\",\n        \"<strong>功能:</strong> 可以把多个运算连接起来操作, 直到按下等号键, 计算器输出正确的运算结果.\",\n        \"遇到问题记得 <a href='//github.com/FreeCodeCamp/freecodecamp/wiki/How-to-get-help-when-you-get-stuck' target='_blank'>Read-Search-Ask</a>.\",\n        \"当你完成这个挑战, 点击 \\\"我已经完成了这个挑战\\\" 并提交你的 CodePen 链接. \",\n        \"你可以分享这个项目给 <a href='mailto:jin@freecodecamp.cn' target='_blank'>JackJin</a> 或 <a href='https://gitter.im/freecodecamp/chinese' target='_blank'>聊天室</a> 来获得反馈。\"\n      ],\n      \"challengeSeed\": [\n        \"126411565\"\n      ],\n      \"tests\": [],\n      \"type\": \"zipline\",\n      \"challengeType\": 3,\n      \"isRequired\": true\n    },\n    {\n      \"id\": \"bd7158d8c442eddfaeb5bd0f\",\n      \"title\": \"Build a Pomodoro Clock\",\n      \"description\": [\n        \"<strong>目标:</strong> 在 <a href='http://codepen.io' target='_blank'>CodePen.io</a> 上做一个类似于 <a href='http://codepen.io/FreeCodeCamp/full/VemPZX' target='_blank'>http://codepen.io/FreeCodeCamp/full/VemPZX</a> 的 APP.\",\n        \"<strong>规则 #1:</strong> 代码是开源的，你可以借鉴，但请不要抄袭。\",\n        \"<strong>规则 #2:</strong> 可以使用你喜爱的任何库来定制属于你自己的风格，实现下面的功能.\",\n        \"<strong>功能:</strong> 可以启动一个 25 分钟的番茄钟, 计时器将在 25 分钟后停止.\",\n        \"<strong>功能:</strong> 可以重置番茄钟的状态以便启动下一次计时.\",\n        \"<strong>功能:</strong> 可以为每个番茄钟自定义时长.\",\n        \"遇到问题记得 <a href='//github.com/FreeCodeCamp/freecodecamp/wiki/How-to-get-help-when-you-get-stuck' target='_blank'>Read-Search-Ask</a>.\",\n        \"当你完成这个挑战, 点击 \\\"我已经完成了这个挑战\\\" 并提交你的 CodePen 链接. \",\n        \"你可以分享这个项目给 <a href='mailto:jin@freecodecamp.cn' target='_blank'>JackJin</a> 或 <a href='https://gitter.im/freecodecamp/chinese' target='_blank'>聊天室</a> 来获得反馈。\"\n      ],\n      \"challengeSeed\": [\n        \"126411567\"\n      ],\n      \"tests\": [],\n      \"type\": \"zipline\",\n      \"isRequired\": true,\n      \"challengeType\": 3\n    },\n    {\n      \"id\": \"bd7158d8c442eedfaeb5bd1c\",\n      \"title\": \"Build a Tic Tac Toe Game\",\n      \"description\": [\n        \"<strong>目标:</strong> 在 <a href='http://codepen.io' target='_blank'>CodePen.io</a> 上创建一个类似于 <a href='http://codepen.io/FreeCodeCamp/full/adBpvw' target='_blank'>http://codepen.io/FreeCodeCamp/full/adBpvw</a> 的 APP.\",\n        \"<strong>规则 #1:</strong> 代码是开源的，你可以借鉴，但请不要抄袭。\",\n        \"<strong>规则 #2:</strong> 可以使用你喜爱的任何库来定制属于你自己的风格，实现下面的功能.\",\n        \"<strong>功能:</strong> 可以和计算机对手进行 井字游戏.\",\n        \"<strong>功能:</strong> 游戏会在结束时重置并立即开始新的一局.\",\n        \"<strong>功能:</strong> 可以自己选择自己的角色是 X 还是 O.\",\n        \"遇到问题记得 <a href='//github.com/FreeCodeCamp/freecodecamp/wiki/How-to-get-help-when-you-get-stuck' target='_blank'>Read-Search-Ask</a>.\",\n        \"当你完成这个挑战, 点击 \\\"我已经完成了这个挑战\\\" 并提交你的 CodePen 链接. \",\n        \"你可以分享这个项目给 <a href='mailto:jin@freecodecamp.cn' target='_blank'>JackJin</a> 或 <a href='https://gitter.im/freecodecamp/chinese' target='_blank'>聊天室</a> 来获得反馈。\"\n      ],\n      \"challengeSeed\": [\n        \"126415123\"\n      ],\n      \"tests\": [],\n      \"type\": \"zipline\",\n      \"challengeType\": 3,\n      \"isRequired\": true\n    },\n    {\n      \"id\": \"bd7158d8c442eddfaeb5bd1c\",\n      \"title\": \"Build a Simon Game\",\n      \"description\": [\n        \"<strong>目标:</strong> 在 <a href='http://codepen.io' target='_blank'>CodePen.io</a> 上创建一个类似于 <a href='http://codepen.io/Em-Ant/full/QbRyqq/' target='_blank'>http://codepen.io/FreeCodeCamp/full/obYBjE</a> 的小游戏.\",\n        \"<strong>规则 #1:</strong> 代码是开源的，你可以借鉴，但请不要抄袭。\",\n        \"<strong>规则 #2:</strong> 可以使用你喜爱的任何库来定制属于你自己的风格，实现下面的功能.\",\n        \"<strong>功能:</strong> 色块亮起的顺序是随机的.\",\n        \"<strong>功能:</strong> 每次以正确的顺序点击色块后, 色块需要以原来的顺序依次亮起, 并增加一个新的序列.\",\n        \"<strong>功能:</strong> 当色块自动按顺序亮起时, 以及用户点击色块时, 需要能够发出声音.\",\n        \"<strong>功能:</strong> 当用户点错时, 要以不同的声音提示用户, 色块需要能以原来的顺序亮起并让用户重试.\",\n        \"<strong>功能:</strong> 可以看到当前游戏中点对的色块序列的数量.\",\n        \"<strong>功能:</strong> 可以通过点击一个按钮重新开始游戏, 并且游戏会重新从一个序列开始.\",\n        \"<strong>功能:</strong> 可以在严格模式下游戏, 即严格模式下一旦输错任意一个序列都必须从头开始\",\n        \"<strong>功能:</strong> 在输入正确 20 个序列时获胜。将会提示胜利, 并结束游戏\",\n        \"<strong>提示:</strong> 这里有一些可能会用到的按键音的 mp3 文件地址 <code>/images/simonSound1.mp3</code>, <code>/images/simonSound2.mp3</code>, <code>/images/simonSound3.mp3</code>, <code>/images/simonSound4.mp3</code>.\",\n        \"遇到问题记得 <a href='//github.com/FreeCodeCamp/freecodecamp/wiki/How-to-get-help-when-you-get-stuck' target='_blank'>Read-Search-Ask</a>.\",\n        \"当你完成这个挑战, 点击 \\\"我已经完成了这个挑战\\\" 并提交你的 CodePen 链接. \",\n        \"你可以分享这个项目给 <a href='mailto:jin@freecodecamp.cn' target='_blank'>JackJin</a> 或 <a href='https://gitter.im/freecodecamp/chinese' target='_blank'>聊天室</a> 来获得反馈。\"\n      ],\n      \"challengeSeed\": [\n        \"137213633\"\n      ],\n      \"tests\": [],\n      \"type\": \"zipline\",\n      \"challengeType\": 3,\n      \"isRequired\": true\n    }\n  ]\n}\n"
  },
  {
    "path": "seed/challenges/01-front-end-development-certification/basic-bonfires.json",
    "content": "{\n  \"name\": \"Basic Algorithm Scripting\",\n  \"order\": 8,\n  \"time\": \"50 hours\",\n  \"helpRoom\": \"chinese\",\n  \"challenges\": [\n    {\n      \"id\": \"bd7158d2c442eddfbeb5bd1f\",\n      \"title\": \"Get Set for our Algorithm Challenges\",\n      \"description\": [\n        [\n          \"//i.imgur.com/sJkp30a.png\",\n          \"An image of a algorithm challenge showing directions, tests, and the code editor.\",\n          \"我们的算法挑战教你用程序员的思维去思考问题。\",\n          \"\"\n        ],\n        [\n          \"//i.imgur.com/d8LuRNh.png\",\n          \"A mother bird kicks a baby bird out of her nest.\",\n          \"之前的挑战向你介绍了编程的概念。接下来的挑战，你将会用你学到的东西来解决开放性的问题。\",\n          \"\"\n        ],\n        [\n          \"//i.imgur.com/WBetuBa.jpg\",\n          \"A programmer punching through his laptop screen in frustration.\",\n          \"算法挑战有点难度，有些挑战可能需要你花上几个小时来完成。你也许会沮丧，但是千万别放弃！\",\n          \"\"\n        ],\n        [\n          \"//i.imgur.com/p2TpOQd.jpg\",\n          \"A cute dog jumping over a hurdle and winking and pointing his paw at you.\",\n          \"当你完成不了挑战的时候，记得开大招'Read-Search-Ask'。<br>别担心，没啥难的。\",\n          \"\"\n        ]\n      ],\n      \"challengeSeed\": [],\n      \"tests\": [],\n      \"type\": \"Waypoint\",\n      \"challengeType\": 7,\n      \"isRequired\": false\n    },\n    {\n      \"id\": \"a202eed8fc186c8434cb6d61\",\n      \"title\": \"Reverse a String\",\n      \"description\": [\n        \"翻转字符串\",\n        \"先把字符串转化成数组，再借助数组的reverse方法翻转数组顺序，最后把数组转化成字符串。\",\n        \"你的结果必须得是一个字符串\",\n        \"当你完成不了挑战的时候，记得开大招'Read-Search-Ask'。\"\n      ],\n      \"challengeSeed\": [\n        \"function reverseString(str) {\",\n        \"  // 请把你的代码写在这里\",\n        \"  return str;\",\n        \"}\",\n        \"\",\n        \"reverseString(\\\"hello\\\");\"\n      ],\n      \"tests\": [\n        \"assert(typeof reverseString(\\\"hello\\\") === \\\"string\\\", 'message: <code>reverseString(\\\"hello\\\")</code> 应该返回一个字符串');\",\n        \"assert(reverseString(\\\"hello\\\") === \\\"olleh\\\", 'message: <code>reverseString(\\\"hello\\\")</code> 应该返回 <code>\\\"olleh\\\"</code>.');\",\n        \"assert(reverseString(\\\"Howdy\\\") === \\\"ydwoH\\\", 'message: <code>reverseString(\\\"Howdy\\\")</code> 应该返回 <code>\\\"ydwoH\\\"</code>.');\",\n        \"assert(reverseString(\\\"Greetings from Earth\\\") === \\\"htraE morf sgniteerG\\\", 'message: <code>reverseString(\\\"Greetings from Earth\\\")</code> 应该返回 <code>\\\"htraE morf sgniteerG\\\"</code>.');\"\n      ],\n      \"type\": \"bonfire\",\n      \"isRequired\": true,\n      \"solutions\": [\n        \"function reverseString(str) {\\n  return str.split('').reverse().join(\\\"\\\");\\n}\\n\\nreverseString('hello');\\n\"\n      ],\n      \"MDNlinks\": [\n        \"Global String Object\",\n        \"String.split()\",\n        \"Array.reverse()\",\n        \"Array.join()\"\n      ],\n      \"challengeType\": 5\n    },\n    {\n      \"id\": \"a302f7aae1aa3152a5b413bc\",\n      \"title\": \"Factorialize a Number\",\n      \"description\": [\n        \"计算一个整数的阶乘\",\n        \"如果用字母n来代表一个整数，阶乘代表着所有小于或等于n的整数的乘积。\",\n        \"阶乘通常简写成 <code>n!</code>\",\n        \"例如: <code>5! = 1 * 2 * 3 * 4 * 5 = 120</code>\",\n        \"当你完成不了挑战的时候，记得开大招'Read-Search-Ask'。\"\n      ],\n      \"challengeSeed\": [\n        \"function factorialize(num) {\",\n        \"  // 请把你的代码写在这里\",\n        \"  return num;\",\n        \"}\",\n        \"\",\n        \"factorialize(5);\"\n      ],\n      \"tests\": [\n        \"assert(typeof factorialize(5) === 'number', 'message: <code>factorialize(5)</code> 应该返回一个数字');\",\n        \"assert(factorialize(5) === 120, 'message: <code>factorialize(5)</code> 应该返回 120.');\",\n        \"assert(factorialize(10) === 3628800, 'message: <code>factorialize(10)</code> 应该返回 3628800.');\",\n        \"assert(factorialize(20) === 2432902008176640000, 'message: <code>factorialize(20)</code> 应该返回 2432902008176640000.');\",\n        \"assert(factorialize(0) === 1, 'message: <code>factorialize(0)</code> 应该返回 1.');\"\n      ],\n      \"type\": \"bonfire\",\n      \"isRequired\": true,\n      \"solutions\": [\n        \"function factorialize(num) {\\n  return num < 1 ? 1 : num * factorialize(num-1);\\n}\\n\\nfactorialize(5);\\n\"\n      ],\n      \"MDNlinks\": [\n        \"Arithmetic Operators\"\n      ],\n      \"challengeType\": 5\n    },\n    {\n      \"id\": \"aaa48de84e1ecc7c742e1124\",\n      \"title\": \"Check for Palindromes\",\n      \"description\": [\n        \"检查回文字符串\",\n        \"如果给定的字符串是回文，返回<code>true</code>，反之，返回<code>false</code>。\",\n        \"如果一个字符串忽略标点符号、大小写和空格，正着读和反着读一模一样，那么这个字符串就是<dfn>palindrome</dfn>(回文)。\",\n        \"<strong>注意</strong>你需要去掉字符串多余的标点符号和空格，然后把字符串转化成小写来验证此字符串是否为回文。\",\n        \"函数参数的值可以为<code>\\\"racecar\\\"</code>，<code>\\\"RaceCar\\\"</code>和<code>\\\"race CAR\\\"</code>。\",\n        \"当你完成不了挑战的时候，记得开大招'Read-Search-Ask'。\"\n      ],\n      \"challengeSeed\": [\n        \"function palindrome(str) {\",\n        \"  // 请把你的代码写在这里\",\n        \"  return true;\",\n        \"}\",\n        \"\",\n        \"\",\n        \"\",\n        \"palindrome(\\\"eye\\\");\"\n      ],\n      \"tests\": [\n        \"assert(typeof palindrome(\\\"eye\\\") === \\\"boolean\\\", 'message: <code>palindrome(\\\"eye\\\")</code> 应该返回一个布尔值');\",\n        \"assert(palindrome(\\\"eye\\\") === true, 'message: <code>palindrome(\\\"eye\\\")</code> 应该返回 true.');\",\n        \"assert(palindrome(\\\"race car\\\") === true, 'message: <code>palindrome(\\\"race car\\\")</code> 应该返回 true.');\",\n        \"assert(palindrome(\\\"not a palindrome\\\") === false, 'message: <code>palindrome(\\\"not a palindrome\\\")</code> 应该返回 false.');\",\n        \"assert(palindrome(\\\"A man, a plan, a canal. Panama\\\") === true, 'message: <code>palindrome(\\\"A man, a plan, a canal. Panama\\\")</code> 应该返回 true.');\",\n        \"assert(palindrome(\\\"never odd or even\\\") === true, 'message: <code>palindrome(\\\"never odd or even\\\")</code> 应该返回 true.');\",\n        \"assert(palindrome(\\\"nope\\\") === false, 'message: <code>palindrome(\\\"nope\\\")</code> 应该返回 false.');\",\n        \"assert(palindrome(\\\"almostomla\\\") === false, 'message: <code>palindrome(\\\"almostomla\\\")</code> 应该返回 false.');\",\n        \"assert(palindrome(\\\"My age is 0, 0 si ega ym.\\\") === true, 'message: <code>palindrome(\\\"My age is 0, 0 si ega ym.\\\")</code> 应该返回 true.');\",\n        \"assert(palindrome(\\\"1 eye for of 1 eye.\\\") === false, 'message: <code>palindrome(\\\"1 eye for of 1 eye.\\\")</code> 应该返回 false.');\",\n        \"assert(palindrome(\\\"0_0 (: /-\\\\ :) 0-0\\\") === true, 'message: <code>palindrome(\\\"0_0 (: /-\\\\ :) 0-0\\\")</code> 应该返回 true.');\"\n      ],\n      \"type\": \"bonfire\",\n      \"isRequired\": true,\n      \"solutions\": [\n        \"function palindrome(str) {\\n  var string = str.toLowerCase().split(/[^A-Za-z0-9]/gi).join('');\\n  var aux = string.split('');\\n  if (aux.join('') === aux.reverse().join('')){\\n    return true;\\n  }\\n\\n  return false;\\n}\"\n      ],\n      \"MDNlinks\": [\n        \"String.replace()\",\n        \"String.toLowerCase()\"\n      ],\n      \"challengeType\": 5\n    },\n    {\n      \"id\": \"a26cbbe9ad8655a977e1ceb5\",\n      \"title\": \"Find the Longest Word in a String\",\n      \"description\": [\n        \"找出最长单词\",\n        \"在句子中找出最长的单词，并返回它的长度。\",\n        \"函数的返回值应该是一个数字。\",\n        \"当你完成不了挑战的时候，记得开大招'Read-Search-Ask'。\"\n      ],\n      \"challengeSeed\": [\n        \"function findLongestWord(str) {\",\n        \"  // 请把你的代码写在这里\",\n        \"  return str.length;\",\n        \"}\",\n        \"\",\n        \"findLongestWord(\\\"The quick brown fox jumped over the lazy dog\\\");\"\n      ],\n      \"tests\": [\n        \"assert(typeof findLongestWord(\\\"The quick brown fox jumped over the lazy dog\\\") === \\\"number\\\", 'message: <code>findLongestWord(\\\"The quick brown fox jumped over the lazy dog\\\")</code> 应该返回一个数字');\",\n        \"assert(findLongestWord(\\\"The quick brown fox jumped over the lazy dog\\\") === 6, 'message: <code>findLongestWord(\\\"The quick brown fox jumped over the lazy dog\\\")</code> 应该返回 6.');\",\n        \"assert(findLongestWord(\\\"May the force be with you\\\") === 5, 'message: <code>findLongestWord(\\\"May the force be with you\\\")</code> 应该返回 5.');\",\n        \"assert(findLongestWord(\\\"Google do a barrel roll\\\") === 6, 'message: <code>findLongestWord(\\\"Google do a barrel roll\\\")</code> 应该返回 6.');\",\n        \"assert(findLongestWord(\\\"What is the average airspeed velocity of an unladen swallow\\\") === 8, 'message: <code>findLongestWord(\\\"What is the average airspeed velocity of an unladen swallow\\\")</code> 应该返回 8.');\",\n        \"assert(findLongestWord(\\\"What if we try a super-long word such as otorhinolaryngology\\\") === 19, 'message: <code>findLongestWord(\\\"What if we try a super-long word such as otorhinolaryngology\\\")</code> 应该返回 19.');\"\n      ],\n      \"type\": \"bonfire\",\n      \"isRequired\": true,\n      \"solutions\": [\n        \"function findLongestWord(str) {\\n  return str.split(' ').sort(function(a, b) { return b.length - a.length;})[0].length;\\n}\\n\\nfindLongestWord('The quick brown fox jumped over the lazy dog');\\n\"\n      ],\n      \"MDNlinks\": [\n        \"String.split()\",\n        \"String.length\"\n      ],\n      \"challengeType\": 5\n    },\n    {\n      \"id\": \"ab6137d4e35944e21037b769\",\n      \"title\": \"Title Case a Sentence\",\n      \"description\": [\n        \"句中单词首字母大写\",\n        \"确保字符串的每个单词首字母都大写，其余部分小写。\",\n        \"像'the'和'of'这样的连接符同理。\",\n        \"当你完成不了挑战的时候，记得开大招'Read-Search-Ask'。\"\n      ],\n      \"challengeSeed\": [\n        \"function titleCase(str) {\",\n        \"  // 请把你的代码写在这里\",\n        \"  return str;\",\n        \"}\",\n        \"\",\n        \"titleCase(\\\"I'm a little tea pot\\\");\"\n      ],\n      \"tests\": [\n        \"assert(typeof titleCase(\\\"I'm a little tea pot\\\") === \\\"string\\\", 'message: <code>titleCase(\\\"I&#39;m a little tea pot\\\")</code> 应该返回一个字符串');\",\n        \"assert(titleCase(\\\"I'm a little tea pot\\\") === \\\"I'm A Little Tea Pot\\\", 'message: <code>titleCase(\\\"I&#39;m a little tea pot\\\")</code> 应该返回 \\\"I&#39;m A Little Tea Pot\\\".');\",\n        \"assert(titleCase(\\\"sHoRt AnD sToUt\\\") === \\\"Short And Stout\\\", 'message: <code>titleCase(\\\"sHoRt AnD sToUt\\\")</code> 应该返回 \\\"Short And Stout\\\".');\",\n        \"assert(titleCase(\\\"HERE IS MY HANDLE HERE IS MY SPOUT\\\") === \\\"Here Is My Handle Here Is My Spout\\\", 'message: <code>titleCase(\\\"HERE IS MY HANDLE HERE IS MY SPOUT\\\")</code> 应该返回 \\\"Here Is My Handle Here Is My Spout\\\".');\"\n      ],\n      \"type\": \"bonfire\",\n      \"isRequired\": true,\n      \"solutions\": [\n        \"function titleCase(str) {\\n  return str.split(' ').map(function(word) {\\n    return word.charAt(0).toUpperCase() + word.substring(1).toLowerCase();\\n  }).join(' ');\\n}\\n\\ntitleCase(\\\"I'm a little tea pot\\\");\\n\"\n      ],\n      \"MDNlinks\": [\n        \"String.split()\"\n      ],\n      \"challengeType\": 5\n    },\n    {\n      \"id\": \"a789b3483989747d63b0e427\",\n      \"title\": \"Return Largest Numbers in Arrays\",\n      \"description\": [\n        \"找出多个数组中的最大数\",\n        \"右边大数组中包含了4个小数组，分别找到每个小数组中的最大值，然后把它们串联起来，形成一个新数组。\",\n        \"提示：你可以用for循环来迭代数组，并通过<code>arr[i]</code>的方式来访问数组的每个元素。\",\n        \"当你完成不了挑战的时候，记得开大招'Read-Search-Ask'。\"\n      ],\n      \"challengeSeed\": [\n        \"function largestOfFour(arr) {\",\n        \"  // 请把你的代码写在这里\",\n        \"  return arr;\",\n        \"}\",\n        \"\",\n        \"largestOfFour([[4, 5, 1, 3], [13, 27, 18, 26], [32, 35, 37, 39], [1000, 1001, 857, 1]]);\"\n      ],\n      \"tests\": [\n        \"assert(largestOfFour([[4, 5, 1, 3], [13, 27, 18, 26], [32, 35, 37, 39], [1000, 1001, 857, 1]]).constructor === Array, 'message: <code>largestOfFour([[4, 5, 1, 3], [13, 27, 18, 26], [32, 35, 37, 39], [1000, 1001, 857, 1]])</code> 应该返回一个数组');\",\n        \"assert.deepEqual(largestOfFour([[13, 27, 18, 26], [4, 5, 1, 3], [32, 35, 37, 39], [1000, 1001, 857, 1]]), [27,5,39,1001], 'message: <code>largestOfFour([[13, 27, 18, 26], [4, 5, 1, 3], [32, 35, 37, 39], [1000, 1001, 857, 1]])</code> 应该返回 <code>[27,5,39,1001]</code>.');\",\n        \"assert.deepEqual(largestOfFour([[4, 9, 1, 3], [13, 35, 18, 26], [32, 35, 97, 39], [1000000, 1001, 857, 1]]), [9,35,97,1000000], 'message: <code>largestOfFour([[4, 9, 1, 3], [13, 35, 18, 26], [32, 35, 97, 39], [1000000, 1001, 857, 1]])</code> 应该返回 <code>[9, 35, 97, 1000000]</code>.');\"\n      ],\n      \"type\": \"bonfire\",\n      \"isRequired\": true,\n      \"solutions\": [\n        \"function largestOfFour(arr) {\\n  return arr.map(function(subArr) {\\n    return Math.max.apply(null, subArr);\\n  });\\n}\\n\\nlargestOfFour([[4, 5, 1, 3], [13, 27, 18, 26], [32, 35, 37, 39], [1000, 1001, 857, 1]]);\\n\"\n      ],\n      \"MDNlinks\": [\n        \"Comparison Operators\"\n      ],\n      \"challengeType\": 5\n    },\n    {\n      \"id\": \"acda2fb1324d9b0fa741e6b5\",\n      \"title\": \"Confirm the Ending\",\n      \"description\": [\n        \"检查字符串结尾\",\n        \"判断一个字符串(<code>str</code>)是否以指定的字符串(<code>target</code>)结尾。\",\n        \"如果是，返回true;如果不是，返回false。\",\n        \"当你完成不了挑战的时候，记得开大招'Read-Search-Ask'。\"\n      ],\n      \"challengeSeed\": [\n        \"function confirmEnding(str, target) {\",\n        \"  // 请把你的代码写在这里\",\n        \"  return str;\",\n        \"}\",\n        \"\",\n        \"confirmEnding(\\\"Bastian\\\", \\\"n\\\");\"\n      ],\n      \"tests\": [\n        \"assert(confirmEnding(\\\"Bastian\\\", \\\"n\\\") === true, 'message: <code>confirmEnding(\\\"Bastian\\\", \\\"n\\\")</code> 应该返回 true.');\",\n        \"assert(confirmEnding(\\\"Connor\\\", \\\"n\\\") === false, 'message: <code>confirmEnding(\\\"Connor\\\", \\\"n\\\")</code> 应该返回 false.');\",\n        \"assert(confirmEnding(\\\"Walking on water and developing software from a specification are easy if both are frozen\\\", \\\"specification\\\") === false, 'message: <code>confirmEnding(\\\"Walking on water and developing software from a specification are easy if both are frozen\\\"&#44; \\\"specification\\\"&#41;</code> 应该返回 false.');\",\n        \"assert(confirmEnding(\\\"He has to give me a new name\\\", \\\"name\\\") === true, 'message: <code>confirmEnding(\\\"He has to give me a new name\\\", \\\"name\\\")</code> 应该返回 true.');\",\n        \"assert(confirmEnding(\\\"He has to give me a new name\\\", \\\"me\\\") === true, 'message: <code>confirmEnding(\\\"He has to give me a new name\\\", \\\"me\\\")</code> 应该返回 true.');\",\n        \"assert(confirmEnding(\\\"He has to give me a new name\\\", \\\"na\\\") === false, 'message: <code>confirmEnding(\\\"He has to give me a new name\\\", \\\"na\\\")</code> 应该返回 false.');\",\n        \"assert(confirmEnding(\\\"If you want to save our world, you must hurry. We dont know how much longer we can withstand the nothing\\\", \\\"mountain\\\") === false, 'message: <code>confirmEnding(\\\"If you want to save our world, you must hurry. We dont know how much longer we can withstand the nothing\\\", \\\"mountain\\\")</code> 应该返回 false.');\"\n      ],\n      \"type\": \"bonfire\",\n      \"isRequired\": true,\n      \"solutions\": [\n        \"function confirmEnding(str, target) {\\n  return str.substring(str.length-target.length) === target;\\n};\\n\"\n      ],\n      \"MDNlinks\": [\n        \"String.substr()\"\n      ],\n      \"challengeType\": 5\n    },\n    {\n      \"id\": \"afcc8d540bea9ea2669306b6\",\n      \"title\": \"Repeat a string repeat a string\",\n      \"description\": [\n        \"重复输出字符串\",\n        \"（重要的事情说3遍）\",\n        \"重复一个指定的字符串 <code>num</code>次，如果<code>num</code>是一个负数则返回一个空字符串。\",\n        \"当你完成不了挑战的时候，记得开大招'Read-Search-Ask'。\"\n      ],\n      \"challengeSeed\": [\n        \"function repeat(str, num) {\",\n        \"  // 请把你的代码写在这里\",\n        \"  return str;\",\n        \"}\",\n        \"\",\n        \"repeat(\\\"abc\\\", 3);\"\n      ],\n      \"tests\": [\n        \"assert(repeat(\\\"*\\\", 3) === \\\"***\\\", 'message: <code>repeat(\\\"*\\\", 3)</code> 应该返回 <code>\\\"***\\\"</code>.');\",\n        \"assert(repeat(\\\"abc\\\", 3) === \\\"abcabcabc\\\", 'message: <code>repeat(\\\"abc\\\", 3)</code> 应该返回 <code>\\\"abcabcabc\\\"</code>.');\",\n        \"assert(repeat(\\\"abc\\\", 4) === \\\"abcabcabcabc\\\", 'message: <code>repeat(\\\"abc\\\", 4)</code> 应该返回 <code>\\\"abcabcabcabc\\\"</code>.');\",\n        \"assert(repeat(\\\"abc\\\", 1) === \\\"abc\\\", 'message: <code>repeat(\\\"abc\\\", 1)</code> 应该返回 <code>\\\"abc\\\"</code>.');\",\n        \"assert(repeat(\\\"*\\\", 8) === \\\"********\\\", 'message: <code>repeat(\\\"*\\\", 8)</code> 应该返回 <code>\\\"********\\\"</code>.');\",\n        \"assert(repeat(\\\"abc\\\", -2) === \\\"\\\", 'message: <code>repeat(\\\"abc\\\", -2)</code> 应该返回 <code>\\\"\\\"</code>.');\"\n      ],\n      \"type\": \"bonfire\",\n      \"isRequired\": true,\n      \"solutions\": [\n        \"function repeat(str, num) {\\n  if (num < 0) return '';\\n  return num === 1 ? str : str + repeat(str, num-1);\\n}\\n\\nrepeat('abc', 3);\\n\"\n      ],\n      \"MDNlinks\": [\n        \"Global String Object\"\n      ],\n      \"challengeType\": 5\n    },\n    {\n      \"id\": \"ac6993d51946422351508a41\",\n      \"title\": \"Truncate a string\",\n      \"description\": [\n        \"截断字符串\",\n        \"（用瑞兹来截断对面的退路）\",\n        \"如果字符串的长度比指定的参数<code>num</code>长，则把多余的部分用<code>...</code>来表示。\",\n        \"切记，插入到字符串尾部的三个点号也会计入字符串的长度。\",\n        \"但是，如果指定的参数<code>num</code>小于或等于3，则添加的三个点号不会计入字符串的长度。\",\n        \"当你完成不了挑战的时候，记得开大招'Read-Search-Ask'。\"\n      ],\n      \"challengeSeed\": [\n        \"function truncate(str, num) {\",\n        \"  // 请把你的代码写在这里\",\n        \"  return str;\",\n        \"}\",\n        \"\",\n        \"truncate(\\\"A-tisket a-tasket A green and yellow basket\\\", 11);\"\n      ],\n      \"tests\": [\n        \"assert(truncate(\\\"A-tisket a-tasket A green and yellow basket\\\", 11) === \\\"A-tisket...\\\", 'message: <code>truncate(\\\"A-tisket a-tasket A green and yellow basket\\\", 11)</code> 应该返回 \\\"A-tisket...\\\".');\",\n        \"assert(truncate(\\\"Peter Piper picked a peck of pickled peppers\\\", 14) === \\\"Peter Piper...\\\", 'message: <code>truncate(\\\"Peter Piper picked a peck of pickled peppers\\\", 14)</code> 应该返回 \\\"Peter Piper...\\\".');\",\n        \"assert(truncate(\\\"A-tisket a-tasket A green and yellow basket\\\", \\\"A-tisket a-tasket A green and yellow basket\\\".length) === \\\"A-tisket a-tasket A green and yellow basket\\\", 'message: <code>truncate(\\\"A-tisket a-tasket A green and yellow basket\\\", \\\"A-tisket a-tasket A green and yellow basket\\\".length)</code> 应该返回 \\\"A-tisket a-tasket A green and yellow basket\\\".');\",\n        \"assert(truncate('A-tisket a-tasket A green and yellow basket', 'A-tisket a-tasket A green and yellow basket'.length + 2) === 'A-tisket a-tasket A green and yellow basket', 'message: <code>truncate(\\\"A-tisket a-tasket A green and yellow basket\\\", \\\"A-tisket a-tasket A green and yellow basket\\\".length + 2)</code> 应该返回 \\\"A-tisket a-tasket A green and yellow basket\\\".');\",\n        \"assert(truncate(\\\"A-\\\", 1) === \\\"A...\\\", 'message: <code>truncate(\\\"A-\\\", 1)</code> 应该返回 \\\"A...\\\".');\",\n        \"assert(truncate(\\\"Absolutely Longer\\\", 2) === \\\"Ab...\\\", 'message: <code>truncate(\\\"Absolutely Longer\\\", 2)</code> 应该返回 \\\"Ab...\\\".');\"\n      ],\n      \"type\": \"bonfire\",\n      \"isRequired\": true,\n      \"solutions\": [\n        \"function truncate(str, num) {\\n  if(str.length > num ) {\\n    if(num > 3) {\\n      return str.slice(0, num - 3) + '...';\\n    } else {\\n      return str.slice(0,num) + '...';\\n    }\\n  } \\n  return str;\\n}\"\n      ],\n      \"MDNlinks\": [\n        \"String.slice()\"\n      ],\n      \"challengeType\": 5\n    },\n    {\n      \"id\": \"a9bd25c716030ec90084d8a1\",\n      \"title\": \"Chunky Monkey\",\n      \"description\": [\n        \"猴子吃香蕉, 分割数组\",\n        \"（猴子吃香蕉可是掰成好几段来吃哦）\",\n        \"把一个数组<code>arr</code>按照指定的数组大小<code>size</code>分割成若干个数组块。\",\n        \"例如:chunk([1,2,3,4],2)=[[1,2],[3,4]];\",\n        \"chunk([1,2,3,4,5],2)=[[1,2],[3,4],[5]];\",\n        \"当你完成不了挑战的时候，记得开大招'Read-Search-Ask'。\"\n      ],\n      \"challengeSeed\": [\n        \"function chunk(arr, size) {\",\n        \"  // 请把你的代码写在这里\",\n        \"  return arr;\",\n        \"}\",\n        \"\",\n        \"chunk([\\\"a\\\", \\\"b\\\", \\\"c\\\", \\\"d\\\"], 2);\"\n      ],\n      \"tests\": [\n        \"assert.deepEqual(chunk([\\\"a\\\", \\\"b\\\", \\\"c\\\", \\\"d\\\"], 2), [[\\\"a\\\", \\\"b\\\"], [\\\"c\\\", \\\"d\\\"]], 'message: <code>chunk([\\\"a\\\", \\\"b\\\", \\\"c\\\", \\\"d\\\"], 2)</code> 应该返回 <code>[[\\\"a\\\", \\\"b\\\"], [\\\"c\\\", \\\"d\\\"]]</code>.');\",\n        \"assert.deepEqual(chunk([0, 1, 2, 3, 4, 5], 3), [[0, 1, 2], [3, 4, 5]], 'message: <code>chunk([0, 1, 2, 3, 4, 5], 3)</code> 应该返回 <code>[[0, 1, 2], [3, 4, 5]]</code>.');\",\n        \"assert.deepEqual(chunk([0, 1, 2, 3, 4, 5], 2), [[0, 1], [2, 3], [4, 5]], 'message: <code>chunk([0, 1, 2, 3, 4, 5], 2)</code> 应该返回 <code>[[0, 1], [2, 3], [4, 5]]</code>.');\",\n        \"assert.deepEqual(chunk([0, 1, 2, 3, 4, 5], 4), [[0, 1, 2, 3], [4, 5]], 'message: <code>chunk([0, 1, 2, 3, 4, 5], 4)</code> 应该返回 <code>[[0, 1, 2, 3], [4, 5]]</code>.');\",\n        \"assert.deepEqual(chunk([0, 1, 2, 3, 4, 5, 6], 3), [[0, 1, 2], [3, 4, 5], [6]], 'message: <code>chunk([0, 1, 2, 3, 4, 5, 6], 3)</code> 应该返回 <code>[[0, 1, 2], [3, 4, 5], [6]]</code>.');\",\n        \"assert.deepEqual(chunk([0, 1, 2, 3, 4, 5, 6, 7, 8], 4), [[0, 1, 2, 3], [4, 5, 6, 7], [8]], 'message: <code>chunk([0, 1, 2, 3, 4, 5, 6, 7, 8], 4)</code> 应该返回 <code>[[0, 1, 2, 3], [4, 5, 6, 7], [8]]</code>.');\"\n      ],\n      \"type\": \"bonfire\",\n      \"isRequired\": true,\n      \"solutions\": [\n        \"function chunk(arr, size) {\\n  var out = [];\\n  for (var i = 0; i < arr.length; i+=size) {\\n    out.push(arr.slice(i,i+size));\\n  }\\n  return out;\\n}\\n\\nchunk(['a', 'b', 'c', 'd'], 2);\\n\"\n      ],\n      \"MDNlinks\": [\n        \"Array.push()\",\n        \"Array.slice()\"\n      ],\n      \"challengeType\": 5\n    },\n    {\n      \"id\": \"ab31c21b530c0dafa9e241ee\",\n      \"title\": \"Slasher Flick\",\n      \"description\": [\n        \"截断数组\",\n        \"返回一个数组被截断<code>n</code>个元素后还剩余的元素，截断从索引0开始。\",\n        \"当你完成不了挑战的时候，记得开大招'Read-Search-Ask'。\"\n      ],\n      \"challengeSeed\": [\n        \"function slasher(arr, howMany) {\",\n        \"  // 请把你的代码写在这里\",\n        \"  return arr;\",\n        \"}\",\n        \"\",\n        \"slasher([1, 2, 3], 2);\"\n      ],\n      \"tests\": [\n        \"assert.deepEqual(slasher([1, 2, 3], 2), [3], 'message: <code>slasher([1, 2, 3], 2)</code> 应该返回 <code>[3]</code>.');\",\n        \"assert.deepEqual(slasher([1, 2, 3], 0), [1, 2, 3], 'message: <code>slasher([1, 2, 3], 0)</code> 应该返回 <code>[1, 2, 3]</code>.');\",\n        \"assert.deepEqual(slasher([1, 2, 3], 9), [], 'message: <code>slasher([1, 2, 3], 9)</code> 应该返回 <code>[]</code>.');\",\n        \"assert.deepEqual(slasher([1, 2, 3], 4), [], 'message: <code>slasher([1, 2, 3], 4)</code> 应该返回 <code>[]</code>.');\",\n        \"assert.deepEqual(slasher(['burgers', 'fries', 'shake'], 1), ['fries', 'shake'], 'message: <code>slasher([\\\"burgers\\\", \\\"fries\\\", \\\"shake\\\"], 1)</code> 应该返回 <code>[\\\"fries\\\", \\\"shake\\\"]</code>.');\",\n        \"assert.deepEqual(slasher([1, 2, 'chicken', 3, 'potatoes', 'cheese', 4], 5), ['cheese', 4], 'message: <code>slasher([1, 2, \\\"chicken\\\", 3, \\\"potatoes\\\", \\\"cheese\\\", 4], 5)</code> 应该返回 <code>[\\\"cheese\\\", 4]</code>.');\"\n      ],\n      \"type\": \"bonfire\",\n      \"isRequired\": true,\n      \"solutions\": [\n        \"function slasher(arr, howMany) {\\n  // it doesn't always pay to be first\\n  return arr.slice(howMany);\\n}\\n\\nslasher([1, 2, 3], 2);\\n\"\n      ],\n      \"MDNlinks\": [\n        \"Array.slice()\",\n        \"Array.splice()\"\n      ],\n      \"challengeType\": 5\n    },\n    {\n      \"id\": \"af2170cad53daa0770fabdea\",\n      \"title\": \"Mutations\",\n      \"description\": [\n        \"比较字符串\",\n        \"（蛤蟆可以吃队友，也可以吃对手）\",\n        \"如果数组第一个字符串元素包含了第二个字符串元素的所有字符，函数返回true。\",\n        \"举例，<code>[\\\"hello\\\", \\\"Hello\\\"]</code>应该返回true，因为在忽略大小写的情况下，第二个字符串的所有字符都可以在第一个字符串找到。\",\n        \"<code>[\\\"hello\\\", \\\"hey\\\"]</code>应该返回false，因为字符串\\\"hello\\\"并不包含字符\\\"y\\\"。\",\n        \"<code>[\\\"Alien\\\", \\\"line\\\"]</code>应该返回true，因为\\\"line\\\"中所有字符都可以在\\\"Alien\\\"找到。\",\n        \"当你完成不了挑战的时候，记得开大招'Read-Search-Ask'。\"\n      ],\n      \"challengeSeed\": [\n        \"function mutation(arr) {\",\n        \"  // 请把你的代码写在这里\",\n        \"  return arr;\",\n        \"}\",\n        \"\",\n        \"mutation([\\\"hello\\\", \\\"hey\\\"]);\"\n      ],\n      \"tests\": [\n        \"assert(mutation([\\\"hello\\\", \\\"hey\\\"]) === false, 'message: <code>mutation([\\\"hello\\\", \\\"hey\\\"])</code> 应该返回 false.');\",\n        \"assert(mutation([\\\"hello\\\", \\\"Hello\\\"]) === true, 'message: <code>mutation([\\\"hello\\\", \\\"Hello\\\"])</code> 应该返回 true.');\",\n        \"assert(mutation([\\\"zyxwvutsrqponmlkjihgfedcba\\\", \\\"qrstu\\\"]) === true, 'message: <code>mutation([\\\"zyxwvutsrqponmlkjihgfedcba\\\", \\\"qrstu\\\"])</code> 应该返回 true.');\",\n        \"assert(mutation([\\\"Mary\\\", \\\"Army\\\"]) === true, 'message: <code>mutation([\\\"Mary\\\", \\\"Army\\\"])</code> 应该返回 true.');\",\n        \"assert(mutation([\\\"Mary\\\", \\\"Aarmy\\\"]) === true, 'message: <code>mutation([\\\"Mary\\\", \\\"Aarmy\\\"])</code> 应该返回 true.');\",\n        \"assert(mutation([\\\"Alien\\\", \\\"line\\\"]) === true, 'message: <code>mutation([\\\"Alien\\\", \\\"line\\\"])</code> 应该返回 true.');\",\n        \"assert(mutation([\\\"floor\\\", \\\"for\\\"]) === true, 'message: <code>mutation([\\\"floor\\\", \\\"for\\\"])</code> 应该返回 true.');\",\n        \"assert(mutation([\\\"hello\\\", \\\"neo\\\"]) === false, 'message: <code>mutation([\\\"hello\\\", \\\"neo\\\"])</code> 应该返回 false.');\"\n      ],\n      \"type\": \"bonfire\",\n      \"isRequired\": true,\n      \"solutions\": [\n        \"function mutation(arr) {\\n  var hash = Object.create(null);\\n  arr[0].toLowerCase().split('').forEach(function(c) {\\n    hash[c] = true;\\n  });\\n  return !arr[1].toLowerCase().split('').filter(function(c) {\\n    return !hash[c];\\n  }).length;\\n}\\n\\nmutation(['hello', 'hey']);\\n\"\n      ],\n      \"MDNlinks\": [\n        \"String.indexOf()\"\n      ],\n      \"challengeType\": 5\n    },\n    {\n      \"id\": \"adf08ec01beb4f99fc7a68f2\",\n      \"title\": \"Falsy Bouncer\",\n      \"description\": [\n        \"过滤数组假值\",\n        \"（真假美猴王）\",\n        \"删除数组中的所有假值。\",\n        \"在JavaScript中，假值有<code>false</code>、<code>null</code>、<code>0</code>、<code>\\\"\\\"</code>、<code>undefined</code> 和 <code>NaN</code>。\",\n        \"当你完成不了挑战的时候，记得开大招'Read-Search-Ask'。\"\n      ],\n      \"challengeSeed\": [\n        \"function bouncer(arr) {\",\n        \"  // 请把你的代码写在这里\",\n        \"  return arr;\",\n        \"}\",\n        \"\",\n        \"bouncer([7, \\\"ate\\\", \\\"\\\", false, 9]);\"\n      ],\n      \"tests\": [\n        \"assert.deepEqual(bouncer([7, \\\"ate\\\", \\\"\\\", false, 9]), [7, \\\"ate\\\", 9], 'message: <code>bouncer([7, \\\"ate\\\", \\\"\\\", false, 9])</code> 应该返回 <code>[7, \\\"ate\\\", 9]</code>.');\",\n        \"assert.deepEqual(bouncer([\\\"a\\\", \\\"b\\\", \\\"c\\\"]), [\\\"a\\\", \\\"b\\\", \\\"c\\\"], 'message: <code>bouncer([\\\"a\\\", \\\"b\\\", \\\"c\\\"])</code> 应该返回 <code>[\\\"a\\\", \\\"b\\\", \\\"c\\\"]</code>.');\",\n        \"assert.deepEqual(bouncer([false, null, 0, NaN, undefined, \\\"\\\"]), [], 'message: <code>bouncer([false, null, 0, NaN, undefined, \\\"\\\"])</code> 应该返回 <code>[]</code>.');\",\n        \"assert.deepEqual(bouncer([1, null, NaN, 2, undefined]), [1, 2], 'message: <code>bouncer([1, null, NaN, 2, undefined])</code> 应该返回 <code>[1, 2]</code>.');\"\n      ],\n      \"type\": \"bonfire\",\n      \"isRequired\": true,\n      \"solutions\": [\n        \"function bouncer(arr) {\\n  // Don't show a false ID to this bouncer.\\n  return arr.filter(function(e) {return e;});\\n}\\n\\nbouncer([7, 'ate', '', false, 9]);\\n\"\n      ],\n      \"MDNlinks\": [\n        \"Boolean Objects\",\n        \"Array.filter()\"\n      ],\n      \"challengeType\": 5\n    },\n    {\n      \"id\": \"a39963a4c10bc8b4d4f06d7e\",\n      \"title\": \"Seek and Destroy\",\n      \"description\": [\n        \"摧毁数组\",\n        \"<strong>金克斯的迫击炮！</strong>\",\n        \"实现一个摧毁(destroyer)函数，第一个参数是待摧毁的数组，其余的参数是待摧毁的值。\",\n        \"当你完成不了挑战的时候，记得开大招'Read-Search-Ask'。\"\n      ],\n      \"challengeSeed\": [\n        \"function destroyer(arr) {\",\n        \"  // 请把你的代码写在这里\",\n        \"  return arr;\",\n        \"}\",\n        \"\",\n        \"destroyer([1, 2, 3, 1, 2, 3], 2, 3);\"\n      ],\n      \"tests\": [\n        \"assert.deepEqual(destroyer([1, 2, 3, 1, 2, 3], 2, 3), [1, 1], 'message: <code>destroyer([1, 2, 3, 1, 2, 3], 2, 3)</code> 应该返回 <code>[1, 1]</code>.');\",\n        \"assert.deepEqual(destroyer([1, 2, 3, 5, 1, 2, 3], 2, 3), [1, 5, 1], 'message: <code>destroyer([1, 2, 3, 5, 1, 2, 3], 2, 3)</code> 应该返回 <code>[1, 5, 1]</code>.');\",\n        \"assert.deepEqual(destroyer([3, 5, 1, 2, 2], 2, 3, 5), [1], 'message: <code>destroyer([3, 5, 1, 2, 2], 2, 3, 5)</code> 应该返回 <code>[1]</code>.');\",\n        \"assert.deepEqual(destroyer([2, 3, 2, 3], 2, 3), [], 'message: <code>destroyer([2, 3, 2, 3], 2, 3)</code> 应该返回 <code>[]</code>.');\",\n        \"assert.deepEqual(destroyer([\\\"tree\\\", \\\"hamburger\\\", 53], \\\"tree\\\", 53), [\\\"hamburger\\\"], 'message: <code>destroyer([\\\"tree\\\", \\\"hamburger\\\", 53], \\\"tree\\\", 53)</code> 应该返回 <code>[\\\"hamburger\\\"]</code>.');\"\n      ],\n      \"type\": \"bonfire\",\n      \"isRequired\": true,\n      \"solutions\": [\n        \"function destroyer(arr) {\\n  var hash = Object.create(null);\\n  [].slice.call(arguments, 1).forEach(function(e) {\\n    hash[e] = true;\\n  });\\n  // Remove all the values\\n  return arr.filter(function(e) { return !(e in hash);});\\n}\\n\\ndestroyer([1, 2, 3, 1, 2, 3], 2, 3);\\n\"\n      ],\n      \"MDNlinks\": [\n        \"Arguments object\",\n        \"Array.filter()\"\n      ],\n      \"challengeType\": 5\n    },\n    {\n      \"id\": \"a24c1a4622e3c05097f71d67\",\n      \"title\": \"Where do I belong\",\n      \"description\": [\n        \"数组排序并找出元素索引\",\n        \"<strong>我身在何处？</strong>\",\n        \"先给数组排序，然后找到指定的值在数组的位置，最后返回位置对应的索引。\",\n        \"举例：<code>where([1,2,3,4], 1.5)</code> 应该返回 <code>1</code>。因为<code>1.5</code>插入到数组<code>[1,2,3,4]</code>后变成<code>[1,1.5,2,3,4]</code>，而<code>1.5</code>对应的索引值就是<code>1</code>。\",\n        \"同理，<code>where([20,3,5], 19)</code> 应该返回 <code>2</code>。因为数组会先排序为 <code>[3,5,20]</code>，<code>19</code>插入到数组<code>[3,5,20]</code>后变成<code>[3,5,19,20]</code>，而<code>19</code>对应的索引值就是<code>2</code>。\",\n        \"当你完成不了挑战的时候，记得开大招'Read-Search-Ask'。\"\n      ],\n      \"challengeSeed\": [\n        \"function where(arr, num) {\",\n        \"  // 请把你的代码写在这里\",\n        \"  return num;\",\n        \"}\",\n        \"\",\n        \"where([40, 60], 50);\"\n      ],\n      \"tests\": [\n        \"assert(where([10, 20, 30, 40, 50], 35) === 3, 'message: <code>where([10, 20, 30, 40, 50], 35)</code> 应该返回 <code>3</code>.');\",\n        \"assert(where([10, 20, 30, 40, 50], 30) === 2, 'message: <code>where([10, 20, 30, 40, 50], 30)</code> 应该返回 <code>2</code>.');\",\n        \"assert(where([40, 60], 50) === 1, 'message: <code>where([40, 60], 50)</code> 应该返回 <code>1</code>.');\",\n        \"assert(where([3, 10, 5], 3) === 0, 'message: <code>where([3, 10, 5], 3)</code> 应该返回 <code>0</code>.');\",\n        \"assert(where([5, 3, 20, 3], 5) === 2, 'message: <code>where([5, 3, 20, 3], 5)</code> 应该返回 <code>2</code>.');\",\n        \"assert(where([2, 20, 10], 19) === 2, 'message: <code>where([2, 20, 10], 19)</code> 应该返回 <code>2</code>.');\",\n        \"assert(where([2, 5, 10], 15) === 3, 'message: <code>where([2, 5, 10], 15)</code> 应该返回 <code>3</code>.');\"\n      ],\n      \"type\": \"bonfire\",\n      \"isRequired\": true,\n      \"solutions\": [\n        \"function where(arr, num) {\\n  arr = arr.sort(function(a, b){return a-b;});\\n  for (var i = 0; i < arr.length; i++) {\\n    if (arr[i] >= num)\\n      {\\n        return i;\\n      }\\n  }\\n  return arr.length;\\n}\"\n      ],\n      \"MDNlinks\": [\n        \"Array.sort()\"\n      ],\n      \"challengeType\": 5\n    },\n    {\n      \"id\": \"56533eb9ac21ba0edf2244e2\",\n      \"title\": \"Caesars Cipher\",\n      \"description\": [\n        \"凯撒密码\",\n        \"（让上帝的归上帝，凯撒的归凯撒）\",\n        \"下面我们来介绍风靡全球的凯撒密码<code>Caesar cipher</code>，又叫移位密码。\",\n        \"移位密码也就是密码中的字母会按照指定的数量来做移位。\",\n        \"一个常见的案例就是<a href=\\\"http://www.baike.com/wiki/ROT13&prd=so_1_doc\\\" target='_blank'>ROT13</a>密码，字母会移位13个位置。由'A' &harr; 'N', 'B' &harr;  'O'，以此类推。\",\n        \"写一个<a href=\\\"http://www.baike.com/wiki/ROT13&prd=so_1_doc\\\" target='_blank'>ROT13</a>函数，实现输入加密字符串，输出解密字符串。\",\n        \"所有的字母都是大写，不要转化任何非字母形式的字符(例如：空格，标点符号)，遇到这些特殊字符，跳过它们。\",\n        \"当你完成不了挑战的时候，记得开大招'Read-Search-Ask'。\"\n      ],\n      \"challengeSeed\": [\n        \"function rot13(str) { // LBH QVQ VG!\",\n        \"  // 请把你的代码写在这里\",\n        \"  return str;\",\n        \"}\",\n        \"\",\n        \"rot13(\\\"SERR PBQR PNZC\\\");  // 你可以修改这一行来测试你的代码\"\n      ],\n      \"tail\": [\n        \"\"\n      ],\n      \"solutions\": [\n        \"var lookup = {\\n  'A': 'N','B': 'O','C': 'P','D': 'Q',\\n  'E': 'R','F': 'S','G': 'T','H': 'U',\\n  'I': 'V','J': 'W','K': 'X','L': 'Y',\\n  'M': 'Z','N': 'A','O': 'B','P': 'C',\\n  'Q': 'D','R': 'E','S': 'F','T': 'G',\\n  'U': 'H','V': 'I','W': 'J','X': 'K',\\n  'Y': 'L','Z': 'M' \\n};\\n\\nfunction rot13(encodedStr) {\\n  var codeArr = encodedStr.split(\\\"\\\");  // String to Array\\n  var decodedArr = []; // Your Result goes here\\n  // Only change code below this line\\n  \\n  decodedArr = codeArr.map(function(letter) {\\n    if(lookup.hasOwnProperty(letter)) {\\n      letter = lookup[letter];\\n    }\\n    return letter;\\n  });\\n\\n  // Only change code above this line\\n  return decodedArr.join(\\\"\\\"); // Array to String\\n}\"\n      ],\n      \"tests\": [\n        \"assert(rot13(\\\"SERR PBQR PNZC\\\") === \\\"FREE CODE CAMP\\\", 'message: <code>rot13(\\\"SERR PBQR PNZC\\\")</code> 应该解码为 <code>\\\"FREE CODE CAMP\\\"</code>');\",\n        \"assert(rot13(\\\"SERR CVMMN!\\\") === \\\"FREE PIZZA!\\\", 'message: <code>rot13(\\\"SERR CVMMN!\\\")</code> 应该解码为 <code>\\\"FREE PIZZA!\\\"</code>');\",\n        \"assert(rot13(\\\"SERR YBIR?\\\") === \\\"FREE LOVE?\\\", 'message: <code>rot13(\\\"SERR YBIR?\\\")</code> 应该解码为 <code>\\\"FREE LOVE?\\\"</code>');\",\n        \"assert(rot13(\\\"GUR DHVPX OEBJA QBT WHZCRQ BIRE GUR YNML SBK.\\\") === \\\"THE QUICK BROWN DOG JUMPED OVER THE LAZY FOX.\\\", 'message: <code>rot13(\\\"GUR DHVPX OEBJA QBT WHZCRQ BIRE GUR YNML SBK.\\\")</code> 应该解码为 <code>\\\"THE QUICK BROWN DOG JUMPED OVER THE LAZY FOX.\\\"</code>');\"\n      ],\n      \"type\": \"bonfire\",\n      \"MDNlinks\": [\n        \"String.charCodeAt()\",\n        \"String.fromCharCode()\"\n      ],\n      \"challengeType\": 5,\n      \"isRequired\": true,\n      \"releasedOn\": \"January 1, 2016\"\n    }\n  ]\n}\n"
  },
  {
    "path": "seed/challenges/01-front-end-development-certification/basic-javascript.json",
    "content": "{\n  \"name\": \"Basic JavaScript\",\n  \"time\": \"10 hours\",\n  \"order\": 6,\n  \"helpRoom\": \"chinese\",\n  \"challenges\": [\n    {\n      \"id\": \"bd7123c9c441eddfaeb4bdef\",\n      \"title\": \"Comment your JavaScript Code\",\n      \"description\": [\n        \"注释的代码块在JavaScript之中是不会运行的。注释是一个非常好的方式让你自己以及其他人明白这段代码是怎么运行的。\",\n        \"JavaScript中的注释方式有以下两种：\",\n        \"使用 <code>//</code> 来告诉JavaScript来忽略当前行的代码\",\n        \"<blockquote>// This is an in-line comment.</blockquote>\",\n        \"你也可以使用多行注释来注释你的代码，以<code>/*</code>开始，用<code>*/</code>来结束，就像下面这样：\",\n        \"<blockquote>/* This is a <br>   multi-line comment */</blockquote>\",\n        \"<strong>最佳实践</strong><br>你应该给你写的代码添加注释，来让你的代码看起来更加地清晰易懂。良好的注释能够清晰地传达你写的代码的意图&mdash;对于那些读你的代码的人来说<em>以及</em>未来你看到它的时候，还能理解这段代码的意图。\",\n        \"<h4>任务</h4>\",\n        \"尝试创建这两种类型的注释。\"\n      ],\n      \"challengeSeed\": [\n        \"\"\n      ],\n      \"solutions\": [\n        \"// Fake Comment\\n/* Another Comment */\"\n      ],\n      \"tests\": [\n        \"assert(code.match(/(\\\\/\\\\/)...../g), 'message: 创建一个 <code>//</code> 样式的注释, 被注释的文本至少要包含5个字符.');\",\n        \"assert(code.match(/(\\\\/\\\\*)[\\\\w\\\\W]{5,}(?=\\\\*\\\\/)/gm), 'message: 创建一个 <code>/* */</code> 样式的注释, 被注释的文本至少要包含5个字符.');\",\n        \"assert(code.match(/(\\\\*\\\\/)/g), 'message: 确保你有使用<code>*/</code>关闭注释.');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 1\n    },\n    {\n      \"id\": \"bd7123c9c443eddfaeb5bdef\",\n      \"title\": \"Declare JavaScript Variables\",\n      \"description\": [\n        \"在计算机科学中, <code>data</code>(数据)就是一切，因为它对于计算机的意义重大。JavaScript提供七种不同的<dfn>data types</dfn>(数据类型)，它们是<code>undefined</code>（未定义）, <code>null</code>（空）, <code>boolean</code>（布尔型）, <code>string</code>（字符串）, <code>symbol</code>(符号), <code>number</code>（数字）, and <code>object</code>（对象）。\",\n        \"举个例子, 计算机能够分辨不同的数字, 例如数字 <code>12</code>和 <code>strings</code>，<code>\\\"12\\\"</code>和<code>\\\"dog\\\"</code>, 或<code>\\\"123 cats\\\"</code>, 都是字母的集合。 计算机能够精确地操作数字， 但是对于字符串却无能为力。\",\n        \"<code>Variables</code>（变量）允许计算机以一种动态的形式来存储和操作数据，通过操作指向数据的指针而不是数据本身来避免了内存泄露，以上的七种数据类型都可以存储到一个变量（variable）中。\",\n        \"<code>Variables</code> 非常类似于你在数学中使用的x,y变量, 这意味着它们都是以一个简单命名的名字来代替我们赋值给它的数据。计算机中的<code>variables</code>（变量）与数学中的变量不同的是，计算机可以在不同的时间存储不同类型的变量。\",\n        \"通过在变量的前面使用关键字<code>var</code>，我们告诉 JavaScript 来创建或者 <dfn>declare</dfn>（声明）一个变量,就像这样：\",\n        \"<blockquote>var ourName;</blockquote>\",\n        \"上面代码的意思是创建一个名为<code>ourName</code>的<code>variable</code>（变量），在JavaScript中我们使用分号来结束一段声明。\",\n        \"<code>Variable</code> （变量）的名字可以由数字、字母、<code>$</code> 或者 <code>_</code>组成，但是不能包含空格或者以数字为首。\",\n        \"<h4>任务</h4>\",\n        \"使用<code>var</code> 关键字来创建一个名为<code>myName</code>的变量。\",\n        \"<strong>提示</strong><br>如果遇到困难了，请看下<code>ourName</code>的例子是怎么写的。\"\n      ],\n      \"challengeSeed\": [\n        \"// 举例\",\n        \"var ourName;\",\n        \"\",\n        \"// 请在这条注释以下定义 myName 变量\",\n        \"\"\n      ],\n      \"tail\": [\n        \"if(typeof myName !== \\\"undefined\\\"){(function(v){return v;})(myName);}\"\n      ],\n      \"solutions\": [\n        \"var myName;\"\n      ],\n      \"tests\": [\n        \"assert(/var\\\\s+myName\\\\s*;/.test(code), 'message: 你需要使用<code>var</code>关键字定义一个变量<code>myName</code>, 并使用分号结尾。');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 1\n    },\n    {\n      \"id\": \"56533eb9ac21ba0edf2244a8\",\n      \"title\": \"Storing Values with the Equal Operator\",\n      \"description\": [\n        \"在JavaScript中，你可以通过assignment(分配)操作符把一个值存储到变量中。\",\n        \"<code>myVariable = 5;</code>\",\n        \"把<code>Number</code>数字<code>5</code>赋给变量<code>myVariable</code>。\",\n        \"赋值过程是从右到左进行的。所有 <code>=</code> 操作符右边的值都会被赋到左边的变量。\",\n        \"<blockquote>myVar = 5;<br>myNum = myVar;</blockquote>\",\n        \"数值 <code>5</code> 被赋给变量 <code>myVar</code> 中， 然后变量 <code>myVar</code> 又赋给变量 <code>myNum</code> ，这样子 <code>myNum</code> 变量中的值也是 <code>5</code> 了。\",\n        \"<h4>任务</h4>\",\n        \"把数值 <code>7</code> 赋给变量 <code>a</code>。\",\n        \"把变量 <code>a</code> 中的内容赋给变量 <code>b</code>。\"\n      ],\n      \"releasedOn\": \"January 1, 2016\",\n      \"challengeSeed\": [\n        \"// 初始化变量\",\n        \"var a;\",\n        \"var b = 2;\",\n        \"\",\n        \"// 请把你的代码写在这条注释以下\",\n        \"\"\n      ],\n      \"tail\": [\n        \"(function(a,b){return \\\"a = \\\" + a + \\\", b = \\\" + b;})(a,b);\"\n      ],\n      \"solutions\": [\n        \"var a;\\nvar b = 2;\\na = 7;\\nb = a;\"\n      ],\n      \"tests\": [\n        \"assert(/var a;/.test(code) && /var b = 2;/.test(code), 'message: 不要修改注释上方的代码');\",\n        \"assert(typeof a === 'number' && a === 7, 'message: <code>a</code> 的值应该是 7');\",\n        \"assert(typeof b === 'number' && b === 7, 'message: <code>b</code> 的值应该是 7');\",\n        \"assert(/b\\\\s*=\\\\s*a\\\\s*;/g.test(code), 'message: 你需要用<code>=</code>把<code>a</code>的值赋给<code>b</code>');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 1\n    },\n    {\n      \"id\": \"56533eb9ac21ba0edf2244a9\",\n      \"title\": \"Initializing Variables with the Equal Operator\",\n      \"description\": [\n        \"通常地我们会在<dfn>initialize</dfn>开始声明变量的时候就会给变量赋一个初始值。\",\n        \"<code>var myVar = 0;</code>\",\n        \"创建一个名为 <code>myVar</code> 的变量并指定一个初始值 <code>0</code>。\",\n        \"<h4>任务</h4>\",\n        \"通过关键字 <code>var</code> 定义一个变量 <code>a</code> 并且给它一个初始值 <code>9</code>。\"\n      ],\n      \"releasedOn\": \"January 1, 2016\",\n      \"challengeSeed\": [\n        \"// 举例\",\n        \"var ourVar = 19;\",\n        \"\",\n        \"// 请把你的代码写在这条注释以下\",\n        \"\"\n      ],\n      \"tail\": [\n        \"if(typeof a !== 'undefined') {(function(a){return \\\"a = \\\" + a;})(a);} else { (function() {return 'a is undefined';})(); }\"\n      ],\n      \"solutions\": [\n        \"var a = 9;\"\n      ],\n      \"tests\": [\n        \"assert(/var\\\\s+a\\\\s*=\\\\s*9\\\\s*/.test(code), 'message: 你需要初始化 <code>a</code> 的值为 <code>9</code>');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 1\n    },\n    {\n      \"id\": \"56533eb9ac21ba0edf2244aa\",\n      \"title\": \"Understanding Uninitialized Variables\",\n      \"description\": [\n        \"当 JavaScript 中的变量被声明的时候，程序内部会给它一个初始值 <code>undefined</code>。当你对一个值为 <code>undefined</code> 的变量进行运算操作的时候，算出来的结果将会是 <code>NaN</code>，<code>NaN</code> 的意思是 <dfn>\\\"Not a Number\\\"</dfn>。当你用一个没有 <code>定义</code> 的变量来做字符串连接操作的时候，它会如实的输出<code>\\\"undefined\\\"</code>。\",\n        \"<h4>任务</h4>\",\n        \"定义3个变量 <code>a</code>、<code>b</code>、<code>c</code> ，并且分别给他们赋值：<code>5</code>、<code>10</code>、<code>\\\"I am a\\\"</code> ，这样它们就不会是 <code>undefined</code>（未定义的了）。\"\n      ],\n      \"releasedOn\": \"January 1, 2016\",\n      \"challengeSeed\": [\n        \"// 初始化变量\",\n        \"var a;\",\n        \"var b;\",\n        \"var c;\",\n        \"\",\n        \"// 请只修改这条注释以上的代码\",\n        \"\",\n        \"a = a + 1;\",\n        \"b = b + 5;\",\n        \"c = c + \\\" String!\\\";\",\n        \"\"\n      ],\n      \"tail\": [\n        \"(function(a,b,c){ return \\\"a = \\\" + a + \\\", b = \\\" + b + \\\", c = '\\\" + c + \\\"'\\\"; })(a,b,c);\"\n      ],\n      \"solutions\": [\n        \"var a = 5;\\nvar b = 10;\\nvar c = \\\"I am a\\\";\\na = a + 1;\\nb = b + 5;\\nc = c + \\\" String!\\\";\"\n      ],\n      \"tests\": [\n        \"assert(typeof a === 'number' && a === 6, 'message: <code>a</code> 应该是已经定义的, 并且值为 <code>6</code>');\",\n        \"assert(typeof b === 'number' && b === 15, 'message: <code>b</code> 应该是已经定义的, 并且值为 <code>15</code>');\",\n        \"assert(!/undefined/.test(c) && c === \\\"I am a String!\\\", 'message: <code>c</code> 不能包含 <code>undefined</code>, 并且值应该为 \\\"I am a String!\\\"');\",\n        \"assert(/a = a \\\\+ 1;/.test(code) && /b = b \\\\+ 5;/.test(code) && /c = c \\\\+ \\\" String!\\\";/.test(code), 'message: 不要修改<code>// Do not change code below this line</code>下面的代码');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 1\n    },\n    {\n      \"id\": \"56533eb9ac21ba0edf2244ab\",\n      \"title\": \"Understanding Case Sensitivity in Variables\",\n      \"description\": [\n        \"在 JavaScript 中所有的变量都是大小写敏感的。这意味着你要区别对待大写字母和小写字母。\",\n        \"<code>MYVAR</code>与<code>MyVar</code>和<code>myvar</code> 是截然不同的变量。这就有可能导致多个截然不同的变量却有着有相似的名字。正是由于以上原因所以强烈地建议你, <em>不要</em> 使用这一特性。（以免给自己带来麻烦）\",\n        \"<h4>最佳实践</h4>\",\n        \"使用 <dfn>驼峰命名法</dfn> 来书写一个 Javascript 变量，在 <dfn>驼峰命名法</dfn> 中，变量名的第一个单词的首写字母小写，后面的单词的第一个字母大写。\",\n        \"<strong>举个栗子:</strong>\",\n        \"<blockquote>var someVariable;<br>var anotherVariableName;<br>var thisVariableNameIsTooLong;</blockquote>\",\n        \"<h4>任务</h4>\",\n        \"修正声明的变量，让它们的命名符合 <dfn>驼峰命名法</dfn> 的规范。\"\n      ],\n      \"releasedOn\": \"January 1, 2016\",\n      \"challengeSeed\": [\n        \"// 初始化变量\",\n        \"var StUdLyCapVaR;\",\n        \"var properCamelCase;\",\n        \"var TitleCaseOver;\",\n        \"\",\n        \"// 给变量赋值\",\n        \"STUDLYCAPVAR = 10;\",\n        \"PRoperCAmelCAse = \\\"A String\\\";\",\n        \"tITLEcASEoVER = 9000;\"\n      ],\n      \"solutions\": [\n        \"var studlyCapVar;\\nvar properCamelCase;\\nvar titleCaseOver;\\n\\nstudlyCapVar = 10;\\nproperCamelCase = \\\"A String\\\";\\ntitleCaseOver = 9000;\"\n      ],\n      \"tests\": [\n        \"assert(typeof studlyCapVar !== 'undefined' && studlyCapVar === 10, 'message: <code>studlyCapVar</code> 应该被定义并且值为 <code>10</code>');\",\n        \"assert(typeof properCamelCase !== 'undefined' && properCamelCase === \\\"A String\\\", 'message: <code>properCamelCase</code> 应该被定义并且值为 <code>\\\"A String\\\"</code>');\",\n        \"assert(typeof titleCaseOver !== 'undefined' && titleCaseOver === 9000, 'message: <code>titleCaseOver</code> 应该被定义并且值为 <code>9000</code>');\",\n        \"assert(code.match(/studlyCapVar/g).length === 2, 'message: <code>studlyCapVar</code> 应该同时在声明和赋值时使用驼峰命名法');\",\n        \"assert(code.match(/properCamelCase/g).length === 2, 'message: <code>properCamelCase</code> 应该同时在声明和赋值时使用驼峰命名法');\",\n        \"assert(code.match(/titleCaseOver/g).length === 2, 'message: <code>titleCaseOver</code> 应该同时在声明和赋值时使用驼峰命名法');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 1\n    },\n    {\n      \"id\": \"cf1111c1c11feddfaeb3bdef\",\n      \"title\": \"Add Two Numbers with JavaScript\",\n      \"description\": [\n        \"现在让我们来尝试在JavaScript中做加法运算。\",\n        \"JavaScript 中使用 <code>+</code> 号来让两个数字执行加法运算。\",\n        \"\",\n        \"<strong>举例</strong>\",\n        \"<blockquote>myVar = 5 + 10; // 等于 15</blockquote>\",\n        \"\",\n        \"<h4>任务</h4>\",\n        \"改变数字 <code>0</code> 让变量 sum 的值为 <code>20</code>.\"\n      ],\n      \"challengeSeed\": [\n        \"var sum = 10 + 0;\",\n        \"\"\n      ],\n      \"tail\": [\n        \"(function(z){return 'sum='+z;})(sum);\"\n      ],\n      \"solutions\": [\n        \"var sum = 10 + 10;\"\n      ],\n      \"tests\": [\n        \"assert(sum === 20, 'message: <code>sum</code> 应该等于 <code>20</code>');\",\n        \"assert(/\\\\+/.test(code), 'message: 要使用 <code>+</code> 运算符');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 1\n    },\n    {\n      \"id\": \"cf1111c1c11feddfaeb4bdef\",\n      \"title\": \"Subtract One Number from Another with JavaScript\",\n      \"description\": [\n        \"我们也可以在 JavaScript 中执行减法运算。\",\n        \"JavaScript 中使用 <code>-</code> 来做减法运算。\",\n        \"\",\n        \"<strong>举例</strong>\",\n        \"<blockquote>myVar = 12 - 6; // 等于 6</blockquote>\",\n        \"\",\n        \"<h4>任务</h4>\",\n        \"改变数字 <code>0</code> 让变量 difference 的值为 <code>12</code>。\"\n      ],\n      \"challengeSeed\": [\n        \"var difference = 45 - 0;\",\n        \"\",\n        \"\"\n      ],\n      \"tail\": [\n        \"(function(z){return 'difference='+z;})(difference);\"\n      ],\n      \"solutions\": [\n        \"var difference = 45 - 33;\"\n      ],\n      \"tests\": [\n        \"assert(difference === 12, 'message: 需要使 <code>difference</code> 的值等于 12.');\",\n        \"assert((code).match(/difference/g).length === 1,'message: 只能修改第一行代码');\",\n        \"assert(/\\\\d+\\\\s*-\\\\s*\\\\d+/.test(code),'message: 使用 <code>-</code> 运算符');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 1\n    },\n    {\n      \"id\": \"cf1231c1c11feddfaeb5bdef\",\n      \"title\": \"Multiply Two Numbers with JavaScript\",\n      \"description\": [\n        \"我们也可在 JavaScript 中使用乘法运算。\",\n        \"JavaScript 使用这个 <code>*</code> 符号来让两个数字相乘。\",\n        \"\",\n        \"<strong>举例</strong>\",\n        \"<blockquote>myVar = 13 * 13; // 把 169 赋值给 myVar</blockquote>\",\n        \"\",\n        \"<h4>任务</h4>\",\n        \"改变数值 <code>0</code> 来让变量 product 的值等于 <code>80</code>。\"\n      ],\n      \"challengeSeed\": [\n        \"var product = 8 * 0;\",\n        \"\",\n        \"\"\n      ],\n      \"tail\": [\n        \"(function(z){return 'product = '+z;})(product);\"\n      ],\n      \"solutions\": [\n        \"var product = 8 * 10;\"\n      ],\n      \"tests\": [\n        \"assert(product === 80,'message: 需要使 <code>product</code> 的值等于 80');\",\n        \"assert(/\\\\*/.test(code), 'message: 使用 <code>*</code> 运算符');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 1\n    },\n    {\n      \"id\": \"cf1111c1c11feddfaeb6bdef\",\n      \"title\": \"Divide One Number by Another with JavaScript\",\n      \"description\": [\n        \"我们可以在 JavaScript 中做除法运算。\",\n        \"JavaScript 中使用 <code>/</code> 符号做除法运算。\",\n        \"\",\n        \"<strong>举例</strong>\",\n        \"<blockquote>myVar = 16 / 2; // 把 8 赋值给 myVar</blockquote>\",\n        \"\",\n        \"<h4>任务</h4>\",\n        \"改变数值<code>0</code>来让变量 <code>quotient</code> 的值等于<code>2</code>。\"\n      ],\n      \"challengeSeed\": [\n        \"var quotient = 66 / 0;\",\n        \"\",\n        \"\"\n      ],\n      \"tail\": [\n        \"(function(z){return 'quotient = '+z;})(quotient);\"\n      ],\n      \"solutions\": [\n        \"var quotient = 66 / 33;\"\n      ],\n      \"tests\": [\n        \"assert(quotient === 2, 'message: 需要使 <code>quotient</code> 的值等于 2.');\",\n        \"assert(/\\\\d+\\\\s*\\\\/\\\\s*\\\\d+/.test(code), 'message: 使用 <code>/</code> 运算符');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 1\n    },\n    {\n      \"id\": \"56533eb9ac21ba0edf2244ac\",\n      \"title\": \"Increment a Number with JavaScript\",\n      \"description\": [\n        \"使用 <code>++</code> ，我们可以很容易地对变量进行自增或者<code>+1</code>运算。\",\n        \"<code>i++;</code>\",\n        \"等效于\",\n        \"<code>i = i + 1;</code>\",\n        \"<strong>提示</strong><br><code>i++;</code>这种写法，省去了书写=符号的必要。\",\n        \"<h4>任务</h4>\",\n        \"重写代码，使用 <code>++</code> 来对变量 <code>myVar</code> 进行自增操作。\"\n      ],\n      \"releasedOn\": \"January 1, 2016\",\n      \"challengeSeed\": [\n        \"var myVar = 87;\",\n        \"\",\n        \"// 请只修改这条注释以下的代码\",\n        \"myVar = myVar + 1;\",\n        \"\"\n      ],\n      \"tail\": [\n        \"(function(z){return 'myVar = ' + z;})(myVar);\"\n      ],\n      \"solutions\": [\n        \"var myVar = 87;\\nmyVar++;\"\n      ],\n      \"tests\": [\n        \"assert(myVar === 88, 'message: <code>myVar</code> 应该等于 <code>88</code>');\",\n        \"assert(/myVar\\\\s*[+]{2}/.test(code), 'message: 使用 <code>++</code> 运算符');\",\n        \"assert(/var myVar = 87;/.test(code), 'message: 不要修改注释上方的代码');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 1\n    },\n    {\n      \"id\": \"56533eb9ac21ba0edf2244ad\",\n      \"title\": \"Decrement a Number with JavaScript\",\n      \"description\": [\n        \"使用自减符号 <code>--</code> ，你可以很方便地对一个变量执行 <dfn>自减</dfn> 或者减一操作。\",\n        \"<code>i--;</code>\",\n        \"等效于\",\n        \"<code>i = i - 1;</code>\",\n        \"<strong>提示</strong><br><code>i--;</code>这种写法，省去了书写等号的必要。\",\n        \"<h4>任务</h4>\",\n        \"重写代码，使用 <code>--</code> 符号对 <code>myVar</code> 执行自减操作。\"\n      ],\n      \"releasedOn\": \"January 1, 2016\",\n      \"challengeSeed\": [\n        \"var myVar = 11;\",\n        \"\",\n        \"// 请只修改这条注释以下的代码\",\n        \"myVar = myVar - 1;\",\n        \"\"\n      ],\n      \"tail\": [\n        \"(function(z){return 'myVar = ' + z;})(myVar);\"\n      ],\n      \"solutions\": [\n        \"var myVar = 11;\\nmyVar--;\"\n      ],\n      \"tests\": [\n        \"assert(myVar === 10, 'message: <code>myVar</code> 应该等于 <code>10</code>');\",\n        \"assert(/myVar\\\\s*[-]{2}/.test(code), 'message: 对<code>myVar</code>使用 <code>--</code> 运算符 ');\",\n        \"assert(/var myVar = 11;/.test(code), 'message: 不要修改上面的代码');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 1\n    },\n    {\n      \"id\": \"cf1391c1c11feddfaeb4bdef\",\n      \"title\": \"Create Decimal Numbers with JavaScript\",\n      \"description\": [\n        \"我们也可以把小数存储到变量中。小数也被称作 <dfn>浮点数</dfn> 。\",\n        \"<strong>提示</strong><br>不是所有的实数都可以用 <dfn>浮点数</dfn> 来表示。因为可能存在四舍五入的错误，<a href=\\\"https://en.wikipedia.org/wiki/Floating_point#Accuracy_problems\\\" target=\\\"_blank\\\">详情在这儿</a>。\",\n        \"<h4>任务</h4>\",\n        \"创建一个变量 <code>myDecimal</code> 并给它赋值一个浮点数。 (例如 <code>5.21</code>)。\"\n      ],\n      \"challengeSeed\": [\n        \"var ourDecimal = 5.7;\",\n        \"\",\n        \"// 请把你的代码写在这条注释以下\",\n        \"\",\n        \"\"\n      ],\n      \"tail\": [\n        \"(function(){if(typeof myDecimal !== \\\"undefined\\\"){return myDecimal;}})();\"\n      ],\n      \"solutions\": [\n        \"var myDecimal = 9.9;\"\n      ],\n      \"tests\": [\n        \"assert(typeof myDecimal === \\\"number\\\", 'message: <code>myDecimal</code> 应该是一个数字');\",\n        \"assert(myDecimal % 1 != 0, 'message: <code>myDecimal</code> 应该包含小数点'); \"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 1\n    },\n    {\n      \"id\": \"bd7993c9c69feddfaeb7bdef\",\n      \"title\": \"Multiply Two Decimals with JavaScript\",\n      \"description\": [\n        \"在 JavaScript 中，你也可以用小数进行计算，就像整数一样。\",\n        \"让我们把两个小数相乘，并得到它们相乘的结果（product）。\",\n        \"<h4>任务</h4>\",\n        \"改变 <code>0.0</code> 的数值让变量<code>product</code>的值等于 <code>5.0</code>。\"\n      ],\n      \"challengeSeed\": [\n        \"var product = 2.0 * 0.0;\",\n        \"\",\n        \"\"\n      ],\n      \"tail\": [\n        \"(function(y){return 'product = '+y;})(product);\"\n      ],\n      \"solutions\": [\n        \"var product = 2.0 * 2.5;\"\n      ],\n      \"tests\": [\n        \"assert(product === 5.0, 'message: <code>product</code> 的值应该等于 <code>5.0</code>.');\",\n        \"assert(/\\\\*/.test(code), 'message: 需要使用 <code>*</code> 运算符');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 1\n    },\n    {\n      \"id\": \"bd7993c9ca9feddfaeb7bdef\",\n      \"title\": \"Divide one Decimal by Another with JavaScript\",\n      \"description\": [\n        \"现在让我们来用一个小数做除法操作。\",\n        \"<h4>任务</h4>\",\n        \"改变数值 <code>0.0</code> 的值让变量 <code>quotient</code> 的值等于 <code>2.2</code>.\"\n      ],\n      \"challengeSeed\": [\n        \"var quotient = 0.0 / 2.0;\",\n        \"\",\n        \"\"\n      ],\n      \"tail\": [\n        \"(function(y){return 'quotient = '+y;})(quotient);\"\n      ],\n      \"solutions\": [\n        \"var quotient = 4.4 / 2.0;\"\n      ],\n      \"tests\": [\n        \"assert(quotient === 2.2, 'message: <code>quotient</code> 的值应该等于 <code>2.2</code>.');\",\n        \"assert(/\\\\//.test(code), 'message: 需要使用 <code>/</code> 运算符');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 1\n    },\n    {\n      \"id\": \"56533eb9ac21ba0edf2244ae\",\n      \"title\": \"Finding a Remainder in JavaScript\",\n      \"description\": [\n        \"现在我们用<code>%</code>运算符来取余。\",\n        \"<strong>举例</strong>\",\n        \"<blockquote>5 % 2 = 1</blockquote>\",\n        \"<strong>用法</strong><br>在数学中，看一个数是奇数还是偶数，只需要看这个数除以2得到的余数是0还是1。  \",\n        \"<blockquote>17 % 2 = 1 (17 is 奇数)<br>48 % 2 = 0 (48 is 偶数)</blockquote>\",\n        \"<h4>任务</h4>\",\n        \"使用 <code>%</code> 操作符，计算11除以3剩下的余数，并把余数赋给变量remainder。\"\n      ],\n      \"releasedOn\": \"January 1, 2016\",\n      \"challengeSeed\": [\n        \"// 请只修改这条注释以下的代码\",\n        \"\",\n        \"var remainder;\",\n        \"\"\n      ],\n      \"tail\": [\n        \"(function(y){return 'remainder = '+y;})(remainder);\"\n      ],\n      \"solutions\": [\n        \"var remainder =  11 % 3;\"\n      ],\n      \"tests\": [\n        \"assert(remainder === 2, 'message: <code>remainder</code> 的值应该等于 <code>2</code>');\",\n        \"assert(/\\\\d+\\\\s*%\\\\s*\\\\d+/.test(code), 'message: 需要使用 <code>%</code> 运算符');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 1\n    },\n    {\n      \"id\": \"56533eb9ac21ba0edf2244af\",\n      \"title\": \"Assignment with Plus Equals\",\n      \"description\": [\n        \"在编程当中，通常通过赋值来修改变量的内容。请记住，先计算<code>=</code>右边，然后把计算出来的结果赋给左边。\",\n        \"<code>myVar = myVar + 5;</code>\",\n        \"以上是最常见的运算赋值语句，先运算、再赋值。\",\n        \"还有一类操作符是一步到位既做运算也赋值的。\",\n        \"这类操作符的其中一种就是 <code>+=</code> 运算符。\",\n        \"<code>myVar += 5;</code> 也是把数值 <code>5</code> 加到变量 <code>myVar</code>上。\",\n        \"<h4>任务</h4>\",\n        \"使用 <code>+=</code> 操作符实现同样的效果。\"\n      ],\n      \"releasedOn\": \"January 1, 2016\",\n      \"challengeSeed\": [\n        \"var a = 3;\",\n        \"var b = 17;\",\n        \"var c = 12;\",\n        \"\",\n        \"// 请只修改这条注释以下的代码\",\n        \"\",\n        \"a = a + 12;\",\n        \"b = 9 + b;\",\n        \"c = c + 7;\",\n        \"\"\n      ],\n      \"tail\": [\n        \"(function(a,b,c){ return \\\"a = \\\" + a + \\\", b = \\\" + b + \\\", c = \\\" + c; })(a,b,c);\"\n      ],\n      \"solutions\": [\n        \"var a = 3;\\nvar b = 17;\\nvar c = 12;\\n\\na += 12;\\nb += 9;\\nc += 7;\"\n      ],\n      \"tests\": [\n        \"assert(a === 15, 'message: <code>a</code> 应该等于 <code>15</code>');\",\n        \"assert(b === 26, 'message: <code>b</code> 应该等于 <code>26</code>');\",\n        \"assert(c === 19, 'message: <code>c</code> 应该等于 <code>19</code>');\",\n        \"assert(code.match(/\\\\+=/g).length === 3, 'message: 你应该对每个变量使用 <code>+=</code> 操作符');\",\n        \"assert(/var a = 3;/.test(code) && /var b = 17;/.test(code) && /var c = 12;/.test(code), 'message: 不要修改上面的代码');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 1\n    },\n    {\n      \"id\": \"56533eb9ac21ba0edf2244b0\",\n      \"title\": \"Assignment with Minus Equals\",\n      \"description\": [\n        \"与 <code>+=</code> 操作符类似，<code>-=</code> 操作符用来对一个变量进行减法赋值操作。\",\n        \"<code>myVar = myVar - 5;</code>\",\n        \"将会从变量 <code>myVar</code> 中减去数值 <code>5</code>。也可以写成这种形式：\",\n        \"<code>myVar -= 5;</code>\",\n        \"<h4>任务</h4>\",\n        \"使用 <code>-=</code> 操作符实现同样的效果。\"\n      ],\n      \"releasedOn\": \"January 1, 2016\",\n      \"challengeSeed\": [\n        \"var a = 11;\",\n        \"var b = 9;\",\n        \"var c = 3;\",\n        \"\",\n        \"// 请只修改这条注释以下的代码\",\n        \"\",\n        \"a = a - 6;\",\n        \"b = b - 15;\",\n        \"c = c - 1;\",\n        \"\",\n        \"\"\n      ],\n      \"tail\": [\n        \"(function(a,b,c){ return \\\"a = \\\" + a + \\\", b = \\\" + b + \\\", c = \\\" + c; })(a,b,c);\"\n      ],\n      \"solutions\": [\n        \"var a = 11;\\nvar b = 9;\\nvar c = 3;\\n\\na -= 6;\\nb -= 15;\\nc -= 1;\\n\\n\"\n      ],\n      \"tests\": [\n        \"assert(a === 5, 'message: <code>a</code> 应该等于 <code>5</code>');\",\n        \"assert(b === -6, 'message: <code>b</code> 应该等于 <code>-6</code>');\",\n        \"assert(c === 2, 'message: <code>c</code> 应该等于 <code>2</code>');\",\n        \"assert(code.match(/-=/g).length === 3, 'message: 应该对每个变量使用 <code>-=</code> 操作符');\",\n        \"assert(/var a = 11;/.test(code) && /var b = 9;/.test(code) && /var c = 3;/.test(code), 'message: 不要修改上面的代码');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 1\n    },\n    {\n      \"id\": \"56533eb9ac21ba0edf2244b1\",\n      \"title\": \"Assignment with Times Equals\",\n      \"description\": [\n        \"<code>*=</code> 操作符是让变量与一个数相乘并赋值。\",\n        \"<code>myVar = myVar * 5;</code>\",\n        \"将会把变量 <code>myVar</code> 与数值 <code>5</code>相乘。也可以写作这样的形式: \",\n        \"<code>myVar *= 5;</code>\",\n        \"<h4>任务</h4>\",\n        \"使用 <code>*=</code>操作符实现同样的效果。\"\n      ],\n      \"releasedOn\": \"January 1, 2016\",\n      \"challengeSeed\": [\n        \"var a = 5;\",\n        \"var b = 12;\",\n        \"var c = 4.6;\",\n        \"\",\n        \"// 请只修改这条注释以下的代码\",\n        \"\",\n        \"a = a * 5;\",\n        \"b = 3 * b;\",\n        \"c = c * 10;\",\n        \"\",\n        \"\"\n      ],\n      \"tail\": [\n        \"(function(a,b,c){ return \\\"a = \\\" + a + \\\", b = \\\" + b + \\\", c = \\\" + c; })(a,b,c);\"\n      ],\n      \"solutions\": [\n        \"var a = 5;\\nvar b = 12;\\nvar c = 4.6;\\n\\na *= 5;\\nb *= 3;\\nc *= 10;\"\n      ],\n      \"tests\": [\n        \"assert(a === 25, 'message: <code>a</code> 应该等于 <code>25</code>');\",\n        \"assert(b === 36, 'message: <code>b</code> 应该等于 <code>36</code>');\",\n        \"assert(c === 46, 'message: <code>c</code> 应该等于 <code>46</code>');\",\n        \"assert(code.match(/\\\\*=/g).length === 3, 'message: 应该对每个变量使用 <code>*=</code> 操作符');\",\n        \"assert(/var a = 5;/.test(code) && /var b = 12;/.test(code) && /var c = 4\\\\.6;/.test(code), 'message: 不要修改上面的代码');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 1\n    },\n    {\n      \"id\": \"56533eb9ac21ba0edf2244b2\",\n      \"title\": \"Assignment with Divided by Equals\",\n      \"description\": [\n        \"<code>/=</code> 操作符是让变量与另一个数相除并赋值。\",\n        \"<code>myVar = myVar / 5;</code>\",\n        \"会把变量 <code>myVar</code> 的值除于 <code>5</code>。等价于: \",\n        \"<code>myVar /= 5;</code>\",\n        \"<h4>任务</h4>\",\n        \"使用 <code>/=</code>操作符实现同样的效果。\"\n      ],\n      \"releasedOn\": \"January 1, 2016\",\n      \"challengeSeed\": [\n        \"var a = 48;\",\n        \"var b = 108;\",\n        \"var c = 33;\",\n        \"\",\n        \"// 请只修改这条注释以下的代码\",\n        \"\",\n        \"a = a / 12;\",\n        \"b = b / 4;\",\n        \"c = c / 11;\",\n        \"\"\n      ],\n      \"tail\": [\n        \"(function(a,b,c){ return \\\"a = \\\" + a + \\\", b = \\\" + b + \\\", c = \\\" + c; })(a,b,c);\"\n      ],\n      \"solutions\": [\n        \"var a = 48;\\nvar b = 108;\\nvar c = 33;\\n\\na /= 12;\\nb /= 4;\\nc /= 11;\"\n      ],\n      \"tests\": [\n        \"assert(a === 4, 'message: <code>a</code> 应该等于 <code>4</code>');\",\n        \"assert(b === 27, 'message: <code>b</code> 应该等于 <code>27</code>');\",\n        \"assert(c === 3, 'message: <code>c</code> 应该等于 <code>3</code>');\",\n        \"assert(code.match(/\\\\/=/g).length === 3, 'message: 应该对每个变量使用 <code>/=</code> 操作符');\",\n        \"assert(/var a = 48;/.test(code) && /var b = 108;/.test(code) && /var c = 33;/.test(code), 'message: 不要修改上面的代码');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 1\n    },\n    {\n      \"id\": \"56533eb9ac21ba0edf2244b3\",\n      \"title\": \"Convert Celsius to Fahrenheit\",\n      \"description\": [\n        \"为了测试你的学习效果，我们来做一个摄氏度转华氏度的小应用。\",\n        \"从<code>Celsius</code>摄氏度转换为<code>Fahrenheit</code>华氏度的算法是：摄氏度的温度乘于9除于5，再加上32。\",\n        \"创建一个变量 <code>fahrenheit</code>，然后计算出摄氏度对应的华氏度。\"\n      ],\n      \"releasedOn\": \"January 1, 2016\",\n      \"challengeSeed\": [\n        \"function convert(celsius) {\",\n        \"  // 请把你的代码写在这条注释以下\",\n        \"  \",\n        \"\",\n        \"  // 请把你的代码写在这条注释以上\",\n        \"    return fahrenheit;\",\n        \"}\",\n        \"\",\n        \"convert(30);  // 你可以修改这一行来测试你的代码\"\n      ],\n      \"solutions\": [\n        \"function convert(celsius) {\\n  var fahrenheit = celsius * 9/5 + 32;\\n  if ( typeof fahrenheit !== 'undefined' ) {\\n  return fahrenheit;\\n  } else {\\n    return 'fahrenheit not defined';\\n  }\\n}\"\n      ],\n      \"tests\": [\n        \"assert(typeof convert(0) === 'number', 'message: <code>convert(0)</code> 应该返回一个数字');\",\n        \"assert(convert(-30) === -22, 'message: <code>convert(-30)</code> 应该返回 <code>-22</code>');\",\n        \"assert(convert(-10) === 14, 'message: <code>convert(-10)</code> 应该返回 <code>14</code>');\",\n        \"assert(convert(0) === 32, 'message: <code>convert(0)</code> 应该返回 <code>32</code>');\",\n        \"assert(convert(20) === 68, 'message: <code>convert(20)</code> 应该返回 <code>68</code>');\",\n        \"assert(convert(30) === 86, 'message: <code>convert(30)</code> 应该返回 <code>86</code>');\"\n      ],\n      \"type\": \"checkpoint\",\n      \"challengeType\": 1\n    },\n    {\n      \"id\": \"bd7123c9c444eddfaeb5bdef\",\n      \"title\": \"Declare String Variables\",\n      \"description\": [\n        \"先前我们使用过的代码：\",\n        \"<code>var myName = \\\"your name\\\";</code>\",\n        \"<code>\\\"your name\\\"</code> 被称作 <dfn>字符串</dfn>。 字符串是用单或双引号包裹起来的一连串的零个或多个字符。\",\n        \"<h4>任务</h4>\",\n        \"创建两个新的 <code>字符串</code> 变量：<code>myFirstName</code> 和 <code>myLastName</code> 分别为它们赋上你的姓和名的值。\"\n      ],\n      \"challengeSeed\": [\n        \"// 举例\",\n        \"var firstName = \\\"Alan\\\";\",\n        \"var lastName = \\\"Turing\\\";\",\n        \"\",\n        \"// 请把你的代码写在这条注释以下\",\n        \"\",\n        \"\",\n        \"\"\n      ],\n      \"tail\": [\n        \"if(typeof myFirstName !== \\\"undefined\\\" && typeof myLastName !== \\\"undefined\\\"){(function(){return myFirstName + ', ' + myLastName;})();}\"\n      ],\n      \"solutions\": [\n        \"var myFirstName = \\\"Alan\\\";\\nvar myLastName = \\\"Turing\\\";\"\n      ],\n      \"tests\": [\n        \"assert((function(){if(typeof myFirstName !== \\\"undefined\\\" && typeof myFirstName === \\\"string\\\" && myFirstName.length > 0){return true;}else{return false;}})(), 'message: <code>myFirstName</code> 应该是一个字符串,并且至少包含一个字符.');\",\n        \"assert((function(){if(typeof myLastName !== \\\"undefined\\\" && typeof myLastName === \\\"string\\\" && myLastName.length > 0){return true;}else{return false;}})(), 'message: <code>myLastName</code> 应该是一个字符串,并且至少包含一个字符.');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 1\n    },\n    {\n      \"id\": \"56533eb9ac21ba0edf2244b5\",\n      \"title\": \"Escaping Literal Quotes in Strings\",\n      \"description\": [\n        \"当你定义一个字符串必须要用单引号或双引号来包裹它。那么当你需要在字符串中使用一个: <code>\\\"</code> 或者 <code>'</code> 时该怎么办呢?\",\n        \"在 JavaScript 中，你可以通过在引号前面使用 <dfn>反斜杠</dfn> (<code>\\\\</code>) 来转义引号。\",\n        \"<code>var sampleStr = \\\"Alan said, \\\\\\\"Peter is learning JavaScript\\\\\\\".\\\";</code>\",\n        \"这标志着提醒 JavaScript 单引号或双引号并不是字符串的结尾，而是出现在字符串内的字符。所以，如果你要打印字符串到控制台，你将得到：\",\n        \"<code>Alan said, \\\"Peter is learning JavaScript\\\".</code>\",\n        \"<h4>任务</h4>\",\n        \"使用 <dfn>反斜杠</dfn> 将一个字符串赋值给变量 <code>myStr</code>，以便如果你要打印到控制台，你会看到：\",\n        \"<code>I am a \\\"double quoted\\\" string inside \\\"double quotes\\\"</code>\"\n      ],\n      \"releasedOn\": \"January 1, 2016\",\n      \"challengeSeed\": [\n        \"var myStr; // 请修改这一行\",\n        \"\",\n        \"\"\n      ],\n      \"tail\": [\n        \"(function(){\",\n        \"  if(typeof myStr === 'string') {\",\n        \"    return \\\"myStr = \\\" + myStr;\",\n        \"  } else {\",\n        \"    return \\\"myStr is undefined\\\";\",\n        \"  }\",\n        \"})();\"\n      ],\n      \"solutions\": [\n        \"var myStr = \\\"I am a \\\\\\\"double quoted\\\\\\\" string inside \\\\\\\"double quotes\\\\\\\"\\\";\"\n      ],\n      \"tests\": [\n        \"assert(code.match(/\\\\\\\\\\\"/g).length === 4 && code.match(/[^\\\\\\\\]\\\"/g).length === 2, 'message: 你的代码中应该包含两个双引号 (<code>&quot;</code>) 以及四个转义的双引号 (<code>&#92;&quot;</code>) ');\",\n        \"assert(myStr === \\\"I am a \\\\\\\"double quoted\\\\\\\" string inside \\\\\\\"double quotes\\\\\\\"\\\", 'message: <code>myStr</code> 应该的值应该为 (<code>\\\"I am a \\\"double quoted\\\" string inside \\\"double quotes\\\"\\\"</code>).');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 1\n    },\n    {\n      \"id\": \"56533eb9ac21ba0edf2244b4\",\n      \"title\": \"Quoting Strings with Single Quotes\",\n      \"description\": [\n        \"在 JavaScript 中的 <dfn>字符串</dfn> 要用单引号或双引号来包裹它，只要你在开始和结束都使用相同类型的引号，单引号和双引号的功能在JavaScript中是相同的。\",\n        \"<code>\\\"This string has \\\\\\\"double quotes\\\\\\\" in it\\\"</code>\",\n        \"当我们需要在字符串中使用与开头结尾相同的引号时，我们需要对引号进行 <dfn>转义</dfn> 。如果你有很多双引号的字符串，使用转义字符可能导致难以阅读。这时候可以使用单引号。\",\n        \"<code>'This string has \\\"double quotes\\\" in it. And \\\"probably\\\" lots of them.'</code>\",\n        \"<h4>任务</h4>\",\n        \"更改myStr字符串的双引号为单引号，并移除转义符号。\"\n      ],\n      \"releasedOn\": \"January 1, 2016\",\n      \"challengeSeed\": [\n        \"var myStr = \\\"<a href=\\\\\\\"http://www.example.com\\\\\\\" target=\\\\\\\"_blank\\\\\\\">Link</a>\\\";\",\n        \"\",\n        \"\"\n      ],\n      \"tail\": [\n        \"(function() { return \\\"myStr = \\\" + myStr; })();\"\n      ],\n      \"solutions\": [\n        \"var myStr = '<a href=\\\"http://www.example.com\\\" target=\\\"_blank\\\">Link</a>';\"\n      ],\n      \"tests\": [\n        \"assert(!/\\\\\\\\/g.test(code), 'message: 移除所有的 <code>反斜线</code> (<code>\\\\</code>)');\",\n        \"assert(code.match(/\\\"/g).length === 4 && code.match(/'/g).length === 2, 'message: 你的代码中应该包含两个单引号 <code>&#39;</code> 以及四个双引号 <code>&quot;</code>');\",\n        \"assert(myStr === '<a href=\\\"http://www.example.com\\\" target=\\\"_blank\\\">Link</a>', 'message: 仅仅移除反斜线 <code>\\\\</code>.');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 1\n    },\n    {\n      \"id\": \"56533eb9ac21ba0edf2244b6\",\n      \"title\": \"Escape Sequences in Strings\",\n      \"description\": [\n        \"字符串中的转义序列\",\n        \"引号不是字符串中唯一的可以被转义字符。下面是常见的转义序列列表:\",\n        \"<table class=\\\"table table-striped\\\"><thead><tr><th>Code</th><th>Output</th></tr></thead><tbody><tr><td>\\\\'</td><td>单引号</td></tr><tr><td>\\\\\\\"</td><td>双引号</td></tr><tr><td>\\\\\\\\</td><td>反斜杠符</td></tr><tr><td>\\\\n</td><td>换行符</td></tr><tr><td>\\\\r</td><td>回车符</td></tr><tr><td>\\\\t</td><td>制表符</td></tr><tr><td>\\\\b</td><td>退格符</td></tr><tr><td>\\\\f</td><td>换页符</td></tr></tbody></table>\",\n        \"<em>注意，如果你想要显示一个反斜杠就必须要转义它。</em>\",\n        \"<h4>任务</h4>\",\n        \"按照下面的顺序，并且用空格来分割：<br><code>反斜杠 制表符 退格符 回车符 换行符</code> 并把它赋值给变量 <code>myStr</code>\"\n      ],\n      \"releasedOn\": \"January 1, 2016\",\n      \"challengeSeed\": [\n        \"var myStr; // 请修改这一行\",\n        \"\",\n        \"\"\n      ],\n      \"tail\": [\n        \"(function(){\",\n        \"if (myStr !== undefined){\",\n        \"return 'myStr = '+ JSON.stringify(myStr);}\",\n        \"else{return null;}})();\"\n      ],\n      \"solutions\": [\n        \"var myStr = \\\"\\\\\\\\ \\\\t \\\\b \\\\r \\\\n\\\";\"\n      ],\n      \"tests\": [\n        \"assert(myStr === \\\"\\\\\\\\ \\\\t \\\\b \\\\r \\\\n\\\", 'message: <code>myStr</code> 应该包含被转义的字符, 并且按照 <code>反斜杠 制表符 退格符 回车符 换行符</code> 的顺序用空格分开');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 1\n    },\n    {\n      \"id\": \"56533eb9ac21ba0edf2244b7\",\n      \"title\": \"Concatenating Strings with Plus Operator\",\n      \"description\": [\n        \"在 JavaScript 中，当 <code>+</code> 操作符与 <code>字符串</code> 一起使用的时候，它被称作 <dfn>连接</dfn> 操作符。你可以通过和其他字符串<dfn>连接</dfn> 来创建一个新的字符串。\",\n        \"<strong>举个例子</strong>\",\n        \"<blockquote>'My name is Alan,' + ' I concatenate.'</blockquote>\",\n        \"<strong>注意</strong><br>当心空格。连接操作不会添加两个字符串之外的空格，所以想加上空格的话，你需要自己在字符串里面添加。\",\n        \"<h4>任务</h4>\",\n        \"使用 <code>+</code> 操作，把字符串 <code>\\\"This is the start. \\\"</code> 和 <code>\\\"This is the end.\\\"</code> 连接起来并赋值给变量 <code>myStr</code>。\"\n      ],\n      \"releasedOn\": \"January 1, 2016\",\n      \"challengeSeed\": [\n        \"// 举例\",\n        \"var ourStr = \\\"I come first. \\\" + \\\"I come second.\\\";\",\n        \"\",\n        \"// 请只修改这条注释以下的代码\",\n        \"\",\n        \"var myStr;\",\n        \"\",\n        \"\"\n      ],\n      \"tail\": [\n        \"(function(){\",\n        \"  if(typeof myStr === 'string') {\",\n        \"    return 'myStr = \\\"' + myStr + '\\\"';\",\n        \"  } else {\",\n        \"    return 'myStr is not a string';\",\n        \"  }\",\n        \"})();\"\n      ],\n      \"solutions\": [\n        \"var ourStr = \\\"I come first. \\\" + \\\"I come second.\\\";\\nvar myStr = \\\"This is the start. \\\" + \\\"This is the end.\\\";\"\n      ],\n      \"tests\": [\n        \"assert(myStr === \\\"This is the start. This is the end.\\\", 'message: <code>myStr</code> 的值应该是 <code>This is the start. This is the end.</code>');\",\n        \"assert(code.match(/([\\\"']).*([\\\"'])\\\\s*\\\\+\\\\s*([\\\"']).*([\\\"'])/g).length > 1, 'message: 使用 <code>+</code> 操作符构建 <code>myStr</code>');\",\n        \"assert(/var\\\\s+myStr/.test(code), 'message: <code>myStr</code> 应该使用 <code>var</code> 关键字来声明.');\",\n        \"assert(/myStr\\\\s*=/.test(code), 'message: 确保有给 <code>myStr</code> 赋值.');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 1\n    },\n    {\n      \"id\": \"56533eb9ac21ba0edf2244b8\",\n      \"title\": \"Concatenating Strings with the Plus Equals Operator\",\n      \"description\": [\n        \"我们还可以使用 <code>+=</code> 运算符来 <dfn>连接</dfn> 字符串到现有字符串的结尾。对于那些非常长的字符串来说，这一操作是非常有用的。\",\n        \"<strong>注意</strong><br>当心空格。连接操作不会添加两个字符串外面的空格，所以如果想要加上空格的话，你需要自己在字符串里面添加。\",\n        \"<h4>任务</h4>\",\n        \"通过使用 <code>+=</code> 操作符来连接这两个字符串:<br><code>\\\"This is the first sentence. \\\"</code> 和 <code>\\\"This is the second sentence.\\\"</code> 并赋给变量 <code>myStr</code>。\"\n      ],\n      \"releasedOn\": \"January 1, 2016\",\n      \"challengeSeed\": [\n        \"// 举例\",\n        \"var ourStr = \\\"I come first. \\\";\",\n        \"ourStr += \\\"I come second.\\\";\",\n        \"\",\n        \"// 请只修改这条注释以下的代码\",\n        \"\",\n        \"var myStr;\",\n        \"\",\n        \"\"\n      ],\n      \"tail\": [\n        \"(function(){\",\n        \"  if(typeof myStr === 'string') {\",\n        \"    return 'myStr = \\\"' + myStr + '\\\"';\",\n        \"  } else {\",\n        \"    return 'myStr is not a string';\",\n        \"  }\",\n        \"})();\"\n      ],\n      \"solutions\": [\n        \"var ourStr = \\\"I come first. \\\";\\nourStr += \\\"I come second.\\\";\\n\\nvar myStr = \\\"This is the first sentence. \\\";\\nmyStr += \\\"This is the second sentence.\\\";\"\n      ],\n      \"tests\": [\n        \"assert(myStr === \\\"This is the first sentence. This is the second sentence.\\\", 'message: <code>myStr</code> 的值应该是 <code>This is the first sentence. This is the second sentence.</code>');\",\n        \"assert(code.match(/\\\\w\\\\s*\\\\+=\\\\s*[\\\"']/g).length > 1 && code.match(/\\\\w\\\\s*\\\\=\\\\s*[\\\"']/g).length > 1, 'message: 使用 <code>+=</code> 操作符创建 <code>myStr</code> 变量');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 1\n    },\n    {\n      \"id\": \"56533eb9ac21ba0edf2244b9\",\n      \"title\": \"Constructing Strings with Variables\",\n      \"description\": [\n        \"有时候你需要创建一个填字风格的字符串。\",\n        \"通过使用连接运算符<code> + </code>，你可以插入一个或多个变量来组成一个字符串。\",\n        \"<h4>任务</h4>\",\n        \"把你的名字赋值给变量 <code>myName</code> ，然后把变量 <code>myName</code> 插入到字符串 <code>\\\"My name is \\\"</code> 和 <code>\\\" and I am swell!\\\"</code>之间，并把连接后的结果赋值给变量 <code>myStr</code>。 \"\n      ],\n      \"releasedOn\": \"January 1, 2016\",\n      \"challengeSeed\": [\n        \"// 举例\",\n        \"var ourName = \\\"Free Code Camp\\\";\",\n        \"var ourStr = \\\"Hello, our name is \\\" + ourName + \\\", how are you?\\\";\",\n        \"\",\n        \"// 请只修改这条注释以下的代码\",\n        \"var myName;\",\n        \"var myStr;\",\n        \"\",\n        \"\"\n      ],\n      \"tail\": [\n        \"(function(){\",\n        \"  var output = [];\",\n        \"  if(typeof myName === 'string') {\",\n        \"    output.push('myName = \\\"' + myName + '\\\"');\",\n        \"  } else {\",\n        \"    output.push('myName is not a string');\",\n        \"  }\",\n        \"  if(typeof myStr === 'string') {\",\n        \"    output.push('myStr = \\\"' + myStr + '\\\"');\",\n        \"  } else {\",\n        \"    output.push('myStr is not a string');\",\n        \"  }\",\n        \"  return output.join('\\\\n');\",\n        \"})();\"\n      ],\n      \"solutions\": [\n        \"var myName = \\\"Bob\\\";\\nvar myStr = \\\"My name is \\\" + myName + \\\" and I am swell!\\\";\"\n      ],\n      \"tests\": [\n        \"assert(typeof myName !== 'undefined' && myName.length > 2, 'message: <code>myName</code> 至少要包含三个字符');\",\n        \"assert(code.match(/[\\\"']\\\\s*\\\\+\\\\s*myName\\\\s*\\\\+\\\\s*[\\\"']/g).length > 0, 'message: 使用两个 <code>+</code> 操作符创建 <code>myStr</code> 变量');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 1\n    },\n    {\n      \"id\": \"56533eb9ac21ba0edf2244ed\",\n      \"title\": \"Appending Variables to Strings\",\n      \"description\": [\n        \"我们不仅可以创建出多行的字符串，还可以使用加等号(<code>+=</code>)运算符来追加变量到字符串上。\",\n        \"<h4>任务</h4>\",\n        \"设置变量 <code>someAdjective</code> 的值，并使用 <code>+=</code> 运算符把它追加到变量 <code>myStr</code> 上。\"\n      ],\n      \"releasedOn\": \"January 1, 2016\",\n      \"challengeSeed\": [\n        \"// 举例\",\n        \"var anAdjective = \\\"awesome!\\\";\",\n        \"var ourStr = \\\"Free Code Camp is \\\";\",\n        \"ourStr += anAdjective;\",\n        \"\",\n        \"// 请只修改这条注释以下的代码\",\n        \"\",\n        \"var someAdjective;\",\n        \"var myStr = \\\"Learning to code is \\\";\",\n        \"\"\n      ],\n      \"tail\": [\n        \"(function(){\",\n        \"  var output = [];\",\n        \"  if(typeof someAdjective === 'string') {\",\n        \"    output.push('someAdjective = \\\"' + someAdjective + '\\\"');\",\n        \"  } else {\",\n        \"    output.push('someAdjective is not a string');\",\n        \"  }\",\n        \"  if(typeof myStr === 'string') {\",\n        \"    output.push('myStr = \\\"' + myStr + '\\\"');\",\n        \"  } else {\",\n        \"    output.push('myStr is not a string');\",\n        \"  }\",\n        \"  return output.join('\\\\n');\",\n        \"})();\"\n      ],\n      \"solutions\": [\n        \"var anAdjective = \\\"awesome!\\\";\\nvar ourStr = \\\"Free Code Camp is \\\";\\nourStr += anAdjective;\\n\\nvar someAdjective = \\\"neat\\\";\\nvar myStr = \\\"Learning to code is \\\";\\nmyStr += someAdjective;\"\n      ],\n      \"tests\": [\n        \"assert(typeof someAdjective !== 'undefined' && someAdjective.length > 2, 'message: <code>someAdjective</code> 应该是一个至少包含三个字符的字符串');\",\n        \"assert(code.match(/\\\\w\\\\s*\\\\+=\\\\s*someAdjective\\\\s*;/).length > 0, 'message: 使用 <code>+=</code> 操作符把 <code>someAdjective</code> 追加到 <code>myStr</code> 的后面');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 1\n    },\n    {\n      \"id\": \"bd7123c9c448eddfaeb5bdef\",\n      \"title\": \"Find the Length of a String\",\n      \"description\": [\n        \"你可以通过在字符串变量或字符串后面写上 <code>.length</code> 来获得字符串变量 <code>字符串</code> 值的长度。\",\n        \"<code>\\\"Alan Peter\\\".length; // 10</code>\",\n        \"例如，我们创建了一个变量 <code>var firstName = \\\"Charles\\\"</code>，我们就可以通过使用 <code>firstName.length</code> 来获得 <code>\\\"Charles\\\"</code> 字符串的长度。\",\n        \"<h4>任务</h4>\",\n        \"使用 <code>.length</code> 属性来获得变量 <code>lastName</code> 的长度，并把它赋值给变量 <code>lastNameLength</code>。\"\n      ],\n      \"challengeSeed\": [\n        \"// 举例\",\n        \"var firstNameLength = 0;\",\n        \"var firstName = \\\"Ada\\\";\",\n        \"\",\n        \"firstNameLength = firstName.length;\",\n        \"\",\n        \"// 初始化变量\",\n        \"var lastNameLength = 0;\",\n        \"var lastName = \\\"Lovelace\\\";\",\n        \"\",\n        \"// 请只修改这条注释以下的代码\",\n        \"\",\n        \"lastNameLength = lastName;\",\n        \"\",\n        \"\"\n      ],\n      \"tail\": [\n        \"if(typeof lastNameLength !== \\\"undefined\\\"){(function(){return lastNameLength;})();}\"\n      ],\n      \"solutions\": [\n        \"var firstNameLength = 0;\\nvar firstName = \\\"Ada\\\";\\nfirstNameLength = firstName.length;\\n\\nvar lastNameLength = 0;\\nvar lastName = \\\"Lovelace\\\";\\nlastNameLength = lastName.length;\"\n      ],\n      \"tests\": [\n        \"assert((function(){if(typeof lastNameLength !== \\\"undefined\\\" && typeof lastNameLength === \\\"number\\\" && lastNameLength === 8){return true;}else{return false;}})(), 'message: <code>lastNameLength</code> 应该等于 8.');\",\n        \"assert((function(){if(code.match(/\\\\.length/gi) && code.match(/\\\\.length/gi).length >= 2 && code.match(/var lastNameLength \\\\= 0;/gi) && code.match(/var lastNameLength \\\\= 0;/gi).length >= 1){return true;}else{return false;}})(), 'message: 你应该使用 <code>.length</code> 获取 <code>lastName</code> 的长度, 像这样: <code>lastName.length</code>.');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 1\n    },\n    {\n      \"id\": \"bd7123c9c549eddfaeb5bdef\",\n      \"title\": \"Use Bracket Notation to Find the First Character in a String\",\n      \"description\": [\n        \"[]叫中括号，{}叫大括号，()叫小括号。\",\n        \"JavaScript中只有字符串类型，没有字符类型。那么如何获取到字符串中的某个字符呢？\",\n        \"我们通过<code>[索引]</code> 来获得对应的字符。\",\n        \"大多数现代编程语言，如JavaScript，不同于人类从1开始计数。它们是从0开始计数，这被称为 <dfn>基于零</dfn> 的索引。\",\n        \"例如, 在单词 \\\"Charles\\\" 中索引0上的字符为 \\\"C\\\"，所以在 <code>var firstName = \\\"Charles\\\"</code> 中，你可以使用 <code>firstName[0]</code> 来获得第一个位置上的字符。\",\n        \"<h4>任务</h4>\",\n        \"使用<code>[索引]</code>来得到变量 <code>lastName</code> 中的第一个字符，并赋给变量 <code>firstLetterOfLastName</code> 。\",\n        \"<strong>提示</strong><br>如果你遇到困难了，不妨看看变量 <code>firstLetterOfFirstName</code> 是如何赋值的。\"\n      ],\n      \"challengeSeed\": [\n        \"// 举例\",\n        \"var firstLetterOfFirstName = \\\"\\\";\",\n        \"var firstName = \\\"Ada\\\";\",\n        \"\",\n        \"firstLetterOfFirstName = firstName[0];\",\n        \"\",\n        \"// 初始化变量\",\n        \"var firstLetterOfLastName = \\\"\\\";\",\n        \"var lastName = \\\"Lovelace\\\";\",\n        \"\",\n        \"// 请只修改这条注释以下的代码\",\n        \"firstLetterOfLastName = lastName;\",\n        \"\"\n      ],\n      \"tail\": [\n        \"(function(v){return v;})(firstLetterOfLastName);\"\n      ],\n      \"solutions\": [\n        \"var firstLetterOfLastName = \\\"\\\";\\nvar lastName = \\\"Lovelace\\\";\\n\\n// Only change code below this line\\nfirstLetterOfLastName = lastName[0];\"\n      ],\n      \"tests\": [\n        \"assert(firstLetterOfLastName === 'L', 'message: <code>firstLetterOfLastName</code> 的值应该是 <code>L</code>.');\",\n        \"assert(code.match(/firstLetterOfLastName\\\\s*=\\\\s*lastName\\\\s*\\\\[\\\\s*\\\\d+\\\\s*\\\\]/), 'message: 你应该使用括号');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 1\n    },\n    {\n      \"id\": \"56533eb9ac21ba0edf2244ba\",\n      \"title\": \"Understand String Immutability\",\n      \"description\": [\n        \"理解字符串的不可变性！当你搞懂不可变性后immutable.js对于你就是小菜一碟了。\",\n        \"在 JavaScript 中，<code>字符串</code> 的值是 <dfn>不可变的</dfn>，这意味着一旦字符串被创建就不能被改变。\",\n        \"例如，下面的代码：\",\n        \"<blockquote>var myStr = \\\"Bob\\\";<br>myStr[0] = \\\"J\\\";</blockquote>\",\n        \"是不会把变量 <code>myStr</code> 的值改变成 \\\"Job\\\" 的，因为变量 <code>myStr</code> 是不可变的。注意，这 <em>并不</em> 意味着 <code>myStr</code> 永远不能被改变，只是字符串字面量 <dfn>string literal</dfn> 的各个字符不能被改变。改变 <code>myStr</code> 中的唯一方法是重新给它赋一个值，就像这样：\",\n        \"<blockquote>var myStr = \\\"Bob\\\";<br>myStr = \\\"Job\\\";</blockquote>\",\n        \"<h4>任务</h4>\",\n        \"把<code>myStr</code> 的值改为<code>Hello World</code>。\"\n      ],\n      \"releasedOn\": \"January 1, 2016\",\n      \"challengeSeed\": [\n        \"// 初始化变量\",\n        \"var myStr = \\\"Jello World\\\";\",\n        \"\",\n        \"// 请只修改这条注释以下的代码\",\n        \"\",\n        \"myStr[0] = \\\"H\\\"; // 请修改这一行\",\n        \"\",\n        \"\"\n      ],\n      \"tail\": [\n        \"(function(v){return \\\"myStr = \\\" + v;})(myStr);\"\n      ],\n      \"solutions\": [\n        \"var myStr = \\\"Jello World\\\";\\nmyStr = \\\"Hello World\\\";\"\n      ],\n      \"tests\": [\n        \"assert(myStr === \\\"Hello World\\\", 'message: <code>myStr</code> 的值应该是 <code>Hello World</code>');\",\n        \"assert(/myStr = \\\"Jello World\\\"/.test(code), 'message: 不要修改上面的代码');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 1\n    },\n    {\n      \"id\": \"bd7123c9c450eddfaeb5bdef\",\n      \"title\": \"Use Bracket Notation to Find the Nth Character in a String\",\n      \"description\": [\n        \"你也可以使用 <code>[索引]</code>来获得一个字符串中的其他位置的字符。\",\n        \"请记住，程序是从 <code>0</code> 开始计数，所以获取第一个字符实际上是[0]。\",\n        \"<h4>任务</h4>\",\n        \"让我们使用<code>[索引]</code>，把 <code>lastName</code> 变量的第三个字符赋值给 <code>thirdLetterOfLastName</code>。\",\n        \"<strong>提示</strong><br>如果你遇到困难了，看看 <code>secondLetterOfFirstName</code> 变量是如何做的。\"\n      ],\n      \"challengeSeed\": [\n        \"// 举例\",\n        \"var firstName = \\\"Ada\\\";\",\n        \"var secondLetterOfFirstName = firstName[1];\",\n        \"\",\n        \"// 初始化变量\",\n        \"var lastName = \\\"Lovelace\\\";\",\n        \"\",\n        \"// 请只修改这条注释以下的代码\",\n        \"var thirdLetterOfLastName = lastName;\",\n        \"\",\n        \"\"\n      ],\n      \"tail\": [\n        \"(function(v){return v;})(thirdLetterOfLastName);\"\n      ],\n      \"solutions\": [\n        \"var lastName = \\\"Lovelace\\\";\\nvar thirdLetterOfLastName = lastName[2];\"\n      ],\n      \"tests\": [\n        \"assert(thirdLetterOfLastName === 'v', 'message: <code>thirdLetterOfLastName</code> 的值应该是 <code>v</code>.');\",\n        \"assert(code.match(/thirdLetterOfLastName\\\\s*=\\\\s*lastName\\\\s*\\\\[\\\\s*\\\\d+\\\\s*\\\\]/), 'message: 你应该使用括号');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 1\n    },\n    {\n      \"id\": \"bd7123c9c451eddfaeb5bdef\",\n      \"title\": \"Use Bracket Notation to Find the Last Character in a String\",\n      \"description\": [\n        \"为了得到一个字符串的最后一个字符，你可以用<code>[字符串的长度减去一]</code>。\",\n        \"例如，在 <code>var firstName = \\\"Charles\\\"</code> 中，你可以这样操作 <code>firstName[firstName.length - 1]</code> 来得到字符串的最后的一个字符。\",\n        \"<h4>任务</h4>\",\n        \"使用 <code>[索引]</code> 来取得 <code>lastName</code> 变量中的最后一个字符。\",\n        \"<strong>提示</strong><br>如果你遇到困难了，不妨看看在 <code>lastLetterOfFirstName</code> 变量上是怎么做的。\"\n      ],\n      \"challengeSeed\": [\n        \"// 举例\",\n        \"var firstName = \\\"Ada\\\";\",\n        \"var lastLetterOfFirstName = firstName[firstName.length - 1];\",\n        \"\",\n        \"// 初始化变量\",\n        \"var lastName = \\\"Lovelace\\\";\",\n        \"\",\n        \"// 请只修改这条注释以下的代码\",\n        \"var lastLetterOfLastName = lastName;\",\n        \"\",\n        \"\"\n      ],\n      \"tail\": [\n        \"(function(v){return v;})(lastLetterOfLastName);\"\n      ],\n      \"solutions\": [\n        \"var firstName = \\\"Ada\\\";\\nvar lastLetterOfFirstName = firstName[firstName.length - 1];\\n\\nvar lastName = \\\"Lovelace\\\";\\nvar lastLetterOfLastName = lastName[lastName.length - 1];\"\n      ],\n      \"tests\": [\n        \"assert(lastLetterOfLastName === \\\"e\\\", 'message: <code>lastLetterOfLastName</code> 应该是 \\\"e\\\".');\",\n        \"assert(code.match(/\\\\.length/g).length === 2, 'message: 你需要使用 <code>.length</code> 获取最后一个字符.');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 1\n    },\n    {\n      \"id\": \"bd7123c9c452eddfaeb5bdef\",\n      \"title\": \"Use Bracket Notation to Find the Nth-to-Last Character in a String\",\n      \"description\": [\n        \"我们既可以获取字符串的最后一个字符，也可以用获取字符串的倒数第N个字符。\",\n        \"例如，你可以这样 <code>firstName[firstName.length - 3]</code> 操作来获得 <code>var firstName = \\\"Charles\\\"</code> 字符串中的倒数第三个字符。\",\n        \"<h4>任务</h4>\",\n        \"使用 <code>[索引]</code> 来获得 <code>lastName</code> 字符串中的倒数第二个字符。\",\n        \"<strong>提示</strong><br>如果你遇到困难了，不妨看看 <code>thirdToLastLetterOfFirstName</code> 变量是如何做到的。\"\n      ],\n      \"challengeSeed\": [\n        \"// 举例\",\n        \"var firstName = \\\"Ada\\\";\",\n        \"var thirdToLastLetterOfFirstName = firstName[firstName.length - 3];\",\n        \"\",\n        \"// 初始化变量\",\n        \"var lastName = \\\"Lovelace\\\";\",\n        \"\",\n        \"// 请只修改这条注释以下的代码\",\n        \"var secondToLastLetterOfLastName = lastName;\",\n        \"\",\n        \"\"\n      ],\n      \"tail\": [\n        \"(function(v){return v;})(secondToLastLetterOfLastName);\"\n      ],\n      \"solutions\": [\n        \"var firstName = \\\"Ada\\\";\\nvar thirdToLastLetterOfFirstName = firstName[firstName.length - 3];\\n\\nvar lastName = \\\"Lovelace\\\";\\nvar secondToLastLetterOfLastName = lastName[lastName.length - 2];\"\n      ],\n      \"tests\": [\n        \"assert(secondToLastLetterOfLastName === 'c', 'message: <code>secondToLastLetterOfLastName</code> 应该是 \\\"c\\\".');\",\n        \"assert(code.match(/\\\\.length/g).length === 2, 'message: 你需要使用 <code>.length</code> 获取倒数第二个字符.');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 1\n    },\n    {\n      \"id\": \"56533eb9ac21ba0edf2244bb\",\n      \"title\": \"Word Blanks\",\n      \"description\": [\n        \"<strong>填词造句</strong>\",\n        \"现在，我们来用字符串的相关知识实现一个造句函数。\",\n        \"通过使用提供的变量参数：名词<code>myNoun</code>、形容词<code>myAdjective</code>、动词<code>myVerb</code>、副词<code>myAdverb</code>，来创建一个新的句子 <code>result</code>。\",\n        \"请注意，在英文中，句中的单词是必须用空格来分隔的\",\n        \"举个例子，如果名词为 <code>\\\"dog\\\"</code>，形容词为 <code>\\\"big\\\"</code>，动词为 <code>\\\"run\\\"</code>，副词为<code>\\\"quickly\\\"</code>，那么函数返回值为 <code>\\\"dog big run quickly\\\"</code> 就是没问题的\",\n        \"此外，为了句子通顺，你可以在包含所有传入单词的前提下自己添加一些其他单词。对于上面的例子，函数返回值为 <code>\\\"That big brown dog just run quickly\\\"</code> 也是没问题的\"\n      ],\n      \"releasedOn\": \"January 1, 2016\",\n      \"challengeSeed\": [\n        \"function wordBlanks(myNoun, myAdjective, myVerb, myAdverb) {\",\n        \"  var result = \\\"\\\";\",\n        \"  // 请把你的代码写在这条注释以下\",\n        \"  \",\n        \"\",\n        \"  // 请把你的代码写在这条注释以上\",\n        \"  return result;\",\n        \"}\",\n        \"\",\n        \"wordBlanks(\\\"dog\\\", \\\"big\\\", \\\"ran\\\", \\\"quickly\\\");  // 你可以修改这一行来测试你的代码\"\n      ],\n      \"tail\": [\n        \"var test1 = wordBlanks(\\\"dog\\\", \\\"big\\\", \\\"ran\\\", \\\"quickly\\\");\",\n        \"var test2 = wordBlanks(\\\"cat\\\", \\\"little\\\", \\\"hit\\\", \\\"slowly\\\");\"\n      ],\n      \"solutions\": [\n        \"function wordBlanks(myNoun, myAdjective, myVerb, myAdverb) {\\n  var result = \\\"\\\";\\n\\n  result = \\\"Once there was a \\\" + myNoun + \\\" which was very \\\" + myAdjective + \\\". \\\";\\n  result += \\\"It \\\" + myVerb + \\\" \\\" + myAdverb + \\\" around the yard.\\\";\\n\\n  return result;\\n}\"\n      ],\n      \"tests\": [\n        \"assert(typeof wordBlanks(\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\") === 'string', 'message: <code>wordBlanks(\\\"\\\",\\\"\\\",\\\"\\\",\\\"\\\")</code> 应该返回一个字符串.');\",\n        \"assert(/\\\\bdog\\\\b/.test(test1) && /\\\\bbig\\\\b/.test(test1) && /\\\\bran\\\\b/.test(test1) && /\\\\bquickly\\\\b/.test(test1),'message: <code>wordBlanks(\\\"dog\\\", \\\"big\\\", \\\"ran\\\", \\\"quickly\\\")</code> 应该包含所有传入的单词并且单词之间要有间隔(可以添加任意修饰的单词).');\",\n        \"assert(/\\\\bcat\\\\b/.test(test2) && /\\\\blittle\\\\b/.test(test2) && /\\\\bhit\\\\b/.test(test2) && /\\\\bslowly\\\\b/.test(test2),'message: <code>wordBlanks(\\\"cat\\\", \\\"little\\\", \\\"hit\\\", \\\"slowly\\\")</code> 应该包含所有传入的单词并且单词之间要有间隔(可以添加任意修饰的单词).');\"\n      ],\n      \"type\": \"checkpoint\",\n      \"challengeType\": 1\n    },\n    {\n      \"id\": \"bd7993c9c69feddfaeb8bdef\",\n      \"title\": \"Store Multiple Values in one Variable using JavaScript Arrays\",\n      \"description\": [\n        \"使用 <code>数组</code>，我们可以在一个地方存储多个数据。\",\n        \"你以左方括号<code>[</code>开始定义一个数组，以右方括号<code>]</code>结束定义，并把每个条目之间用逗号隔开，就像这样：<br><code>var sandwich = [\\\"peanut butter\\\", \\\"jelly\\\", \\\"bread\\\"]</code>。\",\n        \"<h4>任务</h4>\",\n        \"创建一个包含 <code>字符串</code> 和 <code>数字</code> 的数组 <code>myArray</code>。\",\n        \"<strong>提示</strong><br>如果你遇到困难，请参考文本编辑器中的示例代码。\"\n      ],\n      \"challengeSeed\": [\n        \"// 举例\",\n        \"var array = [\\\"John\\\", 23];\",\n        \"\",\n        \"// 请只修改这条注释以下的代码\",\n        \"var myArray = [];\",\n        \"\"\n      ],\n      \"tail\": [\n        \"(function(z){return z;})(myArray);\"\n      ],\n      \"solutions\": [\n        \"var myArray = [\\\"The Answer\\\", 42];\"\n      ],\n      \"tests\": [\n        \"assert(typeof myArray == 'object', 'message: <code>myArray</code> 应该是一个 <code>数组</code>.');\",\n        \"assert(typeof myArray[0] !== 'undefined' && typeof myArray[0] == 'string', 'message: <code>myArray</code> 数组的第一个元素应该是一个 <code>字符串</code>.');\",\n        \"assert(typeof myArray[1] !== 'undefined' && typeof myArray[1] == 'number', 'message: <code>myArray</code> 数组的第二个元素应该是一个 <code>数字</code>.');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 1\n    },\n    {\n      \"id\": \"cf1111c1c11feddfaeb7bdef\",\n      \"title\": \"Nest one Array within Another Array\",\n      \"description\": [\n        \"你也可以在数组中包含其他数组，就像这样: <code>[[\\\"Bulls\\\", 23], [\\\"White Sox\\\", 45]]</code>。这被称为一个 <dfn>多维数组<dfn>。\",\n        \"<h4>任务</h4>\",\n        \"创建一个名为 <code>myArray</code>的多维数组。\"\n      ],\n      \"challengeSeed\": [\n        \"// 举例\",\n        \"var ourArray = [[\\\"the universe\\\", 42], [\\\"everything\\\", 101010]];\",\n        \"\",\n        \"// 请只修改这条注释以下的代码\",\n        \"var myArray = [];\",\n        \"\"\n      ],\n      \"tail\": [\n        \"if(typeof myArray !== \\\"undefined\\\"){(function(){return myArray;})();}\"\n      ],\n      \"solutions\": [\n        \"var myArray = [[1,2,3]];\"\n      ],\n      \"tests\": [\n        \"assert(Array.isArray(myArray) && myArray.some(Array.isArray), 'message: <code>myArray</code> 应该包含至少一个嵌入的数组');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 1\n    },\n    {\n      \"id\": \"56bbb991ad1ed5201cd392ca\",\n      \"title\": \"Access Array Data with Indexes\",\n      \"description\": [\n        \"我们可以像操作字符串一样通过数组索引<code>[index]</code>来访问数组中的数据。\",\n        \"数组索引的使用与字符串索引一样，不同的是，通过字符串的索引得到的是一个字符，通过数组索引得到的是一个条目。与字符串类似，数组也是 <dfn>基于零</dfn> 的索引，因此数组的第一个元素的索引是 <code>0</code>。\",\n        \"<strong>例如</strong>\",\n        \"<blockquote>var array = [1,2,3];<br>array[0]; // 等于 1<br>var data = array[1];  // 等于 2</blockquote>\",\n        \"<h4>任务</h4>\",\n        \"创建一个名为 <code>myData</code> 的变量，并把 <code>myArray</code> 的第一个索引上的值赋给它。\"\n      ],\n      \"challengeSeed\": [\n        \"// 举例\",\n        \"var ourArray = [1,2,3];\",\n        \"var ourData = ourArray[0]; // ourData 的值为 1\",\n        \"\",\n        \"// 初始化变量\",\n        \"var myArray = [1,2,3];\",\n        \"\",\n        \"// 请把你的代码写在这条注释以下\",\n        \"\"\n      ],\n      \"tail\": [\n        \"if(typeof myArray !== \\\"undefined\\\" && typeof myData !== \\\"undefined\\\"){(function(y,z){return 'myArray = ' + JSON.stringify(y) + ', myData = ' + JSON.stringify(z);})(myArray, myData);}\"\n      ],\n      \"solutions\": [\n        \"var myArray = [1,2,3];\\nvar myData = myArray[0];\"\n      ],\n      \"tests\": [\n        \"assert((function(){if(typeof myArray != 'undefined' && typeof myData != 'undefined' && myArray[0] == myData){return true;}else{return false;}})(), 'message: 变量 <code>myData</code> 的值应该等于 <code>myArray</code> 的第一个值.');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 1\n    },\n    {\n      \"id\": \"cf1111c1c11feddfaeb8bdef\",\n      \"title\": \"Modify Array Data With Indexes\",\n      \"description\": [\n        \"与字符串的数据不可变不同，数组的数据是可变的，并且可以自由地改变。\",\n        \"<strong>例如</strong>\",\n        \"<blockquote>var ourArray = [3,2,1];<br>ourArray[0] = 1; // ourArray等于 [1,2,1]</blockquote>\",\n        \"<h4>任务</h4>\",\n        \"修改数组 <code>myArray</code> 中索引0上的值为 <code>3</code>。\"\n      ],\n      \"challengeSeed\": [\n        \"// 举例\",\n        \"var ourArray = [1,2,3];\",\n        \"ourArray[1] = 3; // ourArray 的值为 [1,3,3].\",\n        \"\",\n        \"// 初始化变量\",\n        \"var myArray = [1,2,3];\",\n        \"\",\n        \"// 请把你的代码写在这条注释以下\",\n        \"\",\n        \"\"\n      ],\n      \"tail\": [\n        \"if(typeof myArray !== \\\"undefined\\\"){(function(){return myArray;})();}\"\n      ],\n      \"solutions\": [\n        \"var myArray = [1,2,3];\\nmyArray[0] = 3;\"\n      ],\n      \"tests\": [\n        \"assert((function(){if(typeof myArray != 'undefined' && myArray[0] == 3 && myArray[1] == 2 && myArray[2] == 3){return true;}else{return false;}})(), 'message: <code>myArray</code> 的值应该变成 [3,2,3].');\",\n        \"assert((function(){if(code.match(/myArray\\\\[0\\\\]\\\\s?=\\\\s?/g)){return true;}else{return false;}})(), 'message: 你应该使用正确的索引修改 <code>myArray</code> 的值.');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 1\n    },\n    {\n      \"id\": \"56592a60ddddeae28f7aa8e1\",\n      \"title\": \"Access Multi-Dimensional Arrays With Indexes\",\n      \"description\": [\n        \"可以把 <dfn>多维</dfn> 数组看作成是一个 <em>数组中的数组</em>。当使用<code>[]</code>去访问数组的时候，第一个<code>[index]</code>访问的是第N个子数组，第二个<code>[index]</code>访问的是第N个子数组的第N个元素。\",\n        \"<strong>例如</strong>\",\n        \"<blockquote>var arr = [<br>    [1,2,3],<br>    [4,5,6],<br>    [7,8,9],<br>    [[10,11,12], 13, 14]<br>];<br>arr[0]; // 等于 [1,2,3]<br>arr[1][2]; // 等于 6<br>arr[3][0][1]; // 等于 11</blockquote>\",\n        \"<h4>任务</h4>\",\n        \"使用恰当的 <code>[index]</code> 访问 <code>myArray</code>，使得 <code>myData</code> 的值为 <code>8</code>\"\n      ],\n      \"releasedOn\": \"January 1, 2016\",\n      \"challengeSeed\": [\n        \"// 初始化变量\",\n        \"var myArray = [[1,2,3], [4,5,6], [7,8,9], [[10,11,12], 13, 14]];\",\n        \"\",\n        \"// 请只修改这条注释以下的代码\",\n        \"var myData = myArray[0][0];\",\n        \"\"\n      ],\n      \"tail\": [\n        \"if(typeof myArray !== \\\"undefined\\\"){(function(){return \\\"myData: \\\" + myData + \\\" myArray: \\\" + JSON.stringify(myArray);})();}\"\n      ],\n      \"solutions\": [\n        \"var myArray = [[1,2,3],[4,5,6], [7,8,9], [[10,11,12], 13, 14]];\\nvar myData = myArray[2][1];\"\n      ],\n      \"tests\": [\n        \"assert(myData === 8, 'message: <code>myData</code> 应该等于 <code>8</code>.');\",\n        \"assert(/myArray\\\\[2\\\\]\\\\[1\\\\]/g.test(code), 'message: 你应该使用括号从 <code>myArray</code> 中取值.');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 1\n    },\n    {\n      \"id\": \"56bbb991ad1ed5201cd392cb\",\n      \"title\": \"Manipulate Arrays With push()\",\n      \"description\": [\n        \"一个简单的方法将数据追加到一个数组的末尾是通过 <code>push()</code> 函数。\",\n        \"<code>.push()</code> 接受把一个或多个参数，并把它“推”入到数组的末尾。\",\n        \"<blockquote>var arr = [1,2,3];<br>arr.push(4);<br>// 现在arr的值为 [1,2,3,4]</blockquote>\",\n        \"<h4>任务</h4>\",\n        \"把 <code>[\\\"dog\\\", 3]</code> “推”入到 <code>myArray</code> 变量的末尾。\"\n      ],\n      \"challengeSeed\": [\n        \"// 举例\",\n        \"var ourArray = [\\\"Stimpson\\\", \\\"J\\\", \\\"cat\\\"];\",\n        \"ourArray.push([\\\"happy\\\", \\\"joy\\\"]); \",\n        \"// 经过 push 操作后，ourArray 的值为 [\\\"Stimpson\\\", \\\"J\\\", \\\"cat\\\", [\\\"happy\\\", \\\"joy\\\"]]\",\n        \"\",\n        \"// 初始化变量\",\n        \"var myArray = [[\\\"John\\\", 23], [\\\"cat\\\", 2]];\",\n        \"\",\n        \"// 请把你的代码写在这条注释以下\",\n        \"\",\n        \"\"\n      ],\n      \"tail\": [\n        \"(function(z){return 'myArray = ' + JSON.stringify(z);})(myArray);\"\n      ],\n      \"solutions\": [\n        \"var myArray = [[\\\"John\\\", 23], [\\\"cat\\\", 2]];\\nmyArray.push([\\\"dog\\\",3]);\"\n      ],\n      \"tests\": [\n        \"assert((function(d){if(d[2] != undefined && d[0][0] == 'John' && d[0][1] == 23 && d[2][0] == 'dog' && d[2][1] == 3 && d[2].length == 2){return true;}else{return false;}})(myArray), 'message: <code>myArray</code> 现在应该等于 <code>[[\\\"John\\\", 23], [\\\"cat\\\", 2], [\\\"dog\\\", 3]]</code>.');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 1\n    },\n    {\n      \"id\": \"56bbb991ad1ed5201cd392cc\",\n      \"title\": \"Manipulate Arrays With pop()\",\n      \"description\": [\n        \"改变数组中数据的另一种方法是用 <code>.pop()</code> 函数。\",\n        \"<code>.pop()</code> 函数用来“抛出”一个数组末尾的值。我们可以把这个“抛出”的值赋给一个变量存储起来。\",\n        \"数组中任何类型的条目（数值，字符串，甚至是数组）可以被“抛出来” 。\",\n        \"举个例子, 对于这段代码<br><code>var oneDown = [1, 4, 6].pop();</code><br>现在 <code>oneDown</code> 的值为 <code>6</code> ，数组变成了 <code>[1, 4]</code>。\",\n        \"<h4>任务</h4>\",\n        \"使用 <code>.pop()</code> 函数移除 <code>myArray</code> 中的最后一条，并且把“抛出”的值赋给 <code>removedFromMyArray</code>。\"\n      ],\n      \"challengeSeed\": [\n        \"// 举例\",\n        \"var ourArray = [1,2,3];\",\n        \"var removedFromOurArray = ourArray.pop(); \",\n        \"// 经过 pop 操作之后，removedFromOurArray 的值为 3, ourArray 的值为 [1,2]\",\n        \"\",\n        \"// 初始化变量\",\n        \"var myArray = [[\\\"John\\\", 23], [\\\"cat\\\", 2]];\",\n        \"\",\n        \"// 请只修改这条注释以下的代码\",\n        \"var removedFromMyArray;\",\n        \"\",\n        \"\"\n      ],\n      \"tail\": [\n        \"(function(y, z){return 'myArray = ' + JSON.stringify(y) + ' & removedFromMyArray = ' + JSON.stringify(z);})(myArray, removedFromMyArray);\"\n      ],\n      \"solutions\": [\n        \"var myArray = [[\\\"John\\\", 23], [\\\"cat\\\", 2]];\\nvar removedFromMyArray = myArray.pop();\"\n      ],\n      \"tests\": [\n        \"assert((function(d){if(d[0][0] == 'John' && d[0][1] == 23 && d[2] == undefined){return true;}else{return false;}})(myArray), 'message: <code>myArray</code> 应该只包含 <code>[[\\\"John\\\", 23]]</code>.');\",\n        \"assert((function(d){if(d[0] == 'cat' && d[1] == 2 && d[2] == undefined){return true;}else{return false;}})(removedFromMyArray), 'message: <code>removedFromMyArray</code> 应该只包含 <code>[\\\"cat\\\", 2]</code>.');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 1\n    },\n    {\n      \"id\": \"56bbb991ad1ed5201cd392cd\",\n      \"title\": \"Manipulate Arrays With shift()\",\n      \"description\": [\n        \"<code>pop()</code> 函数用来移出数组中最后一个元素。如果想要移出第一个元素要怎么办呢？\",\n        \"这就是 <code>.shift()</code> 的用武之地。它的工作原理就像 <code>.pop()</code>，但它移除的是第一个元素，而不是最后一个。\",\n        \"<h4>任务</h4>\",\n        \"使用 <code>.shift()</code> 函数移出 <code>myArray</code> 中的第一项，并把“移出”的值赋给 <code>removedFromMyArray</code>。\"\n      ],\n      \"challengeSeed\": [\n        \"// 举例\",\n        \"var ourArray = [\\\"Stimpson\\\", \\\"J\\\", [\\\"cat\\\"]];\",\n        \"removedFromOurArray = ourArray.shift();\",\n        \"// 经过 shift 操作后，removedFromOurArray 的值为 \\\"Stimpson\\\"，ourArray 的值为 [\\\"J\\\", [\\\"cat\\\"]].\",\n        \"\",\n        \"// 初始化变量\",\n        \"var myArray = [[\\\"John\\\", 23], [\\\"dog\\\", 3]];\",\n        \"\",\n        \"// 请只修改这条注释以下的代码\",\n        \"var removedFromMyArray;\",\n        \"\",\n        \"\"\n      ],\n      \"tail\": [\n        \"(function(y, z){return 'myArray = ' + JSON.stringify(y) + ' & removedFromMyArray = ' + JSON.stringify(z);})(myArray, removedFromMyArray);\"\n      ],\n      \"solutions\": [\n        \"var myArray = [[\\\"John\\\", 23], [\\\"dog\\\", 3]];\\n\\n// Only change code below this line.\\nvar removedFromMyArray = myArray.shift();\"\n      ],\n      \"tests\": [\n        \"assert((function(d){if(d[0][0] == 'dog' && d[0][1] == 3 && d[1] == undefined){return true;}else{return false;}})(myArray), 'message: <code>myArray</code> 现在应该等于 <code>[[\\\"dog\\\", 3]]</code>.');\",\n        \"assert((function(d){if(d[0] === 'John' && d[1] === 23 && typeof removedFromMyArray === 'object'){return true;}else{return false;}})(removedFromMyArray), 'message: <code>removedFromMyArray</code> 应该包含 <code>[\\\"John\\\", 23]</code>.');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 1\n    },\n    {\n      \"id\": \"56bbb991ad1ed5201cd392ce\",\n      \"title\": \"Manipulate Arrays With unshift()\",\n      \"description\": [\n        \"你不仅可以 <code>shift</code>（移出）数组中的第一个元素，你也可以 <code>unshift</code>（移入）一个元素到数组的头部。\",\n        \"<code>.unshift()</code> 函数用起来就像 <code>.push()</code> 函数一样, 但不是在数组的末尾添加元素，而是在数组的头部添加元素。\",\n        \"<h4>任务</h4>\",\n        \"使用 <code>unshift()</code> 函数把<code>[\\\"Paul\\\",35]</code> 加入到 <code>myArray</code> 的头部。\"\n      ],\n      \"challengeSeed\": [\n        \"// 举例\",\n        \"var ourArray = [\\\"Stimpson\\\", \\\"J\\\", \\\"cat\\\"];\",\n        \"ourArray.shift(); // 经过 shift 操作后，ourArray 的值为 [\\\"J\\\", \\\"cat\\\"]\",\n        \"ourArray.unshift(\\\"Happy\\\"); \",\n        \"// 经过 unshift 操作后，ourArray 的值为 [\\\"Happy\\\", \\\"J\\\", \\\"cat\\\"]\",\n        \"\",\n        \"// 初始化变量\",\n        \"var myArray = [[\\\"John\\\", 23], [\\\"dog\\\", 3]];\",\n        \"myArray.shift();\",\n        \"\",\n        \"// 请把你的代码写在这条注释以下\",\n        \"\",\n        \"\"\n      ],\n      \"tail\": [\n        \"(function(y, z){return 'myArray = ' + JSON.stringify(y);})(myArray);\"\n      ],\n      \"solutions\": [\n        \"var myArray = [[\\\"John\\\", 23], [\\\"dog\\\", 3]];\\nmyArray.shift();\\nmyArray.unshift([\\\"Paul\\\", 35]);\"\n      ],\n      \"tests\": [\n        \"assert((function(d){if(typeof d[0] === \\\"object\\\" && d[0][0].toLowerCase() == 'paul' && d[0][1] == 35 && d[1][0] != undefined && d[1][0] == 'dog' && d[1][1] != undefined && d[1][1] == 3){return true;}else{return false;}})(myArray), 'message: <code>myArray</code> 现在应该包含 [[\\\"Paul\\\", 35], [\\\"dog\\\", 3]].');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 1\n    },\n    {\n      \"id\": \"56533eb9ac21ba0edf2244bc\",\n      \"title\": \"Shopping List\",\n      \"description\": [\n        \"购物清单\",\n        \"创建一个名叫 <code>myList</code>的购物清单，清单的数据格式就是多维数组。\",\n        \"每个子数组中的第一个元素应该是购买的物品名称，第二个元素应该是物品的数量，类似于：\",\n        \"<code>[\\\"Chocolate Bar\\\", 15]</code>\",\n        \"任务：你的购物清单至少应该有5个子数组。\"\n      ],\n      \"releasedOn\": \"January 1, 2016\",\n      \"challengeSeed\": [\n        \"var myList = [];\",\n        \"\",\n        \"\"\n      ],\n      \"tail\": [\n        \"var count = 0;\",\n        \"var isArray = false;\",\n        \"var hasString = false;\",\n        \"var hasNumber = false;\",\n        \"(function(list){\",\n        \"  if(Array.isArray(myList)) {\",\n        \"    isArray = true;\",\n        \"    if(myList.length > 0) {\",\n        \"      hasString = true;\",\n        \"      hasNumber = true;\",\n        \"      myList.forEach(function(elem) {\",\n        \"        if(typeof elem[0] !== 'string') {\",\n        \"          hasString = false;\",\n        \"        }\",\n        \"        if(typeof elem[1] !== 'number') {\",\n        \"          hasNumber = false;\",\n        \"        }\",\n        \"      });\",\n        \"    }\",\n        \"    count = myList.length;\",\n        \"    return JSON.stringify(myList);\",\n        \"  } else {\",\n        \"    return \\\"myList is not an array\\\";\",\n        \"  }\",\n        \"\",\n        \"})(myList);\"\n      ],\n      \"solutions\": [\n        \"var myList = [\\n  [\\\"Candy\\\", 10],\\n  [\\\"Potatoes\\\", 12],\\n  [\\\"Eggs\\\", 12],\\n  [\\\"Catfood\\\", 1],\\n  [\\\"Toads\\\", 9]\\n];\"\n      ],\n      \"tests\": [\n        \"assert(isArray, 'message: <code>myList</code> 应该一个数组');\",\n        \"assert(hasString, 'message: 你的每个子数组的第一个元素的类型都应该是字符串');\",\n        \"assert(hasNumber, 'message: 你的每个子数组的第二个元素的类型都应该是数字');\",\n        \"assert(count > 4, 'message: 你的列表中至少要包含5个元素');\"\n      ],\n      \"type\": \"checkpoint\",\n      \"challengeType\": 1\n    },\n    {\n      \"id\": \"56bbb991ad1ed5201cd392cf\",\n      \"title\": \"Write Reusable JavaScript with Functions\",\n      \"description\": [\n        \"在 JavaScript 中，我们可以把代码的重复部分抽取出来，放到一个<dfn>函数</dfn>（functions）中。\",\n        \"这是一个函数（function）的例子：\",\n        \"<blockquote>function functionName() {<br>  console.log(\\\"Hello World\\\");<br>}</blockquote>\",\n        \"你可以通过函数名称<code>functionName</code>加上后面的小括号来调用这个函数（function），就像这样：\",\n        \"<code>functionName();</code>\",\n        \"每次调用函数时它会打印出消息的“Hello World”到开发的控制台上。所有的大括号之间的代码将在每次函数调用时执行。\",\n        \"<h4>任务</h4>\",\n        \"<ol><li>创建一个名为 <code>myFunction</code> 的函数，这个函数可以打印“Hi World”到开发控制台上。</li><li>调用这个函数。</li></ol>\"\n      ],\n      \"challengeSeed\": [\n        \"// 举例\",\n        \"function ourFunction() {\",\n        \"  console.log(\\\"Heyya, World\\\");\",\n        \"}\",\n        \"\",\n        \"ourFunction();\",\n        \"\",\n        \"// 请把你的代码写在这条注释以下\",\n        \"\",\n        \"\"\n      ],\n      \"tail\": [\n        \"var logOutput = \\\"\\\";\",\n        \"var originalConsole = console\",\n        \"function capture() {\",\n        \"    var nativeLog = console.log;\",\n        \"    console.log = function (message) {\",\n        \"        if(message && message.trim) logOutput = message.trim();\",\n        \"        if(nativeLog.apply) {\",\n        \"          nativeLog.apply(originalConsole, arguments);\",\n        \"        } else {\",\n        \"          var nativeMsg = Array.prototype.slice.apply(arguments).join(' ');\",\n        \"          nativeLog(nativeMsg);\",\n        \"        }\",\n        \"    };\",\n        \"}\",\n        \"\",\n        \"function uncapture() {\",\n        \"  console.log = originalConsole.log;\",\n        \"}\",\n        \"\",\n        \"if (typeof myFunction !== \\\"function\\\") { \",\n        \"  (function() { return \\\"myFunction is not defined\\\"; })();\",\n        \"} else {\",\n        \"  capture();\",\n        \"  myFunction();  \",\n        \"  uncapture();\",\n        \"  (function() { return logOutput || \\\"console.log never called\\\"; })();\",\n        \"}\"\n      ],\n      \"solutions\": [\n        \"function myFunction() {\\n  console.log(\\\"Hi World\\\");\\n}\\nmyFunction();\"\n      ],\n      \"tests\": [\n        \"assert(typeof myFunction === 'function', 'message: <code>myFunction</code> 应该是一个函数');\",\n        \"assert(\\\"Hi World\\\" === logOutput, 'message: <code>myFunction</code> 应该在控制台中输出 \\\"Hi World\\\"');\",\n        \"assert(/^\\\\s*myFunction\\\\(\\\\)\\\\s*;/m.test(code), 'message: 在你定义 <code>myFunction</code> 之后记得调用它');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 1\n    },\n    {\n      \"id\": \"56533eb9ac21ba0edf2244bd\",\n      \"title\": \"Passing Values to Functions with Arguments\",\n      \"description\": [\n        \"函数的参数<code>parameters</code>在函数中充当占位符(也叫形参)的作用，参数可以为一个或多个。调用一个函数时所传入的参数为实参，实参决定着形参真正的值。简单理解：形参即形式、实参即内容。\",\n        \"这是带有两个参数的函数， <code>param1</code> 和 <code>param2</code>：\",\n        \"<blockquote>function testFun(param1, param2) {<br>  console.log(param1, param2);<br>}</blockquote>\",\n        \"接着我们调用 <code>testFun</code>：\",\n        \"<code>testFun(\\\"Hello\\\", \\\"World\\\");</code>\",\n        \"我们传递了两个参数， <code>\\\"Hello\\\"</code> 和 <code>\\\"World\\\"</code>。在函数内部，<code>param1</code> 等于“Hello”，<code>param2</code> 等于“World”。请注意，<code>testFun</code> 函数可以多次调用，每次调用时传递的参数会决定形参的实际值。\",\n        \"<h4>任务</h4>\",\n        \"<ol><li>创建一个名为 <code>myFunction</code> 的函数，它可以接收两个参数，计算参数的和，将结果输出到控制台。</li><li>调用这个函数。</li></ol>\"\n      ],\n      \"releasedOn\": \"January 1, 2016\",\n      \"head\": [\n        \"var logOutput = \\\"\\\";\",\n        \"var originalConsole = console\",\n        \"function capture() {\",\n        \"    var nativeLog = console.log;\",\n        \"    console.log = function (message) {\",\n        \"        if(message) logOutput = JSON.stringify(message).trim();\",\n        \"        if(nativeLog.apply) {\",\n        \"          nativeLog.apply(originalConsole, arguments);\",\n        \"        } else {\",\n        \"          var nativeMsg = Array.prototype.slice.apply(arguments).join(' ');\",\n        \"          nativeLog(nativeMsg);\",\n        \"        }\",\n        \"    };\",\n        \"}\",\n        \"\",\n        \"function uncapture() {\",\n        \"  console.log = originalConsole.log;\",\n        \"}\",\n        \"\",\n        \"capture();\"\n      ],\n      \"challengeSeed\": [\n        \"// 举例\",\n        \"function ourFunction(a, b) {\",\n        \"  console.log(a - b);\",\n        \"}\",\n        \"ourFunction(10, 5); // 输出 5\",\n        \"\",\n        \"// 请把你的代码写在这条注释以下\",\n        \"\",\n        \"\"\n      ],\n      \"tail\": [\n        \"uncapture();\",\n        \"\",\n        \"if (typeof myFunction !== \\\"function\\\") { \",\n        \"  (function() { return \\\"myFunction is not defined\\\"; })();\",\n        \"} else {\",\n        \"  (function() { return logOutput || \\\"console.log never called\\\"; })();\",\n        \"}\"\n      ],\n      \"solutions\": [\n        \"function myFunction(a, b) {\\n  console.log(a + b);\\n}\\nmyFunction(10, 5);\"\n      ],\n      \"tests\": [\n        \"assert(typeof myFunction === 'function', 'message: <code>myFunction</code> 应该是一个函数');\",\n        \"if(typeof myFunction === \\\"function\\\") { capture(); myFunction(1,2); uncapture(); } assert(logOutput == 3, 'message: <code>myFunction(1,2)</code> 应该输出 <code>3</code>');\",\n        \"if(typeof myFunction === \\\"function\\\") { capture(); myFunction(7,9); uncapture(); } assert(logOutput == 16, 'message: <code>myFunction(7,9)</code> 应该输出 <code>16</code>');\",\n        \"assert(/^\\\\s*myFunction\\\\s*\\\\([\\\\w\\\\W]+\\\\)\\\\s*;/m.test(code), 'message: 在你定义 <code>myFunction</code> 之后记得调用它');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 1\n    },\n    {\n      \"id\": \"56533eb9ac21ba0edf2244be\",\n      \"title\": \"Global Scope and Functions\",\n      \"description\": [\n        \"在 JavaScript 中， <dfn>作用域</dfn> 涉及到变量的作用范围。在函数外定义的变量具有 <dfn>全局</dfn> 作用域。这意味着，具有全局作用域的变量可以在代码的任何地方被调用。\",\n        \"这些没有使用<code>var</code>关键字定义的变量，会被自动创建在全局作用域中，形成全局变量。当在代码其他地方无意间定义了一个变量，刚好变量名与全局变量相同，这时会产生意想不到的后果。因此你应该总是使用var关键字来声明你的变量。\",\n        \"<h4>任务</h4>\",\n        \"在函数外声明一个 <code>全局</code> 变量 <code>myGlobal</code>，并给它一个初始值 <code>10</code> \",\n        \"在函数 <code>fun1</code> 的内部，<strong>不</strong>使用 <code>var</code> 关键字来声明 <code>oopsGlobal</code>，并赋值为 <code>5</code>。\"\n      ],\n      \"releasedOn\": \"January 1, 2016\",\n      \"head\": [\n        \"var logOutput = \\\"\\\";\",\n        \"var originalConsole = console\",\n        \"function capture() {\",\n        \"    var nativeLog = console.log;\",\n        \"    console.log = function (message) {\",\n        \"        logOutput = message;\",\n        \"        if(nativeLog.apply) {\",\n        \"          nativeLog.apply(originalConsole, arguments);\",\n        \"        } else {\",\n        \"          var nativeMsg = Array.prototype.slice.apply(arguments).join(' ');\",\n        \"          nativeLog(nativeMsg);\",\n        \"        }\",\n        \"    };\",\n        \"}\",\n        \"\",\n        \"function uncapture() {\",\n        \"  console.log = originalConsole.log;\",\n        \"}\",\n        \"var oopsGlobal;\",\n        \"capture();\"\n      ],\n      \"challengeSeed\": [\n        \"// 请在这里定义变量\",\n        \"\",\n        \"\",\n        \"function fun1() {\",\n        \"  // 请在这里把 5 赋值给 oopsGlobal\",\n        \"  \",\n        \"}\",\n        \"\",\n        \"// 请只修改这条注释以上的代码\",\n        \"function fun2() {\",\n        \"  var output = \\\"\\\";\",\n        \"  if (typeof myGlobal != \\\"undefined\\\") {\",\n        \"    output += \\\"myGlobal: \\\" + myGlobal;\",\n        \"  }\",\n        \"  if (typeof oopsGlobal != \\\"undefined\\\") {\",\n        \"    output += \\\" oopsGlobal: \\\" + oopsGlobal;\",\n        \"  }\",\n        \"  console.log(output);\",\n        \"}\"\n      ],\n      \"tail\": [\n        \"fun1();\",\n        \"fun2();\",\n        \"uncapture();\",\n        \"(function() { return logOutput || \\\"console.log never called\\\"; })();\"\n      ],\n      \"solutions\": [\n        \"// Declare your variable here\\nvar myGlobal = 10;\\n\\nfunction fun1() {\\n  // Assign 5 to oopsGlobal Here\\n  oopsGlobal = 5;\\n}\\n\\n// Only change code above this line\\nfunction fun2() {\\n  var output = \\\"\\\";\\n  if(typeof myGlobal != \\\"undefined\\\") {\\n    output += \\\"myGlobal: \\\" + myGlobal;\\n  }\\n  if(typeof oopsGlobal != \\\"undefined\\\") {\\n    output += \\\" oopsGlobal: \\\" + oopsGlobal;\\n  }\\n  console.log(output);\\n}\"\n      ],\n      \"tests\": [\n        \"assert(typeof myGlobal != \\\"undefined\\\", 'message: <code>myGlobal</code> 需要被定义');\",\n        \"assert(myGlobal === 10, 'message: <code>myGlobal</code> 的值应该是 <code>10</code>');\",\n        \"assert(/var\\\\s+myGlobal/.test(code), 'message: <code>myGlobal</code> 应该使用 <code>var</code> 关键字声明');\",\n        \"assert(typeof oopsGlobal != \\\"undefined\\\" && oopsGlobal === 5, 'message: <code>oopsGlobal</code> 的值应该是 <code>5</code>');\",\n        \"assert(!/var\\\\s+oopsGlobal/.test(code), 'message: 不要使用 <code>var</code>关键字声明 <code>oopsGlobal</code>');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 1\n    },\n    {\n      \"id\": \"56533eb9ac21ba0edf2244bf\",\n      \"title\": \"Local Scope and Functions\",\n      \"description\": [\n        \"在一个函数内声明的变量，以及该函数的参数都是局部变量，意味着它们只在该函数内可见。\",\n        \"这是在函数 <code>myTest</code>内声明局部变量<code>loc</code> 的最佳例子：\",\n        \"<blockquote>function myTest() {<br>  var loc = \\\"foo\\\";<br>  console.log(loc);<br>}<br>myTest(); // \\\"foo\\\"<br>console.log(loc); // \\\"undefined\\\"</blockquote>\",\n        \"在函数外，<code>loc</code> 是未定义的。\",\n        \"<h4>任务</h4>\",\n        \"在函数 <code>myFunction</code> 内部声明一个局部变量 <code>myVar</code>，并删除外部console.log。\"\n      ],\n      \"releasedOn\": \"January 1, 2016\",\n      \"head\": [\n        \"var logOutput = \\\"\\\";\",\n        \"var originalConsole = console\",\n        \"function capture() {\",\n        \"    var nativeLog = console.log;\",\n        \"    console.log = function (message) {\",\n        \"        logOutput = message;\",\n        \"        if(nativeLog.apply) {\",\n        \"          nativeLog.apply(originalConsole, arguments);\",\n        \"        } else {\",\n        \"          var nativeMsg = Array.prototype.slice.apply(arguments).join(' ');\",\n        \"          nativeLog(nativeMsg);\",\n        \"        }\",\n        \"    };\",\n        \"}\",\n        \"\",\n        \"function uncapture() {\",\n        \"  console.log = originalConsole.log;\",\n        \"}\",\n        \"\"\n      ],\n      \"challengeSeed\": [\n        \"function myFunction() {\",\n        \"  'use strict';\",\n        \"  \",\n        \"  \",\n        \"  console.log(myVar);\",\n        \"}\",\n        \"myFunction();\",\n        \"\",\n        \"// 请先运行这段代码，并在左边的输出区域或浏览器的控制台中查看输出\",\n        \"// 由于 myVar 在 myFunction 内外均没有定义，因此才会有报错\",\n        \"console.log(myVar);\",\n        \"\",\n        \"// 现在，在 myFunction 中定义 myVar，并删掉 myFunction 外面的 console.log 那一行\",\n        \"\"\n      ],\n      \"tail\": [\n        \"typeof myFunction === 'function' && (capture(), myFunction(), uncapture());\",\n        \"(function() { return logOutput || \\\"console.log never called\\\"; })();\"\n      ],\n      \"solutions\": [\n        \"function myFunction() {\\n  'use strict';\\n  \\n  var myVar;\\n  console.log(myVar);\\n}\\nmyFunction();\"\n      ],\n      \"tests\": [\n        \"assert(typeof myVar === 'undefined', 'message: 未找到全局的 <code>myVar</code> 变量');\",\n        \"assert(/var\\\\s+myVar/.test(code), 'message: 需要定义局部的 <code>myVar</code> 变量');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 1\n    },\n    {\n      \"id\": \"56533eb9ac21ba0edf2244c0\",\n      \"title\": \"Global vs. Local Scope in Functions\",\n      \"description\": [\n        \"一个程序中有可能具有相同名称的 <dfn>局部</dfn> 变量 和 <dfn>全局</dfn> 变量。在这种情况下，<code>局部</code> 变量将会优先于 <code>全局</code> 变量。\",\n        \"下面为例：\",\n        \"<blockquote>var someVar = \\\"Hat\\\";<br>function myFun() {<br>  var someVar = \\\"Head\\\";<br>  return someVar;<br>}</blockquote>\",\n        \"函数 <code>myFun</code> 将会返回 <code>\\\"Head\\\"</code>，因为 <code>局部变量</code> 优先级更高。\",\n        \"<h4>任务</h4>\",\n        \"给 <code>myFunction</code> 添加一个局部变量来覆盖 <code>outerWear</code> 的值为 <code>\\\"sweater\\\"</code>。\"\n      ],\n      \"releasedOn\": \"January 1, 2016\",\n      \"challengeSeed\": [\n        \"// 初始化变量\",\n        \"var outerWear = \\\"T-Shirt\\\";\",\n        \"\",\n        \"function myFunction() {\",\n        \"  // 请把你的代码写在这条注释以下\",\n        \"  \",\n        \"  \",\n        \"  \",\n        \"  // 请把你的代码写在这条注释以上\",\n        \"  return outerWear;\",\n        \"}\",\n        \"\",\n        \"myFunction();\"\n      ],\n      \"solutions\": [\n        \"var outerWear = \\\"T-Shirt\\\";\\nfunction myFunction() {\\n  var outerWear = \\\"sweater\\\";\\n  return outerWear;\\n}\"\n      ],\n      \"tests\": [\n        \"assert(outerWear === \\\"T-Shirt\\\", 'message: 不要修改全局变量 <code>outerWear</code> 的值');\",\n        \"assert(myFunction() === \\\"sweater\\\", 'message: <code>myFunction</code> 应该返回 <code>\\\"sweater\\\"</code>');\",\n        \"assert(/return outerWear/.test(code), 'message: 不要修改 <code>return</code> 语句');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 1\n    },\n    {\n      \"id\": \"56533eb9ac21ba0edf2244c2\",\n      \"title\": \"Return a Value from a Function with Return\",\n      \"description\": [\n        \"我们可以把数据通过函数的 <dfn>参数</dfn> 来传入函数，也可以使用 <code>return</code> 语句把数据从一个函数中传出来。\",\n        \"<strong>例如</strong>\",\n        \"<blockquote>function plusThree(num) {<br>  return num + 3;<br>}<br>var answer = plusThree(5); // 8</blockquote>\",\n        \"<code>plusThree</code> 带有一个为 <code>num</code> 的 <dfn>参数</dfn> 并且返回（returns）一个等于 <code>num + 3</code> 的值。\",\n        \"<h4>任务</h4>\",\n        \"创建一个函数 <code>timesFive</code> 接受一个参数, 把它乘于 <code>5</code> 之后并返回（returns）。\"\n      ],\n      \"releasedOn\": \"January 1, 2016\",\n      \"challengeSeed\": [\n        \"// 举例\",\n        \"function minusSeven(num) {\",\n        \"  return num - 7;\",\n        \"}\",\n        \"\",\n        \"// 请把你的代码写在这条注释以下\",\n        \"\",\n        \"\"\n      ],\n      \"tail\": [\n        \"(function() { if(typeof timesFive === 'function'){ return \\\"timesfive(5) === \\\" + timesFive(5); } else { return \\\"timesFive is not a function\\\"} })();\"\n      ],\n      \"solutions\": [\n        \"function timesFive(num) {\\n  return num * 5;\\n}\"\n      ],\n      \"tests\": [\n        \"assert(typeof timesFive === 'function', 'message: <code>timesFive</code> 应该是一个函数');\",\n        \"assert(timesFive(5) === 25, 'message: <code>timesFive(5)</code> 应该返回 <code>25</code>');\",\n        \"assert(timesFive(2) === 10, 'message: <code>timesFive(2)</code> 应该返回 <code>10</code>');\",\n        \"assert(timesFive(0) === 0, 'message: <code>timesFive(0)</code> 应该返回 <code>0</code>');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 1\n    },\n    {\n      \"id\": \"56533eb9ac21ba0edf2244c3\",\n      \"title\": \"Assignment with a Returned Value\",\n      \"description\": [\n        \"如果你还记得我们在这一节 <a href=\\\"waypoint-storing-values-with-the-equal-operator\\\" target=\\\"_blank\\\">Storing Values with the Equal Operator</a> 的讨论，赋值之前，先完成等号右边的操作。这意味着我们可把一个函数的返回值，赋值给一个变量。\",\n        \"假设我们预先定义的函数 <code>sum</code> 其功能就是将两个数字相加，那么：\",\n        \"<code>ourSum = sum(5, 12);</code>\",\n        \"将调用 <code>sum</code> 函数，返回<code>return</code>了一个数值 <code>17</code>，然后把它赋值给了 <code>ourSum</code> 变量。\",\n        \"<h4>任务</h4>\",\n        \"调用 <code>process</code> 函数并给参数一个值 <code>7</code>，然后把返回的值赋值给变量 <code>processed</code>。\"\n      ],\n      \"releasedOn\": \"January 1, 2016\",\n      \"challengeSeed\": [\n        \"// 举例\",\n        \"var changed = 0;\",\n        \"\",\n        \"function change(num) {\",\n        \"  return (num + 5) / 3;\",\n        \"}\",\n        \"\",\n        \"changed = change(10);\",\n        \"\",\n        \"// 初始化变量\",\n        \"var processed = 0;\",\n        \"\",\n        \"function process(num) {\",\n        \"  return (num + 3) / 5;\",\n        \"}\",\n        \"\",\n        \"// 请把你的代码写在这条注释以下\",\n        \"\",\n        \"\"\n      ],\n      \"tail\": [\n        \"(function(){return \\\"processed = \\\" + processed})();\"\n      ],\n      \"solutions\": [\n        \"var processed = 0;\\n\\nfunction process(num) {\\n  return (num + 3) / 5;\\n}\\n\\nprocessed = process(7);\"\n      ],\n      \"tests\": [\n        \"assert(processed === 2, 'message: <code>processed</code> 的值应该是 <code>2</code>');\",\n        \"assert(/processed\\\\s*=\\\\s*process\\\\(\\\\s*7\\\\s*\\\\)\\\\s*;/.test(code), 'message: 你应该把 <code>process</code> 的结果赋值给 <code>processed</code>');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 1\n    },\n    {\n      \"id\": \"56533eb9ac21ba0edf2244c6\",\n      \"title\": \"Stand in Line\",\n      \"description\": [\n        \"在计算机科学中 <dfn>队列</dfn>（queue）是一个抽象的数据结构，队列中的条目都是有秩序的。新的条目会被加到 <code>队列</code> 的末尾，旧的条目会从 <code>队列</code> 的头部被移出。\",\n        \"写一个函数 <code>queue</code> ，用一个数组<code>arr</code>和一个数字<code>item</code>作为参数。数字<code>item</code>添加到数组的结尾，然后移出数组的第一个元素，最后队列函数应该返回被删除的元素。\"\n      ],\n      \"releasedOn\": \"January 1, 2016\",\n      \"head\": [\n        \"var logOutput = [];\",\n        \"var originalConsole = console\",\n        \"function capture() {\",\n        \"    var nativeLog = console.log;\",\n        \"    console.log = function (message) {\",\n        \"        logOutput.push(message);\",\n        \"        if(nativeLog.apply) {\",\n        \"          nativeLog.apply(originalConsole, arguments);\",\n        \"        } else {\",\n        \"          var nativeMsg = Array.prototype.slice.apply(arguments).join(' ');\",\n        \"          nativeLog(nativeMsg);\",\n        \"        }\",\n        \"    };\",\n        \"}\",\n        \"\",\n        \"function uncapture() {\",\n        \"  console.log = originalConsole.log;\",\n        \"}\",\n        \"\",\n        \"capture();\"\n      ],\n      \"challengeSeed\": [\n        \"function queue(arr, item) {\",\n        \"  // 请把你的代码写在这里\",\n        \"  \",\n        \"  return item;  // 请修改这一行\",\n        \"}\",\n        \"\",\n        \"// 初始化测试数据\",\n        \"var testArr = [1,2,3,4,5];\",\n        \"\",\n        \"// 控制台输出\",\n        \"console.log(\\\"Before: \\\" + JSON.stringify(testArr));\",\n        \"console.log(queue(testArr, 6)); // 你可以修改这一行来测试你的代码\",\n        \"console.log(\\\"After: \\\" + JSON.stringify(testArr));\"\n      ],\n      \"tail\": [\n        \"uncapture();\",\n        \"testArr = [1,2,3,4,5];\",\n        \"(function() { return logOutput.join(\\\"\\\\n\\\");})();\"\n      ],\n      \"solutions\": [\n        \"var testArr = [ 1,2,3,4,5];\\n\\nfunction queue(arr, item) {\\n    arr.push(item);\\n    return arr.shift();\\n}\"\n      ],\n      \"tests\": [\n        \"assert(queue([],1) === 1, 'message: <code>queue([], 1)</code> 应该返回 <code>1</code>');\",\n        \"assert(queue([2],1) === 2, 'message: <code>queue([2], 1)</code> 应该返回 <code>2</code>');\",\n        \"assert(queue([5,6,7,8,9],1) === 5, 'message: <code>queue([5,6,7,8,9], 1)</code> 应该返回 <code>5</code>');\",\n        \"queue(testArr, 10); assert(testArr[4] === 10, 'message: 在 <code>queue(testArr, 10)</code> 之后, <code>testArr[4]</code> 的值应该是 <code>10</code>');\"\n      ],\n      \"type\": \"checkpoint\",\n      \"challengeType\": 1\n    },\n    {\n      \"id\": \"bd7123c9c441eddfaeb5bdef\",\n      \"title\": \"Understanding Boolean Values\",\n      \"description\": [\n        \"另一种数据类型是<dfn>布尔</dfn>（Boolean）。<code>布尔</code> 值要么是<code>true</code> 要么是<code>false</code>。它非常像电路开关， <code>true</code> 是“开”，<code>false</code> 是“关”。这两种状态是互斥的。\",\n        \"<strong>注意</strong><br><code>Boolean</code> 值绝不会写作被引号包裹起来的形式。<code>字符串</code> 的 <code>\\\"true\\\"</code> 和 <code>\\\"false\\\"</code> 不是 <code>布尔值</code>，在 JavaScript 中也没有特殊含义。\",\n        \"<h4>任务</h4>\",\n        \"修改 <code>welcomeToBooleans</code> 函数，让它返回 <code>true</code> 而不是 <code>false</code>。\"\n      ],\n      \"challengeSeed\": [\n        \"function welcomeToBooleans() {\",\n        \"\",\n        \"// 请只修改这条注释以下的代码\",\n        \"\",\n        \"return false; // 请修改这一行\",\n        \"\",\n        \"// 请只修改这条注释以上的代码\",\n        \"}\"\n      ],\n      \"tail\": [\n        \"welcomeToBooleans();\"\n      ],\n      \"solutions\": [\n        \"function welcomeToBooleans() {\\n  return true; // Change this line\\n}\"\n      ],\n      \"tests\": [\n        \"assert(typeof welcomeToBooleans() === 'boolean', 'message: <code>welcomeToBooleans()</code> 函数应该返回一个布尔值 &#40;true/false&#41; ');\",\n        \"assert(welcomeToBooleans() === true, 'message: <code>welcomeToBooleans()</code> 应该返回 true.');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 1\n    },\n    {\n      \"id\": \"cf1111c1c12feddfaeb3bdef\",\n      \"title\": \"Use Conditional Logic with If Statements\",\n      \"description\": [\n        \"<code>If</code> 语句用于在代码中做条件判断。关键字 <code>if</code> 告诉 JavaScript 在小括号中的条件为真的情况下去执行定义在大括号里面的代码。这种条件被称为 <code>Boolean</code> 条件，因为他们只可能是 <code>true</code>（真）或 <code>false</code>（假）。\",\n        \"当条件的计算结果为 <code>true</code>，程序执行大括号内的语句。当布尔条件的计算结果为 <code>false</code>，大括号内的代码将不会执行。\",\n        \"<strong>伪代码</strong>\",\n        \"<blockquote>if(<i>条件为真</i>){<br>  <i>语句被执行</i><br>}</blockquote>\",\n        \"<strong>示例</strong>\",\n        \"<blockquote>function test (myCondition) {<br>  if (myCondition) {<br>     return \\\"It was true\\\";<br>  }<br>  return \\\"It was false\\\";<br>}<br>test(true);  // 返回 \\\"It was true\\\"<br>test(false); // 返回 \\\"It was false\\\"</blockquote>\",\n        \"当 <code>test</code> 被调用，并且传递进来的参数值为 <code>true</code>，<code>if</code> 语句会计算 <code>myCondition</code> 的结果，看它是真还是假。如果条件为 <code>true</code>，函数会返回 <code>\\\"It was true\\\"</code>。当 <code>test</code> 被调用，并且传递进来的参数值为 <code>false</code>，<code>myCondition</code> <em>不</em> 为 <code>true</code>，并且不执行大括号后面的语句，函数返回 <code>\\\"It was false\\\"</code>。\",\n        \"<h4>任务</h4>\",\n        \"在函数内部创建一个 <code>if</code> 语句，如果该参数 <code>wasThatTrue</code> 值为 <code>true</code>，返回 <code>\\\"That was true\\\"</code>，否则，并返回 <code>\\\"That was false\\\"</code>。\"\n      ],\n      \"challengeSeed\": [\n        \"// 举例\",\n        \"function ourFunction(isItTrue) {\",\n        \"  if (isItTrue) { \",\n        \"    return \\\"Yes, it's true\\\";\",\n        \"  }\",\n        \"  return \\\"No, it's false\\\";\",\n        \"}\",\n        \"\",\n        \"// 定义 myFunction\",\n        \"function myFunction(wasThatTrue) {\",\n        \"\",\n        \"  // 请把你的代码写在这条注释以下\",\n        \"  \",\n        \"  \",\n        \"  \",\n        \"  // 请把你的代码写在这条注释以上\",\n        \"\",\n        \"}\",\n        \"\",\n        \"// 你可以修改这一行来测试你的代码\",\n        \"myFunction(true);\"\n      ],\n      \"solutions\": [\n        \"function myFunction(wasThatTrue) {\\n  if (wasThatTrue) {\\n    return \\\"That was true\\\";\\n  }\\n  return \\\"That was false\\\";\\n}\"\n      ],\n      \"tests\": [\n        \"assert(typeof myFunction === \\\"function\\\", 'message: <code>myFunction</code> 应该是一个函数');\",\n        \"assert(typeof myFunction(true) === \\\"string\\\", 'message: <code>myFunction(true)</code> 应该返回字符串');\",\n        \"assert(typeof myFunction(false) === \\\"string\\\", 'message: <code>myFunction(false)</code> 应该返回字符串');\",\n        \"assert(myFunction(true) === \\\"That was true\\\", 'message: <code>myFunction(true)</code> 应该返回 \\\"That was true\\\"');\",\n        \"assert(myFunction(false) === \\\"That was false\\\", 'message: <code>myFunction(false)</code> 应该返回 \\\"That was false\\\"');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 1\n    },\n    {\n      \"id\": \"56533eb9ac21ba0edf2244d0\",\n      \"title\": \"Comparison with the Equality Operator\",\n      \"description\": [\n        \"在 JavaScript 中，有很多 <dfn>相互比较的操作</dfn>。所有这些操作符都返回一个 <code>true</code> 或 <code>false</code> 值。\",\n        \"最基本的运算符是相等运算符：<code>==</code>。相等运算符比较两个值，如果它们是同等，返回 <code>true</code>，如果它们不等，返回 <code>false</code>。值得注意的是相等运算符不同于赋值运算符（<code>=</code>），赋值运算符是把等号右边的值赋给左边的变量。\",\n        \"<blockquote>function equalityTest(myVal) {<br>  if (myVal == 10) {<br>     return \\\"Equal\\\";<br>  }<br>  return \\\"Not Equal\\\";<br>}</blockquote>\",\n        \"如果 <code>myVal</code> 等于 <code>10</code>，相等运算符会返回 <code>true</code>，因此大括号里面的代码会被执行，函数将返回 <code>\\\"Equal\\\"</code>。否则，函数返回 <code>\\\"Not Equal\\\"</code>。\",\n        \"在 JavaScript 中，为了让两个不同的 <code>数据类型</code>（例如 <code>数字</code> 和 <code>字符串</code>）的值可以作比较，它必须把一种类型转换为另一种类型。然而一旦这样做，它可以像下面这样来比较：\",\n        \"<blockquote>   1   ==  1    // true<br>   1   ==  2    // false<br>   1   == '1'   // true<br>  \\\"3\\\"  ==  3    // true</blockquote>\",\n        \"<h4>任务</h4>\",\n        \"把 <code>相等运算符</code> 添加到指定的行，这样当 <code>val</code> 的值为<code>12</code>的时候，函数会返回\\\"Equal\\\"。\"\n      ],\n      \"releasedOn\": \"January 1, 2016\",\n      \"challengeSeed\": [\n        \"// 定义 myTest\",\n        \"function myTest(val) {\",\n        \"  if (val) { // 请修改这一行\",\n        \"    return \\\"Equal\\\";\",\n        \"  }\",\n        \"  return \\\"Not Equal\\\";\",\n        \"}\",\n        \"\",\n        \"// 你可以修改这一行来测试你的代码\",\n        \"myTest(10);\"\n      ],\n      \"solutions\": [\n        \"function myTest(val) {\\n  if (val == 12) {\\n    return \\\"Equal\\\";\\n  }\\n  return \\\"Not Equal\\\";\\n}\"\n      ],\n      \"tests\": [\n        \"assert(myTest(10) === \\\"Not Equal\\\", 'message: <code>myTest(10)</code> 应该返回 \\\"Not Equal\\\"');\",\n        \"assert(myTest(12) === \\\"Equal\\\", 'message: <code>myTest(12)</code> 应该返回 \\\"Equal\\\"');\",\n        \"assert(myTest(\\\"12\\\") === \\\"Equal\\\", 'message: <code>myTest(\\\"12\\\")</code> 应该返回 \\\"Equal\\\"');\",\n        \"assert(code.match(/val\\\\s*==[\\\\s'\\\"\\\\d]+/g).length > 0, 'message: 你应该使用 <code>==</code> 运算符');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 1\n    },\n    {\n      \"id\": \"56533eb9ac21ba0edf2244d1\",\n      \"title\": \"Comparison with the Strict Equality Operator\",\n      \"description\": [\n        \"严格相等运算符（<code>===</code>）是相对于相等操作符（<code>==</code>）的一种操作符。与相等操作符不同的是，它会同时比较元素的值和 <code>数据类型</code>。\",\n        \"<strong>举个例子</strong>\",\n        \"<blockquote>3 === 3   // true<br>3 === '3' // false</blockquote>\",\n        \"<code>3</code> 是一个 <code>数字</code> 类型的，而<code>'3'</code> 是一个 <code>字符</code> 类型的，所以3不全等于'3'。\",\n        \"<h4>任务</h4>\",\n        \"在 <code>if</code> 语句值使用严格相等运算符，这样当 <code>val</code> 严格等于7的时候，函数会返回\\\"Equal\\\"。\"\n      ],\n      \"releasedOn\": \"January 1, 2016\",\n      \"challengeSeed\": [\n        \"// 定义 myTest\",\n        \"function myTest(val) {\",\n        \"  if (val) { // 请修改这一行\",\n        \"    return \\\"Equal\\\";\",\n        \"  }\",\n        \"  return \\\"Not Equal\\\";\",\n        \"}\",\n        \"\",\n        \"// 你可以修改这一行来测试你的代码\",\n        \"myTest(10);\"\n      ],\n      \"solutions\": [\n        \"function myTest(val) {\\n  if (val === 7) {\\n    return \\\"Equal\\\";\\n  }\\n  return \\\"Not Equal\\\";\\n}\"\n      ],\n      \"tests\": [\n        \"assert(myTest(10) === \\\"Not Equal\\\", 'message: <code>myTest(10)</code> 应该返回 \\\"Not Equal\\\"');\",\n        \"assert(myTest(7) === \\\"Equal\\\", 'message: <code>myTest(7)</code> 应该返回 \\\"Equal\\\"');\",\n        \"assert(myTest(\\\"7\\\") === \\\"Not Equal\\\", 'message: <code>myTest(\\\"7\\\")</code> 应该返回 \\\"Not Equal\\\"');\",\n        \"assert(code.match(/val\\\\s*===\\\\s*\\\\d+/g).length > 0, 'message: 你应该使用 <code>===</code> 运算符');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 1\n    },\n    {\n      \"id\": \"56533eb9ac21ba0edf2244d2\",\n      \"title\": \"Comparison with the Inequality Operator\",\n      \"description\": [\n        \"不相等运算符（<code>!=</code>）与相等运算符是相反的。这意味着不相等运算符中，如果“不为真”并且返回 <code>false</code> 的地方，在相等运算符中会返回<code>true</code>，<em>反之亦然</em>。与相等运算符类似，不相等运算符在比较的时候也会转换值的数据类型。\",\n        \"<strong>例如</strong>\",\n        \"<blockquote>1 != 2      // true<br>1 != \\\"1\\\"    // false<br>1 != '1'    // false<br>1 != true   // false<br>0 != false  // false</blockquote>\",\n        \"<h4>任务</h4>\",\n        \"在 <code>if</code> 语句中，添加不相等运算符 <code>!=</code>，这样函数在当 <code>val</code> 不等于  <code>99</code> 的时候，会返回 \\\"Not Equal\\\"。\"\n      ],\n      \"releasedOn\": \"January 1, 2016\",\n      \"challengeSeed\": [\n        \"// 定义 myTest\",\n        \"function myTest(val) {\",\n        \"  if (val) { // 请修改这一行\",\n        \"    return \\\"Not Equal\\\";\",\n        \"  }\",\n        \"  return \\\"Equal\\\";\",\n        \"}\",\n        \"\",\n        \"// 你可以修改这一行来测试你的代码\",\n        \"myTest(10);\"\n      ],\n      \"solutions\": [\n        \"function myTest(val) {\\n  if (val != 99) {\\n    return \\\"Not Equal\\\";\\n  }\\n  return \\\"Equal\\\";\\n}\"\n      ],\n      \"tests\": [\n        \"assert(myTest(99) === \\\"Equal\\\", 'message: <code>myTest(99)</code> 应该返回 \\\"Equal\\\"');\",\n        \"assert(myTest(\\\"99\\\") === \\\"Equal\\\", 'message: <code>myTest(\\\"99\\\")</code> 应该返回 \\\"Equal\\\"');\",\n        \"assert(myTest(12) === \\\"Not Equal\\\", 'message: <code>myTest(12)</code> 应该返回 \\\"Not Equal\\\"');\",\n        \"assert(myTest(\\\"12\\\") === \\\"Not Equal\\\", 'message: <code>myTest(\\\"12\\\")</code> 应该返回 \\\"Not Equal\\\"');\",\n        \"assert(myTest(\\\"bob\\\") === \\\"Not Equal\\\", 'message: <code>myTest(\\\"bob\\\")</code> 应该返回 \\\"Not Equal\\\"');\",\n        \"assert(code.match(/(?!!==)!=/), 'message: 你应该使用 <code>!=</code> 运算符');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 1\n    },\n    {\n      \"id\": \"56533eb9ac21ba0edf2244d3\",\n      \"title\": \"Comparison with the Strict Inequality Operator\",\n      \"description\": [\n        \"严格不相等运算符（<code>!==</code>）与全等运算符是相反的。这意味着严格不相等并返回 <code>false</code> 的地方，用严格相等运算符会返回 <code>true</code>，<em>反之亦然</em>。严格相等运算符不会转换值的数据类型。\",\n        \"<strong>例如</strong>\",\n        \"<blockquote>3 !== 3   // false<br>3 !== '3' // true<br>4 !== 3   // true</blockquote>\",\n        \"<h4>任务</h4>\",\n        \"在 <code>if</code> 语句中，添加严格不相等运算符 <code>!==</code>，这样如果 <code>val</code> 与 <code>17</code> 严格不相等的时候，函数会返回 \\\"Not Equal\\\"。\"\n      ],\n      \"releasedOn\": \"January 1, 2016\",\n      \"challengeSeed\": [\n        \"// 定义 myTest\",\n        \"function myTest(val) {\",\n        \"  // 请只修改这条注释以下的代码\",\n        \"  \",\n        \"  if (val) {\",\n        \"\",\n        \"  // 请只修改这条注释以上的代码\",\n        \"\",\n        \"    return \\\"Not Equal\\\";\",\n        \"  }\",\n        \"  return \\\"Equal\\\";\",\n        \"}\",\n        \"\",\n        \"// 你可以修改这一行来测试你的代码\",\n        \"myTest(10);\"\n      ],\n      \"solutions\": [\n        \"function myTest(val) {\\n  if (val !== 17) {\\n    return \\\"Not Equal\\\";\\n  }\\n  return \\\"Equal\\\";\\n}\"\n      ],\n      \"tests\": [\n        \"assert(myTest(17) === \\\"Equal\\\", 'message: <code>myTest(17)</code> 应该返回 \\\"Equal\\\"');\",\n        \"assert(myTest(\\\"17\\\") === \\\"Not Equal\\\", 'message: <code>myTest(\\\"17\\\")</code> 应该返回n \\\"Not Equal\\\"');\",\n        \"assert(myTest(12) === \\\"Not Equal\\\", 'message: <code>myTest(12)</code> 应该返回 \\\"Not Equal\\\"');\",\n        \"assert(myTest(\\\"bob\\\") === \\\"Not Equal\\\", 'message: <code>myTest(\\\"bob\\\")</code> 应该返回 \\\"Not Equal\\\"');\",\n        \"assert(code.match(/val\\\\s*!==\\\\s*\\\\d+/g).length > 0, 'message: 你应该使用 <code>!==</code> 运算符');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 1\n    },\n    {\n      \"id\": \"56533eb9ac21ba0edf2244d4\",\n      \"title\": \"Comparison with the Greater Than Operator\",\n      \"description\": [\n        \"使用大于运算符（<code>&gt;</code>）来比较两个数字。如果大于运算符左边的数字大于右边的数字，将会返回 <code>true</code>。否则，它返回 <code>false</code>。\",\n        \"与相等运算符一样，大于运算符在比较的时候，会转换值的数据类型。\",\n        \"<strong>例如</strong>\",\n        \"<blockquote> 5 > 3   // true<br> 7 > '3' // true<br> 2 > 3   // false<br>'1' > 9  // false</blockquote>\",\n        \"<h4>任务</h4>\",\n        \"添加 <code>大于</code> 运算符到指定的行，使得返回的语句是有意义的。\"\n      ],\n      \"releasedOn\": \"January 1, 2016\",\n      \"challengeSeed\": [\n        \"function myTest(val) {\",\n        \"  if (val) {  // 请修改这一行\",\n        \"    return \\\"Over 100\\\";\",\n        \"  }\",\n        \"  \",\n        \"  if (val) {  // 请修改这一行\",\n        \"    return \\\"Over 10\\\";\",\n        \"  }\",\n        \"\",\n        \"  return \\\"10 or Under\\\";\",\n        \"}\",\n        \"\",\n        \"// 你可以修改这一行来测试你的代码\",\n        \"myTest(10);\"\n      ],\n      \"solutions\": [\n        \"function myTest(val) {\\n  if (val > 100) {  // Change this line\\n    return \\\"Over 100\\\";\\n  }\\n  if (val > 10) {  // Change this line\\n    return \\\"Over 10\\\";\\n  }\\n  return \\\"10 or Under\\\";\\n}\"\n      ],\n      \"tests\": [\n        \"assert(myTest(0) === \\\"10 or Under\\\", 'message: <code>myTest(0)</code> 应该返回 \\\"10 or Under\\\"');\",\n        \"assert(myTest(10) === \\\"10 or Under\\\", 'message: <code>myTest(10)</code> 应该返回 \\\"10 or Under\\\"');\",\n        \"assert(myTest(11) === \\\"Over 10\\\", 'message: <code>myTest(11)</code> 应该返回 \\\"Over 10\\\"');\",\n        \"assert(myTest(99) === \\\"Over 10\\\", 'message: <code>myTest(99)</code> 应该返回 \\\"Over 10\\\"');\",\n        \"assert(myTest(100) === \\\"Over 10\\\", 'message: <code>myTest(100)</code> 应该返回 \\\"Over 10\\\"');\",\n        \"assert(myTest(101) === \\\"Over 100\\\", 'message: <code>myTest(101)</code> 应该返回 \\\"Over 100\\\"');\",\n        \"assert(myTest(150) === \\\"Over 100\\\", 'message: <code>myTest(150)</code> 应该返回 \\\"Over 100\\\"');\",\n        \"assert(code.match(/val\\\\s*>\\\\s*('|\\\")*\\\\d+('|\\\")*/g).length > 1, 'message: 你应该使用 <code>&gt;</code> 运算符至少两次');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 1\n    },\n    {\n      \"id\": \"56533eb9ac21ba0edf2244d5\",\n      \"title\": \"Comparison with the Greater Than Or Equal To Operator\",\n      \"description\": [\n        \"使用 <code>大于等于</code> 运算符（<code>&gt;=</code>）来比较两个数字的大小。如果大于等于运算符左边的数字比右边的数字大或者相等，它会返回 <code>true</code>。否则，它会返回 <code>false</code>。\",\n        \"与相等运算符相似，<code>大于等于</code> 运算符在比较的时候会转换值的数据类型。\",\n        \"<strong>例如</strong>\",\n        \"<blockquote> 6  >=  6  // true<br> 7  >= '3' // true<br> 2  >=  3  // false<br>'7' >=  9  // false</blockquote>\",\n        \"<h4>任务</h4>\",\n        \"添加 <code>大于等于</code> 运算符到指定行，使得函数的返回语句有意义。\"\n      ],\n      \"releasedOn\": \"January 1, 2016\",\n      \"challengeSeed\": [\n        \"function myTest(val) {\",\n        \"  if (val) {  // 请修改这一行\",\n        \"    return \\\"20 or Over\\\";\",\n        \"  }\",\n        \"  \",\n        \"  if (val) {  // 请修改这一行\",\n        \"    return \\\"10 or Over\\\";\",\n        \"  }\",\n        \"\",\n        \"  return \\\"9 or Under\\\";\",\n        \"}\",\n        \"\",\n        \"// 你可以修改这一行来测试你的代码\",\n        \"myTest(10);\"\n      ],\n      \"solutions\": [\n        \"function myTest(val) {\\n  if (val >= 20) {  // Change this line\\n    return \\\"20 or Over\\\";\\n  }\\n  \\n  if (val >= 10) {  // Change this line\\n    return \\\"10 or Over\\\";\\n  }\\n\\n  return \\\"9 or Under\\\";\\n}\"\n      ],\n      \"tests\": [\n        \"assert(myTest(0) === \\\"9 or Under\\\", 'message: <code>myTest(0)</code> 应该返回 \\\"9 or Under\\\"');\",\n        \"assert(myTest(9) === \\\"9 or Under\\\", 'message: <code>myTest(9)</code> 应该返回 \\\"9 or Under\\\"');\",\n        \"assert(myTest(10) === \\\"10 or Over\\\", 'message: <code>myTest(10)</code> 应该返回 \\\"10 or Over\\\"');\",\n        \"assert(myTest(11) === \\\"10 or Over\\\", 'message: <code>myTest(11)</code> 应该返回 \\\"10 or Over\\\"');\",\n        \"assert(myTest(19) === \\\"10 or Over\\\", 'message: <code>myTest(19)</code> 应该返回 \\\"10 or Over\\\"');\",\n        \"assert(myTest(100) === \\\"20 or Over\\\", 'message: <code>myTest(100)</code> 应该返回 \\\"20 or Over\\\"');\",\n        \"assert(myTest(21) === \\\"20 or Over\\\", 'message: <code>myTest(21)</code> 应该返回 \\\"20 or Over\\\"');\",\n        \"assert(code.match(/val\\\\s*>=\\\\s*('|\\\")*\\\\d+('|\\\")*/g).length > 1, 'message: 你应该使用 <code>&gt;=</code> 运算符至少两次');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 1\n    },\n    {\n      \"id\": \"56533eb9ac21ba0edf2244d6\",\n      \"title\": \"Comparison with the Less Than Operator\",\n      \"description\": [\n        \"使用 <dfn>小于</dfn> 运算符（<code>&lt;</code>）比较两个数字的大小。如果小于运算符左边的数字比右边的数字小，它会返回 <code>true</code>。否则，他会返回 <code>false</code>。与相等运算符类似，<dfn>小于</dfn> 运算符在做比较的时候会转换值的数据类型。\",\n        \"<strong>例如</strong>\",\n        \"<blockquote>  2 &lt; 5  // true<br>'3' &lt; 7  // true<br>  5 &lt; 5  // false<br>  3 &lt; 2  // false<br>'8' &lt; 4  // false</blockquote>\",\n        \"<h4>任务</h4>\",\n        \"添加 <code>小于</code> 运算符到指定行，使得函数的返回语句有意义。\"\n      ],\n      \"releasedOn\": \"January 1, 2016\",\n      \"challengeSeed\": [\n        \"function myTest(val) {\",\n        \"  if (val) {  // 请修改这一行\",\n        \"    return \\\"Under 25\\\";\",\n        \"  }\",\n        \"  \",\n        \"  if (val) {  // 请修改这一行\",\n        \"    return \\\"Under 55\\\";\",\n        \"  }\",\n        \"\",\n        \"  return \\\"55 or Over\\\";\",\n        \"}\",\n        \"\",\n        \"// 你可以修改这一行来测试你的代码\",\n        \"myTest(10);\"\n      ],\n      \"solutions\": [\n        \"function myTest(val) {\\n  if (val < 25) {  // Change this line\\n    return \\\"Under 25\\\";\\n  }\\n  \\n  if (val < 55) {  // Change this line\\n    return \\\"Under 55\\\";\\n  }\\n\\n  return \\\"55 or Over\\\";\\n}\"\n      ],\n      \"tests\": [\n        \"assert(myTest(0) === \\\"Under 25\\\", 'message: <code>myTest(0)</code> 应该返回 \\\"Under 25\\\"');\",\n        \"assert(myTest(24) === \\\"Under 25\\\", 'message: <code>myTest(24)</code> 应该返回 \\\"Under 25\\\"');\",\n        \"assert(myTest(25) === \\\"Under 55\\\", 'message: <code>myTest(25)</code> 应该返回 \\\"Under 55\\\"');\",\n        \"assert(myTest(54) === \\\"Under 55\\\", 'message: <code>myTest(54)</code> 应该返回 \\\"Under 55\\\"');\",\n        \"assert(myTest(55) === \\\"55 or Over\\\", 'message: <code>myTest(55)</code> 应该返回 \\\"55 or Over\\\"');\",\n        \"assert(myTest(99) === \\\"55 or Over\\\", 'message: <code>myTest(99)</code> 应该返回 \\\"55 or Over\\\"');\",\n        \"assert(code.match(/val\\\\s*<\\\\s*('|\\\")*\\\\d+('|\\\")*/g).length > 1, 'message: 你应该使用 <code>&lt;</code> 运算符至少两次');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 1\n    },\n    {\n      \"id\": \"56533eb9ac21ba0edf2244d7\",\n      \"title\": \"Comparison with the Less Than Or Equal To Operator\",\n      \"description\": [\n        \"使用 <code>小于等于</code> 运算符（<code>&lt;=</code>）比较两个数字的大小。如果在小于等于运算符，左边的数字小于或者等于右边的数字，它会返回 <code>true</code>。如果在小于等于运算符，左边的数字大于或者等于右边的数字，它会返回 <code>false</code>。与相等运算符类型，<code>小于等于</code> 运算符会转换数据类型。\",\n        \"<strong>例如</strong>\",\n        \"<blockquote>  4 &lt;= 5  // true<br>'7' &lt;= 7  // true<br>  5 &lt;= 5  // true<br>  3 &lt;= 2  // false<br>'8' &lt;= 4  // false</blockquote>\",\n        \"<h4>任务</h4>\",\n        \"添加 <code>小于等于</code> 运算符到指定行，使得函数的返回语句有意义。\"\n      ],\n      \"releasedOn\": \"January 1, 2016\",\n      \"challengeSeed\": [\n        \"function myTest(val) {\",\n        \"  if (val) {  // 请修改这一行\",\n        \"    return \\\"Smaller Than or Equal to 12\\\";\",\n        \"  }\",\n        \"  \",\n        \"  if (val) {  // 请修改这一行\",\n        \"    return \\\"Smaller Than or Equal to 24\\\";\",\n        \"  }\",\n        \"\",\n        \"  return \\\"25 or More\\\";\",\n        \"}\",\n        \"\",\n        \"// 你可以修改这一行来测试你的代码\",\n        \"myTest(10);\",\n        \"\"\n      ],\n      \"solutions\": [\n        \"function myTest(val) {\\n  if (val <= 12) {  // Change this line\\n    return \\\"Smaller Than or Equal to 12\\\";\\n  }\\n  \\n  if (val <= 24) {  // Change this line\\n    return \\\"Smaller Than or Equal to 24\\\";\\n  }\\n\\n  return \\\"25 or More\\\";\\n}\"\n      ],\n      \"tests\": [\n        \"assert(myTest(0) === \\\"Smaller Than or Equal to 12\\\", 'message: <code>myTest(0)</code> 应该返回 \\\"Smaller Than or Equal to 12\\\"');\",\n        \"assert(myTest(11) === \\\"Smaller Than or Equal to 12\\\", 'message: <code>myTest(11)</code> 应该返回 \\\"Smaller Than or Equal to 12\\\"');\",\n        \"assert(myTest(12) === \\\"Smaller Than or Equal to 12\\\", 'message: <code>myTest(12)</code> 应该返回 \\\"Smaller Than or Equal to 12\\\"');\",\n        \"assert(myTest(23) === \\\"Smaller Than or Equal to 24\\\", 'message: <code>myTest(23)</code> 应该返回 \\\"Smaller Than or Equal to 24\\\"');\",\n        \"assert(myTest(24) === \\\"Smaller Than or Equal to 24\\\", 'message: <code>myTest(24)</code> 应该返回 \\\"Smaller Than or Equal to 24\\\"');\",\n        \"assert(myTest(25) === \\\"25 or More\\\", 'message: <code>myTest(25)</code> 应该返回 \\\"25 or More\\\"');\",\n        \"assert(myTest(55) === \\\"25 or More\\\", 'message: <code>myTest(55)</code> 应该返回 \\\"25 or More\\\"');\",\n        \"assert(code.match(/val\\\\s*<=\\\\s*('|\\\")*\\\\d+('|\\\")*/g).length > 1, 'message: 你应该使用 <code>&lt;=</code> 运算符至少两次');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 1\n    },\n    {\n      \"id\": \"56533eb9ac21ba0edf2244d8\",\n      \"title\": \"Comparisons with the Logical And Operator\",\n      \"description\": [\n        \"有时你需要在一次判断中做多个操作。当且仅当运算符的左边和右边都是 <code>true</code>，<dfn>逻辑与</dfn> 运算符（<code>&&</code>）才会返回 <code>true</code>。\",\n        \"同样的效果可以通过if语句的嵌套来实现：\",\n        \"<blockquote>if (num > 5) {<br>  if (num < 10) {<br>    return \\\"Yes\\\";<br>  }<br>}<br>return \\\"No\\\";</blockquote>\",\n        \"只有当 <code>num</code> 的值在6和9之间（包括6和9）才会返回 \\\"Yes\\\"。相同的逻辑可被写为：\",\n        \"<blockquote>if (num > 5 && num < 10) {<br>  return \\\"Yes\\\";<br>}<br>return \\\"No\\\";</blockquote>\",\n        \"<h4>任务</h4>\",\n        \"结合两个if语句为一个语句，如果 <code>val</code> 小于或等于 <code>50</code> 并且大于或等于 <code>25</code>，返回 <code>\\\"Yes\\\"</code>。否则，将返回 <code>\\\"No\\\"</code>。\"\n      ],\n      \"releasedOn\": \"January 1, 2016\",\n      \"challengeSeed\": [\n        \"function myTest(val) {\",\n        \"  // 请只修改这条注释以下的代码\",\n        \"\",\n        \"  if (val) {\",\n        \"    if (val) {\",\n        \"      return \\\"Yes\\\";\",\n        \"    }\",\n        \"  }\",\n        \"\",\n        \"  // 请只修改这条注释以上的代码\",\n        \"  return \\\"No\\\";\",\n        \"}\",\n        \"\",\n        \"// 你可以修改这一行来测试你的代码\",\n        \"myTest(10);\"\n      ],\n      \"solutions\": [\n        \"function myTest(val) {\\n  if (val >= 25 && val <= 50) {\\n    return \\\"Yes\\\";\\n  }\\n  return \\\"No\\\";\\n}\"\n      ],\n      \"tests\": [\n        \"assert(code.match(/&&/g).length === 1, 'message: 你应该使用 <code>&&</code> 运算符一次');\",\n        \"assert(code.match(/if/g).length === 1, 'message: 你应该只有一个 <code>if</code> 表达式');\",\n        \"assert(myTest(0) === \\\"No\\\", 'message: <code>myTest(0)</code> 应该返回 \\\"No\\\"');\",\n        \"assert(myTest(24) === \\\"No\\\", 'message: <code>myTest(24)</code> 应该返回 \\\"No\\\"');\",\n        \"assert(myTest(25) === \\\"Yes\\\", 'message: <code>myTest(25)</code> 应该返回 \\\"Yes\\\"');\",\n        \"assert(myTest(30) === \\\"Yes\\\", 'message: <code>myTest(30)</code> 应该返回 \\\"Yes\\\"');\",\n        \"assert(myTest(50) === \\\"Yes\\\", 'message: <code>myTest(50)</code> 应该返回 \\\"Yes\\\"');\",\n        \"assert(myTest(51) === \\\"No\\\", 'message: <code>myTest(51)</code> 应该返回 \\\"No\\\"');\",\n        \"assert(myTest(75) === \\\"No\\\", 'message: <code>myTest(75)</code> 应该返回 \\\"No\\\"');\",\n        \"assert(myTest(80) === \\\"No\\\", 'message: <code>myTest(80)</code> 应该返回 \\\"No\\\"');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 1\n    },\n    {\n      \"id\": \"56533eb9ac21ba0edf2244d9\",\n      \"title\": \"Comparisons with the Logical Or Operator\",\n      \"description\": [\n        \"如果任何一个操作数是<code>true</code>，<dfn>逻辑或</dfn> 运算符 (<code>||</code>) 返回 <code>true</code>。反之，返回 <code>false</code>。\",\n        \"举个例子：\",\n        \"<blockquote>if (num > 10) {<br>  return \\\"No\\\";<br>}<br>if (num < 5) {<br>  return \\\"No\\\";<br>}<br>return \\\"Yes\\\";</blockquote>\",\n        \"只有当<code>num</code>大于等于5或小于等于10时，函数返回\\\"Yes\\\"。相同的逻辑可以简写成：\",\n        \"<blockquote>if (num > 10 || num < 5) {<br>  return \\\"No\\\";<br>}<br>return \\\"Yes\\\";</blockquote>\",\n        \"<h4>任务</h4>\",\n        \"结合两个if语句为一个语句，如果<code>val</code>不在10和20之间(包括10和20)，返回 <code>\\\"Outside\\\"</code>。反之，返回 <code>\\\"Inside\\\"</code>。\"\n      ],\n      \"releasedOn\": \"January 1, 2016\",\n      \"challengeSeed\": [\n        \"function myTest(val) {\",\n        \"  // 请只修改这条注释以下的代码\",\n        \"\",\n        \"  if (val) {\",\n        \"    return \\\"Outside\\\";\",\n        \"  }\",\n        \"\",\n        \"  if (val) {\",\n        \"    return \\\"Outside\\\";\",\n        \"  }\",\n        \"\",\n        \"  // 请只修改这条注释以上的代码\",\n        \"  return \\\"Inside\\\";\",\n        \"}\",\n        \"\",\n        \"// 你可以修改这一行来测试你的代码\",\n        \"myTest(15);\"\n      ],\n      \"solutions\": [\n        \"function myTest(val) {\\n  if (val < 10 || val > 20) {\\n    return \\\"Outside\\\";\\n  }\\n  return \\\"Inside\\\";\\n}\"\n      ],\n      \"tests\": [\n        \"assert(code.match(/\\\\|\\\\|/g).length === 1, 'message: 你应该使用一次 <code>||</code> 操作符');\",\n        \"assert(code.match(/if/g).length === 1, 'message: 你应该只有一个 <code>if</code> 表达式');\",\n        \"assert(myTest(0) === \\\"Outside\\\", 'message: <code>myTest(0)</code> 应该返回 \\\"Outside\\\"');\",\n        \"assert(myTest(9) === \\\"Outside\\\", 'message: <code>myTest(9)</code> 应该返回 \\\"Outside\\\"');\",\n        \"assert(myTest(10) === \\\"Inside\\\", 'message: <code>myTest(10)</code> 应该返回 \\\"Inside\\\"');\",\n        \"assert(myTest(15) === \\\"Inside\\\", 'message: <code>myTest(15)</code> 应该返回 \\\"Inside\\\"');\",\n        \"assert(myTest(19) === \\\"Inside\\\", 'message: <code>myTest(19)</code> 应该返回 \\\"Inside\\\"');\",\n        \"assert(myTest(20) === \\\"Inside\\\", 'message: <code>myTest(20)</code> 应该返回 \\\"Inside\\\"');\",\n        \"assert(myTest(21) === \\\"Outside\\\", 'message: <code>myTest(21)</code> 应该返回 \\\"Outside\\\"');\",\n        \"assert(myTest(25) === \\\"Outside\\\", 'message: <code>myTest(25)</code> 应该返回 \\\"Outside\\\"');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 1\n    },\n    {\n      \"id\": \"56533eb9ac21ba0edf2244da\",\n      \"title\": \"Introducing Else Statements\",\n      \"description\": [\n        \"当<code>if</code>语句的条件为真，大括号里的代码执行，那如果条件为假呢？\",\n        \"正常情况下什么也不会发生。\",\n        \"写一个<code>else</code>语句，当条件为假时执行相应的代码。\",\n        \"<blockquote>if (num > 10) {<br>  return \\\"Bigger than 10\\\";<br>} else {<br>  return \\\"10 or Less\\\";<br>}</blockquote>\",\n        \"<h4>任务</h4>\",\n        \"结合多个<code>if</code>语句为一个<code>if/else</code>语句。\"\n      ],\n      \"releasedOn\": \"January 1, 2016\",\n      \"challengeSeed\": [\n        \"function myTest(val) {\",\n        \"  var result = \\\"\\\";\",\n        \"  // 请只修改这条注释以下的代码\",\n        \"  \",\n        \"  if (val > 5) {\",\n        \"    result = \\\"Bigger than 5\\\";\",\n        \"  }\",\n        \"  \",\n        \"  if (val <= 5) {\",\n        \"    result = \\\"5 or Smaller\\\";\",\n        \"  }\",\n        \"  \",\n        \"  // 请只修改这条注释以上的代码\",\n        \"  return result;\",\n        \"}\",\n        \"\",\n        \"// 你可以修改这一行来测试你的代码\",\n        \"myTest(4);\",\n        \"\"\n      ],\n      \"solutions\": [\n        \"function myTest(val) {\\n  var result = \\\"\\\";\\n  if(val > 5) {\\n    result = \\\"Bigger than 5\\\";\\n  } else {\\n    result = \\\"5 or Smaller\\\";\\n  }\\n  return result;\\n}\"\n      ],\n      \"tests\": [\n        \"assert(code.match(/if/g).length === 1, 'message: 你应该只有一个 <code>if</code> 表达式');\",\n        \"assert(/else/g.test(code), 'message: 你应该使用一个 <code>else</code> 表达式');\",\n        \"assert(myTest(4) === \\\"5 or Smaller\\\", 'message: <code>myTest(4)</code> 应该返回 \\\"5 or Smaller\\\"');\",\n        \"assert(myTest(5) === \\\"5 or Smaller\\\", 'message: <code>myTest(5)</code> 应该返回 \\\"5 or Smaller\\\"');\",\n        \"assert(myTest(6) === \\\"Bigger than 5\\\", 'message: <code>myTest(6)</code> 应该返回 \\\"Bigger than 5\\\"');\",\n        \"assert(myTest(10) === \\\"Bigger than 5\\\", 'message: <code>myTest(10)</code> 应该返回 \\\"Bigger than 5\\\"');\",\n        \"assert(/var result = \\\"\\\";/.test(code) && /return result;/.test(code), 'message: 不要修改上面和下面的代码');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 1\n    },\n    {\n      \"id\": \"56533eb9ac21ba0edf2244db\",\n      \"title\": \"Introducing Else If Statements\",\n      \"description\": [\n        \"如果你有多个条件语句，你可以通过<code>else if</code>语句把 <code>if</code>语句链起来。\",\n        \"<blockquote>if (num > 15) {<br>  return \\\"Bigger than 15\\\";<br>} else if (num < 5) {<br>  return \\\"Smaller than 5\\\";<br>} else {<br>  return \\\"Between 5 and 15\\\";<br>}</blockquote>\",\n        \"<h4>任务</h4>\",\n        \"使用<code>else if</code>实现同样的效果。\"\n      ],\n      \"releasedOn\": \"January 1, 2016\",\n      \"challengeSeed\": [\n        \"function myTest(val) {\",\n        \"  if (val > 10) {\",\n        \"    return \\\"Greater than 10\\\";\",\n        \"  }\",\n        \"  \",\n        \"  if (val < 5) {\",\n        \"    return \\\"Smaller than 5\\\";\",\n        \"  }\",\n        \"  \",\n        \"  return \\\"Between 5 and 10\\\";\",\n        \"}\",\n        \"\",\n        \"// 你可以修改这一行来测试你的代码\",\n        \"myTest(7);\",\n        \"\"\n      ],\n      \"solutions\": [\n        \"function myTest(val) {\\n  if(val > 10) {\\n    return \\\"Greater than 10\\\";\\n  } else if(val < 5) {\\n    return \\\"Smaller than 5\\\";\\n  } else {\\n    return \\\"Between 5 and 10\\\";\\n  }\\n}\"\n      ],\n      \"tests\": [\n        \"assert(code.match(/else/g).length > 1, 'message: 你应该至少有两个 <code>else</code> 表达式');\",\n        \"assert(code.match(/if/g).length > 1, 'message: 你应该至少有两个 <code>if</code> 表达式');\",\n        \"assert(myTest(0) === \\\"Smaller than 5\\\", 'message: <code>myTest(0)</code> 应该返回 \\\"Smaller than 5\\\"');\",\n        \"assert(myTest(5) === \\\"Between 5 and 10\\\", 'message: <code>myTest(5)</code> 应该返回 \\\"Between 5 and 10\\\"');\",\n        \"assert(myTest(7) === \\\"Between 5 and 10\\\", 'message: <code>myTest(7)</code> 应该返回 \\\"Between 5 and 10\\\"');\",\n        \"assert(myTest(10) === \\\"Between 5 and 10\\\", 'message: <code>myTest(10)</code> 应该返回 \\\"Between 5 and 10\\\"');\",\n        \"assert(myTest(12) === \\\"Greater than 10\\\", 'message: <code>myTest(12)</code> 应该返回 \\\"Greater than 10\\\"');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 1\n    },\n    {\n      \"id\": \"5690307fddb111c6084545d7\",\n      \"title\": \"Logical Order in If Else Statements\",\n      \"description\": [\n        \"<code>if</code>、<code>else if</code>语句中代码的执行顺序是很重要的。\",\n        \"在条件判断语句中，代码的执行顺序是从上到下，所以你需要考虑清楚先执行哪一句，后执行哪一句。\",\n        \"这有两个例子。\",\n        \"第一个例子：\",\n        \"<blockquote>function foo(x) {<br>  if (x < 1) {<br>    return \\\"Less than one\\\";<br>  } else if (x < 2) {<br>    return \\\"Less than two\\\";<br>  } else {<br>    return \\\"Greater than or equal to two\\\";<br>  }<br>}</blockquote>\",\n        \"第二个例子更改了代码的执行顺序：\",\n        \"<blockquote>function bar(x) {<br>  if (x < 2) {<br>    return \\\"Less than two\\\";<br>  } else if (x < 1) {<br>    return \\\"Less than one\\\";<br>  } else {<br>    return \\\"Greater than or equal to two\\\";<br>  }<br>}</blockquote>\",\n        \"这两个函数看起来几乎一模一样，我们传一个值进去看看它们有什么区别。\",\n        \"<blockquote>foo(0) // \\\"Less than one\\\"<br>bar(0) // \\\"Less than two\\\"</blockquote>\",\n        \"<h4>任务</h4>\",\n        \"更改函数的逻辑顺序以便通过所有的测试用例。\"\n      ],\n      \"challengeSeed\": [\n        \"function myTest(val) {\",\n        \"  if (val < 10) {\",\n        \"    return \\\"Less than 10\\\";\",\n        \"  } else if (val < 5) {\",\n        \"    return \\\"Less than 5\\\";\",\n        \"  } else {\",\n        \"    return \\\"Greater than or equal to 10\\\";\",\n        \"  }\",\n        \"}\",\n        \"\",\n        \"// 你可以修改这一行来测试你的代码\",\n        \"myTest(7);\"\n      ],\n      \"solutions\": [\n        \"function myTest(val) {\\n  if(val < 5) {\\n    return \\\"Less than 5\\\";            \\n  } else if (val < 10) {\\n    return \\\"Less than 10\\\";\\n  } else {\\n    return \\\"Greater than or equal to 10\\\";\\n  }\\n}\"\n      ],\n      \"tests\": [\n        \"assert(myTest(4) === \\\"Less than 5\\\", 'message: <code>myTest(4)</code> 应该返回 \\\"Less than 5\\\"');\",\n        \"assert(myTest(6) === \\\"Less than 10\\\", 'message: <code>myTest(6)</code> 应该返回 \\\"Less than 10\\\"');\",\n        \"assert(myTest(11) === \\\"Greater than or equal to 10\\\", 'message: <code>myTest(11)</code> 应该返回 \\\"Greater than or equal to 10\\\"');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 1\n    },\n    {\n      \"id\": \"56533eb9ac21ba0edf2244dc\",\n      \"title\": \"Chaining If Else Statements\",\n      \"description\": [\n        \"<code>if/else</code> 语句串联在一起可以实现复杂的逻辑，这是多个<code>if/else if</code> 语句串联在一起的伪代码：\",\n        \"<blockquote>if (<em>condition1</em>) {<br>  <em>statement1</em><br>} else if (<em>condition2</em>) {<br>  <em>statement2</em><br>} else if (<em>condition3</em>) {<br>  <em>statement3</em><br>. . .<br>} else {<br>  <em>statementN</em><br>}</blockquote>\",\n        \"<h4>任务</h4>\",\n        \"把<code>if</code>/<code>else if</code>语句串联起来实现下面的逻辑：\",\n        \"<code>num &lt;   5</code> - return \\\"Tiny\\\"<br><code>num &lt;  10</code> - return \\\"Small\\\"<br><code>num &lt; 15</code> - return \\\"Medium\\\"<br><code>num &lt; 20</code> - return \\\"Large\\\"<br><code>num >= 20</code>  - return \\\"Huge\\\"\"\n      ],\n      \"releasedOn\": \"January 1, 2016\",\n      \"challengeSeed\": [\n        \"function myTest(num) {\",\n        \"  // 请只修改这条注释以下的代码\",\n        \"  \",\n        \"  \",\n        \"  return \\\"修改这里\\\";\",\n        \"  // 请只修改这条注释以上的代码\",\n        \"}\",\n        \"\",\n        \"// 你可以修改这一行来测试你的代码\",\n        \"myTest(7);\"\n      ],\n      \"solutions\": [\n        \"function myTest(num) {\\n  if (num < 5) {\\n    return \\\"Tiny\\\";\\n  } else if (num < 10) {\\n    return \\\"Small\\\";\\n  } else if (num < 15) {\\n    return \\\"Medium\\\";\\n  } else if (num < 20) {\\n    return \\\"Large\\\";\\n  } else {\\n    return \\\"Huge\\\";\\n  }\\n}\"\n      ],\n      \"tests\": [\n        \"assert(code.match(/else/g).length > 3, 'message: 你应该有至少4个 <code>else</code> 表达式');\",\n        \"assert(code.match(/if/g).length > 3, 'message: 你应该有至少4个 <code>if</code> 表达式');\",\n        \"assert(code.match(/return/g).length >= 5, 'message: 你应该有至少5个 <code>return</code> 表达式');\",\n        \"assert(myTest(0) === \\\"Tiny\\\", 'message: <code>myTest(0)</code> 应该返回 \\\"Tiny\\\"');\",\n        \"assert(myTest(4) === \\\"Tiny\\\", 'message: <code>myTest(4)</code> 应该返回 \\\"Tiny\\\"');\",\n        \"assert(myTest(5) === \\\"Small\\\", 'message: <code>myTest(5)</code> 应该返回 \\\"Small\\\"');\",\n        \"assert(myTest(8) === \\\"Small\\\", 'message: <code>myTest(8)</code> 应该返回 \\\"Small\\\"');\",\n        \"assert(myTest(10) === \\\"Medium\\\", 'message: <code>myTest(10)</code> 应该返回 \\\"Medium\\\"');\",\n        \"assert(myTest(14) === \\\"Medium\\\", 'message: <code>myTest(14)</code> 应该返回 \\\"Medium\\\"');\",\n        \"assert(myTest(15) === \\\"Large\\\", 'message: <code>myTest(15)</code> 应该返回 \\\"Large\\\"');\",\n        \"assert(myTest(17) === \\\"Large\\\", 'message: <code>myTest(17)</code> 应该返回 \\\"Large\\\"');\",\n        \"assert(myTest(20) === \\\"Huge\\\", 'message: <code>myTest(20)</code> 应该返回 \\\"Huge\\\"');\",\n        \"assert(myTest(25) === \\\"Huge\\\", 'message: <code>myTest(25)</code> 应该返回 \\\"Huge\\\"');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 1\n    },\n    {\n      \"id\": \"5664820f61c48e80c9fa476c\",\n      \"title\": \"Golf Code\",\n      \"description\": [\n        \"在高尔夫<code>golf</code>游戏中，每个洞都有自己的标准杆数<code>par</code>，代表着距离。根据你把球打进洞所挥杆的次数<code>strokes</code>，可以计算出你的高尔夫水平。\",\n        \"函数将会传送2个参数，分别是标准杆数<code>par</code> 和 挥杆次数<code>strokes</code> ，根据下面的表格返回正确的水平段位。\",\n        \"<table class=\\\"table table-striped\\\"><thead><tr><th>Strokes</th><th>Return</th></tr></thead><tbody><tr><td>1</td><td>\\\"Hole-in-one!\\\"</td></tr><tr><td>&lt;= par - 2</td><td>\\\"Eagle\\\"</td></tr><tr><td>par - 1</td><td>\\\"Birdie\\\"</td></tr><tr><td>par</td><td>\\\"Par\\\"</td></tr><tr><td>par + 1</td><td>\\\"Bogey\\\"</td></tr><tr><td>par + 2</td><td>\\\"Double Bogey\\\"</td></tr><tr><td>&gt;= par + 3</td><td>\\\"Go Home!\\\"</td></tr></tbody></table>\",\n        \"<code>par</code> 和 <code>strokes</code> 必须是数字而且是正数。\"\n      ],\n      \"releasedOn\": \"January 1, 2016\",\n      \"challengeSeed\": [\n        \"function golfScore(par, strokes) {\",\n        \"  // 请只修改这条注释以下的代码\",\n        \"  \",\n        \"  \",\n        \"  return \\\"修改这里\\\";\",\n        \"  // 请只修改这条注释以上的代码\",\n        \"}\",\n        \"\",\n        \"// 你可以修改这一行来测试你的代码\",\n        \"golfScore(5, 4);\"\n      ],\n      \"solutions\": [\n        \"function golfScore(par, strokes) {\\n  if (strokes === 1) {\\n    return \\\"Hole-in-one!\\\";\\n  }\\n  \\n  if (strokes <= par - 2) {\\n    return \\\"Eagle\\\";\\n  }\\n  \\n  if (strokes === par - 1) {\\n    return \\\"Birdie\\\";\\n  }\\n  \\n  if (strokes === par) {\\n    return \\\"Par\\\";\\n  }\\n  \\n  if (strokes === par + 1) {\\n    return \\\"Bogey\\\";\\n  }\\n  \\n  if(strokes === par + 2) {\\n    return \\\"Double Bogey\\\";\\n  }\\n  \\n  return \\\"Go Home!\\\";\\n}\"\n      ],\n      \"tests\": [\n        \"assert(golfScore(4, 1) === \\\"Hole-in-one!\\\", 'message: <code>golfScore(4, 1)</code> 应该返回 \\\"Hole-in-one!\\\"');\",\n        \"assert(golfScore(4, 2) === \\\"Eagle\\\", 'message: <code>golfScore(4, 2)</code> 应该返回 \\\"Eagle\\\"');\",\n        \"assert(golfScore(5, 2) === \\\"Eagle\\\", 'message: <code>golfScore(5, 2)</code> 应该返回 \\\"Eagle\\\"');\",\n        \"assert(golfScore(4, 3) === \\\"Birdie\\\", 'message: <code>golfScore(4, 3)</code> 应该返回 \\\"Birdie\\\"');\",\n        \"assert(golfScore(4, 4) === \\\"Par\\\", 'message: <code>golfScore(4, 4)</code> 应该返回 \\\"Par\\\"');\",\n        \"assert(golfScore(1, 1) === \\\"Hole-in-one!\\\", 'message: <code>golfScore(1, 1)</code> 应该返回 \\\"Hole-in-one!\\\"');\",\n        \"assert(golfScore(5, 5) === \\\"Par\\\", 'message: <code>golfScore(5, 5)</code> 应该返回 \\\"Par\\\"');\",\n        \"assert(golfScore(4, 5) === \\\"Bogey\\\", 'message: <code>golfScore(4, 5)</code> 应该返回 \\\"Bogey\\\"');\",\n        \"assert(golfScore(4, 6) === \\\"Double Bogey\\\", 'message: <code>golfScore(4, 6)</code> 应该返回 \\\"Double Bogey\\\"');\",\n        \"assert(golfScore(4, 7) === \\\"Go Home!\\\", 'message: <code>golfScore(4, 7)</code> 应该返回 \\\"Go Home!\\\"');\",\n        \"assert(golfScore(5, 9) === \\\"Go Home!\\\", 'message: <code>golfScore(5, 9)</code> 应该返回 \\\"Go Home!\\\"');\"\n      ],\n      \"type\": \"checkpoint\",\n      \"challengeType\": 1\n    },\n    {\n      \"id\": \"56533eb9ac21ba0edf2244dd\",\n      \"title\": \"Selecting from many options with Switch Statements\",\n      \"description\": [\n        \"如果你有非常多的选项需要选择，可以使用switch语句。根据不同的参数值会匹配上不同的case分支，语句会从第一个匹配的case分支开始执行，直到碰到break就结束。\",\n        \"这是一个伪代码案例：\",\n        \"<blockquote>switch (num) {<br>  case value1:<br>    statement1;<br>    break;<br>  case value2:<br>    statement2;<br>    break;<br>...<br>  case valueN:<br>    statementN;<br>    break;<br>}</blockquote>\",\n        \"测试<code>case</code> 值使用严格相等运算符进行比较，break关键字告诉javascript停止执行语句。如果没有break关键字，下一个语句会继续执行。\",\n        \"<h4>任务</h4>\",\n        \"写一个测试 <code>val</code>的switch语句，并且根据下面的条件来设置不同的<code>answer</code>：<br><code>1</code> - \\\"alpha\\\"<br><code>2</code> - \\\"beta\\\"<br><code>3</code> - \\\"gamma\\\"<br><code>4</code> - \\\"delta\\\"\"\n      ],\n      \"releasedOn\": \"January 1, 2016\",\n      \"challengeSeed\": [\n        \"function myTest(val) {\",\n        \"  var answer = \\\"\\\";\",\n        \"  // 请把你的代码写在这条注释以下\",\n        \"  \",\n        \"  \",\n        \"  \",\n        \"  // 请把你的代码写在这条注释以上\",\n        \"  return answer;  \",\n        \"}\",\n        \"\",\n        \"// 你可以修改这一行来测试你的代码\",\n        \"myTest(1);\",\n        \"\"\n      ],\n      \"solutions\": [\n        \"function myTest(val) {\\n  var answer = \\\"\\\";\\n\\n  switch (val) {\\n    case 1:\\n      answer = \\\"alpha\\\";\\n      break;\\n    case 2:\\n      answer = \\\"beta\\\";\\n      break;\\n    case 3:\\n      answer = \\\"gamma\\\";\\n      break;\\n    case 4:\\n      answer = \\\"delta\\\";\\n  }\\n  return answer;  \\n}\"\n      ],\n      \"tests\": [\n        \"assert(myTest(1) === \\\"alpha\\\", 'message: <code>myTest(1) 应该有一个值为 \\\"alpha\\\"');\",\n        \"assert(myTest(2) === \\\"beta\\\", 'message: <code>myTest(2) 应该有一个值为 \\\"beta\\\"');\",\n        \"assert(myTest(3) === \\\"gamma\\\", 'message: <code>myTest(3) 应该有一个值为 \\\"gamma\\\"');\",\n        \"assert(myTest(4) === \\\"delta\\\", 'message: <code>myTest(4) 应该有一个值为 \\\"delta\\\"');\",\n        \"assert(!/else/g.test(code) || !/if/g.test(code), 'message: 不能使用任何 <code>if</code> 或 <code>else</code> 表达式');\",\n        \"assert(code.match(/break/g).length > 2, 'message: 你应该有至少 3 个 <code>break</code> 表达式');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 1\n    },\n    {\n      \"id\": \"56533eb9ac21ba0edf2244de\",\n      \"title\": \"Adding a default option in Switch statements\",\n      \"description\": [\n        \"在<code>switch</code> 语句中你可能无法用case来指定所有情况，这时你可以添加default语句。当再也找不到case匹配的时候default语句会执行，非常类似于if/else组合中的else语句。\",\n        \"<code>default</code>语句应该是最后一个case。\",\n        \"<blockquote>switch (num) {<br>  case value1:<br>    statement1;<br>    break;<br>  case value2:<br>    statement2;<br>    break;<br>...<br>  default:<br>    defaultStatement;<br>}</blockquote>\",\n        \"<h4>任务</h4>\",\n        \"写一个根据下面的条件来设置<code>answer</code>的switch语句：<br><code>\\\"a\\\"</code> - \\\"apple\\\"<br><code>\\\"b\\\"</code> - \\\"bird\\\"<br><code>\\\"c\\\"</code> - \\\"cat\\\"<br><code>default</code> - \\\"stuff\\\"\"\n      ],\n      \"releasedOn\": \"January 1, 2016\",\n      \"challengeSeed\": [\n        \"function myTest(val) {\",\n        \"  var answer = \\\"\\\";\",\n        \"  // 请把你的代码写在这条注释以下\",\n        \"  \",\n        \"  \",\n        \"  \",\n        \"  // 请把你的代码写在这条注释以上\",\n        \"  return answer;  \",\n        \"}\",\n        \"\",\n        \"// 你可以修改这一行来测试你的代码\",\n        \"myTest(1);\",\n        \"\"\n      ],\n      \"solutions\": [\n        \"function myTest(val) {\\n  var answer = \\\"\\\";\\n\\n  switch(val) {\\n    case \\\"a\\\":\\n      answer = \\\"apple\\\";\\n      break;\\n    case \\\"b\\\":\\n      answer = \\\"bird\\\";\\n      break;\\n    case \\\"c\\\":\\n      answer = \\\"cat\\\";\\n      break;\\n    default:\\n      answer = \\\"stuff\\\";\\n  }\\n  return answer;  \\n}\"\n      ],\n      \"tests\": [\n        \"assert(myTest(\\\"a\\\") === \\\"apple\\\", 'message: <code>myTest(\\\"a\\\") 应该有一个值为 \\\"apple\\\"');\",\n        \"assert(myTest(\\\"b\\\") === \\\"bird\\\", 'message: <code>myTest(\\\"b\\\") 应该有一个值为 \\\"bird\\\"');\",\n        \"assert(myTest(\\\"c\\\") === \\\"cat\\\", 'message: <code>myTest(\\\"c\\\") 应该有一个值为 \\\"cat\\\"');\",\n        \"assert(myTest(\\\"d\\\") === \\\"stuff\\\", 'message: <code>myTest(\\\"d\\\") 应该有一个值为 \\\"stuff\\\"');\",\n        \"assert(myTest(4) === \\\"stuff\\\", 'message: <code>myTest(4) 应该有一个值为 \\\"stuff\\\"');\",\n        \"assert(!/else/g.test(code) || !/if/g.test(code), 'message: 不能使用任何 <code>if</code> 或 <code>else</code> 表达式');\",\n        \"assert(code.match(/break/g).length > 2, 'message: 你应该有至少 3 个 <code>break</code> 表达式');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 1\n    },\n    {\n      \"id\": \"56533eb9ac21ba0edf2244df\",\n      \"title\": \"Multiple Identical Options in Switch Statements\",\n      \"description\": [\n        \"如果<code>switch</code>语句中的<code>case</code>分支的<code>break</code> 语句漏掉了，后面的 <code>case</code>语句会一直执行直到遇到<code>break</code>。如果你有多个输入值的输出值一样，可以试试下面的<code>switch</code>语句：\",\n        \"<blockquote>switch(val) {<br>  case 1:<br>  case 2:<br>  case 3:<br>    result = \\\"1, 2, or 3\\\";<br>    break;<br>  case 4:<br>    result = \\\"4 alone\\\";<br>}</blockquote>\",\n        \"分支1、2、3将会产生相同的输出结果。\",\n        \"<h4>任务</h4>\",\n        \"写一个根据下面的范围来设置<code>answer</code> 的switch语句：<br><code>1-3</code> - \\\"Low\\\"<br><code>4-6</code> - \\\"Mid\\\"<br><code>7-9</code> - \\\"High\\\"\",\n        \"<strong>提示</strong><br>你需要为每一个包含数字的范围准备一个<code>answer</code>语句。\"\n      ],\n      \"releasedOn\": \"January 1, 2016\",\n      \"challengeSeed\": [\n        \"function myTest(val) {\",\n        \"  var answer = \\\"\\\";\",\n        \"  // 请把你的代码写在这条注释以下\",\n        \"  \",\n        \"  \",\n        \"  \",\n        \"  // 请把你的代码写在这条注释以上\",\n        \"  return answer;  \",\n        \"}\",\n        \"\",\n        \"// 你可以修改这一行来测试你的代码\",\n        \"myTest(1);\",\n        \"\"\n      ],\n      \"solutions\": [\n        \"function myTest(val) {\\n  var answer = \\\"\\\";\\n  \\n  switch (val) {\\n    case 1:\\n    case 2:\\n    case 3:\\n      answer = \\\"Low\\\";\\n      break;\\n    case 4:\\n    case 5:\\n    case 6:\\n      answer = \\\"Mid\\\";\\n      break;\\n    case 7:\\n    case 8:\\n    case 9:\\n      answer = \\\"High\\\";\\n  }\\n  \\n  return answer;  \\n}\"\n      ],\n      \"tests\": [\n        \"assert(myTest(1) === \\\"Low\\\", 'message: <code>myTest(1)</code> 应该返回 \\\"Low\\\"');\",\n        \"assert(myTest(2) === \\\"Low\\\", 'message: <code>myTest(2)</code> 应该返回 \\\"Low\\\"');\",\n        \"assert(myTest(3) === \\\"Low\\\", 'message: <code>myTest(3)</code> 应该返回 \\\"Low\\\"');\",\n        \"assert(myTest(4) === \\\"Mid\\\", 'message: <code>myTest(4)</code> 应该返回 \\\"Mid\\\"');\",\n        \"assert(myTest(5) === \\\"Mid\\\", 'message: <code>myTest(5)</code> 应该返回 \\\"Mid\\\"');\",\n        \"assert(myTest(6) === \\\"Mid\\\", 'message: <code>myTest(6)</code> 应该返回 \\\"Mid\\\"');\",\n        \"assert(myTest(7) === \\\"High\\\", 'message: <code>myTest(7)</code> 应该返回 \\\"High\\\"');\",\n        \"assert(myTest(8) === \\\"High\\\", 'message: <code>myTest(8)</code> 应该返回 \\\"High\\\"');\",\n        \"assert(myTest(9) === \\\"High\\\", 'message: <code>myTest(9)</code> 应该返回 \\\"High\\\"');\",\n        \"assert(!/else/g.test(code) || !/if/g.test(code), 'message: 不要使用 <code>if</code> 或 <code>else</code> 表达式');\",\n        \"assert(code.match(/case/g).length === 9, 'message: 你应该有 9 个 <code>case</code> 表达式');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 1\n    },\n    {\n      \"id\": \"56533eb9ac21ba0edf2244e0\",\n      \"title\": \"Replacing If Else Chains with Switch\",\n      \"description\": [\n        \"如果你有多个选项需要选择，<code>switch</code> 语句写起来会比多个串联的<code>if</code>/<code>if else</code>语句容易些，譬如:\",\n        \"<blockquote>if (val === 1) {<br>  answer = \\\"a\\\";<br>} else if (val === 2) {<br>  answer = \\\"b\\\";<br>} else {<br>  answer = \\\"c\\\";<br>}</blockquote>\",\n        \"可以被下面替代：\",\n        \"<blockquote>switch (val) {<br>  case 1:<br>    answer = \\\"a\\\";<br>    break;<br>  case 2:<br>    answer = \\\"b\\\";<br>    break;<br>  default:<br>    answer = \\\"c\\\";<br>}</blockquote>\",\n        \"<h4>任务</h4>\",\n        \"把串联的 <code>if</code>/<code>if else</code> 语句改成 <code>switch</code> 语句。\"\n      ],\n      \"releasedOn\": \"January 1, 2016\",\n      \"challengeSeed\": [\n        \"function myTest(val) {\",\n        \"  var answer = \\\"\\\";\",\n        \"  // 请只修改这条注释以下的代码\",\n        \"  \",\n        \"  if (val === \\\"bob\\\") {\",\n        \"    answer = \\\"Marley\\\";\",\n        \"  } else if (val === 42) {\",\n        \"    answer = \\\"The Answer\\\";\",\n        \"  } else if (val === 1) {\",\n        \"    answer = \\\"There is no #1\\\";\",\n        \"  } else if (val === 99) {\",\n        \"    answer = \\\"Missed me by this much!\\\";\",\n        \"  } else if (val === 7) {\",\n        \"    answer = \\\"Ate Nine\\\";\",\n        \"  }\",\n        \"  \",\n        \"  // 请只修改这条注释以上的代码\",\n        \"  return answer;  \",\n        \"}\",\n        \"\",\n        \"// 你可以修改这一行来测试你的代码\",\n        \"myTest(7);\",\n        \"\"\n      ],\n      \"solutions\": [\n        \"function myTest(val) {\\n  var answer = \\\"\\\";\\n\\n  switch (val) {\\n    case \\\"bob\\\":\\n      answer = \\\"Marley\\\";\\n      break;\\n    case 42:\\n      answer = \\\"The Answer\\\";\\n      break;\\n    case 1:\\n      answer = \\\"There is no #1\\\";\\n      break;\\n    case 99:\\n      answer = \\\"Missed me by this much!\\\";\\n      break;\\n    case 7:\\n      answer = \\\"Ate Nine\\\";\\n  }\\n  return answer;  \\n}\"\n      ],\n      \"tests\": [\n        \"assert(!/else/g.test(code), 'message: 不要使用 <code>else</code> 表达式');\",\n        \"assert(!/if/g.test(code), 'message: 不要使用 <code>if</code> 表达式');\",\n        \"assert(code.match(/break/g).length >= 4, 'message: 你应该有至少 4 个 <code>break</code> 表达式');\",\n        \"assert(myTest(\\\"bob\\\") === \\\"Marley\\\", 'message: <code>myTest(\\\"bob\\\")</code> 应该为 \\\"Marley\\\"');\",\n        \"assert(myTest(42) === \\\"The Answer\\\", 'message: <code>myTest(42)</code> 应该为 \\\"The Answer\\\"');\",\n        \"assert(myTest(1) === \\\"There is no #1\\\", 'message: <code>myTest(1)</code> 应该为 \\\"There is no #1\\\"');\",\n        \"assert(myTest(99) === \\\"Missed me by this much!\\\", 'message: <code>myTest(99)</code> 应该为 \\\"Missed me by this much!\\\"');\",\n        \"assert(myTest(7) === \\\"Ate Nine\\\", 'message: <code>myTest(7)</code> 应该为 \\\"Ate Nine\\\"');\",\n        \"assert(myTest(\\\"John\\\") === \\\"\\\", 'message: <code>myTest(\\\"John\\\")</code> 应该为 \\\"\\\" (empty string)');\",\n        \"assert(myTest(156) === \\\"\\\", 'message: <code>myTest(156)</code> 应该为 \\\"\\\" (empty string)');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 1\n    },\n    {\n      \"id\": \"5679ceb97cbaa8c51670a16b\",\n      \"title\": \"Returning Boolean Values from Functions\",\n      \"description\": [\n        \"你可能会回想起<a href=\\\"waypoint-comparison-with-the-equality-operator\\\" target=\\\"_blank\\\">Comparison with the Equality Operator</a> ，所有的比较操作符返回的都是一个boolean值，要么是 <code>true</code> 要么是<code>false</code> 。\",\n        \"使用 <code>if/else</code>语句来做比较然后返回<code>true</code>或<code>false</code>已经成为大家的共识:\",\n        \"<blockquote>function isEqual(a,b) {<br>  if (a === b) {<br>    return true;<br>  } else {<br>    return false;<br>  }<br>}</blockquote>\",\n        \"因为<code>===</code> 总是返回 <code>true</code> 或 <code>false</code>，所以我们可以直接返回比较的结果：\",\n        \"<blockquote>function isEqual(a,b) {<br>  return a === b;<br>}</blockquote>\",\n        \"<h4>任务</h4>\",\n        \"移除<code>isLess</code>函数的<code>if/else</code>语句但不影响函数的功能。\"\n      ],\n      \"releasedOn\": \"January 1, 2016\",\n      \"challengeSeed\": [\n        \"function isLess(a, b) {\",\n        \"  // 请修改这部分代码\",\n        \"  if (a < b) {\",\n        \"    return true;\",\n        \"  } else {\",\n        \"    return false;\",\n        \"  }\",\n        \"}\",\n        \"\",\n        \"// 你可以修改这一行来测试你的代码\",\n        \"isLess(10, 15);\"\n      ],\n      \"tail\": [\n        \"\"\n      ],\n      \"solutions\": [\n        \"function isLess(a, b) {\\n  return a < b;\\n}\"\n      ],\n      \"tests\": [\n        \"assert(isLess(10,15) === true, 'message: <code>isLess(10,15)</code> 应该返回 <code>true</code>');\",\n        \"assert(isLess(15, 10) === false, 'message: <code>isLess(15,10)</code> 应该返回 <code>false</code>');\",\n        \"assert(!/if|else/g.test(code), 'message: 不要使用 <code>if</code> 或 <code>else</code> 表达式');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 1\n    },\n    {\n      \"id\": \"56533eb9ac21ba0edf2244c4\",\n      \"title\": \"Return Early Pattern for Functions\",\n      \"description\": [\n        \"当代码执行到return语句时，函数返回一个结果就结束运行了，return后面的语句根本不会执行。\",\n        \"<strong>举例</strong>\",\n        \"<blockquote>function myFun() {<br>  console.log(\\\"Hello\\\");<br>  return \\\"World\\\";<br>  console.log(\\\"byebye\\\")<br>}<br>myFun();</blockquote>\",\n        \"上面的代码输出\\\"Hello\\\"到控制台、返回 \\\"World\\\"，但没有输出<code>\\\"byebye\\\"</code>，因为函数遇到return语句就退出了。\",\n        \"<h4>任务</h4>\",\n        \"修改函数<code>abTest</code>当<code>a</code>或<code>b</code>小于0时，函数立即返回一个<code>undefined</code>并退出。\",\n        \"<strong>提示</strong><br>记住<a href='understanding-uninitialized-variables' target='_blank'><code>undefined</code></a>，是一个关键字，而不是一个字符串。\"\n      ],\n      \"releasedOn\": \"January 1, 2016\",\n      \"challengeSeed\": [\n        \"// 定义 abTest\",\n        \"function abTest(a, b) {\",\n        \"  // 请把你的代码写在这条注释以下\",\n        \"  \",\n        \"  \",\n        \"  \",\n        \"  // 请把你的代码写在这条注释以上\",\n        \"\",\n        \"  return Math.round(Math.pow(Math.sqrt(a) + Math.sqrt(b), 2));\",\n        \"}\",\n        \"\",\n        \"// 你可以修改这一行来测试你的代码\",\n        \"abTest(2,2);\"\n      ],\n      \"tail\": [\n        \"\"\n      ],\n      \"solutions\": [\n        \"function abTest(a, b) {\\n  if(a < 0 || b < 0) {\\n    return undefined;\\n  } \\n  return Math.round(Math.pow(Math.sqrt(a) + Math.sqrt(b), 2));\\n}\"\n      ],\n      \"tests\": [\n        \"assert(typeof abTest(2,2) === 'number' , 'message: <code>abTest(2,2)</code> 应该返回数字');\",\n        \"assert(abTest(2,2) === 8 , 'message: <code>abTest(2,2)</code> 应该返回 <code>8</code>');\",\n        \"assert(abTest(-2,2) === undefined , 'message: <code>abTest(-2,2)</code> 应该返回 <code>undefined</code>');\",\n        \"assert(abTest(2,-2) === undefined , 'message: <code>abTest(2,-2)</code> 应该返回 <code>undefined</code>');\",\n        \"assert(abTest(2,8) === 18 , 'message: <code>abTest(2,8)</code> 应该返回 <code>18</code>');\",\n        \"assert(abTest(3,3) === 12 , 'message: <code>abTest(3,3)</code> 应该返回 <code>12</code>');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 1\n    },\n    {\n      \"id\": \"565bbe00e9cc8ac0725390f4\",\n      \"title\": \"Counting Cards\",\n      \"description\": [\n        \"在赌场21点游戏中，玩家可以通过计算牌桌上已经发放的卡牌的高低值来让自己在游戏中保持优势，这就叫<a href='https://www.douban.com/note/273781969/' target='_blank'>21点算法</a>。\",\n        \"根据下面的表格，每张卡牌都分配了一个值。如果卡牌的值<count>大于0，那么玩家应该追加赌注。反之，追加少许赌注甚至不追加赌注。\",\n        \"<table class=\\\"table table-striped\\\"><thead><tr><th>Count Change</th><th>Cards</th></tr></thead><tbody><tr><td>+1</td><td>2, 3, 4, 5, 6</td></tr><tr><td>0</td><td>7, 8, 9</td></tr><tr><td>-1</td><td>10, 'J', 'Q', 'K','A'</td></tr></tbody></table>\",\n        \"你需要写一个函数，实现21点算法，它根据参数 <code>card</code>的值来递增或递减变量<code>count</code>，函数返回一个由当前<code>count</code>和 <code>\\\"Bet\\\"</code>(<code>count>0</code>)或<code>\\\"Hold\\\"</code>(<code>count<=0</code>) 拼接的字符串。注意<code>count</code>和<code>\\\"Bet\\\"</code> 或 <code>\\\"Hold\\\"</code>应该用空格分开。\",\n        \"<strong>例如：</strong><br><code>\\\"-3 Hold\\\"<br>\\\"5 Bet\\\"</code>\",\n        \"<strong>提示</strong><br>既然card的值为7、8、9时，count值不变，那我们就可以忽略这种情况。\"\n      ],\n      \"releasedOn\": \"January 1, 2016\",\n      \"challengeSeed\": [\n        \"var count = 0;\",\n        \"\",\n        \"function cc(card) {\",\n        \"  // 请把你的代码写在这条注释以下\",\n        \"  \",\n        \"  \",\n        \"  return \\\"修改这里\\\";\",\n        \"  // 请把你的代码写在这条注释以上\",\n        \"}\",\n        \"\",\n        \"// 你可以在这里添加/删除 cc 方法的调用来测试结果\",\n        \"// 提示: 左边只会显示最后一次执行的返回值\",\n        \"cc(2); cc(3); cc(7); cc('K'); cc('A');\"\n      ],\n      \"solutions\": [\n        \"var count = 0;\\nfunction cc(card) {\\n  switch(card) {\\n    case 2:\\n    case 3:\\n    case 4:\\n    case 5:\\n    case 6:\\n      count++;\\n      break;\\n    case 10:\\n    case 'J':\\n    case 'Q':\\n    case 'K':\\n    case 'A':\\n      count--;\\n  }\\n  if(count > 0) {\\n    return count + \\\" Bet\\\";\\n  } else {\\n    return count + \\\" Hold\\\";\\n  }\\n}\"\n      ],\n      \"tests\": [\n        \"assert((function(){ count = 0; cc(2);cc(3);cc(4);cc(5);var out = cc(6); if(out === \\\"5 Bet\\\") {return true;} return false; })(), 'message: 卡牌序列 2, 3, 4, 5, 6 应该返回 <code>\\\"5 Bet\\\"</code>');\",\n        \"assert((function(){ count = 0; cc(7);cc(8);var out = cc(9); if(out === \\\"0 Hold\\\") {return true;} return false; })(), 'message: 卡牌序列 7, 8, 9 应该返回 <code>\\\"0 Hold\\\"</code>');\",\n        \"assert((function(){ count = 0; cc(10);cc('J');cc('Q');cc('K');var out = cc('A'); if(out === \\\"-5 Hold\\\") {return true;} return false; })(), 'message: 卡牌序列 10, J, Q, K, A 应该返回 <code>\\\"-5 Hold\\\"</code>');\",\n        \"assert((function(){ count = 0; cc(3);cc(7);cc('Q');cc(8);var out = cc('A'); if(out === \\\"-1 Hold\\\") {return true;} return false; })(), 'message: 卡牌序列 3, 7, Q, 8, A 应该返回 <code>\\\"-1 Hold\\\"</code>');\",\n        \"assert((function(){ count = 0; cc(2);cc('J');cc(9);cc(2);var out = cc(7); if(out === \\\"1 Bet\\\") {return true;} return false; })(), 'message: 卡牌序列 2, J, 9, 2, 7 应该返回 <code>\\\"1 Bet\\\"</code>');\",\n        \"assert((function(){ count = 0; cc(3);cc(2);cc('A');cc(10);var out = cc('K'); if(out === \\\"-1 Hold\\\") {return true;} return false; })(), 'message: 卡牌序列 3, 2, A, 10, K 应该返回 <code>\\\"-1 Hold\\\"</code>');\"\n      ],\n      \"type\": \"checkpoint\",\n      \"challengeType\": 1\n    },\n    {\n      \"id\": \"56bbb991ad1ed5201cd392d0\",\n      \"title\": \"Build JavaScript Objects\",\n      \"description\": [\n        \"你之前可能听说过对象 <code>object</code> 。\",\n        \"对象和数组很相似，数组是通过索引来访问和修改数据，对象是通过属性来访问和修改数据的。\",\n        \"这是一个示例对象：\",\n        \"<blockquote>var cat = {<br>  \\\"name\\\": \\\"Whiskers\\\",<br>  \\\"legs\\\": 4,<br>  \\\"tails\\\": 1,<br>  \\\"enemies\\\": [\\\"Water\\\", \\\"Dogs\\\"]<br>};</blockquote>\",\n        \"对象适合用来存储结构化数据，就和真实世界的对象一模一样，比如一只猫。\",\n        \"<h4>任务</h4>\",\n        \"创建一个叫做<code>myDog</code>的对象，它里面有这些属性： <code>名称\\\"name\\\"</code>、 <code>腿\\\"legs\\\"</code>, <code>尾巴\\\"tails\\\"</code>、<code>朋友\\\"friends\\\"</code>。\",\n        \"你可以设置对象属性为任何你想要的值，只要 <code>\\\"name\\\"</code> 是字符串、 <code>\\\"legs\\\"</code> 和 <code>\\\"tails\\\"</code> 是数字、<code>\\\"friends\\\"</code> 是数组。\"\n      ],\n      \"challengeSeed\": [\n        \"// 举例\",\n        \"var ourDog = {\",\n        \"  \\\"name\\\": \\\"Camper\\\",\",\n        \"  \\\"legs\\\": 4,\",\n        \"  \\\"tails\\\": 1,\",\n        \"  \\\"friends\\\": [\\\"everything!\\\"]\",\n        \"};\",\n        \"\",\n        \"// 请只修改这条注释以下的代码\",\n        \"\",\n        \"var myDog = {\",\n        \"  \",\n        \"  \",\n        \"  \",\n        \"  \",\n        \"};\"\n      ],\n      \"tail\": [\n        \"(function(z){return z;})(myDog);\"\n      ],\n      \"solutions\": [\n        \"var myDog = {\\n  \\\"name\\\": \\\"Camper\\\",\\n  \\\"legs\\\": 4,\\n  \\\"tails\\\": 1,\\n  \\\"friends\\\": [\\\"everything!\\\"]  \\n};\"\n      ],\n      \"tests\": [\n        \"assert((function(z){if(z.hasOwnProperty(\\\"name\\\") && z.name !== undefined && typeof z.name === \\\"string\\\"){return true;}else{return false;}})(myDog), 'message: <code>myDog</code> 应该包含 <code>name</code> 属性, 并且是一个字符串');\",\n        \"assert((function(z){if(z.hasOwnProperty(\\\"legs\\\") && z.legs !== undefined && typeof z.legs === \\\"number\\\"){return true;}else{return false;}})(myDog), 'message: <code>myDog</code> 应该包含 <code>legs</code> 属性, 并且是一个数字');\",\n        \"assert((function(z){if(z.hasOwnProperty(\\\"tails\\\") && z.tails !== undefined && typeof z.tails === \\\"number\\\"){return true;}else{return false;}})(myDog), 'message: <code>myDog</code> 应该包含 <code>tails</code> 属性, 并且是一个数字');\",\n        \"assert((function(z){if(z.hasOwnProperty(\\\"friends\\\") && z.friends !== undefined && Array.isArray(z.friends)){return true;}else{return false;}})(myDog), 'message: <code>myDog</code> 应该包含 <code>friends</code> 属性, 并且是一个数组');\",\n        \"assert((function(z){return Object.keys(z).length === 4;})(myDog), 'message: <code>myDog</code> 应该只包含给出的属性');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 1\n    },\n    {\n      \"id\": \"56533eb9ac21ba0edf2244c7\",\n      \"title\": \"Accessing Objects Properties with the Dot Operator\",\n      \"description\": [\n        \"有两种方式访问对象属性，一个是点操作符(<code>.</code>)，一个是中括号操作符(<code>[]</code>)。\",\n        \"当你知道属性的名称的时候，使用点操作符。\",\n        \"这是一个使用点操作符读取对象属性的例子：\",\n        \"<blockquote>var myObj = {<br>  prop1: \\\"val1\\\",<br>  prop2: \\\"val2\\\"<br>};<br>var prop1val = myObj.prop1; // val1<br>var prop2val = myObj.prop2; // val2</blockquote>\",\n        \"<h4>任务</h4>\",\n        \"通过点操作符读取对象<code>testObj</code>，把<code>hat</code>的属性值赋给变量<code>hatValue</code>，把<code>shirt</code>的属性值赋给<code>shirtValue</code>。\"\n      ],\n      \"releasedOn\": \"January 1, 2016\",\n      \"challengeSeed\": [\n        \"// 初始化变量\",\n        \"var testObj = {\",\n        \"  \\\"hat\\\": \\\"ballcap\\\",\",\n        \"  \\\"shirt\\\": \\\"jersey\\\",\",\n        \"  \\\"shoes\\\": \\\"cleats\\\"\",\n        \"};\",\n        \"\",\n        \"// 请只修改这条注释以下的代码\",\n        \"\",\n        \"var hatValue = testObj;      // 请修改这一行\",\n        \"var shirtValue = testObj;    // 请修改这一行\"\n      ],\n      \"tail\": [\n        \"(function(a,b) { return \\\"hatValue = '\\\" + a + \\\"', shirtValue = '\\\" + b + \\\"'\\\"; })(hatValue,shirtValue);\"\n      ],\n      \"solutions\": [\n        \"var testObj = {\\n  \\\"hat\\\": \\\"ballcap\\\",\\n  \\\"shirt\\\": \\\"jersey\\\",\\n  \\\"shoes\\\": \\\"cleats\\\"\\n};\\n\\nvar hatValue = testObj.hat;  \\nvar shirtValue = testObj.shirt;\"\n      ],\n      \"tests\": [\n        \"assert(typeof hatValue === 'string' , 'message: <code>hatValue</code> 应该是一个字符串');\",\n        \"assert(hatValue === 'ballcap' , 'message: <code>hatValue</code> 的值应该是 <code>\\\"ballcap\\\"</code>');\",\n        \"assert(typeof shirtValue === 'string' , 'message: <code>shirtValue</code> 应该是一个字符串');\",\n        \"assert(shirtValue === 'jersey' , 'message: <code>shirtValue</code> 的值应该是 <code>\\\"jersey\\\"</code>');\",\n        \"assert(code.match(/testObj\\\\.\\\\w+/g).length > 1, 'message: 你应该使用点操作符两次');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 1\n    },\n    {\n      \"id\": \"56533eb9ac21ba0edf2244c8\",\n      \"title\": \"Accessing Objects Properties with Bracket Notation\",\n      \"description\": [\n        \"第二种访问对象的方式就是中括号操作符(<code>[]</code>)，如果你想访问的属性的名称有一个空格，这时你只能使用中括号操作符(<code>[]</code>)。\",\n        \"这是一个使用中括号操作符(<code>[]</code>)读取对象属性的例子：\",\n        \"<blockquote>var myObj = {<br>  \\\"Space Name\\\": \\\"Kirk\\\",<br>  \\\"More Space\\\": \\\"Spock\\\"<br>};<br>myObj[\\\"Space Name\\\"]; // Kirk<br>myObj['More Space']; // Spock</blockquote>\",\n        \"提示：属性名称中如果有空格，必须把属性名称用单引号或双引号包裹起来。\",\n        \"<h4>任务</h4>\",\n        \"用中括号操作符读取对象<code>testObj</code>的属性<code>\\\"an entree\\\"</code>值和属性<code>\\\"the drink\\\"</code>值。\"\n      ],\n      \"releasedOn\": \"January 1, 2016\",\n      \"challengeSeed\": [\n        \"// 初始化变量\",\n        \"var testObj = {\",\n        \"  \\\"an entree\\\": \\\"hamburger\\\",\",\n        \"  \\\"my side\\\": \\\"veggies\\\",\",\n        \"  \\\"the drink\\\": \\\"water\\\"\",\n        \"};\",\n        \"\",\n        \"// 请只修改这条注释以下的代码\",\n        \"\",\n        \"var entreeValue = testObj;   // 请修改这一行\",\n        \"var drinkValue = testObj;    // 请修改这一行\"\n      ],\n      \"tail\": [\n        \"(function(a,b) { return \\\"entreeValue = '\\\" + a + \\\"', drinkValue = '\\\" + b + \\\"'\\\"; })(entreeValue,drinkValue);\"\n      ],\n      \"solutions\": [\n        \"var testObj = {\\n  \\\"an entree\\\": \\\"hamburger\\\",\\n  \\\"my side\\\": \\\"veggies\\\",\\n  \\\"the drink\\\": \\\"water\\\"\\n};\\nvar entreeValue = testObj[\\\"an entree\\\"];\\nvar drinkValue = testObj['the drink'];\"\n      ],\n      \"tests\": [\n        \"assert(typeof entreeValue === 'string' , 'message: <code>entreeValue</code> 应该是一个字符串');\",\n        \"assert(entreeValue === 'hamburger' , 'message: <code>entreeValue</code> 的值应该是 <code>\\\"hamburger\\\"</code>');\",\n        \"assert(typeof drinkValue === 'string' , 'message: <code>drinkValue</code> 应该是一个字符串');\",\n        \"assert(drinkValue === 'water' , 'message: <code>drinkValue</code> 的值应该是 <code>\\\"water\\\"</code>');\",\n        \"assert(code.match(/testObj\\\\s*?\\\\[('|\\\")[^'\\\"]+\\\\1\\\\]/g).length > 1, 'message: 你应该使用括号两次');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 1\n    },\n    {\n      \"id\": \"56533eb9ac21ba0edf2244c9\",\n      \"title\": \"Accessing Objects Properties with Variables\",\n      \"description\": [\n        \"中括号操作符的另一个使用方式是用变量来访问一个属性。当你需要遍历对象的属性列表或查表时，这种方式极为有用。\",\n        \"这有一个使用变量来访问属性的例子：\",\n        \"<blockquote>var someProp = \\\"propName\\\";<br>var myObj = {<br>  propName: \\\"Some Value\\\"<br >}<br>myObj[someProp]; // \\\"Some Value\\\"</blockquote>\",\n        \"还有更多：\",\n        \"<blockquote>var myDog = \\\"Hunter\\\";<br>var dogs = {<br>  Fido: \\\"Mutt\\\",\\n  Hunter: \\\"Doberman\\\",\\n  Snoopie: \\\"Beagle\\\"<br >}<br>var breed = dogs[myDog]; <br>console.log(breed)// \\\"Doberman\\\"</blockquote>\",\n        \"提示：当我们通过变量名访问属性的时候，不需要给变量名包裹引号。因为实际上我们使用的是变量的值，而不是变量的名称。\",\n        \"<h4>任务</h4>\",\n        \"使用变量 <code>playerNumber</code>，通过中括号操作符找到 <code>testObj</code> 中 <code>playerNumber</code> 为 <code>16</code> 的值。\"\n      ],\n      \"releasedOn\": \"January 1, 2016\",\n      \"challengeSeed\": [\n        \"// 初始化变量\",\n        \"var testObj = {\",\n        \"  12: \\\"Namath\\\",\",\n        \"  16: \\\"Montana\\\",\",\n        \"  19: \\\"Unitas\\\"\",\n        \"};\",\n        \"\",\n        \"// 请只修改这条注释以下的代码\",\n        \"\",\n        \"var playerNumber;       // 修改这一行\",\n        \"var player = testObj;   // 修改这一行\"\n      ],\n      \"tail\": [\n        \"if(typeof player !== \\\"undefined\\\"){(function(v){return v;})(player);}\"\n      ],\n      \"solutions\": [\n        \"var testObj = {\\n  12: \\\"Namath\\\",\\n  16: \\\"Montana\\\",\\n  19: \\\"Unitas\\\"\\n};\\nvar playerNumber = 16;\\nvar player = testObj[playerNumber];\"\n      ],\n      \"tests\": [\n        \"assert(typeof playerNumber === 'number', 'message: <code>playerNumber</code> 应该是一个数字');\",\n        \"assert(typeof player === 'string', 'message: <code>player</code> 变量应该是字符串');\",\n        \"assert(player === 'Montana', 'message: <code>player</code> 的值应该是 \\\"Montana\\\"');\",\n        \"assert(/testObj\\\\s*?\\\\[\\\\s*playerNumber\\\\s*\\\\]/.test(code),'message: 你应该使用括号访问 <code>testObj</code>');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 1\n    },\n    {\n      \"id\": \"56bbb991ad1ed5201cd392d1\",\n      \"title\": \"Updating Object Properties\",\n      \"description\": [\n        \"当你创建了一个对象后，你可以用点操作符或中括号操作符来更新对象的属性。\",\n        \"举个例子，让我们看看 <code>ourDog</code>:\",\n        \"<blockquote>var ourDog = {<br>  \\\"name\\\": \\\"Camper\\\",<br>  \\\"legs\\\": 4,<br>  \\\"tails\\\": 1,<br>  \\\"friends\\\": [\\\"everything!\\\"]<br>};</blockquote>\",\n        \"让我们更改它的名称为 \\\"Happy Camper\\\"，这有两种方式来更新对象的<code>name</code>属性：\",\n        \"<code>ourDog.name = \\\"Happy Camper\\\";</code>\",\n        \"<code>ourDog[\\\"name\\\"] = \\\"Happy Camper\\\";</code>\",\n        \"<h4>任务</h4>\",\n        \"更新 <code>myDog</code> 对象的<code>name</code>属性，让它的名字从 \\\"Coder\\\" 变成 \\\"Happy Coder\\\"。\"\n      ],\n      \"challengeSeed\": [\n        \"// 举例\",\n        \"var ourDog = {\",\n        \"  \\\"name\\\": \\\"Camper\\\",\",\n        \"  \\\"legs\\\": 4,\",\n        \"  \\\"tails\\\": 1,\",\n        \"  \\\"friends\\\": [\\\"everything!\\\"]\",\n        \"};\",\n        \"\",\n        \"ourDog.name = \\\"Happy Camper\\\";\",\n        \"\",\n        \"// 初始化变量\",\n        \"var myDog = {\",\n        \"  \\\"name\\\": \\\"Coder\\\",\",\n        \"  \\\"legs\\\": 4,\",\n        \"  \\\"tails\\\": 1,\",\n        \"  \\\"friends\\\": [\\\"Free Code Camp Campers\\\"]\",\n        \"};\",\n        \"\",\n        \"// 请把你的代码写在这条注释以下\",\n        \"\",\n        \"\"\n      ],\n      \"tail\": [\n        \"(function(z){return z;})(myDog);\"\n      ],\n      \"solutions\": [\n        \"var myDog = {\\n  \\\"name\\\": \\\"Coder\\\",\\n  \\\"legs\\\": 4,\\n  \\\"tails\\\": 1,\\n  \\\"friends\\\": [\\\"Free Code Camp Campers\\\"]\\n};\\nmyDog.name = \\\"Happy Coder\\\";\"\n      ],\n      \"tests\": [\n        \"assert(/happy coder/gi.test(myDog.name), 'message: 更新 <code>myDog</code> 的 <code>\\\"name\\\"</code> 属性, 使其等于 \\\"Happy Coder\\\".');\",\n        \"assert(/\\\"name\\\": \\\"Coder\\\"/.test(code), 'message: 不要修改 <code>myDog</code> 的定义');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 1\n    },\n    {\n      \"id\": \"56bbb991ad1ed5201cd392d2\",\n      \"title\": \"Add New Properties to a JavaScript Object\",\n      \"description\": [\n        \"你也可以像更改属性一样给对象添加属性。\",\n        \"看看我们是如何给<code>ourDog</code>添加 <code>\\\"bark\\\"</code>属性：\",\n        \"<code>ourDog.bark = \\\"bow-wow\\\";</code> \",\n        \"或者\",\n        \"<code>ourDog[\\\"bark\\\"] = \\\"bow-wow\\\";</code>\",\n        \"<h4>任务</h4>\",\n        \"给<code>myDog</code>添加一个<code>\\\"bark\\\"</code> 属性，设置它的值为狗的声音，例如：\\\"woof\\\"。\"\n      ],\n      \"challengeSeed\": [\n        \"// 举例\",\n        \"var ourDog = {\",\n        \"  \\\"name\\\": \\\"Camper\\\",\",\n        \"  \\\"legs\\\": 4,\",\n        \"  \\\"tails\\\": 1,\",\n        \"  \\\"friends\\\": [\\\"everything!\\\"]\",\n        \"};\",\n        \"\",\n        \"ourDog.bark = \\\"bow-wow\\\";\",\n        \"\",\n        \"// 初始化变量\",\n        \"var myDog = {\",\n        \"  \\\"name\\\": \\\"Happy Coder\\\",\",\n        \"  \\\"legs\\\": 4,\",\n        \"  \\\"tails\\\": 1,\",\n        \"  \\\"friends\\\": [\\\"Free Code Camp Campers\\\"]\",\n        \"};\",\n        \"\",\n        \"// 请把你的代码写在这条注释以下\",\n        \"\"\n      ],\n      \"tail\": [\n        \"(function(z){return z;})(myDog);\"\n      ],\n      \"solutions\": [\n        \"var myDog = {\\n  \\\"name\\\": \\\"Happy Coder\\\",\\n  \\\"legs\\\": 4,\\n  \\\"tails\\\": 1,\\n  \\\"friends\\\": [\\\"Free Code Camp Campers\\\"]\\n};\\nmyDog.bark = \\\"Woof Woof\\\";\"\n      ],\n      \"tests\": [\n        \"assert(myDog.bark !== undefined, 'message: 给 <code>myDog</code> 添加 <code>\\\"bark\\\"</code> 属性');\",\n        \"assert(!/bark[^\\\\n]:/.test(code), 'message: 不能在 setup 的地方添加 <code>\\\"bark\\\"</code> 属性');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 1\n    },\n    {\n      \"id\": \"56bbb991ad1ed5201cd392d3\",\n      \"title\": \"Delete Properties from a JavaScript Object\",\n      \"description\": [\n        \"我们同样可以删除对象的属性，例如：\",\n        \"<code>delete ourDog.bark;</code>\",\n        \"<h4>任务</h4>\",\n        \"删除<code>myDog</code>对象的<code>\\\"tails\\\"</code>属性。\"\n      ],\n      \"challengeSeed\": [\n        \"// 举例\",\n        \"var ourDog = {\",\n        \"  \\\"name\\\": \\\"Camper\\\",\",\n        \"  \\\"legs\\\": 4,\",\n        \"  \\\"tails\\\": 1,\",\n        \"  \\\"friends\\\": [\\\"everything!\\\"],\",\n        \"  \\\"bark\\\": \\\"bow-wow\\\"\",\n        \"};\",\n        \"\",\n        \"delete ourDog.bark;\",\n        \"\",\n        \"// 初始化变量\",\n        \"var myDog = {\",\n        \"  \\\"name\\\": \\\"Happy Coder\\\",\",\n        \"  \\\"legs\\\": 4,\",\n        \"  \\\"tails\\\": 1,\",\n        \"  \\\"friends\\\": [\\\"Free Code Camp Campers\\\"],\",\n        \"  \\\"bark\\\": \\\"woof\\\"\",\n        \"};\",\n        \"\",\n        \"// 请把你的代码写在这条注释以下\",\n        \"\",\n        \"\"\n      ],\n      \"tail\": [\n        \"(function(z){return z;})(myDog);\"\n      ],\n      \"solutions\": [\n        \"var ourDog = {\\n  \\\"name\\\": \\\"Camper\\\",\\n  \\\"legs\\\": 4,\\n  \\\"tails\\\": 1,\\n  \\\"friends\\\": [\\\"everything!\\\"],\\n  \\\"bark\\\": \\\"bow-wow\\\"\\n};\\n\\nvar myDog = {\\n  \\\"name\\\": \\\"Happy Coder\\\",\\n  \\\"legs\\\": 4,\\n  \\\"tails\\\": 1,\\n  \\\"friends\\\": [\\\"Free Code Camp Campers\\\"],\\n  \\\"bark\\\": \\\"woof\\\"\\n};\\n\\ndelete myDog.tails;\"\n      ],\n      \"tests\": [\n        \"assert(myDog.tails === undefined, 'message: 从 <code>myDog</code> 中删除 <code>\\\"tails\\\"</code> 属性');\",\n        \"assert(code.match(/\\\"tails\\\": 1/g).length > 1, 'message: 不能修改 <code>myDog</code> 的 setup 部分');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 1\n    },\n    {\n      \"id\": \"56533eb9ac21ba0edf2244ca\",\n      \"title\": \"Using Objects for Lookups\",\n      \"description\": [\n        \"对象和字典一样，可以用来存储键/值对。如果你的数据跟对象一样，你可以用对象来查找你想要的值，而不是使用switch或if/else语句。当你知道你的输入数据在某个范围时，这种查找方式极为有效。\",\n        \"这是简单的反向字母表：\",\n        \"<blockquote>var alpha = {<br>  1:\\\"Z\\\",<br>  2:\\\"Y\\\",<br>  3:\\\"X\\\",<br>  4:\\\"W\\\",<br>  ...<br>  24:\\\"C\\\",<br>  25:\\\"B\\\",<br>  26:\\\"A\\\"<br>};<br>alpha[2]; // \\\"Y\\\"<br>alpha[24]; // \\\"C\\\"<br><br>var value = 2;<br>alpha[value]; // \\\"Y\\\"</blockquote>\",\n        \"<h4>任务</h4>\",\n        \"把switch语句转化为一个叫做lookup的对象。\"\n      ],\n      \"releasedOn\": \"January 1, 2016\",\n      \"challengeSeed\": [\n        \"// 定义 phoneticLookup\",\n        \"function phoneticLookup(val) {\",\n        \"  var result = \\\"\\\";\",\n        \"\",\n        \"  // 请只修改这条注释以下的代码\",\n        \"  switch(val) {\",\n        \"    case \\\"alpha\\\": \",\n        \"      result = \\\"Adams\\\";\",\n        \"      break;\",\n        \"    case \\\"bravo\\\": \",\n        \"      result = \\\"Boston\\\";\",\n        \"      break;\",\n        \"    case \\\"charlie\\\": \",\n        \"      result = \\\"Chicago\\\";\",\n        \"      break;\",\n        \"    case \\\"delta\\\": \",\n        \"      result = \\\"Denver\\\";\",\n        \"      break;\",\n        \"    case \\\"echo\\\": \",\n        \"      result = \\\"Easy\\\";\",\n        \"      break;\",\n        \"    case \\\"foxtrot\\\": \",\n        \"      result = \\\"Frank\\\";\",\n        \"  }\",\n        \"\",\n        \"  // 请只修改这条注释以上的代码\",\n        \"  return result;\",\n        \"}\",\n        \"\",\n        \"// 你可以修改这一行来测试你的代码\",\n        \"phoneticLookup(\\\"charlie\\\");\"\n      ],\n      \"solutions\": [\n        \"function phoneticLookup(val) {\\n  var result = \\\"\\\";\\n\\n  var lookup = {\\n    alpha: \\\"Adams\\\",\\n    bravo: \\\"Boston\\\",\\n    charlie: \\\"Chicago\\\",\\n    delta: \\\"Denver\\\",\\n    echo: \\\"Easy\\\",\\n    foxtrot: \\\"Frank\\\"\\n  };\\n\\n  result = lookup[val];\\n\\n  return result;\\n}\"\n      ],\n      \"tests\": [\n        \"assert(phoneticLookup(\\\"alpha\\\") === 'Adams', 'message: <code>phoneticLookup(\\\"alpha\\\")</code> 应该等于 <code>\\\"Adams\\\"</code>');\",\n        \"assert(phoneticLookup(\\\"bravo\\\") === 'Boston', 'message: <code>phoneticLookup(\\\"bravo\\\")</code> 应该等于 <code>\\\"Boston\\\"</code>');\",\n        \"assert(phoneticLookup(\\\"charlie\\\") === 'Chicago', 'message: <code>phoneticLookup(\\\"charlie\\\")</code> 应该等于 <code>\\\"Chicago\\\"</code>');\",\n        \"assert(phoneticLookup(\\\"delta\\\") === 'Denver', 'message: <code>phoneticLookup(\\\"delta\\\")</code> 应该等于 <code>\\\"Denver\\\"</code>');\",\n        \"assert(phoneticLookup(\\\"echo\\\") === 'Easy', 'message: <code>phoneticLookup(\\\"echo\\\")</code> 应该等于 <code>\\\"Easy\\\"</code>');\",\n        \"assert(phoneticLookup(\\\"foxtrot\\\") === 'Frank', 'message: <code>phoneticLookup(\\\"foxtrot\\\")</code> 应该等于 <code>\\\"Frank\\\"</code>');\",\n        \"assert(typeof phoneticLookup(\\\"\\\") === 'undefined', 'message: <code>phoneticLookup(\\\"\\\")</code> 应该等于 <code>undefined</code>');\",\n        \"assert(!/case|switch|if/g.test(code), 'message: 不能使用 <code>case</code>, <code>switch</code>, 或 <code>if</code> 语句'); \"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 1\n    },\n    {\n      \"id\": \"567af2437cbaa8c51670a16c\",\n      \"title\": \"Testing Objects for Properties\",\n      \"description\": [\n        \"有时检查一个对象属性是否存在是非常有用的，我们可以用<code>.hasOwnProperty(propname)</code>方法来检查对象是否有该属性。如果有返回<code>true</code>，反之返回 <code>false</code>。\",\n        \"<strong>举例</strong>\",\n        \"<blockquote>var myObj = {<br>  top: \\\"hat\\\",<br>  bottom: \\\"pants\\\"<br>};<br>myObj.hasOwnProperty(\\\"top\\\");    // true<br>myObj.hasOwnProperty(\\\"middle\\\"); // false</blockquote>\",\n        \"<h4>任务</h4>\",\n        \"修改函数<code>checkObj</code>检查<code>myObj</code>是否有<code>checkProp</code>属性，如果属性存在，返回属性对应的值，如果不存在，返回 <code>\\\"Not Found\\\"</code>。\",\n        \"注意：如果你需要通过变量来访问对象的属性值，请用中括号操作符，点操作符不支持变量。\"\n      ],\n      \"releasedOn\": \"January 1, 2016\",\n      \"challengeSeed\": [\n        \"// 初始化变量\",\n        \"var myObj = {\",\n        \"  gift: \\\"pony\\\",\",\n        \"  pet: \\\"kitten\\\",\",\n        \"  bed: \\\"sleigh\\\"\",\n        \"};\",\n        \"\",\n        \"function checkObj(checkProp) {\",\n        \"  // 请把你的代码写在这条注释以下\",\n        \"  \",\n        \"  return \\\"修改这里\\\";\",\n        \"}\",\n        \"\",\n        \"// 你可以修改这一行来测试你的代码\",\n        \"checkObj(\\\"gift\\\");\"\n      ],\n      \"tail\": [\n        \"\"\n      ],\n      \"solutions\": [\n        \"var myObj = {\\n  gift: \\\"pony\\\",\\n  pet: \\\"kitten\\\",\\n  bed: \\\"sleigh\\\"\\n};\\nfunction checkObj(checkProp) {\\n  if(myObj.hasOwnProperty(checkProp)) {\\n    return myObj[checkProp];\\n  } else {\\n    return \\\"Not Found\\\";\\n  }\\n}\"\n      ],\n      \"tests\": [\n        \"assert(checkObj(\\\"gift\\\") === \\\"pony\\\", 'message: <code>checkObj(\\\"gift\\\")</code> 应该返回 <code>\\\"pony\\\"</code>.');\",\n        \"assert(checkObj(\\\"pet\\\") === \\\"kitten\\\", 'message: <code>checkObj(\\\"pet\\\")</code> 应该返回  <code>\\\"kitten\\\"</code>.');\",\n        \"assert(checkObj(\\\"house\\\") === \\\"Not Found\\\", 'message: <code>checkObj(\\\"house\\\")</code> 应该返回 <code>\\\"Not Found\\\"</code>.');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 1\n    },\n    {\n      \"id\": \"56533eb9ac21ba0edf2244cb\",\n      \"title\": \"Introducing JavaScript Object Notation (JSON)\",\n      \"description\": [\n        \"JavaScript Object Notation 简称 <code>JSON</code>，它使用JavaScript对象的格式来存储数据。JSON是灵活的，因为它允许 <dfn>数据结构</dfn> 是 <dfn>字符串</dfn>，<dfn>数字</dfn>，<dfn>布尔值</dfn>，<dfn>函数</dfn>，和 <dfn>对象</dfn> 的任意组合。\",\n        \"这里是一个JSON对象的示例：\",\n        \"<blockquote>var ourMusic = [<br>  {<br>    \\\"artist\\\": \\\"Daft Punk\\\",<br>    \\\"title\\\": \\\"Homework\\\",<br>    \\\"release_year\\\": 1997,<br>    \\\"formats\\\": [ <br>      \\\"CD\\\", <br>      \\\"Cassette\\\", <br>      \\\"LP\\\" ],<br>    \\\"gold\\\": true<br>  }<br>];</blockquote>\",\n        \"这是一个对象数组，并且对象有各种关于专辑的 <dfn>详细信息</dfn>。它也有一个嵌套的 <code>formats</code> 的数组。附加专辑记录可以被添加到数组的最上层。\",\n        \"<strong>提示</strong><br>数组中有多个 JSON 对象的时候，对象与对象之间要用逗号隔开。\",\n        \"<h4>任务</h4>\",\n        \"添加一个新专辑到 <code>myMusic</code> 的JSON对象。添加 <code>artist</code> 和 <code>title</code> 字符串，<code>release_year</code> 数字和 <code>formats</code> 字符串数组。\"\n      ],\n      \"releasedOn\": \"January 1, 2016\",\n      \"challengeSeed\": [\n        \"var myMusic = [\",\n        \"  {\",\n        \"    \\\"artist\\\": \\\"Billy Joel\\\",\",\n        \"    \\\"title\\\": \\\"Piano Man\\\",\",\n        \"    \\\"release_year\\\": 1973,\",\n        \"    \\\"formats\\\": [ \",\n        \"      \\\"CS\\\", \",\n        \"      \\\"8T\\\", \",\n        \"      \\\"LP\\\" ],\",\n        \"    \\\"gold\\\": true\",\n        \"  }\",\n        \"  // 请在这里添加专辑\",\n        \"];\",\n        \"\"\n      ],\n      \"tail\": [\n        \"(function(x){ if (Array.isArray(x)) { return JSON.stringify(x); } return \\\"myMusic is not an array\\\"})(myMusic);\"\n      ],\n      \"solutions\": [\n        \"var myMusic = [\\n  {\\n    \\\"artist\\\": \\\"Billy Joel\\\",\\n    \\\"title\\\": \\\"Piano Man\\\",\\n    \\\"release_year\\\": 1973,\\n    \\\"formats\\\": [ \\n      \\\"CS\\\", \\n      \\\"8T\\\", \\n      \\\"LP\\\" ],\\n    \\\"gold\\\": true\\n  }, \\n  {\\n    \\\"artist\\\": \\\"ABBA\\\",\\n    \\\"title\\\": \\\"Ring Ring\\\",\\n    \\\"release_year\\\": 1973,\\n    \\\"formats\\\": [ \\n      \\\"CS\\\", \\n      \\\"8T\\\", \\n      \\\"LP\\\",\\n    \\\"CD\\\",\\n  ]\\n  }\\n];\"\n      ],\n      \"tests\": [\n        \"assert(Array.isArray(myMusic), 'message: <code>myMusic</code> 应该是一个数组');\",\n        \"assert(myMusic.length > 1, 'message: <code>myMusic</code> 应该至少包含两个元素');\",\n        \"assert(typeof myMusic[1] === 'object', 'message: <code>myMusic[1]</code> 应该是一个对象');\",\n        \"assert(Object.keys(myMusic[1]).length > 3, 'message: <code>myMusic[1]</code> 至少要包含四个属性');\",\n        \"assert(myMusic[1].hasOwnProperty('artist') && typeof myMusic[1].artist === 'string', 'message: <code>myMusic[1]</code> 应该包含一个类型为字符串的 <code>artist</code> 属性');\",\n        \"assert(myMusic[1].hasOwnProperty('title') && typeof myMusic[1].title === 'string', 'message: <code>myMusic[1]</code> 应该包含一个类型为字符串的 <code>title</code> 属性');\",\n        \"assert(myMusic[1].hasOwnProperty('release_year') && typeof myMusic[1].release_year === 'number', 'message: <code>myMusic[1]</code> 应该包含一个类型为数字的 <code>release_year</code> 属性');\",\n        \"assert(myMusic[1].hasOwnProperty('formats') && Array.isArray(myMusic[1].formats), 'message: <code>myMusic[1]</code> 应该包含一个类型为数组的 <code>formats</code> 属性');\",\n        \"assert(myMusic[1].formats.every(function(item) { return (typeof item === \\\"string\\\")}) && myMusic[1].formats.length > 1, 'message: <code>formats</code> 应该是一个至少包含两个字符串元素的数组');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 1\n    },\n    {\n      \"id\": \"56533eb9ac21ba0edf2244cc\",\n      \"title\": \"Accessing Nested Objects in JSON\",\n      \"description\": [\n        \"通过串联起来的点操作符或中括号操作符来访问JSON对象的嵌套属性。\",\n        \"下面是一个嵌套的JSON对象：\",\n        \"<blockquote>var ourStorage = {<br>  \\\"desk\\\": {<br>    \\\"drawer\\\": \\\"stapler\\\"<br>  },<br>  \\\"cabinet\\\": {<br>    \\\"top drawer\\\": { <br>      \\\"folder1\\\": \\\"a file\\\",<br>      \\\"folder2\\\": \\\"secrets\\\"<br>    },<br>    \\\"bottom drawer\\\": \\\"soda\\\"<br>  }<br>}<br>ourStorage.cabinet[\\\"top drawer\\\"].folder2;  // \\\"secrets\\\"<br>ourStorage.desk.drawer; // \\\"stapler\\\"</blockquote>\",\n        \"<h4>任务</h4>\",\n        \"检索JSON对象 <code>myStorage</code> 中嵌套属性 <code>glove box</code> 的值。因为属性的名字带有空格，请使用中括号操作符来访问属性的值。\"\n      ],\n      \"releasedOn\": \"January 1, 2016\",\n      \"challengeSeed\": [\n        \"// 初始化变量\",\n        \"var myStorage = {\",\n        \"  \\\"car\\\": {\",\n        \"    \\\"inside\\\": {\",\n        \"      \\\"glove box\\\": \\\"maps\\\",\",\n        \"      \\\"passenger seat\\\": \\\"crumbs\\\"\",\n        \"     },\",\n        \"    \\\"outside\\\": {\",\n        \"      \\\"trunk\\\": \\\"jack\\\"\",\n        \"    }\",\n        \"  }\",\n        \"};\",\n        \"\",\n        \"// 请只修改这条注释以下的代码\",\n        \"\",\n        \"var gloveBoxContents = \\\"\\\"; // 请修改这一行\",\n        \"\"\n      ],\n      \"tail\": [\n        \"(function(x) { \",\n        \"  if(typeof x != 'undefined') { \",\n        \"    return \\\"gloveBoxContents = \\\" + x;\",\n        \"  }\",\n        \"  return \\\"gloveBoxContents is undefined\\\";\",\n        \"})(gloveBoxContents);\"\n      ],\n      \"solutions\": [\n        \"var myStorage = {  \\n  \\\"car\\\":{  \\n    \\\"inside\\\":{  \\n      \\\"glove box\\\":\\\"maps\\\",\\n      \\\"passenger seat\\\":\\\"crumbs\\\"\\n    },\\n    \\\"outside\\\":{  \\n      \\\"trunk\\\":\\\"jack\\\"\\n    }\\n  }\\n};\\nvar gloveBoxContents = myStorage.car.inside[\\\"glove box\\\"];\"\n      ],\n      \"tests\": [\n        \"assert(gloveBoxContents === \\\"maps\\\", 'message: <code>gloveBoxContents</code> 应该等于 \\\"maps\\\"');\",\n        \"assert(/=\\\\s*myStorage\\\\.car\\\\.inside\\\\[(\\\"|')glove box\\\\1\\\\]/g.test(code), 'message: 使用点和方括号访问 <code>myStorage</code>');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 1\n    },\n    {\n      \"id\": \"56533eb9ac21ba0edf2244cd\",\n      \"title\": \"Accessing Nested Arrays in JSON\",\n      \"description\": [\n        \"正如我们在前面的例子所见，JSON对象可以嵌套对象和数组。与访问嵌套对象一样，用中括号操作符同样可以访问嵌套数组。\",\n        \"下面是如何访问嵌套数组的例子：\",\n        \"<blockquote>var ourPets = { <br>  \\\"cats\\\": [<br>    \\\"Meowzer\\\",<br>    \\\"Fluffy\\\",<br>    \\\"Kit-Cat\\\"<br>  ],<br>  \\\"dogs\\\": [<br>    \\\"Spot\\\",<br>    \\\"Bowser\\\",<br>    \\\"Frankie\\\"<br>  ]<br>};<br>ourPets.cats[1]; // \\\"Fluffy\\\"<br>ourPets.dogs[0]; // \\\"Spot\\\"</blockquote>\",\n        \"<h4>任务</h4>\",\n        \"使用点操作符和中括号操作符来检索变量 <code>myPlants</code> 的第二棵树。\"\n      ],\n      \"releasedOn\": \"January 1, 2016\",\n      \"challengeSeed\": [\n        \"// 初始化变量\",\n        \"var myPlants = [\",\n        \"  { \",\n        \"    type: \\\"flowers\\\",\",\n        \"    list: [\",\n        \"      \\\"rose\\\",\",\n        \"      \\\"tulip\\\",\",\n        \"      \\\"dandelion\\\"\",\n        \"    ]\",\n        \"  },\",\n        \"  {\",\n        \"    type: \\\"trees\\\",\",\n        \"    list: [\",\n        \"      \\\"fir\\\",\",\n        \"      \\\"pine\\\",\",\n        \"      \\\"birch\\\"\",\n        \"    ]\",\n        \"  }  \",\n        \"];\",\n        \"\",\n        \"// 请只修改这条注释以下的代码\",\n        \"\",\n        \"var secondTree = \\\"\\\"; // 请修改这一行\",\n        \"\"\n      ],\n      \"tail\": [\n        \"(function(x) { \",\n        \"  if(typeof x != 'undefined') { \",\n        \"    return \\\"secondTree = \\\" + x;\",\n        \"  }\",\n        \"  return \\\"secondTree is undefined\\\";\",\n        \"})(secondTree);\"\n      ],\n      \"solutions\": [\n        \"var myPlants = [\\n  { \\n    type: \\\"flowers\\\",\\n    list: [\\n      \\\"rose\\\",\\n      \\\"tulip\\\",\\n      \\\"dandelion\\\"\\n    ]\\n  },\\n  {\\n    type: \\\"trees\\\",\\n    list: [\\n      \\\"fir\\\",\\n      \\\"pine\\\",\\n      \\\"birch\\\"\\n    ]\\n  }  \\n];\\n\\n// Only change code below this line\\n\\nvar secondTree = myPlants[1].list[1];\"\n      ],\n      \"tests\": [\n        \"assert(secondTree === \\\"pine\\\", 'message: <code>secondTree</code> 应该等于 \\\"pine\\\"');\",\n        \"assert(/=\\\\s*myPlants\\\\[1\\\\].list\\\\[1\\\\]/.test(code), 'message: 使用点和方括号访问 <code>myPlants</code>');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 1\n    },\n    {\n      \"id\": \"cf1111c1c11feddfaeb5bdef\",\n      \"title\": \"Iterate with JavaScript For Loops\",\n      \"description\": [\n        \"一个条件语句只能执行一次代码，而一个循环语句可以多次执行代码。\",\n        \"JavaScript 中最常见的循环就是“<code>for循环</code>”。\",\n        \"for循环中的三个表达式用分号隔开：\",\n        \"<code>for ([初始化]; [条件判断]; [计数器])</code>\",\n        \"<code>初始化</code>语句只会在执行循环开始之前执行一次。它通常用于定义和设置你的循环变量。\",\n        \"<code>条件判断</code>语句会在每一轮循环的开始执行，只要条件判断为 <code>true</code> 就会继续执行循环。当条件为 <code>false</code>的时候，循环将停止执行。这意味着，如果条件在一开始就为 <code>false</code>，这个循环将不会执行。\",\n        \"<code>计数器</code>是在每一轮循环结束时执行，通常用于递增或递减。\",\n        \"在下面的例子中，先初始化<code>i = 0</code>，条件 <code>i < 5</code> 为真，进入第一次循环，执行大括号里的代码，第一次循环结束。递增<code>i</code>的值，条件判断，就这样依次执行下去，直到条件判断为假，整个循环结束。\",\n        \"<blockquote>var ourArray = [];<br>for (var i = 0; i < 5; i++) {<br>  ourArray.push(i);<br>}</blockquote>\",\n        \"最终 <code>ourArray</code> 的值为 <code>[0,1,2,3,4]</code>.\",\n        \"<h4>任务</h4>\",\n        \"使用 <code>for</code> 循环把从 1 到 5 添加进 <code>myArray</code> 中。\",\n        \"for循环就是if条件语句的进化版。\"\n      ],\n      \"challengeSeed\": [\n        \"// 举例\",\n        \"var ourArray = [];\",\n        \"\",\n        \"for (var i = 0; i < 5; i++) {\",\n        \"  ourArray.push(i);\",\n        \"}\",\n        \"\",\n        \"// 初始化变量\",\n        \"var myArray = [];\",\n        \"\",\n        \"// 请把你的代码写在这条注释以下\",\n        \"\",\n        \"\"\n      ],\n      \"tail\": [\n        \"if (typeof myArray !== \\\"undefined\\\"){(function(){return myArray;})();}\"\n      ],\n      \"solutions\": [\n        \"var ourArray = [];\\nfor (var i = 0; i < 5; i++) {\\n  ourArray.push(i);\\n}\\nvar myArray = [];\\nfor (var i = 1; i < 6; i++) {\\n  myArray.push(i);\\n}\"\n      ],\n      \"tests\": [\n        \"assert(code.match(/for\\\\s*\\\\(/g).length > 1, 'message: 你应该使用 <code>for</code> 循环');\",\n        \"assert.deepEqual(myArray, [1,2,3,4,5], 'message: <code>myArray</code> 应该等于 <code>[1,2,3,4,5]</code>.');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 1\n    },\n    {\n      \"id\": \"56104e9e514f539506016a5c\",\n      \"title\": \"Iterate Odd Numbers With a For Loop\",\n      \"description\": [\n        \"for循环可以按照我们指定的顺序来迭代，通过更改我们的 <code>计数器</code>，我们可以按照偶数顺序来迭代。\",\n        \"初始化 <code>i = 0</code>，当 <code>i < 10</code> 的时候继续循环。\",\n        \"<code>i += 2</code> 让 <code>i</code> 每次循环之后增加2。\",\n        \"<blockquote>var ourArray = [];<br>for (var i = 0; i < 10; i += 2) {<br>  ourArray.push(i);<br>}</blockquote>\",\n        \"循环结束后，<code>ourArray</code> 的值为 <code>[0,2,4,6,8]</code>。\",\n        \"改变 <code>计数器</code>，这样我们可以用奇数来数。\",\n        \"<h4>任务</h4>\",\n        \"写一个 <code>for</code> 循环，把从1到9的奇数添加到 <code>myArray</code>。\"\n      ],\n      \"challengeSeed\": [\n        \"// 举例\",\n        \"var ourArray = [];\",\n        \"\",\n        \"for (var i = 0; i < 10; i += 2) {\",\n        \"  ourArray.push(i);\",\n        \"}\",\n        \"\",\n        \"// 初始化变量\",\n        \"var myArray = [];\",\n        \"\",\n        \"// 请把你的代码写在这条注释以下\",\n        \"\",\n        \"\"\n      ],\n      \"tail\": [\n        \"if(typeof myArray !== \\\"undefined\\\"){(function(){return myArray;})();}\"\n      ],\n      \"solutions\": [\n        \"var ourArray = [];\\nfor (var i = 0; i < 10; i += 2) {\\n  ourArray.push(i);\\n}\\nvar myArray = [];\\nfor (var i = 1; i < 10; i += 2) {\\n  myArray.push(i);\\n}\"\n      ],\n      \"tests\": [\n        \"assert(code.match(/for\\\\s*\\\\(/g).length > 1, 'message: 你应该使用 <code>for</code> 循环');\",\n        \"assert.deepEqual(myArray, [1,3,5,7,9], 'message: <code>myArray</code> 应该等于 <code>[1,3,5,7,9]</code>.');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 1\n    },\n    {\n      \"id\": \"56105e7b514f539506016a5e\",\n      \"title\": \"Count Backwards With a For Loop\",\n      \"description\": [\n        \"for循环也可以逆向迭代，只要我们定义好合适的条件。\",\n        \"为了能够从后往前两两倒数，我们需要改变我们的 <code>初始化</code>，<code>条件判断</code> 和 <code>计数器</code>。\",\n        \"我们让 <code>i = 10</code>，并且当 <code>i > 0</code> 的时候才继续循环。我们使用 <code>i-=2</code> 来让 <code>i</code> 每次循环递减 2。\",\n        \"<blockquote>var ourArray = [];<br>for (var i=10; i > 0; i-=2) {<br>  ourArray.push(i);<br>}</blockquote>\",\n        \"循环结束后，<code>ourArray</code> 的值为 <code>[10,8,6,4,2]</code>。\",\n        \"让我们改变 <code>初始化</code> 和 <code>计数器</code>，这样我们就可以按照奇数从后往前两两倒着数。\",\n        \"<h4>任务</h4>\",\n        \"使用一个 <code>for</code> 循环，把9到1的奇数添加进 <code>myArray</code>。\"\n      ],\n      \"challengeSeed\": [\n        \"// 举例\",\n        \"var ourArray = [];\",\n        \"\",\n        \"for (var i = 10; i > 0; i -= 2) {\",\n        \"  ourArray.push(i);\",\n        \"}\",\n        \"\",\n        \"// 初始化变量\",\n        \"var myArray = [];\",\n        \"\",\n        \"// 请把你的代码写在这条注释以下\",\n        \"\"\n      ],\n      \"tail\": [\n        \"if(typeof myArray !== \\\"undefined\\\"){(function(){return myArray;})();}\"\n      ],\n      \"solutions\": [\n        \"var ourArray = [];\\nfor (var i = 10; i > 0; i -= 2) {\\n  ourArray.push(i);\\n}\\nvar myArray = [];\\nfor (var i = 9; i > 0; i -= 2) {\\n  myArray.push(i);\\n}\"\n      ],\n      \"tests\": [\n        \"assert(code.match(/for\\\\s*\\\\(/g).length > 1, 'message: 你应该使用 <code>for</code> 循环');\",\n        \"assert.deepEqual(myArray, [9,7,5,3,1], 'message: <code>myArray</code> 应该等于 <code>[9,7,5,3,1]</code>.');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 1\n    },\n    {\n      \"id\": \"5675e877dbd60be8ad28edc6\",\n      \"title\": \"Iterate Through an Array with a For Loop\",\n      \"description\": [\n        \"迭代输出一个数组的每个元素是 JavaScript 中的常见需求， <code>for</code> 循环可以做到这一点。\",\n        \"下面的代码将输出数组  <code>arr</code> 的每个元素到控制台：\",\n        \"<blockquote>var arr = [10,9,8,7,6];<br>for (var i=0; i < arr.length; i++) {<br>   console.log(arr[i]);<br>}</blockquote>\",\n        \"记住数组的索引从零开始的，这意味着数组的最后一个元素的下标是：数组的长度 - 1。我们这个循环的 <dfn>条件</dfn> 是 <code>i < arr.length</code>，当 <code>i</code> 的值为 长度-1 的时候循环就停止了。\",\n        \"<h4>任务</h4>\",\n        \"声明并初始化一个变量 <code>total</code> 为 <code>0</code>。使用 <code>for</code> 循环，使得 <code>total</code> 的值为 <code>myArr</code> 的数组中的每个元素的值的总和。\"\n      ],\n      \"releasedOn\": \"January 1, 2016\",\n      \"challengeSeed\": [\n        \"// 举例\",\n        \"var ourArr = [ 9, 10, 11, 12];\",\n        \"var ourTotal = 0;\",\n        \"\",\n        \"for (var i = 0; i < ourArr.length; i++) {\",\n        \"  ourTotal += ourArr[i];\",\n        \"}\",\n        \"\",\n        \"// 初始化变量\",\n        \"var myArr = [ 2, 3, 4, 5, 6];\",\n        \"\",\n        \"// 请把你的代码写在这条注释以下\",\n        \"\",\n        \"\"\n      ],\n      \"tail\": [\n        \"(function(){if(typeof total !== 'undefined') { return \\\"total = \\\" + total; } else { return \\\"total is undefined\\\";}})()\"\n      ],\n      \"solutions\": [\n        \"var ourArr = [ 9, 10, 11, 12];\\nvar ourTotal = 0;\\n\\nfor (var i = 0; i < ourArr.length; i++) {\\n  ourTotal += ourArr[i];\\n}\\n\\nvar myArr = [ 2, 3, 4, 5, 6];\\nvar total = 0;\\n\\nfor (var i = 0; i < myArr.length; i++) {\\n  total += myArr[i];\\n}\"\n      ],\n      \"tests\": [\n        \"assert(code.match(/var\\\\s*total\\\\s*=\\\\s*0\\\\s*;/), 'message: <code>total</code> 应该被声明, 并且初始化值为 0');\",\n        \"assert(total === 20, 'message: <code>total</code> 应该等于 20');\",\n        \"assert(code.match(/for\\\\s*\\\\(/g).length > 1 && code.match(/myArr\\\\s*\\\\[/), 'message: 你应该使用 <code>for</code> 循环在 <code>myArr</code> 中遍历');\",\n        \"assert(!code.match(/total[\\\\s\\\\+\\\\-]*=\\\\s*(\\\\d(?!\\\\s*;)|[1-9])/g), 'message: 不能直接把 <code>total</code> 设置成 20');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 1\n    },\n    {\n      \"id\": \"56533eb9ac21ba0edf2244e1\",\n      \"title\": \"Nesting For Loops\",\n      \"description\": [\n        \"如果你有一个二维数组，可以使用相同的逻辑，先遍历外面的数组，再遍历里面的子数组。下面是一个例子：\",\n        \"<blockquote>var arr = [<br>  [1,2], [3,4], [5,6]<br>];<br>for (var i=0; i &lt; arr.length; i++) {<br>  for (var j=0; j &lt; arr[i].length; j++) {<br>    console.log(arr[i][j]);<br>  }<br>}</blockquote>\",\n        \"一次输出 <code>arr</code> 中的每个子元素。提示，对于内部循环，我们可以通过 <code>arr[i]</code> 的 <code>.length</code> 来获得子数组的长度，因为 <code>arr[i]</code> 的本身就是一个数组。\",\n        \"<h4>任务</h4>\",\n        \"修改函数 <code>multiplyAll</code>，获得 <code>arr</code> 内部数组的每个数字相乘的结果 <code>product</code>。\"\n      ],\n      \"releasedOn\": \"January 1, 2016\",\n      \"challengeSeed\": [\n        \"function multiplyAll(arr) {\",\n        \"  var product = 1;\",\n        \"  // 请把你的代码写在这条注释以下\",\n        \"  \",\n        \"  // 请把你的代码写在这条注释以上\",\n        \"  return product;\",\n        \"}\",\n        \"\",\n        \"// 你可以修改这一行来测试你的代码\",\n        \"multiplyAll([[1,2],[3,4],[5,6,7]]);\",\n        \"\"\n      ],\n      \"tail\": [\n        \"\"\n      ],\n      \"solutions\": [\n        \"function multiplyAll(arr) {\\n  var product = 1;\\n  for (var i = 0; i < arr.length; i++) {\\n    for (var j = 0; j < arr[i].length; j++) {\\n      product *= arr[i][j];\\n    }\\n  }\\n  return product;\\n}\\n\\nmultiplyAll([[1,2],[3,4],[5,6,7]]);\"\n      ],\n      \"tests\": [\n        \"assert(multiplyAll([[1],[2],[3]]) === 6, 'message: <code>multiplyAll([[1],[2],[3]]);</code> 应该返回 <code>6</code>');\",\n        \"assert(multiplyAll([[1,2],[3,4],[5,6,7]]) === 5040, 'message: <code>multiplyAll([[1,2],[3,4],[5,6,7]])</code> 应该返回 <code>5040</code>');\",\n        \"assert(multiplyAll([[5,1],[0.2, 4, 0.5],[3, 9]]) === 54, 'message: <code>multiplyAll([[5,1],[0.2, 4, 0.5],[3, 9]]);)</code> 应该返回 <code>54</code>');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 1\n    },\n    {\n      \"id\": \"cf1111c1c11feddfaeb1bdef\",\n      \"title\": \"Iterate with JavaScript While Loops\",\n      \"description\": [\n        \"另一种类型的 JavaScript 循环被称为<code>while循环</code>，因为它规定，当（while）条件为真，循环才会执行，反之不执行。\",\n        \"<blockquote>var ourArray = [];<br>var i = 0;<br>while(i < 5) {<br>  ourArray.push(i);<br>  i++;<br>}</blockquote>\",\n        \"<h4>任务</h4>\",\n        \"通过一个 <code>while</code> 循环，把从 0 到 4 的值添加到 <code>myArray</code> 中。\"\n      ],\n      \"challengeSeed\": [\n        \"// 初始化变量\",\n        \"var myArray = [];\",\n        \"\",\n        \"// 请把你的代码写在这条注释以下\",\n        \"\",\n        \"\"\n      ],\n      \"tail\": [\n        \"if(typeof myArray !== \\\"undefined\\\"){(function(){return myArray;})();}\"\n      ],\n      \"solutions\": [\n        \"var myArray = [];\\nvar i = 0;\\nwhile(i < 5) {\\n  myArray.push(i);\\n  i++;\\n}\"\n      ],\n      \"tests\": [\n        \"assert(code.match(/while/g), 'message: 你应该使用 <code>while</code> 循环');\",\n        \"assert.deepEqual(myArray, [0,1,2,3,4], 'message: <code>myArray</code> 应该等于 <code>[0,1,2,3,4]</code>.');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 1\n    },\n    {\n      \"id\": \"5688e62ea601b2482ff8422b\",\n      \"title\": \"Profile Lookup\",\n      \"description\": [\n        \"我们有一个对象数组，里面存储着通讯录。\",\n        \"函数 <code>lookUp</code> 有两个预定义参数：<code>firstName</code>值和<code>prop</code>属性 。\",\n        \"函数将会检查通讯录中是否存在一个与传入的 <code>firstName</code> 相同的联系人。如果存在，那么还需要检查对应的联系人中是否存在 <code>prop</code>属性。\",\n        \"如果它们都存在，函数返回<code>prop</code>属性对应的值。\",\n        \"如果<code>firstName</code> 值不存在，返回 <code>\\\"No such contact\\\"</code>。\",\n        \"如果<code>prop</code> 属性不存在，返回 <code>\\\"No such property\\\"</code>。\",\n        \"\"\n      ],\n      \"releasedOn\": \"January 8, 2016\",\n      \"challengeSeed\": [\n        \"//初始化变量\",\n        \"var contacts = [\",\n        \"    {\",\n        \"        \\\"firstName\\\": \\\"Akira\\\",\",\n        \"        \\\"lastName\\\": \\\"Laine\\\",\",\n        \"        \\\"number\\\": \\\"0543236543\\\",\",\n        \"        \\\"likes\\\": [\\\"Pizza\\\", \\\"Coding\\\", \\\"Brownie Points\\\"]\",\n        \"    },\",\n        \"    {\",\n        \"        \\\"firstName\\\": \\\"Harry\\\",\",\n        \"        \\\"lastName\\\": \\\"Potter\\\",\",\n        \"        \\\"number\\\": \\\"0994372684\\\",\",\n        \"        \\\"likes\\\": [\\\"Hogwarts\\\", \\\"Magic\\\", \\\"Hagrid\\\"]\",\n        \"    },\",\n        \"    {\",\n        \"        \\\"firstName\\\": \\\"Sherlock\\\",\",\n        \"        \\\"lastName\\\": \\\"Holmes\\\",\",\n        \"        \\\"number\\\": \\\"0487345643\\\",\",\n        \"        \\\"likes\\\": [\\\"Intriguing Cases\\\", \\\"Violin\\\"]\",\n        \"    },\",\n        \"    {\",\n        \"        \\\"firstName\\\": \\\"Kristian\\\",\",\n        \"        \\\"lastName\\\": \\\"Vos\\\",\",\n        \"        \\\"number\\\": \\\"unknown\\\",\",\n        \"        \\\"likes\\\": [\\\"Javascript\\\", \\\"Gaming\\\", \\\"Foxes\\\"]\",\n        \"    }\",\n        \"];\",\n        \"\",\n        \"\",\n        \"function lookUp(firstName, prop){\",\n        \"// 请把你的代码写在这条注释以下\",\n        \"\",\n        \"// 请把你的代码写在这条注释以上\",\n        \"}\",\n        \"\",\n        \"// 你可以修改这一行来测试你的代码\",\n        \"lookUp(\\\"Akira\\\", \\\"likes\\\");\"\n      ],\n      \"solutions\": [\n        \"var contacts = [\\n    {\\n        \\\"firstName\\\": \\\"Akira\\\",\\n        \\\"lastName\\\": \\\"Laine\\\",\\n        \\\"number\\\": \\\"0543236543\\\",\\n        \\\"likes\\\": [\\\"Pizza\\\", \\\"Coding\\\", \\\"Brownie Points\\\"]\\n    },\\n    {\\n        \\\"firstName\\\": \\\"Harry\\\",\\n        \\\"lastName\\\": \\\"Potter\\\",\\n        \\\"number\\\": \\\"0994372684\\\",\\n        \\\"likes\\\": [\\\"Hogwarts\\\", \\\"Magic\\\", \\\"Hagrid\\\"]\\n    },\\n    {\\n        \\\"firstName\\\": \\\"Sherlock\\\",\\n        \\\"lastName\\\": \\\"Holmes\\\",\\n        \\\"number\\\": \\\"0487345643\\\",\\n        \\\"likes\\\": [\\\"Intriguing Cases\\\", \\\"Violin\\\"]\\n    },\\n    {\\n        \\\"firstName\\\": \\\"Kristian\\\",\\n        \\\"lastName\\\": \\\"Vos\\\",\\n        \\\"number\\\": \\\"unknown\\\",\\n        \\\"likes\\\": [\\\"Javascript\\\", \\\"Gaming\\\", \\\"Foxes\\\"]\\n    },\\n];\\n\\n\\n//Write your function in between these comments\\nfunction lookUp(name, prop){\\n    for(var i in contacts){\\n      if(contacts[i].firstName === name) {\\n        return contacts[i][prop] || \\\"No such property\\\";\\n      }\\n    }\\n   return \\\"No such contact\\\";\\n}\\n//Write your function in between these comments\\n\\nlookUp(\\\"Akira\\\", \\\"likes\\\");\"\n      ],\n      \"tests\": [\n        \"assert(lookUp('Kristian','lastName') === \\\"Vos\\\", 'message: <code>\\\"Kristian\\\", \\\"lastName\\\"</code> 应该返回 <code>\\\"Vos\\\"</code>');\",\n        \"assert.deepEqual(lookUp(\\\"Sherlock\\\", \\\"likes\\\"), [\\\"Intriguing Cases\\\", \\\"Violin\\\"], 'message: <code>\\\"Sherlock\\\", \\\"likes\\\"</code> 应该返回 <code>[\\\"Intriguing Cases\\\", \\\"Violin\\\"]</code>');\",\n        \"assert(typeof lookUp(\\\"Harry\\\", \\\"likes\\\") === \\\"object\\\", 'message: <code>\\\"Harry\\\",\\\"likes\\\"</code> 应该返回一个数组');\",\n        \"assert(lookUp(\\\"Bob\\\", \\\"number\\\") === \\\"No such contact\\\", 'message: <code>\\\"Bob\\\", \\\"number\\\"</code> 应该返回 \\\"No such contact\\\"');\",\n        \"assert(lookUp(\\\"Akira\\\", \\\"address\\\") === \\\"No such property\\\", 'message: <code>\\\"Akira\\\", \\\"address\\\"</code> 应该返回 \\\"No such property\\\"');\"\n      ],\n      \"type\": \"checkpoint\",\n      \"challengeType\": 1\n    },\n    {\n      \"id\": \"cf1111c1c11feddfaeb9bdef\",\n      \"title\": \"Generate Random Fractions with JavaScript\",\n      \"description\": [\n        \"计算机的行为只有两种：确定性和随机性。当你一步步地闯关来到这里就是确定行为，当你随意点了个链接就来到这里就是随机行为。\",\n        \"而随机数最适合用来创建这种随机行为。\",\n        \"<code>Math.random()</code>用来生成一个在0(包括0)到1(不包括1)之间的随机小数，因此<code>Math.random()</code>可能返回0但绝不会返回1。\",\n        \"<strong>提示</strong><br>随后的函数都会在<code>return</code>执行前调用，所以我们可以直接返回<code>Math.random()</code>的值。\",\n        \"<h4>任务</h4>\",\n        \"更改<code>myFunction</code> 来生成一个随机数取代 <code>0</code>。\"\n      ],\n      \"challengeSeed\": [\n        \"function myFunction() {\",\n        \"\",\n        \"  // 请把你的代码写在这条注释以下\",\n        \"\",\n        \"  return 0;\",\n        \"\",\n        \"  // 请把你的代码写在这条注释以上\",\n        \"}\"\n      ],\n      \"tail\": [\n        \"(function(){return myFunction();})();\"\n      ],\n      \"solutions\": [\n        \"function myFunction() {\\n  return Math.random();\\n}\"\n      ],\n      \"tests\": [\n        \"assert(typeof myFunction() === \\\"number\\\", 'message: <code>myFunction</code> 应该返回一个随机数');\",\n        \"assert((myFunction()+''). match(/\\\\./g), 'message: <code>myFunction</code> 应该返回一个小数');\",\n        \"assert(code.match(/Math\\\\.random/g).length >= 0, 'message: 需要使用 <code>Math.random</code> 生成随机的小数');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 1\n    },\n    {\n      \"id\": \"cf1111c1c12feddfaeb1bdef\",\n      \"title\": \"Generate Random Whole Numbers with JavaScript\",\n      \"description\": [\n        \"生成随机小数很棒，但随机数更有用的地方在于生成随机整数。\",\n        \"<ol><li>用 <code>Math.random()</code> 生成一个随机小数。</li><li>把这个随机小数乘以 <code>20</code>。</li><li>用 <code>Math.floor()</code> 向下取整 获得它最近的整数。</li></ol>\",\n        \"记住 <code>Math.random()</code> 永远不会返回 <code>1</code>。同时因为我们是在用 <code>Math.floor()</code> 向下取整，所以最终我们获得的结果不可能有 <code>20</code>。这确保了我们获得了一个在0到19之间的整数。\",\n        \"把操作连缀起来，代码类似于下面：\",\n        \"<code>Math.floor(Math.random() * 20);</code>\",\n        \"我们先调用 <code>Math.random()</code>，把它的结果乘以20，然后把上一步的结果传给 <code>Math.floor()</code>，最终通过向下取整获得最近的整数。\",\n        \"<h4>任务</h4>\",\n        \"生成一个 <code>0</code> 到 <code>9</code>之间的随机整数。\"\n      ],\n      \"challengeSeed\": [\n        \"var randomNumberBetween0and19 = Math.floor(Math.random() * 20);\",\n        \"\",\n        \"function myFunction() {\",\n        \"\",\n        \"  // 请把你的代码写在这条注释以下\",\n        \"\",\n        \"  return Math.random();\",\n        \"}\"\n      ],\n      \"tail\": [\n        \"(function(){return myFunction();})();\"\n      ],\n      \"solutions\": [\n        \"var randomNumberBetween0and19 = Math.floor(Math.random() * 20);\\n\\nfunction myFunction() {\\n  return Math.floor(Math.random() * 10);\\n}\"\n      ],\n      \"tests\": [\n        \"assert(typeof myFunction() === \\\"number\\\" && (function(){var r = myFunction();return Math.floor(r) === r;})(), 'message: <code>myFunction</code> 的结果应该是一个整数');\",\n        \"assert(code.match(/Math.random/g).length > 1, 'message: 需要使用 <code>Math.random</code> 生成随机数字');\",\n        \"assert(code.match(/\\\\(\\\\s*?Math.random\\\\s*?\\\\(\\\\s*?\\\\)\\\\s*?\\\\*\\\\s*?10\\\\s*?\\\\)/g) || code.match(/\\\\(\\\\s*?10\\\\s*?\\\\*\\\\s*?Math.random\\\\s*?\\\\(\\\\s*?\\\\)\\\\s*?\\\\)/g), 'message: 你应该将 <code>Math.random</code> 的结果乘以 10 来生成 0 到 9 之间的随机数');\",\n        \"assert(code.match(/Math.floor/g).length > 1, 'message: 你需要使用 <code>Math.floor</code> 移除数字中的小数部分');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 1\n    },\n    {\n      \"id\": \"cf1111c1c12feddfaeb2bdef\",\n      \"title\": \"Generate Random Whole Numbers within a Range\",\n      \"description\": [\n        \"我们之前生成的随机数是在0到某个数之间，现在我们要生成的随机数是在两个指定的数之间。\",\n        \"我们需要定义一个最小值和一个最大值。\",\n        \"下面是我们将要使用的方法，仔细看看并尝试理解这行代码到底在干嘛：\",\n        \"<code>Math.floor(Math.random() * (max - min + 1)) + min</code>\",\n        \"<h4>任务</h4>\",\n        \"创建一个叫<code>randomRange</code>的函数，参数为myMin和myMax，返回一个在<code>myMin</code>(包括myMin)和<code>myMax</code>(包括myMax)之间的随机数。\"\n      ],\n      \"challengeSeed\": [\n        \"// 举例\",\n        \"function ourFunction(ourMin, ourMax) {\",\n        \"\",\n        \"  return Math.floor(Math.random() * (ourMax - ourMin + 1)) + ourMin;\",\n        \"}\",\n        \"\",\n        \"ourFunction(1, 9);\",\n        \"\",\n        \"// 请把你的代码写在这条注释以下\",\n        \"\",\n        \"function randomRange(myMin, myMax) {\",\n        \"\",\n        \"  return 0; // 请修改这一行\",\n        \"\",\n        \"}\",\n        \"\",\n        \"// 你可以修改这一行来测试你的代码\",\n        \"var myRandom = randomRange(5, 15);\"\n      ],\n      \"tail\": [\n        \"var calcMin = 100;\",\n        \"var calcMax = -100;\",\n        \"for(var i = 0; i < 100; i++) {\",\n        \"  var result = randomRange(5,15);\",\n        \"  calcMin = Math.min(calcMin, result);\",\n        \"  calcMax = Math.max(calcMax, result);\",\n        \"}\",\n        \"(function(){\",\n        \"  if(typeof myRandom === 'number') {\",\n        \"    return \\\"myRandom = \\\" + myRandom;\",\n        \"  } else {\",\n        \"    return \\\"myRandom undefined\\\";\",\n        \"  }\",\n        \"})();\"\n      ],\n      \"solutions\": [\n        \"function randomRange(myMin, myMax) {\\n  return Math.floor(Math.random() * (myMax - myMin + 1)) + myMin;\\n}\"\n      ],\n      \"tests\": [\n        \"assert(calcMin === 5, 'message: <code>randomRange</code> 返回的随机数应该大于或等于 <code>myMin</code>.');\",\n        \"assert(calcMax === 15, 'message: <code>randomRange</code> 返回的随机数应该小于或等于 <code>myMax</code>.');\",\n        \"assert(randomRange(0,1) % 1 === 0 , 'message: <code>randomRange</code> 应该返回一个随机整数, 而不是小数');\",\n        \"assert((function(){if(code.match(/myMax/g).length > 1 && code.match(/myMin/g).length > 2 && code.match(/Math.floor/g) && code.match(/Math.random/g)){return true;}else{return false;}})(), 'message: <code>randomRange</code> 应该使用 <code>myMax</code> 和 <code>myMin</code>, 并且返回两者之间的随机数');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 1\n    },\n    {\n      \"id\": \"cf1111c1c12feddfaeb6bdef\",\n      \"title\": \"Sift through Text with Regular Expressions\",\n      \"description\": [\n        \"<code>Regular expressions</code> 正则表达式被用来根据某种匹配模式来寻找<code>strings</code>中的某些单词。\",\n        \"举例：如果我们想要找到字符串<code>The dog chased the cat</code>中单词 <code>the</code>，我们可以使用下面的正则表达式: <code>/the/gi</code>\",\n        \"我们可以把这个正则表达式分成几段：\",\n        \"<code>/</code> 是这个正则表达式的头部\",\n        \"<code>the</code> 是我们想要匹配的模式\",\n        \"<code>/</code> 是这个正则表达式的尾部\",\n        \"<code>g</code> 代表着 <code>global</code>(全局)，意味着返回所有的匹配而不仅仅是第一个。\",\n        \"<code>i</code> 代表着忽略大小写，意思是当我们寻找匹配的字符串的时候忽略掉字母的大小写。\",\n        \"<h4>任务</h4>\",\n        \"用全局、忽略大小写的模式选取字符串 <code>testString</code>中所有的单词 <code>and</code>。\",\n        \"你可以尝试把 <code>.</code> 替换成 <code>and</code>。\"\n      ],\n      \"head\": [\n        \"\"\n      ],\n      \"challengeSeed\": [\n        \"// 初始化变量\",\n        \"var testString = \\\"Ada Lovelace and Charles Babbage designed the first computer and the software that would have run on it.\\\";\",\n        \"\",\n        \"// 举例\",\n        \"var expressionToGetSoftware = /software/gi;\",\n        \"var softwareCount = testString.match(expressionToGetSoftware).length;\",\n        \"  \",\n        \"\",\n        \"// 请只修改这条注释以下的代码\",\n        \"\",\n        \"var expression = /./gi;  // 请修改这一行\",\n        \"\",\n        \"// 请只修改这条注释以上的代码\",\n        \"\",\n        \"// 用 andCount 存储 testString 中匹配到 expression 的次数\",\n        \"var andCount = testString.match(expression).length;\",\n        \"\"\n      ],\n      \"tail\": [\n        \"(function(){return andCount;})();\"\n      ],\n      \"solutions\": [\n        \"var testString = \\\"Ada Lovelace and Charles Babbage designed the first computer and the software that would have run on it.\\\";\\nvar expression = /and/gi;  // Change this Line\\nvar andCount = testString.match(expression).length;\"\n      ],\n      \"tests\": [\n        \"assert(andCount==2, 'message: 你的正则表达式应该找到两个 <code>and</code>');\",\n        \"assert(code.match(/\\\\/and\\\\/gi/), 'message: 使用正则表达式在 <code>testString</code> 中找到单词 <code>and</code>');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 1\n    },\n    {\n      \"id\": \"cf1111c1c12feddfaeb7bdef\",\n      \"title\": \"Find Numbers with Regular Expressions\",\n      \"description\": [\n        \"我们可以在正则表达式中使用特殊选择器来选取特殊类型的值。\",\n        \"特殊选择器中的一种就是数字选择器<code>\\\\d</code>，意思是被用来获取一个字符串的数字。\",\n        \"在JavaScript中, 数字选择器类似于: <code>/\\\\d/g</code>。\",\n        \"在选择器后面添加一个加号标记(<code>+</code>)，例如：<code>/\\\\d+/g</code>，它允许这个正则表达式匹配一个或更多数字。\",\n        \"尾部的<code>g</code>是'global'的简写，意思是允许这个正则表达式 找到所有的匹配而不是仅仅找到第一个匹配。\",\n        \"<h4>任务</h4>\",\n        \"用 <code>\\\\d</code> 选择器来选取字符串中的所有数字。\"\n      ],\n      \"head\": [\n        \"\"\n      ],\n      \"challengeSeed\": [\n        \"// 初始化变量\",\n        \"var testString = \\\"There are 3 cats but 4 dogs.\\\";\",\n        \"\",\n        \"// 请只修改这条注释以下的代码\",\n        \"\",\n        \"var expression = /.+/g;  // 请修改这一行\",\n        \"\",\n        \"// 请只修改这条注释以上的代码\",\n        \"\",\n        \"// 用 digitCount 存储 testString 中匹配到 expression 的次数\",\n        \"var digitCount = testString.match(expression).length;\"\n      ],\n      \"tail\": [\n        \"(function(){return digitCount;})();\"\n      ],\n      \"solutions\": [\n        \"var testString = \\\"There are 3 cats but 4 dogs.\\\";\\nvar expression = /\\\\d+/g;  // Change this line\\nvar digitCount = testString.match(expression).length;\"\n      ],\n      \"tests\": [\n        \"assert(digitCount === 2, 'message: 你的正则表达式应该在 <code>testString</code> 中找到两个数字');\",\n        \"assert(code.match(/\\\\/\\\\\\\\d\\\\+\\\\//g), 'message: 使用 <code>/\\\\d+/g</code> 正则表达式在 <code>testString</code> 中查找数字');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 1\n    },\n    {\n      \"id\": \"cf1111c1c12feddfaeb8bdef\",\n      \"title\": \"Find Whitespace with Regular Expressions\",\n      \"description\": [\n        \"我们也可以使用正则表达式选择器 <code>\\\\s</code> 来选择一个字符串中的空白。\",\n        \"空白字符有 <code>\\\" \\\"</code> (空格符)、<code>\\\\r</code> (回车符)、<code>\\\\n</code> (换行符)、<code>\\\\t</code> (制表符) 和 <code>\\\\f</code> (换页符)。\",\n        \"空白正则表达式类似于：\",\n        \"<code>/\\\\s+/g</code>\",\n        \"<h4>任务</h4>\",\n        \"用 <code>\\\\s</code> 选取句子中的所有空白字符。\"\n      ],\n      \"head\": [\n        \"\"\n      ],\n      \"challengeSeed\": [\n        \"// 初始化变量\",\n        \"var testString = \\\"How many spaces are there in this sentence?\\\";\",\n        \"\",\n        \"// 请只修改这条注释以下的代码\",\n        \"\",\n        \"var expression = /.+/g;  // 请修改这一行\",\n        \"\",\n        \"// 请只修改这条注释以上的代码\",\n        \"\",\n        \"// 用 spaceCount 存储 testString 中匹配到 expression 的次数\",\n        \"var spaceCount = testString.match(expression).length;\"\n      ],\n      \"tail\": [\n        \"(function(){return spaceCount;})();\"\n      ],\n      \"solutions\": [\n        \"var testString = \\\"How many spaces are there in this sentence?\\\";\\nvar expression = /\\\\s+/g;  // Change this line\\nvar spaceCount = testString.match(expression).length;\"\n      ],\n      \"tests\": [\n        \"assert(spaceCount === 7, 'message: 你的正则表达式应该在 <code>testString</code> 中找到七个空白');\",\n        \"assert(code.match(/\\\\/\\\\\\\\s\\\\+\\\\//g), 'message: 使用 <code>/\\\\s+/g</code> 正则表达式在 <code>testString</code> 查找空白字符');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 1\n    },\n    {\n      \"id\": \"cf1111c1c13feddfaeb3bdef\",\n      \"title\": \"Invert Regular Expression Matches with JavaScript\",\n      \"description\": [\n        \"你可以用正则表达式选择器的大写版本 来转化任何匹配。\",\n        \"举个例子：<code>\\\\s</code> 匹配任何空白字符，<code>\\\\S</code> 匹配任何非空白字符。\",\n        \"<h4>任务</h4>\",\n        \"用 <code>/\\\\S/g</code> 来匹配字符串<code>testString</code>中的所有非空白字符。\"\n      ],\n      \"head\": [\n        \"\"\n      ],\n      \"challengeSeed\": [\n        \"// 初始化变量\",\n        \"var testString = \\\"How many non-space characters are there in this sentence?\\\";\",\n        \"\",\n        \"// 请只修改这条注释以下的代码\",\n        \"\",\n        \"var expression = /.+/g;  // 请修改这一行\",\n        \"\",\n        \"// 请只修改这条注释以上的代码\",\n        \"\",\n        \"// 用 nonSpaceCount 存储 testString 中匹配到 expression 的次数\",\n        \"var nonSpaceCount = testString.match(expression).length;\"\n      ],\n      \"tail\": [\n        \"(function(){return nonSpaceCount;})();\"\n      ],\n      \"solutions\": [\n        \"var testString = \\\"How many non-space characters are there in this sentence?\\\";\\nvar expression = /\\\\S/g;  \\nvar nonSpaceCount = testString.match(expression).length;\"\n      ],\n      \"tests\": [\n        \"assert(nonSpaceCount === 49, 'message: 你的正则表达式应该在 <code>testString</code> 中找到 49 个非空白的字符');\",\n        \"assert(code.match(/\\\\/\\\\\\\\S\\\\/g/g), 'message: 使用 <code>/\\\\S/g</code> 正则表达式在 <code>testString</code> 中查找非空白字符');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 1\n    },\n    {\n      \"id\": \"cf1111c1c12feddfaeb9bdef\",\n      \"title\": \"Create a JavaScript Slot Machine\",\n      \"description\": [\n        \"现在把我们之前的所学的知识点结合起来完成一个老虎机游戏。\",\n        \"这次我们生成3个随机数，范围在1到3之间。\",\n        \"分别用 <code>slotOne</code>、<code>slotTwo</code>、<code>slotThree</code>来存储着3个随机数。\",\n        \"用我们之前的所学来生成<a href='generate-random-whole-numbers-within-a-range' target='_blank'>随机数</a>)：\",\n        \"<code>Math.floor(Math.random() * (3 - 1 + 1)) + 1;</code>\"\n      ],\n      \"challengeSeed\": [\n        \"fccss\",\n        \"  function runSlots() {\",\n        \"    var slotOne;\",\n        \"    var slotTwo;\",\n        \"    var slotThree;\",\n        \"   \",\n        \"    var images = [\\\"//i.imgur.com/9H17QFk.png\\\", \\\"//i.imgur.com/9RmpXTy.png\\\", \\\"//i.imgur.com/VJnmtt5.png\\\"];\",\n        \"   \",\n        \"    // 请把你的代码写在这条注释以下\",\n        \"    \",\n        \"    \",\n        \"    \",\n        \"    // 请把你的代码写在这条注释以上\",\n        \"    \",\n        \"    \",\n        \"    if (slotOne !== undefined && slotTwo !== undefined && slotThree !== undefined) {\",\n        \"      $(\\\".logger\\\").html(slotOne + \\\" \\\" + slotTwo + \\\" \\\" + slotThree);\",\n        \"    }\",\n        \"    \",\n        \"    \",\n        \"    $(\\\".logger\\\").append(\\\" Not A Win\\\")\",\n        \"    return [slotOne, slotTwo, slotThree];\",\n        \"  }\",\n        \"\",\n        \"  $(document).ready(function() {\",\n        \"     $(\\\".go\\\").click(function() {\",\n        \"       runSlots();\",\n        \"     });\",\n        \"   });\",\n        \"fcces\",\n        \" \",\n        \"<div>\",\n        \" <div class = \\\"container inset\\\">\",\n        \"   <div class = \\\"header inset\\\">\",\n        \"     <img src=\\\"/images/freecodecamp_logo.svg\\\" alt=\\\"learn to code JavaScript at Free Code Camp logo\\\" class=\\\"img-responsive nav-logo\\\">\",\n        \"     <h2>FCC Slot Machine</h2>\",\n        \"   </div>\",\n        \"   <div class = \\\"slots inset\\\">\",\n        \"     <div class = \\\"slot inset\\\">\",\n        \"       \",\n        \"     </div>\",\n        \"     <div class = \\\"slot inset\\\">\",\n        \"       \",\n        \"     </div>\",\n        \"     <div class = \\\"slot inset\\\">\",\n        \"       \",\n        \"     </div>\",\n        \"   </div>\",\n        \"   <br/>\",\n        \"   <div class = \\\"outset\\\">\",\n        \"     <button class = \\\"go inset\\\">\",\n        \"       Go\",\n        \"     </button>\",\n        \"   </div>\",\n        \"   <br/>\",\n        \"   <div class = \\\"foot inset\\\">\",\n        \"     <span class = \\\"logger\\\"></span>\",\n        \"   </div>\",\n        \" </div>\",\n        \"</div>\",\n        \"\",\n        \"<style>\",\n        \" .container {\",\n        \"   background-color: #4a2b0f;\",\n        \"   height: 400px;\",\n        \"   width: 260px;\",\n        \"   margin: 50px auto;\",\n        \"   border-radius: 4px;\",\n        \" }\",\n        \" .header {\",\n        \"   border: 2px solid #fff;\",\n        \"   border-radius: 4px;\",\n        \"   height: 55px;\",\n        \"   margin: 14px auto;\",\n        \"   background-color: #457f86\",\n        \" }\",\n        \" .header h2 {\",\n        \"   height: 30px;\",\n        \"   margin: auto;\",\n        \" }\",\n        \" .header h2 {\",\n        \"   font-size: 14px;\",\n        \"   margin: 0 0;\",\n        \"   padding: 0;\",\n        \"   color: #fff;\",\n        \"   text-align: center;\",\n        \" }\",\n        \" .slots{\",\n        \"   display: flex;\",\n        \"   background-color: #457f86;\",\n        \"   border-radius: 6px;\",\n        \"   border: 2px solid #fff;\",\n        \" }\",\n        \" .slot{\",\n        \"   flex: 1 0 auto;\",\n        \"   background: white;\",\n        \"   height: 75px;\",\n        \"   margin: 8px;\",\n        \"   border: 2px solid #215f1e;\",\n        \"   border-radius: 4px;\",\n        \" }\",\n        \" .go {\",\n        \"   width: 100%;\",\n        \"   color: #fff;\",\n        \"   background-color: #457f86;\",\n        \"   border: 2px solid #fff;\",\n        \"   border-radius: 2px;\",\n        \"   box-sizing: none;\",\n        \"   outline: none!important;\",\n        \" }\",\n        \" .foot {\",\n        \"   height: 150px;\",\n        \"   background-color: 457f86;\",\n        \"   border: 2px solid #fff;\",\n        \" }\",\n        \" \",\n        \" .logger {\",\n        \"   color: white;\",\n        \"   margin: 10px;\",\n        \" }\",\n        \" \",\n        \" .outset {\",\n        \"   -webkit-box-shadow: 0px 0px 15px -2px rgba(0,0,0,0.75);\",\n        \"   -moz-box-shadow: 0px 0px 15px -2px rgba(0,0,0,0.75);\",\n        \"     box-shadow: 0px 0px 15px -2px rgba(0,0,0,0.75);\",\n        \" }\",\n        \" \",\n        \" .inset {\",\n        \"   -webkit-box-shadow: inset 0px 0px 15px -2px rgba(0,0,0,0.75);\",\n        \"   -moz-box-shadow: inset 0px 0px 15px -2px rgba(0,0,0,0.75);\",\n        \"   box-shadow: inset 0px 0px 15px -2px rgba(0,0,0,0.75);\",\n        \" }\",\n        \"</style>\"\n      ],\n      \"solutions\": [\n        \"\"\n      ],\n      \"tests\": [\n        \"assert(typeof(runSlots($(\\\".slot\\\"))[0]) === \\\"number\\\" && runSlots($(\\\".slot\\\"))[0] > 0 && runSlots($(\\\".slot\\\"))[0] < 4, '<code>slotOne</code> 应该是一个随机数')\",\n        \"assert(typeof(runSlots($(\\\".slot\\\"))[1]) === \\\"number\\\" && runSlots($(\\\".slot\\\"))[1] > 0 && runSlots($(\\\".slot\\\"))[1] < 4, '<code>slotTwo</code> 应该是一个随机数')\",\n        \"assert(typeof(runSlots($(\\\".slot\\\"))[2]) === \\\"number\\\" && runSlots($(\\\".slot\\\"))[2] > 0 && runSlots($(\\\".slot\\\"))[2] < 4, '<code>slotThree</code> 应该是一个随机数')\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 0,\n      \"isBeta\": true\n    },\n    {\n      \"id\": \"cf1111c1c13feddfaeb1bdef\",\n      \"title\": \"Add your JavaScript Slot Machine Slots\",\n      \"description\": [\n        \"现在我们的老虎机每次生成3个随机数，我们得去检查随机数是否全部相等的情况。\",\n        \"如果全部相等，我们应该提示用户他们赢了，并返回中奖号码，否则我们应该返回null。\",\n        \"<code>null</code> 是JavaScript中的一种数据类型，意味着空。\",\n        \"当这3个随机数相等的时候，判定用户赢。让我们创建一个<code>if statement</code>，用多个条件按顺序来检查它们是否相等。类似于：\",\n        \"<code>if (slotOne === slotTwo && slotTwo === slotThree){</code>\",\n        \"<code>&nbsp;&nbsp;return slotOne;</code>\",\n        \"<code>} else {</code>\",\n        \"<code>}</code>\",\n        \"当3个随机数都一样的时候，我们把 <code>\\\"It's A Win\\\"</code> 追加到class <code>logger</code>的html中。\"\n      ],\n      \"challengeSeed\": [\n        \"fccss\",\n        \"  function runSlots() {\",\n        \"    var slotOne;\",\n        \"    var slotTwo;\",\n        \"    var slotThree;\",\n        \"    \",\n        \"    var images = [\\\"//i.imgur.com/9H17QFk.png\\\", \\\"//i.imgur.com/9RmpXTy.png\\\", \\\"//i.imgur.com/VJnmtt5.png\\\"];\",\n        \"    \",\n        \"    slotOne = Math.floor(Math.random() * (3 - 1 + 1)) + 1;\",\n        \"    slotTwo = Math.floor(Math.random() * (3 - 1 + 1)) + 1;\",\n        \"    slotThree = Math.floor(Math.random() * (3 - 1 + 1)) + 1;\",\n        \"    \",\n        \"    \",\n        \"    // 请把你的代码写在这条注释以下\",\n        \"    \",\n        \"    \",\n        \"    \",\n        \"    // 请把你的代码写在这条注释以上\",\n        \"    \",\n        \"    if (slotOne !== undefined && slotTwo !== undefined && slotThree !== undefined){\",\n        \"      $(\\\".logger\\\").html(slotOne + \\\" \\\" + slotTwo + \\\" \\\" + slotThree);\",\n        \"    }\",\n        \"    \",\n        \"    $(\\\".logger\\\").append(\\\" Not A Win\\\");\",\n        \"    \",\n        \"    return [slotOne, slotTwo, slotThree];\",\n        \"  }\",\n        \"\",\n        \"  $(document).ready(function() {\",\n        \"     $(\\\".go\\\").click(function() {\",\n        \"       runSlots();\",\n        \"     });\",\n        \"   });\",\n        \"fcces\",\n        \" \",\n        \"<div>\",\n        \" <div class = \\\"container inset\\\">\",\n        \"   <div class = \\\"header inset\\\">\",\n        \"     <img src=\\\"/images/freecodecamp_logo.svg\\\" alt=\\\"learn to code JavaScript at Free Code Camp logo\\\" class=\\\"img-responsive nav-logo\\\">\",\n        \"     <h2>FCC Slot Machine</h2>\",\n        \"   </div>\",\n        \"   <div class = \\\"slots inset\\\">\",\n        \"     <div class = \\\"slot inset\\\">\",\n        \"       \",\n        \"     </div>\",\n        \"     <div class = \\\"slot inset\\\">\",\n        \"       \",\n        \"     </div>\",\n        \"     <div class = \\\"slot inset\\\">\",\n        \"       \",\n        \"     </div>\",\n        \"   </div>\",\n        \"   <br/>\",\n        \"   <div class = \\\"outset\\\">\",\n        \"     <button class = \\\"go inset\\\">\",\n        \"       Go\",\n        \"     </button>\",\n        \"   </div>\",\n        \"   <br/>\",\n        \"   <div class = \\\"foot inset\\\">\",\n        \"     <span class = \\\"logger\\\"></span>\",\n        \"   </div>\",\n        \" </div>\",\n        \"</div>\",\n        \"\",\n        \"<style>\",\n        \" .container {\",\n        \"   background-color: #4a2b0f;\",\n        \"   height: 400px;\",\n        \"   width: 260px;\",\n        \"   margin: 50px auto;\",\n        \"   border-radius: 4px;\",\n        \" }\",\n        \" .header {\",\n        \"   border: 2px solid #fff;\",\n        \"   border-radius: 4px;\",\n        \"   height: 55px;\",\n        \"   margin: 14px auto;\",\n        \"   background-color: #457f86\",\n        \" }\",\n        \" .header h2 {\",\n        \"   height: 30px;\",\n        \"   margin: auto;\",\n        \" }\",\n        \" .header h2 {\",\n        \"   font-size: 14px;\",\n        \"   margin: 0 0;\",\n        \"   padding: 0;\",\n        \"   color: #fff;\",\n        \"   text-align: center;\",\n        \" }\",\n        \" .slots{\",\n        \"   display: flex;\",\n        \"   background-color: #457f86;\",\n        \"   border-radius: 6px;\",\n        \"   border: 2px solid #fff;\",\n        \" }\",\n        \" .slot{\",\n        \"   flex: 1 0 auto;\",\n        \"   background: white;\",\n        \"   height: 75px;\",\n        \"   margin: 8px;\",\n        \"   border: 2px solid #215f1e;\",\n        \"   border-radius: 4px;\",\n        \" }\",\n        \" .go {\",\n        \"   width: 100%;\",\n        \"   color: #fff;\",\n        \"   background-color: #457f86;\",\n        \"   border: 2px solid #fff;\",\n        \"   border-radius: 2px;\",\n        \"   box-sizing: none;\",\n        \"   outline: none!important;\",\n        \" }\",\n        \" .foot {\",\n        \"   height: 150px;\",\n        \"   background-color: 457f86;\",\n        \"   border: 2px solid #fff;\",\n        \" }\",\n        \" \",\n        \" .logger {\",\n        \"   color: white;\",\n        \"   margin: 10px;\",\n        \" }\",\n        \" \",\n        \" .outset {\",\n        \"   -webkit-box-shadow: 0px 0px 15px -2px rgba(0,0,0,0.75);\",\n        \"   -moz-box-shadow: 0px 0px 15px -2px rgba(0,0,0,0.75);\",\n        \"     box-shadow: 0px 0px 15px -2px rgba(0,0,0,0.75);\",\n        \" }\",\n        \" \",\n        \" .inset {\",\n        \"   -webkit-box-shadow: inset 0px 0px 15px -2px rgba(0,0,0,0.75);\",\n        \"   -moz-box-shadow: inset 0px 0px 15px -2px rgba(0,0,0,0.75);\",\n        \"   box-shadow: inset 0px 0px 15px -2px rgba(0,0,0,0.75);\",\n        \" }\",\n        \"</style>\"\n      ],\n      \"solutions\": [\n        \"\"\n      ],\n      \"tests\": [\n        \"assert((function(){var data = runSlots();return data === null || data.toString().length === 1;})(), 'message: 如果三个随机数都相等, 我们应该返回这个数字, 否则应该返回 <code>null</code>.')\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 0,\n      \"isBeta\": true\n    },\n    {\n      \"id\": \"cf1111c1c13feddfaeb2bdef\",\n      \"title\": \"Bring your JavaScript Slot Machine to Life\",\n      \"description\": [\n        \"让我们用 jQuery 选择器 <code>$(\\\".slot\\\")</code> 获得所有老虎机。\",\n        \"一旦获取到所有老虎机，我们可以通过中括号操作符获取到每一个老虎机：\",\n        \"<code>$($(\\\".slot\\\")[0]).html(slotOne);</code>\",\n        \"jQuery将会获取到第一个老虎机，并更新它的HTML为正确的数字。\",\n        \"任务：分别更新每个老虎机上的HTML为对应的数字。\"\n      ],\n      \"challengeSeed\": [\n        \"fccss\",\n        \"  function runSlots() {\",\n        \"    var slotOne;\",\n        \"    var slotTwo;\",\n        \"    var slotThree;\",\n        \"    \",\n        \"    var images = [\\\"//i.imgur.com/9H17QFk.png\\\", \\\"//i.imgur.com/9RmpXTy.png\\\", \\\"//i.imgur.com/VJnmtt5.png\\\"];\",\n        \"    \",\n        \"    slotOne = Math.floor(Math.random() * (3 - 1 + 1)) + 1;\",\n        \"    slotTwo = Math.floor(Math.random() * (3 - 1 + 1)) + 1;\",\n        \"    slotThree = Math.floor(Math.random() * (3 - 1 + 1)) + 1;\",\n        \"    \",\n        \"    \",\n        \"    // 请把你的代码写在这条注释以下\",\n        \"    \",\n        \"    \",\n        \"    \",\n        \"    // 请把你的代码写在这条注释以上\",\n        \"    \",\n        \"    if (slotOne === slotTwo && slotTwo === slotThree) {\",\n        \"      $(\\\".logger\\\").html(\\\" It's A Win\\\")\",\n        \"      return null;\",\n        \"    }\",\n        \"    \",\n        \"    if (slotOne !== undefined && slotTwo !== undefined && slotThree !== undefined){\",\n        \"      $(\\\".logger\\\").html(slotOne + \\\" \\\" + slotTwo + \\\" \\\" + slotThree);\",\n        \"    }\",\n        \"    \",\n        \"    $(\\\".logger\\\").append(\\\" Not A Win\\\");\",\n        \"    \",\n        \"    \",\n        \"    return [slotOne, slotTwo, slotThree];\",\n        \"  }\",\n        \"\",\n        \"  $(document).ready(function() {\",\n        \"     $(\\\".go\\\").click(function() {\",\n        \"       runSlots();\",\n        \"     });\",\n        \"   });\",\n        \"fcces\",\n        \" \",\n        \"<div>\",\n        \" <div class = \\\"container inset\\\">\",\n        \"   <div class = \\\"header inset\\\">\",\n        \"     <img src=\\\"/images/freecodecamp_logo.svg\\\" alt=\\\"learn to code JavaScript at Free Code Camp logo\\\" class=\\\"img-responsive nav-logo\\\">\",\n        \"     <h2>FCC Slot Machine</h2>\",\n        \"   </div>\",\n        \"   <div class = \\\"slots inset\\\">\",\n        \"     <div class = \\\"slot inset\\\">\",\n        \"       \",\n        \"     </div>\",\n        \"     <div class = \\\"slot inset\\\">\",\n        \"       \",\n        \"     </div>\",\n        \"     <div class = \\\"slot inset\\\">\",\n        \"       \",\n        \"     </div>\",\n        \"   </div>\",\n        \"   <br/>\",\n        \"   <div class = \\\"outset\\\">\",\n        \"     <button class = \\\"go inset\\\">\",\n        \"       Go\",\n        \"     </button>\",\n        \"   </div>\",\n        \"   <br/>\",\n        \"   <div class = \\\"foot inset\\\">\",\n        \"     <span class = \\\"logger\\\"></span>\",\n        \"   </div>\",\n        \" </div>\",\n        \"</div>\",\n        \"\",\n        \"<style>\",\n        \" .container {\",\n        \"   background-color: #4a2b0f;\",\n        \"   height: 400px;\",\n        \"   width: 260px;\",\n        \"   margin: 50px auto;\",\n        \"   border-radius: 4px;\",\n        \" }\",\n        \" .header {\",\n        \"   border: 2px solid #fff;\",\n        \"   border-radius: 4px;\",\n        \"   height: 55px;\",\n        \"   margin: 14px auto;\",\n        \"   background-color: #457f86\",\n        \" }\",\n        \" .header h2 {\",\n        \"   height: 30px;\",\n        \"   margin: auto;\",\n        \" }\",\n        \" .header h2 {\",\n        \"   font-size: 14px;\",\n        \"   margin: 0 0;\",\n        \"   padding: 0;\",\n        \"   color: #fff;\",\n        \"   text-align: center;\",\n        \" }\",\n        \" .slots{\",\n        \"   display: flex;\",\n        \"   background-color: #457f86;\",\n        \"   border-radius: 6px;\",\n        \"   border: 2px solid #fff;\",\n        \" }\",\n        \" .slot{\",\n        \"   flex: 1 0 auto;\",\n        \"   background: white;\",\n        \"   height: 75px;\",\n        \"   margin: 8px;\",\n        \"   border: 2px solid #215f1e;\",\n        \"   border-radius: 4px;\",\n        \"   text-align: center;\",\n        \"   padding-top: 25px;\",\n        \" }\",\n        \" .go {\",\n        \"   width: 100%;\",\n        \"   color: #fff;\",\n        \"   background-color: #457f86;\",\n        \"   border: 2px solid #fff;\",\n        \"   border-radius: 2px;\",\n        \"   box-sizing: none;\",\n        \"   outline: none!important;\",\n        \" }\",\n        \" .foot {\",\n        \"   height: 150px;\",\n        \"   background-color: 457f86;\",\n        \"   border: 2px solid #fff;\",\n        \" }\",\n        \" \",\n        \" .logger {\",\n        \"   color: white;\",\n        \"   margin: 10px;\",\n        \" }\",\n        \" \",\n        \" .outset {\",\n        \"   -webkit-box-shadow: 0px 0px 15px -2px rgba(0,0,0,0.75);\",\n        \"   -moz-box-shadow: 0px 0px 15px -2px rgba(0,0,0,0.75);\",\n        \"     box-shadow: 0px 0px 15px -2px rgba(0,0,0,0.75);\",\n        \" }\",\n        \" \",\n        \" .inset {\",\n        \"   -webkit-box-shadow: inset 0px 0px 15px -2px rgba(0,0,0,0.75);\",\n        \"   -moz-box-shadow: inset 0px 0px 15px -2px rgba(0,0,0,0.75);\",\n        \"   box-shadow: inset 0px 0px 15px -2px rgba(0,0,0,0.75);\",\n        \" }\",\n        \"</style>\"\n      ],\n      \"solutions\": [\n        \"\"\n      ],\n      \"tests\": [\n        \"assert((function(){runSlots();if($($(\\\".slot\\\")[0]).html().replace(/\\\\s/gi, \\\"\\\") !== \\\"\\\" && $($(\\\".slot\\\")[1]).html().replace(/\\\\s/gi, \\\"\\\") !== \\\"\\\" && $($(\\\".slot\\\")[2]).html().replace(/\\\\s/gi, \\\"\\\") !== \\\"\\\"){return true;}else{return false;}})(), '你应该在老虎机对应的插槽中显示相应的摇奖结果')\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 0,\n      \"isBeta\": true\n    },\n    {\n      \"id\": \"cf1111c1c11feddfaeb1bdff\",\n      \"title\": \"Give your JavaScript Slot Machine some Stylish Images\",\n      \"description\": [\n        \"现在给我们的老虎机加点图片。\",\n        \"我们已经为你准备好了图片<code>images</code>，我们可以通过不同的索引来获取每个图片。\",\n        \"现在让我们设置第一个老虎机根据随机数来显示一张图片：\",\n        \"<code>$($('.slot')[0]).html('&lt;img src = \\\"' + images[slotOne-1] + '\\\"&gt;');</code>\",\n        \"任务：设置所有的老虎机根据随机数来显示对应的图片，最后点击RUN。\"\n      ],\n      \"challengeSeed\": [\n        \"fccss\",\n        \"  function runSlots() {\",\n        \"    var slotOne;\",\n        \"    var slotTwo;\",\n        \"    var slotThree;\",\n        \"    \",\n        \"    var images = [\\\"//i.imgur.com/9H17QFk.png\\\", \\\"//i.imgur.com/9RmpXTy.png\\\", \\\"//i.imgur.com/VJnmtt5.png\\\"];\",\n        \"    \",\n        \"    slotOne = Math.floor(Math.random() * (3 - 1 + 1)) + 1;\",\n        \"    slotTwo = Math.floor(Math.random() * (3 - 1 + 1)) + 1;\",\n        \"    slotThree = Math.floor(Math.random() * (3 - 1 + 1)) + 1;\",\n        \"    \",\n        \"    \",\n        \"    // 请把你的代码写在这条注释以下\",\n        \"    \",\n        \"    \",\n        \"    \",\n        \"    // 请把你的代码写在这条注释以上\",\n        \"    \",\n        \"    if (slotOne === slotTwo && slotTwo === slotThree) {\",\n        \"      $('.logger').html(\\\"It's A Win\\\");\",\n        \"      return null;\",\n        \"    }\",\n        \"    \",\n        \"    if (slotOne !== undefined && slotTwo !== undefined && slotThree !== undefined){\",\n        \"      $(\\\".logger\\\").html(slotOne + \\\" \\\" + slotTwo + \\\" \\\" + slotThree);\",\n        \"    }\",\n        \"    \",\n        \"    $('.logger').append(\\\" Not A Win\\\");\",\n        \"    \",\n        \"    return [slotOne, slotTwo, slotThree];\",\n        \"  }\",\n        \"\",\n        \"  $(document).ready(function() {\",\n        \"     $('.go').click(function() {\",\n        \"       runSlots();\",\n        \"     });\",\n        \"   });\",\n        \"fcces\",\n        \" \",\n        \"<div>\",\n        \" <div class = 'container inset'>\",\n        \"   <div class = 'header inset'>\",\n        \"     <img src='/images/freecodecamp_logo.svg' alt='learn to code JavaScript at Free Code Camp logo' class='img-responsive nav-logo'>\",\n        \"     <h2>FCC Slot Machine</h2>\",\n        \"   </div>\",\n        \"   <div class = 'slots inset'>\",\n        \"     <div class = 'slot inset'>\",\n        \"       \",\n        \"     </div>\",\n        \"     <div class = 'slot inset'>\",\n        \"       \",\n        \"     </div>\",\n        \"     <div class = 'slot inset'>\",\n        \"       \",\n        \"     </div>\",\n        \"   </div>\",\n        \"   <br/>\",\n        \"   <div class = 'outset'>\",\n        \"     <button class = 'go inset'>\",\n        \"       Go\",\n        \"     </button>\",\n        \"   </div>\",\n        \"   <br/>\",\n        \"   <div class = 'foot inset'>\",\n        \"     <span class = 'logger'></span>\",\n        \"   </div>\",\n        \" </div>\",\n        \"</div>\",\n        \"\",\n        \"<style>\",\n        \" .slot > img {\",\n        \"  margin: 0!important;\",\n        \"  height: 71px;\",\n        \"  width: 50px;\",\n        \" }\",\n        \" .container {\",\n        \"   background-color: #4a2b0f;\",\n        \"   height: 400px;\",\n        \"   width: 260px;\",\n        \"   margin: 50px auto;\",\n        \"   border-radius: 4px;\",\n        \" }\",\n        \" .header {\",\n        \"   border: 2px solid #fff;\",\n        \"   border-radius: 4px;\",\n        \"   height: 55px;\",\n        \"   margin: 14px auto;\",\n        \"   background-color: #457f86\",\n        \" }\",\n        \" .header h2 {\",\n        \"   height: 30px;\",\n        \"   margin: auto;\",\n        \" }\",\n        \" .header h2 {\",\n        \"   font-size: 14px;\",\n        \"   margin: 0 0;\",\n        \"   padding: 0;\",\n        \"   color: #fff;\",\n        \"   text-align: center;\",\n        \" }\",\n        \" .slots{\",\n        \"   display: flex;\",\n        \"   background-color: #457f86;\",\n        \"   border-radius: 6px;\",\n        \"   border: 2px solid #fff;\",\n        \" }\",\n        \" .slot{\",\n        \"   flex: 1 0 auto;\",\n        \"   background: white;\",\n        \"   height: 75px;\",\n        \"   width: 50px;\",\n        \"   margin: 8px;\",\n        \"   border: 2px solid #215f1e;\",\n        \"   border-radius: 4px;\",\n        \"   text-align: center;\",\n        \" }\",\n        \" .go {\",\n        \"   width: 100%;\",\n        \"   color: #fff;\",\n        \"   background-color: #457f86;\",\n        \"   border: 2px solid #fff;\",\n        \"   border-radius: 2px;\",\n        \"   box-sizing: none;\",\n        \"   outline: none!important;\",\n        \" }\",\n        \" .foot {\",\n        \"   height: 150px;\",\n        \"   background-color: 457f86;\",\n        \"   border: 2px solid #fff;\",\n        \" }\",\n        \" \",\n        \" .logger {\",\n        \"   color: white;\",\n        \"   margin: 10px;\",\n        \" }\",\n        \" \",\n        \" .outset {\",\n        \"   -webkit-box-shadow: 0px 0px 15px -2px rgba(0,0,0,0.75);\",\n        \"   -moz-box-shadow: 0px 0px 15px -2px rgba(0,0,0,0.75);\",\n        \"     box-shadow: 0px 0px 15px -2px rgba(0,0,0,0.75);\",\n        \" }\",\n        \" \",\n        \" .inset {\",\n        \"   -webkit-box-shadow: inset 0px 0px 15px -2px rgba(0,0,0,0.75);\",\n        \"   -moz-box-shadow: inset 0px 0px 15px -2px rgba(0,0,0,0.75);\",\n        \"   box-shadow: inset 0px 0px 15px -2px rgba(0,0,0,0.75);\",\n        \" }\",\n        \"</style>\"\n      ],\n      \"solutions\": [\n        \"\"\n      ],\n      \"tests\": [\n        \"assert((function(){runSlots();if($($(\\\".slot\\\")[0]).html().match(\\/img\\/).length == 1){return true;}else{return false;}})(), '你应该为 sloneOne 添加图片.')\",\n        \"assert((function(){runSlots();if($($(\\\".slot\\\")[1]).html().match(\\/img\\/).length == 1){return true;}else{return false;}})(), '你应该为 sloneTwo 添加图片')\",\n        \"assert((function(){runSlots();if($($(\\\".slot\\\")[2]).html().match(\\/img\\/).length == 1){return true;}else{return false;}})(), '你应该为 sloneThree 添加图片')\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 0,\n      \"isBeta\": true\n    }\n  ]\n}\n"
  },
  {
    "path": "seed/challenges/01-front-end-development-certification/basic-ziplines.json",
    "content": "{\n  \"name\": \"Basic Front End Development Projects\",\n  \"order\": 5.5,\n  \"time\": \"50 hours\",\n  \"helpRoom\": \"chinese\",\n  \"challenges\": [\n    {\n      \"id\": \"bd7158d8c442eddfbeb5bd1f\",\n      \"title\": \"Get Set for our Front End Development Projects\",\n      \"description\": [\n        [\n          \"//i.imgur.com/OAD6SJz.png\",\n          \"An image of a Simon game, one our front end projects.\",\n          \"我们的前端开发项目将会使用一个叫CodePen的在线编辑器来应用你所学到的前端开发技能。\",\n          \"\"\n        ],\n        [\n          \"//i.imgur.com/WBetuBa.jpg\",\n          \"A programmer punching through his laptop screen in frustration.\",\n          \"这些项目都是有点难度的，每个项目都会花费好几天时间来完成，你会受到挫败，但别放弃，边学边练会容易一些。\",\n          \"\"\n        ],\n        [\n          \"//i.imgur.com/p2TpOQd.jpg\",\n          \"A cute dog jumping over a hurdle and winking and pointing his paw at you.\",\n          \"当你完成不了挑战的时候，记得使用“Read-Search-Ask”大法。<br>别担心，没啥难的。\",\n          \"\"\n        ],\n        [\n          \"//i.imgur.com/G1saeDt.gif\",\n          \"A gif showing how to create a Codepen account.\",\n          \"为了完成我们的前端项目挑战，我们会使用一个叫CodePen的在线编辑器，点击下面的链接可以注册一个CodePen账户。提示：codepen不支持github账户直接登录，只支持注册账户后通过github关联登录。\",\n          \"https://codepen.io/accounts/signup/user/free\"\n        ],\n        [\n          \"//i.imgur.com/U4y9RJ1.gif\",\n          \"A gif showing that you can type \\\"hello world\\\" will output \\\"hello world\\\" in the preview window. You can also drag windows to resize them, and change their orientation.\",\n          \"在HTML里，创建一个文本为\\\"Hello World\\\"的h1元素，你可以拖拽元素的框架来调整它的大小，你还可以点击\\\"Change View\\\"按钮来改变框架的方向。\",\n          \"\"\n        ],\n        [\n          \"//i.imgur.com/G9KFQDL.gif\",\n          \"A gif showing the process of adding Bootstrap to your pen.\",\n          \"点击CSS盒子左上角的齿轮图标，然后向下滚动到\\\"Quick add\\\"，选择Bootstrap。现在给你的h1元素添加一个class=\\\"text-primary\\\"，它可以更改元素的颜色并且证明Bootstrap生效了。\",\n          \"\"\n        ]\n      ],\n      \"challengeSeed\": [],\n      \"tests\": [],\n      \"type\": \"Waypoint\",\n      \"isRequired\": false,\n      \"challengeType\": 7\n    },\n    {\n      \"id\": \"bd7158d8c442eddfaeb5bd18\",\n      \"title\": \"Build a Tribute Page\",\n      \"description\": [\n        \"<strong>每个诗人心中都有自己的致橡树，by 舒婷。</strong>\",\n        \"<strong>每个程序猿心中都有自己的偶像，写一个致敬页来向自己的偶像致敬。</strong>\",\n        \"当你看不到右边的视频时，说明你还身处防火墙中，赶紧翻墙去体验<a href='https://github.com/getlantern/forum#%E8%93%9D%E7%81%AFlantern%E6%9C%80%E6%96%B0%E7%89%88%E6%9C%AC%E4%B8%8B%E8%BD%BD' target='_blank'>自由无阻碍的互联网</a>。\",\n        \"如果你还不明白翻墙对个人成长的重要性，请去看电影<a href='http://huluoyang.github.io/2016/02/25/the-shawshank-redemption/'>《肖申克的救赎》</a>。\",\n        \"<strong>目标:</strong> 设计一个类似于: <a href='https://codepen.io/FreeCodeCamp/full/NNvBQW/' target='_blank'>https://codepen.io/FreeCodeCamp/full/NNvBQW/</a>的页面。\",\n        \"<strong>规则1:</strong> 代码是开源的，你可以借鉴，但请不要抄袭。\",\n        \"<strong>规则2:</strong> 用你喜爱的任何库来定制属于你自己的风格，实现下面的功能</a>\",\n        \"<strong>功能1:</strong> 你可以用图片和文本来实现这个致敬页面。\",\n        \"<strong>功能2:</strong> 你可以点击链接穿越到另一个网站，获得关于这个主题的更多信息。\",\n        \"当你遇到困难的时候，记得查看错误提示、阅读文档、搜索、提问。\",\n        \"当你完成了这个项目，请点击 \\\"我已经完成了这个挑战\\\" 按钮，输入你的项目在CodePen上的链接。\",\n        \"你可以分享这个项目给<a href='mailto:jin@freecodecamp.cn'>JackJin</a>或<a href='//gitter.im/freecodecamp/chinese' target='_blank'>聊天室</a>来获得反馈。\"\n      ],\n      \"releasedOn\": \"January 1, 2016\",\n      \"challengeSeed\": [\n        \"154927651\"\n      ],\n      \"tests\": [],\n      \"type\": \"zipline\",\n      \"isRequired\": true,\n      \"challengeType\": 3\n    },\n    {\n      \"id\": \"bd7158d8c242eddfaeb5bd13\",\n      \"title\": \"Build a Personal Portfolio Webpage\",\n      \"description\": [\n        \"此项目有难度，实在不会可以先跳过，学完后面再来完善。\",\n        \"当你看不到右边的视频时，说明你还身处防火墙中，赶紧翻墙去体验<a href='https://github.com/getlantern/forum#%E8%93%9D%E7%81%AFlantern%E6%9C%80%E6%96%B0%E7%89%88%E6%9C%AC%E4%B8%8B%E8%BD%BD' target='_blank'>自由无阻碍的互联网</a>。\",\n        \"如果你还不明白翻墙对个人成长的重要性，请去看电影<a href='http://huluoyang.github.io/2016/02/25/the-shawshank-redemption/'>《肖申克的救赎》</a>。\",\n        \"<strong>目标:</strong> 设计一个类似于: <a href='https://codepen.io/freeCodeCamp/full/YqLyXB/' target='_blank'>https://codepen.io/freeCodeCamp/full/YqLyXB/</a>的个人作品集。\",\n        \"<strong>规则1:</strong> 代码是开源的，你可以借鉴，但请不要抄袭。\",\n        \"<strong>规则2:</strong> 用你喜爱的任何库来定制属于你自己的风格，实现下面的功能</a>。\",\n        \"<strong>规则3:</strong> 你可以用你自己的css和框架，而不仅仅是Bootstrap。\",\n        \"<strong>功能:</strong> 你可以通过滚动来浏览这个页面的所有内容。\",\n        \"<strong>功能:</strong> 你可以通过点击不同的按钮来跳到不同的社交媒体页。\",\n        \"<strong>功能:</strong> 你可以看到不同项目的缩略图。\",\n        \"<strong>功能:</strong> 你可以点击导航条上的按钮来调到网页上的不同区域。\",\n        \"如果你现在没什么东西值得放在作品集上也别担心，后面我们会设计好几个应用，届时你可以再回头来更新你的作品集。\",\n        \"CodePen上已经有很多很棒的作品集模板来供你参考，但你需要去设计你自己的作品集，用Bootstrap可能会容易实现一些。\",\n        \"因为CodePen重载了Window.open()功能，所以你必须得用jQuery选取锚点元素<code>&lt;a target='_blank'&gt;</a></code>的方式来打开一个窗口。\",\n        \"当你遇到困难的时候，记得查看错误提示、阅读文档、搜索、提问。\",\n        \"当你完成了这个项目，请点击 \\\"我已经完成了这个挑战\\\" 按钮，输入你的项目在CodePen上的链接。\",\n        \"你可以分享这个项目给<a href='mailto:jin@freecodecamp.cn'>JackJin</a>或<a href='//gitter.im/freecodecamp/chinese' target='_blank'>聊天室</a>来获得反馈。\"\n      ],\n      \"challengeSeed\": [\n        \"133315782\"\n      ],\n      \"tests\": [],\n      \"type\": \"zipline\",\n      \"isRequired\": true,\n      \"challengeType\": 3\n    }\n  ]\n}\n"
  },
  {
    "path": "seed/challenges/01-front-end-development-certification/bootstrap.json",
    "content": "{\n  \"name\": \"Responsive Design with Bootstrap\",\n  \"order\": 3,\n  \"time\": \"5 hours\",\n  \"helpRoom\": \"chinese\",\n  \"challenges\": [\n    {\n      \"id\": \"bad87fee1348bd9acde08712\",\n      \"title\": \"Use Responsive Design with Bootstrap Fluid Containers\",\n      \"description\": [\n        \"现在让我们回到我们的Cat Photo应用。这次，我们将用流行的响应式框架Bootstrap来美化它。\",\n        \"Bootstrap将会根据你的屏幕的大小来调整HTML元素的大小 —— 强调 <code>响应式设计</code>的概念。\",\n        \"通过响应式设计，你无需再为你的网站设计一个手机版的。它在任何尺寸的屏幕上看起来都会不错。 \",\n        \"你仅需要通过添加下列代码到你的HTML开头来将Bootstrap添加到任意应用中：\",\n        \"<code>&#60;link rel=\\\"stylesheet\\\" href=\\\"//cdn.bootcss.com/bootstrap/3.3.1/css/bootstrap.min.css\\\"/&#62;</code>\",\n        \"在此案例中，我们已经帮你把上述代码添加到页面中。\",\n        \"首先，我们需要把所有的HTML内容放在class为<code>container-fluid</code>的<code>div</code>下。\"\n      ],\n      \"challengeSeed\": [\n        \"<link href=\\\"//fonts.gdgdocs.org/css?family=Lobster\\\" rel=\\\"stylesheet\\\" type=\\\"text/css\\\">\",\n        \"<style>\",\n        \"  .red-text {\",\n        \"    color: red;\",\n        \"  }\",\n        \"\",\n        \"  h2 {\",\n        \"    font-family: Lobster, Monospace;\",\n        \"  }\",\n        \"\",\n        \"  p {\",\n        \"    font-size: 16px;\",\n        \"    font-family: Monospace;\",\n        \"  }\",\n        \"\",\n        \"  .thick-green-border {\",\n        \"    border-color: green;\",\n        \"    border-width: 10px;\",\n        \"    border-style: solid;\",\n        \"    border-radius: 50%;\",\n        \"  }\",\n        \"\",\n        \"  .smaller-image {\",\n        \"    width: 100px;\",\n        \"  }\",\n        \"</style>\",\n        \"\",\n        \"<h2 class=\\\"red-text\\\">CatPhotoApp</h2>\",\n        \"\",\n        \"<p>Click here for <a href=\\\"#\\\">cat photos</a>.</p>\",\n        \"\",\n        \"<a href=\\\"#\\\"><img class=\\\"smaller-image thick-green-border\\\" src=\\\"/images/relaxing-cat.jpg\\\"></a>\",\n        \"\",\n        \"<p>Things cats love:</p>\",\n        \"<ul>\",\n        \"  <li>cat nip</li>\",\n        \"  <li>laser pointers</li>\",\n        \"  <li>lasagna</li>\",\n        \"</ul>\",\n        \"<p>Top 3 things cats hate:</p>\",\n        \"<ol>\",\n        \"  <li>flea treatment</li>\",\n        \"  <li>thunder</li>\",\n        \"  <li>other cats</li>\",\n        \"</ol>\",\n        \"<form action=\\\"/submit-cat-photo\\\">\",\n        \"  <label><input type=\\\"radio\\\" name=\\\"indoor-outdoor\\\"> Indoor</label>\",\n        \"  <label><input type=\\\"radio\\\" name=\\\"indoor-outdoor\\\"> Outdoor</label>\",\n        \"  <label><input type=\\\"checkbox\\\" name=\\\"personality\\\"> Loving</label>\",\n        \"  <label><input type=\\\"checkbox\\\" name=\\\"personality\\\"> Lazy</label>\",\n        \"  <label><input type=\\\"checkbox\\\" name=\\\"personality\\\"> Crazy</label>\",\n        \"  <input type=\\\"text\\\" placeholder=\\\"cat photo URL\\\" required>\",\n        \"  <button type=\\\"submit\\\">Submit</button>\",\n        \"</form>\"\n      ],\n      \"tests\": [\n        \"assert($(\\\"div\\\").hasClass(\\\"container-fluid\\\"), 'message: 你的 <code>div</code> 元素应该包含类属性 <code>container-fluid</code>.');\",\n        \"assert(code.match(/<\\\\/div>/g) && code.match(/<div/g) && code.match(/<\\\\/div>/g).length === code.match(/<div/g).length, 'message: 确保你的每一个 <code>div</code> 元素都有一个闭合标签.');\",\n        \"assert($(\\\".container-fluid\\\").children().length >= 8, 'message: 确保你已经将所有HTML元素内嵌在 <code>.container-fluid</code> 之中.');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 0\n    },\n    {\n      \"id\": \"bad87fee1348bd9acde08812\",\n      \"title\": \"Make Images Mobile Responsive\",\n      \"description\": [\n        \"首先，在已有的图片下方添加一张新的图片。将它的 <code>src</code> 属性设置为 <code>/images/running-cat.jpg</code>。\",\n        \"如果图片的尺寸刚好等于我们手机的尺寸，那想必是极好的。\",\n        \"谢天谢地，通过Bootstrap，我们要做的只是给图片添加 <code>img-responsive</code> class属性。这样图片的宽度就能完美地适配你的页面的宽度了。\"\n      ],\n      \"challengeSeed\": [\n        \"<link href=\\\"//fonts.gdgdocs.org/css?family=Lobster\\\" rel=\\\"stylesheet\\\" type=\\\"text/css\\\">\",\n        \"<style>\",\n        \"  .red-text {\",\n        \"    color: red;\",\n        \"  }\",\n        \"\",\n        \"  h2 {\",\n        \"    font-family: Lobster, Monospace;\",\n        \"  }\",\n        \"\",\n        \"  p {\",\n        \"    font-size: 16px;\",\n        \"    font-family: Monospace;\",\n        \"  }\",\n        \"\",\n        \"  .thick-green-border {\",\n        \"    border-color: green;\",\n        \"    border-width: 10px;\",\n        \"    border-style: solid;\",\n        \"    border-radius: 50%;\",\n        \"  }\",\n        \"\",\n        \"  .smaller-image {\",\n        \"    width: 100px;\",\n        \"  }\",\n        \"</style>\",\n        \"\",\n        \"<div class=\\\"container-fluid\\\">\",\n        \"  <h2 class=\\\"red-text\\\">CatPhotoApp</h2>\",\n        \"\",\n        \"  <p>Click here for <a href=\\\"#\\\">cat photos</a>.</p>\",\n        \"\",\n        \"  <a href=\\\"#\\\"><img class=\\\"smaller-image thick-green-border\\\" src=\\\"/images/relaxing-cat.jpg\\\"></a>\",\n        \"\",\n        \"  <p>Things cats love:</p>\",\n        \"  <ul>\",\n        \"    <li>cat nip</li>\",\n        \"    <li>laser pointers</li>\",\n        \"    <li>lasagna</li>\",\n        \"  </ul>\",\n        \"  <p>Top 3 things cats hate:</p>\",\n        \"  <ol>\",\n        \"    <li>flea treatment</li>\",\n        \"    <li>thunder</li>\",\n        \"    <li>other cats</li>\",\n        \"  </ol>\",\n        \"  <form action=\\\"/submit-cat-photo\\\">\",\n        \"    <label><input type=\\\"radio\\\" name=\\\"indoor-outdoor\\\"> Indoor</label>\",\n        \"    <label><input type=\\\"radio\\\" name=\\\"indoor-outdoor\\\"> Outdoor</label>\",\n        \"    <label><input type=\\\"checkbox\\\" name=\\\"personality\\\"> Loving</label>\",\n        \"    <label><input type=\\\"checkbox\\\" name=\\\"personality\\\"> Lazy</label>\",\n        \"    <label><input type=\\\"checkbox\\\" name=\\\"personality\\\"> Crazy</label>\",\n        \"    <input type=\\\"text\\\" placeholder=\\\"cat photo URL\\\" required>\",\n        \"    <button type=\\\"submit\\\">Submit</button>\",\n        \"  </form>\",\n        \"</div>\"\n      ],\n      \"tests\": [\n        \"assert($(\\\"img\\\").length === 2, 'message: 此时，你应该共有两张图片。');\",\n        \"assert($(\\\"img:eq(1)\\\").hasClass(\\\"img-responsive\\\"), 'message: 你的新图片应摆放在旧图片之下，并且含有 <code>img-responsive</code> class属性。');\",\n        \"assert(!$(\\\"img:eq(1)\\\").hasClass(\\\"smaller-image\\\"), 'message: 你的新图片不应该含有 <code>smaller-image</code> class属性。');\",\n        \"assert($(\\\"img:eq(1)\\\").attr(\\\"src\\\") === \\\"/images/running-cat.jpg\\\", 'message: 你的新图片需要有属性 <code>src</code> ，属性值为 <code>/images/running-cat.jpg</code>。');\",\n        \"assert(code.match(/<img/g) && code.match(/<img[^<]*>/g).length === 2 && code.match(/<img/g).length === 2, 'message: 确保你的新元素 <code>img</code> 有一个起闭合作用的右尖括号。');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 0\n    },\n    {\n      \"id\": \"bad87fee1348bd8acde08812\",\n      \"title\": \"Center Text with Bootstrap\",\n      \"description\": [\n        \"既然我们在使用Bootstrap，我们可以通过居中头部元素来使它看起来更棒。 我们所要做的只是把<code>text-center</code>  class属性添加给 <code>h2</code> 元素。\",\n        \"记住：你可以用空格分开多个class来为同一个元素添加多个 class 属性， 就像这样：\",\n        \"<code>&#60h2 class=\\\"red-text text-center\\\"&#62your text&#60/h2&#62</code>\"\n      ],\n      \"challengeSeed\": [\n        \"<link href=\\\"//fonts.gdgdocs.org/css?family=Lobster\\\" rel=\\\"stylesheet\\\" type=\\\"text/css\\\">\",\n        \"<style>\",\n        \"  .red-text {\",\n        \"    color: red;\",\n        \"  }\",\n        \"\",\n        \"  h2 {\",\n        \"    font-family: Lobster, Monospace;\",\n        \"  }\",\n        \"\",\n        \"  p {\",\n        \"    font-size: 16px;\",\n        \"    font-family: Monospace;\",\n        \"  }\",\n        \"\",\n        \"  .thick-green-border {\",\n        \"    border-color: green;\",\n        \"    border-width: 10px;\",\n        \"    border-style: solid;\",\n        \"    border-radius: 50%;\",\n        \"  }\",\n        \"\",\n        \"  .smaller-image {\",\n        \"    width: 100px;\",\n        \"  }\",\n        \"</style>\",\n        \"\",\n        \"<div class=\\\"container-fluid\\\">\",\n        \"  <h2 class=\\\"red-text\\\">CatPhotoApp</h2>\",\n        \"\",\n        \"  <p>Click here for <a href=\\\"#\\\">cat photos</a>.</p>\",\n        \"\",\n        \"  <a href=\\\"#\\\"><img class=\\\"smaller-image thick-green-border\\\" src=\\\"/images/relaxing-cat.jpg\\\"></a>\",\n        \"\",\n        \"  <img src=\\\"/images/running-cat.jpg\\\" class=\\\"img-responsive\\\">\",\n        \"  <p>Things cats love:</p>\",\n        \"  <ul>\",\n        \"    <li>cat nip</li>\",\n        \"    <li>laser pointers</li>\",\n        \"    <li>lasagna</li>\",\n        \"  </ul>\",\n        \"  <p>Top 3 things cats hate:</p>\",\n        \"  <ol>\",\n        \"    <li>flea treatment</li>\",\n        \"    <li>thunder</li>\",\n        \"    <li>other cats</li>\",\n        \"  </ol>\",\n        \"  <form action=\\\"/submit-cat-photo\\\">\",\n        \"    <label><input type=\\\"radio\\\" name=\\\"indoor-outdoor\\\"> Indoor</label>\",\n        \"    <label><input type=\\\"radio\\\" name=\\\"indoor-outdoor\\\"> Outdoor</label>\",\n        \"    <label><input type=\\\"checkbox\\\" name=\\\"personality\\\"> Loving</label>\",\n        \"    <label><input type=\\\"checkbox\\\" name=\\\"personality\\\"> Lazy</label>\",\n        \"    <label><input type=\\\"checkbox\\\" name=\\\"personality\\\"> Crazy</label>\",\n        \"    <input type=\\\"text\\\" placeholder=\\\"cat photo URL\\\" required>\",\n        \"    <button type=\\\"submit\\\">Submit</button>\",\n        \"  </form>\",\n        \"</div>\"\n      ],\n      \"tests\": [\n        \"assert($(\\\"h2\\\").hasClass(\\\"text-center\\\"), 'message: 你的 <code>h2</code> 元素需要填写 <code>text-center</code> class 属性使其居中显示');\",\n        \"assert($(\\\"h2\\\").hasClass(\\\"red-text\\\"), 'message: 你的 <code>h2</code> 元素仍然需要有 <code>red-text</code> class 属性');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 0\n    },\n    {\n      \"id\": \"bad87fee1348cd8acdf08812\",\n      \"title\": \"Create a Bootstrap Button\",\n      \"description\": [\n        \"Bootstrap有它自己的 <code>button</code> 按钮风格， 看起来要比默认的按钮好看得多。\",\n        \"在三只猫咪图片下面创建一个新的 <code>button</code> 元素。给它添加 <code>btn</code> class 属性以及\\\"Like\\\"文本。\"\n      ],\n      \"challengeSeed\": [\n        \"<link href=\\\"//fonts.gdgdocs.org/css?family=Lobster\\\" rel=\\\"stylesheet\\\" type=\\\"text/css\\\">\",\n        \"<style>\",\n        \"  .red-text {\",\n        \"    color: red;\",\n        \"  }\",\n        \"\",\n        \"  h2 {\",\n        \"    font-family: Lobster, Monospace;\",\n        \"  }\",\n        \"\",\n        \"  p {\",\n        \"    font-size: 16px;\",\n        \"    font-family: Monospace;\",\n        \"  }\",\n        \"\",\n        \"  .thick-green-border {\",\n        \"    border-color: green;\",\n        \"    border-width: 10px;\",\n        \"    border-style: solid;\",\n        \"    border-radius: 50%;\",\n        \"  }\",\n        \"\",\n        \"  .smaller-image {\",\n        \"    width: 100px;\",\n        \"  }\",\n        \"</style>\",\n        \"\",\n        \"<div class=\\\"container-fluid\\\">\",\n        \"  <h2 class=\\\"red-text text-center\\\">CatPhotoApp</h2>\",\n        \"\",\n        \"  <p>Click here for <a href=\\\"#\\\">cat photos</a>.</p>\",\n        \"\",\n        \"  <a href=\\\"#\\\"><img class=\\\"smaller-image thick-green-border\\\" src=\\\"/images/relaxing-cat.jpg\\\"></a>\",\n        \"\",\n        \"  <img src=\\\"/images/running-cat.jpg\\\" class=\\\"img-responsive\\\">\",\n        \"\",\n        \"  <p>Things cats love:</p>\",\n        \"  <ul>\",\n        \"    <li>cat nip</li>\",\n        \"    <li>laser pointers</li>\",\n        \"    <li>lasagna</li>\",\n        \"  </ul>\",\n        \"  <p>Top 3 things cats hate:</p>\",\n        \"  <ol>\",\n        \"    <li>flea treatment</li>\",\n        \"    <li>thunder</li>\",\n        \"    <li>other cats</li>\",\n        \"  </ol>\",\n        \"  <form action=\\\"/submit-cat-photo\\\">\",\n        \"    <label><input type=\\\"radio\\\" name=\\\"indoor-outdoor\\\"> Indoor</label>\",\n        \"    <label><input type=\\\"radio\\\" name=\\\"indoor-outdoor\\\"> Outdoor</label>\",\n        \"    <label><input type=\\\"checkbox\\\" name=\\\"personality\\\"> Loving</label>\",\n        \"    <label><input type=\\\"checkbox\\\" name=\\\"personality\\\"> Lazy</label>\",\n        \"    <label><input type=\\\"checkbox\\\" name=\\\"personality\\\"> Crazy</label>\",\n        \"    <input type=\\\"text\\\" placeholder=\\\"cat photo URL\\\" required>\",\n        \"    <button type=\\\"submit\\\">Submit</button>\",\n        \"  </form>\",\n        \"</div>\"\n      ],\n      \"tests\": [\n        \"assert(new RegExp(\\\"like\\\",\\\"gi\\\").test($(\\\"button\\\").text()), 'message: 创建一个新的元素 <code>button</code> ，包含文本 \\\"Like\\\"。');\",\n        \"assert($(\\\"button\\\").hasClass(\\\"btn\\\"), 'message: 你新创建的按钮需要有 <code>btn</code>  class 属性。');\",\n        \"assert(code.match(/<\\\\/button>/g) && code.match(/<button/g) && code.match(/<\\\\/button>/g).length === code.match(/<button/g).length, 'message: 确保你所有的 <code>button</code> 元素都有一个闭合标签。');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 0\n    },\n    {\n      \"id\": \"bad87fee1348cd8acef08812\",\n      \"title\": \"Create a Block Element Bootstrap Button\",\n      \"description\": [\n        \"通常情况下，你的 <code>button</code> 元素仅与它所包含的文本一样宽。通过使其成为块级元素，你的按钮将会伸展并填满页面整个水平空间，任何在它之下的元素都会跟着浮动至该区块的下一行。\",\n        \"这张图阐述了行内元素与块级元素的区别：\",\n        \"<a href=\\\"//i.imgur.com/O32cDWE.png\\\" data-lightbox=\\\"img-enlarge\\\"><img class=\\\"img-responsive\\\" src=\\\"//i.imgur.com/O32cDWE.png\\\" title=\\\"Click to enlarge\\\" alt=\\\"An \\\"inline\\\" button is as small as the text it contains. In this image, it's centered. Below it is a \\\"block-level\\\" button, which stretches to fill the entire horizontal space.'></a>\",\n        \"注意，这些按钮仍然需要 <code>btn</code> class。\",\n        \"添加Bootstrap的 <code>btn-block</code> class 到你的按钮。\"\n      ],\n      \"challengeSeed\": [\n        \"<link href=\\\"//fonts.gdgdocs.org/css?family=Lobster\\\" rel=\\\"stylesheet\\\" type=\\\"text/css\\\">\",\n        \"<style>\",\n        \"  .red-text {\",\n        \"    color: red;\",\n        \"  }\",\n        \"\",\n        \"  h2 {\",\n        \"    font-family: Lobster, Monospace;\",\n        \"  }\",\n        \"\",\n        \"  p {\",\n        \"    font-size: 16px;\",\n        \"    font-family: Monospace;\",\n        \"  }\",\n        \"\",\n        \"  .thick-green-border {\",\n        \"    border-color: green;\",\n        \"    border-width: 10px;\",\n        \"    border-style: solid;\",\n        \"    border-radius: 50%;\",\n        \"  }\",\n        \"\",\n        \"  .smaller-image {\",\n        \"    width: 100px;\",\n        \"  }\",\n        \"</style>\",\n        \"\",\n        \"<div class=\\\"container-fluid\\\">\",\n        \"  <h2 class=\\\"red-text text-center\\\">CatPhotoApp</h2>\",\n        \"\",\n        \"  <p>Click here for <a href=\\\"#\\\">cat photos</a>.</p>\",\n        \"\",\n        \"  <a href=\\\"#\\\"><img class=\\\"smaller-image thick-green-border\\\" src=\\\"/images/relaxing-cat.jpg\\\"></a>\",\n        \"\",\n        \"  <img src=\\\"/images/running-cat.jpg\\\" class=\\\"img-responsive\\\">\",\n        \"  <button class=\\\"btn\\\">Like</button>\",\n        \"  <p>Things cats love:</p>\",\n        \"  <ul>\",\n        \"    <li>cat nip</li>\",\n        \"    <li>laser pointers</li>\",\n        \"    <li>lasagna</li>\",\n        \"  </ul>\",\n        \"  <p>Top 3 things cats hate:</p>\",\n        \"  <ol>\",\n        \"    <li>flea treatment</li>\",\n        \"    <li>thunder</li>\",\n        \"    <li>other cats</li>\",\n        \"  </ol>\",\n        \"  <form action=\\\"/submit-cat-photo\\\">\",\n        \"    <label><input type=\\\"radio\\\" name=\\\"indoor-outdoor\\\"> Indoor</label>\",\n        \"    <label><input type=\\\"radio\\\" name=\\\"indoor-outdoor\\\"> Outdoor</label>\",\n        \"    <label><input type=\\\"checkbox\\\" name=\\\"personality\\\"> Loving</label>\",\n        \"    <label><input type=\\\"checkbox\\\" name=\\\"personality\\\"> Lazy</label>\",\n        \"    <label><input type=\\\"checkbox\\\" name=\\\"personality\\\"> Crazy</label>\",\n        \"    <input type=\\\"text\\\" placeholder=\\\"cat photo URL\\\" required>\",\n        \"    <button type=\\\"submit\\\">Submit</button>\",\n        \"  </form>\",\n        \"</div>\"\n      ],\n      \"tests\": [\n        \"assert($(\\\"button\\\").hasClass(\\\"btn\\\"), 'message: 你的按钮仍然需要有 class <code>btn</code> 属性。');\",\n        \"assert($(\\\"button\\\").hasClass(\\\"btn-block\\\"), 'message: 你的按钮需要有 class <code>btn-block</code> 属性。');\",\n        \"assert(code.match(/<\\\\/button>/g) && code.match(/<button/g) && code.match(/<\\\\/button>/g).length === code.match(/<button/g).length, 'message: 确保你所有的 <code>button</code> 元素都有一个闭合标签。');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 0\n    },\n    {\n      \"id\": \"bad87fee1348cd8acef08811\",\n      \"title\": \"Taste the Bootstrap Button Color Rainbow\",\n      \"description\": [\n        \"深蓝色<code>btn-primary</code>是你的应用的主要颜色，被用在那些用户主要采取的操作上。\",\n        \"添加Bootstrap的 <code>btn-primary</code> class 属性到按钮标签上。\",\n        \"注意：这个按钮仍然需要 <code>btn</code> 和 <code>btn-block</code> 属性！\"\n      ],\n      \"challengeSeed\": [\n        \"<link href=\\\"//fonts.gdgdocs.org/css?family=Lobster\\\" rel=\\\"stylesheet\\\" type=\\\"text/css\\\">\",\n        \"<style>\",\n        \"  .red-text {\",\n        \"    color: red;\",\n        \"  }\",\n        \"\",\n        \"  h2 {\",\n        \"    font-family: Lobster, Monospace;\",\n        \"  }\",\n        \"\",\n        \"  p {\",\n        \"    font-size: 16px;\",\n        \"    font-family: Monospace;\",\n        \"  }\",\n        \"\",\n        \"  .thick-green-border {\",\n        \"    border-color: green;\",\n        \"    border-width: 10px;\",\n        \"    border-style: solid;\",\n        \"    border-radius: 50%;\",\n        \"  }\",\n        \"\",\n        \"  .smaller-image {\",\n        \"    width: 100px;\",\n        \"  }\",\n        \"</style>\",\n        \"\",\n        \"<div class=\\\"container-fluid\\\">\",\n        \"  <h2 class=\\\"red-text text-center\\\">CatPhotoApp</h2>\",\n        \"\",\n        \"  <p>Click here for <a href=\\\"#\\\">cat photos</a>.</p>\",\n        \"\",\n        \"  <a href=\\\"#\\\"><img class=\\\"smaller-image thick-green-border\\\" src=\\\"/images/relaxing-cat.jpg\\\"></a>\",\n        \"\",\n        \"  <img src=\\\"/images/running-cat.jpg\\\" class=\\\"img-responsive\\\">\",\n        \"  <button class=\\\"btn btn-block\\\">Like</button>\",\n        \"  <p>Things cats love:</p>\",\n        \"  <ul>\",\n        \"    <li>cat nip</li>\",\n        \"    <li>laser pointers</li>\",\n        \"    <li>lasagna</li>\",\n        \"  </ul>\",\n        \"  <p>Top 3 things cats hate:</p>\",\n        \"  <ol>\",\n        \"    <li>flea treatment</li>\",\n        \"    <li>thunder</li>\",\n        \"    <li>other cats</li>\",\n        \"  </ol>\",\n        \"  <form action=\\\"/submit-cat-photo\\\">\",\n        \"    <label><input type=\\\"radio\\\" name=\\\"indoor-outdoor\\\"> Indoor</label>\",\n        \"    <label><input type=\\\"radio\\\" name=\\\"indoor-outdoor\\\"> Outdoor</label>\",\n        \"    <label><input type=\\\"checkbox\\\" name=\\\"personality\\\"> Loving</label>\",\n        \"    <label><input type=\\\"checkbox\\\" name=\\\"personality\\\"> Lazy</label>\",\n        \"    <label><input type=\\\"checkbox\\\" name=\\\"personality\\\"> Crazy</label>\",\n        \"    <input type=\\\"text\\\" placeholder=\\\"cat photo URL\\\" required>\",\n        \"    <button type=\\\"submit\\\">Submit</button>\",\n        \"  </form>\",\n        \"</div>\"\n      ],\n      \"tests\": [\n        \"assert($(\\\"button\\\").hasClass(\\\"btn-primary\\\"), 'message: 你的按钮需要有 class <code>btn-primary</code> 属性');\",\n        \"assert($(\\\"button\\\").hasClass(\\\"btn-block\\\") && $(\\\"button\\\").hasClass(\\\"btn\\\"), 'message: 你的按钮仍然需要有 class <code>btn</code> 和 <code>btn-block</code> 属性。');\",\n        \"assert(code.match(/<\\\\/button>/g) && code.match(/<button/g) && code.match(/<\\\\/button>/g).length === code.match(/<button/g).length, 'message: 确保你所有的 <code>button</code> 元素都有一个闭合标签。');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 0\n    },\n    {\n      \"id\": \"bad87fee1348cd8acef08813\",\n      \"title\": \"Call out Optional Actions with Button Info\",\n      \"description\": [\n        \"Bootstrap自带了一些预定义的按钮颜色。浅蓝色 <code>btn-info</code> 被用在那些用户可能会采取的操作上。\",\n        \"在你的 \\\"Like\\\" 按钮下面添加一个文本为 \\\"Info\\\" 的块级Bootstrap按钮，并为其添加 <code>btn-info</code> 和 <code>btn-block</code> class属性。\",\n        \"注意：这些按钮仍然需要 <code>btn</code> 和 <code>btn-block</code> class属性\"\n      ],\n      \"challengeSeed\": [\n        \"<link href=\\\"//fonts.gdgdocs.org/css?family=Lobster\\\" rel=\\\"stylesheet\\\" type=\\\"text/css\\\">\",\n        \"<style>\",\n        \"  .red-text {\",\n        \"    color: red;\",\n        \"  }\",\n        \"\",\n        \"  h2 {\",\n        \"    font-family: Lobster, Monospace;\",\n        \"  }\",\n        \"\",\n        \"  p {\",\n        \"    font-size: 16px;\",\n        \"    font-family: Monospace;\",\n        \"  }\",\n        \"\",\n        \"  .thick-green-border {\",\n        \"    border-color: green;\",\n        \"    border-width: 10px;\",\n        \"    border-style: solid;\",\n        \"    border-radius: 50%;\",\n        \"  }\",\n        \"\",\n        \"  .smaller-image {\",\n        \"    width: 100px;\",\n        \"  }\",\n        \"</style>\",\n        \"\",\n        \"<div class=\\\"container-fluid\\\">\",\n        \"  <h2 class=\\\"red-text text-center\\\">CatPhotoApp</h2>\",\n        \"\",\n        \"  <p>Click here for <a href=\\\"#\\\">cat photos</a>.</p>\",\n        \"\",\n        \"  <a href=\\\"#\\\"><img class=\\\"smaller-image thick-green-border\\\" src=\\\"/images/relaxing-cat.jpg\\\"></a>\",\n        \"\",\n        \"  <img src=\\\"/images/running-cat.jpg\\\" class=\\\"img-responsive\\\">\",\n        \"  <button class=\\\"btn btn-block btn-primary\\\">Like</button>\",\n        \"  <p>Things cats love:</p>\",\n        \"  <ul>\",\n        \"    <li>cat nip</li>\",\n        \"    <li>laser pointers</li>\",\n        \"    <li>lasagna</li>\",\n        \"  </ul>\",\n        \"  <p>Top 3 things cats hate:</p>\",\n        \"  <ol>\",\n        \"    <li>flea treatment</li>\",\n        \"    <li>thunder</li>\",\n        \"    <li>other cats</li>\",\n        \"  </ol>\",\n        \"  <form action=\\\"/submit-cat-photo\\\">\",\n        \"    <label><input type=\\\"radio\\\" name=\\\"indoor-outdoor\\\"> Indoor</label>\",\n        \"    <label><input type=\\\"radio\\\" name=\\\"indoor-outdoor\\\"> Outdoor</label>\",\n        \"    <label><input type=\\\"checkbox\\\" name=\\\"personality\\\"> Loving</label>\",\n        \"    <label><input type=\\\"checkbox\\\" name=\\\"personality\\\"> Lazy</label>\",\n        \"    <label><input type=\\\"checkbox\\\" name=\\\"personality\\\"> Crazy</label>\",\n        \"    <input type=\\\"text\\\" placeholder=\\\"cat photo URL\\\" required>\",\n        \"    <button type=\\\"submit\\\">Submit</button>\",\n        \"  </form>\",\n        \"</div>\"\n      ],\n      \"tests\": [\n        \"assert(new RegExp(\\\"info\\\",\\\"gi\\\").test($(\\\"button\\\").text()), 'message: 创建一个新的 <code>button</code> 元素，包含文本 \\\"Info\\\"。');\",\n        \"assert($(\\\"button.btn-block.btn\\\").length > 1, 'message: 你的两个 Bootstrap 按钮都应该有 class <code>btn</code> 和 <code>btn-block</code> 属性。');\",\n        \"assert($(\\\"button\\\").hasClass(\\\"btn-info\\\"), 'message: 你的新按钮需要有 class <code>btn-info</code> 属性。');\",\n        \"assert(code.match(/<\\\\/button>/g) && code.match(/<button/g) && code.match(/<\\\\/button>/g).length === code.match(/<button/g).length, 'message: 确保你所有的 <code>button</code> 元素都有一个闭合标签。');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 0\n    },\n    {\n      \"id\": \"bad87fee1348ce8acef08814\",\n      \"title\": \"Warn your Users of a Dangerous Action\",\n      \"description\": [\n        \"Bootstrap自带了一些预定义的按钮颜色。红色<code>btn-danger</code>被用来提醒用户该操作具有“破坏性”，例如删除一张猫的图片。\",\n        \"创建一个文本为 \\\"Delete\\\" 的按钮，并且给它添加 class <code>btn-danger</code>。\",\n        \"注意：这些标签仍然需要 <code>btn</code> 与 <code>btn-block</code> class。\"\n      ],\n      \"challengeSeed\": [\n        \"<link href=\\\"//fonts.gdgdocs.org/css?family=Lobster\\\" rel=\\\"stylesheet\\\" type=\\\"text/css\\\">\",\n        \"<style>\",\n        \"  .red-text {\",\n        \"    color: red;\",\n        \"  }\",\n        \"\",\n        \"  h2 {\",\n        \"    font-family: Lobster, Monospace;\",\n        \"  }\",\n        \"\",\n        \"  p {\",\n        \"    font-size: 16px;\",\n        \"    font-family: Monospace;\",\n        \"  }\",\n        \"\",\n        \"  .thick-green-border {\",\n        \"    border-color: green;\",\n        \"    border-width: 10px;\",\n        \"    border-style: solid;\",\n        \"    border-radius: 50%;\",\n        \"  }\",\n        \"\",\n        \"  .smaller-image {\",\n        \"    width: 100px;\",\n        \"  }\",\n        \"</style>\",\n        \"\",\n        \"<div class=\\\"container-fluid\\\">\",\n        \"  <h2 class=\\\"red-text text-center\\\">CatPhotoApp</h2>\",\n        \"\",\n        \"  <p>Click here for <a href=\\\"#\\\">cat photos</a>.</p>\",\n        \"\",\n        \"  <a href=\\\"#\\\"><img class=\\\"smaller-image thick-green-border\\\" src=\\\"/images/relaxing-cat.jpg\\\"></a>\",\n        \"\",\n        \"  <img src=\\\"/images/running-cat.jpg\\\" class=\\\"img-responsive\\\">\",\n        \"  <button class=\\\"btn btn-block btn-primary\\\">Like</button>\",\n        \"  <button class=\\\"btn btn-block btn-info\\\">Info</button>\",\n        \"  <p>Things cats love:</p>\",\n        \"  <ul>\",\n        \"    <li>cat nip</li>\",\n        \"    <li>laser pointers</li>\",\n        \"    <li>lasagna</li>\",\n        \"  </ul>\",\n        \"  <p>Top 3 things cats hate:</p>\",\n        \"  <ol>\",\n        \"    <li>flea treatment</li>\",\n        \"    <li>thunder</li>\",\n        \"    <li>other cats</li>\",\n        \"  </ol>\",\n        \"  <form action=\\\"/submit-cat-photo\\\">\",\n        \"    <label><input type=\\\"radio\\\" name=\\\"indoor-outdoor\\\"> Indoor</label>\",\n        \"    <label><input type=\\\"radio\\\" name=\\\"indoor-outdoor\\\"> Outdoor</label>\",\n        \"    <label><input type=\\\"checkbox\\\" name=\\\"personality\\\"> Loving</label>\",\n        \"    <label><input type=\\\"checkbox\\\" name=\\\"personality\\\"> Lazy</label>\",\n        \"    <label><input type=\\\"checkbox\\\" name=\\\"personality\\\"> Crazy</label>\",\n        \"    <input type=\\\"text\\\" placeholder=\\\"cat photo URL\\\" required>\",\n        \"    <button type=\\\"submit\\\">Submit</button>\",\n        \"  </form>\",\n        \"</div>\"\n      ],\n      \"tests\": [\n        \"assert(new RegExp(\\\"Delete\\\",\\\"gi\\\").test($(\\\"button\\\").text()), 'message: 创建一个 <code>button</code> 新元素， 包含文本 \\\"Delete\\\"。');\",\n        \"assert($(\\\"button.btn-block.btn\\\").length > 2, 'message: 你的所有 Bootstrap 按钮都应该包含 class <code>btn</code> 和 <code>btn-block</code> 属性。');\",\n        \"assert($(\\\"button\\\").hasClass(\\\"btn-danger\\\"), 'message: 你的新按钮需要有 class <code>btn-danger</code> 属性.');\",\n        \"assert(code.match(/<\\\\/button>/g) && code.match(/<button/g) && code.match(/<\\\\/button>/g).length === code.match(/<button/g).length, 'message: 确保你所有的 <code>button</code> 元素都有一个闭合标签.');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 0\n    },\n    {\n      \"id\": \"bad88fee1348ce8acef08815\",\n      \"title\": \"Use the Bootstrap Grid to Put Elements Side By Side\",\n      \"description\": [\n        \"Bootstrap 使用一种响应式网格布局——可轻松实现将多个元素放入一行并指定各个元素的相对宽度的需求。Bootstrap 中大多数的class属性都可以设置于 <code>div</code> 元素中。\",\n        \"下面这张图表显示了 Bootstraps 的12列网格布局是如何起作用的：\",\n        \"<a href=\\\"//i.imgur.com/FaYuui8.png\\\" data-lightbox=\\\"img-enlarge\\\"><img class=\\\"img-responsive\\\" src=\\\"//i.imgur.com/FaYuui8.png\\\" title=\\\"Click to enlarge\\\" alt=\\\"an image illustrating Bootstrap's grid system\\\"></a>\",\n        \"请注意，在这张图表中，class属性 <code>col-md-*</code> 正被使用。在这里，<code>md</code> 表示 medium (中等的)，<code>*</code> 代表一个数字，它指定了这个元素所占的列宽。通过此图表的属性设置可知，在中等大小的屏幕上(例如笔记本电脑)，元素的列宽被指定了。\",\n        \"在我们创建的 Cat Photo App 中，将会使用 <code>col-xs-*</code> ，其中 <code>xs</code> 是 extra small 缩写（应用于较小的屏幕，比如手机屏幕），<code>*</code> 是你需要填写的数字，代表在一行中,各个元素应该占的列宽。\",\n        \"把 <code>Like</code>, <code>Info</code> 和 <code>Delete</code> 三个按钮一并放入一个 <code>&#60;div class=\\\"row\\\"&#62;</code> 元素中；然后，其中的每一个按钮都需要各自被一个 <code>&#60;div class=\\\"col-xs-4\\\"&#62;</code> 元素包裹。\",\n        \"当<code>div</code> 元素设置了 class 属性 <code>row</code> 之后，那几个按钮便可嵌入其中。\"\n      ],\n      \"challengeSeed\": [\n        \"<link href=\\\"//fonts.gdgdocs.org/css?family=Lobster\\\" rel=\\\"stylesheet\\\" type=\\\"text/css\\\">\",\n        \"<style>\",\n        \"  .red-text {\",\n        \"    color: red;\",\n        \"  }\",\n        \"\",\n        \"  h2 {\",\n        \"    font-family: Lobster, Monospace;\",\n        \"  }\",\n        \"\",\n        \"  p {\",\n        \"    font-size: 16px;\",\n        \"    font-family: Monospace;\",\n        \"  }\",\n        \"\",\n        \"  .thick-green-border {\",\n        \"    border-color: green;\",\n        \"    border-width: 10px;\",\n        \"    border-style: solid;\",\n        \"    border-radius: 50%;\",\n        \"  }\",\n        \"\",\n        \"  .smaller-image {\",\n        \"    width: 100px;\",\n        \"  }\",\n        \"</style>\",\n        \"\",\n        \"<div class=\\\"container-fluid\\\">\",\n        \"  <h2 class=\\\"red-text text-center\\\">CatPhotoApp</h2>\",\n        \"\",\n        \"  <p>Click here for <a href=\\\"#\\\">cat photos</a>.</p>\",\n        \"\",\n        \"  <a href=\\\"#\\\"><img class=\\\"smaller-image thick-green-border\\\" src=\\\"/images/relaxing-cat.jpg\\\"></a>\",\n        \"\",\n        \"  <img src=\\\"/images/running-cat.jpg\\\" class=\\\"img-responsive\\\">\",\n        \"  <button class=\\\"btn btn-block btn-primary\\\">Like</button>\",\n        \"  <button class=\\\"btn btn-block btn-info\\\">Info</button>\",\n        \"  <button class=\\\"btn btn-block btn-danger\\\">Delete</button>\",\n        \"  <p>Things cats love:</p>\",\n        \"  <ul>\",\n        \"    <li>cat nip</li>\",\n        \"    <li>laser pointers</li>\",\n        \"    <li>lasagna</li>\",\n        \"  </ul>\",\n        \"  <p>Top 3 things cats hate:</p>\",\n        \"  <ol>\",\n        \"    <li>flea treatment</li>\",\n        \"    <li>thunder</li>\",\n        \"    <li>other cats</li>\",\n        \"  </ol>\",\n        \"  <form action=\\\"/submit-cat-photo\\\">\",\n        \"    <label><input type=\\\"radio\\\" name=\\\"indoor-outdoor\\\"> Indoor</label>\",\n        \"    <label><input type=\\\"radio\\\" name=\\\"indoor-outdoor\\\"> Outdoor</label>\",\n        \"    <label><input type=\\\"checkbox\\\" name=\\\"personality\\\"> Loving</label>\",\n        \"    <label><input type=\\\"checkbox\\\" name=\\\"personality\\\"> Lazy</label>\",\n        \"    <label><input type=\\\"checkbox\\\" name=\\\"personality\\\"> Crazy</label>\",\n        \"    <input type=\\\"text\\\" placeholder=\\\"cat photo URL\\\" required>\",\n        \"    <button type=\\\"submit\\\">Submit</button>\",\n        \"  </form>\",\n        \"</div>\"\n      ],\n      \"tests\": [\n        \"assert($(\\\"div.row:has(button)\\\").length > 0, 'message: 你的所有按钮都需要嵌入在同一个 <code>div</code> 元素中， 并且该元素包含 class <code>row</code> 属性。');\",\n        \"assert($(\\\"div.col-xs-4:has(button)\\\").length > 2, 'message: 每一个 Bootstrap 按钮都需要各自嵌入在自己的 <code>div</code> 元素中，并且该元素包含 class <code>col-xs-4</code> 属性。');\",\n        \"assert(code.match(/<\\\\/button>/g) && code.match(/<button/g) && code.match(/<\\\\/button>/g).length === code.match(/<button/g).length, 'message: 确保你的每一个 <code>button</code> 元素都有一个闭合标签。');\",\n        \"assert(code.match(/<\\\\/div>/g) && code.match(/<div/g) && code.match(/<\\\\/div>/g).length === code.match(/<div/g).length, 'message: 确保你的每一个 <code>div</code> 元素都有一个闭合标签。');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 0\n    },\n    {\n      \"id\": \"bad87fee1347bd9aedf08845\",\n      \"title\": \"Ditch Custom CSS for Bootstrap\",\n      \"description\": [\n        \"现在，让我们清理一下之前的代码了，以让我们的 Cat Photo 应用看起来更简洁，用 Bootstrap 内置的样式来替换我们之前自定义的样式。\",\n        \"别担心 —— 以后我们会有大把时间来自定义我们的 CSS 样式的 ：）\",\n        \"删除 <code>style</code> 元素里的 <code>.red-text</code>, <code>p</code> 和 <code>.smaller-image</code> CSS声明，这样你的 <code>style</code> 留下的声明就只有 <code>h2</code> 和 <code>thick-green-border</code>。\",\n        \"然后删除包含死链接的 <code>p</code> 元素。 移除 <code>h2</code> 元素的 <code>red-text</code> class 并且用 Bootstrap的 <code>text-primary</code> class替换之。\",\n        \"最后，移除第一个 <code>img</code> 元素的 \\\"smaller  -image\\\" class ，替换为 Bootstrap的 <code>img-responsive</code> class。\"\n      ],\n      \"challengeSeed\": [\n        \"<link href=\\\"//fonts.gdgdocs.org/css?family=Lobster\\\" rel=\\\"stylesheet\\\" type=\\\"text/css\\\">\",\n        \"<style>\",\n        \"  .red-text {\",\n        \"    color: red;\",\n        \"  }\",\n        \"\",\n        \"  h2 {\",\n        \"    font-family: Lobster, Monospace;\",\n        \"  }\",\n        \"\",\n        \"  p {\",\n        \"    font-size: 16px;\",\n        \"    font-family: Monospace;\",\n        \"  }\",\n        \"\",\n        \"  .thick-green-border {\",\n        \"    border-color: green;\",\n        \"    border-width: 10px;\",\n        \"    border-style: solid;\",\n        \"    border-radius: 50%;\",\n        \"  }\",\n        \"\",\n        \"  .smaller-image {\",\n        \"    width: 100px;\",\n        \"  }\",\n        \"</style>\",\n        \"\",\n        \"<div class=\\\"container-fluid\\\">\",\n        \"  <h2 class=\\\"red-text text-center\\\">CatPhotoApp</h2>\",\n        \"\",\n        \"  <p>Click here for <a href=\\\"#\\\">cat photos</a>.</p>\",\n        \"\",\n        \"  <a href=\\\"#\\\"><img class=\\\"smaller-image thick-green-border\\\" src=\\\"/images/relaxing-cat.jpg\\\"></a>\",\n        \"\",\n        \"  <img src=\\\"/images/running-cat.jpg\\\" class=\\\"img-responsive\\\">\",\n        \"  <div class=\\\"row\\\">\",\n        \"    <div class=\\\"col-xs-4\\\">\",\n        \"      <button class=\\\"btn btn-block btn-primary\\\">Like</button>\",\n        \"    </div>\",\n        \"    <div class=\\\"col-xs-4\\\">\",\n        \"      <button class=\\\"btn btn-block btn-info\\\">Info</button>\",\n        \"    </div>\",\n        \"    <div class=\\\"col-xs-4\\\">\",\n        \"      <button class=\\\"btn btn-block btn-danger\\\">Delete</button>\",\n        \"    </div>\",\n        \"  </div>\",\n        \"  <p>Things cats love:</p>\",\n        \"  <ul>\",\n        \"    <li>cat nip</li>\",\n        \"    <li>laser pointers</li>\",\n        \"    <li>lasagna</li>\",\n        \"  </ul>\",\n        \"  <p>Top 3 things cats hate:</p>\",\n        \"  <ol>\",\n        \"    <li>flea treatment</li>\",\n        \"    <li>thunder</li>\",\n        \"    <li>other cats</li>\",\n        \"  </ol>\",\n        \"  <form action=\\\"/submit-cat-photo\\\">\",\n        \"    <label><input type=\\\"radio\\\" name=\\\"indoor-outdoor\\\"> Indoor</label>\",\n        \"    <label><input type=\\\"radio\\\" name=\\\"indoor-outdoor\\\"> Outdoor</label>\",\n        \"    <label><input type=\\\"checkbox\\\" name=\\\"personality\\\"> Loving</label>\",\n        \"    <label><input type=\\\"checkbox\\\" name=\\\"personality\\\"> Lazy</label>\",\n        \"    <label><input type=\\\"checkbox\\\" name=\\\"personality\\\"> Crazy</label>\",\n        \"    <input type=\\\"text\\\" placeholder=\\\"cat photo URL\\\" required>\",\n        \"    <button type=\\\"submit\\\">Submit</button>\",\n        \"  </form>\",\n        \"</div>\"\n      ],\n      \"tests\": [\n        \"assert(!$(\\\"h2\\\").hasClass(\\\"red-text\\\"), 'message: 你的 <code>h2</code> 元素应该不再有 class <code>red-text</code> 属性。');\",\n        \"assert($(\\\"h2\\\").hasClass(\\\"text-primary\\\"), 'message: 你的 <code>h2</code> 元素现在应该有 class <code>text-primary</code> 属性。');\",\n        \"assert(!$(\\\"p\\\").css(\\\"font-family\\\").match(/monospace/i), 'message: 你的段落元素应该不再使用 <code>Monospace</code> 字体。');\",\n        \"assert(!$(\\\"img\\\").hasClass(\\\"smaller-image\\\"), 'message: 从你第一张照片中移除 class <code>smaller-image</code> 属性。');\",\n        \"assert($(\\\".img-responsive\\\").length > 1, 'message: 在你第一张照片中添加 class <code>img-responsive</code> 属性。');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 0\n    },\n    {\n      \"id\": \"bad87fee1348bd9aedf08845\",\n      \"title\": \"Use Spans for Inline Elements\",\n      \"description\": [\n        \"你可以用 span 标签来创建行内元素。还记得我们是怎样使用 <code>.btn-block</code>来创建填满整行的按钮吗？\",\n        \"这张图展示了 <code>inline</code> 元素与 <code>block-level</code> 块级元素的区别：\",\n        \"<a href=\\\"//i.imgur.com/O32cDWE.png\\\" data-lightbox=\\\"img-enlarge\\\"><img class=\\\"img-responsive\\\" src=\\\"//i.imgur.com/O32cDWE.png\\\" title=\\\"Click to enlarge\\\" alt=\\\"An \\\"inline\\\" button is as small as the text it contains. In this image, it's centered. Below it is a \\\"block-level\\\" button, which stretches to fill the entire horizontal space.'></a>\",\n        \"通过使用 <code>span</code> 元素，你可以把几个元素放在一起。你甚至可以用此为一个元素的不同部分指定样式。\",\n        \"把 \\\"Things cats love\\\" 中的 \\\"love\\\" 放到 <code>span</code> 标签下。然后为其添加 <code>text-danger</code> class 来使文字变成红色。\",\n        \"举例，\\\"Top 3 things cats <code>hate</code>\\\" 元素的写法如下：\",\n        \"<code>&#60;p&#62;Top 3 things cats &#60;span class = \\\"text-danger\\\"&#62;hate:&#60;/span&#62;&#60;/p&#62;</code>\"\n      ],\n      \"challengeSeed\": [\n        \"<link href=\\\"//fonts.gdgdocs.org/css?family=Lobster\\\" rel=\\\"stylesheet\\\" type=\\\"text/css\\\">\",\n        \"<style>\",\n        \"\",\n        \"  h2 {\",\n        \"    font-family: Lobster, Monospace;\",\n        \"  }\",\n        \"\",\n        \"  .thick-green-border {\",\n        \"    border-color: green;\",\n        \"    border-width: 10px;\",\n        \"    border-style: solid;\",\n        \"    border-radius: 50%;\",\n        \"  }\",\n        \"\",\n        \"</style>\",\n        \"\",\n        \"<div class=\\\"container-fluid\\\">\",\n        \"  <h2 class=\\\"text-primary text-center\\\">CatPhotoApp</h2>\",\n        \"\",\n        \"  <a href=\\\"#\\\"><img class=\\\"img-responsive thick-green-border\\\" src=\\\"/images/relaxing-cat.jpg\\\"></a>\",\n        \"\",\n        \"  <img src=\\\"/images/running-cat.jpg\\\" class=\\\"img-responsive\\\">\",\n        \"  <div class=\\\"row\\\">\",\n        \"    <div class=\\\"col-xs-4\\\">\",\n        \"      <button class=\\\"btn btn-block btn-primary\\\">Like</button>\",\n        \"    </div>\",\n        \"    <div class=\\\"col-xs-4\\\">\",\n        \"      <button class=\\\"btn btn-block btn-info\\\">Info</button>\",\n        \"    </div>\",\n        \"    <div class=\\\"col-xs-4\\\">\",\n        \"      <button class=\\\"btn btn-block btn-danger\\\">Delete</button>\",\n        \"    </div>\",\n        \"  </div>\",\n        \"  <p>Things cats love:</p>\",\n        \"  <ul>\",\n        \"    <li>cat nip</li>\",\n        \"    <li>laser pointers</li>\",\n        \"    <li>lasagna</li>\",\n        \"  </ul>\",\n        \"  <p>Top 3 things cats hate:</p>\",\n        \"  <ol>\",\n        \"    <li>flea treatment</li>\",\n        \"    <li>thunder</li>\",\n        \"    <li>other cats</li>\",\n        \"  </ol>\",\n        \"  <form action=\\\"/submit-cat-photo\\\">\",\n        \"    <label><input type=\\\"radio\\\" name=\\\"indoor-outdoor\\\"> Indoor</label>\",\n        \"    <label><input type=\\\"radio\\\" name=\\\"indoor-outdoor\\\"> Outdoor</label>\",\n        \"    <label><input type=\\\"checkbox\\\" name=\\\"personality\\\"> Loving</label>\",\n        \"    <label><input type=\\\"checkbox\\\" name=\\\"personality\\\"> Lazy</label>\",\n        \"    <label><input type=\\\"checkbox\\\" name=\\\"personality\\\"> Crazy</label>\",\n        \"    <input type=\\\"text\\\" placeholder=\\\"cat photo URL\\\" required>\",\n        \"    <button type=\\\"submit\\\">Submit</button>\",\n        \"  </form>\",\n        \"</div>\"\n      ],\n      \"tests\": [\n        \"assert($(\\\"p span\\\") && $(\\\"p span\\\").length > 0, 'message: 你的 <code>span</code> 元素应该在 <code>p</code> 内。');\",\n        \"assert($(\\\"p span\\\") && $(\\\"p span\\\").text().match(/love/i), 'message: 你的 <code>span</code> 元素应该含有文本 <code>love</code>。');\",\n        \"assert($(\\\"span\\\").hasClass(\\\"text-danger\\\"), 'message: 你的 <code>span</code> 元素应该含有 class <code>text-danger</code>。');\",\n        \"assert(code.match(/<\\\\/span>/g) && code.match(/<span/g) && code.match(/<\\\\/span>/g).length === code.match(/<span/g).length, 'message: 确保你的 <code>span</code> 元素有一个闭合标签。');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 0\n    },\n    {\n      \"id\": \"bad87fee1348bd9aede08845\",\n      \"title\": \"Create a Custom Heading\",\n      \"description\": [\n        \"让我们来为Cat Photo 应用做一个导航吧，把标题和惬意的猫图片放在同一行。\",\n        \"记住，Bootstrap使用响应式栅格系统，这使得把元素放入行内并为每个元素指定宽度变得很容易。大部分的 Bootstrap的 class 都可以被用在 <code>div</code> 元素上。\",\n        \"这张图展示了 Bootstrap 的12栏栅格布局是如何工作的：\",\n        \"<a href=\\\"//i.imgur.com/FaYuui8.png\\\" data-lightbox=\\\"img-enlarge\\\"><img class=\\\"img-responsive\\\" src=\\\"//i.imgur.com/FaYuui8.png\\\" title=\\\"Click to enlarge\\\" alt=\\\"an image illustrating Bootstrap's grid system\\\"></a>\",\n        \"注意，在此图示中，我们使用了 <code>col-md-*</code> class 。此处 <code>md</code> 代表中等，<code>*</code> 指定了元素宽度应该占用的栏数。 在这个案例中，我们指定了元素在中等大小的屏幕（如笔记本等）上所占用的栏数。\",\n        \"在此应用中，我们将使用 <code>col-xs-*</code>， <code>xs</code> 意味着非常小（比如非常小的手机屏幕）， <code>*</code> 指定了元素宽度应该占用的栏数。\",\n        \"将你的第一张图片和 <code>h2</code> 元素放到同一个 <code>&#60;div class=\\\"row\\\"&#62;</code> 元素下。 将你的 <code>h2</code> 元素放到 <code>&#60;div class=\\\"col-xs-8\\\"&#62;</code> 下，你的图片放到 <code>&#60;div class=\\\"col-xs-4\\\"&#62;</code> 下，这样他们就能位于同一行了。\",\n        \"注意现在图片是否与文字大小一致呢？\"\n      ],\n      \"challengeSeed\": [\n        \"<link href=\\\"//fonts.gdgdocs.org/css?family=Lobster\\\" rel=\\\"stylesheet\\\" type=\\\"text/css\\\">\",\n        \"\",\n        \"<style>\",\n        \"  h2 {\",\n        \"    font-family: Lobster, Monospace;\",\n        \"  }\",\n        \"\",\n        \"  .thick-green-border {\",\n        \"    border-color: green;\",\n        \"    border-width: 10px;\",\n        \"    border-style: solid;\",\n        \"    border-radius: 50%;\",\n        \"  }\",\n        \"</style>\",\n        \"\",\n        \"<div class=\\\"container-fluid\\\">\",\n        \"  <h2 class=\\\"text-primary text-center\\\">CatPhotoApp</h2>\",\n        \"\",\n        \"  <a href=\\\"#\\\"><img class=\\\"img-responsive thick-green-border\\\" src=\\\"/images/relaxing-cat.jpg\\\"></a>\",\n        \"\",\n        \"  <img src=\\\"/images/running-cat.jpg\\\" class=\\\"img-responsive\\\">\",\n        \"  <div class=\\\"row\\\">\",\n        \"    <div class=\\\"col-xs-4\\\">\",\n        \"      <button class=\\\"btn btn-block btn-primary\\\">Like</button>\",\n        \"    </div>\",\n        \"    <div class=\\\"col-xs-4\\\">\",\n        \"      <button class=\\\"btn btn-block btn-info\\\">Info</button>\",\n        \"    </div>\",\n        \"    <div class=\\\"col-xs-4\\\">\",\n        \"      <button class=\\\"btn btn-block btn-danger\\\">Delete</button>\",\n        \"    </div>\",\n        \"  </div>\",\n        \"  <p>Things cats <span class=\\\"text-danger\\\">love:</span></p>\",\n        \"  <ul>\",\n        \"    <li>cat nip</li>\",\n        \"    <li>laser pointers</li>\",\n        \"    <li>lasagna</li>\",\n        \"  </ul>\",\n        \"  <p>Top 3 things cats hate:</p>\",\n        \"  <ol>\",\n        \"    <li>flea treatment</li>\",\n        \"    <li>thunder</li>\",\n        \"    <li>other cats</li>\",\n        \"  </ol>\",\n        \"  <form action=\\\"/submit-cat-photo\\\">\",\n        \"    <label><input type=\\\"radio\\\" name=\\\"indoor-outdoor\\\"> Indoor</label>\",\n        \"    <label><input type=\\\"radio\\\" name=\\\"indoor-outdoor\\\"> Outdoor</label>\",\n        \"    <label><input type=\\\"checkbox\\\" name=\\\"personality\\\"> Loving</label>\",\n        \"    <label><input type=\\\"checkbox\\\" name=\\\"personality\\\"> Lazy</label>\",\n        \"    <label><input type=\\\"checkbox\\\" name=\\\"personality\\\"> Crazy</label>\",\n        \"    <input type=\\\"text\\\" placeholder=\\\"cat photo URL\\\" required>\",\n        \"    <button type=\\\"submit\\\">Submit</button>\",\n        \"  </form>\",\n        \"</div>\"\n      ],\n      \"tests\": [\n        \"assert($(\\\"div.row:has(h2)\\\").length > 0 && $(\\\"div.row:has(img)\\\").length > 0, 'message: 你的 <code>h2</code> 和最上方的 <code>img</code> 元素都应在内嵌在一个含有 class <code>row</code> 的 <code>div</code> 元素中。');\",\n        \"assert($(\\\"div.col-xs-4:has(img)\\\").length > 0, 'message: 将你最上方的 <code>img</code> 元素内嵌入含有 class <code>col-xs-4</code> 的一个元素 <code>div</code> 中。');\",\n        \"assert($(\\\"div.col-xs-8:has(h2)\\\").length > 0, 'message: 将你的 <code>h2</code> 元素内嵌入含有 class <code>col-xs-8</code> 的一个元素 <code>div</code> 中。');\",\n        \"assert(code.match(/<\\\\/div>/g) && code.match(/<div/g) && code.match(/<\\\\/div>/g).length === code.match(/<div/g).length, 'message: 确保你的每一个 <code>div</code> 元素都有一个闭合标签。');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 0\n    },\n    {\n      \"id\": \"bad87fee1348bd9aedd08845\",\n      \"title\": \"Add Font Awesome Icons to our Buttons\",\n      \"description\": [\n        \"Font Awesome 是一个非常方便的图标库。这些图标都是矢量图形，被保存在 <code>.svg</code> 的文件格式中。这些图标就和字体一样，你可以通过像素单位指定它们的大小，它们将会继承其父HTML元素的字体大小。\",\n        \"你可以将 Font Awesome 图标库增添至任何一个应用中，方法很简单，只需要在你的 HTML 头部增加下列代码即可：\",\n        \"<code>&#60;link rel=\\\"stylesheet\\\" href=\\\"//cdn.bootcss.com/font-awesome/4.2.0/css/font-awesome.min.css\\\"/&#62;</code>\",\n        \"不过，我们已经事先在幕后为此页面添加了该功能。（不必重复添加上面这段代码）\",\n        \"<code>i</code> 元素起初一般是让其它元素有斜体(italic)的功能，不过现在一般用来指代图标。你可以将 Font Awesome 中的 class 属性添加到 <code>i</code> 元素中，把它变成一个图标，比如：\",\n        \"<code>&lt;i class=\\\"fa fa-info-circle\\\"&gt;&lt;/i&gt;</code>\",\n        \"你可以通过 Font Awesome 库增加一个 <code>thumbs-up</code> 图标到你的 like 按钮中，方法是在<code>i</code> 元素中增加 class 属性 <code>fa</code> 和 <code>fa-thumbs-up</code>。\"\n      ],\n      \"challengeSeed\": [\n        \"<link href=\\\"//fonts.gdgdocs.org/css?family=Lobster\\\" rel=\\\"stylesheet\\\" type=\\\"text/css\\\">\",\n        \"<style>\",\n        \"  h2 {\",\n        \"    font-family: Lobster, Monospace;\",\n        \"  }\",\n        \"\",\n        \"  .thick-green-border {\",\n        \"    border-color: green;\",\n        \"    border-width: 10px;\",\n        \"    border-style: solid;\",\n        \"    border-radius: 50%;\",\n        \"  }\",\n        \"</style>\",\n        \"\",\n        \"<div class=\\\"container-fluid\\\">\",\n        \"  <div class=\\\"row\\\">\",\n        \"    <div class=\\\"col-xs-8\\\">\",\n        \"      <h2 class=\\\"text-primary text-center\\\">CatPhotoApp</h2>\",\n        \"    </div>\",\n        \"    <div class=\\\"col-xs-4\\\">\",\n        \"      <a href=\\\"#\\\"><img class=\\\"img-responsive thick-green-border\\\" src=\\\"/images/relaxing-cat.jpg\\\"></a>\",\n        \"    </div>\",\n        \"  </div>\",\n        \"  <img src=\\\"/images/running-cat.jpg\\\" class=\\\"img-responsive\\\">\",\n        \"  <div class=\\\"row\\\">\",\n        \"    <div class=\\\"col-xs-4\\\">\",\n        \"      <button class=\\\"btn btn-block btn-primary\\\">Like</button>\",\n        \"    </div>\",\n        \"    <div class=\\\"col-xs-4\\\">\",\n        \"      <button class=\\\"btn btn-block btn-info\\\">Info</button>\",\n        \"    </div>\",\n        \"    <div class=\\\"col-xs-4\\\">\",\n        \"      <button class=\\\"btn btn-block btn-danger\\\">Delete</button>\",\n        \"    </div>\",\n        \"  </div>\",\n        \"  <p>Things cats <span class=\\\"text-danger\\\">love:</span></p>\",\n        \"  <ul>\",\n        \"    <li>cat nip</li>\",\n        \"    <li>laser pointers</li>\",\n        \"    <li>lasagna</li>\",\n        \"  </ul>\",\n        \"  <p>Top 3 things cats hate:</p>\",\n        \"  <ol>\",\n        \"    <li>flea treatment</li>\",\n        \"    <li>thunder</li>\",\n        \"    <li>other cats</li>\",\n        \"  </ol>\",\n        \"  <form action=\\\"/submit-cat-photo\\\">\",\n        \"    <label><input type=\\\"radio\\\" name=\\\"indoor-outdoor\\\"> Indoor</label>\",\n        \"    <label><input type=\\\"radio\\\" name=\\\"indoor-outdoor\\\"> Outdoor</label>\",\n        \"    <label><input type=\\\"checkbox\\\" name=\\\"personality\\\"> Loving</label>\",\n        \"    <label><input type=\\\"checkbox\\\" name=\\\"personality\\\"> Lazy</label>\",\n        \"    <label><input type=\\\"checkbox\\\" name=\\\"personality\\\"> Crazy</label>\",\n        \"    <input type=\\\"text\\\" placeholder=\\\"cat photo URL\\\" required>\",\n        \"    <button type=\\\"submit\\\">Submit</button>\",\n        \"  </form>\",\n        \"</div>\"\n      ],\n      \"tests\": [\n        \"assert($(\\\"i\\\").is(\\\".fa.fa-thumbs-up\\\"), 'message: 增加一个 <code>i</code> 元素包含 class 属性 <code>fa</code> 和 <code>fa-thumbs-up</code>。');\",\n        \"assert($(\\\"i.fa-thumbs-up\\\").parent().text().match(/Like/gi) && $(\\\".btn-primary > i\\\").is(\\\".fa.fa-thumbs-up\\\"), 'message: 你的 <code>fa-thumbs-up</code> 图标应放置在 Like 按钮中。');\",\n        \"assert($(\\\"button\\\").children(\\\"i\\\").length > 0, 'message: 将 <code>i</code> 元素放置于你的 <code>button</code> 元素之中。');\",\n        \"assert(code.match(/<\\\\/i>/g), 'message: 确保你的 <code>i</code> 有一个闭合标签。');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 0\n    },\n    {\n      \"id\": \"bad87fee1348bd9aedc08845\",\n      \"title\": \"Add Font Awesome Icons to all of our Buttons\",\n      \"description\": [\n        \"Font Awesome 是一个非常方便的图标库。这些图片都是矢量图，以 <code>.svg</code> 文件格式保存。这些图标用起来就像字体一样。你可以使用像素单位来指定他们的大小，它们会继承父级HTML元素的字体大小。\",\n        \"使用 Font Awesome 分别为你的 info 按钮添加 <code>info-circle</code> 图标，为你的 delete 按钮添加 <code>trash</code> 图标。\"\n      ],\n      \"challengeSeed\": [\n        \"<link href=\\\"//fonts.gdgdocs.org/css?family=Lobster\\\" rel=\\\"stylesheet\\\" type=\\\"text/css\\\">\",\n        \"<style>\",\n        \"  h2 {\",\n        \"    font-family: Lobster, Monospace;\",\n        \"  }\",\n        \"\",\n        \"  .thick-green-border {\",\n        \"    border-color: green;\",\n        \"    border-width: 10px;\",\n        \"    border-style: solid;\",\n        \"    border-radius: 50%;\",\n        \"  }\",\n        \"</style>\",\n        \"\",\n        \"<div class=\\\"container-fluid\\\">\",\n        \"  <div class=\\\"row\\\">\",\n        \"    <div class=\\\"col-xs-8\\\">\",\n        \"      <h2 class=\\\"text-primary text-center\\\">CatPhotoApp</h2>\",\n        \"    </div>\",\n        \"    <div class=\\\"col-xs-4\\\">\",\n        \"      <a href=\\\"#\\\"><img class=\\\"img-responsive thick-green-border\\\" src=\\\"/images/relaxing-cat.jpg\\\"></a>\",\n        \"    </div>\",\n        \"  </div>\",\n        \"  <img src=\\\"/images/running-cat.jpg\\\" class=\\\"img-responsive\\\">\",\n        \"  <div class=\\\"row\\\">\",\n        \"    <div class=\\\"col-xs-4\\\">\",\n        \"      <button class=\\\"btn btn-block btn-primary\\\"><i class=\\\"fa fa-thumbs-up\\\"></i> Like</button>\",\n        \"    </div>\",\n        \"    <div class=\\\"col-xs-4\\\">\",\n        \"      <button class=\\\"btn btn-block btn-info\\\">Info</button>\",\n        \"    </div>\",\n        \"    <div class=\\\"col-xs-4\\\">\",\n        \"      <button class=\\\"btn btn-block btn-danger\\\">Delete</button>\",\n        \"    </div>\",\n        \"  </div>\",\n        \"  <p>Things cats <span class=\\\"text-danger\\\">love:</span></p>\",\n        \"  <ul>\",\n        \"    <li>cat nip</li>\",\n        \"    <li>laser pointers</li>\",\n        \"    <li>lasagna</li>\",\n        \"  </ul>\",\n        \"  <p>Top 3 things cats hate:</p>\",\n        \"  <ol>\",\n        \"    <li>flea treatment</li>\",\n        \"    <li>thunder</li>\",\n        \"    <li>other cats</li>\",\n        \"  </ol>\",\n        \"  <form action=\\\"/submit-cat-photo\\\">\",\n        \"    <label><input type=\\\"radio\\\" name=\\\"indoor-outdoor\\\"> Indoor</label>\",\n        \"    <label><input type=\\\"radio\\\" name=\\\"indoor-outdoor\\\"> Outdoor</label>\",\n        \"    <label><input type=\\\"checkbox\\\" name=\\\"personality\\\"> Loving</label>\",\n        \"    <label><input type=\\\"checkbox\\\" name=\\\"personality\\\"> Lazy</label>\",\n        \"    <label><input type=\\\"checkbox\\\" name=\\\"personality\\\"> Crazy</label>\",\n        \"    <input type=\\\"text\\\" placeholder=\\\"cat photo URL\\\" required>\",\n        \"    <button type=\\\"submit\\\">Submit</button>\",\n        \"  </form>\",\n        \"</div>\"\n      ],\n      \"tests\": [\n        \"assert($(\\\".btn-danger > i\\\").is(\\\".fa.fa-trash\\\"), 'message: 你应该添加一个 <code>&#60;i class=\\\"fa fa-trash\\\"&#62;&#60;/i&#62;</code> 到你的删除按钮元素中。');\",\n        \"assert($(\\\".btn-info > i\\\").is(\\\".fa.fa-info-circle\\\"), 'message: 你应该添加一个 <code>&#60;i class=\\\"fa fa-info-circle\\\"&#62;&#60;/i&#62;</code> 到你的 info 按钮元素中。');\",\n        \"assert(code.match(/<\\\\/i>/g) && code.match(/<\\\\/i>/g).length > 2 && $(\\\".btn-primary > i\\\").is(\\\".fa.fa-thumbs-up\\\"), 'message: 确保你的每一个 <code>i</code> 元素都有一个闭合标签，并且 <code>&#60;i class=\\\"fa fa-thumbs-up\\\"&#62;&#60;/i&#62;</code> 在你的 like 按钮元素中。');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 0\n    },\n    {\n      \"id\": \"bad87fee1348bd9aedb08845\",\n      \"title\": \"Responsively Style Radio Buttons\",\n      \"description\": [\n        \"你还可以将 Bootstrap 的 <code>col-xs-*</code>用在 <code>form</code> 元素中。这样的话，我们的单选按钮就可以均匀地在页面上展开，不需要知道屏幕的分辨率有多宽。\",\n        \"将页面中的两个单选按钮放置于一个 <code>&#60;div class=\\\"row\\\"&#62;</code> 元素中。然后，添加 <code>&#60;div class=\\\"col-xs-6\\\"&#62;</code> 元素并分别包裹每一个单选按钮。\"\n      ],\n      \"challengeSeed\": [\n        \"<link href=\\\"//fonts.gdgdocs.org/css?family=Lobster\\\" rel=\\\"stylesheet\\\" type=\\\"text/css\\\">\",\n        \"<style>\",\n        \"  h2 {\",\n        \"    font-family: Lobster, Monospace;\",\n        \"  }\",\n        \"\",\n        \"  .thick-green-border {\",\n        \"    border-color: green;\",\n        \"    border-width: 10px;\",\n        \"    border-style: solid;\",\n        \"    border-radius: 50%;\",\n        \"  }\",\n        \"</style>\",\n        \"\",\n        \"<div class=\\\"container-fluid\\\">\",\n        \"  <div class=\\\"row\\\">\",\n        \"    <div class=\\\"col-xs-8\\\">\",\n        \"      <h2 class=\\\"text-primary text-center\\\">CatPhotoApp</h2>\",\n        \"    </div>\",\n        \"    <div class=\\\"col-xs-4\\\">\",\n        \"      <a href=\\\"#\\\"><img class=\\\"img-responsive thick-green-border\\\" src=\\\"/images/relaxing-cat.jpg\\\"></a>\",\n        \"    </div>\",\n        \"  </div>\",\n        \"  <img src=\\\"/images/running-cat.jpg\\\" class=\\\"img-responsive\\\">\",\n        \"  <div class=\\\"row\\\">\",\n        \"    <div class=\\\"col-xs-4\\\">\",\n        \"      <button class=\\\"btn btn-block btn-primary\\\"><i class=\\\"fa fa-thumbs-up\\\"></i> Like</button>\",\n        \"    </div>\",\n        \"    <div class=\\\"col-xs-4\\\">\",\n        \"      <button class=\\\"btn btn-block btn-info\\\"><i class=\\\"fa fa-info-circle\\\"></i> Info</button>\",\n        \"    </div>\",\n        \"    <div class=\\\"col-xs-4\\\">\",\n        \"      <button class=\\\"btn btn-block btn-danger\\\"><i class=\\\"fa fa-trash\\\"></i> Delete</button>\",\n        \"    </div>\",\n        \"  </div>\",\n        \"  <p>Things cats <span class=\\\"text-danger\\\">love:</span></p>\",\n        \"  <ul>\",\n        \"    <li>cat nip</li>\",\n        \"    <li>laser pointers</li>\",\n        \"    <li>lasagna</li>\",\n        \"  </ul>\",\n        \"  <p>Top 3 things cats hate:</p>\",\n        \"  <ol>\",\n        \"    <li>flea treatment</li>\",\n        \"    <li>thunder</li>\",\n        \"    <li>other cats</li>\",\n        \"  </ol>\",\n        \"  <form action=\\\"/submit-cat-photo\\\">\",\n        \"    <label><input type=\\\"radio\\\" name=\\\"indoor-outdoor\\\"> Indoor</label>\",\n        \"    <label><input type=\\\"radio\\\" name=\\\"indoor-outdoor\\\"> Outdoor</label>\",\n        \"    <label><input type=\\\"checkbox\\\" name=\\\"personality\\\"> Loving</label>\",\n        \"    <label><input type=\\\"checkbox\\\" name=\\\"personality\\\"> Lazy</label>\",\n        \"    <label><input type=\\\"checkbox\\\" name=\\\"personality\\\"> Crazy</label>\",\n        \"    <input type=\\\"text\\\" placeholder=\\\"cat photo URL\\\" required>\",\n        \"    <button type=\\\"submit\\\">Submit</button>\",\n        \"  </form>\",\n        \"</div>\"\n      ],\n      \"tests\": [\n        \"assert($(\\\"div.row:has(input[type=\\\\\\\"radio\\\\\\\"])\\\").length > 0, 'message: 将你所有的单选按钮放置于包含 class 属性 <code>row</code> 的 <code>div</code> 元素中。');\",\n        \"assert($(\\\"div.col-xs-6:has(input[type=\\\\\\\"radio\\\\\\\"])\\\").length > 1, 'message: 你的每一个单选按钮都分别嵌套于自己的 <code>div</code> 元素中，<code>div</code> 包含 class 属性 <code>col-xs-6</code>。');\",\n        \"assert(code.match(/<\\\\/div>/g) && code.match(/<div/g) && code.match(/<\\\\/div>/g).length === code.match(/<div/g).length, 'message: 确保你的每个 <code>div</code> 元素都有一个闭合标签。');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 0\n    },\n    {\n      \"id\": \"bad87fee1348bd9aeda08845\",\n      \"title\": \"Responsively Style Checkboxes\",\n      \"description\": [\n        \"你还可以将 Bootstrap 的 <code>col-xs-*</code>用在 <code>form</code> 元素中。这样我们的复选框就可以均匀地在页面上展开了，不管屏幕的分辨率是多大。\",\n        \"将你所有的复选框都放置于一个 <code>&#60;div class=\\\"row\\\"&#62;</code> 元素中。然后分别把每个按钮都放置于一个 <code>&#60;div class=\\\"col-xs-4\\\"&#62;</code> 元素中。\"\n      ],\n      \"challengeSeed\": [\n        \"<link href=\\\"//fonts.gdgdocs.org/css?family=Lobster\\\" rel=\\\"stylesheet\\\" type=\\\"text/css\\\">\",\n        \"<style>\",\n        \"  h2 {\",\n        \"    font-family: Lobster, Monospace;\",\n        \"  }\",\n        \"\",\n        \"  .thick-green-border {\",\n        \"    border-color: green;\",\n        \"    border-width: 10px;\",\n        \"    border-style: solid;\",\n        \"    border-radius: 50%;\",\n        \"  }\",\n        \"\",\n        \"</style>\",\n        \"\",\n        \"<div class=\\\"container-fluid\\\">\",\n        \"  <div class=\\\"row\\\">\",\n        \"    <div class=\\\"col-xs-8\\\">\",\n        \"      <h2 class=\\\"text-primary text-center\\\">CatPhotoApp</h2>\",\n        \"    </div>\",\n        \"    <div class=\\\"col-xs-4\\\">\",\n        \"      <a href=\\\"#\\\"><img class=\\\"img-responsive thick-green-border\\\" src=\\\"/images/relaxing-cat.jpg\\\"></a>\",\n        \"    </div>\",\n        \"  </div>\",\n        \"  <img src=\\\"/images/running-cat.jpg\\\" class=\\\"img-responsive\\\">\",\n        \"  <div class=\\\"row\\\">\",\n        \"    <div class=\\\"col-xs-4\\\">\",\n        \"      <button class=\\\"btn btn-block btn-primary\\\"><i class=\\\"fa fa-thumbs-up\\\"></i> Like</button>\",\n        \"    </div>\",\n        \"    <div class=\\\"col-xs-4\\\">\",\n        \"      <button class=\\\"btn btn-block btn-info\\\"><i class=\\\"fa fa-info-circle\\\"></i> Info</button>\",\n        \"    </div>\",\n        \"    <div class=\\\"col-xs-4\\\">\",\n        \"      <button class=\\\"btn btn-block btn-danger\\\"><i class=\\\"fa fa-trash\\\"></i> Delete</button>\",\n        \"    </div>\",\n        \"  </div>\",\n        \"  <p>Things cats <span class=\\\"text-danger\\\">love:</span></p>\",\n        \"  <ul>\",\n        \"    <li>cat nip</li>\",\n        \"    <li>laser pointers</li>\",\n        \"    <li>lasagna</li>\",\n        \"  </ul>\",\n        \"  <p>Top 3 things cats hate:</p>\",\n        \"  <ol>\",\n        \"    <li>flea treatment</li>\",\n        \"    <li>thunder</li>\",\n        \"    <li>other cats</li>\",\n        \"  </ol>\",\n        \"  <form action=\\\"/submit-cat-photo\\\">\",\n        \"    <div class=\\\"row\\\">\",\n        \"      <div class=\\\"col-xs-6\\\">\",\n        \"        <label><input type=\\\"radio\\\" name=\\\"indoor-outdoor\\\"> Indoor</label>\",\n        \"      </div>\",\n        \"      <div class=\\\"col-xs-6\\\">\",\n        \"        <label><input type=\\\"radio\\\" name=\\\"indoor-outdoor\\\"> Outdoor</label>\",\n        \"      </div>\",\n        \"    </div>\",\n        \"    <label><input type=\\\"checkbox\\\" name=\\\"personality\\\"> Loving</label>\",\n        \"    <label><input type=\\\"checkbox\\\" name=\\\"personality\\\"> Lazy</label>\",\n        \"    <label><input type=\\\"checkbox\\\" name=\\\"personality\\\"> Crazy</label>\",\n        \"    <input type=\\\"text\\\" placeholder=\\\"cat photo URL\\\" required>\",\n        \"    <button type=\\\"submit\\\">Submit</button>\",\n        \"  </form>\",\n        \"</div>\"\n      ],\n      \"tests\": [\n        \"assert($(\\\"div.row:has(input[type=\\\\\\\"checkbox\\\\\\\"])\\\").length > 0, 'message: 将你所有的复选框嵌入一个 <code>div</code> 含有 class <code>row</code> 的元素中。');\",\n        \"assert($(\\\"div.col-xs-4:has(input[type=\\\\\\\"checkbox\\\\\\\"])\\\").length > 2, 'message: 将你的每一个复选框都分别用含有 class <code>col-xs-4</code> 的 <code>div</code> 元素包裹。');\",\n        \"assert(code.match(/<\\\\/div>/g) && code.match(/<div/g) && code.match(/<\\\\/div>/g).length === code.match(/<div/g).length, 'message: 确保你的每一个 <code>div</code> 元素都有一个闭合标签。');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 0\n    },\n    {\n      \"id\": \"bad87fee1348bd9aed908845\",\n      \"title\": \"Style Text Inputs as Form Controls\",\n      \"description\": [\n        \"你可以在你的 <code>button</code> 提交按钮上添加 Font Awesome的 <code>fa-paper-plane</code> 图标，方法是在元素中增加 <code>&#60;i class=\\\"fa fa-paper-plane\\\"&#62;&#60;/i&#62;</code> 。\",\n        \"给你表单的文本输入框增加 class<code>form-control</code> 。在你的表单提交按钮中增加 class <code>btn btn-primary</code> 。同样，在这个提交按钮中增加 Font Awesome 的 <code>fa-paper-plane</code> 图标。\"\n      ],\n      \"challengeSeed\": [\n        \"<link href=\\\"//fonts.gdgdocs.org/css?family=Lobster\\\" rel=\\\"stylesheet\\\" type=\\\"text/css\\\">\",\n        \"<style>\",\n        \"  h2 {\",\n        \"    font-family: Lobster, Monospace;\",\n        \"  }\",\n        \"\",\n        \"  .thick-green-border {\",\n        \"    border-color: green;\",\n        \"    border-width: 10px;\",\n        \"    border-style: solid;\",\n        \"    border-radius: 50%;\",\n        \"  }\",\n        \"\",\n        \"</style>\",\n        \"\",\n        \"<div class=\\\"container-fluid\\\">\",\n        \"  <div class=\\\"row\\\">\",\n        \"    <div class=\\\"col-xs-8\\\">\",\n        \"      <h2 class=\\\"text-primary text-center\\\">CatPhotoApp</h2>\",\n        \"    </div>\",\n        \"    <div class=\\\"col-xs-4\\\">\",\n        \"      <a href=\\\"#\\\"><img class=\\\"img-responsive thick-green-border\\\" src=\\\"/images/relaxing-cat.jpg\\\"></a>\",\n        \"    </div>\",\n        \"  </div>\",\n        \"  <img src=\\\"/images/running-cat.jpg\\\" class=\\\"img-responsive\\\">\",\n        \"  <div class=\\\"row\\\">\",\n        \"    <div class=\\\"col-xs-4\\\">\",\n        \"      <button class=\\\"btn btn-block btn-primary\\\"><i class=\\\"fa fa-thumbs-up\\\"></i> Like</button>\",\n        \"    </div>\",\n        \"    <div class=\\\"col-xs-4\\\">\",\n        \"      <button class=\\\"btn btn-block btn-info\\\"><i class=\\\"fa fa-info-circle\\\"></i> Info</button>\",\n        \"    </div>\",\n        \"    <div class=\\\"col-xs-4\\\">\",\n        \"      <button class=\\\"btn btn-block btn-danger\\\"><i class=\\\"fa fa-trash\\\"></i> Delete</button>\",\n        \"    </div>\",\n        \"  </div>\",\n        \"  <p>Things cats <span class=\\\"text-danger\\\">love:</span></p>\",\n        \"  <ul>\",\n        \"    <li>cat nip</li>\",\n        \"    <li>laser pointers</li>\",\n        \"    <li>lasagna</li>\",\n        \"  </ul>\",\n        \"  <p>Top 3 things cats hate:</p>\",\n        \"  <ol>\",\n        \"    <li>flea treatment</li>\",\n        \"    <li>thunder</li>\",\n        \"    <li>other cats</li>\",\n        \"  </ol>\",\n        \"  <form action=\\\"/submit-cat-photo\\\">\",\n        \"    <div class=\\\"row\\\">\",\n        \"      <div class=\\\"col-xs-6\\\">\",\n        \"        <label><input type=\\\"radio\\\" name=\\\"indoor-outdoor\\\"> Indoor</label>\",\n        \"      </div>\",\n        \"      <div class=\\\"col-xs-6\\\">\",\n        \"        <label><input type=\\\"radio\\\" name=\\\"indoor-outdoor\\\"> Outdoor</label>\",\n        \"      </div>\",\n        \"    </div>\",\n        \"    <div class=\\\"row\\\">\",\n        \"      <div class=\\\"col-xs-4\\\">\",\n        \"        <label><input type=\\\"checkbox\\\" name=\\\"personality\\\"> Loving</label>\",\n        \"      </div>\",\n        \"      <div class=\\\"col-xs-4\\\">\",\n        \"        <label><input type=\\\"checkbox\\\" name=\\\"personality\\\"> Lazy</label>\",\n        \"      </div>\",\n        \"      <div class=\\\"col-xs-4\\\">\",\n        \"        <label><input type=\\\"checkbox\\\" name=\\\"personality\\\"> Crazy</label>\",\n        \"      </div>\",\n        \"    </div>\",\n        \"    <input type=\\\"text\\\" placeholder=\\\"cat photo URL\\\" required>\",\n        \"    <button type=\\\"submit\\\">Submit</button>\",\n        \"  </form>\",\n        \"</div>\"\n      ],\n      \"tests\": [\n        \"assert($(\\\"button[type=\\\\\\\"submit\\\\\\\"]\\\").hasClass(\\\"btn btn-primary\\\"), 'message: 给你表单中的提交按钮增加 class 属性 <code>btn btn-primary</code>。');\",\n        \"assert($(\\\"button[type=\\\\\\\"submit\\\\\\\"]:has(i.fa.fa-paper-plane)\\\").length > 0, 'message: 添加 <code>&#60;i class=\\\"fa fa-paper-plane\\\"&#62;&#60;/i&#62;</code> 到你的 <code>button</code> 提交元素之中。');\",\n        \"assert($(\\\"input[type=\\\\\\\"text\\\\\\\"]\\\").hasClass(\\\"form-control\\\"), 'message: 给你表单中的文本元素 <code>input</code> 添加 class 属性 <code>form-control</code>。');\",\n        \"assert(code.match(/<\\\\/i>/g) && code.match(/<\\\\/i/g).length > 3, 'message: 确保你的每一个 <code>i</code> 元素都有一个闭合标签。');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 0\n    },\n    {\n      \"id\": \"bad87fee1348bd9aec908845\",\n      \"title\": \"Line up Form Elements Responsively with Bootstrap\",\n      \"description\": [\n        \"现在让我们把 <code>input</code> 元素和提交按钮 <code>button</code> 放到同一行。我们将用和之前一样的方法：通过使用拥有 <code>row</code> class 属性的 <code>div</code> 元素和其它在它之内的具有 <code>col-xs-*</code> class 属性的 <code>div</code> 元素。\",\n        \"将你的表单中的 <code>input</code> 文本框和提交按钮 <code>button</code> 放到一个具有 <code>row</code> class 属性的 <code>div</code> 元素中。 将你的 <code>input</code> 放置于 class 为 <code>col-xs-7</code> 的 <code>div</code>元素中。 将你的表单的提交按钮 <code>button</code> 放置于 class 属性为 <code>col-xs-5</code> 的 <code>div</code> 元素中。\",\n        \"这是目前为止我们的 Cat Photo 应用的最后一个挑战了。希望你能够喜欢学习 Font Awesome，Bootstrap和响应式设计！\"\n      ],\n      \"challengeSeed\": [\n        \"<link href=\\\"//fonts.gdgdocs.org/css?family=Lobster\\\" rel=\\\"stylesheet\\\" type=\\\"text/css\\\">\",\n        \"<style>\",\n        \"  h2 {\",\n        \"    font-family: Lobster, Monospace;\",\n        \"  }\",\n        \"\",\n        \"  .thick-green-border {\",\n        \"    border-color: green;\",\n        \"    border-width: 10px;\",\n        \"    border-style: solid;\",\n        \"    border-radius: 50%;\",\n        \"  }\",\n        \"\",\n        \"</style>\",\n        \"\",\n        \"<div class=\\\"container-fluid\\\">\",\n        \"  <div class=\\\"row\\\">\",\n        \"    <div class=\\\"col-xs-8\\\">\",\n        \"      <h2 class=\\\"text-primary text-center\\\">CatPhotoApp</h2>\",\n        \"    </div>\",\n        \"    <div class=\\\"col-xs-4\\\">\",\n        \"      <a href=\\\"#\\\"><img class=\\\"img-responsive thick-green-border\\\" src=\\\"/images/relaxing-cat.jpg\\\"></a>\",\n        \"    </div>\",\n        \"  </div>\",\n        \"  <img src=\\\"/images/running-cat.jpg\\\" class=\\\"img-responsive\\\">\",\n        \"  <div class=\\\"row\\\">\",\n        \"    <div class=\\\"col-xs-4\\\">\",\n        \"      <button class=\\\"btn btn-block btn-primary\\\"><i class=\\\"fa fa-thumbs-up\\\"></i> Like</button>\",\n        \"    </div>\",\n        \"    <div class=\\\"col-xs-4\\\">\",\n        \"      <button class=\\\"btn btn-block btn-info\\\"><i class=\\\"fa fa-info-circle\\\"></i> Info</button>\",\n        \"    </div>\",\n        \"    <div class=\\\"col-xs-4\\\">\",\n        \"      <button class=\\\"btn btn-block btn-danger\\\"><i class=\\\"fa fa-trash\\\"></i> Delete</button>\",\n        \"    </div>\",\n        \"  </div>\",\n        \"  <p>Things cats <span class=\\\"text-danger\\\">love:</span></p>\",\n        \"  <ul>\",\n        \"    <li>cat nip</li>\",\n        \"    <li>laser pointers</li>\",\n        \"    <li>lasagna</li>\",\n        \"  </ul>\",\n        \"  <p>Top 3 things cats hate:</p>\",\n        \"  <ol>\",\n        \"    <li>flea treatment</li>\",\n        \"    <li>thunder</li>\",\n        \"    <li>other cats</li>\",\n        \"  </ol>\",\n        \"  <form action=\\\"/submit-cat-photo\\\">\",\n        \"    <div class=\\\"row\\\">\",\n        \"      <div class=\\\"col-xs-6\\\">\",\n        \"        <label><input type=\\\"radio\\\" name=\\\"indoor-outdoor\\\"> Indoor</label>\",\n        \"      </div>\",\n        \"      <div class=\\\"col-xs-6\\\">\",\n        \"        <label><input type=\\\"radio\\\" name=\\\"indoor-outdoor\\\"> Outdoor</label>\",\n        \"      </div>\",\n        \"    </div>\",\n        \"    <div class=\\\"row\\\">\",\n        \"      <div class=\\\"col-xs-4\\\">\",\n        \"        <label><input type=\\\"checkbox\\\" name=\\\"personality\\\"> Loving</label>\",\n        \"      </div>\",\n        \"      <div class=\\\"col-xs-4\\\">\",\n        \"        <label><input type=\\\"checkbox\\\" name=\\\"personality\\\"> Lazy</label>\",\n        \"      </div>\",\n        \"      <div class=\\\"col-xs-4\\\">\",\n        \"        <label><input type=\\\"checkbox\\\" name=\\\"personality\\\"> Crazy</label>\",\n        \"      </div>\",\n        \"    </div>\",\n        \"    <input type=\\\"text\\\" class=\\\"form-control\\\" placeholder=\\\"cat photo URL\\\" required>\",\n        \"    <button type=\\\"submit\\\" class=\\\"btn btn-primary\\\"><i class=\\\"fa fa-paper-plane\\\"></i> Submit</button>\",\n        \"  </form>\",\n        \"</div>\"\n      ],\n      \"tests\": [\n        \"assert($(\\\"div.row:has(input[type=\\\\\\\"text\\\\\\\"])\\\").length > 0 &&  $(\\\"div.row:has(button[type=\\\\\\\"submit\\\\\\\"])\\\").length > 0, 'message: 将你的表单提交按钮和文本输入栏嵌入到含有 class <code>row</code> 的 div 元素中。');\",\n        \"assert($(\\\"div.col-xs-7:has(input[type=\\\\\\\"text\\\\\\\"])\\\").length > 0, 'message: 将你的文本输入栏嵌入到一个含有 class <code>col-xs-7</code> 的 div 元素中。');\",\n        \"assert($(\\\"div.col-xs-5:has(button[type=\\\\\\\"submit\\\\\\\"])\\\").length > 0, 'message: 将你的表单提交按钮嵌入到一个含有 class <code>col-xs-5</code> 的 div 元素中。');\",\n        \"assert(code.match(/<\\\\/div>/g) && code.match(/<div/g) && code.match(/<\\\\/div>/g).length === code.match(/<div/g).length, 'message: 确保你的每一个 <code>div</code> 元素都有一个闭合标签。');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 0\n    },\n    {\n      \"id\": \"bad87fee1348bd9aec908846\",\n      \"title\": \"Create a Bootstrap Headline\",\n      \"description\": [\n        \"现在，让我们从头开始练习我们的HTML, CSS 和 Bootstrap 技术。\",\n        \"我们将会搭建一个 jQuery playground，它也即将在我们接下来的 jQuery 课程中被投入使用。\",\n        \"首先，创建一个 <code>h3</code> 元素，并且包含文本内容 <code>jQuery Playground</code> 。\",\n        \"在 <code>h3</code> 元素中设置 Bootstrap 的 class 属性 <code>text-primary</code> 为其上色，同时增加 Bootstrap 的 class 属性 <code>text-center</code> 使文本居中显示。\"\n      ],\n      \"challengeSeed\": [\n        \"\",\n        \"\",\n        \"\"\n      ],\n      \"tests\": [\n        \"assert($(\\\"h3\\\") && $(\\\"h3\\\").length > 0, 'message: 在你的页面中增加一个 <code>h3</code> 元素。');\",\n        \"assert(code.match(/<\\\\/h3>/g) && code.match(/<h3/g) && code.match(/<\\\\/h3>/g).length === code.match(/<h3/g).length, 'message: 确保你的 <code>h3</code> 元素有一个闭合标签。');\",\n        \"assert($(\\\"h3\\\").hasClass(\\\"text-primary\\\"), 'message: 为了让你的 <code>h3</code> element 能被上色，需要添加 class <code>text-primary</code> 。');\",\n        \"assert($(\\\"h3\\\").hasClass(\\\"text-center\\\"), 'message: 你的 <code>h3</code> element 居中显示需要添加 class <code>text-center</code> 。');\",\n        \"assert.isTrue((/jquery(\\\\s)+playground/gi).test($(\\\"h3\\\").text()), 'message: 你的 <code>h3</code> 元素需要有文本 <code>jQuery Playground</code> 。');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 0\n    },\n    {\n      \"id\": \"bad87fee1348bd9aec908746\",\n      \"title\": \"House our page within a Bootstrap Container Fluid Div\",\n      \"description\": [\n        \"现在让我们确保页面里所有的内容都是响应式的。\",\n        \"让我们将 <code>h3</code> 元素放置于一个class属性为 <code>container-fluid</code> 的 <code>div</code> 元素中。\"\n      ],\n      \"challengeSeed\": [\n        \"<h3 class=\\\"text-primary text-center\\\">jQuery Playground</h3>\",\n        \"\",\n        \"\"\n      ],\n      \"tests\": [\n        \"assert($(\\\"div\\\").hasClass(\\\"container-fluid\\\"), 'message: 你的 <code>div</code> 元素应该有 class <code>container-fluid</code>。');\",\n        \"assert(code.match(/<\\\\/div>/g) && code.match(/<div/g) && code.match(/<\\\\/div>/g).length === code.match(/<div/g).length, 'message: 确保你的每一个 <code>div</code> 元素都有一个闭合标签。');\",\n        \"assert($(\\\"div\\\").children(\\\"h3\\\").length >0, 'message: 将你的 <code>h3</code> 元素嵌入到一个 <code>div</code> 元素中。');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 0\n    },\n    {\n      \"id\": \"bad87fee1348bd9bec908846\",\n      \"title\": \"Create a Bootstrap Row\",\n      \"description\": [\n        \"现在将要为我们的内联元素创建一个 Bootstrap 行。\",\n        \"在 <code>h3</code> 标签下创建一个 <code>div</code> 元素，并且带有 class 属性 <code>row</code> 。\"\n      ],\n      \"challengeSeed\": [\n        \"<div class=\\\"container-fluid\\\">\",\n        \"  <h3 class=\\\"text-primary text-center\\\">jQuery Playground</h3>\",\n        \"\",\n        \"</div>\",\n        \"\"\n      ],\n      \"tests\": [\n        \"assert(($(\\\"div\\\").length > 1) && ($(\\\"div.row h3.text-primary\\\").length == 0) && ($(\\\"div.row + h3.text-primary\\\").length == 0) && ($(\\\"h3.text-primary + div.row\\\").length > 0), 'message: 在你的 <code>h3</code> 之下增加一个 <code>div</code> 元素。');\",\n        \"assert($(\\\"div\\\").hasClass(\\\"row\\\"), 'message: 你的 <code>div</code> 元素应该有 class <code>row</code>');\",\n        \"assert($(\\\"div.container-fluid div.row\\\").length > 0, 'message: 你的 <code>row div</code> 应该内嵌于 <code>container-fluid div</code> 之中。');\",\n        \"assert(code.match(/<\\\\/div>/g) && code.match(/<div/g) && code.match(/<\\\\/div>/g).length === code.match(/<div/g).length, 'message: 确保你的 <code>div</code> 元素有一个闭合标签。');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 0\n    },\n    {\n      \"id\": \"bad87fee1348bd9aec908847\",\n      \"title\": \"Split your Bootstrap Row\",\n      \"description\": [\n        \"既然我们已经有了一个 Bootstrap 行，让我们来把它分成两栏来放置我们的元素吧。\",\n        \"在你的行内添加两个 <code>div</code> 元素，每个都具有 <code>col-xs-6</code> class 属性。\"\n      ],\n      \"challengeSeed\": [\n        \"<div class=\\\"container-fluid\\\">\",\n        \"  <h3 class=\\\"text-primary text-center\\\">jQuery Playground</h3>\",\n        \"  <div class=\\\"row\\\">\",\n        \"\",\n        \"\",\n        \"  </div>\",\n        \"</div>\"\n      ],\n      \"tests\": [\n        \"assert($(\\\"div.row > div.col-xs-6\\\").length > 1, 'message: 将两个 <code>div class=\\\"col-xs-6\\\"</code> 元素内嵌入你的 <code>div class=\\\"row\\\"</code> 元素中。');\",\n        \"assert(code.match(/<\\\\/div>/g) && code.match(/<div/g) && code.match(/<\\\\/div>/g).length === code.match(/<div/g).length, 'message: 确保你所有的 <code>div</code> 元素都有一个闭合标签。');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 0\n    },\n    {\n      \"id\": \"bad87fee1348bd9aec908848\",\n      \"title\": \"Create Bootstrap Wells\",\n      \"description\": [\n        \"Bootstrap 有一个 class 属性叫做 <code>well</code>，它的作用是为设定的列创造出一种视觉上的深度感（一种视觉上的效果，动手写代码体会一下）。\",\n        \"在你的每一个class为<code>col-xs-6</code>的<code>div</code> 元素中都嵌入一个带有 <code>well</code> class 属性的 <code>div</code> 元素。\"\n      ],\n      \"challengeSeed\": [\n        \"<div class=\\\"container-fluid\\\">\",\n        \"  <h3 class=\\\"text-primary text-center\\\">jQuery Playground</h3>\",\n        \"  <div class=\\\"row\\\">\",\n        \"    <div class=\\\"col-xs-6\\\">\",\n        \"\",\n        \"    </div>\",\n        \"    <div class=\\\"col-xs-6\\\">\",\n        \"\",\n        \"    </div>\",\n        \"  </div>\",\n        \"</div>\"\n      ],\n      \"tests\": [\n        \"assert($(\\\"div.col-xs-6\\\").not(\\\":has(>div.well)\\\").length < 1, 'message: 创建一个 <code>div</code> 元素并包含 class <code>well</code> ， 将其分别放置于你的每一个有 class <code>\\\"col-xs-6\\\"</code> 的 <code>div</code> 元素中。 ');\",\n        \"assert($(\\\"div.row > div.col-xs-6\\\").length > 1, 'message: 将你两个含有 class <code>\\\"col-xs-6\\\"</code> 的 <code>div</code> 元素嵌入到有 class <code>\\\"row\\\"</code> 的 <code>div</code> 元素中。');\",\n        \"assert(code.match(/<\\\\/div>/g) && code.match(/<div/g) && code.match(/<\\\\/div>/g).length === code.match(/<div/g).length, 'message: 确保你所有的 <code>div</code> 元素都有闭合标签。');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 0\n    },\n    {\n      \"id\": \"bad87fee1348bd9aec908849\",\n      \"title\": \"Add Elements within your Bootstrap Wells\",\n      \"description\": [\n        \"现在我们已经在行内的每一列都嵌套了好几层 <code>div</code> 元素了。这已经足够了。现在让我们添加 button 元素吧。\",\n        \"在每一个 <code>well</code> <code>div</code> 元素下放置三个 <code>button</code> 元素。\"\n      ],\n      \"challengeSeed\": [\n        \"<div class=\\\"container-fluid\\\">\",\n        \"  <h3 class=\\\"text-primary text-center\\\">jQuery Playground</h3>\",\n        \"  <div class=\\\"row\\\">\",\n        \"    <div class=\\\"col-xs-6\\\">\",\n        \"      <div class=\\\"well\\\">\",\n        \"\",\n        \"\",\n        \"\",\n        \"      </div>\",\n        \"    </div>\",\n        \"    <div class=\\\"col-xs-6\\\">\",\n        \"      <div class=\\\"well\\\">\",\n        \"\",\n        \"\",\n        \"\",\n        \"      </div>\",\n        \"    </div>\",\n        \"  </div>\",\n        \"</div>\"\n      ],\n      \"tests\": [\n        \"assert($(\\\"div.well\\\").children(\\\"button\\\").length > 5, 'message: 将三个 <code>button</code> 元素分别内嵌于含有 class <code>well</code> 的 <code>div</code> 元素中。');\",\n        \"assert($(\\\"button\\\") && $(\\\"button\\\").length > 5, 'message: 你应该总共有 6 个 <code>button</code> 元素。');\",\n        \"assert(code.match(/<\\\\/button>/g) && code.match(/<button/g) && code.match(/<\\\\/button>/g).length === code.match(/<button/g).length, 'message: 确保你所有的 <code>button</code> 元素都有闭合标签。');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 0\n    },\n    {\n      \"id\": \"bad87fee1348bd9aec908850\",\n      \"title\": \"Apply the Default Bootstrap Button Style\",\n      \"description\": [\n        \"Bootstrap 还有一种属于按钮的 class 属性叫做 <code>btn-default</code> 。\",\n        \"为你的每一个 <code>button</code> 元素增加两个 class 属性: <code>btn</code> 和 <code>btn-default</code> 。\"\n      ],\n      \"challengeSeed\": [\n        \"<div class=\\\"container-fluid\\\">\",\n        \"  <h3 class=\\\"text-primary text-center\\\">jQuery Playground</h3>\",\n        \"  <div class=\\\"row\\\">\",\n        \"    <div class=\\\"col-xs-6\\\">\",\n        \"      <div class=\\\"well\\\">\",\n        \"        <button></button>\",\n        \"        <button></button>\",\n        \"        <button></button>\",\n        \"      </div>\",\n        \"    </div>\",\n        \"    <div class=\\\"col-xs-6\\\">\",\n        \"      <div class=\\\"well\\\">\",\n        \"        <button></button>\",\n        \"        <button></button>\",\n        \"        <button></button>\",\n        \"      </div>\",\n        \"    </div>\",\n        \"  </div>\",\n        \"</div>\"\n      ],\n      \"tests\": [\n        \"assert($(\\\".btn\\\").length > 5, 'message: 将 <code>btn</code> class 添加到你所有的 <code>button</code> 元素中。');\",\n        \"assert($(\\\".btn-default\\\").length > 5, 'message: 将 <code>btn-default</code> class 添加到你每一个 <code>button</code> 元素中。');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 0\n    },\n    {\n      \"id\": \"bad87fee1348bd9aec908852\",\n      \"title\": \"Create a Class to Target with jQuery Selectors\",\n      \"description\": [\n        \"并不是每一个 class 属性都是用于 CSS 的。 有些时候我们创建一些 class 只是为了更方便地在jQuery中选中这些元素。\",\n        \"为你的每一个 <code>button</code> 都添加 <code>target</code> class。\"\n      ],\n      \"challengeSeed\": [\n        \"<div class=\\\"container-fluid\\\">\",\n        \"  <h3 class=\\\"text-primary text-center\\\">jQuery Playground</h3>\",\n        \"  <div class=\\\"row\\\">\",\n        \"    <div class=\\\"col-xs-6\\\">\",\n        \"      <div class=\\\"well\\\">\",\n        \"        <button class=\\\"btn btn-default\\\"></button>\",\n        \"        <button class=\\\"btn btn-default\\\"></button>\",\n        \"        <button class=\\\"btn btn-default\\\"></button>\",\n        \"      </div>\",\n        \"    </div>\",\n        \"    <div class=\\\"col-xs-6\\\">\",\n        \"      <div class=\\\"well\\\">\",\n        \"        <button class=\\\"btn btn-default\\\"></button>\",\n        \"        <button class=\\\"btn btn-default\\\"></button>\",\n        \"        <button class=\\\"btn btn-default\\\"></button>\",\n        \"      </div>\",\n        \"    </div>\",\n        \"  </div>\",\n        \"</div>\"\n      ],\n      \"tests\": [\n        \"assert($(\\\".target\\\").length > 5, 'message: 设置 <code>target</code> class 属性到你的每一个 <code>button</code> 元素中。');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 0\n    },\n    {\n      \"id\": \"bad87fee1348bd9aec908853\",\n      \"title\": \"Add ID Attributes to Bootstrap Elements\",\n      \"description\": [\n        \"回忆一下，我们除了可以给元素增加 class 属性，还可以给你的每个元素增添一个 id 属性。\",\n        \"每一个指定元素的 id 都是唯一的，并且在每个页面中只能使用一次。\",\n        \"现在给我们每个包含 class <code>well</code> 的 <code>div</code> 元素一个唯一的 id。\",\n        \"记住，你可以像这样赋予一个元素 id：\",\n        \"<code>&#60;div class=\\\"well\\\" id=\\\"center-well\\\"&#62;</code>\",\n        \"给左边的 well 赋予 id <code>left-well</code>。给右边的 well 赋予 id <code>right-well</code>。\"\n      ],\n      \"challengeSeed\": [\n        \"<div class=\\\"container-fluid\\\">\",\n        \"  <h3 class=\\\"text-primary text-center\\\">jQuery Playground</h3>\",\n        \"  <div class=\\\"row\\\">\",\n        \"    <div class=\\\"col-xs-6\\\">\",\n        \"      <div class=\\\"well\\\">\",\n        \"        <button class=\\\"btn btn-default target\\\"></button>\",\n        \"        <button class=\\\"btn btn-default target\\\"></button>\",\n        \"        <button class=\\\"btn btn-default target\\\"></button>\",\n        \"      </div>\",\n        \"    </div>\",\n        \"    <div class=\\\"col-xs-6\\\">\",\n        \"      <div class=\\\"well\\\">\",\n        \"        <button class=\\\"btn btn-default target\\\"></button>\",\n        \"        <button class=\\\"btn btn-default target\\\"></button>\",\n        \"        <button class=\\\"btn btn-default target\\\"></button>\",\n        \"      </div>\",\n        \"    </div>\",\n        \"  </div>\",\n        \"</div>\"\n      ],\n      \"tests\": [\n        \"assert($(\\\".col-xs-6\\\").children(\\\"#left-well\\\") && $(\\\".col-xs-6\\\").children(\\\"#left-well\\\").length > 0, 'message: 给你左边的 <code>well</code> 设置 id <code>left-well</code>。');\",\n        \"assert($(\\\".col-xs-6\\\").children(\\\"#right-well\\\") && $(\\\".col-xs-6\\\").children(\\\"#right-well\\\").length > 0, 'message: 给你右边的 <code>well</code> 设置 id <code>right-well</code>。');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 0\n    },\n    {\n      \"id\": \"bad87fee1348bd9aec908854\",\n      \"title\": \"Label Bootstrap Wells\",\n      \"description\": [\n        \"让我们为我们的 wells 都标上它们的 id 吧。\",\n        \"在 left-well 之上，class为 <code>col-xs-6</code> 的 <code>div</code> 元素里面，添加一个文本为 <code>#left-well</code> 的 <code>h4</code>元素。\",\n        \"在 right-well 之上，class为 <code>col-xs-6</code> 的 <code>div</code> 元素里面，添加一个文本为 <code>#right-well</code> 的 <code>h4</code>元素。\"\n      ],\n      \"challengeSeed\": [\n        \"<div class=\\\"container-fluid\\\">\",\n        \"  <h3 class=\\\"text-primary text-center\\\">jQuery Playground</h3>\",\n        \"  <div class=\\\"row\\\">\",\n        \"    <div class=\\\"col-xs-6\\\">\",\n        \"\",\n        \"      <div class=\\\"well\\\" id=\\\"left-well\\\">\",\n        \"        <button class=\\\"btn btn-default target\\\"></button>\",\n        \"        <button class=\\\"btn btn-default target\\\"></button>\",\n        \"        <button class=\\\"btn btn-default target\\\"></button>\",\n        \"      </div>\",\n        \"    </div>\",\n        \"    <div class=\\\"col-xs-6\\\">\",\n        \"\",\n        \"      <div class=\\\"well\\\" id=\\\"right-well\\\">\",\n        \"        <button class=\\\"btn btn-default target\\\"></button>\",\n        \"        <button class=\\\"btn btn-default target\\\"></button>\",\n        \"        <button class=\\\"btn btn-default target\\\"></button>\",\n        \"      </div>\",\n        \"    </div>\",\n        \"  </div>\",\n        \"</div>\"\n      ],\n      \"tests\": [\n        \"assert($(\\\".col-xs-6\\\").children(\\\"h4\\\") && $(\\\".col-xs-6\\\").children(\\\"h4\\\").length > 1, 'message: 添加 <code>h4</code> 元素到你的每一个 <code>&#60;div class=\\\"col-xs-6\\\"&#62;</code> 元素之中。');\",\n        \"assert(new RegExp(\\\"#left-well\\\",\\\"gi\\\").test($(\\\"h4\\\").text()), 'message: 第一个 <code>h4</code> 元素含有文本内容 <code>#left-well</code> 。');\",\n        \"assert(new RegExp(\\\"#right-well\\\",\\\"gi\\\").test($(\\\"h4\\\").text()), 'message: 另一个 <code>h4</code> 元素含有文本内容 <code>#right-well</code> 。');\",\n        \"assert(code.match(/<\\\\/h4>/g) && code.match(/<h4/g) && code.match(/<\\\\/h4>/g).length === code.match(/<h4/g).length, 'message: 确保你所有的 <code>h4</code> 元素都有闭合标签。');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 0\n    },\n    {\n      \"id\": \"bad87fee1348bd9aec908855\",\n      \"title\": \"Give Each Element a Unique ID\",\n      \"description\": [\n        \"我们也可以使用jQuery并通过每个按钮各自唯一的 id 来标识出它们。\\n\",\n        \"给你的每一个按钮一个唯一的 id ，以 <code>target1</code> 为开始，<code>target6</code> 为结束。\",\n        \"确保 <code>target1</code> 到 <code>target3</code> 在 <code>#left-well</code> 之中，<code>target4</code> 到 <code>target6</code> 则在 <code>#right-well</code> 之中。\"\n      ],\n      \"challengeSeed\": [\n        \"<div class=\\\"container-fluid\\\">\",\n        \"  <h3 class=\\\"text-primary text-center\\\">jQuery Playground</h3>\",\n        \"  <div class=\\\"row\\\">\",\n        \"    <div class=\\\"col-xs-6\\\">\",\n        \"      <h4>#left-well</h4>\",\n        \"      <div class=\\\"well\\\" id=\\\"left-well\\\">\",\n        \"        <button class=\\\"btn btn-default target\\\"></button>\",\n        \"        <button class=\\\"btn btn-default target\\\"></button>\",\n        \"        <button class=\\\"btn btn-default target\\\"></button>\",\n        \"      </div>\",\n        \"    </div>\",\n        \"    <div class=\\\"col-xs-6\\\">\",\n        \"      <h4>#right-well</h4>\",\n        \"      <div class=\\\"well\\\" id=\\\"right-well\\\">\",\n        \"        <button class=\\\"btn btn-default target\\\"></button>\",\n        \"        <button class=\\\"btn btn-default target\\\"></button>\",\n        \"        <button class=\\\"btn btn-default target\\\"></button>\",\n        \"      </div>\",\n        \"    </div>\",\n        \"  </div>\",\n        \"</div>\"\n      ],\n      \"tests\": [\n        \"assert($(\\\"#left-well\\\").children(\\\"#target1\\\") && $(\\\"#left-well\\\").children(\\\"#target1\\\").length > 0, 'message: 其中一个 <code>button</code> 元素应该有 id <code>target1</code>。');\",\n        \"assert($(\\\"#left-well\\\").children(\\\"#target2\\\") && $(\\\"#left-well\\\").children(\\\"#target2\\\").length > 0, 'message: 其中一个 <code>button</code> 元素应该有 id <code>target2</code>。');\",\n        \"assert($(\\\"#left-well\\\").children(\\\"#target3\\\") && $(\\\"#left-well\\\").children(\\\"#target3\\\").length > 0, 'message: 其中一个 <code>button</code> 元素应该有 id <code>target3</code>。');\",\n        \"assert($(\\\"#right-well\\\").children(\\\"#target4\\\") && $(\\\"#right-well\\\").children(\\\"#target4\\\").length > 0, 'message: 其中一个 <code>button</code> 元素应该有 id <code>target4</code>。');\",\n        \"assert($(\\\"#right-well\\\").children(\\\"#target5\\\") && $(\\\"#right-well\\\").children(\\\"#target5\\\").length > 0, 'message: 其中一个 <code>button</code> 元素应该有 id <code>target5</code>。');\",\n        \"assert($(\\\"#right-well\\\").children(\\\"#target6\\\") && $(\\\"#right-well\\\").children(\\\"#target6\\\").length > 0, 'message: 其中一个 <code>button</code> 元素应该有 id <code>target6</code>。');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 0\n    },\n    {\n      \"id\": \"bad87fee1348bd9aec908856\",\n      \"title\": \"Label Bootstrap Buttons\",\n      \"description\": [\n        \"正如我们标注了每个 wells， 我们同样想要标注每一个按钮。\",\n        \"为你的每个 <code>button</code> 元素选择与其 id 选择器相同的文本。\"\n      ],\n      \"challengeSeed\": [\n        \"<div class=\\\"container-fluid\\\">\",\n        \"  <h3 class=\\\"text-primary text-center\\\">jQuery Playground</h3>\",\n        \"  <div class=\\\"row\\\">\",\n        \"    <div class=\\\"col-xs-6\\\">\",\n        \"      <h4>#left-well</h4>\",\n        \"      <div class=\\\"well\\\" id=\\\"left-well\\\">\",\n        \"        <button class=\\\"btn btn-default target\\\" id=\\\"target1\\\"></button>\",\n        \"        <button class=\\\"btn btn-default target\\\" id=\\\"target2\\\"></button>\",\n        \"        <button class=\\\"btn btn-default target\\\" id=\\\"target3\\\"></button>\",\n        \"      </div>\",\n        \"    </div>\",\n        \"    <div class=\\\"col-xs-6\\\">\",\n        \"      <h4>#right-well</h4>\",\n        \"      <div class=\\\"well\\\" id=\\\"right-well\\\">\",\n        \"        <button class=\\\"btn btn-default target\\\" id=\\\"target4\\\"></button>\",\n        \"        <button class=\\\"btn btn-default target\\\" id=\\\"target5\\\"></button>\",\n        \"        <button class=\\\"btn btn-default target\\\" id=\\\"target6\\\"></button>\",\n        \"      </div>\",\n        \"    </div>\",\n        \"  </div>\",\n        \"</div>\"\n      ],\n      \"tests\": [\n        \"assert(new RegExp(\\\"#target1\\\",\\\"gi\\\").test($(\\\"#target1\\\").text()), 'message: 在 id 为 <code>target1</code> 的 <code>button</code> 元素中输入文本 <code>#target1</code>。');\",\n        \"assert(new RegExp(\\\"#target2\\\",\\\"gi\\\").test($(\\\"#target2\\\").text()), 'message: 在 id 为 <code>target2</code> 的 <code>button</code> 元素中输入文本 <code>#target2</code>。');\",\n        \"assert(new RegExp(\\\"#target3\\\",\\\"gi\\\").test($(\\\"#target3\\\").text()), 'message: 在 id 为 <code>target3</code> 的 <code>button</code> 元素中输入文本 <code>#target3</code>。');\",\n        \"assert(new RegExp(\\\"#target4\\\",\\\"gi\\\").test($(\\\"#target4\\\").text()), 'message: 在 id 为 <code>target4</code> 的 <code>button</code> 元素中输入文本 <code>#target4</code>。');\",\n        \"assert(new RegExp(\\\"#target5\\\",\\\"gi\\\").test($(\\\"#target5\\\").text()), 'message: 在 id 为 <code>target5</code> 的 <code>button</code> 元素中输入文本 <code>#target5</code>。');\",\n        \"assert(new RegExp(\\\"#target6\\\",\\\"gi\\\").test($(\\\"#target6\\\").text()), 'message: 在 id 为 <code>target6</code> 的 <code>button</code> 元素中输入文本 <code>#target6</code>。');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 0\n    },\n    {\n      \"id\": \"bad87fee1348bd9aec908857\",\n      \"title\": \"Use Comments to Clarify Code\",\n      \"description\": [\n        \"当我们开始使用jQuery，我们将修改HTML元素，但是实际上我们并不是直接在 HTML 文本中修改。\",\n        \"我们必须确保让每个人都知道，他们不应该直接修改此页面上这些代码。\",\n        \"记住，你可以在 <code>&#60;!--</code> 为开始，  <code>--&#62;</code> 为结束的地方进行评论注释。(像这样， <code>&#60;!--</code> 我是一段注释 <code>--&#62;</code> )\",\n        \"请在你的 HTML 顶部加如下一段注释：<code>Only change code above this line.</code> 。\"\n      ],\n      \"challengeSeed\": [\n        \"<div class=\\\"container-fluid\\\">\",\n        \"  <h3 class=\\\"text-primary text-center\\\">jQuery Playground</h3>\",\n        \"  <div class=\\\"row\\\">\",\n        \"    <div class=\\\"col-xs-6\\\">\",\n        \"      <h4>#left-well</h4>\",\n        \"      <div class=\\\"well\\\" id=\\\"left-well\\\">\",\n        \"        <button class=\\\"btn btn-default target\\\" id=\\\"target1\\\">#target1</button>\",\n        \"        <button class=\\\"btn btn-default target\\\" id=\\\"target2\\\">#target2</button>\",\n        \"        <button class=\\\"btn btn-default target\\\" id=\\\"target3\\\">#target3</button>\",\n        \"      </div>\",\n        \"    </div>\",\n        \"    <div class=\\\"col-xs-6\\\">\",\n        \"      <h4>#right-well</h4>\",\n        \"      <div class=\\\"well\\\" id=\\\"right-well\\\">\",\n        \"        <button class=\\\"btn btn-default target\\\" id=\\\"target4\\\">#target4</button>\",\n        \"        <button class=\\\"btn btn-default target\\\" id=\\\"target5\\\">#target5</button>\",\n        \"        <button class=\\\"btn btn-default target\\\" id=\\\"target6\\\">#target6</button>\",\n        \"      </div>\",\n        \"    </div>\",\n        \"  </div>\",\n        \"</div>\"\n      ],\n      \"tests\": [\n        \"assert(code.match(/^\\\\s*<!--/), 'message: 在增加注释前，在你的 HTML 顶部增加此代码 <code>&#60;!--</code> 。');\",\n        \"assert(code.match(/<!--\\\\s*(?!(>|->|.*-->.*this line))\\\\s*.*this line.*\\\\s*-->/gi), 'message: 你的注释内容 <code>Only change code above this line</code>.');\",\n        \"assert(code.match(/-->.*\\\\n+.+/g), 'message: 确保你的注释有闭合代码 <code>--&#62;</code>.');\",\n        \"assert(code.match(/<!--/g).length === code.match(/-->/g).length, 'message: 注意，注释的开始标签和闭合标签数量应该一一对应，保持数量一致。');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 0\n    }\n  ]\n}\n"
  },
  {
    "path": "seed/challenges/01-front-end-development-certification/front-end-development-certificate.json",
    "content": "{\n  \"name\": \"Claim Your Front End Development Certificate\",\n  \"order\": 13,\n  \"time\": \"5 minutes\",\n  \"challenges\": [\n    {\n      \"id\": \"561add10cb82ac38a17513be\",\n      \"title\": \"Claim Your Front End Development Certificate\",\n      \"description\": [\n        [\n          \"//i.imgur.com/k8btNUB.jpg\",\n          \"An image of our Front End Development Certificate\",\n          \"本次挑战将会授予你前端开发者证书。在我们发行你的证书之前，必须验证你已经完成了所有的基本和中级算法脚本的挑战，以及所有的基本，中级和高级前端开发项目。你也要向我们做出学术诚信的承诺。点击下面的按钮开始。\",\n          \"\"\n        ],\n        [\n          \"//i.imgur.com/HArFfMN.jpg\",\n          \"The definition of plagiarism: Plagiarism (noun) - copying someone else’s work and presenting it as your own without crediting them\",\n          \"点击下面的按钮，意味着你承诺你所有提交的代码 1）是你自己写的，或者 2）来自开源库，比如jQuery。或者 3）已经显式地申明原作者。并且你允许我们审核你所有挑战的完成代码，在发现剽窃的时候吊销你的证书。\",\n          \"#\"\n        ],\n        [\n          \"//i.imgur.com/14F2Van.jpg\",\n          \"An image of the text \\\"Front End Development Certificate requirements\\\"\",\n          \"让我们确认您已经完成了所有的基本和中级算法脚本的挑战，以及我们的基本，中级和高级前端开发项目。点击下方的按钮开始验证。\",\n          \"#\"\n        ],\n        [\n          \"//i.imgur.com/16SIhHO.jpg\",\n          \"An image of the word \\\"Congratulations\\\"\",\n          \"恭喜！我们已经将前端开发者证书添加到你的代码记录区。除非你选择隐藏你的挑战完成代码，你的证书会一直公开有效。\",\n          \"\"\n        ]\n      ],\n      \"challengeSeed\": [\n        {\n          \"properties\": [\n            \"isHonest\",\n            \"isFrontEndCert\"\n          ],\n          \"apis\": [\n            \"/certificate/honest\",\n            \"/certificate/verify/front-end\"\n          ],\n          \"stepIndex\": [\n            1,\n            2\n          ]\n        }\n      ],\n      \"tests\": [\n        {\n          \"id\": \"a202eed8fc186c8434cb6d61\",\n          \"title\": \"Reverse a String\"\n        },\n        {\n          \"id\": \"a302f7aae1aa3152a5b413bc\",\n          \"title\": \"Factorialize a Number\"\n        },\n        {\n          \"id\": \"aaa48de84e1ecc7c742e1124\",\n          \"title\": \"Check for Palindromes\"\n        },\n        {\n          \"id\": \"a26cbbe9ad8655a977e1ceb5\",\n          \"title\": \"Find the Longest Word in a String\"\n        },\n        {\n          \"id\": \"ab6137d4e35944e21037b769\",\n          \"title\": \"Title Case a Sentence\"\n        },\n        {\n          \"id\": \"a789b3483989747d63b0e427\",\n          \"title\": \"Return Largest Numbers in Arrays\"\n        },\n        {\n          \"id\": \"acda2fb1324d9b0fa741e6b5\",\n          \"title\": \"Confirm the Ending\"\n        },\n        {\n          \"id\": \"afcc8d540bea9ea2669306b6\",\n          \"title\": \"Repeat a string repeat a string\"\n        },\n        {\n          \"id\": \"ac6993d51946422351508a41\",\n          \"title\": \"Truncate a string\"\n        },\n        {\n          \"id\": \"a9bd25c716030ec90084d8a1\",\n          \"title\": \"Chunky Monkey\"\n        },\n        {\n          \"id\": \"ab31c21b530c0dafa9e241ee\",\n          \"title\": \"Slasher Flick\"\n        },\n        {\n          \"id\": \"af2170cad53daa0770fabdea\",\n          \"title\": \"Mutations\"\n        },\n        {\n          \"id\": \"adf08ec01beb4f99fc7a68f2\",\n          \"title\": \"Falsy Bouncer\"\n        },\n        {\n          \"id\": \"a39963a4c10bc8b4d4f06d7e\",\n          \"title\": \"Seek and Destroy\"\n        },\n        {\n          \"id\": \"a24c1a4622e3c05097f71d67\",\n          \"title\": \"Where do I belong\"\n        },\n        {\n          \"id\": \"a3566b1109230028080c9345\",\n          \"title\": \"Sum All Numbers in a Range\"\n        },\n        {\n          \"id\": \"a5de63ebea8dbee56860f4f2\",\n          \"title\": \"Diff Two Arrays\"\n        },\n        {\n          \"id\": \"a7f4d8f2483413a6ce226cac\",\n          \"title\": \"Roman Numeral Converter\"\n        },\n        {\n          \"id\": \"a8e512fbe388ac2f9198f0fa\",\n          \"title\": \"Wherefore art thou\"\n        },\n        {\n          \"id\": \"a0b5010f579e69b815e7c5d6\",\n          \"title\": \"Search and Replace\"\n        },\n        {\n          \"id\": \"aa7697ea2477d1316795783b\",\n          \"title\": \"Pig Latin\"\n        },\n        {\n          \"id\": \"afd15382cdfb22c9efe8b7de\",\n          \"title\": \"DNA Pairing\"\n        },\n        {\n          \"id\": \"af7588ade1100bde429baf20\",\n          \"title\": \"Missing letters\"\n        },\n        {\n          \"id\": \"a77dbc43c33f39daa4429b4f\",\n          \"title\": \"Boo who\"\n        },\n        {\n          \"id\": \"a105e963526e7de52b219be9\",\n          \"title\": \"Sorted Union\"\n        },\n        {\n          \"id\": \"a6b0bb188d873cb2c8729495\",\n          \"title\": \"Convert HTML Entities\"\n        },\n        {\n          \"id\": \"a103376db3ba46b2d50db289\",\n          \"title\": \"Spinal Tap Case\"\n        },\n        {\n          \"id\": \"a5229172f011153519423690\",\n          \"title\": \"Sum All Odd Fibonacci Numbers\"\n        },\n        {\n          \"id\": \"a3bfc1673c0526e06d3ac698\",\n          \"title\": \"Sum All Primes\"\n        },\n        {\n          \"id\": \"ae9defd7acaf69703ab432ea\",\n          \"title\": \"Smallest Common Multiple\"\n        },\n        {\n          \"id\": \"a6e40f1041b06c996f7b2406\",\n          \"title\": \"Finders Keepers\"\n        },\n        {\n          \"id\": \"a5deed1811a43193f9f1c841\",\n          \"title\": \"Drop it\"\n        },\n        {\n          \"id\": \"ab306dbdcc907c7ddfc30830\",\n          \"title\": \"Steamroller\"\n        },\n        {\n          \"id\": \"a8d97bd4c764e91f9d2bda01\",\n          \"title\": \"Binary Agents\"\n        },\n        {\n          \"id\": \"a10d2431ad0c6a099a4b8b52\",\n          \"title\": \"Everything Be True\"\n        },\n        {\n          \"id\": \"a97fd23d9b809dac9921074f\",\n          \"title\": \"Arguments Optional\"\n        },\n        {\n          \"id\": \"bd7158d8c442eddfbeb5bd1f\",\n          \"title\": \"Get Set for Ziplines\"\n        },\n        {\n          \"id\": \"bd7158d8c242eddfaeb5bd13\",\n          \"title\": \"Build a Personal Portfolio Webpage\"\n        },\n        {\n          \"id\": \"bd7158d8c442eddfaeb5bd13\",\n          \"title\": \"Build a Random Quote Machine\"\n        },\n        {\n          \"id\": \"bd7158d8c442eddfaeb5bd0f\",\n          \"title\": \"Build a Pomodoro Clock\"\n        },\n        {\n          \"id\": \"bd7158d8c442eddfaeb5bd17\",\n          \"title\": \"Build a JavaScript Calculator\"\n        },\n        {\n          \"id\": \"bd7158d8c442eddfaeb5bd10\",\n          \"title\": \"Show the Local Weather\"\n        },\n        {\n          \"id\": \"bd7158d8c442eddfaeb5bd1f\",\n          \"title\": \"Use the Twitch.tv JSON API\"\n        },\n        {\n          \"id\": \"bd7158d8c442eddfaeb5bd18\",\n          \"title\": \"Stylize Stories on Camper News\"\n        },\n        {\n          \"id\": \"bd7158d8c442eddfaeb5bd19\",\n          \"title\": \"Build a Wikipedia Viewer\"\n        },\n        {\n          \"id\": \"bd7158d8c442eedfaeb5bd1c\",\n          \"title\": \"Build a Tic Tac Toe Game\"\n        },\n        {\n          \"id\": \"bd7158d8c442eddfaeb5bd1c\",\n          \"title\": \"Build a Simon Game\"\n        }\n      ],\n      \"type\": \"Waypoint\",\n      \"challengeType\": 7\n    }\n  ]\n}"
  },
  {
    "path": "seed/challenges/01-front-end-development-certification/gear-up-for-success.json",
    "content": "{\n  \"name\": \"Gear up for Success\",\n  \"order\": 4,\n  \"time\": \"20 minutes\",\n  \"challenges\": [\n    {\n      \"id\": \"570add8ccb82ac38a17513c3\",\n      \"title\": \"Join our LinkedIn Alumni Network\",\n      \"description\": [\n        [\n          \"//i.imgur.com/vJyiXzU.gif\",\n          \"A gif showing how you can click the link below and fill in the necessary fields to add your Free Code Camp studies to your LinkedIn profile.\",\n          \"在LinkedIn中，FreeCodeCamp是一所被认可的大学。你可以通过在LinkedIn的教育背景一栏中添加FreeCodeCamp来加入我们的庞大的校友网络。详细设置步骤如下：设置你的毕业时间为明年。在\\\"获颁学位\\\"一栏填入 \\\"Full Stack Web Development Certification\\\"。在\\\"学习专业\\\"一栏填入 \\\"Computer Software Engineering\\\"。然后点击\\\"保存\\\"按钮。\",\n          \"https://www.linkedin.com/profile/edit-education?school=Free+Code+Camp\"\n        ]\n      ],\n      \"challengeSeed\": [],\n      \"tests\": [],\n      \"type\": \"Waypoint\",\n      \"challengeType\": 7\n    },\n    {\n      \"id\": \"560adc65cb82ac38a17513c2\",\n      \"title\": \"Join our Subreddit\",\n      \"description\": [\n        [\n          \"//i.imgur.com/DYjJuCG.gif\",\n          \"A gif showing how you can create a Reddit account and join Free Code Camp's subreddit.\",\n          \"我们在Reddit上有专用子频道。在这里可以很方便地与我们整个社区分享链接和提问。如果你还没有Reddit账户，你可以在几秒内创建一个（邮箱都不需要填）。然后你需要点击\\\"订阅\\\"按钮来订阅我们的子频道。你还可以从我们的侧边栏里订阅其他你感兴趣的频道。\",\n          \"https://reddit.com/r/freecodecamp\"\n        ]\n      ],\n      \"releasedOn\": \"February 10, 2016\",\n      \"challengeSeed\": [],\n      \"tests\": [],\n      \"type\": \"Waypoint\",\n      \"challengeType\": 7\n    },\n    {\n      \"id\": \"560adf65cb82ac38a17513c2\",\n      \"title\": \"Read Coding News on our Medium Publication\",\n      \"description\": [\n        [\n          \"//i.imgur.com/FxSOL4a.gif\",\n          \"A gif showing how you can create a Medium account.\",\n          \"我们写了很多关于软件开发的文章发布在Medium上。如果你还没有Medium账户，你可以点击下面的链接然后使用第三方登录或者是用邮箱注册一个（你将会收到一封验证邮件，点击其中的链接即可完成创建）。当你选择完感兴趣的话题，你就可以点击下一步了。\",\n          \"https://www.medium.com\"\n        ],\n        [\n          \"//i.imgur.com/zhhywSX.gif\",\n          \"A gif showing how you can click the \\\"follow\\\" button to follow Free Code Camp's publication.\",\n          \"当你登录后，你可以进入Free Code Camp的Medium频道，点击\\\"关注\\\"。团员们每周会发布几篇文章。\",\n          \"https://medium.freecodecamp.com\"\n        ]\n      ],\n      \"releasedOn\": \"February 10, 2016\",\n      \"challengeSeed\": [],\n      \"tests\": [],\n      \"type\": \"Waypoint\",\n      \"challengeType\": 7\n    },\n    {\n      \"id\": \"560ade65cb82ac38a17513c2\",\n      \"title\": \"Watch us Code Live on Twitch.tv\",\n      \"description\": [\n        [\n          \"//i.imgur.com/8rtyRY1.gif\",\n          \"A gif showing how you can sign up for Twitch.tv and follow our channel.\",\n          \"团员们会经常在Twitch.tv直播写代码. 你可以在一分钟内创建一个Twitch帐户，然后关注Free Code Camp频道。 当你关注后，每次团员进行直播的时候你都会收到一封通知邮件。在与其他团员一起观看代码直播的时候还可以在直播间进行互动。通过观看团员们直播搭建项目来学习编程相当的有趣直观。\",\n          \"https://twitch.tv/freecodecamp\"\n        ]\n      ],\n      \"releasedOn\": \"February 10, 2016\",\n      \"challengeSeed\": [],\n      \"tests\": [],\n      \"type\": \"Waypoint\",\n      \"challengeType\": 7\n    },\n    {\n      \"id\": \"560add8ccb81ac38a17513c4\",\n      \"title\": \"Commit to a Goal and a Nonprofit\",\n      \"description\": [\n        [\n          \"//i.imgur.com/Og1ifsn.gif\",\n          \"A gif showing how you can commit to a goal for your Free Code Camp studies and pledge a monthly donation to a nonprofit to give you external motivation to reach that goal.\",\n          \"你可以为自己设定目标并承诺在完成设定的目标前每个月向非盈利组织捐款来敦促自己学习编程，同时也可以切实的帮助到非盈利组织。设定你的目标，然后选择月度捐献额度。当你点击\\\"提交\\\"，向非盈利性组织捐款的页面将会在新标签页打开。需要注意的是，这完全是自愿的，你也可以在任何时刻取消或是停止捐款。\",\n          \"/commit\"\n        ]\n      ],\n      \"challengeSeed\": [],\n      \"tests\": [],\n      \"type\": \"Waypoint\",\n      \"challengeType\": 7\n    }\n  ]\n}\n"
  },
  {
    "path": "seed/challenges/01-front-end-development-certification/html5-and-css.json",
    "content": "{\n  \"name\": \"HTML5 and CSS\",\n  \"order\": 2,\n  \"time\": \"5 hours\",\n  \"helpRoom\": \"chinese\",\n  \"challenges\": [\n    {\n      \"id\": \"bd7123c8c441eddfaeb5bdef\",\n      \"title\": \"Say Hello to HTML Element\",\n      \"description\": [\n        \"欢迎来到FreeCodeCamp的第一个编码挑战！\",\n        \"整个课程的设计围绕两个原则：所见即所得、循序渐进。\",\n        \"界面简洁直观，左边是课程区、中间是编辑区、右边是显示区。\",\n        \"HTML是英文Hyper Text Markup Language(超文本标记语言)的缩写。\",\n        \"你看到<code>&#60;h1&#62;Hello&#60;/h1&#62;</code>了吗? \",\n        \"<code>h1</code>就是一个HTML<code>元素</code>，<code>h1</code>是<code>header1</code>的简写，意思是一级标题。\",\n        \"大部分元素都有一个<code>开始标记</code>和一个<code>结束标记</code>。\",\n        \"开始标记像这样：<code>&#60;h1&#62;</code>\",\n        \"结束标记像这样：<code>&#60;/h1&#62;</code>\",\n        \"开始标记和结束标记的唯一区别就是结束标记多了一个<code>/</code>。\",\n        \"每个挑战都有测试，当你写完代码后可以点击<code>Run tests</code>，如果代码通过测试，你将获得学习积分。\",\n        \"如果你点击<code>Run tests</code>后没反应，说明测试没通过，用鼠标拖动课程区的滚动条到最下面，可以看到你没有通过测试的详细原因。\",\n        \"任务：请更改<code>h1</code>标签中的Hello为Hello World，然后点击<code>Run tests</code>。\"\n      ],\n      \"challengeSeed\": [\n        \"<h1>Hello</h1>\"\n      ],\n      \"tests\": [\n        \"assert.isTrue((/hello(\\\\s)+world/gi).test($('h1').text()), 'message: 你的 <code>h1</code> 元素应该包含文本 \\\"Hello World\\\".');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 0\n    },\n    {\n      \"id\": \"bad87fee1348bd9aedf0887a\",\n      \"title\": \"Headline with the h2 Element\",\n      \"description\": [\n        \"接下来我们会设计一个类似于下图的页面：\",\n        \"<a href=\\\"/images/myCatPhoto.png\\\" data-lightbox=\\\"img-enlarge\\\"><img class=\\\"img-responsive\\\" src=\\\"/images/myCatPhoto.png\\\" title=\\\"Click to enlarge\\\" alt=\\\"A screen shot of our finished Cat Photo App\\\"></a>\",\n        \"h是英文<code>header</code>标题的缩写，标题无处不在，它的应用范围十分广泛：网站结构、写作文、PPT等。h1是主标题，h2是副标题，h3、h4、h5、h6依次递减字体的大小。\",\n        \"在主标题下面创建一个副标题，标题内容是：CatPhotoApp。\"\n      ],\n      \"challengeSeed\": [\n        \"<h1>Hello World</h1>\"\n      ],\n      \"tests\": [\n        \"assert(($(\\\"h2\\\").length > 0), 'message: 创建一个主标题');\",\n        \"assert(code.match(/<\\\\/h2>/g) && code.match(/<\\\\/h2>/g).length === code.match(/<h2>/g).length, 'message: 确保副标题有一个结束标记');\",\n        \"assert.isTrue((/cat(\\\\s)?photo(\\\\s)?app/gi).test($(\\\"h2\\\").text()), 'message: 副标题应该包含文本 \\\"CatPhotoApp\\\"');\",\n        \"assert.isTrue((/hello(\\\\s)+world/gi).test($(\\\"h1\\\").text()), 'message: 主标题应该包含文本 \\\"Hello World\\\"');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 0\n    },\n    {\n      \"id\": \"bad87fee1348bd9aedf08801\",\n      \"title\": \"Inform with the Paragraph Element\",\n      \"description\": [\n        \"p是英文<code>paragraph</code>段落的缩写，经常被用来创建一个段落，就和你写作文一样。\",\n        \"任务：在副标题下面新增一个段落，段落内容是：<code>Hello Paragraph</code>。\"\n      ],\n      \"challengeSeed\": [\n        \"<h1>Hello World</h1>\",\n        \"<h2>我家的猫咪</h2>\"\n      ],\n      \"tests\": [\n        \"assert(($(\\\"p\\\").length > 0), 'message: 创建一个段落');\",\n        \"assert.isTrue((/hello(\\\\s)+paragraph/gi).test($(\\\"p\\\").text()), 'message: 段落的文本为 \\\"Hello Paragraph\\\"');\",\n        \"assert(code.match(/<\\\\/p>/g) && code.match(/<\\\\/p>/g).length === code.match(/<p/g).length, 'message: 确保段落有结束标记');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 0\n    },\n    {\n      \"id\": \"bad87fee1348bd9aedf08802\",\n      \"title\": \"Uncomment HTML\",\n      \"description\": [\n        \"注释有两个功能：\",\n        \"1、想让某一段代码不起作用，但你又不想删除这一段代码。\",\n        \"2、就是给代码添加一些说明，方便团队合作或日后自己查看，但又不想影响代码本身。\",\n        \"我们先学习如何删除注释，再学习如何添加注释。\",\n        \"提示：可以通过删除<code>&#60;!--</code>和<code>--&#62;</code>来删除注释。\",\n        \"任务：试着先把一级标题、二级标题、段落的注释都删除掉。\"\n      ],\n      \"challengeSeed\": [\n        \"<!--\",\n        \"<h1>Hello World</h1>\",\n        \"\",\n        \"<h2>我家的猫咪</h2>\",\n        \"\",\n        \"<p>Hello Paragraph</p>\",\n        \"-->\"\n      ],\n      \"tests\": [\n        \"assert($(\\\"h1\\\").length > 0, 'message: 通过删除注释来让页面上的主标题是可见的.');\",\n        \"assert($(\\\"h2\\\").length > 0, 'message: 通过删除注释来让页面上的副标题是可见的.');\",\n        \"assert($(\\\"p\\\").length > 0, 'message: 通过删除注释来让页面上的段落是可见的.');\",\n        \"assert(!/-->/gi.test(code), 'message: 确定你删除了所有的注释标记; i.e. <code>--&#62;</code>.');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 0\n    },\n    {\n      \"id\": \"bad87fee1348bd9aedf08804\",\n      \"title\": \"Comment out HTML\",\n      \"description\": [\n        \"注释的开始标记是<code>&#60;!--</code>\",\n        \"结束标记是<code>--></code>\",\n        \"任务：把主标题和段落都注释掉，但把副标题留着。\"\n      ],\n      \"challengeSeed\": [\n        \"<!--\",\n        \"<h1>Hello World</h1>\",\n        \"\",\n        \"<h2>我家的猫咪</h2>\",\n        \"\",\n        \"<p>Hello Paragraph</p>\",\n        \"-->\"\n      ],\n      \"tests\": [\n        \"assert(($(\\\"h1\\\").length === 0), 'message: 给主标题添加注释这样你在网页行看不到这个元素.');\",\n        \"assert(($(\\\"h2\\\").length > 0), 'message: 删除副标题的注释可以让你在网页上看到这个元素.');\",\n        \"assert(($(\\\"p\\\").length === 0), 'message: 给段落添加注释这样你在网页上就看不到这个元素.');\",\n        \"assert(code.match(/-->/g).length > 1, 'message: 确保每一个注释都以<code>--&#62;</code>结尾.');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 0\n    },\n    {\n      \"id\": \"bad87fee1348bd9aedf08833\",\n      \"title\": \"Fill in the Blank with Placeholder Text\",\n      \"description\": [\n        \"Web开发者通常用<a href='http://www.ruanyifeng.com/blog/2009/04/lorem_ipsum.html'>lorem ipsum text</a>来做占位符，占位符就是占着位置的一些文字，没有实际意义。\",\n        \"为什么叫<code>lorem ipsum text</code>呢?\",\n        \"是因为<code>lorem ipsum</code>是古罗马西塞罗谚语的前两个单词。\",\n        \"从公元16世纪开始<code>lorem ipsum text</code>就被当做占位符了，这种传统延续到了互联网时代。\",\n        \"于此同时，孙悟空也在五指山下压了500年，然后就进化成程序猿了，是不是很巧合，哈哈。\",\n        \"任务：把段落中的文本替换为：<code>Monkey code 猴哥猴哥，你真了不得，金箍棒在手，问世间谁是英雄。</code>\"\n      ],\n      \"challengeSeed\": [\n        \"<h1>西游记</h1>\",\n        \"\",\n        \"<h2>齐天大圣</h2>\",\n        \"\",\n        \"<h2>孙悟空</h2>\",\n        \"\",\n        \"<p>七十二变</p>\"\n      ],\n      \"tests\": [\n        \"assert.isTrue((/Monkey(\\\\s)+code/gi).test($(\\\"p\\\").text()), 'message: 你的<code>p</code>元素必须包含<code>Monkey code</code>。');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 0\n    },\n    {\n      \"id\": \"bad87fed1348bd9aedf08833\",\n      \"title\": \"Delete HTML Elements\",\n      \"description\": [\n        \"手机的屏幕空间是有限的。\",\n        \"让我们删除不必要的元素，开始设计我们的CatPhotoApp。\",\n        \"任务：删除你的<code>h1</code>元素以简化视图。\"\n      ],\n      \"challengeSeed\": [\n        \"<h1>Hello cat!</h1>\",\n        \"\",\n        \"<h2>我家的猫咪</h2>\",\n        \"\",\n        \"<p>在大家心目中，猫是慵懒的可爱的化身，它可以睡饱了再起来吃饭，可以逗趣小耗子，可以卖得了萌，使得了坏，这样百变的小怪兽就集结在一只宠物上，怎能不惹人怜爱。</p>\"\n      ],\n      \"tests\": [\n        \"assert(($(\\\"h1\\\").length == 0), 'message: 删除你的<code>h1</code>元素。');\",\n        \"assert(($(\\\"h2\\\").length > 0), 'message: 在页面上保留你的<code>h2</code>元素。');\",\n        \"assert(($(\\\"p\\\").length > 0), 'message: 在页面上保留你的<code>p</code>元素。');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 0\n    },\n    {\n      \"id\": \"bad87fee1348bd9aedf08803\",\n      \"title\": \"Change the Color of Text\",\n      \"description\": [\n        \"现在让我们来改变某些文本的颜色。\",\n        \"我们可以通过修改<code>h2</code>元素的<code>style</code>(样式)来达到目的。\",\n        \"样式的属性有很多，其中color用来指定颜色。\",\n        \"以下是将你的<code>h2</code>元素的文本颜色设置为蓝色的示例代码：\",\n        \"<code>&#60;h2 style=\\\"color: blue\\\"&#62;CatPhotoApp&#60;/h2&#62;</code>\",\n        \"任务：修改你的<code>h2</code>元素的style，让文本的颜色变为红色。\"\n      ],\n      \"challengeSeed\": [\n        \"<h2>我家的猫咪</h2>\",\n        \"\",\n        \"<p>在大家心目中，猫是慵懒的可爱的化身，它可以睡饱了再起来吃饭，可以逗趣小耗子，可以卖得了萌，使得了坏，这样百变的小怪兽就集结在一只宠物上，怎能不惹人怜爱。</p>\"\n      ],\n      \"tests\": [\n        \"assert($(\\\"h2\\\").css(\\\"color\\\") === \\\"rgb(255, 0, 0)\\\", 'message: 你的<code>h2</code>元素应该是红色的。');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 0\n    },\n    {\n      \"id\": \"bad87fee1348bd9aedf08805\",\n      \"title\": \"Use CSS Selectors to Style Elements\",\n      \"description\": [\n        \"样式的属性多达几千个，但别担心，按照80-20原则，常用的也就几十个，你完全可以掌握它。\",\n        \"当你键入<code>&#60;h2 style=\\\"color: red\\\"&#62;CatPhotoApp&#60;/h2&#62;</code>，你就给<code>h2</code>元素<code>添加了inline style(内联样式)</code>。\",\n        \"内联样式是为元素添加样式的最简单有效的方式，但是更易于维护的方式是使用层叠样式表<code>CSS</code>（Cascading Style Sheets）。\",\n        \"在代码的最顶端，创建一个如下的<code>style</code>元素：\",\n        \"<blockquote>&#60;style&#62;<br>&#60;/style&#62;</blockquote>\",\n        \"在这个<code>style</code>元素内, 你可以为所有的<code>h2</code>元素创建一个<code>元素选择器</code>。比如，如果你想要将所有的<code>h2</code>元素设置为红色, 你的代码应该看起来像这样：\",\n        \"<blockquote>&#60;style&#62;<br>&nbsp;&nbsp;选择器 {属性名称: 属性值;}<br>&nbsp;&nbsp;h2 {color: red;}<br>&#60;/style&#62;</blockquote>\",\n        \"注意：一定要在属性值的后面加上分号<code>;</code>。\",\n        \"任务：删除你的<code>h2</code>元素的内联样式，然后创建一个<code>style</code>元素。添加必要的CSS，使所有<code>h2</code>元素变为蓝色。\"\n      ],\n      \"challengeSeed\": [\n        \"<h2 style=\\\"color: red\\\">我家的猫咪</h2>\",\n        \"\",\n        \"<p>在大家心目中，猫是慵懒的可爱的化身，它可以睡饱了再起来吃饭，可以逗趣小耗子，可以卖得了萌，使得了坏，这样百变的小怪兽就集结在一只宠物上，怎能不惹人怜爱。</p>\"\n      ],\n      \"tests\": [\n        \"assert(!$(\\\"h2\\\").attr(\\\"style\\\"), 'message: 从你的<code>h2</code>元素中删除样式属性。');\",\n        \"assert($(\\\"style\\\") && $(\\\"style\\\").length > 1, 'message: 创建一个<code>style</code>元素。');\",\n        \"assert($(\\\"h2\\\").css(\\\"color\\\") === \\\"rgb(0, 0, 255)\\\", 'message: 你的<code>h2</code>元素应该是蓝色的。');\",\n        \"assert(code.match(/h2\\\\s*\\\\{\\\\s*color\\\\s*:.*;\\\\s*\\\\}/g), 'message: 确保你对<code>h2</code>的样式声明是正确的，并以分号和右花括号结尾。');\",\n        \"assert(code.match(/<\\\\/style>/g) && code.match(/<\\\\/style>/g).length === (code.match(/<style((\\\\s)*((type|media|scoped|title|disabled)=\\\"[^\\\"]*\\\")?(\\\\s)*)*>/g) || []).length, 'message: 确保所有的<code>style</code>元素是正确的，并且包含结束标记。');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 0\n    },\n    {\n      \"id\": \"bad87fee1348bd9aecf08806\",\n      \"title\": \"Use a CSS Class to Style an Element\",\n      \"description\": [\n        \"上节课我们学习了元素选择器，这节课我们学习类选择器。\",\n        \"<strong>我们先声明一个类选择器：</strong>\",\n        \"<blockquote>&#60;style&#62;<br>&nbsp;&nbsp;.blue-text {<br>&nbsp;&nbsp;&nbsp;&nbsp;color: blue;<br>&nbsp;&nbsp;}<br>&#60;/style&#62;</blockquote>\",\n        \"上面的代码在 <code>&#60;style&#62;</code> 标记中声明了一个叫做 <code>blue-text</code> 的类样式。\",\n        \"<strong>然后在h2元素上应用我们声明的类选择器：</strong>\",\n        \"<code>&#60;h2 class=\\\"blue-text\\\"&#62;CatPhotoApp&#60;/h2&#62;</code>\",\n        \"注意：在CSS中，类选择器应该添加<code>.</code>为前缀。\",\n        \"而在HTML中，class属性不能添加<code>.</code>为前缀。\",\n        \"这是因为在CSS中如果类选择器前不添加<code>.</code> 浏览器就会误认为类选择器是一个元素选择器。\",\n        \"任务：在你的<code>style</code>元素中，修改<code>h2</code>选择器为<code>.red-text</code>选择器，并把颜色值从<code>blue</code>修改为<code>red</code>。\",\n        \"最后在<code>h2</code>元素上应用我们声明的<code>.red-text</code>选择器。\"\n      ],\n      \"challengeSeed\": [\n        \"<style>\",\n        \"  h2 {\",\n        \"    color: blue;\",\n        \"  }\",\n        \"</style>\",\n        \"\",\n        \"<h2>我家的猫咪</h2>\",\n        \"\",\n        \"<p>在大家心目中，猫是慵懒的可爱的化身，它可以睡饱了再起来吃饭，可以逗趣小耗子，可以卖得了萌，使得了坏，这样百变的小怪兽就集结在一只宠物上，怎能不惹人怜爱。</p>\"\n      ],\n      \"tests\": [\n        \"assert($(\\\"h2\\\").css(\\\"color\\\") === \\\"rgb(255, 0, 0)\\\", 'message: 你的<code>h2</code>元素应该为红色。');\",\n        \"assert($(\\\"h2\\\").hasClass(\\\"red-text\\\"), 'message: 你的<code>h2</code>元素的class属性必须为<code>red-text</code>。');\",\n        \"assert(code.match(/\\\\.red-text\\\\s*\\\\{\\\\s*color\\\\s*:\\\\s*red;\\\\s*\\\\}/g), 'message: 你的样式表应该声明一个<code>red-text</code> 类，并设置其color为red。');\",\n        \"assert($(\\\"h2\\\").attr(\\\"style\\\") === undefined, 'message: 不要在你的<code>h2</code>元素中使用形如<code>style=\\\"color&#58; red\\\"</code>的内联（inline）样式声明。');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 0\n    },\n    {\n      \"id\": \"bad87fee1348bd9aefe08806\",\n      \"title\": \"Style Multiple Elements with a CSS Class\",\n      \"description\": [\n        \"你可以在 HTML 元素的开始标记中通过使用<code>class=\\\"your-class-here\\\"</code>来将 class 附加到相关元素中。\",\n        \"CSS 类选择器必须添加<code>.</code>为前缀，如下：\",\n        \"<blockquote>.blue-text {<br>&nbsp;&nbsp;color: blue;<br>}</blockquote>\",\n        \"但在HTML中class属性的值不需要添加<code>.</code>为前缀，如下：\",\n        \"<code>&#60;h2 class=\\\"blue-text\\\"&#62;CatPhotoApp&#60;/h2&#62;</code>\",\n        \"将<code>red-text</code>类应用到<code>h2</code>和<code>p</code>元素中。\"\n      ],\n      \"challengeSeed\": [\n        \"<style>\",\n        \"  .red-text {\",\n        \"    color: red;\",\n        \"  }\",\n        \"</style>\",\n        \"\",\n        \"<h2 class=\\\"red-text\\\">我家的猫咪</h2>\",\n        \"\",\n        \"<p>在大家心目中，猫是慵懒的可爱的化身，它可以睡饱了再起来吃饭，可以逗趣小耗子，可以卖得了萌，使得了坏，这样百变的小怪兽就集结在一只宠物上，怎能不惹人怜爱。</p>\"\n      ],\n      \"tests\": [\n        \"assert($(\\\"h2\\\").css(\\\"color\\\") === \\\"rgb(255, 0, 0)\\\", 'message: 你的<code>h2</code>元素应该为红色。');\",\n        \"assert($(\\\"h2\\\").hasClass(\\\"red-text\\\"), 'message: 你的<code>h2</code>元素应该包含<code>red-text</code> 类。');\",\n        \"assert($(\\\"p\\\").css(\\\"color\\\") === \\\"rgb(255, 0, 0)\\\", 'message: 你的<code>p</code>元素应该为红色。');\",\n        \"assert($(\\\"p\\\").hasClass(\\\"red-text\\\"), 'message: 你的<code>p</code>元素应该包含<code>red-text</code> 类。');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 0\n    },\n    {\n      \"id\": \"bad87fee1348bd9aedf08806\",\n      \"title\": \"Change the Font Size of an Element\",\n      \"description\": [\n        \"字号是由样式属性<code>font-size</code>来控制的, 如下：\",\n        \"<blockquote>h1 {<br>&nbsp;&nbsp;font-size: 30px;<br>}</blockquote>\",\n        \"用下面的文本来创建第二个<code>p</code>元素：<br><code>养动物有的时候，就是介于爱与恨之间，当你钦羡别人萌宠这么可爱的时候，你一定没有想过，狗狗和猫猫会到处拉屎，甚至会屯老鼠，啃鞋子，用爪子爬门，你不理它，它就挠你，你要对它发脾气，它会比你更来劲。所以，狗猫慎入，没有一定的准备，切勿随便去侍养动物。它们一旦认定你了，你就是它们的主人，如果你抛弃它们，它们必定心中重创。</code>\",\n        \"任务：让第一个段落和第二个段落的<code>font-size</code>都为<code>16px</code>。\",\n        \"请不要为第二个段落添加 class 属性。\"\n      ],\n      \"challengeSeed\": [\n        \"<style>\",\n        \"  .red-text {\",\n        \"    color: red;\",\n        \"  }\",\n        \"</style>\",\n        \"\",\n        \"<h2 class=\\\"red-text\\\">我家的猫咪</h2>\",\n        \"\",\n        \"<p class=\\\"red-text\\\">在大家心目中，猫是慵懒的可爱的化身，它可以睡饱了再起来吃饭，可以逗趣小耗子，可以卖得了萌，使得了坏，这样百变的小怪兽就集结在一只宠物上，怎能不惹人怜爱。</p>\"\n      ],\n      \"tests\": [\n        \"assert($(\\\"p\\\").length > 1, 'message: 你需要有2个<code>p</code>元素。');\",\n        \"assert(code.match(/<\\\\/p>/g) && code.match(/<\\\\/p>/g).length === code.match(/<p/g).length, 'message: 确保所有段落都包含结束标记。');\",\n        \"assert.isTrue((/养动物/gi).test($(\\\"p\\\").text()), 'message: 你的<code>p</code>元素应该包含文本<code>养动物</code>。');\",\n        \"assert($(\\\"p:not([class])\\\").length === 1, 'message: 不要为第二个段落添加 class 属性，也不要删除第一个段落的 class 属性。');\",\n        \"assert(parseInt($(\\\"p:not([class])\\\").css(\\\"font-size\\\"), 10) > 15, 'message: 将段落的<code>font-size</code>设置为<code>16px</code>。');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 0\n    },\n    {\n      \"id\": \"bad87fee1348bd9aede08807\",\n      \"title\": \"Set the Font Family of an Element\",\n      \"description\": [\n        \"用<code>font-family</code>属性来设置元素的字体。\",\n        \"如果你想把副标题的字体设置为<code>Sans-serif</code>，你可以使用下面的CSS：\",\n        \"<blockquote>h2 {<br>&nbsp;&nbsp;font-family: Sans-serif;<br>}</blockquote>\",\n        \"任务：让所有的<code>p</code>元素都使用<code>Monospace</code>字体。\"\n      ],\n      \"challengeSeed\": [\n        \"<style>\",\n        \"  .red-text {\",\n        \"    color: red;\",\n        \"  }\",\n        \"\",\n        \"  p {\",\n        \"    font-size: 16px;\",\n        \"  }\",\n        \"</style>\",\n        \"\",\n        \"<h2 class=\\\"red-text\\\">CatPhotoApp</h2>\",\n        \"\",\n        \"<p class=\\\"red-text\\\">在大家心目中，猫是慵懒的可爱的化身，它可以睡饱了再起来吃饭，可以逗趣小耗子，可以卖得了萌，使得了坏，这样百变的小怪兽就集结在一只宠物上，怎能不惹人怜爱。</p>\",\n        \"<p>养动物有的时候，就是介于爱与恨之间，当你钦羡别人萌宠这么可爱的时候，你一定没有想过，狗狗和猫猫会到处拉屎，甚至会屯老鼠，啃鞋子，用爪子爬门，你不理它，它就挠你，你要对它发脾气，它会比你更来劲。所以，狗猫慎入，没有一定的准备，切勿随便去侍养动物。它们一旦认定你了，你就是它们的主人，如果你抛弃它们，它们必定心中重创。</p>\"\n      ],\n      \"tests\": [\n        \"assert($(\\\"p\\\").not(\\\".red-text\\\").css(\\\"font-family\\\").match(/monospace/i), 'message: 你的段落应该使用字体<code>Monospace</code>。');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 0\n    },\n    {\n      \"id\": \"bad87fee1348bd9aedf08807\",\n      \"title\": \"Import a Google Font\",\n      \"description\": [\n        \"现在，让我们来导入谷歌字体。\",\n        \"首先，你需要用<code>link</code>标签来引入谷歌<code>Lobster</code>字体。\",\n        \"复制下面的代码片断并将其粘贴到你的代码编辑器的顶部：\",\n        \"<code>&#60;link href=\\\"https://fonts.gdgdocs.org/css?family=Lobster\\\" rel=\\\"stylesheet\\\" type=\\\"text/css\\\"&#62;</code>\",\n        \"现在你可以将<code>Lobster</code>作为 font-family属性 的值应用到你的<code>h2</code>元素上了。\",\n        \"为你的<code>h2</code>元素应用<code>font-family</code>属性，值为<code>Lobster</code>。\",\n        \"当你遇到困难时可以参考<code><a href='https://github.com/freecodecampchina/freecodecamp.cn/wiki/common-question' target='_blank'>wiki</a></code>\"\n      ],\n      \"challengeSeed\": [\n        \"<style>\",\n        \"  .red-text {\",\n        \"    color: red;\",\n        \"  }\",\n        \"\",\n        \"  p {\",\n        \"    font-size: 16px;\",\n        \"    font-family: Monospace;\",\n        \"  }\",\n        \"</style>\",\n        \"\",\n        \"<h2 class=\\\"red-text\\\">CatPhotoApp</h2>\",\n        \"\",\n        \"<p class=\\\"red-text\\\">在大家心目中，猫是慵懒的可爱的化身，它可以睡饱了再起来吃饭，可以逗趣小耗子，可以卖得了萌，使得了坏，这样百变的小怪兽就集结在一只宠物上，怎能不惹人怜爱。</p>\",\n        \"<p class=\\\"red-text\\\">养动物有的时候，就是介于爱与恨之间，当你钦羡别人萌宠这么可爱的时候，你一定没有想过，狗狗和猫猫会到处拉屎，甚至会屯老鼠，啃鞋子，用爪子爬门，你不理它，它就挠你，你要对它发脾气，它会比你更来劲。所以，狗猫慎入，没有一定的准备，切勿随便去侍养动物。它们一旦认定你了，你就是它们的主人，如果你抛弃它们，它们必定心中重创。</p>\"\n      ],\n      \"tests\": [\n        \"assert(new RegExp(\\\"googleapis|gdgdocs\\\", \\\"gi\\\").test(code), 'message: 导入<code>Lobster</code>字体。');\",\n        \"assert($(\\\"h2\\\").css(\\\"font-family\\\").match(/lobster/i), 'message: 你的副标题应该使用字体<code>Lobster</code>。');\",\n        \"assert($(\\\"p\\\").css(\\\"font-family\\\").match(/monospace/i), 'message: 你的段落仍旧使用字体<code>Monospace</code>。');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 0\n    },\n    {\n      \"id\": \"bad87fee1348bd9aedf08808\",\n      \"title\": \"Specify How Fonts Should Degrade\",\n      \"description\": [\n        \"有几种默认的字体是所有浏览器都可用的，包括<code>Monospace</code>、<code>Serif</code>和<code>Sans-Serif</code>。\",\n        \"当某种字体不可用时，你可以让浏览器<code>自动降级</code>到另一种字体。\",\n        \"例如，如果你想让段落的字体为<code>Helvetica</code>，但你同时想在<code>Helvetica</code>字体不可用时自动降级使用<code>Sans-Serif</code>字体，你可以使用如下CSS样式：\",\n        \"<blockquote>p {<br>&nbsp;&nbsp;font-family: Helvetica, Sans-Serif;<br>}</blockquote>\",\n        \"现在注释掉link标签，以使<code>Lobster</code>字体不可用。请仔细观察浏览器是如何降级到<code>Monospace</code>字体的。\"\n      ],\n      \"challengeSeed\": [\n        \"<link href=\\\"https://fonts.gdgdocs.org/css?family=Lobster\\\" rel=\\\"stylesheet\\\" type=\\\"text/css\\\">\",\n        \"<style>\",\n        \"  .red-text {\",\n        \"    color: red;\",\n        \"  }\",\n        \"\",\n        \"  h2 {\",\n        \"    font-family: Lobster, Monospace;\",\n        \"  }\",\n        \"\",\n        \"  p {\",\n        \"    font-size: 16px;\",\n        \"    font-family: Monospace;\",\n        \"  }\",\n        \"</style>\",\n        \"\",\n        \"<h2 class=\\\"red-text\\\">CatPhotoApp</h2>\",\n        \"\",\n        \"<p class=\\\"red-text\\\">在大家心目中，猫是慵懒的可爱的化身，它可以睡饱了再起来吃饭，可以逗趣小耗子，可以卖得了萌，使得了坏，这样百变的小怪兽就集结在一只宠物上，怎能不惹人怜爱。</p>\",\n        \"<p class=\\\"red-text\\\">养动物有的时候，就是介于爱与恨之间，当你钦羡别人萌宠这么可爱的时候，你一定没有想过，狗狗和猫猫会到处拉屎，甚至会屯老鼠，啃鞋子，用爪子爬门，你不理它，它就挠你，你要对它发脾气，它会比你更来劲。所以，狗猫慎入，没有一定的准备，切勿随便去侍养动物。它们一旦认定你了，你就是它们的主人，如果你抛弃它们，它们必定心中重创。</p>\"\n      ],\n      \"tests\": [\n        \"assert($(\\\"h2\\\").css(\\\"font-family\\\").match(/^\\\"?lobster/i), 'message: 你的副标题应该使用<code>Lobster</code>字体。');\",\n        \"assert($(\\\"h2\\\").css(\\\"font-family\\\").match(/lobster.*,.*monospace/i), 'message: 当<code>Lobster</code>字体不可用时副标题应该降级到<code>Monospace</code>字体。');\",\n        \"assert(new RegExp(\\\"<!--\\\", \\\"gi\\\").test(code), 'message: 通过把<code>&#60!--</code>放在开头可以把<code>link</code>标签注释掉。');\",\n        \"assert(new RegExp(\\\"-->\\\", \\\"gi\\\").test(code), 'message: 别忘了通过添加<code>--&#62;</code>来结束你的注释。');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 0\n    },\n    {\n      \"id\": \"bad87fee1348bd9aedf08812\",\n      \"title\": \"Add Images to your Website\",\n      \"description\": [\n        \"使用<code>img</code>元素来为你的网站添加图片，使用<code>src</code>属性指向一个图片的具体地址。\",\n        \"举例如下：\",\n        \"<code>&#60img src=\\\"https://www.your-image-source.com/your-image.jpg\\\"&#62</code>\",\n        \"注意：<code>img</code>元素是自关闭元素，不需要结束标记。\",\n        \"用以下图片来测试：\",\n        \"<code>/images/relaxing-cat.jpg</code>\"\n      ],\n      \"challengeSeed\": [\n        \"<link href=\\\"https://fonts.gdgdocs.org/css?family=Lobster\\\" rel=\\\"stylesheet\\\" type=\\\"text/css\\\">\",\n        \"<style>\",\n        \"  .red-text {\",\n        \"    color: red;\",\n        \"  }\",\n        \"\",\n        \"  h2 {\",\n        \"    font-family: Lobster, Monospace;\",\n        \"  }\",\n        \"\",\n        \"  p {\",\n        \"    font-size: 16px;\",\n        \"    font-family: Monospace;\",\n        \"  }\",\n        \"</style>\",\n        \"\",\n        \"<h2 class=\\\"red-text\\\">我家的猫咪</h2>\",\n        \"\",\n        \"<p class=\\\"red-text\\\">猫咪猫咪我就喜欢你</p>\",\n        \"<p class=\\\"red-text\\\">深深地爱上你</p>\",\n        \"<p class=\\\"red-text\\\">没有理由没有原因</p>\",\n        \"<p class=\\\"red-text\\\">从见到你的那一天起</p>\",\n        \"<p class=\\\"red-text\\\">你知道我在等你吗?</p>\",\n        \"<p class=\\\"red-text\\\">你如果真的在乎我</p>\",\n        \"<p class=\\\"red-text\\\">又怎会让无尽的夜陪我度过</p>\",\n        \"<p class=\\\"red-text\\\">猫咪猫咪我就喜欢你</p>\",\n        \"<p class=\\\"red-text\\\">深深地爱上你</p>\",\n        \"<p class=\\\"red-text\\\">在黑夜里倾听你的声音</p>\"\n      ],\n      \"tests\": [\n        \"assert($(\\\"img\\\").length > 0, 'message: 你的页面应该包含一个图片元素。');\",\n        \"assert(new RegExp(\\\"\\\\/images\\\\/relaxing-cat.jpg\\\", \\\"gi\\\").test($(\\\"img\\\").attr(\\\"src\\\")), 'message: 你的图片应该包含一个指向猫咪图片的<code>src</code>属性。');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 0\n    },\n    {\n      \"id\": \"bad87fee1348bd9acdf08812\",\n      \"title\": \"Size your Images\",\n      \"description\": [\n        \"CSS包含一个控制元素宽度的<code>width</code>属性。像控制字体一样，我们使用<code>px</code>（像素）来指定图片的宽度。\",\n        \"例如，如果我们想要创建一个名为<code>larger-image</code>的类选择器，把HTML元素的宽度设定为500像素，我们使用：\",\n        \"<blockquote>&#60;style&#62;<br>&nbsp;&nbsp;.larger-image {<br>&nbsp;&nbsp;&nbsp;&nbsp;width: 500px;<br>&nbsp;&nbsp;}<br>&#60;/style&#62;</blockquote>\",\n        \"任务：创建一个名为<code>smaller-image</code>的类选择器，然后用它来改变图片尺寸，使图片仅有100像素宽。\"\n      ],\n      \"challengeSeed\": [\n        \"<link href=\\\"https://fonts.gdgdocs.org/css?family=Lobster\\\" rel=\\\"stylesheet\\\" type=\\\"text/css\\\">\",\n        \"<style>\",\n        \"  .red-text {\",\n        \"    color: red;\",\n        \"  }\",\n        \"\",\n        \"  h2 {\",\n        \"    font-family: Lobster, Monospace;\",\n        \"  }\",\n        \"\",\n        \"  p {\",\n        \"    font-size: 16px;\",\n        \"    font-family: Monospace;\",\n        \"  }\",\n        \"</style>\",\n        \"\",\n        \"<h2 class=\\\"red-text\\\">CatPhotoApp</h2>\",\n        \"\",\n        \"<img src=\\\"/images/relaxing-cat.jpg\\\">\",\n        \"\",\n        \"<p class=\\\"red-text\\\">在大家心目中，猫是慵懒的可爱的化身，它可以睡饱了再起来吃饭，可以逗趣小耗子，可以卖得了萌，使得了坏，这样百变的小怪兽就集结在一只宠物上，怎能不惹人怜爱。</p>\",\n        \"<p class=\\\"red-text\\\">养动物有的时候，就是介于爱与恨之间，当你钦羡别人萌宠这么可爱的时候，你一定没有想过，狗狗和猫猫会到处拉屎，甚至会屯老鼠，啃鞋子，用爪子爬门，你不理它，它就挠你，你要对它发脾气，它会比你更来劲。所以，狗猫慎入，没有一定的准备，切勿随便去侍养动物。它们一旦认定你了，你就是它们的主人，如果你抛弃它们，它们必定心中重创。</p>\"\n      ],\n      \"tests\": [\n        \"assert($(\\\"img\\\").hasClass(\\\"smaller-image\\\"), 'message: 你的<code>img</code>元素应该包含<code>smaller-image</code> class。');\",\n        \"assert($(\\\"img\\\").width() === 100, 'message: 你的图片应该为100像素宽。');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 0\n    },\n    {\n      \"id\": \"bad87fee1348bd9bedf08813\",\n      \"title\": \"Add Borders Around your Elements\",\n      \"description\": [\n        \"CSS 边框的属性有style(样式)、color(颜色)、width(宽度)、height(高度)等。\",\n        \"举个例子，如果我们想要让一个HTML元素的边框颜色为红色、边框宽度为5像素(px)、边框样式为固体(solid)，代码如下:\",\n        \"<blockquote>&#60;style&#62;<br>&nbsp;&nbsp;.thin-red-border {<br>&nbsp;&nbsp;&nbsp;&nbsp;border-color: red;<br>&nbsp;&nbsp;&nbsp;&nbsp;border-width: 5px;<br>&nbsp;&nbsp;&nbsp;&nbsp;border-style: solid;<br>&nbsp;&nbsp;}<br>&#60;/style&#62;</blockquote>\",\n        \"任务：创建一个叫thick-green-border的class，让它的边框宽度为10像素、边框样式为solid(固体)、边框颜色为绿色(green)，然后把这个class应用到你的猫咪照片上。\",\n        \"提示：你可以应用多个class到一个元素，只需要在多个class之间用空格分开即可。例如：\",\n        \"<code>&lt;img class=\\\"class1 class2\\\"&gt;</code>\"\n      ],\n      \"challengeSeed\": [\n        \"<link href=\\\"https://fonts.gdgdocs.org/css?family=Lobster\\\" rel=\\\"stylesheet\\\" type=\\\"text/css\\\">\",\n        \"<style>\",\n        \"  .red-text {\",\n        \"    color: red;\",\n        \"  }\",\n        \"\",\n        \"  h2 {\",\n        \"    font-family: Lobster, Monospace;\",\n        \"  }\",\n        \"\",\n        \"  p {\",\n        \"    font-size: 16px;\",\n        \"    font-family: Monospace;\",\n        \"  }\",\n        \"\",\n        \"  .smaller-image {\",\n        \"    width: 100px;\",\n        \"  }\",\n        \"</style>\",\n        \"\",\n        \"<h2 class=\\\"red-text\\\">CatPhotoApp</h2>\",\n        \"\",\n        \"<img class=\\\"smaller-image\\\" src=\\\"/images/relaxing-cat.jpg\\\">\",\n        \"\",\n        \"<p class=\\\"red-text\\\">在大家心目中，猫是慵懒的可爱的化身，它可以睡饱了再起来吃饭，可以逗趣小耗子，可以卖得了萌，使得了坏，这样百变的小怪兽就集结在一只宠物上，怎能不惹人怜爱。</p>\",\n        \"<p class=\\\"red-text\\\">养动物有的时候，就是介于爱与恨之间，当你钦羡别人萌宠这么可爱的时候，你一定没有想过，狗狗和猫猫会到处拉屎，甚至会屯老鼠，啃鞋子，用爪子爬门，你不理它，它就挠你，你要对它发脾气，它会比你更来劲。所以，狗猫慎入，没有一定的准备，切勿随便去侍养动物。它们一旦认定你了，你就是它们的主人，如果你抛弃它们，它们必定心中重创。</p>\"\n      ],\n      \"tests\": [\n        \"assert($(\\\"img\\\").hasClass(\\\"smaller-image\\\"), 'message: 你的 <code>img</code> 元素应该有 class <code>smaller-image</code>.');\",\n        \"assert($(\\\"img\\\").hasClass(\\\"thick-green-border\\\"), 'message: 你的 <code>img</code> 元素应该有 class <code>thick-green-border</code>.');\",\n        \"assert($(\\\"img\\\").hasClass(\\\"thick-green-border\\\") && parseInt($(\\\"img\\\").css(\\\"border-top-width\\\"), 10) >= 8 && parseInt($(\\\"img\\\").css(\\\"border-top-width\\\"), 10) <= 12, 'message: 指定图片的边框宽度为 <code>10px</code>.');\",\n        \"assert($(\\\"img\\\").css(\\\"border-right-style\\\") === \\\"solid\\\", 'message: 指定图标的边框样式为 <code>solid</code>.');\",\n        \"assert($(\\\"img\\\").css(\\\"border-left-color\\\") === \\\"rgb(0, 128, 0)\\\", 'message: 这个围绕着 <code>img</code> 元素的边框颜色应该是绿色.');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 0\n    },\n    {\n      \"id\": \"bad87fee1348bd9aedf08814\",\n      \"title\": \"Add Rounded Corners with a Border Radius\",\n      \"description\": [\n        \"猫咪图片的边框现在是尖尖的，不够可爱，我们可以通过CSS的一个叫border-radius(边框半径)的属性来让它的边框变成圆的。\",\n        \"你同样可以使用像素来指定border-radius的属性值，现在让你的猫咪图片的边框半径为10px吧。\",\n        \"注意：这个任务有多种解决方案。你可以添加border-radius到<code>.thick-green-border</code>类选择器，也可以添加到<code>.smaller-image</code>类选择器.\"\n      ],\n      \"challengeSeed\": [\n        \"<link href=\\\"https://fonts.gdgdocs.org/css?family=Lobster\\\" rel=\\\"stylesheet\\\" type=\\\"text/css\\\">\",\n        \"<style>\",\n        \"  .red-text {\",\n        \"    color: red;\",\n        \"  }\",\n        \"\",\n        \"  h2 {\",\n        \"    font-family: Lobster, Monospace;\",\n        \"  }\",\n        \"\",\n        \"  p {\",\n        \"    font-size: 16px;\",\n        \"    font-family: Monospace;\",\n        \"  }\",\n        \"\",\n        \"  .thick-green-border {\",\n        \"    border-color: green;\",\n        \"    border-width: 10px;\",\n        \"    border-style: solid;\",\n        \"  }\",\n        \"\",\n        \"  .smaller-image {\",\n        \"    width: 100px;\",\n        \"  }\",\n        \"</style>\",\n        \"\",\n        \"<h2 class=\\\"red-text\\\">我家的猫咪</h2>\",\n        \"\",\n        \"<img class=\\\"smaller-image thick-green-border\\\" src=\\\"/images/relaxing-cat.jpg\\\">\",\n        \"\",\n        \"<p class=\\\"red-text\\\">我家两岁的小公猫哈哈是个收藏家，臭鱼烂虾，鸡头猪手，无所不爱。清晨我还在睡梦中，突然觉得胸口一沉，恍惚中意识到哈哈又跑到我身上来撒娇，心里不由得滚起温暖的热流，拉过哈哈一把从头摸过背，小家伙顺势想往被子里钻，我一边拒绝着一边往上拉被子，突然脚下一凉，烂泥一样挂在我的大脚趾上的是一块垃圾箱里的鱼头！我顿时睡意全无，换床单洗被罩，天光放亮才勉强收拾妥当。害得我带着熊猫眼跑去上班，一天都没有好心情。实在搞不懂它为什么爱把垃圾叼上床，是故意恶作剧？还是我给的猫粮不够吃？</p>\",\n        \"<p class=\\\"red-text\\\">有时候猫会把主人当成自己的孩子(听起来有点令人窝心)，这种行为是在给家里带来猎物。它把自己看成是家里的顶梁柱，有责任给不争气的主人找来食物——猫咪通过长时间对你的观察，沉痛地发现你不会打猎。经常出门的猫咪会把它逮到的老鼠、小鸟带回家里，不出门的就经常翻翻垃圾箱找点东西给你。这个时候，主人可不要责骂它，不然它会认为你对它带回来的食物不满意，下次去找更了不起的东西带回来，放在房间里最显眼的地方。但如果你看见它往家里运输死老鼠，最好也别谢它，别让它觉得你对这种猎物很满意，下次照单带回来。最好的办法是心里感念着猫咪所为你做的，并默默地收拾好一切。</p>\"\n      ],\n      \"tests\": [\n        \"assert($(\\\"img\\\").hasClass(\\\"thick-green-border\\\"), 'message: 你的图片元素应该有 class \\\"thick-green-border\\\".');\",\n        \"assert(parseInt($(\\\"img\\\").css(\\\"border-top-left-radius\\\")) > 8, 'message: 你的图片的边框半径应该为 <code>10px</code>');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 0\n    },\n    {\n      \"id\": \"bad87fee1348bd9aedf08815\",\n      \"title\": \"Make Circular Images with a Border Radius\",\n      \"description\": [\n        \"除了像素，你还可以使用百分比来指定<code>border-radius</code>边框半径的值。\",\n        \"给你的猫咪图片一个<code>50%</code>的<code>border-radius</code>。\"\n      ],\n      \"challengeSeed\": [\n        \"<link href=\\\"https://fonts.gdgdocs.org/css?family=Lobster\\\" rel=\\\"stylesheet\\\" type=\\\"text/css\\\">\",\n        \"<style>\",\n        \"  .red-text {\",\n        \"    color: red;\",\n        \"  }\",\n        \"\",\n        \"  h2 {\",\n        \"    font-family: Lobster, Monospace;\",\n        \"  }\",\n        \"\",\n        \"  p {\",\n        \"    font-size: 16px;\",\n        \"    font-family: Monospace;\",\n        \"  }\",\n        \"\",\n        \"  .thick-green-border {\",\n        \"    border-color: green;\",\n        \"    border-width: 10px;\",\n        \"    border-style: solid;\",\n        \"    border-radius: 10px;\",\n        \"  }\",\n        \"\",\n        \"  .smaller-image {\",\n        \"    width: 100px;\",\n        \"  }\",\n        \"</style>\",\n        \"\",\n        \"<h2 class=\\\"red-text\\\">CatPhotoApp</h2>\",\n        \"\",\n        \"<img class=\\\"smaller-image thick-green-border\\\" src=\\\"/images/relaxing-cat.jpg\\\">\",\n        \"\",\n        \"<p class=\\\"red-text\\\">在大家心目中，猫是慵懒的可爱的化身，它可以睡饱了再起来吃饭，可以逗趣小耗子，可以卖得了萌，使得了坏，这样百变的小怪兽就集结在一只宠物上，怎能不惹人怜爱。</p>\",\n        \"<p class=\\\"red-text\\\">养动物有的时候，就是介于爱与恨之间，当你钦羡别人萌宠这么可爱的时候，你一定没有想过，狗狗和猫猫会到处拉屎，甚至会屯老鼠，啃鞋子，用爪子爬门，你不理它，它就挠你，你要对它发脾气，它会比你更来劲。所以，狗猫慎入，没有一定的准备，切勿随便去侍养动物。它们一旦认定你了，你就是它们的主人，如果你抛弃它们，它们必定心中重创。</p>\"\n      ],\n      \"tests\": [\n        \"assert(parseInt($(\\\"img\\\").css(\\\"border-top-left-radius\\\")) > 48, 'message: 你的图片的边框半径应该是<code>50&#37;</code>，这样它就可以形成一个圆形边框。');\",\n        \"assert(code.match(/50%/g), 'message: 确定你使用的是百分比而不是像素值。');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 0\n    },\n    {\n      \"id\": \"bad87fee1348bd9aedf08816\",\n      \"title\": \"Link to External Pages with Anchor Elements\",\n      \"description\": [\n        \"<code>a</code>元素，也叫<code>anchor（锚点）</code>元素，既可以用来链接到外部地址实现页面跳转功能，也可以链接到当前页面的某部分实现内部导航功能。\",\n        \"下面是一张<code>a</code>元素的图示。<code>a</code>元素位于段落元素的中间，这意味着链接会出现在段落的中间。\",\n        \"<a href=\\\"//i.imgur.com/hviuZwe.png\\\" data-lightbox=\\\"img-enlarge\\\"><img class=\\\"img-responsive\\\" title=\\\"Click to enlarge\\\" alt=\\\"a diagram of how anchor tags are composed with the same text as on the following line\\\" src=\\\"//i.imgur.com/hviuZwe.png\\\"></a>\",\n        \"这有一个例子：\",\n        \"<code>&#60;p&#62;Here's a &#60;a href=\\\"http://freecodecamp.cn\\\"&#62; link to FreeCodeCamp中文社区 &#60;/a&#62; for you to follow.&#60;/p&#62;</code>\",\n        \"任务：创建一个链接到<code>http://freecatphotoapp.com</code>的<code>a</code>元素，并用<code>cat photos</code>作为其<code>anchor text（锚点文本）</code>。\"\n      ],\n      \"challengeSeed\": [\n        \"<link href=\\\"https://fonts.gdgdocs.org/css?family=Lobster\\\" rel=\\\"stylesheet\\\" type=\\\"text/css\\\">\",\n        \"<style>\",\n        \"  .red-text {\",\n        \"    color: red;\",\n        \"  }\",\n        \"\",\n        \"  h2 {\",\n        \"    font-family: Lobster, Monospace;\",\n        \"  }\",\n        \"\",\n        \"  p {\",\n        \"    font-size: 16px;\",\n        \"    font-family: Monospace;\",\n        \"  }\",\n        \"\",\n        \"  .thick-green-border {\",\n        \"    border-color: green;\",\n        \"    border-width: 10px;\",\n        \"    border-style: solid;\",\n        \"    border-radius: 50%;\",\n        \"  }\",\n        \"\",\n        \"  .smaller-image {\",\n        \"    width: 100px;\",\n        \"  }\",\n        \"</style>\",\n        \"\",\n        \"<h2 class=\\\"red-text\\\">CatPhotoApp</h2>\",\n        \"\",\n        \"<img class=\\\"smaller-image thick-green-border\\\" src=\\\"/images/relaxing-cat.jpg\\\">\",\n        \"\",\n        \"<p class=\\\"red-text\\\">在大家心目中，猫是慵懒的可爱的化身，它可以睡饱了再起来吃饭，可以逗趣小耗子，可以卖得了萌，使得了坏，这样百变的小怪兽就集结在一只宠物上，怎能不惹人怜爱。</p>\",\n        \"<p class=\\\"red-text\\\">养动物有的时候，就是介于爱与恨之间，当你钦羡别人萌宠这么可爱的时候，你一定没有想过，狗狗和猫猫会到处拉屎，甚至会屯老鼠，啃鞋子，用爪子爬门，你不理它，它就挠你，你要对它发脾气，它会比你更来劲。所以，狗猫慎入，没有一定的准备，切勿随便去侍养动物。它们一旦认定你了，你就是它们的主人，如果你抛弃它们，它们必定心中重创。</p>\"\n      ],\n      \"tests\": [\n        \"assert((/cat photos/gi).test($(\\\"a\\\").text()), 'message: 你的<code>a</code>元素应该使用\\\"cat photos\\\"作为其<code>anchor text（锚点文本）</code>。');\",\n        \"assert(/http:\\\\/\\\\/freecatphotoapp\\\\.com/gi.test($(\\\"a\\\").attr(\\\"href\\\")), 'message: 你需要有一个链接到<code>http&#58;//freecatphotoapp.com</code>的<code>a</code>元素。');\",\n        \"assert(code.match(/<\\\\/a>/g) && code.match(/<\\\\/a>/g).length === code.match(/<a/g).length, 'message: 确保你的<code>a</code>元素有一个结束标记。');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 0\n    },\n    {\n      \"id\": \"bad87fee1348bd9aede08817\",\n      \"title\": \"Nest an Anchor Element within a Paragraph\",\n      \"description\": [\n        \"作为参考，再次看一看<code>a</code>元素的图示：\",\n        \"<a href=\\\"//i.imgur.com/hviuZwe.png\\\" data-lightbox=\\\"img-enlarge\\\"><img class=\\\"img-responsive\\\" title=\\\"Click to enlarge\\\" alt=\\\"a diagram of how anchor tags are composed with the same text as on the following line\\\" src=\\\"//i.imgur.com/hviuZwe.png\\\"></a>\",\n        \"例如：\",\n        \"<code>&#60;p&#62;Here's a &#60;a href=\\\"https://freecodecamp.cn\\\"&#62; link to FreeCodeCamp中文社区&#60;/a&#62; for you to follow.&#60;/p&#62;</code>\",\n        \"<code>Nesting（嵌套）</code>就是把一个元素放在另一个元素里面。\",\n        \"任务：把你的<code>a</code>元素嵌套进一个新的<code>p</code>元素（紧邻已有的<code>h2</code>元素之后），让段落的文本为<code>View more cat photos</code>，但是其中仅<code>cat photos</code>是一个链接，其余的是普通文本。\"\n      ],\n      \"challengeSeed\": [\n        \"<link href=\\\"https://fonts.gdgdocs.org/css?family=Lobster\\\" rel=\\\"stylesheet\\\" type=\\\"text/css\\\">\",\n        \"<style>\",\n        \"  .red-text {\",\n        \"    color: red;\",\n        \"  }\",\n        \"\",\n        \"  h2 {\",\n        \"    font-family: Lobster, Monospace;\",\n        \"  }\",\n        \"\",\n        \"  p {\",\n        \"    font-size: 16px;\",\n        \"    font-family: Monospace;\",\n        \"  }\",\n        \"\",\n        \"  .thick-green-border {\",\n        \"    border-color: green;\",\n        \"    border-width: 10px;\",\n        \"    border-style: solid;\",\n        \"    border-radius: 50%;\",\n        \"  }\",\n        \"\",\n        \"  .smaller-image {\",\n        \"    width: 100px;\",\n        \"  }\",\n        \"</style>\",\n        \"\",\n        \"<h2 class=\\\"red-text\\\">CatPhotoApp</h2>\",\n        \"<!-- 请只修改这条注释以下的代码 -->\",\n        \"\",\n        \"<a href=\\\"http://www.freecatphotoapp.com\\\">cat photos</a>\",\n        \"\",\n        \"<!-- 请只修改这条注释以上的代码 -->\",\n        \"<img class=\\\"smaller-image thick-green-border\\\" src=\\\"/images/relaxing-cat.jpg\\\">\",\n        \"\",\n        \"<p class=\\\"red-text\\\">在大家心目中，猫是慵懒的可爱的化身，它可以睡饱了再起来吃饭，可以逗趣小耗子，可以卖得了萌，使得了坏，这样百变的小怪兽就集结在一只宠物上，怎能不惹人怜爱。</p>\",\n        \"<p class=\\\"red-text\\\">养动物有的时候，就是介于爱与恨之间，当你钦羡别人萌宠这么可爱的时候，你一定没有想过，狗狗和猫猫会到处拉屎，甚至会屯老鼠，啃鞋子，用爪子爬门，你不理它，它就挠你，你要对它发脾气，它会比你更来劲。所以，狗猫慎入，没有一定的准备，切勿随便去侍养动物。它们一旦认定你了，你就是它们的主人，如果你抛弃它们，它们必定心中重创。</p>\"\n      ],\n      \"tests\": [\n        \"assert($(\\\"a[href=\\\\\\\"http://www.freecatphotoapp.com\\\\\\\"]\\\").length > 0, 'message: 你需要有一个链接到\\\"http://www.freecatphotoapp.com\\\"的<code>a</code>元素。');\",\n        \"assert($(\\\"a\\\").text().match(/cat\\\\sphotos/gi), 'message: 你的<code>a</code>元素的锚文本应该为\\\"cat photos\\\"。');\",\n        \"assert($(\\\"p\\\") && $(\\\"p\\\").length > 2, 'message: 创建一个新的包围你的<code>a</code>元素的<code>p</code>元素。');\",\n        \"assert($(\\\"a[href=\\\\\\\"http://www.freecatphotoapp.com\\\\\\\"]\\\").parent().is(\\\"p\\\"), 'message: 你的<code>a</code>元素应该嵌套在你新的<code>p</code>元素中。');\",\n        \"assert($(\\\"a[href=\\\\\\\"http://www.freecatphotoapp.com\\\\\\\"]\\\").parent().text().match(/^\\\\s*View\\\\smore\\\\s/gi), 'message: 你的<code>p</code>元素应该包含文本\\\"View more \\\"，注意more后面有一个空格。');\",\n        \"assert(!$(\\\"a\\\").text().match(/View\\\\smore/gi), 'message: 你的<code>a</code>元素<em>不</em>应该包含文本\\\"View more\\\"。');\",\n        \"assert(code.match(/<\\\\/p>/g) && code.match(/<p/g) && code.match(/<\\\\/p>/g).length === code.match(/<p/g).length, 'message: 确保你的每一个<code>p</code>元素都有一个结束标记。');\",\n        \"assert(code.match(/<\\\\/a>/g) && code.match(/<a/g) && code.match(/<\\\\/a>/g).length === code.match(/<a/g).length, 'message: 确保你的每一个<code>a</code>元素都有一个结束标记。');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 0\n    },\n    {\n      \"id\": \"bad87fee1348bd9aedf08817\",\n      \"title\": \"Make Dead Links using the Hash Symbol\",\n      \"description\": [\n        \"有时你想为你的网站添加一个<code>a</code>元素，但此时你还不知道要将它们链接到哪儿，此时可以使用固定链接。\",\n        \"把你的<code>a</code>元素的<code>href</code>属性的值替换为一个<code>#</code>，别名hash(哈希)符号，将其变为一个固定链接。\"\n      ],\n      \"challengeSeed\": [\n        \"<link href=\\\"https://fonts.gdgdocs.org/css?family=Lobster\\\" rel=\\\"stylesheet\\\" type=\\\"text/css\\\">\",\n        \"<style>\",\n        \"  .red-text {\",\n        \"    color: red;\",\n        \"  }\",\n        \"\",\n        \"  h2 {\",\n        \"    font-family: Lobster, Monospace;\",\n        \"  }\",\n        \"\",\n        \"  p {\",\n        \"    font-size: 16px;\",\n        \"    font-family: Monospace;\",\n        \"  }\",\n        \"\",\n        \"  .thick-green-border {\",\n        \"    border-color: green;\",\n        \"    border-width: 10px;\",\n        \"    border-style: solid;\",\n        \"    border-radius: 50%;\",\n        \"  }\",\n        \"\",\n        \"  .smaller-image {\",\n        \"    width: 100px;\",\n        \"  }\",\n        \"</style>\",\n        \"\",\n        \"<h2 class=\\\"red-text\\\">CatPhotoApp</h2>\",\n        \"\",\n        \"<p>Click here for <a href=\\\"http://www.freecatphotoapp.com\\\">cat photos</a>.</p>\",\n        \"\",\n        \"<img class=\\\"smaller-image thick-green-border\\\" src=\\\"/images/relaxing-cat.jpg\\\">\",\n        \"\",\n        \"<p class=\\\"red-text\\\">在大家心目中，猫是慵懒的可爱的化身，它可以睡饱了再起来吃饭，可以逗趣小耗子，可以卖得了萌，使得了坏，这样百变的小怪兽就集结在一只宠物上，怎能不惹人怜爱。</p>\",\n        \"<p class=\\\"red-text\\\">养动物有的时候，就是介于爱与恨之间，当你钦羡别人萌宠这么可爱的时候，你一定没有想过，狗狗和猫猫会到处拉屎，甚至会屯老鼠，啃鞋子，用爪子爬门，你不理它，它就挠你，你要对它发脾气，它会比你更来劲。所以，狗猫慎入，没有一定的准备，切勿随便去侍养动物。它们一旦认定你了，你就是它们的主人，如果你抛弃它们，它们必定心中重创。</p>\"\n      ],\n      \"tests\": [\n        \"assert($(\\\"a\\\").attr(\\\"href\\\") === \\\"#\\\", 'message: 通过把<code>href</code>属性设置为\\\"#\\\"，你的<code>a</code>元素应该是一个固定链接。 ');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 0\n    },\n    {\n      \"id\": \"bad87fee1348bd9aedf08820\",\n      \"title\": \"Turn an Image into a Link\",\n      \"description\": [\n        \"你可以通过把某元素嵌套进<code>a</code>元素使其变成一个链接。\",\n        \"把你的图片嵌套进<code>a</code>元素。举例如下：\",\n        \"<code>&#60;a href=\\\"#\\\"&#62;&#60;img src=\\\"/images/relaxing-cat.jpg\\\"&#62;&#60;/a&#62;</code>\",\n        \"任务：把你的小猫图片插入到一个新的锚点元素中，并把锚点元素的<code>href</code>属性设置为<code>#</code>。\",\n        \"一旦完成，把你的光标悬停在你的图片上。你的光标此时应该由光标指针变成手形指针。图片现在是一个链接了。\"\n      ],\n      \"challengeSeed\": [\n        \"<link href=\\\"https://fonts.gdgdocs.org/css?family=Lobster\\\" rel=\\\"stylesheet\\\" type=\\\"text/css\\\">\",\n        \"<style>\",\n        \"  .red-text {\",\n        \"    color: red;\",\n        \"  }\",\n        \"\",\n        \"  h2 {\",\n        \"    font-family: Lobster, Monospace;\",\n        \"  }\",\n        \"\",\n        \"  p {\",\n        \"    font-size: 16px;\",\n        \"    font-family: Monospace;\",\n        \"  }\",\n        \"\",\n        \"  .thick-green-border {\",\n        \"    border-color: green;\",\n        \"    border-width: 10px;\",\n        \"    border-style: solid;\",\n        \"    border-radius: 50%;\",\n        \"  }\",\n        \"\",\n        \"  .smaller-image {\",\n        \"    width: 100px;\",\n        \"  }\",\n        \"</style>\",\n        \"\",\n        \"<h2 class=\\\"red-text\\\">CatPhotoApp</h2>\",\n        \"\",\n        \"<p>Click here for <a href=\\\"#\\\">cat photos</a>.</p>\",\n        \"\",\n        \"<img class=\\\"smaller-image thick-green-border\\\" src=\\\"/images/relaxing-cat.jpg\\\">\",\n        \"\",\n        \"<p class=\\\"red-text\\\">在大家心目中，猫是慵懒的可爱的化身，它可以睡饱了再起来吃饭，可以逗趣小耗子，可以卖得了萌，使得了坏，这样百变的小怪兽就集结在一只宠物上，怎能不惹人怜爱。</p>\",\n        \"<p class=\\\"red-text\\\">养动物有的时候，就是介于爱与恨之间，当你钦羡别人萌宠这么可爱的时候，你一定没有想过，狗狗和猫猫会到处拉屎，甚至会屯老鼠，啃鞋子，用爪子爬门，你不理它，它就挠你，你要对它发脾气，它会比你更来劲。所以，狗猫慎入，没有一定的准备，切勿随便去侍养动物。它们一旦认定你了，你就是它们的主人，如果你抛弃它们，它们必定心中重创。</p>\"\n      ],\n      \"tests\": [\n        \"assert($(\\\"a\\\").children(\\\"img.smaller-image\\\").length > 0, 'message: 把现有的<code>img</code>元素嵌套进一个<code>a</code>元素。');\",\n        \"assert(new RegExp(\\\"#\\\").test($(\\\"a\\\").children(\\\"img\\\").parent().attr(\\\"href\\\")), 'message: 你的<code>a</code>元素应该是一个<code>href</code>属性设置为<code>#</code>的死链接。');\",\n        \"assert(code.match(/<\\\\/a>/g) && code.match(/<a/g) && code.match(/<\\\\/a>/g).length === code.match(/<a/g).length, 'message: 确保你的每一个<code>a</code>元素都有结束标记。');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 0\n    },\n    {\n      \"id\": \"bad87fee1348bd9aedf08818\",\n      \"title\": \"Add Alt Text to an Image for Accessibility\",\n      \"description\": [\n        \"<code>alt</code>属性，也被称为<code>alt text</code>, 是当图片无法加载时显示的替代文本。<code>alt</code>属性对于盲人或视觉损伤的用户理解一幅图片中所描绘的内容非常重要，搜索引擎也会搜索<code>alt</code>属性。\",\n        \"简而言之，每一张图片都应该有一个<code>alt</code>属性！\",\n        \"你可以像下面例子中一样为img元素添加一个<code>alt</code>属性：\",\n        \"<code>&#60img src=\\\"www.your-image-source.com/your-image.jpg\\\" alt=\\\"your alt text\\\"&#62</code>\",\n        \"为你的猫咪图片添加一个<code>alt</code>属性，内容为<code>A cute orange cat lying on its back</code>。\"\n      ],\n      \"challengeSeed\": [\n        \"<link href=\\\"https://fonts.gdgdocs.org/css?family=Lobster\\\" rel=\\\"stylesheet\\\" type=\\\"text/css\\\">\",\n        \"<style>\",\n        \"  .red-text {\",\n        \"    color: red;\",\n        \"  }\",\n        \"\",\n        \"  h2 {\",\n        \"    font-family: Lobster, Monospace;\",\n        \"  }\",\n        \"\",\n        \"  p {\",\n        \"    font-size: 16px;\",\n        \"    font-family: Monospace;\",\n        \"  }\",\n        \"\",\n        \"  .thick-green-border {\",\n        \"    border-color: green;\",\n        \"    border-width: 10px;\",\n        \"    border-style: solid;\",\n        \"    border-radius: 50%;\",\n        \"  }\",\n        \"\",\n        \"  .smaller-image {\",\n        \"    width: 100px;\",\n        \"  }\",\n        \"</style>\",\n        \"\",\n        \"<h2 class=\\\"red-text\\\">CatPhotoApp</h2>\",\n        \"\",\n        \"<p>Click here for <a href=\\\"#\\\">cat photos</a>.</p>\",\n        \"\",\n        \"<a href=\\\"#\\\"><img class=\\\"smaller-image thick-green-border\\\" src=\\\"/images/relaxing-cat.jpg\\\"></a>\",\n        \"\",\n        \"<p class=\\\"red-text\\\">在大家心目中，猫是慵懒的可爱的化身，它可以睡饱了再起来吃饭，可以逗趣小耗子，可以卖得了萌，使得了坏，这样百变的小怪兽就集结在一只宠物上，怎能不惹人怜爱。</p>\",\n        \"<p class=\\\"red-text\\\">养动物有的时候，就是介于爱与恨之间，当你钦羡别人萌宠这么可爱的时候，你一定没有想过，狗狗和猫猫会到处拉屎，甚至会屯老鼠，啃鞋子，用爪子爬门，你不理它，它就挠你，你要对它发脾气，它会比你更来劲。所以，狗猫慎入，没有一定的准备，切勿随便去侍养动物。它们一旦认定你了，你就是它们的主人，如果你抛弃它们，它们必定心中重创。</p>\"\n      ],\n      \"tests\": [\n        \"assert($(\\\"img\\\").filter(function(){ return /cat/gi.test(this.alt) }).length > 0, 'message: 你的图片元素应该有一个设置为<code>A cute orange cat lying on its back</code>的<code>alt</code>属性。');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 0\n    },\n    {\n      \"id\": \"bad87fee1348bd9aedf08827\",\n      \"title\": \"Create a Bulleted Unordered List\",\n      \"description\": [\n        \"HTML有一个特殊元素，用于创建<code>unordered lists（无序列表）</code>, 或带项目符号的列表。\",\n        \"无序列表以<code>&#60;ul&#62;</code>元素开始，并包含一个或多个<code>&#60;li&#62;</code>元素。\",\n        \"例如：\",\n        \"<blockquote>&#60;ul&#62;<br>&nbsp;&nbsp;&#60;li&#62;milk&#60;/li&#62;<br>&nbsp;&nbsp;&#60;li&#62;cheese&#60;/li&#62;<br>&#60;/ul&#62;</blockquote>\",\n        \"将会创建一个带项目符号的\\\"milk\\\"和\\\"cheese\\\"列表。\",\n        \"删除最后两个<code>p</code>元素，然后在页面底部创建一个有关猫咪喜欢的三件事情的无序列表。\"\n      ],\n      \"challengeSeed\": [\n        \"<link href=\\\"https://fonts.gdgdocs.org/css?family=Lobster\\\" rel=\\\"stylesheet\\\" type=\\\"text/css\\\">\",\n        \"<style>\",\n        \"  .red-text {\",\n        \"    color: red;\",\n        \"  }\",\n        \"\",\n        \"  h2 {\",\n        \"    font-family: Lobster, Monospace;\",\n        \"  }\",\n        \"\",\n        \"  p {\",\n        \"    font-size: 16px;\",\n        \"    font-family: Monospace;\",\n        \"  }\",\n        \"\",\n        \"  .thick-green-border {\",\n        \"    border-color: green;\",\n        \"    border-width: 10px;\",\n        \"    border-style: solid;\",\n        \"    border-radius: 50%;\",\n        \"  }\",\n        \"\",\n        \"  .smaller-image {\",\n        \"    width: 100px;\",\n        \"  }\",\n        \"</style>\",\n        \"\",\n        \"<h2 class=\\\"red-text\\\">CatPhotoApp</h2>\",\n        \"\",\n        \"<p>Click here for <a href=\\\"#\\\">cat photos</a>.</p>\",\n        \"\",\n        \"<a href=\\\"#\\\"><img class=\\\"smaller-image thick-green-border\\\" alt=\\\"A cute orange cat lying on its back\\\" src=\\\"/images/relaxing-cat.jpg\\\"></a>\",\n        \"\",\n        \"<p class=\\\"red-text\\\">在大家心目中，猫是慵懒的可爱的化身，它可以睡饱了再起来吃饭，可以逗趣小耗子，可以卖得了萌，使得了坏，这样百变的小怪兽就集结在一只宠物上，怎能不惹人怜爱。</p>\",\n        \"<p class=\\\"red-text\\\">养动物有的时候，就是介于爱与恨之间，当你钦羡别人萌宠这么可爱的时候，你一定没有想过，狗狗和猫猫会到处拉屎，甚至会屯老鼠，啃鞋子，用爪子爬门，你不理它，它就挠你，你要对它发脾气，它会比你更来劲。所以，狗猫慎入，没有一定的准备，切勿随便去侍养动物。它们一旦认定你了，你就是它们的主人，如果你抛弃它们，它们必定心中重创。</p>\"\n      ],\n      \"tests\": [\n        \"assert($(\\\"ul\\\").length > 0, 'message: 创建一个<code>ul</code>元素。');\",\n        \"assert($(\\\"ul li\\\").length > 2, 'message: 你应该在你的<code>ul</code>元素中添加三个<code>li</code>元素。');\",\n        \"assert(code.match(/<\\\\/ul>/gi) && code.match(/<ul/gi) && code.match(/<\\\\/ul>/gi).length === code.match(/<ul/gi).length, 'message: 确保你的<code>ul</code>元素有结束标记。');\",\n        \"assert(code.match(/<\\\\/li>/gi) && code.match(/<li[\\\\s>]/gi) && code.match(/<\\\\/li>/gi).length === code.match(/<li[\\\\s>]/gi).length, 'message: 确保你的<code>li</code>元素有结束标记。');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 0\n    },\n    {\n      \"id\": \"bad87fee1348bd9aedf08828\",\n      \"title\": \"Create an Ordered List\",\n      \"description\": [\n        \"HTML有一个特殊元素，用于创建<code>ordered lists（有序列表）</code>, 或数字编号列表。\",\n        \"有序列表以<code>&#60;ol&#62;</code>元素开始，并包含一个或多个<code>&#60;li&#62;</code>元素。\",\n        \"例如：\",\n        \"<blockquote>&#60;ol&#62;<br>&nbsp;&nbsp;&#60;li&#62;Garfield&#60;/li&#62;<br>&nbsp;&nbsp;&#60;li&#62;Sylvester&#60;/li&#62;<br>&#60;/ol&#62;</blockquote>\",\n        \"将创建一个包含\\\"Garfield\\\"和\\\"Sylvester\\\"的数字编号列表。\",\n        \"创建一个有关猫咪最痛恨的三件事情<code>Top 3 things cats hate:</code>的有序列表。\"\n      ],\n      \"challengeSeed\": [\n        \"<link href=\\\"https://fonts.gdgdocs.org/css?family=Lobster\\\" rel=\\\"stylesheet\\\" type=\\\"text/css\\\">\",\n        \"<style>\",\n        \"  .red-text {\",\n        \"    color: red;\",\n        \"  }\",\n        \"\",\n        \"  h2 {\",\n        \"    font-family: Lobster, Monospace;\",\n        \"  }\",\n        \"\",\n        \"  p {\",\n        \"    font-size: 16px;\",\n        \"    font-family: Monospace;\",\n        \"  }\",\n        \"\",\n        \"  .thick-green-border {\",\n        \"    border-color: green;\",\n        \"    border-width: 10px;\",\n        \"    border-style: solid;\",\n        \"    border-radius: 50%;\",\n        \"  }\",\n        \"\",\n        \"  .smaller-image {\",\n        \"    width: 100px;\",\n        \"  }\",\n        \"</style>\",\n        \"\",\n        \"<h2 class=\\\"red-text\\\">CatPhotoApp</h2>\",\n        \"\",\n        \"<p>Click here for <a href=\\\"#\\\">cat photos</a>.</p>\",\n        \"\",\n        \"<a href=\\\"#\\\"><img class=\\\"smaller-image thick-green-border\\\" alt=\\\"A cute orange cat lying on its back\\\" src=\\\"/images/relaxing-cat.jpg\\\"></a>\",\n        \"\",\n        \"<p>Things cats love:</p>\",\n        \"<ul>\",\n        \"  <li>cat nip</li>\",\n        \"  <li>laser pointers</li>\",\n        \"  <li>lasagna</li>\",\n        \"</ul>\",\n        \"<p>Top 3 things cats hate:</p>\",\n        \"<!-- 请把你的代码写在这条注释以下 -->\"\n      ],\n      \"tests\": [\n        \"assert.equal($(\\\"ol\\\").prev().text(), 'Top 3 things cats hate:', 'message: 你应该有一个关于\\\"Top 3 things cats hate:\\\"的有序列表。');\",\n        \"assert.equal($(\\\"ul\\\").prev().text(), \\\"Things cats love:\\\", 'message: 你应该有一个关于\\\"Things cats love:\\\"的无序列表。');\",\n        \"assert.equal($(\\\"ul li\\\").length, 3, 'message: 在你的<code>ul</code>元素中应该包含三条<code>li</code>元素。');\",\n        \"assert.equal($(\\\"ol li\\\").length, 3, 'message: 在你的<code>ol</code>元素中应该包含三条<code>li</code>元素。');\",\n        \"assert(code.match(/<\\\\/ul>/g) && code.match(/<\\\\/ul>/g).length === code.match(/<ul>/g).length, 'message: 确保你的<code>ul</code>元素有一个结束标记。');\",\n        \"assert(code.match(/<\\\\/ol>/g) && code.match(/<\\\\/ol>/g).length === code.match(/<ol>/g).length, 'message: 确保你的<code>ol</code>元素有一个结束标记。');\",\n        \"assert(code.match(/<\\\\/li>/g) && code.match(/<li>/g) && code.match(/<\\\\/li>/g).length === code.match(/<li>/g).length, 'message: 确保你的<code>li</code>元素有一个结束标记。');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 0\n    },\n    {\n      \"id\": \"bad87fee1348bd9aedf08829\",\n      \"title\": \"Create a Text Field\",\n      \"description\": [\n        \"现在让我们来创建一个form(表单)。\",\n        \"Text input(文本输入框)是用来获得用户输入的绝佳方式。\",\n        \"你可以用如下方法创建：\",\n        \"<code>&#60;input type=\\\"text\\\"&#62;</code>\",\n        \"注意，<code>input</code>元素是自关闭的。\",\n        \"任务：在有序列表下面创建一个type(类型)为<code>text</code>的<code>input</code>元素。\"\n      ],\n      \"challengeSeed\": [\n        \"<link href=\\\"https://fonts.gdgdocs.org/css?family=Lobster\\\" rel=\\\"stylesheet\\\" type=\\\"text/css\\\">\",\n        \"<style>\",\n        \"  .red-text {\",\n        \"    color: red;\",\n        \"  }\",\n        \"\",\n        \"  h2 {\",\n        \"    font-family: Lobster, Monospace;\",\n        \"  }\",\n        \"\",\n        \"  p {\",\n        \"    font-size: 16px;\",\n        \"    font-family: Monospace;\",\n        \"  }\",\n        \"\",\n        \"  .thick-green-border {\",\n        \"    border-color: green;\",\n        \"    border-width: 10px;\",\n        \"    border-style: solid;\",\n        \"    border-radius: 50%;\",\n        \"  }\",\n        \"\",\n        \"  .smaller-image {\",\n        \"    width: 100px;\",\n        \"  }\",\n        \"</style>\",\n        \"\",\n        \"<h2 class=\\\"red-text\\\">CatPhotoApp</h2>\",\n        \"\",\n        \"<p>Click here for <a href=\\\"#\\\">cat photos</a>.</p>\",\n        \"\",\n        \"<a href=\\\"#\\\"><img class=\\\"smaller-image thick-green-border\\\" alt=\\\"A cute orange cat lying on its back\\\" src=\\\"/images/relaxing-cat.jpg\\\"></a>\",\n        \"\",\n        \"<p>Things cats love:</p>\",\n        \"<ul>\",\n        \"  <li>cat nip</li>\",\n        \"  <li>laser pointers</li>\",\n        \"  <li>lasagna</li>\",\n        \"</ul>\",\n        \"<p>Top 3 things cats hate:</p>\",\n        \"<ol>\",\n        \"  <li>flea treatment</li>\",\n        \"  <li>thunder</li>\",\n        \"  <li>other cats</li>\",\n        \"</ol>\"\n      ],\n      \"tests\": [\n        \"assert($(\\\"input[type=text]\\\").length > 0, 'message: 你的应用应该有一个type（类型）为<code>text</code>的<code>input</code>元素。');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 0\n    },\n    {\n      \"id\": \"bad87fee1348bd9aedf08830\",\n      \"title\": \"Add Placeholder Text to a Text Field\",\n      \"description\": [\n        \"占位符(placeholder text)是用户在<code>input(输入)</code>框输入任何东西之前放置在<code>input(输入)</code>框中的预定义文本。\",\n        \"你可以用如下方式创建占位符：\",\n        \"<code>&#60;input type=\\\"text\\\" placeholder=\\\"this is placeholder text\\\"&#62;</code>\",\n        \"把你的<code>input(输入)</code>框的<code>placeholder</code>的值设置为\\\"cat photo URL\\\"。\"\n      ],\n      \"challengeSeed\": [\n        \"<link href=\\\"https://fonts.gdgdocs.org/css?family=Lobster\\\" rel=\\\"stylesheet\\\" type=\\\"text/css\\\">\",\n        \"<style>\",\n        \"  .red-text {\",\n        \"    color: red;\",\n        \"  }\",\n        \"\",\n        \"  h2 {\",\n        \"    font-family: Lobster, Monospace;\",\n        \"  }\",\n        \"\",\n        \"  p {\",\n        \"    font-size: 16px;\",\n        \"    font-family: Monospace;\",\n        \"  }\",\n        \"\",\n        \"  .thick-green-border {\",\n        \"    border-color: green;\",\n        \"    border-width: 10px;\",\n        \"    border-style: solid;\",\n        \"    border-radius: 50%;\",\n        \"  }\",\n        \"\",\n        \"  .smaller-image {\",\n        \"    width: 100px;\",\n        \"  }\",\n        \"</style>\",\n        \"\",\n        \"<h2 class=\\\"red-text\\\">CatPhotoApp</h2>\",\n        \"\",\n        \"<p>Click here for <a href=\\\"#\\\">cat photos</a>.</p>\",\n        \"\",\n        \"<a href=\\\"#\\\"><img class=\\\"smaller-image thick-green-border\\\" alt=\\\"A cute orange cat lying on its back\\\" src=\\\"/images/relaxing-cat.jpg\\\"></a>\",\n        \"\",\n        \"<p>Things cats love:</p>\",\n        \"<ul>\",\n        \"  <li>cat nip</li>\",\n        \"  <li>laser pointers</li>\",\n        \"  <li>lasagna</li>\",\n        \"</ul>\",\n        \"<p>Top 3 things cats hate:</p>\",\n        \"<ol>\",\n        \"  <li>flea treatment</li>\",\n        \"  <li>thunder</li>\",\n        \"  <li>other cats</li>\",\n        \"</ol>\",\n        \"<input type=\\\"text\\\">\"\n      ],\n      \"tests\": [\n        \"assert($(\\\"input[placeholder]\\\").length > 0, 'message: 添加一个具有<code>placeholder</code>属性的文本<code>input</code>元素。');\",\n        \"assert($(\\\"input\\\") && $(\\\"input\\\").attr(\\\"placeholder\\\") && $(\\\"input\\\").attr(\\\"placeholder\\\").match(/cat\\\\s+photo\\\\s+URL/gi), 'message: 把你的placeholder属性的值设置为\\\"cat photo URL\\\"。');\",\n        \"assert($(\\\"input[type=text]\\\").length > 0 && code.match(/<input.*(text|URL)\\\\s*[\\\"\\\\']\\\\s*\\\\/?>/gi), 'message: 完成后的<code>input</code>元素应该具有合法的语法。');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 0\n    },\n    {\n      \"id\": \"bad87fee1348bd9aede08830\",\n      \"title\": \"Create a Form Element\",\n      \"description\": [\n        \"使用HTML来构建可以跟服务器交互的Web表单(form)，通过给你的<code>form</code>元素添加一个<code>action</code>属性来达到此目的。\",\n        \"<code>action</code>属性的值指定了表单提交到服务器的地址。\",\n        \"例如：\",\n        \"<code>&#60;form action=\\\"/url-where-you-want-to-submit-form-data\\\"&#62;&#60;/form&#62;</code>\",\n        \"把你的文本框嵌套进<code>form</code>元素，并为此<code>form</code>元素添加<code>action=\\\"/submit-cat-photo\\\"</code>。\"\n      ],\n      \"challengeSeed\": [\n        \"<link href=\\\"https://fonts.gdgdocs.org/css?family=Lobster\\\" rel=\\\"stylesheet\\\" type=\\\"text/css\\\">\",\n        \"<style>\",\n        \"  .red-text {\",\n        \"    color: red;\",\n        \"  }\",\n        \"\",\n        \"  h2 {\",\n        \"    font-family: Lobster, Monospace;\",\n        \"  }\",\n        \"\",\n        \"  p {\",\n        \"    font-size: 16px;\",\n        \"    font-family: Monospace;\",\n        \"  }\",\n        \"\",\n        \"  .thick-green-border {\",\n        \"    border-color: green;\",\n        \"    border-width: 10px;\",\n        \"    border-style: solid;\",\n        \"    border-radius: 50%;\",\n        \"  }\",\n        \"\",\n        \"  .smaller-image {\",\n        \"    width: 100px;\",\n        \"  }\",\n        \"</style>\",\n        \"\",\n        \"<h2 class=\\\"red-text\\\">CatPhotoApp</h2>\",\n        \"\",\n        \"<p>Click here for <a href=\\\"#\\\">cat photos</a>.</p>\",\n        \"\",\n        \"<a href=\\\"#\\\"><img class=\\\"smaller-image thick-green-border\\\" alt=\\\"A cute orange cat lying on its back\\\" src=\\\"/images/relaxing-cat.jpg\\\"></a>\",\n        \"\",\n        \"<p>Things cats love:</p>\",\n        \"<ul>\",\n        \"  <li>cat nip</li>\",\n        \"  <li>laser pointers</li>\",\n        \"  <li>lasagna</li>\",\n        \"</ul>\",\n        \"<p>Top 3 things cats hate:</p>\",\n        \"<ol>\",\n        \"  <li>flea treatment</li>\",\n        \"  <li>thunder</li>\",\n        \"  <li>other cats</li>\",\n        \"</ol>\",\n        \"<input type=\\\"text\\\" placeholder=\\\"cat photo URL\\\">\"\n      ],\n      \"tests\": [\n        \"assert($(\\\"form\\\") && $(\\\"form\\\").children(\\\"input\\\") && $(\\\"form\\\").children(\\\"input\\\").length > 0, 'message: 把你的文本输入元素嵌套进一个<code>form</code>元素。');\",\n        \"assert($(\\\"form\\\").attr(\\\"action\\\") === \\\"/submit-cat-photo\\\", 'message: 确保你的<code>form</code>有一个设置为<code>/submit-cat-photo</code>的<code>action</code>属性。');\",\n        \"assert(code.match(/<\\\\/form>/g) && code.match(/<form/g) && code.match(/<\\\\/form>/g).length === code.match(/<form/g).length, 'message: 确保你的<code>form</code>元素有一个结束标记。');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 0\n    },\n    {\n      \"id\": \"bad87fee1348bd9aedd08830\",\n      \"title\": \"Add a Submit Button to a Form\",\n      \"description\": [\n        \"让我们来为你的form添加一个<code>submit</code>(提交)按钮，点击这个按钮，表单中的数据将会被发送到你通过<code>action</code>属性指定的地址上。\",\n        \"下面是submit按钮的例子：\",\n        \"<code>&#60;button type=\\\"submit\\\"&#62;this button submits the form&#60;/button&#62;</code>\",\n        \"为你的<code>form</code>元素添加一个type为<code>submit</code>的提交按钮，用\\\"Submit\\\"作按钮文本。\"\n      ],\n      \"challengeSeed\": [\n        \"<link href=\\\"https://fonts.gdgdocs.org/css?family=Lobster\\\" rel=\\\"stylesheet\\\" type=\\\"text/css\\\">\",\n        \"<style>\",\n        \"  .red-text {\",\n        \"    color: red;\",\n        \"  }\",\n        \"\",\n        \"  h2 {\",\n        \"    font-family: Lobster, Monospace;\",\n        \"  }\",\n        \"\",\n        \"  p {\",\n        \"    font-size: 16px;\",\n        \"    font-family: Monospace;\",\n        \"  }\",\n        \"\",\n        \"  .thick-green-border {\",\n        \"    border-color: green;\",\n        \"    border-width: 10px;\",\n        \"    border-style: solid;\",\n        \"    border-radius: 50%;\",\n        \"  }\",\n        \"\",\n        \"  .smaller-image {\",\n        \"    width: 100px;\",\n        \"  }\",\n        \"</style>\",\n        \"\",\n        \"<h2 class=\\\"red-text\\\">CatPhotoApp</h2>\",\n        \"\",\n        \"<p>Click here for <a href=\\\"#\\\">cat photos</a>.</p>\",\n        \"\",\n        \"<a href=\\\"#\\\"><img class=\\\"smaller-image thick-green-border\\\" alt=\\\"A cute orange cat lying on its back\\\" src=\\\"/images/relaxing-cat.jpg\\\"></a>\",\n        \"\",\n        \"<p>Things cats love:</p>\",\n        \"<ul>\",\n        \"  <li>cat nip</li>\",\n        \"  <li>laser pointers</li>\",\n        \"  <li>lasagna</li>\",\n        \"</ul>\",\n        \"<p>Top 3 things cats hate:</p>\",\n        \"<ol>\",\n        \"  <li>flea treatment</li>\",\n        \"  <li>thunder</li>\",\n        \"  <li>other cats</li>\",\n        \"</ol>\",\n        \"<form action=\\\"/submit-cat-photo\\\">\",\n        \"  <input type=\\\"text\\\" placeholder=\\\"cat photo URL\\\">\",\n        \"</form>\"\n      ],\n      \"tests\": [\n        \"assert($(\\\"form\\\").children(\\\"button\\\").length > 0, 'message: 你的form内部应该有一个button。');\",\n        \"assert($(\\\"button\\\").attr(\\\"type\\\") === \\\"submit\\\", 'message: 你的submit button应该有一个<code>type</code>属性，其值设置为<code>submit</code>。');\",\n        \"assert($(\\\"button\\\").text().match(/^\\\\s*submit\\\\s*$/gi), 'message: 你的submit button的按钮文本仅应该为\\\"Submit\\\"。');\",\n        \"assert(code.match(/<\\\\/button>/g) && code.match(/<button/g) && code.match(/<\\\\/button>/g).length === code.match(/<button/g).length, 'message: 确保你的<code>button</code>元素有一个结束标记。');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 0\n    },\n    {\n      \"id\": \"bad87fee1348bd9aedc08830\",\n      \"title\": \"Use HTML5 to Require a Field\",\n      \"description\": [\n        \"当你设计表单时，你可以指定某些选项为必填项(required)，只有当用户填写了该选项后，用户才能够提交表单。\",\n        \"例如，如果你想把一个文本输入字段设置为必填项，在你的<code>input</code>元素中加上<code>required</code>属性就可以了，你可以使用：<br><code>&#60;input type=\\\"text\\\" required&#62;</code>\",\n        \"任务：给你的输入框添加<code>required</code>属性，这样用户不填写输入框就无法提交表单。\",\n        \"试试输入框不填写任何文本，然后点击Submit提交表单，看看浏览器如何提示你该字段为必填项。\",\n        \"注意：<code>required</code>属性在Safari浏览器10.1以下不起作用(2017年3月27以前)，请更新Safari或者使用其他浏览器来学习，推荐使用Chrome。\"\n      ],\n      \"challengeSeed\": [\n        \"<link href=\\\"https://fonts.gdgdocs.org/css?family=Lobster\\\" rel=\\\"stylesheet\\\" type=\\\"text/css\\\">\",\n        \"<style>\",\n        \"  .red-text {\",\n        \"    color: red;\",\n        \"  }\",\n        \"\",\n        \"  h2 {\",\n        \"    font-family: Lobster, Monospace;\",\n        \"  }\",\n        \"\",\n        \"  p {\",\n        \"    font-size: 16px;\",\n        \"    font-family: Monospace;\",\n        \"  }\",\n        \"\",\n        \"  .thick-green-border {\",\n        \"    border-color: green;\",\n        \"    border-width: 10px;\",\n        \"    border-style: solid;\",\n        \"    border-radius: 50%;\",\n        \"  }\",\n        \"\",\n        \"  .smaller-image {\",\n        \"    width: 100px;\",\n        \"  }\",\n        \"</style>\",\n        \"\",\n        \"<h2 class=\\\"red-text\\\">CatPhotoApp</h2>\",\n        \"\",\n        \"<p>Click here for <a href=\\\"#\\\">cat photos</a>.</p>\",\n        \"\",\n        \"<a href=\\\"#\\\"><img class=\\\"smaller-image thick-green-border\\\" alt=\\\"A cute orange cat lying on its back\\\" src=\\\"/images/relaxing-cat.jpg\\\"></a>\",\n        \"\",\n        \"<p>Things cats love:</p>\",\n        \"<ul>\",\n        \"  <li>cat nip</li>\",\n        \"  <li>laser pointers</li>\",\n        \"  <li>lasagna</li>\",\n        \"</ul>\",\n        \"<p>Top 3 things cats hate:</p>\",\n        \"<ol>\",\n        \"  <li>flea treatment</li>\",\n        \"  <li>thunder</li>\",\n        \"  <li>other cats</li>\",\n        \"</ol>\",\n        \"<form action=\\\"/submit-cat-photo\\\">\",\n        \"  <input type=\\\"text\\\" placeholder=\\\"cat photo URL\\\">\",\n        \"  <button type=\\\"submit\\\">Submit</button>\",\n        \"</form>\"\n      ],\n      \"tests\": [\n        \"assert($(\\\"input\\\").prop(\\\"required\\\"), 'message: 你的文本<code>input</code>元素应该具有<code>required</code>属性。');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 0\n    },\n    {\n      \"id\": \"bad87fee1348bd9aedf08834\",\n      \"title\": \"Create a Set of Radio Buttons\",\n      \"description\": [\n        \"类比是最好的学习方式，当你搞不清一个概念时，最好在生活中找到对应的案例。\",\n        \"单选就是你只能在多个选项中选择一个，就好比你有很多追求者，但却只能选择一个结婚。\",\n        \"多选一的场景就用<code>radio button(单选按钮)</code>\",\n        \"单选按钮只是<code>input</code>输入框的一种类型。\",\n        \"每一个单选按钮都应该嵌套在它自己的<code>label(标签)</code>元素中。\",\n        \"注意：所有关联的单选按钮应该使用相同的<code>name</code>属性。\",\n        \"下面是一个单选按钮的例子：\",\n        \"<code>&#60;label&#62;&#60;input type=\\\"radio\\\" name=\\\"indoor-outdoor\\\"&#62; Indoor&#60;/label&#62;</code>\",\n        \"给你的表单添加两个单选按钮，一个叫<code>indoor</code>，另一个叫<code>outdoor</code>。\"\n      ],\n      \"challengeSeed\": [\n        \"<link href=\\\"https://fonts.gdgdocs.org/css?family=Lobster\\\" rel=\\\"stylesheet\\\" type=\\\"text/css\\\">\",\n        \"<style>\",\n        \"  .red-text {\",\n        \"    color: red;\",\n        \"  }\",\n        \"\",\n        \"  h2 {\",\n        \"    font-family: Lobster, Monospace;\",\n        \"  }\",\n        \"\",\n        \"  p {\",\n        \"    font-size: 16px;\",\n        \"    font-family: Monospace;\",\n        \"  }\",\n        \"\",\n        \"  .thick-green-border {\",\n        \"    border-color: green;\",\n        \"    border-width: 10px;\",\n        \"    border-style: solid;\",\n        \"    border-radius: 50%;\",\n        \"  }\",\n        \"\",\n        \"  .smaller-image {\",\n        \"    width: 100px;\",\n        \"  }\",\n        \"</style>\",\n        \"\",\n        \"<h2 class=\\\"red-text\\\">CatPhotoApp</h2>\",\n        \"\",\n        \"<p>Click here for <a href=\\\"#\\\">cat photos</a>.</p>\",\n        \"\",\n        \"<a href=\\\"#\\\"><img class=\\\"smaller-image thick-green-border\\\" alt=\\\"A cute orange cat lying on its back\\\" src=\\\"/images/relaxing-cat.jpg\\\"></a>\",\n        \"\",\n        \"<p>Things cats love:</p>\",\n        \"<ul>\",\n        \"  <li>cat nip</li>\",\n        \"  <li>laser pointers</li>\",\n        \"  <li>lasagna</li>\",\n        \"</ul>\",\n        \"<p>Top 3 things cats hate:</p>\",\n        \"<ol>\",\n        \"  <li>flea treatment</li>\",\n        \"  <li>thunder</li>\",\n        \"  <li>other cats</li>\",\n        \"</ol>\",\n        \"<form action=\\\"/submit-cat-photo\\\">\",\n        \"  <input type=\\\"text\\\" placeholder=\\\"cat photo URL\\\" required>\",\n        \"  <button type=\\\"submit\\\">Submit</button>\",\n        \"</form>\"\n      ],\n      \"tests\": [\n        \"assert($('input[type=\\\"radio\\\"]').length > 1, 'message: 你的页面上应该有两个单选按钮元素。');\",\n        \"assert($('label > input[type=\\\"radio\\\"]').filter(\\\"[name='indoor-outdoor']\\\").length > 1, 'message: 设置你的单选按钮的<code>name</code>属性为<code>indoor-outdoor</code>。');\",\n        \"assert($('label > input[type=\\\"radio\\\"]:only-child').length > 1, 'message: 你的两个单选按钮中的每一个都应该嵌套进它自己的<code>label</code>元素中。');\",\n        \"assert((code.match(/<\\\\/label>/g) && code.match(/<label/g) && code.match(/<\\\\/label>/g).length === code.match(/<label/g).length), 'message: 确保你的每一个<code>label</code>元素都有一个结束标记。');\",\n        \"assert($(\\\"label\\\").text().match(/indoor/gi), 'message: 应该有一个<code>indoor</code>单选按钮。');\",\n        \"assert($(\\\"label\\\").text().match(/outdoor/gi), 'message: 应该有一个<code>outdoor</code>单选按钮。');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 0\n    },\n    {\n      \"id\": \"bad87fee1348bd9aedf08835\",\n      \"title\": \"Create a Set of Checkboxes\",\n      \"description\": [\n        \"当你在大学选课时，面对几百门课程，而因为时间和精力，你只能从中选择十几门。\",\n        \"这样的场景就用<code>checkboxes（复选按钮）</code>。\",\n        \"复选按钮是<code>input</code>的输入框的另一种类型。\",\n        \"每一个复选按钮都应该嵌套进<code>label</code>元素中。\",\n        \"所有关联的复选按钮应该具有相同的<code>name</code>属性。\",\n        \"下面是复选按钮的例子：\",\n        \"<code>&#60;label&#62;&#60;input type=\\\"checkbox\\\" name=\\\"personality\\\"&#62; Loving&#60;/label&#62;</code>\",\n        \"任务：为你的表单添加三个复选按钮，每个复选按钮都应该嵌套进它自己的<code>label</code>元素，所有复选按钮的<code>name</code>属性必须为<code>personality</code>。\"\n      ],\n      \"challengeSeed\": [\n        \"<link href=\\\"https://fonts.gdgdocs.org/css?family=Lobster\\\" rel=\\\"stylesheet\\\" type=\\\"text/css\\\">\",\n        \"<style>\",\n        \"  .red-text {\",\n        \"    color: red;\",\n        \"  }\",\n        \"\",\n        \"  h2 {\",\n        \"    font-family: Lobster, Monospace;\",\n        \"  }\",\n        \"\",\n        \"  p {\",\n        \"    font-size: 16px;\",\n        \"    font-family: Monospace;\",\n        \"  }\",\n        \"\",\n        \"  .thick-green-border {\",\n        \"    border-color: green;\",\n        \"    border-width: 10px;\",\n        \"    border-style: solid;\",\n        \"    border-radius: 50%;\",\n        \"  }\",\n        \"\",\n        \"  .smaller-image {\",\n        \"    width: 100px;\",\n        \"  }\",\n        \"</style>\",\n        \"\",\n        \"<h2 class=\\\"red-text\\\">CatPhotoApp</h2>\",\n        \"\",\n        \"<p>Click here for <a href=\\\"#\\\">cat photos</a>.</p>\",\n        \"\",\n        \"<a href=\\\"#\\\"><img class=\\\"smaller-image thick-green-border\\\" alt=\\\"A cute orange cat lying on its back\\\" src=\\\"/images/relaxing-cat.jpg\\\"></a>\",\n        \"\",\n        \"<p>Things cats love:</p>\",\n        \"<ul>\",\n        \"  <li>cat nip</li>\",\n        \"  <li>laser pointers</li>\",\n        \"  <li>lasagna</li>\",\n        \"</ul>\",\n        \"<p>Top 3 things cats hate:</p>\",\n        \"<ol>\",\n        \"  <li>flea treatment</li>\",\n        \"  <li>thunder</li>\",\n        \"  <li>other cats</li>\",\n        \"</ol>\",\n        \"<form action=\\\"/submit-cat-photo\\\">\",\n        \"  <label><input type=\\\"radio\\\" name=\\\"indoor-outdoor\\\"> Indoor</label>\",\n        \"  <label><input type=\\\"radio\\\" name=\\\"indoor-outdoor\\\"> Outdoor</label>\",\n        \"  <input type=\\\"text\\\" placeholder=\\\"cat photo URL\\\" required>\",\n        \"  <button type=\\\"submit\\\">Submit</button>\",\n        \"</form>\"\n      ],\n      \"tests\": [\n        \"assert($('input[type=\\\"checkbox\\\"]').length > 2, 'message: 你的页面上应该有三个复选按钮元素。');\",\n        \"assert($('label > input[type=\\\"checkbox\\\"]:only-child').length > 2, 'message: 每一个复选按钮都应该嵌套进它自己的<code>label</code>元素。');\",\n        \"assert(code.match(/<\\\\/label>/g) && code.match(/<label/g) && code.match(/<\\\\/label>/g).length === code.match(/<label/g).length, 'message: 确保每一个<code>label</code>元素都有一个结束标记。');\",\n        \"assert($('label > input[type=\\\"checkbox\\\"]').filter(\\\"[name='personality']\\\").length > 2, 'message: 复选按钮的<code>name</code>属性必须为<code>personality</code>。');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 0\n    },\n    {\n      \"id\": \"bad87fee1348bd9aedd08835\",\n      \"title\": \"Check Radio Buttons and Checkboxes by Default\",\n      \"description\": [\n        \"使用<code>checked</code>属性，你可以设置复选按钮和单选按钮默认被选中。\",\n        \"为此，只需在<code>input</code>元素中添加属性<code>checked</code>\",\n        \"<code>&#60;input type=\\\"radio\\\" name=\\\"test-name\\\" checked&#62;</code>\",\n        \"把你的第一个<code>radio button</code>和第一个<code>checkbox</code>都设置为默认选中。\"\n      ],\n      \"challengeSeed\": [\n        \"<link href=\\\"https://fonts.gdgdocs.org/css?family=Lobster\\\" rel=\\\"stylesheet\\\" type=\\\"text/css\\\">\",\n        \"<style>\",\n        \"  .red-text {\",\n        \"    color: red;\",\n        \"  }\",\n        \"\",\n        \"  h2 {\",\n        \"    font-family: Lobster, Monospace;\",\n        \"  }\",\n        \"\",\n        \"  p {\",\n        \"    font-size: 16px;\",\n        \"    font-family: Monospace;\",\n        \"  }\",\n        \"\",\n        \"  .thick-green-border {\",\n        \"    border-color: green;\",\n        \"    border-width: 10px;\",\n        \"    border-style: solid;\",\n        \"    border-radius: 50%;\",\n        \"  }\",\n        \"\",\n        \"  .smaller-image {\",\n        \"    width: 100px;\",\n        \"  }\",\n        \"</style>\",\n        \"\",\n        \"<h2 class=\\\"red-text\\\">CatPhotoApp</h2>\",\n        \"\",\n        \"<p>Click here for <a href=\\\"#\\\">cat photos</a>.</p>\",\n        \"\",\n        \"<a href=\\\"#\\\"><img class=\\\"smaller-image thick-green-border\\\" alt=\\\"A cute orange cat lying on its back\\\" src=\\\"/images/relaxing-cat.jpg\\\"></a>\",\n        \"\",\n        \"<p>Things cats love:</p>\",\n        \"<ul>\",\n        \"  <li>cat nip</li>\",\n        \"  <li>laser pointers</li>\",\n        \"  <li>lasagna</li>\",\n        \"</ul>\",\n        \"<p>Top 3 things cats hate:</p>\",\n        \"<ol>\",\n        \"  <li>flea treatment</li>\",\n        \"  <li>thunder</li>\",\n        \"  <li>other cats</li>\",\n        \"</ol>\",\n        \"<form action=\\\"/submit-cat-photo\\\">\",\n        \"  <label><input type=\\\"radio\\\" name=\\\"indoor-outdoor\\\"> Indoor</label>\",\n        \"  <label><input type=\\\"radio\\\" name=\\\"indoor-outdoor\\\"> Outdoor</label>\",\n        \"  <label><input type=\\\"checkbox\\\" name=\\\"personality\\\"> Loving</label>\",\n        \"  <label><input type=\\\"checkbox\\\" name=\\\"personality\\\"> Lazy</label>\",\n        \"  <label><input type=\\\"checkbox\\\" name=\\\"personality\\\"> Energetic</label>\",\n        \"  <input type=\\\"text\\\" placeholder=\\\"cat photo URL\\\" required>\",\n        \"  <button type=\\\"submit\\\">Submit</button>\",\n        \"</form>\"\n      ],\n      \"tests\": [\n        \"assert($('input[type=\\\"radio\\\"]').prop(\\\"checked\\\"), 'message: 你表单中的第一个单选按钮应该默认被选中。');\",\n        \"assert($('input[type=\\\"checkbox\\\"]').prop(\\\"checked\\\"), 'message: 你表单中的第一个复选按钮应该默认被选中。');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 0\n    },\n    {\n      \"id\": \"bad87fee1348bd9aede08835\",\n      \"title\": \"Nest Many Elements within a Single Div Element\",\n      \"description\": [\n        \"<code>div</code>元素，也被称作division(层)元素，是一个盛装其他元素的通用容器。\",\n        \"所以可以利用CSS的继承关系把<code>div</code>上的CSS传递给它所有子元素。\",\n        \"你可以用<code>&#60;div&#62;</code>来标记一个div元素的开始，然后用<code>&#60;/div&#62;</code>来标记一个div元素的结束。\",\n        \"试着在你的\\\"Things cats love\\\" <code>p</code>元素之前放置<code>div</code>的开始标记，在你的<code>ol</code>结束标记之后放置<code>div</code>的结束标记，这样你的两个列表就都嵌套在<code>div</code>中了。\",\n        \"把\\\"Things cats love\\\"和\\\"Things cats hate\\\"两个列表都嵌套进同一个<code>div</code>元素中。\"\n      ],\n      \"challengeSeed\": [\n        \"<link href=\\\"https://fonts.gdgdocs.org/css?family=Lobster\\\" rel=\\\"stylesheet\\\" type=\\\"text/css\\\">\",\n        \"<style>\",\n        \"  .red-text {\",\n        \"    color: red;\",\n        \"  }\",\n        \"\",\n        \"  h2 {\",\n        \"    font-family: Lobster, Monospace;\",\n        \"  }\",\n        \"\",\n        \"  p {\",\n        \"    font-size: 16px;\",\n        \"    font-family: Monospace;\",\n        \"  }\",\n        \"\",\n        \"  .thick-green-border {\",\n        \"    border-color: green;\",\n        \"    border-width: 10px;\",\n        \"    border-style: solid;\",\n        \"    border-radius: 50%;\",\n        \"  }\",\n        \"\",\n        \"  .smaller-image {\",\n        \"    width: 100px;\",\n        \"  }\",\n        \"</style>\",\n        \"\",\n        \"<h2 class=\\\"red-text\\\">CatPhotoApp</h2>\",\n        \"\",\n        \"<p>Click here for <a href=\\\"#\\\">cat photos</a>.</p>\",\n        \"\",\n        \"<a href=\\\"#\\\"><img class=\\\"smaller-image thick-green-border\\\" alt=\\\"A cute orange cat lying on its back\\\" src=\\\"/images/relaxing-cat.jpg\\\"></a>\",\n        \"\",\n        \"<p>Things cats love:</p>\",\n        \"<ul>\",\n        \"  <li>cat nip</li>\",\n        \"  <li>laser pointers</li>\",\n        \"  <li>lasagna</li>\",\n        \"</ul>\",\n        \"<p>Top 3 things cats hate:</p>\",\n        \"<ol>\",\n        \"  <li>flea treatment</li>\",\n        \"  <li>thunder</li>\",\n        \"  <li>other cats</li>\",\n        \"</ol>\",\n        \"\",\n        \"<form action=\\\"/submit-cat-photo\\\">\",\n        \"  <label><input type=\\\"radio\\\" name=\\\"indoor-outdoor\\\" checked> Indoor</label>\",\n        \"  <label><input type=\\\"radio\\\" name=\\\"indoor-outdoor\\\"> Outdoor</label>\",\n        \"  <label><input type=\\\"checkbox\\\" name=\\\"personality\\\" checked> Loving</label>\",\n        \"  <label><input type=\\\"checkbox\\\" name=\\\"personality\\\"> Lazy</label>\",\n        \"  <label><input type=\\\"checkbox\\\" name=\\\"personality\\\"> Energetic</label>\",\n        \"  <input type=\\\"text\\\" placeholder=\\\"cat photo URL\\\" required>\",\n        \"  <button type=\\\"submit\\\">Submit</button>\",\n        \"</form>\"\n      ],\n      \"tests\": [\n        \"assert($(\\\"div\\\").children(\\\"p\\\").length > 1, 'message: 把你的<code>p</code>元素嵌套进你的<code>div</code>元素中。');\",\n        \"assert($(\\\"div\\\").children(\\\"ul\\\").length > 0, 'message: 把你的<code>ul</code>元素嵌套进你的<code>div</code>元素中。');\",\n        \"assert($(\\\"div\\\").children(\\\"ol\\\").length > 0, 'message: 把你的<code>ol</code>元素嵌套进你的<code>div</code>元素中。');\",\n        \"assert(code.match(/<\\\\/div>/g) && code.match(/<\\\\/div>/g).length === code.match(/<div>/g).length, 'message: 确保你的<code>div</code>元素有一个结束标记。');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 0\n    },\n    {\n      \"id\": \"bad87fed1348bd9aede07836\",\n      \"title\": \"Give a Background Color to a Div Element\",\n      \"description\": [\n        \"你可以用 <code>background-color</code> 属性来设置一个元素的背景颜色。\",\n        \"例如，如果你想把一个元素的背景颜色设置为<code>green</code>，你应该把这些加到你的 <code>style</code> 元素中：\",\n        \"<blockquote>.green-background {<br>&nbsp;&nbsp;background-color: green;<br>}</blockquote>\",\n        \"创建一个叫做 <code>gray-background</code> 的类选择器，设置其 <code>background-color</code> 为 gray，最后应用到 <code>div</code> 元素。\"\n      ],\n      \"challengeSeed\": [\n        \"<link href=\\\"https://fonts.gdgdocs.org/css?family=Lobster\\\" rel=\\\"stylesheet\\\" type=\\\"text/css\\\">\",\n        \"<style>\",\n        \"  .red-text {\",\n        \"    color: red;\",\n        \"  }\",\n        \"\",\n        \"  h2 {\",\n        \"    font-family: Lobster, Monospace;\",\n        \"  }\",\n        \"\",\n        \"  p {\",\n        \"    font-size: 16px;\",\n        \"    font-family: Monospace;\",\n        \"  }\",\n        \"\",\n        \"  .thick-green-border {\",\n        \"    border-color: green;\",\n        \"    border-width: 10px;\",\n        \"    border-style: solid;\",\n        \"    border-radius: 50%;\",\n        \"  }\",\n        \"\",\n        \"  .smaller-image {\",\n        \"    width: 100px;\",\n        \"  }\",\n        \"</style>\",\n        \"\",\n        \"<h2 class=\\\"red-text\\\">CatPhotoApp</h2>\",\n        \"\",\n        \"<p>Click here for <a href=\\\"#\\\">cat photos</a>.</p>\",\n        \"\",\n        \"<a href=\\\"#\\\"><img class=\\\"smaller-image thick-green-border\\\" alt=\\\"A cute orange cat lying on its back\\\" src=\\\"/images/relaxing-cat.jpg\\\"></a>\",\n        \"\",\n        \"<div>\",\n        \"  <p>Things cats love:</p>\",\n        \"  <ul>\",\n        \"    <li>cat nip</li>\",\n        \"    <li>laser pointers</li>\",\n        \"    <li>lasagna</li>\",\n        \"  </ul>\",\n        \"  <p>Top 3 things cats hate:</p>\",\n        \"  <ol>\",\n        \"    <li>flea treatment</li>\",\n        \"    <li>thunder</li>\",\n        \"    <li>other cats</li>\",\n        \"  </ol>\",\n        \"</div>\",\n        \"\",\n        \"<form action=\\\"/submit-cat-photo\\\">\",\n        \"  <label><input type=\\\"radio\\\" name=\\\"indoor-outdoor\\\" checked> Indoor</label>\",\n        \"  <label><input type=\\\"radio\\\" name=\\\"indoor-outdoor\\\"> Outdoor</label>\",\n        \"  <label><input type=\\\"checkbox\\\" name=\\\"personality\\\" checked> Loving</label>\",\n        \"  <label><input type=\\\"checkbox\\\" name=\\\"personality\\\"> Lazy</label>\",\n        \"  <label><input type=\\\"checkbox\\\" name=\\\"personality\\\"> Energetic</label>\",\n        \"  <input type=\\\"text\\\" placeholder=\\\"cat photo URL\\\" required>\",\n        \"  <button type=\\\"submit\\\">Submit</button>\",\n        \"</form>\"\n      ],\n      \"tests\": [\n        \"assert($(\\\"div\\\").hasClass(\\\"gray-background\\\"), 'message: 把 <code>gray-background</code> class 指定给你的 <code>div</code> 元素。');\",\n        \"assert($(\\\".gray-background\\\").css(\\\"background-color\\\") === \\\"rgb(128, 128, 128)\\\", 'message: 你的 <code>div</code> 元素应该有一个灰色（gray）的背景。');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 0\n    },\n    {\n      \"id\": \"bad87eee1348bd9aede07836\",\n      \"title\": \"Set the ID of an Element\",\n      \"description\": [\n        \"除了 <code>class</code>属性之外，每一个 HTML 元素还可以使用 <code>id</code> 属性。\",\n        \"使用 <code>id</code> 属性有若干好处，一旦当你开始使用 jQuery 的时候你会有更深的体会。\",\n        \"<code>id</code> 属性应该是唯一的，虽然浏览器并不强制唯一，但基于最佳实践，这一点是被广泛认可的，所以请不要给一个以上的元素设置相同的 <code>id</code> 属性。\",\n        \"下面举例说明了如何设置<code>h2</code> 元素的<code>id</code>属性为<code>cat-photo-app</code>。\",\n        \"<code>&#60;h2 id=\\\"cat-photo-app\\\"></code>\",\n        \"任务：设置 <code>form</code> 元素的<code>id</code>属性为 <code>cat-photo-form</code>。\"\n      ],\n      \"challengeSeed\": [\n        \"<link href=\\\"https://fonts.gdgdocs.org/css?family=Lobster\\\" rel=\\\"stylesheet\\\" type=\\\"text/css\\\">\",\n        \"<style>\",\n        \"  .red-text {\",\n        \"    color: red;\",\n        \"  }\",\n        \"\",\n        \"  h2 {\",\n        \"    font-family: Lobster, Monospace;\",\n        \"  }\",\n        \"\",\n        \"  p {\",\n        \"    font-size: 16px;\",\n        \"    font-family: Monospace;\",\n        \"  }\",\n        \"\",\n        \"  .thick-green-border {\",\n        \"    border-color: green;\",\n        \"    border-width: 10px;\",\n        \"    border-style: solid;\",\n        \"    border-radius: 50%;\",\n        \"  }\",\n        \"\",\n        \"  .smaller-image {\",\n        \"    width: 100px;\",\n        \"  }\",\n        \"  .gray-background {\",\n        \"    background-color: gray;\",\n        \"  }\",\n        \"</style>\",\n        \"\",\n        \"<h2 class=\\\"red-text\\\">CatPhotoApp</h2>\",\n        \"\",\n        \"<p>Click here for <a href=\\\"#\\\">cat photos</a>.</p>\",\n        \"\",\n        \"<a href=\\\"#\\\"><img class=\\\"smaller-image thick-green-border\\\" alt=\\\"A cute orange cat lying on its back\\\" src=\\\"/images/relaxing-cat.jpg\\\"></a>\",\n        \"\",\n        \"<div class=\\\"gray-background\\\">\",\n        \"  <p>Things cats love:</p>\",\n        \"  <ul>\",\n        \"    <li>cat nip</li>\",\n        \"    <li>laser pointers</li>\",\n        \"    <li>lasagna</li>\",\n        \"  </ul>\",\n        \"  <p>Top 3 things cats hate:</p>\",\n        \"  <ol>\",\n        \"    <li>flea treatment</li>\",\n        \"    <li>thunder</li>\",\n        \"    <li>other cats</li>\",\n        \"  </ol>\",\n        \"</div>\",\n        \"\",\n        \"<form action=\\\"/submit-cat-photo\\\">\",\n        \"  <label><input type=\\\"radio\\\" name=\\\"indoor-outdoor\\\" checked> Indoor</label>\",\n        \"  <label><input type=\\\"radio\\\" name=\\\"indoor-outdoor\\\"> Outdoor</label>\",\n        \"  <label><input type=\\\"checkbox\\\" name=\\\"personality\\\" checked> Loving</label>\",\n        \"  <label><input type=\\\"checkbox\\\" name=\\\"personality\\\"> Lazy</label>\",\n        \"  <label><input type=\\\"checkbox\\\" name=\\\"personality\\\"> Energetic</label>\",\n        \"  <input type=\\\"text\\\" placeholder=\\\"cat photo URL\\\" required>\",\n        \"  <button type=\\\"submit\\\">Submit</button>\",\n        \"</form>\"\n      ],\n      \"tests\": [\n        \"assert($(\\\"form\\\").attr(\\\"id\\\") === \\\"cat-photo-form\\\", 'message: 设置 <code>form</code> 元素的<code>id</code>属性为 <code>cat-photo-form</code>。');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 0\n    },\n    {\n      \"id\": \"bad87dee1348bd9aede07836\",\n      \"title\": \"Use an ID Attribute to Style an Element\",\n      \"description\": [\n        \"和类选择器一样，你也可以使用ID选择器来声明样式。\",\n        \"声明一个叫<code>cat-photo-element</code>的ID选择器 ，并设置背景色为绿色。：\",\n        \"<blockquote>#cat-photo-element {<br>&nbsp;&nbsp;background-color: green;<br>}</blockquote>\",\n        \"注意：在你的 <code>style</code> 元素内部，定义类选择器必须添加 <code>.</code> 为前缀，定义ID选择器必须添加 <code>#</code> 为前缀。\",\n        \"任务：试着给你的表单，添加一个值为 <code>cat-photo-form</code> 的 id 属性，一个绿色的背景。\"\n      ],\n      \"challengeSeed\": [\n        \"<link href=\\\"https://fonts.gdgdocs.org/css?family=Lobster\\\" rel=\\\"stylesheet\\\" type=\\\"text/css\\\">\",\n        \"<style>\",\n        \"  .red-text {\",\n        \"    color: red;\",\n        \"  }\",\n        \"\",\n        \"  h2 {\",\n        \"    font-family: Lobster, Monospace;\",\n        \"  }\",\n        \"\",\n        \"  p {\",\n        \"    font-size: 16px;\",\n        \"    font-family: Monospace;\",\n        \"  }\",\n        \"\",\n        \"  .thick-green-border {\",\n        \"    border-color: green;\",\n        \"    border-width: 10px;\",\n        \"    border-style: solid;\",\n        \"    border-radius: 50%;\",\n        \"  }\",\n        \"\",\n        \"  .smaller-image {\",\n        \"    width: 100px;\",\n        \"  }\",\n        \"\",\n        \"  .gray-background {\",\n        \"    background-color: gray;\",\n        \"  }\",\n        \"</style>\",\n        \"\",\n        \"<h2 class=\\\"red-text\\\">CatPhotoApp</h2>\",\n        \"\",\n        \"<p>Click here for <a href=\\\"#\\\">cat photos</a>.</p>\",\n        \"\",\n        \"<a href=\\\"#\\\"><img class=\\\"smaller-image thick-green-border\\\" alt=\\\"A cute orange cat lying on its back\\\" src=\\\"/images/relaxing-cat.jpg\\\"></a>\",\n        \"\",\n        \"<div class=\\\"gray-background\\\">\",\n        \"  <p>Things cats love:</p>\",\n        \"  <ul>\",\n        \"    <li>cat nip</li>\",\n        \"    <li>laser pointers</li>\",\n        \"    <li>lasagna</li>\",\n        \"  </ul>\",\n        \"  <p>Top 3 things cats hate:</p>\",\n        \"  <ol>\",\n        \"    <li>flea treatment</li>\",\n        \"    <li>thunder</li>\",\n        \"    <li>other cats</li>\",\n        \"  </ol>\",\n        \"</div>\",\n        \"\",\n        \"<form action=\\\"/submit-cat-photo\\\" id=\\\"cat-photo-form\\\">\",\n        \"  <label><input type=\\\"radio\\\" name=\\\"indoor-outdoor\\\" checked> Indoor</label>\",\n        \"  <label><input type=\\\"radio\\\" name=\\\"indoor-outdoor\\\"> Outdoor</label>\",\n        \"  <label><input type=\\\"checkbox\\\" name=\\\"personality\\\" checked> Loving</label>\",\n        \"  <label><input type=\\\"checkbox\\\" name=\\\"personality\\\"> Lazy</label>\",\n        \"  <label><input type=\\\"checkbox\\\" name=\\\"personality\\\"> Energetic</label>\",\n        \"  <input type=\\\"text\\\" placeholder=\\\"cat photo URL\\\" required>\",\n        \"  <button type=\\\"submit\\\">Submit</button>\",\n        \"</form>\"\n      ],\n      \"tests\": [\n        \"assert($(\\\"form\\\").attr(\\\"id\\\") === \\\"cat-photo-form\\\", 'message: 为你的 <code>form</code> 元素添加值为 <code>cat-photo-form</code> 的 id。');\",\n        \"assert($(\\\"#cat-photo-form\\\").css(\\\"background-color\\\") === \\\"rgb(0, 128, 0)\\\", 'message: 你的 <code>form</code> 元素的 <code>background-color</code> 应该为 green。');\",\n        \"assert(code.match(/<form.*cat-photo-form.*>/gi) && code.match(/<form.*cat-photo-form.*>/gi).length > 0, 'message: 确保你的 <code>form</code> 元素有一个 <code>id</code> 属性。');\",\n        \"assert(!code.match(/<form.*style.*>/gi) && !code.match(/<form.*class.*>/gi), 'message: 不要给你的 <code>form</code> 添加任何 <code>class</code> 或 <code>style</code> 属性。');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 0\n    },\n    {\n      \"id\": \"bad88fee1348bd9aedf08825\",\n      \"title\": \"Adjusting the Padding of an Element\",\n      \"description\": [\n        \"现在让我们把 Cat Photo App 暂时搁置，以学习更多的 HTML 样式。\",\n        \"你可能早已经注意到了这点，所有的 HTML 元素本质上是小的矩形块，代表着某一小块区域。\",\n        \"有三个影响HTML元素布局的重要属性：<code>padding(内边距)</code>、<code>margin(外边距)</code>、<code>border(边框)</code>。\",\n        \"元素的 <code>padding</code> 控制元素内容 <code>content</code>和元素边框 <code>border</code> 之间的距离。\",\n        \"在这儿，我们可以看到绿方块和红方块都位于黄方块之中，但是红方块比绿方块具有更大的 <code>padding</code>。\",\n        \"当你加大绿方块的 <code>padding</code>, 它将扩大元素内容和元素边框的距离。\",\n        \"任务：修改绿方块的 <code>padding</code> 以使它与红方块相匹配。\"\n      ],\n      \"challengeSeed\": [\n        \"<style>\",\n        \"  .injected-text {\",\n        \"    margin-bottom: -25px;\",\n        \"    text-align: center;\",\n        \"  }\",\n        \"\",\n        \"  .box {\",\n        \"    border-style: solid;\",\n        \"    border-color: black;\",\n        \"    border-width: 5px;\",\n        \"    text-align: center;\",\n        \"  }\",\n        \"\",\n        \"  .yellow-box {\",\n        \"    background-color: yellow;\",\n        \"    padding: 10px;\",\n        \"  }\",\n        \"  \",\n        \"  .red-box {\",\n        \"    background-color: red;\",\n        \"    padding: 20px;\",\n        \"  }\",\n        \"\",\n        \"  .green-box {\",\n        \"    background-color: green;\",\n        \"    padding: 10px;\",\n        \"  }\",\n        \"</style>\",\n        \"<h5 class=\\\"injected-text\\\">margin</h5>\",\n        \"\",\n        \"<div class=\\\"box yellow-box\\\">\",\n        \"  <h5 class=\\\"box red-box\\\">padding</h5>\",\n        \"  <h5 class=\\\"box green-box\\\">padding</h5>\",\n        \"</div>\"\n      ],\n      \"tests\": [\n        \"assert($(\\\".green-box\\\").css(\\\"padding-top\\\") === \\\"20px\\\", 'message: 你的 <code>green-box</code> class 应该为元素设置一个 <code>20px</code> 的 <code>padding</code>。');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 0\n    },\n    {\n      \"id\": \"bad87fee1348bd9aedf08822\",\n      \"title\": \"Adjust the Margin of an Element\",\n      \"description\": [\n        \"元素的外边距 <code>margin</code> 控制元素边框 <code>border</code> 和元素实际所占空间的距离。\",\n        \"在这儿，我们可以看到绿方块和红方块都位于黄方块之中，注意红方块比绿方块具有更大的外边距 <code>margin</code>，使得它看起来更小。\",\n        \"当你增大绿方块的 <code>margin</code> 时，将会增加元素边框和元素实际所占空间之间的距离。\",\n        \"修改绿方块的 <code>margin</code> 以使它与红方块匹配。\"\n      ],\n      \"challengeSeed\": [\n        \"<style>\",\n        \"  .injected-text {\",\n        \"    margin-bottom: -25px;\",\n        \"    text-align: center;\",\n        \"  }\",\n        \"\",\n        \"  .box {\",\n        \"    border-style: solid;\",\n        \"    border-color: black;\",\n        \"    border-width: 5px;\",\n        \"    text-align: center;\",\n        \"  }\",\n        \"\",\n        \"  .yellow-box {\",\n        \"    background-color: yellow;\",\n        \"    padding: 10px;\",\n        \"  }\",\n        \"  \",\n        \"  .red-box {\",\n        \"    background-color: red;\",\n        \"    padding: 20px;\",\n        \"    margin: 20px;\",\n        \"  }\",\n        \"\",\n        \"  .green-box {\",\n        \"    background-color: green;\",\n        \"    padding: 20px;\",\n        \"    margin: 10px;\",\n        \"  }\",\n        \"</style>\",\n        \"<h5 class=\\\"injected-text\\\">margin</h5>\",\n        \"\",\n        \"<div class=\\\"box yellow-box\\\">\",\n        \"  <h5 class=\\\"box red-box\\\">padding</h5>\",\n        \"  <h5 class=\\\"box green-box\\\">padding</h5>\",\n        \"</div>\"\n      ],\n      \"tests\": [\n        \"assert($(\\\".green-box\\\").css(\\\"margin-top\\\") === \\\"20px\\\", 'message: 你的 <code>green-box</code> class 应该使元素具有 <code>20px</code> 的 <code>margin</code>。');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 0\n    },\n    {\n      \"id\": \"bad87fee1348bd9aedf08823\",\n      \"title\": \"Add a Negative Margin to an Element\",\n      \"description\": [\n        \"元素的 <code>margin</code> 控制元素的 <code>border</code> 和元素实际所占空间的距离。\",\n        \"如果你将一个元素的 <code>margin</code> 设置为负值，元素将会变大。\",\n        \"具体可以看看红方块的 <code>margin</code> 值。\",\n        \"任务：把绿方块的 <code>margin</code> 设置为 <code>-15px</code>，以使它将父容器(黄方块)的横向宽度填满。\"\n      ],\n      \"challengeSeed\": [\n        \"<style>\",\n        \"  .injected-text {\",\n        \"    margin-bottom: -25px;\",\n        \"    text-align: center;\",\n        \"  }\",\n        \"\",\n        \"  .box {\",\n        \"    border-style: solid;\",\n        \"    border-color: black;\",\n        \"    border-width: 5px;\",\n        \"    text-align: center;\",\n        \"  }\",\n        \"\",\n        \"  .yellow-box {\",\n        \"    background-color: yellow;\",\n        \"    padding: 10px;\",\n        \"  }\",\n        \"  \",\n        \"  .red-box {\",\n        \"    background-color: red;\",\n        \"    padding: 20px;\",\n        \"    margin: -15px;\",\n        \"  }\",\n        \"\",\n        \"  .green-box {\",\n        \"    background-color: green;\",\n        \"    padding: 20px;\",\n        \"    margin: 20px;\",\n        \"  }\",\n        \"</style>\",\n        \"\",\n        \"<div class=\\\"box yellow-box\\\">\",\n        \"  <h5 class=\\\"box red-box\\\">padding</h5>\",\n        \"  <h5 class=\\\"box green-box\\\">padding</h5>\",\n        \"</div>\"\n      ],\n      \"tests\": [\n        \"assert($(\\\".green-box\\\").css(\\\"margin-top\\\") === \\\"-15px\\\", 'message: 你的 <code>green-box</code> 类选择器的 <code>margin</code>应该为 <code>-15px</code>。');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 0\n    },\n    {\n      \"id\": \"bad87fee1348bd9aedf08824\",\n      \"title\": \"Add Different Padding to Each Side of an Element\",\n      \"description\": [\n        \"有时你想要自定义元素，使它的每一个边具有不同的 <code>padding</code>。\",\n        \"CSS 允许你使用 <code>padding-top</code>、<code>padding-right</code>、<code>padding-bottom</code> 和 <code>padding-left</code>来控制元素上右下左四个方向的 <code>padding</code>。\",\n        \"使你的绿方块的顶部和左侧具有 <code>40px</code> 的 <code>padding</code>，而底部和右侧则是 <code>20px</code>。\"\n      ],\n      \"challengeSeed\": [\n        \"<style>\",\n        \"  .injected-text {\",\n        \"    margin-bottom: -25px;\",\n        \"    text-align: center;\",\n        \"  }\",\n        \"\",\n        \"  .box {\",\n        \"    border-style: solid;\",\n        \"    border-color: black;\",\n        \"    border-width: 5px;\",\n        \"    text-align: center;\",\n        \"  }\",\n        \"\",\n        \"  .yellow-box {\",\n        \"    background-color: yellow;\",\n        \"    padding: 10px;\",\n        \"  }\",\n        \"  \",\n        \"  .red-box {\",\n        \"    background-color: red;\",\n        \"    padding-top: 40px;\",\n        \"    padding-right: 20px;\",\n        \"    padding-bottom: 20px;\",\n        \"    padding-left: 40px;\",\n        \"  }\",\n        \"\",\n        \"  .green-box {\",\n        \"    background-color: green;\",\n        \"  }\",\n        \"</style>\",\n        \"<h5 class=\\\"injected-text\\\">margin</h5>\",\n        \"\",\n        \"<div class=\\\"box yellow-box\\\">\",\n        \"  <h5 class=\\\"box red-box\\\">padding</h5>\",\n        \"  <h5 class=\\\"box green-box\\\">padding</h5>\",\n        \"</div>\"\n      ],\n      \"tests\": [\n        \"assert($(\\\".green-box\\\").css(\\\"padding-top\\\") === \\\"40px\\\", 'message: 你的 <code>green-box</code> class 应该为元素的顶部设置 <code>40px</code> 的 <code>padding</code>。');\",\n        \"assert($(\\\".green-box\\\").css(\\\"padding-left\\\") === \\\"40px\\\", 'message: 你的 <code>green-box</code> class 应该为元素的左侧设置 <code>40px</code> 的 <code>padding</code>。');\",\n        \"assert($(\\\".green-box\\\").css(\\\"padding-right\\\") === \\\"20px\\\", 'message: 你的 <code>green-box</code> class 应该为元素的右侧设置 <code>20px</code> 的 <code>padding</code>。');\",\n        \"assert($(\\\".green-box\\\").css(\\\"padding-bottom\\\") === \\\"20px\\\", 'message: 你的 <code>green-box</code> class 应该为元素的底部设置 <code>20px</code> 的 <code>padding</code>。');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 0\n    },\n    {\n      \"id\": \"bad87fee1248bd9aedf08824\",\n      \"title\": \"Add Different Margins to Each Side of an Element\",\n      \"description\": [\n        \"有时你想要自定义元素，使它的每一个边具有不同的 <code>margin</code>。\",\n        \"CSS 允许你使用 <code>margin-top</code>、<code>margin-right</code>、<code>margin-bottom</code> 和 <code>margin-left</code> 来控制元素上右下左四个方向的 <code>margin</code>。\",\n        \"使你的绿方块的顶部和左侧具有 <code>40px</code> 的 <code>margin</code>，而底部和右侧则是 <code>20px</code>。\"\n      ],\n      \"challengeSeed\": [\n        \"<style>\",\n        \"  .injected-text {\",\n        \"    margin-bottom: -25px;\",\n        \"    text-align: center;\",\n        \"  }\",\n        \"\",\n        \"  .box {\",\n        \"    border-style: solid;\",\n        \"    border-color: black;\",\n        \"    border-width: 5px;\",\n        \"    text-align: center;\",\n        \"  }\",\n        \"\",\n        \"  .yellow-box {\",\n        \"    background-color: yellow;\",\n        \"    padding: 10px;\",\n        \"  }\",\n        \"  \",\n        \"  .red-box {\",\n        \"    background-color: red;\",\n        \"    margin-top: 40px;\",\n        \"    margin-right: 20px;\",\n        \"    margin-bottom: 20px;\",\n        \"    margin-left: 40px;\",\n        \"  }\",\n        \"\",\n        \"  .green-box {\",\n        \"    background-color: green;\",\n        \"  }\",\n        \"</style>\",\n        \"<h5 class=\\\"injected-text\\\">margin</h5>\",\n        \"\",\n        \"<div class=\\\"box yellow-box\\\">\",\n        \"  <h5 class=\\\"box red-box\\\">padding</h5>\",\n        \"  <h5 class=\\\"box green-box\\\">padding</h5>\",\n        \"</div>\"\n      ],\n      \"tests\": [\n        \"assert($(\\\".green-box\\\").css(\\\"margin-top\\\") === \\\"40px\\\", 'message: 你的 <code>green-box</code> class 应该为元素的顶部设置 <code>40px</code> 的 <code>margin</code>。');\",\n        \"assert($(\\\".green-box\\\").css(\\\"margin-left\\\") === \\\"40px\\\", 'message: 你的 <code>green-box</code> class 应该为元素的左侧设置 <code>40px</code> 的 <code>margin</code>。');\",\n        \"assert($(\\\".green-box\\\").css(\\\"margin-right\\\") === \\\"20px\\\", 'message: 你的 <code>green-box</code> class 应该为元素的右侧设置 <code>20px</code> 的 <code>margin</code>。');\",\n        \"assert($(\\\".green-box\\\").css(\\\"margin-bottom\\\") === \\\"20px\\\", 'message: 你的 <code>green-box</code> class 应该为元素的底部设置 <code>20px</code> 的 <code>margin</code>。');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 0\n    },\n    {\n      \"id\": \"bad87fee1348bd9aedf08826\",\n      \"title\": \"Use Clockwise Notation to Specify the Padding of an Element\",\n      \"description\": [\n        \"除了分别指定元素的 <code>padding-top</code>、<code>padding-right</code>、<code>padding-bottom</code> 和 <code>padding-left</code> 属性外，你还可以集中起来指定它们，举例如下：\",\n        \"<code>padding: 10px 20px 10px 20px;</code>\",\n        \"这四个值以顺时针方式排列：顶部、右侧、底部、左侧，简称：上右下左。\",\n        \"使用顺时针方式设置 \\\".green-box\\\" class，使其顶部和左侧具有 <code>40px</code> 的 <code>padding</code>，而底部和右侧具有 <code>20px</code> 的 <code>padding</code>。\"\n      ],\n      \"challengeSeed\": [\n        \"<style>\",\n        \"  .injected-text {\",\n        \"    margin-bottom: -25px;\",\n        \"    text-align: center;\",\n        \"  }\",\n        \"\",\n        \"  .box {\",\n        \"    border-style: solid;\",\n        \"    border-color: black;\",\n        \"    border-width: 5px;\",\n        \"    text-align: center;\",\n        \"  }\",\n        \"\",\n        \"  .yellow-box {\",\n        \"    background-color: yellow;\",\n        \"    padding: 20px 40px 20px 40px;\",\n        \"  }\",\n        \"  \",\n        \"  .red-box {\",\n        \"    background-color: red;\",\n        \"    padding: 20px 40px 20px 40px;\",\n        \"  }\",\n        \"\",\n        \"  .green-box {\",\n        \"    background-color: green;\",\n        \"  }\",\n        \"</style>\",\n        \"<h5 class=\\\"injected-text\\\">margin</h5>\",\n        \"\",\n        \"<div class=\\\"box yellow-box\\\">\",\n        \"  <h5 class=\\\"box red-box\\\">padding</h5>\",\n        \"  <h5 class=\\\"box green-box\\\">padding</h5>\",\n        \"</div>\"\n      ],\n      \"tests\": [\n        \"assert($(\\\".green-box\\\").css(\\\"padding-top\\\") === \\\"40px\\\", 'message: 你的 <code>green-box</code> class 应该为元素的顶部设置 <code>40px</code> 的 <code>padding</code>。');\",\n        \"assert($(\\\".green-box\\\").css(\\\"padding-right\\\") === \\\"20px\\\", 'message: 你的 <code>green-box</code> class 应该为元素的右侧设置 <code>20px</code> 的 <code>padding</code>。');\",\n        \"assert($(\\\".green-box\\\").css(\\\"padding-bottom\\\") === \\\"20px\\\", 'message: 你的 <code>green-box</code> class 应该为元素的底部设置 <code>20px</code> 的 <code>padding</code>。');\",\n        \"assert($(\\\".green-box\\\").css(\\\"padding-left\\\") === \\\"40px\\\", 'message: 你的 <code>green-box</code> class 应该为元素的左侧设置 <code>40px</code> 的 <code>padding</code>。');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 0\n    },\n    {\n      \"id\": \"bad87fee1348bd9afdf08726\",\n      \"title\": \"Use Clockwise Notation to Specify the Margin of an Element\",\n      \"description\": [\n        \"让我们再试一次，但这次是用于 <code>margin</code>。\",\n        \"除了分别指定元素的 <code>margin-top</code>、<code>margin-right</code>、<code>margin-bottom</code> 和 <code>margin-left</code> 属性外，你还可以集中起来指定它们，举例如下：\",\n        \"<code>margin: 10px 20px 10px 20px;</code>\",\n        \"这四个值以顺时针方式排列：顶部、右侧、底部、左侧，简称：上右下左。\",\n        \"使用<code>顺时针表示法</code>设置含有 \\\".green-box\\\" class 的元素，使其顶部和左侧具有 <code>40px</code> 的 <code>margin</code>，而底部和右侧具有 <code>20px</code> 的 <code>margin</code>。\"\n      ],\n      \"challengeSeed\": [\n        \"<style>\",\n        \"  .injected-text {\",\n        \"    margin-bottom: -25px;\",\n        \"    text-align: center;\",\n        \"  }\",\n        \"\",\n        \"  .box {\",\n        \"    border-style: solid;\",\n        \"    border-color: black;\",\n        \"    border-width: 5px;\",\n        \"    text-align: center;\",\n        \"  }\",\n        \"\",\n        \"  .yellow-box {\",\n        \"    background-color: yellow;\",\n        \"    padding: 20px 40px 20px 40px;\",\n        \"  }\",\n        \"  \",\n        \"  .red-box {\",\n        \"    background-color: red;\",\n        \"    margin: 20px 40px 20px 40px;\",\n        \"  }\",\n        \"\",\n        \"  .green-box {\",\n        \"    background-color: green;\",\n        \"  }\",\n        \"</style>\",\n        \"<h5 class=\\\"injected-text\\\">margin</h5>\",\n        \"\",\n        \"<div class=\\\"box yellow-box\\\">\",\n        \"  <h5 class=\\\"box red-box\\\">padding</h5>\",\n        \"  <h5 class=\\\"box green-box\\\">padding</h5>\",\n        \"</div>\"\n      ],\n      \"tests\": [\n        \"assert($(\\\".green-box\\\").css(\\\"margin-top\\\") === \\\"40px\\\", 'message: 你的 <code>green-box</code> class 应该为元素的顶部设置 <code>40px</code> 的 <code>margin</code>。');\",\n        \"assert($(\\\".green-box\\\").css(\\\"margin-right\\\") === \\\"20px\\\", 'message: 你的 <code>green-box</code> class 应该为元素的右侧设置 <code>20px</code> 的 <code>margin</code>。');\",\n        \"assert($(\\\".green-box\\\").css(\\\"margin-bottom\\\") === \\\"20px\\\", 'message: 你的 <code>green-box</code> class 应该为元素的底部设置 <code>20px</code> 的 <code>margin</code>。');\",\n        \"assert($(\\\".green-box\\\").css(\\\"margin-left\\\") === \\\"40px\\\", 'message: 你的 <code>green-box</code> class 应该为元素的左侧设置 <code>40px</code> 的 <code>margin</code>。');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 0\n    },\n    {\n      \"id\": \"bad87fee1348bd9aedf08736\",\n      \"title\": \"Style the HTML Body Element\",\n      \"description\": [\n        \"现在让我们来一个全新的开始，讲一讲 CSS 继承。\",\n        \"每一个 HTML 页面都有一个 <code>body</code> 元素。\",\n        \"通过将其 <code>background-color</code> 设置为黑色，我们可以证明 <code>body</code> 元素的存在。\",\n        \"我们可以通过将下面的代码添加到我们的 <code>style</code> 元素来做到这一点：\",\n        \"<blockquote>body {<br>&nbsp;&nbsp;background-color: black;<br>}</blockquote>\"\n      ],\n      \"challengeSeed\": [\n        \"<style>\",\n        \"\",\n        \"</style>\"\n      ],\n      \"tests\": [\n        \"assert($(\\\"body\\\").css(\\\"background-color\\\") === \\\"rgb(0, 0, 0)\\\", 'message: 将你的 <code>body</code> 元素的 <code>background-color</code> 设置为 black。');\",\n        \"assert(code.match(/<style>\\\\s*body\\\\s*\\\\{\\\\s*background.*\\\\s*:\\\\s*.*;?\\\\s*\\\\}\\\\s*<\\\\/style>/i), 'message: 确保你的 CSS 规则是正确的格式，具有开始和结束的花括号。');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 0\n    },\n    {\n      \"id\": \"bad87fee1348bd9aedf08746\",\n      \"title\": \"Inherit Styles from the Body Element\",\n      \"description\": [\n        \"现在我们证明了每一个 HTML 页面都有一个 <code>body</code> 元素，并且其 <code>body</code> 元素同样能够应用样式。\",\n        \"记住，你可以像对其他 HTML 元素一样对你的 <code>body</code> 元素应用样式，并且所有其他元素将继承你的 <code>body</code> 元素的样式。\",\n        \"首先，创建一个文字为 <code>Hello World</code> 的 <code>h1</code> 元素。\",\n        \"然后，让我们通过向 <code>body</code> 元素的样式声明部分添加 <code>color: green;</code> 使页面上的所有元素的颜色为 <code>green</code>。\",\n        \"最后，通过向 <code>body</code> 元素的样式声明部分添加 <code>font-family: Monospace;</code> 将 <code>body</code> 元素的 font-family（字体）设置为 <code>Monospace</code>。\"\n      ],\n      \"challengeSeed\": [\n        \"<style>\",\n        \"  body {\",\n        \"    background-color: black;\",\n        \"  }\",\n        \"\",\n        \"</style>\"\n      ],\n      \"tests\": [\n        \"assert(($(\\\"h1\\\").length > 0), 'message: 创建一个 <code>h1</code> 元素。');\",\n        \"assert(($(\\\"h1\\\").length > 0 && $(\\\"h1\\\").text().match(/hello world/i)), 'message: 你的 <code>h1</code> 元素的文字应该是 <code>Hello World</code>。');\",\n        \"assert(code.match(/<\\\\/h1>/g) && code.match(/<h1/g) && code.match(/<\\\\/h1>/g).length === code.match(/<h1/g).length, 'message: 确保你的 <code>h1</code> 元素有一个结束标记。');\",\n        \"assert(($(\\\"body\\\").css(\\\"color\\\") === \\\"rgb(0, 128, 0)\\\"), 'message: 设置 <code>body</code> 元素的 <code>color</code> 属性为 <code>green</code>。');\",\n        \"assert(($(\\\"body\\\").css(\\\"font-family\\\").match(/Monospace/i)), 'message: 设置 <code>body</code> 元素的 <code>font-family</code> 属性为 <code>Monospace</code>。');\",\n        \"assert(($(\\\"h1\\\").length > 0 && $(\\\"h1\\\").css(\\\"font-family\\\").match(/monospace/i)), 'message: 你的 <code>h1</code> 元素应该从 <code>body</code> 元素继承字体 <code>Monospace</code>。');\",\n        \"assert(($(\\\"h1\\\").length > 0 && $(\\\"h1\\\").css(\\\"color\\\") === \\\"rgb(0, 128, 0)\\\"), 'message: 你的 <code>h1</code> 元素应该从 <code>body</code> 元素继承绿色。');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 0\n    },\n    {\n      \"id\": \"bad87fee1348bd9aedf08756\",\n      \"title\": \"Prioritize One Style Over Another\",\n      \"description\": [\n        \"有时你的 HTML 元素会得到相互冲突的多个样式。\",\n        \"例如，你的 <code>h1</code> 元素不能同时为绿色和粉色。\",\n        \"让我们来看看当我们创建一个使其文字为粉色的 class 时会发生什么，然后将其应用到某元素。我们的 class 会 <code>override（覆盖）</code> <code>body</code> 元素的 <code>color: green;</code> CSS 属性吗？\",\n        \"创建一个使元素颜色成为粉色的名为 <code>pink-text</code> 的 CSS class。\",\n        \"设置 <code>h1</code> 元素的 class 为 <code>pink-text</code>。\"\n      ],\n      \"challengeSeed\": [\n        \"<style>\",\n        \"  body {\",\n        \"    background-color: black;\",\n        \"    font-family: Monospace;\",\n        \"    color: green;\",\n        \"  }\",\n        \"</style>\",\n        \"<h1>Hello World!</h1>\"\n      ],\n      \"tests\": [\n        \"assert($(\\\"h1\\\").hasClass(\\\"pink-text\\\"), 'message: 你的 <code>h1</code> 元素应该包含名为 <code>pink-text</code> 的 class。');\",\n        \"assert(code.match(/\\\\.pink-text\\\\s*\\\\{\\\\s*color\\\\s*:\\\\s*pink\\\\s*;\\\\s*\\\\}/g), 'message: 你的 <code>&#60;style&#62;</code> 包含一个将 color 设置为 pink 的 <code>pink-text</code> CSS class。');\",\n        \"assert($(\\\"h1\\\").css(\\\"color\\\") === \\\"rgb(255, 192, 203)\\\", 'message: 你的 <code>h1</code> 元素应该为粉色。');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 0\n    },\n    {\n      \"id\": \"bad87fee1348bd9aedf04756\",\n      \"title\": \"Override Styles in Subsequent CSS\",\n      \"description\": [\n        \"我们的 \\\"pink-text\\\" class 覆盖了 <code>body</code> 元素的 CSS 声明！\",\n        \"我们刚刚证明了我们的 class 会覆盖 <code>body</code> 元素的 CSS，那么下一个合乎情理的问题就是，我们怎样才能覆盖我们的 <code>pink-text</code> class 呢？\",\n        \"再创建一个把元素设置为蓝色的名为 <code>blue-text</code> 的 CSS class，确保它在你的 <code>pink-text</code> class 声明的下面。\",\n        \"除了 <code>pink-text</code> class 之外，再把 <code>blue-text</code> class 应用到你的 <code>h1</code> 元素，让我们来看看谁会赢。\",\n        \"如下例，通过用空格分隔多个 class 属性，可对 HTML 元素应用多个 class 属性：\",\n        \"<code>class=\\\"class1 class2\\\"</code>\",\n        \"注意：在 HTML 中这些 class 如何排序是无所谓的。\",\n        \"然而，在 <code>&#60;style&#62;</code> 部分中 <code>class</code> 声明的顺序却非常重要，第二个声明总是比第一个具有优先权。因为 <code>.blue-text</code> 是第二个声明，它覆盖了 <code>.pink-text</code> 属性。\"\n      ],\n      \"challengeSeed\": [\n        \"<style>\",\n        \"  body {\",\n        \"    background-color: black;\",\n        \"    font-family: Monospace;\",\n        \"    color: green;\",\n        \"  }\",\n        \"  .pink-text {\",\n        \"    color: pink;\",\n        \"  }\",\n        \"</style>\",\n        \"<h1 class=\\\"pink-text\\\">Hello World!</h1>\"\n      ],\n      \"tests\": [\n        \"assert($(\\\"h1\\\").hasClass(\\\"pink-text\\\"), 'message: 你的 <code>h1</code> 元素应该包含 <code>pink-text</code> class。');\",\n        \"assert($(\\\"h1\\\").hasClass(\\\"blue-text\\\"), 'message: 你的 <code>h1</code> 元素应该包含 <code>blue-text</code> class。');\",\n        \"assert($(\\\".pink-text\\\").hasClass(\\\"blue-text\\\"), 'message: <code>blue-text</code> 和 <code>pink-text</code> 都应该属于同一个 <code>h1</code> 元素。');\",\n        \"assert($(\\\"h1\\\").css(\\\"color\\\") === \\\"rgb(0, 0, 255)\\\", 'message: 你的 <code>h1</code> 元素应该是蓝色的。');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 0\n    },\n    {\n      \"id\": \"bad87fee1348bd8aedf06756\",\n      \"title\": \"Override Class Declarations by Styling ID Attributes\",\n      \"description\": [\n        \"我们刚刚证明了浏览器读取 CSS 的顺序是从上到下，这意味着，在发生冲突时，浏览器会使用最后的 CSS 声明。\",\n        \"但是并非只有这些，还有其他覆盖 CSS 的方法。你还记得 id 属性吗？\",\n        \"让我们来覆盖你的 <code>pink-text</code> 和 <code>blue-text</code> 两个 class，通过为 <code>h1</code> 元素添加 id 并设置 id 的样式，使你的 <code>h1</code> 元素变成 orange（橙色）。\",\n        \"给你的 <code>h1</code> 元素添加名为 <code>orange-text</code> 的 <code>id</code> 属性。记住，id 样式看起来是这样的：\",\n        \"<code>&#60;h1 id=\\\"orange-text\\\"&#62;</code>\",\n        \"在你的 <code>h1</code> 元素中保留 <code>blue-text</code> 和 <code>pink-text</code> 两个 class。\",\n        \"在你的 <code>style</code> 元素中为你的 <code>orange-text</code> id 创建一个 CSS 声明，就像下面例子中的样子：\",\n        \"<blockquote>#brown-text {<br>&nbsp;&nbsp;color: brown;<br>}</blockquote>\",\n        \"注意：你声明的这个 CSS 在 <code>pink-text</code>类选择器的上面还是下面是无所谓的，因为 id 属性总是具有更高的优先级。\"\n      ],\n      \"challengeSeed\": [\n        \"<style>\",\n        \"  body {\",\n        \"    background-color: black;\",\n        \"    font-family: Monospace;\",\n        \"    color: green;\",\n        \"  }\",\n        \"  .pink-text {\",\n        \"    color: pink;\",\n        \"  }\",\n        \"  .blue-text {\",\n        \"    color: blue;\",\n        \"  }\",\n        \"</style>\",\n        \"<h1 class=\\\"pink-text blue-text\\\">Hello World!</h1>\"\n      ],\n      \"tests\": [\n        \"assert($(\\\"h1\\\").hasClass(\\\"pink-text\\\"), 'message: 你的 <code>h1</code> 元素应该包含 <code>pink-text</code> class。');\",\n        \"assert($(\\\"h1\\\").hasClass(\\\"blue-text\\\"), 'message: 你的 <code>h1</code> 元素应该包含 <code>blue-text</code> class。');\",\n        \"assert($(\\\"h1\\\").attr(\\\"id\\\") === \\\"orange-text\\\", 'message: 为你的 <code>h1</code> 元素添加 <code>orange-text</code> id。');\",\n        \"assert(code.match(/#orange-text\\\\s*{/gi), 'message: 为你的 <code>orange-text</code> id 创建一个 CSS 声明。');\",\n        \"assert(!code.match(/<h1.*style.*>/gi), 'message: 不要为你的 <code>h1</code> 添加任何 <code>style</code> 属性。');\",\n        \"assert($(\\\"h1\\\").css(\\\"color\\\") === \\\"rgb(255, 165, 0)\\\", 'message: 你的 <code>h1</code> 元素应该是橙色的。');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 0\n    },\n    {\n      \"id\": \"bad87fee1348bd9aedf06756\",\n      \"title\": \"Override Class Declarations with Inline Styles\",\n      \"description\": [\n        \"我们证明了无论在 <code>style</code> 元素 CSS 的哪个位置进行声明，id 声明都会覆盖 class 声明。\",\n        \"还有其他覆盖 CSS 的方法。你还记得行内样式吗？\",\n        \"试着用 <code>in-line style（行内样式）</code> 使 <code>h1</code> 元素变为白色。记住，行内样式看起来是这样的：\",\n        \"<code>&#60;h1 style=\\\"color: green\\\"&#62;</code>\",\n        \"保留 <code>h1</code> 元素中的 <code>blue-text</code> 和 <code>pink-text</code> 两个 class。\"\n      ],\n      \"challengeSeed\": [\n        \"<style>\",\n        \"  body {\",\n        \"    background-color: black;\",\n        \"    font-family: Monospace;\",\n        \"    color: green;\",\n        \"  }\",\n        \"  #orange-text {\",\n        \"    color: orange;\",\n        \"  }\",\n        \"  .pink-text {\",\n        \"    color: pink;\",\n        \"  }\",\n        \"  .blue-text {\",\n        \"    color: blue;\",\n        \"  }\",\n        \"</style>\",\n        \"<h1 id=\\\"orange-text\\\" class=\\\"pink-text blue-text\\\">Hello World!</h1>\"\n      ],\n      \"tests\": [\n        \"assert($(\\\"h1\\\").hasClass(\\\"pink-text\\\"), 'message: 你的 <code>h1</code> 元素应该包含 <code>pink-text</code> class。');\",\n        \"assert($(\\\"h1\\\").hasClass(\\\"blue-text\\\"), 'message: 你的 <code>h1</code> 元素应该包含 <code>blue-text</code> class。');\",\n        \"assert($(\\\"h1\\\").attr(\\\"id\\\") === \\\"orange-text\\\", 'message: 你的 <code>h1</code> 元素应该包含 <code>orange-text</code> id。');\",\n        \"assert(code.match(/<h1[\\\\s\\\\S]*?style/gi) && code.match(/<h1[\\\\s\\\\S]*?style[\\\\s\\\\S]*?color\\\\s*?:/gi), 'message: 给你的 <code>h1</code> 元素添加行内样式 <code>color&#58; white</code>。');\",\n        \"assert($(\\\"h1\\\").css(\\\"color\\\") === \\\"rgb(255, 255, 255)\\\", 'message: 你的 <code>h1</code> 元素应该是白色的。');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 0\n    },\n    {\n      \"id\": \"bad87fee1348bd9aedf07756\",\n      \"title\": \"Override All Other Styles by using Important\",\n      \"description\": [\n        \"耶！我们刚刚证明了行内样式将覆盖<code>style</code> 中定义的所有 CSS。\",\n        \"但是等一下，还有最后一种覆盖 CSS 的方法，这是所有方法中最强大的，但是在讲它之前，我们先讲讲为什么你要覆盖 CSS。\",\n        \"很多情况下，你会使用 CSS 库，这些库可能会意外覆盖掉你自己的 CSS。所以当你需要确保某元素具有指定的 CSS 时，你可以使用 <code>!important</code>。\",\n        \"让我们再回到我们的 <code>pink-text</code> class 声明。还记得不？我们的 <code>pink-text</code> class 被随后的 class 声明、id 声明和行内样式所覆盖了。\",\n        \"让我们来给 pink-text 元素的 color 声明加上关键字 <code>!important</code>，以便 100% 确保你的 <code>h1</code> 元素是粉色的。\",\n        \"举例如下：\",\n        \"<code>color: pink !important;</code>\"\n      ],\n      \"challengeSeed\": [\n        \"<style>\",\n        \"  body {\",\n        \"    background-color: black;\",\n        \"    font-family: Monospace;\",\n        \"    color: green;\",\n        \"  }\",\n        \"  #orange-text {\",\n        \"    color: orange;\",\n        \"  }\",\n        \"  .pink-text {\",\n        \"    color: pink;\",\n        \"  }\",\n        \"  .blue-text {\",\n        \"    color: blue;\",\n        \"  }\",\n        \"</style>\",\n        \"<h1 id=\\\"orange-text\\\" class=\\\"pink-text blue-text\\\" style=\\\"color: white\\\">Hello World!</h1>\"\n      ],\n      \"tests\": [\n        \"assert($(\\\"h1\\\").hasClass(\\\"pink-text\\\"), 'message: 你的 <code>h1</code> 元素应该包含 class <code>pink-text</code>。');\",\n        \"assert($(\\\"h1\\\").hasClass(\\\"blue-text\\\"), 'message: 你的 <code>h1</code> 元素应该包含 class <code>blue-text</code>。');\",\n        \"assert($(\\\"h1\\\").attr(\\\"id\\\") === \\\"orange-text\\\", 'message: 你的 <code>h1</code> 元素应该包含 id <code>orange-text</code>。');\",\n        \"assert(code.match(/<h1.*style/gi) && code.match(/<h1.*style.*color\\\\s*?:/gi), 'message: 你的 <code>h1</code> 元素应该包含行内样式 <code>color&#58; white</code>。');\",\n        \"assert(code.match(/pink.*\\\\!important;/gi), 'message: 你的 <code>pink-text</code> class 应该包含 <code>!important</code> 关键字以覆盖所有其它的声明。');\",\n        \"assert($(\\\"h1\\\").css(\\\"color\\\") === \\\"rgb(255, 192, 203)\\\", 'message: 你的 <code>h1</code> 元素应该是粉色的。');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 0\n    },\n    {\n      \"id\": \"bad87fee1348bd9aedf08726\",\n      \"title\": \"Use Hex Code for Specific Colors\",\n      \"description\": [\n        \"你是否知道在 CSS 中还有其他表示颜色的方法？其中的一种方法称作 hexadecimal code（十六进制编码），简写为 <code>hex code</code>。\",\n        \"我们通常使用 <code>decimals</code>，也就是十进制数字，它对每一位数字使用符号0到9来表示。<code>Hexadecimals</code> （或 <code>hex</code>）是十六进制数字，这意味着它使用十六个不同的符号。像十进制那样，符号 0-9 代表数值零到九，再使用 A、B、C、D、E、F 代表数值十到十五。合在一起，用 0 到 F 可以代表 <code>hexadecimal</code> 中的每一位数字，共为我们提供 16 个可能的数值。你可以在 <a target='_blank' href='https://en.wikipedia.org/wiki/Hexadecimal'>这儿</a> 找到更多关于十六进制数字的信息。\",\n        \"在 CSS 中，我们可以使用 6 位十六进制数字来表示颜色，每 2 位分别表示红色 (R)、绿色 (G) 和蓝色 (B) 成分。例如，<code>#000000</code> 是黑色，同时也是可能的数值中最小的。你可以在 <a target='_blank' href='https://en.wikipedia.org/wiki/RGB_color_model'>这儿</a> 找到更多关于 RGB 颜色系统的信息。\",\n        \"把 <code>body</code> 元素的 background-color 由 <code>black</code> 替换成其 <code>hex code</code> 表示，即<code>#000000</code>。\"\n      ],\n      \"challengeSeed\": [\n        \"<style>\",\n        \"  body {\",\n        \"    background-color: black;\",\n        \"  }\",\n        \"</style>\"\n      ],\n      \"tests\": [\n        \"assert($(\\\"body\\\").css(\\\"background-color\\\") === \\\"rgb(0, 0, 0)\\\", 'message: 使你的 <code>body</code> 元素的背景为黑色。');\",\n        \"assert(code.match(/body\\\\s*{(([\\\\s\\\\S]*;\\\\s*?)|\\\\s*?)background.*\\\\s*:\\\\s*?#000(000)?((\\\\s*})|(;[\\\\s\\\\S]*?}))/gi), 'message: 使用 <code>hex code</code> 来表示黑色而不是用单词 <code>black</code>，例如 <code>body { color&#58; #000000; }</code>。');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 0\n    },\n    {\n      \"id\": \"bad87fee1348bd9aedf08725\",\n      \"title\": \"Use Hex Code to Color Elements White\",\n      \"description\": [\n        \"<code>0</code> 是 hex code（十六进制编码）中最小的一个，它代表颜色的完全缺失。\",\n        \"<code>F</code> 是 hex code（十六进制编码）中最大的一个，它代表最大可能的亮度。\",\n        \"让我们通过把 background-color 的 hex code 修改为 <code>#FFFFFF</code>，以把 <code>body</code> 元素的背景改为白色。\"\n      ],\n      \"challengeSeed\": [\n        \"<style>\",\n        \"  body {\",\n        \"    background-color: #000000;\",\n        \"  }\",\n        \"</style>\"\n      ],\n      \"tests\": [\n        \"assert($(\\\"body\\\").css(\\\"background-color\\\") === \\\"rgb(255, 255, 255)\\\", 'message: 你的 <code>body</code> 元素的 <code>background-color</code> 应该是白色的。');\",\n        \"assert(code.match(/body\\\\s*{(([\\\\s\\\\S]*;\\\\s*?)|\\\\s*?)background.*\\\\s*:\\\\s*?#FFF(FFF)?((\\\\s*})|(;[\\\\s\\\\S]*?}))/gi), 'message: 使用 <code>hex code</code> 表示白色而不是使用单词 <code>white</code>，例如 <code>body { color&#58; #FFFFFF; }</code>。');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 0\n    },\n    {\n      \"id\": \"bad87fee1348bd9aedf08724\",\n      \"title\": \"Use Hex Code to Color Elements Red\",\n      \"description\": [\n        \"你可能会疑惑为什么我们使用6位数来表示一种颜色而不是只用一位或二位，答案是使用6位数可提供给我们巨大数量的颜色变化。\",\n        \"会有多少种可能的颜色？16 个值和 6 个位置意味着我们有 16 的 6 次方，或者说超过 1600 万种可能的颜色。\",\n        \"Hex code 遵循 red-green-blue（红-绿-蓝），或者叫 <code>rgb</code> 格式。hex code 中的前两位表示颜色中红色的数量，第三四位代表绿色的数量，第五六位代表蓝色的数量。\",\n        \"所以要得到绝对的纯红色，你只需要在第一和第二位使用 <code>F</code> （最大可能的数值），且在第三、第四、第五和第六位使用 <code>0</code> （最小可能数值）。\",\n        \"通过对 background-color 应用 hex code 值 <code>#FF0000</code> 以把 <code>body</code> 元素的背景色设置为红色。\"\n      ],\n      \"challengeSeed\": [\n        \"<style>\",\n        \"  body {\",\n        \"    background-color: #FFFFFF;\",\n        \"  }\",\n        \"</style>\"\n      ],\n      \"tests\": [\n        \"assert($(\\\"body\\\").css(\\\"background-color\\\") === \\\"rgb(255, 0, 0)\\\", 'message: 把你的 <code>body</code> 元素的 <code>background-color</code> 设置为红色。');\",\n        \"assert(code.match(/body\\\\s*{(([\\\\s\\\\S]*;\\\\s*?)|\\\\s*?)background.*\\\\s*:\\\\s*?#((F00)|(FF0000))((\\\\s*})|(;[\\\\s\\\\S]*?}))/gi), 'message: 使用 <code>hex code</code> 而不是单词 <code>red</code> 表示红色，例如 <code>body { color&#58; #FF0000; }</code>。');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 0\n    },\n    {\n      \"id\": \"bad87fee1348bd9aedf08723\",\n      \"title\": \"Use Hex Code to Color Elements Green\",\n      \"description\": [\n        \"记住 <code>hex code</code> 遵循 red-green-blue（红-绿-蓝），或称为 <code>rgb</code> 格式。hex code 中的前两位表示颜色中红色的数量，第三四位代表绿色的数量，第五六位代表蓝色的数量。\",\n        \"所以要得到绝对的纯绿色，你只需要在第三和第四位使用 <code>F</code> （最大可能的数值），且在其它位使用 <code>0</code> （最小可能数值）。\",\n        \"通过对 background-color 应用 hex code 值 <code>#00FF00</code> 以把 <code>body</code> 元素的背景色设置为绿色。\"\n      ],\n      \"challengeSeed\": [\n        \"<style>\",\n        \"  body {\",\n        \"    background-color: #FF0000;\",\n        \"  }\",\n        \"</style>\"\n      ],\n      \"tests\": [\n        \"assert($(\\\"body\\\").css(\\\"background-color\\\") === \\\"rgb(0, 255, 0)\\\", 'message: 把你的 <code>body</code> 元素的 <code>background-color</code> 设置为绿色。');\",\n        \"assert(code.match(/body\\\\s*{(([\\\\s\\\\S]*;\\\\s*?)|\\\\s*?)background.*\\\\s*:\\\\s*?#((0F0)|(00FF00))((\\\\s*})|(;[\\\\s\\\\S]*?}))/gi), 'message: 使用 <code>hex code</code> 而不是单词 <code>green</code> 来表示绿色，例如 <code>body { color&#58; #00FF00; }</code>。');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 0\n    },\n    {\n      \"id\": \"bad87fee1348bd9aedf08722\",\n      \"title\": \"Use Hex Code to Color Elements Blue\",\n      \"description\": [\n        \"<code>hex code</code> 遵循 red-green-blue（红-绿-蓝），或称为 <code>rgb</code> 格式。hex code 中的前两位表示颜色中红色的数量，第三四位代表绿色的数量，第五六位代表蓝色的数量。\",\n        \"所以要得到绝对的纯蓝色，你只需要在第五和第六位使用 <code>F</code> （最大可能的数值），且在其它位使用 <code>0</code> （最小可能数值）。\",\n        \"通过对 background-color 应用 hex code 值 <code>#0000FF</code> 以把 <code>body</code> 元素的背景色设置为蓝色。\"\n      ],\n      \"challengeSeed\": [\n        \"<style>\",\n        \"  body {\",\n        \"    background-color: #00FF00;\",\n        \"  }\",\n        \"</style>\"\n      ],\n      \"tests\": [\n        \"assert($(\\\"body\\\").css(\\\"background-color\\\") === \\\"rgb(0, 0, 255)\\\", 'message: 把你的 <code>body</code> 元素的 <code>background-color</code> 设置为蓝色。');\",\n        \"assert(code.match(/body\\\\s*{(([\\\\s\\\\S]*;\\\\s*?)|\\\\s*?)background.*\\\\s*:\\\\s*?#((00F)|(0000FF))((\\\\s*})|(;[\\\\s\\\\S]*?}))/gi), 'message: 使用 <code>hex code</code> 而不是单词 <code>blue</code> 来表示蓝色，例如 <code>body { color&#58; #0000FF; }</code>。');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 0\n    },\n    {\n      \"id\": \"bad87fee1348bd9aedf08721\",\n      \"title\": \"Use Hex Code to Mix Colors\",\n      \"description\": [\n        \"从这三种纯色（红、绿、蓝），我们能得到 1600 万种其它的颜色。\",\n        \"例如，橙色是纯红，混合一些绿，没有蓝。\",\n        \"通过对 background-color 应用 hex code 值 <code>#FFA500</code> 以把 <code>body</code> 元素的背景色设置为橙色。\"\n      ],\n      \"challengeSeed\": [\n        \"<style>\",\n        \"  body {\",\n        \"    background-color: #0000FF;\",\n        \"  }\",\n        \"</style>\"\n      ],\n      \"tests\": [\n        \"assert($(\\\"body\\\").css(\\\"background-color\\\") === \\\"rgb(255, 165, 0)\\\", 'message: 把你的 <code>body</code> 元素的 <code>background-color</code> 设置为橙色。');\",\n        \"assert(code.match(/body\\\\s*{(([\\\\s\\\\S]*;\\\\s*?)|\\\\s*?)background.*\\\\s*:\\\\s*?#FFA500((\\\\s*})|(;[\\\\s\\\\S]*?}))/gi), 'message: 使用 <code>hex code</code> 而不是单词 <code>orange</code> 来表示橙色，例如 <code>body { color&#58; #FFA500; }</code>。');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 0\n    },\n    {\n      \"id\": \"bad87fee1348bd9aede08720\",\n      \"title\": \"Use Hex Code to Color Elements Gray\",\n      \"description\": [\n        \"从这三种纯色（红、绿、蓝），我们能得到 1600 万种其它的颜色。\",\n        \"我们也可以通过平均混合所有三种颜色得到不同灰度等级的灰色。\",\n        \"通过对 background-color 应用 hex code 值 <code>#808080</code> 以把 <code>body</code> 元素的背景色设置为灰色。\"\n      ],\n      \"challengeSeed\": [\n        \"<style>\",\n        \"  body {\",\n        \"    background-color: #FFA500;\",\n        \"  }\",\n        \"</style>\"\n      ],\n      \"tests\": [\n        \"assert($(\\\"body\\\").css(\\\"background-color\\\") === \\\"rgb(128, 128, 128)\\\", 'message: 把你的 <code>body</code> 元素的 <code>background-color</code> 设置为灰色。');\",\n        \"assert(code.match(/body\\\\s*{(([\\\\s\\\\S]*;\\\\s*?)|\\\\s*?)background.*\\\\s*:\\\\s*?#808080((\\\\s*})|(;[\\\\s\\\\S]*?}))/gi), 'message: 使用 <code>hex code</code> 而不是单词 <code>gray</code> 来表示灰色，例如 <code>body { color&#58; #808080; }</code>。');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 0\n    },\n    {\n      \"id\": \"bad87fee1348bd9aedf08720\",\n      \"title\": \"Use Hex Code for Specific Shades of Gray\",\n      \"description\": [\n        \"通过平均混合所有三种颜色，我们还可以得到其他色度等级的灰色，这样我们可以非常接近纯黑色。\",\n        \"通过对 background-color 应用 hex code 值 <code>#111111</code> 以把 <code>body</code> 元素的背景色设置为深灰色。\"\n      ],\n      \"challengeSeed\": [\n        \"<style>\",\n        \"  body {\",\n        \"    background-color: #808080;\",\n        \"  }\",\n        \"</style>\"\n      ],\n      \"tests\": [\n        \"assert($(\\\"body\\\").css(\\\"background-color\\\") === \\\"rgb(17, 17, 17)\\\", 'message: 把你的 <code>body</code> 元素的 <code>background-color</code> 设置为深灰色。');\",\n        \"assert(code.match(/body\\\\s*{(([\\\\s\\\\S]*;\\\\s*?)|\\\\s*?)background.*\\\\s*:\\\\s*?#111(111)?((\\\\s*})|(;[\\\\s\\\\S]*?}))/gi), 'message: 使用 <code>hex code</code> 来表示深灰色，例如 <code>body { color&#58; #111111; }</code>。');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 0\n    },\n    {\n      \"id\": \"bad87fee1348bd9aedf08719\",\n      \"title\": \"Use Abbreviated Hex Code\",\n      \"description\": [\n        \"许多人对超过 1600 万种颜色感觉十分地抓狂，并且 hex code 非常难以记忆。幸运的是，你可以缩短它。\",\n        \"例如，红，hex code 是 <code>#FF0000</code> ，可被缩写成 <code>#F00</code>。也就是说，一位表示红，一位表示绿，一位表示蓝。\",\n        \"这会把所有可能的颜色数减少至大约 4000 种，但是浏览器会把 <code>#FF0000</code> 和 <code>#F00</code> 解释为完全相同的颜色。\",\n        \"继续前进，尝试使用 <code>#F00</code> 把 <code>body</code> 元素的背景色改为红色。\"\n      ],\n      \"challengeSeed\": [\n        \"<style>\",\n        \"  body {\",\n        \"    background-color: #111111;\",\n        \"  }\",\n        \"</style>\"\n      ],\n      \"tests\": [\n        \"assert($(\\\"body\\\").css(\\\"background-color\\\") === \\\"rgb(255, 0, 0)\\\", 'message: 把你的 <code>body</code> 元素的 <code>background-color</code> 设置为红色。');\",\n        \"assert(code.match(/body\\\\s*{(([\\\\s\\\\S]*;\\\\s*?)|\\\\s*?)background.*\\\\s*:\\\\s*?#F00((\\\\s*})|(\\\\s*;[\\\\s\\\\S]*?}))/gi), 'message: 使用 <code>abbreviated（缩写的） hex code</code> 而不是六字符 <code>hex code</code>。例如 <code>body { color&#58; #F00; }</code>。');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 0\n    },\n    {\n      \"id\": \"bad87fee1348bd9aede08718\",\n      \"title\": \"Use RGB values to Color Elements\",\n      \"description\": [\n        \"在 CSS 中表示颜色的另一个方法是使用 <code>rgb</code> 值。\",\n        \"代表黑色的 RGB 值看起来是下面的样子：\",\n        \"<code>rgb(0, 0, 0)</code>\",\n        \"代表白色的 RGB 值看起来是下面的样子：\",\n        \"<code>rgb(255, 255, 255)</code>\",\n        \"使用 <code>rgb</code>，你通过 0 至 255 之间的一个数字来指定每种颜色的亮度，而不是像 hex code 那样使用六个十六进制数字。\",\n        \"如果你做个算术，16 乘以 16 总共有 256 个值，所以从零开始计数的 <code>rgb</code>，和 hex code 一样有完全相同数量的可能数值。\",\n        \"让我们用黑色的 RGB 值 <code>rgb(0, 0, 0)</code> 替换掉 <code>body</code> 元素背景色的 hex code。\"\n      ],\n      \"challengeSeed\": [\n        \"<style>\",\n        \"  body {\",\n        \"    background-color: #F00;\",\n        \"  }\",\n        \"</style>\"\n      ],\n      \"tests\": [\n        \"assert($(\\\"body\\\").css(\\\"background-color\\\") === \\\"rgb(0, 0, 0)\\\", 'message: 你的 <code>body</code> 元素应该具有黑色的背景。');\",\n        \"assert(code.match(/rgb\\\\s*\\\\(\\\\s*0\\\\s*,\\\\s*0\\\\s*,\\\\s*0\\\\s*\\\\)/ig), 'message: 使用 <code>rgb</code> 将你的 <code>body</code> 元素的 <code>background-color</code> 设置为黑色，例如 <code>body { background-color&#58; rgb&#40;0&#44; 0&#44; 0&#41;; }</code>。');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 0\n    },\n    {\n      \"id\": \"bad88fee1348bd9aedf08726\",\n      \"title\": \"Use RGB to Color Elements White\",\n      \"description\": [\n        \"代表黑色的 RGB 值看起来是下面的样子：\",\n        \"<code>rgb(0, 0, 0)</code>\",\n        \"代表白色的 RGB 值看起来是下面的样子：\",\n        \"<code>rgb(255, 255, 255)</code>\",\n        \"使用 <code>rgb</code>，你通过 0 至 255 之间的一个数字来指定每种颜色的亮度，而不是像 hex code 那样使用六个十六进制数字。\",\n        \"把 <code>body</code> 元素的背景色从黑色的 RGB 值修改为白色的 <code>rgb</code> 值 <code>rgb(255, 255, 255)</code>。\"\n      ],\n      \"challengeSeed\": [\n        \"<style>\",\n        \"  body {\",\n        \"    background-color: rgb(0, 0, 0);\",\n        \"  }\",\n        \"</style>\"\n      ],\n      \"tests\": [\n        \"assert($(\\\"body\\\").css(\\\"background-color\\\") === \\\"rgb(255, 255, 255)\\\", 'message: 你的 <code>body</code> 元素应该具有白色的背景。');\",\n        \"assert(code.match(/rgb\\\\s*\\\\(\\\\s*255\\\\s*,\\\\s*255\\\\s*,\\\\s*255\\\\s*\\\\)/ig), 'message: 使用 <code>rgb</code> 将你的 <code>body</code> 元素的 <code>background-color</code> 设置为白色，例如 <code>body { background-color&#58; rgb&#40;255&#44; 255 &#44; 255&#41;; }</code>。');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 0\n    },\n    {\n      \"id\": \"bad89fee1348bd9aedf08724\",\n      \"title\": \"Use RGB to Color Elements Red\",\n      \"description\": [\n        \"和使用 hex code 一样，你可以通过不同数值的组合来表示 RGB 中不同的颜色。\",\n        \"这些数值遵循 RGB 顺序模式：第一位表示红色，第二位表示绿色，第三位表示蓝色。\",\n        \"把 <code>body</code> 元素的背景色修改为红色的 RGB 值：<code>rgb(255, 0, 0)</code>。\"\n      ],\n      \"challengeSeed\": [\n        \"<style>\",\n        \"  body {\",\n        \"    background-color: rgb(255, 255, 255);\",\n        \"  }\",\n        \"</style>\"\n      ],\n      \"tests\": [\n        \"assert($(\\\"body\\\").css(\\\"background-color\\\") === \\\"rgb(255, 0, 0)\\\", 'message: 你的 <code>body</code> 元素应该具有红色的背景。');\",\n        \"assert(code.match(/rgb\\\\s*\\\\(\\\\s*255\\\\s*,\\\\s*0\\\\s*,\\\\s*0\\\\s*\\\\)/ig), 'message: 使用 <code>rgb</code> 将你的 <code>body</code> 元素的 <code>background-color</code> 设置为红色，例如 <code>body { background-color&#58; rgb&#40;255&#44; 0&#44; 0&#41;; }</code>。');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 0\n    },\n    {\n      \"id\": \"bad80fee1348bd9aedf08723\",\n      \"title\": \"Use RGB to Color Elements Green\",\n      \"description\": [\n        \"现在将<code>body</code> 元素的背景色修改为绿色的 <code>rgb</code> 值：<code>rgb(0, 255, 0)</code>。\"\n      ],\n      \"challengeSeed\": [\n        \"<style>\",\n        \"  body {\",\n        \"    background-color: rgb(255, 0, 0);\",\n        \"  }\",\n        \"</style>\"\n      ],\n      \"tests\": [\n        \"assert($(\\\"body\\\").css(\\\"background-color\\\") === \\\"rgb(0, 255, 0)\\\", 'message: 你的 <code>body</code> 元素应该具有绿色的背景。');\",\n        \"assert(code.match(/rgb\\\\s*\\\\(\\\\s*0\\\\s*,\\\\s*255\\\\s*,\\\\s*0\\\\s*\\\\)/ig), 'message: 使用 <code>rgb</code> 将你的 <code>body</code> 元素的 <code>background-color</code> 设置为绿色，例如 <code>body { background-color&#58; rgb&#40;0&#44; 255&#44; 0&#41;; }</code>。');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 0\n    },\n    {\n      \"id\": \"bad81fee1348bd9aedf08722\",\n      \"title\": \"Use RGB to Color Elements Blue\",\n      \"description\": [\n        \"将你的 <code>body</code> 元素的背景色修改为蓝色的 RGB 值：<code>rgb(0, 0, 255)</code>。\"\n      ],\n      \"challengeSeed\": [\n        \"<style>\",\n        \"  body {\",\n        \"    background-color: rgb(0, 255, 0);\",\n        \"  }\",\n        \"</style>\"\n      ],\n      \"tests\": [\n        \"assert($(\\\"body\\\").css(\\\"background-color\\\") === \\\"rgb(0, 0, 255)\\\", 'message: 你的 <code>body</code> 元素应该具有蓝色的背景。');\",\n        \"assert(code.match(/rgb\\\\s*\\\\(\\\\s*0\\\\s*,\\\\s*0\\\\s*,\\\\s*255\\\\s*\\\\)/ig), 'message: 使用 <code>rgb</code> 将你的 <code>body</code> 元素的 <code>background-color</code> 设置为蓝色，例如 <code>body { background-color&#58; rgb&#40;0&#44; 0&#44; 255&#41;; }</code>。');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 0\n    },\n    {\n      \"id\": \"bad82fee1348bd9aedf08721\",\n      \"title\": \"Use RGB to Mix Colors\",\n      \"description\": [\n        \"就像使用 hex code 一样，你可以使用不同数值的组合在 RGB 中混合出各种颜色。\",\n        \"将 <code>body</code> 元素的背景色修改为橙色的 RGB 值：<code>rgb(255, 165, 0)</code>。\"\n      ],\n      \"challengeSeed\": [\n        \"<style>\",\n        \"  body {\",\n        \"    background-color: rgb(0, 0, 255);\",\n        \"  }\",\n        \"</style>\"\n      ],\n      \"tests\": [\n        \"assert($(\\\"body\\\").css(\\\"background-color\\\") === \\\"rgb(255, 165, 0)\\\", 'message: 你的 <code>body</code> 元素应该具有橙色的背景。');\",\n        \"assert(code.match(/rgb\\\\s*\\\\(\\\\s*255\\\\s*,\\\\s*165\\\\s*,\\\\s*0\\\\s*\\\\)/ig), 'message: 使用 <code>rgb</code> 将你的 <code>body</code> 元素的 <code>background-color</code> 设置为橙色，例如 <code>body { background-color&#58; rgb&#40;255&#44; 165&#44; 0&#41;; }</code>。');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 0\n    }\n  ]\n}\n"
  },
  {
    "path": "seed/challenges/01-front-end-development-certification/intermediate-bonfires.json",
    "content": "{\n  \"name\": \"Intermediate Algorithm Scripting\",\n  \"order\": 11.5,\n  \"time\": \"50 hours\",\n  \"helpRoom\": \"chinese\",\n  \"challenges\": [\n    {\n      \"id\": \"a3566b1109230028080c9345\",\n      \"title\": \"Sum All Numbers in a Range\",\n      \"description\": [\n        \"我们会传递给你一个包含两个数字的数组。返回这两个数字和它们之间所有数字的和。\",\n        \"最小的数字并非总在最前面。\",\n        \"如果你被难住了，记得使用 Read-Search-Ask。尝试与他人结伴编程、编写你自己的代码。\"\n      ],\n      \"challengeSeed\": [\n        \"function sumAll(arr) {\",\n        \"  return 1;\",\n        \"}\",\n        \"\",\n        \"sumAll([1, 4]);\"\n      ],\n      \"solutions\": [\n        \"function sumAll(arr) {\\n  var sum = 0;\\n  arr.sort(function(a,b) {return a-b;});\\n  for (var i = arr[0]; i <= arr[1]; i++) {\\n    sum += i; \\n  }\\n  return sum;\\n}\"\n      ],\n      \"tests\": [\n        \"assert(typeof sumAll([1, 4]) === 'number', 'message: <code>sumAll([1, 4])</code> 应该返回一个数字。');\",\n        \"assert.deepEqual(sumAll([1, 4]), 10, 'message: <code>sumAll([1, 4])</code> 应该返回 10。');\",\n        \"assert.deepEqual(sumAll([4, 1]), 10, 'message: <code>sumAll([4, 1])</code> 应该返回 10。');\",\n        \"assert.deepEqual(sumAll([5, 10]), 45, 'message: <code>sumAll([5, 10])</code> 应该返回 45。');\",\n        \"assert.deepEqual(sumAll([10, 5]), 45, 'message: <code>sumAll([10, 5])</code> 应该返回 45。');\"\n      ],\n      \"type\": \"bonfire\",\n      \"MDNlinks\": [\n        \"Math.max()\",\n        \"Math.min()\",\n        \"Array.reduce()\"\n      ],\n      \"isRequired\": true,\n      \"challengeType\": 5\n    },\n    {\n      \"id\": \"a5de63ebea8dbee56860f4f2\",\n      \"title\": \"Diff Two Arrays\",\n      \"description\": [\n        \"比较两个数组，然后返回一个新数组，该数组的元素为两个给定数组中所有独有的数组元素。换言之，返回两个数组的差异。\",\n        \"如果你被难住了，记得使用 Read-Search-Ask尝试与他人结伴编程、编写你自己的代码。\"\n      ],\n      \"challengeSeed\": [\n        \"function diff(arr1, arr2) {\",\n        \"  var newArr = [];\",\n        \"  // Same, same; but different.\",\n        \"  return newArr;\",\n        \"}\",\n        \"\",\n        \"diff([1, 2, 3, 5], [1, 2, 3, 4, 5]);\"\n      ],\n      \"solutions\": [\n        \"function diff(arr1, arr2) {\\n  var newArr = [];\\n  var h1 = Object.create(null);\\n  arr1.forEach(function(e) {\\n    h1[e] = e;\\n  });\\n  \\n  var h2 = Object.create(null);\\n  arr2.forEach(function(e) {\\n    h2[e] = e;\\n  });\\n  \\n  Object.keys(h1).forEach(function(e) {\\n     if (!(e in h2)) newArr.push(h1[e]);\\n  });\\n  Object.keys(h2).forEach(function(e) {\\n     if (!(e in h1)) newArr.push(h2[e]);\\n  });\\n  // Same, same; but different.\\n  return newArr;\\n}\"\n      ],\n      \"tests\": [\n        \"assert(typeof diff([1, 2, 3, 5], [1, 2, 3, 4, 5]) === \\\"object\\\", 'message: <code>diff([1, 2, 3, 5], [1, 2, 3, 4, 5])</code> 应该返回一个数组。');\",\n        \"assert.sameMembers(diff([\\\"diorite\\\", \\\"andesite\\\", \\\"grass\\\", \\\"dirt\\\", \\\"pink wool\\\", \\\"dead shrub\\\"], [\\\"diorite\\\", \\\"andesite\\\", \\\"grass\\\", \\\"dirt\\\", \\\"dead shrub\\\"]), [\\\"pink wool\\\"], 'message: <code>[\\\"diorite\\\", \\\"andesite\\\", \\\"grass\\\", \\\"dirt\\\", \\\"pink wool\\\", \\\"dead shrub\\\"], [\\\"diorite\\\", \\\"andesite\\\", \\\"grass\\\", \\\"dirt\\\", \\\"dead shrub\\\"]</code> 应该返回 <code>[\\\"pink wool\\\"]</code>。');\",\n        \"assert.sameMembers(diff([\\\"andesite\\\", \\\"grass\\\", \\\"dirt\\\", \\\"pink wool\\\", \\\"dead shrub\\\"], [\\\"diorite\\\", \\\"andesite\\\", \\\"grass\\\", \\\"dirt\\\", \\\"dead shrub\\\"]), [\\\"diorite\\\", \\\"pink wool\\\"], 'message: <code>[\\\"andesite\\\", \\\"grass\\\", \\\"dirt\\\", \\\"pink wool\\\", \\\"dead shrub\\\"], [\\\"diorite\\\", \\\"andesite\\\", \\\"grass\\\", \\\"dirt\\\", \\\"dead shrub\\\"]</code> 应该返回 <code>[\\\"diorite\\\", \\\"pink wool\\\"]</code>。');\",\n        \"assert.sameMembers(diff([\\\"andesite\\\", \\\"grass\\\", \\\"dirt\\\", \\\"dead shrub\\\"], [\\\"andesite\\\", \\\"grass\\\", \\\"dirt\\\", \\\"dead shrub\\\"]), [], 'message: <code>[\\\"andesite\\\", \\\"grass\\\", \\\"dirt\\\", \\\"dead shrub\\\"], [\\\"andesite\\\", \\\"grass\\\", \\\"dirt\\\", \\\"dead shrub\\\"]</code> 应该返回 <code>[]</code>。');\",\n        \"assert.sameMembers(diff([1, 2, 3, 5], [1, 2, 3, 4, 5]), [4], 'message: <code>[1, 2, 3, 5], [1, 2, 3, 4, 5]</code> 应该返回 <code>[4]</code>。');\",\n        \"assert.sameMembers(diff([1, \\\"calf\\\", 3, \\\"piglet\\\"], [1, \\\"calf\\\", 3, 4]), [\\\"piglet\\\", 4], 'message: <code>[1, \\\"calf\\\", 3, \\\"piglet\\\"], [1, \\\"calf\\\", 3, 4]</code> 应该返回 <code>[\\\"piglet\\\", 4]</code>。');\",\n        \"assert.sameMembers(diff([], [\\\"snuffleupagus\\\", \\\"cookie monster\\\", \\\"elmo\\\"]), [\\\"snuffleupagus\\\", \\\"cookie monster\\\", \\\"elmo\\\"], 'message: <code>[], [\\\"snuffleupagus\\\", \\\"cookie monster\\\", \\\"elmo\\\"]</code> 应该返回 <code>[\\\"snuffleupagus\\\", \\\"cookie monster\\\", \\\"elmo\\\"]</code>。');\",\n        \"assert.sameMembers(diff([1, \\\"calf\\\", 3, \\\"piglet\\\"], [7, \\\"filly\\\"]), [1, \\\"calf\\\", 3, \\\"piglet\\\", 7, \\\"filly\\\"], 'message: <code>[1, \\\"calf\\\", 3, \\\"piglet\\\"], [7, \\\"filly\\\"]</code> 应该返回 <code>[1, \\\"calf\\\", 3, \\\"piglet\\\", 7, \\\"filly\\\"]</code>。');\"\n      ],\n      \"type\": \"bonfire\",\n      \"MDNlinks\": [\n        \"Comparison Operators\",\n        \"Array.slice()\",\n        \"Array.filter()\",\n        \"Array.indexOf()\",\n        \"Array.concat()\"\n      ],\n      \"isRequired\": true,\n      \"challengeType\": 5\n    },\n    {\n      \"id\": \"a7f4d8f2483413a6ce226cac\",\n      \"title\": \"Roman Numeral Converter\",\n      \"description\": [\n        \"将给定的数字转换成罗马数字。\",\n        \"所有返回的 <a href=\\\"http://www.mathsisfun.com/roman-numerals.html\\\" target=\\\"_blank\\\">罗马数字</a> 都应该是大写形式。\",\n        \"如果你被难住了，记得使用 Read-Search-Ask尝试与他人结伴编程、编写你自己的代码。\"\n      ],\n      \"challengeSeed\": [\n        \"function convert(num) {\",\n        \" return num;\",\n        \"}\",\n        \"\",\n        \"convert(36);\"\n      ],\n      \"solutions\": [\n        \"function convert(num) {\\n  var ref = [['M', 1000], ['CM', 900], ['D', 500], ['CD', 400], ['C', 100], ['XC', 90], ['L', 50], ['XL', 40], ['X', 10], ['IX', 9], ['V', 5], ['IV', 4], ['I', 1]];\\n  var res = [];\\n  ref.forEach(function(p) {\\n    while (num >= p[1]) {\\n      res.push(p[0]);\\n      num -= p[1];\\n    }\\n  });\\n  return res.join('');\\n}\"\n      ],\n      \"tests\": [\n        \"assert.deepEqual(convert(2), \\\"II\\\", 'message: <code>convert(2)</code> 应该返回 \\\"II\\\"。');\",\n        \"assert.deepEqual(convert(3), \\\"III\\\", 'message: <code>convert(3)</code> 应该返回 \\\"III\\\"。');\",\n        \"assert.deepEqual(convert(4), \\\"IV\\\", 'message: <code>convert(4)</code> 应该返回 \\\"IV\\\"。');\",\n        \"assert.deepEqual(convert(5), \\\"V\\\", 'message: <code>convert(5)</code> 应该返回 \\\"V\\\"。');\",\n        \"assert.deepEqual(convert(9), \\\"IX\\\", 'message: <code>convert(9)</code> 应该返回 \\\"IX\\\"。');\",\n        \"assert.deepEqual(convert(12), \\\"XII\\\", 'message: <code>convert(12)</code> 应该返回 \\\"XII\\\"。');\",\n        \"assert.deepEqual(convert(16), \\\"XVI\\\", 'message: <code>convert(16)</code> 应该返回 \\\"XVI\\\"。');\",\n        \"assert.deepEqual(convert(29), \\\"XXIX\\\", 'message: <code>convert(29)</code> 应该返回 \\\"XXIX\\\"。');\",\n        \"assert.deepEqual(convert(44), \\\"XLIV\\\", 'message: <code>convert(44)</code> 应该返回 \\\"XLIV\\\"。');\",\n        \"assert.deepEqual(convert(45), \\\"XLV\\\", 'message: <code>convert(45)</code> 应该返回 \\\"XLV\\\"。');\",\n        \"assert.deepEqual(convert(68), \\\"LXVIII\\\", 'message: <code>convert(68)</code> 应该返回 \\\"LXVIII\\\"。');\",\n        \"assert.deepEqual(convert(83), \\\"LXXXIII\\\", 'message: <code>convert(83)</code> 应该返回 \\\"LXXXIII\\\"。');\",\n        \"assert.deepEqual(convert(97), \\\"XCVII\\\", 'message: <code>convert(97)</code> 应该返回 \\\"XCVII\\\"。');\",\n        \"assert.deepEqual(convert(99), \\\"XCIX\\\", 'message: <code>convert(99)</code> 应该返回 \\\"XCIX\\\"。');\",\n        \"assert.deepEqual(convert(500), \\\"D\\\", 'message: <code>convert(500)</code> 应该返回 \\\"D\\\"。');\",\n        \"assert.deepEqual(convert(501), \\\"DI\\\", 'message: <code>convert(501)</code> 应该返回 \\\"DI\\\"。');\",\n        \"assert.deepEqual(convert(649), \\\"DCXLIX\\\", 'message: <code>convert(649)</code> 应该返回 \\\"DCXLIX\\\"。');\",\n        \"assert.deepEqual(convert(798), \\\"DCCXCVIII\\\", 'message: <code>convert(798)</code> 应该返回 \\\"DCCXCVIII\\\"。');\",\n        \"assert.deepEqual(convert(891), \\\"DCCCXCI\\\", 'message: <code>convert(891)</code> 应该返回 \\\"DCCCXCI\\\"。');\",\n        \"assert.deepEqual(convert(1000), \\\"M\\\", 'message: <code>convert(1000)</code> 应该返回 \\\"M\\\"。');\",\n        \"assert.deepEqual(convert(1004), \\\"MIV\\\", 'message: <code>convert(1004)</code> 应该返回 \\\"MIV\\\"。');\",\n        \"assert.deepEqual(convert(1006), \\\"MVI\\\", 'message: <code>convert(1006)</code> 应该返回 \\\"MVI\\\"。');\",\n        \"assert.deepEqual(convert(1023), \\\"MXXIII\\\", 'message: <code>convert(1023)</code> 应该返回 \\\"MXXIII\\\"。');\",\n        \"assert.deepEqual(convert(2014), \\\"MMXIV\\\", 'message: <code>convert(2014)</code> 应该返回 \\\"MMXIV\\\"。');\",\n        \"assert.deepEqual(convert(3999), \\\"MMMCMXCIX\\\", 'message: <code>convert(3999)</code> 应该返回 \\\"MMMCMXCIX\\\"。');\"\n      ],\n      \"type\": \"bonfire\",\n      \"MDNlinks\": [\n        \"Roman Numerals\",\n        \"Array.splice()\",\n        \"Array.indexOf()\",\n        \"Array.join()\"\n      ],\n      \"isRequired\": true,\n      \"challengeType\": 5\n    },\n    {\n      \"id\": \"a8e512fbe388ac2f9198f0fa\",\n      \"title\": \"Wherefore art thou\",\n      \"description\": [\n        \"写一个 function，它遍历一个对象数组（第一个参数）并返回一个包含相匹配的属性-值对（第二个参数）的所有对象的数组。如果返回的数组中包含 source 对象的属性-值对，那么此对象的每一个属性-值对都必须存在于 collection 的对象中。\",\n        \"例如，如果第一个参数是 <code>[{ first: \\\"Romeo\\\", last: \\\"Montague\\\" }, { first: \\\"Mercutio\\\", last: null }, { first: \\\"Tybalt\\\", last: \\\"Capulet\\\" }]</code>，第二个参数是 <code>{ last: \\\"Capulet\\\" }</code>，那么你必须从数组（第一个参数）返回其中的第三个对象，因为它包含了作为第二个参数传递的属性-值对。\",\n        \"如果你被难住了，记得使用 Read-Search-Ask编写你自己的代码。\"\n      ],\n      \"challengeSeed\": [\n        \"function where(collection, source) {\",\n        \"  var arr = [];\",\n        \"  // What's in a name?\",\n        \"  return arr;\",\n        \"}\",\n        \"\",\n        \"where([{ first: \\\"Romeo\\\", last: \\\"Montague\\\" }, { first: \\\"Mercutio\\\", last: null }, { first: \\\"Tybalt\\\", last: \\\"Capulet\\\" }], { last: \\\"Capulet\\\" });\"\n      ],\n      \"solutions\": [\n        \"function where(collection, source) {\\n  var arr = [];\\n  var keys = Object.keys(source);\\n  collection.forEach(function(e) {\\n    if(keys.every(function(key) {return e[key] === source[key];})) {\\n      arr.push(e);  \\n    }\\n  });\\n  return arr;\\n}\"\n      ],\n      \"tests\": [\n        \"assert.deepEqual(where([{ first: \\\"Romeo\\\", last: \\\"Montague\\\" }, { first: \\\"Mercutio\\\", last: null }, { first: \\\"Tybalt\\\", last: \\\"Capulet\\\" }], { last: \\\"Capulet\\\" }), [{ first: \\\"Tybalt\\\", last: \\\"Capulet\\\" }], 'message: <code>where([{ first: \\\"Romeo\\\", last: \\\"Montague\\\" }, { first: \\\"Mercutio\\\", last: null }, { first: \\\"Tybalt\\\", last: \\\"Capulet\\\" }], { last: \\\"Capulet\\\" })</code> 应该返回 <code>[{ first: \\\"Tybalt\\\", last: \\\"Capulet\\\" }]</code>。');\",\n        \"assert.deepEqual(where([{ \\\"a\\\": 1 }, { \\\"a\\\": 1 }, { \\\"a\\\": 1, \\\"b\\\": 2 }], { \\\"a\\\": 1 }), [{ \\\"a\\\": 1 }, { \\\"a\\\": 1 }, { \\\"a\\\": 1, \\\"b\\\": 2 }], 'message: <code>where([{ \\\"a\\\": 1 }, { \\\"a\\\": 1 }, { \\\"a\\\": 1, \\\"b\\\": 2 }], { \\\"a\\\": 1 })</code> 应该返回 <code>[{ \\\"a\\\": 1 }, { \\\"a\\\": 1 }, { \\\"a\\\": 1, \\\"b\\\": 2 }]</code>。');\",\n        \"assert.deepEqual(where([{ \\\"a\\\": 1, \\\"b\\\": 2 }, { \\\"a\\\": 1 }, { \\\"a\\\": 1, \\\"b\\\": 2, \\\"c\\\": 2 }], { \\\"a\\\": 1, \\\"b\\\": 2 }), [{ \\\"a\\\": 1, \\\"b\\\": 2 }, { \\\"a\\\": 1, \\\"b\\\": 2, \\\"c\\\": 2 }], 'message: <code>where([{ \\\"a\\\": 1, \\\"b\\\": 2 }, { \\\"a\\\": 1 }, { \\\"a\\\": 1, \\\"b\\\": 2, \\\"c\\\": 2 }], { \\\"a\\\": 1, \\\"b\\\": 2 })</code> 应该返回 <code>[{ \\\"a\\\": 1, \\\"b\\\": 2 }, { \\\"a\\\": 1, \\\"b\\\": 2, \\\"c\\\": 2 }]</code>。');\",\n        \"assert.deepEqual(where([{ \\\"a\\\": 1, \\\"b\\\": 2 }, { \\\"a\\\": 1 }, { \\\"a\\\": 1, \\\"b\\\": 2, \\\"c\\\": 2 }], { \\\"a\\\": 1, \\\"c\\\": 2 }), [{ \\\"a\\\": 1, \\\"b\\\": 2, \\\"c\\\": 2 }], 'message: <code>where([{ \\\"a\\\": 1, \\\"b\\\": 2 }, { \\\"a\\\": 1 }, { \\\"a\\\": 1, \\\"b\\\": 2, \\\"c\\\": 2 }], { \\\"a\\\": 1, \\\"c\\\": 2 })</code> 应该返回 <code>[{ \\\"a\\\": 1, \\\"b\\\": 2, \\\"c\\\": 2 }]</code>.');\",\n        \"assert.deepEqual(where([{ \\\"a\\\": 1, \\\"b\\\": 2 }, { \\\"a\\\": 1 }, { \\\"a\\\": 1, \\\"b\\\": 2, \\\"c\\\": 2 }, {\\\"b\\\":2}], { \\\"a\\\": 1, \\\"b\\\": 2 }), [{ \\\"a\\\": 1, \\\"b\\\": 2 }, { \\\"a\\\": 1, \\\"b\\\": 2, \\\"c\\\":2 }], 'message: <code>where([{ \\\"a\\\": 1, \\\"b\\\": 2 }, { \\\"a\\\": 1 }, { \\\"a\\\": 1, \\\"b\\\": 2, \\\"c\\\": 2 }, { \\\"b\\\":2 }], { \\\"a\\\": 1, \\\"b\\\": 2 })</code> 应该返回 <code>[{ \\\"a\\\": 1, \\\"b\\\": 2 }, { \\\"a\\\": 1, \\\"b\\\": 2, \\\"c\\\":2 }]</code>.');\"\n      ],\n      \"type\": \"bonfire\",\n      \"MDNlinks\": [\n        \"Global Object\",\n        \"Object.hasOwnProperty()\",\n        \"Object.keys()\"\n      ],\n      \"isRequired\": true,\n      \"challengeType\": 5\n    },\n    {\n      \"id\": \"a0b5010f579e69b815e7c5d6\",\n      \"title\": \"Search and Replace\",\n      \"description\": [\n        \"使用给定的参数对句子执行一次查找和替换，然后返回新句子。\",\n        \"第一个参数是将要对其执行查找和替换的句子。\",\n        \"第二个参数是将被替换掉的单词（替换前的单词）。\",\n        \"第三个参数用于替换第二个参数（替换后的单词）。\",\n        \"注意：替换时保持原单词的大小写。例如，如果你想用单词 \\\"dog\\\" 替换单词 \\\"Book\\\" ，你应该替换成 \\\"Dog\\\"。\",\n        \"如果你被难住了，记得使用 Read-Search-Ask尝试与他人结伴编程、编写你自己的代码。\"\n      ],\n      \"challengeSeed\": [\n        \"function myReplace(str, before, after) {\",\n        \"  return str;\",\n        \"}\",\n        \"\",\n        \"myReplace(\\\"A quick brown fox jumped over the lazy dog\\\", \\\"jumped\\\", \\\"leaped\\\");\"\n      ],\n      \"solutions\": [\n        \"function myReplace(str, before, after) {\\n  if (before.charAt(0) === before.charAt(0).toUpperCase()) {\\n    after = after.charAt(0).toUpperCase() + after.substring(1);\\n  } else {\\n    after = after.charAt(0).toLowerCase() + after.substring(1);\\n  }\\n  return str.replace(before, after);\\n}\"\n      ],\n      \"tests\": [\n        \"assert.deepEqual(myReplace(\\\"Let us go to the store\\\", \\\"store\\\", \\\"mall\\\"), \\\"Let us go to the mall\\\", 'message: <code>myReplace(\\\"Let us go to the store\\\", \\\"store\\\", \\\"mall\\\")</code> 应该返回 \\\"Let us go to the mall\\\"。');\",\n        \"assert.deepEqual(myReplace(\\\"He is Sleeping on the couch\\\", \\\"Sleeping\\\", \\\"sitting\\\"), \\\"He is Sitting on the couch\\\", 'message: <code>myReplace(\\\"He is Sleeping on the couch\\\", \\\"Sleeping\\\", \\\"sitting\\\")</code> 应该返回 \\\"He is Sitting on the couch\\\"。');\",\n        \"assert.deepEqual(myReplace(\\\"This has a spellngi error\\\", \\\"spellngi\\\", \\\"spelling\\\"), \\\"This has a spelling error\\\", 'message: <code>myReplace(\\\"This has a spellngi error\\\", \\\"spellngi\\\", \\\"spelling\\\")</code> 应该返回 \\\"This has a spelling error\\\"。');\",\n        \"assert.deepEqual(myReplace(\\\"His name is Tom\\\", \\\"Tom\\\", \\\"john\\\"), \\\"His name is John\\\", 'message: <code>myReplace(\\\"His name is Tom\\\", \\\"Tom\\\", \\\"john\\\")</code> 应该返回 \\\"His name is John\\\"。');\",\n        \"assert.deepEqual(myReplace(\\\"Let us get back to more Coding\\\", \\\"Coding\\\", \\\"algorithms\\\"), \\\"Let us get back to more Algorithms\\\", 'message: <code>myReplace(\\\"Let us get back to more Coding\\\", \\\"Coding\\\", \\\"algorithms\\\")</code> 应该返回 \\\"Let us get back to more Algorithms\\\"。');\"\n      ],\n      \"type\": \"bonfire\",\n      \"MDNlinks\": [\n        \"Array.splice()\",\n        \"String.replace()\",\n        \"Array.join()\"\n      ],\n      \"isRequired\": true,\n      \"challengeType\": 5\n    },\n    {\n      \"id\": \"aa7697ea2477d1316795783b\",\n      \"title\": \"Pig Latin\",\n      \"description\": [\n        \"把指定的字符串翻译成 pig latin。\",\n        \"<a href=\\\"http://en.wikipedia.org/wiki/Pig_Latin\\\" target=\\\"_blank\\\">Pig Latin</a> 把一个英文单词的第一个辅音或辅音丛（consonant cluster）移到词尾，然后加上后缀 \\\"ay\\\"。\",\n        \"如果单词以元音开始，你只需要在词尾添加 \\\"way\\\" 就可以了。\",\n        \"如果你被难住了，记得使用 Read-Search-Ask尝试与他人结伴编程、编写你自己的代码。\"\n      ],\n      \"challengeSeed\": [\n        \"function translate(str) {\",\n        \"  return str;\",\n        \"}\",\n        \"\",\n        \"translate(\\\"consonant\\\");\"\n      ],\n      \"solutions\": [\n        \"function translate(str) {\\n  if (isVowel(str.charAt(0))) return str + \\\"way\\\";\\n  var front = [];\\n  str = str.split('');\\n  while (str.length && !isVowel(str[0])) {\\n    front.push(str.shift());\\n  }\\n  return [].concat(str, front).join('') + 'ay';\\n}\\n\\nfunction isVowel(c) {\\n  return ['a', 'e', 'i', 'o', 'u'].indexOf(c.toLowerCase()) !== -1;\\n}\"\n      ],\n      \"tests\": [\n        \"assert.deepEqual(translate(\\\"california\\\"), \\\"aliforniacay\\\", 'message: <code>translate(\\\"california\\\")</code> 应该返回 \\\"aliforniacay\\\"。');\",\n        \"assert.deepEqual(translate(\\\"paragraphs\\\"), \\\"aragraphspay\\\", 'message: <code>translate(\\\"paragraphs\\\")</code> 应该返回 \\\"aragraphspay\\\"。');\",\n        \"assert.deepEqual(translate(\\\"glove\\\"), \\\"oveglay\\\", 'message: <code>translate(\\\"glove\\\")</code> 应该返回 \\\"oveglay\\\"。');\",\n        \"assert.deepEqual(translate(\\\"algorithm\\\"), \\\"algorithmway\\\", 'message: <code>translate(\\\"algorithm\\\")</code> 应该返回 \\\"algorithmway\\\"。');\",\n        \"assert.deepEqual(translate(\\\"eight\\\"), \\\"eightway\\\", 'message: <code>translate(\\\"eight\\\")</code> 应该返回 \\\"eightway\\\"。');\"\n      ],\n      \"type\": \"bonfire\",\n      \"MDNlinks\": [\n        \"Array.indexOf()\",\n        \"Array.push()\",\n        \"Array.join()\",\n        \"String.substr()\",\n        \"String.split()\"\n      ],\n      \"isRequired\": true,\n      \"challengeType\": 5\n    },\n    {\n      \"id\": \"afd15382cdfb22c9efe8b7de\",\n      \"title\": \"DNA Pairing\",\n      \"description\": [\n        \"DNA 链缺少配对的碱基。依据每一个碱基，为其找到配对的碱基，然后将结果作为第二个数组返回。\",\n        \"<a href=\\\"http://en.wikipedia.org/wiki/Base_pair\\\" target=\\\"_blank\\\">Base pairs（碱基对）</a> 是一对 AT 和 CG，为给定的字母匹配缺失的碱基。\",\n        \"在每一个数组中将给定的字母作为第一个碱基返回。\",\n        \"例如，对于输入的 GCG，相应地返回 [[\\\"G\\\", \\\"C\\\"], [\\\"C\\\",\\\"G\\\"],[\\\"G\\\", \\\"C\\\"]]\",\n        \"字母和与之配对的字母在一个数组内，然后所有数组再被组织起来封装进一个数组。\",\n        \"如果你被卡住了，记得开大招 Read-Search-Ask。尝试与他人结伴编程、编写你自己的代码。\"\n      ],\n      \"challengeSeed\": [\n        \"function pair(str) {\",\n        \"  return str;\",\n        \"}\",\n        \"\",\n        \"pair(\\\"GCG\\\");\"\n      ],\n      \"solutions\": [\n        \"var lookup = Object.create(null);\\nlookup.A = 'T';\\nlookup.T = 'A';\\nlookup.C = 'G';\\nlookup.G = 'C';\\n\\nfunction pair(str) {\\n return str.split('').map(function(p) {return [p, lookup[p]];});\\n}\"\n      ],\n      \"tests\": [\n        \"assert.deepEqual(pair(\\\"ATCGA\\\"),[[\\\"A\\\",\\\"T\\\"],[\\\"T\\\",\\\"A\\\"],[\\\"C\\\",\\\"G\\\"],[\\\"G\\\",\\\"C\\\"],[\\\"A\\\",\\\"T\\\"]], 'message: <code>pair(\\\"ATCGA\\\")</code> 应该返回 <code>[[\\\"A\\\",\\\"T\\\"],[\\\"T\\\",\\\"A\\\"],[\\\"C\\\",\\\"G\\\"],[\\\"G\\\",\\\"C\\\"],[\\\"A\\\",\\\"T\\\"]]</code>。');\",\n        \"assert.deepEqual(pair(\\\"TTGAG\\\"),[[\\\"T\\\",\\\"A\\\"],[\\\"T\\\",\\\"A\\\"],[\\\"G\\\",\\\"C\\\"],[\\\"A\\\",\\\"T\\\"],[\\\"G\\\",\\\"C\\\"]], 'message: <code>pair(\\\"TTGAG\\\")</code> 应该返回 <code>[[\\\"T\\\",\\\"A\\\"],[\\\"T\\\",\\\"A\\\"],[\\\"G\\\",\\\"C\\\"],[\\\"A\\\",\\\"T\\\"],[\\\"G\\\",\\\"C\\\"]]</code>。');\",\n        \"assert.deepEqual(pair(\\\"CTCTA\\\"),[[\\\"C\\\",\\\"G\\\"],[\\\"T\\\",\\\"A\\\"],[\\\"C\\\",\\\"G\\\"],[\\\"T\\\",\\\"A\\\"],[\\\"A\\\",\\\"T\\\"]], 'message: <code>pair(\\\"CTCTA\\\")</code> 应该返回 <code>[[\\\"C\\\",\\\"G\\\"],[\\\"T\\\",\\\"A\\\"],[\\\"C\\\",\\\"G\\\"],[\\\"T\\\",\\\"A\\\"],[\\\"A\\\",\\\"T\\\"]]</code>。');\"\n      ],\n      \"type\": \"bonfire\",\n      \"MDNlinks\": [\n        \"Array.push()\",\n        \"String.split()\"\n      ],\n      \"isRequired\": true,\n      \"challengeType\": 5\n    },\n    {\n      \"id\": \"af7588ade1100bde429baf20\",\n      \"title\": \"Missing letters\",\n      \"description\": [\n        \"从传递进来的字母序列中找到缺失的字母并返回它。\",\n        \"如果所有字母都在序列中，返回 undefined。\",\n        \"如果你被卡住了，记得开大招 Read-Search-Ask。尝试与他人结伴编程、编写你自己的代码。\"\n      ],\n      \"challengeSeed\": [\n        \"function fearNotLetter(str) {\",\n        \"  return str;\",\n        \"}\",\n        \"\",\n        \"fearNotLetter(\\\"abce\\\");\"\n      ],\n      \"solutions\": [\n        \"function fearNotLetter(str) {\\n  var s = str.split('').map(function(c) {return c.charCodeAt(0);});\\n  for (var i = 1; i < s.length; i++) {\\n    if (s[i]-1 != s[i-1]) {\\n      return String.fromCharCode(s[i]-1);\\n    }\\n  }\\n}\"\n      ],\n      \"tests\": [\n        \"assert.deepEqual(fearNotLetter(\\\"abce\\\"), \\\"d\\\", 'message: <code>fearNotLetter(\\\"abce\\\")</code> 应该返回 \\\"d\\\"。');\",\n        \"assert.deepEqual(fearNotLetter(\\\"abcdefghjklmno\\\"), \\\"i\\\", 'message: <code>fearNotLetter(\\\"abcdefghjklmno\\\")</code> 应该返回 \\\"i\\\"。');\",\n        \"assert.isUndefined(fearNotLetter(\\\"bcd\\\"), 'message: <code>fearNotLetter(\\\"bcd\\\")</code> 应该返回 undefined。');\",\n        \"assert.isUndefined(fearNotLetter(\\\"yz\\\"), 'message: <code>fearNotLetter(\\\"yz\\\")</code> 应该返回 undefined。');\"\n      ],\n      \"type\": \"bonfire\",\n      \"MDNlinks\": [\n        \"String.charCodeAt()\",\n        \"String.fromCharCode()\"\n      ],\n      \"isRequired\": true,\n      \"challengeType\": 5\n    },\n    {\n      \"id\": \"a77dbc43c33f39daa4429b4f\",\n      \"title\": \"Boo who\",\n      \"description\": [\n        \"检查一个值是否是基本布尔类型，并返回 true 或 false。\",\n        \"基本布尔类型即 true 和 false。\",\n        \"如果你被卡住了，记得开大招 Read-Search-Ask。尝试与他人结伴编程、编写你自己的代码。\"\n      ],\n      \"challengeSeed\": [\n        \"function boo(bool) {\",\n        \"  // What is the new fad diet for ghost developers? The Boolean.\",\n        \"  return bool;\",\n        \"}\",\n        \"\",\n        \"boo(null);\"\n      ],\n      \"solutions\": [\n        \"function boo(bool) {\\n  // What is the new fad diet for ghost developers? The Boolean.\\n  return typeof bool === \\\"boolean\\\";\\n}\\n\\nboo(null);\"\n      ],\n      \"tests\": [\n        \"assert.strictEqual(boo(true), true, 'message: <code>boo(true)</code> 应该返回 true。');\",\n        \"assert.strictEqual(boo(false), true, 'message: <code>boo(false)</code> 应该返回 true。');\",\n        \"assert.strictEqual(boo([1, 2, 3]), false, 'message: <code>boo([1, 2, 3])</code> 应该返回 false。');\",\n        \"assert.strictEqual(boo([].slice), false, 'message: <code>boo([].slice)</code> 应该返回 false。');\",\n        \"assert.strictEqual(boo({ \\\"a\\\": 1 }), false, 'message: <code>boo({ \\\"a\\\": 1 })</code> 应该返回 false。');\",\n        \"assert.strictEqual(boo(1), false, 'message: <code>boo(1)</code> 应该返回 false。');\",\n        \"assert.strictEqual(boo(NaN), false, 'message: <code>boo(NaN)</code> 应该返回 false。');\",\n        \"assert.strictEqual(boo(\\\"a\\\"), false, 'message: <code>boo(\\\"a\\\")</code> 应该返回 false。');\",\n        \"assert.strictEqual(boo(\\\"true\\\"), false, 'message: <code>boo(\\\"true\\\")</code> 应该返回 false。');\",\n        \"assert.strictEqual(boo(\\\"false\\\"), false, 'message: <code>boo(\\\"false\\\")</code> 应该返回 false。');\"\n      ],\n      \"type\": \"bonfire\",\n      \"MDNlinks\": [\n        \"Boolean Objects\"\n      ],\n      \"isRequired\": true,\n      \"challengeType\": 5\n    },\n    {\n      \"id\": \"a105e963526e7de52b219be9\",\n      \"title\": \"Sorted Union\",\n      \"description\": [\n        \"写一个 function，传入两个或两个以上的数组，返回一个以给定的原始数组排序的不包含重复值的新数组。\",\n        \"换句话说，所有数组中的所有值都应该以原始顺序被包含在内，但是在最终的数组中不包含重复值。\",\n        \"非重复的数字应该以它们原始的顺序排序，但最终的数组不应该以数字顺序排序。\",\n        \"请参照下面验证判断中的例子。\",\n        \"如果你被卡住了，记得开大招 Read-Search-Ask。尝试与他人结伴编程、编写你自己的代码。\"\n      ],\n      \"challengeSeed\": [\n        \"function unite(arr1, arr2, arr3) {\",\n        \"  return arr1;\",\n        \"}\",\n        \"\",\n        \"unite([1, 3, 2], [5, 2, 1, 4], [2, 1]);\"\n      ],\n      \"solutions\": [\n        \"function unite(arr1, arr2, arr3) {\\n  return [].slice.call(arguments).reduce(function(a, b) {\\n    return [].concat(a, b.filter(function(e) {return a.indexOf(e) === -1;}));\\n  }, []);\\n}\"\n      ],\n      \"tests\": [\n        \"assert.deepEqual(unite([1, 3, 2], [5, 2, 1, 4], [2, 1]), [1, 3, 2, 5, 4], 'message: <code>unite([1, 3, 2], [5, 2, 1, 4], [2, 1])</code> 应该返回 <code>[1, 3, 2, 5, 4]</code>。');\",\n        \"assert.deepEqual(unite([1, 3, 2], [1, [5]], [2, [4]]), [1, 3, 2, [5], [4]], 'message: <code>unite([1, 3, 2], [1, [5]], [2, [4]])</code> 应该返回 <code>[1, 3, 2, [5], [4]]</code>。');\",\n        \"assert.deepEqual(unite([1, 2, 3], [5, 2, 1]), [1, 2, 3, 5], 'message: <code>unite([1, 2, 3], [5, 2, 1])</code> 应该返回 <code>[1, 2, 3, 5]</code>。');\",\n        \"assert.deepEqual(unite([1, 2, 3], [5, 2, 1, 4], [2, 1], [6, 7, 8]), [1, 2, 3, 5, 4, 6, 7, 8], 'message: <code>unite([1, 2, 3], [5, 2, 1, 4], [2, 1], [6, 7, 8])</code> 应该返回 <code>[1, 2, 3, 5, 4, 6, 7, 8]</code>。');\"\n      ],\n      \"type\": \"bonfire\",\n      \"MDNlinks\": [\n        \"Arguments object\",\n        \"Array.reduce()\"\n      ],\n      \"isRequired\": true,\n      \"challengeType\": 5\n    },\n    {\n      \"id\": \"a6b0bb188d873cb2c8729495\",\n      \"title\": \"Convert HTML Entities\",\n      \"description\": [\n        \"将字符串中的字符 <code>&</code>、<code><</code>、<code>></code>、<code>\\\"</code> （双引号）, 以及 <code>'</code> （单引号）转换为它们对应的 HTML 实体。\",\n        \"如果你被卡住了，记得开大招 Read-Search-Ask。尝试与他人结伴编程、编写你自己的代码。\"\n      ],\n      \"challengeSeed\": [\n        \"function convert(str) {\",\n        \"  // &colon;&rpar;\",\n        \"  return str;\",\n        \"}\",\n        \"\",\n        \"convert(\\\"Dolce & Gabbana\\\");\"\n      ],\n      \"solutions\": [\n        \"var MAP = { '&': '&amp;',\\n            '<': '&lt;',\\n            '>': '&gt;',\\n            '\\\"': '&quot;',\\n            \\\"'\\\": '&apos;'};\\n\\nfunction convert(str) {\\n  return str.replace(/[&<>\\\"']/g, function(c) {\\n    return MAP[c];\\n  });\\n}\"\n      ],\n      \"tests\": [\n        \"assert.match(convert(\\\"Dolce & Gabbana\\\"), /Dolce &amp; Gabbana/, 'message: <code>convert(\\\"Dolce & Gabbana\\\")</code> 应该返回 <code>Dolce &&#8203;amp; Gabbana</code>。');\",\n        \"assert.match(convert(\\\"Hamburgers < Pizza < Tacos\\\"), /Hamburgers &lt; Pizza &lt; Tacos/, 'message: <code>convert(\\\"Hamburgers < Pizza < Tacos\\\")</code> 应该返回 <code>Hamburgers &&#8203;lt; Pizza &&#8203;lt; Tacos</code>。');\",\n        \"assert.match(convert(\\\"Sixty > twelve\\\"), /Sixty &gt; twelve/, 'message: <code>convert(\\\"Sixty > twelve\\\")</code> 应该返回 <code>Sixty &&#8203;gt; twelve</code>。');\",\n        \"assert.match(convert('Stuff in \\\"quotation marks\\\"'), /Stuff in &quot;quotation marks&quot;/, 'message: <code>convert(&apos;Stuff in \\\"quotation marks\\\"&apos;)</code> 应该返回 <code>Stuff in &&#8203;quot;quotation marks&&#8203;quot;</code>。');\",\n        \"assert.match(convert(\\\"Shindler's List\\\"), /Shindler&apos;s List/, 'message: <code>convert(\\\"Shindler&apos;s List\\\")</code> 应该返回 <code>Shindler&&#8203;apos;s List</code>。');\",\n        \"assert.match(convert('<>'), /&lt;&gt;/, 'message: <code>convert(\\\"<>\\\")</code> 应该返回 <code>&&#8203;lt;&&#8203;gt;</code>。');\",\n        \"assert.strictEqual(convert('abc'), 'abc', 'message: <code>convert(\\\"abc\\\")</code> 应该返回 <code>abc</code>。');\"\n      ],\n      \"type\": \"bonfire\",\n      \"MDNlinks\": [\n        \"RegExp\",\n        \"HTML Entities\"\n      ],\n      \"isRequired\": true,\n      \"challengeType\": 5\n    },\n    {\n      \"id\": \"a103376db3ba46b2d50db289\",\n      \"title\": \"Spinal Tap Case\",\n      \"description\": [\n        \"将字符串转换为 spinal case。Spinal case 是 all-lowercase-words-joined-by-dashes 这种形式的，也就是以连字符连接所有小写单词。\",\n        \"如果你被卡住了，记得开大招 Read-Search-Ask。尝试与他人结伴编程、编写你自己的代码。\"\n      ],\n      \"challengeSeed\": [\n        \"function spinalCase(str) {\",\n        \"  // \\\"It's such a fine line between stupid, and clever.\\\"\",\n        \"  // --David St. Hubbins\",\n        \"  return str;\",\n        \"}\",\n        \"\",\n        \"spinalCase('This Is Spinal Tap');\"\n      ],\n      \"solutions\": [\n        \"function spinalCase(str) {\\n  // \\\"It's such a fine line between stupid, and clever.\\\"\\n  // --David St. Hubbins\\n  str = str.replace(/([a-z](?=[A-Z]))/g, '$1 ');\\n  return str.toLowerCase().replace(/\\\\ |\\\\_/g, '-');\\n}\"\n      ],\n      \"tests\": [\n        \"assert.deepEqual(spinalCase(\\\"This Is Spinal Tap\\\"), \\\"this-is-spinal-tap\\\", 'message: <code>spinalCase(\\\"This Is Spinal Tap\\\")</code> 应该返回 <code>\\\"this-is-spinal-tap\\\"</code>。');\",\n        \"assert.strictEqual(spinalCase('thisIsSpinalTap'), \\\"this-is-spinal-tap\\\", 'message: <code>spinalCase(\\\"thisIsSpinalTap\\\")</code> 应该返回 <code>\\\"this-is-spinal-tap\\\"</code>。');\",\n        \"assert.strictEqual(spinalCase(\\\"The_Andy_Griffith_Show\\\"), \\\"the-andy-griffith-show\\\", 'message: <code>spinalCase(\\\"The_Andy_Griffith_Show\\\")</code> 应该返回 <code>\\\"the-andy-griffith-show\\\"</code>。');\",\n        \"assert.strictEqual(spinalCase(\\\"Teletubbies say Eh-oh\\\"), \\\"teletubbies-say-eh-oh\\\", 'message: <code>spinalCase(\\\"Teletubbies say Eh-oh\\\")</code> 应该返回 <code>\\\"teletubbies-say-eh-oh\\\"</code>。');\"\n      ],\n      \"type\": \"bonfire\",\n      \"MDNlinks\": [\n        \"RegExp\",\n        \"String.replace()\"\n      ],\n      \"isRequired\": true,\n      \"challengeType\": 5\n    },\n    {\n      \"id\": \"a5229172f011153519423690\",\n      \"title\": \"Sum All Odd Fibonacci Numbers\",\n      \"description\": [\n        \"给一个正整数<code>num</code>，返回小于或等于<code>num</code>的斐波纳契奇数之和。\",\n        \"斐波纳契数列中的前几个数字是 1、1、2、3、5 和 8，随后的每一个数字都是前两个数字之和。\",\n        \"例如，sumFibs(4)应该返回 5，因为斐波纳契数列中所有小于4的奇数是 1、1、3。\",\n        \"提示：此题不能用递归来实现斐波纳契数列。因为当<code>num</code>较大时，内存会溢出，推荐用数组来实现。\",\n        \"参考文档：<a href='http://www.cnblogs.com/meteoric_cry/archive/2010/11/29/1891241.html'>博客园</a>，<a href='https://github.com/FreeCodeCampChina/freecodecamp.cn/issues/19'>Issue</a>\",\n        \"如果你被卡住了，记得开大招 Read-Search-Ask。尝试与他人结伴编程、编写你自己的代码。\"\n      ],\n      \"challengeSeed\": [\n        \"function sumFibs(num) {\",\n        \"  return num;\",\n        \"}\",\n        \"\",\n        \"sumFibs(4);\"\n      ],\n      \"solutions\": [\n        \"function sumFibs(num) {\\n  var a = 1; \\n  var b = 1;\\n  var s = 0;\\n  while (a <= num) {\\n    if (a % 2 !== 0) {   \\n      s += a; \\n    }\\n    a = [b, b=b+a][0];\\n  }\\n  return s;\\n}\"\n      ],\n      \"tests\": [\n        \"assert(typeof sumFibs(1) === \\\"number\\\", 'message: <code>sumFibs(1)</code> 应该返回一个数字。');\",\n        \"assert.deepEqual(sumFibs(1000), 1785, 'message: <code>sumFibs(1000)</code> 应该返回 1785。');\",\n        \"assert.deepEqual(sumFibs(4000000), 4613732, 'message: <code>sumFibs(4000000)</code> 应该返回 4613732。');\",\n        \"assert.deepEqual(sumFibs(4), 5, 'message: <code>sumFibs(4)</code> 应该返回 5。');\",\n        \"assert.deepEqual(sumFibs(75024), 60696, 'message: <code>sumFibs(75024)</code> 应该返回 60696。');\",\n        \"assert.deepEqual(sumFibs(75025), 135721, 'message: <code>sumFibs(75025)</code> 应该返回 135721。');\"\n      ],\n      \"type\": \"bonfire\",\n      \"MDNlinks\": [\n        \"Remainder\"\n      ],\n      \"isRequired\": true,\n      \"challengeType\": 5\n    },\n    {\n      \"id\": \"a3bfc1673c0526e06d3ac698\",\n      \"title\": \"Sum All Primes\",\n      \"description\": [\n        \"求小于等于给定数值的质数之和。\",\n        \"只有 1 和它本身两个约数的数叫质数。例如，2 是质数，因为它只能被 1 和 2 整除。1 不是质数，因为它只能被自身整除。\",\n        \"给定的数不一定是质数。\",\n        \"如果你被卡住了，记得开大招 Read-Search-Ask。尝试与他人结伴编程、编写你自己的代码。\"\n      ],\n      \"challengeSeed\": [\n        \"function sumPrimes(num) {\",\n        \"  return num;\",\n        \"}\",\n        \"\",\n        \"sumPrimes(10);\"\n      ],\n      \"solutions\": [\n        \"function eratosthenesArray(n) {\\n    var primes = [];\\n    if (n > 2) {\\n        var half = n>>1;\\n        var sieve = Array(half);\\n        for (var i = 1, limit = Math.sqrt(n)>>1; i <= limit; i++) {\\n            if (!sieve[i]) {\\n                for (var step = 2*i+1, j = (step*step)>>1; j < half; j+=step) {\\n                    sieve[j] = true;\\n                }\\n            }\\n        }\\n        primes.push(2);\\n        for (var p = 1; p < half; p++) {\\n            if (!sieve[p]) primes.push(2*p+1);\\n        }\\n    }\\n    return primes;\\n}\\n\\nfunction sumPrimes(num) {\\n  return eratosthenesArray(num+1).reduce(function(a,b) {return a+b;}, 0);\\n}\\n\\nsumPrimes(10);\"\n      ],\n      \"tests\": [\n        \"assert.deepEqual(typeof sumPrimes(10), 'number', 'message: <code>sumPrimes(10)</code> 应该返回一个数字。');\",\n        \"assert.deepEqual(sumPrimes(10), 17, 'message: <code>sumPrimes(10)</code> 应该返回 17。');\",\n        \"assert.deepEqual(sumPrimes(977), 73156, 'message: <code>sumPrimes(977)</code> 应该返回 73156。');\"\n      ],\n      \"type\": \"bonfire\",\n      \"MDNlinks\": [\n        \"For Loops\",\n        \"Array.push()\"\n      ],\n      \"isRequired\": true,\n      \"challengeType\": 5\n    },\n    {\n      \"id\": \"ae9defd7acaf69703ab432ea\",\n      \"title\": \"Smallest Common Multiple\",\n      \"description\": [\n        \"找出能被两个给定参数和它们之间的连续数字整除的最小公倍数。\",\n        \"范围是两个数字构成的数组，两个数字不一定按数字顺序排序。\",\n        \"例如对 1 和 3 —— 找出能被 1 和 3 和它们<em>之间</em>所有数字整除的最小公倍数。\",\n        \"如果你被卡住了，记得开大招 Read-Search-Ask 。尝试与他人结伴编程、编写你自己的代码。\"\n      ],\n      \"challengeSeed\": [\n        \"function smallestCommons(arr) {\",\n        \"  return arr;\",\n        \"}\",\n        \"\",\n        \"\",\n        \"smallestCommons([1,5]);\"\n      ],\n      \"solutions\": [\n        \"function gcd(a, b) {\\n    while (b !== 0) {\\n        a = [b, b = a % b][0];\\n    }\\n    return a;\\n}\\n\\nfunction lcm(a, b) {\\n    return (a * b) / gcd(a, b);\\n}\\n\\nfunction smallestCommons(arr) {\\n  arr.sort(function(a,b) {return a-b;});\\n  var rng = [];\\n  for (var i = arr[0]; i <= arr[1]; i++) {\\n    rng.push(i);\\n  }\\n  return rng.reduce(lcm);\\n}\"\n      ],\n      \"tests\": [\n        \"assert.deepEqual(typeof smallestCommons([1, 5]), 'number', 'message: <code>smallestCommons([1, 5])</code> 应该返回一个数字。');\",\n        \"assert.deepEqual(smallestCommons([1, 5]), 60, 'message: <code>smallestCommons([1, 5])</code> 应该返回 60。');\",\n        \"assert.deepEqual(smallestCommons([5, 1]), 60, 'message: <code>smallestCommons([5, 1])</code> 应该返回 60。');\",\n        \"assert.deepEqual(smallestCommons([1, 13]), 360360, 'message: <code>smallestCommons([1, 13])</code> 应该返回 360360。');\"\n      ],\n      \"type\": \"bonfire\",\n      \"MDNlinks\": [\n        \"Smallest Common Multiple\"\n      ],\n      \"isRequired\": true,\n      \"challengeType\": 5\n    },\n    {\n      \"id\": \"a6e40f1041b06c996f7b2406\",\n      \"title\": \"Finders Keepers\",\n      \"description\": [\n        \"写一个 <code>function</code>，它遍历数组 <code>arr</code>，并返回数组中第一个满足 <code>func</code> 返回值的元素。举个例子，如果 <code>arr</code> 为 <code>[1, 2, 3]</code>，<code>func</code> 为 <code>function(num) {return num === 2; }</code>，那么 <code>find</code> 的返回值应为 <code>2</code>。\",\n        \"如果你被卡住了，记得开大招 Read-Search-Ask。尝试与他人结伴编程、编写你自己的代码。\"\n      ],\n      \"challengeSeed\": [\n        \"function find(arr, func) {\",\n        \"  var num = 0;\",\n        \"  return num;\",\n        \"}\",\n        \"\",\n        \"find([1, 2, 3, 4], function(num){ return num % 2 === 0; });\"\n      ],\n      \"solutions\": [\n        \"function find(arr, func) {\\n  var num;\\n  arr.some(function(e) {\\n    if (func(e)) {\\n      num = e;\\n      return true;\\n    }\\n  });\\n  return num;\\n}\"\n      ],\n      \"tests\": [\n        \"assert.strictEqual(find([1, 3, 5, 8, 9, 10], function(num) { return num % 2 === 0; }), 8, 'message: <code>find([1, 3, 5, 8, 9, 10], function(num) { return num % 2 === 0; })</code> 应该返回 8。');\",\n        \"assert.strictEqual(find([1, 3, 5, 9], function(num) { return num % 2 === 0; }), undefined, 'message: <code>find([1, 3, 5, 9], function(num) { return num % 2 === 0; })</code> 应该返回 undefined。');\"\n      ],\n      \"type\": \"bonfire\",\n      \"MDNlinks\": [\n        \"Array.filter()\"\n      ],\n      \"isRequired\": true,\n      \"challengeType\": 5\n    },\n    {\n      \"id\": \"a5deed1811a43193f9f1c841\",\n      \"title\": \"Drop it\",\n      \"description\": [\n        \"<strong>队友该卖就卖，千万别舍不得。</strong>\",\n        \"当你的队伍被敌人包围时，你选择拯救谁、抛弃谁非常重要，如果选择错误就会造成团灭。\",\n        \"如果是AD或AP，优先拯救。\",\n        \"因为AD和AP是队伍输出的核心。\",\n        \"其次应该拯救打野。\",\n        \"因为打野死了对面就可以无所顾虑地打龙。\",\n        \"最后才是辅助或上单。\",\n        \"因为辅助和上单都是肉，死了也不会对团队造成毁灭性影响，该卖就卖。\",\n        \"但真实中的团战远比这要复杂，你的队伍很可能会被敌人分割成2个或3个部分。\",\n        \"当你救了一个重要的人时，很可能其他队友也会因此获救。\",\n        \"举个例子：\",\n        \"辅助和AD经常是在一起的，打野和中单在一起，上单经常一个人。\",\n        \"你救了AD，辅助也经常因此获救。\",\n        \"让我们来丢弃数组(arr)的元素，从左边开始，直到回调函数return true就停止。\",\n        \"第二个参数，<code>func</code>，是一个函数。用来测试数组的第一个元素，如果返回fasle，就从数组中抛出该元素(注意：此时数组已被改变)，继续测试数组的第一个元素，如果返回fasle，继续抛出，直到返回true。\",\n        \"最后返回数组的剩余部分，如果没有剩余，就返回一个空数组。\",\n        \"如果你被卡住了，记得开大招 Read-Search-Ask。尝试与他人结伴编程。编写你自己的代码。\"\n      ],\n      \"challengeSeed\": [\n        \"function drop(arr, func) {\",\n        \"  // Drop them elements.\",\n        \"  return arr;\",\n        \"}\",\n        \"\",\n        \"drop([1, 2, 3], function(n) {return n < 3; });\"\n      ],\n      \"solutions\": [\n        \"function drop(arr, func) {\\n  // Drop them elements.\\n  while (arr.length && !func(arr[0])) {\\n    arr.shift();\\n  }\\n  return arr;\\n}\"\n      ],\n      \"tests\": [\n        \"assert.deepEqual(drop([1, 2, 3, 4], function(n) {return n >= 3;}), [3, 4], 'message: <code>drop([1, 2, 3, 4], function(n) {return n >= 3;})</code> 应该返回 <code>[3, 4]</code>。');\",\n        \"assert.deepEqual(drop([0, 1, 0, 1], function(n) {return n === 1;}), [1, 0, 1], 'message: <code>drop([0, 1, 0, 1], function(n) {return n === 1;})</code> 应该返回 <code>[1, 0, 1]</code>。');\",\n        \"assert.deepEqual(drop([1, 2, 3], function(n) {return n > 0;}), [1, 2, 3], 'message: <code>drop([1, 2, 3], function(n) {return n > 0;})</code> 应该返回 <code>[1, 2, 3]</code>。');\",\n        \"assert.deepEqual(drop([1, 2, 3, 4], function(n) {return n > 5;}), [], 'message: <code>drop([1, 2, 3, 4], function(n) {return n > 5;})</code> 应该返回 <code>[]</code>。');\",\n        \"assert.deepEqual(drop([1, 2, 3, 7, 4], function(n) {return n > 3;}), [7, 4], 'message: <code>drop([1, 2, 3, 7, 4], function(n) {return n > 3;})</code> 应该返回 <code>[7, 4]</code>。');\",\n        \"assert.deepEqual(drop([1, 2, 3, 9, 2], function(n) {return n > 2;}), [3, 9, 2], 'message: <code>drop([1, 2, 3, 9, 2], function(n) {return n > 2;})</code> 应该返回 <code>[3, 9, 2]</code>。');\"\n      ],\n      \"type\": \"bonfire\",\n      \"MDNlinks\": [\n        \"Arguments object\",\n        \"Array.shift()\",\n        \"Array.slice()\"\n      ],\n      \"isRequired\": true,\n      \"challengeType\": 5\n    },\n    {\n      \"id\": \"ab306dbdcc907c7ddfc30830\",\n      \"title\": \"Steamroller\",\n      \"description\": [\n        \"对嵌套的数组进行扁平化处理。你必须考虑到不同层级的嵌套。\",\n        \"如果你被卡住了，记得开大招 Read-Search-Ask。尝试与他人结伴编程、编写你自己的代码。\"\n      ],\n      \"challengeSeed\": [\n        \"function steamroller(arr) {\",\n        \"  // I'm a steamroller, baby\",\n        \"  return arr;\",\n        \"}\",\n        \"\",\n        \"steamroller([1, [2], [3, [[4]]]]);\"\n      ],\n      \"solutions\": [\n        \"function steamroller(arr) {\\n  if (!Array.isArray(arr)) {\\n    return [arr];\\n  }\\n  var out = [];\\n  arr.forEach(function(e) {\\n    steamroller(e).forEach(function(v) {\\n      out.push(v);\\n    });\\n  });\\n  return out;\\n}\"\n      ],\n      \"tests\": [\n        \"assert.deepEqual(steamroller([[[\\\"a\\\"]], [[\\\"b\\\"]]]), [\\\"a\\\", \\\"b\\\"], 'message: <code>steamroller([[[\\\"a\\\"]], [[\\\"b\\\"]]])</code> 应该返回 <code>[\\\"a\\\", \\\"b\\\"]</code>。');\",\n        \"assert.deepEqual(steamroller([1, [2], [3, [[4]]]]), [1, 2, 3, 4], 'message: <code>steamroller([1, [2], [3, [[4]]]])</code> 应该返回 <code>[1, 2, 3, 4]</code>。');\",\n        \"assert.deepEqual(steamroller([1, [], [3, [[4]]]]), [1, 3, 4], 'message: <code>steamroller([1, [], [3, [[4]]]])</code> 应该返回 <code>[1, 3, 4]</code>。');\",\n        \"assert.deepEqual(steamroller([1, {}, [3, [[4]]]]), [1, {}, 3, 4], 'message: <code>steamroller([1, {}, [3, [[4]]]])</code> 应该返回 <code>[1, {}, 3, 4]</code>。');\"\n      ],\n      \"type\": \"bonfire\",\n      \"MDNlinks\": [\n        \"Array.isArray()\"\n      ],\n      \"isRequired\": true,\n      \"challengeType\": 5\n    },\n    {\n      \"id\": \"a8d97bd4c764e91f9d2bda01\",\n      \"title\": \"Binary Agents\",\n      \"description\": [\n        \"传入二进制字符串，翻译成英语句子并返回。\",\n        \"二进制字符串是以空格分隔的。\",\n        \"如果你被卡住了，记得开大招 Read-Search-Ask。尝试与他人结伴编程、编写你自己的代码。\"\n      ],\n      \"challengeSeed\": [\n        \"function binaryAgent(str) {\",\n        \"  return str;\",\n        \"}\",\n        \"\",\n        \"binaryAgent(\\\"01000001 01110010 01100101 01101110 00100111 01110100 00100000 01100010 01101111 01101110 01100110 01101001 01110010 01100101 01110011 00100000 01100110 01110101 01101110 00100001 00111111\\\");\"\n      ],\n      \"solutions\": [\n        \"function binaryAgent(str) {\\n  return str.split(' ').map(function(s) { return parseInt(s, 2); }).map(function(b) { return String.fromCharCode(b);}).join('');\\n}\"\n      ],\n      \"tests\": [\n        \"assert.deepEqual(binaryAgent('01000001 01110010 01100101 01101110 00100111 01110100 00100000 01100010 01101111 01101110 01100110 01101001 01110010 01100101 01110011 00100000 01100110 01110101 01101110 00100001 00111111'), \\\"Aren't bonfires fun!?\\\", 'message: <code>binaryAgent(\\\"01000001 01110010 01100101 01101110 00100111 01110100 00100000 01100010 01101111 01101110 01100110 01101001 01110010 01100101 01110011 00100000 01100110 01110101 01101110 00100001 00111111\\\")</code> 应该返回 \\\"Aren&#39;t bonfires fun!?\\\"');\",\n        \"assert.deepEqual(binaryAgent('01001001 00100000 01101100 01101111 01110110 01100101 00100000 01000110 01110010 01100101 01100101 01000011 01101111 01100100 01100101 01000011 01100001 01101101 01110000 00100001'), \\\"I love FreeCodeCamp!\\\", 'message: <code>binaryAgent(\\\"01001001 00100000 01101100 01101111 01110110 01100101 00100000 01000110 01110010 01100101 01100101 01000011 01101111 01100100 01100101 01000011 01100001 01101101 01110000 00100001\\\")</code> 应该返回 \\\"I love FreeCodeCamp!\\\"');\"\n      ],\n      \"type\": \"bonfire\",\n      \"MDNlinks\": [\n        \"String.charCodeAt()\",\n        \"String.fromCharCode()\"\n      ],\n      \"isRequired\": true,\n      \"challengeType\": 5\n    },\n    {\n      \"id\": \"a10d2431ad0c6a099a4b8b52\",\n      \"title\": \"Everything Be True\",\n      \"description\": [\n        \"<strong>所有的东西都是真的！</strong>\",\n        \"完善编辑器中的every函数，如果集合(collection)中的所有对象都存在对应的属性(pre)，并且属性(pre)对应的值为真。函数返回ture。反之，返回false。\",\n        \"记住：你只能通过中括号来访问对象的变量属性(pre)。\",\n        \"提示：你可以有多种实现方式，最简洁的方式莫过于<a href='https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array/every'>Array.prototype.every()</a>。\",\n        \"如果你被卡住了，记得开大招 Read-Search-Ask。尝试与他人结伴编程、编写你自己的代码。\"\n      ],\n      \"challengeSeed\": [\n        \"function every(collection, pre) {\",\n        \"  // Is everyone being true?\",\n        \"  return pre;\",\n        \"}\",\n        \"\",\n        \"every([{\\\"user\\\": \\\"Tinky-Winky\\\", \\\"sex\\\": \\\"male\\\"}, {\\\"user\\\": \\\"Dipsy\\\", \\\"sex\\\": \\\"male\\\"}, {\\\"user\\\": \\\"Laa-Laa\\\", \\\"sex\\\": \\\"female\\\"}, {\\\"user\\\": \\\"Po\\\", \\\"sex\\\": \\\"female\\\"}], \\\"sex\\\");\"\n      ],\n      \"solutions\": [\n        \"function every(collection, pre) {\\n  // Does everyone have one of these?\\n  return collection.every(function(e) { return e[pre]; });\\n}\"\n      ],\n      \"tests\": [\n        \"assert.strictEqual(every([{\\\"user\\\": \\\"Tinky-Winky\\\", \\\"sex\\\": \\\"male\\\"}, {\\\"user\\\": \\\"Dipsy\\\", \\\"sex\\\": \\\"male\\\"}, {\\\"user\\\": \\\"Laa-Laa\\\", \\\"sex\\\": \\\"female\\\"}, {\\\"user\\\": \\\"Po\\\", \\\"sex\\\": \\\"female\\\"}], \\\"sex\\\"), true, 'message: <code>every([{\\\"user\\\": \\\"Tinky-Winky\\\", \\\"sex\\\": \\\"male\\\"}, {\\\"user\\\": \\\"Dipsy\\\", \\\"sex\\\": \\\"male\\\"}, {\\\"user\\\": \\\"Laa-Laa\\\", \\\"sex\\\": \\\"female\\\"}, {\\\"user\\\": \\\"Po\\\", \\\"sex\\\": \\\"female\\\"}], \\\"sex\\\")</code> 应该返回 true。');\",\n        \"assert.strictEqual(every([{\\\"user\\\": \\\"Tinky-Winky\\\", \\\"sex\\\": \\\"male\\\"}, {\\\"user\\\": \\\"Dipsy\\\"}, {\\\"user\\\": \\\"Laa-Laa\\\", \\\"sex\\\": \\\"female\\\"}, {\\\"user\\\": \\\"Po\\\", \\\"sex\\\": \\\"female\\\"}], \\\"sex\\\"), false, 'message: <code>every([{\\\"user\\\": \\\"Tinky-Winky\\\", \\\"sex\\\": \\\"male\\\"}, {\\\"user\\\": \\\"Dipsy\\\"}, {\\\"user\\\": \\\"Laa-Laa\\\", \\\"sex\\\": \\\"female\\\"}, {\\\"user\\\": \\\"Po\\\", \\\"sex\\\": \\\"female\\\"}], \\\"sex\\\")</code> 应该返回 false。');\",\n        \"assert.strictEqual(every([{\\\"user\\\": \\\"Tinky-Winky\\\", \\\"sex\\\": \\\"male\\\", \\\"age\\\": 2}, {\\\"user\\\": \\\"Dipsy\\\", \\\"sex\\\": \\\"male\\\", \\\"age\\\": 0}, {\\\"user\\\": \\\"Laa-Laa\\\", \\\"sex\\\": \\\"female\\\", \\\"age\\\": 5}, {\\\"user\\\": \\\"Po\\\", \\\"sex\\\": \\\"female\\\", \\\"age\\\": 4}], \\\"age\\\"), false, 'message: <code>every([{\\\"user\\\": \\\"Tinky-Winky\\\", \\\"sex\\\": \\\"male\\\", \\\"age\\\": 0}, {\\\"user\\\": \\\"Dipsy\\\", \\\"sex\\\": \\\"male\\\", \\\"age\\\": 3}, {\\\"user\\\": \\\"Laa-Laa\\\", \\\"sex\\\": \\\"female\\\", \\\"age\\\": 5}, {\\\"user\\\": \\\"Po\\\", \\\"sex\\\": \\\"female\\\", \\\"age\\\": 4}], \\\"age\\\")</code> 应该返回 false。');\",\n        \"assert.strictEqual(every([{\\\"name\\\": \\\"Pete\\\", \\\"onBoat\\\": true}, {\\\"name\\\": \\\"Repeat\\\", \\\"onBoat\\\": true}, {\\\"name\\\": \\\"FastFoward\\\", \\\"onBoat\\\": null}], \\\"onBoat\\\"), false, 'message: <code>every([{\\\"name\\\": \\\"Pete\\\", \\\"onBoat\\\": true}, {\\\"name\\\": \\\"Repeat\\\", \\\"onBoat\\\": true}, {\\\"name\\\": \\\"FastFoward\\\", \\\"onBoat\\\": null}], \\\"onBoat\\\")</code> 应该返回 false');\",\n        \"assert.strictEqual(every([{\\\"name\\\": \\\"Pete\\\", \\\"onBoat\\\": true}, {\\\"name\\\": \\\"Repeat\\\", \\\"onBoat\\\": true, \\\"alias\\\": \\\"Repete\\\"}, {\\\"name\\\": \\\"FastFoward\\\", \\\"onBoat\\\": true}], \\\"onBoat\\\"), true, 'message: <code>every([{\\\"name\\\": \\\"Pete\\\", \\\"onBoat\\\": true}, {\\\"name\\\": \\\"Repeat\\\", \\\"onBoat\\\": true, \\\"alias\\\": \\\"Repete\\\"}, {\\\"name\\\": \\\"FastFoward\\\", \\\"onBoat\\\": true}], \\\"onBoat\\\")</code> 应该返回 true');\",\n        \"assert.strictEqual(every([{\\\"single\\\": \\\"yes\\\"}], \\\"single\\\"), true, 'message: <code>every([{\\\"single\\\": \\\"yes\\\"}], \\\"single\\\")</code> 应该返回 true');\",\n        \"assert.strictEqual(every([{\\\"single\\\": \\\"\\\"}, {\\\"single\\\": \\\"double\\\"}], \\\"single\\\"), false, 'message: <code>every([{\\\"single\\\": \\\"\\\"}, {\\\"single\\\": \\\"double\\\"}], \\\"single\\\")</code> 应该返回 false');\",\n        \"assert.strictEqual(every([{\\\"single\\\": \\\"double\\\"}, {\\\"single\\\": undefined}], \\\"single\\\"), false, 'message: <code>every([{\\\"single\\\": \\\"double\\\"}, {\\\"single\\\": undefined}], \\\"single\\\")</code> 应该返回 false');\",\n        \"assert.strictEqual(every([{\\\"single\\\": \\\"double\\\"}, {\\\"single\\\": NaN}], \\\"single\\\"), false, 'message: <code>every([{\\\"single\\\": \\\"double\\\"}, {\\\"single\\\": NaN}], \\\"single\\\")</code> 应该返回 false');\"\n      ],\n      \"isRequired\": true,\n      \"type\": \"bonfire\",\n      \"challengeType\": 5\n    },\n    {\n      \"id\": \"a97fd23d9b809dac9921074f\",\n      \"title\": \"Arguments Optional\",\n      \"description\": [\n        \"创建一个计算两个参数之和的 function。如果只有一个参数，则返回一个 function，该 function 请求一个参数然后返回求和的结果。\",\n        \"例如，<code>add(2, 3)</code> 应该返回 <code>5</code>，而 <code>add(2)</code> 应该返回一个 function。\",\n        \"调用这个有一个参数的返回的 function，返回求和的结果：\",\n        \"<code>var sumTwoAnd = add(2);</code>\",\n        \"<code>sumTwoAnd(3)</code> 返回 <code>5</code>。\",\n        \"只要存在非数字参数，就返回 undefined。\",\n        \"如果你被卡住了，记得开大招 Read-Search-Ask。尝试与他人结伴编程、编写你自己的代码。\"\n      ],\n      \"challengeSeed\": [\n        \"function add() {\",\n        \"  return false;\",\n        \"}\",\n        \"\",\n        \"add(2,3);\"\n      ],\n      \"solutions\": [\n        \"function add() {\\n  var a = arguments[0];\\n  if (toString.call(a) !== '[object Number]') return;  \\n  if (arguments.length === 1) {\\n    return function(b) {\\n      if (toString.call(b) !== '[object Number]') return;\\n      return a + b;\\n    };\\n  }\\n  var b = arguments[1];\\n  if (toString.call(b) !== '[object Number]') return;  \\n  return a + arguments[1];\\n}\"\n      ],\n      \"tests\": [\n        \"assert.deepEqual(add(2, 3), 5, 'message: <code>add(2, 3)</code> 应该返回 5。');\",\n        \"assert.deepEqual(add(2)(3), 5, 'message: <code>add(2)(3)</code> 应该返回 5。');\",\n        \"assert.isUndefined(add(\\\"http://bit.ly/IqT6zt\\\"), 'message: <code>add(\\\"http://bit.ly/IqT6zt\\\")</code> 应该返回 undefined。');\",\n        \"assert.isUndefined(add(2, \\\"3\\\"), 'message: <code>add(2, \\\"3\\\")</code> 应该返回 undefined。');\",\n        \"assert.isUndefined(add(2)([3]), 'message: <code>add(2)([3])</code> 应该返回 undefined。');\"\n      ],\n      \"type\": \"bonfire\",\n      \"MDNlinks\": [\n        \"Closures\",\n        \"Arguments object\"\n      ],\n      \"isRequired\": true,\n      \"challengeType\": 5\n    }\n  ]\n}\n"
  },
  {
    "path": "seed/challenges/01-front-end-development-certification/intermediate-ziplines.json",
    "content": "{\n  \"name\": \"Intermediate Front End Development Projects\",\n  \"order\": 11,\n  \"time\": \"100 hours\",\n  \"helpRoom\": \"chinese\",\n  \"challenges\": [\n    {\n      \"id\": \"bd7158d8c442eddfaeb5bd13\",\n      \"title\": \"Build a Random Quote Machine\",\n      \"description\": [\n        \"当你看不到右边的视频时，说明你还身处防火墙中，赶紧翻墙去体验<a href='https://github.com/getlantern/forum#%E8%93%9D%E7%81%AFlantern%E6%9C%80%E6%96%B0%E7%89%88%E6%9C%AC%E4%B8%8B%E8%BD%BD' target='_blank'>自由无阻碍的互联网</a>。\",\n        \"如果你还不明白翻墙对个人成长的重要性，请去看电影<a href='http://huluoyang.github.io/2016/02/25/the-shawshank-redemption/'>《肖申克的救赎》</a>。\",\n        \"<strong>目标:</strong> 设计一个功能类似于: <a href='https://codepen.io/hezag/full/ZGxOLX/' target='_blank'>https://codepen.io/hezag/full/ZGxOLX/</a>的应用。\",\n        \"<strong>规则#1:</strong> 代码是开源的，你可以借鉴，但请不要抄袭。\",\n        \"<strong>规则#2:</strong> 用你喜爱的任何库来定制属于你自己的风格，实现下面的<a href='http://www.cnblogs.com/henryhappier/archive/2011/02/23/1962617.html'>功能</a>。\",\n        \"<strong>功能#1:</strong> 点击一个按钮就生存一个新的随机引用短语。\",\n        \"<strong>功能#1:</strong> 点击一个按钮就把这个引用短语发到twitter中。\",\n        \"当你遇到困难的时候，记得查看错误提示、阅读文档、搜索、提问。\",\n        \"当你完成了这个项目，请点击 \\\"我已经完成了这个挑战\\\" 按钮，输入你的项目在CodePen上的链接。\",\n        \"你可以分享这个项目给<a href='mailto:jin@freecodecamp.cn'>JackJin</a>或<a href='//gitter.im/freecodecamp/chinese' target='_blank'>聊天室</a>来获得反馈。\"\n      ],\n      \"challengeSeed\": [\n        \"126415122\"\n      ],\n      \"tests\": [],\n      \"type\": \"zipline\",\n      \"isRequired\": true,\n      \"challengeType\": 3\n    },\n    {\n      \"id\": \"bd7158d8c442eddfaeb5bd10\",\n      \"title\": \"Show the Local Weather\",\n      \"description\": [\n        \"当你看不到右边的视频时，说明你还身处防火墙中，赶紧翻墙去体验<a href='https://github.com/getlantern/forum#%E8%93%9D%E7%81%AFlantern%E6%9C%80%E6%96%B0%E7%89%88%E6%9C%AC%E4%B8%8B%E8%BD%BD' target='_blank'>自由无阻碍的互联网</a>。\",\n        \"如果你还不明白翻墙对个人成长的重要性，请去看电影<a href='http://huluoyang.github.io/2016/02/25/the-shawshank-redemption/'>《肖申克的救赎》</a>。\",\n        \"<strong>目标:</strong> 设计一个功能类似于: <a href='https://codepen.io/S1ngS1ng/pen/WORqxP' target='_blank'>https://codepen.io/S1ngS1ng/full/WORqxP</a>的应用。\",\n        \"<strong>规则#1:</strong> 代码是开源的，你可以借鉴，但请不要抄袭。\",\n        \"<strong>规则#2:</strong> 用你喜爱的任何库来定制属于你自己的风格，实现下面的<a href='http://www.cnblogs.com/henryhappier/archive/2011/02/23/1962617.html'>功能</a>。\",\n        \"<strong>实现路径:</strong> 页面结构->样式->功能->接口->展示。\",\n        \"<strong>第一步:</strong> 用你熟悉的HTML快速构建出页面的结构。\",\n        \"<strong>第二步:</strong> 用CSS给页面添加样式，让页面变得漂亮起来。\",\n        \"<strong>第三步:</strong> 用JavaScript给页面添加功能，让页面能动起来。\",\n        \"<strong>第四步:</strong> 通过Ajax获取到JSON数据，来动态更新页面。\",\n        \"<strong>第五步:</strong> 把本地编辑器的代码放在CodePen或RunJS上，让大家都可以来观赏。\",\n        \"API：我们推荐使用<a href='https://www.juhe.cn/docs/api/id/39/aid/132'>聚合数据天气预报接口</a>，它需要你创建一个免费的APPKey，通过Ajax获取天气数据。\",\n        \"当你遇到困难的时候，记得查看错误提示、阅读文档、搜索、提问。\",\n        \"当你完成了这个项目，请点击 \\\"我已经完成了这个挑战\\\" 按钮，输入你的项目在CodePen上的链接。\",\n        \"你可以分享这个项目给<a href='mailto:jin@freecodecamp.cn'>JackJin</a>或<a href='//gitter.im/freecodecamp/chinese' target='_blank'>聊天室</a>来获得反馈。\"\n      ],\n      \"challengeSeed\": [\n        \"126415127\"\n      ],\n      \"tests\": [],\n      \"type\": \"zipline\",\n      \"challengeType\": 3,\n      \"isRequired\": true\n    },\n    {\n      \"id\": \"bd7158d8c442eddfaeb5bd19\",\n      \"title\": \"Build a Wikipedia Viewer\",\n      \"description\": [\n        \"当你看不到右边的视频时，说明你还身处防火墙中，赶紧翻墙去体验<a href='https://github.com/getlantern/forum#%E8%93%9D%E7%81%AFlantern%E6%9C%80%E6%96%B0%E7%89%88%E6%9C%AC%E4%B8%8B%E8%BD%BD' target='_blank'>自由无阻碍的互联网</a>。\",\n        \"如果你还不明白翻墙对个人成长的重要性，请去看电影<a href='http://huluoyang.github.io/2016/02/25/the-shawshank-redemption/'>《肖申克的救赎》</a>。\",\n        \"<strong>目标:</strong> 设计一个功能类似于: <a href='https://codepen.io/freeCodeCamp/full/wGqEga' target='_blank'>https://codepen.io/freeCodeCamp/full/wGqEga</a>的应用。\",\n        \"<strong>规则#1:</strong> 代码是开源的，你可以借鉴，但请不要抄袭。\",\n        \"<strong>规则#2:</strong> 用你喜爱的任何库来定制属于你自己的风格，实现下面的<a href='http://www.cnblogs.com/henryhappier/archive/2011/02/23/1962617.html'>功能</a>。\",\n        \"<strong>功能:</strong> 我可以在一个搜索框搜索维基百科的条目，并看到输出结果。\",\n        \"<strong>功能:</strong> 我可以点击一个按钮就看到一个随机的维基百科条目。\",\n        \"<span class='text-info'>提示 #1:</span> 这个URL可以让你获得一个随机的维基百科条目：<code>http://en.wikipedia.org/wiki/Special:Random</code>.\",\n        \"<span class='text-info'>提示 #2:</span> 这是你使用维基百科API的入口： <code>http://www.mediawiki.org/wiki/API:Main_page</code>.\",\n        \"<span class='text-info'>提示 #3:</span> 使用这个 <a href='https://en.wikipedia.org/wiki/Special:ApiSandbox#action=query&titles=Main%20Page&prop=revisions&rvprop=content&format=jsonfm' target='_blank'>传送门</a> 来体验维基百科的API。\",\n        \"当你遇到困难的时候，记得查看错误提示、阅读文档、搜索、提问。\",\n        \"当你完成了这个项目，请点击 \\\"我已经完成了这个挑战\\\" 按钮，输入你的项目在CodePen上的链接。\",\n        \"你可以分享这个项目给<a href='mailto:jin@freecodecamp.cn'>JackJin</a>或<a href='//gitter.im/freecodecamp/chinese' target='_blank'>聊天室</a>来获得反馈。\"\n      ],\n      \"challengeSeed\": [\n        \"126415131\"\n      ],\n      \"tests\": [],\n      \"type\": \"zipline\",\n      \"challengeType\": 3,\n      \"isRequired\": true\n    },\n    {\n      \"id\": \"bd7158d8c442eddfaeb5bd1f\",\n      \"title\": \"Use the Twitch.tv JSON API\",\n      \"description\": [\n        \"当你看不到右边的视频时，说明你还身处防火墙中，赶紧翻墙去体验<a href='https://github.com/getlantern/forum#%E8%93%9D%E7%81%AFlantern%E6%9C%80%E6%96%B0%E7%89%88%E6%9C%AC%E4%B8%8B%E8%BD%BD' target='_blank'>自由无阻碍的互联网</a>。\",\n        \"如果你还不明白翻墙对个人成长的重要性，请去看电影<a href='http://huluoyang.github.io/2016/02/25/the-shawshank-redemption/'>《肖申克的救赎》</a>。\",\n        \"<strong>目标:</strong> 设计一个功能类似于: <a href='https://codepen.io/freeCodeCamp/full/Myvqmo' target='_blank'>https://codepen.io/freeCodeCamp/full/Myvqmo</a>的应用。\",\n        \"<strong>规则#1:</strong> 代码是开源的，你可以借鉴，但请不要抄袭。\",\n        \"<strong>规则#2:</strong> 用你喜爱的任何库来定制属于你自己的风格，实现下面的<a href='http://www.cnblogs.com/henryhappier/archive/2011/02/23/1962617.html'>功能</a>。\",\n        \"<strong>功能:</strong> 我可以看到 FreeCodeCamp 现在是否在Twitch.tv上直播。\",\n        \"<strong>功能:</strong> 我可以点击链接跳到 FreeCodeCamp 在Twitch.tv上的频道。\",\n        \"<strong>功能:</strong> 如果有人在直播，我可以看到他正在直播什么。\",\n        \"<strong>功能:</strong> 如果直播者关闭了他的账户，我会看到一个404提示页面。\",\n        \"<strong>提示:</strong> 这有一个如何调用 Twitch.tv的JSONP API的示例：<a href='https://github.com/FreeCodeCamp/FreeCodeCamp/wiki/Front-End-Project-Use-Twitchtv-JSON-API' target='_blank'>https://github.com/FreeCodeCamp/FreeCodeCamp/wiki/Front-End-Project-Use-the-Twitchtv-JSON-API</a>.\",\n        \"<strong>提示:</strong> 这个文档有更多关于如何调用这个API的细节：<a href='https://github.com/justintv/Twitch-API/blob/master/v3_resources/streams.md#get-streamschannel' target='_blank'>https://github.com/justintv/Twitch-API/blob/master/v3_resources/streams.md#get-streamschannel</a>.\",\n        \"<strong>提示:</strong> 这有一个Twitch.tv 用户名数组，里面包含有通常正在直播写代码的人： <code>[\\\"freecodecamp\\\", \\\"storbeck\\\", \\\"terakilobyte\\\", \\\"habathcx\\\",\\\"RobotCaleb\\\",\\\"thomasballinger\\\",\\\"noobs2ninjas\\\",\\\"beohoff\\\"]</code>\",\n        \"当你遇到困难的时候，记得查看错误提示、阅读文档、搜索、提问。\",\n        \"当你完成了这个项目，请点击 \\\"我已经完成了这个挑战\\\" 按钮，输入你的项目在CodePen上的链接。\",\n        \"你可以分享这个项目给<a href='mailto:jin@freecodecamp.cn'>JackJin</a>或<a href='//gitter.im/freecodecamp/chinese' target='_blank'>聊天室</a>来获得反馈。\"\n      ],\n      \"challengeSeed\": [\n        \"126411564\"\n      ],\n      \"tests\": [],\n      \"type\": \"zipline\",\n      \"challengeType\": 3,\n      \"isRequired\": true\n    },\n    {\n      \"id\": \"bd7158d8c242eddfaeb5be13\",\n      \"title\": \"Design a danmu app\",\n      \"description\": [\n        \"此项目有难度，实在不会可以先跳过，学完后面再来完善。\",\n        \"当你看不到右边的视频时，说明你还身处防火墙中，赶紧翻墙去体验<a href='https://github.com/getlantern/forum#%E8%93%9D%E7%81%AFlantern%E6%9C%80%E6%96%B0%E7%89%88%E6%9C%AC%E4%B8%8B%E8%BD%BD' target='_blank'>自由无阻碍的互联网</a>。\",\n        \"如果你还不明白翻墙对个人成长的重要性，请去看电影<a href='http://huluoyang.github.io/2016/02/25/the-shawshank-redemption/'>《肖申克的救赎》</a>。\",\n        \"<strong>目标:</strong> 设计一个类似于右边的：<a href='http://codepen.io/huluoyang/full/GZbBwL/' target='_blank'>弹幕墙</a>。\",\n        \"<strong>规则1:</strong> 代码是开源的，你可以借鉴，但请不要抄袭。\",\n        \"<strong>规则2:</strong> 用你喜爱的任何库来定制属于你自己的风格，实现下面的功能</a>。\",\n        \"<strong>功能:</strong> 实现发射弹幕、清除弹幕、显示弹幕功能。\",\n        \"<strong>实现路径:</strong> 结构-->样式-->功能\",\n        \"<strong>第一步:</strong> 先设计一个简单的弹幕页面，上面有弹幕墙、输入框、按钮，并添加样式。\",\n        \"<strong>第二步:</strong> 然后给弹幕页面添加功能，能实现发射弹幕、清除弹幕、显示弹幕等功能。\",\n        \"当你遇到困难的时候，记得查看错误提示、阅读文档、搜索、提问。\",\n        \"当你完成了这个项目，请点击 \\\"我已经完成了这个挑战\\\" 按钮，输入你的项目在CodePen上的链接。\",\n        \"你可以分享这个项目给<a href='mailto:jin@freecodecamp.cn'>JackJin</a>或<a href='//gitter.im/freecodecamp/chinese' target='_blank'>聊天室</a>来获得反馈。\"\n      ],\n      \"challengeSeed\": [\n        \"167523128\"\n      ],\n      \"tests\": [],\n      \"type\": \"zipline\",\n      \"challengeType\": 3,\n      \"isRequired\": true\n    }\n  ]\n}\n"
  },
  {
    "path": "seed/challenges/01-front-end-development-certification/jquery.json",
    "content": "{\n  \"name\": \"jQuery\",\n  \"order\": 5,\n  \"time\": \"3 hours\",\n  \"helpRoom\": \"chinese\",\n  \"challenges\": [\n    {\n      \"id\": \"bad87fee1348bd9acdd08826\",\n      \"title\": \"Learn how Script Tags and Document Ready Work\",\n      \"description\": [\n        \"现在让我们开始学习最流行的JavaScript库jQuery吧，不用担心JavaScript本身，我们稍后会提到它。\",\n        \"在开始学习使用jQuery之前，我们需要加一些代码到HTML文件中。\",\n        \"首先在页面顶端增加一行<code>script</code>元素，然后写上结束符。\",\n        \"浏览器会运行<code>script</code> 里所有的Javascript，包括jQuery。\",\n        \"在你的<code>script</code>里，添加这个方法:<code>$(document).ready(function() {</code>到你的<code>script</code>，接下来用<code>});</code>结束这个方法\",\n        \"接下来我们来学习如何写<code>方法</code>，<code>方法</code>里面的代码会被浏览器加载。\",\n        \"在没有<code>document ready function</code>以前，你的代码会在HTML没有渲染完成就执行，这样会产生bug。\"\n      ],\n      \"challengeSeed\": [\n        \"\",\n        \"\",\n        \"<!-- 请把你的代码写在这条注释以上 -->\",\n        \"\",\n        \"<div class=\\\"container-fluid\\\">\",\n        \"  <h3 class=\\\"text-primary text-center\\\">jQuery Playground</h3>\",\n        \"  <div class=\\\"row\\\">\",\n        \"    <div class=\\\"col-xs-6\\\">\",\n        \"      <h4>#left-well</h4>\",\n        \"      <div class=\\\"well\\\" id=\\\"left-well\\\">\",\n        \"        <button class=\\\"btn btn-default target\\\" id=\\\"target1\\\">#target1</button>\",\n        \"        <button class=\\\"btn btn-default target\\\" id=\\\"target2\\\">#target2</button>\",\n        \"        <button class=\\\"btn btn-default target\\\" id=\\\"target3\\\">#target3</button>\",\n        \"      </div>\",\n        \"    </div>\",\n        \"    <div class=\\\"col-xs-6\\\">\",\n        \"      <h4>#right-well</h4>\",\n        \"      <div class=\\\"well\\\" id=\\\"right-well\\\">\",\n        \"        <button class=\\\"btn btn-default target\\\" id=\\\"target4\\\">#target4</button>\",\n        \"        <button class=\\\"btn btn-default target\\\" id=\\\"target5\\\">#target5</button>\",\n        \"        <button class=\\\"btn btn-default target\\\" id=\\\"target6\\\">#target6</button>\",\n        \"      </div>\",\n        \"    </div>\",\n        \"  </div>\",\n        \"</div>\"\n      ],\n      \"tests\": [\n        \"assert(code.match(/<\\\\/script\\\\s*>/g) && code.match(/<script(\\\\sasync|\\\\sdefer)*(\\\\s(charset|src|type)\\\\s*=\\\\s*[\\\"\\\\']+[^\\\"\\\\']*[\\\"\\\\']+)*(\\\\sasync|\\\\sdefer)*\\\\s*>/g) && code.match(/<\\\\/script\\\\s*>/g).length === code.match(/<script(\\\\sasync|\\\\sdefer)*(\\\\s(charset|src|type)\\\\s*=\\\\s*[\\\"\\\\']+[^\\\"\\\\']*[\\\"\\\\']+)*(\\\\sasync|\\\\sdefer)*\\\\s*>/g).length, 'message: 创建一个 <code>script</code> 元素，确保它是有效的，并且有关闭标签。');\",\n        \"assert(code.match(/\\\\$\\\\s*?\\\\(\\\\s*?document\\\\)\\\\.ready\\\\s*?\\\\(\\\\s*?function\\\\s*?\\\\(\\\\s*?\\\\)\\\\s*?\\\\{/g), 'message: 你应该添加 <code>$&#40;document&#41;.ready&#40;function&#40;&#41; {</code> 到 <code>script</code> 元素的开头部分。');\",\n        \"assert(code.match(/\\\\n*?\\\\s*?\\\\}\\\\s*?\\\\);/g), 'message: 使用 <code>}&#41;;</code> 来关闭 <code>$&#40;document&#41;.ready&#40;function&#40;&#41; {</code> function。');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 0\n    },\n    {\n      \"id\": \"bad87fee1348bd9bedc08826\",\n      \"title\": \"Target HTML Elements with Selectors Using jQuery\",\n      \"description\": [\n        \"现在我们已经知道 <code>document ready function</code>的用法了.\",\n        \"现在让我们开始写第一个jQuery语句，所有jQuery方法都是由<code>$</code>开始的，通常称作为 <code>美元符号</code>，或者简称为<code>bling</code>。\",\n        \"jQuery通过<code>选择器</code>来选择一个元素的，然后操作元素做些改变。\",\n        \"举个例子，要让所有的<code>按钮</code>做弹回效果，只要把这段代码写在<code>document ready function</code>里面就可以了。\",\n        \"<code>$(\\\"button\\\").addClass(\\\"animated bounce\\\");</code>\",\n        \"我们已经在后台为你引入了jQuery库和Animate.css库，这样你就可以在编辑器里直接可以使用这两个库，进而通过jQuery给<code>button</code>元素添加<code>bounce</code>回弹动画效果。\"\n      ],\n      \"challengeSeed\": [\n        \"fccss\",\n        \"  $(document).ready(function() {\",\n        \"\",\n        \"  });\",\n        \"fcces\",\n        \"\",\n        \"<!-- 请只修改这条注释以上的代码 -->\",\n        \"\",\n        \"<div class=\\\"container-fluid\\\">\",\n        \"  <h3 class=\\\"text-primary text-center\\\">jQuery Playground</h3>\",\n        \"  <div class=\\\"row\\\">\",\n        \"    <div class=\\\"col-xs-6\\\">\",\n        \"      <h4>#left-well</h4>\",\n        \"      <div class=\\\"well\\\" id=\\\"left-well\\\">\",\n        \"        <button class=\\\"btn btn-default target\\\" id=\\\"target1\\\">#target1</button>\",\n        \"        <button class=\\\"btn btn-default target\\\" id=\\\"target2\\\">#target2</button>\",\n        \"        <button class=\\\"btn btn-default target\\\" id=\\\"target3\\\">#target3</button>\",\n        \"      </div>\",\n        \"    </div>\",\n        \"    <div class=\\\"col-xs-6\\\">\",\n        \"      <h4>#right-well</h4>\",\n        \"      <div class=\\\"well\\\" id=\\\"right-well\\\">\",\n        \"        <button class=\\\"btn btn-default target\\\" id=\\\"target4\\\">#target4</button>\",\n        \"        <button class=\\\"btn btn-default target\\\" id=\\\"target5\\\">#target5</button>\",\n        \"        <button class=\\\"btn btn-default target\\\" id=\\\"target6\\\">#target6</button>\",\n        \"      </div>\",\n        \"    </div>\",\n        \"  </div>\",\n        \"</div>\"\n      ],\n      \"tests\": [\n        \"assert($(\\\"button\\\").hasClass(\\\"animated\\\") && $(\\\"button\\\").hasClass(\\\"bounce\\\"), 'message: 使用 jQuery 的 <code>addClass&#40&#41</code> function 为你的 <code>button</code> 元素添加 class <code>animated</code> 和 <code>bounce</code>。');\",\n        \"assert(!code.match(/class.*animated/g), 'message: 只用 jQuery 来为元素添加 class。');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 0\n    },\n    {\n      \"id\": \"bad87fee1348bd9aedc08826\",\n      \"title\": \"Target Elements by Class Using jQuery\",\n      \"description\": [\n        \"你看到我们是怎么给所有的<code>按钮</code>做弹回效果了吗？我们用 <code>$(\\\"button\\\")</code>来选中按钮，然后用<code>.addClass(\\\"animated bounce\\\")</code>给按钮加CSS class。\",\n        \"你只需要用jQuery的<code>.addClass()</code>方法，就可以给元素加class了。\",\n        \"首先，我们来使用<code>$(\\\".well\\\")</code>来获取所有class为<code>well</code>的<code>div</code>元素。\",\n        \"仔细想想为什么需要在<code>well</code>前面添加<code>.</code>\",\n        \"然后使用jQuery的<code>.addClass()</code>方法添加2个class：<code>animated</code>、<code>shake</code>。\",\n        \"例如，你可以将下面的代码写在<code>document ready function</code>里：\",\n        \"<code>$(\\\".text-primary\\\").addClass(\\\"animated shake\\\");</code>\",\n        \"上面的代码给所有class为<code>text-primary</code> 的元素添加shake class。\"\n      ],\n      \"challengeSeed\": [\n        \"fccss\",\n        \"  $(document).ready(function() {\",\n        \"    $(\\\"button\\\").addClass(\\\"animated bounce\\\");\",\n        \"  });\",\n        \"fcces\",\n        \"\",\n        \"<!-- 请只修改这条注释以上的代码 -->\",\n        \"\",\n        \"<div class=\\\"container-fluid\\\">\",\n        \"  <h3 class=\\\"text-primary text-center\\\">jQuery Playground</h3>\",\n        \"  <div class=\\\"row\\\">\",\n        \"    <div class=\\\"col-xs-6\\\">\",\n        \"      <h4>#left-well</h4>\",\n        \"      <div class=\\\"well\\\" id=\\\"left-well\\\">\",\n        \"        <button class=\\\"btn btn-default target\\\" id=\\\"target1\\\">#target1</button>\",\n        \"        <button class=\\\"btn btn-default target\\\" id=\\\"target2\\\">#target2</button>\",\n        \"        <button class=\\\"btn btn-default target\\\" id=\\\"target3\\\">#target3</button>\",\n        \"      </div>\",\n        \"    </div>\",\n        \"    <div class=\\\"col-xs-6\\\">\",\n        \"      <h4>#right-well</h4>\",\n        \"      <div class=\\\"well\\\" id=\\\"right-well\\\">\",\n        \"        <button class=\\\"btn btn-default target\\\" id=\\\"target4\\\">#target4</button>\",\n        \"        <button class=\\\"btn btn-default target\\\" id=\\\"target5\\\">#target5</button>\",\n        \"        <button class=\\\"btn btn-default target\\\" id=\\\"target6\\\">#target6</button>\",\n        \"      </div>\",\n        \"    </div>\",\n        \"  </div>\",\n        \"</div>\"\n      ],\n      \"tests\": [\n        \"assert($(\\\".well\\\").hasClass(\\\"animated\\\") && $(\\\".well\\\").hasClass(\\\"shake\\\"), 'message: 使用jQuery的<code>addClass()</code>方法给所有类名中含有<code>well</code>的元素添加 <code>animated shake</code>这两个类.');\",\n        \"assert(!code.match(/class\\\\.\\\\*animated/g), 'message: 只能使用jQuery给元素添加类。');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 0\n    },\n    {\n      \"id\": \"bad87fee1348bd9aeda08826\",\n      \"title\": \"Target Elements by ID Using jQuery\",\n      \"description\": [\n        \"你还可以根据id属性来获取元素\",\n        \"首先用<code>$(\\\"#target3\\\")</code>来选择id为<code>target3</code>的<code>button</code>元素。\",\n        \"注意，就像CSS一样，在id的名字前加上 <code>#</code>。 \",\n        \"然后使用jQuery的<code>.addClass()</code>方法来添加 <code>animated</code>和<code>fadeOut</code>class.\",\n        \"例如：下面的代码就是给id为<code>target6</code>的<code>button</code>元素添加fade out效果的：\",\n        \"<code>$(\\\"#target6\\\").addClass(\\\"animated fadeOut\\\")</code>\"\n      ],\n      \"challengeSeed\": [\n        \"fccss\",\n        \"  $(document).ready(function() {\",\n        \"    $(\\\"button\\\").addClass(\\\"animated bounce\\\");\",\n        \"    $(\\\".well\\\").addClass(\\\"animated shake\\\");\",\n        \"\",\n        \"  });\",\n        \"fcces\",\n        \"\",\n        \"<!-- 请只修改这条注释以上的代码 -->\",\n        \"\",\n        \"<div class=\\\"container-fluid\\\">\",\n        \"  <h3 class=\\\"text-primary text-center\\\">jQuery Playground</h3>\",\n        \"  <div class=\\\"row\\\">\",\n        \"    <div class=\\\"col-xs-6\\\">\",\n        \"      <h4>#left-well</h4>\",\n        \"      <div class=\\\"well\\\" id=\\\"left-well\\\">\",\n        \"        <button class=\\\"btn btn-default target\\\" id=\\\"target1\\\">#target1</button>\",\n        \"        <button class=\\\"btn btn-default target\\\" id=\\\"target2\\\">#target2</button>\",\n        \"        <button class=\\\"btn btn-default target\\\" id=\\\"target3\\\">#target3</button>\",\n        \"      </div>\",\n        \"    </div>\",\n        \"    <div class=\\\"col-xs-6\\\">\",\n        \"      <h4>#right-well</h4>\",\n        \"      <div class=\\\"well\\\" id=\\\"right-well\\\">\",\n        \"        <button class=\\\"btn btn-default target\\\" id=\\\"target4\\\">#target4</button>\",\n        \"        <button class=\\\"btn btn-default target\\\" id=\\\"target5\\\">#target5</button>\",\n        \"        <button class=\\\"btn btn-default target\\\" id=\\\"target6\\\">#target6</button>\",\n        \"      </div>\",\n        \"    </div>\",\n        \"  </div>\",\n        \"</div>\"\n      ],\n      \"tests\": [\n        \"assert($(\\\"#target3\\\").hasClass(\\\"animated\\\"), 'message: 选择 <code>button</code> 给它的 <code>id</code> 写成 <code>target3</code>。 然后使用 jQuery <code>addClass&#40&#41</code> 给它添加一个 <code>animated</code> class。');\",\n        \"assert(($(\\\"#target3\\\").hasClass(\\\"fadeOut\\\") || $(\\\"#target3\\\").hasClass(\\\"fadeout\\\"))  && code.match(/\\\\$\\\\(.#target3.\\\\)/g), 'message: 选中 id <code>target3</code> 然后使用 jQuery <code>addClass&#40&#41</code> 给它添加一个 <code>fadeOut</code> class。');\",\n        \"assert(!code.match(/class.*animated/g), 'message: 只使用 jQuery 来添加这些 class 到元素中。');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 0\n    },\n    {\n      \"id\": \"bad87fee1348bd9aeda08726\",\n      \"title\": \"Delete your jQuery Functions\",\n      \"description\": [\n        \"这些动画效果一开始很cool，但是动画太多就有点喧宾夺主了。\",\n        \"在你的<code>document ready function</code>里删掉那三条语句，只留<code>document ready function</code>。\"\n      ],\n      \"challengeSeed\": [\n        \"fccss\",\n        \"  $(document).ready(function() {\",\n        \"    $(\\\"button\\\").addClass(\\\"animated bounce\\\");\",\n        \"    $(\\\".well\\\").addClass(\\\"animated shake\\\");\",\n        \"    $(\\\"#target3\\\").addClass(\\\"animated fadeOut\\\");\",\n        \"\",\n        \"  });\",\n        \"fcces\",\n        \"\",\n        \"<!-- 请只修改这条注释以上的代码 -->\",\n        \"\",\n        \"<div class=\\\"container-fluid\\\">\",\n        \"  <h3 class=\\\"text-primary text-center\\\">jQuery Playground</h3>\",\n        \"  <div class=\\\"row\\\">\",\n        \"    <div class=\\\"col-xs-6\\\">\",\n        \"      <h4>#left-well</h4>\",\n        \"      <div class=\\\"well\\\" id=\\\"left-well\\\">\",\n        \"        <button class=\\\"btn btn-default target\\\" id=\\\"target1\\\">#target1</button>\",\n        \"        <button class=\\\"btn btn-default target\\\" id=\\\"target2\\\">#target2</button>\",\n        \"        <button class=\\\"btn btn-default target\\\" id=\\\"target3\\\">#target3</button>\",\n        \"      </div>\",\n        \"    </div>\",\n        \"    <div class=\\\"col-xs-6\\\">\",\n        \"      <h4>#right-well</h4>\",\n        \"      <div class=\\\"well\\\" id=\\\"right-well\\\">\",\n        \"        <button class=\\\"btn btn-default target\\\" id=\\\"target4\\\">#target4</button>\",\n        \"        <button class=\\\"btn btn-default target\\\" id=\\\"target5\\\">#target5</button>\",\n        \"        <button class=\\\"btn btn-default target\\\" id=\\\"target6\\\">#target6</button>\",\n        \"      </div>\",\n        \"    </div>\",\n        \"  </div>\",\n        \"</div>\"\n      ],\n      \"tests\": [\n        \"assert(!code.match(/e\\\"\\\\);/g) && !code.match(/t\\\"\\\\);/g), 'message: 在你的<code>document ready function</code>里删掉那三条语句，只留<code>document ready function</code>。');\",\n        \"assert(code.match(/<script>/g), 'message: 保证你的 <code>script</code> 开头完好无缺。');\",\n        \"assert(code.match(/\\\\$\\\\(document\\\\)\\\\.ready\\\\(function\\\\(\\\\)\\\\s?\\\\{/g), 'message: 保证 <code>$&#40document&#41.ready&#40function&#40&#41 {</code> 的完整性。');\",\n        \"assert(code.match(/\\\\n\\\\s+?\\\\}\\\\);/g), 'message: 保证 \\\"document ready function\\\" 的结尾 <code>&#125;&#41;</code> 的完整性。');\",\n        \"assert(code.match(/<\\\\/script>/g) && code.match(/<script/g) && code.match(/<\\\\/script>/g).length === code.match(/<script/g).length, 'message: 保证你的 <code>script</code> 结尾完好无缺。');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 0\n    },\n    {\n      \"id\": \"bad87fee1348bd9aed908626\",\n      \"title\": \"Target the same element with multiple jQuery Selectors\",\n      \"description\": [\n        \"现在你已经了解了3种选择器：元素选择器：<code>$(\\\"button\\\")</code>、class选择器：<code>$(\\\".btn\\\")</code>、id选择器：<code>$(\\\"#target1\\\")</code>。\",\n        \"尽管用<code>.addClass()</code>这种方式就可以加不同的class，不过还是让我们尝试用不同的方式给元素添加class吧。\",\n        \"用上面介绍的jQuery选择器和<code>addClass()</code>方法：\",\n        \"给所有type为<code>button</code>的元素添加<code>animated</code> class。\",\n        \"给所有class为<code>.btn</code>的按钮添加<code>shake</code> class。\",\n        \"给所有id为<code>#target1</code>的按钮添加<code>btn-primary</code> class。\"\n      ],\n      \"challengeSeed\": [\n        \"fccss\",\n        \"  $(document).ready(function() {\",\n        \"\",\n        \"  });\",\n        \"fcces\",\n        \"\",\n        \"<!-- 请只修改这条注释以上的代码 -->\",\n        \"\",\n        \"<div class=\\\"container-fluid\\\">\",\n        \"  <h3 class=\\\"text-primary text-center\\\">jQuery Playground</h3>\",\n        \"  <div class=\\\"row\\\">\",\n        \"    <div class=\\\"col-xs-6\\\">\",\n        \"      <h4>#left-well</h4>\",\n        \"      <div class=\\\"well\\\" id=\\\"left-well\\\">\",\n        \"        <button class=\\\"btn btn-default target\\\" id=\\\"target1\\\">#target1</button>\",\n        \"        <button class=\\\"btn btn-default target\\\" id=\\\"target2\\\">#target2</button>\",\n        \"        <button class=\\\"btn btn-default target\\\" id=\\\"target3\\\">#target3</button>\",\n        \"      </div>\",\n        \"    </div>\",\n        \"    <div class=\\\"col-xs-6\\\">\",\n        \"      <h4>#right-well</h4>\",\n        \"      <div class=\\\"well\\\" id=\\\"right-well\\\">\",\n        \"        <button class=\\\"btn btn-default target\\\" id=\\\"target4\\\">#target4</button>\",\n        \"        <button class=\\\"btn btn-default target\\\" id=\\\"target5\\\">#target5</button>\",\n        \"        <button class=\\\"btn btn-default target\\\" id=\\\"target6\\\">#target6</button>\",\n        \"      </div>\",\n        \"    </div>\",\n        \"  </div>\",\n        \"</div>\"\n      ],\n      \"tests\": [\n        \"assert(code.match(/\\\\$\\\\s*?\\\\(\\\\s*?(?:'|\\\")\\\\s*?button\\\\s*?(?:'|\\\")/gi), 'message: 使用 <code>$&#40\\\"button\\\"&#41</code> 选择器。');\",\n        \"assert(code.match(/\\\\$\\\\s*?\\\\(\\\\s*?(?:'|\\\")\\\\s*?\\\\.btn\\\\s*?(?:'|\\\")/gi), 'message: 使用 <code>$&#40\\\".btn\\\"&#41</code> 选择器。');\",\n        \"assert(code.match(/\\\\$\\\\s*?\\\\(\\\\s*?(?:'|\\\")\\\\s*?#target1\\\\s*?(?:'|\\\")/gi), 'message: 使用 <code>$&#40\\\"#target1\\\"&#41</code> 选择器。');\",\n        \"assert(code.match(/addClass/g) && code.match(/addClass\\\\(\\\\s*?('|\\\")[\\\\w-]+\\\\1\\\\s*?\\\\)/g).length > 2, 'message: 在每个选择器中只添加一个 class。');\",\n        \"assert($(\\\"#target1\\\").hasClass(\\\"animated\\\") && $(\\\"#target1\\\").hasClass(\\\"shake\\\") && $(\\\"#target1\\\").hasClass(\\\"btn-primary\\\"), 'message: 你的 <code>#target1</code> 元素应该有class <code>animated</code>&#130; <code>shake</code> 和 <code>btn-primary</code>。');\",\n        \"assert(!code.match(/class.*animated/g), 'message: 只使用 jQuery来添加这些class到元素中。');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 0\n    },\n    {\n      \"id\": \"bad87fee1348bd9aed918626\",\n      \"title\": \"Remove classes from an element with jQuery\",\n      \"description\": [\n        \"你可以通过jQuery的<code>addClass()</code>方法给元素添加class,也可以通过jQuery<code>removeClass()</code>方法去掉元素上的class。\",\n        \"像下面这样：\",\n        \"<code>$(\\\"#target2\\\").removeClass(\\\"btn-default\\\");</code>\",\n        \"<code>$(\\\"#target2\\\").removeClass(\\\"btn-default\\\");</code>\",\n        \"来尝试把所有<code>button</code>元素上的<code>btn-default</code> class移除掉。 \"\n      ],\n      \"challengeSeed\": [\n        \"fccss\",\n        \"  $(document).ready(function() {\",\n        \"    $(\\\"button\\\").addClass(\\\"animated bounce\\\");\",\n        \"    $(\\\".well\\\").addClass(\\\"animated shake\\\");\",\n        \"    $(\\\"#target3\\\").addClass(\\\"animated fadeOut\\\");\",\n        \"\",\n        \"  });\",\n        \"fcces\",\n        \"\",\n        \"<!-- 请只修改这条注释以上的代码 -->\",\n        \"\",\n        \"<div class=\\\"container-fluid\\\">\",\n        \"  <h3 class=\\\"text-primary text-center\\\">jQuery Playground</h3>\",\n        \"  <div class=\\\"row\\\">\",\n        \"    <div class=\\\"col-xs-6\\\">\",\n        \"      <h4>#left-well</h4>\",\n        \"      <div class=\\\"well\\\" id=\\\"left-well\\\">\",\n        \"        <button class=\\\"btn btn-default target\\\" id=\\\"target1\\\">#target1</button>\",\n        \"        <button class=\\\"btn btn-default target\\\" id=\\\"target2\\\">#target2</button>\",\n        \"        <button class=\\\"btn btn-default target\\\" id=\\\"target3\\\">#target3</button>\",\n        \"      </div>\",\n        \"    </div>\",\n        \"    <div class=\\\"col-xs-6\\\">\",\n        \"      <h4>#right-well</h4>\",\n        \"      <div class=\\\"well\\\" id=\\\"right-well\\\">\",\n        \"        <button class=\\\"btn btn-default target\\\" id=\\\"target4\\\">#target4</button>\",\n        \"        <button class=\\\"btn btn-default target\\\" id=\\\"target5\\\">#target5</button>\",\n        \"        <button class=\\\"btn btn-default target\\\" id=\\\"target6\\\">#target6</button>\",\n        \"      </div>\",\n        \"    </div>\",\n        \"  </div>\",\n        \"</div>\"\n      ],\n      \"tests\": [\n        \"assert($(\\\".btn-default\\\").length === 0, 'message: 在 <code>button</code> 元素上移除 <code>btn-default</code> class。');\",\n        \"assert(code.match(/btn btn-default/g), 'message: 只使用 jQuery 来移除从这个元素移除 class。');\",\n        \"assert(code.match(/\\\\.[\\\\v\\\\s]*removeClass[\\\\s\\\\v]*\\\\([\\\\s\\\\v]*('|\\\")\\\\s*btn-default\\\\s*('|\\\")[\\\\s\\\\v]*\\\\)/gm), 'message: 只移除 <code>btn-default</code> class.');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 0\n    },\n    {\n      \"id\": \"bad87fee1348bd9aed908826\",\n      \"title\": \"Change the CSS of an Element Using jQuery\",\n      \"description\": [\n        \"我们可以通过jQuery来改变HTML元素的CSS样式。\",\n        \"jQuery有一个叫做<code>.css()</code>的方法能让你改变元素的CSS样式。\",\n        \"我们是这样来把颜色改变成蓝色的:\",\n        \"<code>$(\\\"#target1\\\").css(\\\"color\\\", \\\"blue\\\");</code>\",\n        \"这跟通常的CSS语法有点不同，这里CSS的属性和值是在引号内的，并且用逗号分开。\",\n        \"把你的<code>document ready function</code>清空，\",\n        \"来尝试把<code>target1</code>改变成红色。\"\n      ],\n      \"challengeSeed\": [\n        \"fccss\",\n        \"  $(document).ready(function() {\",\n        \"    $(\\\"button\\\").addClass(\\\"animated bounce\\\");\",\n        \"    $(\\\".well\\\").addClass(\\\"animated shake\\\");\",\n        \"    $(\\\"#target3\\\").addClass(\\\"animated fadeOut\\\");\",\n        \"    $(\\\"button\\\").removeClass(\\\"btn-default\\\");\",\n        \"\",\n        \"  });\",\n        \"fcces\",\n        \"\",\n        \"<!-- 请只修改这条注释以上的代码 -->\",\n        \"\",\n        \"<div class=\\\"container-fluid\\\">\",\n        \"  <h3 class=\\\"text-primary text-center\\\">jQuery Playground</h3>\",\n        \"  <div class=\\\"row\\\">\",\n        \"    <div class=\\\"col-xs-6\\\">\",\n        \"      <h4>#left-well</h4>\",\n        \"      <div class=\\\"well\\\" id=\\\"left-well\\\">\",\n        \"        <button class=\\\"btn btn-default target\\\" id=\\\"target1\\\">#target1</button>\",\n        \"        <button class=\\\"btn btn-default target\\\" id=\\\"target2\\\">#target2</button>\",\n        \"        <button class=\\\"btn btn-default target\\\" id=\\\"target3\\\">#target3</button>\",\n        \"      </div>\",\n        \"    </div>\",\n        \"    <div class=\\\"col-xs-6\\\">\",\n        \"      <h4>#right-well</h4>\",\n        \"      <div class=\\\"well\\\" id=\\\"right-well\\\">\",\n        \"        <button class=\\\"btn btn-default target\\\" id=\\\"target4\\\">#target4</button>\",\n        \"        <button class=\\\"btn btn-default target\\\" id=\\\"target5\\\">#target5</button>\",\n        \"        <button class=\\\"btn btn-default target\\\" id=\\\"target6\\\">#target6</button>\",\n        \"      </div>\",\n        \"    </div>\",\n        \"  </div>\",\n        \"</div>\"\n      ],\n      \"tests\": [\n        \"assert($(\\\"#target1\\\").css(\\\"color\\\") === 'rgb(255, 0, 0)', 'message: 你的 <code>target1</code> 应该是红色。');\",\n        \"assert(!code.match(/class.*animated/g), 'message: 请使用jQuery来实现，而不是原生js。');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 0\n    },\n    {\n      \"id\": \"bad87fee1348bd9aed808826\",\n      \"title\": \"Disable an Element Using jQuery\",\n      \"description\": [\n        \"你还可以用jQuery改变除了CSS以外的属性。比如，你可以让按钮变不可选。\",\n        \"当你把按钮设置成不可选以后，这会让按钮变灰并且不能点击。\",\n        \"jQuery有一个<code>.prop()</code>的方法让你来调整元素的属性.\",\n        \"我们是这样来让按钮不可选的:\",\n        \"<code>$(\\\"button\\\").prop(\\\"disabled\\\", true);</code>\",\n        \"<code>$(\\\"button\\\").prop(\\\"disabled\\\", true);</code>\",\n        \"来尝试让 <code>target1</code> 按钮不可选.\"\n      ],\n      \"challengeSeed\": [\n        \"fccss\",\n        \"  $(document).ready(function() {\",\n        \"    $(\\\"#target1\\\").css(\\\"color\\\", \\\"red\\\");\",\n        \"\",\n        \"  });\",\n        \"fcces\",\n        \"\",\n        \"<!-- 请只修改这条注释以上的代码 -->\",\n        \"\",\n        \"<div class=\\\"container-fluid\\\">\",\n        \"  <h3 class=\\\"text-primary text-center\\\">jQuery Playground</h3>\",\n        \"  <div class=\\\"row\\\">\",\n        \"    <div class=\\\"col-xs-6\\\">\",\n        \"      <h4>#left-well</h4>\",\n        \"      <div class=\\\"well\\\" id=\\\"left-well\\\">\",\n        \"        <button class=\\\"btn btn-default target\\\" id=\\\"target1\\\">#target1</button>\",\n        \"        <button class=\\\"btn btn-default target\\\" id=\\\"target2\\\">#target2</button>\",\n        \"        <button class=\\\"btn btn-default target\\\" id=\\\"target3\\\">#target3</button>\",\n        \"      </div>\",\n        \"    </div>\",\n        \"    <div class=\\\"col-xs-6\\\">\",\n        \"      <h4>#right-well</h4>\",\n        \"      <div class=\\\"well\\\" id=\\\"right-well\\\">\",\n        \"        <button class=\\\"btn btn-default target\\\" id=\\\"target4\\\">#target4</button>\",\n        \"        <button class=\\\"btn btn-default target\\\" id=\\\"target5\\\">#target5</button>\",\n        \"        <button class=\\\"btn btn-default target\\\" id=\\\"target6\\\">#target6</button>\",\n        \"      </div>\",\n        \"    </div>\",\n        \"  </div>\",\n        \"</div>\"\n      ],\n      \"tests\": [\n        \"assert($(\\\"#target1\\\") && $(\\\"#target1\\\").prop(\\\"disabled\\\"), 'message: 禁用你的 <code>target1</code> 按钮。');\",\n        \"assert($(\\\"#target2\\\") && !$(\\\"#target2\\\").prop(\\\"disabled\\\"), 'message: 不要禁用任何其他按钮');\",\n        \"assert(!code.match(/disabled>/g), 'message: 只使用 jQuery 来添加 class 到这些元素。');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 0\n    },\n    {\n      \"id\": \"564944c91be2204b269d51e3\",\n      \"title\": \"Change Text Inside an Element Using jQuery\",\n      \"description\": [\n        \"jQuery不仅可以改变元素开始标记和结束标记间的文本，甚至可以改变元素标记本身。\",\n        \"jQuery的<code>.html()</code>方法可以添加HTML标签和文字到元素，而元素之前的内容都会被方法的内容所替换掉。\",\n        \"我们是通过<code>em</code>[emphasize]标签来重写和强调标题文本的：\",\n        \"<code>$(\\\"h3\\\").html(\\\"&#60;em&#62;jQuery Playground&#60;/em&#62;\\\");</code>\",\n        \"jQuery 还有一个类似的方法叫<code>.text()</code>，它只能改变文本但不能修改标记。换句话说，这个方法只会把传进来的任何东西(包括标记)当成文本来显示。\",\n        \"任务：强调id为<code>target4</code>按钮里的文本。 \"\n      ],\n      \"releasedOn\": \"November 18, 2015\",\n      \"challengeSeed\": [\n        \"fccss\",\n        \"  $(document).ready(function() {\",\n        \"    $(\\\"#target1\\\").css(\\\"color\\\", \\\"red\\\");\",\n        \"\",\n        \"  });\",\n        \"fcces\",\n        \"\",\n        \"<!-- 请只修改这条注释以上的代码 -->\",\n        \"\",\n        \"<div class=\\\"container-fluid\\\">\",\n        \"  <h3 class=\\\"text-primary text-center\\\">jQuery Playground</h3>\",\n        \"  <div class=\\\"row\\\">\",\n        \"    <div class=\\\"col-xs-6\\\">\",\n        \"      <h4>#left-well</h4>\",\n        \"      <div class=\\\"well\\\" id=\\\"left-well\\\">\",\n        \"        <button class=\\\"btn btn-default target\\\" id=\\\"target1\\\">#target1</button>\",\n        \"        <button class=\\\"btn btn-default target\\\" id=\\\"target2\\\">#target2</button>\",\n        \"        <button class=\\\"btn btn-default target\\\" id=\\\"target3\\\">#target3</button>\",\n        \"      </div>\",\n        \"    </div>\",\n        \"    <div class=\\\"col-xs-6\\\">\",\n        \"      <h4>#right-well</h4>\",\n        \"      <div class=\\\"well\\\" id=\\\"right-well\\\">\",\n        \"        <button class=\\\"btn btn-default target\\\" id=\\\"target4\\\">#target4</button>\",\n        \"        <button class=\\\"btn btn-default target\\\" id=\\\"target5\\\">#target5</button>\",\n        \"        <button class=\\\"btn btn-default target\\\" id=\\\"target6\\\">#target6</button>\",\n        \"      </div>\",\n        \"    </div>\",\n        \"  </div>\",\n        \"</div>\"\n      ],\n      \"tests\": [\n        \"assert.isTrue((/<em>|<i>#target4<\\\\/em>|<\\\\/i>/gi).test($(\\\"#target4\\\").html()), 'message: 通过增加HTML标签的方式来强调 <code>target4</code>按钮的文本。');\",\n        \"assert($(\\\"#target4\\\") && $(\\\"#target4\\\").text() === '#target4', 'message: 确保你更换的按钮为 <code>target4</code>。');\",\n        \"assert.isFalse((/<em>|<i>/gi).test($(\\\"h3\\\").html()), 'message: 不要更改任何文本。');\",\n        \"assert(code.match(/\\\\.html\\\\(/g), 'message: 确保你使用的方法是 <code>.html()</code>，而不是 <code>.text()</code>。');\",\n        \"assert(code.match(/\\\\$\\\\(\\\\s*?(\\\\\\\"|\\\\')#target4(\\\\\\\"|\\\\')\\\\s*?\\\\)\\\\.html\\\\(/), 'message: 确保你使用的是jQuery中的id选择器。');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 0\n    },\n    {\n      \"id\": \"bad87fee1348bd9aed708826\",\n      \"title\": \"Remove an Element Using jQuery\",\n      \"description\": [\n        \"现在让我们用jQuery来移除页面上的HTML元素吧.\",\n        \"jQuery 有一个<code>.remove()</code> 的方法可以移除HTML元素\",\n        \"试着使用<code>.remove()</code>方法来移除页面上的<code>target4</code>元素吧.\"\n      ],\n      \"challengeSeed\": [\n        \"fccss\",\n        \"  $(document).ready(function() {\",\n        \"    $(\\\"#target1\\\").css(\\\"color\\\", \\\"red\\\");\",\n        \"    $(\\\"#target1\\\").prop(\\\"disabled\\\", true);\",\n        \"\",\n        \"  });\",\n        \"fcces\",\n        \"\",\n        \"<!-- 请只修改这条注释以上的代码 -->\",\n        \"\",\n        \"<div class=\\\"container-fluid\\\">\",\n        \"  <h3 class=\\\"text-primary text-center\\\">jQuery Playground</h3>\",\n        \"  <div class=\\\"row\\\">\",\n        \"    <div class=\\\"col-xs-6\\\">\",\n        \"      <h4>#left-well</h4>\",\n        \"      <div class=\\\"well\\\" id=\\\"left-well\\\">\",\n        \"        <button class=\\\"btn btn-default target\\\" id=\\\"target1\\\">#target1</button>\",\n        \"        <button class=\\\"btn btn-default target\\\" id=\\\"target2\\\">#target2</button>\",\n        \"        <button class=\\\"btn btn-default target\\\" id=\\\"target3\\\">#target3</button>\",\n        \"      </div>\",\n        \"    </div>\",\n        \"    <div class=\\\"col-xs-6\\\">\",\n        \"      <h4>#right-well</h4>\",\n        \"      <div class=\\\"well\\\" id=\\\"right-well\\\">\",\n        \"        <button class=\\\"btn btn-default target\\\" id=\\\"target4\\\">#target4</button>\",\n        \"        <button class=\\\"btn btn-default target\\\" id=\\\"target5\\\">#target5</button>\",\n        \"        <button class=\\\"btn btn-default target\\\" id=\\\"target6\\\">#target6</button>\",\n        \"      </div>\",\n        \"    </div>\",\n        \"  </div>\",\n        \"</div>\"\n      ],\n      \"tests\": [\n        \"assert($(\\\"#target4\\\").length === 0, 'message: 使用jQuery来移除页面中的<code>target4</code>元素。');\",\n        \"assert(code.match(/id=\\\"target4/g), 'message: 请使用jQuery来实现，而不是原生js。');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 0\n    },\n    {\n      \"id\": \"bad87fee1348bd9aed608826\",\n      \"title\": \"Use appendTo to Move Elements with jQuery\",\n      \"description\": [\n        \"现在让我们尝试把元素从一个<code>div</code>里移到另外一个<code>div</code>里。\",\n        \"jQuery有一个<code>appendTo()</code>方法可以把选中的元素加到其他元素中。\",\n        \"比如，你想让<code>target4</code>从我们的从<code>right-well</code>移到<code>left-well</code>，我们可以这样使用:\",\n        \"<code>$(\\\"#target4\\\").appendTo(\\\"#left-well\\\");</code>\",\n        \"来试着把<code>target2</code>元素从<code>left-well</code>移到<code>right-well</code>中。\"\n      ],\n      \"challengeSeed\": [\n        \"fccss\",\n        \"  $(document).ready(function() {\",\n        \"    $(\\\"#target1\\\").css(\\\"color\\\", \\\"red\\\");\",\n        \"    $(\\\"#target1\\\").prop(\\\"disabled\\\", true);\",\n        \"    $(\\\"#target4\\\").remove();\",\n        \"\",\n        \"  });\",\n        \"fcces\",\n        \"\",\n        \"<!-- 请只修改这条注释以上的代码 -->\",\n        \"\",\n        \"<div class=\\\"container-fluid\\\">\",\n        \"  <h3 class=\\\"text-primary text-center\\\">jQuery Playground</h3>\",\n        \"  <div class=\\\"row\\\">\",\n        \"    <div class=\\\"col-xs-6\\\">\",\n        \"      <h4>#left-well</h4>\",\n        \"      <div class=\\\"well\\\" id=\\\"left-well\\\">\",\n        \"        <button class=\\\"btn btn-default target\\\" id=\\\"target1\\\">#target1</button>\",\n        \"        <button class=\\\"btn btn-default target\\\" id=\\\"target2\\\">#target2</button>\",\n        \"        <button class=\\\"btn btn-default target\\\" id=\\\"target3\\\">#target3</button>\",\n        \"      </div>\",\n        \"    </div>\",\n        \"    <div class=\\\"col-xs-6\\\">\",\n        \"      <h4>#right-well</h4>\",\n        \"      <div class=\\\"well\\\" id=\\\"right-well\\\">\",\n        \"        <button class=\\\"btn btn-default target\\\" id=\\\"target4\\\">#target4</button>\",\n        \"        <button class=\\\"btn btn-default target\\\" id=\\\"target5\\\">#target5</button>\",\n        \"        <button class=\\\"btn btn-default target\\\" id=\\\"target6\\\">#target6</button>\",\n        \"      </div>\",\n        \"    </div>\",\n        \"  </div>\",\n        \"</div>\"\n      ],\n      \"tests\": [\n        \"assert($(\\\"#left-well\\\").children(\\\"#target2\\\").length === 0, 'message: 你的 <code>target2</code> 元素不应该在 <code>left-well</code>里面。');\",\n        \"assert($(\\\"#right-well\\\").children(\\\"#target2\\\").length > 0, 'message: 你的 <code>target2</code> 元素应该在 <code>right-well</code>里面。');\",\n        \"assert(!code.match(/class.*animated/g), 'message: 请使用jQuery来实现，而不是原生js。');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 0\n    },\n    {\n      \"id\": \"bad87fee1348bd9aed508826\",\n      \"title\": \"Clone an Element Using jQuery\",\n      \"description\": [\n        \"除了移动元素，你还可以拷贝元素。简单理解：移动元素就是剪切，拷贝元素就是复制。\",\n        \"jQuery的<code>clone()</code>方法可以拷贝元素。\",\n        \"比如，如果我想把<code>target2</code>从<code>left-well</code>拷贝到<code>right-well</code>，我们可以这样写:\",\n        \"<code>$(\\\"#target2\\\").clone().appendTo(\\\"#right-well\\\");</code>\",\n        \"你有没有发现两个jQuery方法合在一起使用了？这就叫方法链<code>function chaining</code>，使用起来很方便。\",\n        \"复制<code>target5</code>元素追加到<code>left-well</code>。\",\n        \"<strong>提示：</strong>当你点击run tests后left-well会有两个#target5，千万别以为这是bug。实际上是因为编辑器中的代码会自动执行一次，点击run后会再执行一次，所以有两个#target5。\"\n      ],\n      \"challengeSeed\": [\n        \"fccss\",\n        \"  $(document).ready(function() {\",\n        \"    $(\\\"#target1\\\").css(\\\"color\\\", \\\"red\\\");\",\n        \"    $(\\\"#target1\\\").prop(\\\"disabled\\\", true);\",\n        \"    $(\\\"#target4\\\").remove();\",\n        \"    $(\\\"#target2\\\").appendTo(\\\"#right-well\\\");\",\n        \"\",\n        \"  });\",\n        \"fcces\",\n        \"\",\n        \"<!-- 请只修改这条注释以上的代码 -->\",\n        \"\",\n        \"<div class=\\\"container-fluid\\\">\",\n        \"  <h3 class=\\\"text-primary text-center\\\">jQuery Playground</h3>\",\n        \"  <div class=\\\"row\\\">\",\n        \"    <div class=\\\"col-xs-6\\\">\",\n        \"      <h4>#left-well</h4>\",\n        \"      <div class=\\\"well\\\" id=\\\"left-well\\\">\",\n        \"        <button class=\\\"btn btn-default target\\\" id=\\\"target1\\\">#target1</button>\",\n        \"        <button class=\\\"btn btn-default target\\\" id=\\\"target2\\\">#target2</button>\",\n        \"        <button class=\\\"btn btn-default target\\\" id=\\\"target3\\\">#target3</button>\",\n        \"      </div>\",\n        \"    </div>\",\n        \"    <div class=\\\"col-xs-6\\\">\",\n        \"      <h4>#right-well</h4>\",\n        \"      <div class=\\\"well\\\" id=\\\"right-well\\\">\",\n        \"        <button class=\\\"btn btn-default target\\\" id=\\\"target4\\\">#target4</button>\",\n        \"        <button class=\\\"btn btn-default target\\\" id=\\\"target5\\\">#target5</button>\",\n        \"        <button class=\\\"btn btn-default target\\\" id=\\\"target6\\\">#target6</button>\",\n        \"      </div>\",\n        \"    </div>\",\n        \"  </div>\",\n        \"</div>\"\n      ],\n      \"tests\": [\n        \"assert($(\\\"#right-well\\\").children(\\\"#target5\\\").length > 0, 'message: 你的<code>target5</code> 元素应该在 <code>right-well</code>里面。');\",\n        \"assert($(\\\"#left-well\\\").children(\\\"#target5\\\").length > 0, 'message: 克隆的<code>target5</code> 元素也应该在 <code>left-well</code>里面。');\",\n        \"assert(!code.match(/class.*animated/g), 'message: 请使用jQuery来实现，而不是原生js。');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 0\n    },\n    {\n      \"id\": \"bad87fee1348bd9aed308826\",\n      \"title\": \"Target the Parent of an Element Using jQuery\",\n      \"description\": [\n        \"每个HTML元素根据继承属性都有父<code>parent</code>元素。\",\n        \"举个例子，<code>h3</code> 元素的父元素是 <code>&#60;div class=\\\"container-fluid\\\"&#62</code>，<code>&#60;div class=\\\"container-fluid\\\"&#62</code>的父元素是 <code>body</code>。\",\n        \"jQuery有一个方法叫<code>parent()</code>，它允许你访问指定元素的父元素。\",\n        \"举个例子：让<code>left-well</code> 元素的父元素<code>parent()</code>的背景色变成蓝色。\",\n        \"<code>$(\\\"#left-well\\\").parent().css(\\\"background-color\\\", \\\"blue\\\")</code>\",\n        \"试试让<code>#target1</code>元素的父元素的背景色变成红色。\"\n      ],\n      \"challengeSeed\": [\n        \"fccss\",\n        \"  $(document).ready(function() {\",\n        \"    $(\\\"#target1\\\").css(\\\"color\\\", \\\"red\\\");\",\n        \"    $(\\\"#target1\\\").prop(\\\"disabled\\\", true);\",\n        \"    $(\\\"#target4\\\").remove();\",\n        \"    $(\\\"#target2\\\").appendTo(\\\"#right-well\\\");\",\n        \"    $(\\\"#target5\\\").clone().appendTo(\\\"#left-well\\\");\",\n        \"\",\n        \"  });\",\n        \"fcces\",\n        \"\",\n        \"<!-- 请只修改这条注释以上的代码 -->\",\n        \"\",\n        \"<body>\",\n        \"  <div class=\\\"container-fluid\\\">\",\n        \"    <h3 class=\\\"text-primary text-center\\\">jQuery Playground</h3>\",\n        \"    <div class=\\\"row\\\">\",\n        \"      <div class=\\\"col-xs-6\\\">\",\n        \"        <h4>#left-well</h4>\",\n        \"        <div class=\\\"well\\\" id=\\\"left-well\\\">\",\n        \"          <button class=\\\"btn btn-default target\\\" id=\\\"target1\\\">#target1</button>\",\n        \"          <button class=\\\"btn btn-default target\\\" id=\\\"target2\\\">#target2</button>\",\n        \"          <button class=\\\"btn btn-default target\\\" id=\\\"target3\\\">#target3</button>\",\n        \"        </div>\",\n        \"      </div>\",\n        \"      <div class=\\\"col-xs-6\\\">\",\n        \"        <h4>#right-well</h4>\",\n        \"        <div class=\\\"well\\\" id=\\\"right-well\\\">\",\n        \"          <button class=\\\"btn btn-default target\\\" id=\\\"target4\\\">#target4</button>\",\n        \"          <button class=\\\"btn btn-default target\\\" id=\\\"target5\\\">#target5</button>\",\n        \"          <button class=\\\"btn btn-default target\\\" id=\\\"target6\\\">#target6</button>\",\n        \"        </div>\",\n        \"      </div>\",\n        \"    </div>\",\n        \"  </div>\",\n        \"</body>\"\n      ],\n      \"tests\": [\n        \"assert($(\\\"#left-well\\\").css(\\\"background-color\\\") === 'red' || $(\\\"#left-well\\\").css(\\\"background-color\\\") === 'rgb(255, 0, 0)' || $(\\\"#left-well\\\").css(\\\"background-color\\\").toLowerCase() === '#ff0000' || $(\\\"#left-well\\\").css(\\\"background-color\\\").toLowerCase() === '#f00', 'message: 你的<code>left-well</code> 元素应该有一个红色的背景。');\",\n        \"assert(code.match(/\\\\.parent\\\\s*\\\\(\\\\)\\\\s*\\\\.css/g), 'message: 你应该使用<code>&#46;parent&#40;&#41;</code> 来修改这个元素。');\",\n        \"assert(code.match(/\\\\$\\\\s*?\\\\(\\\\s*?(?:'|\\\")\\\\s*?#target1\\\\s*?(?:'|\\\")\\\\s*?\\\\)\\\\s*?\\\\.parent/gi), 'message: 你应该在 <code>&#35;target1</code> 元素上调用<code>&#46;parent&#40;&#41;</code>方法。');\",\n        \"assert(code.match(/<div class=\\\"well\\\" id=\\\"left-well\\\">/g), 'message: 请使用jQuery来给元素添加css。');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 0\n    },\n    {\n      \"id\": \"bad87fee1348bd9aed208826\",\n      \"title\": \"Target the Children of an Element Using jQuery\",\n      \"description\": [\n        \"每个人都继承了自己的父母的一些属性，譬如：DNA、相貌、血型、体型等等，HTML也不例外。\",\n        \"许多HTML元素都有<code>children</code>(子元素)，每个子元素都从父元素那里继承了一些属性。\",\n        \"举个例子，每个HTML元素都是 <code>body</code> 的子元素， 你的 \\\"jQuery Playground\\\" <code>h3</code> 元素是 <code>&#60;div class=\\\"container-fluid\\\"&#62</code> 的子元素。\",\n        \"jQuery有一个方法叫<code>children()</code>，它允许你访问指定元素的子元素。\",\n        \"举个例子：让<code>left-well</code> 元素的子元素<code>children()</code>的文本颜色变成蓝色。\",\n        \"<code>$(\\\"#left-well\\\").children().css(\\\"color\\\", \\\"blue\\\")</code>\",\n        \"任务：让<code>#right-well</code>元素的所有子元素的文本颜色都变成橙色（orange）。\"\n      ],\n      \"challengeSeed\": [\n        \"fccss\",\n        \"  $(document).ready(function() {\",\n        \"    $(\\\"#target1\\\").css(\\\"color\\\", \\\"red\\\");\",\n        \"    $(\\\"#target1\\\").prop(\\\"disabled\\\", true);\",\n        \"    $(\\\"#target4\\\").remove();\",\n        \"    $(\\\"#target2\\\").appendTo(\\\"#right-well\\\");\",\n        \"    $(\\\"#target5\\\").clone().appendTo(\\\"#left-well\\\");\",\n        \"    $(\\\"#target1\\\").parent().css(\\\"background-color\\\", \\\"red\\\");\",\n        \"\",\n        \"  });\",\n        \"fcces\",\n        \"\",\n        \"<!-- 请只修改这条注释以上的代码 -->\",\n        \"\",\n        \"<div class=\\\"container-fluid\\\">\",\n        \"  <h3 class=\\\"text-primary text-center\\\">jQuery Playground</h3>\",\n        \"  <div class=\\\"row\\\">\",\n        \"    <div class=\\\"col-xs-6\\\">\",\n        \"      <h4>#left-well</h4>\",\n        \"      <div class=\\\"well\\\" id=\\\"left-well\\\">\",\n        \"        <button class=\\\"btn btn-default target\\\" id=\\\"target1\\\">#target1</button>\",\n        \"        <button class=\\\"btn btn-default target\\\" id=\\\"target2\\\">#target2</button>\",\n        \"        <button class=\\\"btn btn-default target\\\" id=\\\"target3\\\">#target3</button>\",\n        \"      </div>\",\n        \"    </div>\",\n        \"    <div class=\\\"col-xs-6\\\">\",\n        \"      <h4>#right-well</h4>\",\n        \"      <div class=\\\"well\\\" id=\\\"right-well\\\">\",\n        \"        <button class=\\\"btn btn-default target\\\" id=\\\"target4\\\">#target4</button>\",\n        \"        <button class=\\\"btn btn-default target\\\" id=\\\"target5\\\">#target5</button>\",\n        \"        <button class=\\\"btn btn-default target\\\" id=\\\"target6\\\">#target6</button>\",\n        \"      </div>\",\n        \"    </div>\",\n        \"  </div>\",\n        \"</div>\"\n      ],\n      \"tests\": [\n        \"assert($(\\\"#right-well\\\").children().css(\\\"color\\\") === 'rgb(255, 165, 0)', 'message: <code>#right-well</code> 的所有子元素的文本颜色都为橙色。');\",\n        \"assert(code.match(/\\\\.children\\\\(\\\\)\\\\.css/g), 'message: 你应该使用 <code>children&#40&#41</code> 函数来修改这些元素。');\",\n        \"assert(code.match(/<div class=\\\"well\\\" id=\\\"right-well\\\">/g), 'message: 请使用jQuery来给这些元素添加class。');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 0\n    },\n    {\n      \"id\": \"bad87fee1348bd9aed108826\",\n      \"title\": \"Target a Specific Child of an Element Using jQuery\",\n      \"description\": [\n        \"你已经看到了当用jQuery选择器通过id属性来选取元素的时候是多么方便，但是你不能总是写这么整齐的id。\",\n        \"幸运的是，jQuery有一些另外的技巧可以达到同样的效果。\",\n        \"jQuery 用CSS选择器来选取元素，比如，<code>.target:nth-child(n)</code> CSS 选择器允许你按照索引顺序 (从1开始) 进一步过滤符合 <code>.target</code> 条件的元素。\",\n        \"示例：给符合 <code>.target</code> 的第三个元素添加 animated 和 bounce class。\",\n        \"<code>$(\\\".target:nth-child(3)\\\").addClass(\\\"animated bounce\\\");</code>\",\n        \"任务：请给每个 class 为 well 中的第二个 class 为 <code>target</code> 子元素添加 <code>animated</code> 和 <code>bounce</code> class。注意，你只需要用 <code>.target</code> 选择器和 <code>:nth-child()</code> 就够了。\"\n      ],\n      \"challengeSeed\": [\n        \"fccss\",\n        \"  $(document).ready(function() {\",\n        \"    $(\\\"#target1\\\").css(\\\"color\\\", \\\"red\\\");\",\n        \"    $(\\\"#target1\\\").prop(\\\"disabled\\\", true);\",\n        \"    $(\\\"#target4\\\").remove();\",\n        \"    $(\\\"#target2\\\").appendTo(\\\"#right-well\\\");\",\n        \"    $(\\\"#target5\\\").clone().appendTo(\\\"#left-well\\\");\",\n        \"    $(\\\"#target1\\\").parent().css(\\\"background-color\\\", \\\"red\\\");\",\n        \"    $(\\\"#right-well\\\").children().css(\\\"color\\\", \\\"orange\\\");\",\n        \"\",\n        \"  });\",\n        \"fcces\",\n        \"\",\n        \"<!-- 请只修改这条注释以上的代码 -->\",\n        \"\",\n        \"<div class=\\\"container-fluid\\\">\",\n        \"  <h3 class=\\\"text-primary text-center\\\">jQuery Playground</h3>\",\n        \"  <div class=\\\"row\\\">\",\n        \"    <div class=\\\"col-xs-6\\\">\",\n        \"      <h4>#left-well</h4>\",\n        \"      <div class=\\\"well\\\" id=\\\"left-well\\\">\",\n        \"        <button class=\\\"btn btn-default target\\\" id=\\\"target1\\\">#target1</button>\",\n        \"        <button class=\\\"btn btn-default target\\\" id=\\\"target2\\\">#target2</button>\",\n        \"        <button class=\\\"btn btn-default target\\\" id=\\\"target3\\\">#target3</button>\",\n        \"      </div>\",\n        \"    </div>\",\n        \"    <div class=\\\"col-xs-6\\\">\",\n        \"      <h4>#right-well</h4>\",\n        \"      <div class=\\\"well\\\" id=\\\"right-well\\\">\",\n        \"        <button class=\\\"btn btn-default target\\\" id=\\\"target4\\\">#target4</button>\",\n        \"        <button class=\\\"btn btn-default target\\\" id=\\\"target5\\\">#target5</button>\",\n        \"        <button class=\\\"btn btn-default target\\\" id=\\\"target6\\\">#target6</button>\",\n        \"      </div>\",\n        \"    </div>\",\n        \"  </div>\",\n        \"</div>\"\n      ],\n      \"tests\": [\n        \"assert($(\\\".target:nth-child(2)\\\").hasClass(\\\"animated\\\") && $(\\\".target:nth-child(2)\\\").hasClass(\\\"bounce\\\"), 'message: 第二个元素在你的 <code>target</code> 在你的目标元素中应该 bounce。');\",\n        \"assert(code.match(/\\\\:nth-child\\\\(/g), 'message: 你应该使用 <code>&#58;nth-child&#40&#41</code> 这些功能来修改这些元素。');\",\n        \"assert(code.match(/<button class=\\\"btn btn-default target\\\" id=\\\"target2\\\">/g), 'message: 只使用 jQuery 来添加这些 class 到元素中。');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 0\n    },\n    {\n      \"id\": \"bad87fee1348bd9aed008826\",\n      \"title\": \"Target Even Numbered Elements Using jQuery\",\n      \"description\": [\n        \"示例：获取class为<code>target</code>且索引为奇数的所有元素，并给他们添加class。\",\n        \"<code>$(\\\".target:odd\\\").addClass(\\\"animated shake\\\");</code>\",\n        \"记住，jQuery里的索引是从0开始的，也就是说：<code>:odd</code> 选择第2、4、6个元素，因为target#2(索引为1)，target#4(索引为3)，target6(索引为5。\",\n        \"任务：获取class为<code>target</code>且索引为偶数的所有元素，也就是target#1(索引为0)，target#3(索引为2)，target5(索引为4)，并给它们添加class <code>animated</code> 和 <code>shake</code>。\"\n      ],\n      \"challengeSeed\": [\n        \"fccss\",\n        \"  $(document).ready(function() {\",\n        \"    $(\\\"#target1\\\").css(\\\"color\\\", \\\"red\\\");\",\n        \"    $(\\\"#target1\\\").prop(\\\"disabled\\\", true);\",\n        \"    $(\\\"#target4\\\").remove();\",\n        \"    $(\\\"#target2\\\").appendTo(\\\"#right-well\\\");\",\n        \"    $(\\\"#target5\\\").clone().appendTo(\\\"#left-well\\\");\",\n        \"    $(\\\"#target1\\\").parent().css(\\\"background-color\\\", \\\"red\\\");\",\n        \"    $(\\\"#right-well\\\").children().css(\\\"color\\\", \\\"orange\\\");\",\n        \"    $(\\\"#left-well\\\").children().css(\\\"color\\\", \\\"green\\\");\",\n        \"    $(\\\".target:nth-child(2)\\\").addClass(\\\"animated bounce\\\");\",\n        \"\",\n        \"  });\",\n        \"fcces\",\n        \"\",\n        \"<!-- 请只修改这条注释以上的代码 -->\",\n        \"\",\n        \"<div class=\\\"container-fluid\\\">\",\n        \"  <h3 class=\\\"text-primary text-center\\\">jQuery Playground</h3>\",\n        \"  <div class=\\\"row\\\">\",\n        \"    <div class=\\\"col-xs-6\\\">\",\n        \"      <h4>#left-well</h4>\",\n        \"      <div class=\\\"well\\\" id=\\\"left-well\\\">\",\n        \"        <button class=\\\"btn btn-default target\\\" id=\\\"target1\\\">#target1</button>\",\n        \"        <button class=\\\"btn btn-default target\\\" id=\\\"target2\\\">#target2</button>\",\n        \"        <button class=\\\"btn btn-default target\\\" id=\\\"target3\\\">#target3</button>\",\n        \"      </div>\",\n        \"    </div>\",\n        \"    <div class=\\\"col-xs-6\\\">\",\n        \"      <h4>#right-well</h4>\",\n        \"      <div class=\\\"well\\\" id=\\\"right-well\\\">\",\n        \"        <button class=\\\"btn btn-default target\\\" id=\\\"target4\\\">#target4</button>\",\n        \"        <button class=\\\"btn btn-default target\\\" id=\\\"target5\\\">#target5</button>\",\n        \"        <button class=\\\"btn btn-default target\\\" id=\\\"target6\\\">#target6</button>\",\n        \"      </div>\",\n        \"    </div>\",\n        \"  </div>\",\n        \"</div>\"\n      ],\n      \"tests\": [\n        \"assert($('.target:even').hasClass('animated') && $('.target:even').hasClass('shake'), 'message: 所有 <code>target</code> 元素的偶数都应该 <code>shake</code>');\",\n        \"assert(code.match(/\\\\:even/g), 'message: 你应该使用 <code>&#58;even</code> 功能来更改这些元素。');\",\n        \"assert(code.match(/<button class=\\\"btn btn-default target\\\" id=\\\"target3\\\">/g), 'message: 只使用 jQuery 来添加这些 class 到元素中。');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 0\n    },\n    {\n      \"id\": \"bad87fee1348bd9aecb08826\",\n      \"title\": \"Use jQuery to Modify the Entire Page\",\n      \"description\": [\n        \"我们已经玩了这么久的jQuery游乐场，是时候结束这一节了。\",\n        \"我们让整个body都有淡出效果(fadeOut)： <code> $(\\\"body\\\").addClass(\\\"animated fadeOut\\\");</code>\",\n        \"让我们做一些更为激动人心的事情，给body添加class <code>animated</code> 和<code>hinge</code> 。\"\n      ],\n      \"challengeSeed\": [\n        \"fccss\",\n        \"  $(document).ready(function() {\",\n        \"    $(\\\"#target1\\\").css(\\\"color\\\", \\\"red\\\");\",\n        \"    $(\\\"#target1\\\").prop(\\\"disabled\\\", true);\",\n        \"    $(\\\"#target4\\\").remove();\",\n        \"    $(\\\"#target2\\\").appendTo(\\\"#right-well\\\");\",\n        \"    $(\\\"#target5\\\").clone().appendTo(\\\"#left-well\\\");\",\n        \"    $(\\\"#target1\\\").parent().css(\\\"background-color\\\", \\\"red\\\");\",\n        \"    $(\\\"#right-well\\\").children().css(\\\"color\\\", \\\"orange\\\");\",\n        \"    $(\\\"#left-well\\\").children().css(\\\"color\\\", \\\"green\\\");\",\n        \"    $(\\\".target:nth-child(2)\\\").addClass(\\\"animated bounce\\\");\",\n        \"    $(\\\".target:even\\\").addClass(\\\"animated shake\\\");\",\n        \"\",\n        \"  });\",\n        \"fcces\",\n        \"\",\n        \"<!-- 请只修改这条注释以上的代码 -->\",\n        \"\",\n        \"<div class=\\\"container-fluid\\\">\",\n        \"  <h3 class=\\\"text-primary text-center\\\">jQuery Playground</h3>\",\n        \"  <div class=\\\"row\\\">\",\n        \"    <div class=\\\"col-xs-6\\\">\",\n        \"      <h4>#left-well</h4>\",\n        \"      <div class=\\\"well\\\" id=\\\"left-well\\\">\",\n        \"        <button class=\\\"btn btn-default target\\\" id=\\\"target1\\\">#target1</button>\",\n        \"        <button class=\\\"btn btn-default target\\\" id=\\\"target2\\\">#target2</button>\",\n        \"        <button class=\\\"btn btn-default target\\\" id=\\\"target3\\\">#target3</button>\",\n        \"      </div>\",\n        \"    </div>\",\n        \"    <div class=\\\"col-xs-6\\\">\",\n        \"      <h4>#right-well</h4>\",\n        \"      <div class=\\\"well\\\" id=\\\"right-well\\\">\",\n        \"        <button class=\\\"btn btn-default target\\\" id=\\\"target4\\\">#target4</button>\",\n        \"        <button class=\\\"btn btn-default target\\\" id=\\\"target5\\\">#target5</button>\",\n        \"        <button class=\\\"btn btn-default target\\\" id=\\\"target6\\\">#target6</button>\",\n        \"      </div>\",\n        \"    </div>\",\n        \"  </div>\",\n        \"</div>\"\n      ],\n      \"tests\": [\n        \"assert($('body').hasClass('animated') && $('body').hasClass('hinge'), 'message: 添加 <code>animated</code> 和 <code>hinge</code> 到你的 <code>body</code> 元素内。');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 0\n    }\n  ]\n}\n"
  },
  {
    "path": "seed/challenges/01-front-end-development-certification/json-apis-and-ajax.json",
    "content": "{\n  \"name\": \"JSON APIs and Ajax\",\n  \"order\": 10,\n  \"time\": \"2 hours\",\n  \"helpRoom\": \"chinese\",\n  \"challenges\": [\n    {\n      \"id\": \"56bbb991ad1ed5201cd392d4\",\n      \"title\": \"Trigger Click Events with jQuery\",\n      \"description\": [\n        \"通过jQuery来绑定点击事件。\",\n        \"首先，我们来看一下函数 <code>$(document).ready()</code> 干了些什么。\",\n        \"这个函数中的代码只会在我们的页面加载时候运行一次，确保执行js之前页面所有的dom已经准备就绪。\",\n        \"任务：给\\\"Get Message\\\"按钮绑定一个点击事件。\",\n        \"我们先在<code>$(document).ready()</code>函数中增加一个<code>click</code>事件。代码如下：<code>$(document).ready()</code> function by adding this code:\",\n        \"<blockquote>$(\\\"#getMessage\\\").on(\\\"click\\\", function(){</br></br>});</blockquote>\"\n      ],\n      \"challengeSeed\": [\n        \"fccss\",\n        \"  $(document).ready(function() {\",\n        \"    // 请把你的代码写在这条注释以下\",\n        \"    \",\n        \"    // 请把你的代码写在这条注释以上\",\n        \"  });\",\n        \"fcces\",\n        \"\",\n        \"\",\n        \"<div class=\\\"container-fluid\\\">\",\n        \"  <div class = \\\"row text-center\\\">\",\n        \"    <h2>Cat Photo Finder</h2>\",\n        \"  </div>\",\n        \"  <div class = \\\"row text-center\\\">\",\n        \"    <div class = \\\"col-xs-12 well message\\\">\",\n        \"      The message will go here\",\n        \"    </div>\",\n        \"  </div>\",\n        \"  <div class = \\\"row text-center\\\">\",\n        \"    <div class = \\\"col-xs-12\\\">\",\n        \"      <button id = \\\"getMessage\\\" class = \\\"btn btn-primary\\\">\",\n        \"        Get Message\",\n        \"      </button>\",\n        \"    </div>\",\n        \"  </div>\",\n        \"</div>\"\n      ],\n      \"tests\": [\n        \"assert(code.match(/\\\\$\\\\s*?\\\\(\\\\s*?(?:'|\\\")\\\\#getMessage(?:'|\\\")\\\\s*?\\\\)\\\\s*?\\\\.on\\\\s*?\\\\(\\\\s*?(?:'|\\\")click(?:'|\\\")\\\\s*?\\\\,\\\\s*?function\\\\s*?\\\\(\\\\s*?\\\\)\\\\s*?\\\\{/gi), 'message: Bind the click event to the button with the ID of <code>getMessage</code>');\",\n        \"assert(code.match(/\\\\n*?\\\\s*?\\\\}\\\\n*?\\\\s*?\\\\);/gi) && code.match(/\\\\n*?\\\\s*?\\\\}\\\\);/gi).length >= 2, 'message: Be sure to close your functions with <code>}&#41;;</code>');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 0\n    },\n    {\n      \"id\": \"56bbb991ad1ed5201cd392d5\",\n      \"title\": \"Change Text with Click Events\",\n      \"description\": [\n        \"通过点击事件来更改文本。\",\n        \"当我们点击按钮时，我们可以更新HTML页面\",\n        \"任务：点击\\\"Get Message\\\"按钮，将class为<code>message</code> 的元素的文本改为：“Here is the message”。\",\n        \"为此在我们的点击事件中加入如下代码：\",\n        \"<code>$(\\\".message\\\").html(\\\"Here is the message\\\");</code>\"\n      ],\n      \"challengeSeed\": [\n        \"fccss\",\n        \"  $(document).ready(function() {\",\n        \"    $(\\\"#getMessage\\\").on(\\\"click\\\", function(){\",\n        \"      // 请把你的代码写在这条注释以下\",\n        \"      \",\n        \"      // 请把你的代码写在这条注释以上\",\n        \"    });\",\n        \"  });\",\n        \"fcces\",\n        \"\",\n        \"\",\n        \"<div class=\\\"container-fluid\\\">\",\n        \"  <div class = \\\"row text-center\\\">\",\n        \"    <h2>Cat Photo Finder</h2>\",\n        \"  </div>\",\n        \"  <div class = \\\"row text-center\\\">\",\n        \"    <div class = \\\"col-xs-12 well message\\\">\",\n        \"      The message will go here\",\n        \"    </div>\",\n        \"  </div>\",\n        \"  <div class = \\\"row text-center\\\">\",\n        \"    <div class = \\\"col-xs-12\\\">\",\n        \"      <button id = \\\"getMessage\\\" class = \\\"btn btn-primary\\\">\",\n        \"        Get Message\",\n        \"      </button>\",\n        \"    </div>\",\n        \"  </div>\",\n        \"</div>\"\n      ],\n      \"tests\": [\n        \"assert(code.match(/\\\\$\\\\s*?\\\\(\\\\s*?(?:'|\\\")\\\\.message(?:'|\\\")\\\\s*?\\\\)\\\\s*?(\\\\.html|\\\\.text)\\\\s*?\\\\(\\\\s*?(?:'|\\\")Here\\\\sis\\\\sthe\\\\smessage(?:'|\\\")\\\\s*?\\\\);/gi), 'message: Clicking the \\\"Get Message\\\" button should give the element with the class <code>message</code> the text \\\"Here is the message\\\".');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 0\n    },\n    {\n      \"id\": \"56bbb991ad1ed5201cd392d6\",\n      \"title\": \"Get JSON with the jQuery getJSON Method\",\n      \"description\": [\n        \"当你需要根据服务器返回的数据来动态改变页面的时候，应用程序接口(API)就派上用场了。\",\n        \"记住，API——应用程序接口(Application Programming Interface)是计算机之间相互交流沟通的工具。\",\n        \"许多网站的应用程序接口(API)都是通过一种称为JSON格式的数据来传输的，JSON 是 JavaScript Object Notation的简写。\",\n        \"其实如果你曾经创建过JS对象的话，你就已经使用了这种数据格式，JSON是一种非常简洁的数据格式。\",\n        \"它通常表现为了两种形式，一种为单个对象，一种为多个对象\",\n        \"单个对象类似于：<br><code>{name:'盖伦',advantage:'单挑无敌'}</code>\",\n        \"多个对象类似于：<br><code>[{name:'盖伦',advantage:'单挑无敌'},{name:'诺克',advantage:'上单霸主'}]</code>\",\n        \"每个对象属性和属性值的组合就是我们经常听到的\\\"键值对(key-value pairs)\\\"。\",\n        \"让我们从之前的猫图API拿取数据吧。\",\n        \"你应该在你的点击事件中加入如下的代码：\",\n        \"<blockquote>$.getJSON(\\\"/json/cats.json\\\", function(json) {</code></br>  $(\\\".message\\\").html(JSON.stringify(json));</br>});</blockquote>\",\n        \"在这之后，点击\\\"Get Message\\\"按钮。你的Ajax函数将把文字\\\"The message will go here\\\"替换成此从FreeCodeCam的猫图API中获得的原始JSON数据。\"\n      ],\n      \"challengeSeed\": [\n        \"fccss\",\n        \"  $(document).ready(function() {\",\n        \"\",\n        \"    $(\\\"#getMessage\\\").on(\\\"click\\\", function(){\",\n        \"      // 请把你的代码写在这条注释以下\",\n        \"      \",\n        \"      \",\n        \"      \",\n        \"      // 请把你的代码写在这条注释以上\",\n        \"    });\",\n        \"\",\n        \"  });\",\n        \"fcces\",\n        \"\",\n        \"<div class=\\\"container-fluid\\\">\",\n        \"  <div class = \\\"row text-center\\\">\",\n        \"    <h2>Cat Photo Finder</h2>\",\n        \"  </div>\",\n        \"  <div class = \\\"row text-center\\\">\",\n        \"    <div class = \\\"col-xs-12 well message\\\">\",\n        \"      The message will go here\",\n        \"    </div>\",\n        \"  </div>\",\n        \"  <div class = \\\"row text-center\\\">\",\n        \"    <div class = \\\"col-xs-12\\\">\",\n        \"      <button id = \\\"getMessage\\\" class = \\\"btn btn-primary\\\">\",\n        \"        Get Message\",\n        \"      </button>\",\n        \"    </div>\",\n        \"  </div>\",\n        \"</div>\"\n      ],\n      \"tests\": [\n        \"assert(code.match(/\\\\$\\\\s*?\\\\(\\\\s*?(\\\\\\\"|\\\\')\\\\#getMessage(\\\\\\\"|\\\\')\\\\s*?\\\\)\\\\s*?\\\\.\\\\s*?on\\\\s*?\\\\(\\\\s*?(\\\\\\\"|\\\\')click(\\\\\\\"|\\\\')\\\\s*?\\\\,\\\\s*?function\\\\s*?\\\\(\\\\s*?\\\\)\\\\s*?\\\\{/gi), 'message: You should have a click handler on the getMessage button to trigger the AJAX request.');\",\n        \"assert(code.match(/\\\\s*?\\\\}\\\\s*?\\\\)\\\\s*?\\\\;/gi), 'message: You should have at least one closing set of brackets and parenthesis.');\",\n        \"assert(code.match(/\\\\s*?\\\\}\\\\s*?\\\\)\\\\s*?\\\\;/gi) && code.match(/\\\\,\\\\s*?function\\\\s*?\\\\(\\\\s*?\\\\w*?\\\\s*?\\\\)\\\\s*?\\\\{/gi) && code.match(/\\\\s*?\\\\}\\\\s*?\\\\)\\\\s*?\\\\;/gi).length === code.match(/\\\\s*?function\\\\s*?\\\\(\\\\s*?\\\\w*?\\\\s*?\\\\)\\\\s*?\\\\{/gi).length, 'message: Each callback function should have a closing set of brackets and parenthesis.');\",\n        \"assert(code.match(/\\\\$\\\\s*?\\\\.\\\\s*?getJSON\\\\s*?\\\\(\\\\s*?(\\\\\\\"|\\\\')\\\\/json\\\\/cats\\\\.json(\\\\\\\"|\\\\')\\\\s*?\\\\,\\\\s*?function\\\\s*?\\\\(\\\\s*?json\\\\s*?\\\\)\\\\s*?\\\\{/gi), 'message: You should be making use of the getJSON method given in the description to load data from the json file.');\",\n        \"assert(code.match(/\\\\$\\\\s*?\\\\(\\\\s*?(\\\\\\\"|\\\\')\\\\.message(\\\\\\\"|\\\\')\\\\s*?\\\\)\\\\s*?\\\\.\\\\s*?html\\\\s*?\\\\(\\\\s*?JSON\\\\s*?\\\\.\\\\s*?stringify\\\\s*?\\\\(\\\\s*?json\\\\s*?\\\\)\\\\s*?\\\\)/gi), 'message: Don&apos;t forget to make the <code>.html</code> change the contents of the message box so that it contains the result of the getJSON.');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 0\n    },\n    {\n      \"id\": \"56bbb991ad1ed5201cd392d7\",\n      \"title\": \"Convert JSON Data to HTML\",\n      \"description\": [\n        \"好了，我们已经从JSON API中获得了数据，现在把它们展现到我们的HTML页面中吧。\",\n        \"这里，我们使用<code>.forEach()</code>函数来循环遍历JSON数据写到htmll变量中。\",\n        \"首先我们定义一个HTML变量，<br><code>var html = \\\"\\\";</code> 。\",\n        \"然后，我们使用<code>.forEach()</code>函数来循环遍历JSON数据写到html变量中，最后把html变量显示到我们的页面中。\",\n        \"整个过程的代码如下：\",\n        \"<blockquote>json.forEach(function(val) {</br>  var keys = Object.keys(val);</br>  html += \\\"&lt;div class = 'cat'&gt;\\\";</br>  keys.forEach(function(key) {</br>    html += \\\"&lt;b&gt;\\\" + key + \\\"&lt;/b&gt;: \\\" + val[key] + \\\"&lt;br&gt;\\\";</br>  });</br>  html += \\\"&lt;/div&gt;&lt;br&gt;\\\";</br>});</blockquote>\",\n        \"提示：示例中难点在于两个forEach循环，而且里面夹杂有字符串拼接，这是最头疼也最容易出错的地方。\"\n      ],\n      \"challengeSeed\": [\n        \"fccss\",\n        \"  $(document).ready(function() {\",\n        \"\",\n        \"    $(\\\"#getMessage\\\").on(\\\"click\\\", function() {\",\n        \"      $.getJSON(\\\"/json/cats.json\\\", function(json) {\",\n        \"\",\n        \"        var html = \\\"\\\";\",\n        \"        // 请把你的代码写在这条注释以下\",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        // 请把你的代码写在这条注释以上\",\n        \"\",\n        \"        $(\\\".message\\\").html(html);\",\n        \"\",\n        \"      });\",\n        \"    });\",\n        \"  });\",\n        \"fcces\",\n        \"\",\n        \"<div class=\\\"container-fluid\\\">\",\n        \"  <div class = \\\"row text-center\\\">\",\n        \"    <h2>Cat Photo Finder</h2>\",\n        \"  </div>\",\n        \"  <div class = \\\"row text-center\\\">\",\n        \"    <div class = \\\"col-xs-12 well message\\\">\",\n        \"      The message will go here\",\n        \"   </div>\",\n        \"  </div>\",\n        \"  <div class = \\\"row text-center\\\">\",\n        \"    <div class = \\\"col-xs-12\\\">\",\n        \"      <button id = \\\"getMessage\\\" class = \\\"btn btn-primary\\\">\",\n        \"        Get Message\",\n        \"      </button>\",\n        \"    </div>\",\n        \"  </div>\",\n        \"</div>\"\n      ],\n      \"tests\": [\n        \"assert(code.match(/json\\\\.forEach/gi), 'message: The message box should have something in it.');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 0\n    },\n    {\n      \"id\": \"56bbb991ad1ed5201cd392d8\",\n      \"title\": \"Render Images from Data Sources\",\n      \"description\": [\n        \"从上节课获得的JSON数组中，每个对象都包含了一个以<code>imageLink</code>为键(key)，以猫的图片的url为值(value)的键值对。\",\n        \"当我们在遍历这些对象时，我们用<code>imageLink</code>的属性来显示<code>img</code>元素的图片。\",\n        \"代码如下：\",\n        \"<code>html += \\\"&lt;img src = '\\\" + val.imageLink + \\\"'&gt;\\\";</code>\"\n      ],\n      \"challengeSeed\": [\n        \"fccss\",\n        \"  $(document).ready(function() {\",\n        \"\",\n        \"    $(\\\"#getMessage\\\").on(\\\"click\\\", function() {\",\n        \"      $.getJSON(\\\"/json/cats.json\\\", function(json) {\",\n        \"\",\n        \"        var html = \\\"\\\";\",\n        \"\",\n        \"        json.forEach(function(val) {\",\n        \"\",\n        \"          html += \\\"<div class = 'cat'>\\\";\",\n        \"\",\n        \"          // 请把你的代码写在这条注释以下\",\n        \"          \",\n        \"          \",\n        \"          \",\n        \"          // 请把你的代码写在这条注释以上\",\n        \"\",\n        \"          html += \\\"</div>\\\";\",\n        \"\",\n        \"        });\",\n        \"\",\n        \"        $(\\\".message\\\").html(html);\",\n        \"\",\n        \"      });\",\n        \"    });\",\n        \"  });\",\n        \"fcces\",\n        \"\",\n        \"<div class=\\\"container-fluid\\\">\",\n        \"  <div class = \\\"row text-center\\\">\",\n        \"    <h2>Cat Photo Finder</h2>\",\n        \"  </div>\",\n        \"  <div class = \\\"row text-center\\\">\",\n        \"    <div class = \\\"col-xs-12 well message\\\">\",\n        \"      The message will go here\",\n        \"    </div>\",\n        \"  </div>\",\n        \"  <div class = \\\"row text-center\\\">\",\n        \"    <div class = \\\"col-xs-12\\\">\",\n        \"      <button id = \\\"getMessage\\\" class = \\\"btn btn-primary\\\">\",\n        \"        Get Message\",\n        \"      </button>\",\n        \"    </div>\",\n        \"  </div>\",\n        \"</div>\"\n      ],\n      \"tests\": [\n        \"assert(code.match(/val.imageLink/gi), 'message: You should have used the <code>imageLink</code> property to display the images.');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 0\n    },\n    {\n      \"id\": \"56bbb991ad1ed5201cd392d9\",\n      \"title\": \"Prefilter JSON\",\n      \"description\": [\n        \"如果我们不想把所有从JSON API中得到的图片都展现出来，我们可以在遍历之前做一次过滤。\",\n        \"我们把其中 \\\"id\\\" 键的值为1的图片过滤掉。\",\n        \"代码如下:\",\n        \"<blockquote>json = json.filter(function(val) {</br>  return (val.id !== 1);</br>});</blockquote>\"\n      ],\n      \"challengeSeed\": [\n        \"fccss\",\n        \"  $(document).ready(function() {\",\n        \"\",\n        \"    $(\\\"#getMessage\\\").on(\\\"click\\\", function() {\",\n        \"      $.getJSON(\\\"/json/cats.json\\\", function(json) {\",\n        \"\",\n        \"        var html = \\\"\\\";\",\n        \"\",\n        \"        // 请把你的代码写在这条注释以下\",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        // 请把你的代码写在这条注释以上\",\n        \"\",\n        \"        json.forEach(function(val) {\",\n        \"\",\n        \"          html += \\\"<div class = 'cat'>\\\"\",\n        \"\",\n        \"          html += \\\"<img src = '\\\" + val.imageLink + \\\"'>\\\"\",\n        \"\",\n        \"          html += \\\"</div>\\\"\",\n        \"\",\n        \"        });\",\n        \"\",\n        \"        $(\\\".message\\\").html(html);\",\n        \"\",\n        \"      });\",\n        \"    });\",\n        \"  });\",\n        \"fcces\",\n        \"\",\n        \"<div class=\\\"container-fluid\\\">\",\n        \"  <div class = \\\"row text-center\\\">\",\n        \"    <h2>Cat Photo Finder</h2>\",\n        \"  </div>\",\n        \"  <div class = \\\"row text-center\\\">\",\n        \"    <div class = \\\"col-xs-12 well message\\\">\",\n        \"      The message will go here\",\n        \"    </div>\",\n        \"  </div>\",\n        \"  <div class = \\\"row text-center\\\">\",\n        \"    <div class = \\\"col-xs-12\\\">\",\n        \"      <button id = \\\"getMessage\\\" class = \\\"btn btn-primary\\\">\",\n        \"        Get Message\",\n        \"      </button>\",\n        \"    </div>\",\n        \"  </div>\",\n        \"</div>\"\n      ],\n      \"tests\": [\n        \"assert(code.match(/filter/gi), 'message: 你应该使用<code>.filter</code>这个方法。');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 0\n    },\n    {\n      \"id\": \"56bbb991ad1ed5201cd392da\",\n      \"title\": \"Get Geo-location Data\",\n      \"description\": [\n        \"还有一件很棒的事情，我们可以获取用户的当前位置。每个浏览器都有自带的 Navigator 接口供我们调用。\",\n        \"地理位置的信息包括经度<code>longitude</code>和纬度<code>latitude</code>。\",\n        \"你将会看到一个是否允许获取当前位置的提示。不管你选择允许或者禁止，只要代码正确，这关就能过了。\",\n        \"如果你选择允许，你将会看到右侧手机输出的文字为你当前所在位置的经纬度。\",\n        \"代码如下：\",\n        \"<blockquote>if (navigator.geolocation) {</br>  navigator.geolocation.getCurrentPosition(function(position) {</br>    $(\\\"#data\\\").html(\\\"latitude: \\\" + position.coords.latitude + \\\"&lt;br&gt;longitude: \\\" + position.coords.longitude);</br>  });</br>}</blockquote>\"\n      ],\n      \"challengeSeed\": [\n        \"fccss\",\n        \"  // 请把你的代码写在这条注释以下\",\n        \"  \",\n        \"  \",\n        \"  \",\n        \"  // 请把你的代码写在这条注释以上\",\n        \"fcces\",\n        \"<div id = \\\"data\\\">\",\n        \"  <h4>You are here:</h4>\",\n        \"  \",\n        \"</div>\"\n      ],\n      \"tests\": [\n        \"assert(code.match(/navigator\\\\.geolocation\\\\.getCurrentPosition/gi), 'message: 你应该使用 <code>navigator.geolocation</code> 来获取用户的当前地理位置。');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 0\n    }\n  ]\n}\n"
  },
  {
    "path": "seed/challenges/01-front-end-development-certification/object-oriented-and-functional-programming.json",
    "content": "{\n  \"name\": \"Object Oriented and Functional Programming\",\n  \"order\": 7,\n  \"time\": \"2 hours\",\n  \"helpRoom\": \"chinese\",\n  \"note\": [\n    \"Methods\",\n    \"Closures\",\n    \"Factories\",\n    \"Pure Functions\",\n    \"Currying Functions\",\n    \"Functors\",\n    \"Currying Functions\"\n  ],\n  \"challenges\": [\n    {\n      \"id\": \"cf1111c1c15feddfaeb1bdef\",\n      \"title\": \"Declare JavaScript Objects as Variables\",\n      \"description\": [\n        \"在我们深入 <strong>面向对象编程之前</strong> ，让我们先回顾一下Javascript的 <strong>对象（Object）</strong> \",\n        \"任务：给你的 <code>motorBike</code> 对象添加 <code>wheels</code>, <code>engines</code> 和 <code>seats</code> 属性，并且设置他们的数量。\"\n      ],\n      \"challengeSeed\": [\n        \"var car = {\",\n        \"  \\\"wheels\\\":4,\",\n        \"  \\\"engines\\\":1,\",\n        \"  \\\"seats\\\":5\",\n        \"};\",\n        \"\",\n        \"var motorBike = {\",\n        \"\",\n        \"  // 只能在这一行下面写代码\",\n        \"\",\n        \"};\"\n      ],\n      \"tail\": [\n        \"(function() {return JSON.stringify(motorBike);})();\"\n      ],\n      \"solutions\": [\n        \"var car = {\\n  \\\"wheels\\\":4,\\n  \\\"engines\\\":1,\\n  \\\"seats\\\":5\\n};\\n\\nvar motorBike = {\\n  \\\"wheels\\\": 4,\\n  \\\"engines\\\": 1,\\n  \\\"seats\\\": 2\\n};\"\n      ],\n      \"tests\": [\n        \"assert(typeof motorBike.engines === 'number', 'message: <code>motorBike</code> 应该有一个 <code>engines</code> 属性，且属性值为数字。');\",\n        \"assert(typeof motorBike.wheels === 'number', 'message: <code>motorBike</code> 应该有一个 <code>wheels</code> 属性，且属性值为数字。');\",\n        \"assert(typeof motorBike.seats === 'number', 'message: <code>motorBike</code> 应该有一个 <code>seats</code> 属性，且属性值为数字。');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 1\n    },\n    {\n      \"id\": \"cf1111c1c15feddfaeb2bdef\",\n      \"title\": \"Construct JavaScript Objects with Functions\",\n      \"description\": [\n        \"除了上一种方法外，我们还可以使用<strong>构造函数</strong>来创建对象。\",\n        \" <strong>构造函数</strong> 通常使用大写字母开头，以便把自己和其他普通函数区别开。\",\n        \"下面便是一个 <strong>构造函数</strong> 了：\",\n        \"<blockquote>var Car = function() {<br>&nbsp;&nbsp;this.wheels = 4;<br>&nbsp;&nbsp;this.engines = 1;<br>&nbsp;&nbsp;this.seats = 1;<br>};</blockquote>\",\n        \"在 <strong> 构造函数 </strong> 中， <code>this</code> 指向被此 <strong>构造函数</strong> 创建出来的 <strong>对象</strong> 。所以，当我们在 <strong>构造函数</strong> 中写：\",\n        \"<code>&nbsp;&nbsp;this.wheels = 4;</code>\",\n        \"这时，它创建出来的新<strong>对象</strong>将带有 <code>wheels</code> 属性，并且赋值为 <code>4</code>.\",\n        \"你可以认为 <strong>构造函数</strong> 描述了它所创建出来的<strong>对象</strong>。\",\n        \"让你的 <code>MotorBike</code> <strong>构造函数</strong> 描述一个具有 <code>wheels</code>, <code>engines</code> 和 <code>seats</code> 属性的 <strong>对象</strong> ，并且为这些属性设置值。\"\n      ],\n      \"challengeSeed\": [\n        \"var Car = function() {\",\n        \"  this.wheels = 4;\",\n        \"  this.engines = 1;\",\n        \"  this.seats = 1;\",\n        \"};\",\n        \"\",\n        \"// 只能在这一行下面写代码\",\n        \"\",\n        \"var MotorBike = function() {\",\n        \"\",\n        \"};\"\n      ],\n      \"tail\": [\n        \"(function() {return JSON.stringify(new MotorBike());})();\"\n      ],\n      \"solutions\": [\n        \"var Car = function() {\\n  this.wheels = 4;\\n  this.engines = 1;\\n  this.seats = 1;\\n};\\n\\nvar myCar = new Car();\\n\\nvar MotorBike = function() {\\n  this.engines = 1;\\n  this.seats = 1;\\n  this.wheels = 4;\\n};\\n\\nvar myMotorBike = new MotorBike();\"\n      ],\n      \"tests\": [\n        \"assert(typeof (new MotorBike()).engines === 'number', 'message: <code>MotorBike</code> 应该有一个 <code>engines</code> 属性，且属性值为数字。');\",\n        \"assert(typeof (new MotorBike()).wheels === 'number', 'message: <code>MotorBike</code> 应该有一个 <code>wheels</code> 属性，且属性值为数字。');\",\n        \"assert(typeof (new MotorBike()).seats === 'number', 'message: <code>MotorBike</code> 应该有一个 <code>seats</code> 属性，且属性值为数字。');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 1\n    },\n    {\n      \"id\": \"cf1111c1c15feddfaeb4bdef\",\n      \"title\": \"Make Instances of Objects with a Constructor Function\",\n      \"description\": [\n        \"现在，我们把上一节课我们写的 <strong>构造函数</strong> 在这里用起来！\",\n        \"使用构造函数时，我们通过在它前面使用 <code>new</code> <strong>关键字</strong> 来对它进行调用，如下：\",\n        \"<code>var myCar = new Car();</code>\",\n        \"<code>myCar</code> 现在成为了 <code>Car</code> 的一个 <strong>实例</strong>（instance），它被 <strong>构造函数</strong> 描述成下面的样子：\",\n        \"<blockquote>{<br>&nbsp;&nbsp;wheels: 4,<br>&nbsp;&nbsp;engines: 1,<br>&nbsp;&nbsp;seats: 1<br>}</blockquote>\",\n        \"记住：要使用 <code>new</code> <strong>关键字</strong> 去调用构造函数。因为只有这样，Javascript才知道这是要去构造一个新 <strong>对象</strong> ，并且把构造函数中的 <code>this</code> 指向这个新对象。\",\n        \"现在，当 <code>myCar</code> （即 <code>Car</code> 的一个 <strong>实例</strong> ）创建后，他可以像普通对象一样被使用，包括创建、访问、修改它的属性等，就像我们使用其他对象一样。如下：\",\n        \"<code>myCar.turboType = \\\"twin\\\";</code>\",\n        \"我们的 <code>myCar</code> 变量现在有了一个 <code>turboType</code> 属性了，且值为 <code>\\\"twin\\\"</code> 。\",\n        \"在编辑器中，使用 <code>Car</code> 这个构造函数去创建一个新的 <strong>实例</strong> ，并且把这个实例赋值给 <code>myCar</code> 。\",\n        \"然后给 <code>myCar</code> 创建一个 <code>nickname</code> 属性，且属性值为一个字符串\"\n      ],\n      \"challengeSeed\": [\n        \"var Car = function() {\",\n        \"  this.wheels = 4;\",\n        \"  this.engines = 1;\",\n        \"  this.seats = 1;\",\n        \"};\",\n        \"\",\n        \"// 只能在这一行下面写代码\",\n        \"\",\n        \"var myCar;\"\n      ],\n      \"tail\": [\n        \"(function() {return JSON.stringify(myCar);})();\"\n      ],\n      \"solutions\": [\n        \"var Car = function() {\\n  this.wheels = 4;\\n  this.engines = 1;\\n  this.seats = 1;\\n};\\n\\nvar myCar = new Car();\\n\\nmyCar.nickname = \\\"Lucy\\\";\"\n      ],\n      \"tests\": [\n        \"assert((new Car()).wheels === 4, 'message:  <strong>构造函数</strong> 中的 <code>wheels</code> 属性的值应该还是 <code>4</code> 不变。');\",\n        \"assert(typeof (new Car()).nickname === 'undefined', 'message: <strong>构造函数</strong> 中不应该有 <code>nickname</code> 属性。');\",\n        \"assert(myCar.wheels === 4, 'message: <code>myCar</code> 中的 <code>wheels</code> 属性的值应该等于 <code>4</code> ');\",\n        \"assert(typeof myCar.nickname === 'string', 'message: <code>myCar</code> 中的 <code>nickname</code> 属性应该是一个字符串(String)。');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 1\n    },\n    {\n      \"id\": \"563cfb55594311ffcb333c70\",\n      \"title\": \"Make Unique Objects by Passing Parameters to our Constructor\",\n      \"description\": [\n        \"我们之前写的 <code>构造函数</code> 很好，但是我们不想总是创建相同的对象，怎么办呢？\",\n        \"为了解决这个问题，我们要向 <code>构造函数</code> 中添加 <code>参数</code> 。像下面这样：\",\n        \"<blockquote>var Car = function(wheels, seats, engines) {<br>&nbsp;&nbsp;this.wheels = wheels;<br>&nbsp;&nbsp;this.seats = seats;<br>&nbsp;&nbsp;this.engines = engines;<br>};</blockquote>\",\n        \"现在，我们可以在调用 <code>构造函数</code> 时传入一组 <code>参数</code> 了。\",\n        \"<code>var myCar = new Car(6, 3, 1);</code>\",\n        \"这段代码将会使用这一组 <code>参数</code> 来创建出下面的对象：\",\n        \"<blockquote>{<br>&nbsp;&nbsp;wheels: 6,<br>&nbsp;&nbsp;seats: 3,<br>&nbsp;&nbsp;engines: 1<br>}</blockquote>\",\n        \"现在该你试试了！改动 <code>Car</code> 的 <code>构造函数</code> ，使它能够通过使用 <code>参数</code> 来为 <code>wheels</code> 、 <code>seats</code> 、 <code>engines</code> 属性进行赋值。\",\n        \"然后调用你刚刚改写过的 <code>构造函数</code> ，并传入三个 <code>参数</code> ，我们就能看到创建的新对象赋值给了 <code>myCar</code> 。\"\n      ],\n      \"challengeSeed\": [\n        \"var Car = function() {\",\n        \"  // 请修改这个构造器\",\n        \"  this.wheels = 4;\",\n        \"  this.seats = 1;\",\n        \"  this.engines = 1;\",\n        \"};\",\n        \"\",\n        \"// 你可以修改这一行来测试你的代码\",\n        \"var myCar;\"\n      ],\n      \"tail\": [\n        \"(function() {return JSON.stringify(myCar);})();\"\n      ],\n      \"solutions\": [\n        \"var Car = function(wheels,seats,engines) {\\n  this.wheels = wheels;\\n  this.seats = seats;\\n  this.engines = engines;\\n};\\n\\nvar myCar = new Car(4,1,1);\"\n      ],\n      \"tests\": [\n        \"assert((function(){var testCar = new Car(3,1,2); return testCar.wheels === 3 && testCar.seats === 1 && testCar.engines === 2;})(), 'message: 调用 <code>new Car(3,1,2)</code> 时，应该创建一个对象，这个对象带有一个 <code>wheels</code> 属性，且值为 <code>3</code>，一个 <code>seats</code> 属性，且值为 <code>1</code>，和一个 <code>engines</code> 属性，且值为 <code>2</code>。');\",\n        \"assert((function(){var testCar = new Car(4,4,2); return testCar.wheels === 4 && testCar.seats === 4 && testCar.engines === 2;})(), 'message: 调用 <code>new Car(4,4,2)</code> 时，应该创建一个对象，这个对象带有一个 <code>wheels</code> 属性，且值为 <code>4</code，一个 <code>seats</code> 属性，且值为 <code>4</code>，和一个 <code>engines</code> 属性，且值为 <code>2</code>.');\",\n        \"assert((function(){var testCar = new Car(2,6,3); return testCar.wheels === 2 && testCar.seats === 6 && testCar.engines === 3;})(), 'message: 调用 <code>new Car(2,6,3)</code> 时，应该创建一个对象，这个对象带有一个 <code>wheels</code> 属性，且值为 <code>2</code>，一个 <code>seats</code> 属性，且值为<code>6</code>，和一个 <code>engines</code> 属性，且值为 <code>3</code>.');\",\n        \"assert(typeof myCar.wheels === 'number' && typeof myCar.seats === 'number' && typeof myCar.engines === 'number', 'message: <code>myCar</code> 的 <code>wheels</code>、<code>seats</code>、 <code>engines</code> 属性的值应该是一个数字。');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 1\n    },\n    {\n      \"id\": \"cf1111c1c15feddfaeb3bdef\",\n      \"title\": \"Make Object Properties Private\",\n      \"description\": [\n        \"对象拥有自己的特征，称为 <code>属性</code>，对象还有自己的函数，称为 <code>方法</code> 。\",\n        \"在前面的课程（构造函数）中，我们使用了 <code>this</code> 指向当前（将要被创建的）对象中的 <code>公有属性</code> 。\",\n        \"我们也可以创建 <code>私有属性</code> 和 <code>私有方法</code> ，它们两个在对象外部是不可访问的。\",\n        \"为了完成这个任务，我们在 <code>构造函数</code> 中，使用我们熟悉的 <code>var</code> 关键字去创建变量，来替代我们使用 <code>this</code> 创建 <code>属性</code> 。\",\n        \"比如，我们想记录我们的car行驶的 <code>speed</code> ，但是我们希望外面的代码对 <code>speed</code> 的修改只能是加速或减速（而不是变成字符串、直接赋值成某个速度等其他操作），那么如何达到这类操作的目的呢？\",\n        \"编辑器中的 <code>构造函数</code> 展示了如何实现这种控制模式。\",\n        \"该你自己试试了！修改 <code>Bike</code> 的 <code>构造函数</code> ，使它有一个名为 <code>gear</code> 的 <code>私有属性</code> ，还有两个公有方法，叫做 <code>getGear</code> 和 <code>setGear</code>。其中 get 是获得、set 是设置的意思。这两个方法用来获得和设置 <code>gear</code> 的值。\"\n      ],\n      \"challengeSeed\": [\n        \"var Car = function() {\",\n        \"  // 这是一个私有方法\",\n        \"  var speed = 10;\",\n        \"\",\n        \"  // 这些是公共方法\",\n        \"  this.accelerate = function(change) {\",\n        \"    speed += change;\",\n        \"  };\",\n        \"\",\n        \"  this.decelerate = function() {\",\n        \"    speed -= 5;\",\n        \"  };\",\n        \"\",\n        \"  this.getSpeed = function() {\",\n        \"    return speed;\",\n        \"  };\",\n        \"};\",\n        \"\",\n        \"var Bike = function() {\",\n        \"\",\n        \"  // 只能在这一行下面写代码\",\n        \"\",\n        \"};\",\n        \"\",\n        \"var myCar = new Car();\",\n        \"\",\n        \"var myBike = new Bike();\"\n      ],\n      \"tail\": [\n        \"if(myBike.hasOwnProperty('getGear')){(function() {return JSON.stringify(myBike.getGear());})();}\"\n      ],\n      \"solutions\": [\n        \"var Car = function() {\\n  var speed = 10;\\n\\n  this.accelerate = function(change) {\\n    speed += change;\\n  };\\n\\n  this.decelerate = function() {\\n    speed -= 5;\\n  };\\n\\n  this.getSpeed = function() {\\n    return speed;\\n  };\\n};\\n\\nvar Bike = function() {\\n  var gear = 1;\\n  \\n  this.getGear = function() {\\n    return gear;\\n  };\\n  \\n  this.setGear = function(newGear) {\\n    gear = newGear;\\n  };\\n};\\n\\nvar myCar = new Car();\\n\\nvar myBike = new Bike();\"\n      ],\n      \"tests\": [\n        \"assert(typeof myBike.getGear !== 'undefined' && typeof myBike.getGear === 'function', 'message: <code>myBike</code> 的 <code>getGear</code> 方法在对象之外应该可以访问。');\",\n        \"assert(typeof myBike.setGear !== 'undefined' && typeof myBike.setGear === 'function', 'message: <code>myBike</code> 的 <code>setGear</code> 方法在对象之外应该可以访问。 ');\",\n        \"assert(typeof myBike.gear === 'undefined', 'message: <code>myBike.gear</code> 在外部访问时，应该保持  <code>undefined</code> ，即外部访问不到私有属性。');\",\n        \"assert.strictEqual((function () { myBike.setGear(4); return myBike.getGear(); })(), 4, 'message: 当调用 <code>myBike.setGear(4)</code>时，<code>myBike.getGear()</code> 应该返回 <code>4</code> 。');\",\n        \"assert.strictEqual((function () { myBike.setGear(3); return myBike.getGear(); })(), 3, 'message: 当调用 <code>myBike.setGear(3)</code> 时，<code>myBike.getGear()</code> 应该返回 <code>3</code> 。');\",\n        \"assert.strictEqual((function () { myBike.setGear(1); return myBike.getGear(); })(), 1, 'message: 当调用 <code>myBike.setGear(1)</code> 时，<code>myBike.getGear()</code> 应该返回 <code>1</code> 。');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 1\n    },\n    {\n      \"id\": \"cf1111c1c15feddfaeb7bdef\",\n      \"title\": \"Iterate over Arrays with .map\",\n      \"description\": [\n        \" <code>map</code> 方法可以方便的迭代数组，例子：\",\n        \"<blockquote>var timesFour = oldArray.map(function(val){<br>&nbsp;&nbsp;return val * 4;<br>});</blockquote>\",\n        \"\",\n        \" <code>map</code> 方法会迭代数组中的每一个元素，并根据回调函数来处理每一个元素，最后返回一个新数组。注意，这个方法不会改变原始数组。\",\n        \"在我们的例子中，回调函数只有一个参数，即数组中元素的值 (<code>val</code> 参数) ，但其实，你的回调函数也可以支持多个参数，譬如：元素的索引<code>index</code>、原始数组<code>arr</code>。\",\n        \"使用 <code>map</code> 方法来为 <code>oldArray</code> 中的每一项增加3，并且在 <code>newArray</code> 中保存它们。 <code>oldArray</code> 不应该被改变。\"\n      ],\n      \"challengeSeed\": [\n        \"var oldArray = [1,2,3,4,5];\",\n        \"\",\n        \"// 只能在这一行下面写代码\",\n        \"\",\n        \"var newArray = oldArray;\"\n      ],\n      \"tail\": [\n        \"(function() {return newArray;})();\"\n      ],\n      \"tests\": [\n        \"assert.deepEqual(oldArray, [1,2,3,4,5], 'message: 你不应该改变原始数组。');\",\n        \"assert.deepEqual(newArray, [4,5,6,7,8], 'message: 你应该为数组中的每一项加3.');\",\n        \"assert(editor.getValue().match(/\\\\.map\\\\s*\\\\(/gi), 'message: 你应该使用 <code>map</code> 方法。');\",\n        \"assert(editor.getValue().match(/\\\\[1\\\\,2\\\\,3\\\\,4\\\\,5\\\\]/gi), 'message: 你只能用 <code>map</code> 来更该数组。');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 1\n    },\n    {\n      \"id\": \"cf1111c1c15feddfaeb8bdef\",\n      \"title\": \"Condense arrays with .reduce\",\n      \"description\": [\n        \"数组方法 <code>reduce</code> 用来迭代一个数组，并且把它累积到一个值中。\",\n        \"使用 <code>reduce</code> 方法时，你要传入一个回调函数，这个回调函数的参数是一个 <strong>累加器</strong> （比如例子中的 <code>previousVal</code>) 和当前值 (<code>currentVal</code>）。\",\n        \"<code>reduce</code> 方法有一个可选的第二参数，它可以被用来设置累加器的初始值。如果没有在这定义初始值，那么初始值将变成数组中的第一项，而 <code>currentVal</code> 将从数组的第二项开始。\",\n        \"下面的例子使用了 <code>reduce</code> 来让数组中的所有值相减：\",\n        \"<blockquote>var singleVal = array.reduce(function(previousVal, currentVal) {<br>&nbsp;&nbsp;return previousVal - currentVal;<br>}, 0);</blockquote>\",\n        \"使用 <code>reduce</code> 方法来让 <code>array</code> 中的所有值相加，并且把结果赋值给 <code>singleVal</code> 。\"\n      ],\n      \"challengeSeed\": [\n        \"var array = [4,5,6,7,8];\",\n        \"var singleVal = 0;\",\n        \"\",\n        \"// 只能在这一行下面写代码\",\n        \"\",\n        \"singleVal = array;\"\n      ],\n      \"tail\": [\n        \"(function() {return singleVal;})();\"\n      ],\n      \"tests\": [\n        \"assert(singleVal == 30, 'message: <code>singleVal</code> 应该等于 <code>array</code> 中所有数的和。');\",\n        \"assert(editor.getValue().match(/\\\\.reduce\\\\s*\\\\(/gi), 'message: 你应该使用 <code>reduce</code> 方法。');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 1\n    },\n    {\n      \"id\": \"cf1111c1c15feddfaeb9bdef\",\n      \"title\": \"Filter Arrays with .filter\",\n      \"description\": [\n        \" <code>filter</code> 方法用来迭代一个数组，并且按给出的条件过滤出符合的元素。\",\n        \"<code>filter</code> 方法传入一个回调函数，这个回调函数会携带一个参数，参数为当前迭代的项（我们叫它 <code>val</code> ）。\",\n        \"回调函数返回 <code>true</code> 的项会保留在数组中，返回 <code>false</code> 的项会被过滤出数组。\",\n        \"下面的代码示例展示了使用 <code>filter</code> 来移除数组中值等于5的项：\",\n        \" <strong>注意：</strong> 我们忽略了第二参数和第三参数，因为例子中我们只需要第一参数就够了。\",\n        \"<blockquote>array = array.filter(function(val) {<br>&nbsp;&nbsp;return val !== 5;<br>});</blockquote>\",\n        \"使用 <code>filter</code> 来创建一个新数组，新数组的值是 <code>oldArray</code> 中值小于6的元素。不许改变原数组 <code>oldArray</code> 。\"\n      ],\n      \"challengeSeed\": [\n        \"var oldArray = [1,2,3,4,5,6,7,8,9,10];\",\n        \"\",\n        \"// 只能在这一行下面写代码\",\n        \"\",\n        \"var newArray = oldArray;\"\n      ],\n      \"tail\": [\n        \"(function() {return newArray;})();\"\n      ],\n      \"tests\": [\n        \"assert.deepEqual(oldArray, [1,2,3,4,5,6,7,8,9,10], 'message: 你不应该改变原始数组。');\",\n        \"assert.deepEqual(newArray, [1,2,3,4,5], 'message: 你应该保留数组中小于 6 的元素。 ');\",\n        \"assert(editor.getValue().match(/array\\\\.filter\\\\s*\\\\(/gi), 'message: 你应该使用 <code>filter</code> 来创建新的数组。');\",\n        \"assert(editor.getValue().match(/\\\\[1\\\\,2\\\\,3\\\\,4\\\\,5\\\\,6\\\\,7\\\\,8\\\\,9\\\\,10\\\\]/gi), 'message: 你应该使用 <code>filter</code> 来生成新数组中的值。');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 1\n    },\n    {\n      \"id\": \"cf1111c1c16feddfaeb1bdef\",\n      \"title\": \"Sort Arrays with .sort\",\n      \"description\": [\n        \"使用 <code>sort</code> 方法，你可以很容易的按字母顺序或数字顺序对数组中的元素进行排序。\",\n        \"与我们之前用的数组方法仅仅返回一个新数组不同， <code>sort</code> 方法将改变原数组，返回被排序后的数组。\",\n        \"<code>sort</code> 可以把比较函数作为参数传入。比较函数有返回值，当 <code>a</code> 小于 <code>b</code>，返回一个负数；当 <code>a</code> 大于 <code>b</code> ，返回一个正数；相等时返回0。\",\n        \"如果没有传入比较函数，它将把值全部转成字符串，并按照字母顺序进行排序。\",\n        \"下面的例子将展示 <code>sort</code> 的使用，传入的比较函数把元素按照从小到大的顺序进行排列：\",\n        \"<blockquote>var array = [1, 12, 21, 2];<br>array.sort(function(a, b) {<br>&nbsp;&nbsp;return a - b;<br>});</blockquote>\",\n        \"使用 <code>sort</code> 按照从大到小的顺序排序 <code>array</code> 。\"\n      ],\n      \"challengeSeed\": [\n        \"var array = [1, 12, 21, 2];\",\n        \"\",\n        \"// 只能在这一行下面写代码\",\n        \"\",\n        \"array.sort();\"\n      ],\n      \"tail\": [\n        \"(function() {return array;})();\"\n      ],\n      \"tests\": [\n        \"assert.deepEqual(array, [21, 12, 2, 1], 'message: 你应该按照从大到小的顺序排序。');\",\n        \"assert(editor.getValue().match(/\\\\[1,\\\\s*12,\\\\s*21,\\\\s*2\\\\];/gi), 'message: 你应该使用 <code>sort</code> 来改变数组。');\",\n        \"assert(editor.getValue().match(/\\\\.sort\\\\s*\\\\(/g), 'message: 你应该使用 <code>sort</code> 方法。');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 1\n    },\n    {\n      \"id\": \"cf1111c1c16feddfaeb2bdef\",\n      \"title\": \"Reverse Arrays with .reverse\",\n      \"description\": [\n        \"你可以使用 <code>reverse</code> 方法来翻转数组。\",\n        \"<blockquote>var myArray = [1, 2, 3];<br>myArray.reverse();</blockquote>\",\n        \"<em>结果myArray 变成了 [3, 2, 1]</em>\",\n        \"使用 <code>reverse</code> 来翻转 <code>array</code> 数组。并赋值给 <code>newArray</code>.\"\n      ],\n      \"challengeSeed\": [\n        \"var array = [1,2,3,4,5,6,7];\",\n        \"var newArray = [];\",\n        \"\",\n        \"// 只能在这一行下面写代码\",\n        \"\",\n        \"newArray = array;\"\n      ],\n      \"tail\": [\n        \"(function() {return newArray;})();\"\n      ],\n      \"tests\": [\n        \"assert.deepEqual(newArray, [7,6,5,4,3,2,1], 'message: 你应该反序数组。');\",\n        \"assert(editor.getValue().match(/\\\\.reverse\\\\s*\\\\(\\\\)/gi), 'message: 你应该使用 <code>reverse</code> 方法。');\",\n        \"assert(editor.getValue().match(/\\\\[1\\\\,2\\\\,3\\\\,4\\\\,5\\\\,6\\\\,7/gi), 'message: 你应该仅用 <code>reverse</code> 去修改 <code>array</code>。');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 1\n    },\n    {\n      \"id\": \"cf1111c1c16feddfaeb3bdef\",\n      \"title\": \"Concatenate Arrays with .concat\",\n      \"description\": [\n        \"<code>concat</code> 方法可以用来把两个数组的内容合并到一个数组中。\",\n        \"<code>concat</code> 方法的参数应该是一个数组。参数中的数组会拼接在原数组的后面，并作为一个新数组返回。\",\n        \"下面是一个拼接数组的例子，用<code>concat</code> 把 <code>otherArray</code> 拼接在 <code>oldArray</code> 的后面：\",\n        \"<code>newArray = oldArray.concat(otherArray);</code>\",\n        \"使用 <code>.concat()</code> 将 <code>concatMe</code> 拼接到 <code>oldArray</code> 后面，并且赋值给 <code>newArray</code>。\"\n      ],\n      \"challengeSeed\": [\n        \"var oldArray = [1,2,3];\",\n        \"var newArray = [];\",\n        \"\",\n        \"var concatMe = [4,5,6];\",\n        \"\",\n        \"// 只能在这一行下面写代码\",\n        \"\",\n        \"newArray = oldArray;\"\n      ],\n      \"tail\": [\n        \"(function() {return newArray;})();\"\n      ],\n      \"tests\": [\n        \"assert.deepEqual(newArray, [1,2,3,4,5,6], 'message: 你应该合并两个数组。');\",\n        \"assert(editor.getValue().match(/\\\\.concat\\\\s*\\\\(/gi), 'message: 你应该使用 <code>concat</code> 方法来合并数组。');\",\n        \"assert(editor.getValue().match(/\\\\[1\\\\,2\\\\,3\\\\]/gi) && editor.getValue().match(/\\\\[4\\\\,5\\\\,6\\\\]/gi), 'message: 你应该使用 <code>concat</code> 方法去修改数组。');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 1\n    },\n    {\n      \"id\": \"cf1111c1c16feddfaeb4bdef\",\n      \"title\": \"Split Strings with .split\",\n      \"description\": [\n        \"你可以使用 <code>split</code> 方法按指定分隔符将字符串分割为数组。\",\n        \"你要给 <code>split</code> 方法传递一个参数，这个参数将会作为一个分隔符。\",\n        \"下面的例子展示了 <code>split</code> 方法的使用，按照 <code>s</code> 字母进行分割：\",\n        \"<code>var array = string.split('s');</code>\",\n        \"使用 <code>split</code> 方法来把字符串 <code>string</code> 分割为数组 <code>array</code>。\"\n      ],\n      \"challengeSeed\": [\n        \"var string = \\\"Split me into an array\\\";\",\n        \"var array = [];\",\n        \"\",\n        \"// 只能在这一行下面写代码\",\n        \"\",\n        \"array = string;\"\n      ],\n      \"tail\": [\n        \"(function() {return array;})();\"\n      ],\n      \"tests\": [\n        \"assert(/\\\\.split\\\\(/gi, 'message: 你应该在字符串上使用 <code>split</code> 方法。');\",\n        \"assert(typeof array === 'object' && array.length === 5, 'message: 你应该使用空格（ <code>\\\" \\\"</code> ）来分割字符串。 ');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 1\n    },\n    {\n      \"id\": \"cf1111c1c16feddfaeb5bdef\",\n      \"title\": \"Join Strings with .join\",\n      \"description\": [\n        \"我们还可以使用 <code>join</code> 方法来把数组转换成字符串，里面的每一个元素可以用你指定的连接符来连接起来，这个连接符就是你要传入的参数。\",\n        \"下面展示了使用 <code>join</code> 来将数组中的每一项放入字符串，并用 <code> and </code> 进行连接：\",\n        \"<blockquote>var veggies = [\\\"Celery\\\", \\\"Radish\\\", \\\"Carrot\\\", \\\"Potato\\\"];<br>var salad = veggies.join(\\\" and \\\");<br>console.log(salad); // \\\"Celery and Radish and Carrot and Potato\\\" </blockquote>\",\n        \"使用 <code>join</code> 方法，连接符为<code>' '</code>把数组 <code>joinMe</code> 转化成字符串 <code>joinedString</code>.\"\n      ],\n      \"challengeSeed\": [\n        \"var joinMe = [\\\"Split\\\",\\\"me\\\",\\\"into\\\",\\\"an\\\",\\\"array\\\"];\",\n        \"var joinedString = '';\",\n        \"\",\n        \"// 只能在这一行下面写代码\",\n        \"\",\n        \"joinedString = joinMe;\"\n      ],\n      \"tail\": [\n        \"(function() {return joinedString;})();\"\n      ],\n      \"tests\": [\n        \"assert(typeof joinedString === 'string' && joinedString === \\\"Split me into an array\\\", 'message: 你应该使用空格来分隔元素。');\",\n        \"assert(/\\\\.join\\\\(/gi, 'message: 你应该在数组上使用 <code>join</code> 方法。');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 1\n    }\n  ]\n}\n"
  },
  {
    "path": "seed/challenges/02-data-visualization-certification/d3.json",
    "content": "{\n  \"name\": \"D3\",\n  \"order\": 16,\n  \"isComingSoon\": true,\n  \"time\": \"5 hours\",\n  \"helpRoom\": \"chinese\",\n  \"challenges\": [\n    {\n      \"id\": \"bd7158d8c423ede2aab5bdee\",\n      \"title\": \"Learn D3 Challenges\",\n      \"description\": [],\n      \"challengeSeed\": [],\n      \"tests\": [],\n      \"type\": \"waypoint\",\n      \"challengeType\": 3\n    }\n  ]\n}"
  },
  {
    "path": "seed/challenges/02-data-visualization-certification/data-visualization-certificate.json",
    "content": "{\n  \"name\": \"Claim Your Data Visualization Certificate\",\n  \"order\": 18,\n  \"time\": \"5 minutes\",\n  \"challenges\": [\n    {\n      \"id\": \"561add10cb82ac38a17513b3\",\n      \"title\": \"Claim Your Data Visualization Certificate\",\n      \"description\": [\n        [\n          \"//i.imgur.com/Et3iD74.jpg\",\n          \"An image of our Data Visualization Certificate\",\n          \"这个挑战将授予你数据可视化认证证书。在我们授予你证书前，我们必须验证你是否已全部完成我们的React和D3.js项目。你同意必须接受我们的学术诚信承诺。点击下面的按钮我们就开始这一过程。\",\n          \"\"\n        ],\n        [\n          \"//i.imgur.com/HArFfMN.jpg\",\n          \"The definition of plagiarism: Plagiarism (noun) - copying someone else’s work and presenting it as your own without crediting them\",\n          \"点击下面的按钮，你便默认承诺全部你提交的代码满足下列条件 A) 代码是你或你搭档独立完成的，或者 B) 代码来自如jQuery这样的开源库，亦或者，C) 已经清楚的注明了代码的原作者。你同样也授予我们修改你编码挑战的解决方案，同时，如果我们发现你的代码有任何抄袭的证据，我们也会撤销你的证书。\",\n          \"#\"\n        ],\n        [\n          \"//i.imgur.com/14F2Van.jpg\",\n          \"An image of the text \\\"Data Visualization Certificate requirements\\\"\",\n          \"让我们确认你已经完成了我们的React和D3.js项目。请点击下面的按钮来验证。\",\n          \"#\"\n        ],\n        [\n          \"//i.imgur.com/16SIhHO.jpg\",\n          \"An image of the word \\\"Congratulations\\\"\",\n          \"恭喜你！我们已经将数据可视化证书添加到你个人的档案页面。除非你选择隐藏你的解决方案，你获得的证书会一直公开有效。\",\n          \"\"\n        ]\n      ],\n      \"challengeSeed\": [\n        {\n          \"properties\": [\n            \"isHonest\",\n            \"isDataVisualizationCert\"\n          ],\n          \"apis\": [\n            \"/certificate/honest\",\n            \"/certificate/verify/data-visualization\"\n          ],\n          \"stepIndex\": [\n            1,\n            2\n          ]\n        }\n      ],\n      \"tests\": [\n        {\n          \"id\": \"bd7157d8c242eddfaeb5bd13\",\n          \"title\": \"Build a Markdown Previewer\"\n        },\n        {\n          \"id\": \"bd7156d8c242eddfaeb5bd13\",\n          \"title\": \"Build a Camper Leaderboard\"\n        },\n        {\n          \"id\": \"bd7155d8c242eddfaeb5bd13\",\n          \"title\": \"Build a Recipe Box\"\n        },\n        {\n          \"id\": \"bd7154d8c242eddfaeb5bd13\",\n          \"title\": \"Build the Game of Life\"\n        },\n        {\n          \"id\": \"bd7153d8c242eddfaeb5bd13\",\n          \"title\": \"Build a Roguelike Dungeon Crawler Game\"\n        },\n        {\n          \"id\": \"bd7168d8c242eddfaeb5bd13\",\n          \"title\": \"Visualize Data with a Bar Chart\"\n        },\n        {\n          \"id\": \"bd7178d8c242eddfaeb5bd13\",\n          \"title\": \"Visualize Data with a Scatterplot Graph\"\n        },\n        {\n          \"id\": \"bd7188d8c242eddfaeb5bd13\",\n          \"title\": \"Visualize Data with a Heat Map\"\n        },\n        {\n          \"id\": \"bd7198d8c242eddfaeb5bd13\",\n          \"title\": \"Show Relationships with a Force Directed Graph\"\n        },\n        {\n          \"id\": \"bd7108d8c242eddfaeb5bd13\",\n          \"title\": \"Map Data Across the Globe\"\n        }\n      ],\n      \"type\": \"Waypoint\",\n      \"challengeType\": 7\n    }\n  ]\n}\n"
  },
  {
    "path": "seed/challenges/02-data-visualization-certification/data-visualization-projects.json",
    "content": "{\n  \"name\": \"Data Visualization Projects\",\n  \"order\": 17,\n  \"time\": \"200 hours\",\n  \"helpRoom\": \"chinese\",\n  \"challenges\": [\n    {\n      \"id\": \"bd7168d8c242eddfaeb5bd13\",\n      \"title\": \"Visualize Data with a Bar Chart\",\n      \"description\": [\n        \" <strong>目标：</strong> 在 <a href='http://codepen.io' target='_blank'>CodePen.io</a> 上创建一个功能与这个示例： <a href='http://codepen.io/FreeCodeCamp/full/adBBWd' target='_blank'>http://codepen.io/FreeCodeCamp/full/adBBWd</a> 类似的应用。\",\n        \" <strong>规则 #1：</strong> 代码是开源的，你可以借鉴，但请不要抄袭。\",\n        \" <strong>规则 #2：</strong> 完成以下 <a href='http://en.wikipedia.org/wiki/User_story' target='_blank'>用户故事（即用户需求）</a>。可以根据需要引用其它第三方的库或接口。以你自己的风格习惯完成这个项目。\",\n        \" <strong>规则 #3：</strong> 该项目必须使用 D3.js 库。\",\n        \" <strong>用户需求：</strong> 显示美国国内生产总值（GDP）季度统计图。\",\n        \" <strong>用户需求：</strong> 移动鼠标经过图上某点时，提示当前位置代表年份、季度和 GDP 值。\",\n        \" <strong>提示：</strong> 美国 GDP 统计数据可以引用这里的公布数据：<a href='https://raw.githubusercontent.com/FreeCodeCamp/ProjectReferenceData/master/GDP-data.json' target='_blank'>https://raw.githubusercontent.com/FreeCodeCamp/ProjectReferenceData/master/GDP-data.json</a>\",\n        \"当你遇到问题时，可以到这里求助： <a href='//github.com/FreeCodeCamp/freecodecamp/wiki/How-to-get-help-when-you-get-stuck' target='_blank'>Read-Search-Ask</a> 。\",\n        \"项目完成后，点击 \\\"我已经完成了这个挑战\\\" 并在弹出窗口中填入你在 CodePen 的项目链接。\",\n        \"最后，你可以在 <a href='//gitter.im/freecodecamp/chinese' target='_blank'>Code Review Chatroom</a> 中分享你的代码，获取反馈。也可以把它分享在微博或其他社交媒体上。\"\n      ],\n      \"challengeSeed\": [\n        \"150324699\"\n      ],\n      \"tests\": [],\n      \"isRequired\": true,\n      \"releasedOn\": \"January 1, 2016\",\n      \"type\": \"zipline\",\n      \"challengeType\": 3\n    },\n    {\n      \"id\": \"bd7178d8c242eddfaeb5bd13\",\n      \"title\": \"Visualize Data with a Scatterplot Graph\",\n      \"description\": [\n        \" <strong>目标：</strong> 在 <a href='http://codepen.io' target='_blank'>CodePen.io</a> 上创建一个功能与这个示例： <a href='http://codepen.io/FreeCodeCamp/full/GoNNEy' target='_blank'>http://codepen.io/FreeCodeCamp/full/GoNNEy</a> 类似的应用。\",\n        \" <strong>规则 #1：</strong> 代码是开源的，你可以借鉴，但请不要抄袭。\",\n        \" <strong>规则 #2：</strong> 完成以下 <a href='http://en.wikipedia.org/wiki/User_story' target='_blank'>用户故事（即用户需求）</a>。可以根据需要引用其它第三方的库或接口。以你自己的风格习惯完成这个项目。\",\n        \" <strong>规则 #3：</strong> 该项目必须使用 D3.js 库。\",\n        \" <strong>用户需求：</strong> 用散点图显示 FreeCodeCamp 骑行记录。\",\n        \" <strong>用户需求：</strong> 移动鼠标经过图上某点时，提示当前位置的详细信息。\",\n        \" <strong>提示： </strong> 骑行比赛数据参考这里： <a href='https://raw.githubusercontent.com/FreeCodeCamp/ProjectReferenceData/master/cyclist-data.json' target='_blank'>https://raw.githubusercontent.com/FreeCodeCamp/ProjectReferenceData/master/cyclist-data.json</a> 。\",\n        \"当你遇到问题时，可以到这里求助： <a href='//github.com/FreeCodeCamp/freecodecamp/wiki/How-to-get-help-when-you-get-stuck' target='_blank'>Read-Search-Ask</a> 。\",\n        \"项目完成后，点击 \\\"我已经完成了这个挑战\\\" 并在弹出窗口中填入你在 CodePen 的项目链接。\",\n        \"最后，你可以在 <a href='//gitter.im/freecodecamp/chinese' target='_blank'>Code Review Chatroom</a> 中分享你的代码，获取反馈。也可以把它分享在微博或其他社交媒体上。\"\n      ],\n      \"challengeSeed\": [\n        \"150324700\"\n      ],\n      \"tests\": [],\n      \"isRequired\": true,\n      \"releasedOn\": \"January 1, 2016\",\n      \"type\": \"zipline\",\n      \"challengeType\": 3\n    },\n    {\n      \"id\": \"bd7188d8c242eddfaeb5bd13\",\n      \"title\": \"Visualize Data with a Heat Map\",\n      \"description\": [\n        \" <strong>目标：</strong> 在 <a href='http://codepen.io' target='_blank'>CodePen.io</a> 上创建一个功能与这个示例： </a> app that is functionally similar to this: <a href='http://codepen.io/FreeCodeCamp/full/rxWWGa' target='_blank'>http://codepen.io/FreeCodeCamp/full/rxWWGa</a> 类似的应用。\",\n        \" <strong>规则 #1：</strong> 代码是开源的，你可以借鉴，但请不要抄袭。\",\n        \" <strong>规则 #2：</strong> 完成以下 <a href='http://en.wikipedia.org/wiki/User_story' target='_blank'>用户故事（即用户需求）</a>。可以根据需要引用其它第三方的库或接口。以你自己的风格习惯完成这个项目。\",\n        \" <strong>规则 #3：</strong> 该项目必须使用 D3.js 库。\",\n        \" <strong>用户需求：</strong> 用笛卡儿坐标系（X轴表示年份，Y轴表示月份）显示温度图。\",\n        \" <strong>用户需求：</strong> 每个单元格的颜色代表当前单元格与其他单元格平均温度的对比度（例如：越高于平均温度，显示颜色越红，越低于平均温度，显示颜色越蓝）。\",\n        \" <strong>用户需求：</strong> 移动鼠标经过图上某点时，提示当前位置的详细信息。\",\n        \" <strong>提示：</strong> 本项目数据可以参考这里： <a href='https://raw.githubusercontent.com/FreeCodeCamp/ProjectReferenceData/master/global-temperature.json' target='_blank'>https://raw.githubusercontent.com/FreeCodeCamp/ProjectReferenceData/master/global-temperature.json</a> 。\",\n        \"当你遇到问题时，可以到这里求助： <a href='//github.com/FreeCodeCamp/freecodecamp/wiki/How-to-get-help-when-you-get-stuck' target='_blank'>Read-Search-Ask</a> 。\",\n        \"项目完成后，点击 \\\"我已经完成了这个挑战\\\" 并在弹出窗口中填入你在 CodePen 的项目链接。\",\n        \"最后，你可以在 <a href='//gitter.im/freecodecamp/chinese' target='_blank'>Code Review Chatroom</a> 中分享你的代码，获取反馈。也可以把它分享在微博或其他社交媒体上。\"\n      ],\n      \"challengeSeed\": [\n        \"150324701\"\n      ],\n      \"tests\": [],\n      \"isRequired\": true,\n      \"releasedOn\": \"January 1, 2016\",\n      \"type\": \"zipline\",\n      \"challengeType\": 3\n    },\n    {\n      \"id\": \"bd7198d8c242eddfaeb5bd13\",\n      \"title\": \"Show Relationships with a Force Directed Graph\",\n      \"description\": [\n        \" <strong>目标：</strong> 在 <a href='http://codepen.io' target='_blank'>CodePen.io</a> 上创建一个功能与这个示例： <a href='http://codepen.io/FreeCodeCamp/full/KVNNXY' target='_blank'>http://codepen.io/FreeCodeCamp/full/KVNNXY</a> 类似的应用（这个旧链接好像坏掉了，在 Github 的 issue 中提到这个链接可以参考 http://codepen.io/KMT/pen/dMqgrO ）。\",\n        \" <strong>规则 #1：</strong> 代码是开源的，你可以借鉴，但请不要抄袭。\",\n        \" <strong>规则 #2：</strong> 完成以下 <a href='http://en.wikipedia.org/wiki/User_story' target='_blank'>用户故事（即用户需求）</a>。可以根据需要引用其它第三方的库或接口。以你自己的风格习惯完成这个项目。\",\n        \" <strong>规则 #3：</strong> 该项目必须使用 D3.js 库。\",\n        \" <strong>用户需求：</strong> 用力导向图（ Force-directed Graph）显示每个 camper 在 Camper News 上所发表链接的域名。\",\n        \" <strong>用户需求：</strong> 在每个节点上显示 camper 的头像。\",\n        \" <strong>用户需求：</strong> 显示每个 camper 之间以及他们所发表链接的域名之间的联系。\",\n        \" <strong>用户需求：</strong> 每个 camper 的头像大小表示他所发表的指定域名下链接的次数。\",\n        \" <strong>用户需求：</strong> 每个域名的节点大小表示该域名下链接被引用的次数。\",\n        \" <strong>提示：</strong> <code>http://www.freecodecamp.com/news/hot</code> 。\",\n        \"当你遇到问题时，可以到这里求助： <a href='//github.com/FreeCodeCamp/freecodecamp/wiki/How-to-get-help-when-you-get-stuck' target='_blank'>Read-Search-Ask</a> 。\",\n        \"项目完成后，点击 \\\"我已经完成了这个挑战\\\" 并在弹出窗口中填入你在 CodePen 的项目链接。\",\n        \"最后，你可以在 <a href='//gitter.im/freecodecamp/chinese' target='_blank'>Code Review Chatroom</a> 中分享你的代码，获取反馈。也可以把它分享在微博或其他社交媒体上。\"\n      ],\n      \"challengeSeed\": [\n        \"150324458\"\n      ],\n      \"tests\": [],\n      \"isRequired\": true,\n      \"releasedOn\": \"January 1, 2016\",\n      \"type\": \"zipline\",\n      \"challengeType\": 3\n    },\n    {\n      \"id\": \"bd7108d8c242eddfaeb5bd13\",\n      \"title\": \"Map Data Across the Globe\",\n      \"description\": [\n        \" <strong>目标：</strong> 在 <a href='http://codepen.io' target='_blank'>CodePen.io</a> 上创建一个功能与这个示例： <a href='http://codepen.io/FreeCodeCamp/full/mVEJag' target='_blank'>http://codepen.io/FreeCodeCamp/full/mVEJag</a> 类似的应用。\",\n        \" <strong>规则 #1：</strong> 代码是开源的，你可以借鉴，但请不要抄袭。\",\n        \" <strong>规则 #2：</strong> 完成以下 <a href='http://en.wikipedia.org/wiki/User_story' target='_blank'>用户故事（即用户需求）</a>。可以根据需要引用其它第三方的库或接口。以你自己的风格习惯完成这个项目。\",\n        \" <strong>规则 #3：</strong> 该项目必须使用 D3.js 库。\",\n        \" <strong>用户需求：</strong> 在一个世界地图上显示陨石坠落地。\",\n        \" <strong>用户需求：</strong> 在图中显示陨石的相对大小。\",\n        \" <strong>用户需求：</strong> 移动鼠标经过图上某点时，提示当前位置的详细信息。\",\n        \" <strong>提示：</strong> 本项目数据可以参考这里：<a href='https://raw.githubusercontent.com/FreeCodeCamp/ProjectReferenceData/master/meteorite-strike-data.json' target='_blank'>https://raw.githubusercontent.com/FreeCodeCamp/ProjectReferenceData/master/meteorite-strike-data.json</a>\",\n        \"当你遇到问题时，可以到这里求助： <a href='//github.com/FreeCodeCamp/freecodecamp/wiki/How-to-get-help-when-you-get-stuck' target='_blank'>Read-Search-Ask</a> 。\",\n        \"项目完成后，点击 \\\"我已经完成了这个挑战\\\" 并在弹出窗口中填入你在 CodePen 的项目链接。\",\n        \"最后，你可以在 <a href='//gitter.im/freecodecamp/chinese' target='_blank'>Code Review Chatroom</a> 中分享你的代码，获取反馈。也可以把它分享在微博或其他社交媒体上。\"\n      ],\n      \"challengeSeed\": [\n        \"150324698\"\n      ],\n      \"tests\": [],\n      \"isRequired\": true,\n      \"releasedOn\": \"January 1, 2016\",\n      \"type\": \"zipline\",\n      \"challengeType\": 3\n    }\n  ]\n}\n"
  },
  {
    "path": "seed/challenges/02-data-visualization-certification/react-projects.json",
    "content": "{\n  \"name\": \"React Projects\",\n  \"order\": 15,\n  \"time\": \"200 hours\",\n  \"helpRoom\": \"chinese\",\n  \"challenges\": [\n    {\n      \"id\": \"bd7157d8c242eddfaeb5bd13\",\n      \"title\": \"Build a Markdown Previewer\",\n      \"description\": [\n        \" <strong>目标：</strong> 在 <a href='http://codepen.io' target='_blank'>CodePen.io</a> 上创建一个这样的应用，它的功能类似于这个 <a href='http://codepen.io/FreeCodeCamp/full/obYYqW' target='_blank'>http://codepen.io/FreeCodeCamp/full/obYYqW</a>。\",\n        \" <strong>规则 #1：</strong> 代码是开源的，你可以借鉴，但请不要抄袭。\",\n        \" <strong>规则 #2：</strong> 按照这个 <a href='http://en.wikipedia.org/wiki/User_story' target='_blank'>用户故事（即用户需求）</a>来进行开发。你可以使用任何你需要的库或框架。写出你自己的风格。\",\n        \" <strong>规则 #3：</strong> 你所使用的技术里，必须包含Sass和React。\",\n        \" <strong>用户需求：</strong> 我可以在文本域内写“Github风格”的Markdown文档。\",\n        \" <strong>用户需求：</strong> 我可以实时预览解析后的Markdown文档。\",\n        \" <strong>线索：</strong> 你不必自己实现Markdown的解析引擎，你可以引入这个<a href='https://cdnjs.com/libraries/marked' target='_blank'>https://cdnjs.com/libraries/marked</a>Markdown解析库来帮助你解析文档。\",\n        \" <strong>注意：</strong> 如果你想使用React的JSX语法，你需要使用 <code>Babel</code> 作为预处理器。\",\n        \"当你卡住的时候，记得来这里 <a href='//github.com/FreeCodeCamp/freecodecamp/wiki/How-to-get-help-when-you-get-stuck' target='_blank'>Read-Search-Ask</a> 获取可能的帮助。\",\n        \"当你完成后，点击 \\\"我已经完成了这个挑战\\\" 并且附加一个你的 CodePen 链接。 \",\n        \"你可以在 <a href='//gitter.im/freecodecamp/chinese' target='_blank'>代码检查群</a> 中分享你的代码，从而获得反馈。你也可以把它分享在微博或其他社交媒体上。\"\n      ],\n      \"releasedOn\": \"January 1, 2016\",\n      \"challengeSeed\": [\n        \"150324697\"\n      ],\n      \"tests\": [],\n      \"type\": \"zipline\",\n      \"isRequired\": true,\n      \"challengeType\": 3\n    },\n    {\n      \"id\": \"bd7156d8c242eddfaeb5bd13\",\n      \"title\": \"Build a Camper Leaderboard\",\n      \"description\": [\n        \" <strong>目标：</strong> 创建一个功能与此相似的 <a href='http://codepen.io' target='_blank'>CodePen.io</a> 应用：<a href='http://codepen.io/FreeCodeCamp/full/qbqqJm/' target='_blank'>http://codepen.io/FreeCodeCamp/full/qbqqJm/</a>.\",\n        \" <strong>规则 #1：</strong> 代码是开源的，你可以借鉴，但请不要抄袭。\",\n        \" <strong>规则 #2：</strong> 按照这个 <a href='http://en.wikipedia.org/wiki/User_story' target='_blank'>用户故事（即用户需求）</a>来进行开发。你可以使用任何你需要的库或框架。写出你自己的风格。\",\n        \" <strong>规则 #3：</strong> 你所使用的技术里，必须包含Sass和React。\",\n        \" <strong>用户需求：</strong> 我能在表格中看到在过去30天内，Free Code Camp 中谁完成的任务最多。\",\n        \" <strong>用户需求：</strong> 我能看到他们在过去30内，完成了那些任务，并且知道他们总共完成了哪些任务。\",\n        \" <strong>用户需求：</strong> 我能够分别对“过去30天完成的任务量”和“总共完成的任务量”两列表格进行排序。\",\n        \" <strong>线索：</strong> 从这个API中获取最近30内的前100名学员： <a href='http://fcctop100.herokuapp.com/api/fccusers/top/recent' target='_blank'>http://fcctop100.herokuapp.com/api/fccusers/top/recent</a>.\",\n        \" <strong>线索：</strong> 从这个API中获取全部时间段的前100名学员： <a href='http://fcctop100.herokuapp.com/api/fccusers/top/alltime' target='_blank'>http://fcctop100.herokuapp.com/api/fccusers/top/alltime</a>.\",\n        \"当你卡住的时候，记得来这里 <a href='//github.com/FreeCodeCamp/freecodecamp/wiki/How-to-get-help-when-you-get-stuck' target='_blank'>Read-Search-Ask</a> 获取可能的帮助。\",\n        \"当你完成后，点击 \\\"我已经完成了这个挑战\\\" 并且附加一个你的 CodePen 链接。 \",\n        \"你可以在 <a href='//gitter.im/freecodecamp/chinese' target='_blank'>代码检查群</a> 中分享你的代码，从而获得反馈。你也可以把它分享在微博或其他社交媒体上。\"\n      ],\n      \"releasedOn\": \"January 1, 2016\",\n      \"challengeSeed\": [\n        \"150324694\"\n      ],\n      \"tests\": [],\n      \"type\": \"zipline\",\n      \"isRequired\": true,\n      \"challengeType\": 3\n    },\n    {\n      \"id\": \"bd7155d8c242eddfaeb5bd13\",\n      \"title\": \"Build a Recipe Box\",\n      \"description\": [\n        \" <strong>目标：</strong> Build a <a href='http://codepen.io' target='_blank'>CodePen.io</a> app that is functionally similar to this: <a href='http://codepen.io/FreeCodeCamp/full/LGbbqj' target='_blank'>http://codepen.io/FreeCodeCamp/full/LGbbqj</a>.\",\n        \" <strong>规则 #1：</strong> 代码是开源的，你可以借鉴，但请不要抄袭。\",\n        \" <strong>规则 #2：</strong> 按照这个 <a href='http://en.wikipedia.org/wiki/User_story' target='_blank'>用户故事（即用户需求）</a>来进行开发。你可以使用任何你需要的库或框架。写出你自己的风格。\",\n        \" <strong>规则 #3：</strong> 你所使用的技术里，必须包含Sass和React。\",\n        \" <strong>用户需求：</strong> 当我填入名字和食材，我就能够创建一个食谱。\",\n        \" <strong>用户需求：</strong> 我能看见我需要的食谱的列表。\",\n        \" <strong>用户需求：</strong> 我能点进去查看食谱。\",\n        \" <strong>用户需求：</strong> 我能编辑食谱。\",\n        \" <strong>用户需求：</strong> 我能删除食谱。\",\n        \" <strong>用户需求：</strong> 所有的食谱，都应该存储在本地。当我刷新页面时，我添加的食谱不会丢失。\",\n        \" <strong>线索：</strong> 你应该为你CodePe上的本地存储的键加上前缀，如： <code>_username_recipes</code>\",\n        \"当你卡住的时候，记得来这里 <a href='//github.com/FreeCodeCamp/freecodecamp/wiki/How-to-get-help-when-you-get-stuck' target='_blank'>Read-Search-Ask</a> 获取可能的帮助。\",\n        \"当你完成后，点击 \\\"我已经完成了这个挑战\\\" 并且附加一个你的 CodePen 链接。 \",\n        \"你可以在 <a href='//gitter.im/freecodecamp/chinese' target='_blank'>代码检查群</a> 中分享你的代码，从而获得反馈。你也可以把它分享在微博或其他社交媒体上。\"\n      ],\n      \"releasedOn\": \"January 1, 2016\",\n      \"challengeSeed\": [\n        \"150324695\"\n      ],\n      \"tests\": [],\n      \"type\": \"zipline\",\n      \"isRequired\": true,\n      \"challengeType\": 3\n    },\n    {\n      \"id\": \"bd7154d8c242eddfaeb5bd13\",\n      \"title\": \"Build the Game of Life\",\n      \"description\": [\n        \" <strong>目标：</strong> Build a <a href='http://codepen.io' target='_blank'>CodePen.io</a> app that is functionally similar to this: <a href='http://codepen.io/FreeCodeCamp/full/dGOOrZ' target='_blank'>http://codepen.io/FreeCodeCamp/full/dGOOrZ</a>.\",\n        \" <strong>规则 #1：</strong> 代码是开源的，你可以借鉴，但请不要抄袭。\",\n        \" <strong>规则 #2：</strong> 按照这个 <a href='http://en.wikipedia.org/wiki/User_story' target='_blank'>用户故事（即用户需求）</a>来进行开发。你可以使用任何你需要的库或框架。写出你自己的风格。\",\n        \" <strong>规则 #3：</strong> 你所使用的技术里，必须包含Sass和React。\",\n        \" <strong>用户需求：</strong> 当我第一次进入游戏时，它能随机生成一个棋盘，然后我能开始游戏。\",\n        \" <strong>用户需求：</strong> 我能够开始和结束游戏。\",\n        \" <strong>用户需求：</strong> 我能设置棋盘。\",\n        \" <strong>用户需求：</strong> 我也可以清空棋盘。\",\n        \" <strong>用户需求：</strong> 当我点击开始时，游戏将开始。\",\n        \" <strong>用户需求：</strong> 每次棋盘更改时，我能看到经过了多少世代。\",\n        \" <strong>线索：</strong> 这是 John Conway 自己对 Conway's Game of Life 游戏（这个游戏）的解释： <a href='https://www.youtube.com/watch?v=E8kUJL04ELA' target='_blank'>https://www.youtube.com/watch?v=E8kUJL04ELA</a>\",\n        \" <strong>线索：</strong> 这是 Conway's Game of Life （这个游戏）的规则，供你参考： <a href='https://en.wikipedia.org/wiki/Conway%27s_Game_of_Life' target='_blank'>https://en.wikipedia.org/wiki/Conway%27s_Game_of_Life</a>\",\n        \"当你卡住的时候，记得来这里 <a href='//github.com/FreeCodeCamp/freecodecamp/wiki/How-to-get-help-when-you-get-stuck' target='_blank'>Read-Search-Ask</a> 获取可能的帮助。\",\n        \"当你完成后，点击 \\\"我已经完成了这个挑战\\\" 并且附加一个你的 CodePen 链接。 \",\n        \"你可以在 <a href='//gitter.im/freecodecamp/chinese' target='_blank'>代码检查群</a> 中分享你的代码，从而获得反馈。你也可以把它分享在微博或其他社交媒体上。\"\n      ],\n      \"releasedOn\": \"January 1, 2016\",\n      \"challengeSeed\": [\n        \"150324459\"\n      ],\n      \"tests\": [],\n      \"type\": \"zipline\",\n      \"isRequired\": true,\n      \"challengeType\": 3\n    },\n    {\n      \"id\": \"bd7153d8c242eddfaeb5bd13\",\n      \"title\": \"Build a Roguelike Dungeon Crawler Game\",\n      \"description\": [\n        \" <strong>目标：</strong> Build a <a href='http://codepen.io' target='_blank'>CodePen.io</a> app that is functionally similar to this: <a href='http://codepen.io/FreeCodeCamp/full/dGOOEJ/' target='_blank'>http://codepen.io/FreeCodeCamp/full/dGOOEJ/</a>.\",\n        \" <strong>规则 #1：</strong> 代码是开源的，你可以借鉴，但请不要抄袭。\",\n        \" <strong>规则 #2：</strong> 按照这个 <a href='http://en.wikipedia.org/wiki/User_story' target='_blank'>用户故事（即用户需求）</a>来进行开发。你可以使用任何你需要的库或框架。写出你自己的风格。\",\n        \" <strong>规则 #3：</strong> 你所使用的技术里，必须包含Sass和React。\",\n        \" <strong>用户需求：</strong> 我有生命值、等级、一个武器。我能捡到其他更好的武器。我能捡到补血药。\",\n        \" <strong>用户需求：</strong> 所有的（可拾起的）物品和敌人都是在地图上随机分布的。\",\n        \" <strong>用户需求：</strong> 我能游览整个地图，寻找物品。\",\n        \" <strong>用户需求：</strong> 我能在地图范围内随便走，但是遇到敌人时，我只能打败敌人后才能继续往前走。\",\n        \" <strong>用户需求：</strong> 地图的绝大部分被战争迷雾覆盖，当我往前走，地图才会显示一部分。\",\n        \" <strong>用户需求：</strong> 打败敌人能获得经验值，而积攒经验值能够让我升级。\",\n        \" <strong>用户需求：</strong> 交战时，大家轮流攻击对方，直到我们中的一个死掉。我的攻击力取决于我的等级和武器。敌人的攻击力以其等级为基准在一定范围内随机。\",\n        \" <strong>用户需求：</strong> 当我打败了大boss，我就胜利了。\",\n        \" <strong>用户需求：</strong> 游戏比赛应该是具有挑战性的，但理论上应该是稳赢的。\",\n        \"当你卡住的时候，记得来这里 <a href='//github.com/FreeCodeCamp/freecodecamp/wiki/How-to-get-help-when-you-get-stuck' target='_blank'>Read-Search-Ask</a> 获取可能的帮助。\",\n        \"当你完成后，点击 \\\"我已经完成了这个挑战\\\" 并且附加一个你的 CodePen 链接。 \",\n        \"你可以在 <a href='//gitter.im/freecodecamp/chinese' target='_blank'>代码检查群</a> 中分享你的代码，从而获得反馈。你也可以把它分享在微博或其他社交媒体上。\"\n      ],\n      \"releasedOn\": \"January 1, 2016\",\n      \"challengeSeed\": [\n        \"150324693\"\n      ],\n      \"tests\": [],\n      \"type\": \"zipline\",\n      \"isRequired\": true,\n      \"challengeType\": 3\n    }\n  ]\n}\n"
  },
  {
    "path": "seed/challenges/02-data-visualization-certification/react.json",
    "content": "{\n  \"name\": \"React\",\n  \"order\": 14,\n  \"isComingSoon\": true,\n  \"time\": \"5 hours\",\n  \"helpRoom\": \"chinese\",\n  \"challenges\": [\n    {\n      \"id\": \"bd7158d8c423ede3aeb5bdee\",\n      \"title\": \"Learn React Challenges\",\n      \"description\": [],\n      \"challengeSeed\": [],\n      \"tests\": [],\n      \"type\": \"waypoint\",\n      \"challengeType\": 3\n    }\n  ]\n}"
  },
  {
    "path": "seed/challenges/02-data-visualization-certification/sass.json",
    "content": "{\n  \"name\": \"Sass\",\n  \"order\": 13,\n  \"isComingSoon\": true,\n  \"time\": \"5 hours\",\n  \"helpRoom\": \"chinese\",\n  \"challenges\": [\n    {\n      \"id\": \"bd7158d8c423ede2aeb5bdee\",\n      \"title\": \"Learn Sass Challenges\",\n      \"description\": [],\n      \"challengeSeed\": [],\n      \"tests\": [],\n      \"type\": \"waypoint\",\n      \"challengeType\": 3\n    }\n  ]\n}"
  },
  {
    "path": "seed/challenges/03-back-end-development-certification/api-projects.json",
    "content": "{\n  \"name\": \"API Projects\",\n  \"order\": 26,\n  \"time\": \"150 hours\",\n  \"helpRoom\": \"chinese\",\n  \"challenges\": [\n    {\n      \"id\": \"bd7158d8c443eddfaeb5bcef\",\n      \"title\": \"Get Set for our Back End Development Projects\",\n      \"description\": [\n        [\n          \"//i.imgur.com/4IZjWZ3.gif\",\n          \"A gif showing how to create a c9.io account.\",\n          \"为了方便你完成接下来的挑战项目，这里推荐一个基于浏览器的在线开发环境 c9.io 。使用在线开发环境，你就不必在自己电脑上安装 Node.js 和 MongoDB 了，这样可以为你节省大把的时间来做练习。<br>打开 c9.io 主页后，点击右上角的 Github 图标，通过关联你的 Github 帐号来创建一个 c9.io 帐号。注意，最后一步需要填写你的邮箱地址。（整个过程可以参考上边的演示录像）。\",\n          \"http://c9.io\"\n        ],\n        [\n          \"//i.imgur.com/F7i5Hhi.gif\",\n          \"A gif showing how to fill out the new workspace form\",\n          \"你没有必要自己造轮子去完成接下来的挑战，这里推荐使用集成了 MongoDB，Express 和 Node.js 的轻量级 JavaScript 全栈框架 Clementine.js 。如果有兴趣，请参考 Clementine.js 的完整教程一步一步构建自己的应用开发环境，这里我们只需要克隆它的源码到 c9.io 的开发环境就好了。<br>登录 c9.io 后，你需要创建一个新的 Workspace，模板选择 blank 即可，克隆地址填： <code>https://github.com/johnstonbl01/clementinejs-fcc.git</code> ， 最后点击屏幕下方的 \\\"Create workspace\\\" 按钮，完成创建开发环境。（整个过程可以参考上边的演示录像）。\",\n          \"\"\n        ],\n        [\n          \"//i.imgur.com/42m1vyr.gif\",\n          \"A gif showing you how to show hidden files.\",\n          \"创建完毕后自动进入新建的 Workspace ，点击左侧导航栏右上角的齿轮图标，选择显示隐藏文件（\\\"show hidden files\\\"）。（整个过程可以参考上边的演示录像）。\",\n          \"\"\n        ],\n        [\n          \"//i.imgur.com/qrE8xaK.gif\",\n          \"A gif showing you how to create a new file.\",\n          \"然后，在左侧导航栏的空白处点击鼠标右键，新建一个文件 <code>.env</code>。（整个过程可以参考上边的演示录像）。\",\n          \"\"\n        ],\n        [\n          \"//i.imgur.com/jkQX9SQ.gif\",\n          \"A gif showing you how to prep your environmental variables in your .env file.\",\n          \"打开刚刚新建的 .env 文件，把下边的代码粘帖进去，并保存：<br><code>GITHUB_KEY=<br>GITHUB_SECRET=<br>MONGO_URI=mongodb://localhost:27017/clementinejs<br>PORT=8080<br>APP_URL=http://localhost:8080/</code> 。（整个过程可以参考上边的演示录像）。\",\n          \"\"\n        ],\n        [\n          \"//i.imgur.com/f3DE7zB.gif\",\n          \"A gif showing you how to open c9.io's preview window.\",\n          \"点击标题栏上菜单 windows ， 在下拉菜单中选择 share， 之后在弹出的窗口中点击 Application 右边的链接， 在弹出选项中选择 open 。此时会打开一个新的页面，注意这个页面就是你在 c9.io 中新建的 App 的主页，复制这个 App 的主页地址，下一步骤会用到。（整个过程可以参考上边的演示录像）。\",\n          \"\"\n        ],\n        [\n          \"//i.imgur.com/Ip0qUdQ.gif\",\n          \"A gif showing you how to create a GitHub app using c9.io's preview URL.\",\n          \"登录 Github ，进入你的 Profile 页面，在左侧列表中选择 OAuth applications ，之后在右边选择 Developer application 来创建一个鉴权 App 。 Application name 可以自己取， Homepage URL 填入上一步创建的 App 的主页地址。 Authorization callback URL 也填入相同的地址，并在后边加上相对路径：<code>auth/github/callback</code>。最后点击最下边的注册应用（Register Application）。（整个过程可以参考上边的演示录像）。\",\n          \"https://github.com/settings/applications/new\"\n        ],\n        [\n          \"//i.imgur.com/qCUVRFb.gif\",\n          \"A gif showing you how to transfer GitHub's key and secret over to your .env file, as well as your c9.io URL.\",\n          \"在 Github 上的鉴权 App 已经创建完成，此时会显示 Client ID 和 Client Secret 。把 Client ID 和 Client Secret 分别赋给 .env 文件中的 GITHUB_KEY 和 GITHUB_SECRET。并把上文提到的 APP 地址赋给 APP_URL 。（整个过程可以参考上边的演示录像）。\",\n          \"\"\n        ],\n        [\n          \"//i.imgur.com/2a20Vah.gif\",\n          \"A gif showing you how to start mongoDB in c9.io's terminal.\",\n          \"在 c9.io 的命令行终端中输入以下命令以启动 mongoDB：<code>mongod --smallfiles</code>。\",\n          \"\"\n        ],\n        [\n          \"//i.imgur.com/dC55pWk.gif\",\n          \"A gif showing you how to open a new tab in c9.io's terminal.\",\n          \"新建一个命令行窗口，输入以下命令安装依赖包： <code>npm install</code> 。\",\n          \"\"\n        ],\n        [\n          \"//i.imgur.com/54OC2Ro.gif\",\n          \"A gif showing you how to navigate to your preview tab and sign in to your new Clementine.js app.\",\n          \"依赖包安装完毕，在命令行窗口中启动应用：<code>node server.js</code>　。回到前面打开的 App 主页并刷新，你应该可以看到　Clementine.js 的 logo，点击 \\\"sign in\\\" 并确认 Github 的鉴权请求。\",\n          \"\"\n        ],\n        [\n          \"//i.imgur.com/2IJfyvN.gif\",\n          \"A gif showing you how to click the button to trigger an AJAX action with Clementine.js and how to look at your user profile from the GitHub authentication data.\",\n          \"点击按钮 \\\"click me\\\" ，你应该可以看到点击数在增加。点击上边的 Profile 链接，可以看到从 Github 同步过来的个人信息。\",\n          \"\"\n        ],\n        [\n          \"//i.imgur.com/bjO5pnq.gif\",\n          \"A gif showing you how to create a new GitHub repository and push your code up to it.\",\n          \"在 Github 上创建一个新的仓库，然后拷贝仓库的 .git 地址。 <br>在 c9.io 的命令行窗口中，用刚刚新建的 Github 仓库地址设置 Remote URL : <code>git remote set-url origin</code> 。<br>然后，就可以把代码推到 Github 上去了： <code>git push origin master</code>。<br>完成后，在 Github 上就可以看到刚才推上去的代码了。（整个过程可以参考上边的演示录像）。\",\n          \"https://github.com/new\"\n        ],\n        [\n          \"//i.imgur.com/Qn0K65B.gif\",\n          \"A gif showing you how to add add-ons to Heroku.\",\n          \"现在，你已经掌握如何在 c9.io 上开发部署 App 。后续我们将会进一步介绍在 Heroku 上部署 Clementine 的步骤（后续几个挑战都需要把完成的 App 部署到 Heroku 上，所以，请根据 Heroku 的文档自己练习一下如何部署 App 到 Heroku ）。\",\n          \"\"\n        ]\n      ],\n      \"challengeSeed\": [],\n      \"tests\": [],\n      \"type\": \"Waypoint\",\n      \"challengeType\": 7,\n      \"isRequired\": false\n    },\n    {\n      \"id\": \"bd7158d8c443edefaeb5bdef\",\n      \"title\": \"Timestamp Microservice\",\n      \"description\": [\n        \"<strong>目标：</strong> 参考这个例子： <a href='https://timestamp-ms.herokuapp.com/' target='_blank'>https://timestamp-ms.herokuapp.com/</a> ，完成一个全栈式 JavaScript 应用，并把它部署在 Heroku 上。\",\n        \"对于每个项目，你都需要建立一个独立的 Github 仓库，和一个 Heroku 项目。如果你不记得如何做，请回头参考这个说明： <a href='/challenges/get-set-for-our-back-end-development-projects'>https://freecodecamp.cn/challenges/get-set-for-our-back-end-development-projects</a>。\",\n        \"这个项目中需要完成的需求：\",\n        \"<strong>用户故事：</strong> 把一个字符串作为参数，判断该字符串是不是一个 Unix 时间，或者一个公历日期（例如：January 1, 2016）。\",\n        \"<strong>用户故事：</strong> 如果是，那么它同时返回 Unix 时间戳和公历日期。\",\n        \"<strong>用户故事：</strong> 如果不是，那么它返回 null 。\",\n        \"当你完成所有用户需求后，点击按钮 \\\"我已经完成了这个挑战\\\"，在弹出窗口中，填入你的 Github 仓库地址和部署在 Heroku 上的应用的地址。\",\n        \"你可以把你的项目共享到我们的代码检视聊天室<a href='//gitter.im/freecodecamp/chinese' target='_blank'>Code Review Chatroom</a>以获取别人的意见和反馈，也可以通过微信或其他媒体帐号进行共享。\"\n      ],\n      \"challengeSeed\": [\n        \"150324691\"\n      ],\n      \"tests\": [],\n      \"isRequired\": true,\n      \"releasedOn\": \"January 1, 2016\",\n      \"type\": \"basejump\",\n      \"challengeType\": 4\n    },\n    {\n      \"id\": \"bd7158d8c443edefaeb5bdff\",\n      \"title\": \"Request Header Parser Microservice\",\n      \"description\": [\n        \"<strong>目标：</strong> 参考这个例子：<a href='https://cryptic-ridge-9197.herokuapp.com/api/whoami/' target='_blank'>https://cryptic-ridge-9197.herokuapp.com/api/whoami/</a>，完成一个全栈式 JavaScript 应用，并把它部署到 Heroku 上。\",\n        \"对于每个项目，你都需要建立一个独立的 Github 仓库，和一个 Heroku 项目。如果你不记得如何做，请回头参考这个说明： <a href='/challenges/get-set-for-our-back-end-development-projects'>http://freecodecamp.cn/challenges/get-set-for-our-back-end-development-projects</a>。\",\n        \"这个项目中需要完成的需求：\",\n        \"<strong>用户故事：</strong> 用户在浏览器输入该地址后，返回用户的 IP 地址，语言，操作系统等信息。\",\n        \"当你完成所有用户需求后，点击按钮 \\\"我已经完成了这个挑战\\\"，在弹出窗口中，填入你的 Github 仓库地址和部署在 Heroku 上的应用的地址。\",\n        \"你可以把你的项目共享到我们的代码检视聊天室<a href='//gitter.im/freecodecamp/chinese' target='_blank'>Code Review Chatroom</a>以获取别人的意见和反馈，也可以通过微信或其他媒体帐号进行共享。\"\n      ],\n      \"challengeSeed\": [\n        \"150324460\"\n      ],\n      \"tests\": [],\n      \"isRequired\": true,\n      \"releasedOn\": \"January 1, 2016\",\n      \"type\": \"basejump\",\n      \"challengeType\": 4\n    },\n    {\n      \"id\": \"bd7158d8c443edefaeb5bd0e\",\n      \"title\": \"URL Shortener Microservice\",\n      \"description\": [\n        \"<strong>目标：</strong> 参考这个例子：<a href='https://shurli.herokuapp.com/' target='_blank'>https://shurli.herokuapp.com/</a>，完成一个全栈式 JavaScript 应用，并把它部署到 Heroku 上。\",\n        \"对于每个项目，你都需要建立一个独立的 Github 仓库，和一个 Heroku 项目。如果你不记得如何做，请回头参考这个说明： <a href='/challenges/get-set-for-our-back-end-development-projects'>http://freecodecamp.cn/challenges/get-set-for-our-back-end-development-projects</a>。\",\n        \"这个项目中需要完成的需求：\",\n        \"<strong>用户故事：</strong> 用户在浏览器输入该地址时，把一个合法的 URL 作为参数，返回一个 JSON 格式的段地址。\",\n        \"<strong>用户故事：</strong> 如果用户输入的是一个无效的 URL 地址（不符合 http://www.example.com 格式）作为参数，则返回错误。\",\n        \"<strong>用户故事：</strong> 如果用户输入前边生成的短地址，则会重定向到相应的合法地址。\",\n        \"当你完成所有用户需求后，点击按钮 \\\"我已经完成了这个挑战\\\"，在弹出窗口中，填入你的 Github 仓库地址和部署在 Heroku 上的应用的地址。\",\n        \"你可以把你的项目共享到我们的代码检视聊天室<a href='//gitter.im/freecodecamp/chinese' target='_blank'>Code Review Chatroom</a>以获取别人的意见和反馈，也可以通过微信或其他媒体帐号进行共享。\"\n      ],\n      \"challengeSeed\": [\n        \"150324692\"\n      ],\n      \"tests\": [],\n      \"isRequired\": true,\n      \"releasedOn\": \"January 1, 2016\",\n      \"type\": \"basejump\",\n      \"challengeType\": 4\n    },\n    {\n      \"id\": \"bd7158d8c443edefaeb5bdee\",\n      \"title\": \"Image Search Abstraction Layer\",\n      \"description\": [\n        \"<strong>目标：</strong> 参考这个图片查询的例子： <a href='https://cryptic-ridge-9197.herokuapp.com/api/imagesearch/lolcats%20funny?offset=10' target='_blank'>https://cryptic-ridge-9197.herokuapp.com/api/imagesearch/lolcats%20funny?offset=10</a>， 以及这个显示最近几次查询情况的例子：<a href='https://cryptic-ridge-9197.herokuapp.com/api/latest/imagesearch/' target='_blank'>https://cryptic-ridge-9197.herokuapp.com/api/latest/imagesearch/</a>，完成一个全栈式 JavaScript 应用，并把它部署到 Heroku 上。\",\n        \"对于每个项目，你都需要建立一个独立的 Github 仓库，和一个 Heroku 项目。如果你不记得如何做，请回头参考这个说明： <a href='/challenges/get-set-for-our-back-end-development-projects'>http://freecodecamp.cn/challenges/get-set-for-our-back-end-development-projects</a>。\",\n        \"这个项目中需要完成的需求：\",\n        \"<strong>用户故事：</strong> 根据指定的字符串描述，获取一组符合描述的图片地址和文字描述以及页面地址。\",\n        \"<strong>用户故事：</strong> 可以在地址中增加一个参数 ?offset=2 来对返回结果进行分页。\",\n        \"<strong>用户故事：</strong> 可以获取一个列表，显示最近几次搜索的搜索语句和返回页面地址。\",\n        \"当你完成所有用户需求后，点击按钮 \\\"我已经完成了这个挑战\\\"，在弹出窗口中，填入你的 Github 仓库地址和部署在 Heroku 上的应用的地址。\",\n        \"你可以把你的项目共享到我们的代码检视聊天室<a href='//gitter.im/freecodecamp/chinese' target='_blank'>Code Review Chatroom</a>以获取别人的意见和反馈，也可以通过微信或其他媒体帐号进行共享。\"\n      ],\n      \"challengeSeed\": [\n        \"150324461\"\n      ],\n      \"tests\": [],\n      \"isRequired\": true,\n      \"releasedOn\": \"January 1, 2016\",\n      \"type\": \"basejump\",\n      \"challengeType\": 4\n    },\n    {\n      \"id\": \"bd7158d8c443edefaeb5bd0f\",\n      \"title\": \"File Metadata Microservice\",\n      \"description\": [\n        \"<strong>目标：</strong> 参考这个例子：<a href='https://cryptic-ridge-9197.herokuapp.com/' target='_blank'>https://cryptic-ridge-9197.herokuapp.com/</a>，完成一个全栈式 JavaScript 应用，并把它部署到 Heroku 上。\",\n        \"对于每个项目，你都需要建立一个独立的 Github 仓库，和一个 Heroku 项目。如果你不记得如何做，请回头参考这个说明： <a href='/challenges/get-set-for-our-back-end-development-projects'>http://freecodecamp.cn/challenges/get-set-for-our-back-end-development-projects</a>。\",\n        \"这个项目中需要完成的需求：\",\n        \"<strong>用户故事：</strong> 我可以通过提交一个 FormData 对象来上传文件。\",\n        \"<strong>用户故事：</strong> 当我上传一个文件后，会收到一个 JSON 格式的响应，显示文件的大小。\",\n        \"<strong>提示：</strong> 你可能会用到这个模块： <a href='https://www.npmjs.com/package/multer' target='_blank'>https://www.npmjs.com/package/multer</a> 。\",\n        \"当你完成所有用户需求后，点击按钮 \\\"我已经完成了这个挑战\\\"，在弹出窗口中，填入你的 Github 仓库地址和部署在 Heroku 上的应用的地址。\",\n        \"你可以把你的项目共享到我们的代码检视聊天室<a href='//gitter.im/freecodecamp/chinese' target='_blank'>Code Review Chatroom</a>以获取别人的意见和反馈，也可以通过微信或其他媒体帐号进行共享。\"\n      ],\n      \"challengeSeed\": [\n        \"150324457\"\n      ],\n      \"tests\": [],\n      \"isRequired\": true,\n      \"releasedOn\": \"January 1, 2016\",\n      \"type\": \"basejump\",\n      \"challengeType\": 4\n    }\n  ]\n}\n"
  },
  {
    "path": "seed/challenges/03-back-end-development-certification/automated-testing-and-debugging.json",
    "content": "{\n  \"name\": \"Automated Testing and Debugging\",\n  \"order\": 20,\n  \"time\": \"15 minutes\",\n  \"helpRoom\": \"chinese\",\n  \"challenges\": [\n    {\n      \"id\": \"cf1111c1c16feddfaeb6bdef\",\n      \"title\": \"Use the JavaScript Console\",\n      \"description\": [\n        \"Chrome 和 Firefox 都有先进的 Javascript 控制台，像知名的 DevTools，可以方便的用来调试你的 Javascript。\",\n        \"要打开调试工具，你可以在 Chrome 的菜单中找到<code>开发者工具</code>，或者从 Firefox 的菜单中找到<code>Web控制台</code>。我们不推荐你使用其它浏览器，或者使用手机，而是尽量使用桌面版的 Firefox 或 Chrome。\",\n        \"接下来我们使用<code>console.log</code>方法在控制台中打印内容。\",\n        \"<code>console.log('Hello world!')</code>\"\n      ],\n      \"challengeSeed\": [\n        \"\",\n        \"\",\n        \"\"\n      ],\n      \"tests\": [\n        \"assert(editor.getValue().match(/console\\\\.log\\\\(/gi), 'message: 你应该使用 console.log 方法输出 \\\"Hello world!\\\" 到控制台');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 1\n    },\n    {\n      \"id\": \"cf1111c1c16feddfaeb7bdef\",\n      \"title\": \"Using typeof\",\n      \"description\": [\n        \"你可以使用<code>typeof</code>来检查一个变量的<code>数据结构</code>或类型。\",\n        \"需要注意的是，在 Javascript 中，数组也是一种特殊的对象。\",\n        \"Try using <code>typeof</code> on each of the following to see which types they have.\",\n        \"尝试使用<code>typeof</code>查看以下内容各是什么类型。\",\n        \"<code>console.log(typeof \\\"\\\");</code>\",\n        \"<code>console.log(typeof 0);</code>\",\n        \"<code>console.log(typeof []);</code>\",\n        \"<code>console.log(typeof {});</code>\"\n      ],\n      \"challengeSeed\": [\n        \"\",\n        \"\",\n        \"\"\n      ],\n      \"tests\": [\n        \"assert(code.match(/console\\\\.log\\\\(typeof[\\\\( ][\\\"'].*[\\\"']\\\\)?\\\\);/), 'message: 你应该使用<code>typeof</code>查看字符串的类型，并用<code>console.log</code>输出。');\",\n        \"assert(code.match(/console\\\\.log\\\\(typeof[\\\\( ]\\\\d+\\\\.?\\\\d*\\\\)?\\\\);/), 'message: 你应该使用<code>typeof</code>查看数字的类型，并用<code>console.log</code>输出。');\",\n        \"assert(code.match(/console\\\\.log\\\\(typeof[\\\\( ]\\\\[\\\\]\\\\)?\\\\);/), 'message: 你应该使用<code>typeof</code>查看数组的类型，并用<code>console.log</code>输出。');\",\n        \"assert(code.match(/console\\\\.log\\\\(typeof[\\\\( ]\\\\{\\\\}\\\\)?\\\\);/), 'message: 你应该使用<code>typeof</code>查看对象的类型，并用<code>console.log</code>输出。');\"\n      ],\n      \"type\": \"waypoint\",\n      \"challengeType\": 1\n    }\n  ]\n}"
  },
  {
    "path": "seed/challenges/03-back-end-development-certification/back-end-development-certificate.json",
    "content": "{\n  \"name\": \"Claim Your Back End Development Certificate\",\n  \"order\": 29,\n  \"time\": \"5 minutes\",\n  \"challenges\": [\n    {\n      \"id\": \"660add10cb82ac38a17513be\",\n      \"title\": \"Claim Your Back End Development Certificate\",\n      \"description\": [\n        [\n          \"//i.imgur.com/8v3t84p.jpg\",\n          \"An image of our Back End Development Certificate\",\n          \"这个挑战将授予你经过认证的后端开发者证书。在此之前，我们必须确认你已经完成了所有的后端开发项目。同时，你也要向我们做出学术诚信的承诺。点击下面的按钮开始。\",\n          \"\"\n        ],\n        [\n          \"//i.imgur.com/HArFfMN.jpg\",\n          \"The definition of plagiarism: Plagiarism (noun) - copying someone else’s work and presenting it as your own without crediting them\",\n          \"点击下面的按钮，你需要对你提交的所有的代码作出承诺 A) 是你自己亲自写的，或者 B) 来自开源库，比如jQuery，或者 C) 已经明确地申明了原始作者。你也需要允许我们审核你所有挑战的代码。如果发现任何剽窃的证据，我们将撤销你的证书。\",\n          \"#\"\n        ],\n        [\n          \"//i.imgur.com/2qn7tHp.jpg\",\n          \"An image of the text \\\"Back End Development Certificate requirements\\\"\",\n          \"让我们确认你已经完成了所有的后端开发项目。点击下方的按钮来验证。。\",\n          \"#\"\n        ],\n        [\n          \"//i.imgur.com/16SIhHO.jpg\",\n          \"An image of the word \\\"Congratulations\\\"\",\n          \"恭喜！我们已经将后端开发者证书添加到你的作品集。除非你选择隐藏你的答案，证书将保持公开可见并且有效。\",\n          \"\"\n        ]\n      ],\n      \"challengeSeed\": [\n        {\n          \"properties\": [\n            \"isHonest\",\n            \"isBackEndCert\"\n          ],\n          \"apis\": [\n            \"/certificate/honest\",\n            \"/certificate/verify/back-end\"\n          ],\n          \"stepIndex\": [\n            1,\n            2\n          ]\n        }\n      ],\n      \"tests\": [\n        {\n          \"id\": \"bd7158d8c443edefaeb5bdef\",\n          \"title\": \"Timestamp Microservice\"\n        },\n        {\n          \"id\": \"bd7158d8c443edefaeb5bdff\",\n          \"title\": \"Request Header Parser Microservice\"\n        },\n        {\n          \"id\": \"bd7158d8c443edefaeb5bd0e\",\n          \"title\": \"URL Shortener Microservice\"\n        },\n        {\n          \"id\": \"bd7158d8c443edefaeb5bdee\",\n          \"title\": \"Image Search Abstraction Layer\"\n        },\n        {\n          \"id\": \"bd7158d8c443edefaeb5bd0f\",\n          \"title\": \"File Metadata Microservice\"\n        },\n        {\n          \"id\": \"bd7158d8c443eddfaeb5bdef\",\n          \"title\": \"Build a Voting App\"\n        },\n        {\n          \"id\": \"bd7158d8c443eddfaeb5bdff\",\n          \"title\": \"Build a Nightlife Coordination App\"\n        },\n        {\n          \"id\": \"bd7158d8c443eddfaeb5bd0e\",\n          \"title\": \"Chart the Stock Market\"\n        },\n        {\n          \"id\": \"bd7158d8c443eddfaeb5bd0f\",\n          \"title\": \"Manage a Book Trading Club\"\n        },\n        {\n          \"id\": \"bd7158d8c443eddfaeb5bdee\",\n          \"title\": \"Build a Pinterest Clone\"\n        }\n      ],\n      \"type\": \"Waypoint\",\n      \"challengeType\": 7\n    }\n  ]\n}\n"
  },
  {
    "path": "seed/challenges/03-back-end-development-certification/dynamic-web-applications.json",
    "content": "{\n  \"name\": \"Dynamic Web Application Projects\",\n  \"order\": 27,\n  \"time\": \"250 hours\",\n  \"helpRoom\": \"chinese\",\n  \"challenges\": [\n    {\n      \"id\": \"bd7158d8c443eddfaeb5bdef\",\n      \"title\": \"Build a Voting App\",\n      \"description\": [\n        \"<strong>目标：</strong>创建一个完整的 Javascript 应用，功能上类似于 <a href='https://fcc-voting-arthow4n.herokuapp.com/' target='_blank'>https://fcc-voting-arthow4n.herokuapp.com/</a> 并部署到 Heroku。\",\n        \"你应该为每一个项目创建一个 GitHub 仓库以及 Heroku 项目。如果你不记得该如何操作，可以查看 <a href='/challenges/get-set-for-our-back-end-development-projects'>http://freecodecamp.cn/challenges/get-set-for-our-back-end-development-projects</a>.\",\n        \"下面是你应该在这个 Story 中实现的内容：\",\n        \"<strong>Story：</strong> 作为一个已授权的用户，我可以保持我的投票，并可以在稍后访问它们。\",\n        \"<strong>Story：</strong> 作为一个已授权的用户，我可以分享我的投票给好友。\",\n        \"<strong>Story：</strong> 作为一个已授权的用户，我可以看到我投票的汇总结果。\",\n        \"<strong>Story：</strong> 作为一个已授权的用户，我可以删除决定不想要的投票内容。\",\n        \"<strong>Story：</strong> 作为一个已授权的用户，我可以创建一个包含任意数量选项的投票。\",\n        \"<strong>Story：</strong> 无论是否授权，我都可以查看投票并参与任何人的投票。\",\n        \"<strong>Story：</strong> 无论是否授权，我都可以在图表中查看投票结果。（可以通过使用 Chart.js 或 Google Charts 实现）\",\n        \"<strong>Story：</strong> 作为一个已授权的用户，如果我不喜欢投票中的选项，我可以自己创建一个新的选项。\",\n        \"当你完成以上 Story，点击 \\\"我已完成挑战\\\" 按钮并输入你的 GitHub 仓库地址和 Heroku 地址。\",\n        \"你可以通过我们的 <a href='//gitter.im/freecodecamp/chinese' target='_blank'>Code Review Chatroom</a> 聊天室获取帮助。\"\n      ],\n      \"challengeSeed\": [\n        \"133315786\"\n      ],\n      \"tests\": [],\n      \"type\": \"basejump\",\n      \"challengeType\": 4,\n      \"isRequired\": true\n    },\n    {\n      \"id\": \"bd7158d8c443eddfaeb5bdff\",\n      \"title\": \"Build a Nightlife Coordination App\",\n      \"description\": [\n        \"<strong>目标：</strong> 创建一个完整的 JavaScript 应用，功能类似于 <a href='http://whatsgoinontonight.herokuapp.com/' target='_blank'>http://whatsgoinontonight.herokuapp.com/</a> ，并部署到 Heroku。\",\n        \"你应该为每一个项目创建一个 GitHub 仓库以及 Heroku 项目。如果你不记得该如何操作，可以查看 <a href='/challenges/get-set-for-our-back-end-development-projects'>http://freecodecamp.cn/challenges/get-set-for-our-back-end-development-projects</a>.\",\n        \"下面是你应该在这个 Story 中实现的内容：\",\n        \"<strong>Story：</strong> 作为一个未授权用户，我可以看到我附近的所有酒吧。\",\n        \"<strong>Story：</strong> 作为一个已授权用户，我可以把我自己添加到一个酒吧，表示我今晚将会去那儿。\",\n        \"<strong>Story：</strong> 作为一个已授权用户，如果我不再想去某个酒吧，可以把自己从酒吧中移出。\",\n        \"<strong>Story：</strong> 作为一个未授权用户，在我登录后我不需要重新搜索附近的酒吧。\",\n        \"<strong>提示：</strong> 尝试使用 <a href='https://www.yelp.com/developers/documentation/v2/overview' target='_blank'>Yelp API</a> 查找地点。如果你使用 Yelp API，请在你的应用中声明你的使用。\",\n        \"当你完成以上 Story，点击 \\\"我已完成挑战\\\" 按钮并输入你的 GitHub 仓库地址和 Heroku 地址。\",\n        \"你可以通过我们的 <a href='//gitter.im/freecodecamp/chinese' target='_blank'>Code Review Chatroom</a> 聊天室获取帮助。\"\n      ],\n      \"challengeSeed\": [\n        \"133315781\"\n      ],\n      \"tests\": [],\n      \"type\": \"basejump\",\n      \"challengeType\": 4,\n      \"isRequired\": true\n    },\n    {\n      \"id\": \"bd7158d8c443eddfaeb5bd0e\",\n      \"title\": \"Chart the Stock Market\",\n      \"description\": [\n        \"<strong>目标：</strong>建立一个完整的 JavaScript 应用，功能上类似于 <a href='http://watchstocks.herokuapp.com/' target='_blank'>http://watchstocks.herokuapp.com/</a> ，并将其部署到 Heroku。\",\n        \"你应该为每一个项目创建一个 GitHub 仓库以及 Heroku 项目。如果你不记得该如何操作，可以查看 <a href='/challenges/get-set-for-our-back-end-development-projects'>http://freecodecamp.cn/challenges/get-set-for-our-back-end-development-projects</a>。\",\n        \"下面是你应该在这个 Story 中实现的内容：\",\n        \"<strong>User Story:</strong> I can view a graph displaying the recent trend lines for each added stock.\",\n        \"<strong>User Story:</strong> I can add new stocks by their symbol name.\",\n        \"<strong>User Story:</strong> I can remove stocks.\",\n        \"<strong>User Story:</strong> I can see changes in real-time when any other user adds or removes a stock. For this you will need to use Web Sockets.\",\n        \"Once you've finished implementing these user stories, click the \\\"我已经完成了这个挑战\\\" button and enter the URLs for both your GitHub repository and your live app running on Heroku.\",\n        \"You can get feedback on your project from fellow campers by sharing it in our <a href='//gitter.im/freecodecamp/chinese' target='_blank'>Code Review Chatroom</a>. You can also share it on Twitter and your city's Campsite (on Facebook).\"\n      ],\n      \"challengeSeed\": [\n        \"133315787\"\n      ],\n      \"tests\": [],\n      \"type\": \"basejump\",\n      \"challengeType\": 4,\n      \"isRequired\": true\n    },\n    {\n      \"id\": \"bd7158d8c443eddfaeb5bd0f\",\n      \"title\": \"Manage a Book Trading Club\",\n      \"description\": [\n        \"<strong>Objective:</strong> Build a full stack JavaScript app that is functionally similar to this: <a href='http://bookjump.herokuapp.com/' target='_blank'>http://bookjump.herokuapp.com/</a> and deploy it to Heroku.\",\n        \"Note that for each project, you should create a new GitHub repository and a new Heroku project. If you can't remember how to do this, revisit <a href='/challenges/get-set-for-our-back-end-development-projects'>http://freecodecamp.cn/challenges/get-set-for-our-back-end-development-projects</a>.\",\n        \"Here are the specific user stories you should implement for this project:\",\n        \"<strong>User Story:</strong> I can view all books posted by every user.\",\n        \"<strong>User Story:</strong> I can add a new book.\",\n        \"<strong>User Story:</strong> I can update my settings to store my full name, city, and state.\",\n        \"<strong>User Story:</strong> I can propose a trade and wait for the other user to accept the trade.\",\n        \"Once you've finished implementing these user stories, click the \\\"我已经完成了这个挑战\\\" button and enter the URLs for both your GitHub repository and your live app running on Heroku.\",\n        \"You can get feedback on your project from fellow campers by sharing it in our <a href='//gitter.im/freecodecamp/chinese' target='_blank'>Code Review Chatroom</a>. You can also share it on Twitter and your city's Campsite (on Facebook).\"\n      ],\n      \"challengeSeed\": [\n        \"133316032\"\n      ],\n      \"tests\": [],\n      \"type\": \"basejump\",\n      \"challengeType\": 4,\n      \"isRequired\": true\n    },\n    {\n      \"id\": \"bd7158d8c443eddfaeb5bdee\",\n      \"title\": \"Build a Pinterest Clone\",\n      \"description\": [\n        \"<strong>Objective:</strong> Build a full stack JavaScript app that is functionally similar to this: <a href='http://pintech.herokuapp.com/' target='_blank'>http://pintech.herokuapp.com/</a> and deploy it to Heroku.\",\n        \"Note that for each project, you should create a new GitHub repository and a new Heroku project. If you can't remember how to do this, revisit <a href='/challenges/get-set-for-our-back-end-development-projects'>http://freecodecamp.cn/challenges/get-set-for-our-back-end-development-projects</a>.\",\n        \"Here are the specific user stories you should implement for this project:\",\n        \"<strong>User Story:</strong> As an unauthenticated user, I can login with Twitter.\",\n        \"<strong>User Story:</strong> As an authenticated user, I can link to images.\",\n        \"<strong>User Story:</strong> As an authenticated user, I can delete images that I've linked to.\",\n        \"<strong>User Story:</strong> As an authenticated user, I can see a Pinterest-style wall of all the images I've linked to.\",\n        \"<strong>User Story:</strong> As an unauthenticated user, I can browse other users' walls of images.\",\n        \"<strong>User Story:</strong> As an authenticated user, if I upload an image that is broken, it will be replaced by a placeholder image. (can use jQuery broken image detection)\",\n        \"<strong>Hint:</strong> <a href='http://masonry.desandro.com/' target='_blank'>Masonry.js</a> is a library that allows for Pinterest-style image grids.\",\n        \"Once you've finished implementing these user stories, click the \\\"我已经完成了这个挑战\\\" button and enter the URLs for both your GitHub repository and your live app running on Heroku.\",\n        \"You can get feedback on your project from fellow campers by sharing it in our <a href='//gitter.im/freecodecamp/chinese' target='_blank'>Code Review Chatroom</a>. You can also share it on Twitter and your city's Campsite (on Facebook).\"\n      ],\n      \"challengeSeed\": [\n        \"133315784\"\n      ],\n      \"tests\": [],\n      \"type\": \"basejump\",\n      \"challengeType\": 4,\n      \"isRequired\": true\n    }\n  ]\n}\n"
  },
  {
    "path": "seed/challenges/03-back-end-development-certification/git.json",
    "content": "{\n  \"name\": \"Git\",\n  \"order\": 24,\n  \"time\": \"3 hours\",\n  \"helpRoom\": \"chinese\",\n  \"challenges\": [\n    {\n      \"id\": \"bd7353d8c341eddeaeb5bd0f\",\n      \"title\": \"Save your Code Revisions Forever with Git\",\n      \"description\": [\n        \"我们将在 Cloud 9 中完成这个挑战，Cloud 9 是一个非常强大的在线代码编辑器，它包含了一个完整的 Ubuntu 环境，所有的一切都是运行在云端。\",\n        \"如果你还没有 Cloud 9 的账号，可以点击链接<a href='http://c9.io' target='_blank'>http://c9.io</a>注册。\",\n        \"打开<a href='http://c9.io' target='_blank'>http://c9.io</a>并登入你的账号。\",\n        \"点击 c9 页面右上角的“+”号创建一个新的工作空间。\",\n        \"为你的工作空间设置一个名称。\",\n        \"在下面的图形选择区域选择 Node.js 模板。\",\n        \"点击“Create workspace”按钮，完成工作空间的创建。\",\n        \"进入刚刚创建的工作空间，在页面的下方你会看到有一个 bash 命令窗口。在这个小窗口里面输入下面的命令，你现在没有必要去了解这个命令的含义。\",\n        \"在命令窗口中输入<code>npm install -g git-it</code>安装<code>git-it</code>\",\n        \"现在在命令窗口中输入<code>git-it</code>开始我们的教程。\",\n        \"你可以通过拖动命令窗口的边框来调整窗口的大小。\",\n        \"确认你现在的工作目录是在“workspace”下面，你可以通过使用命令<code>cd ~/workspace</code>回到工作目录中。\",\n        \"你可以在 GitHub 上查看本节的源码 <a href='https://github.com/jlord/git-it'>https://github.com/jlord/git-it</a>。\",\n        \"完成 \\\"Get Git\\\"\",\n        \"完成 \\\"Repository\\\"\",\n        \"完成 \\\"Commit to it\\\"\",\n        \"完成 \\\"Githubbin\\\"\",\n        \"完成 \\\"Remote Control\\\"\",\n        \"完成 \\\"Forks and Clones\\\"\",\n        \"完成 \\\"Branches aren't just for Birds\\\"\",\n        \"完成 \\\"It's a Small World\\\"\",\n        \"完成 \\\"Pull, Never out of Date\\\"\",\n        \"完成 \\\"Requesting you Pull, Please\\\"\",\n        \"完成 \\\"Merge Tada!\\\"\",\n        \"完成这些后你可以移步到下一个挑战。\"\n      ],\n      \"challengeSeed\": [\n        \"133316034\"\n      ],\n      \"tests\": [],\n      \"type\": \"waypoint\",\n      \"challengeType\": 2\n    }\n  ]\n}"
  },
  {
    "path": "seed/challenges/03-back-end-development-certification/mongodb.json",
    "content": "{\n  \"name\": \"MongoDB\",\n  \"order\": 25,\n  \"time\": \"3 hours\",\n  \"helpRoom\": \"chinese\",\n  \"challenges\": [\n    {\n      \"id\": \"bd7243d8c341eddeaeb5bd0f\",\n      \"title\": \"Store Data in MongoDB\",\n      \"description\": [\n        \"--译者注：如果访问 c9.io 网站比较慢，在自己电脑上安装 learnyoumongo 也可以完成这个挑战。\",\n        \"在这一节，我们将使用 Cloud 9 提供的在线开发环境, 该开发环境是一个基于 Ubuntu 14.04 的虚拟云主机。\",\n        \"如果你还没有 Cloud 9 账号，请在这个页面注册： <a href='http://c9.io' target='_blank'>http://c9.io</a> 。--译者注：可以选择用 Github 账号登陆。\",\n        \"注册完成后，打开 <a href='http://c9.io' target='_blank'>http://c9.io</a> 并登陆你的账号。\",\n        \"登陆后，点击屏幕右上角的 \\\"+\\\" 图标，创建一个新的开发环境（Workspace）。\",\n        \"命名你的开发环境（Workspace name），命名必须是小写、数字、下划线或者短横线，不能用大写，开发环境的描述信息（Description）可以不填。\",\n        \"在屏幕下方提供的模板中选择 Node.js 来创建你的开发环境。\",\n        \"点击屏幕下方的 \\\"Create workspace\\\" 按钮，完成创建开发环境。\",\n        \"稍等一会儿，等待 C9 完成创建并加载你的开发环境，之后你应该可以进入你刚刚创建的开发环境，并在屏幕下方会看到一个命令行终端窗口（terminal window）。以下步骤的操作都将在这个命令行终端窗口中完成。\",\n        \"安装 <code>learnyoumongo</code> : <code>npm install learnyoumongo -g</code>。\",\n        \"在终端中输入 <code>learnyoumongo</code> 开始你的挑战。\",\n        \"请务必注意：在执行命令 <code>mongod</code> 时，请务必带上 <code>--nojournal</code> 参数，例如： <code>mongod --nojournal</code> 。\",\n        \"提示：你可以通过拽拉边框调节当前窗口的大小。\",\n        \"练习期间，请务必保证你的当前目录是 \\\"workspace\\\" ，如果当前目录不是 \\\"workspace\\\" ，你可以通过这个命令返回： <code>cd ~/workspace</code> 。\",\n        \"你可以在 Github 上 <a href='https://github.com/evanlucas/learnyoumongo'>https://github.com/evanlucas/learnyoumongo</a> 查看该教程的源码。\",\n        \"完成 \\\"Mongod\\\"\",\n        \"完成 \\\"Connect\\\"\",\n        \"完成 \\\"Find\\\"\",\n        \"完成 \\\"Find Project\\\"\",\n        \"完成 \\\"Insert\\\"\",\n        \"完成 \\\"Update\\\"\",\n        \"完成 \\\"Remove\\\"\",\n        \"完成 \\\"Count\\\"\",\n        \"完成 \\\"Aggregate\\\"\",\n        \"完成上述所有步骤后，请继续下一节的挑战。\"\n      ],\n      \"challengeSeed\": [\n        \"133316035\"\n      ],\n      \"tests\": [],\n      \"type\": \"waypoint\",\n      \"challengeType\": 2\n    }\n  ]\n}\n"
  },
  {
    "path": "seed/challenges/03-back-end-development-certification/nodejs-and-expressjs.json",
    "content": "{\n  \"name\": \"Node.js and Express.js\",\n  \"order\": 24,\n  \"time\": \"20 hours\",\n  \"helpRoom\": \"chinese\",\n  \"challenges\": [\n    {\n      \"id\": \"bd7153d8c441eddfaeb5bd0f\",\n      \"title\": \"Manage Packages with NPM\",\n      \"description\": [\n        \"我们将在 Cloud 9 中完成这个挑战，Cloud 9 是一个非常强大的在线代码编辑器，它包含了一个完整的 Ubuntu 环境，所有的一切都是运行在云端。\",\n        \"如果你还没有 Cloud 9 的账号，可以点击链接<a href='http://c9.io' target='_blank'>http://c9.io</a>注册。\",\n        \"打开<a href='http://c9.io' target='_blank'>http://c9.io</a>并登入你的账号。\",\n        \"点击 c9 页面右上角的“+”号创建一个新的工作空间。\",\n        \"为你的工作空间设置一个名称。\",\n        \"在下面的图形选择区域选择 Node.js 模板。\",\n        \"点击“Create workspace”按钮，完成工作空间的创建。\",\n        \"进入刚刚创建的工作空间，在页面的下方你会看到有一个 bash 命令窗口。在这个小窗口里面输入下面的命令，你现在没有必要去了解这个命令的含义。\",\n        \"在命令窗口中输入<code>npm install -g how-to-npm</code>安装<code>how-to-npm</code>\",\n        \"现在在命令窗口中输入<code>how-to-npm</code>开始我们的教程。\",\n        \"你可以通过拖动命令窗口的边框来调整窗口的大小。\",\n        \"确认你现在的工作目录是在“workspace”下面，你可以通过使用命令<code>cd ~/workspace</code>回到工作目录中。\",\n        \"需要注意的是你只能添加dist标签在第8步到第10步中发布的具体版本号。如果你收到了403或404错误，运行 <code>how-to-npm</code> 然后再试一次。\",\n        \"另外，如果你遇到一个错误，而且你认为你理解这个错误，你可以通过在命令窗口中输入<code>how-to-npm verify skip</code>跳过这一步。\",\n        \"你可以在 GitHub 上查看本节的源码 <a href='https://github.com/npm/how-to-npm'>https://github.com/npm/how-to-npm</a>。\",\n        \"完成 \\\"Install NPM\\\"\",\n        \"完成 \\\"Dev Environment\\\"\",\n        \"完成 \\\"Login\\\"\",\n        \"完成 \\\"Start a Project\\\"\",\n        \"完成 \\\"Install a Module\\\"\",\n        \"完成 \\\"Listing Dependencies\\\"\",\n        \"完成 \\\"NPM Test\\\"\",\n        \"完成 \\\"Package Niceties\\\"\",\n        \"完成 \\\"Publish\\\"\",\n        \"完成 \\\"Version\\\"\",\n        \"完成 \\\"Publish Again\\\"\",\n        \"如果你已经完成了这些步骤，你可以跳过剩余的部分并开始下一个挑战。\"\n      ],\n      \"challengeSeed\": [\n        \"126433450\"\n      ],\n      \"tests\": [],\n      \"type\": \"waypoint\",\n      \"challengeType\": 2\n    },\n    {\n      \"id\": \"bd7153d8c441eddfaeb5bdff\",\n      \"title\": \"Start a Node.js Server\",\n      \"description\": [\n        \"我们将在 Cloud 9 中完成这个挑战，Cloud 9 是一个非常强大的在线代码编辑器，它包含了一个完整的 Ubuntu 环境，所有的一切都是运行在云端。我们将会做 Node School 的 LearnYouNode 挑战的前 7 步。\",\n        \"如果你还没有 Cloud 9 的账号，可以点击链接<a href='http://c9.io' target='_blank'>http://c9.io</a>注册。\",\n        \"打开<a href='http://c9.io' target='_blank'>http://c9.io</a>并登入你的账号。\",\n        \"点击 c9 页面右上角的“+”号创建一个新的工作空间。\",\n        \"为你的工作空间设置一个名称和可选的描述。\",\n        \"在下面的图形选择区域选择 Node.js 模板。\",\n        \"点击“Create workspace”按钮，完成工作空间的创建。\",\n        \"进入刚刚创建的工作空间，在页面的下方你会看到有一个 bash 命令窗口。在这个小窗口里面输入下面的命令，你现在没有必要去了解这个命令的含义。\",\n        \"运行命令 <code>sudo npm install -g learnyounode</code>\",\n        \"现在在命令窗口中输入<code>learnyounode</code>开始我们的教程。\",\n        \"你可以通过拖动命令窗口的边框来调整窗口的大小。\",\n        \"确认你现在的工作目录是在“workspace”下面，你可以通过使用命令<code>cd ~/workspace</code>回到工作目录中。\",\n        \"你可以到 GitHub 上面查看本节的源码 <a href='https://github.com/workshopper/learnyounode'>https://github.com/workshopper/learnyounode</a>\",\n        \"完成 \\\"Hello World\\\"\",\n        \"完成 \\\"Baby Steps\\\"\",\n        \"完成 \\\"My First I/O\\\"\",\n        \"完成 \\\"My First Async I/O\\\"\",\n        \"完成 \\\"Filtered LS\\\"\",\n        \"完成 \\\"Make it Modular\\\"\",\n        \"完成 \\\"HTTP Client\\\"\",\n        \"如果你已经完成了这 7 个挑战，请开始下一个。\"\n      ],\n      \"challengeSeed\": [\n        \"126411561\"\n      ],\n      \"tests\": [],\n      \"type\": \"waypoint\",\n      \"challengeType\": 2\n    },\n    {\n      \"id\": \"bd7153d8c441eddfaeb5bdfe\",\n      \"title\": \"Continue working with Node.js Servers\",\n      \"description\": [\n        \"我们继续 LearnYouNode 的挑战。这一次我们进行第 8 步到第 10 步。\",\n        \"确认你现在的工作目录是在“workspace”下面，你可以通过使用命令<code>cd ~/workspace</code>回到工作目录中。\",\n        \"回到你在 c9.io 上创建的工作空间，运行 <code>learnyounode</code> 开始我们的教程。\",\n        \"你可以在 GitHub 上找到这节课程的源码 <a href='https://github.com/workshopper/learnyounode'>https://github.com/workshopper/learnyounode</a>\",\n        \"完成 \\\"HTTP Collect\\\"\",\n        \"完成 \\\"Juggling Async\\\"\",\n        \"完成 \\\"Time Server\\\"\",\n        \"完成这 3 步后请开始下一个挑战。\"\n      ],\n      \"challengeSeed\": [\n        \"128836506\"\n      ],\n      \"tests\": [],\n      \"type\": \"waypoint\",\n      \"challengeType\": 2\n    },\n    {\n      \"id\": \"bd7153d8c441eddfaeb5bdfd\",\n      \"title\": \"Finish working with Node.js Servers\",\n      \"description\": [\n        \"我们继续 LearnYouNode 挑战的第 11 到第 13 步。\",\n        \"确认你现在的工作目录是在“workspace”下面，你可以通过使用命令<code>cd ~/workspace</code>回到工作目录中。\",\n        \"回到你在 c9.io 上创建的工作空间，运行 <code>learnyounode</code> 开始我们的教程。\",\n        \"你可以在 GitHub 上找到这节课程的源码 <a href='https://github.com/workshopper/learnyounode'>https://github.com/workshopper/learnyounode</a>\",\n        \"完成 \\\"HTTP File Server\\\"\",\n        \"完成 \\\"HTTP Uppercaserer\\\"\",\n        \"完成 \\\"HTTP JSON API Server\\\"\",\n        \"完成这最后 3 步，你可以进行下一个挑战了。\"\n      ],\n      \"challengeSeed\": [\n        \"128836507\"\n      ],\n      \"tests\": [],\n      \"type\": \"waypoint\",\n      \"challengeType\": 2\n    },\n    {\n      \"id\": \"bd7153d8c441eddfaeb5bd1f\",\n      \"title\": \"Build Web Apps with Express.js\",\n      \"description\": [\n        \"我们将在 Cloud 9 中完成这个挑战，Cloud 9 是一个非常强大的在线代码编辑器，它包含了一个完整的 Ubuntu 环境，所有的一切都是运行在云端。\",\n        \"如果你还没有 Cloud 9 的账号，可以点击链接<a href='http://c9.io' target='_blank'>http://c9.io</a>注册。\",\n        \"打开<a href='http://c9.io' target='_blank'>http://c9.io</a>并登入你的账号。\",\n        \"点击 c9 页面右上角的“+”号创建一个新的工作空间。\",\n        \"为你的工作空间设置一个名称和可选的描述。\",\n        \"在下面的图形选择区域选择 Node.js 模板。\",\n        \"点击“Create workspace”按钮，完成工作空间的创建。\",\n        \"进入刚刚创建的工作空间，在页面的下方你会看到有一个 bash 命令窗口。在这个小窗口里面输入下面的命令，你现在没有必要去了解这个命令的含义。\",\n        \"运行命令 <code>git clone https://github.com/FreeCodeCamp/fcc-expressworks.git && chmod 744 fcc-expressworks/setup.sh && fcc-expressworks/setup.sh && source ~/.profile</code>\",\n        \"执行命令 <code>expressworks</code> 以开始我们的教程。\",\n        \"你可以通过拖动命令窗口的边框来调整窗口的大小。\",\n        \"确认你现在的工作目录是在“workspace”下面，你可以通过使用命令<code>cd ~/workspace</code>回到工作目录中。\",\n        \"你可以到 GitHub 上面查看本节的源码 <a href='https://github.com/azat-co/expressworks'>https://github.com/azat-co/expressworks</a>\",\n        \"完成 \\\"Hello World!\\\"\",\n        \"完成 \\\"Static\\\"\",\n        \"完成 \\\"Jade\\\"\",\n        \"完成 \\\"Good Old Form\\\"\",\n        \"完成 \\\"Stylish CSS\\\"\",\n        \"完成 \\\"Param Pam Pam\\\"\",\n        \"完成 \\\"What's In Query\\\"\",\n        \"完成 \\\"JSON Me\\\"\",\n        \"完成这些后请移步下一个挑战\"\n      ],\n      \"challengeSeed\": [\n        \"126411559\"\n      ],\n      \"tests\": [],\n      \"type\": \"waypoint\",\n      \"challengeType\": 2\n    }\n  ]\n}\n"
  },
  {
    "path": "seed/challenges/04-video-challenges/accessibility.json",
    "content": "{\n  \"name\": \"Accessibility\",\n  \"order\": 5.5,\n  \"time\": \"0 hours\",\n  \"isComingSoon\": true,\n  \"challenges\": [\n    {\n      \"id\": \"bd7128d8c441eddfbeb5bddd\",\n      \"title\": \"Learn Accessibility Challenges\",\n      \"description\": [],\n      \"challengeSeed\": [],\n      \"tests\": [],\n      \"type\": \"hike\",\n      \"challengeType\": 6,\n      \"nameEs\": \"Accessibility\"\n    }\n  ]\n}    "
  },
  {
    "path": "seed/challenges/04-video-challenges/agile.json",
    "content": "{\n  \"name\": \"Agile\",\n  \"order\": 6,\n  \"time\": \"0 hours\",\n  \"isComingSoon\": true,\n  \"challenges\": [\n    {\n      \"id\": \"bd7128d8c441eddfbec5bdde\",\n      \"title\": \"Learn Agile Challenges\",\n      \"description\": [],\n      \"challengeSeed\": [],\n      \"tests\": [],\n      \"type\": \"hike\",\n      \"challengeType\": 6,\n      \"nameEs\": \"Agile\"\n    }\n  ]\n}    "
  },
  {
    "path": "seed/challenges/04-video-challenges/bigonotation.json",
    "content": "{\n  \"name\": \"Big O Notation\",\n  \"order\": 4,\n  \"time\": \"30 minutes\",\n  \"challenges\": [\n    {\n      \"id\": \"56b15f15632298c12f31517b\",\n      \"title\": \"Big O Notation: What It Is and Why You Should Care\",\n      \"description\": [\n        \"时间复杂度是讨论算法花费多少时间的一种方式。它对于更快的提高精简中的软件的运行速度有着很大的作用。\",\n        \"当你编写代码的时候，你应该要知道这个软件需要花多长时间去执行。没有人想要创造一个由于运行缓慢而让用户觉得沮丧的项目。\",\n        \"时间复杂度相对于一个算法来说，是一个或多个函数的集合。\",\n        \"大O符号专门帮助您识别是算法没有'规模'好，还是在有大量不同的用户，信息，或其他投入量工作下运行良好。\",\n        \"这不符合摩尔定律 - 不管你的电脑有多大有快捷，如果算法是成倍地低效率，它在现实就无法使用。\",\n        \"此外，关于大O符号和时间复杂度的问题可作为面试问题。\",\n        \"您的雇主将会希望您写的代码在加载用户的页面上不会花费太长的时间，大O符号的知识说明您在编写代码是认识到这一点的。\",\n        \"从这段视频中可以得出的结论是当您的网站或应用程序扩大时，大O符号可帮助您明确在速度和内存上有可能出现的问题（有时是大问题）。\"\n      ],\n      \"challengeSeed\": [\n        \"139874123\"\n      ],\n      \"tests\": [\n        [\n          \"如果一个算法对少量数据来说是高效的，那么它将对大量数据的同样高效。\",\n          false,\n          \"这取决于算法和它处理的数据。\"\n        ],\n        [\n          \"大O符号反映了算法在预期投入方面的速度。\",\n          true\n        ]\n      ],\n      \"type\": \"hike\",\n      \"challengeType\": 6\n    },\n    {\n      \"id\": \"56b15f15632298c12f31517a\",\n      \"title\": \"Big O Notation: A Few Examples\",\n      \"description\": [\n        \"通过在算法中执行的基本操作（基本操作=一个花费固定时间执行的操作）的数目统计来测量时间复杂度。\",\n        \"时间复杂度由函数T(n)表示。O代表函数，(n)表示作用于元件的数目。\",\n        \"渐进时间复杂度，对于任何的有效输入它可能花费的最长时间，是表达时间复杂度最常见的方式。\",\n        \"当你讨论大0符号,通常指的是最坏的情况。\",\n        \"例如，如果我们有两个列表搜索常见条目,我们将计算条目在每个列表花费的最长时间，我们不低估可能需要多长时间是为了安全起见。\",\n        \"O(1)——确定一个数字是奇数或偶数。O(1)是一个静态的时间常量,不管有多少信息或有多少用户它都是一样的不改变。\",\n        \"O(log N)——发现一个字在字典里(使用二分法检索)。二分法检索是一个典型的“分而治之”的算法。\",\n        \"O(N)——看一本书\",\n        \"O(N log N)——排序一副扑克牌(使用归并排序)\",\n        \"O(N ^ 2)——在你购物车上检查你的购物清单的每一样东西\",\n        \"O(∞)-掷硬币,直到它落在头上\",\n        \"作为一个经验法则,任何用N ^ 2或其他指数对于多个用户的网站来说都不是好的算法。\",\n        \"如果你的算法降低在输入上降低指数,你应该找一个更有效的方法来解决这个问题。\",\n        \"当你编码循环内循环,你要特别注意时间复杂度。\",\n        \"大O备忘单是当你分类算法时的一个查看平台,像“合并排序”或“快速排序”。\",\n        \"<a href='http://bigocheatsheet.com/' target='_blank'>bigocheatsheet.com/</a>\",\n        \"普林斯顿Coursera课程不是一颗卑微的心。通过在java的例子和实践中，这门课程将涵盖java的迭代数据，排序，和搜索算法。\",\n        \"<a href='http://coursera.org/course/algs4partI' target='_blank'>coursera.org/course/algs4partI</a>\"\n      ],\n      \"challengeSeed\": [\n        \"139877627\"\n      ],\n      \"tests\": [\n        [\n          \"算法表达了指数O(N ^ 2)可以在某些情况下工作得很好,所以你不应该完全避免它们。\",\n          false,\n          \"虽然它们可以在某些小范围的情况下工作,但由于他们不会在大范围内工作所以他们并不是好的做法。\"\n        ],\n        [\n          \"如果你的做法是有效的所有的算法都可以分解完成在一个静态的时间。\",\n          false,\n          \"在某些程度上并不是所有的算法都可以简化,但你应该总是试图找到最简单的方法来解决你的问题。\"\n        ]\n      ],\n      \"type\": \"hike\",\n      \"challengeType\": 6\n    }\n  ]\n}\n"
  },
  {
    "path": "seed/challenges/04-video-challenges/chromedevtools.json",
    "content": "{\n  \"name\": \"Chrome Developer Tools\",\n  \"order\": 3,\n  \"time\": \"1 hour\",\n  \"challenges\": [\n    {\n      \"id\": \"56b15f15632298c12f315184\",\n      \"title\": \"Chrome Dev Tools: Elements\",\n      \"description\": [\n        \"这个课程只对Chrome开发工具中的Elements(元素)标签做基本介绍,更多详细介绍请点击: <a href='http://developers.google.com/web/tools/iterate/inspect-styles/basics' target='_blank'>developers.google.com/web/tools/iterate/inspect-styles/basics</a>\",\n        \"我们接下来会在每个小节中中使用Free Code Camp用户kmiasko的网站 mckellen.com/ 来做演示。\",\n        \"在chrome浏览器中右击选中'Inspect element'即可访问elements标签，然后你就可以随便修改元素文本，元素标签和任何其他CSS或者HTML。\",\n        \"这些修改不会自动保存，不能当做IDE或者可以保存内容的编辑器。你可以使用chrome中的'persistent authoring'功能去保存更改。\",\n        \"记住这里层叠，继承和其他CSS规则都可以使用，另外，被覆盖的式样会以穿越文字的横线的形式展示。\",\n        \"需要注意的是现在\\\"树\\\"中看到的代码是当前的HTML，而不是页面加载时的代码。如果你用JavaScript或Jquery来改变页面元素，\\\"树\\\"就会更新。\",\n        \"Padding，border和margin都很容易在右下角的彩色盒子里面检查和编辑。\",\n        \"更多详细内容请访问Chrome开发工具文档： <a href='http://developers.google.com/web/tools/iterate/inspect-styles/basics' target='_blank'>developers.google.com/web/tools/iterate/inspect-styles/basics</a>\"\n      ],\n      \"challengeSeed\": [\n        \"137186237\"\n      ],\n      \"tests\": [\n        [\n          \"你应该使用elements标签页去编辑现有网页的HTML和CSS。\",\n          true\n        ],\n        [\n          \"在elements标签页中所做的更改都会保存，可以当做编辑器。\",\n          false,\n          \"编辑都是临时的，如果你想要对代码进行更改，记得写到你自己的文档而中不至于丢失。\"\n        ]\n      ],\n      \"type\": \"hike\",\n      \"challengeType\": 6\n    },\n    {\n      \"id\": \"56b15f15632298c12f315183\",\n      \"title\": \"Chrome Dev Tools: Network\",\n      \"description\": [\n        \"network标签页是用来回答'页面中哪个部分最耗时间'或'哪个调用初始化了网络请求'\",\n        \"network仪表盘记录了页面中每个元素加载的详细信息。\",\n        \"每一个请求都记录在network仪表盘的底部日志中\",\n        \"观察底部的线条，你会注意到彩色图案。每一个颜色都代表了请求中的不同类型内容。\",\n        \"线越长代表网络耗时越大，我们最终目标就是缩短线长。如果出现长线条，说明某些内容拖慢了整个网页。\",\n        \"点击请求日志，会看到更加详细的请求信息。\",\n        \"更多详细内容请访问: <a href='http://developers.google.com/web/tools/profile-performance/network-performance/resource-loading' target='_blank'>developers.google.com/web/tools/profile-performance/network-performance/resource-loading</a>\"\n      ],\n      \"challengeSeed\": [\n        \"137187539\"\n      ],\n      \"tests\": [\n        [\n          \"Network标签页可以用来判断发生了那些请求及其耗时\",\n          true\n        ],\n        [\n          \"和很多Chrome开发者工具中的标签一样，有很多种形式来观察和使用Chrome提供的信息\",\n          true\n        ]\n      ],\n      \"type\": \"hike\",\n      \"challengeType\": 6\n    },\n    {\n      \"id\": \"56b15f15632298c12f315182\",\n      \"title\": \"Chrome Dev Tools: Sources\",\n      \"description\": [\n        \"Sources标签页对调试JavaScript帮助很大。项目越大，越难准确找到问题所在。\",\n        \"可以对代码的不同部分设置断点，代码会到此停止执行。\",\n        \"有很多种断点类型可以使用，如一行特定代码，一个DOM事件，XMLHTTP请求或一个JavaScript事件。\",\n        \"设置好断点之后，浏览器在进入这段代码或事件时，会暂停执行。\",\n        \"通过减缓代码执行，我们就有机会仔细观察每一个设置点，准确跟踪页面行为。\",\n        \"一旦断点设置好，我们就可以逐步浏览和检查页面中断点处的代码。\",\n        \"和elements标签一样，可以实时编辑代码观察结果，不过记得在别处保存更改。\",\n        \"更多详细内容请访问: <a href='http://developers.google.com/web/tools/javascript/breakpoints/' target='_blank'>developers.google.com/web/tools/javascript/breakpoints/</a>\"\n      ],\n      \"challengeSeed\": [\n        \"137188025\"\n      ],\n      \"tests\": [\n        [\n          \"可以很容易通过Chrome开发者工具进行代码调试。\",\n          true\n        ],\n        [\n          \"断点是事先设置好的，但是你可以设置其在代码中的位置。\",\n          false,\n          \"需要在调试中设置所有断点。\"\n        ]\n      ],\n      \"type\": \"hike\",\n      \"challengeType\": 6\n    },\n    {\n      \"id\": \"56b15f15632298c12f315181\",\n      \"title\": \"Chrome Dev Tools: Timeline\",\n      \"description\": [\n        \"Timeline 面板可以在应用运行时记录和分析所有行为。此处最适合分析应用性能问题。\",\n        \"就像通过network标签找出时间耗费，通过sources标签找出有问题的代码一样，通过Timeline可以观察到更多详细细节。\",\n        \"使用点击timeline的圆形按钮，你可以记录（捕获）堆栈，js性能，内存和图形绘制(CSS)等信息。\",\n        \"chrome会以小粒度的详细日志来展现这些信息，可以通过很多种形式来查看。\",\n        \"所有这些信息可以帮助你很好地理解浏览器中发生的行为，尤其是发现内存占用比较多的事件。\",\n        \"在加载新页面之前记得先点击'clear'按钮再开始记录。\",\n        \"当记录JS事件时，点击title或左侧的'function call'，会重定向到resource标签，同时定位到函数所在位置的代码行。\",\n        \"更多详细内容请访问: <a href='http://developers.google.com/web/tools/profile-performance/evaluate-performance/timeline-tool' target='_blank'>developers.google.com/web/tools/profile-performance/evaluate-performance/timeline-tool</a>\"\n      ],\n      \"challengeSeed\": [\n        \"137188786\"\n      ],\n      \"tests\": [\n        [\n          \"Timeline标签页记录API返回信息所需时间。\",\n          false,\n          \"Timeline标签页最好用于速度和内存使用的性能问题分析。\"\n        ],\n        [\n          \"使用Timeline标签页时，需要点击'record'按钮来记录信息。\",\n          true\n        ]\n      ],\n      \"type\": \"hike\",\n      \"challengeType\": 6\n    },\n    {\n      \"id\": \"56b15f15632298c12f315180\",\n      \"title\": \"Chrome Dev Tools: Profiles\",\n      \"description\": [\n        \"Profiles 面板可以提供web应用或页面的执行时间和内存，主要是针对运行于页面或app上的JavaScript。\",\n        \"这里可以收集到3种类型的概述信息: CPU profile，HEAP snapshot和HEAP profile。HEAP profiles更多的和内存使用信息相关，CPU profile和JavaScript性能相关。\",\n        \"V8分析器可以帮助定位JavaScript中的性能问题，有助于优化代码。\",\n        \"每一个profile都可以在左侧查看，可以对每个页面采集多个profile。总体而言，profiles标签页非常适合优化代码。\",\n        \"更多详细内容请访问：<a href='http://developers.google.com/web/tools/profile-performance/rendering-tools/js-execution' target='_blank'>developers.google.com/web/tools/profile-performance/rendering-tools/js-execution</a>\"\n      ],\n      \"challengeSeed\": [\n        \"137189330\"\n      ],\n      \"tests\": [\n        [\n          \"采集的profile或快照信息只能以一种展现形式查看。\",\n          false,\n          \"和其他Chrome开发工具一样，有很多种展现形式来理解信息。\"\n        ],\n        [\n          \"点击'record'后，针对你需要捕获的页面进行刷新。\",\n          true\n        ]\n      ],\n      \"type\": \"hike\",\n      \"challengeType\": 6\n    },\n    {\n      \"id\": \"56b15f15632298c12f31517f\",\n      \"title\": \"Chrome Dev Tools: Resources\",\n      \"description\": [\n        \"Resources 面板可以显示已经加载的资源，包括：IndexedDB，Web SQL数据库，local storage，session storage，cookies，Application Cache, 图片, 字体和样式表。\",\n        \"可以在浏览器中查看和修改所有这些信息。\",\n        \"当你进行高级网站构建时，resources 面板可以帮你更好的理解app和页面的实时性要求。\",\n        \"更多详细内容请访问：<a href='http://developers.google.com/web/tools/iterate/manage-data/index' target='_blank'>developers.google.com/web/tools/iterate/manage-data/index</a>\"\n      ],\n      \"challengeSeed\": [\n        \"137193676\"\n      ],\n      \"tests\": [\n        [\n          \"Resources 标签中可以查看外部资源，如：SQL和cookies\",\n          true\n        ]\n      ],\n      \"type\": \"hike\",\n      \"challengeType\": 6\n    },\n    {\n      \"id\": \"56b15f15632298c12f31517e\",\n      \"title\": \"Chrome Dev Tools: Audits\",\n      \"description\": [\n        \"Audit 工具帮助你逐步改善你的页面。\",\n        \"在这段视频中，我把这个工具用在我的名言生成应用中，该项目是当做课程中的前端开发项目。\",\n        \"Audit 工具会自动给你提供改进建议。\",\n        \"使用时需要注意和其他知识联系起来。\",\n        \"有时它提供的建议是正确的， 但是也有可能是错误的。\",\n        \"当你想要优化你的网站或应用，但是你不知道从哪里着手时，可以从使用这个工具开始。\"\n      ],\n      \"challengeSeed\": [\n        \"137194227\"\n      ],\n      \"tests\": [\n        [\n          \"Audit 标签页会提供网页改进建议。\",\n          true\n        ],\n        [\n          \"虽然你不需要按照它提供的所有建议，但是最好这么做。\",\n          false,\n          \"如果你不理解工具提出的错误或建议，最好在修改前多做些功课。\"\n        ]\n      ],\n      \"type\": \"hike\",\n      \"challengeType\": 6\n    },\n    {\n      \"id\": \"56b15f15632298c12f31517d\",\n      \"title\": \"Chrome Dev Tools: Console\",\n      \"description\": [\n        \"Console 面板提供了2个主要功能：在开发过程中记录调试信息和提供一个可以用于和文档、开发工具交互的shell环境。\",\n        \"可以使用标准JS语法和特定控制台命令来查看原始数据和结构化数据。\",\n        \"从API中获取的JSON数据是典型的结构化数据。在我给Free Code Camp构建第一个前端开发项目时，我经常使用。\",\n        \"信息经常会叠加满屏幕，你可以键入'clear()'来清空屏幕。通过勾选'Preserve Log'可以保存日志。\",\n        \"有几种不同的日志命令，比如console.log()用于基本日志记录，console.error()和colsole.warn()用于一些重要信息。\",\n        \"Console中可以追踪异常（代码出现了问题），甚至可以在出现异常时暂停代码的执行，如果你还记得，这个功能在Source标签页中也有。\",\n        \"更多详细信息请查看：<a href='http://developers.google.com/web/tools/javascript/console/' target='_blank'>developers.google.com/web/tools/javascript/console/</a>\"\n      ],\n      \"challengeSeed\": [\n        \"137194773\"\n      ],\n      \"tests\": [\n        [\n          \"Chrome开发工具中的console和计算机中的console有很多相似之处。\",\n          true\n        ],\n        [\n          \"这个视频很详细，包含了所有你需要的知识点。\",\n          false,\n          \"请点击浏览页面中的文档链接。\"\n        ]\n      ],\n      \"type\": \"hike\",\n      \"challengeType\": 6\n    },\n    {\n      \"id\": \"56b15f15632298c12f31517c\",\n      \"title\": \"Chrome Dev Tools: Summary\",\n      \"description\": [\n        \"1.) Chrome开发工具非常棒，你用得越多越深，你的技能水平增长的越快。\",\n        \"2.) 经常阅读官方文档： <a href='http://developers.google.com/web/tools/chrome-devtools/' target='_blank'>developers.google.com/web/tools/chrome-devtools/</a>\",\n        \"3.) Chrome开发工具中的所有功能要结合起来使用，这样才能高效地完成任务，不要只用自己熟悉的功能。\"\n\n      ],\n      \"challengeSeed\": [\n        \"137196041\"\n      ],\n      \"tests\": [\n        [\n          \"设备模式可以模拟不同屏幕尺寸和网络情况下网页效果。\",\n          true\n        ]\n      ],\n      \"type\": \"hike\",\n      \"challengeType\": 6\n    }\n  ]\n}\n"
  },
  {
    "path": "seed/challenges/04-video-challenges/computer-basics.json",
    "content": "{\n  \"name\": \"Computer Basics\",\n  \"order\": 0,\n  \"time\": \"2 hours\",\n  \"challenges\": [\n    {\n      \"id\": \"bd7128d8c441eddfbeb5bddf\",\n      \"title\": \"Computer Basics: The 4 Basic Parts of a Computer\",\n      \"description\": [\n        \"一台机器至少需要这四个基本部分才能被认定为是一台计算机。\",\n        \"今天我们要谈论计算机硬件基础。\",\n        \"计算机由4个基本部分组成：输入设备、输出设备、CPU（中央处理器）、存储器。\",\n        \"输入是你放入计算机的东西。\",\n        \"想想鼠标，键盘，麦克风，任何你把数据输入到计算机的方式。\",\n        \"输出是你在显示屏上所看见的或在扬声器里所听见的。\",\n        \"这些可以以任意的形式呈现如文本，数字，视频，图像等等，不过这不重要。\",\n        \"CPU代表中央处理单元，并且当我们提到计算机时都能想起它\",\n        \"CPU是实现功能，运行软件的部分，由CPU来操作数据。\",\n        \"内存储器是我们存储数据和信息的地方。\",\n        \"现在，CPU对存储器具有独占访问权\",\n        \"你无法直接用输入和输出而不通过CPU来访问内存。\",\n        \"那么，来回顾一下，我们知道了计算机有四个基本组成：输入，输出，CPU，存储器。\"\n      ],\n      \"challengeSeed\": [\n        \"132542064\"\n      ],\n      \"tests\": [\n        [\n          \"计算机有三个基本部分\",\n          false,\n          \"计算机有四个基本组成: 输入，输出，中央处理单元(CPU)，存储器。\"\n        ],\n        [\n          \"CPU代表中央处理单元\",\n          true\n        ],\n        [\n          \"所有组成部分都可以访问内存\",\n          false,\n          \"只有CPU可以访问内存\"\n        ]\n      ],\n      \"type\": \"hike\",\n      \"challengeType\": 6\n    },\n    {\n      \"id\": \"bd7127d8c441eddfbeb5bddf\",\n      \"title\": \"Computer Basics: More Computer Hardware\",\n      \"description\": [\n        \"这个视频涵盖了主板，扩展槽和电源的基本功能。\",\n        \"让我们快速的回顾一下 - 计算机的四个基本组成，有输入例如鼠标和键盘, 输出：在显示器中看到和扬声器中听到的, CPU：中央处理单元, 还有内存储器。\",\n        \"现在存储器可以分为短期存储器（称作RAM）, 和长期存储器.\",\n        \"长期存储器通常是硬盘, 但是也可以是CD-ROM或者是闪存设备, 或是任何这一类的存储设备。\",\n        \"除了这四个基本部分, 我们今天还有另外三样东西要谈论: 主板，扩展槽和电源。\",\n        \"主板是连接这些硬件的东西。\",\n        \"当这些数据到处流动试图找出该去哪时, 主板帮助他们导流他们，使他们去向正确的地方\",\n        \"扩展卡是声卡，显卡，这类可以提升用户体验的东西。\",\n        \"电源, 就像他的名字一样, 给我们的计算机提供电力。\",\n        \"它通常是一个部件并有一个风扇在上面来帮助它散热。\",\n        \"然后让我们快速的回顾一下。\",\n        \"除了输入，输出，CPU，存储器这四个基本部分，我们通常还有主板，扩展卡和电源。\"\n      ],\n      \"challengeSeed\": [\n        \"132542458\"\n      ],\n      \"tests\": [\n        [\n          \"电源不是计算机的一个必要的部分因为它不是4个基本部分之一\",\n          false,\n          \"计算机需要电力。\"\n        ],\n        [\n          \"主板连接了计算机所有的工作部件。\",\n          true\n        ],\n        [\n          \"存储器通常分为三种。\",\n          false,\n          \"只有两种:RAM和长期存储器例如硬盘。\"\n        ]\n      ],\n      \"type\": \"hike\",\n      \"challengeType\": 6\n    },\n    {\n      \"id\": \"bd7129d8a441eddfbeb5bddf\",\n      \"title\": \"Computer Basics: Chips and Moore's Law\",\n      \"description\": [\n        \"我们讨论什么是芯片还有为什么技术一年比一年便宜。\",\n        \"在这个视频中我们要讨论芯片和摩尔定律。\",\n        \"你应该注意到近十年或者说很多年来，如我你要去买一个MP3，你可以用越来越少的钱买到越来越大的容量。\",\n        \"当你在商店里的时候也许你会想：\\\"嗯~，我现在可以入手一个了，或者我可以再等半年看看价格会降多少\\\", 这也许听起来很可笑但是长期来说一直存在的一个趋势。\",\n        \"让我们谈谈什么组成了一个芯片。\",\n        \"一个芯片全是由成千上万的晶体管(一种只能是0或1的开关)组成的(注意到这里的主题了？).\",\n        \"所有的这些晶体管塞进了一个芯片里，并且这就是芯片存储信息的方式。\",\n        \"在一个芯片上集成的晶体管数量决定了芯片的大小和速度\",\n        \"摩尔定律是观察到自从1965年芯片上的晶体管数量每两年增加一倍的一种规律。\",\n        \"这很重要的，因为它使技术更经济实惠和方便。\"\n      ],\n      \"challengeSeed\": [\n        \"133182057\"\n      ],\n      \"tests\": [\n        [\n          \"芯片有晶体管，可存储1或0的小开关。\",\n          true\n        ],\n        [\n          \"穆尔定律是技术每年都在速度上加倍的规律。\",\n          false,\n          \"摩尔定律是芯片上的晶体管的数量每两年加倍的规律.\"\n        ],\n        [\n          \"摩尔定律这几年慢下来了\",\n          true,\n          \"截止2015年，摩尔定律确实慢下来了。英特尔(Intel)的(首席执行官)CEO，Brian Krzanich，宣布我们现在的节奏更接近于两年半而不是两年。'\"\n        ]\n      ],\n      \"type\": \"hike\",\n      \"challengeType\": 6\n    },\n    {\n      \"id\": \"bd7126d8c441eddfbeb5bddf\",\n      \"title\": \"Computer Basics: Intro to Binary Code\",\n      \"description\": [\n        \"二进制是什么，它意味着什么。\",\n        \"0和1可以转译为更复杂的数据。\",\n        \"今天我们要讨论一点二进制码。\",\n        \"二进制码是一种非常常见的计算机语言，它只能是1或0，也是on(开)或关，1代表on(开)，0代表off(关)。\",\n        \"这些1和0可以表示相当多的东西，但通常来说它们是数字，字母和符号。\",\n        \"我们要深入学习如何用二进制编码一个数字，但是就像你猜的那样，翻译二进制只要谷歌搜索一下就能完成。\",\n        \"最重要的是你要理解这个概念：即使是0和1这样简单的东西也可以翻译成很复杂的东西，这是现在所有计算机语言的基础。\"\n      ],\n      \"challengeSeed\": [\n        \"132542757\"\n      ],\n      \"tests\": [\n        [\n          \"0和1我们讨论小开关是on(开)还是off(关)的方式。\",\n          true\n        ],\n        [\n          \"1代表on(开)，0代表off(关)。\",\n          true\n        ],\n        [\n          \"有一些东西不能被转译成二进制码\",\n          false,\n          \"所有的东西都可以用二进制来表达！\"\n        ]\n      ],\n      \"type\": \"hike\",\n      \"challengeType\": 6\n    },\n    {\n      \"id\": \"bd7125d8c441eddfbeb5bddf\",\n      \"title\": \"Computer Basics: Decoding a Binary Number\",\n      \"description\": [\n        \"在这段视频中，我们用二进制来编码一个数字。\",\n        \"让我们来谈论二进制，也就是一堆一堆的0和1。\",\n        \"我们要从标记开始，向后看，有多少数字。\",\n        \"（在这个视频中是7，但是我们从0开始，所以我们得到了6。） 就是这么简单。\",\n        \"下一步就是要把2放到它发挥作用的地方：2到0，2到1，一直到最大的占位符。\",\n        \"接下来我们要做的就是填上几个数学题：2的指数问题。\",\n        \"如果是1我们，我们留下这个数字(2的指数解)并且把它加到其他 \\\"1\\\" 或是 \\\"on\\\" 数字。\",\n        \"如果是0，我们不要它。\",\n        \"在这个视频中，我们的数字累加到75。\"\n      ],\n      \"challengeSeed\": [\n        \"132543332\"\n      ],\n      \"tests\": [\n        [\n          \"1 === on(开) and 0 ===off(关)\",\n          true\n        ],\n        [\n          \"不是所有的数字都可以用二进制表达。\",\n          false,\n          \"所有的数字都可以！\"\n        ],\n        [\n          \"我们可以任意组合以二为底的幂来创建所有的数字。\",\n          true\n        ]\n      ],\n      \"type\": \"hike\",\n      \"challengeType\": 6\n    },\n    {\n      \"id\": \"bd7124d8c441eddfbeb5bddf\",\n      \"title\": \"Computer Basics: How To Measure Data Size\",\n      \"description\": [\n        \"数据的大小是如何衡量的呢, 我们从一个比特(bit)开始一直到10的15次方。\",\n        \"今天我们将学习数据大小。\",\n        \"最小的单位我们称之为1比特(bit)\",\n        \"比特(bit)只能是0或1, 也就是回到我们一直在学习的二进制。\",\n        \"之后, 我们得到了一个4比特(bit), 虽然不常见但也挺好的.\",\n        \"字节, 很常见, 8比特(bit).\",\n        \"很多东西都可以用二个字节来表示。\",\n        \"在我们有了微小的比特和较小的字节后，我们很快就可以获得更大的数字。\",\n        \"下一步是KB, 1024个字节, 或者8192个比特(bit).\",\n        \"之后是MB, 1024个字节的2次方。\",\n        \"之后就是GB了, 1024个字节的3次方； TB, 1024个字节的4次方, 和PB, 1024个字节的5次方。\",\n        \"这些越来越快的变大。\"\n      ],\n      \"challengeSeed\": [\n        \"132543959\"\n      ],\n      \"tests\": [\n        [\n          \"一字节是最小的数据。\",\n          false,\n          \"一个字节=8比特(bit)\"\n        ],\n        [\n          \"一比特是最小的数据。\",\n          true\n        ],\n        [\n          \"1KB=1024字节\",\n          true\n        ]\n      ],\n      \"type\": \"hike\",\n      \"challengeType\": 6\n    },\n    {\n      \"id\": \"bd7123d8c441eddfbeb5bddf\",\n      \"title\": \"Computer Basics: Measuring Data Speed\",\n      \"description\": [\n        \"测量数据的速度和数据大小是不同的。\",\n        \"这段视频涵盖了数据速率是怎么计算的。\",\n        \"我们来学习数据的速率。\",\n        \"数据速率不同于数据大小, 通常是计算每秒多少比特, 而大小是计算有多少比特。\",\n        \"一旦我们涉及到指数级，数据速率的表示就有了很大的不同\",\n        \"我们怎么讨论数据速率取决于我们在讨论的东西。\",\n        \"在音频下载中，我们使用KB/s\",\n        \"网速，我们使用MB/s\",\n        \"网络中, 我们用GB/s (十亿比特每秒!)。\",\n        \"这里主要选取方式是速度是按比特来计算而大小是按字节来计算。\",\n        \"此外，如果你看到你的网速有多少多少比特每秒，记住它永远比按你提到数据大小时的字节小8倍。\"\n      ],\n      \"challengeSeed\": [\n        \"132545171\"\n      ],\n      \"tests\": [\n        [\n          \"数据速率是按比特来计算的\",\n          true\n        ],\n        [\n          \"数据大小是按比特来计算的\",\n          false,\n          \"大小是按字节计算而速率是按比特来计算的。\"\n        ]\n      ],\n      \"type\": \"hike\",\n      \"challengeType\": 6\n    },\n    {\n      \"id\": \"bd7122d8c441eddfbeb5bddf\",\n      \"title\": \"Computer Basics: Binary Bytes\",\n      \"description\": [\n        \"二进制远不止表示数字 - 通过字节, 它可以表示所有字母数字符号, 通过编译成复杂的代码.\",\n        \"我们来学习最基础的部分-计算机如何理解其他语言如Javascript.\",\n        \"最基础的是一个比特，上或下，1或0The most basic thing is a bit, up or down, 1 or 0.\",\n        \"之后是一个字节，8比特。\",\n        \"所有数字 (255 及以下), 字母, 和符号 可以被转化成计算机所理解的字节。\",\n        \"所以，所有Javascript里的数字，字母，符号都可以被转化。\",\n        \"计算机可以处理很多语言，我所希望你从视频中获得的是所有计算机中的数据归根结底是二进制字节。\"\n      ],\n      \"challengeSeed\": [\n        \"132545417\"\n      ],\n      \"tests\": [\n        [\n          \"所有数字，字母和符号都有对应的二进制转化。\",\n          true\n        ],\n        [\n          \"记住这些转化是一种很好的做法。\",\n          false,\n          \"你只需要根据需要查阅就可以了。\"\n        ],\n        [\n          \"所有的东西都可以转化为为进制，包括图片，音乐，视频。\",\n          true\n        ]\n      ],\n      \"type\": \"hike\",\n      \"challengeType\": 6\n    },\n    {\n      \"id\": \"bd7121d8c441eddfbeb5bddf\",\n      \"title\": \"Computer Basics: Types of Computers\",\n      \"description\": [\n        \"这个视频涵盖了超级计算机，服务器，工作站，个人电脑，微控制器的基础部分。\",\n        \"让我们来看看这些不同类型的计算机。\",\n        \"最大的一个类型称为超级计算机, 一种使用并行处理的技术同时用很多CPU处理同一问题的计算机。\",\n        \"下一种类型叫做服务器。\",\n        \"服务器拥有并访问大量的数据或程序。\",\n        \"Free Code Camp 被托管在那样一种存储了所有信息的服务器上。\",\n        \"我们现在来谈谈工作站 - 一种和个人电脑非常相似的计算机, 但是更耗能且贵的多。\",\n        \"Toy Story(玩具总动员) 就是在工作站上制作的。\",\n        \"现在，个人电脑是迄今为止最常见的。\",\n        \"也许你听说过 \\\"我有一台Mac(苹果公司出品的家用台式机)!\\\" 或者是 \\\"我有一台PC(个人计算机)!\\\", 这些可以彰显他们的与众不同, 但是实际上我的MacBook(苹果公司出品的笔记本电脑)还是一台PC, 一个个人计算机。\",\n        \"他同时是Mac和PC。\",\n        \"最后一种类型的计算机我们称它微控制器， 一种可能你汽车里都有的计算机，它非常擅长处理小型的特定的任务但是不可以像个人计算机那样操作和使用。\"\n      ],\n      \"challengeSeed\": [\n        \"132546182\"\n      ],\n      \"tests\": [\n        [\n          \"最常见的计算机类型是个人计算机。\",\n          true\n        ],\n        [\n          \"使得超级计算机\\\"超级\\\"的原因是多个CPU可以同时处理一个问题，(这项技术)称为并行处理。\",\n          true\n        ],\n        [\n          \"微控制器和工作站可以执行大致相同的任务。\",\n          false,\n          \"微控制器只能执行小的特定的任务而工作站电脑很强大也很专业。\"\n        ]\n      ],\n      \"type\": \"hike\",\n      \"challengeType\": 6\n    },\n    {\n      \"id\": \"bd7120d8c441eddfbeb5bddf\",\n      \"title\": \"Computer Basics: More on the Motherboard\",\n      \"description\": [\n        \"更多关主板构成和个人计算机基本功能的细节。\",\n        \"现在我们要讨论更多关于主板的内容\",\n        \"我们在以前的视频中简短地提到过它，但是今天我们会提供更多的细节。\",\n        \"主板是处理器和内存之间的桥梁-如果它不这样做，它就不是一个主板。\",\n        \"但是大多数主板要比这个功能多的多。\",\n        \"主要是它们有扩展槽和接口。\",\n        \"扩展槽使你可以任意插入提高计算机性能的东西，而不需要让中央处理器负担更多。\",\n        \"举个例子，显卡和声卡可以提供更好的声音和更出色的显示效果从而显著提升用户体验，却不会拖慢电脑。\",\n        \"网卡也可以插进扩展槽。\",\n        \"这将有助于您的计算机连接网络，我们会在将来的视频中谈论更多。\",\n        \"PC和扩展卡在笔记本上很常见，并且扩展卡因为他们尺寸很小被合并到了主板上。\",\n        \"除了扩展槽，主板还有接口。\",\n        \"在电脑上，你会知道有一个地方链接USB，电源接口，SD卡，以太网，甚至是一个音频插孔来通过耳机听声音。\",\n        \"它们都是接口，主板上一个可以连接外源到CPU来获取或者给予信息的地方。\"\n      ],\n      \"challengeSeed\": [\n        \"132547285\"\n      ],\n      \"tests\": [\n        [\n          \"主板必须连接CPU，存储器和网卡。\",\n          false,\n          \"主板只要连接CPU和存储器就可以算作主板。\"\n        ],\n        [\n          \"扩展槽允许用户为计算机赋予能力。\",\n          true\n        ],\n        [\n          \"端口帮助计算机获取信息。\",\n          true\n        ]\n      ],\n      \"type\": \"hike\",\n      \"challengeType\": 6\n    },\n    {\n      \"id\": \"bd712fd8c441eddfbeb5bddf\",\n      \"title\": \"Computer Basics: Data Networks\",\n      \"description\": [\n        \"这个视频涵盖了局域网，广域网，虚拟专用网的基础部分。\",\n        \"在这个视频中，我们讨论数据网络。\",\n        \"你也许听说过网络，像水网，公路网，电话网，有线电视网等。\",\n        \"今天我们会讨论计算机所使用的网络-数据网络。\",\n        \"上面我们提到的三种类型是局域网(LAN)，广域网(WAN)，虚拟专用网(VPN)。\",\n        \"局域网就像是一小组计算机连接在了一起。\",\n        \"局域网最重要的是这些计算机离得很近。\",\n        \"所以，如果你在学校或者星巴克使用WiFi，如果你很接近的话你可能就在使用一个局域网。\",\n        \"广域网是两个，三个或者更多的局域网长距离的连接起来。\",\n        \"所以，也许在美国科罗拉多州的一所学校要想连接到密苏里的一所学校。\",\n        \"他们可以使用广域网。\",\n        \"你也许认为他们通过因特网(Internet)相连接，对于VPN来说(虚拟专用网，设计上和广域网相似)，你是对的。\",\n        \"但是，一个广域网通常租用来自因特网公司的电缆来创建连接。\"\n      ],\n      \"challengeSeed\": [\n        \"132547590\"\n      ],\n      \"tests\": [\n        [\n          \"你可以从一个很远的地方连接到局域网。\",\n          false,\n          \"连接到局域网一定要在空间上接近。\"\n        ],\n        [\n          \"VPN和WAN做的事同一件事。\",\n          true\n        ],\n        [\n          \"VPN和WAN都使用互联网来连接局域网\",\n          false,\n          \"同样是连接局域网，VPN使用互联网而WAN使用租用线路。\"\n        ]\n      ],\n      \"type\": \"hike\",\n      \"challengeType\": 6\n    },\n    {\n      \"id\": \"bd712ed8c441eddfbeb5bddf\",\n      \"title\": \"Computer Basics: IP Addresses\",\n      \"description\": [\n        \"每个设备都有一个IP地址。\",\n        \"IP地址是基于位置分配的，它对于互联网的正常工作至关重要。\",\n        \"我们要讨论因特网(Internet)的第一部分：因特网是如何工作的。\",\n        \"为了了解因特网是怎么工作的，我们需要先谈谈IP地址。\",\n        \"你可能已经习惯了每个设备都有它自己的IP地址，就像一个房子有它自己的地址一样。\",\n        \"如果一个设备没有IP地址因特网不能向它分发数据。\",\n        \"不止你的设备有，猫(modem)和路由器(router)也有，数据传输路上的每一步都有，我们之后会提到这些。\",\n        \"IP地址由位置所决定，起始于5个大型国际地区。\",\n        \"从左到右，数字意味着你的位置。\",\n        \"你告诉110你的IP地址， 他们没办法通过这组数字知道你住在哪里。\",\n        \"但是它足够明确到你可以Google \\\"我附近最好吃的冰棍\\\" 并且Google会给你靠近你住所地信息。\",\n        \"这就是通过IP地址做到的。\"\n      ],\n      \"challengeSeed\": [\n        \"132548071\"\n      ],\n      \"tests\": [\n        [\n          \"要参与到因特网中，IP地址是必须的。\",\n          true\n        ],\n        [\n          \"IP地址是基于位置分配的。\",\n          true\n        ]\n      ],\n      \"type\": \"hike\",\n      \"challengeType\": 6\n    },\n    {\n      \"id\": \"bd712dd8c441eddfbeb5bddf\",\n      \"title\": \"Computer Basics: How the Internet Works\",\n      \"description\": [\n        \"简单的回顾一下因特网是如何运作的\",\n        \"更深层次的理解, 请参考 <a href='http://web.stanford.edu/class/msande91si/www-spr04/readings/week1/InternetWhitepaper.htm' target='_blank'>web.stanford.edu/class/msande91si/www-spr04/readings/week1/InternetWhitepaper.htm</a>.\",\n        \"我们来多聊一些因特网是如何工作的。\",\n        \"我们已经知道了每个设备和路由器在互联网上有它自己的基于位置分配的IP地址。\",\n        \"使用这些IP地址，你的设备可以与您的调制解调器，然后到一个路由器，它是由Web服务设置。\",\n        \"路由器会去域名服务器，仍然只是发送请求。\",\n        \"该服务器将发回被请求的信息，它会回到您的设备。\",\n        \"你可能会认为这是岌岌可危的;如果一步出错，那么整个(传输)过程就完成了。\",\n        \"但实际上，有那么多的路由器和那么多条路线，即使一大块数据发送出去，也没有真正影响(因特网的)功能。\",\n        \"这真是太神奇了。\",\n        \"我希望你从这个视频中学到， 您的设备，因为它有一个IP地址，可以发送请求信息，然后那个信息会很快通过包括因特网在内的服务器和路由器返回给您。\",\n        \"现在，这个解释是非常简单的。\",\n        \"想要获取更多的信息, 参考 <a href='http://web.stanford.edu/class/msande91si/www-spr04/readings/week1/InternetWhitepaper.htm' target='_blank'>web.stanford.edu/class/msande91si/www-spr04/readings/week1/InternetWhitepaper.htm</a>.\"\n      ],\n      \"challengeSeed\": [\n        \"132548579\"\n      ],\n      \"tests\": [\n        [\n          \"您的计算机发送请求来获取信息。\",\n          true\n        ],\n        [\n          \"大量的路由和服务器的死机会造成因特网无法使用。\",\n          false,\n          \"因特网有那么多的连接即使是大量的路由器和服务器停止运作但是你的体验仍然不会受到影响。\"\n        ]\n      ],\n      \"type\": \"hike\",\n      \"challengeType\": 6\n    },\n    {\n      \"id\": \"bd712cd8c441eddfbeb5bddf\",\n      \"title\": \"Computer Basics: Software\",\n      \"description\": [\n        \"我们不仅区分硬件和软件，并且还讨论操作系统和应用软件之间的差异。\",\n        \"在这段视频中，我们将讨论软件的基础知识。\",\n        \"我们已经学习过了可以看得见摸得着的硬件。\",\n        \"软件是程序或在硬件上运行的程序。\",\n        \"软件是写入硬件的代码。\",\n        \"我们今天要讨论的的两种软件类型是操作系统和应用软件。\",\n        \"有三个主要的操作系统：Windows，Mac和Linux。\",\n        \"应用软件包括所有其他软件，如Web浏览器，游戏，还有像Photoshop，查看邮件，编辑文档的软件等。\"\n      ],\n      \"challengeSeed\": [\n        \"132548908\"\n      ],\n      \"tests\": [\n        [\n          \"Safari浏览器，Chrome浏览器和Firefox都是应用软件\",\n          true\n        ]\n      ],\n      \"type\": \"hike\",\n      \"challengeType\": 6\n    },\n    {\n      \"id\": \"56b15f15632298c12f31510f\",\n      \"title\": \"Computer Basics: Content Delivery Networks\",\n      \"description\": [\n        \"内容传递网络(CDN)是一种分布式服务器（网络），基于用户的地理位置向用户分发网页和其他Web内容，网页和内容分发服务器的起源。\",\n        \"CDN的目标是建立更高质量的网络连接。\",\n        \"CDNs通过为用户和用户目标站点之间建立快速通道或提供更快的建立在其他服务器上的镜像站点来达成目标。\",\n        \"这个概念和这种类型的服务不是创新型的想法，但是它正使互联网更加普及。\",\n        \"网站付费使用CDN服务，而CDN反过来you向因特网提供商付费来使用他们的服务和数据。\",\n        \"谷歌托管库就是一种CDNs -- <a href='http://developers.google.com/speed/libraries/#jquery' target='_blank'>developers.google.com/speed/libraries/#jquery</a>\",\n        \"谷歌托管那些(常用的)库，比起你自己(在自己的服务器上)部署这些库，你的用户就可以更快的访问到它。\",\n        \"有可能的话，用户浏览器甚至会存储已经访问过的网站的缓存。如果你不熟悉\\\"缓存\\\"这个名词,没关系，我们在之后的视频中会学习到的。\",\n        \"作为用户，你可能一直在用CDN而你却不知道。\",\n        \"作为开发人员，您可能需要使用像谷歌库一类的CDN来帮助你的页面加载更迅速。\",\n        \"作为一个公司，如果你希望你的公司能在用户的访问互联网时更有效快捷的访问到你，CDN非常游泳。\"\n      ],\n      \"challengeSeed\": [\n        \"139880437\"\n      ],\n      \"tests\": [\n        [\n          \"内容分发网络是你向互联网服务提供商付费，以提高您的网络连接质量而购买的服务。\",\n          false,\n          \"CDNs(内容分发网络)不是由ISP(因特网服务提供商)提供的，而是一种网站客户同样在ISP租用服务器更好得向用户传递原始网站的内容。\"\n        ],\n        [\n          \"CDN非常流行而且广泛使用，你可能作为网民一直在使用而很多时候甚至不知道它。但是，没有CDN服务你的体验就不可能那么快。\",\n          true\n        ]\n      ],\n      \"type\": \"hike\",\n      \"challengeType\": 6\n    },\n    {\n      \"id\": \"bd7129d80441eddfbeb5bddf\",\n      \"title\": \"Analog vs Digital and File Compression\",\n      \"description\": [\n        \"电脑如何将模拟声音转换成数字文件，以及正反数据压缩。\",\n        \"让我们学习非常基础的模拟与数字转换。\",\n        \"特别的是，我们将谈论如何计算机解释模拟声音，并把它变成一个数字文件。\",\n        \"一个模拟声波可能看起来像任何东西，但在这个例子中它是一条波浪线。\",\n        \"计算机采集和测量很多很多不同的点。把他们转化为数字。\",\n        \"这就是所谓的采样。\",\n        \"之后，计算机可以使用这些数字，并再次把它们变成声音。\",\n        \"我们再来学习数据压缩。\",\n        \"压缩的好处是，它是一个更小的文件：它更容易储存，它更容易发送给其他人，它只是占用更少的空间。\",\n        \"压缩声音的一种常用方法是以更低的频率采样。\",\n        \"另一种方式是，它从一个中点而不是0开始采样，所以所采集的数字更小。\",\n        \"在图像中，它是通过测量一组16个的像素来压缩，而不是独立的。\",\n        \"视频中减掉的部分是你想使用一个高质量的数字文件，但当你在压缩时，你需要决定压缩到何种程度以确保用户仍然有最好的体验。\"\n      ],\n      \"challengeSeed\": [\n        \"133182587\"\n      ],\n      \"tests\": [\n        [\n          \"模拟声音可以转换为数字文件，数字文件可以转换为模拟声音。\",\n          true\n        ],\n        [\n          \"压缩是不值得的，因为它降低质量。\",\n          false,\n          \"有时，压缩是一个好主意。这取决于你想要做什么，你的产品的最终目标是什么。\"\n        ]\n      ],\n      \"type\": \"hike\",\n      \"challengeType\": 6\n    },\n    {\n      \"id\": \"bd7129d8b441eddfbeb5bddf\",\n      \"title\": \"Routers and Packets\",\n      \"description\": [\n        \"在这段视频中，我们学习更多路由器和数据包，重要的概念的知识来理解因特网是如何工作的。\",\n        \"让我们来学习更多关于路由器和它们如何联网的知识。\",\n        \"路由器是连接不同的小范围网络的东西。\",\n        \"我想打个比方：我是一名教师，我在一所学校工作。\",\n        \"假如说我有一个包，并且我需要把它送给我在民政事务处工作的人。\",\n        \"我不知道她在哪里，我不知道她的办公室所在地，但我知道她的名字。\",\n        \"我找我的秘书，像我的第一台路由器，我说\\\"嘿，我需要找在民政事务处的某某，你能帮帮我吗？\\\"，她会说：\\\"当然，我不知道她的办公室准确位置，但我知道，下一步，我可以找到她所在的区域。\\\"\",\n        \"于是，她继续并将其它发送至到民政事务处的秘书，下一个路由器。\",\n        \"那秘书不知道我是谁或者我在哪里，但她看到包装上的名称，知道结束位置。\",\n        \"我想要去表达的是每个路由器只需要知道自己的小网，就在它旁边的站点。\",\n        \"它不必知道整个互联网，但只是它自己的连接。\",\n        \"它可以获取信息并说，好吧，我不知道确切位置这回事，但我会在正确的方向传递下去吧。\",\n        \"这就是它所需要做的事。\",\n        \"路由器可以是不同的尺寸，不同容量，但他们做的是知道自己的邻居，获得信息，并传递向正确的方向。\",\n        \"我们下一步需要学习的另一件事情是，路由器甚至不必须有完整的包的信息。\",\n        \"如果一台电脑正试图将信息发送到另一个时，数据可能会在不同的路由器之间分开，但是这没问题。\",\n        \"计算机仍然知道如何正确地把信息重新组合到一起。\",\n        \"所发送信息的小碎片被称为数据包。\",\n        \"包实际上是一小段二进制代码。\",\n        \"这是一个数据包的样子的示例，一段电流的视觉表示，计算机可以把它转化为1和0的，这就是我们所知道的二进制，可以代表任何数字数据。\",\n        \"这些小数据包通过路由器发送，并且如果一个文件是用一个信息包(发送)太大，它可以被分成帧（较小的小数据包）。\",\n        \"帧发送到目的地不必采用相同的路由。\",\n        \"他们可以决定哪个路由是开放的，取其速度最快，而且因为它们具有IP地址，所有的路由器知道从哪里发送。\",\n        \"一旦他们到达终点目的地，计算机知道如何把所有的信息重新拼合到一起。\"\n      ],\n      \"challengeSeed\": [\n        \"133181251\"\n      ],\n      \"tests\": [\n        [\n          \"路由器必须知道整个互联网。\",\n          false,\n          \"路由器只需要知道它们附近的站点并向正确的方向发送信息。\"\n        ],\n        [\n          \"包是二进制代码片段。\",\n          true\n        ],\n        [\n          \"包必须一整块发送。\",\n          false,\n          \"包可以被分成帧。\"\n        ]\n      ],\n      \"type\": \"hike\",\n      \"challengeType\": 6\n    },\n    {\n      \"id\": \"bd7029d8c441eddfbeb5bddf\",\n      \"title\": \"Source Code\",\n      \"description\": [\n        \"在这段视频中，我们讨论一下源代码，解释器和编译器，还有开源意味着什么。\",\n        \"让我们来谈谈源代码：源代码是什么，在哪里能看到它，计算机如何使它变得有意义。\",\n        \"源代码本身是程序员创建的文本文档：他们键入它，它的字母，数字和符号。\",\n        \"如果你把这个给别人，让他们看看在他们的电脑查看这个文档，这没法帮助他们查看电子邮件，它不是一个浏览器，它只是一个文本文档。\",\n        \"计算机必须有一种解释它的东西，并使一些有用的东西可以运行于它。\",\n        \"有两种主要的方法是这样做：无论是由一个解释器或编译器。\",\n        \"每个浏览器都有一个解释器，这就是JavaScript如何被处理的。\",\n        \"其他的语言，像C++，使用编译器。\",\n        \"与解释器不同的是，编译器将其所有的工作都放在了程序员的端上。\",\n        \"他们发送他们的包，他们的产品，它已经被编译，它已经可以在一台机器上运行。\",\n        \"然而，JavaScript，和其他的解释型语言，您只需编写JavaScript，用户端的浏览器有能力解释它所以你不需要编译它。\",\n        \"每个人对于哪个（翻译或编译器）更好都持自己的意见，但它们都有各自的优缺点，这个需要具体情况具体分析。\",\n        \"他们擅长于不同的方面。\",\n        \"现在，我们来看看开源意味着什么。\",\n        \"Free Code Camp 是开源的，这意味着所有的文档和源代码是开放的和可访问的。\",\n        \"你可能在想，“那有什么用？“，但最精彩的是，如果你想改变或改善FreeCodecamp，你可以写出你的改进，也许最终会实施成功。\",\n        \"这是很棒的方式，网站和软件以强大和快速的方式迭代，得益于社区合作，它们迅速的改善。\",\n        \"贡献开源项目的一条默认规则是你所提交的改进还是开源的并且可以被大众再次改进，你也允许其他人做改进。\"\n      ],\n      \"challengeSeed\": [\n        \"133177129\"\n      ],\n      \"tests\": [\n        [\n          \"源代码是文本文档。\",\n          true\n        ],\n        [\n          \"Javascript 是编译型语言。\",\n          false,\n          \"Javascript 是解释型语言。\"\n        ],\n        [\n          \"Free Code Camp 是开源的。\",\n          true\n        ]\n      ],\n      \"type\": \"hike\",\n      \"challengeType\": 6\n    },\n    {\n      \"id\": \"bd7119d8c441eddfbeb5bddf\",\n      \"title\": \"Variables In Code\",\n      \"description\": [\n        \"变量在Javascript和许多其他的编程语言频繁使用。\",\n        \"在这段视频中，我们将学习代码中的变量。\",\n        \"变量，就像在代数中，是一个字母或一个单词，它代表了别的东西。\",\n        \"就像我们写的 var x = \\\"Briana\\\". 当我们之后提到 \\\"x\\\" , 它就知道这是 Briana.\",\n        \"当我们写 console.log(x), 它就会输出 \\\"Briana\\\".\",\n        \"但是当心 - 如果我们写 console.log(\\\"x\\\"),  x 在双引号里, 它将会输出字符 \\\"x\\\".\",\n        \"我希望你从视频中学习到的是变量存在于代码中，你可以把任何小到一个字符串大到一个函数存储在里面，只要一个简单的名字。\"\n      ],\n      \"challengeSeed\": [\n        \"133172920\"\n      ],\n      \"tests\": [\n        [\n          \"变量如JavaScript的编程语言中非常有用。\",\n          true\n        ],\n        [\n          \"变量不能代表除了字符串，数字和布尔值之外的东西。\",\n          false,\n          \"变量可以代表从简单到复杂的任何东西。\"\n        ]\n      ],\n      \"type\": \"hike\",\n      \"challengeType\": 6\n    },\n    {\n      \"id\": \"bd712bd8c441eddfbeb5bddf\",\n      \"title\": \"What Do Programmers Do?\",\n      \"description\": [\n        \"程序员 (别称. 码农, 开发者, 或者是软件工程师) 通过把大的想法转换成计算机可以理解的小步骤来解决问题。\",\n        \"在这个视频中，我们讨论程序员是什么。\",\n        \"程序员也可以被称为码农, 开发者, 或者是软件工程师, 这些人做的事就是得到想法把他们转变为功能代码。\",\n        \"他们不仅创造代码，还维护代码。\",\n        \"让我们来看看电脑怎么理解代码，特别是JavaScript。\",\n        \"计算机一行一行的理解代码，并且当你在写代码的时候，你会注意到左边的行号。\",\n        \"计算机一行一行的接收代码，理解每一行所有表达的东西。\",\n        \"一切都是按顺序的，就是一直往下，所以引用一些下面的东西会引发错误。\",\n        \"计算机就像你看书一样一直向下读下来。\",\n        \"程序员就是那些负责把想法转化成小的一个步骤并且写成计算机可以理解的东西。\"\n      ],\n      \"challengeSeed\": [\n        \"133166912\"\n      ],\n      \"tests\": [\n        [\n          \"计算机一次只读一行代码。\",\n          true\n        ],\n        [\n          \"程序员和开发者是完全不同的职业。\",\n          false,\n          \"这些头衔很相似，他们描述的都是相同的工作岗位。\"\n        ],\n        [\n          \"程序员得到想法并把他们分解为小的计算机可以理解的步骤。\",\n          true\n        ]\n      ],\n      \"type\": \"hike\",\n      \"challengeType\": 6\n    },\n    {\n      \"id\": \"bd712ad8c441eddfbeb5bddf\",\n      \"title\": \"Console and Logging\",\n      \"description\": [\n        \"我们讨论控制台是什么(在哪)，为什么它很有用，并且展示一点它是如何工作的。\",\n        \"控制台: 它是什么，在哪能找到它，它用来干什么。\",\n        \"控制台常用于显示系统管理级的消息。\",\n        \"你的浏览器和计算机都有自己的控制台。\",\n        \"一旦你熟悉了它，你会发现这是一个非常有用和强大的工具。\",\n        \"在Javascript中，控制台用作调试并找出你的代码中的问题的好工具。\",\n        \"你需要记住的最重要的命令之一是\\\"console.log()\\\"。\",\n        \"这个命令行可以被放在代码的任意行来帮助你找到，识别和准确的修复特殊针对性的问题。\",\n        \"使用Chrome浏览器和Chrome控制台，如果我们输入\\\"console.log(\\\"Free Code Camp rocks!\\\");\\\"，控制台会显示\\\"Free Code Camp rocks!\\\"。\",\n        \"对数字，布尔值(真/假的状态)也有效。\",\n        \"当输出字符串时，一定要把它放在引号里，这样它才知道这是一个字符串。\"\n      ],\n      \"challengeSeed\": [\n        \"133170880\"\n      ],\n      \"tests\": [\n        [\n          \"控制台只服务于小的不必须的目标。\",\n          false,\n          \"控制台的主要目的是调试，是写代码中重要的一个步骤\"\n        ],\n        [\n          \"你可以输出字符串（一组单词），数字，和布尔值（真/假状态）。\",\n          true\n        ]\n      ],\n      \"type\": \"hike\",\n      \"challengeType\": 6,\n      \"nameEs\": \"Consola y Logging\"\n    },\n    {\n      \"id\": \"bd7129d89441eddfbeb5bddf\",\n      \"title\": \"Computer Security\",\n      \"description\": [\n        \"计算机安全以及如何确保保护你的信息的基础知识\",\n        \"让我们来介绍计算机的安全性。\",\n        \"我们要谈的第一件事就是所谓针对密码的字典攻击。\",\n        \"当创建您的密码，有些网站需要极其特殊和复杂的密码，这实际上是一个也不必要的。\",\n        \"他们想要保护你不受字典攻击的攻击。\",\n        \"字典攻击就是尝试字典里的每一个字词，或者是它自己数据库中的常见词汇和很多人使用过的密码\",\n        \"如果您的密码是Kangaroo，他们很可能进入您的帐户了。\",\n        \"大多数密码都没有这个简单的，但是，这并不重要。\",\n        \"他们只需要简单的密码就可以攻击巨量的账户。\",\n        \"在创建密码时，你想要使用不同的类型，数字和符号，但是最有效的方法之一是出现一些随机的字母（例如：kangarooSyCA67）。\",\n        \"当然，不要用序列号。\",\n        \"另一件需要当心的是网络钓鱼，是模仿其他正规站点的网页或者邮件，试图欺骗用户输入自己的个人信息，而它却没有连接到它所模仿的站点。\",\n        \"一般情况下，两种方式来保护免受这些攻击：在地址栏中查看网址，打开一个新的浏览器并转到它所声称的网站。\",\n        \"我们还要学习加密和HTTPS。\",\n        \"如果你是在星巴克试图访问您的银行帐户，您有理由怀疑有人能看到，并采集您的信息。\",\n        \"你会想在网址的开头寻找一个绿色的HTTPS而不是HTTP。\",\n        \"这意味着，你向该网站所发送的密码和其他信息都被加密，只有他们可以根据一串码解开的数据。\",\n        \"一般情况下，只要你显示的是私人或敏感信息，检查一下HTTPS。\",\n        \"其他一些提示：重要账户之间不要使用相同的代码。\",\n        \"如果您使用的网站被黑客侵入，密码再长也没用。\",\n        \"同样，不要下载奇怪的文件。\",\n        \"如果你下载的文件不是像.PDF，txt文件，JPG格式这样常见的文件类型，就要小心了。\",\n        \"你下载的一些文件非常厉害，它们甚至可以在后台运行。\",\n        \"最后，让你的软件更新，特别是联网的软件。\",\n        \"信息泄露的一种方式就是'坏人'发现了旧版本的漏洞并突破了安全系统。\",\n        \"这些漏洞在新版本中已经修复，如果你每个软件都保持更新，你可以避免很多问题。\",\n        \"这些都是你应该知道的关于如何保持您的计算机上的信息安全的最基本的东西。\"\n      ],\n      \"challengeSeed\": [\n        \"133186284\"\n      ],\n      \"tests\": [\n        [\n          \"你所有的账户的密码都应该相同。\",\n          false,\n          \"不要重用重要的密码。\"\n        ],\n        [\n          \"如果你不信任一个网站或电子邮件，打开一个新的浏览器并重新进入预定地址。\",\n          true\n        ],\n        [\n          \"保持软件更新，将有助于保护您的计算机和信息。\",\n          true\n        ]\n      ],\n      \"type\": \"hike\",\n      \"challengeType\": 6\n    }\n  ]\n}\n"
  },
  {
    "path": "seed/challenges/04-video-challenges/computer-science.json",
    "content": "{\n  \"name\": \"Computer Science\",\n  \"order\": 7,\n  \"time\": \"0 hours\",\n  \"isComingSoon\": true,\n  \"challenges\": [\n    {\n      \"id\": \"bd7128d8c441eddfbeb5bddc\",\n      \"title\": \"Learn Computer Science Challenges\",\n      \"description\": [],\n      \"challengeSeed\": [],\n      \"tests\": [],\n      \"type\": \"hike\",\n      \"challengeType\": 6,\n      \"nameEs\": \"Computer Science\"\n    }\n  ]\n}    "
  },
  {
    "path": "seed/challenges/04-video-challenges/data-visualization.json",
    "content": "{\n  \"name\": \"Data Visualization\",\n  \"order\": 8,\n  \"time\": \"0 hours\",\n  \"isComingSoon\": true,\n  \"challenges\": [\n    {\n      \"id\": \"bd7128d8c441eddfbeb5bdde\",\n      \"title\": \"Learn Data Visualization Challenges\",\n      \"description\": [],\n      \"challengeSeed\": [],\n      \"tests\": [],\n      \"type\": \"hike\",\n      \"challengeType\": 6,\n      \"nameEs\": \"Data Visualization\"\n    }\n  ]\n}    "
  },
  {
    "path": "seed/challenges/04-video-challenges/devops.json",
    "content": "{\n  \"name\": \"DevOps\",\n  \"order\": 16,\n  \"time\": \"0 hours\",\n  \"isComingSoon\": true,\n  \"challenges\": [\n    {\n      \"id\": \"bd7128d8c441eddfbeb5bdd5\",\n      \"title\": \"Learn DevOps Challenges\",\n      \"description\": [],\n      \"challengeSeed\": [],\n      \"tests\": [],\n      \"type\": \"hike\",\n      \"challengeType\": 6,\n      \"nameEs\": \"DevOps\"\n    }\n  ]\n}    "
  },
  {
    "path": "seed/challenges/04-video-challenges/dom.json",
    "content": "{\n  \"name\": \"The DOM\",\n  \"order\": 1,\n  \"time\": \"30 minutes\",\n  \"challenges\": [\n    {\n      \"id\": \"56b15f15632298c12f31518f\",\n      \"title\": \"The DOM: What's the Document Object Model?\",\n      \"description\": [\n        \"DOM 是浏览器的内部，网页的程序化称呼。JavaScript 允许你修改网页的 DOM 结构，因而你就无需编辑网站页面的 HTML。\",\n        \"从技术上讲，DOM 是一种 API（应用编程接口）。有许多类型的 API，但是 DOM 这种特定的 API 是与 XML 和 HTML 文档进行交互的。这是负责如何将这些文件被访问和操纵。\",        \n        \"真的，使用 DOM 你可以做很多事情，如果你已经在用 JS 和 jQuery 编写脚本，你已经在做了。\",\n        \"你可以插入新的东西，元素或者为已经存在的元素改变样式或内容。\",\n        \"这可以用原生的 JavaScript 中的 document.getElementById（id），element.getElementsByTagName（name），或使用 document.createElement（name）来对 DOM 进行操作。\",\n        \"你也可以使用 JS 库如 jQuery 来简化的，标准化和自动化的操纵 DOM，就像这样：$('#box2').append('This will be added to box2!')\"\n      ],\n      \"challengeSeed\": [\n        \"139879431\"\n      ],\n      \"tests\": [\n        [\n          \"The DOM is complex and difficult to access.\",\n          false,\n          \"The DOM is easily accessed and manipulated with JavaScript and jQuery.\"\n        ],\n        [\n          \"The DOM is an API that is a part of the browser.\",\n          true\n        ]\n      ],\n      \"type\": \"hike\",\n      \"challengeType\": 6\n    },\n    {\n      \"id\": \"56b15f15632298c12f31518e\",\n      \"title\": \"The DOM: Style in the Header, Script in the Footer\",\n      \"description\": [\n        \"也许你已经被告知了，链接样式表（CSS）应包含在网页的头部（head）和脚本（JS）链接应该包含在页脚。你是否问过自己，为什么要这样子做吗？\",\n        \"如果你见过，首先加载页面文本，然后再去加载格式和css样式的网页，那么你就见过那些，没有把样式（style）和脚本（script）放在正确的地方的网页。\",\n        \"这一切都取决于浏览器是如何判定是否加载了足够的信息来显示页面。这就是所谓的“DOMContentLoaded”事件：一旦事件发生，无论是加载完毕都将显示。\",\n        \"DOM 会告诉浏览器，一旦 HTML 被加载，它就已经准备好了，然而有时 CSS 和 JS 还没有进来。但是，如果你在头部放入 CSS 样式和在页脚中放入 JS 脚本，这样你就可以保证在 DOM 触发“DOMContentLoaded”事件之前，所有内容都将被载入，这个事件会把网页展示给用户。\",\n        \"这是一个简单的解释，因为大多数这些视频都是这样解释的。欲了解更多信息，这是我很喜欢的一个资源：<a href='http://ablogaboutcode.com/2011/06/14/how-javascript-loading-works-domcontentloaded-and-onload' target='_blank'>ablogaboutcode.com/2011/06/14/how-javascript-loading-works-domcontentloaded-and-onload</a>\"        \n      ],\n      \"challengeSeed\": [\n        \"139879984\"\n      ],\n      \"tests\": [\n        [\n          \"Placing the style in the header and the script in the footer ensures the page is loaded for the user as you want it to appear.\",\n          true\n        ],\n        [\n          \"The CSS link should go in the header and the JS link should go in the footer. If you don't do it just that way, the webpage will crash.\",\n          false,\n          \"The webpage won't necessarily crash, but it might load in an unattractive or dysfunctional way.\"\n        ]\n      ],\n      \"type\": \"hike\",\n      \"challengeType\": 6\n    }\n  ]\n}"
  },
  {
    "path": "seed/challenges/04-video-challenges/embedded-and-internet-of-things.json",
    "content": "{\n  \"name\": \"Embedded and Internet of Things\",\n  \"order\": 9,\n  \"time\": \"0 hours\",\n  \"isComingSoon\": true,\n  \"challenges\": [\n    {\n      \"id\": \"bd7128d8c441eddfbeb5bdda\",\n      \"title\": \"Learn Embedded and Internet of Things Challenges\",\n      \"description\": [],\n      \"challengeSeed\": [],\n      \"tests\": [],\n      \"type\": \"hike\",\n      \"challengeType\": 6,\n      \"nameEs\": \"Embedded and Internet of Things\"\n    }\n  ]\n}    "
  },
  {
    "path": "seed/challenges/04-video-challenges/game-development.json",
    "content": "{\n  \"name\": \"Game Development\",\n  \"order\": 10,\n  \"time\": \"0 hours\",\n  \"isComingSoon\": true,\n  \"challenges\": [\n    {\n      \"id\": \"bd7128d8c441eddfbeb5bdd0\",\n      \"title\": \"Learn Game Development Challenges\",\n      \"description\": [],\n      \"challengeSeed\": [],\n      \"tests\": [],\n      \"type\": \"hike\",\n      \"challengeType\": 6,\n      \"nameEs\": \"Game Development\"\n    }\n  ]\n}    "
  },
  {
    "path": "seed/challenges/04-video-challenges/gamification.json",
    "content": "{\n  \"name\": \"Gamification\",\n  \"order\": 12,\n  \"time\": \"0 hours\",\n  \"isComingSoon\": true,\n  \"challenges\": [\n    {\n      \"id\": \"bd7128d8c441eddfbeb5bdd9\",\n      \"title\": \"Learn Gamification Challenges\",\n      \"description\": [],\n      \"challengeSeed\": [],\n      \"tests\": [],\n      \"type\": \"hike\",\n      \"challengeType\": 6,\n      \"nameEs\": \"Gamification\"\n    }\n  ]\n}    "
  },
  {
    "path": "seed/challenges/04-video-challenges/jslingo.json",
    "content": "{\n  \"name\": \"JavaScript Lingo\",\n  \"order\": 2,\n  \"time\": \"1 hour\",\n  \"challenges\": [\n    {\n      \"id\": \"56b15f15632298c12f31518c\",\n      \"title\": \"JavaScript Lingo: MDN and Documentation\",\n      \"description\": [\n        \"这是一个关于 MDN 和文档概念的基本介绍。\",\n        \"MDN (Mozilla Developer Network) 是一个非常棒的开源项目, 里面不仅有 JavaScript 的相关文档, 还有其他语言和主题的文档. 如果你从没有听说过 MDN , 那么你现在应该去体验一下。 我从<a href='http://developer.mozilla.org/en-US/docs/Web/JavaScript' target='_blank'>developer.mozilla.org/en-US/docs/Web/JavaScript</a>中获得了不少帮助。\",\n        \"当我提到 文档 的时候, 我是指提供给用户的产品介绍. MDN  里的文档不完全是JS的开发人员写的. Brendan Eich 于1995年创造了 JS , 但是它现在已经成为一个社区驱动的项目，并且在不断发展。\",\n        \"当你继续学习 JavaScript, jQuery 或其他语言， 以及接触开发或编程服务时，, 文档都是你的好帮手。 \",\n        \"你查询文档的速度越快，效率越高, 你成为一个合格的开发者的速度也就越快。\",\n        \"这些视频并不是要教你 JavaScript - 而是要介绍给你一些随着你学习的深入会变得更有价值的东西。\"\n      ],\n      \"challengeSeed\": [\n        \"137072373\"\n      ],\n      \"tests\": [\n        [\n          \"文档不是一个学习一门编程语言的好方法。\",\n          false,\n          \"Documentation can be your best friend once you learn how to get the most from it.\",\n          \"当你学会充分利用文档的时候，你会发现它真的很有用。\"\n        ],\n        [\n          \"Mozilla Developer Network 是应该经常查阅的好资源。\",\n          true\n        ]\n      ],\n      \"type\": \"hike\",\n      \"challengeType\": 6\n    },\n    {\n      \"id\": \"56b15f15632298c12f31518d\",\n      \"title\": \"JavaScript Lingo: Value Types\",\n      \"description\": [\n        \"三个最基本的值的类型 booleans（布尔值）, strings（字符串）, and numbers（数值）。\",\n        \"布尔值包含 true （真） 或 false （假） 两种值。 这些字是特殊的并且是保留字。 你不能将一个变量命名为 'true', 因为它已经被普遍地用作了布尔值 ('false' 也一样)。\",\n        \"字符串是一串字符， 它被包含与 (') 或 双引号 (\\\")  中。 字符串可以被命名为 'true', 只要它在引号之中。\",\n        \"数值是自解释的 —— 一个数值是由数字组成的值, 即使它包含小数或者负号。\"\n      ],\n      \"challengeSeed\": [\n        \"137072769\"\n      ],\n      \"tests\": [\n        [\n          \"数值包含小数。\",\n          true\n        ],\n        [\n          \"如果一个值既不为真，也不为假，那么它是一个字符串。 \",\n          false,\n          \"字符串应该被包含在引号中间。\"\n        ]\n      ],\n      \"type\": \"hike\",\n      \"challengeType\": 6\n    },\n    {\n      \"id\": \"56b15f15632298c12f31518b\",\n      \"title\": \"JavaScript Lingo: Variables & camelCase\",\n      \"description\": [\n        \"接下来我们会讲到 变量 和 驼峰 拼写法 \",\n        \"一个变量(variables)，简写为'var',是布尔值、字符串、或其他静态信息的名字或者占位符。\",\n        \"你可以用谷歌开发工具来检查FCC主页并且寻找变量\",\n        \"你可以在变量前加入'var'来‘声明’它，并在接下来的脚本中引用它。\",\n        \"驼峰拼写法是 JavaScript 拼写字符的一种方式，它有很高的易读性。 单词的第一个字母是小写的, 单词中其他的字母也是, 但是每个连续单词的第一个字母都是大写的。中间没有空格。 例: brianaLovesHerPets, bestFoodIsCheese, and codeIsWorthLearning.\",\n        \"当你声明变量的时候， 使用驼峰拼写法。 并且让变量的命名尽可能的具有描述性和尽可能短，这样别人（还有你）才可以根据名字来判断一个变量是什么\"\n      ],\n      \"challengeSeed\": [\n        \"137078492\"\n      ],\n      \"tests\": [\n        [\n          \"驼峰拼写法在JavaScript中是强制性的。\",\n          false,\n          \"即使驼峰拼写法应用广泛，但它并不是强制性的。 尽早习惯使用驼峰拼写法也不是什么坏主意。\"\n        ],\n        [\n          \"变量只能包含 布尔值、字符串、或数值\",\n          false,\n          \"变量可以包含数组和对象在内的各种各样的静态值。\"\n        ]\n      ],\n      \"type\": \"hike\",\n      \"challengeType\": 6\n    },\n    {\n      \"id\": \"56b15f15632298c12f31518a\",\n      \"title\": \"JavaScript Lingo: Arrays & Objects\",\n      \"description\": [\n        \"如果你想在一个变量中储存多个信息, 你可以创建一个数组或对象。\",\n        \"**声明: JS 中的对象和其他语言中的对象并不完全一样。 我们将在这里讨论的是JS中的对象。\",\n        \"数组是储存在 [方括号]中的许多数据. 数据由逗号（，）分隔）. 数据可以是布尔值 、字符串、数值，甚至是其他数组。 我们称之为嵌套数组\",\n        \"对象是和数组一样可以以一定的顺序储存许多数据于一个变量中的数据类型。 你以前一定听说过 JSON （JavaScript Object Notation） , 当你向其他网站发起API请求时(请求得到信息来展示在你的页面上) 通常的返回格式都是JSON\",\n        \" JSON 的例子: var obj = {'name' : 'Briana', 'food' : 'cheese', 'dog' : 'Maurice'};\",\n        \"注意那个大括号, name 和 food 被称作‘键’,, 与之对应的则称为‘值’, 如 Briana 和 cheese. 它们都以字符串形式保存, 但是布尔值、数值和其他数据类型也可以\"\n      ],\n      \"challengeSeed\": [\n        \"137080554\"\n      ],\n      \"tests\": [\n        [\n          \"数组很容易辨别，它们包含于[方括号]中 \",\n          true\n        ],\n        [\n          \"JavaScript 语言中的对象与其他语言中的对象一样。\",\n          false,\n          \"JavaScript中的对象有一些轻微的不同, 但只要你理解了JS的上下文, 在你不想学习其他语言的情况下这就足够了。\"\n        ]\n      ],\n      \"type\": \"hike\",\n      \"challengeType\": 6\n    },\n    {\n      \"id\": \"56b15f15632298c12f315189\",\n      \"title\": \"JavaScript Lingo: Finding and Indexing Data in Arrays\",\n      \"description\": [\n        \"通常情况下，当你需要在许多数据中查找某个数据时，, 你可以通过索引来找到它。\",\n        \"我们现在不会介绍语法, 但是你应该知道数组中第一个值的索引为0.\",\n        \"这对字符串和对象来说也是， 这些索引都从0开始计数, 所以当你查询indexArr[2]时, 你会得到数组中的第三个值。\"\n      ],\n      \"challengeSeed\": [\n        \"137081193\"\n      ],\n      \"tests\": [\n        [\n          \"数组的第一个索引为1。\",\n          false,\n          \"数组的第一个索引为0.\"\n        ],\n        [\n          \"同一个数组中的数据类型必须相同，如：都为布尔值。\",\n          false,\n          \"数组可以包含各种不同的数据类型。\"\n        ]\n      ],\n      \"type\": \"hike\",\n      \"challengeType\": 6\n    },\n    {\n      \"id\": \"56b15f15632298c12f315188\",\n      \"title\": \"JavaScript Lingo: Manipulating Data\",\n      \"description\": [\n        \"方法和函数可以帮助你处理变量和其他数据。\",\n        \"方法是JavaScript中内置的, 当你在做 bonfires 的时候，会对这些更加熟悉。\",\n        \"我建议你通过 MDN (Mozilla Developer Network that we discussed in the first video) 来熟悉这些方法和其他一些功能。 <a href='http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Methods_Index' target='_blank'>developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Methods_Index</a>\",\n        \"例如 '.split(' ')'会返回一个字符串数组，并且可以通过多种方式来实现。 方法 是非常强大的- 许多时候，当你需要做某事的时候，总会有个方法来做这件事。\",\n        \"函数，比如：变量，是你定义并创建的东西。\",\n        \"在你在Free Code Camp中的算法实践中, 你会创建一个函数来接收数据并按你的想法处理它。\",\n        \"那时候，你会更熟悉语法， 但是现在，你只要记住，使用方法和函数，你可以做几乎任何事情。\"\n      ],\n      \"challengeSeed\": [\n        \"137081423\"\n      ],\n      \"tests\": [\n        [\n          \"当你想要做任何特定的事情的时候, 你应该在这之前先搜索一下是否有已经存在的方法可以做这件事。\",\n          true\n        ],\n        [\n          \"当编写你自己的函数的时候, 为了保持代码整洁，你应该尽可能少的使用方法。 \",\n          false,\n          \"方法被开发出来就是用来帮助你的， 当你需要的时候，就使用它们。\"\n        ]\n      ],\n      \"type\": \"hike\",\n      \"challengeType\": 6\n    },\n    {\n      \"id\": \"56b15f15632298c12f315187\",\n      \"title\": \"JavaScript Lingo: Math\",\n      \"description\": [\n        \"JS中有一个叫作 'Math' 的静态对象，包含许多内置的属性和方法。\",\n        \"当你在处理数值相关的时候，你会想要更深入的了解这些。 在编写你自己的函数之前，搜索一下 MDN 文档, 可能这些函数已经存在了。\",\n        \"例如： Math.random() 会返回指定范围内的一个随机数， 而 Math.round() 会把输入值转换为最接近的整数。\",\n        \"当我在做Free Code Camp 的前端项目the random quote generator的时候使用了 Math.random() \",\n        \"当你在处理数字的时候, 请记住JS有一个叫做'floating-point format'的有趣属性。\",\n        \"根据数值的数量、 数值的大小、 数值的计算, JS 的返回可能会有.00004的误差。\",\n        \"有一些办法可以解决它, 并且通常情况下，它并不会造成麻烦, 但是当你遇到一些莫名其妙的问题时你应该想到它。\"\n      ],\n      \"challengeSeed\": [\n        \"137081785\"\n      ],\n      \"tests\": [\n        [\n          \"当谈及JavaScript中的 Math 时, 所有的函数和方法会像它们在其他计算器上一样起作用。\",\n          false,\n          \"记住 'floating-point format'.\"\n        ],\n        [\n          \"'Math' 对象有许多特定的函数和方法。\",\n          true\n        ]\n      ],\n      \"type\": \"hike\",\n      \"challengeType\": 6\n    },\n    {\n      \"id\": \"56b15f15632298c12f315186\",\n      \"title\": \"JavaScript Lingo: Loops\",\n      \"description\": [\n        \"如果有一组数据, (我们将会以数组为例，但这并不是必须的,) 并且你想对数组中的每个元素应用相同的操作, 你可以使用循环\",\n        \"循环的语法对新手来说可能很复杂, 但是一旦你掌握它，它们会特别有用. 我在许多算法解决中应用了循环。\",\n        \"你不必理解这里的所有一切 - 只需要知道当你想要处理一组数据时，循环可以大幅度减少你的工作量就好。\"\n      ],\n      \"challengeSeed\": [\n        \"137082032\"\n      ],\n      \"tests\": [\n        [\n          \"循环只有一种\",\n          false,\n          \"有许多种循环来满足不同的需要。\"\n        ],\n        [\n          \"循环只能用来操作数组\",\n          false,\n          \"循环可以被应用于许多解决方案。\"\n        ]\n      ],\n      \"type\": \"hike\",\n      \"challengeType\": 6\n    },\n    {\n      \"id\": \"56b15f15632298c12f315185\",\n      \"title\": \"JavaScript Lingo: Regular Expressions\",\n      \"description\": [\n        \"正则（RegExp） 并不像JS中的其他东西一样, 它有陡峭的学习曲线\",\n        \"正则会是非常有用并且有效率的工具\",\n        \"使用正则，你可以匹配、替换、搜索和分离复杂字符串\",\n        \"如其他的视频一样, 我们不会注重细节, 但是我会介绍一些正则表达式来证明它们的价值。\",\n        \"当你想要创建一个注册页， 验证密码需要包含至少一个数字和大写字母, 你可以使用正则\",\n        \"当你想要确保输入页面的日期都是未来的有效日期, 你可以使用正则。\",\n        \"应用正则表达式的场合没有什么限制, 大多数情况下会在验证和自动编辑数据时使用。\"\n      ],\n      \"challengeSeed\": [\n        \"137082304\"\n      ],\n      \"tests\": [\n        [\n          \"正则表达式对处理字符串非常有用。 \",\n          true\n        ],\n        [\n          \"正则表达式是令人生畏的，如果你不喜欢它, 你可以尽量避免使用它。\",\n          false,\n          \"对正则有点耐心，对你自己也要有耐心。 它会帮助你减少你所需要写的代码量。\"\n        ]\n      ],\n      \"type\": \"hike\",\n      \"challengeType\": 6\n    }\n  ]\n}\n"
  },
  {
    "path": "seed/challenges/04-video-challenges/machine-learning.json",
    "content": "{\n  \"name\": \"Machine Learning\",\n  \"order\": 13,\n  \"time\": \"0 hours\",\n  \"isComingSoon\": true,\n  \"challenges\": [\n    {\n      \"id\": \"bd7128d8c441eddfbeb5bdd8\",\n      \"title\": \"Learn Machine Learning Challenges\",\n      \"description\": [],\n      \"challengeSeed\": [],\n      \"tests\": [],\n      \"type\": \"hike\",\n      \"challengeType\": 6,\n      \"nameEs\": \"Machine Learning\"\n    }\n  ]\n}    "
  },
  {
    "path": "seed/challenges/04-video-challenges/math-for-programmers.json",
    "content": "{\n  \"name\": \"Math for Programmers\",\n  \"order\": 14,\n  \"time\": \"0 hours\",\n  \"isComingSoon\": true,\n  \"challenges\": [\n    {\n      \"id\": \"bd7128d8c441eddfbeb5bdd7\",\n      \"title\": \"Learn Math for Programmers Challenges\",\n      \"description\": [],\n      \"challengeSeed\": [],\n      \"tests\": [],\n      \"type\": \"hike\",\n      \"challengeType\": 6,\n      \"nameEs\": \"Math for Programmers\"\n    }\n  ]\n}    "
  },
  {
    "path": "seed/challenges/04-video-challenges/mobile-javascript-development.json",
    "content": "{\n  \"name\": \"Mobile JavaScript Development\",\n  \"order\": 15,\n  \"time\": \"0 hours\",\n  \"isComingSoon\": true,\n  \"challenges\": [\n    {\n      \"id\": \"bd7128d8c441eddfbeb5bdd6\",\n      \"title\": \"Learn Mobile JavaScript Development Challenges\",\n      \"description\": [],\n      \"challengeSeed\": [],\n      \"tests\": [],\n      \"type\": \"hike\",\n      \"challengeType\": 6,\n      \"nameEs\": \"Mobile JavaScript Development\"\n    }\n  ]\n}    "
  },
  {
    "path": "seed/challenges/04-video-challenges/software-engineering-principles.json",
    "content": "{\n  \"name\": \"Software Engineering Principles\",\n  \"order\": 17,\n  \"time\": \"0 hours\",\n  \"isComingSoon\": true,\n  \"challenges\": [\n    {\n      \"id\": \"bd7128d8c441ecdfbeb5bdd5\",\n      \"title\": \"Learn Software Engineering Principles Challenges\",\n      \"description\": [],\n      \"challengeSeed\": [],\n      \"tests\": [],\n      \"type\": \"hike\",\n      \"challengeType\": 6,\n      \"nameEs\": \"Software Engineering Principles\"\n    }\n  ]\n}    "
  },
  {
    "path": "seed/challenges/04-video-challenges/statistics.json",
    "content": "{\n  \"name\": \"Statistics\",\n  \"order\": 18,\n  \"time\": \"0 hours\",\n  \"isComingSoon\": true,\n  \"challenges\": [\n    {\n      \"id\": \"bd7128d8c441eddfbeb5bdd4\",\n      \"title\": \"Learn Statistics Challenges\",\n      \"description\": [],\n      \"challengeSeed\": [],\n      \"tests\": [],\n      \"type\": \"hike\",\n      \"challengeType\": 6,\n      \"nameEs\": \"Statistics\"\n    }\n  ]\n}    "
  },
  {
    "path": "seed/challenges/04-video-challenges/tools.json",
    "content": "{\n  \"name\": \"Tools\",\n  \"order\": 19,\n  \"time\": \"0 hours\",\n  \"isComingSoon\": true,\n  \"challenges\": [\n    {\n      \"id\": \"bd7128d8c441eddfbeb5bdd3\",\n      \"title\": \"Learn Tools Challenges\",\n      \"description\": [],\n      \"challengeSeed\": [],\n      \"tests\": [],\n      \"type\": \"hike\",\n      \"challengeType\": 6,\n      \"nameEs\": \"Tools\"\n    }\n  ]\n}    "
  },
  {
    "path": "seed/challenges/04-video-challenges/user-experience-design.json",
    "content": "{\n  \"name\": \"User Experience Design\",\n  \"order\": 20,\n  \"time\": \"0 hours\",\n  \"isComingSoon\": true,\n  \"challenges\": [\n    {\n      \"id\": \"bd7128d8c441eddfbeb5bdd2\",\n      \"title\": \"Learn User Experience Design Challenges\",\n      \"description\": [],\n      \"challengeSeed\": [],\n      \"tests\": [],\n      \"type\": \"hike\",\n      \"challengeType\": 6,\n      \"nameEs\": \"User Experience Design\"\n    }\n  ]\n}    "
  },
  {
    "path": "seed/challenges/04-video-challenges/visual-design.json",
    "content": "{\n  \"name\": \"Visual Design\",\n  \"order\": 21,\n  \"time\": \"0 hours\",\n  \"isComingSoon\": true,\n  \"challenges\": [\n    {\n      \"id\": \"bd7128d8c441eddfbeb5bdd1\",\n      \"title\": \"Learn Visual Design Challenges\",\n      \"description\": [],\n      \"challengeSeed\": [],\n      \"tests\": [],\n      \"type\": \"hike\",\n      \"challengeType\": 6,\n      \"nameEs\": \"Visual Design\"\n    }\n  ]\n}    "
  },
  {
    "path": "seed/create-challenge-bundle.js",
    "content": "var fs = require('fs');\nvar getChallenges = require('./getChallenges');\n\nvar challengeSpecs = getChallenges();\n\nfs.writeFileSync('seed/challenge-bundle.json', JSON.stringify(challengeSpecs));\n"
  },
  {
    "path": "seed/get-challenge-completion.js",
    "content": "/* eslint-disable no-process-exit */\n\n/**\n * Data creation script for academic data pushes. Run this script with\n * node seed/get-challenge-completion.js >> ~/output.json\n * For large data sets supply the flag --max_old_space_size=2000000 to node.\n * Run from the root FCC directory. Beware, this will generate a very large file\n * if you have a large user collection such as the production mongo db.\n*/\n\nrequire('dotenv').load();\nvar secrets = require('../config/secrets'),\n    mongodb = require('mongodb'),\n    MongoClient = mongodb.MongoClient;\n\nMongoClient.connect(secrets.db, function(err, database) {\n  if (err) {\n    throw err;\n  }\n  var firstTime = true;\n\n  var stream = database.collection('user')\n        .find({'completedChallenges': { $ne: null },\n               'isLocked': { $ne: true } },\n              {'completedChallenges': true})\n        .stream();\n  console.log('[');\n  stream.on('data', function(results) {\n    if (!results.completedChallenges) {\n      // dud\n    } else {\n      var dataOut = [];\n      results.completedChallenges.forEach(function(challenge) {\n        dataOut.push({\n          name: challenge.name,\n          completedDate: challenge.completedDate,\n          solution: challenge.solution\n        });\n      });\n      if (dataOut.length) {\n        if (!firstTime) {\n          console.log(',' + JSON.stringify(dataOut));\n        } else {\n          firstTime = false;\n          console.log(JSON.stringify(dataOut));\n        }\n      }\n    }\n  }).on('end', function() {\n    console.log(']');\n    process.exit(0);\n  });\n});\n"
  },
  {
    "path": "seed/get-emails.js",
    "content": "/* eslint-disable no-process-exit */\nrequire('dotenv').load();\nvar secrets = require('../config/secrets'),\n    mongodb = require('mongodb'),\n    MongoClient = mongodb.MongoClient;\n\nMongoClient.connect(secrets.db, function(err, database) {\n  if (err) {\n    throw err;\n  }\n\n  database.collection('user').aggregate([\n    {$match: { 'email': { $exists: true } } },\n    {$match: { 'email': { $ne: '' } } },\n    {$match: { 'email': { $ne: null } } },\n    {$match: { 'sendMonthlyEmail': true } },\n    {$match: { 'email': { $not: /(test|fake)/i } } },\n    {$group: { '_id': 1, 'emails': {$addToSet: '$email' } } }\n  ], function(err, results) {\n    if (err) { throw err; }\n\n    console.log('\\\"email\\\"\\n\\\"' + results[0].emails.join('\\\"\\n\\\"') + '\\\"');\n    process.exit(0);\n  });\n});\n"
  },
  {
    "path": "seed/getChallenges.js",
    "content": "/* eslint-disable no-self-compare */\nvar fs = require('fs');\nvar path = require('path');\n\nfunction getFilesFor(dir) {\n  return fs.readdirSync(path.join(__dirname, '/' + dir))\n    .map(function(file) {\n      let superBlock;\n      if (fs.statSync(path.join(__dirname, dir + '/' + file)).isFile()) {\n        return { file: file };\n      }\n      superBlock = file;\n      return getFilesFor(dir + '/' + superBlock)\n        .map(function(data) {\n          return {\n            file: superBlock + '/' + data.file,\n            superBlock: superBlock\n          };\n        });\n    })\n    .reduce(function(files, file) {\n      if (!Array.isArray(file)) {\n        files.push(file);\n        return files;\n      }\n      return files.concat(file);\n    }, []);\n}\n\nfunction getSupOrder(filePath) {\n  var order = parseInt((filePath || '').split('-')[0], 10);\n  // check for NaN\n  if (order !== order) {\n    return 0;\n  }\n  return order;\n}\n\nfunction getSupName(filePath) {\n  var order = parseInt((filePath || '').split('-')[0], 10);\n  // check for NaN\n  if (order !== order) {\n    return filePath;\n  }\n\n  return (filePath || '').split('-').splice(1).join('-');\n}\n\nmodule.exports = function getChallenges() {\n  try {\n    return getFilesFor('challenges')\n      .map(function(data) {\n        var challengeSpec = require('./challenges/' + data.file);\n        challengeSpec.fileName = data.file;\n        challengeSpec.superBlock = getSupName(data.superBlock);\n        challengeSpec.superOrder = getSupOrder(data.superBlock);\n\n        return challengeSpec;\n      });\n  } catch (e) {\n    console.log('error', e);\n    return [];\n  }\n};\n"
  },
  {
    "path": "seed/index.js",
    "content": "/* eslint-disable no-process-exit */\nrequire('babel-register');\nrequire('dotenv').load();\nvar adler32 = require('adler32');\n\nvar Rx = require('rx'),\n    _ = require('lodash'),\n    getChallenges = require('./getChallenges'),\n    app = require('../server/server');\n\n\nvar Challenge = app.models.Challenge;\nvar destroy = Rx.Observable.fromNodeCallback(Challenge.destroyAll, Challenge);\nvar create = Rx.Observable.fromNodeCallback(Challenge.create, Challenge);\n\ndestroy()\n  .flatMap(function() { return Rx.Observable.from(getChallenges()); })\n  .flatMap(function(challengeSpec) {\n    var order = challengeSpec.order;\n    var block = challengeSpec.name;\n    var superBlock = challengeSpec.superBlock;\n    var superOrder = challengeSpec.superOrder;\n    var isBeta = !!challengeSpec.isBeta;\n    var isComingSoon = !!challengeSpec.isComingSoon;\n    var fileName = challengeSpec.fileName;\n    var helpRoom = challengeSpec.helpRoom || 'chinese';\n\n    console.log('parsed %s successfully', block);\n\n    // challenge file has no challenges...\n    if (challengeSpec.challenges.length === 0) {\n      return Rx.Observable.just([{ block: 'empty ' + block }]);\n    }\n\n    var challenges = challengeSpec.challenges\n      .map(function(challenge, index) {\n        challenge.name = challenge.title.replace(/[^a-zA-Z0-9\\s]/g, '');\n\n        challenge.dashedName = challenge.name\n          .toLowerCase()\n          .replace(/\\:/g, '')\n          .replace(/\\s/g, '-');\n\n        challenge.checksum = adler32.sum(\n          Buffer(challenge.title +\n            JSON.stringify(challenge.description) +\n            JSON.stringify(challenge.challengeSeed) +\n            JSON.stringify(challenge.tests)));\n\n        challenge.fileName = fileName;\n        challenge.helpRoom = helpRoom;\n        challenge.order = order;\n        challenge.suborder = index + 1;\n        challenge.block = block;\n        challenge.isBeta = challenge.isBeta || isBeta;\n        challenge.isComingSoon = challenge.isComingSoon || isComingSoon;\n        challenge.time = challengeSpec.time;\n        challenge.superOrder = superOrder;\n        challenge.superBlock = superBlock\n          .split('-')\n          .map(function(word) {\n            return _.capitalize(word);\n          })\n          .join(' ');\n\n        return challenge;\n      });\n\n    return create(challenges);\n  })\n  .subscribe(\n    function(challenges) {\n      console.log('%s successfully saved', challenges[0].block);\n    },\n    function(err) { throw err; },\n    function() {\n      console.log('challenge seed completed');\n      process.exit(0);\n    }\n  );\n"
  },
  {
    "path": "seed/loopbackMigration.js",
    "content": "/* eslint-disable no-process-exit */\nrequire('dotenv').load();\nvar Rx = require('rx'),\n  uuid = require('node-uuid'),\n  assign = require('lodash/object/assign'),\n  mongodb = require('mongodb'),\n  secrets = require('../config/secrets');\n\nconst batchSize = 20;\nvar MongoClient = mongodb.MongoClient;\nRx.config.longStackSupport = true;\n\nvar providers = [\n  'facebook',\n  'twitter',\n  'google',\n  'github',\n  'linkedin'\n];\n\n// create async console.logs\nfunction debug() {\n  var args = [].slice.call(arguments);\n  process.nextTick(function() {\n    console.log.apply(console, args);\n  });\n}\n\nfunction createConnection(URI) {\n  return Rx.Observable.create(function(observer) {\n    debug('connecting to db');\n    MongoClient.connect(URI, function(err, database) {\n      if (err) {\n        return observer.onError(err);\n      }\n      debug('db connected');\n      observer.onNext(database);\n      observer.onCompleted();\n    });\n  });\n}\n\nfunction createQuery(db, collection, options, batchSize) {\n  return Rx.Observable.create(function(observer) {\n    var cursor = db.collection(collection).find({}, options);\n    cursor.batchSize(batchSize || 20);\n    // Cursor.each will yield all doc from a batch in the same tick,\n    // or schedule getting next batch on nextTick\n    debug('opening cursor for %s', collection);\n    cursor.each(function(err, doc) {\n      if (err) {\n        return observer.onError(err);\n      }\n      if (!doc) {\n        console.log('onCompleted');\n        return observer.onCompleted();\n      }\n      observer.onNext(doc);\n    });\n\n    return Rx.Disposable.create(function() {\n      debug('closing cursor for %s', collection);\n      cursor.close();\n    });\n  });\n}\n\nfunction getUserCount(db) {\n  return Rx.Observable.create(function(observer) {\n    var cursor = db.collection('users').count(function(err, count) {\n      if (err) {\n        return observer.onError(err);\n      }\n      observer.onNext(count);\n      observer.onCompleted();\n\n      return Rx.Disposable.create(function() {\n        debug('closing user count');\n        cursor.close();\n      });\n    });\n  });\n}\n\nfunction insertMany(db, collection, users, options) {\n  return Rx.Observable.create(function(observer) {\n    db.collection(collection).insertMany(users, options, function(err) {\n      if (err) {\n        return observer.onError(err);\n      }\n      observer.onNext();\n      observer.onCompleted();\n    });\n  });\n}\n\nvar count = 0;\n// will supply our db object\nvar dbObservable = createConnection(secrets.db).replay();\n\nvar totalUser = dbObservable\n  .flatMap(function(db) {\n    return getUserCount(db);\n  })\n  .shareReplay();\n\nvar users = dbObservable\n  .flatMap(function(db) {\n    // returns user document, n users per loop where n is the batchsize.\n    return createQuery(db, 'users', {}, batchSize);\n  })\n  .map(function(user) {\n    // flatten user\n    assign(user, user.portfolio, user.profile);\n    if (!user.username) {\n      user.username = 'fcc' + uuid.v4().slice(0, 8);\n    }\n    if (user.github) {\n      user.isGithubCool = true;\n    } else {\n      user.isMigrationGrandfathered = true;\n    }\n    providers.forEach(function(provider) {\n      user[provider + 'id'] = user[provider];\n      user[provider] = null;\n    });\n    user.rand = Math.random();\n\n    return user;\n  })\n  .shareReplay();\n\n// batch them into arrays of twenty documents\nvar userSavesCount = users\n  .bufferWithCount(batchSize)\n  // get bd object ready for insert\n  .withLatestFrom(dbObservable, function(users, db) {\n    return {\n      users: users,\n      db: db\n    };\n  })\n  .flatMap(function(dats) {\n    // bulk insert into new collection for loopback\n    return insertMany(dats.db, 'user', dats.users, { w: 1 });\n  })\n  .flatMap(function() {\n    return totalUser;\n  })\n  .doOnNext(function(totalUsers) {\n    count = count + batchSize;\n    debug('user progress %s', count / totalUsers * 100);\n  })\n  // count how many times insert completes\n  .count();\n\n// create User Identities\nvar userIdentityCount = users\n  .flatMap(function(user) {\n    var ids = providers\n      .map(function(provider) {\n        return {\n          provider: provider,\n          externalId: user[provider + 'id'],\n          userId: user._id || user.id\n        };\n      })\n      .filter(function(ident) {\n        return !!ident.externalId;\n      });\n\n    return Rx.Observable.from(ids);\n  })\n  .bufferWithCount(batchSize)\n  .withLatestFrom(dbObservable, function(identities, db) {\n    return {\n      identities: identities,\n      db: db\n    };\n  })\n  .flatMap(function(dats) {\n    // bulk insert into new collection for loopback\n    return insertMany(dats.db, 'userIdentity', dats.identities, { w: 1 });\n  })\n  // count how many times insert completes\n  .count();\n\n/*\nvar storyCount = dbObservable\n  .flatMap(function(db) {\n    return createQuery(db, 'stories', {}, batchSize);\n  })\n  .bufferWithCount(batchSize)\n  .withLatestFrom(dbObservable, function(stories, db) {\n    return {\n      stories: stories,\n      db: db\n    };\n  })\n  .flatMap(function(dats) {\n    return insertMany(dats.db, 'story', dats.stories, { w: 1 });\n  })\n  .count();\n  */\n\nRx.Observable.combineLatest(\n  userIdentityCount,\n  userSavesCount,\n  // storyCount,\n  function(userIdentCount, userCount) {\n    return {\n      userIdentCount: userIdentCount * batchSize,\n      userCount: userCount * batchSize\n      // storyCount: storyCount * batchSize\n    };\n  })\n  .subscribe(\n    function(countObj) {\n      console.log('next');\n      count = countObj;\n    },\n    function(err) {\n      console.error('an error occured', err, err.stack);\n    },\n    function() {\n      console.log('finished with ', count);\n      process.exit(0);\n    }\n  );\n\ndbObservable.connect();\n"
  },
  {
    "path": "seed/test-challenges.js",
    "content": "/* eslint-disable no-eval, no-process-exit */\nimport _ from 'lodash';\nimport { Observable } from 'rx';\nimport tape from 'tape';\nimport getChallenges from './getChallenges';\n\n\nfunction createIsAssert(t, isThing) {\n  const { assert } = t;\n  return function() {\n    const args = [...arguments];\n    args[0] = isThing(args[0]);\n    assert.apply(t, args);\n  };\n}\n\nfunction fillAssert(t) {\n  const assert = t.assert;\n\n  assert.isArray = createIsAssert(t, _.isArray);\n  assert.isBoolean = createIsAssert(t, _.isBoolean);\n  assert.isString = createIsAssert(t, _.isString);\n  assert.isNumber = createIsAssert(t, _.isNumber);\n  assert.isUndefined = createIsAssert(t, _.isUndefined);\n\n  assert.deepEqual = t.deepEqual;\n  assert.equal = t.equal;\n  assert.strictEqual = t.equal;\n\n  assert.sameMembers = function sameMembers() {\n    const [ first, second, ...args] = arguments;\n    assert.apply(\n      t,\n      [\n        _.difference(first, second).length === 0 &&\n        _.difference(second, first).length === 0\n      ].concat(args)\n    );\n  };\n\n  assert.includeMembers = function includeMembers() {\n    const [ first, second, ...args] = arguments;\n    assert.apply(t, [_.difference(second, first).length === 0].concat(args));\n  };\n\n  assert.match = function match() {\n    const [value, regex, ...args] = arguments;\n    assert.apply(t, [regex.test(value)].concat(args));\n  };\n\n  return assert;\n}\n\nfunction createTest({\n  title,\n  tests = [],\n  solutions = [],\n  head = [],\n  tail = []\n}) {\n  solutions = solutions.filter(solution => !!solution);\n  tests = tests.filter(test => !!test);\n  head = head.join('\\n');\n  tail = tail.join('\\n');\n  const plan = tests.length;\n  if (!plan) {\n    return Observable.just({\n      title,\n      type: 'missing'\n    });\n  }\n\n  return Observable.fromCallback(tape)(title)\n    .doOnNext(t => solutions.length ? t.plan(plan) : t.end())\n    .flatMap(t => {\n      if (solutions.length <= 0) {\n        t.comment('No solutions for ' + title);\n        return Observable.just({\n          title,\n          type: 'missing'\n        });\n      }\n\n\n      return Observable.just(t)\n        .map(fillAssert)\n        /* eslint-disable no-unused-vars */\n        // assert and code used within the eval\n        .doOnNext(assert => {\n          solutions.forEach(solution => {\n            tests.forEach(test => {\n              const code = solution;\n              const editor = { getValue() { return code; } };\n              /* eslint-enable no-unused-vars */\n              try {\n                (() => {\n                  return eval(\n                    head + '\\n;;' +\n                    solution + '\\n;;' +\n                    tail + '\\n;;' +\n                    test);\n                })();\n              } catch (e) {\n                t.fail(e);\n              }\n            });\n          });\n        })\n        .map(() => ({ title }));\n    });\n}\n\nObservable.from(getChallenges())\n  .flatMap(challengeSpec => {\n    return Observable.from(challengeSpec.challenges);\n  })\n  .flatMap(challenge => {\n    return createTest(challenge);\n  })\n  .map(({ title, type }) => {\n    if (type === 'missing') {\n      return title;\n    }\n    return false;\n  })\n  .filter(title => !!title)\n  .toArray()\n  .subscribe(\n    (noSolutions) => {\n      console.log(\n        '# These challenges have no solutions\\n- [ ] ' +\n          noSolutions.join('\\n- [ ] ')\n      );\n    },\n    err => { throw err; },\n    () => process.exit(0)\n  );\n\n"
  },
  {
    "path": "server/README.md",
    "content": "Everything to do with the server.\n\nOne file that is not tracked here is `rev-manifest.json`.\nIt is generated at runtime and its contents changes as the contents\nof client side files change.\n"
  },
  {
    "path": "server/boot/a-extendUser.js",
    "content": "import { Observable } from 'rx';\nimport debugFactory from 'debug';\n\nconst debug = debugFactory('fcc:user:remote');\n\nfunction destroyAllRelated(id, Model) {\n  return Observable.fromNodeCallback(\n    Model.destroyAll,\n    Model\n  )({ userId: id });\n}\n\nmodule.exports = function(app) {\n  var User = app.models.User;\n  var UserIdentity = app.models.UserIdentity;\n  var UserCredential = app.models.UserCredential;\n  var Email = app.models.Email;\n  console.log(Email.send);\n  User.observe('before delete', function(ctx, next) {\n    debug('removing user', ctx.where);\n    var id = ctx.where && ctx.where.id ? ctx.where.id : null;\n    if (!id) {\n      return next();\n    }\n    return Observable.combineLatest(\n      destroyAllRelated(id, UserIdentity),\n      destroyAllRelated(id, UserCredential),\n      function(identData, credData) {\n        return {\n          identData: identData,\n          credData: credData\n        };\n      }\n    )\n      .subscribe(\n        function(data) {\n          debug('deleted', data);\n        },\n        function(err) {\n          debug('error deleting user %s stuff', id, err);\n          next(err);\n        },\n        function() {\n          debug('user stuff deleted for user %s', id);\n          next();\n        }\n      );\n  });\n\n  // set email varified false on user email signup\n  // should not be set with oauth signin methods\n  User.beforeRemote('create', function(ctx, user, next) {\n    var body = ctx.req.body;\n    if (body) {\n      body.emailVerified = false;\n    }\n    next();\n  });\n\n  // send welcome email to new camper\n  User.afterRemote('create', function({ req, res }, user, next) {\n    debug('user created, sending email');\n    if (!user.email) { return next(); }\n    const redirect = req.session && req.session.returnTo ?\n      req.session.returnTo :\n      '/';\n      console.log(redirect);\n    console.log(user.email);\n    var mailOptions = {\n      type: 'email',\n      to: user.email,\n      from: 'team@freecodecamp.cn',\n      subject: '欢迎来到FreeCodeCamp!',\n      redirect: '/',\n      text: [\n        '来自加利福利亚州的问候!\\n\\n',\n        '谢谢您加入我们的社区。\\n',\n        '在你使用FreeCodeCamp的过程中有任何问题，都可以给我们发邮件。\\n',\n        '如果你有空，可以添加我们的微信公众号： ',\n        'freecodecamp\\n\\n',\n        '祝您闯关愉快!\\n\\n',\n        '- the Free Code Camp Team'\n      ].join('')\n    };\n\n    debug('sending welcome email');\n    return Email.send(mailOptions, function(err) {\n      if (err) { console.log(err); return next(err); }\n      return req.logIn(user, function(err) {\n        if (err) { console.log(err); return next(err); }\n\n        req.flash('success', {\n          msg: [ '欢迎来到Free Code Camp!我们已经为您创建好了账户。' ]\n        });\n        return res.redirect(redirect);\n      });\n    });\n  });\n};\n"
  },
  {
    "path": "server/boot/a-extendUserIdent.js",
    "content": "import { Observable } from 'rx';\nimport debugFactory from 'debug';\nimport dedent from 'dedent';\n\nimport { observeMethod, observeQuery } from '../utils/rx';\nimport { getSocialProvider } from '../utils/auth';\n\nconst debug = debugFactory('fcc:userIdent');\n\nexport default function({ models }) {\n  const { User, UserIdentity, UserCredential } = models;\n  const findUserById = observeMethod(User, 'findById');\n  const findIdent = observeMethod(UserIdentity, 'findOne');\n\n  UserIdentity.link = function(\n    userId,\n    provider,\n    authScheme,\n    profile,\n    credentials,\n    options = {},\n    cb\n  ) {\n    if (typeof options === 'function' && !cb) {\n      cb = options;\n      options = {};\n    }\n    const user$ = findUserById(userId);\n    const query = {\n      where: {\n        provider: getSocialProvider(provider),\n        externalId: profile.id\n      }\n    };\n\n    debug('link identity query', query);\n    findIdent(query)\n      .flatMap(identity => {\n        const modified = new Date();\n        if (!identity) {\n          return observeQuery(UserIdentity, 'create', {\n            provider: getSocialProvider(provider),\n            externalId: profile.id,\n            authScheme,\n            profile,\n            credentials,\n            userId,\n            created: modified,\n            modified\n          });\n        }\n        if (identity.userId.toString() !== userId.toString()) {\n          return Observable.throw(\n            new Error(\n              dedent`\nYour GitHub is already associated with another account.\nYou may have accidentally created a duplicate account.\nNo worries, though. We can fix this real quick.\nPlease email us with your GitHub username: team@freecodecamp.com.\n              `.split('/n').join(' ')\n            )\n          );\n        }\n        identity.credentials = credentials;\n        return observeQuery(identity, 'updateAttributes', {\n          profile,\n          credentials,\n          modified\n        });\n      })\n      .withLatestFrom(user$, (identity, user) => ({ identity, user }))\n      .subscribe(\n        ({ identity, user }) => {\n          cb(null, user, identity);\n        },\n        cb\n      );\n  };\n\n  UserCredential.link = UserIdentity.link.bind(UserIdentity);\n}\n"
  },
  {
    "path": "server/boot/a-react.js",
    "content": "import React from 'react';\nimport { RouterContext } from 'react-router';\nimport debug from 'debug';\n\nimport renderToString from '../../common/app/utils/render-to-string';\nimport provideStore from '../../common/app/provide-store';\n\nimport app$ from '../../common/app';\n\nconst log = debug('fcc:react-server');\n\n// add routes here as they slowly get reactified\n// remove their individual controllers\nconst routes = [\n  '/jobs',\n  '/jobs/*',\n  '/videos',\n  '/videos/*'\n];\n\nconst devRoutes = [];\n\nexport default function reactSubRouter(app) {\n  var router = app.loopback.Router();\n\n  // These routes are in production\n  routes.forEach((route) => {\n    router.get(route, serveReactApp);\n  });\n\n  if (process.env.NODE_ENV === 'development') {\n    devRoutes.forEach(function(route) {\n      router.get(route, serveReactApp);\n    });\n  }\n\n  app.use(router);\n\n  function serveReactApp(req, res, next) {\n    const serviceOptions = { req };\n    app$({\n      location: req.path,\n      serviceOptions\n    })\n      // if react-router does not find a route send down the chain\n      .filter(({ redirect, props }) => {\n        if (!props && redirect) {\n          res.redirect(redirect.pathname + redirect.search);\n        }\n        if (!props) {\n          log(`react tried to find ${location.pathname} but got 404`);\n          return next();\n        }\n        return !!props;\n      })\n      .flatMap(({ props, store }) => {\n        log('render react markup and pre-fetch data');\n\n        return renderToString(\n          provideStore(React.createElement(RouterContext, props), store)\n        )\n          .map(({ markup }) => ({ markup, store }));\n      })\n      .flatMap(function({ markup, store }) {\n        log('react markup rendered, data fetched');\n        const state = store.getState();\n        const { title } = state.app.title;\n        res.expose(state, 'data');\n        return res.render$(\n          'layout-react',\n          { markup, title }\n        );\n      })\n      .doOnNext(markup => res.send(markup))\n      .subscribe(\n        () => log('html rendered and ready to send'),\n        next\n      );\n  }\n}\n"
  },
  {
    "path": "server/boot/a-services.js",
    "content": "import Fetchr from 'fetchr';\nimport getHikesService from '../services/hikes';\nimport getJobServices from '../services/job';\nimport getUserServices from '../services/user';\n\nexport default function bootServices(app) {\n  const hikesService = getHikesService(app);\n  const jobServices = getJobServices(app);\n  const userServices = getUserServices(app);\n\n  Fetchr.registerFetcher(hikesService);\n  Fetchr.registerFetcher(jobServices);\n  Fetchr.registerFetcher(userServices);\n  app.use('/services', Fetchr.middleware());\n}\n"
  },
  {
    "path": "server/boot/about.js",
    "content": "import dedent from 'dedent';\nimport moment from 'moment';\n\nimport { observeMethod } from '../utils/rx';\n\nfunction numberWithCommas(x) {\n  return x.toString().replace(/\\B(?=(\\d{3})+(?!\\d))/g, ',');\n}\n\nexport default function about(app) {\n  const router = app.loopback.Router();\n  const User = app.models.User;\n  const userCount$ = observeMethod(User, 'count');\n\n  function showAbout(req, res, next) {\n    const daysRunning = moment().diff(new Date('5/5/2016'), 'days');\n\n    userCount$()\n      .map(camperCount => numberWithCommas(camperCount))\n      .doOnNext(camperCount => {\n        res.render('resources/about', {\n          camperCount,\n          daysRunning,\n          title: dedent`\n            About our Open Source Community, our social media presence,\n            and how to contact us`.split('\\n').join(' '),\n          globalCompletedCount: numberWithCommas(\n            12952 + (Math.floor((Date.now() - 1463557575258) / 18000))\n          )\n        });\n      })\n      .subscribe(() => {}, next);\n  }\n\n  router.get('/about', showAbout);\n  app.use(router);\n}\n"
  },
  {
    "path": "server/boot/authentication.js",
    "content": "module.exports = function enableAuthentication(app) {\n  // enable authentication\n  app.enableAuth();\n};\n"
  },
  {
    "path": "server/boot/certificate.js",
    "content": "import _ from 'lodash';\nimport dedent from 'dedent';\nimport { Observable } from 'rx';\nimport debug from 'debug';\n\nimport {\n  ifNoUser401,\n  ifNoUserSend\n} from '../utils/middleware';\n\nimport { observeQuery } from '../utils/rx';\n\nimport {\n  frontEndChallengeId,\n  dataVisChallengeId,\n  backEndChallengeId\n} from '../utils/constantStrings.json';\n\nimport {\n  completeCommitment$\n} from '../utils/commit';\n\nimport certTypes from '../utils/certTypes.json';\n\nconst log = debug('fcc:certification');\nconst sendMessageToNonUser = ifNoUserSend(\n  '你必须先登录'\n);\n\nfunction isCertified(ids, challengeMap = {}) {\n  return _.every(ids, ({ id }) => challengeMap[id]);\n}\n\nfunction getIdsForCert$(id, Challenge) {\n  return observeQuery(\n    Challenge,\n    'findById',\n    id,\n    {\n      id: true,\n      tests: true,\n      name: true,\n      challengeType: true\n    }\n  )\n    .shareReplay();\n}\n\nexport default function certificate(app) {\n  const router = app.loopback.Router();\n  const { Challenge } = app.models;\n\n  const certTypeIds = {\n    [certTypes.frontEnd]: getIdsForCert$(frontEndChallengeId, Challenge),\n    [certTypes.dataVis]: getIdsForCert$(dataVisChallengeId, Challenge),\n    [certTypes.backEnd]: getIdsForCert$(backEndChallengeId, Challenge)\n  };\n\n  router.post(\n    '/certificate/verify/front-end',\n    ifNoUser401,\n    verifyCert.bind(null, certTypes.frontEnd)\n  );\n\n  router.post(\n    '/certificate/verify/back-end',\n    ifNoUser401,\n    verifyCert.bind(null, certTypes.backEnd)\n  );\n\n  router.post(\n    '/certificate/verify/data-visualization',\n    ifNoUser401,\n    verifyCert.bind(null, certTypes.dataVis)\n  );\n\n  router.post(\n    '/certificate/honest',\n    sendMessageToNonUser,\n    postHonest\n  );\n\n  app.use(router);\n\n  function verifyCert(certType, req, res, next) {\n    const { user } = req;\n    return certTypeIds[certType]\n      .flatMap(challenge => {\n        const {\n          id,\n          tests,\n          name,\n          challengeType\n        } = challenge;\n        if (\n          !user[certType] &&\n          isCertified(tests, user.challengeMap)\n        ) {\n          const updateData = {\n            $set: {\n              [`challengeMap.${id}`]: {\n                id,\n                name,\n                completedDate: new Date(),\n                challengeType\n              },\n              [certType]: true\n            }\n          };\n\n          return req.user.update$(updateData)\n            // If user has commited to nonprofit,\n            // this will complete his pledge\n            .flatMap(\n              () => completeCommitment$(user),\n              ({ count }, pledgeOrMessage) => {\n                if (typeof pledgeOrMessage === 'string') {\n                  log(pledgeOrMessage);\n                }\n                log(`${count} documents updated`);\n                return true;\n              }\n            );\n        }\n        return Observable.just(false);\n      })\n      .subscribe(\n        (didCertify) => {\n          if (didCertify) {\n            return res.status(200).send(true);\n          }\n          return res.status(200).send(\n            dedent`\n              你没有完成必要步骤，请返回学习路径完成对应课程。\n            `\n          );\n        },\n        next\n      );\n  }\n\n  function postHonest(req, res, next) {\n    return req.user.update$({ $set: { isHonest: true } }).subscribe(\n      () => res.status(200).send(true),\n      next\n    );\n  }\n}\n"
  },
  {
    "path": "server/boot/challenge.js",
    "content": "import _ from 'lodash';\nimport dedent from 'dedent';\nimport moment from 'moment';\nimport { Observable, Scheduler } from 'rx';\nimport debug from 'debug';\nimport accepts from 'accepts';\nimport { isMongoId } from 'validator';\n\nimport {\n  dasherize,\n  unDasherize,\n  getMDNLinks,\n  randomVerb,\n  randomPhrase,\n  randomCompliment\n} from '../utils';\n\nimport { observeMethod } from '../utils/rx';\n\nimport {\n  ifNoUserSend\n} from '../utils/middleware';\n\nimport getFromDisk$ from '../utils/getFromDisk$';\nimport badIdMap from '../utils/bad-id-map';\n\nconst isDev = process.env.NODE_ENV !== 'production';\nconst isBeta = !!process.env.BETA;\nconst log = debug('fcc:challenges');\nconst challengesRegex = /^(bonfire|waypoint|zipline|basejump|checkpoint)/i;\nconst challengeView = {\n  0: 'challenges/showHTML',\n  1: 'challenges/showJS',\n  2: 'challenges/showVideo',\n  3: 'challenges/showZiplineOrBasejump',\n  4: 'challenges/showZiplineOrBasejump',\n  5: 'challenges/showBonfire',\n  7: 'challenges/showStep'\n};\n\nfunction isChallengeCompleted(user, challengeId) {\n  if (!user) {\n    return false;\n  }\n  return !!user.challengeMap[challengeId];\n}\n\n/*\nfunction numberWithCommas(x) {\n  return x.toString().replace(/\\B(?=(\\d{3})+(?!\\d))/g, ',');\n}\n*/\n\nfunction buildUserUpdate(\n  user,\n  challengeId,\n  completedChallenge,\n  timezone\n) {\n  const updateData = { $set: {} };\n  let finalChallenge;\n  const { timezone: userTimezone, challengeMap = {} } = user;\n\n  const oldChallenge = challengeMap[challengeId];\n  const alreadyCompleted = !!oldChallenge;\n\n\n  if (alreadyCompleted) {\n    // add data from old challenge\n    finalChallenge = {\n      ...completedChallenge,\n      completedDate: oldChallenge.completedDate,\n      lastUpdated: completedChallenge.completedDate\n    };\n  } else {\n    if (challengeId) {\n      updateData.$push = {\n        progressTimestamps: {\n          timestamp: Date.now(),\n          completedChallenge: challengeId\n        }\n      };\n      finalChallenge = completedChallenge;\n    }\n  }\n\n  updateData.$set = {\n    [`challengeMap.${challengeId}`]: finalChallenge\n  };\n\n  if (\n    timezone &&\n    timezone !== 'UTC' &&\n    (!userTimezone || userTimezone === 'UTC')\n  ) {\n    updateData.$set = {\n      ...updateData.$set,\n      timezone: userTimezone\n    };\n  }\n\n  log('user update data', updateData);\n\n  return { alreadyCompleted, updateData };\n}\n\n\n// small helper function to determine whether to mark something as new\nconst dateFormat = 'MMM MMMM DD, YYYY';\nfunction shouldShowNew(element, block) {\n  if (element) {\n    return typeof element.releasedOn !== 'undefined' &&\n      moment(element.releasedOn, dateFormat).diff(moment(), 'days') >= -60;\n  }\n\n  if (block) {\n    const newCount = block.reduce((sum, { markNew }) => {\n      if (markNew) {\n        return sum + 1;\n      }\n      return sum;\n    }, 0);\n    return newCount / block.length * 100 === 100;\n  }\n  return null;\n}\n\n// meant to be used with a filter method\n// on an array or observable stream\n// true if challenge should be passed through\n// false if should filter challenge out of array or stream\nfunction shouldNotFilterComingSoon({ isComingSoon, isBeta: challengeIsBeta }) {\n  return isDev ||\n    !isComingSoon ||\n    (isBeta && challengeIsBeta);\n}\n\nfunction getRenderData$(user, challenge$, origChallengeName, solution) {\n  const challengeName = unDasherize(origChallengeName)\n    .replace(challengesRegex, '');\n\n  const testChallengeName = new RegExp(challengeName, 'i');\n  log('looking for %s', testChallengeName);\n\n  return challenge$\n    .map(challenge => challenge.toJSON())\n    .filter((challenge) => {\n      return shouldNotFilterComingSoon(challenge) &&\n        challenge.type !== 'hike' &&\n        testChallengeName.test(challenge.name);\n    })\n    .last({ defaultValue: null })\n    .flatMap(challenge => {\n      log('enviroment ' + isDev);\n      if (challenge && isDev) {\n        return getFromDisk$(challenge);\n      }\n      return Observable.just(challenge);\n    })\n    .flatMap(challenge => {\n\n      // Handle not found\n      if (!challenge) {\n        log('did not find challenge for ' + origChallengeName);\n        return Observable.just({\n          type: 'redirect',\n          redirectUrl: '/map',\n          message: dedent`\n    We couldn't find a challenge with the name ${origChallengeName}.\n    Please double check the name.\n          `\n        });\n      }\n\n      if (dasherize(challenge.name) !== origChallengeName) {\n        let redirectUrl = `/challenges/${dasherize(challenge.name)}`;\n\n        if (solution) {\n          redirectUrl += `?solution=${encodeURIComponent(solution)}`;\n        }\n\n        return Observable.just({\n          type: 'redirect',\n          redirectUrl\n        });\n      }\n\n      // save user does nothing if user does not exist\n      return Observable.just({\n        data: {\n          ...challenge,\n          // identifies if a challenge is completed\n          isCompleted: isChallengeCompleted(user, challenge.id),\n\n          // video challenges\n          video: challenge.challengeSeed[0],\n\n          // bonfires specific\n          bonfires: challenge,\n          MDNkeys: challenge.MDNlinks,\n          MDNlinks: getMDNLinks(challenge.MDNlinks),\n\n          // htmls specific\n          verb: randomVerb(),\n          phrase: randomPhrase(),\n          compliment: randomCompliment(),\n\n          // Google Analytics\n          gaName: challenge.title + '~' + challenge.checksum\n        }\n      });\n    });\n}\n\n// create a stream of an array of all the challenge blocks\nfunction getSuperBlocks$(challenge$, challengeMap) {\n  return challenge$\n    // mark challenge completed\n    .map(challengeModel => {\n      const challenge = challengeModel.toJSON();\n      challenge.completed = !!challengeMap[challenge.id];\n      challenge.markNew = shouldShowNew(challenge);\n\n      if (challenge.type === 'hike') {\n        challenge.url = '/videos/' + challenge.dashedName;\n      } else {\n        challenge.url = '/challenges/' + challenge.dashedName;\n      }\n\n      return challenge;\n    })\n    // group challenges by block | returns a stream of observables\n    .groupBy(challenge => challenge.block)\n    // turn block group stream into an array\n    .flatMap(block$ => block$.toArray())\n    .map(blockArray => {\n      const completedCount = blockArray.reduce((sum, { completed }) => {\n        if (completed) {\n          return sum + 1;\n        }\n        return sum;\n      }, 0);\n      const isBeta = _.every(blockArray, 'isBeta');\n      const isComingSoon = _.every(blockArray, 'isComingSoon');\n      const isRequired = _.every(blockArray, 'isRequired');\n\n      return {\n        isBeta,\n        isComingSoon,\n        isRequired,\n        name: blockArray[0].block,\n        superBlock: blockArray[0].superBlock,\n        dashedName: dasherize(blockArray[0].block),\n        markNew: shouldShowNew(null, blockArray),\n        challenges: blockArray,\n        completed: completedCount / blockArray.length * 100,\n        time: blockArray[0] && blockArray[0].time || '???'\n      };\n    })\n    .toArray()\n    .flatMap(blocks => Observable.from(blocks, null, null, Scheduler.default))\n    .groupBy(block => block.superBlock)\n    .flatMap(blocks$ => blocks$.toArray())\n    .map(superBlockArray => ({\n      name: superBlockArray[0].superBlock,\n      blocks: superBlockArray\n    }))\n    .toArray();\n}\n\nfunction getChallengeById$(challenge$, challengeId) {\n  // return first challenge if no id is given\n  if (!challengeId) {\n    return challenge$\n      .map(challenge => challenge.toJSON())\n      .filter(shouldNotFilterComingSoon)\n      // filter out hikes\n      .filter(({ superBlock }) => !(/^videos/gi).test(superBlock))\n      .first();\n  }\n  return challenge$\n    .map(challenge => challenge.toJSON())\n    // filter out challenges coming soon\n    .filter(shouldNotFilterComingSoon)\n    // filter out hikes\n    .filter(({ superBlock }) => !(/^videos/gi).test(superBlock))\n    .filter(({ id }) => id === challengeId);\n}\n\nfunction getNextChallenge$(challenge$, blocks$, challengeId) {\n  return getChallengeById$(challenge$, challengeId)\n    // now lets find the block it belongs to\n    .flatMap(challenge => {\n      // find the index of the block this challenge resides in\n      const blockIndex$ = blocks$\n        .findIndex(({ name }) => name === challenge.block);\n\n\n      return blockIndex$\n        .flatMap(blockIndex => {\n          // could not find block?\n          if (blockIndex === -1) {\n            return Observable.throw(\n              'could not find challenge block for ' + challenge.block\n            );\n          }\n          const firstChallengeOfNextBlock$ = blocks$\n            .elementAt(blockIndex + 1, {})\n            .map(({ challenges = [] }) => challenges[0]);\n\n          return blocks$\n            .filter(shouldNotFilterComingSoon)\n            .elementAt(blockIndex)\n            .flatMap(block => {\n              // find where our challenge lies in the block\n              const challengeIndex$ = Observable.from(\n                block.challenges,\n                null,\n                null,\n                Scheduler.default\n              )\n                .findIndex(({ id }) => id === challengeId);\n\n              // grab next challenge in this block\n              return challengeIndex$\n                .map(index => {\n                  return block.challenges[index + 1];\n                })\n                .flatMap(nextChallenge => {\n                  if (!nextChallenge) {\n                    return firstChallengeOfNextBlock$;\n                  }\n                  return Observable.just(nextChallenge);\n                });\n            });\n        });\n    })\n    .first();\n}\n\nmodule.exports = function(app) {\n  const router = app.loopback.Router();\n\n  const challengesQuery = {\n    order: [\n      'superOrder ASC',\n      'order ASC',\n      'suborder ASC'\n    ]\n  };\n\n  // challenge model\n  const Challenge = app.models.Challenge;\n  // challenge find query stream\n  const findChallenge$ = observeMethod(Challenge, 'find');\n  // create a stream of all the challenges\n  const challenge$ = findChallenge$(challengesQuery)\n    .flatMap(challenges => Observable.from(\n      challenges,\n      null,\n      null,\n      Scheduler.default\n    ))\n    // filter out all challenges that have isBeta flag set\n    // except in development or beta site\n    .filter(challenge => isDev || isBeta || !challenge.isBeta)\n    .shareReplay();\n\n  // create a stream of challenge blocks\n  const blocks$ = challenge$\n    .map(challenge => challenge.toJSON())\n    .filter(shouldNotFilterComingSoon)\n    // group challenges by block | returns a stream of observables\n    .groupBy(challenge => challenge.block)\n    // turn block group stream into an array\n    .flatMap(blocks$ => blocks$.toArray())\n    // turn array into stream of object\n    .map(blocksArray => ({\n      name: blocksArray[0].block,\n      dashedName: dasherize(blocksArray[0].block),\n      challenges: blocksArray,\n      superBlock: blocksArray[0].superBlock,\n      order: blocksArray[0].order\n    }))\n    // filter out hikes\n    .filter(({ superBlock }) => {\n      return !(/^videos/gi).test(superBlock);\n    })\n    .shareReplay();\n\n  const firstChallenge$ = challenge$\n    .first()\n    .map(challenge => challenge.toJSON())\n    .shareReplay();\n\n  const lastChallenge$ = challenge$\n    .last()\n    .map(challenge => challenge.toJSON())\n    .shareReplay();\n\n  const send200toNonUser = ifNoUserSend(true);\n\n  router.post(\n    '/completed-challenge/',\n    send200toNonUser,\n    completedChallenge\n  );\n  router.post(\n    '/completed-zipline-or-basejump',\n    send200toNonUser,\n    completedZiplineOrBasejump\n  );\n\n  router.get('/map', showMap.bind(null, false));\n  router.get('/map-aside', showMap.bind(null, true));\n  router.get(\n    '/challenges/current-challenge',\n    redirectToCurrentChallenge\n  );\n  router.get(\n    '/challenges/next-challenge',\n    redirectToNextChallenge\n  );\n\n  router.get('/challenges/:challengeName', showChallenge);\n\n  app.use(router);\n\n  function redirectToCurrentChallenge(req, res, next) {\n    let challengeId = req.query.id || req.cookies.currentChallengeId;\n    // prevent serialized null/undefined from breaking things\n\n    if (badIdMap[challengeId]) {\n      challengeId = badIdMap[challengeId];\n    }\n\n    if (!isMongoId('' + challengeId)) {\n      challengeId = null;\n    }\n\n    getChallengeById$(challenge$, challengeId)\n      .doOnNext(({ dashedName })=> {\n        if (!dashedName) {\n          log('no challenge found for %s', challengeId);\n          req.flash('info', {\n            msg: `We coudn't find a challenge with the id ${challengeId}`\n          });\n          res.redirect('/map');\n        }\n        res.redirect('/challenges/' + dashedName);\n      })\n      .subscribe(() => {}, next);\n  }\n\n  function redirectToNextChallenge(req, res, next) {\n    let challengeId = req.query.id || req.cookies.currentChallengeId;\n\n    if (badIdMap[challengeId]) {\n      challengeId = badIdMap[challengeId];\n    }\n\n    if (!isMongoId('' + challengeId)) {\n      challengeId = null;\n    }\n\n    Observable.combineLatest(\n      firstChallenge$,\n      lastChallenge$\n    )\n      .flatMap(([firstChallenge, { id: lastChallengeId } ]) => {\n        // no id supplied, load first challenge\n        if (!challengeId) {\n          return Observable.just(firstChallenge);\n        }\n        // camper just completed last challenge\n        if (challengeId === lastChallengeId) {\n          return Observable.just()\n            .doOnCompleted(() => {\n              req.flash('info', {\n                msg: dedent`\n                  Once you have completed all of our challenges, you should\n                  join our <a href=\"https://gitter.im/freecodecamp/HalfWayClub\"\n                  target=\"_blank\">Half Way Club</a> and start getting\n                  ready for our nonprofit projects.\n                `.split('\\n').join(' ')\n              });\n              return res.redirect('/map');\n            });\n        }\n\n        return getNextChallenge$(challenge$, blocks$, challengeId);\n      })\n      .doOnNext(({ dashedName } = {}) => {\n        if (!dashedName) {\n          log('no challenge found for %s', challengeId);\n          res.redirect('/map');\n        }\n        res.redirect('/challenges/' + dashedName);\n      })\n      .subscribe(() => {}, next);\n  }\n\n  function showChallenge(req, res, next) {\n    const solution = req.query.solution;\n    const challengeName = req.params.challengeName.replace(challengesRegex, '');\n\n    getRenderData$(req.user, challenge$, challengeName, solution)\n      .subscribe(\n        ({ type, redirectUrl, message, data }) => {\n          if (message) {\n            req.flash('info', {\n              msg: message\n            });\n          }\n          if (type === 'redirect') {\n            log('redirecting to %s', redirectUrl);\n            return res.redirect(redirectUrl);\n          }\n          var view = challengeView[data.challengeType];\n          if (data.id) {\n            res.cookie('currentChallengeId', data.id, {\n              expires: new Date(2147483647000)});\n          }\n          return res.render(view, data);\n        },\n        next,\n        function() {}\n      );\n  }\n\n  function completedChallenge(req, res, next) {\n    req.checkBody('id', 'id must be a ObjectId').isMongoId();\n    req.checkBody('name', 'name must be at least 3 characters')\n      .isString()\n      .isLength({ min: 3 });\n    req.checkBody('challengeType', 'challengeType must be an integer')\n      .isNumber();\n\n    const type = accepts(req).type('html', 'json', 'text');\n\n    const errors = req.validationErrors(true);\n\n    if (errors) {\n      if (type === 'json') {\n        return res.status(403).send({ errors });\n      }\n\n      log('errors', errors);\n      return res.sendStatus(403);\n    }\n\n    const completedDate = Date.now();\n    const {\n      id,\n      name,\n      challengeType,\n      solution,\n      timezone\n    } = req.body;\n\n    const { alreadyCompleted, updateData } = buildUserUpdate(\n      req.user,\n      id,\n      {\n        id,\n        challengeType,\n        solution,\n        name,\n        completedDate\n      },\n      timezone\n    );\n\n    const user = req.user;\n    const points = alreadyCompleted ?\n      user.progressTimestamps.length :\n      user.progressTimestamps.length + 1;\n\n    return user.update$(updateData)\n      .doOnNext(({ count }) => log('%s documents updated', count))\n      .subscribe(\n        () => {},\n        next,\n        function() {\n          if (type === 'json') {\n            return res.json({\n              points,\n              alreadyCompleted\n            });\n          }\n          return res.sendStatus(200);\n        }\n      );\n  }\n\n  function completedZiplineOrBasejump(req, res, next) {\n    const type = accepts(req).type('html', 'json', 'text');\n    req.checkBody('id', 'id must be an ObjectId').isMongoId();\n    req.checkBody('name', 'Name must be at least 3 characters')\n      .isString()\n      .isLength({ min: 3 });\n    req.checkBody('challengeType', 'must be a number')\n      .isNumber();\n    req.checkBody('solution', 'solution must be a url').isURL();\n\n    const errors = req.validationErrors(true);\n\n    if (errors) {\n      if (type === 'json') {\n        return res.status(403).send({ errors });\n      }\n      log('errors', errors);\n      return res.sendStatus(403);\n    }\n\n    const { user, body = {} } = req;\n\n    const completedChallenge = _.pick(\n      body,\n      [ 'id', 'name', 'solution', 'githubLink', 'challengeType' ]\n    );\n    completedChallenge.challengeType = +completedChallenge.challengeType;\n    completedChallenge.completedDate = Date.now();\n\n    if (\n      !completedChallenge.solution ||\n      // only basejumps require github links\n      (\n        completedChallenge.challengeType === 4 &&\n        !completedChallenge.githubLink\n      )\n    ) {\n      req.flash('errors', {\n        msg: 'You haven\\'t supplied the necessary URLs for us to inspect ' +\n          'your work.'\n      });\n      return res.sendStatus(403);\n    }\n\n\n    const {\n      alreadyCompleted,\n      updateData\n    } = buildUserUpdate(req.user, completedChallenge.id, completedChallenge);\n\n    return user.update$(updateData)\n      .doOnNext(({ count }) => log('%s documents updated', count))\n      .doOnNext(() => {\n        if (type === 'json') {\n          return res.send({\n            alreadyCompleted,\n            points: alreadyCompleted ?\n              user.progressTimestamps.length :\n              user.progressTimestamps.length + 1\n          });\n        }\n        return res.status(200).send(true);\n      })\n      .subscribe(() => {}, next);\n  }\n\n  function showMap(showAside, { user = {} }, res, next) {\n    const { challengeMap = {} } = user;\n\n    return getSuperBlocks$(challenge$, challengeMap)\n      .subscribe(\n        superBlocks => {\n          res.render('map/show', {\n            superBlocks,\n            title: 'A Map to Learn to Code and Become a Software Engineer',\n            showAside\n          });\n        },\n        next\n      );\n  }\n};\n"
  },
  {
    "path": "server/boot/commit.js",
    "content": "import _ from 'lodash';\nimport { Observable } from 'rx';\nimport debugFactory from 'debug';\nimport dedent from 'dedent';\n\nimport nonprofits from '../utils/commit.json';\nimport {\n  commitGoals,\n  completeCommitment$\n} from '../utils/commit';\n\nimport {\n  unDasherize\n} from '../utils';\n\nimport {\n  observeQuery,\n  saveInstance\n} from '../utils/rx';\n\nimport {\n  ifNoUserRedirectTo\n} from '../utils/middleware';\n\nconst sendNonUserToSignIn = ifNoUserRedirectTo(\n  '/login',\n  'You must be signed in to commit to a nonprofit.',\n  'info'\n);\n\nconst sendNonUserToCommit = ifNoUserRedirectTo(\n  '/commit',\n  'You must be signed in to update commit',\n  'info'\n);\n\nconst debug = debugFactory('fcc:commit');\n\nfunction findNonprofit(name) {\n  let nonprofit;\n  if (name) {\n    nonprofit = _.find(nonprofits, (nonprofit) => {\n      return name === nonprofit.name;\n    });\n  }\n\n  nonprofit = nonprofit || nonprofits[ _.random(0, nonprofits.length - 1) ];\n  return nonprofit;\n}\n\nexport default function commit(app) {\n  const router = app.loopback.Router();\n  const { Pledge } = app.models;\n\n  router.get(\n    '/commit',\n    commitToNonprofit\n  );\n\n  router.get(\n    '/commit/pledge',\n    sendNonUserToSignIn,\n    pledge\n  );\n\n  router.get(\n    '/commit/directory',\n    renderDirectory\n  );\n\n  router.post(\n    '/commit/stop-commitment',\n    sendNonUserToCommit,\n    stopCommit\n  );\n\n  router.post(\n    '/commit/complete-goal',\n    sendNonUserToCommit,\n    completeCommitment\n  );\n\n  app.use(router);\n\n  function commitToNonprofit(req, res, next) {\n    const { user } = req;\n    let nonprofitName = unDasherize(req.query.nonprofit);\n\n    debug('looking for nonprofit', nonprofitName);\n    const nonprofit = findNonprofit(nonprofitName);\n\n    Observable.just(user)\n      .flatMap(user => {\n        if (user) {\n          debug('getting user pledge');\n          return observeQuery(user, 'pledge');\n        }\n        return Observable.just();\n      })\n      .subscribe(\n        pledge => {\n          if (pledge) {\n            debug('found previous pledge');\n            req.flash('info', {\n              msg: dedent`\n                Looks like you already have a pledge to ${pledge.displayName}.\n                Hitting commit here will replace your old commitment.\n              `\n            });\n          }\n          res.render(\n            'commit/',\n            Object.assign(\n              {\n                title: 'Commit to a nonprofit. Commit to your goal.',\n                pledge\n              },\n              commitGoals,\n              nonprofit\n            )\n          );\n        },\n        next\n      );\n\n  }\n\n  function pledge(req, res, next) {\n    const { user } = req;\n    const {\n      nonprofit: nonprofitName = 'girl develop it',\n      amount = '5',\n      goal = commitGoals.frontEndCert\n    } = req.query;\n\n    const nonprofit = findNonprofit(nonprofitName);\n\n    observeQuery(user, 'pledge')\n      .flatMap(oldPledge => {\n        // create new pledge for user\n        const pledge = Pledge(\n          Object.assign(\n            {\n              amount,\n              goal,\n              userId: user.id\n            },\n            nonprofit\n          )\n        );\n\n        if (oldPledge) {\n          debug('user already has pledge, creating a new one');\n          // we orphan last pledge since a user only has one pledge at a time\n          oldPledge.userId = '';\n          oldPledge.formerUser = user.id;\n          oldPledge.endDate = new Date();\n          oldPledge.isOrphaned = true;\n          return saveInstance(oldPledge)\n            .flatMap(() => {\n              return saveInstance(pledge);\n            });\n        }\n        return saveInstance(pledge);\n      })\n      .subscribe(\n        ({ displayName, goal, amount }) => {\n          req.flash('success', {\n            msg: dedent`\n              Congratulations, you have committed to giving\n              ${displayName} $${amount} each month until you have completed\n              your ${goal}.\n            `\n          });\n          res.redirect('/' + user.username);\n        },\n        next\n      );\n  }\n\n  function renderDirectory(req, res) {\n    res.render('commit/directory', {\n      title: 'Commit Directory',\n      nonprofits\n    });\n  }\n\n  function completeCommitment(req, res, next) {\n    const { user } = req;\n\n    return completeCommitment$(user)\n      .subscribe(\n        msgOrPledge => {\n          if (typeof msgOrPledge === 'string') {\n            return res.send(msgOrPledge);\n          }\n          return res.send(true);\n        },\n        next\n      );\n  }\n\n  function stopCommit(req, res, next) {\n    const { user } = req;\n\n    observeQuery(user, 'pledge')\n      .flatMap(pledge => {\n        if (!pledge) {\n          return Observable.just();\n        }\n\n        pledge.formerUserId = pledge.userId;\n        pledge.userId = null;\n        pledge.isOrphaned = true;\n        pledge.dateEnded = new Date();\n        return saveInstance(pledge);\n      })\n      .subscribe(\n        pledge => {\n          let msg = 'You have successfully stopped your pledge.';\n          if (!pledge) {\n            msg = `No pledge found for user ${user.username}.`;\n          }\n          req.flash('errors', { msg });\n          return res.redirect(`/${user.username}`);\n        },\n        next\n      );\n  }\n}\n"
  },
  {
    "path": "server/boot/explorer.js",
    "content": "module.exports = function mountLoopBackExplorer(app) {\n  if (process.env.NODE_ENV === 'production') {\n    return;\n  }\n  var explorer;\n  try {\n    explorer = require('loopback-component-explorer');\n  } catch (err) {\n    // Print the message only when the app was started via `app.listen()`.\n    // Do not print any message when the project is used as a component.\n    app.once('started', function() {\n      console.log(\n        'Run `npm install loopback-component-explorer` to enable ' +\n        'the LoopBack explorer'\n      );\n    });\n    return;\n  }\n\n  var restApiRoot = app.get('restApiRoot');\n  var mountPath = '/explorer';\n\n  explorer(app, { basePath: restApiRoot, mountPath });\n  app.once('started', function() {\n    var baseUrl = app.get('url').replace(/\\/$/, '');\n\n    console.log('Browse your REST API at %s%s', baseUrl, mountPath);\n  });\n};\n"
  },
  {
    "path": "server/boot/home.js",
    "content": "import { defaultProfileImage } from '../../common/utils/constantStrings.json';\n\nconst message =\n  'Learn to Code and Help Nonprofits';\n\nmodule.exports = function(app) {\n  var router = app.loopback.Router();\n  router.get('/', addDefaultImage, index);\n\n  app.use(router);\n\n  function addDefaultImage(req, res, next) {\n    if (!req.user || req.user.picture) {\n      return next();\n    }\n    req.user.picture = defaultProfileImage;\n    return req.user.save(function(err) {\n      if (err) { return next(err); }\n      return next();\n    });\n  }\n\n  function index(req, res) {\n    if (req.user) {\n      return res.redirect('/challenges/current-challenge');\n    }\n    return res.render('home', { title: message });\n  }\n};\n"
  },
  {
    "path": "server/boot/randomAPIs.js",
    "content": "const Rx = require('rx'),\n  async = require('async'),\n  moment = require('moment'),\n  request = require('request'),\n  debug = require('debug')('fcc:cntr:resources'),\n  constantStrings = require('../utils/constantStrings.json'),\n  labs = require('../resources/labs.json'),\n  testimonials = require('../resources/testimonials.json'),\n  secrets = require('../../config/secrets');\n\nmodule.exports = function(app) {\n  var router = app.loopback.Router();\n  var User = app.models.User;\n  var Challenge = app.models.Challenge;\n  var Story = app.models.Story;\n  var Nonprofit = app.models.Nonprofit;\n  var UserIdentity = app.models.UserIdentity;\n\n  router.get('/api/github', githubCalls);\n  router.get('/api/blogger', bloggerCalls);\n  router.get('/api/trello', trelloCalls);\n  router.get('/sitemap.xml', sitemap);\n  router.get('/chat', chat);\n  router.get('/home', home);\n  router.get('/coding-bootcamp-cost-calculator', bootcampCalculator);\n  router.get('/twitch', twitch);\n  router.get('/pmi-acp-agile-project-managers', agileProjectManagers);\n  router.get('/pmi-acp-agile-project-managers-form', agileProjectManagersForm);\n  router.get('/nonprofits', nonprofits);\n  router.get('/nonprofits-form', nonprofitsForm);\n  router.get('/unsubscribe/:email', unsubscribeMonthly);\n  router.get('/unsubscribe-notifications/:email', unsubscribeNotifications);\n  router.get('/unsubscribe-quincy/:email', unsubscribeQuincy);\n  router.get('/unsubscribed', unsubscribed);\n  router.get('/get-started', getStarted);\n  router.get('/submit-cat-photo', submitCatPhoto);\n  router.get('/labs', showLabs);\n  router.get('/stories', showTestimonials);\n  router.get('/shop', showShop);\n  router.get('/shop/cancel-stickers', cancelStickers);\n  router.get('/shop/confirm-stickers', confirmStickers);\n  router.get('/all-stories', showAllTestimonials);\n  router.get('/terms', terms);\n  router.get('/privacy', privacy);\n  router.get('/how-nonprofit-projects-work', howNonprofitProjectsWork);\n  router.get('/code-of-conduct', codeOfConduct);\n  router.get('/academic-honesty', academicHonesty);\n  router.get('/get-user-identity', getUserIdentity);\n  router.route('/leader-board').get(leaderBoard);\n  router.route('/master').get(master);\n  router.route('/newer').get(newer);\n  router.route('/women').get(women);\n  // router.route('/newer').get(newer);\n  // router.route('/women').get(women);\n  router.route('/has-username').post(hasUsername);\n  router.route('/has-join').post(hasJoin);\n  router.route('/add-telphone').post(addTelphone);\n  router.route('/update-profile').post(updateProfile);\n  router.route('/dashboard').post(dashboard);\n  router.get('/code', function(req, res) {\n    res.render('resources/code', {\n      title: '苏州全民在线编程挑战赛'\n    });\n  });\n  router.get('/progress', function(req, res) {\n    res.render('resources/progress', {\n      title: '学习进度排行榜'\n    });\n  });\n  router.get('/group', function(req, res) {\n    res.render('resources/group', {\n      title: '线下同城学习小组'\n    });\n  });\n  router.get('/dashboard', function(req, res) {\n    res.render('resources/dashboard', {\n      title: 'fcc后台统计系统'\n    });\n  });\n\n  router.get(\n    '/the-fastest-web-page-on-the-internet',\n    theFastestWebPageOnTheInternet\n  );\n\n  app.use(router);\n\n  function sitemap(req, res, next) {\n    var appUrl = 'http://www.freecodecamp.cn';\n    var now = moment(new Date()).format('YYYY-MM-DD');\n\n    // TODO(berks): refactor async to rx\n    async.parallel({\n        users: function(callback) {\n          User.find(\n            {\n              where: { username: { nlike: '' } },\n              fields: { username: true }\n            },\n            function(err, users) {\n              if (err) {\n                debug('User err: ', err);\n                callback(err);\n              } else {\n                Rx.Observable.from(users, null, null, Rx.Scheduler.default)\n                  .map(function(user) {\n                    return user.username;\n                  })\n                  .toArray()\n                  .subscribe(\n                    function(usernames) {\n                      callback(null, usernames);\n                    },\n                    callback\n                  );\n              }\n            });\n        },\n\n        challenges: function(callback) {\n          Challenge.find(\n            { fields: { name: true } },\n            function(err, challenges) {\n              if (err) {\n                debug('Challenge err: ', err);\n                callback(err);\n              } else {\n                Rx.Observable.from(challenges, null, null, Rx.Scheduler.default)\n                  .map(function(challenge) {\n                    return challenge.name;\n                  })\n                  .toArray()\n                  .subscribe(\n                    callback.bind(callback, null),\n                    callback\n                  );\n              }\n            });\n        },\n        stories: function(callback) {\n          Story.find(\n            { field: { link: true } },\n            function(err, stories) {\n              if (err) {\n                debug('Story err: ', err);\n                callback(err);\n              } else {\n                Rx.Observable.from(stories, null, null, Rx.Scheduler.default)\n                  .map(function(story) {\n                    return story.link;\n                  })\n                  .toArray()\n                  .subscribe(\n                    callback.bind(callback, null),\n                    callback\n                  );\n              }\n            }\n          );\n        },\n        nonprofits: function(callback) {\n          Nonprofit.find(\n            { field: { name: true } },\n            function(err, nonprofits) {\n              if (err) {\n                debug('User err: ', err);\n                callback(err);\n              } else {\n                Rx.Observable.from(nonprofits, null, null, Rx.Scheduler.default)\n                  .map(function(nonprofit) {\n                    return nonprofit.name;\n                  })\n                  .toArray()\n                  .subscribe(\n                    callback.bind(callback, null),\n                    callback\n                  );\n              }\n            });\n        }\n      }, function(err, results) {\n        if (err) {\n          return next(err);\n        }\n        return process.nextTick(function() {\n          res.header('Content-Type', 'application/xml');\n          res.render('resources/sitemap', {\n            appUrl: appUrl,\n            now: now,\n            users: results.users,\n            challenges: results.challenges,\n            stories: results.stories,\n            nonprofits: results.nonprofits\n          });\n        });\n      }\n    );\n  }\n\n  function chat(req, res) {\n    res.redirect('https://gitter.im/FreeCodeCamp/chinese');\n  }\n  function home(req, res) {\n    res.render('home');\n  }\n\n  function showLabs(req, res) {\n    res.render('resources/labs', {\n      title: 'Projects Built by Free Code Camp Software Engineers',\n      projects: labs\n    });\n  }\n\n  function terms(req, res) {\n      res.render('resources/terms-of-service', {\n            title: 'Terms of Service'\n      });\n  }\n\n  function privacy(req, res) {\n      res.render('resources/privacy', {\n          title: 'Privacy policy'\n      });\n  }\n\n  function howNonprofitProjectsWork(req, res) {\n      res.render('resources/how-nonprofit-projects-work', {\n          title: 'How our nonprofit projects work'\n      });\n  }\n\n  function codeOfConduct(req, res) {\n      res.render('resources/code-of-conduct', {\n          title: 'Code of Conduct'\n      });\n  }\n\n  function academicHonesty(req, res) {\n      res.render('resources/academic-honesty', {\n          title: 'Academic Honesty policy'\n      });\n  }\n\n  function theFastestWebPageOnTheInternet(req, res) {\n    res.render('resources/the-fastest-web-page-on-the-internet', {\n      title: 'This is the fastest web page on the internet'\n    });\n  }\n\n  function showTestimonials(req, res) {\n    res.render('resources/stories', {\n      title: 'Testimonials from Happy Free Code Camp Students ' +\n        'who got Software Engineer Jobs',\n      stories: testimonials.slice(0, 72),\n      moreStories: true\n    });\n  }\n\n  function showAllTestimonials(req, res) {\n    res.render('resources/stories', {\n      title: 'Testimonials from Happy Free Code Camp Students ' +\n        'who got Software Engineer Jobs',\n      stories: testimonials,\n      moreStories: false\n    });\n  }\n\n  function showShop(req, res) {\n    res.render('resources/shop', {\n      title: 'Support Free Code Camp by Buying t-shirts, ' +\n        'stickers, and other goodies'\n    });\n  }\n\n  function confirmStickers(req, res) {\n    req.flash('success', {\n      msg: 'Thank you for supporting our community! You should receive ' +\n        'your stickers in the mail soon!'\n    });\n    res.redirect('/shop');\n  }\n\n  function cancelStickers(req, res) {\n      req.flash('info', {\n        msg: 'You\\'ve cancelled your purchase of our stickers. You can ' +\n          'support our community any time by buying some.'\n      });\n      res.redirect('/shop');\n  }\n  function submitCatPhoto(req, res) {\n    res.send('Submitted!');\n  }\n\n  function bootcampCalculator(req, res) {\n    res.render('resources/calculator', {\n      title: 'Coding Bootcamp Cost Calculator'\n    });\n  }\n\n  function nonprofits(req, res) {\n    res.render('resources/nonprofits', {\n      title: 'Your Nonprofit Can Get Pro Bono Code'\n    });\n  }\n\n  function nonprofitsForm(req, res) {\n    res.render('resources/nonprofits-form', {\n      title: 'Nonprofit Projects Proposal Form'\n    });\n  }\n\n  function agileProjectManagers(req, res) {\n    res.render('resources/pmi-acp-agile-project-managers', {\n      title: 'Get Agile Project Management Experience for the PMI-ACP'\n    });\n  }\n\n  function agileProjectManagersForm(req, res) {\n    res.render('resources/pmi-acp-agile-project-managers-form', {\n      title: 'Agile Project Management Program Application Form'\n    });\n  }\n\n  function twitch(req, res) {\n    res.redirect('https://twitch.tv/freecodecamp');\n  }\n  function leaderBoard(req, res, next) {\n    // var data = User.find({}, {\"_id\":0, \"username\":1, \"picture\":1, \"progressTimestamps\":1});\n    // for(var i=0;i<data.length;i++){\n    //     data[i].score = data[i].progressTimestamps.length;\n    //     delete  data[i].progressTimestamps;\n    // };\n    // console.log(data);\n    User.find({\n      where: {\n        isCheater: false\n      },\n      fields: {\n        _id: 0,\n        username: 1,\n        picture: 1,\n        progressTimestamps: 1\n      }\n    }, (err, user) => {\n      if (err) { return next(err); }\n      var data = user.slice();\n      for (var i = 0; i < data.length; i++) {\n          data[i].score = data[i].progressTimestamps.length;\n          data[i].projectScore = 0;\n          delete data[i].progressTimestamps;\n      }\n      res.send(data);\n    });\n  }\n  function getUserIdentity(req, res, next) {\n    UserIdentity.find({\n      where: {},\n      fields: {\n        created: 1,\n        _id: 0\n      }\n    }, (err, data) =>{\n      if (err) {\n        return next(err);\n      }\n      res.send(data);\n      console.log(data);\n    });\n  }\n  function dashboard(req, res, next) {\n    User.find({\n      where: {\n        group: true\n      },\n      fields: {\n        _id: 0,\n        username: 1,\n        fullname: 1,\n        email: 1,\n        telphone: 1,\n        wechat: 1,\n        location: 1,\n        background: 1\n      }\n    }, (err, user) =>{\n      if (err) { return next(err); }\n      var data = user.slice();\n      res.send(data);\n    });\n  }\n  function updateProfile(req, res, next) {\n    User.findOne({\n      where: {\n        username: req.body.username\n      }\n    }, (err, user) => {\n      if (err) { return next(err); }\n      user.updateAttributes({\n        fullname: req.body.fullname,\n        email: req.body.email,\n        telphone: req.body.telphone,\n        location: req.body.location,\n        background: req.body.background,\n        wechat: req.body.wechat,\n        group: req.body.group\n      }, (err, user) =>{\n        if (err) { return next(err); }\n        res.send(user);\n      });\n    });\n  }\n  function master(req, res, next) {\n    User.find({\n      where: {\n        category: master,\n        isCheater: false\n      },\n      fields: {\n        _id: 0,\n        username: 1,\n        picture: 1,\n        progressTimestamps: 1\n      }\n    }, (err, user) => {\n      if (err) { return next(err); }\n      var data = user.slice();\n      for (var i = 0; i < data.length; i++) {\n          data[i].score = data[i].progressTimestamps.length;\n          data[i].projectScore = 0;\n          delete data[i].progressTimestamps;\n      }\n      res.send(data);\n    });\n  }\n  function newer(req, res, next) {\n    User.find({\n      where: {\n        category: 'newer',\n        isCheater: false\n      },\n      fields: {\n        _id: 0,\n        username: 1,\n        picture: 1,\n        progressTimestamps: 1\n      }\n    }, (err, user) => {\n      if (err) { return next(err); }\n      var data = user.slice();\n      for (var i = 0; i < data.length; i++) {\n          data[i].score = data[i].progressTimestamps.length;\n          data[i].projectScore = 0;\n          delete data[i].progressTimestamps;\n      }\n      res.send(data);\n    });\n  }\n  function women(req, res, next) {\n    User.find({\n      where: {\n        category: 'women',\n        isCheater: false\n      },\n      fields: {\n        _id: 0,\n        username: 1,\n        picture: 1,\n        progressTimestamps: 1\n      }\n    }, (err, user) => {\n      if (err) { return next(err); }\n      var data = user.slice();\n      for (var i = 0; i < data.length; i++) {\n          data[i].score = data[i].progressTimestamps.length;\n          data[i].projectScore = 0;\n          delete data[i].progressTimestamps;\n      }\n      res.send(data);\n    });\n  }\n  function hasUsername(req, res, next) {\n    User.findOne({\n      where: {\n        username: req.body.username\n      }\n    }, (err, user) => {\n      if (err) { return next(err); }\n      // res.send(user);\n      if (user) {\n        res.send({ status: 200 });\n      } else {\n        res.send({ status: 404 });\n      }\n    });\n  }\n  function hasJoin(req, res, next) {\n    User.findOne({\n      where: {\n        username: req.body.username,\n        telphone: req.body.telphone}\n    }, (err, user) => {\n      if (err) { return next(err); }\n      if (user) {\n        res.send({ 'status': 200 });\n      } else {\n        res.send({ 'status': 404});\n      }\n    });\n  }\n  function addTelphone(req, res, next) {\n    User.findOne({\n      where: {\n        username: req.body.username\n      }\n    }, (err, user) => {\n      if (err) { return next(err); }\n      user.updateAttributes({\n        telphone: req.body.telphone,\n        category: req.body.category\n      }, (err) =>{\n        if (err) { return next(err); }\n        res.send({ 'status': 200 });\n      });\n    });\n  }\n\n  function unsubscribeMonthly(req, res, next) {\n    req.checkParams('email', 'Must send a valid email').isEmail();\n    return User.findOne({ where: { email: req.params.email } }, (err, user) => {\n      if (err) { return next(err); }\n      return user.updateAttribute('sendMonthlyEmail', false, (err) => {\n        if (err) { return next(err); }\n        req.flash('info', {\n          msg: 'We\\'ve successfully updated your Email preferences.'\n        });\n        return res.redirect('/unsubscribed');\n      });\n    });\n  }\n\n  function unsubscribeNotifications(req, res, next) {\n    req.checkParams('email', 'Must send a valid email').isEmail();\n    return User.findOne({ where: { email: req.params.email } }, (err, user) => {\n      if (err) { return next(err); }\n      return user.updateAttribute('sendNotificationEmail', false, (err) => {\n        if (err) { return next(err); }\n        req.flash('info', {\n          msg: 'We\\'ve successfully updated your Email preferences.'\n        });\n        return res.redirect('/unsubscribed');\n      });\n    });\n  }\n\n  function unsubscribeQuincy(req, res, next) {\n    req.checkParams('email', 'Must send a valid email').isEmail();\n    return User.findOne({ where: { email: req.params.email } }, (err, user) => {\n      if (err) { return next(err); }\n      return user.updateAttribute('sendQuincyEmail', false, (err) => {\n        if (err) { return next(err); }\n        req.flash('info', {\n          msg: 'We\\'ve successfully updated your Email preferences.'\n        });\n        return res.redirect('/unsubscribed');\n      });\n    });\n  }\n\n  function unsubscribed(req, res) {\n    res.render('resources/unsubscribed', {\n      title: 'You have been unsubscribed'\n    });\n  }\n\n  function getStarted(req, res) {\n    res.render('resources/get-started', {\n      title: 'How to get started with Free Code Camp'\n    });\n  }\n\n  function githubCalls(req, res, next) {\n    var githubHeaders = {\n      headers: {\n        'User-Agent': constantStrings.gitHubUserAgent\n      },\n      port: 80\n    };\n    request(\n      [\n        'https://api.github.com/repos/freecodecamp/',\n        'freecodecamp/pulls?client_id=',\n        secrets.github.clientID,\n        '&client_secret=',\n        secrets.github.clientSecret\n      ].join(''),\n      githubHeaders,\n      function(err, status1, pulls) {\n        if (err) { return next(err); }\n        pulls = pulls ?\n          Object.keys(JSON.parse(pulls)).length :\n          'Can\\'t connect to github';\n\n        return request(\n          [\n            'https://api.github.com/repos/freecodecamp/',\n            'freecodecamp/issues?client_id=',\n            secrets.github.clientID,\n            '&client_secret=',\n            secrets.github.clientSecret\n          ].join(''),\n          githubHeaders,\n          function(err, status2, issues) {\n            if (err) { return next(err); }\n            issues = ((pulls === parseInt(pulls, 10)) && issues) ?\n            Object.keys(JSON.parse(issues)).length - pulls :\n              \"Can't connect to GitHub\";\n            return res.send({\n              issues: issues,\n              pulls: pulls\n            });\n          }\n        );\n      }\n    );\n  }\n\n  function trelloCalls(req, res, next) {\n    request(\n      'https://trello.com/1/boards/BA3xVpz9/cards?key=' +\n      secrets.trello.key,\n      function(err, status, trello) {\n        if (err) { return next(err); }\n        trello = (status && status.statusCode === 200) ?\n          (JSON.parse(trello)) :\n          'Can\\'t connect to to Trello';\n\n        return res.end(JSON.stringify(trello));\n      });\n  }\n\n  function bloggerCalls(req, res, next) {\n    request(\n      'https://www.gdgdocs.org/blogger/v3/blogs/2421288658305323950/' +\n        'posts?key=' +\n      secrets.blogger.key,\n      function(err, status, blog) {\n        if (err) { return next(err); }\n\n        blog = (status && status.statusCode === 200) ?\n          JSON.parse(blog) :\n          'Can\\'t connect to Blogger';\n        return res.end(JSON.stringify(blog));\n      }\n    );\n  }\n};\n"
  },
  {
    "path": "server/boot/redirectHttps.js",
    "content": "var path = require('path');\nvar loopback = require('loopback');\nvar express = require('express');\n\nvar port = 1337;\n\n// this will listen to traffic on port 1337\n// The purpose is to redirect any user who is direct to https\n// instead of http by mistake. Our nginx proxy server will listen\n// for https traffic and serve from this port on this server.\n// the view being send will have a short timeout and a redirect\nmodule.exports = function(loopbackApp) {\n  var app = express();\n  app.set('view engine', 'jade');\n  // views in ../views'\n  app.set('views', path.join(__dirname, '..'));\n\n  // server static files\n  app.use(loopback.static(path.join(\n    __dirname,\n    '../',\n    '../public'\n  )));\n\n  // all traffic will be redirected on page load;\n  app.use(function(req, res) {\n    return res.render('views/redirect-https');\n  });\n\n  loopbackApp.once('started', function() {\n    app.listen(port, function() {\n      console.log('https redirect listening on port %s', port);\n    });\n  });\n};\n"
  },
  {
    "path": "server/boot/redirects.js",
    "content": "module.exports = function(app) {\n  var router = app.loopback.Router();\n\n  router.get('/nonprofit-project-instructions', function(req, res) {\n    res.redirect(\n      301,\n      '//github.com/FreeCodeCamp/freecodecamp/wiki/' +\n        \"How-Free-Code-Camp's-Nonprofit-Projects-work\"\n    );\n  });\n\n  router.get('/agile', function(req, res) {\n    res.redirect(301, '/pmi-acp-agile-project-managers');\n  });\n\n  router.get('/privacy', function(req, res) {\n    res.redirect(\n      301,\n      '//github.com/FreeCodeCamp/freecodecamp/wiki/' +\n        \"Free-Code-Camp's-Privacy-Policy\"\n    );\n  });\n\n  router.get('/learn-to-code', function(req, res) {\n    res.redirect(301, '/map');\n  });\n\n  router.get('/field-guide/*', function(req, res) {\n    res.redirect(302, '/wiki');\n  });\n\n  router.get('/about', function(req, res) {\n    res.redirect(301, '/map');\n  });\n\n  app.use(router);\n};\n"
  },
  {
    "path": "server/boot/restApi.js",
    "content": "module.exports = function mountRestApi(app) {\n  var restApiRoot = app.get('restApiRoot');\n  app.use(restApiRoot, app.loopback.rest());\n};\n"
  },
  {
    "path": "server/boot/story.js",
    "content": "var Rx = require('rx'),\n    assign = require('object.assign'),\n    sanitizeHtml = require('sanitize-html'),\n    moment = require('moment'),\n    debug = require('debug')('fcc:cntr:story'),\n    utils = require('../utils'),\n    observeMethod = require('../utils/rx').observeMethod,\n    saveUser = require('../utils/rx').saveUser,\n    saveInstance = require('../utils/rx').saveInstance,\n    validator = require('validator');\n\nimport {\n  ifNoUser401,\n  ifNoUserRedirectTo\n} from '../utils/middleware';\n\nconst foundationDate = 1413298800000;\nconst time48Hours = 172800000;\n\nconst unDasherize = utils.unDasherize;\nconst dasherize = utils.dasherize;\nconst getURLTitle = utils.getURLTitle;\nconst sendNonUserToNews = ifNoUserRedirectTo('/news');\n\nfunction hotRank(timeValue, rank) {\n  /*\n  * Hotness ranking algorithm: http://amix.dk/blog/post/19588\n  * tMS = postedOnDate - foundationTime;\n  * Ranking...\n  * f(ts, 1, rank) = log(10)z + (ts)/45000;\n  */\n  var z = Math.log(rank) / Math.log(10);\n  var hotness = z + (timeValue / time48Hours);\n  return hotness;\n}\n\nfunction sortByRank(a, b) {\n  return hotRank(b.timePosted - foundationDate, b.rank) -\n    hotRank(a.timePosted - foundationDate, a.rank);\n}\n\nfunction cleanData(data, opts) {\n  var options = assign(\n    {},\n    {\n      allowedTags: [],\n      allowedAttributes: []\n    },\n    opts || {}\n  );\n  return sanitizeHtml(data, options).replace(/&quot;;/g, '\"');\n}\n\nmodule.exports = function(app) {\n  var router = app.loopback.Router();\n  var User = app.models.User;\n  var findUserById = observeMethod(User, 'findById');\n\n  var Story = app.models.Story;\n  var findStory = observeMethod(Story, 'find');\n  var findOneStory = observeMethod(Story, 'findOne');\n  var findStoryById = observeMethod(Story, 'findById');\n  var countStories = observeMethod(Story, 'count');\n\n  router.post('/news/userstories', userStories);\n  router.get('/news/hot', hotJSON);\n  router.get('/news/feed', RSSFeed);\n  router.get('/stories/hotStories', hotJSON);\n  router.get(\n    '/stories/submit',\n    sendNonUserToNews,\n    submitNew\n  );\n  router.get(\n    '/stories/submit/new-story',\n    sendNonUserToNews,\n    preSubmit\n  );\n  router.post('/stories/preliminary', ifNoUser401, newStory);\n  router.post('/stories/', ifNoUser401, storySubmission);\n  router.get('/news/', hot);\n  router.post('/stories/search', getStories);\n  router.get('/news/:storyName', returnIndividualStory);\n  router.post('/stories/upvote/', ifNoUser401, upvote);\n  router.get('/stories/:storyName', redirectToNews);\n\n  app.use(router);\n\n  function redirectToNews(req, res) {\n    var url = req.originalUrl.replace(/^\\/stories/, '/news');\n    return res.redirect(url);\n  }\n\n  function hotJSON(req, res, next) {\n    var query = {\n      order: 'timePosted DESC',\n      limit: 1000\n    };\n    findStory(query).subscribe(\n      function(stories) {\n        var sliceVal = stories.length >= 100 ? 100 : stories.length;\n        var data = stories.sort(sortByRank).slice(0, sliceVal);\n        res.json(data);\n      },\n      next\n    );\n  }\n\n  function RSSFeed(req, res, next) {\n    var query = {\n      order: 'timePosted DESC',\n      limit: 1000\n    };\n    findStory(query).subscribe(\n      function(stories) {\n        var sliceVal = stories.length >= 100 ? 100 : stories.length;\n        var data = stories.sort(sortByRank).slice(0, sliceVal);\n        res.set('Content-Type', 'text/xml');\n        res.render('feed', {\n          title: 'FreeCodeCamp Camper News RSS Feed',\n          description: 'RSS Feed for FreeCodeCamp Top 100 Hot Camper News',\n          url: 'http://www.freecodecamp.com/news',\n          FeedPosts: data\n        });\n      },\n      next\n    );\n  }\n\n  function hot(req, res) {\n    return res.render('stories/index', {\n      title: 'Top Stories on Camper News',\n      page: 'hot'\n    });\n  }\n\n  function submitNew(req, res) {\n    if (!req.user.isGithubCool) {\n      req.flash('errors', {\n        msg: 'You must link GitHub with your account before you can post' +\n          ' on Camper News.'\n      });\n      return res.redirect('/news');\n    }\n\n    return res.render('stories/index', {\n      title: 'Submit a new story to Camper News',\n      page: 'submit'\n    });\n  }\n\n  function preSubmit(req, res) {\n    var data = req.query;\n    if (typeof data.url !== 'string') {\n      req.flash('errors', { msg: 'No URL supplied with story' });\n      return res.redirect('/news');\n    }\n    var cleanedData = cleanData(data.url);\n\n    if (data.url.replace(/&/g, '&amp;') !== cleanedData) {\n      req.flash('errors', {\n        msg: 'The data for this post is malformed'\n      });\n      return res.render('stories/index', {\n        page: 'stories/submit'\n      });\n    }\n\n    var title = data.title || '';\n    var image = data.image || '';\n    var description = data.description || '';\n    return res.render('stories/index', {\n      title: 'Confirm your Camper News story submission',\n      page: 'storySubmission',\n      storyURL: data.url,\n      storyTitle: title,\n      storyImage: image,\n      storyMetaDescription: description\n    });\n  }\n\n  function returnIndividualStory(req, res, next) {\n    var dashedName = req.params.storyName;\n    var storyName = unDasherize(dashedName);\n\n    findOneStory({ where: { storyLink: storyName } }).subscribe(\n      function(story) {\n        if (!story) {\n          req.flash('errors', {\n            msg: \"404: We couldn't find a story with that name. \" +\n            'Please double check the name.'\n          });\n          return res.redirect('/news');\n        }\n\n        var dashedNameFull = story.storyLink.toLowerCase()\n          .replace(/\\s+/g, ' ')\n          .replace(/\\s/g, '-');\n\n        if (dashedNameFull !== dashedName) {\n          return res.redirect('../stories/' + dashedNameFull);\n        }\n\n        var username = req.user ? req.user.username : '';\n        // true if any of votes are made by user\n        var userVoted = story.upVotes.some(function(upvote) {\n          return upvote.upVotedByUsername === username;\n        });\n\n        return res.render('stories/index', {\n          title: story.headline,\n          link: story.link,\n          originalStoryLink: dashedName,\n          author: story.author,\n          rank: story.upVotes.length,\n          upVotes: story.upVotes,\n          id: story.id,\n          timeAgo: moment(story.timePosted).fromNow(),\n          image: story.image,\n          page: 'show',\n          storyMetaDescription: story.metaDescription,\n          hasUserVoted: userVoted\n        });\n      },\n      next\n    );\n  }\n\n  function userStories({ body: { search = '' } = {} }, res, next) {\n    if (!search || typeof search !== 'string') {\n      return res.sendStatus(404);\n    }\n\n    return app.dataSources.db.connector\n      .collection('story')\n      .find({\n        'author.username': search.toLowerCase().replace('$', '')\n      })\n      .toArray(function(err, items) {\n        if (err) {\n          return next(err);\n        }\n        if (items && items.length !== 0) {\n          return res.json(items.sort(sortByRank));\n        }\n        return res.sendStatus(404);\n      });\n  }\n\n  function getStories({ body: { search = '' } = {} }, res, next) {\n    if (!search || typeof search !== 'string') {\n      return res.sendStatus(404);\n    }\n\n    const query = {\n      '$text': {\n        // protect against NoSQL injection\n        '$search': search.replace('$', '')\n      }\n    };\n\n    const fields = {\n      headline: 1,\n      timePosted: 1,\n      link: 1,\n      description: 1,\n      rank: 1,\n      upVotes: 1,\n      author: 1,\n      image: 1,\n      storyLink: 1,\n      metaDescription: 1,\n      textScore: {\n        $meta: 'textScore'\n      }\n    };\n\n    const options = {\n      sort: {\n        textScore: {\n          $meta: 'textScore'\n        }\n      }\n    };\n\n    return app.dataSources.db.connector\n      .collection('story')\n      .find(query, fields, options)\n      .toArray(function(err, items) {\n        if (err) {\n          return next(err);\n        }\n        if (items && items.length !== 0) {\n          return res.json(items);\n        }\n        return res.sendStatus(404);\n      });\n  }\n\n  function upvote(req, res, next) {\n    const { id } = req.body;\n    var story$ = findStoryById(id).shareReplay();\n\n    story$.flatMap(function(story) {\n        // find story author\n        return findUserById(story.author.userId);\n      })\n      .flatMap(function(user) {\n        // if user deletes account then this will not exist\n        if (user) {\n          user.progressTimestamps.push({\n            timestamp: Date.now()\n          });\n        }\n        return saveUser(user);\n      })\n      .flatMap(function() {\n        return story$;\n      })\n      .flatMap(function(story) {\n        debug('upvoting');\n        story.rank += 1;\n        story.upVotes.push({\n          upVotedBy: req.user.id,\n          upVotedByUsername: req.user.username\n        });\n        return saveInstance(story);\n      })\n      .subscribe(\n        function(story) {\n          return res.send(story);\n        },\n        next\n      );\n  }\n\n  function newStory(req, res, next) {\n    if (!req.user.isGithubCool) {\n      req.flash('errors', {\n        msg: 'You must authenticate with Github to post to Camper News'\n      });\n      return res.redirect('/news');\n    }\n    var url = req.body.data.url;\n\n    if (!validator.isURL('' + url)) {\n      req.flash('errors', {\n        msg: \"The URL you submitted doesn't appear valid\"\n      });\n      return res.json({\n        alreadyPosted: true,\n        storyURL: '/stories/submit'\n      });\n\n    }\n    if (url.search(/^https?:\\/\\//g) === -1) {\n      url = 'http://' + url;\n    }\n\n    return findStory({ where: { link: url } })\n      .map(function(stories) {\n        if (stories.length) {\n          return {\n            alreadyPosted: true,\n            storyURL: '/stories/' + stories.pop().storyLink\n          };\n        }\n        return {\n          alreadyPosted: false,\n          storyURL: url\n        };\n      })\n      .flatMap(function(data) {\n        if (data.alreadyPosted) {\n          return Rx.Observable.just(data);\n        }\n        return Rx.Observable.fromNodeCallback(getURLTitle)(data.storyURL)\n          .map(function(story) {\n            return {\n              alreadyPosted: false,\n              storyURL: data.storyURL,\n              storyTitle: story.title,\n              storyImage: story.image,\n              storyMetaDescription: story.description\n            };\n          });\n      })\n      .subscribe(\n        function(story) {\n          if (story.alreadyPosted) {\n            req.flash('errors', {\n              msg: \"Someone's already posted that link. Here's the discussion.\"\n            });\n          }\n          res.json(story);\n        },\n        next\n      );\n  }\n\n  function storySubmission(req, res, next) {\n    if (req.user.isBanned) {\n      return res.json({\n        isBanned: true\n      });\n    }\n    var data = req.body.data;\n\n    var storyLink = data.headline\n      .replace(/[^a-z0-9\\s]/gi, '')\n      .replace(/\\s+/g, ' ')\n      .toLowerCase()\n      .trim();\n\n    var link = data.link;\n\n    if (link.search(/^https?:\\/\\//g) === -1) {\n      link = 'http://' + link;\n    }\n\n    var query = {\n      storyLink: {\n        like: ('^' + storyLink + '(?: [0-9]+)?$'),\n        options: 'i'\n      }\n    };\n\n    var savedStory = countStories(query)\n      .flatMap(function(storyCount) {\n        // if duplicate storyLink add unique number\n        storyLink = (storyCount === 0) ?\n          storyLink :\n          storyLink + ' ' + storyCount;\n\n        var link = data.link;\n        if (link.search(/^https?:\\/\\//g) === -1) {\n          link = 'http://' + link;\n        }\n        var newStory = new Story({\n          headline: cleanData(data.headline),\n          timePosted: Date.now(),\n          link: link,\n          description: cleanData(data.description),\n          rank: 1,\n          upVotes: [({\n            upVotedBy: req.user.id,\n            upVotedByUsername: req.user.username\n          })],\n          author: {\n            picture: req.user.picture,\n            userId: req.user.id,\n            username: req.user.username\n          },\n          image: data.image,\n          storyLink: storyLink,\n          metaDescription: data.storyMetaDescription\n        });\n        return saveInstance(newStory);\n      });\n\n    req.user.progressTimestamps.push({\n      timestamp: Date.now()\n    });\n    return saveUser(req.user)\n      .flatMap(savedStory)\n      .subscribe(\n        function(story) {\n          res.json({\n            storyLink: dasherize(story.storyLink)\n          });\n        },\n        next\n      );\n  }\n};\n"
  },
  {
    "path": "server/boot/t-wiki.js",
    "content": "module.exports = function(app) {\n  var router = app.loopback.Router();\n  router.get('/wiki/*', showWiki);\n  router.get('/wiki', showWiki);\n\n  app.use(router);\n\n  function showWiki(req, res) {\n    res.render('wiki/show', { title: 'Wiki | Free Code Camp' });\n  }\n};\n"
  },
  {
    "path": "server/boot/user.js",
    "content": "import dedent from 'dedent';\nimport moment from 'moment-timezone';\nimport { Observable } from 'rx';\nimport debugFactory from 'debug';\n\nimport {\n  frontEndChallengeId,\n  dataVisChallengeId,\n  backEndChallengeId\n} from '../utils/constantStrings.json';\n\nimport certTypes from '../utils/certTypes.json';\n\nimport { ifNoUser401, ifNoUserRedirectTo } from '../utils/middleware';\nimport { observeQuery } from '../utils/rx';\nimport {\n  prepUniqueDays,\n  calcCurrentStreak,\n  calcLongestStreak\n} from '../utils/user-stats';\n\nconst debug = debugFactory('fcc:boot:user');\nconst sendNonUserToMap = ifNoUserRedirectTo('/map');\nconst certIds = {\n  [certTypes.frontEnd]: frontEndChallengeId,\n  [certTypes.dataVis]: dataVisChallengeId,\n  [certTypes.backEnd]: backEndChallengeId\n};\n\nconst certViews = {\n  [certTypes.frontEnd]: 'certificate/front-end.jade',\n  [certTypes.dataVis]: 'certificate/data-vis.jade',\n  [certTypes.backEnd]: 'certificate/back-end.jade',\n  [certTypes.fullStack]: 'certificate/full-stack.jade'\n};\n\nconst certText = {\n  [certTypes.fronEnd]: 'Front End certified',\n  [certTypes.dataVis]: 'Data Vis Certified',\n  [certTypes.backEnd]: 'Back End Certified',\n  [certTypes.fullStack]: 'Full Stack Certified'\n};\n\nconst dateFormat = 'MMM DD, YYYY';\n\nfunction replaceScriptTags(value) {\n  return value\n    .replace(/<script>/gi, 'fccss')\n    .replace(/<\\/script>/gi, 'fcces');\n}\n\nfunction replaceFormAction(value) {\n  return value.replace(/<form[^>]*>/, function(val) {\n    return val.replace(/action(\\s*?)=/, 'fccfaa$1=');\n  });\n}\n\nfunction encodeFcc(value = '') {\n  return replaceScriptTags(replaceFormAction(value));\n}\n\nfunction isAlgorithm(challenge) {\n  // test if name starts with hike/waypoint/basejump/zipline\n  // fix for bug that saved different challenges with incorrect\n  // challenge types\n  return !(/^(waypoint|hike|zipline|basejump)/i).test(challenge.name) &&\n    +challenge.challengeType === 5;\n}\n\nfunction isProject(challenge) {\n  return +challenge.challengeType === 3 ||\n    +challenge.challengeType === 4;\n}\n\nfunction getChallengeGroup(challenge) {\n  if (isProject(challenge)) {\n    return 'projects';\n  } else if (isAlgorithm(challenge)) {\n    return 'algorithms';\n  }\n  return 'challenges';\n}\n\n// buildDisplayChallenges(challengeMap: Object, tz: String) => Observable[{\n//   algorithms: Array,\n//   projects: Array,\n//   challenges: Array\n// }]\nfunction buildDisplayChallenges(challengeMap = {}, timezone) {\n  return Observable.from(Object.keys(challengeMap))\n    .map(challengeId => challengeMap[challengeId])\n    .map(challenge => {\n      let finalChallenge = { ...challenge };\n      if (challenge.completedDate) {\n        finalChallenge.completedDate = moment\n          .tz(challenge.completedDate, timezone)\n          .format(dateFormat);\n      }\n\n      if (challenge.lastUpdated) {\n        finalChallenge.lastUpdated = moment\n          .tz(challenge.lastUpdated, timezone)\n          .format(dateFormat);\n      }\n\n      return finalChallenge;\n    })\n    .filter(({ challengeType }) => challengeType !== 6)\n    .groupBy(getChallengeGroup)\n    .flatMap(group$ => {\n      return group$.toArray().map(challenges => ({\n        [getChallengeGroup(challenges[0])]: challenges\n      }));\n    })\n    .reduce((output, group) => ({ ...output, ...group}), {})\n    .map(groups => ({\n      algorithms: groups.algorithms || [],\n      projects: groups.projects || [],\n      challenges: groups.challenges || []\n    }));\n}\n\nmodule.exports = function(app) {\n  var router = app.loopback.Router();\n  var User = app.models.User;\n  function findUserByUsername$(username, fields) {\n    return observeQuery(\n      User,\n      'findOne',\n      {\n        where: { username },\n        fields\n      }\n    );\n  }\n\n  router.get('/login', function(req, res) {\n    res.redirect(301, '/signin');\n  });\n  router.get('/logout', function(req, res) {\n    res.redirect(301, '/signout');\n  });\n  router.get('/signin', getSignin);\n  router.get('/signout', signout);\n  router.get('/forgot', getForgot);\n  router.post('/forgot', postForgot);\n  router.get('/reset-password', getReset);\n  router.post('/reset-password', postReset);\n  // Disable email signup\n  // router.get('/email-signup', getEmailSignup);\n  router.get('/email-signin', getEmailSignin);\n  router.get(\n    '/toggle-lockdown-mode',\n    sendNonUserToMap,\n    toggleLockdownMode\n  );\n  router.get(\n    '/toggle-announcement-email-mode',\n    sendNonUserToMap,\n    toggleReceivesAnnouncementEmails\n  );\n  router.get(\n    '/toggle-notification-email-mode',\n    sendNonUserToMap,\n    toggleReceivesNotificationEmails\n  );\n  router.get(\n    '/toggle-quincy-email-mode',\n    sendNonUserToMap,\n    toggleReceivesQuincyEmails\n  );\n  router.post(\n    '/account/delete',\n    ifNoUser401,\n    postDeleteAccount\n  );\n  router.get(\n    '/account',\n    sendNonUserToMap,\n    getAccount\n  );\n  router.get(\n    '/settings',\n    sendNonUserToMap,\n    getSettings\n  );\n  router.get('/vote1', vote1);\n  router.get('/vote2', vote2);\n\n  // Ensure these are the last routes!\n  router.get(\n    '/:username/front-end-certification',\n    showCert.bind(null, certTypes.frontEnd)\n  );\n\n  router.get(\n    '/:username/data-visualization-certification',\n    showCert.bind(null, certTypes.dataVis)\n  );\n\n  router.get(\n    '/:username/back-end-certification',\n    showCert.bind(null, certTypes.backEnd)\n  );\n\n  router.get(\n    '/:username/full-stack-certification',\n    (req, res) => res.redirect(req.url.replace('full-stack', 'back-end'))\n  );\n\n  router.get('/:username', returnUser);\n\n  app.use(router);\n\n  function getSignin(req, res) {\n    if (req.user) {\n      return res.redirect('/');\n    }\n    return res.render('account/signin', {\n      title: 'Sign in to Free Code Camp using a Social Media Account'\n    });\n  }\n\n  function signout(req, res) {\n    req.logout();\n    res.redirect('/');\n  }\n\n  function getEmailSignin(req, res) {\n    if (req.user) {\n      return res.redirect('/');\n    }\n    return res.render('account/email-signin', {\n      title: 'Sign in to Free Code Camp using your Email Address'\n    });\n  }\n\n  /* Comment this out as Email Signup is currently disabled\n  function getEmailSignup(req, res) {\n    if (req.user) {\n      return res.redirect('/');\n    }\n    return res.render('account/email-signup', {\n      title: 'Sign up for Free Code Camp using your Email Address'\n    });\n  }\n  */\n\n  function getAccount(req, res) {\n    const { username } = req.user;\n    return res.redirect('/' + username);\n  }\n\n  function getSettings(req, res) {\n    res.render('account/settings', {\n        title: 'Settings'\n    });\n  }\n\n  function returnUser(req, res, next) {\n    const username = req.params.username.toLowerCase();\n    const { user, path } = req;\n\n    // timezone of signed-in account\n    // to show all date related components\n    // using signed-in account's timezone\n    // not of the profile she is viewing\n    const timezone = user && user.timezone ?\n      user.timezone :\n      'UTC';\n\n    const query = {\n      where: { username },\n      include: 'pledge'\n    };\n\n    return User.findOne$(query)\n      .filter(userPortfolio => {\n        if (!userPortfolio) {\n          req.flash('errors', {\n            msg: `We couldn't find a page for ${ path }`\n          });\n          res.redirect('/');\n        }\n        return !!userPortfolio;\n      })\n      .flatMap(userPortfolio => {\n        userPortfolio = userPortfolio.toJSON();\n\n        const timestamps = userPortfolio\n          .progressTimestamps\n          .map(objOrNum => {\n            return typeof objOrNum === 'number' ?\n              objOrNum :\n              objOrNum.timestamp;\n          });\n\n        const uniqueDays = prepUniqueDays(timestamps, timezone);\n\n        userPortfolio.currentStreak = calcCurrentStreak(uniqueDays, timezone);\n        userPortfolio.longestStreak = calcLongestStreak(uniqueDays, timezone);\n\n        const calender = userPortfolio\n          .progressTimestamps\n          .map((objOrNum) => {\n            return typeof objOrNum === 'number' ?\n              objOrNum :\n              objOrNum.timestamp;\n          })\n          .filter((timestamp) => {\n            return !!timestamp;\n          })\n          .reduce((data, timeStamp) => {\n            data[(timeStamp / 1000)] = 1;\n            return data;\n          }, {});\n\n        return buildDisplayChallenges(userPortfolio.challengeMap, timezone)\n          .map(displayChallenges => ({\n            ...userPortfolio,\n            ...displayChallenges,\n            title: 'Camper ' + userPortfolio.username + '\\'s Code Portfolio',\n            calender,\n            github: userPortfolio.githubURL,\n            moment,\n            encodeFcc\n          }));\n      })\n      .doOnNext(data => {\n        return res.render('account/show', data);\n      })\n      .subscribe(\n        () => {},\n        next\n      );\n  }\n\n  function showCert(certType, req, res, next) {\n    const username = req.params.username.toLowerCase();\n    const certId = certIds[certType];\n    return findUserByUsername$(username, {\n          isGithubCool: true,\n          isCheater: true,\n          isLocked: true,\n          isFrontEndCert: true,\n          isDataVisCert: true,\n          isBackEndCert: true,\n          isFullStackCert: true,\n          isHonest: true,\n          username: true,\n          name: true,\n          challengeMap: true\n      })\n      .subscribe(\n        user => {\n          if (!user) {\n            req.flash('errors', {\n              msg: `We couldn't find a user with the username ${username}`\n            });\n            return res.redirect('/');\n          }\n          if (!user.isGithubCool) {\n            req.flash('errors', {\n              msg: dedent`\n                This user needs to link GitHub with their account\n                in order for others to be able to view their certificate.\n              `\n            });\n            return res.redirect('back');\n          }\n\n          if (user.isCheater) {\n            req.flash('errors', {\n              msg: dedent`\n                很抱歉，该账户违反了学术诚实守则。如果你是该账户的主人，请联系jin@freecodecamp.cn获知缘由。\n              `\n            });\n            return res.redirect(`/${user.username}`);\n          }\n\n          if (user.isLocked) {\n            req.flash('errors', {\n              msg: dedent`\n                ${username} has chosen to make their profile\n                  private. They will need to make their profile public\n                  in order for others to be able to view their certificate.\n              `\n            });\n            return res.redirect('back');\n          }\n          if (!user.isHonest) {\n            req.flash('errors', {\n              msg: dedent`\n                ${username} has not yet agreed to our Academic Honesty Pledge.\n              `\n            });\n            return res.redirect('back');\n          }\n\n          if (user[certType]) {\n\n            const { challengeMap = {} } = user;\n            const { completedDate = new Date() } = challengeMap[certId] || {};\n\n            return res.render(\n              certViews[certType],\n              {\n                username: user.username,\n                date: moment(new Date(completedDate)).format('MMMM, Do YYYY'),\n                name: user.name\n              }\n            );\n          }\n          req.flash('errors', {\n            msg: `Looks like user ${username} is not ${certText[certType]}`\n          });\n          return res.redirect('back');\n        },\n        next\n      );\n  }\n\n  function toggleLockdownMode(req, res, next) {\n    return User.findById(req.accessToken.userId, function(err, user) {\n      if (err) { return next(err); }\n      return user.updateAttribute('isLocked', !user.isLocked, function(err) {\n        if (err) { return next(err); }\n        req.flash('info', {\n          msg: 'We\\'ve successfully updated your Privacy preferences.'\n        });\n        return res.redirect('/settings');\n      });\n    });\n  }\n\n  function toggleReceivesAnnouncementEmails(req, res, next) {\n    return User.findById(req.accessToken.userId, function(err, user) {\n      if (err) { return next(err); }\n      return user.updateAttribute(\n        'sendMonthlyEmail',\n        !user.sendMonthlyEmail,\n        (err) => {\n          if (err) { return next(err); }\n          req.flash('info', {\n            msg: 'We\\'ve successfully updated your Email preferences.'\n          });\n          return res.redirect('/settings');\n        });\n    });\n  }\n\n  function toggleReceivesQuincyEmails(req, res, next) {\n    return User.findById(req.accessToken.userId, function(err, user) {\n      if (err) { return next(err); }\n      return user.updateAttribute('sendQuincyEmail', !user.sendQuincyEmail,\n        (err) => {\n          if (err) { return next(err); }\n          req.flash('info', {\n            msg: 'We\\'ve successfully updated your Email preferences.'\n          });\n          return res.redirect('/settings');\n        }\n      );\n    });\n  }\n\n  function toggleReceivesNotificationEmails(req, res, next) {\n    return User.findById(req.accessToken.userId, function(err, user) {\n      if (err) { return next(err); }\n      return user.updateAttribute(\n        'sendNotificationEmail',\n        !user.sendNotificationEmail,\n        function(err) {\n          if (err) { return next(err); }\n          req.flash('info', {\n            msg: 'We\\'ve successfully updated your Email preferences.'\n          });\n          return res.redirect('/settings');\n      });\n    });\n  }\n\n  function postDeleteAccount(req, res, next) {\n    User.destroyById(req.user.id, function(err) {\n      if (err) { return next(err); }\n      req.logout();\n      req.flash('info', { msg: 'You\\'ve successfully deleted your account.' });\n      return res.redirect('/');\n    });\n  }\n\n  function getReset(req, res) {\n    if (!req.accessToken) {\n      req.flash('errors', { msg: 'access token invalid' });\n      return res.render('account/forgot');\n    }\n    return res.render('account/reset', {\n      title: 'Reset your Password',\n      accessToken: req.accessToken.id\n    });\n  }\n\n  function postReset(req, res, next) {\n    const errors = req.validationErrors();\n    const { password } = req.body;\n\n    if (errors) {\n      req.flash('errors', errors);\n      return res.redirect('back');\n    }\n\n    return User.findById(req.accessToken.userId, function(err, user) {\n      if (err) { return next(err); }\n      return user.updateAttribute('password', password, function(err) {\n        if (err) { return next(err); }\n\n        debug('password reset processed successfully');\n        req.flash('info', { msg: 'You\\'ve successfully reset your password.' });\n        return res.redirect('/');\n      });\n    });\n  }\n\n  function getForgot(req, res) {\n    if (req.isAuthenticated()) {\n      return res.redirect('/');\n    }\n    return res.render('account/forgot', {\n      title: 'Forgot Password'\n    });\n  }\n\n  function postForgot(req, res) {\n    const errors = req.validationErrors();\n    const email = req.body.email.toLowerCase();\n\n    if (errors) {\n      req.flash('errors', errors);\n      return res.redirect('/forgot');\n    }\n\n    return User.resetPassword({\n      email: email\n    }, function(err) {\n      if (err) {\n        req.flash('errors', err.message);\n        return res.redirect('/forgot');\n      }\n\n      req.flash('info', {\n        msg: 'An e-mail has been sent to ' +\n        email +\n        ' with further instructions.'\n      });\n      return res.render('account/forgot');\n    });\n  }\n\n  function vote1(req, res, next) {\n    if (req.user) {\n      req.user.tshirtVote = 1;\n      req.user.save(function(err) {\n        if (err) { return next(err); }\n\n        req.flash('success', { msg: 'Thanks for voting!' });\n        return res.redirect('/map');\n      });\n    } else {\n      req.flash('error', { msg: 'You must be signed in to vote.' });\n      res.redirect('/map');\n    }\n  }\n\n  function vote2(req, res, next) {\n    if (req.user) {\n      req.user.tshirtVote = 2;\n      req.user.save(function(err) {\n        if (err) { return next(err); }\n\n        req.flash('success', { msg: 'Thanks for voting!' });\n        return res.redirect('/map');\n      });\n    } else {\n      req.flash('error', {msg: 'You must be signed in to vote.'});\n      res.redirect('/map');\n    }\n  }\n};\n"
  },
  {
    "path": "server/config.development.js",
    "content": "module.exports = {\n  host: '127.0.0.1',\n  sessionSecret: process.env.SESSION_SECRET,\n\n  trello: {\n    key: process.env.TRELLO_KEY,\n    secret: process.env.TRELLO_SECRET\n  },\n\n  blogger: {\n    key: process.env.BLOGGER_KEY\n  },\n\n  github: {\n    clientID: process.env.GITHUB_ID,\n    clientSecret: process.env.GITHUB_SECRET\n  }\n};\n"
  },
  {
    "path": "server/config.json",
    "content": "{\n  \"restApiRoot\": \"/api\",\n  \"host\": \"127.0.0.1\",\n  \"port\": 3000,\n  \"legacyExplorer\": false,\n  \"remoting\": {\n    \"context\": {\n      \"enableHttpContext\": false\n    },\n    \"rest\": {\n      \"normalizeHttpPath\": false,\n      \"xml\": false\n    },\n    \"json\": {\n      \"strict\": false,\n      \"limit\": \"100kb\"\n    },\n    \"urlencoded\": {\n      \"extended\": true,\n      \"limit\": \"100kb\"\n    },\n    \"cors\": {\n      \"origin\": true,\n      \"credentials\": true\n    },\n    \"errorHandler\": {\n      \"disableStackTrace\": false\n    }\n  }\n}\n"
  },
  {
    "path": "server/config.local.js",
    "content": "var globalConfig = require('../common/config.global');\n\nmodule.exports = {\n  restApiRoot: globalConfig.restApi,\n  sessionSecret: process.env.SESSION_SECRET,\n\n  trello: {\n    key: process.env.TRELLO_KEY,\n    secret: process.env.TRELLO_SECRET\n  },\n\n  blogger: {\n    key: process.env.BLOGGER_KEY\n  },\n\n  github: {\n    clientID: process.env.GITHUB_ID,\n    clientSecret: process.env.GITHUB_SECRET\n  }\n};\n"
  },
  {
    "path": "server/config.production.js",
    "content": "module.exports = {\n  host: process.env.HOST || 'localhost'\n};\n"
  },
  {
    "path": "server/datasources.json",
    "content": "{\n  \"db\": {\n    \"name\": \"db\",\n    \"connector\": \"mongodb\"\n  },\n  \"mail\": {\n    \"name\": \"mail\",\n    \"connector\": \"mail\"\n  }\n}\n"
  },
  {
    "path": "server/datasources.local.js",
    "content": "var secrets = require('../config/secrets');\n\nmodule.exports = {\n  db: {\n    connector: 'mongodb',\n    connectionTimeout: 10000,\n    url: secrets.db\n  },\n  mail: {\n    connector: 'mail',\n    transports: [{\n      type: 'smtp',\n      service: 'Mandrill',\n      auth: {\n        user: secrets.mandrill.user,\n        pass: secrets.mandrill.password\n      }\n    }]\n  }\n};\n"
  },
  {
    "path": "server/debug-entry.js",
    "content": "// use this file with runners like node-debug\n// or mocha.\nrequire('babel-register');\nvar app = require('./server');\napp.start();\n"
  },
  {
    "path": "server/manifests/README.md",
    "content": "This folder contains a list of json files representing the name\nof revisioned client files. It is empty due to the fact that the\nfiles are generated at runtime and their content is determined by\nthe content of the files they are derived from.\n\nSince the build process is not exactly the same on every machine,\nthese files are not tracked in github otherwise conflicts arise when\nbuilding on our servers.\n"
  },
  {
    "path": "server/middleware.json",
    "content": "{\n  \"initial:before\": {\n    \"loopback#favicon\": {\n      \"params\": \"$!../public/favicon.ico\"\n    },\n    \"loopback#static\": {\n      \"params\": [\n        \"$!../public\",\n        {\n          \"maxAge\": \"86400000\"\n        }\n      ]\n    }\n  },\n  \"initial\": {\n    \"compression\": {},\n    \"morgan\": {\n      \"params\": \":status :method :response-time ms - :url\"\n    }\n  },\n  \"session\": {\n    \"./middlewares/sessions.js\": {}\n  },\n  \"auth:before\": {\n    \"./middlewares/add-return-to\": {}\n  },\n  \"auth\": {\n  },\n  \"parse\": {\n    \"body-parser#json\": {},\n    \"body-parser#urlencoded\": {\n      \"params\": { \"extended\": true }\n    },\n    \"method-override\": {},\n    \"./middlewares/cookie-parser\": {}\n  },\n  \"parse:after\": {\n    \"./middlewares/validator\": {}\n  },\n  \"routes:before\": {\n    \"express-flash\": {},\n    \"helmet#xssFilter\": {},\n    \"helmet#noSniff\": {},\n    \"helmet#frameguard\": {},\n    \"./middlewares/constant-headers\": {},\n    \"./middlewares/csp\": {},\n    \"./middlewares/express-rx\": {},\n    \"./middlewares/jade-helpers\": {},\n    \"./middlewares/global-locals\": {},\n    \"./middlewares/revision-helpers\": {},\n    \"./middlewares/migrate-completed-challenges\": {}\n  },\n  \"routes\": {\n  },\n  \"files\": {\n  },\n  \"final\": {\n  },\n  \"final:after\": {\n    \"./middlewares/keymetrics\": {},\n    \"./middlewares/error-handlers\": {}\n  }\n}\n"
  },
  {
    "path": "server/middlewares/add-return-to.js",
    "content": "const pathsOfNoReturn = [\n  'link',\n  'bower_components',\n  'auth',\n  'login',\n  'logout',\n  'signin',\n  'signup',\n  'fonts',\n  'favicon',\n  'js',\n  'css'\n];\n\nconst pathsWhiteList = [\n  'news',\n  'challenges',\n  'map',\n  'news',\n  'commit'\n];\n\nconst pathsOfNoReturnRegex = new RegExp(pathsOfNoReturn.join('|'), 'i');\nconst whiteListRegex = new RegExp(pathsWhiteList.join('|'), 'i');\n\nexport default function addReturnToUrl() {\n  return function(req, res, next) {\n    // Remember original destination before login.\n    var path = req.path.split('/')[1];\n\n    if (\n      req.method !== 'GET' ||\n      pathsOfNoReturnRegex.test(path) ||\n      !whiteListRegex.test(path) ||\n      (/news/i).test(path) && (/hot/i).test(req.path)\n    ) {\n      return next();\n    }\n    req.session.returnTo = req.originalUrl === '/map-aside' ?\n      '/map' :\n      req.originalUrl;\n    return next();\n  };\n}\n"
  },
  {
    "path": "server/middlewares/constant-headers.js",
    "content": "export default function constantHeaders() {\n  return function(req, res, next) {\n    res.header('Access-Control-Allow-Origin', '*');\n    res.header('Access-Control-Allow-Headers',\n      'Origin, X-Requested-With, Content-Type, Accept'\n    );\n    next();\n  };\n}\n"
  },
  {
    "path": "server/middlewares/cookie-parser.js",
    "content": "import cookieParser from 'cookie-parser';\nimport secrets from '../../config/secrets';\n\nexport default cookieParser.bind(cookieParser, secrets.cookieSecret);\n"
  },
  {
    "path": "server/middlewares/csp.js",
    "content": "import helmet from 'helmet';\n\nlet trusted = [\n  \"'self'\"\n];\n\nif (process.env.NODE_ENV !== 'production') {\n  trusted.push('ws://localhost:3000');\n}\n\nexport default function csp() {\n  return helmet.csp({\n    directives: {\n      defaultSrc: trusted,\n      scriptSrc: [\n        \"'unsafe-eval'\",\n        \"'unsafe-inline'\",\n        '*.google-analytics.com',\n        '*.gstatic.com',\n        'https://*.gdgdocs.org',\n        'https://*.cloudflare.com',\n        '*.cloudflare.com',\n        'https://*.gitter.im',\n        'https://*.cdnjs.com',\n        '*.cdnjs.com',\n        'https://*.jsdelivr.com',\n        '*.jsdelivr.com',\n        '*.twimg.com',\n        'https://*.twimg.com',\n        '*.qbox.me',\n        'https://*.qbox.me',\n        '*.growingio.com',\n        'https://*.growingio.com',\n        'vimeo.com',\n        '*.clouddn.com',\n        'https://*.clouddn.com',\n        'https://www.sdk.cn',\n        'https://sdk.cn'\n      ].concat(trusted),\n      connectSrc: [\n        'vimeo.com',\n        'tags.growingio.com',\n        'api.growingio.com'\n      ].concat(trusted),\n      styleSrc: [\n        \"'unsafe-inline'\",\n        '*.gstatic.com',\n        '*.googleapis.com',\n        'https://*.googleapis.com',\n        '*.gdgdocs.org',\n        'https://*.gdgdocs.org',\n        '*.bootstrapcdn.com',\n        'https://*.bootstrapcdn.com',\n        '*.bootcss.com',\n        'https://*.bootcss.com',\n        '*.cloudflare.com',\n        'https://*.cloudflare.com',\n        '*.clouddn.com',\n        'https://*.clouddn.com',\n        '*.gdgdocs.org',\n        'https://*.gdgdocs.org'\n      ].concat(trusted),\n      fontSrc: [\n        '*.cloudflare.com',\n        'https://*.cloudflare.com',\n        '*.bootstrapcdn.com',\n        '*.bootcss.com',\n        'https://*.bootcss.com',\n        '*.googleapis.com',\n        'https://*.googleapis.com',\n        '*.gdgdocs.org',\n        'https://*.gdgdocs.org',\n        '*.gstatic.com',\n        'https://*.bootstrapcdn.com',\n        '*.qnssl.com',\n        'https://*.qnssl.com'\n      ].concat(trusted),\n      imgSrc: [\n        // allow all input since we have user submitted images for\n        // public profile\n        '*',\n        'data:'\n      ],\n      mediaSrc: [\n        '*.bitly.com',\n        '*.amazonaws.com',\n        '*.twitter.com'\n      ].concat(trusted),\n      frameSrc: [\n        '*.gitter.im',\n        '*.gitter.im https:',\n        '*.vimeo.com',\n        '*.twitter.com',\n        '*.ghbtns.com',\n        '*.freecatphotoapp.com',\n        'freecodecamp.github.io'\n      ].concat(trusted)\n    },\n    // set to true if you only want to report errors\n    reportOnly: false,\n    // set to true if you want to set all headers\n    setAllHeaders: false,\n    // set to true if you want to force buggy CSP in Safari 5\n    safari5: false\n  });\n}\n"
  },
  {
    "path": "server/middlewares/error-handlers.js",
    "content": "import errorHanlder from 'errorhandler';\nimport accepts from 'accepts';\n\nexport default function prodErrorHandler() {\n  if (process.env.NODE_ENV === 'development') {\n    return errorHanlder({ log: true });\n  }\n  // error handling in production.\n  // disabling eslint due to express parity rules for error handlers\n  return function(err, req, res, next) { // eslint-disable-line\n    // respect err.status\n    if (err.status) {\n      res.statusCode = err.status;\n    }\n\n    // default status code to 500\n    if (res.statusCode < 400) {\n      res.statusCode = 500;\n    }\n\n    // parse res type\n    var accept = accepts(req);\n    var type = accept.type('html', 'json', 'text');\n\n    var message = 'Oops! Something went wrong. Please try again later';\n    if (type === 'html') {\n      if (typeof req.flash === 'function') {\n        req.flash('errors', {\n          msg: message\n        });\n      }\n      return res.redirect('/map');\n      // json\n    } else if (type === 'json') {\n      res.setHeader('Content-Type', 'application/json');\n      return res.send({\n        message: message\n      });\n      // plain text\n    } else {\n      res.setHeader('Content-Type', 'text/plain');\n      return res.send(message);\n    }\n  };\n}\n"
  },
  {
    "path": "server/middlewares/express-rx.js",
    "content": "import { Observable } from 'rx';\n\n// add rx methods to express\nexport default function expressRx() {\n  return function expressRx(req, res, next) {\n    // render to observable stream\n    res.render$ = Observable.fromNodeCallback(res.render, res);\n    next();\n  };\n}\n"
  },
  {
    "path": "server/middlewares/global-locals.js",
    "content": "export default function globalLocals() {\n  return function(req, res, next) {\n    // Make user object available in templates.\n    res.locals.user = req.user;\n    next();\n  };\n}\n"
  },
  {
    "path": "server/middlewares/jade-helpers.js",
    "content": "const challengesRegex = /^(bonfire|waypoint|zipline|basejump|checkpoint):\\s/i;\n\nexport default function jadeHelpers() {\n  return function jadeHelpersMiddleware(req, res, next) {\n    res.locals.removeOldTerms = function removeOldTerms(str = '') {\n      return str.replace(challengesRegex, '');\n    };\n\n    next();\n  };\n}\n"
  },
  {
    "path": "server/middlewares/keymetrics.js",
    "content": "import pmx from 'pmx';\n\nexport default function keymetrics() {\n  if (process.env.NODE_ENV !== 'production') {\n    return (err, req, res, next) => next(err);\n  }\n  return (err, req, res, next) => {\n    if (res.statusCode < 400) { res.statusCode = 500; }\n\n    err.url = req.url;\n    err.component = req.url;\n    err.action = req.method;\n    err.params = req.body;\n    err.session = req.session;\n    err.username = req.user ? req.user.username : 'anonymous';\n    err.userId = req.user ? req.user.id : 'anonymous';\n\n    return next(pmx.notify(err));\n  };\n}\n"
  },
  {
    "path": "server/middlewares/migrate-completed-challenges.js",
    "content": "import { Observable, Scheduler } from 'rx';\nimport { ObjectID } from 'mongodb';\nimport debug from 'debug';\n\nimport idMap from '../utils/bad-id-map';\n\nconst log = debug('freecc:migrate');\nconst challengeTypes = {\n  html: 0,\n  js: 1,\n  video: 2,\n  zipline: 3,\n  basejump: 4,\n  bonfire: 5,\n  hikes: 6,\n  step: 7,\n  waypoint: 0\n};\n\nconst challengeTypeReg = /^(waypoint|hike|zipline|basejump)/i;\nconst challengeTypeRegWithColon =\n  /^(bonfire|checkpoint|waypoint|hike|zipline|basejump):\\s+/i;\n\nfunction updateName(challenge) {\n  if (\n    challenge.name &&\n    challenge.challengeType === 5 &&\n    challengeTypeReg.test(challenge.name)\n  ) {\n\n    challenge.name.replace(challengeTypeReg, match => {\n      // find the correct type\n      const type = challengeTypes[''.toLowerCase.call(match)];\n      // if type found, replace current type\n      //\n      if (type) {\n        challenge.challengeType = type;\n      }\n\n      return match;\n    });\n\n  }\n\n  if (challenge.name) {\n    challenge.oldName = challenge.name;\n    challenge.name = challenge.name.replace(challengeTypeRegWithColon, '');\n  }\n  return challenge;\n}\n\nfunction updateId(challenge) {\n  if (idMap.hasOwnProperty(challenge.id)) {\n    challenge.id = idMap[challenge.id];\n  }\n\n  return challenge;\n}\n\n// buildChallengeMap(\n//  userId: String,\n//  completedChallenges: Object[],\n//  User: User\n// ) => Observable\nfunction buildChallengeMap(userId, completedChallenges = [], User) {\n  return Observable.from(\n    completedChallenges,\n    null,\n    null,\n    Scheduler.default\n  )\n    .map(challenge => {\n      return challenge && typeof challenge.toJSON === 'function' ?\n        challenge.toJSON() :\n        challenge;\n    })\n    .map(updateId)\n    .filter(({ id, _id }) => ObjectID.isValid(id || _id))\n    .map(updateName)\n    .reduce((challengeMap, challenge) => {\n      const id = challenge.id || challenge._id;\n\n      challengeMap[id] = challenge;\n      return challengeMap;\n    }, {})\n    .flatMap(challengeMap => {\n      const updateData = {\n        '$set': {\n          challengeMap,\n          isChallengeMapMigrated: true\n        }\n      };\n      return Observable.fromNodeCallback(User.updateAll, User)(\n        { id: userId },\n        updateData,\n        { allowExtendedOperators: true }\n      );\n    });\n}\n\nexport default function migrateCompletedChallenges() {\n  return ({ user, app }, res, next) => {\n    const User = app.models.User;\n    if (!user || user.isChallengeMapMigrated) {\n      return next();\n    }\n    return buildChallengeMap(\n      user.id.toString(),\n      user.completedChallenges,\n      User\n    )\n      .subscribe(\n        count => log('documents update', count),\n        // errors go here\n        next,\n        next\n      );\n  };\n}\n"
  },
  {
    "path": "server/middlewares/revision-helpers.js",
    "content": "import manifest from '../rev-manifest.json';\n\nconst __DEV__ = process.env.NODE_ENV === 'development';\nconst manifestPath = '../rev-manifest.json';\n\nexport default function({ globalPrepend = '' } = {}) {\n\n  function rev(manifest, scopedPrepend, asset) {\n    return `${globalPrepend}${scopedPrepend}/${ manifest[asset] || asset }`;\n  }\n  const boundRev = rev.bind(null, manifest);\n\n  return function(req, res, next) {\n    // in dev environment, we reread the manifest on every call\n    // this means we do not need to restart server on every change to\n    // client code\n    if (__DEV__) {\n      // we first need to remove the manifest from require cache\n      delete require.cache[require.resolve(manifestPath)];\n      // and re-require\n      const manifest = require(manifestPath);\n      res.locals.rev = rev.bind(null, manifest);\n      return next();\n    }\n\n    // in production we take use the initially loaded manifest\n    // since this should not change in production\n    res.locals.rev = boundRev;\n    return next();\n  };\n}\n"
  },
  {
    "path": "server/middlewares/sessions.js",
    "content": "import session from 'express-session';\nimport MongoStoreFactory from 'connect-mongo';\nimport secrets from '../../config/secrets';\n\nconst MongoStore = MongoStoreFactory(session);\n\nexport default function sessionsMiddleware() {\n  return session({\n    resave: true,\n    saveUninitialized: true,\n    secret: secrets.sessionSecret,\n    store: new MongoStore({ url: secrets.db })\n  });\n}\n"
  },
  {
    "path": "server/middlewares/validator.js",
    "content": "import validator from 'express-validator';\n\nexport default function() {\n  return validator({\n    customValidators: {\n      matchRegex(param, regex) {\n        return regex.test(param);\n      },\n      isString(value) {\n        return typeof value === 'string';\n      },\n      isNumber(value) {\n        return typeof value === 'number';\n      }\n    }\n  });\n}\n"
  },
  {
    "path": "server/model-config.json",
    "content": "{\n  \"_meta\": {\n    \"sources\": [\n      \"loopback/common/models\",\n      \"loopback/server/models\",\n      \"../common/models\",\n      \"./models\"\n    ]\n  },\n  \"User\": {\n    \"dataSource\": \"db\",\n    \"public\": false\n  },\n  \"AccessToken\": {\n    \"dataSource\": \"db\",\n    \"public\": false\n  },\n  \"ACL\": {\n    \"dataSource\": \"db\",\n    \"public\": false\n  },\n  \"RoleMapping\": {\n    \"dataSource\": \"db\",\n    \"public\": false\n  },\n  \"Role\": {\n    \"dataSource\": \"db\",\n    \"public\": false\n  },\n  \"Email\": {\n    \"dataSource\": \"mail\",\n    \"public\": false\n  },\n  \"challenge\": {\n    \"dataSource\": \"db\",\n    \"public\": true\n  },\n  \"job\": {\n    \"dataSource\": \"db\",\n    \"public\": true\n  },\n  \"nonprofit\": {\n    \"dataSource\": \"db\",\n    \"public\": true\n  },\n  \"story\": {\n    \"dataSource\": \"db\",\n    \"public\": true\n  },\n  \"pledge\": {\n    \"dataSource\": \"db\",\n    \"public\": true\n  },\n  \"promo\": {\n    \"dataSource\": \"db\",\n    \"public\": true\n  },\n  \"user\": {\n    \"dataSource\": \"db\",\n    \"public\": true\n  },\n  \"userCredential\": {\n    \"dataSource\": \"db\",\n    \"public\": true\n  },\n  \"userIdentity\": {\n    \"dataSource\": \"db\",\n    \"public\": true\n  }\n}\n"
  },
  {
    "path": "server/passport-providers.js",
    "content": "var successRedirect = '/';\nvar failureRedirect = '/login';\nvar linkFailureRedirect = '/account';\nmodule.exports = {\n  local: {\n    provider: 'local',\n    module: 'passport-local',\n    usernameField: 'email',\n    passwordField: 'password',\n    authPath: '/auth/local',\n    successRedirect: successRedirect,\n    failureRedirect: '/email-signin',\n    session: true,\n    failureFlash: true\n  },\n  /* 'juhe-login': {\n     provider: 'juhe',\n     authScheme: 'oauth2',\n     module: 'passport-juhe',\n     authPath: '/auth/juhe',\n     callbackURL: '/auth/juhe/callback',\n     callbackPath: '/auth/juhe/callback',\n     successRedirect: successRedirect,\n     failureRedirect: failureRedirect,\n     clientID: process.env.JUHE_ID,\n     clientSecret: process.env.JUHE_SECRET,\n     failureFlash: true\n   },*/\n  'github-login': {\n    provider: 'github',\n    authScheme: 'oauth2',\n    module: 'passport-github',\n    authPath: '/auth/github',\n    callbackURL: '/auth/github/callback',\n    callbackPath: '/auth/github/callback',\n    successRedirect: successRedirect,\n    failureRedirect: failureRedirect,\n    clientID: process.env.GITHUB_ID,\n    clientSecret: process.env.GITHUB_SECRET,\n    scope: ['email'],\n    failureFlash: true\n  },\n  'github-link': {\n    provider: 'github',\n    authScheme: 'oauth2',\n    module: 'passport-github',\n    authPath: '/link/github',\n    callbackURL: '/auth/github/callback/link',\n    callbackPath: '/auth/github/callback/link',\n    successRedirect: successRedirect,\n    failureRedirect: linkFailureRedirect,\n    clientID: process.env.GITHUB_ID,\n    clientSecret: process.env.GITHUB_SECRET,\n    scope: ['email'],\n    link: true,\n    failureFlash: true\n  }\n};\n"
  },
  {
    "path": "server/production-start.js",
    "content": "// this ensures node understands the future\nrequire('babel-register');\n\nvar startTime = Date.now();\nvar timeoutHandler;\n// this is where server starts booting up\nvar app = require('./server');\nconsole.log('waiting for db to connect');\n\n\nvar onConnect = function() {\n  console.log('db connected in %s ms', Date.now() - startTime);\n  if (timeoutHandler) {\n    clearTimeout(timeoutHandler);\n  }\n  app.start();\n};\n\nvar timeoutHandler = setTimeout(function() {\n  var message =\n    'db did not after  ' +\n    (Date.now() - startTime) +\n    ' ms connect crashing hard';\n\n  console.log(message);\n  // purposely shutdown server\n  // pm2 should restart this in production\n  throw new Error(message);\n}, 15000);\n\napp.dataSources.db.on('connected', onConnect);\n"
  },
  {
    "path": "server/resources/labs.json",
    "content": "[\n  {\n    \"camper\": \"johnstonbl01\",\n    \"name\": \"Clementine.js\",\n    \"url\": \"http://johnstonbl01.github.io/clementinejs/\",\n    \"description\": \"The elegant and lightweight boilerplate for full stack JavaScript.\",\n    \"image\": \"//i.imgur.com/ib1wOho.png\"\n  },\n  {\n    \"camper\": \"adventurebear\",\n    \"name\": \"Coding Bootcamp Cost Calculator\",\n    \"url\": \"http://www.freecodecamp.com/coding-bootcamp-cost-calculator\",\n    \"description\": \"This d3.js-powered coding bootcamp cost calculator takes into account tuition, financing, lost wages and cost of living.\",\n    \"image\": \"https://qph.is.quoracdn.net/main-qimg-670d6a0c5b01f74138e777732994240f?convert_to_webp=true\"\n  },\n  {\n    \"camper\": \"martoncsikos\",\n    \"name\": \"Skill.bar\",\n    \"url\": \"http://www.skill.bar\",\n    \"description\": \"Learn. Gain points. Visualize your skills.\",\n    \"image\": \"//i.imgur.com/URkqqb5.png\"\n  },\n  {\n    \"camper\": \"ericdouglas\",\n    \"name\": \"Open Source Society\",\n    \"url\": \"https://github.com/open-source-society/computer-science\",\n    \"description\": \"A path to a free education in Computer Science.\",\n    \"image\": \"https://camo.githubusercontent.com/c42438055d3fee26b29e6d046fd8d06ebff3db20/687474703a2f2f692e696d6775722e636f6d2f6838786a72726a2e706e67\"\n  },\n  {\n    \"camper\": \"akiralaine\",\n    \"name\": \"Musare\",\n    \"url\": \"http://musare.com/\",\n    \"description\": \"Musare is a modern, collaborative, open-source Music App.\",\n    \"image\": \"//i.imgur.com/Y4D4MPL.png\"\n  },\n  {\n    \"camper\": \"bighitbiker3\",\n    \"name\": \"Queue That\",\n    \"url\": \"http://queuethat.com/\",\n    \"description\": \"An app that uses the SoundCloud API in order to make temporary, running playlists.\",\n    \"image\": \"https://www.evernote.com/l/AqSy_bYAZ0dOiJnn4CfNgo09DOSTUX1IADIB/image.png\"\n  },\n  {\n    \"camper\": \"storbeck\",\n    \"name\": \"Free Code Camp Event Zipline: Recipe Box\",\n    \"url\": \"http://codepen.io/GeoffStorbeck/full/bVKyzd/\",\n    \"description\": \"Try to reverse engineer this Recipe Box as an optional Zipline challenge.\",\n    \"image\": \"//i.imgur.com/5o0bwVQ.png\"\n  },\n  {\n    \"camper\": \"akiralaine\",\n    \"name\": \"Camper News Bot\",\n    \"url\": \"https://twitter.com/campernewsbot\",\n    \"description\": \"This twitter bot tweets out Camper News stories once they hit 5 upvotes.\",\n    \"image\": \"https://pbs.twimg.com/media/CLXOFLPWIAEHYPJ.png\"\n  },\n  {\n    \"camper\": \"roelver\",\n    \"name\": \"Free Code Camp Top 100 Campers\",\n    \"url\": \"http://fcctop100.herokuapp.com/\",\n    \"description\": \"This leaderboard tracks the campers who have been most active (completing challenges, helping other campers) in the past 30 days.\",\n    \"image\": \"//i.imgur.com/4CrQfFi.png\"\n  }\n]"
  },
  {
    "path": "server/resources/testimonials.json",
    "content": "[\n  {\n    \"camper\": \"Shirly\",\n    \"quote\": \"我目前在一家互联网公司从事编辑工作,通过接触FreeCodeCamp 我发现了自己的兴趣所在。我会坚持努力学习下去,希望早日在IT领域做出一些成绩。\",\n    \"github\": \"//github.com/sl123456\",\n    \"image\": \"/images/Shirly.jpg\"\n  },\n  {\n    \"camper\": \"Wendy\",\n    \"quote\": \"Freecodecamp给了我一个平台学习前端。从不断获取知识的过程中,我既得到快乐又认识了很多新朋友。\",\n    \"github\": \"//github.com/tinybird18\",\n    \"image\": \"/images/Wendy.jpg\"\n  },\n  {\n    \"camper\": \"吴京\",\n    \"quote\": \"我是汽车零部件行业的一名机电工程师,之前学习编程,总觉得自己像汪洋大海里的一片孤舟,学习的过程中没有目的和方向。FCC给了我明确的目标,每做一题都离终点更近,学习的过程快乐而有趣,祝自己早日完成学习。\",\n    \"github\": \"//github.com/wilsonwj\",\n    \"image\": \"/images/wujing.jpg\"\n  },\n  {\n    \"camper\": \"Taylor\",\n    \"quote\": \"我从事工业房地产开发,编程这个爱好从大学开始已伴随我20多年。我觉得只有编程才是这样一个过程:做对了就有对的结果。\",\n    \"github\": \"//github.com/taylorren\",\n    \"image\": \"/images/Taylor.jpg\"\n  },\n  {\n    \"camper\": \"程辉\",\n    \"quote\": \"我是一个编程学习爱好者,从2015年5月开始接触FCC立马就喜欢上了它。它让我学会思考如何用程序去解决问题。尤其是在绞尽脑汁做出一道算法题的时候,那种喜悦感会让你越来越喜欢这种学习方式。使用FCC解题就像是在打怪升级,最终你会打倒Boss 战胜自己,赢得这场胜利。\",\n    \"github\": \"//github.com/workcheng\",\n    \"image\": \"/images/chenghui.jpg\"\n  },\n  {\n    \"camper\": \"张建强\",\n    \"quote\": \"在FCC学习了一段时间,我重燃了年轻时的那颗心。那种打游戏冲关的感觉,碰上了,就停不下来。在这里,我们一起打“副本”,一起打boss 不同领域的码农都能发挥出自己最擅长的一面。我爱FCC\",\n    \"github\": \"//github.com/amd‐roy\",\n    \"image\": \"/images/zhangjianqiang.jpg\"\n  },\n  {\n    \"camper\": \"钱杰\",\n    \"quote\": \"我做Web前端开发,热爱编程,FCC让我更好地巩固基础,并带领我走入后端的世界。\",\n    \"github\": \"//github.com/bastarder\",\n    \"image\": \"/images/qianjie.jpg\"\n  },\n  {\n    \"camper\": \"曹娜娜\",\n    \"quote\": \"我在一家眼镜公司从事设计工作,是从零基础开始学习编程。FCC给了我超棒的学习体验,让我喜欢上编程,我会一直坚持学习。\",\n    \"github\": \"//github.com/nana1303\",\n    \"image\": \"/images/caonana.jpg\"\n  },\n  {\n    \"camper\": \"Meta Hirschl\",\n    \"quote\": \"通过构建健壮的、实用性强的 web app，不仅增强了我的信心，还向潜在的雇主显示了我的能力。每一项对我来说都是成功，可以让我找到满意的工作。\",\n    \"github\": \"MetaCoderHirschl\",\n    \"linkedin\": \"https://www.linkedin.com/profile/view?id=ADEAAAKX2fEBfeZ1GVdOh-c0zzkYZKw38o8qzow\",\n    \"image\": \"//i.imgur.com/nsvNixW.jpg\"\n  },\n  {\n    \"camper\": \"Branden Byers\",\n    \"quote\": \"我曾给自己设定目标，要在2015年的年底前找到工作，最终我在2015年的年初就找到了工作，这直接得益于我在 Free Code Camp 所学到的知识和技能。\",\n    \"github\": \"brandenbyers\",\n    \"linkedin\": \"https://www.linkedin.com/in/brandenbyers\",\n    \"image\": \"//i.imgur.com/NbzknHq.jpg\"\n  },\n  {\n    \"camper\": \"Bruna Torman Reseres Franasa\",\n    \"quote\": \"现在我得到了实习的机会。在 IT 领域我没有什么经验，但是现在我的好运来了！\",\n    \"github\": \"brunatrf\",\n    \"linkedin\": \"https://www.linkedin.com/profile/view?id=AAkAABVPh9IB730qyshrsqO1hDNNRUL-X_4i8n0\",\n    \"image\": \"//i.imgur.com/TqxHSNY.jpg\"\n  },\n  {\n    \"camper\": \"Maxim Orlov\",\n    \"quote\": \"我以 web 开发零基础开始学习 Free Code Camp，6 个月后，作为后端工程师，我得到了我的第一份工作。\",\n    \"github\": \"Maximization\",\n    \"linkedin\": \"https://www.linkedin.com/profile/view?id=AAkAAAo83nwBF57LpD9mZlm5dH6OcovOpYKPs3k\",\n    \"image\": \"//i.imgur.com/wjlDigg.jpg\"\n  },\n  {\n    \"camper\": \"Alexander Black, Jr.\",\n    \"quote\": \"为非赢利项目所做的工作，让我有机会学习如何构建 Chrome 扩展，并给了我展示自己全栈开发者技能的平台。\",\n    \"github\": \"alexblackjr\",\n    \"linkedin\": \"https://www.linkedin.com/profile/view?id=AAkAAA553L4BgfgBR-M9RQc7x5matd6FUx3a6-I\",\n    \"image\": \"//i.imgur.com/iHC6ZI4.jpg\"\n  },\n  {\n    \"camper\": \"Cristiane Henriques\",\n    \"quote\": \"当我把 Free Code Camp 添加到我的履历和 LinkedIn 后，我有了越来越多的工作联系。\",\n    \"github\": \"CrisHenriques\",\n    \"linkedin\": \"https://www.linkedin.com/in/crishenriques\",\n    \"image\": \"//i.imgur.com/T6iTQHs.jpg\"\n  },\n  {\n    \"camper\": \"Viktor Bakurin\",\n    \"quote\": \"在我为 Free Code Camp 的非赢利项目工作期间，我在国外找到了一个 MEAN 栈职位，现在我在布达佩斯工作。\",\n    \"github\": \"letalumil\",\n    \"linkedin\": \"https://www.linkedin.com/profile/view?id=AAkAAAq6G3QBA1DIwFZGrS4DGqDzBDTzFjrbNQo\",\n    \"image\": \"//i.imgur.com/fvUAWlx.jpg\"\n  },\n  {\n    \"camper\": \"Ashley Drake\",\n    \"quote\": \"Free Code Camp 帮助我得到了我的第一份工程师工作。这个神奇的社区让我的工作变得更加轻松、有趣。\",\n    \"github\": \"aldraco\",\n    \"linkedin\": \"https://www.linkedin.com/profile/view?id=AAkAABcdBycB1iVHvcW7N3yVK-18ES7Nrxx2jbE\",\n    \"image\": \"//i.imgur.com/xzDoJef.jpg\"\n  },\n  {\n    \"camper\": \"Brian Grant\",\n    \"quote\": \"Free Code Camp 为像我这样的残疾退伍军人提供了一条非常好的接受再教育的途径。即使现在我还没学完课程，我已经得到了工程师工作的 offer。\",\n    \"github\": \"codeseekingman\",\n    \"linkedin\": \"https://www.linkedin.com/profile/view?id=AAkAAAEUqXoBFOq1SWQrBsTMHG4ij9Ss4Qqnrtg\",\n    \"image\": \"//i.imgur.com/QPpjPac.jpg\"\n  },\n  {\n    \"camper\": \"Thomas Joseph Izen\",\n    \"quote\": \"在花了大量的时间尝试不同的编程教学网站后我才发现，FreeCodeCamp 从一开始就是那么地与众不同。他们为不同水平的每个人都提供了最好、最多的用于学习编程并创建神奇的、适销的作品集的条理清晰的途径。\",\n    \"github\": \"TommyIzen\",\n    \"linkedin\": \"https://www.linkedin.com/profile/view?id=AAkAAA79qIYB_RHmvOP59S6VPK3Lm06oG8fM6dw\",\n    \"image\": \"//i.imgur.com/RkO2ISf.jpg\"\n  },\n  {\n    \"camper\": \"Lori Becker\",\n    \"quote\": \"当我获得计算机科学硕士学位并毕业后，我无法把我的任何代码分享给雇主（大学政策：害怕协助作弊）。使用 FreeCodeCamp，我能够开发一个小型的作品集。\",\n    \"github\": \"LCBecker\",\n    \"linkedin\": \"https://www.linkedin.com/profile/view?id=AAkAAADrtuwBOA_0ihkKIbUFXoXskXikQT9uVeo\",\n    \"image\": \"//i.imgur.com/J1cbqDQ.jpg\"\n  },\n  {\n    \"camper\": \"Robert Trammel\",\n    \"quote\": \"我正在做一项把 JavaScript 整合到 FileMaker 的工作，同时在为某校区做一些定制 web 发布的工作，我也得到了 Apple 和另外几家科技公司的 offer。如果不是 Free Code Camp，我现在仍然带着一身棒棒的但却无关紧要的技能在黑暗中摸索呢。\",\n    \"github\": \"comajama\",\n    \"linkedin\": \"https://www.linkedin.com/profile/view?id=AAIAABQsM30BEAI6xyAhk-OqbBNUJL0WD2uA3GE\",\n    \"image\": \"//i.imgur.com/E9YdQIn.jpg\"\n  },\n  {\n    \"camper\": \"Brian Atkins\",\n    \"quote\": \"相比之前，我现在泡在 Free Code Camp 上的时间少了，因为已经有人开始雇我做项目了。Free Code Camp 为我提供了得到这些工作的基础知识。\",\n    \"github\": \"BrianAtk\",\n    \"linkedin\": \"https://www.linkedin.com/profile/view?id=AAkAAABtTx0BmDzmB7eDGOkAJbRw8RZdvysreso\",\n    \"image\": \"//i.imgur.com/veN77Iw.jpg\"\n  },\n  {\n    \"camper\": \"Andrea Goulet\",\n    \"quote\": \"在我开始 Free Code Camp 的学习之前，对于人们问我“会写代码吗？”这样的问题，我会感到非常紧张。现在，我会非常自信地回答“会！”\",\n    \"github\": \"andreagoulet\",\n    \"linkedin\": \"https://www.linkedin.com/profile/view?id=AAkAAAA4KWYB-mCMwEU3LvDHXt6H0rVHbBvszq0\",\n    \"image\": \"//i.imgur.com/XWt7fXk.jpg\"\n  },\n  {\n    \"camper\": \"David McGill\",\n    \"quote\": \"即使你像我一样拥有计算机科学的学位，你仍然需要有向老板证明你对编码感兴趣的项目，Free Code Camp 为我提供了这样的平台。它已经都为你安排好了————你只需要沿着学习路径一路走下去！\",\n    \"github\": \"dmcgill50\",\n    \"linkedin\": \"https://www.linkedin.com/profile/view?id=AAkAAAEBy74BHsJCpgrbohr2dJxbdXuvMuJDx6k\",\n    \"image\": \"//i.imgur.com/ZVNPIYU.jpg\"\n  },\n  {\n    \"camper\": \"Adam Recvlohe\",\n    \"quote\": \"之前我是一个全职教学设计师，没有开发经历。Free Code Camp 帮助我得到了作为 JavaScript 开发人员的工作。\",\n    \"github\": \"arecvlohe\",\n    \"linkedin\": \"https://www.linkedin.com/in/adamrecvlohe\",\n    \"image\": \"//i.imgur.com/oFxOlRG.jpg\"\n  },\n  {\n    \"camper\": \"John Ellis\",\n    \"quote\": \"Free Code Camp 已经成为我的软件开发职业生涯的主要贡献者之一。我从 app 分析师做起，利用业余和周末的时间，花了三个月认真学习课程。我刚刚找到了一份商业系统开发者的工作。\",\n    \"github\": \"johnmellis\",\n    \"linkedin\": \"https://www.linkedin.com/profile/view?id=AAkAAAbrISEBqAVYOBfhni9mB3YoFFzzrAbYvvo\",\n    \"image\": \"//i.imgur.com/qLfaM9Y.jpg\"\n  },\n  {\n    \"camper\": \"Rachel Krantz\",\n    \"quote\": \"Free Code Camp 给了我申请软件工程工作的信心，因为我知道了我有学习的能力。这份信心让招聘经理录用了我。\",\n    \"github\": \"krantzinator\",\n    \"linkedin\": \"https://www.linkedin.com/profile/view?id=AAkAAAOdv-oBnOGtQCoGooUB0xGJ4TWoAgV_z_E\",\n    \"image\": \"//i.imgur.com/dqHrkkC.jpg\"\n  },\n  {\n    \"camper\": \"Alex Dixon\",\n    \"quote\": \"我被公司老板———— 一位拥有 25 年 web 开发经验的程序员————雇佣了。我大学得到的是英语专业的学位，在加入 FreeCodeCamp 之前没有任何编程经验。\",\n    \"github\": \"alex-dixon\",\n    \"linkedin\": \"https://www.linkedin.com/profile/view?id=AAkAABhCmLMBLAR1AXskaJXDMT-uLPZ8M7TynPQ\",\n    \"image\": \"//i.imgur.com/poiaanK.jpg\"\n  },\n  {\n    \"camper\": \"Ryan Lindeman\",\n    \"quote\": \"Free Code Camp 非常棒，它为我提供了我所需要的、能让我更加深入地完成工作项目的全栈开发技术的直接途径。\",\n    \"github\": \"fai1whale\",\n    \"linkedin\": \"https://www.linkedin.com/profile/view?id=AAkAAAkMT1EBFCY849rMWYSDIEj6kosBJSH9n2s\",\n    \"image\": \"//i.imgur.com/jHOjcyN.jpg\"\n  },\n  {\n    \"camper\": \"Stephanie Brown\",\n    \"quote\": \"Free Code Camp 在我学习编码的过程中为我提供了系统的体系与明确的方向。\",\n    \"github\": \"strawmitch\",\n    \"linkedin\": \"https://www.linkedin.com/profile/view?id=AAkAAARqP5cBDDdBxPUzluctvjUhOP3UsiowRtM\",\n    \"image\": \"//i.imgur.com/k5EEyNf.jpg\"\n  },\n  {\n    \"camper\": \"Jimson Sulit\",\n    \"quote\": \"除了我在 Free Code Camp 上学习全栈 web 开发这一事实外，它还给了我领导本地社区项目的机会。\",\n    \"github\": \"webdevjedi25\",\n    \"linkedin\": \"https://www.linkedin.com/profile/view?id=AAkAAAWqUccBopX2Wo_P1gYgy0iIEqChwXPTh2k\",\n    \"image\": \"//i.imgur.com/DzMDPS5.jpg\"\n  },\n  {\n    \"camper\": \"Brian Emory\",\n    \"quote\": \"我喜欢边学边实践，虽然书本内容非常丰富，却是读得多实践少。后来与 Free Code Camp 不期而遇，它让我边学边动手实践。与之前的拼命学习相反，我现在不只学习，而且一边学习一边开发一些很酷的项目。\",\n    \"github\": \"thebrianemory\",\n    \"linkedin\": \"https://www.linkedin.com/profile/view?id=AAkAABc3jXwB-iZdZKZIVAvL93RHGB7_J9gDbVA\",\n    \"image\": \"//i.imgur.com/JcdSD9H.jpg\"\n  },\n  {\n    \"camper\": \"Ralph Cachero\",\n    \"quote\": \"我是一名软件质量保证工程师，Free Code Camp 帮助我理解了开发人员的日常工作。\",\n    \"github\": \"rcachero\",\n    \"linkedin\": \"https://www.linkedin.com/profile/view?id=AAkAAAJEF88BiUtMoxS3Ww7ooI9QmTZdrgP272Q\",\n    \"image\": \"//i.imgur.com/5umfPRq.jpg\"\n  },\n  {\n    \"camper\": \"Ina Tsetsova\",\n    \"quote\": \"Bonfires 真的让我思考并创造性地结合编程的概念。\",\n    \"github\": \"Tsetsova\",\n    \"linkedin\": \"https://www.linkedin.com/profile/view?id=AAkAAAjPoIcBJsAF91dqwgxFQ4qct88yFcljXNU\",\n    \"image\": \"//i.imgur.com/9Ta15Ow.jpg\"\n  },\n  {\n    \"camper\": \"Ryan Jones\",\n    \"quote\": \"使用 Free Code Camp 学习编程让我的职业生涯如虎添翼，它训练我的大脑用电脑的逻辑来思考，这对数字取证领域有着巨大的帮助。\",\n    \"github\": \"ryanmjones\",\n    \"linkedin\": \"https://www.linkedin.com/profile/view?id=AAkAABPJt1MBxC4Yero3PJPhF9rrr_Y7WfOGcCU\",\n    \"image\": \"//i.imgur.com/8cRU20S.jpg\"\n  },\n  {\n    \"camper\": \"Sara Powell\",\n    \"quote\": \"我在编程能力方面取得了巨大的进步——之前根本不会，现在足够获得前端开发职位的面试机会。\",\n    \"github\": \"newtcobell\",\n    \"linkedin\": \"https://www.linkedin.com/profile/view?id=AAkAAAy1jmQBRjoGSUWd6Zib7FtekpSMBVHr7Vw\",\n    \"image\": \"//i.imgur.com/4l4OBbR.jpg\"\n  },\n  {\n    \"camper\": \"Rhonadale Florentino\",\n    \"quote\": \"现在我可以非常自信地告诉客户我能为他们设计网站。\",\n    \"github\": \"None Given\",\n    \"linkedin\": \"https://www.linkedin.com/profile/view?id=AAkAAAI53oUBmy6MPKp1UeHxBy3_y0cyTS4bWow\",\n    \"image\": \"//i.imgur.com/soEDnv6.jpg\"\n  },\n  {\n    \"camper\": \"Justin Clay Lane\",\n    \"quote\": \"Free Code Camp 提供了结构化的学习体验，相比其他免费学习网站，它更接近于真实的课堂。我最近受雇升级并维护当地医生办公室的网站，有额外收入和经历的感觉真是美妙。\",\n    \"github\": \"jclane\",\n    \"linkedin\": \"https://www.linkedin.com/profile/view?id=AAkAAAYZYQ4BBY337OqRUhMnZqDJNX1wNXjT7Bk\",\n    \"image\": \"//i.imgur.com/COEPda5.jpg\"\n  },\n  {\n    \"camper\": \"Angshuman Gupta\",\n    \"quote\": \"我是一家创业公司的联合创始人。我们曾经一直使用 PHP 来编程，但总想换成 meteor.js。Free Code Camp 给了我结构化的 JavaScript 指导。\",\n    \"github\": \"codingang\",\n    \"linkedin\": \"https://www.linkedin.com/profile/view?id=AAkAAAhIipMB6vAXaratEs0MtUd3GgyYm70cvbE\",\n    \"image\": \"//i.imgur.com/7pwkFQ5.jpg\"\n  },\n  {\n    \"camper\": \"Genavieve Clausen\",\n    \"quote\": \"Free Code Camp 让我在很多方面受益，包括自学的机会、鼓励性的环境。真高兴能成为这个成长中的社区中的一员，通过它建立职业生涯的长久联系并创造我所追求的生活方式。\",\n    \"github\": \"GenavieveMarie\",\n    \"linkedin\": \"https://www.linkedin.com/profile/view?id=AAkAAAOISlMBAi43m1SG-xM_S2B8Vy05yiQz5rE\",\n    \"image\": \"//i.imgur.com/vr7lTkx.jpg\"\n  },\n  {\n    \"camper\": \"Tim Stauffer\",\n    \"quote\": \"我发现 Free Code Camp 比我的硕士学位更有用，所以我选择从大学退学。学了这么多内容，还节省了$50,000。\",\n    \"github\": \"timstauffer\",\n    \"linkedin\": \"https://www.linkedin.com/profile/view?id=AAkAAADVcVIBz8UCNjQKl2GUy9ka8UGnQXAXAYw\",\n    \"image\": \"//i.imgur.com/b8YCzf1.jpg\"\n  },\n  {\n    \"camper\": \"Marquina M Iliev-Piselli\",\n    \"quote\": \"我正为我的全职工作重新设计网站。\",\n    \"github\": \"Marquina\",\n    \"linkedin\": \"https://www.linkedin.com/profile/view?id=AAkAAACYvVUBTuu8dNRHthN1TFiyk137PLDqnv4\",\n    \"image\": \"//i.imgur.com/6Ep9hfs.jpg\"\n  },\n  {\n    \"camper\": \"Pete Considine\",\n    \"quote\": \"这些指导性的、结构化的课程是真正有用的，同时在介绍新概念的时候会稍稍放慢步伐。我曾经参加过 Udemy 的课程，为了迎合“得到一切”的宣传口号，它的 JavaScript 课程看起来真的是蜻蜓点水。\",\n    \"github\": \"Pjconsidine\",\n    \"linkedin\": \"https://www.linkedin.com/profile/view?id=AAkAAAAi8-8BxUVpoi_VuJQmeGWN5zhMBgbvPbs\",\n    \"image\": \"//i.imgur.com/SkYRcDW.jpg\"\n  },\n  {\n    \"camper\": \"Khatra Ahmed\",\n    \"quote\": \"我可以学习编程，有问题随时都有支持，每个人都乐于帮助别人，这让学习编程变得更容易。\",\n    \"github\": \"Mystfreak\",\n    \"linkedin\": \"https://www.linkedin.com/profile/view?id=AAkAAAbdUsIBApacWEmL7CIxe2q7aevMn7aQvmQ\",\n    \"image\": \"//i.imgur.com/XguPEF7.jpg\"\n  },\n  {\n    \"camper\": \"Marcus Lyons\",\n    \"quote\": \"Free Code Camp 让我获得了自动化处理我的部分工作的信心，我能利用从 Free Code Camp 上学来的技能编写搜索移动应用数据库日志文件以定位错误的 bash 脚本了。\",\n    \"github\": \"auron1223\",\n    \"linkedin\": \"https://www.linkedin.com/profile/view?id=AAkAAA_1aLABo1pVJH9ijSqz8PvLgpzVYkIsjVc\",\n    \"image\": \"//i.imgur.com/X5c77Ov.jpg\"\n  },\n  {\n    \"camper\": \"Reynald Emmanuel Endaya\",\n    \"quote\": \"不像以前尝试过的所有慕课（MOOC），在那儿我不得不听人讲好长时间，Free Code Camp 有活跃的社区（甚至在马尼拉），并且是互动的。在这儿我学到了很多，并且我学习的势头正劲。\",\n    \"github\": \"None Given\",\n    \"linkedin\": \"https://www.linkedin.com/profile/view?id=AAkAAAUlm8oBQuXm_Y89_LDC9mb2vOjjQH_pZDo\",\n    \"image\": \"//i.imgur.com/oA5CtWF.jpg\"\n  },\n  {\n    \"camper\": \"Victoria Kariolic\",\n    \"quote\": \"通过 Free Code Camp 小组我找到了能够填补我的客户工作间隙的编程伙伴。\",\n    \"github\": \"Niaskywalk\",\n    \"linkedin\": \"https://www.linkedin.com/profile/view?id=AAkAAAEFmXMBlTFIR2j1G-vJhAMsUOPONILGrLM\",\n    \"image\": \"//i.imgur.com/TiqbM1f.jpg\"\n  },\n  {\n    \"camper\": \"Cameron Eshgh\",\n    \"quote\": \"Free Code Camp 能够让我以数字营销人员的角色深入到任何有用的资源或内容并修复不工作的部分，也能让我在 web 开发人员不在的时候挽起袖子大干一番。\",\n    \"github\": \"eshghitude\",\n    \"linkedin\": \"https://www.linkedin.com/profile/view?id=AAkAAAVdU1MBFFiei4ZYNImnVDcR3H_EiuS6qLY\",\n    \"image\": \"//i.imgur.com/PEzJLCp.jpg\"\n  },\n  {\n    \"camper\": \"Devarsh Ruparelia\",\n    \"quote\": \"即使现在我仍然是一名高中生，我实习的创业公司说，如果我完成 Free Code Camp 的全部课程，他们会积极考虑让我为他们做编程工作。非常感谢 Free Code Camp！\",\n    \"github\": \"devarsh1997\",\n    \"linkedin\": \"https://www.linkedin.com/profile/view?id=AAkAAApxpP8BZBcHQzr6Ci3xmkkZX-OSH_oLuJs\",\n    \"image\": \"//i.imgur.com/ouv1qUd.jpg\"\n  },\n  {\n    \"camper\": \"Miranda Bashore\",\n    \"quote\": \"我想成为自由职业者并创建动态 web 网站，Free Code Camp 让我离实现目标更近了，因为在我努力读取硕士学位期间负担不起其他昂贵的训练营费用。\",\n    \"github\": \"DutchBay\",\n    \"linkedin\": \"https://www.linkedin.com/profile/view?id=AAkAAA8KmJMBTtvvgJzjeAUo_YOssh2yLZZlvlk\",\n    \"image\": \"//i.imgur.com/mJlUzOq.jpg\"\n  },\n  {\n    \"camper\": \"Christian Morera\",\n    \"quote\": \"Free Code Camp 是一段非常棒的经历，我在这儿学到了太多的东西。目前我正从内容开发人员过渡到全栈开发人员。\",\n    \"github\": \"chrmorfeus\",\n    \"linkedin\": \"https://www.linkedin.com/profile/view?id=AAkAAAMc-tYBtYri0H1KHz1WNQjWxZ23jg0tMNU\",\n    \"image\": \"//i.imgur.com/sfhBDHw.jpg\"\n  },\n  {\n    \"camper\": \"Jason Arnold\",\n    \"quote\": \"我喜欢自学，所以 Free Code Camp 对我来说太适合了。这些挑战对拓展知识来说足够难，但是还不足以把人吓跑。\",\n    \"github\": \"thejasonfile\",\n    \"linkedin\": \"https://www.linkedin.com/profile/view?id=AAkAAABlImsBwAEZ3u3A5NIlCegho8WZ2j4h0w0\",\n    \"image\": \"//i.imgur.com/hqQ3nPA.jpg\"\n  },\n  {\n    \"camper\": \"Kaveet Laxmidas\",\n    \"quote\": \"Free Code Camp 激发我使用更现代的方法和技术对我的一些旧的开源项目进行彻底改写。\",\n    \"github\": \"kaveet\",\n    \"linkedin\": \"https://www.linkedin.com/profile/view?id=AAkAABZooOgBZJg_0MAJ09pd5vROk83oBFA1cEE\",\n    \"image\": \"//i.imgur.com/1PadpKm.jpg\"\n  },\n  {\n    \"camper\": \"Brett Guillory\",\n    \"quote\": \"Free Code Camp 提供的非常棒的、以目标为导向的课程正是我所需要的，并且最棒的是———— 100% 免费！\",\n    \"github\": \"Kurzninja\",\n    \"linkedin\": \"https://www.linkedin.com/profile/view?id=AAkAAAUMPqMBa6GwMTkA_oHUeqnZzyD95FisjwM\",\n    \"image\": \"//i.imgur.com/WjHNwIu.jpg\"\n  },\n  {\n    \"camper\": \"Kory J. Campbell\",\n    \"quote\": \"我刚刚大学毕业，所以财务状况非常紧张，然而这个训练营绝对帮助我提高了我的技能。\",\n    \"github\": \"@koryjcampbell [sic]\",\n    \"linkedin\": \"https://www.linkedin.com/profile/view?id=AAkAAAtxvTgB0N_uJhW-87Dew4wHyeqLUP-XyZk\",\n    \"image\": \"//i.imgur.com/buAYlTA.jpg\"\n  },\n  {\n    \"camper\": \"Bryon Christopher Miller\",\n    \"quote\": \"Free Code Camp 以结构化、基于社区的方式给了我一个免费在线学习全栈 JavaScript 的机会，非常感谢有此机会。\",\n    \"github\": \"bryonmiller\",\n    \"linkedin\": \"https://www.linkedin.com/profile/view?id=AAkAABEXhHoBxj3Uiq7I0a5v1pVkeJ1gWycbm90\",\n    \"image\": \"//i.imgur.com/ssKAX9d.jpg\"\n  },\n  {\n    \"camper\": \"Darren Joy\",\n    \"quote\": \"非常好的学习机会、非常好的编码挑战，在这儿我遇到了一些非常有激情的人。\",\n    \"github\": \"Darrenfj\",\n    \"linkedin\": \"https://www.linkedin.com/profile/view?id=AAkAAARv6UIBWeXw4ZfCJ70kBKgnhcv8XgnVsa8\",\n    \"image\": \"//i.imgur.com/sCkeJ0z.jpg\"\n  },\n  {\n    \"camper\": \"Stephen Mayeux\",\n    \"quote\": \"Free Code Camp 非常有帮助，因为它不完全是手把手地指导，并且它推着我踏出我的安乐窝。\",\n    \"github\": \"stephenmayeux\",\n    \"linkedin\": \"https://www.linkedin.com/profile/view?id=AAkAAAjTe7cBhjovoz6zTE_M6MwZ_rr3szhiSOM\",\n    \"image\": \"//i.imgur.com/TbuwAJ3.jpg\"\n  },\n  {\n    \"camper\": \"John Hillegass\",\n    \"quote\": \"当我参与高级客户会议或开发人员 scrum 环节时，Free Code Camp 给了我所需的信心。\",\n    \"github\": \"Ohillio\",\n    \"linkedin\": \"https://www.linkedin.com/profile/view?id=AAkAAAWEO3AB51y8eR2tYF8nydQb8kANkdPwR5U\",\n    \"image\": \"//i.imgur.com/P61e3dt.jpg\"\n  },\n  {\n    \"camper\": \"Eric Hartline\",\n    \"quote\": \"这个社区非常有帮助，我早已经完成了比我在其他自我导向课程学到的多很多的课程。\",\n    \"github\": \"wildlifehexagon\",\n    \"linkedin\": \"https://www.linkedin.com/profile/view?id=AAkAAAFitUwByB_tgxdExntMnakgQnTK1H3eEd8\",\n    \"image\": \"//i.imgur.com/PgvxbY2.jpg\"\n  },\n  {\n    \"camper\": \"Danielle J Moss\",\n    \"quote\": \"除了以有趣的方式学习编程之外，我还知道我不孤独，并且当我被卡住的时候我知道该去哪儿寻求帮助。\",\n    \"github\": \"psykobilliethekid\",\n    \"linkedin\": \"https://www.linkedin.com/profile/view?id=AAkAAAV4ccABlbMXZ5VfzvlYentPOIKzFbjgbZM\",\n    \"image\": \"//i.imgur.com/AhaRZ3I.jpg\"\n  },\n  {\n    \"camper\": \"Orcun Tonyali\",\n    \"quote\": \"在管理我公司的网站方面，完整的课程提供了很多帮助。\",\n    \"github\": \"orcuntonyali\",\n    \"linkedin\": \"https://www.linkedin.com/profile/view?id=AAkAAAVwBQIBvE3-M8pDWxzep9umHDnV6JjKmTU\",\n    \"image\": \"//i.imgur.com/54O0p69.jpg\"\n  },\n  {\n    \"camper\": \"Brendan Murphy\",\n    \"quote\": \"我喜欢它，不只是为期 9 周的课程，聊天室和配对编码也很有帮助。\",\n    \"github\": \"dendari\",\n    \"linkedin\": \"https://www.linkedin.com/profile/view?id=AAkAAAA06V8BqPNnPod-FGRuvifILht-QwZX3YY\",\n    \"image\": \"//i.imgur.com/36Ba4HU.jpg\"\n  },\n  {\n    \"camper\": \"Michael Berry\",\n    \"quote\": \"Free Code Camp 帮助我学习了 JavaScript、jQuery 和 Bootstrap，同时提升了我的 HTML 和 CSS 技能。4 月份我被波音公司解雇，希望在我接近完成课程时能找到一份作为 JavaScript 开发人员的工作。与 Free Code Camp 相见恨晚。\",\n    \"github\": \"Karnblack \",\n    \"linkedin\": \"https://www.linkedin.com/profile/view?id=AAkAAAGRqf4BwCI3cdJw9wAPc6NlReG3fzOIQq0\",\n    \"image\": \"//i.imgur.com/rIhq3gl.jpg\"\n  },\n  {\n    \"camper\": \"Angie Canon\",\n    \"quote\": \"Free Code Camp 对我的职业生涯帮助很大。我与一些开发人员一起工作，现在我开始更好地理解他们的世界了。我可以更准确地表达问题，并且开始猜测问题可能与什么有关。\",\n    \"github\": \"angiecan\",\n    \"linkedin\": \"https://www.linkedin.com/profile/view?id=AAkAAACfWbABAMsll9ovljvvsLpH317o47hNHX0\",\n    \"image\": \"//i.imgur.com/v258ssn.jpg\"\n  },\n  {\n    \"camper\": \"Irfan Kucuk\",\n    \"quote\": \"很久以来，我一直在找一个能让我持续感兴趣的学习编程的地方。我试过几个 Codecademy 和类似的地方，但事实证明没有一个能像 Free Code Camp 一样吸引人。\",\n    \"github\": \"Ikucuk\",\n    \"linkedin\": \"https://www.linkedin.com/profile/view?id=AAkAAA5ripkBiFAjXkB3ndO6sKiiq6gD21mk6bw\",\n    \"image\": \"//i.imgur.com/Ox8ycSi.jpg\"\n  },\n  {\n    \"camper\": \"Jonathan Kvicky\",\n    \"quote\": \"Free Code Camp 给了我实现我的软件/web 开发职业生涯规划的强大的基础优势，同时作为一个巨大的平台，连接起为软件工程分享同样激情的其他人。\",\n    \"github\": \"jonkvix\",\n    \"linkedin\": \"https://www.linkedin.com/profile/view?id=AAkAABk3i9YB_hcw1AyVg2QHaf8KMQ8ADQ_R_vg\",\n    \"image\": \"//i.imgur.com/CZsAqDK.jpg\"\n  },\n  {\n    \"camper\": \"Susannah Skyer Gupta\",\n    \"quote\": \"作为一家小型教育软件公司的多面手，我已经把我的编程技巧应用到工作中，开始为修复 bug 提交我自己的 pull requests，而不仅仅是打开一个问题单然后等着某人去修复。\",\n    \"github\": \"SuzGupta\",\n    \"linkedin\": \"https://www.linkedin.com/profile/view?id=AAkAAAFIosEBLewkmbuudMwAqiTM5YE3wHvcE4A\",\n    \"image\": \"//i.imgur.com/sazGykY.jpg\"\n  },\n  {\n    \"camper\": \"Puneet Shivanand\",\n    \"quote\": \"在创建并维护本地一家生物信息学联合会网站的工作中，Free Code Camp 可是帮了我的大忙。\",\n    \"github\": \"puneet-shivanand\",\n    \"linkedin\": \"https://www.linkedin.com/profile/view?id=AAkAAArBgXABw4qoSJQoGjqrvU6_vBX1gUmcwGg\",\n    \"image\": \"//i.imgur.com/5BJDA16.jpg\"\n  },\n  {\n    \"camper\": \"Ian Seabrook\",\n    \"quote\": \"如果没有 Free Code Camp，我不可能与这些一辈子都不会有交集的人建立联系。\",\n    \"github\": \"ianseabrook\",\n    \"linkedin\": \"https://www.linkedin.com/profile/view?id=AAkAAAuVUi4BSJ3K6fcyTa2fnZr_9Oosb3nKM34\",\n    \"image\": \"//i.imgur.com/z17zai3.jpg\"\n  },\n  {\n    \"camper\": \"Oleh Kuchuk\",\n    \"quote\": \"编码练习帮我准备好了我的第一份工作的面试。\",\n    \"github\": \"drkraken\",\n    \"linkedin\": \"https://www.linkedin.com/profile/view?id=AAkAABgy6MwBva2OKpsffAU-OBBeTC7qahTYpGw\",\n    \"image\": \"//i.imgur.com/4KHGgjR.jpg\"\n  },\n  {\n    \"camper\": \"Larisa Bekerman\",\n    \"quote\": \"Free Code Camp 让我更惬意于代码的某些方面，并且更多地以动手实践的方式帮助我复习和理解了概念性的内容。有的人通过理论学习来掌握知识，但是对我而言，只有亲自动手去做，我才能理解那些内容！\",\n    \"github\": \"xaosqueen\",\n    \"linkedin\": \"https://www.linkedin.com/profile/view?id=AAkAAAB-SHUBga96BB-iaHe7QFI-S2dFmeUQaq0\",\n    \"image\": \"//i.imgur.com/EptT3Yl.jpg\"\n  },\n  {\n    \"camper\": \"Jesse Mull\",\n    \"quote\": \"我在 Free Code Camp 三个月学到的知识比从传统大学里学到的更多。\",\n    \"github\": \"jessemull\",\n    \"linkedin\": \"https://www.linkedin.com/profile/view?id=AAkAAAr2HfcBswHtmQeLM1rxDEg7GdCuxvNin5s\",\n    \"image\": \"//i.imgur.com/853QDiC.jpg\"\n  },\n  {\n    \"camper\": \"Mihai Popescu\",\n    \"quote\": \"这些练习帮助我磨炼了自己的技术并得到了在一家科技创业公司实习的机会。在面试时，我的项目成为谈话的焦点，向他们展示了我所做的工作、我是如何处理问题的。\",\n    \"github\": \"Mihaisavezi\",\n    \"linkedin\": \"https://www.linkedin.com/profile/view?id=AAkAAApQxGQBYz-WAQu_0zXPTkW-R7QbdaXEZeA\",\n    \"image\": \"//i.imgur.com/FfrhMjg.jpg\"\n  },\n  {\n    \"camper\": \"Normandy Real\",\n    \"quote\": \"利用 Free Code Camp，我目前在从主机编程向前端开发过渡。\",\n    \"github\": \"mandyreal\",\n    \"linkedin\": \"https://www.linkedin.com/profile/view?id=AAkAAAdebIIBHfcSRnxGI-j6g5y6crfOXSg55Dc\",\n    \"image\": \"//i.imgur.com/U5jVHGk.jpg\"\n  },\n  {\n    \"camper\": \"Kristin Anthony\",\n    \"quote\": \"Free Code Camp 的布局、节奏和资源为我明确了重点，并显示了精通掌握的路径，它提供的巨大帮助不只是能够告诉在我的领域的人我正在学习全栈 JavaScript 并且有项目可展示。\",\n    \"github\": \"anthkris\",\n    \"linkedin\": \"https://www.linkedin.com/profile/view?id=AAkAAAZRM5MBACvQe36s4cvpe5ZHWEfgxprDUFg\",\n    \"image\": \"//i.imgur.com/LAE3xBr.jpg\"\n  },\n  {\n    \"camper\": \"Zlatko Cabric\",\n    \"quote\": \"我还在上学，攻读 web 开发的 AS。大学里的 JavaScript 课程简直是浮云，感谢 Free Code Camp。\",\n    \"github\": \"zlajac \",\n    \"linkedin\": \"https://www.linkedin.com/profile/view?id=AAkAAAsCCFMBUlE24Ie41G_YS3XhdtQMDl5vCZA\",\n    \"image\": \"//i.imgur.com/X2ozvfP.jpg\"\n  },\n  {\n    \"camper\": \"Geoff Storbeck\",\n    \"quote\": \"我已经能够构建工具，它帮助我规划更长远的职业生涯，并在这个领域为我打开了更多的门。\",\n    \"github\": \"storbeck\",\n    \"linkedin\": \"https://www.linkedin.com/profile/view?id=AAkAAAdVQZYBHPYLt5efKwqZmiDM5SqIdH0_AR4\",\n    \"image\": \"//i.imgur.com/DULhJ8z.jpg\"\n  },\n  {\n    \"camper\": \"Jason Rueckert\",\n    \"quote\": \"Free Code Camp 直截了当，帮我获得了申请科技公司程序员工作的足够自信，我得到了面试过的第三个工作。\",\n    \"github\": \"jsonify\",\n    \"linkedin\": \"https://www.linkedin.com/profile/view?id=AAkAAAF-rVIBwdzAFzGkWCaIw81O_jajBs-zKZU\",\n    \"image\": \"//i.imgur.com/vSkODHr.jpg\"\n  },\n  {\n    \"camper\": \"Anthony DePaolo\",\n    \"quote\": \"我可以按照自己的进度学习 web 开发，对我疯狂的生活节奏来说这一点真是太好了。另外它也不会让我花费 $10k-$17k，我现在可负担不起这么高的费用。\",\n    \"github\": \"adepaolo\",\n    \"linkedin\": \"https://www.linkedin.com/profile/view?id=AAkAAAOCUkABzCvw3p1mBiPbbFWq91BEFXGXKxA\",\n    \"image\": \"//i.imgur.com/Dm02s0W.jpg\"\n  },\n  {\n    \"camper\": \"Jimmy Epperson\",\n    \"quote\": \"我学会了建立网站，现在这是我向当地企业提供的新服务。\",\n    \"github\": \"jimmyepp\",\n    \"linkedin\": \"https://www.linkedin.com/profile/view?id=AAkAAADg3N8BTBm_D58gu8Tgq6UPa3OQ_19CrSE\",\n    \"image\": \"https://media.licdn.com/mpr/mpr/shrinknp_400_400/AAEAAQAAAAAAAALWAAAAJDUwZDc5YzYwLTc2MjYtNDIzYy1iYzAyLWNlNzZmMTNjM2M1NA.jpg\"\n  },\n  {\n    \"camper\": \"Jonathan Lucas\",\n    \"quote\": \"Free Code Camp 的支持和帮助，使只有相当基本的前端技术知识的我拥有了对全栈视角更好、更彻底的理解。\",\n    \"github\": \"jonslucas\",\n    \"linkedin\": \"https://www.linkedin.com/profile/view?id=AAkAAATn9H4BI7BP7MBpZ0NR1EvldkWTvAdGy2w\",\n    \"image\": \"//i.imgur.com/Fn91jpJ.jpg\"\n  },\n  {\n    \"camper\": \"Brian Barrow\",\n    \"quote\": \"Free Code Camp 给了我成为 web 开发人员的信心。\",\n    \"github\": \"briancbarrow\",\n    \"linkedin\": \"https://www.linkedin.com/profile/view?id=AAkAAAVH-osBCI8WZTtv3Om5WjeD2rYnjQ6z7zA\",\n    \"image\": \"//i.imgur.com/VfdBd5Z.jpg\"\n  },\n  {\n    \"camper\": \"Josh Cronkhite\",\n    \"quote\": \"借助添加一个完整的新栈，我的简历更有份量了，它为我的客户提供了价值，带来了大量过去我会托付给同事的潜在客户。\",\n    \"github\": \"joshcronkhite\",\n    \"linkedin\": \"https://www.linkedin.com/profile/view?id=AAkAAAGTPvoBg__9rivrYrYgo8sDJ561JpAfhHk\",\n    \"image\": \"//i.imgur.com/DjAIqps.jpg\"\n  },\n  {\n    \"camper\": \"Adam Goswick\",\n    \"quote\": \"在我无法承受返回学校的代价之时，是 Free Code Camp 在帮助我学习 web 开发。\",\n    \"github\": \"thegoz85\",\n    \"linkedin\": \"https://www.linkedin.com/profile/view?id=AAkAAAObbhkBzeCKrzuEB0ssE_iGrBX0Xnu9URc\",\n    \"image\": \"//i.imgur.com/XYdoDCQ.jpg\"\n  },\n  {\n    \"camper\": \"Travis Wouters\",\n    \"quote\": \"在 Free Code Camp 的帮助下，我为我的简历添加了新技能，这些技能能够展示我的经历而不是缺乏实际应用的知识。\",\n    \"github\": \"\",\n    \"linkedin\": \"https://www.linkedin.com/profile/view?id=AAkAAABHP0YBddxsmaf2OghV2jAy17RVMhig4RM\",\n    \"image\": \"//i.imgur.com/fyRsiOs.jpg\"\n  },\n  {\n    \"camper\": \"Nicholas Slaven\",\n    \"quote\": \"Free Code Camp 给了我勇气去打开那扇以编程为职业的理想的大门。\",\n    \"github\": \"nslaven22\",\n    \"linkedin\": \"https://www.linkedin.com/profile/view?id=AAkAAA5HGyIBmpNcXY_tfHBkWxXI6OtwsFAeHRQ\",\n    \"image\": \"//i.imgur.com/9ZYscsm.jpg\"\n  },\n  {\n    \"camper\": \"John Bull\",\n    \"quote\": \"我现在能够向其他员工和客户每天使用的 web 应用程序添加自定义品牌和布局。我现在希望从桌面支持转变到开发的角色。\",\n    \"github\": \"Jbull328\",\n    \"linkedin\": \"https://www.linkedin.com/profile/view?id=AAkAABAyfz8BsjE-oGv1k3URGzhRyeupnTGuK3I\",\n    \"image\": \"//i.imgur.com/U2kJtoX.jpg\"\n  },\n  {\n    \"camper\": \"Nick Galluzzo\",\n    \"quote\": \"目前我在一家科技创业公司担任支持角色。我了解 JavaScript 越多，越能为我真正相信的产品做出更大的贡献！\",\n    \"github\": \"ngalluzzo\",\n    \"linkedin\": \"https://www.linkedin.com/profile/view?id=AAkAAAjQl1EBZPrbUQ6zGPXmKIuNzpCyqqsnox4\",\n    \"image\": \"//i.imgur.com/edJP2Qt.jpg\"\n  },\n  {\n    \"camper\": \"James Allen\",\n    \"quote\": \"我终于觉得我能利用自己的时间学习编程并提高就业能力。\",\n    \"github\": \"None Given\",\n    \"linkedin\": \"https://www.linkedin.com/profile/view?id=AAkAAA4OrsIB5WyfuqeECSQO7HYisImVMDiFBl0\",\n    \"image\": \"//i.imgur.com/quRxESK.jpg\"\n  }\n]\n"
  },
  {
    "path": "server/server.js",
    "content": "require('dotenv').load();\nvar pmx = require('pmx');\npmx.init();\n\nvar _ = require('lodash'),\n    uuid = require('node-uuid'),\n    assign = require('lodash').assign,\n    loopback = require('loopback'),\n    boot = require('loopback-boot'),\n    expressState = require('express-state'),\n    path = require('path'),\n    passportProviders = require('./passport-providers');\n\nvar setProfileFromGithub = require('./utils/auth').setProfileFromGithub;\nvar getSocialProvider = require('./utils/auth').getSocialProvider;\nvar getUsernameFromProvider = require('./utils/auth').getUsernameFromProvider;\nvar generateKey =\n  require('loopback-component-passport/lib/models/utils').generateKey;\n\nvar isBeta = !!process.env.BETA;\nvar app = loopback();\n\nexpressState.extend(app);\napp.set('state namespace', '__fcc__');\n\nvar PassportConfigurator =\n  require('loopback-component-passport').PassportConfigurator;\nvar passportConfigurator = new PassportConfigurator(app);\n\napp.set('port', process.env.PORT || 3000);\napp.set('views', path.join(__dirname, 'views'));\napp.set('view engine', 'jade');\napp.use(loopback.token());\napp.disable('x-powered-by');\n\n// adds passport initialization after session middleware phase is complete\npassportConfigurator.init();\n\nboot(app, {\n  appRootDir: __dirname,\n  dev: process.env.NODE_ENV\n});\n\n\npassportConfigurator.setupModels({\n  userModel: app.models.user,\n  userIdentityModel: app.models.userIdentity,\n  userCredentialModel: app.models.userCredential\n});\n\nvar passportOptions = {\n  emailOptional: true,\n  profileToUser: function(provider, profile) {\n    var emails = profile.emails;\n    // NOTE(berks): get email or set to null.\n    // MongoDB indexs email but can be sparse(blank)\n    var email = emails && emails[0] && emails[0].value ?\n      emails[0].value :\n      null;\n\n    // create random username\n    // username will be assigned when camper signups for Github\n    var username = 'fcc' + uuid.v4().slice(0, 8);\n    var password = generateKey('password');\n    var userObj = {\n      username: username,\n      password: password\n    };\n\n    if (email) {\n      userObj.email = email;\n    }\n\n    if (!(/github/).test(provider)) {\n      userObj[getSocialProvider(provider)] = getUsernameFromProvider(\n        getSocialProvider(provider),\n        profile\n      );\n    }\n\n    if (/github/.test(provider)) {\n      setProfileFromGithub(userObj, profile, profile._json);\n    }\n    return userObj;\n  }\n};\n\nObject.keys(passportProviders).map(function(strategy) {\n  var config = passportProviders[strategy];\n  config.session = config.session !== false;\n  passportConfigurator.configureProvider(\n    strategy,\n    assign(config, passportOptions)\n  );\n});\n\napp.start = _.once(function() {\n  app.listen(app.get('port'), function() {\n    app.emit('started');\n    console.log(\n      'FreeCodeCamp server listening on port %d in %s',\n      app.get('port'),\n      app.get('env')\n    );\n    if (isBeta) {\n      console.log('Free Code Camp is in beta mode');\n    }\n  });\n});\n\nmodule.exports = app;\n\n// start the server if `$ node server.js`\n// in production use `$npm start-production`\n// or `$node server/production` to start the server\n// and wait for DB handshake\nif (require.main === module) {\n  app.start();\n}\n"
  },
  {
    "path": "server/services/hikes.js",
    "content": "import debugFactory from 'debug';\nimport assign from 'object.assign';\n\nconst debug = debugFactory('fcc:services:hikes');\n\nexport default function hikesService(app) {\n  const Challenge = app.models.Challenge;\n\n  return {\n    name: 'hikes',\n    read: (req, resource, { dashedName } = {}, config, cb) => {\n      const query = {\n        where: { challengeType: '6' },\n        order: ['order ASC', 'suborder ASC' ]\n      };\n\n      debug('dashedName', dashedName);\n      if (dashedName) {\n        assign(query.where, {\n          dashedName: { like: dashedName, options: 'i' }\n        });\n      }\n      debug('query', query);\n      Challenge.find(query, (err, hikes) => {\n        if (err) {\n          return cb(err);\n        }\n        return cb(null, hikes.map(hike => hike.toJSON()));\n      });\n    }\n  };\n}\n"
  },
  {
    "path": "server/services/job.js",
    "content": "const whereFilt = {\n  where: {\n    isFilled: false,\n    isPaid: true,\n    isApproved: true\n  },\n  order: 'postedOn DESC'\n};\n\nexport default function getJobServices(app) {\n  const { Job } = app.models;\n\n  return {\n    name: 'jobs',\n    create(req, resource, { job } = {}, body, config, cb) {\n      if (!job) {\n        return cb(new Error('job creation should get a job object'));\n      }\n\n      Object.assign(job, {\n        isPaid: false,\n        isApproved: false\n      });\n\n      return Job.create(job, (err, savedJob) => {\n        cb(err, savedJob.toJSON());\n      });\n    },\n    read(req, resource, params, config, cb) {\n      const id = params ? params.id : null;\n      if (id) {\n        return Job.findById(id)\n          .then(job => cb(null, job.toJSON()))\n          .catch(cb);\n      }\n      return Job.find(whereFilt)\n        .then(jobs => cb(null, jobs.map(job => job.toJSON())))\n        .catch(cb);\n    }\n  };\n}\n"
  },
  {
    "path": "server/services/user.js",
    "content": "import debugFactory from 'debug';\nimport assign from 'object.assign';\n\nconst censor = '**********************:P********';\nconst debug = debugFactory('fcc:services:user');\nconst protectedUserFields = {\n  id: censor,\n  password: censor,\n  profiles: censor\n};\n\nexport default function userServices() {\n  return {\n    name: 'user',\n    read: (req, resource, params, config, cb) => {\n      let { user } = req;\n      if (user) {\n        debug('user is signed in');\n        // Zalgo!!!\n        return process.nextTick(() => {\n          cb(null, assign({}, user.toJSON(), protectedUserFields));\n        });\n      }\n      debug('user is not signed in');\n      return process.nextTick(() => {\n        cb(null, {});\n      });\n    }\n  };\n}\n"
  },
  {
    "path": "server/ssl-config.js",
    "content": "/**\n * Created by nathanleniz on 6/16/15.\n */\n\nvar path = require('path');\nvar fs = require('fs');\n\nif (process.env.NODE_ENV === 'production') {\n  exports.privateKey =\n    fs.readFileSync(path.join(__dirname,\n      '../../private/privatekey.pem'));\n  exports.certificate =\n    fs.readFileSync(path.join(__dirname,\n      '../../private/certificate.pem'));\n\n}\n"
  },
  {
    "path": "server/utils/auth.js",
    "content": "import assign from 'object.assign';\n\nconst providerHash = {\n  facebook: ({ id }) => id,\n  twitter: ({ username }) => username,\n  linkedin({ _json }) {\n    return _json && _json.publicProfileUrl || null;\n  },\n  google: ({ id }) => id\n};\n\nexport function getUsernameFromProvider(provider, profile) {\n  return typeof providerHash[provider] === 'function' ?\n    providerHash[provider](profile) :\n    null;\n}\n\n// using es6 argument destructing\nexport function setProfileFromGithub(\n  user,\n  {\n    profileUrl: githubURL,\n    username\n  },\n  {\n    id: githubId,\n    'avatar_url': picture,\n    email: githubEmail,\n    'created_at': joinedGithubOn,\n    blog: website,\n    location,\n    name\n  }\n) {\n  return assign(\n    user,\n    { isGithubCool: true, isMigrationGrandfathered: false },\n    {\n      name,\n      username: username.toLowerCase(),\n      location,\n      joinedGithubOn,\n      website,\n      picture,\n      githubId,\n      githubURL,\n      githubEmail,\n      githubProfile: githubURL\n    }\n  );\n}\n\nexport function getFirstImageFromProfile(profile) {\n  return profile && profile.photos && profile.photos[0] ?\n    profile.photos[0].value :\n    null;\n}\n\nexport function getSocialProvider(provider) {\n  return provider.split('-')[0];\n}\n"
  },
  {
    "path": "server/utils/bad-id-map.js",
    "content": "export default {\n  bg9997c9c79feddfaeb9bdef: '56bbb991ad1ed5201cd392ca',\n  bg9995c9c69feddfaeb9bdef: '56bbb991ad1ed5201cd392cb',\n  bg9994c9c69feddfaeb9bdef: '56bbb991ad1ed5201cd392cc',\n  bg9996c9c69feddfaeb9bdef: '56bbb991ad1ed5201cd392cd',\n  bg9997c9c69feddfaeb9bdef: '56bbb991ad1ed5201cd392ce',\n  bg9997c9c89feddfaeb9bdef: '56bbb991ad1ed5201cd392cf',\n  bg9998c9c99feddfaeb9bdef: '56bbb991ad1ed5201cd392d0',\n  bg9999c9c99feddfaeb9bdef: '56bbb991ad1ed5201cd392d1',\n  bg9999c9c99feedfaeb9bdef: '56bbb991ad1ed5201cd392d2',\n  bg9999c9c99fdddfaeb9bdef: '56bbb991ad1ed5201cd392d3',\n  bb000000000000000000001: '56bbb991ad1ed5201cd392d4',\n  bc000000000000000000001: '56bbb991ad1ed5201cd392d5',\n  bb000000000000000000002: '56bbb991ad1ed5201cd392d6',\n  bb000000000000000000003: '56bbb991ad1ed5201cd392d7',\n  bb000000000000000000004: '56bbb991ad1ed5201cd392d8',\n  bb000000000000000000005: '56bbb991ad1ed5201cd392d9',\n  bb000000000000000000006: '56bbb991ad1ed5201cd392da'\n};\n"
  },
  {
    "path": "server/utils/certTypes.json",
    "content": "{\n  \"frontEnd\": \"isFrontEndCert\",\n  \"backEnd\": \"isBackEndCert\",\n  \"dataVis\": \"isDataVisCert\",\n  \"fullStack\": \"isFullStackCert\"\n}\n"
  },
  {
    "path": "server/utils/commit-goals.json",
    "content": "{\n  \"frontEndCert\": \"Front End Development Certification\",\n  \"backEndCert\": \"Back End Development Certification\",\n  \"dataVisCert\": \"Data Visualisation Certification\",\n  \"fullStackCert\": \"Full Stack Development Certification\"\n}\n"
  },
  {
    "path": "server/utils/commit.js",
    "content": "import dedent from 'dedent';\nimport debugFactory from 'debug';\nimport { Observable } from 'rx';\n\nimport commitGoals from './commit-goals.json';\nconst debug = debugFactory('fcc:utils/commit');\n\nexport { commitGoals };\n\nexport function completeCommitment$(user) {\n  const {\n    isFrontEndCert,\n    isDataVisCert,\n    isBackEndCert,\n    isFullStackCert\n  } = user;\n\n  return Observable.fromNodeCallback(user.pledge, user)()\n    .flatMap(pledge => {\n      if (!pledge) {\n        return Observable.just('No pledge found');\n      }\n\n      const { goal } = pledge;\n\n      if (\n        (isFrontEndCert && goal === commitGoals.frontEndCert) ||\n        (isDataVisCert && goal === commitGoals.dataVisCert) ||\n        (isBackEndCert && goal === commitGoals.backEndCert) ||\n        (isFullStackCert && goal === commitGoals.fullStackCert)\n      ) {\n        debug('marking goal complete');\n        pledge.isCompleted = true;\n        pledge.dateEnded = new Date();\n        pledge.formerUserId = pledge.userId;\n        pledge.userId = null;\n        return Observable.fromNodeCallback(pledge.save, pledge)();\n      }\n      return Observable.just(dedent`\n        You have not yet reached your goal of completing the ${goal}\n        Please retry when you have met the requirements.\n      `);\n    });\n}\n"
  },
  {
    "path": "server/utils/commit.json",
    "content": "[\n  {\n    \"name\": \"女子软件开发计划\",\n    \"displayName\": \"女子软件开发计划\",\n    \"donateUrl\": \"https://www.girldevelopit.com/donate\",\n    \"description\": \"女子软件开发计划让妇女们可以亲身参与一些学习编程的课程。\",\n    \"imgAlt\": \"Girl Develop It participants coding at tables.\",\n    \"imgUrl\": \"//i.imgur.com/U1CyEuA.jpg\"\n  },\n  {\n    \"name\": \"黑人女孩编程计划\",\n    \"displayName\": \"黑人女孩编程计划\",\n    \"donateUrl\": \"http://www.blackgirlscode.com/\",\n    \"description\": \"黑人女孩编程计划致力于让全世界看到黑人女孩不仅能编写程序还能完成更多了不起的工作。\",\n    \"imgAlt\": \"Girls developing code with instructor\",\n    \"imgUrl\": \"//i.imgur.com/HBVrdaj.jpg\"\n  },\n  {\n    \"name\": \"程序员之家\",\n    \"displayName\": \"程序员之家\",\n    \"donateUrl\": \"https://www.globalgiving.org/projects/coderdojo-start-a-dojo-support/\",\n    \"description\": \"程序员之家为年轻人建立了一个连接全球自由软件开发俱乐部的网络。\",\n    \"imgAlt\": \"Two adults help several kids program on their laptops.\",\n    \"imgUrl\": \"//i.imgur.com/701RLfV.jpg\"\n  },\n  {\n    \"name\": \"妇女编程\",\n    \"displayName\": \"妇女编程\",\n    \"donateUrl\": \"https://www.womenwhocode.com/donate\",\n    \"description\": \"妇女编程(WWCode)旨在全球范围内推动妇女们能在技术领域有所建树。\",\n    \"imgAlt\": \"Four women sitting in a classroom together learning to code.\",\n    \"imgUrl\": \"//i.imgur.com/tKUi6Rf.jpg\"\n  },\n  {\n    \"name\": \"编程女孩\",\n    \"displayName\": \"编程女孩\",\n    \"donateUrl\": \"http://girlswhocode.com/\",\n    \"description\": \"编程女孩项目旨在激发和教育女孩子们，让他们具备必要的计算机方面的技能从而帮助她们能在21世纪获得良好的工作机会。\",\n    \"imgAlt\": \"Three women smiling while they code on a computer together.\",\n    \"imgUrl\": \"//i.imgur.com/op8BVph.jpg\"\n  },\n  {\n    \"name\": \"骇客俱乐部\",\n    \"displayName\": \"骇客俱乐部\",\n    \"donateUrl\": \"https://hackclub.io/\",\n    \"description\": \"骇客俱乐部与高校的学生们一起创办和领导了许多学校里的编程社团。\",\n    \"imgAlt\": \"A bunch of high school students posing for a photo in their programming club.\",\n    \"imgUrl\": \"//i.imgur.com/G2YvPHf.jpg\"\n  }\n]"
  },
  {
    "path": "server/utils/constantStrings.json",
    "content": "{\n  \"gitHubUserAgent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1521.3 Safari/537.36\",\n  \"frontEndChallengeId\": \"561add10cb82ac38a17513be\",\n  \"dataVisChallengeId\": \"561add10cb82ac38a17513b3\",\n  \"backEndChallengeId\": \"660add10cb82ac38a17513be\"\n}\n"
  },
  {
    "path": "server/utils/constants.js",
    "content": "exports.blacklistedUsernames = [\n  'bonfire',\n  'account',\n  'user',\n  'challenge',\n  'challenges',\n  'completed-challenge',\n  'completed-zipline-or-basejump',\n  'completed-bonfire',\n  'map',\n  'learn-to-code',\n  'about',\n  'api',\n  'explorer',\n  'field-guide',\n  'completed-field-guide',\n  'jobs',\n  'nonprofits',\n  'api',\n  'sitemap.xml',\n  'get-help',\n  'chat',\n  'twitch',\n  'get-pai',\n  'get-help',\n  'nonprofits',\n  'nonproifts-form',\n  'jobs-form',\n  'unsubscribe',\n  'unsubscribed',\n  'cats.json',\n  'agile',\n  'privacy',\n  'stories',\n  'signin',\n  'signout',\n  'forgot',\n  'reset'\n];\n"
  },
  {
    "path": "server/utils/date-utils.js",
    "content": "import moment from 'moment-timezone';\n\n// day count between two epochs (inclusive)\nexport function dayCount([head, tail], timezone = 'UTC') {\n  return Math.ceil(\n    moment(moment(head).tz(timezone).endOf('day')).diff(\n      moment(tail).tz(timezone).startOf('day'),\n      'days',\n      true)\n    );\n}\n"
  },
  {
    "path": "server/utils/getFromDisk$.js",
    "content": "import path from 'path';\nimport { Observable } from 'rx';\nimport adler32 from 'adler32';\n\nconst basePath = process.cwd() + '/seed/challenges/';\n\nexport default function getFromDisk$(challenge) {\n  if (challenge && !challenge.fileName) {\n    throw new Error(\n      `Challenge ${challenge.name} has no fileName.\n      Did you remember run node seed?`\n    );\n  }\n  delete require.cache[require.resolve(\n    path.join(basePath, challenge.fileName)\n  )];\n\n  return Observable.just(require(path.join(basePath, challenge.fileName)))\n    .map(challengeSpec => {\n      const _challenge = challengeSpec.challenges[challenge.suborder - 1];\n      _challenge.helpRoom = challengeSpec.helpRoom || 'chinese';\n      return _challenge;\n    })\n    .map(challenge => {\n      challenge.checksum = adler32.sum(\n        Buffer(challenge.title +\n          JSON.stringify(challenge.description) +\n          JSON.stringify(challenge.challengeSeed) +\n          JSON.stringify(challenge.tests)));\n\n      challenge.head = challenge.head || [];\n      challenge.tail = challenge.tail || [];\n      challenge.challengeType = '' + challenge.challengeType;\n\n      challenge.name = challenge.title.replace(/[^a-zA-Z0-9\\s]/g, '');\n\n      challenge.dashedName = challenge.name\n        .toLowerCase()\n        .replace(/\\:/g, '')\n        .replace(/\\s/g, '-');\n\n      return challenge;\n    });\n}\n"
  },
  {
    "path": "server/utils/index.js",
    "content": "var cheerio = require('cheerio'),\n    request = require('request'),\n    MDNlinks = require('../../seed/bonfireMDNlinks'),\n    resources = require('./resources.json');\n\n/**\n * Cached values\n */\n\nmodule.exports = {\n  dasherize: function dasherize(name) {\n    return ('' + name)\n      .toLowerCase()\n      .replace(/\\s/g, '-')\n      .replace(/[^a-z0-9\\-\\.]/gi, '');\n  },\n\n  unDasherize: function unDasherize(name) {\n    return ('' + name)\n      // replace dash with space\n      .replace(/\\-/g, ' ')\n      // strip nonalphanumarics chars except whitespace\n      .replace(/[^a-zA-Z\\d\\s]/g, '')\n      .trim();\n  },\n\n  randomPhrase: function() {\n    return resources.phrases[\n      Math.floor(Math.random() * resources.phrases.length)\n      ];\n  },\n\n  randomVerb: function() {\n    return resources.verbs[\n      Math.floor(Math.random() * resources.verbs.length)\n      ];\n  },\n\n  randomCompliment: function() {\n    return resources.compliments[\n      Math.floor(Math.random() * resources.compliments.length)\n      ];\n  },\n\n  whichEnvironment: function() {\n    return process.env.NODE_ENV;\n  },\n\n  getURLTitle: function(url, callback) {\n    var result = {\n      title: '',\n      image: '',\n      url: '',\n      description: ''\n    };\n    request(url, function(err, response, body) {\n      if (err || response.statusCode !== 200) {\n        return callback(new Error('failed'));\n      }\n      var $ = cheerio.load(body);\n      var metaDescription = $(\"meta[name='description']\");\n      var metaImage = $(\"meta[property='og:image']\");\n      var urlImage = metaImage.attr('content') ?\n        metaImage.attr('content') :\n        '';\n\n      var metaTitle = $('title');\n      var description = metaDescription.attr('content') ?\n        metaDescription.attr('content') :\n        '';\n\n      result.title = metaTitle.text().length < 90 ?\n        metaTitle.text() :\n      metaTitle.text().slice(0, 87) + '...';\n\n      result.image = urlImage;\n      result.description = description;\n      return callback(null, result);\n    });\n  },\n\n  getMDNLinks: function(links) {\n    if (!links) {\n      return [];\n    }\n    // takes in an array of links, which are strings\n\n    // for each key value, push the corresponding link\n    // from the MDNlinks object into a new array\n    return links.map(function(value) {\n      return MDNlinks[value];\n    });\n  }\n};\n"
  },
  {
    "path": "server/utils/middleware.js",
    "content": "export function ifNoUserRedirectTo(url, message, type = 'errors') {\n  return function(req, res, next) {\n    const { path } = req;\n    if (req.user) {\n      return next();\n    }\n\n    req.flash(type, {\n      msg: message || `You must be signed to go to ${path}`\n    });\n\n    return res.redirect(url);\n  };\n}\n\nexport function ifNoUserSend(sendThis) {\n  return function(req, res, next) {\n    if (req.user) {\n      return next();\n    }\n    return res.status(200).send(sendThis);\n  };\n}\n\nexport function ifNoUser401(req, res, next) {\n  if (req.user) {\n    return next();\n  }\n  return res.status(401).end();\n}\n"
  },
  {
    "path": "server/utils/resources.json",
    "content": "{\n  \"verbs\": [\n    \"aced\",\n    \"nailed\",\n    \"rocked\",\n    \"destroyed\",\n    \"owned\",\n    \"crushed\",\n    \"conquered\",\n    \"shredded\",\n    \"demolished\",\n    \"devoured\",\n    \"banished\",\n    \"wrangled\"\n  ],\n  \"compliments\": [\n    \"Over the top!\",\n    \"Down the rabbit hole we go!\",\n    \"Bring that rain!\",\n    \"Target acquired!\",\n    \"Feel that need for speed!\",\n    \"You've got guts!\",\n    \"We have liftoff!\",\n    \"To infinity and beyond!\",\n    \"Encore!\",\n    \"Onward, ho!\",\n    \"Challenge destroyed!\",\n    \"It's on like Donkey Kong!\",\n    \"Power level? It's over 9000!\",\n    \"Coding spree!\",\n    \"Code long and prosper.\",\n    \"The crowd goes wild!\",\n    \"One for the guinness book!\",\n    \"Flawless victory!\",\n    \"Most efficient!\",\n    \"Party on, Wayne!\",\n    \"You've got the touch!\",\n    \"You're on fire!\",\n    \"Don't hurt 'em, Hammer!\",\n    \"The town is now red!\",\n    \"To the nines!\",\n    \"The world rejoices!\",\n    \"That's the way it's done!\",\n    \"You rock!\",\n    \"Woo-hoo!\",\n    \"We knew you could do it!\",\n    \"Hyper Combo Finish!\",\n    \"Nothing but net!\",\n    \"Boom-shakalaka!\",\n    \"You're a shooting star!\",\n    \"You're unstoppable!\",\n    \"Way cool!\",\n    \"You're king of the world!\",\n    \"Walk on that sunshine!\",\n    \"Keep on trucking!\",\n    \"Off the charts!\",\n    \"There is no spoon!\",\n    \"Cranked it up to 11!\",\n    \"Escape velocity reached!\",\n    \"You make this look easy!\",\n    \"Passed with flying colors!\",\n    \"You've got this!\",\n    \"Happy, happy, joy, joy!\",\n    \"Tomorrow, the world!\",\n    \"Your powers combined!\",\n    \"A winner is you!\",\n    \"It's alive. It's alive!\",\n    \"Sonic Boom!\",\n    \"Here's looking at you, Code!\",\n    \"Ride like the wind!\",\n    \"Legen - wait for it - dary!\",\n    \"Ludicrous Speed! Go!\",\n    \"Yes we can!\",\n    \"Most triumphant!\",\n    \"One loop to rule them all!\",\n    \"By the power of Grayskull!\",\n    \"You did it!\",\n    \"Storm that castle!\",\n    \"Face-melting guitar solo!\",\n    \"Checkmate!\",\n    \"Bodacious!\",\n    \"Tubular!\",\n    \"You're outta sight!\",\n    \"Keep calm and code on!\",\n    \"Even sad panda smiles!\",\n    \"Even grumpy cat approves!\",\n    \"Kool Aid Man says oh yeah!\",\n    \"Bullseye!\",\n    \"Far out!\",\n    \"You're heating up!\",\n    \"Hasta la vista, challenge!\",\n    \"Terminated.\",\n    \"Hodor!\",\n    \"Off the hook!\",\n    \"Thundercats, Hooo!\",\n    \"Shiver me timbers!\",\n    \"Raise the roof!\",\n    \"We've underestimated you.\",\n    \"I also live dangerously.\",\n    \"Get to the choppa!\",\n    \"Bingo!\",\n    \"And you're all out of gum.\",\n    \"Even honeybadger cares!\",\n    \"Helm, Warp Nine. Engage!\",\n    \"Gotta code 'em all!\",\n    \"Spool up the FTL drive!\",\n    \"Cool beans!\",\n    \"They're in another castle.\",\n    \"Power UP!\",\n    \"Nuclear launch detected.\",\n    \"Pikachu chooses you!\",\n    \"We're gonna pump you up!\",\n    \"I gotta have more cow bell.\"\n  ],\n  \"phrases\": [\n    \"Shout it from on top of a mountain\",\n    \"Tell everyone and their dogs\",\n    \"Show them. Show them all!\",\n    \"Inspire your friends\",\n    \"Tell the world of your greatness\",\n    \"Look accomplished on social media\",\n    \"Share news of your grand endeavor\",\n    \"Establish your alibi for the past two hours\",\n    \"Prove to mom that computers aren't just for games\",\n    \"With coding power comes sharing responsibility\",\n    \"Have you told your friends of your coding powers?\"\n  ]\n}\n"
  },
  {
    "path": "server/utils/rx.js",
    "content": "import Rx from 'rx';\nimport debugFactory from 'debug';\n\nconst debug = debugFactory('fcc:rxUtils');\n\nexport function saveInstance(instance) {\n  return new Rx.Observable.create(function(observer) {\n    if (!instance || typeof instance.save !== 'function') {\n      debug('no instance or save method');\n      observer.onNext();\n      return observer.onCompleted();\n    }\n    return instance.save(function(err, savedInstance) {\n      if (err) {\n        return observer.onError(err);\n      }\n      debug('instance saved');\n      observer.onNext(savedInstance);\n      return observer.onCompleted();\n    });\n  });\n}\n\n// alias saveInstance\nexport const saveUser = saveInstance;\n\nexport function observeQuery(Model, method, query) {\n  return Rx.Observable.fromNodeCallback(Model[method], Model)(query);\n}\n\nexport function observeMethod(context, methodName) {\n  return Rx.Observable.fromNodeCallback(context[methodName], context);\n}\n"
  },
  {
    "path": "server/utils/user-stats.js",
    "content": "import _ from 'lodash';\nimport moment from 'moment-timezone';\nimport { dayCount } from '../utils/date-utils';\n\nconst daysBetween = 1.5;\n\nexport function prepUniqueDays(cals, tz = 'UTC') {\n\n  return _(cals)\n    .map(ts => moment(ts).tz(tz).startOf('day').valueOf())\n    .uniq()\n    .sort()\n    .value();\n}\n\nexport function calcCurrentStreak(cals, tz = 'UTC') {\n\n  let prev = _.last(cals);\n  if (moment().tz(tz).startOf('day').diff(prev, 'days') > daysBetween) {\n    return 0;\n  }\n  let currentStreak = 0;\n  let streakContinues = true;\n  _.forEachRight(cals, cur => {\n    if (moment(prev).diff(cur, 'days') < daysBetween) {\n      prev = cur;\n      currentStreak++;\n    } else {\n      // current streak found\n      streakContinues = false;\n    }\n    return streakContinues;\n  });\n\n  return currentStreak;\n}\n\nexport function calcLongestStreak(cals, tz = 'UTC') {\n\n  let tail = cals[0];\n  const longest = cals.reduce((longest, head, index) => {\n    const last = cals[index === 0 ? 0 : index - 1];\n    // is streak broken\n    if (moment(head).tz(tz).diff(moment(last).tz(tz), 'days') > daysBetween) {\n      tail = head;\n    }\n    if (dayCount(longest, tz) < dayCount([head, tail], tz)) {\n      return [head, tail];\n    }\n    return longest;\n  }, [cals[0], cals[0]]);\n\n  return dayCount(longest, tz);\n}\n"
  },
  {
    "path": "server/views/account/email-signin.jade",
    "content": "extends ../layout\nblock content\n    .row\n        .col-xs-12\n            h2.text-center 账户登录:\n            .col-sm-6.col-sm-offset-3\n                form(method='POST', action='/api/users/login')\n                    input(type='hidden', name='_csrf', value=_csrf)\n                    .form-group\n                        input.input-lg.form-control(type='email', name='email', id='email', placeholder='邮箱', autofocus=true, autocomplete=false)\n                    .form-group\n                        input.input-lg.form-control(type='password', name='password', id='password', placeholder='密码', autocomplete=false)\n                    button.btn.btn-primary.btn-lg.btn-block(type='submit')\n                        span.ion-android-hand\n                        | 登录\n                    .button-spacer\n                    .button-spacer\n                a.btn.btn-info.btn-lg.btn-block(href='/forgot') 忘记密码?\n                br\n                br\n                br\n                br\n                br\n                br\n                br\n                br\n"
  },
  {
    "path": "server/views/account/email-signup.jade",
    "content": "extends ../layout\nblock content\n    script.\n      var challengeName = 'Email Signup'\n    h2.text-center 账户注册:\n    form.form-horizontal(method='POST', action='/api/users', name=\"signupForm\")\n        .row\n            .col-sm-6.col-sm-offset-3\n              input(type='hidden', name='_csrf', value=_csrf)\n              .form-group\n                  input.input-lg.form-control(type='email', name='email', id='email', placeholder='邮箱', autofocus, required, autocomplete=\"off\")\n              .form-group\n                  input.input-lg.form-control(type='password', name='password', id='password', placeholder='密码', required, pattern=\".{8,50}\", title=\"密码长度为8-50之间\")\n              .form-group\n                  button.btn.btn-lg.btn-primary.btn-block(type='submit')\n                    span.ion-person-add\n                    | 注册\n              br\n              br\n              br\n              br\n              br\n              br\n              br\n              br\n"
  },
  {
    "path": "server/views/account/forgot.jade",
    "content": "extends ../layout\nblock content\n    .col-sm-6.col-sm-offset-3\n      form(method='POST', action=\"/forgot\")\n        h2.text-center 密码重置\n        input(type='hidden', name='_csrf', value=_csrf)\n        .form-group\n          p.large-p 我们会把密码重置链接发送到你的邮箱里\n          input.form-control.input-lg(type='email', name='email', id='email', placeholder='邮箱', autofocus=true required)\n        .form-group\n          button.btn.btn-primary.btn-lg.btn-block(type='submit')\n            i.fa.fa-key\n            | 重置密码\n        br\n        br\n        br\n        br\n        br\n        br\n        br\n        br\n"
  },
  {
    "path": "server/views/account/reset.jade",
    "content": "extends ../layout\n\nblock content\n  .col-sm-8.col-sm-offset-2.jumbotron\n    form(action='/reset-password?access_token=#{accessToken}', method='POST')\n      h1 Reset Password\n      input(type='hidden', name='_csrf', value=_csrf)\n      .form-group\n        label(for='password') 新密码\n        input.form-control(type='password', name='password', value='', placeholder='新密码', autofocus=true)\n      .form-group\n        label(for='confirm') 确认密码\n        input.form-control(type='password', name='confirm', value='', placeholder='确认密码')\n      .form-group\n        button.btn.btn-primary.btn-reset(type='submit')\n          i.fa.fa-keyboard-o\n          | 更改密码\n      br\n      br\n      br\n      br\n      br\n      br\n      br\n      br\n"
  },
  {
    "path": "server/views/account/settings.jade",
    "content": "extends ../layout\nblock content\n        h1.text-center 账户设置\n        hr\n        .row\n          .col-xs-12\n              if (!user.isGithubCool)\n                  a.btn.btn-lg.btn-block.btn-github.btn-link-social(href='/link/github')\n                      i.fa.fa-github\n                      | 链接我的github账户以解锁作品集\n              else\n                  a.btn.btn-lg.btn-block.btn-github.btn-link-social(href='/link/github')\n                      i.fa.fa-github\n                      | 更新GitHub中的作品集\n          .col-xs-12\n              a.btn.btn-lg.btn-block.btn-primary.btn-link-social(href='/logout')\n                  | 退出账户\n          .col-xs-12\n              a.btn.btn-lg.btn-block.btn-primary.btn-link-social(href='mailto:jin@freecodecamp.cn')\n                  | 联系我们：jin@freecodecamp.cn\n        .spacer\n        h2.text-center 隐私设置\n        .row\n          .col-xs-12.col-sm-8.col-sm-offset-2.col-md-6.col-md-offset-3\n            .row\n              .col-xs-9\n                p.large-p 天空不留下鸟的痕迹，但我已飞过。\n                  br\n                  | (开启隐私模式是拿不到证书的哦！)\n              if (user.isLocked)\n                .col-xs-3\n                  a.btn.btn-lg.btn-primary.btn-block.active.positive-20(href='/toggle-lockdown-mode') On\n              else\n                .col-xs-3\n                  a.btn.btn-lg.btn-primary.btn-block.positive-20(href='/toggle-lockdown-mode') Off\n\n        .spacer\n        h2.text-center 邮箱设置\n        .row\n          .col-xs-12.col-sm-8.col-sm-offset-2.col-md-6.col-md-offset-3\n            .row\n              .col-xs-9\n                p.large-p 订阅公告\n                  br\n                  | (发布公告)\n              if (user.sendMonthlyEmail)\n                .col-xs-3\n                  a.btn.btn-lg.btn-primary.btn-block.active.positive-20(href='/toggle-announcement-email-mode') On\n              else\n                .col-xs-3\n                  a.btn.btn-lg.btn-primary.btn-block.positive-20(href='/toggle-announcement-email-mode') Off\n\n            .row\n              .col-xs-9\n                p.large-p 订阅通知\n                  br\n                  | (发布通知)\n              if (user.sendNotificationEmail)\n                .col-xs-3\n                  a.btn.btn-lg.btn-primary.btn-block.active.positive-20(href='/toggle-notification-email-mode') On\n              else\n                .col-xs-3\n                  a.btn.btn-lg.btn-primary.btn-block.positive-20(href='/toggle-notification-email-mode') Off\n\n            .row\n              .col-xs-9\n                p.large-p 订阅周刊\n                  br\n                  | (发布周刊)\n              if (user.sendQuincyEmail)\n                .col-xs-3\n                  a.btn.btn-lg.btn-primary.btn-block.active.positive-20(href='/toggle-quincy-email-mode') On\n              else\n                .col-xs-3\n                  a.btn.btn-lg.btn-primary.btn-block.positive-20(href='/toggle-quincy-email-mode') Off\n\n        .spacer\n        h2.text-center 危险操作\n        .row\n          .col-xs-12\n              a.btn.btn-lg.btn-block.btn-danger.btn-link-social.confirm-deletion\n                  | 删除我的账户\n              script.\n                  $('.confirm-deletion').on(\"click\", function () {\n                      $('#modal-dialog').modal('show');\n                  });\n          #modal-dialog.modal.animated.wobble\n              .modal-dialog\n                  .modal-content\n                      .modal-header\n                          a.close(href='#', data-dismiss='modal', aria-hidden='true') ×\n                          h3 You don't really want to delete your account, do you?\n                      .modal-body\n                          p This will really delete all your data, including all your progress, news stories and brownie points.\n                          p We won't be able to recover any of it for you later, even if you change your mind.\n                          p If there's something we could do better, send us an email instead and we'll do our best: &thinsp;\n                              a(href=\"mailto:jin@freecodecamp.cn\") huuoyang@freecodecamp.cn\n                              | .\n                      .modal-footer\n                          a.btn.btn-success.btn-block(href='#', data-dismiss='modal', aria-hidden='true')\n                              | Nevermind, I don't want to delete all of my progress\n                          .spacer\n                          form(action='/account/delete', method='POST')\n                              input(type='hidden', name='_csrf', value=_csrf)\n                              button.btn.btn-danger.btn-block(type='submit')\n                                  | I am 100% sure I want to delete my account and all of my progress\n"
  },
  {
    "path": "server/views/account/show.jade",
    "content": "extends ../layout\nblock content\n    script(src=\"/bower_components/cal-heatmap/cal-heatmap.min.js\")\n    script.\n        var challengeName = 'Profile View';\n    if (user && user.username === username)\n      .row\n        if (!user.isGithubCool)\n          a.btn.btn-lg.btn-block.btn-github.btn-link-social(href='/link/github')\n              i.fa.fa-github\n              | 链接GitHub开启作品集\n        .col-xs-12\n            a.btn.btn-lg.btn-block.btn-primary.btn-link-social(href='/settings')\n                | 更新设置\n        .spacer\n    h1.text-center #{username}的编码作品集\n    hr\n    .row\n        .col-xs-12.col-sm-10.col-sm-offset-1.col-md-8.col-md-offset-2.text-center\n            if picture\n                img.img-center.img-responsive.public-profile-img(src=picture)\n            else\n                img.img-center.img-responsive.public-profile-img(src='/images/camper-image-placeholder.png')\n            h1.text-center.negative-5.profile-social-icons\n                if (github)\n                    a.fa.fa-github-square.text-primary(title=\"@#{username}'s GitHub Profile\", href=github, target='_blank')\n            h1.flat-top.wrappable= name\n            h1.flat-top.wrappable= location\n            h1.flat-top.text-primary= \"[ \" + (progressTimestamps.length) + \" ]\"\n            if pledge\n                .spacer\n                  h4\n                    | This camper has committed to giving $#{pledge.amount} to\n                    a(href='#{pledge.donateUrl}?ref=freecodecamp.cn' target='_blank')  #{pledge.displayName}\n                    |  each month until they have completed their #{pledge.goal}.\n                .spacer\n            .row\n                .col-xs-12.col-sm-10.col-sm-offset-1.col-md-8.col-md-offset-2\n                    if isFrontEndCert\n                        a.btn.btn-primary.btn-block(href='/' + username + '/front-end-certification') 查看我的前端开发认证\n                    if isDataVisCert\n                        .button-spacer\n                        a.btn.btn-primary.btn-block(href='/' + username + '/data-visualization-certification') 查看我的数据可视化认证\n                    if isBackEndCert\n                        .button-spacer\n                        a.btn.btn-primary.btn-block(href='/' + username + '/back-end-certification') 查看我的后端开发认证\n\n    .spacer\n    .col-md-12\n        #cal-heatmap.hidden-xs.hidden-sm.d3-centered\n            script.\n                $(document).ready(function () {\n                    var cal = new CalHeatMap();\n                    var calendar = !{JSON.stringify(calender)};\n                  /*\n                    var estUTCOffset = -5;\n                    // moment returns the utc offset in minutes\n                    var userUTCOffset = moment().utcOffset() / 60;\n                    var secondsToOffset =\n                      (estUTCOffset - userUTCOffset) * 3600;\n                    var offsetCalendar = {};\n                    for (var prop in calendar) {\n                      if (calendar.hasOwnProperty(prop)) {\n                        var offsetProp = prop + secondsToOffset;\n                        offsetCalendar[offsetProp] = calendar[prop];\n                      }\n                    }\n                    */\n                    cal.init({\n                        itemSelector: \"#cal-heatmap\",\n                        domain: \"month\",\n                        subDomain: \"x_day\",\n                        domainGutter: 10,\n                        data: calendar,\n                        cellSize: 15,\n                        align: 'center',\n                        cellRadius: 3,\n                        cellPadding: 2,\n                        tooltip: true,\n                        range: 6,\n                        start: new Date().setDate(new Date().getDate() - 150),\n                        legendColors: [\"#cccccc\", \"#215f1e\"],\n                        legend: [1, 2, 3],\n                        label: {\n                            position: \"top\"\n                        }\n                    });\n                });\n        .row\n            .hidden-xs.col-sm-12.text-center\n                .row.text-primary\n                    h4.col-sm-6.text-right 最高频率: #{longestStreak} #{longestStreak === 1 ? ' day' : ' days'}\n                    h4.col-sm-6.text-left  当前频率: #{currentStreak} #{currentStreak === 1 ? ' day' : ' days'}\n\n\n          if (user && user.username == username || !isLocked)\n              if (projects .length > 0)\n                  .col-sm-12\n                      table.table.table-striped\n                          thead\n                              tr\n                                  th.col-xs-5 Projects\n                                  th.col-xs-2.hidden-xs Completed\n                                  th.col-xs-2.hidden-xs Last Updated\n                                  th.col-xs-2.hidden-xs Link\n                          for challenge in projects\n                              tr\n                                  td.col-xs-5.hidden-xs\n                                      a(href='/challenges/' + removeOldTerms(challenge.name), target='_blank')= removeOldTerms(challenge.name)\n                                  td.col-xs-2.hidden-xs= challenge.completedDate ? challenge.completedDate : 'Not Available'\n                                  td.col-xs-2.hidden-xs= challenge.lastUpdated ? challenge.lastUpdated : ''\n                                  td.col-xs-2.hidden-xs\n                                      a(href=challenge.solution, target='_blank') View my project\n                                  td.col-xs-12.visible-xs\n                                      a(href=challenge.solution, target='_blank')= removeOldTerms(challenge.name)\n              if (algorithms.length > 0)\n                  .col-sm-12\n                      table.table.table-striped\n                          thead\n                              tr\n                                  th.col-xs-5 算法\n                                  th.col-xs-2.hidden-xs 完成\n                                  th.col-xs-2.hidden-xs 最后更新\n                                  th.col-xs-2.hidden-xs 解决方案\n                          for challenge in algorithms\n                              tr\n                                  td.col-xs-5.hidden-xs= removeOldTerms(challenge.name)\n                                  td.col-xs-2.hidden-xs= challenge.completedDate ? challenge.completedDate : 'Not Available'\n                                  td.col-xs-2.hidden-xs= challenge.lastUpdated ? challenge.lastUpdated : ''\n                                  td.col-xs-2.hidden-xs\n                                    if (challenge.solution)\n                                        a(href='/challenges/' + removeOldTerms(challenge.name) + '#?solution=' + encodeURIComponent(encodeFcc(challenge.solution)), target='_blank') View solution\n                                    else\n                                        a(href='/challenges/' + removeOldTerms(challenge.name)) View this challenge\n                                  td.col-xs-12.visible-xs\n                                    if (challenge.solution)\n                                        a(href='/challenges/' + removeOldTerms(challenge.name) + '#?solution=' + encodeURIComponent(encodeFcc(challenge.solution)), target='_blank')= removeOldTerms(challenge.name)\n                                    else\n                                        a(href='/challenges/' + removeOldTerms(challenge.name))= removeOldTerms(challenge.name)\n              if (challenges.length > 0)\n                  .col-sm-12\n                      table.table.table-striped\n                          thead\n                              tr\n                                  th.col-xs-5 挑战\n                                  th.col-xs-2.hidden-xs 完成\n                                  th.col-xs-2.hidden-xs 最后更新\n                                  th.col-xs-2.hidden-xs 解决方案\n                          for challenge in challenges\n                              tr\n                                  td.col-xs-5.hidden-xs= removeOldTerms(challenge.name)\n                                  td.col-xs-2.hidden-xs= challenge.completedDate ? challenge.completedDate : 'Not Available'\n                                  td.col-xs-2.hidden-xs= challenge.lastUpdated ? challenge.lastUpdated : ''\n                                  td.col-xs-2.hidden-xs\n                                    if (challenge.solution)\n                                        a(href='/challenges/' + removeOldTerms(challenge.name) + '#?solution=' + encodeURIComponent(encodeFcc(challenge.solution)), target='_blank') View solution\n                                    else\n                                        a(href='/challenges/' + removeOldTerms(challenge.name)) View this challenge\n                                  td.col-xs-12.visible-xs\n                                    if (challenge.solution)\n                                        a(href='/challenges/' + removeOldTerms(challenge.name) + '#?solution=' + encodeURIComponent(encodeFcc(challenge.solution)), target='_blank')= removeOldTerms(challenge.name)\n                                    else\n                                        a(href='/challenges/' + removeOldTerms(challenge.name))= removeOldTerms(challenge.name)\n"
  },
  {
    "path": "server/views/account/signin.jade",
    "content": "extends ../layout\nblock content\n    style.\n    .text-center\n        h2 账户登录\n        .github-login\n          a.btn.btn-lg.btn-block.btn-social.btn-github(href='/auth/github')\n              i.fa.fa-github\n              | GitHub一键注册登录\n          .first * 推荐使用\n        //hiden juhe login\n          br\n          a.btn.btn-lg.btn-block.btn-social.btn-github(href='/auth/juhe')\n              img(src=\"/images/juhe.png\")\n              | 聚合登录\n        br\n        a.btn.btn-lg.btn-block.btn-social.btn-github(href='/email-signin')\n            i.fa.fa-envelope-o\n            | 邮箱登录\n        br\n        a.btn.btn-lg.btn-block.btn-social.btn-github(href='/challenges/learn-how-free-code-camp-works')\n            i.fa.fa-map-o\n            | 直接开始学习\n        br\n        br\n        br\n        br\n        br\n        br\n        br\n        br\n    script.\n      $(document).ready(function() {\n        var method = localStorage.getItem('lastSigninMethod'),\n          btnSelector = 'a.btn.btn-lg.btn-block.btn-social';\n        if (method) {\n          try {\n            var obj = JSON.parse(method);\n          } catch(e) {\n            console.error('Invalid sign in object stored', method);\n            return;\n          }\n          $.each($(btnSelector), function(i, item) {\n            if (\n              $(item).attr('href') === obj.methodLink &&\n              $(item).hasClass(obj.methodClass)\n            ) {\n              $(item).addClass('active');\n              $(item).attr('title', 'This is your last signin method');\n              return false;\n            }\n          });\n        }\n\n        $(btnSelector).click(function() {\n          var obj = {};\n          $(this).removeClass('active');\n          obj.methodClass = $(this).attr('class').split(' ').pop();\n          obj.methodLink = $(this).attr('href');\n          localStorage.setItem('lastSigninMethod', JSON.stringify(obj));\n        });\n      });\n"
  },
  {
    "path": "server/views/certificate/back-end.jade",
    "content": "include font\n#name.cert-name= name\nimg#cert.img-abs(src='//i.imgur.com/yBKoMVP.jpg')\n.cert-date= date\n.cert-link verify this certification at: http://freecodecamp.cn/#{username}/back-end-certification\ninclude script\n"
  },
  {
    "path": "server/views/certificate/data-vis.jade",
    "content": "include font\n#name.cert-name= name\nimg#cert.img-abs(src='//i.imgur.com/l7tIptn.jpg')\n.cert-date= date\n.cert-link verify this certification at: http://freecodecamp.cn/#{username}/data-visualization-certification\ninclude script\n"
  },
  {
    "path": "server/views/certificate/font.jade",
    "content": "style.\n  @font-face {\n    font-family: \"Sax Mono\";\n    src: url(\"/fonts/saxmono.ttf\") format(\"truetype\");\n  }\n\n  body {\n    display: inline-block;\n    font-family: \"Sax Mono\", monospace;\n    margin: 0;\n    position: absolute;\n    text-align: center;\n  }\n\n  .img-abs {\n    left 0;\n    position: relative;\n    top: 0;\n    width: 2000px\n  }\n\n  .cert-name {\n    font-size: 64px;\n    left: 1000px;\n    position: absolute;\n    top: 704px;\n    z-index: 1000;\n  }\n\n  .cert-date {\n    font-size: 60px;\n    left: 760px;\n    position: absolute;\n    top: 1004.8px;\n    z-index: 1000;\n  }\n\n  .cert-link {\n    font-size: 22px;\n    left: 120px;\n    position: absolute;\n    top: 1488px;\n    z-index: 1000;\n  }\n\n"
  },
  {
    "path": "server/views/certificate/front-end.jade",
    "content": "include font\n#name.cert-name= name\nimg#cert.img-abs(src='//i.imgur.com/ToFZKBd.jpg')\n.cert-date= date\n.cert-link verify this certification at: http://freecodecamp.cn/#{username}/front-end-certification\ninclude script\n"
  },
  {
    "path": "server/views/certificate/full-stack.jade",
    "content": "include font\n#name.cert-name= name\nimg#cert.img-abs(src='//i.imgur.com/Z4PgjBQ.jpg')\n.cert-date= date\n.cert-link verify this certification at: http://freecodecamp.cn/#{username}/full-stack-certification\ninclude script\n"
  },
  {
    "path": "server/views/certificate/index.jade",
    "content": "extends ../layout\nblock content\n    .panel.panel-info\n        .panel-heading.text-center\n            h1 Certificate\n        .panel-body\n            p foo\n"
  },
  {
    "path": "server/views/certificate/script.jade",
    "content": "script.\n  (function() {\n    var containerWidth = document.getElementById('cert').offsetWidth;\n    var nameDiv = document.getElementById('name');\n    var nameWidth = nameDiv.offsetWidth;\n    console.log(containerWidth, nameWidth);\n    nameDiv.style.left = ((containerWidth - nameWidth) / 2) + 15;\n  })();\n"
  },
  {
    "path": "server/views/challenges/showBonfire.jade",
    "content": "extends ../layout-wide\nblock content\n    link(rel='stylesheet', href='/bower_components/CodeMirror/lib/codemirror.css')\n    link(rel='stylesheet', href='/bower_components/CodeMirror/addon/lint/lint.css')\n    link(rel='stylesheet', href='/bower_components/CodeMirror/theme/monokai.css')\n    link(rel='stylesheet', href='/css/ubuntu.css')\n    .row\n        .col-md-4.col-lg-3\n            .scroll-locker(id = \"scroll-locker\")\n              .innerMarginFix(style=' width: 99%')\n                #testCreatePanel\n                    h4.text-center.challenge-instructions-title= name\n                      if (isCompleted)\n                          | &nbsp;\n                          i.ion-checkmark-circled.text-primary(title=\"Completed\")\n                    hr\n                    .row\n                        .col-xs-12\n                            .challenge-instructions\n                                for sentence in description\n                                    if (/blockquote|h4|table/.test(sentence))\n                                        !=sentence\n                                    else\n                                        p.wrappable!= sentence\n                            if (MDNlinks.length)\n                                #MDN-links\n                                    p 这是一些对你有帮助的资源:\n                                    for link, index in MDNlinks\n                                        ul: li: a(href=\"\"+link, target=\"_blank\") !{MDNkeys[index]}\n                            .button-spacer\n                if (user)\n                label.btn.btn-primary.btn-block.btn-lg#submitButton\n                        | 运行测试 (ctrl + enter)\n                .button-spacer\n                .btn-group.input-group.btn-group-justified\n                    label.btn.btn-primary.btn-primary-ghost.btn-lg#trigger-reset-modal\n                            | &nbsp; 重置\n                    label.btn.btn-primary.btn-primary-ghost.btn-lg#challenge-help-btn\n                            | &nbsp; 帮助\n                    label.btn.btn-primary.btn-primary-ghost.btn-lg#trigger-issue-modal\n                            | &nbsp; Bug\n                if (!user)\n                    .button-spacer\n                    a.btn.signup-btn.btn-block.btn-block(href='/login') 登录可以保存进度哦\n                        script.\n                            var userLoggedIn = false;\n                .button-spacer\n                form.code\n                    .form-group.codeMirrorView\n                        textarea#codeOutput(style='display: none;')\n                br\n                #testSuite\n                br\n\n        .col-md-8.col-lg-9\n            .editorScrollDiv(style = \"overflow-y: auto; overflow-x: hidden;\")\n                #mainEditorPanel\n                    form.code\n                        .form-group.codeMirrorView\n                            textarea#codeEditor(autofocus=true, style='display: none;')\n\n\n    #complete-courseware-dialog.modal(tabindex='-1')\n        .modal-dialog.animated.fadeIn.fast-animation\n            .modal-content\n                .modal-header.challenge-list-header= compliment\n                    a.close.closing-x(href='#', data-dismiss='modal', aria-hidden='true') ×\n                .modal-body\n                    .text-center\n                      #checkmark-container.row\n                          #challenge-checkmark.animated.zoomInDown.delay-half\n                              span.completion-icon.ion-checkmark-circled.text-primary\n                      .spacer\n                      .row\n                      if (user)\n                          #submit-challenge.animated.fadeIn.btn.btn-lg.btn-primary.btn-block 进入下一个挑战 (ctrl + enter)\n                          a.btn.btn-lg.btn-block.btn-twitter(target=\"_blank\", href=\"https://twitter.com/intent/tweet?text=I%20just%20#{verb}%20%40FreeCodeCamp%20#{name}&url=http%3A%2F%2Ffreecodecamp.cn/challenges/#{dashedName}&hashtags=LearnToCode, JavaScript\", onclick=\"ga('send', 'event', 'twitter', 'share', 'challenge completion share');\")\n                              i.fa.fa-twitter &thinsp;\n                                  = phrase\n                      else\n                          a#next-challenge.btn.btn-lg.btn-primary.btn-block(href=\"/challenges/next-challenge?id=\"+id) 前进(ctrl + enter)\n    include ../partials/challenge-modals\n    script(type=\"text/javascript\").\n      var common = window.common = window.common || { init: [] };\n\n      common.tests = !{JSON.stringify(tests)};\n      common.head = !{JSON.stringify(head)};\n      common.tail = !{JSON.stringify(tail)};\n\n      common.challengeId = !{JSON.stringify(id)};\n      common.challengeName = !{JSON.stringify(name)};\n      common.challengeSeed = !{JSON.stringify(challengeSeed)};\n      common.challengeType = !{JSON.stringify(challengeType)};\n      common.dashedName = !{JSON.stringify(dashedName)};\n      common.isCompleted = !{JSON.stringify(isCompleted)};\n      common.gaName = !{JSON.stringify(gaName)};\n\n      common.username = !{JSON.stringify(user && user.username || '')};\n\n    include ../partials/challenge-footer\n"
  },
  {
    "path": "server/views/challenges/showHTML.jade",
    "content": "extends ../layout-wide\nblock content\n    link(rel='stylesheet', href='/bower_components/CodeMirror/lib/codemirror.css')\n    link(rel='stylesheet', href='/bower_components/CodeMirror/addon/lint/lint.css')\n    link(rel='stylesheet', href='/bower_components/CodeMirror/theme/monokai.css')\n    link(rel='stylesheet', href='/css/ubuntu.css')\n    .row\n        .col-md-3.col-lg-3\n            .scroll-locker(id = \"scroll-locker\")\n                .innerMarginFix(style = \"width: 99%;\")\n                    .row\n                        .col-xs-12\n                            h4.text-center.challenge-instructions-title= name\n                                if (isCompleted)\n                                    | &nbsp;\n                                    i.ion-checkmark-circled.text-primary(title=\"Completed\")\n                            hr\n                            .challenge-instructions\n                                for sentence in description\n                                    if (/\\<blockquote|\\<h4|\\<table/.test(sentence))\n                                        !=sentence\n                                    else\n                                        p.wrappable!= sentence\n                                .negative-bottom-margin-30\n                    .button-spacer\n                    .btn-big.btn.btn-primary.btn-block#submitButton\n                        | Run tests (ctrl + enter)\n                    .button-spacer\n                    .btn-group.input-group.btn-group-justified\n                        label.btn.btn-primary.btn-primary-ghost.btn-lg#trigger-reset-modal Reset\n                        label.btn.btn-primary.btn-primary-ghost.hidden-sm.hidden-md.hidden-lg\n                            a(href='//gitter.im/freecodecamp/chinese') Help\n                        label.btn.btn-primary.btn-primary-ghost.hidden-xs.btn-lg#challenge-help-btn Help\n                        label.btn.btn-primary.btn-primary-ghost.btn-lg#trigger-issue-modal Bug\n                    script.\n                        var userLoggedIn = true;\n                    if (!user)\n                        .button-spacer\n                        a.btn.signup-btn.btn-block.btn-block(href='/login') 登录可以保存进度哦\n                            script.\n                                var userLoggedIn = false;\n                    .button-spacer\n                    #testSuite\n                    br\n        .col-md-5.col-lg-6\n            .editorScrollDiv(style = \"overflow-y: auto; overflow-x: hidden;\")\n                    #mainEditorPanel\n                        form.code\n                            .codeMirrorView\n                                textarea#codeEditor(autofocus=true, style='display: none;')\n        .col-md-4.col-lg-3\n            .hidden-xs.hidden-sm\n                img.iphone-position.iframe-scroll(src=\"/images/iphone6-frame.png\", style = \"z-index: -2;\")\n            iframe.iphone.iframe-scroll#preview\n            .spacer\n        #complete-courseware-dialog.modal(tabindex='-1')\n            .modal-dialog.animated.fadeIn.fast-animation\n                .modal-content\n                    .modal-header.challenge-list-header\n                        = compliment\n                        a.close.closing-x(href='#', data-dismiss='modal', aria-hidden='true') ×\n                    .modal-body\n                        .text-center\n                            #checkmark-container.row\n                                #challenge-checkmark.animated.zoomInDown.delay-half\n                                    span.completion-icon.ion-checkmark-circled.text-primary\n                            .spacer\n                            if(user)\n                                #submit-challenge.animated.fadeIn.btn.btn-lg.btn-primary.btn-block 进入下一个挑战 (ctrl + enter)\n                            else\n                                a#next-challenge.btn.btn-lg.btn-primary.btn-block(href=\"/challenges/next-challenge?id=\"+id) 前进 (ctrl + enter)\n    include ../partials/challenge-modals\n    script(type=\"text/javascript\").\n      $('#next-courseware-button').attr('disabled', 'disabled');\n      var common = window.common || { init: [] };\n\n      common.tests = !{JSON.stringify(tests)};\n      common.head = !{JSON.stringify(head)};\n      common.tail = !{JSON.stringify(tail)};\n\n      common.challengeId = !{JSON.stringify(id)};\n      common.challengeName = !{JSON.stringify(name)};\n      common.challengeSeed = !{JSON.stringify(challengeSeed)};\n      common.challengeType = !{JSON.stringify(challengeType)};\n      common.dashedName = !{JSON.stringify(dashedName)};\n      common.isCompleted = !{JSON.stringify(isCompleted)};\n      common.gaName = !{JSON.stringify(gaName)};\n\n      common.username = !{JSON.stringify(user && user.username || '')};\n\n      common.init.push(function() {\n        common.editor.setOption('lint', false);\n        common.editor.setOption('mode', 'text/html');\n      });\n\n    include ../partials/challenge-footer\n"
  },
  {
    "path": "server/views/challenges/showJS.jade",
    "content": "extends ../layout-wide\nblock content\n    link(rel='stylesheet', href='/bower_components/CodeMirror/lib/codemirror.css')\n    link(rel='stylesheet', href='/bower_components/CodeMirror/addon/lint/lint.css')\n    link(rel='stylesheet', href='/bower_components/CodeMirror/theme/monokai.css')\n    link(rel='stylesheet', href='/css/ubuntu.css')\n    .row\n        .col-md-4.col-lg-3\n            .scroll-locker(id = \"scroll-locker\")\n                .innerMarginFix(style = \"width: 99%;\")\n                    #testCreatePanel\n                        h4.text-center.challenge-instructions-title= name\n                            if (isCompleted)\n                                | &nbsp;\n                                i.ion-checkmark-circled.text-primary(title=\"Completed\")\n                        hr\n                        .row\n                            .col-xs-12\n                                .challenge-instructions\n                                    for sentence in description\n                                        if (/blockquote|\\<ol|h4|\\<table/.test(sentence))\n                                            !=sentence\n                                        else\n                                            p.wrappable!= sentence\n                                if (MDNlinks.length)\n                                    .negative-bottom-margin-30\n                                        #MDN-links\n                                            p 这是一些对你有帮助的资源:\n                                            for link, index in MDNlinks\n                                                ul: li: a(href=\"\" + link, target=\"_blank\") !{MDNkeys[index]}\n                                    .button-spacer\n                    if (user)\n                        form.form-horizontal(novalidate='novalidate', name='completedWithForm')\n                            .form-group.text-center\n                                .col-xs-12\n                                    // extra field to distract password tools like lastpass from injecting css into our username field\n                    label.btn.btn-primary.btn-big.btn-block#submitButton Run tests (ctrl + enter)\n                    .button-spacer\n                    .btn-group.input-group.btn-group-justified\n                        label.btn.btn-primary.btn-lg#trigger-reset-modal Reset\n                        label.btn.btn-primary.btn-lg#challenge-help-btn Help\n                        label.btn.btn-primary.btn-lg#trigger-issue-modal Bug\n                    if (!user)\n                        .button-spacer\n                        a.btn.signup-btn.btn-block.btn-block(href='/login') 登录可以保存进度哦\n                            script.\n                                var userLoggedIn = false;\n                    .button-spacer\n                    form.code\n                        .form-group.codeMirrorView\n                            textarea#codeOutput(style='display: none;')\n                    br\n                    #testSuite\n                    br\n        .col-md-8.col-lg-9\n            .editorScrollDiv(style = \"overflow-y: auto; overflow-x: hidden;\")\n                #mainEditorPanel\n                    form.code\n                        .codeMirrorView\n                            textarea#codeEditor(autofocus=true, style='display: none;')\n    #complete-courseware-dialog.modal(tabindex='-1')\n        .modal-dialog.animated.fadeIn.fast-animation\n            .modal-content\n                .modal-header.challenge-list-header= compliment\n                    a.close.closing-x(href='#', data-dismiss='modal', aria-hidden='true') ×\n                .modal-body\n                    .text-center\n                        #checkmark-container.row\n                            #challenge-checkmark.animated.zoomInDown.delay-half\n                                span.completion-icon.ion-checkmark-circled.text-primary\n                        .spacer\n                        .row\n                        if (user)\n                            #submit-challenge.animated.fadeIn.btn.btn-lg.btn-primary.btn-block 进入下一个挑战 (ctrl + enter)\n                        else\n                            a#next-challenge.animated.fadeIn.btn.btn-lg.btn-primary.btn-block(href=\"/challenges/next-challenge?id=\"+id) 前进 (ctrl + enter)\n    include ../partials/challenge-modals\n    script(type=\"text/javascript\").\n      var common = window.common = { init: [] };\n\n      common.tests = !{JSON.stringify(tests)};\n      common.head = !{JSON.stringify(head)};\n      common.tail = !{JSON.stringify(tail)};\n\n      common.challengeId = !{JSON.stringify(id)};\n      common.challengeName = !{JSON.stringify(name)};\n      common.challengeSeed = !{JSON.stringify(challengeSeed)};\n      common.challengeType = !{JSON.stringify(challengeType)};\n      common.dashedName = !{JSON.stringify(dashedName)};\n      common.isCompleted = !{JSON.stringify(isCompleted)};\n      common.gaName = !{JSON.stringify(gaName)};\n\n      common.username = !{JSON.stringify(user && user.username || '')};\n\n    include ../partials/challenge-footer\n    script.\n      common.init.push(function() {\n        common.editor.setOption('mode', 'javascript');\n      });\n"
  },
  {
    "path": "server/views/challenges/showStep.jade",
    "content": "extends ../layout-wide\nblock content\n    .row\n        .col-md-8.col-md-offset-2\n            for step, index in description\n                .challenge-step(class=index !== 0 ? 'hidden': '')\n                    a(href=step[0] data-lightbox='img-enlarge')\n                        img.gif-block.img-center.img-responsive(src='#{step[0]}' alt='#{step[1]}')\n                    .row\n                        .col-xs-12.col-sm-10.col-sm-offset-1.col-md-8.col-md-offset-2\n                            p!= step[2]\n                    .challenge-button-block\n                        if step[3]\n                            a.btn.btn-block.btn-primary.challenge-step-btn-action.btn-lg(id='#{index}' href='#{step[3]}' target='_blank') 点击这里按图示操作可以解锁下一个挑战\n                            .button-spacer\n                        if index === 0\n                            .col-sm-4.hidden-xs &nbsp;\n                        else\n                            .btn.btn-primary.btn-primary-ghost.col-sm-4.col-xs-12.challenge-step-btn-prev.btn-lg(id='#{index - 1}') 后退\n                        .challenge-step-counter.large-p.col-sm-4.col-xs-12.text-center (#{index + 1} / #{description.length})\n                        if index + 1 === description.length\n                            .btn.btn-primary.col-sm-4.col-xs-12.challenge-step-btn-finish.btn-lg(id='last' class=step[3] && !isCompleted ? 'disabled' : '') 完成挑战\n                        else\n                            .btn.btn-primary.col-sm-4.col-xs-12.challenge-step-btn-next.btn-lg(id='#{index}' class=step[3] && !isCompleted ? 'disabled' : '') 前进\n                    .clearfix\n    .spacer\n    #challenge-step-modal.modal(tabindex='-1')\n        .modal-dialog.animated.fadeIn.fast-animation\n            .modal-content\n                .modal-header.challenge-list-header= compliment\n                    a.close.closing-x(href='#', data-dismiss='modal', aria-hidden='true') ×\n                .modal-body\n                    .text-center\n                      #checkmark-container.row\n                          #challenge-checkmark.animated.zoomInDown.delay-half\n                              span.completion-icon.ion-checkmark-circled.text-primary\n                      .spacer\n                      .row\n                      if (user)\n                          #challenge-step-btn-submit.animated.fadeIn.btn.btn-lg.btn-primary.btn-block 进入下一个挑战\n                      else\n                          a.btn.btn-lg.btn-primary.btn-block(href='/challenges/next-challenge?id=' + id) 前进\n    script.\n      var common = window.common || { init: [] };\n\n      common.challengeId = !{JSON.stringify(id)};\n      common.challengeName = !{JSON.stringify(name)};\n      common.challengeType = !{JSON.stringify(challengeType)};\n      common.dashedName = !{JSON.stringify(dashedName || '')};\n      common.gaName = !{JSON.stringify(gaName)};\n      common.isHonest = !{JSON.stringify(isHonest || false)};\n      common.isFrontEndCert = !{JSON.stringify(isFrontEndCert || false)};\n      common.isFullStackCert = !{JSON.stringify(isFullStackCert || false)};\n      common.challengeSeed = !{JSON.stringify(challengeSeed || [])};\n    include ../partials/challenge-footer\n"
  },
  {
    "path": "server/views/challenges/showVideo.jade",
    "content": "extends ../layout-wide\nblock content\n    .row\n        .col-xs-12.col-sm-12.col-md-4\n            h4.text-center.challenge-instructions-title= name\n                if (isCompleted)\n                    | &nbsp;\n                    i.ion-checkmark-circled.text-primary(title=\"Completed\")\n            hr\n            ol\n                for step, index in description\n                    .row.checklist-element(id=\"#{dashedName + index}\")\n                        .col-xs-2.col-sm-1.col-md-2.padded-ionic-icon.text-right\n                            input(type='checkbox' class='challenge-list-checkbox')\n                        .col-xs-10.col-sm-11.col-md-10\n                            li.step-text.wrappable!= step\n        .col-xs-12.col-sm-12.col-md-8\n            .embed-responsive.embed-responsive-16by9\n                iframe.embed-responsive-item(src='//player.vimeo.com/video/#{video}')\n            .spacer\n            if (user)\n                a.btn.btn-primary.btn-big.btn-block#completed-courseware-editorless 我已经完成了这个挑战 (ctrl + enter)\n            else\n                a.btn.btn-big.btn-primary.btn-block(href='/challenges/next-challenge?id=' + id) 我已经完成了这个挑战(ctrl + enter)\n                script.\n                    var userLoggedIn = true;\n            .button-spacer\n            .btn-group.input-group.btn-group-justified\n                .btn.btn-primary.btn-big#challenge-help-btn 获得帮助\n                .btn.btn-primary.btn-big#trigger-issue-modal 提交bug\n            if (!user)\n                .button-spacer\n                a.btn.btn-big.signup-btn.btn-block(href='/login') 登录可以保存进度哦\n                    script.\n                        var userLoggedIn = false;\n                br\n\n        script(type=\"text/javascript\").\n\n    #complete-courseware-editorless-dialog.modal(tabindex='-1')\n        .modal-dialog.animated.fadeIn.fast-animation\n            .modal-content\n                .modal-header.challenge-list-header= compliment\n                    a.close.closing-x(href='#', data-dismiss='modal', aria-hidden='true') ×\n                .modal-body\n                    .text-center\n                        .animated.zoomInDown\n                            span.completion-icon.ion-checkmark-circled.text-primary\n                        if (user)\n                            a.btn.btn-lg.btn-primary.btn-block#next-courseware-button(name='_csrf', value=_csrf) 我已经完成了这个挑战 (ctrl + enter)\n                        else\n                            a.animated.fadeIn.btn.btn-lg.btn-primary.btn-block(href='/challenges/next-challenge?id=' + id) 我已经完成了这个挑战 (ctrl + enter)\n\n    include ../partials/challenge-modals\n    script.\n      var common = window.common || { init: [] };\n\n      common.challengeId = !{JSON.stringify(id)};\n      common.challengeName = !{JSON.stringify(name)};\n      common.challengeType = !{JSON.stringify(challengeType)};\n      common.dashedName = !{JSON.stringify(dashedName)};\n      common.gaName = !{JSON.stringify(gaName)};\n      common.init.push(function($) {\n        function controlEnterHandler(e) {\n            if (\n              e.keyCode === 13 &&\n              (e.ctrlKey || e.metaKey)\n            ) {\n              $('body').unbind('keydown');\n              $('#complete-courseware-editorless-dialog').modal('show');\n            }\n        };\n\n        function modalControlEnterHandler(e) {\n          if (\n            e.keyCode === 13 &&\n            (e.ctrlKey || e.metaKey)\n          ) {\n            $('#complete-courseware-editorless-dialog').unbind('keydown');\n            $('#next-courseware-button').click();\n          }\n        };\n        if (!{JSON.stringify(user && user.username ? true : false)}) {\n          $('#complete-courseware-editorless-dialog').bind('keydown', modalControlEnterHandler);\n        }\n        $('body').bind('keydown', controlEnterHandler);\n\n        $('#completed-courseware-editorless').on('click', function() {\n          $('#complete-courseware-editorless-dialog').modal('show');\n        });\n      });\n\n    include ../partials/challenge-footer\n"
  },
  {
    "path": "server/views/challenges/showZiplineOrBasejump.jade",
    "content": "extends ../layout-wide\nblock content\n    .row\n        .col-md-4\n            h4.text-center.challenge-instructions-title= name\n                 if (isCompleted)\n                    | &nbsp;\n                    i.ion-checkmark-circled.text-primary(title=\"Completed\")\n            hr\n            ol\n                for step, index in description\n                    .row.checklist-element(id=\"#{dashedName + index}\")\n                        .col-xs-3.col-sm-1.col-md-2.padded-ionic-icon.text-center\n                            input(type='checkbox' class='challenge-list-checkbox')\n                        .col-xs-9.col-sm-11.col-md-10\n                            li.step-text.wrappable!= step\n        .col-xs-12.col-sm-12.col-md-8\n            .embed-responsive.embed-responsive-16by9\n                iframe.embed-responsive-item(src='//player.vimeo.com/video/#{video}')\n            br\n            if (user)\n                a.btn.btn-primary.btn-big.btn-block#completed-zipline-or-basejump 我已经完成了这个挑战 (ctrl + enter)\n                script.\n                    var userLoggedIn = true;\n            else\n                a.btn.btn-big.btn-primary.btn-block(href='/challenges/next-challenge?id=' + id) 进入下一个挑战 (ctrl + enter)\n            .button-spacer\n            .btn-group.input-group.btn-group-justified\n                .btn.btn-primary.btn-primary-ghost.btn-big#challenge-help-btn Help\n                .btn.btn-primary.btn-primary-ghost.btn-big#trigger-issue-modal Bug\n            if (!user)\n                .button-spacer\n                a.btn.btn-big.signup-btn.btn-block(href='/login') 登录可以保存进度哦\n                    script.\n                        var userLoggedIn = false;\n                br\n            script(type=\"text/javascript\").\n\n    #complete-zipline-or-basejump-dialog.modal(tabindex='-1')\n        .modal-dialog.animated.fadeIn.fast-animation\n            .modal-content\n                .modal-header.challenge-list-header= compliment\n                    a.close.closing-x(href='#', data-dismiss='modal', aria-hidden='true') ×\n                .modal-body\n                    .text-center\n                        .animated.zoomInDown\n                            span.completion-icon.ion-checkmark-circled.text-primary\n                    if (user)\n                        form.form-horizontal(name='completedWithForm', id='basejump-or-zipline-submit-form')\n                            .form-group.text-center\n                                .col-xs-10.col-xs-offset-1.col-sm-8.col-sm-offset-2.col-md-8.col-md-offset-2\n                                    // extra field to distract password tools like lastpass from injecting css into our username field\n                                    input.form-control.hidden\n                                    if (challengeType === \"3\")\n                                        input.form-control#public-url(type=\"url\", name=\"solutionUrl\", placeholder=\"http://codepen.io/your-pen-here\", autofocus, required)\n                                    else\n                                        input.form-control#public-url(type=\"url\", name=\"solutionUrl\", placeholder=\"http://yourapp.com\", autofocus, required)\n                                        input.form-control#github-url(name=\"githubUrl\", placeholder=\"http://github.com/camper/project\")\n\n                    if (user)\n                        a.btn.btn-lg.btn-primary.btn-block#next-courseware-button(name='_csrf', value=_csrf) 进入下一个挑战\n                        .button-spacer\n                        a.btn.btn-lg.btn-block.btn-twitter(target=\"_blank\", href=\"https://twitter.com/intent/tweet?text=Check%20out%20the%20project%20I%20just%20built%20with%20%40FreeCodeCamp:%20PASTE_YOUR_CODEPEN_URL_HERE_USING_FULL_INSTEAD_OF_PEN%20%0A%20%23LearnToCode%20%23JavaScript\", onclick=\"ga('send', 'event', 'twitter', 'share', 'challenge completion share');\")\n                          i.fa.fa-twitter &thinsp;Tweet this project\n                    else\n                        a.btn.btn-lg.btn-primary.btn-block(href='/challenges/next-challenge?id=' + id) 进入下一个挑战\n\n    include ../partials/challenge-modals\n    script.\n      var common = window.common || { init: [] };\n      common.challengeId = !{JSON.stringify(id)};\n      common.challengeName = !{JSON.stringify(name)};\n      common.dashedName = !{JSON.stringify(dashedName)};\n      common.gaName = !{JSON.stringify(gaName)};\n      common.challengeType = !{JSON.stringify(challengeType)};\n\n      common.controlEnterHandler = function (e) {\n        $('body').unbind('keydown');\n        if (\n          e.keyCode === 13 &&\n          (e.metaKey || e.ctrlKey)\n        ) {\n          $('#complete-zipline-or-basejump-dialog').modal('show');\n        } else {\n          $('body').bind('keydown', common.controlEnterHandler);\n        }\n      };\n\n      common.modalControlEnterHandler = function (e) {\n        $('#complete-zipline-or-basejump-dialog').unbind('keydown');\n        if (\n          e.keyCode === 13 &&\n          (e.metaKey ||  e.ctrlKey)\n        ) {\n          $('#next-courseware-button').click();\n        } else {\n          $('#complete-zipline-or-basejump-dialog').on('keydown', common.modalControlEnterHandler);\n        }\n      };\n\n      common.init.push(function() {\n        $('body').on('keydown', common.controlEnterHandler);\n\n        if (!!{ JSON.stringify(user ? true : false)}) {\n          $('#complete-zipline-or-basejump-dialog').on('keydown', common.modalControlEnterHandler);\n        }\n\n        $('#completed-zipline-or-basejump').on('click', function() {\n          $('#complete-zipline-or-basejump-dialog').modal('show');\n        });\n      });\n    include ../partials/challenge-footer\n"
  },
  {
    "path": "server/views/commit/directory.jade",
    "content": "extends ../layout\nblock content\n        h1.text-center Commit to one of these nonprofits\n        hr\n        .row\n            .col-xs-12.col-sm-10.col-sm-offset-1\n                for nonprofit in nonprofits\n                    .col-xs-12.col-sm-6.col-md-4.height-400\n                        .text-center\n                            h2= nonprofit.displayName\n                            img.testimonial-image.img-responsive.img-center(src=nonprofit.imgUrl)\n                            .button-spacer\n                            a.text-center(href='/commit?nonprofit=#{nonprofit.name}') Commit to #{nonprofit.displayName}\n                            p= nonprofit.description\n"
  },
  {
    "path": "server/views/commit/index.jade",
    "content": "extends ../layout\nblock content\n    h2.text-center Commit to yourself. Commit to a nonprofit.\n    .row\n        .col-xs-12.col-sm-6.col-sm-offset-3\n          p Give yourself external motivation and help nonprofits right away. Pledge a monthly donation to a nonprofit until you’ve earned either your Front End or Full Stack Development Certification.\n\n    .row\n        .col-xs-12.col-sm-6.col-sm-offset-3.text-center\n          h3 Pledge to #{displayName}&thinsp;\n          .button-spacer\n              a(href='#{imgUrl}' data-lightbox='img-enlarge' alt='#{imgAlt}')\n                  img.img-responsive(src='#{imgUrl}' alt='#{imgAlt}')\n              p.large-p\n                = description\n              p\n                a(href='/commit/directory') ...or see other nonprofits\n    .spacer\n    form.form(name='commit')\n        .hidden\n            input(type='text' value='#{name}' name='nonprofit')\n        .row\n            .col-xs-12.col-sm-6.col-sm-offset-3\n                h3 Step 1: Which certification do you pledge to complete?\n                .btn-group.btn-group-justified(data-toggle='buttons' role='group')\n                    label.btn.btn-primary.btn-lg.active\n                        input(type='radio' id=frontEndCert value=frontEndCert name='goal' checked=\"checked\")\n                        | Front End\n                    label.btn.btn-primary.btn-lg\n                        input(type='radio' id=dataVisCert value=dataVisCert name='goal')\n                        | Data\n                    label.btn.btn-primary.btn-lg\n                        input(type='radio' id=backEndCert value=backEndCert name='goal')\n                        | Back End\n                    label.btn.btn-primary.btn-lg\n                        input(type='radio' id=fullStackCert value=fullStackCert name='goal')\n                        | Full Stack\n        .spacer\n        .row\n            .col-xs-12.col-sm-6.col-sm-offset-3\n                h3 Step 2: How much do you want to pledge monthly until you earn that certification?\n                .btn-group.btn-group-justified(data-toggle='buttons' role='group')\n                    label.btn.btn-primary\n                        input(type='radio' id='5-dollar-pledge' value='5' name='amount')\n                        | $5 per month\n                    label.btn.btn-primary.active\n                        input(type='radio' id='10-dollar-pledge' value='10' name='amount' checked=\"checked\")\n                        | $10 per month\n                    label.btn.btn-primary\n                        input(type='radio' id='25-dollar-pledge' value='25' name='amount')\n                        | $25 per month\n                    label.btn.btn-primary\n                        input(type='radio' id='50-dollar-pledge' value='50' name='amount')\n                        | $50 per month\n        .spacer\n        .col-xs-12.col-sm-6.col-sm-offset-3\n            h3 Step 3: Set up your monthly donation\n        .row\n            .col-xs-12.col-sm-6.col-sm-offset-3.text-center\n                a#commit-btn-donate.btn.btn-block.btn-lg.btn-primary(href=donateUrl target='_blank') Open the #{displayName} donation page\n\n        .spacer\n        .col-xs-12.col-sm-6.col-sm-offset-3\n            h3#commit-step4-text.disabled\n                Step 4: Confirm\n                span#commit-step4-hidden.disabled  (Do step 3 first)\n                span#commit-step4-show.hidden  your commitment to your goal\n        .row\n            .col-xs-12.col-sm-6.col-sm-offset-3.text-center\n                button#commit-btn-submit.btn.btn-block.btn-lg.btn-primary.disabled Commit\n\n    if pledge\n        form.row(name='stop-pledge' action='/commit/stop-commitment' method='post')\n            .col-xs-12.col-sm-6.col-sm-offset-3.text-center\n                .button-spacer\n                button.btn.btn-block.btn-lg.btn-default(name='submit' type='submit') Stop my current pledge\n    else\n        .row\n            .col-xs-12.col-sm-6.col-sm-offset-3.text-center\n                .button-spacer\n                a.btn.btn-block.btn-lg.btn-default(href='/map') Maybe later\n    script.\n      $(function() {\n        $('#commit-btn-donate').click(function() {\n          $('#commit-btn-submit').removeClass('disabled');\n          $('#commit-step4-text').removeClass('disabled');\n          $('#commit-step4-hidden').hide();\n          $('#commit-step4-show').removeClass('hidden');\n        });\n\n        $('#commit-btn-submit').click(function() {\n\n          if (\n            history &&\n            typeof history.pushState === 'function'\n          ) {\n            history.pushState(history.state, null, '/commit/pledge?' + $('form').serialize());\n            return null;\n          }\n\n          window.location.href = '/commit/pledge?' + $('form').serialize();\n        });\n      });\n"
  },
  {
    "path": "server/views/commit/pledge.jade",
    "content": "extends ../layout\nblock content\n    .panel.panel-info\n        .panel-body\n            h3.text-center You've committed!\n            .row\n                .col-xs-12.col-sm-6.col-sm-offset-3\n                  p Congratulations, you have committed to giving\n                    span(style='text-transform: capitalize')  #{nonprofit}\n                    |  #{amount} dollars a month until you have reached your goal\n                    |  of completing your #{goal}\n            .row\n                .col-xs-12.col-sm-6.col-sm-offset-3\n                  img.img-responsive(src='//i.imgur.com/U1CyEuA.jpg' alt=\"Girl Develop It participants coding at tables.\")\n                  p Girl Develop It is a nonprofit that provides in-person classes for women to learn to code.\n"
  },
  {
    "path": "server/views/feed.jade",
    "content": "doctype xml\nrss(version=\"2.0\", xmlns:atom=\"http://www.w3.org/2005/Atom\")\n  channel  \n    title= title\n    link= url\n    description= description\n    atom:link(href=\"http://www.freecodecamp.com/news/feed\", rel=\"self\", type=\"application/rss+xml\")\n    for post in FeedPosts\n      if (post.link).match(/https*:\\/\\/\\w+(\\.\\w+)*/)\n        item\n          title #{ post.headline.replace(/&amp;/g, '&').replace(/&lt;/g, '<').replace(/&gt;/g, '>').replace(/&quot;/g, '\"') }\n          description <![CDATA[!{ post.metaDescription }]]>\n          pubDate= (new Date(post.timePosted)).toUTCString()\n          link= post.link\n          guid(isPermaLink=\"false\")= post.link\n"
  },
  {
    "path": "server/views/home.jade",
    "content": "extends layout\nblock content\n    style.\n      .skills-youll-learn .fa {font-size: 80px;color: #b6a57d;}\n      h2 {text-align:center;}\n    .row\n      .cover\n        .cover-text\n          h1 开启你的软件工程师生涯\n          p.lead.cover-text-secondary Learn to code and help nonprofits\n          // buttons\n          a.btn.btn-orange.btn-lg.btn-extra-padding.button-landing-page(href='/challenges/learn-how-free-code-camp-works', role='button') 开始闯关\n          a.btn.btn-inverse.btn-lg.button-landing-page(href='/signin', role='button') 免费注册登录\n    section.howitworks\n      .container\n        h2 玩转FreeCodeCamp\n        .row\n          .col-sm-6\n            .col-md-6.col-howitworks\n              img(src='/images/landingIcons_connect.svg')\n              h3 加入全球四十万开发者社区\n            .col-md-6.col-howitworks\n              img(src='/images/landingIcons_learn.svg')\n              h3 一起编程闯关、完成挑战\n          .col-sm-6\n            .col-md-6.col-howitworks\n              img(src='/images/landingIcons_portfolio.svg')\n              h3 构建解决现实问题的作品集\n            .col-md-6.col-howitworks\n              img(src='/images/landingIcons_nonprofits.svg')\n              h3 帮助非盈利组织开发项目\n    .row\n     section#curriculum\n      .container\n        h2 课程大纲\n        .row\n          .col-md-6\n            #curriculum-hours\n              p 前端开发(400小时)\n              p 数据可视化(400小时)\n              p 后端开发(400小时)\n              p 非盈利项目(800小时)\n              p 面试攻略(80小时)\n          .col-md-6\n            p#curriculum-explanation\n              | 学完所有的课程可以获得4个证书。\n              | 你的雇主可以随时在FCC上查询到这些证书。\n              strong FCC上所有的东西都是免费的，证书也不例外。\n              | 我们推荐按照顺序来闯关，但是你也可以自由跳跃。\n              | 前面三个证书每个需要400小时，\n              | 最后一个证书需要800小时，来为非盈利组织构建真实的项目。\n    .row(style=\"background-image: linear-gradient(#fff,#F1FEF2);\")\n     section\n      .container\n        h2 课外提升\n        .row\n          .col-md-6\n           #sdkcn-1 正在获取文章...\n          .col-md-6\n           #sdkcn-2 正在获取文章...\n        script var article = function(data) { var rows=7; var html = '<ul>';var count=(data.length>rows?rows:data.length); for(var i=0;i<count;i++){ html += '<li style=\"padding-bottom:10px\"><a target=\"_blank\" style=\"font-size: 19px\" href=\"'+data[i].article_url+'\"><span class=\"ion-ios-circle-outline\"></span>&nbsp;&nbsp;'+data[i].title+'</a></li>' }; html += '</ul>'; document.getElementById(\"sdkcn-1\").innerHTML = html;    if(data.length>rows) { html = '<ul>';count = (data.length>2*rows?2*rows:data.length);for(var i=rows;i<count;i++){ html += '<li style=\"padding-bottom:10px\"><a target=\"_blank\" style=\"font-size: 19px;\" href=\"'+data[i].article_url+'\"><span class=\"ion-ios-circle-outline\"></span>&nbsp;&nbsp;'+data[i].title+'</a></li>' }; html += '</ul>'; document.getElementById(\"sdkcn-2\").innerHTML = html; }};\n        script(src='https://www.sdk.cn/api/article/devecho?callback=article')\n    .row\n     section.skills-youll-learn\n      .container\n        h2 技术栈\n        .row\n          .col-xs-6.col-md-3.skills\n            i.fa.ion-social-html5\n            br\n            | HTML5\n          .col-xs-6.col-md-3.skills\n            i.fa.ion-social-css3\n            br\n            | CSS3\n          .col-xs-6.col-md-3.skills\n            i.fa.ion-social-javascript\n            br\n            | Javascript\n          .col-xs-6.col-md-3.skills\n            i.fa.fa-database\n            br\n            | Databases\n        .row\n          .col-xs-6.col-md-3.skills\n            i.fa.ion-social-github\n            br\n            | Git &amp; GitHub\n          .col-xs-6.col-md-3.skills\n            i.fa.ion-social-nodejs\n            br\n            | Node.js\n          .col-xs-6.col-md-3.skills\n            img(src='/images/react.svg')\n            br\n            | React.js\n          .col-xs-6.col-md-3.skills\n            img(src='/images/d3-logo.svg')\n            br\n            | D3.js\n    .row\n     section#infobox\n      .container\n        #infobox-inner\n          | Free Code Camp 已经被证明是获取编程工作的最有效路径，事实上，没人完成了所有课程，因为他们都在完成之前就找到了工作。\n\n    .text-center\n        h2 学员案例\n        .spacer\n        .row\n            .col-xs-12.col-sm-12.col-md-4\n                img.img-responsive.testimonial-image.img-center(src=\"/images/nsvNixW.jpg\", alt=\"Meta's testimonial image\")\n                .button-spacer\n                span 我是一个家庭妇女\n                br\n                span 通过FreeCodeCamp\n                br\n                span 我设计了很多简洁优雅的界面\n                br\n                span 这让我获得了一份网页设计师的工作\n                h4 -- Meta Hirschl\n            .col-xs-12.col-sm-12.col-md-4\n                img.img-responsive.testimonial-image.img-center(src=\"/images/QPpjPac.jpg\", alt=\"Brian's testimonial image\")\n                .button-spacer\n                span 我是一个退伍伤残老兵\n                br\n                span 通过FreeCodeCamp\n                br\n                span 我制作了很多复杂交互的UI\n                br\n                span 这让我获得了一份Web前端工程师的工作\n                h4 --Brian Grant\n            .col-xs-12.col-sm-12.col-md-4\n                img.img-responsive.testimonial-image.img-center(src=\"/images/wjlDigg.jpg\", alt=\"Maxim Orlov's testimonial image\")\n                .button-spacer\n                span 我是一个大叔\n                br\n                span 通过FreeCodeCamp\n                br\n                span 我开发了很多功能复杂而且稳定的API\n                br\n                span 这让我获得了一份Web后端工程师工作\n                h4 -- Maxim Orlov\n        .spacer\n        .row\n            .col-xs-12.col-sm-8.col-sm-offset-2\n                // buttons\n                a.btn.btn-orange.btn-lg.btn-extra-padding.button-landing-page(href='/challenges/learn-how-free-code-camp-works', role='button') 开始闯关\n                a.btn.btn-green-inverse.btn-lg.button-landing-page(href='/stories', role='button') 倾听更多学员的心声\n"
  },
  {
    "path": "server/views/layout-react.jade",
    "content": "doctype html\nhtml(lang='en')\n  head\n    if title\n      title= title\n    else\n      title Free Code Camp\n    include partials/react-stylesheets\n  body.top-and-bottom-margins(style='overflow: hidden')\n    .container\n      #fcc!= markup\n    script!= state\n    script(src=rev('/js', 'bundle.js'))\n"
  },
  {
    "path": "server/views/layout-wide.jade",
    "content": "doctype html\nhtml(lang='en')\n  head\n    include partials/meta\n    include partials/stylesheets\n  if showAside\n      body.map-aside-body\n          include partials/scripts\n          block content\n  else\n      body.no-top-and-bottom-margins.full-screen-body-background\n        include partials/scripts\n        include partials/navbar\n        include partials/flash\n        block content\n      include partials/footer\n"
  },
  {
    "path": "server/views/layout.jade",
    "content": "doctype html\nhtml(lang='en')\n  head\n    include partials/meta\n    include partials/stylesheets\n  body.top-and-bottom-margins\n    include partials/scripts\n    include partials/navbar\n    .container-fluid\n      include partials/flash\n      block content\n    include partials/footer\n"
  },
  {
    "path": "server/views/map/show.jade",
    "content": "extends ../layout-wide\nblock content\n      .mapWrapper\n        .text-center.map-fixed-header\n            p 强烈推荐按照顺序来学习，不要到处跳跃。\n            .row.map-buttons\n                button.center-block.btn.btn-block.btn-primary.active#showAll 折叠所有课程内容\n            .row.map-buttons\n                .input-group\n                    input#map-filter.form-control(type=\"text\" placeholder=\"输入课程标题来快速检索\" autocomplete=\"off\" value=\"\")\n                    span.input-group-addon\n                       i.fa.fa-search\n            hr\n            include ../partials/flash\n        #accordion.map-accordion\n          #noneFound 什么也没找到，祝你好运！\n          for superBlock, index in superBlocks\n              h2\n                a(data-toggle='collapse', data-parent='#accordion', href='#collapse'+superBlock.name.split(' ').join('-'))\n                  span.no-link-underline\n                    i.fa.fa-caret-down\n                  | #{superBlock.name}\n              div.margin-left-10(id = 'collapse'+superBlock.name.split(' ').join('-') class = \"collapse in map-collapse no-transition certBlock\")\n                  #nested\n                      for challengeBlock in superBlock.blocks\n                          h3\n                            a(data-toggle='collapse', data-parent='#nested', href='#nested-collapse'+challengeBlock.name.replace(/(\\W)/gi, '').split(' ').join('-'))\n                              span.no-link-underline\n                                i.fa.fa-caret-down\n                              | #{challengeBlock.name}\n                            span.challengeBlockTime (#{challengeBlock.time})\n                          div.margin-left-10(id = \"nested-collapse\"+challengeBlock.name.replace(/\\W/gi, '').split(' ').join('-') class = \"collapse in map-collapse no-transition chapterBlock\")\n                              for challenge in challengeBlock.challenges\n                                  if challenge.completed\n                                      p.challenge-title.faded.text-primary.ion-checkmark-circled.padded-ionic-icon.negative-15(name=\"#{challenge.dashedName}\")\n                                          a(href=\"#{challenge.url}\" target='_parent')\n                                              = challenge.title\n                                              span.sr-only= \" Complete\"\n                                  else if challenge.isRequired\n                                      p.challenge-title.ion-ios-circle-outline.padded-ionic-icon.negative-15(name=\"#{challenge.dashedName}\")\n                                          a(name=\"#{challenge.dashedName}\" target='_parent' href=\"#{challenge.url}\" class=challenge.isComingSoon ? 'disabled' : '')\n                                              span= challenge.title\n                                              span.sr-only= \" Incomplete\"\n                                          if challenge.markNew\n                                              span.text-info.small &thinsp; &thinsp;\n                                                  strong\n                                                      em New\n                                          if challengeBlock.isComingSoon\n                                              span.text-info.small &thinsp; &thinsp;\n                                                  strong\n                                                      em Coming Soon\n                                          span.text-primary &thinsp; &thinsp;\n                                              strong *\n                                  else\n                                      p.challenge-title.ion-ios-circle-outline.padded-ionic-icon.negative-15(name=\"#{challenge.dashedName}\")\n                                          a(name=\"#{challenge.dashedName}\" target='_parent' href=\"#{challenge.url}\" class=challenge.isComingSoon ? 'disabled' : '')\n                                              span= challenge.title\n                                              span.sr-only= \" Incomplete\"\n                                          if challenge.markNew\n                                              span.text-info.small &thinsp; &thinsp;\n                                                  strong\n                                                      em New\n                                          if challengeBlock.isComingSoon\n                                              span.text-info.small &thinsp; &thinsp;\n                                                  strong\n                                                      em Coming Soon\n          h2\n            a(data-toggle='collapse', data-parent='#accordion', href='#collapse-full-stack-development-certification')\n              span.no-link-underline\n                i.fa.fa-caret-down &thinsp;\n              | Full Stack Development Certification\n          div.margin-left-10(id = 'collapse-full-stack-development-certification' class = \"collapse in map-collapse no-transition certBlock\")\n              #nested\n                h3\n                  a(data-toggle='collapse', data-parent='#nested', href='#nested-collapse-nonprofit-projects')\n                    span.no-link-underline\n                      i.fa.fa-caret-down &thinsp;\n                    | Nonprofit Projects\n                  span.challengeBlockTime (800 hours)\n                div.margin-left-10(id = \"nested-collapse-nonprofit-projects\" class = \"collapse in map-collapse no-transition chapterBlock\")\n                      .challengeBlockDescription To qualify for these nonprofit projects, you must first earn all three foundational certifications: Front End, Data Visualization, and Back End\n                      p.challenge-title.disabled.text-primary.ion-locked.padded-ionic-icon.negative-15(name=\"Greenfield Nonprofit Project #1\") Greenfield Nonprofit Project #1\n                        span.text-primary &thinsp; &thinsp;\n                          strong *\n                      p.challenge-title.disabled.text-primary.ion-locked.padded-ionic-icon.negative-15(name=\"Greenfield Nonprofit Project #2\") Greenfield Nonprofit Project #2\n                        span.text-primary &thinsp; &thinsp;\n                          strong *\n                      p.challenge-title.disabled.text-primary.ion-locked.padded-ionic-icon.negative-15(name=\"Legacy Code Nonprofit Project #1\") Legacy Code Nonprofit Project #1\n                        span.text-primary &thinsp; &thinsp;\n                          strong *\n                      p.challenge-title.disabled.text-primary.ion-locked.padded-ionic-icon.negative-15(name=\"Legacy Code Nonprofit Project #2\") Legacy Code Nonprofit Project #2\n                        span.text-primary &thinsp; &thinsp;\n                          strong *\n                      p.challenge-title.disabled.text-primary.ion-locked.padded-ionic-icon.negative-15(name=\"Claim your Full Stack Development Certification\") Claim your Full Stack Development Certification\n          h2\n            a(data-toggle='collapse', data-parent='#accordion', href='#collapse-coding-interview-preparation')\n              span.no-link-underline\n                i.fa.fa-caret-down &thinsp;\n              | Coding Interview Preparation\n          div.margin-left-10(id = 'collapse-coding-interview-preparation' class = \"collapse in map-collapse no-transition certBlock\")\n              #nested\n                h3\n                  a(data-toggle='collapse', data-parent='#nested', href='#nested-collapse-coding-interview-training')\n                    span.no-link-underline\n                      i.fa.fa-caret-down &thinsp;\n                    | Coding Interview Training\n                  span.challengeBlockTime (70 hours)\n                div.margin-left-10(id = \"nested-collapse-coding-interview-training\" class = \"collapse in map-collapse no-transition chapterBlock\")\n                      .challengeBlockDescription To qualify for this coding interview training, you must first earn all four certifications: Front End, Data Visualization, Back End, and Full Stack\n                      p.challenge-title.disabled.text-primary.ion-locked.padded-ionic-icon.negative-15(name=\"Soft Skill Training\") Soft Skill Training\n                      p.challenge-title.disabled.text-primary.ion-locked.padded-ionic-icon.negative-15(name=\"Critical Thinking Training\") Critical Thinking Training\n                      p.challenge-title.disabled.text-primary.ion-locked.padded-ionic-icon.negative-15(name=\"Whiteboard Coding Training\") Whiteboard Coding Training\n                  h3\n                    a(data-toggle='collapse', data-parent='#nested', href='#nested-collapse-mock-interviews')\n                      span.no-link-underline\n                        i.fa.fa-caret-down &thinsp;\n                      | Mock Interviews\n                    span.challengeBlockTime (10 hours)\n                  div.margin-left-10(id = \"nested-collapse-mock-interviews\" class = \"collapse in map-collapse no-transition chapterBlock\")\n                        .challengeBlockDescription To qualify for these mock interviews, you must first earn all four certifications: Front End, Data Visualization, Back End, and Full Stack\n                        p.challenge-title.disabled.text-primary.ion-locked.padded-ionic-icon.negative-15(name=\"Mock Interview #1\") Mock Interview #1\n                        p.challenge-title.disabled.text-primary.ion-locked.padded-ionic-icon.negative-15(name=\"Mock Interview #2\") Mock Interview #2\n                        p.challenge-title.disabled.text-primary.ion-locked.padded-ionic-icon.negative-15(name=\"Mock Interview #3\") Mock Interview #3\n          .spacer\n"
  },
  {
    "path": "server/views/partials/challenge-footer.jade",
    "content": "script(src=rev('/js', 'vendor-challenges.js'))\nscript(src=rev('/js', 'commonFramework.js'))\nscript.\n  if (typeof localStorage !== 'undefined') {\n    localStorage.setItem('currentDashedName', typeof common !== 'undefined' && common.dashedName || '');\n  }\n  var common = window.common || { init: [] };\n  common.helpRoom = !{JSON.stringify(helpRoom)};\n  document.addEventListener('gitter-sidecar-ready', function(e) {\n    if (window.main) {\n      window.main.chat.createHelpChat(common.helpRoom, '#challenge-help-btn');\n    }\n  });\n"
  },
  {
    "path": "server/views/partials/challenge-modals.jade",
    "content": "#issue-modal.modal(tabindex='-1')\n    .modal-dialog.animated.fadeIn.fast-animation\n        .modal-content\n            .modal-header.challenge-list-header 你发现了一个bug吗？\n                a.close.closing-x(href='#', data-dismiss='modal', aria-hidden='true') ×\n            .modal-body.text-center\n                h3 在你提交一个新的问题之前，请先阅读“求助，我发现了一个bug”，然后浏览这个挑战的其他问题。\n                a.btn.btn-lg.btn-primary.btn-block#help-ive-found-a-bug-wiki-article(name='_csrf', value=_csrf) 求助，我发现了一个bug\n                a.btn.btn-lg.btn-primary.btn-block#search-issue(name='_csrf', value=_csrf) 浏览这个挑战的其他问题\n                a.btn.btn-lg.btn-primary.btn-block#report-issue(name='_csrf', value=_csrf) 创建一个新问题\n                a.btn.btn-lg.btn-primary.btn-block(href='#', data-dismiss='modal', aria-hidden='true') 取消\n\n#reset-modal.modal(tabindex='-1')\n    .modal-dialog.animated.fadeInUp.fast-animation\n        .modal-content\n            .modal-header.challenge-list-header 重置你的代码吗？\n                a.close.closing-x(href='#', data-dismiss='modal', aria-hidden='true') ×\n            .modal-body\n                h4.text-center 重置将会让你的代码编辑器回到初始状态\n                h4.text-center 当代码一直无法通过测试时，可以尝试重置，然后重写一遍，这招非常有效。\n                a.btn.btn-lg.btn-warning.btn-block#reset-button(href='#', data-dismiss='modal', aria-hidden='true') 重置\n                a.btn.btn-lg.btn-primary.btn-block(href='#', data-dismiss='modal', aria-hidden='true') 取消\n"
  },
  {
    "path": "server/views/partials/flash.jade",
    "content": ".row.flashMessage\n    .col-xs-12\n        if (messages.errors || messages.error)\n          .alert.alert-danger.fade.in\n            button.close(type='button', data-dismiss='alert')\n              span.ion-close-circled\n            for error in (messages.errors || messages.error)\n              div!= error.msg || error\n        if messages.info\n          .alert.alert-info.fade.in\n            button.close(type='button', data-dismiss='alert')\n              span.ion-close-circled\n            for info in messages.info\n              div!= info.msg\n        if messages.success\n          .alert.alert-success.fade.in\n            button.close(type='button', data-dismiss='alert')\n              span.ion-close-circled\n            for success in messages.success\n              div!= success.msg\n"
  },
  {
    "path": "server/views/partials/footer.jade",
    "content": "// scripts should be moved here\n.row.stick-bottom\n footer\n  .container\n    .row\n      .col-md-4.footer-about\n        h2(style=\"text-align:left;\")\n          | freeCodeCamp\n          img(src='/images/logo-footer.svg')\n        p\n          strong 苏州猿生态信息科技有限公司\n        p\n          a(href='http://www.miibeian.gov.cn/') 苏ICP备16029531号\n\n      .col-md-3.mt-20\n        ul\n          //li\n            //a(href='/email-signup') 免费注册\n          li\n            a(href='/about#about-us') 关于我们\n          li\n            a(href='/about#common-question') 常见问题(FAQs)\n          li\n            a(href='/academic-honesty') 学术诚信守则\n      .col-md-2.mt-20\n        ul\n          li\n            a(href='/about#contact-us') 联系我们\n          li\n            a(href='/privacy') 隐私策略\n          li\n            a(href='/code-of-conduct') 行为准则\n          li\n            a(href='/terms') 服务条款\n      .col-md-3\n        p.social-media\n          strong 社交媒体\n        a(href='http://github.com/freecodecampchina/freecodecamp.cn')\n          i.ion-social-github.footer-icon\n        a(href='http://twitch.tv/freecodecamp')\n          i.ion-social-twitch.footer-icon\n        a(href='mail:team@freecodecamp.cn')\n          i.fa.fa-envelope-o.footer-icon\n        a(href='http://www.linkedin.com/edu/school?id=166029')\n          i.ion-social-linkedin.footer-icon\n        a(href='http://weibo.com/FreeCodeCamp')\n          i.fa.fa-weibo.footer-icon\n        a(href='https://mp.weixin.qq.com/s?__biz=MzAxMjkxNTY2OQ==&mid=2247483684&idx=1&sn=6bdd884038025aa12330255a20d81d01&scene=1&srcid=0518SnCgDHGWP6JQQAWdLaJH&key=f5c31ae61525f82e8576092f748bfa57bbfd4be05c966b20c7390f756f4abd27303a08660ee93533a464f76684bd0857&ascene=0&uin=MTMzODU3OTQwMA%3D%3D&devicetype=iMac+MacBookPro11%2C1+OSX+OSX+10.10.5+build(14F1713)&version=11020201&pass_ticket=AhL55zVNBJAMny%2B1IhWY2r6q%2BKV%2Bg8cCgUX05k3LWOnUJMz8SfYiLAPGoeagk9nv')\n         i.fa.fa-weixin.footer-icon\n        a(href='http://shang.qq.com/wpa/qunwpa?idkey=e621702321632ddcf79056f6c109ade2eccade525b77a7a16dfb730ec52664b6' target=\"_blank\")\n         i.fa.fa-qq.footer-icon\n        a(href='tel:0512-62719878')\n         i.fa.fa-mobile.footer-icon\nscript(src=\"/js/sidecar.v1.js\" async defer)\naside.map-aside.is-collapsed\n  .map-aside-action-bar\n      a.map-aside-action-item.map-aside-action-pop-out(href='/map' target='_blank' aria-label='open map in new tab')\n      button.map-aside-action-item.map-aside-action-collapse(aria-label='close map aside')\naside.wiki-aside.is-collapsed\n  .wiki-aside-action-bar\n      a.wiki-aside-action-item.wiki-aside-action-pop-out(href='/wiki' target='_blank' aria-label='open wiki in new tab')\n      button.wiki-aside-action-item.wiki-aside-action-collapse(aria-label='close wiki aside')\n"
  },
  {
    "path": "server/views/partials/meta.jade",
    "content": "meta(charset='utf-8')\nmeta(http-equiv='X-UA-Compatible', content='IE=edge')\nmeta(name='viewport', content='width=device-width, initial-scale=1.0, maximum-scale=1, user-scalable=no')\nmeta(name='csrf-token', content=_csrf)\ntitle  #{title} | FreeCodeCamp中文社区\nmeta(name='keywords', content='FreeCodeCamp，像打魔兽一样学编程！')\nlink(rel=\"android-chrome\", sizes=\"144x144\" href=\"/favicons/android-chrome-144x144.png\")\nlink(rel=\"android-chrome\", sizes=\"192x192\" href=\"/favicons/android-chrome-192x192.png\")\nlink(rel=\"android-chrome\", sizes=\"36x36\" href=\"/favicons/android-chrome-36x36.png\")\nlink(rel=\"android-chrome\", sizes=\"48x48\" href=\"/favicons/android-chrome-48x48.png\")\nlink(rel=\"android-chrome\", sizes=\"72x72\" href=\"/favicons/android-chrome-72x72.png\")\nlink(rel=\"android-chrome\", sizes=\"96x96\" href=\"/favicons/android-chrome-96x96.png\")\nlink(rel=\"android-chrome-manifest\", href=\"/favicons/android-chrome-manifest.json\")\nlink(rel=\"apple-touch-icon\", sizes=\"114x114\", href=\"/favicons/apple-touch-icon-114x114.png\")\nlink(rel=\"apple-touch-icon\", sizes=\"120x120\", href=\"/favicons/apple-touch-icon-120x120.png\")\nlink(rel=\"apple-touch-icon\", sizes=\"144x144\", href=\"/favicons/apple-touch-icon-144x144.png\")\nlink(rel=\"apple-touch-icon\", sizes=\"152x152\", href=\"/favicons/apple-touch-icon-152x152.png\")\nlink(rel=\"apple-touch-icon\", sizes=\"180x180\", href=\"/favicons/apple-touch-icon-180x180.png\")\nlink(rel=\"apple-touch-icon\", sizes=\"57x57\", href=\"/favicons/apple-touch-icon-57x57.png\")\nlink(rel=\"apple-touch-icon\", sizes=\"60x60\", href=\"/favicons/apple-touch-icon-60x60.png\")\nlink(rel=\"apple-touch-icon\", sizes=\"72x72\", href=\"/favicons/apple-touch-icon-72x72.png\")\nlink(rel=\"apple-touch-icon\", sizes=\"76x76\", href=\"/favicons/apple-touch-icon-76x76.png\")\nlink(rel=\"apple-touch-icon-precomposed\", href=\"/favicons/apple-touch-icon-precomposed.png\")\nlink(rel=\"apple-touch-icon\", href=\"/favicons/apple-touch-icon.png\")\nlink(rel=\"favicon\", sizes=\"16x16\", href=\"/favicons/favicon-16x16.png\")\nlink(rel=\"favicon\", sizes=\"32x32\", href=\"/favicons/favicon-32x32.png\")\nlink(rel=\"favicon\", sizes=\"96x96\", href=\"/favicons/favicon-96x96.png\")\nlink(rel=\"mstile\", sizes=\"144x144\", href=\"/favicons/mstile-144x144.png\")\nlink(rel=\"mstile\", sizes=\"150x150\", href=\"/favicons/mstile-150x150.png\")\nlink(rel=\"mstile\", sizes=\"310x310\", href=\"/favicons/mstile-310x310.png\")\nlink(rel=\"mstile\", sizes=\"310x150\", href=\"/favicons/mstile-310x150.png\")\nlink(rel=\"mstile\", sizes=\"70x70\", href=\"/favicons/mstile-70x70.png\")\nlink(rel=\"favicon\", href=\"/favicons/green.ico\")\nlink(rel='shortcut icon', href='/favicons/green.ico')\n"
  },
  {
    "path": "server/views/partials/navbar.jade",
    "content": "nav.navbar.navbar-default.navbar-fixed-top.nav-height\n    .navbar-header\n        button.hamburger.navbar-toggle(type='button', data-toggle='collapse', data-target='.navbar-collapse')\n            .col-xs-12\n                span.hamburger-text 菜单\n        a.navbar-brand(href='/')\n            img.img-responsive.nav-logo(src='/images/logo-navbar.png', alt='learn to code javascript at FreeCodeCamp logo')\n    .collapse.navbar-collapse\n        ul.nav.navbar-nav.navbar-right.hamburger-dropdown\n            li\n                a(href='/home') 首页\n            li.hidden-xs\n                a#nav-map-btn(href='#' onclick='return false') 课程\n            li.visible-xs\n                a(href='/map') 课程\n            li\n                a(href='/group' target='_blank') 同城\n            li\n                a(href='http://s14012.m.fy.xyunqi.com/preview.html?page_id=13606' target='_blank') 周边\n            //关闭问答BBS\n                li\n                    a(href='//bbs.freecodecamp.cn/' target='_blank') 问答\n            li.hidden-xs\n                a#nav-chat-btn(href='#' onclick=\"return false\") 聊天室\n            li.visible-xs\n                a(href=\"//gitter.im/freecodecamp/chinese\" target=\"_blank\") 聊天室\n            li\n                a(href='/about') 关于\n            if !user\n                li\n                    a(href='/login' style=\"color:#FF9900;\") 登录/注册\n                //li\n                    //a(href='/email-signup' style=\"color:#00AC72;\") 注册\n            else\n                li.brownie-points-nav\n                  a(href='/' + user.username) [&thinsp;#{user.progressTimestamps.length}&thinsp;]\n                li.hidden-xs.hidden-sm.avatar\n                  a(href='/' + user.username)\n                        img.profile-picture.float-right(src='#{user.picture}')\n"
  },
  {
    "path": "server/views/partials/react-stylesheets.jade",
    "content": "link(rel='stylesheet', type='text/css' href='/css/lato.css')\nlink(rel='stylesheet', href='/bower_components/font-awesome/css/font-awesome.min.css')\nlink(rel='stylesheet', href=rev('/css', 'main.css'))\nlink(rel='stylesheet', href='/css/Vimeo.css')\n\ninclude meta\nmeta(charset='utf-8')\nmeta(http-equiv='X-UA-Compatible', content='IE=edge')\nmeta(name='viewport', content='width=device-width, initial-scale=1.0')\nmeta(name='csrf-token', content=_csrf)\nscript.\n  var _vds = _vds || [];\n  window._vds = _vds;\n  (function(){\n    _vds.push(['setAccountId', 'b350d488f8e3e5f1']);\n    (function() {\n      var vds = document.createElement('script');\n      vds.type='text/javascript';\n      vds.async = true;\n      vds.src = ('https:' == document.location.protocol ? 'https://' : 'http://') + 'dn-growing.qbox.me/vds.js';\n      var s = document.getElementsByTagName('script')[0];\n      s.parentNode.insertBefore(vds, s);\n    })();\n  })();\n"
  },
  {
    "path": "server/views/partials/scripts.jade",
    "content": "\nscript.\n  var _vds = _vds || [];\n  window._vds = _vds;\n  (function(){\n    _vds.push(['setAccountId', 'b350d488f8e3e5f1']);\n    (function() {\n      var vds = document.createElement('script');\n      vds.type='text/javascript';\n      vds.async = true;\n      vds.src = ('https:' == document.location.protocol ? 'https://' : 'http://') + 'dn-growing.qbox.me/vds.js';\n      var s = document.getElementsByTagName('script')[0];\n      s.parentNode.insertBefore(vds, s);\n    })();\n  })();\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  ga('create', 'UA-76000773-1', 'auto');\n  ga('require', 'displayfeatures');\n  ga('send', 'pageview');\n// Leave the below lines alone!\nscript.\n  (function(global) {\n    global.main = global.main || {};\n    global.main.isLoggedIn = !{JSON.stringify(!!user)};\n    global.main.userId = !{JSON.stringify(user && user.id || false)};\n  }(window))\nscript(src=rev('/js', 'vendor-main.js'))\nscript(src=rev('/js', 'main.js'))\n"
  },
  {
    "path": "server/views/partials/stylesheets.jade",
    "content": "link(rel='stylesheet', type='text/css' href='/css/lato.css')\nlink(rel=\"stylesheet\" type=\"text/css\" href=\"/bower_components/cal-heatmap/cal-heatmap.css\")\nlink(rel='stylesheet', href='/bower_components/font-awesome/css/font-awesome.min.css')\nlink(rel='stylesheet', href='/bower_components/lightbox2/dist/css/lightbox.css')\nlink(rel='stylesheet', href=rev('/css', 'main-f928abf444.css'))\n"
  },
  {
    "path": "server/views/redirect-https.html",
    "content": "<!DOCTYPE html><html lang=\"en\"></html><script src=\"//cdnjs.cloudflare.com/ajax/libs/jquery/2.1.3/jquery.min.js\"></script><script src=\"//cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.4/js/bootstrap.min.js\"></script><link rel=\"stylesheet\" href=\"/bower_components/font-awesome/css/font-awesome.min.css\"><link rel=\"stylesheet\" href=\"/css/main.css\"><link rel=\"stylesheet\" href=\"/css/Vimeo.css\"><meta charset=\"utf-8\"><meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\"><meta name=\"csrf-token\"><title> | Free Code Camp</title><link rel=\"canonical\" href=\"http://freecodecamp.cn\"><meta charset=\"utf-8\"><meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\"><meta name=\"csrf-token\"><meta name=\"keywords\" content=\"learn to code, learn to program, learn programming, learn javascript, learn coding, code, coding, programming, software engineer, software developer, mean stack, web development, development, engineering, learn node.js, learn angular.js, learn express.js, learn mongoDB, coding bootcamp, javascript, open source\"><meta property=\"og:title\" content=\"Learn to code and help nonprofits\"><meta property=\"og:site_name\" content=\"Free Code Camp\"><meta name=\"twitter:widgets:csp\" content=\"on\"><meta name=\"p:domain_verify\" content=\"d0bc047a482c03c24f1168004c2a216a\"><meta property=\"og:url\" content=\"http://www.freecodecamp.cn\"><meta property=\"og:description\" content=\"Learn to code and build projects for nonprofits. Build your full stack web development portfolio today.\"><meta property=\"og:image\" content=\"/images/curriculum-diagram-full.jpg\"><meta property=\"og:type\" content=\"article\"><meta property=\"article:publisher\" content=\"https://www.facebook.com/freecodecamp\"><meta property=\"article:section\" content=\"Responsive\"><link rel=\"publisher\" href=\"https://plus.google.com/+Freecodecamp\"><link rel=\"author\" href=\"https://plus.google.com/+Freecodecamp\"><meta name=\"description\" content=\"Learn to code and build projects for nonprofits. Build your full stack web development portfolio today.\"><meta name=\"twitter:creator\" content=\"@freecodecamp\"><meta name=\"twitter:url\" content=\"http://www.freecodecamp.cn\"><meta name=\"twitter:site\" content=\"@freecodecamp\"><meta name=\"twitter:card\" content=\"summary_large_image\"><meta name=\"twitter:image:src\" content=\"/images/curriculum-diagram-full.jpg\"><meta name=\"twitter:title\" content=\"Learn to code and help nonprofits\"><meta name=\"twitter:description\" content=\"We're an open source community of busy people who learn to code and build projects for nonprofits. Build your full stack web development portfolio today.\"><meta content=\"a40ee5d5dba3bb091ad783ebd2b1383f\" name=\"p:domain_verify\"><meta name=\"msapplication-TileColor\" content=\"#FFFFFF\"><meta name=\"msapplication-TileImage\" content=\"/\"><link rel=\"android-chrome\" sizes=\"144x144\" href=\"/images/favicons/android-chrome-144x144.png\"><link rel=\"android-chrome\" sizes=\"192x192\" href=\"/images/favicons/android-chrome-192x192.png\"><link rel=\"android-chrome\" sizes=\"36x36\" href=\"/images/favicons/android-chrome-36x36.png\"><link rel=\"android-chrome\" sizes=\"48x48\" href=\"/images/favicons/android-chrome-48x48.png\"><link rel=\"android-chrome\" sizes=\"72x72\" href=\"/images/favicons/android-chrome-72x72.png\"><link rel=\"android-chrome\" sizes=\"96x96\" href=\"/images/favicons/android-chrome-96x96.png\"><link rel=\"android-chrome-manifest\" href=\"/images/favicons/android-chrome-manifest.json\"><link rel=\"apple-touch-icon\" sizes=\"114x114\" href=\"/images/favicons/apple-touch-icon-114x114.png\"><link rel=\"apple-touch-icon\" sizes=\"120x120\" href=\"/images/favicons/apple-touch-icon-120x120.png\"><link rel=\"apple-touch-icon\" sizes=\"144x144\" href=\"/images/favicons/apple-touch-icon-144x144.png\"><link rel=\"apple-touch-icon\" sizes=\"152x152\" href=\"/images/favicons/apple-touch-icon-152x152.png\"><link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"/images/favicons/apple-touch-icon-180x180.png\"><link rel=\"apple-touch-icon\" sizes=\"57x57\" href=\"/images/favicons/apple-touch-icon-57x57.png\"><link rel=\"apple-touch-icon\" sizes=\"60x60\" href=\"/images/favicons/apple-touch-icon-60x60.png\"><link rel=\"apple-touch-icon\" sizes=\"72x72\" href=\"/images/favicons/apple-touch-icon-72x72.png\"><link rel=\"apple-touch-icon\" sizes=\"76x76\" href=\"/images/favicons/apple-touch-icon-76x76.png\"><link rel=\"apple-touch-icon-precomposed\" href=\"/images/favicons/apple-touch-icon-precomposed.png\"><link rel=\"apple-touch-icon\" href=\"/images/favicons/apple-touch-icon.png\"><link rel=\"favicon\" sizes=\"16x16\" href=\"/images/favicons/favicon-16x16.png\"><link rel=\"favicon\" sizes=\"32x32\" href=\"/images/favicons/favicon-32x32.png\"><link rel=\"favicon\" sizes=\"96x96\" href=\"/images/favicons/favicon-96x96.png\"><link rel=\"mstile\" sizes=\"144x144\" href=\"/images/favicons/mstile-144x144.png\"><link rel=\"mstile\" sizes=\"150x150\" href=\"/images/favicons/mstile-150x150.png\"><link rel=\"mstile\" sizes=\"310x310\" href=\"/images/favicons/mstile-310x310.png\"><link rel=\"mstile\" sizes=\"310x150\" href=\"/images/favicons/mstile-310x150.png\"><link rel=\"mstile\" sizes=\"70x70\" href=\"/images/favicons/mstile-70x70.png\"><link rel=\"favicon\" href=\"/images/favicons/favicon.ico\"><link rel=\"alternate\" type=\"application/rss+xml\" title=\"RSS Feed for FreeCodeCamp Camper News\" href=\"http://www.freecodecamp.cn/news/feed\"><meta charset=\"utf-8\"><meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\"><meta name=\"csrf-token\"><script>var _vds = _vds || [];\n      window._vds = _vds;\n      (function(){\n        _vds.push(['setAccountId', 'b350d488f8e3e5f1']);\n        (function() {\n          var vds = document.createElement('script');\n          vds.type='text/javascript';\n          vds.async = true;\n          vds.src = ('https:' == document.location.protocol ? 'https://' : 'http://') + 'dn-growing.qbox.me/vds.js';\n          var s = document.getElementsByTagName('script')[0];\n          s.parentNode.insertBefore(vds, s);\n        })();\n      })();</script><body class=\"top-and-bottom-margins\"><nav class=\"navbar navbar-default navbar-fixed-top nav-height\"><div class=\"navbar-header\"><button type=\"button\" data-toggle=\"collapse\" data-target=\".navbar-collapse\" class=\"hamburger navbar-toggle\"><div class=\"col-xs-12\"><span class=\"hamburger-text\">Menu</span></div></button><a href=\"/\" class=\"navbar-brand\"><img src=\"/images/freecodecamp_logo.svg\" alt=\"learn to code javascript at Free Code Camp logo\" class=\"img-responsive nav-logo\"></a></div><div class=\"collapse navbar-collapse\"><ul class=\"nav navbar-nav navbar-right hamburger-dropdown\"><li class=\"hidden-xs\"><a id=\"nav-map-btn\" href=\"#\" onclick=\"return false\">Map</a></li><li class=\"visible-xs\"><a href=\"/map\">Map</a></li><li class=\"hidden-xs\"><a id=\"nav-chat-btn\" href=\"#\" onclick=\"return false\">Chat</a></li><li class=\"visible-xs\"><a href=\"//gitter.im/freecodecamp/chinese\" target=\"_blank\">Chat</a></li><li><a href=\"/news\" target=\"_blank\">News</a></li><li><a href=\"//github.com/FreeCodeCamp/freecodecamp/wiki/Home\" target=\"_blank\">Wiki</a></li><li><a href=\"/jobs\">Jobs</a></li><li><a href=\"/about\">About</a></li><li><a href=\"/login\">Sign in</a></li></ul></div></nav><div class=\"container\"><div class=\"row\"><div class=\"panel panel-info\"><p>redirecting you... please wait...</p></div></div></div><script>setTimeout(function() {\n  window.location = 'http://freecodecamp.cn'\n}, 500);</script></body>\n"
  },
  {
    "path": "server/views/redirect-https.jade",
    "content": "doctype html\nhtml(lang='en')\nscript(src=\"//cdnjs.cloudflare.com/ajax/libs/jquery/2.1.3/jquery.min.js\")\nscript(src=\"//cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.4/js/bootstrap.min.js\")\nlink(rel='stylesheet', href='/bower_components/font-awesome/css/font-awesome.min.css')\nlink(rel='stylesheet', href='/css/main.css')\nlink(rel='stylesheet', href='/css/Vimeo.css')\n\ninclude partials/meta\nmeta(charset='utf-8')\nmeta(http-equiv='X-UA-Compatible', content='IE=edge')\nmeta(name='viewport', content='width=device-width, initial-scale=1.0')\nmeta(name='csrf-token', content=_csrf)\nscript.\n  var _vds = _vds || [];\n  window._vds = _vds;\n  (function(){\n    _vds.push(['setAccountId', 'b350d488f8e3e5f1']);\n    (function() {\n      var vds = document.createElement('script');\n      vds.type='text/javascript';\n      vds.async = true;\n      vds.src = ('https:' == document.location.protocol ? 'https://' : 'http://') + 'dn-growing.qbox.me/vds.js';\n      var s = document.getElementsByTagName('script')[0];\n      s.parentNode.insertBefore(vds, s);\n    })();\n  })();\nbody.top-and-bottom-margins\n  include partials/navbar\n  .container\n    .row\n      .panel.panel-info\n        p redirecting you... please wait...\n  script.\n    setTimeout(function() {\n      window.location = 'http://freecodecamp.cn'\n    }, 500);\n"
  },
  {
    "path": "server/views/resources/about.jade",
    "content": "extends ../layout\nblock content\n    style.\n      .qrcode{position: fixed;bottom:210px;border-radius: 2px;text-align: center;color: #717375;font-size: 12px;}\n      .right{right: 0px;}\n      .fa{font-size:36px;}\n    .row\n        .col-xs-12.col-sm-10.col-sm-offset-1.col-md-6.col-md-offset-3\n            h2.text-center 数据统计\n            hr\n            ul.population-table\n                li\n                    span.tag 创立时间:&#9;\n                    span.text-primary #{daysRunning}\n                    | 天以前\n                if  user\n                    li\n                        span.tag 参与学习:&#9;\n                        span.text-primary #{camperCount}\n                        | 个学员\n                li\n                    span.tag 参与翻译:&#9;\n                    span.text-primary 17\n                    | 只猴子\n                li\n                    span.tag 已经完成:&#9;\n                    span.text-primary #{globalCompletedCount}\n                    | 个挑战\n    .spacer\n    .row\n      dl.qrcode.right.hidden-xs\n        dt\n          img(src='images/qrcode_for_nearest.jpg', width='120px')\n        dd 微信搜索freecodecamp\n        span 更多好东西等你来发现\n    .spacer\n    .row#about-us\n        .col-xs-12.col-sm-10.col-sm-offset-1.col-md-6.col-md-offset-3\n            h2.text-center 传送门\n            hr\n            table.table.link-table\n                tr\n                    td.text-center\n                        img(src=\"https://www.zhihu.com/favicon.ico\")\n                    td\n                        a(href=\"https://www.zhihu.com/search?type=content&q=freecodecamp\", target='_blank') 知乎\n                tr\n                    td.text-center\n                        img(src=\"/images/weixin.png\" width=\"40px\")\n                    td\n                        a(href=\"https://mp.weixin.qq.com/s?__biz=MzAxMjkxNTY2OQ==&mid=2247483684&idx=1&sn=6bdd884038025aa12330255a20d81d01&scene=1&srcid=0518SnCgDHGWP6JQQAWdLaJH&key=f5c31ae61525f82e8576092f748bfa57bbfd4be05c966b20c7390f756f4abd27303a08660ee93533a464f76684bd0857&ascene=0&uin=MTMzODU3OTQwMA%3D%3D&devicetype=iMac+MacBookPro11%2C1+OSX+OSX+10.10.5+build(14F1713)&version=11020201&pass_ticket=AhL55zVNBJAMny%2B1IhWY2r6q%2BKV%2Bg8cCgUX05k3LWOnUJMz8SfYiLAPGoeagk9nv\", target='_blank') 微信\n                tr\n                    td.text-center\n                        img(src=\"/images/jianshu.png\")\n                    td\n                        a(href=\"http://www.jianshu.com/search?q=freecodecamp&type=notes\", target='_blank') 简书\n                tr\n                    td.text-center\n                        img(src=\"/images/weibo.png\")\n                    td\n                        a(href=\"http://weibo.com/FreeCodeCamp\", target='_blank') 微博\n                tr\n                    td.text-center\n                        img(src=\"https://www.oschina.net/img/favicon.ico\")\n                    td\n                        a(href=\"http://git.oschina.net/freecodecamp/freecodecamp.cn\", target='_blank') 开源中国\n                tr\n                    td.text-center\n                        i.fa.fa-github\n                    td\n                        a(href=\"//github.com/freecodecampchina/freecodecamp.cn\", target='_blank') GitHub仓库\n                tr\n                    td.text-center\n                        i.fa.fa-flask\n                    td\n                        a(href=\"/labs\") 学员完成的项目\n                tr\n                    td.text-center\n                        i.fa.fa-comment\n                    td\n                        a(href=\"/stories\") 程序猿的故事\n                tr\n                    td.text-center\n                        i.fa.fa-medium\n                    td\n                        a(href='//medium.freecodecamp.com', target='_blank') Medium平台\n                tr\n                    td.text-center\n                        i.fa.fa-twitch\n                    td\n                        a(href=\"//twitch.tv/freecodecamp\", target='_blank') Twitch.tv频道\n                tr\n                    td.text-center\n                        i.fa.fa-reddit\n                    td\n                        a(href=\"//www.reddit.com/r/freecodecamp\", target='_blank') Reddit讨论组\n                tr\n                    td.text-center\n                        i.fa.fa-linkedin\n                    td\n                        a(href=\"//www.linkedin.com/edu/school?id=166029\", target='_blank') LinkedIn大学主页\n                tr\n                    td.text-center\n                        i.fa.fa-twitter\n                    td\n                        a(href=\"//twitter.com/freecodecamp\", target='_blank') Twitter主页\n                tr\n                    td.text-center\n                        i.fa.fa-facebook\n                    td\n                        a(href=\"//facebook.com/freecodecamp\") Facebook主页\n                tr\n                    td.text-center\n                        i.fa.fa-lock\n                    td\n                        a(href=\"/privacy\") 隐私策略\n                tr\n                    td.text-center\n                        i.fa.fa-balance-scale\n                    td\n                        a(href=\"/code-of-conduct\") 行为规范\n                tr\n                    td.text-center\n                        i.fa.fa-university\n                    td\n                        a(href=\"/academic-honesty\") 学术诚实守则\n                tr\n                    td.text-center\n                        i.fa.fa-book\n                    td\n                        a(href=\"/terms\") 服务条款\n                tr\n                    td.text-center\n                        i.fa.fa-heart\n                    td\n                        a(href=\"/how-nonprofit-projects-work\") 如何运转公益项目\n    .spacer\n    .row#common-question\n        .col-xs-12.col-sm-10.col-sm-offset-1.col-md-6.col-md-offset-3\n            h2.text-center 常见问题\n            hr\n            html\n                <h4>FreeCodeCamp 是什么?</h4>\n                <p class=\"negative-15\">我们是一个帮助你学习编程的开源社区。</p>\n                <h4>如何帮助我学习编程？</h4>\n                <p class=\"negative-15\">你可以通过我们的自学编程挑战，构建项目，获得证书，还可以参加在线下活动。</p>\n                <h4>FreeCodeCamp 可以帮我获得一份软件工程师的工作吗？</h4>\n                <p class=\"negative-15\">可以，数以百计的人在完成我们的编程挑战后获得了软件工程师的工作。</p>\n                <h4>FreeCodeCamp 是一个编码训练营吗？</h4>\n                <p class=\"negative-15\">不是，许多编码训练营使用FreeCodeCamp作为他们课程的一部分。</p>\n                <h4>FreeCodeCamp 彻底免费吗？</h4>\n                <p class=\"negative-15\">是的，我们的课程、项目、证书全都是免费的。</p>\n                <h4>FreeCodeCamp 可以提供什么证书？</h4>\n                <p class=\"negative-15\">FreeCodeCamp 提供4个认证证书，它们是：前端开发认证、数据可视化认证、后端开发认证、全栈开发认证。</p>\n                <h4>我如何通过 FreeCodeCamp 帮助公益组织？</h4>\n                <p class=\"negative-15\">当你完成了前面3个认证，你将会在一个志愿者项目经理的管理下，和多个小伙伴一起完成一些项目。</p>\n                <h4>FreeCodeCamp 为公益组织节省了多少钱？</h4>\n                <p class=\"negative-15\">FreeCodeCamp 已经为公益组织节省了近一百万美元。</p>\n                <h4>有什么方式可以让我在获得认证之前就能帮助公益组织？</h4>\n                <p class=\"negative-15\">是的，你可以按照自己的的学习计划来<a href=\"/commit\">捐助公益组织</a>。</p>\n                <h4>学完整个 FreeCodeCamp 课程需要花多长时间？</h4>\n                <p class=\"negative-15\">获取四个证书需要大约2080个小时，也就是一年时间。我们是完全自学的，所以你可以掌握自己的学习进度。</p>\n                <h4>FreeCodeCamp 可以代替大学学历吗？</h4>\n                <p class=\"negative-15\">不可以，请不要辍学来学习 FreeCodeCamp，你应该一边上大学一边在 FreeCodeCamp 上学习。因为大学里教给你的不仅仅是专业技术，还有宽阔的视野和学习的氛围。</p>\n                <h4>我可以使用 FreeCodeCamp 作为我课堂的一部分吗？</h4>\n                <p class=\"negative-15\">当然可以，许多高中、大学和培训班都把 FreeCodeCamp 作为他们的课程作业。我们是开源的，不需要任何许可证和授权，你可以自由使用。</p>\n                <h4>我应该按顺序学完所有课程吗？</h4>\n                <p class=\"negative-15\">我们推荐你按照顺序来学习课程，但是你也可以自由跳跃。</p>\n                <h4>我必须使用 CodePen 来完成我的前端项目吗？</h4>\n                <p class=\"negative-15\">只要你的代码是开放的，而且有一个在线演示，你可以用任何在线代码编辑器。</p>\n                <h4>你们什么时候发布 React、Sass、和 D3 课程?</h4>\n                <p class=\"negative-15\">我们将在2016年秋天发布这些课程。与此同时，已经有人通过参考这些课程的官方文档来完成了我们的 React/Sass 和 D3 项目。</p>\n                <h4>我可以雇佣 FreeCodeCamp 的校友吗？</h4>\n                <p class=\"negative-15\">你可以通过我们的<a href=\"https://www.linkedin.com/edu/school?id=166029\" target=\"_blank\">校友网络</a>来找到他们。</p>\n                <h4>FreeCodeCamp 是如何启动的？</h4>\n                <p class=\"negative-15\">2014年<a href=\"https://www.quora.com/profile/Quincy-Larson\" target=\"_blank\">Quincy</a> 创立了这个开源社区，他现在是我们诸多活跃贡献者之一。</p>\n                <h4>FreeCodeCamp 是如何运转的？</h4>\n                <p class=\"negative-15\">Quincy 在加州建立一个叫FreeCodeCamp的机构来支撑 FreeCodeCamp 社区的运转。<a href=\"https://gitter.im/berkeleytrue\" target=\"_blank\">Berkeley</a>负责基础设施，<a href=\"https://gitter.im/codenonprofit\" target=\"_blank\">Michael</a> 负责公益项目。</p>\n                <h4>我可以在 FreeCodeCamp 上找份工作吗？</h4>\n                <p class=\"negative-15\">当然可以，只要你学习得足够出色，我们会把你推荐到各大公司，例如：GitHub、Spotify、Google、Facebook等。</p>\n                <h4>我可以投资 FreeCodeCamp 吗？</h4>\n                <p class=\"negative-15\">我们都是自筹资金，并保持低成本运营，不需要外部投资。</p>\n    .spacer\n    .row#contact-us\n        .col-xs-12.col-sm-10.col-sm-offset-1.col-md-6.col-md-offset-3\n            h2.text-center  联系人\n            table.table.table-stripe\n                tr\n                    td 中文社区 (\n                        a(href='mailto:jin@freecodecamp.cn') jin@freecodecamp.cn\n                        | )\n                    td\n                        a(href='https://gitter.im/JackJin2014' target='_blank') @JackJin\n                tr\n                    td 英文社区 (\n                        a(href='mailto:team@freecodecamp.com') team@freecodecamp.com\n                        | )\n                    td\n                        a(href='https://gitter.im/QuincyLarson' target='_blank') @QuincyLarson\n                tr\n                    td Facebook 主页\n                    td\n                        a(href='https://gitter.im/QuincyLarson' target='_blank') @QuincyLarson\n                tr\n                    td Twitter 流\n                    td\n                        a(href='https://gitter.im/QuincyLarson' target='_blank') @QuincyLarson\n                tr\n                    td Medium 平台\n                    td\n                        a(href='https://gitter.im/QuincyLarson' target='_blank') @QuincyLarson\n                tr\n                    td 媒体合作\n                    td\n                        a(href='https://gitter.im/QuincyLarson' target='_blank') @QuincyLarson\n                tr\n                    td 开源代码贡献\n                    td\n                        a(href='https://gitter.im/BerkeleyTrue' target='_blank') @BerkeleyTrue\n                tr\n                    td 服务器问题\n                    td\n                        a(href='https://gitter.im/BerkeleyTrue' target='_blank') @BerkeleyTrue\n                tr\n                    td 非盈利项目\n                    td\n                        a(href='https://gitter.im/CodeNonprofit' target='_blank') @CodeNonprofit\n                tr\n                    td 志愿者\n                    td\n                        a(href='https://gitter.im/CodeNonprofit' target='_blank') @CodeNonprofit\n                tr\n                    td Commit program\n                    td\n                        a(href='https://gitter.im/CodeNonprofit' target='_blank') @CodeNonprofit\n                tr\n                    td Video 挑战课程\n                    td\n                        a(href='https://gitter.im/BrianaMarie' target='_blank') @BrianaMarie\n                tr\n                    td Twitch.tv 频道\n                    td\n                        a(href='https://gitter.im/Septimus' target='_blank') @Septimus\n                tr\n                    td Youtube 频道\n                    td\n                        a(href='https://gitter.im/Septimus' target='_blank') @Septimus\n                tr\n                    td JavaScript 课程\n                    td\n                        a(href='https://gitter.im/SaintPeter' target='_blank') @SaintPeter\n                tr\n                    td 数据科学与开放数据\n                    td\n                        a(href='https://gitter.im/Evaristoc' target='_blank') @Evaristoc\n                tr\n                    td CamperBot\n                    td\n                        a(href='https://gitter.im/LTegman' target='_blank') @LTegman\n                tr\n                    td 翻译和国际化\n                    td\n                        a(href='https://gitter.im/Vtamara' target='_blank') @Vtamara\n                tr\n                    td Wiki\n                    td\n                        a(href='https://gitter.im/Rafase282' target='_blank') @Rafase282\n                tr\n                    td 营地\n                    td\n                        a(href='https://gitter.im/Hallaathrad' target='_blank') @Hallaathrad\n"
  },
  {
    "path": "server/views/resources/academic-honesty.jade",
    "content": "extends ../layout\nblock content\n    .col-xs-12.col-sm-8.col-sm-offset-2.col-md-6.col-md-offset-3\n        html.\n          <h2 class='text-center'></a>Academic Honesty Policy</h2>\n          <hr>\n          <p>Before we issue our verified certification to a camper, he or she must accept our Academic Honesty Pledge, which reads:</p>\n          <p>\"I understand that plagiarism means copying someone else’s work and presenting the work as if it were my own, without clearly attributing the original author.</p>\n          <p>\"I understand that plagiarism is an act of intellectual dishonesty, and that people usually get kicked out of university or fired from their jobs if they get caught plagiarizing.</p>\n          <p>\"Aside from using open source libraries such as jQuery and Bootstrap, and short snippets of code which are clearly attributed to their original author, 100% of the code in my projects was written by me, or along with another camper with whom I was pair programming in real time.</p>\n          <p>\"I pledge that I did not plagiarize any of my Free Code Camp work. I understand that Free Code Camp’s team will audit my projects to confirm this.\"</p>\n          <p>In the situations where we discover instances of unambiguous plagiarism, we will replace the camper in question’s certification with a message that \"Upon review, this account has been flagged for academic dishonesty.\"</p>\n          <p>As an academic institution that grants achievement-based certifications, we take academic honesty very seriously. If you have any questions about this policy, or suspect that someone has violated it, you can email <a href=\"mailto:jin@freecodecamp.cn\">jin@freecodecamp.cn</a> and we will investigate.</p>\n"
  },
  {
    "path": "server/views/resources/calculator.jade",
    "content": "extends ../layout-wide\nblock content\n    script(src=\"../../../js/calculator.js\")\n    .row\n        .col-xs-12.col-sm-10.col-md-8.col-lg-6.col-sm-offset-1.col-md-offset-2.col-lg-offset-3\n            h1.text-center Coding Bootcamp Cost Calculator\n            h3.text-center.text-primary#chosen Coming from _______, and making $_______, your true costs will be:\n            #city-buttons\n                .spacer\n                h2.text-center Where do you live?\n                .spacer\n                .col-xs-12.col-sm-12.col-md-4.btn-nav\n                    button#atlanta.btn.btn-primary.btn-block.btn-lg Atlanta\n                .col-xs-12.col-sm-12.col-md-4.btn-nav\n                    button#austin.btn.btn-primary.btn-block.btn-lg Austin\n                .col-xs-12.col-sm-12.col-md-4.btn-nav\n                    button#brisbane.btn.btn-primary.btn-block.btn-lg Brisbane\n                .col-xs-12.col-sm-12.col-md-4.btn-nav\n                    button#boulder.btn.btn-primary.btn-block.btn-lg Boulder\n                .col-xs-12.col-sm-12.col-md-4.btn-nav\n                    button#chicago.btn.btn-primary.btn-block.btn-lg Chicago\n                .col-xs-12.col-sm-12.col-md-4.btn-nav\n                    button#denver.btn.btn-primary.btn-block.btn-lg Denver\n                .col-xs-12.col-sm-12.col-md-4.btn-nav\n                    button#hong-kong.btn.btn-primary.btn-block.btn-lg Hong Kong\n                .col-xs-12.col-sm-12.col-md-4.btn-nav\n                    button#london.btn.btn-primary.btn-block.btn-lg London\n                .col-xs-12.col-sm-12.col-md-4.btn-nav\n                    button#los-angeles.btn.btn-primary.btn-block.btn-lg Los Angeles\n                .col-xs-12.col-sm-12.col-md-4.btn-nav\n                    button#manchester.btn.btn-primary.btn-block.btn-lg Manchester\n                .col-xs-12.col-sm-12.col-md-4.btn-nav\n                    button#melbourne.btn.btn-primary.btn-block.btn-lg Melbourne\n                .col-xs-12.col-sm-12.col-md-4.btn-nav\n                    button#new-york-city.btn.btn-primary.btn-block.btn-lg New York City\n                .col-xs-12.col-sm-12.col-md-4.btn-nav\n                    button#portland.btn.btn-primary.btn-block.btn-lg Portland\n                .col-xs-12.col-sm-12.col-md-4.btn-nav\n                    button#raleigh-durham.btn.btn-primary.btn-block.btn-lg Raleigh-Durham\n                .col-xs-12.col-sm-12.col-md-4.btn-nav\n                    button#san-francisco.btn.btn-primary.btn-block.btn-lg San Fransisco\n                .col-xs-12.col-sm-12.col-md-4.btn-nav\n                    button#seattle.btn.btn-primary.btn-block.btn-lg Seattle\n                .col-xs-12.col-sm-12.col-md-4.btn-nav\n                    button#singapore.btn.btn-primary.btn-block.btn-lg Singapore\n                .col-xs-12.col-sm-12.col-md-4.btn-nav\n                    button#toronto.btn.btn-primary.btn-block.btn-lg Toronto\n                .col-xs-12.btn-nav\n                    button#other.btn.btn-primary.btn-block.btn-lg Other\n                    .spacer\n            #income.initially-hidden\n                .spacer\n                h2.text-center How much money did you make last year (in USD)?\n                .spacer\n                .col-xs-12.col-sm-12.col-md-4.btn-nav\n                    button#0.btn.btn-primary.btn-block.btn-lg(href='#') $0\n                .col-xs-12.col-sm-12.col-md-4.btn-nav\n                    button#20000.btn.btn-primary.btn-block.btn-lg(href='#') $20,000\n                .col-xs-12.col-sm-12.col-md-4.btn-nav\n                    button#30000.btn.btn-primary.btn-block.btn-lg(href='#') $30,000\n                .col-xs-12.col-sm-12.col-md-4.btn-nav\n                    button#40000.btn.btn-primary.btn-block.btn-lg(href='#') $40,000\n                .col-xs-12.col-sm-12.col-md-4.btn-nav\n                    button#50000.btn.btn-primary.btn-block.btn-lg(href='#') $50,000\n                .col-xs-12.col-sm-12.col-md-4.btn-nav\n                    button#60000.btn.btn-primary.btn-block.btn-lg(href='#') $60,000\n                .col-xs-12.col-sm-12.col-md-4.btn-nav\n                    button#70000.btn.btn-primary.btn-block.btn-lg(href='#') $70,000\n                .col-xs-12.col-sm-12.col-md-4.btn-nav\n                    button#80000.btn.btn-primary.btn-block.btn-lg(href='#') $80,000\n                .col-xs-12.col-sm-12.col-md-4.btn-nav\n                    button#90000.btn.btn-primary.btn-block.btn-lg(href='#') $90,000\n                .col-xs-12.col-sm-12.col-md-4.btn-nav\n                    button#100000.btn.btn-primary.btn-block.btn-lg(href='#') $100,000\n                .col-xs-12.col-sm-12.col-md-4.btn-nav\n                    button#120000.btn.btn-primary.btn-block.btn-lg(href='#') $120,000\n                .col-xs-12.col-sm-12.col-md-4.btn-nav\n                    button#140000.btn.btn-primary.btn-block.btn-lg(href='#') $140,000\n                .col-xs-12.col-sm-12.col-md-4.btn-nav\n                    button#160000.btn.btn-primary.btn-block.btn-lg(href='#') $160,000\n                .col-xs-12.col-sm-12.col-md-4.btn-nav\n                    button#180000.btn.btn-primary.btn-block.btn-lg(href='#') $180,000\n                .col-xs-12.col-sm-12.col-md-4.btn-nav\n                    button#200000.btn.btn-primary.btn-block.btn-lg(href='#') $200,000\n                    .spacer\n            #chart.initially-hidden\n                .d3-centered\n                    svg.chart\n            #explanation.initially-hidden\n                .col-xs-12.col-sm-10.col-sm-offset-1\n                    .text-center\n                        button#transform.btn.btn-primary.btn-lg Transform\n                        .button-spacer\n                        a(href='/json/bootcamps.json') View Data Source JSON\n                        span &nbsp; &bullet; &nbsp;\n                        a(href='/coding-bootcamp-cost-calculator') Recalculate\n                    h3 Notes:\n                    ol\n                        li.large-li We assumed an APR of 6% and a term of 3 years. If you happen to have around $15,000 in cash set aside for a coding bootcamp, please ignore this cost.\n                        li.large-li We assume a cost of living of $500 for cities like San Francisco and New York City, and $400 per week for everywhere else.\n                        li.large-li The most substantial cost for most people is lost wages. A 40-hour-per-week job at the US Federal minimum wage would pay at least $15,000 per year. You can read more about economic cost\n                            a(href='https://en.wikipedia.org/wiki/Economic_cost' target='_blank')  here\n                            | .\n                    .spacer\n                    .row\n                        .col-xs-12.col-sm-6\n                            img.img-responsive.testimonial-image.img-center(src='https://www.evernote.com/l/AHRIBndcq-5GwZVnSy1_D7lskpH4OcJcUKUB/image.png')\n                        .col-xs-12.col-sm-6\n                            h3 Built by Suzanne Atkinson\n                            p.large-p Suzanne is an emergency medicine physician, triathlon coach and web developer from Pittsburgh. You should &thinsp;\n                                a(href='https://twitter.com/intent/user?screen_name=SteelCityCoach' target='_blank') follow her on Twitter\n                                | .\n                    .spacer\n"
  },
  {
    "path": "server/views/resources/code-of-conduct.jade",
    "content": "extends ../layout\nblock content\n    .col-xs-12.col-sm-8.col-sm-offset-2.col-md-6.col-md-offset-3\n        h1.text-center Code of Conduct\n        hr\n        p\n            | Free Code Camp is friendly place to learn to code. We’re committed to keeping it that way.\n        p\n            | All campers are required to agree with the following code of conduct. We’ll enforce this code. We’re expecting cooperation from all campers in ensuring a friendly environment for everybody.\n        p In short: be nice to your fellow campers.\n        p Remember these 3 things and your fellow campers will like you:\n        ol\n            li Compliment your fellow campers when they do good work. Congratulate them when they accomplish something (like completing one of our certifications or getting a job).\n            li Critique the work, not the camper doing it.\n            li Only argue about something if it’s important to the greater discussion.\n        p\n            | Free Code Camp should be a harassment-free experience for everyone, regardless of gender, gender identity and expression, age, sexual orientation, disability, physical appearance, body size, race, national origin, or religion (or lack thereof).\n        p\n            | We do not tolerate harassment of campers in any form, anywhere on Free Code Camp’s online media (Gitter, Twitch, Facebook, etc.) or during pair programming. Harassment includes sexual language and imagery, deliberate intimidation, stalking, unwelcome sexual attention, libel, and any malicious hacking or social engineering.\n        p\n            | If a camper engages in harassing behavior, our team will take any action we deem appropriate, up to and including banning them from Free Code Camp.\n        p\n            | No bots are allowed in any of the Official Chat Rooms without prior explicit permission from the FCC Core Team.\n        p\n            | We want everyone to feel safe and respected. If you are being harassed or notice that someone else is being harassed, say something! Go to our &thinsp;\n            a(href='https://gitter.im/freecodecamp/admin' target='_blank') Admin room in Gitter\n            | &thinsp; and explain what has happened where (preferably with a screen shot of the offending language) so we can take fast action.\n        p\n            | If you have questions about this code of conduct, email us at&thinsp;\n            a(href='mailto:team@freecodecamp.com') team@freecodecamp.com\n"
  },
  {
    "path": "server/views/resources/code.jade",
    "content": "extends ../layout\nblock content\n    style.\n      #banner{background: #4CAF50;height:450px;color:white;margin-left:-15px;margin-right:-15px;margin-top:-71px;}\n      .canvas-text{position:absolute;top:0;left:0;width:100%;margin-top:60px;text-align:center;}\n      #logo{display:block;margin:0 auto;padding-top:3%;width:100px;}\n      .qrcode{position: fixed;top: 500px;border-radius: 2px;-moz-border-radius: 2px;-webkit-border-radius: 2px;\n        text-align: center;color: #717375;font-size: 12px;}\n      .right{right: 0px;}\n      .left{left: 0px;}\n      h4{font-size:18px;}\n      dd{margin: 0 auto;margin-top: 5px;}\n      .btn-orange{background:orange;display:block;margin:0 auto;border:none;margin-top: 20px;font-size:30px;}\n      .carousel-indicators {bottom: -30px;}\n      .carousel-indicators li {border: 1px solid #8BC34A;border-radius: 50%;margin:0;margin-right:5px;}\n      .carousel-indicators .active {background:#8BC34A; width:10px;height:10px;margin-right:5px;}\n      .button-spacer{height:10px;}\n      .spacer{height:10px;}\n      .row{margin-top:40px;text-align:center;}\n      .modal{font-size:24px;}\n      .mt10{margin-top:10px;}\n      .modal-footer{text-align:center;}\n      #commit{color: #fff;background: orange;border: none;}\n    div.hidden\n      img(src='/images/camper-image-placeholder.png')\n    dl.qrcode.right.hidden-xs\n      dt\n        img(src='images/qrcode_for_nearest.jpg', width='120px')\n        dd 微信搜索freecodecamp\n        span 更多好东西等你来发现\n    .qrcode.left.hidden-xs\n      img#iwantjoin(src='/images/enroll.png', width='150px')\n    .row#banner\n      canvas#animate-net.banner-back\n      .canvas-text\n        img#logo(src='/images/wilddog.png')\n        h1 野狗杯\n        h1 苏州全民在线编程挑战赛\n        h2 06.05 -- 07.02\n        // Button trigger modal\n        button.btn.btn-orange.btn-lg(type='button', data-toggle='modal', data-target='#myModal') 立即报名\n    #myModal.modal.fade(tabindex='-1', role='dialog', aria-labelledby='myModalLabel')\n      .modal-dialog(role='document' ng-app=\"app\")\n        .modal-content(ng-controller='modal')\n          .modal-header\n            h4.text-center#myModalLabel.modal-title(style='text-align:center;') FreeCodeCamp 比赛报名入口\n          .modal-body\n            form.form-horizontal\n              .form-group\n                label.col-xs-12.col-sm-3.control-label(for='username') 用户名\n                .col-xs-12.col-sm-9.mt10\n                  input#username.form-control(type='text', ng-model='username', name='username', placeholder='FCC的用户名都是小写哦', required='')\n                  span(style='font-size:12px;') 如果你没有FCC用户名，\n                  a(href='/login', style='font-size:12px;') 请先注册FCC\n              .form-group\n                label.col-xs-12.col-sm-3.control-label(for='telphone') 手机号\n                .col-xs-12.col-sm-9.mt10\n                  input#telphone.form-control(type='tel', ng-model='telphone', name='telphone', placeholder='便于我们通知你领奖品哦', required='')\n              .form-group\n                label.col-xs-12.col-sm-3.control-label(for='category') 选择组别\n                .col-xs-12.col-sm-9.mt10\n                  select(style='border: 1px solid #ccc;width:100%;')\n                    option(value='') 一旦选定不能修改哦 ^_^\n                    option(value='master') 专业组(面向计算机高手)\n                    option(value='newer') 业余组(面向计算机小白)\n                    option(value='women') 新秀组(只面向女性，男性选择改组无法获奖）\n          .modal-footer\n            button.btn.btn-primary(type='button', data-dismiss='modal') 关闭此窗口\n            button#commit.btn.btn-default(ng-click='commit();') 确定无误，提交\n    .container-fluid\n      h4.text-center 人人皆可编程\n      p.text-center(style='padding-top:20px;') 本次挑战赛由苏州工业园区科信局指导、苏州开发者联盟主办、猿生态开发者社区承办。\n      p.text-center 全民编程时代已经来临，编程技能将会成为一项基本素质。\n      p.text-center 本次挑战赛旨在提升苏州开发者技能，营造“人人皆可编程”的氛围。\n    hr\n    .container-fluid\n    h4.text-center 比赛平台：FreeCodeCamp中文社区\n    .row\n      .col-xs-12.col-sm-12.col-md-3\n        img.img-responsive.center-block(src='/images/landingIcons_connect.svg', style='width:150px;')\n        .button-spacer\n        span 全球30W+用户\n        br\n        span GitHub上排名第一\n        .spacer\n      .col-xs-12.col-sm-12.col-md-3\n        img.img-responsive.center-block(src='/images/landingIcons_learn.svg', style='width:150px;')\n        .button-spacer\n        span 游戏化编程\n        br\n        span 无尽的挑战任务\n        .spacer\n      .col-xs-12.col-sm-12.col-md-3\n        img.img-responsive.center-block(src='/images/landingIcons_nonprofits.svg', style='width:150px;')\n        .button-spacer\n        span 8万+人在线交流\n        br\n        span 有问必答\n        .spacer\n      .col-xs-12.col-sm-12.col-md-3\n        img.img-responsive.center-block(src='/images/landingIcons_portfolio.svg', style='width:150px;')\n        .button-spacer\n        span 帮助非盈利组织\n        br\n        span 开发公益项目\n        .spacer\n    hr\n    .container-fluid\n    h4.text-center 赛程\n    embed(src='images/timeline.svg', type='image/svg+xml')\n    hr\n    .container-fluid\n    h4.text-center 分组\n    embed(src='images/groups.svg', type='image/svg+xml', codebase='http://www.adobe.com/svg/viewer/install/', style='margin-left:20px;')\n    hr\n    .container-fluid\n    h4.text-center 评分（标星的必做）\n    embed(src='images/challenges.svg', type='image/svg+xml', codebase='http://www.adobe.com/svg/viewer/install/')\n    hr\n    .container-fluid(style='width:100%;')\n    h4.text-center 奖品\n    #carousel-example-generic.carousel.slide(data-ride='carousel')\n      // Wrapper for slides\n      .carousel-inner(role='listbox')\n        .item.active\n          img(src='/images/1.png', alt='...')\n        .item\n          img(src='/images/2.png', alt='...')\n        .item\n          img(src='/images/3.png', alt='...')\n      // Indicators\n      ol.carousel-indicators\n        li.active(data-target='#carousel-example-generic', data-slide-to='0')\n        li(data-target='#carousel-example-generic', data-slide-to='1')\n        li(data-target='#carousel-example-generic', data-slide-to='2')\n    hr\n    div\n    img.img-responsive.center-block(src='images/startup.png')\n    a(href='https://wilddog.com')\n    img.img-responsive.center-block(src='images/zuanshi.png')\n    img.img-responsive.center-block(src='images/media.png')\n    script(src=\"/js/greensock.js\")\n    script(src=\"/js/angular.min.js\")\n    script(src=\"/js/join-race.js\")\n"
  },
  {
    "path": "server/views/resources/dashboard.jade",
    "content": "extends ../layout\nblock content\n  style.\n    table,th,td{\n      padding-left: 5px;\n      text-align:center;\n    }\n    tr:nth-child(even){\n      background-color: #FAEBD7;\n    }\n    tr:nth-child(odd){\n      background-color: white;\n    }\n    th, tr{\n      padding:10px;\n    }\n    table{margin: 0 auto;}\n  .row(ng-app=\"app\")\n    .col-md-12\n      h2.text-center FCC同城学习小组\n      if user\n        table(ng-controller=\"dashboard\")\n          thead\n            tr\n              th id\n              th 姓名\n              th 邮箱\n              th 手机号\n              th 微信号\n              th 地点\n              th 背景\n          tbody\n            tr(ng-repeat=\"item in items\")\n              th {{item.username}}\n              th {{item.fullname}}\n              th {{item.email}}\n              th {{item.telphone}}\n              th {{item.wechat}}\n              th {{item.location}}\n              th {{item.background}}\n  script(src=\"/js/angular.min.js\")\n  script(src=\"/js/dashboard.js\")\n"
  },
  {
    "path": "server/views/resources/group.jade",
    "content": "extends ../layout\nblock content\n  style.\n    .mt10{margin-top:10px;}\n    .mt20{margin-top:20px;}\n    select{border: 1px solid #ccc;width:100%;height:34px;}\n  .row\n    .col-md-12\n      img.img-responsive(src=\"/images/freecodecamp.png\")\n  h1.text-center 欢迎加入FreeCodeCamp线下同城学习小组\n  if user\n\n    .row(ng-app=\"app\")\n      .col-md-12\n        form.form-horizontal(ng-controller=\"group\")\n          .form-group\n              input#username.form-control(type='hidden', name='username', value=user.username, required)\n          .form-group\n            label.col-xs-12.col-sm-3.col-md-3.control-label(for='fullname') 姓名\n            .col-xs-12.col-sm-9.col-md-6\n              input#fullname.form-control(type='text', ng-model='fullname', name='fullname', placeholder='我们需要您的真实姓名', required)\n          .form-group\n            label.col-xs-12.col-sm-3.col-md-3.control-label(for='email') 邮箱\n            .col-xs-12.col-sm-9.col-md-6\n              input#email.form-control(type='text', ng-model='email', name='email', placeholder='便于我们提前给您发送活动通知', required)\n          .form-group\n            label.col-xs-12.col-sm-3.col-md-3.control-label(for='telphone') 手机号\n            .col-xs-12.col-sm-9.col-md-6\n              input#telphone.form-control(type='tel', ng-model='telphone', name='telphone', placeholder='便于我们关键时刻能联系上您', required)\n          .form-group\n            label.col-xs-12.col-sm-3.col-md-3.control-label(for='wechat') 微信号\n            .col-xs-12.col-sm-9.col-md-6\n              input#wechat.form-control(type='text', ng-model='wechat', name='wechat', placeholder='便于我们把你加入对应的学习群', required)\n          .form-group\n            label.col-xs-12.col-sm-3.col-md-3.control-label(for='location') 城市\n            .col-xs-12.col-sm-9.col-md-6\n              select#location\n                option(value='') 可以就近参加您所在城市的线下活动哦 ^_^\n                option(value='北京') 北京\n                option(value='上海') 上海\n                option(value='广州') 广州\n                option(value='深圳') 深圳\n                option(value='成都') 成都\n                option(value='重庆') 重庆\n                option(value='西安') 西安\n                option(value='天津') 天津\n                option(value='大连') 大连\n                option(value='青岛') 青岛\n                option(value='厦门') 厦门\n                option(value='苏州') 苏州\n                option(value='南京') 南京\n                option(value='杭州') 杭州\n                option(value='武汉') 武汉\n                option(value='长沙') 长沙\n                option(value='合肥') 合肥\n                option(value='南昌') 南昌\n                option(value='其他城市') 其他城市\n          .form-group\n            label.col-xs-12.col-sm-3.col-md-3.control-label(for='category') 背景\n            .col-xs-12.col-sm-9.col-md-6\n              select#background\n                option(value='') 填写您的相关背景便于我们为您提供个性化的服务哦 ^_^\n                option(value='政府') 政府\n                option(value='媒体') 媒体\n                option(value='学校') 学校\n                option(value='学生') 学生\n                option(value='程序猿') 程序猿\n                option(value='程序媛') 程序媛\n                option(value='企业') 企业\n                option(value='公益机构') 公益机构\n                option(value='其他') 其他\n              button#commit.btn.btn-primary.btn-lg.mt20(ng-click='commit();') 提交\n        script(src=\"/js/angular.min.js\")\n        script(src=\"/js/join-group.js\")\n  else\n    a.text-center.center-block(href=\"/login\") 请先登录\n"
  },
  {
    "path": "server/views/resources/how-nonprofit-projects-work.jade",
    "content": "extends ../layout\nblock content\n    .col-xs-12.col-sm-8.col-sm-offset-2.col-md-6.col-md-offset-3\n        h2.text-center How our Nonprofit Projects Work\n        hr\n        p Building nonprofit projects is the main way that our campers learn full stack JavaScript and agile software development. You’ll begin this process once you’ve earned your Front End Development, Data Visualization, and Back End Development certifications.\n        h3 Starting with the end in mind\n        p Our goal at Free Code Camp is to help you land a job as a software developer or get promoted in your current company to a more technical role.\n        p You’ll continue to work on nonprofit projects until you’ve built a sufficiently impressive portfolio and references to start your job search. Your portfolio will ultimately have four nonprofit projects. We estimate that the 800 hours of nonprofit projects and 80 hours of interview prep you’re going to complete, in addition to the 1,200 hours of challenges you’ve already completed by this point, will be more than enough to qualify you for your first coding job.\n        h3 Your first Nonprofit Project\n        p We generally scope Nonprofit Projects to 200 hours, or about 10 weeks at 20 hours per week of development per camper. These are only rough estimates. You’ll only work on one project at a time.\n        p You will choose another camper to partner with on this projects. You should choose your them based on:\n        ol\n            li How many hours you can pledge (around 10, 20, or 40 hours per week)\n            li Your time zones (Will you be able to pair program together?)\n            li Prior coding experience (we’d like both campers to be able to contribute equally)\n        p We don't take age or gender into account. This will provide you with valuable experience in meshing with diverse teams, which is a reality of the contemporary workplace.\n        p Then, you’ll email&thinsp;\n            a(href=\"mailto:team@freecodecamp.com\") team@freecodecamp.com\n            |&thinsp; with:\n        ol\n              li Names\n              li Contact information\n              li Links to each of your Free Code Camp code portfolios\n              li Timezones\n              li Hours pledged per week\n        p We’ll send you a list of 3 nonprofit projects that need your help, and together you will choose one to begin work on. While you do this, our team will code review each of your code portfolios to ensure that all user stories have been completed, and that there are no signs of academic dishonesty.\n        h3 Beginning the Project\n        p We’ll set an initial meeting with representatives from Free Code Camp, the two campers, and the stakeholder. If the stakeholder and both campers show up promptly, and seem enthusiastic and professional, we’ll start the project. This lengthy process serves an important purpose: it reduces the likelihood that any of our campers or stakeholders will waste their precious time.\n        h3 Nonprofit Stakeholders\n        p Each nonprofit project was submitted by a nonprofit. A representative from this nonprofit has agreed to serve as a \"stakeholder\" - an authorative person who understands the organization and its needs for this particular project.\n        p Stakeholders have a deep understanding of their organizations’ needs. Campers will work with them to figure out the best solutions to these needs.\n        p When you and your pair partner first speak with your nonprofit stakeholder, you’ll:\n        ol\n            li talk at length to better understand their needs\n            li create a new Trello board and use it to prioritize what needs to be built\n            li establish deadlines based on your weekly time commitment, and how long you think each task will take\n        p Ideally, we’ll scope each project to be completed in 10 sprints. It’s notoriously difficult to estimate how long building software projects will take, so feel free to ask our volunteer team for help.\n        p You’ll continue to meet with your stakeholder weekly using the conference software GoToMeeting. You will also correspond with the team on the project’s Trello board.\n        p Getting \"blocked\" on a task can take away your sense of forward momentum, so be sure to proactively seek answers to any ambiguities you encounter.\n        p Ultimately, the project will be considered complete once the stakeholder’s needs have been met, and you and your partner are happy with the project. Then you can add it to your portfolio!\n        h3 Working with your Partner\n        p You and your partner will pair program (code together on the same computer virtually) about half of the time, and work independently the other half of the time.\n        p Here are our recommended ways of collaborating:\n        ol\n            li Gitter has robust private messaging functionality. It’s the main way our team communicates, and we recommend it over email.\n            li Trello is great for managing projects. Work with your stakeholder to create Trello cards, and update these cards regularly as you make progress on them.\n            li Screen Hero or Team Viewer - These are the ideal way to pair program. Tools like TMUX are good, but difficult to use. We discourage you from using screen sharing tools where only one person has control of the keyboard and mouse - that isn’t real pair programming.\n            li Write clear and readable code, commit messages, branch names, and pull request messages.\n        h3 Hosting Apps\n        p Unless your stakeholder has an existing modern host (AWS, Digital Ocean), you’ll need to transition them over to a new platform. We believe Heroku is the best choice for a vast majority of web projects. It’s free for hosting non-production apps, easy to use, and has both browser and command line interfaces. It’s owned by Salesforce and used by a ton of companies, so it’s accountable and unlikely to go away.\n        p If you need help convincing your stakeholder that Heroku is the ideal platform, we’ll be happy to talk with them.\n        h3 Maintaining Apps\n        p Once you complete a nonprofit project, your obligation to its stakeholder is finished. Your goal is to leave behind a well documented solution that can be easily maintained by a contract JavaScript developer (or even a less-technical \"super user\").\n        p While you will no longer need to help with feature development, we encourage you to consider helping your stakeholder with occasional patches down the road. After all, this project will be an important piece of your portfolio, and you’ll want it to remain in good shape for curious future employers.\n        h3 Pledging to Finish the Project\n        p Your nonprofit stakeholder, your partner, and our volunteer team are all counting on you to finish your nonprofit project. If you walk away from an unfinished nonprofit project, you’ll become ineligible to ever be assigned another one.\n        p To confirm that you understand the seriousness of this commitment, we require that all campers sign&thinsp;\n            a(href='http://goo.gl/forms/ZMn96z2QqY' target='_blank') this pledge\n            | &thinsp;before starting on their nonprofit projects.\n        p There will likely be times of confusion or frustration. This is normal in software development. The most important thing is that you do not give up and instead persevere through these setbacks. As Steve Jobs famously said, \"Real artists ship.\" And you are going to ship one successful nonprofit project after another until you feel ready to take the next step in your promising career.\n"
  },
  {
    "path": "server/views/resources/labs.jade",
    "content": "extends ../layout\nblock content\n        h2.text-center Projects Created by Free Code Camp Campers\n        hr\n        .row\n            .col-xs-12.col-sm-10.col-sm-offset-1\n                for project in projects\n                    .spacer\n                    .row\n                        .col-xs-12.col-sm-3\n                            img.img-responsive(src=project.image)\n                        .col-xs-12.col-sm-9.negative-15\n                            h3\n                                a(href=project.url) #{project.name}\n                            h4 by&thinsp;\n                                a(href='https://freecodecamp.com/' + project.camper) #{project.camper}\n                            p= project.description\n"
  },
  {
    "path": "server/views/resources/links.jade",
    "content": "extends ../layout\nblock content\n    table.table.link-table\n        tr\n            td.text-right\n                .ion-erlenmeyer-flask\n            td\n                a(href=\"/labs\") Cool Apps Built by Campers\n        tr\n            td.text-right\n                .ion-chatbox\n            td\n                a(href=\"/stories\") Stories from Campers\n        tr\n            td.text-right\n                .ion-speakerphone\n            td\n                a(href='//medium.freecodecamp.com', target='_blank') Medium Publication\n        tr\n            td.text-right\n                .ion-social-github\n            td\n                a(href=\"//github.com/freecodecamp\", target='_blank') GitHub Repository\n        tr\n            td.text-right\n                .ion-social-reddit\n            td\n                a(href=\"//www.reddit.com/r/freecodecamp\", target='_blank') Subreddit\n        tr\n            td.text-right\n                .ion-social-linkedin\n            td\n                a(href=\"//www.linkedin.com/edu/school?id=166029\", target='_blank') LinkedIn University Page\n        tr\n            td.text-right\n                .ion-social-twitter\n            td\n                a(href=\"//twitter.com/freecodecamp\", target='_blank') Twitter Feed\n        tr\n            td.text-right\n                .ion-social-facebook\n            td\n                a(href=\"//facebook.com/freecodecamp\") Facebook Page\n        tr\n            td.text-right\n                .ion-social-twitch-outline\n            td\n                a(href=\"//twitch.tv/freecodecamp\", target='_blank') Twitch.tv Channel\n        tr\n            td.text-right\n                .ion-locked\n            td\n                a(href=\"//github.com/FreeCodeCamp/freecodecamp/wiki/Free-Code-Camp's-Privacy-Policy\") Privacy Policy\n    .spacer\n"
  },
  {
    "path": "server/views/resources/nonprofits-form.jade",
    "content": "extends ../layout\nblock content\n    iframe(src=\"https://docs.google.com/forms/d/1MtQDh8E1Nvkg5jdOucS4LSyk6oMQrN8XTwmQGtgJPAQ/viewform?embedded=true\", frameborder=\"0\", marginheight=\"0\", marginwidth=\"0\", width='102%', height=2550, scrolling=\"no\") Loading...\n"
  },
  {
    "path": "server/views/resources/nonprofits.jade",
    "content": "extends ../layout\nblock content\n    .text-center\n        .row\n            .col-xs-12\n                h1.landing-heading Get pro bono code for your nonprofit.\n                .big-break\n                .col-xs-12.col-sm-12.col-md-12\n                    .embed-responsive.embed-responsive-16by9\n                        iframe.embed-responsive-item(src='//player.vimeo.com/video/126228100')\n                    .big-break\n                h2 As featured in:\n                img.img-center.img-responsive(src='/images/as-seen-on.png')\n                .spacer\n                hr\n                .spacer\n                h2 What nonprofit leaders are saying:\n                .spacer\n                .row\n                    .col-xs-12.col-sm-12.col-md-4\n                        img.img-responsive.testimonial-image.img-center(src=\"//i.imgur.com/ZHnFFN5.jpg\", alt=\"Ewa's testimonial image\")\n                        p.nonprofit-testimonial-copy With Free Code Camp's valuable contribution, we were able to improve all of our systems and processes as part of our Wonder Women Eastern Indonesia program, and make sure that even more life changing technologies get to where they are needed most.\n                        h3 - Ewa Wojkowska with Kopernik\n                    .col-xs-12.col-sm-12.col-md-4\n                        img.img-responsive.testimonial-image.img-center(src=\"//i.imgur.com/KHF8O2i.jpg\", alt=\"Jennifer's testimonial image\")\n                        p.nonprofit-testimonial-copy We have been blown away by the professional quality of the work that has been produced by the campers working on our projects. Free Code Camp has been an invaluable partner and we are grateful for their support.\n                        h3 - Jennifer McDowell with Child First Authority\n                    .col-xs-12.col-sm-12.col-md-4\n                        img.img-responsive.testimonial-image.img-center(src=\"//i.imgur.com/9VknVe3.jpg\", alt=\"Stephanie's testimonial image\")\n                        p.nonprofit-testimonial-copy We had the pleasure to work with two very talented campers who went above and beyond to create a web-based app for us. I would highly recommend that nonprofits apply to Free Code Camp with their custom solution needs!\n                        h3 - Stephanie McAllister with Timeraiser\n                .spacer\n                hr\n                .spacer\n                h2 Our process:\n                .spacer\n                .row\n                    .col-xs-12.col-sm-12.col-md-4\n                        img.img-responsive.landing-icon.img-center(src= '/images/landingIcons_portfolio.svg.gz', alt='Image of a briefcase')\n                        p.large-p You tell us how we can help you.\n                    .col-xs-12.col-sm-12.col-md-4\n                        img.img-responsive.landing-icon.img-center(src= '/images/landingIcons_nonprofits.svg.gz', alt='Image of people putting their hands together in a huddle')\n                        p.large-p We'll hand pick developers and a project manager.\n                    .col-xs-12.col-sm-12.col-md-4\n                        img.img-responsive.landing-icon.img-center(src= '/images/landingIcons_connect.svg.gz', alt='image of two people high-fiving')\n                        p.large-p Together we'll set milestones and complete your project.\n                .spacer\n                hr\n                .spacer\n                h2 Solutions we can help you build:\n                .spacer\n                .text-center.negative-35\n                    .col-xs-12.col-sm-12.col-md-3\n                        .landing-skill-icon.ion-android-globe\n                        h2.black-text Websites\n                    .col-xs-12.col-sm-12.col-md-3\n                        .landing-skill-icon.ion-card\n                        h2.black-text Donation Systems\n                    .col-xs-12.col-sm-12.col-md-3\n                        .landing-skill-icon.ion-android-calendar\n                        h2.black-text Volunteer Systems\n                    .col-xs-12.col-sm-12.col-md-3\n                        .landing-skill-icon.ion-ios-box\n                        h2.black-text Inventory Systems\n                    .col-xs-12.col-sm-12.col-md-3\n                        .landing-skill-icon.ion-university\n                        h2.black-text E-learning Platforms\n                    .col-xs-12.col-sm-12.col-md-3\n                        .landing-skill-icon.ion-ios-list\n                        h2.black-text Paperless Workflows\n                    .col-xs-12.col-sm-12.col-md-3\n                        .landing-skill-icon.ion-ios-people\n                        h2.black-text Community Tools\n                    .col-xs-12.col-sm-12.col-md-3\n                        .landing-skill-icon.ion-settings\n                        h2.black-text ...and other tools\n        .spacer\n        hr\n        .spacer\n        .col-xs-offset-0.col-sm-offset-1.text-left.large-p\n            h2 Our developers build projects for nonprofits who:\n            .spacer\n            ul.large-li\n                li.ion-code &thinsp; already have people who benefit from their services.\n                li.ion-code &thinsp; are registered with their government and have tax-exempt status.\n                li.ion-code &thinsp; have a stakeholder who can meet with our developers to direct the project.\n                li.ion-code &thinsp; can budget at least $20 per month for their own cloud servers.\n                li.ion-code &thinsp; can commit to using and maintaining the solution that our developers build.\n        .big-break\n        .row\n            .col-xs-12.col-sm-8.col-sm-offset-2\n                a.btn.btn-cta.signup-btn.btn-block(href=\"/nonprofits-form\") My nonprofit needs coding help\n"
  },
  {
    "path": "server/views/resources/pmi-acp-agile-project-managers-form.jade",
    "content": "extends ../layout\nblock content\n    iframe(src=\"https://docs.google.com/forms/d/1Y9wvQAx5s_puGcC-NRZpKLMgT0iZwajGMbkKlh-piGg/viewform?embedded=true\", frameborder=\"0\", marginheight=\"0\", marginwidth=\"0\", width='102%', height=2000, scrolling=\"no\") Loading...\n"
  },
  {
    "path": "server/views/resources/pmi-acp-agile-project-managers.jade",
    "content": "extends ../layout\nblock content\n    .jumbotron\n        .text-center\n            .row\n                .col-xs-12\n                    h1.nonprofit-landing.hug-top Get Agile Project Management Experience for the PMI-ACP by Helping Nonprofits\n                    .big-break\n                    .col-xs-12.col-sm-12.col-md-12\n                        .embed-responsive.embed-responsive-16by9\n                            iframe.embed-responsive-item(src='//player.vimeo.com/video/126228100')\n                        .big-break\n                    h2 Your opportunity:\n                    .row\n                        .col-xs-12.col-sm-12.col-md-4\n                            h3.nowrap Plan Projects\n                            img.img-responsive.landing-icon.img-center(src= '/images/landingIcons_portfolio.svg.gz', alt='Image of a briefcase')\n                            p.landing-p You'll triage deliverables and set deadlines.\n                        .col-xs-12.col-sm-12.col-md-4\n                            h3.nowrap Manage Teams\n                            img.img-responsive.landing-icon.img-center(src= '/images/landingIcons_nonprofits.svg.gz', alt='Image of people putting their hands together in a huddle')\n                            p.landing-p You'll lead two developers and a nonprofit stakeholder to success.\n                        .col-xs-12.col-sm-12.col-md-4\n                            h3.nowrap Become a PMI-ACP\n                            img.img-responsive.landing-icon.img-center(src= '/images/landingIcons_connect.svg.gz', alt='image of two people high-fiving')\n                            p.landing-p You'll learn Agile, get references, and qualify for the PMI-ACP.\n                    .big-break\n                    h2 Solutions you'll help nonprofits build:\n                    .text-center.negative-35\n                        .col-xs-12.col-sm-12.col-md-3\n                            .landing-skill-icon.ion-android-globe\n                            h2.black-text Websites\n                        .col-xs-12.col-sm-12.col-md-3\n                            .landing-skill-icon.ion-card\n                            h2.black-text Donation Systems\n                        .col-xs-12.col-sm-12.col-md-3\n                            .landing-skill-icon.ion-android-calendar\n                            h2.black-text Volunteer Systems\n                        .col-xs-12.col-sm-12.col-md-3\n                            .landing-skill-icon.ion-ios-box\n                            h2.black-text Inventory Systems\n                        .col-xs-12.col-sm-12.col-md-3\n                            .landing-skill-icon.ion-university\n                            h2.black-text E-learning Platforms\n                        .col-xs-12.col-sm-12.col-md-3\n                            .landing-skill-icon.ion-ios-list\n                            h2.black-text Paperless Workflows\n                        .col-xs-12.col-sm-12.col-md-3\n                            .landing-skill-icon.ion-ios-people\n                            h2.black-text Community Tools\n                        .col-xs-12.col-sm-12.col-md-3\n                            .landing-skill-icon.ion-settings\n                            h2.black-text ...and other tools\n            .big-break\n            a.btn.btn-cta.signup-btn.btn-block(href=\"/pmi-acp-agile-project-managers-form\") I want to lead agile projects for nonprofits\n"
  },
  {
    "path": "server/views/resources/privacy.jade",
    "content": "extends ../layout\nblock content\n    .col-xs-12.col-sm-8.col-sm-offset-2.col-md-6.col-md-offset-3\n        html.\n            <h2 class='text-center'><a id=\"Privacy_Policy_5\"></a>Privacy Policy</h2>\n            <hr>\n            <p>Your privacy is critically important to us. At Free Code Camp we have a few fundamental principles:</p>\n            <ol>\n            <li>We don’t ask you for personal information unless we truly need it. (We can’t stand services that ask you for things like your gender or income level for no apparent reason.)</li>\n            <li>We don’t share your personal information with anyone except to comply with the law, develop our products, or protect our rights.</li>\n            <li>Unless you ask us not to (by clicking the button that says \"hide all my solutions from other people\" located on your code portfolio), we will share your solutions and progress with the public as part of our open data initiative. This is intended for academics and researchers to better understand Free Code Camp as an educational model.</li>\n            <li>We don’t store personal information on our servers unless required for the on-going operation of one of our services.</li>\n            <li>We aim to make it as simple as possible for you to control what’s visible to the public, seen by search engines, kept private, and permanently deleted. Below is our privacy policy which incorporates these goals</li>\n            </ol>\n            <p>If you have questions about deleting or correcting your personal data please email us at <a mailto=\"team@freecodecamp.com\">team@freecodecamp.com</a></p>\n            <p>Free Code Camp Inc. (“<strong>Free Code Camp</strong>”) operates several websites including <a href=\"http://FreeCodeCamp.com/\">FreeCodeCamp.com</a>. It is Free Code Camp’s policy to respect your privacy regarding any information we may collect while operating our websites.</p>\n            <h3><a id=\"Website_Visitors_19\"></a>Website Visitors</h3>\n            <p>Like most website operators, Free Code Camp collects non-personally-identifying information of the sort that web browsers and servers typically make available, such as the browser type, language preference, referring site, and the date and time of each visitor request. Free Code Camp’s purpose in collecting non-personally identifying information is to better understand how Free Code Camp’s visitors use its website. From time to time, Free Code Camp may release non-personally-identifying information in the aggregate, e.g., by publishing a report on trends in the usage of its website.</p>\n            <p>Free Code Camp also collects potentially personally-identifying information like Internet Protocol (IP) addresses for logged in users and for users leaving comments on <a href=\"http://FreeCodeCamp.com\">FreeCodeCamp.com</a> blogs. Free Code Camp only discloses logged in user and commenter IP addresses under the same circumstances that it uses and discloses personally-identifying information as described below, except that blog commenter IP addresses and email addresses are visible and disclosed to the administrators of the blog where the comment was left.</p>\n            <h3><a id=\"Gathering_of_PersonallyIdentifying_Information_25\"></a>Gathering of Personally-Identifying Information</h3>\n            <p>Many visitors to Free Code Camp’s websites choose to interact with Free Code Camp in ways that require Free Code Camp to gather personally-identifying information. The amount and type of information that Free Code Camp gathers depends on the nature of the interaction. For example, we ask visitors who create an account for tracking their progress at <a href=\"http://FreeCodeCamp.com/\">FreeCodeCamp.com</a> to provide either an email address or sign in with a social media oauth service like GitHub. Those who engage in transactions with Free Code Camp – by placing job ads, for example – are asked to provide additional information, including as necessary the personal and financial information required to process those transactions. In each case, Free Code Camp collects such information only insofar as is necessary or appropriate to fulfill the purpose of the visitor’s interaction with Free Code Camp. Free Code Camp does not disclose personally-identifying information other than as described below. And visitors can always refuse to supply personally-identifying information, with the caveat that it may prevent them from engaging in certain website-related activities.</p>\n            <h3><a id=\"Aggregated_Statistics_29\"></a>Aggregated Statistics</h3>\n            <p>Free Code Camp may collect statistics about the behavior of visitors to its websites. For instance, Free Code Camp may monitor the accounts to try and identify spammers. Free Code Camp may display this information publicly or provide it to others. However, Free Code Camp does not disclose personally-identifying information other than as described below.</p>\n            <h3><a id=\"Protection_of_Certain_PersonallyIdentifying_Information_33\"></a>Protection of Certain Personally-Identifying Information</h3>\n            <p>Free Code Camp discloses potentially personally-identifying and personally-identifying information only to those of its employees, contractors and affiliated organizations that (i) need to know that information in order to process it on Free Code Camp’s behalf or to provide services available at Free Code Camp’s websites, and (ii) that have agreed not to disclose it to others. Some of those employees, contractors and affiliated organizations may be located outside of your home country; by using Free Code Camp’s websites, you consent to the transfer of such information to them. Free Code Camp will not rent or sell potentially personally-identifying and personally-identifying information to anyone. Other than to its employees, contractors and affiliated organizations, as described above, Free Code Camp discloses potentially personally-identifying and personally-identifying information only in response to a subpoena, court order or other governmental request, or when Free Code Camp believes in good faith that disclosure is reasonably necessary to protect the property or rights of Free Code Camp, third parties or the public at large. If you are a registered user of an Free Code Camp website and have supplied your email address, Free Code Camp may occasionally send you an email to tell you about new features, solicit your feedback, or just keep you up to date with what’s going on with Free Code Camp and our products. We primarily use our various product blogs to communicate this type of information, so we expect to keep this type of email to a minimum. If you send us a request (for example via a support email or via one of our feedback mechanisms), we reserve the right to publish it in order to help us clarify or respond to your request or to help us support other users. Free Code Camp takes all measures reasonably necessary to protect against the unauthorized access, use, alteration or destruction of potentially personally-identifying and personally-identifying information.</p>\n            <h3><a id=\"Cookies_37\"></a>Cookies</h3>\n            <p>A cookie is a string of information that a website stores on a visitor’s computer, and that the visitor’s browser provides to the website each time the visitor returns. Free Code Camp uses cookies to help Free Code Camp identify and track visitors, their usage of Free Code Camp website, and their website access preferences. Free Code Camp visitors who do not wish to have cookies placed on their computers should set their browsers to refuse cookies before using Free Code Camp’s websites, with the drawback that certain features of Free Code Camp’s websites may not function properly without the aid of cookies.</p>\n            <h3><a id=\"Business_Transfers_41\"></a>Business Transfers</h3>\n            <p>If Free Code Camp, or substantially all of its assets, were acquired, or in the unlikely event that Free Code Camp goes out of business or enters bankruptcy, user information would be one of the assets that is transferred or acquired by a third party. You acknowledge that such transfers may occur, and that any acquirer of Free Code Camp may continue to use your personal information as set forth in this policy.</p>\n            <h3><a id=\"Ads_45\"></a>Ads</h3>\n            <p>If in the future we show ads, ads appearing on any of our websites may be delivered to users by advertising partners, who may set cookies. These cookies allow the ad server to recognize your computer each time they send you an online advertisement to compile information about you or others who use your computer. This information allows ad networks to, among other things, deliver targeted advertisements that they believe will be of most interest to you. This Privacy Policy covers the use of cookies by Free Code Camp and does not cover the use of cookies by any advertisers.</p>\n            <h3><a id=\"Privacy_Policy_Changes_53\"></a>Privacy Policy Changes</h3>\n            <p>Although most changes are likely to be minor, Free Code Camp may change its Privacy Policy from time to time, and in Free Code Camp’s sole discretion. Free Code Camp encourages visitors to frequently check this page for any changes to its Privacy Policy. If you have a <a href=\"http://FreeCodeCamp.com\">FreeCodeCamp.com</a> account, you should also check your blog’s dashboard for alerts to these changes. Your continued use of this site after any change in this Privacy Policy will constitute your acceptance of such change.</p>\n            <p>This privacy policy is adopted from the Automattic (Free Code Camp) <a href='https://github.com/Free Code Camp/legalmattic'>open source terms</a> and are subject to the <a href='http://creativecommons.org/licenses/by-sa/4.0/'> Creative Commons Attribution-ShareAlike 4.0 International license</a>. We thank them for making this available.</p>\n"
  },
  {
    "path": "server/views/resources/progress.jade",
    "content": "extends ../layout\nblock content\n  style.\n    tr:nth-child(even){background-color: #FAEBD7;}\n    tr:nth-child(odd){background-color: white;}\n    th,td{padding:5px;text-align:center;}\n  .row(ng-app='app')\n    p.text-center\n      |  江湖传言：“江左梅郎，麒麟之才，得之可得天下。”\n    p.text-center\n      |  如今，优秀的js工程师就是江左梅郎，就是企业梦寐以求的麒麟之才。\n    p.text-center\n      |  琅琊榜的规则：绝不允许抄袭，一旦发现，立即取消获得的证书。\n    p.text-center\n      |  迄今已经取消3人证书，请各位做项目过程中独立思考，不要copy示例代码或他人代码。\n    p.text-center\n      |  如果遇到困难无法解决，可先行从学习路径跳过。\n    p.text-center\n      |  证书是对学习成绩优秀的同学的奖励，而不是成为某些人的目的。\n    p.text-center\n      |  再次提醒：一旦涉及抄袭，立即取消证书，永不恢复，拒绝协商。\n    p.text-center\n      比赛已经于2016年7月2日21:00结束，获奖名单请移步：\n      a(href='https://github.com/freecodecampchina/freecodecamp.cn/wiki/bingo' target='_blank')  wiki\n    #left.col-md-4.col-sm-12.col-xs-12\n      h4.text-center 专业组排行榜\n      table(ng-controller='left')\n        tr\n          th 排名\n          th 用户名\n          th 头像\n          th 基础分\n          th 项目分\n          th 总分\n        tr(ng-repeat=\"item in items | orderBy:'-totalScore' \")\n          td(ng-bind='$index+1')\n          td(ng-bind='item.username')\n          td\n            img(ng-src='{{item.picture}}', width='64px')\n          td(ng-bind='item.score')\n          td(ng-bind='item.projectScore')\n          td(ng-bind='item.totalScore = item.score + item.projectScore')\n    #center.col-md-4.col-sm-12.col-xs-12\n      h4.text-center 业余组排行榜\n      table(ng-controller='center')\n        tr\n          th 排名\n          th 用户名\n          th 头像\n          th 基础分\n          th 项目分\n          th 总分\n        tr(ng-repeat=\"item in items | orderBy:'-totalScore' \")\n          td(ng-bind='$index+1')\n          td(ng-bind='item.username')\n          td\n            img(ng-src='{{item.picture}}', width='64px')\n          td(ng-bind='item.score')\n          td(ng-bind='item.projectScore')\n          td(ng-bind='item.totalScore = item.score + item.projectScore')\n    #right.col-md-4.col-sm-12.col-xs-12\n      h4.text-center 程序媛新秀组排行榜\n      table(ng-controller='right')\n        tr\n          th 排名\n          th 用户名\n          th 头像\n          th 基础分\n          th 项目分\n          th 总分\n        tr(ng-repeat=\"item in items | orderBy:'-totalScore' \")\n          td(ng-bind='$index+1')\n          td(ng-bind='item.username')\n          td\n            img(ng-src='{{item.picture}}', width='64px')\n          td(ng-bind='item.score')\n          td(ng-bind='item.projectScore')\n          td(ng-bind='item.totalScore = item.score + item.projectScore')\n  script(src='/js/angular.min.js')\n  script.\n    var project1 = ['bd7158d8c442eddfbeb5bd1f','bd7158d8c442eddfaeb5bd18','bd7158d8c242eddfaeb5bd13','bd7158d8c242eddfaeb5be13'];\n    var project2 = ['bd7158d8c442eddfaeb5bd13','bd7158d8c442eddfaeb5bd10','bd7158d8c442eddfaeb5bd19','bd7158d8c442eddfaeb5bd1f','bd7168d8c242eddfaeb5bd13','bd7178d8c242eddfaeb5bd13','bd7188d8c242eddfaeb5bd13','bd7198d8c242eddfaeb5bd13','bd7108d8c242eddfaeb5bd13'];\n    var project3 = ['bd7158d8c442eddfaeb5bd17','bd7158d8c442eddfaeb5bd0f','bd7158d8c442eedfaeb5bd1c','bd7158d8c442eddfaeb5bd1c','bd7157d8c242eddfaeb5bd13','bd7156d8c242eddfaeb5bd13','bd7155d8c242eddfaeb5bd13','bd7154d8c242eddfaeb5bd13','bd7153d8c242eddfaeb5bd13'];\n    var app = angular.module('app',[]);\n    app.controller('left',['$scope','$http', function($scope,$http){\n      $http.get('/master').then(function(res){\n        var out = res.data;\n        for(var i=0;i<out.length;i++){\n          for(var j=0;j<out[i].progressTimestamps.length;j++){\n            if(out[i].progressTimestamps[j].hasOwnProperty('completedChallenge')){\n              for(var k=0;k<4;k++){\n                if(out[i].progressTimestamps[j].completedChallenge == project1[k]){\n                  out[i].projectScore +=20;\n                  out[i].score -=1;\n                }\n                if(out[i].progressTimestamps[j].completedChallenge == project2[k]){\n                  out[i].projectScore +=30;\n                  out[i].score -=1;\n                }\n                if(out[i].progressTimestamps[j].completedChallenge == project3[k]){\n                  console.log(project3[k]);\n                  out[i].projectScore +=40;\n                  out[i].score -=1;\n                }\n              }\n            }\n          }\n        }\n        $scope.items = out;\n      },function(err){\n        console.log(err);\n      })\n    }]);\n    app.controller('center',['$scope','$http', function($scope,$http){\n      $http.get('/newer').then(function(res){\n        var out = res.data;\n        for(var i=0;i<out.length;i++){\n          for(var j=0;j<out[i].progressTimestamps.length;j++){\n            if(out[i].progressTimestamps[j].hasOwnProperty('completedChallenge')){\n              for(var k=0;k<4;k++){\n                if(out[i].progressTimestamps[j].completedChallenge == project1[k]){\n                  out[i].projectScore +=20;\n                  out[i].score -=1;\n                }\n                if(out[i].progressTimestamps[j].completedChallenge == project2[k]){\n                  out[i].projectScore +=30;\n                  out[i].score -=1;\n                }\n                if(out[i].progressTimestamps[j].completedChallenge == project3[k]){\n                  out[i].projectScore +=40;\n                  out[i].score -=1;\n                }\n              }\n            }\n          }\n        }\n        $scope.items = out;\n      },function(err){\n        console.log(err);\n      })\n    }])\n    app.controller('right',['$scope','$http', function($scope,$http){\n      $http.get('/women').then(function(res){\n        var out = res.data;\n        for(var i=0;i<out.length;i++){\n          for(var j=0;j<out[i].progressTimestamps.length;j++){\n            if(out[i].progressTimestamps[j].hasOwnProperty('completedChallenge')){\n              for(var k=0;k<4;k++){\n                if(out[i].progressTimestamps[j].completedChallenge == project1[k]){\n                  out[i].projectScore +=20;\n                  out[i].score -=1;\n                }\n                if(out[i].progressTimestamps[j].completedChallenge == project2[k]){\n                  out[i].projectScore +=30;\n                  out[i].score -=1;\n                }\n                if(out[i].progressTimestamps[j].completedChallenge == project3[k]){\n                  out[i].projectScore +=40;\n                  out[i].score -=1;\n                }\n              }\n            }\n          }\n        }\n        $scope.items = out;\n      },function(err){\n        console.log(err);\n      })\n    }])\n"
  },
  {
    "path": "server/views/resources/shop.jade",
    "content": "extends ../layout\nblock content\n    h1.text-center Shop\n    hr\n    .row\n        .col-xs-12.col-sm-8.col-sm-offset-2.col-md-6.col-md-offset-3.text-center\n            img.img-responsive.img-center(src='//i.imgur.com/MH1CvwY.jpg')\n            h3 Free Code Camp laptop stickers are here!\n            h4 Get two for only $5, with free shipping anywhere!\n            p These durable 2\" (5 cm) stickers sport a matte finish, and look great anywhere - especially on your laptop.\n            html.\n                <form action=\"https://www.paypal.com/cgi-bin/webscr\" method=\"post\" target=\"_top\">\n                <input type=\"hidden\" name=\"cmd\" value=\"_s-xclick\">\n                <input type=\"hidden\" name=\"hosted_button_id\" value=\"R9AGYKJUCU37N\">\n                <input type=\"image\" src=\"https://www.paypalobjects.com/en_US/i/btn/btn_buynowCC_LG.gif\" border=\"0\" name=\"submit\" alt=\"PayPal - The safer, easier way to pay online!\">\n                <img alt=\"\" border=\"0\" src=\"https://www.paypalobjects.com/en_US/i/scr/pixel.gif\" width=\"1\" height=\"1\">\n                </form>\n"
  },
  {
    "path": "server/views/resources/sitemap.jade",
    "content": "doctype xml\nurlset(xmlns=\"http://www.sitemaps.org/schemas/sitemap/0.9\")\n\n  url\n    loc http://www.freecodecamp.com/\n    changefreq weekly\n    lastmod= now\n    priority= 0.9\n\n  url\n    loc http://www.freecodecamp.com/nonprofits\n    changefreq weekly\n    lastmod= now\n    priority= 0.9\n\n  url\n    loc http://www.freecodecamp.com/pmi-acp-agile-project-managers\n    changefreq weekly\n    lastmod= now\n    priority= 0.9\n\n  url\n    loc http://www.freecodecamp.com/map\n    changefreq weekly\n    lastmod= now\n    priority= 0.9\n\n  url\n    loc http://www.freecodecamp.com/labs\n    changefreq weekly\n    lastmod= now\n    priority= 0.9\n\n  url\n    loc http://www.freecodecamp.com/stories\n    changefreq weekly\n    lastmod= now\n    priority= 0.9\n\n  url\n    loc http://www.freecodecamp.com/jobs\n    changefreq weekly\n    lastmod= now\n    priority= 0.9\n\n  url\n    loc http://www.freecodecamp.com/coding-bootcamp-cost-calculator\n    changefreq monthly\n    lastmod= now\n    priority= 0.9\n\n  //- User\n  each user in users\n    url\n      loc #{appUrl}/#{user}\n      lastmod= now\n      changefreq weekly\n      priority= 0.5\n\n  each challenge in challenges\n    url\n      loc #{appUrl}/challenges/#{challenge.replace(/\\s/g, '-')}\n      lastmod= now\n      changefreq weekly\n      priority= 0.9\n\n  each story in stories\n    url\n      loc #{appUrl}/news/#{story.replace(/\\s/g, '-')}\n      lastmod= now\n      changefreq weekly\n      priority= 0.5\n"
  },
  {
    "path": "server/views/resources/stories.jade",
    "content": "extends ../layout\nblock content\n    h1.text-center 学员感受\n    hr\n    .row\n        .col-xs-12.col-sm-10.col-sm-offset-1\n            .row\n                for story in stories\n                    .col-xs-12.col-sm-6.col-md-4\n                        .height-500\n                            a(href=story.linkedin target='_blank')\n                                img.testimonial-image.img-responsive.img-center(src=story.image)\n                            h3.text-center= story.camper\n                                | &nbsp;\n                                if story.linkedin\n                                  a.fa.fa-linkedin-square.text-primary(alt=\"#{story.camper}'s LinkedIn Profile\", href=story.linkedin, target='_blank')\n                                else\n                                  a.fa.fa-github-square.text-primary(alt=\"#{story.camper}'s GitHub Profile\", href=story.github, target='_blank')\n                            p.small-p.text-justify= story.quote\n            .col-xs-12.col-sm-10.col-sm-offset-1\n                    if moreStories\n                        .text-center\n                            a.btn.btn-lg.btn-primary.btn-primary-ghost.btn-block(href=\"/all-stories\") 查看更多\n                    .spacer\n\n                    if !user\n                        .text-center\n                            a.btn.btn-cta.signup-btn.btn-block(href=\"/login\") 准备好了，Go!\n"
  },
  {
    "path": "server/views/resources/terms-of-service.jade",
    "content": "extends ../layout\nblock content\n    .col-xs-12.col-sm-8.col-sm-offset-2.col-md-6.col-md-offset-3\n        html.\n            <h2 class='text-center'><a id=\"Terms_of_Service_0\"></a>Terms of Service</h3>\n            <hr>\n            <h3><a id=\"The_gist_2\"></a>The gist:</h3>\n            <p>We (the <a href=\"http://FreeCodeCamp.com/about/\">folks that run Free Code Camp's open source community</a>) would <strong>love</strong> for you to use it. Our community is free, and our service is designed to give you as much control and ownership over the code you write as possible, and encourage you to express yourself freely. However, be responsible in what you publish. In particular, make sure that none of the prohibited items (like spam, viruses, or serious threats of violence) appear on your website. If you find anything on Free Code Camp that you believe violates these Terms of Service, please email us at <a mailto=\"team@freecodecamp.com\">team@freecodecamp.com</a></p>\n            <h3><a id=\"Terms_of_Service_10\"></a>Terms of Service:</h3>\n            <p>The following terms and conditions govern all use of the <a href=\"http://FreeCodeCamp.com\">FreeCodeCamp.com</a> website and all content, services, and products available at or through the website - taken together, our Services. Our Services are offered subject to your acceptance without modification of all of the terms and conditions contained herein and all other operating rules, policies (including, without limitation, <a href=\"http://freecodecamp.com/privacy/\">Free Code Camp's Privacy Policy</a>) and procedures that may be published from time to time by Free Code Camp (collectively, the “Agreement”). You agree that we may automatically upgrade our Services, and these terms will apply to any upgrades. Your agreement is with Free Code Camp Inc. Please read this Agreement carefully before accessing or using our Services. By accessing or using any part of our services, you agree to become bound by the terms and conditions of this agreement. If you do not agree to all the terms and conditions of this agreement, then you may not access or use any of our services. If these terms and conditions are considered an offer by Free Code Camp, acceptance is expressly limited to these terms. Our Services are not directed to children younger than 13, and access and use of our Services is only offered to users 13 years of age or older. If you are under 13 years old, please do not register to use our Services. Any person who registers as a user or provides their personal information to our Services represents that they are 13 years of age or older. Use of some aspects of our Services may require a <a href=\"http://FreeCodeCamp.com\">FreeCodeCamp.com</a> account. You agree to provide us with complete and accurate information when you register for an account. You will be solely responsible and liable for any activity that occurs under your username. You are responsible for keeping your password secure.</p>\n            <h4>1. <a href=\"http://FreeCodeCamp.com\">FreeCodeCamp.com</a>.</h4>\n            <ul>\n            <li><strong>Your <a href=\"http://FreeCodeCamp.com\">FreeCodeCamp.com</a> Account and Website.</strong> If you create a website on <a href=\"http://FreeCodeCamp.com\">FreeCodeCamp.com</a>, you are responsible for maintaining the security of your account and website, and you are fully responsible for all activities that occur under the account and any other actions taken in connection with the website. You must immediately notify Free Code Camp of any unauthorized uses of your website, your account, or any other breaches of security. Free Code Camp will not be liable for any acts or omissions by you, including any damages of any kind incurred as a result of such acts or omissions.</li>\n            <li><strong>Responsibility of Contributors.</strong> If you operate a website, comment on a website, post material to <a href=\"http://FreeCodeCamp.com\">FreeCodeCamp.com</a>, post links on <a href=\"http://FreeCodeCamp.com\">FreeCodeCamp.com</a>, or otherwise make (or allow any third party to make) material available (any such material, “Content”), you are entirely responsible for the content of, and any harm resulting from, that Content or your conduct. That is the case regardless of what form the Content takes, which includes, but is not limited to text, photo, video, audio, or code. By using <a href=\"http://FreeCodeCamp.com\">FreeCodeCamp.com</a>, you represent and warrant that your Content and conduct do not violate these terms or the <a href=\"http://FreeCodeCamp.com/code-of-conduct/\">Code of Conduct</a>. By submitting Content to Free Code Camp for inclusion on your website, you grant Free Code Camp a world-wide, royalty-free, and non-exclusive license to reproduce, modify, adapt and publish the Content solely for the purpose of displaying, distributing, and promoting your website. This license allows Free Code Camp to make publicly-posted content available to third parties selected by Free Code Camp (through the Free Code Camp Firehose, for example) so that these third parties can analyze and distribute (but not publicly display) your content through their services. You also give other <a href=\"http://FreeCodeCamp.com\">FreeCodeCamp.com</a> users permission to share your Content on other <a href=\"http://FreeCodeCamp.com\">FreeCodeCamp.com</a> websites and add their own Content to it (aka to reblog your Content), so long as they use only a portion of your post and they give you credit as the original author by linking back to your website. If you delete Content, Free Code Camp will use reasonable efforts to remove it from <a href=\"http://FreeCodeCamp.com\">FreeCodeCamp.com</a>, but you acknowledge that caching or references to the Content may not be made immediately unavailable. Without limiting any of those representations or warranties, Free Code Camp has the right (though not the obligation) to, in Free Code Camp’s sole discretion, (i) refuse or remove any content that, in Free Code Camp’s reasonable opinion, violates any Free Code Camp policy or is in any way harmful or objectionable, or (ii) terminate or deny access to and use of <a href=\"http://FreeCodeCamp.com\">FreeCodeCamp.com</a> to any individual or entity for any reason. Free Code Camp will have no obligation to provide a refund of any amounts previously paid.</li>\n            <li><strong>Attribution.</strong> Free Code Camp reserves the right to display attribution links such as ‘Website at <a href=\"http://FreeCodeCamp.com\">FreeCodeCamp.com</a>,’ theme author, and font attribution in your website footer or toolbar.</li>\n            </ul>\n            <h4><a id=\"4_Responsibility_of_Visitors_49\"></a>4. Responsibility of Visitors.</h4>\n            <p>Free Code Camp has not reviewed, and cannot review, all of the material, including computer software, posted to our Services, and cannot therefore be responsible for that material’s content, use or effects. By operating our Services, Free Code Camp does not represent or imply that it endorses the material there posted, or that it believes such material to be accurate, useful, or non-harmful. You are responsible for taking precautions as necessary to protect yourself and your computer systems from viruses, worms, Trojan horses, and other harmful or destructive content. Our Services may contain content that is offensive, indecent, or otherwise objectionable, as well as content containing technical inaccuracies, typographical mistakes, and other errors. Our Services may also contain material that violates the privacy or publicity rights, or infringes the intellectual property and other proprietary rights, of third parties, or the downloading, copying or use of which is subject to additional terms and conditions, stated or unstated. Free Code Camp disclaims any responsibility for any harm resulting from the use by visitors of our Services, or from any downloading by those visitors of content there posted.</p>\n            <h4><a id=\"5_Content_Posted_on_Other_Websites_53\"></a>5. Content Posted on Other Websites.</h4>\n            <p>We have not reviewed, and cannot review, all of the material, including computer software, made available through the websites and webpages to which <a href=\"http://FreeCodeCamp.com\">FreeCodeCamp.com</a> links, and that link to <a href=\"http://FreeCodeCamp.com\">FreeCodeCamp.com</a>. Free Code Camp does not have any control over those non-FreeCodeCamp.com websites, and is not responsible for their contents or their use. By linking to a non-FreeCodeCamp.com website, Free Code Camp does not represent or imply that it endorses such website. You are responsible for taking precautions as necessary to protect yourself and your computer systems from viruses, worms, Trojan horses, and other harmful or destructive content. Free Code Camp disclaims any responsibility for any harm resulting from your use of non-FreeCodeCamp.com websites and webpages.</p>\n            <h4><a id=\"6_Copyright_Infringement_and_DMCA_Policy_57\"></a>6. Copyright Infringement and DMCA Policy.</h4>\n            <p>As Free Code Camp asks others to respect its intellectual property rights, it respects the intellectual property rights of others. If you believe that material located on or linked to by <a href=\"http://FreeCodeCamp.com\">FreeCodeCamp.com</a> violates your copyright, you are encouraged to notify Free Code Camp in accordance with <a href=\"http://FreeCodeCamp.com/dmca-notice/\">Free Code Camp’s Digital Millennium Copyright Act (“DMCA”) Policy</a>. Free Code Camp will respond to all such notices, including as required or appropriate by removing the infringing material or disabling all links to the infringing material. Free Code Camp will terminate a visitor’s access to and use of the Website if, under appropriate circumstances, the visitor is determined to be a repeat infringer of the copyrights or other intellectual property rights of Free Code Camp or others.</p>\n            <h4><a id=\"7_Intellectual_Property_61\"></a>7. Intellectual Property.</h4>\n            <p>This Agreement does not transfer from Free Code Camp to you any Free Code Camp or third party intellectual property, and all right, title, and interest in and to such property will remain (as between the parties) solely with Free Code Camp. Free Code Camp, <a href=\"http://FreeCodeCamp.com\">FreeCodeCamp.com</a>, the <a href=\"http://FreeCodeCamp.com\">FreeCodeCamp.com</a> logo, and all other trademarks, service marks, graphics and logos used in connection with <a href=\"http://FreeCodeCamp.com\">FreeCodeCamp.com</a> or our Services, are trademarks or registered trademarks of Free Code Camp or Free Code Camp’s licensors. Other trademarks, service marks, graphics and logos used in connection with our Services may be the trademarks of other third parties. Your use of our Services grants you no right or license to reproduce or otherwise use any Free Code Camp or third-party trademarks.</p>\n            <h4><a id=\"10_Changes_73\"></a>10. Changes.</h4>\n            <p>We are constantly updating our Services, and that means sometimes we have to change the legal terms under which our Services are offered. If we make changes that are material, we will let you know by posting on one of our websites, or by sending you an email or other communication before the changes take effect. The notice will designate a reasonable period of time after which the new terms will take effect. If you disagree with our changes, then you should stop using our Services within the designated notice period. Your continued use of our Services will be subject to the new terms. However, any dispute that arose before the changes shall be governed by the Terms (including the binding individual arbitration clause) that were in place when the dispute arose.</p>\n            <h4><a id=\"11_Termination_77\"></a>11. Termination.</h4>\n            <p>Free Code Camp may terminate your access to all or any part of our Services at any time, with or without cause, with or without notice, effective immediately. If you wish to terminate this Agreement or your <a href=\"http://FreeCodeCamp.com\">FreeCodeCamp.com</a> account (if you have one), you may simply discontinue using our Services. All provisions of this Agreement which by their nature should survive termination shall survive termination, including, without limitation, ownership provisions, warranty disclaimers, indemnity and limitations of liability.</p>\n            <h4><a id=\"12_Disclaimer_of_Warranties_81\"></a>12. Disclaimer of Warranties.</h4>\n            <p>Our Services are provided “as is.” Free Code Camp and its suppliers and licensors hereby disclaim all warranties of any kind, express or implied, including, without limitation, the warranties of merchantability, fitness for a particular purpose and non-infringement. Neither Free Code Camp nor its suppliers and licensors, makes any warranty that our Services will be error free or that access thereto will be continuous or uninterrupted. If you’re actually reading this, we praise your diligence and concern. We'd be better off as a civilization if more people cared like you do. You understand that you download from, or otherwise obtain content or services through, our Services at your own discretion and risk.</p>\n            <h4><a id=\"13_Limitation_of_Liability_85\"></a>13. Limitation of Liability.</h4>\n            <p>In no event will Free Code Camp, or its suppliers or licensors, be liable with respect to any subject matter of this Agreement under any contract, negligence, strict liability or other legal or equitable theory for: (i) any special, incidental or consequential damages; (ii) the cost of procurement for substitute products or services; (iii) for interruption of use or loss or corruption of data; or (iv) for any amounts that exceed the fees paid by you to Free Code Camp under this agreement during the twelve (12) month period prior to the cause of action. Free Code Camp shall have no liability for any failure or delay due to matters beyond their reasonable control. The foregoing shall not apply to the extent prohibited by applicable law.</p>\n            <h4><a id=\"14_General_Representation_and_Warranty_89\"></a>14. General Representation and Warranty.</h4>\n            <p>You represent and warrant that (i) your use of our Services will be in strict accordance with the Free Code Camp Privacy Policy, with this Agreement, and with all applicable laws and regulations (including without limitation any local laws or regulations in your country, state, city, or other governmental area, regarding online conduct and acceptable content, and including all applicable laws regarding the transmission of technical data exported from the United States or the country in which you reside) and (ii) your use of our Services will not infringe or misappropriate the intellectual property rights of any third party.</p>\n            <h4><a id=\"15_US_Economic_Sanctions_93\"></a>15. US Economic Sanctions.</h4>\n            <p>You expressly represent and warrant that your use of our Services and or associated services and products is not contrary to applicable U.S. Sanctions. Such use is prohibited, and Free Code Camp reserve the right to terminate accounts or access of those in the event of a breach of this condition.</p>\n            <h4><a id=\"16_Indemnification_97\"></a>16. Indemnification.</h4>\n            <p>You agree to indemnify and hold harmless Free Code Camp, its contractors, and its licensors, and their respective directors, officers, employees, and agents from and against any and all claims and expenses, including attorneys’ fees, arising out of your use of our Services, including but not limited to your violation of this Agreement.</p>\n            <h4><a id=\"17_Translation_101\"></a>17. Translation.</h4>\n            <p>These Terms of Service were originally written in English (US). We may translate these terms into other languages. In the event of a conflict between a translated version of these Terms of Service and the English version, the English version will control.</p>\n            <h4><a id=\"18_Miscellaneous_105\"></a>18. Miscellaneous.</h4>\n            <p>This Agreement constitutes the entire agreement between Free Code Camp and you concerning the subject matter hereof, and they may only be modified by a written amendment signed by an authorized executive of Free Code Camp, or by the posting by Free Code Camp of a revised version. Except to the extent applicable law, if any, provides otherwise, this Agreement, any access to or use of our Services will be governed by the laws of the state of California, U.S.A., excluding its conflict of law provisions, and the proper venue for any disputes arising out of or relating to any of the same will be the state and federal courts located in San Francisco County, California. Except for claims for injunctive or equitable relief or claims regarding intellectual property rights (which may be brought in any competent court without the posting of a bond), any dispute arising under this Agreement shall be finally settled in accordance with the Comprehensive Arbitration Rules of the Judicial Arbitration and Mediation Service, Inc. (“JAMS”) by three arbitrators appointed in accordance with such Rules. The arbitration shall take place in San Francisco, California, in the English language and the arbitral decision may be enforced in any court. The prevailing party in any action or proceeding to enforce this Agreement shall be entitled to costs and attorneys’ fees. If any part of this Agreement is held invalid or unenforceable, that part will be construed to reflect the parties’ original intent, and the remaining portions will remain in full force and effect. A waiver by either party of any term or condition of this Agreement or any breach thereof, in any one instance, will not waive such term or condition or any subsequent breach thereof. You may assign your rights under this Agreement to any party that consents to, and agrees to be bound by, its terms and conditions; Free Code Camp may assign its rights under this Agreement without condition. This Agreement will be binding upon and will inure to the benefit of the parties, their successors and permitted assigns.</p>\n            <p>These terms are adopted from the Automattic (WordPress) <a href='https://github.com/Automattic/legalmattic'>open source terms</a> and are subject to the <a href='http://creativecommons.org/licenses/by-sa/4.0/'> Creative Commons Attribution-ShareAlike 4.0 International license</a>. We thank them for making this available.</p>\n"
  },
  {
    "path": "server/views/resources/test.css",
    "content": ".themeCustom a.link:link, .themeCustom a.link:visited, .themeCustom a:link, .themeCustom a:visited {\n    color: #0066cc;\n}\n\n.themeCustom .sh_header_search .well {\n    background: #dedede;\n}\n\n.themeCustom .sh_header_search .header_wrapper {\n    border-bottom-color: #cccccc;\n}\n\n.themeCustom .column-left {\n    background-color: #dedede;\n}\n\n.themeCustom .column-left .filters .handle {\n    background-color: #dedede;\n}\n\n.themeCustom .column-left .filters .handle:hover {\n    background-color: #cccccc;\n}\n\n.themeCustom .column-left .recent_searches, .themeCustom .column-left .search_tools, .themeCustom .column-left .search_links, .themeCustom .column-left .sort_jobs {\n    border-top-color: #dedede;\n}\n\n.themeCustom #search_title .text-highlight {\n    color: #444444;\n}\n\n.themeCustom .inline-filters {\n    background: #dedede;\n}\n\n.themeCustom input[type=radio]:checked + label > span, .themeCustom .sort_jobs input[type=radio]:checked + label > span, .themeCustom .social-network-logins input[type=radio]:checked + label > span {\n    background-color: #444444;\n    border-color: #444444;\n}\n\n.themeCustom .filters .filter ul li a, .themeCustom #c_expired a, .themeCustom .result a, .themeCustom .expand_search a, .themeCustom .simplyhired-intl a, .themeCustom .filters .filter ul li a:visited, .themeCustom #c_expired a:visited, .themeCustom .result a:visited, .themeCustom .expand_search a:visited, .themeCustom .simplyhired-intl a:visited, .themeCustom .job h2 {\n    color: #0066cc;}\n\n.sh.theme-base .btn-sh2 {\n    background-color: #999999;\n}\n\n.sh.theme-base .sh_header_search .skin-search-promo .btn-large{\n    background-color: #999999;\n    background-image: none;\n}\n\n.sh .job .new {\n    background-color: #999999;\n    background-image: none;\n}\n\n.sh .job .partner-exclusive {\n    background-color: #F15A22;\n}\n"
  },
  {
    "path": "server/views/resources/the-fastest-web-page-on-the-internet.jade",
    "content": "h1 This is the fastest web page on the internet.\nh2 This is raw HTML with no CSS and no JavaScript.\nh2 This is served to you lightning fast from the cloud using Node.js and NGINX.\nh2 Unfortunately, this doesn't do anything.\nh2 I guess speed isn't everything, after all.\nh2\n    a(href='/') Learn to code more useful websites than this one\n"
  },
  {
    "path": "server/views/resources/unsubscribed.jade",
    "content": "extends ../layout\nblock content\n    .panel.panel-info\n        .panel-body.text-center\n            h1 You have successfully been unsubscribed.\n            h2 Whatever you do, keep coding! :)\n"
  },
  {
    "path": "server/views/sponsors/sponsors.html",
    "content": ""
  },
  {
    "path": "server/views/sponsors/sponsors.jade",
    "content": "extends ../layout\nblock content\n    script.\n    .panel.panel-info\n        .panel-heading.text-center\n            h1 These Sponsors make Free Code Camp possible\n        .panel-body\n            img.img-responsive.img-center.border-radius-5(src='/images/wide-social-banner.png')\n            .spacer\n            .row\n                .col-xs-12.col-md-10.col-md-offset-1\n                    h1 Interested in becoming a sponsor? Call us any time at +1 888-888-8888\n                    .spacer\n            h1.text-center Platinum Sponsors\n            .row\n                .col-xs-6\n                    img.img-responsive.img-center(src='http://placekitten.com/200/300')\n                    .col-xs-12.col-sm-10.col-md-8.col-sm-offset-1.col-md-offset-2.negative-35\n                        h3\n                            a(href='#' target='_blank') Name of Company\n                        p.large-p Sagittis 9 lives climb the curtains lady tincidunt sleep on your face odd consequat lobortis erat eu? Malesuada eros, ac facilisis waffles reddit cute id together lacinia lived faucibus! Sed, sleeping watched diam cat ut mercedes litora? Meet cute aptent lacinia, eu likes quam neighbors tincidunt scelerisque quis loves she.\n                .col-xs-6\n                    img.img-responsive.img-center(src='http://placekitten.com/200/300')\n                    .col-xs-12.col-sm-10.col-md-8.col-sm-offset-1.col-md-offset-2.negative-35\n                        h3\n                            a(href='#' target='_blank') Name of Company\n                        p.large-p Sagittis 9 lives climb the curtains lady tincidunt sleep on your face odd consequat lobortis erat eu? Malesuada eros, ac facilisis waffles reddit cute id together lacinia lived faucibus! Sed, sleeping watched diam cat ut mercedes litora? Meet cute aptent lacinia, eu likes quam neighbors tincidunt scelerisque quis loves she.\n\n            h1.text-center Gold Sponsors\n            .row\n                .col-xs-4\n                    img.img-responsive.img-center(src='http://placekitten.com/200/300')\n                    .col-xs-12.col-sm-10.col-sm-offset-1.negative-35\n                        h3\n                            a(href='#' target='_blank') Name of Company\n                        p.large-p Sagittis 9 lives climb the curtains lady tincidunt sleep on your face odd consequat lobortis erat eu? Malesuada eros, ac facilisis waffles reddit cute id together lacinia lived faucibus! Sed, sleeping watched diam cat ut mercedes litora? Meet cute aptent lacinia, eu likes quam neighbors tincidunt scelerisque quis loves she.\n                .col-xs-4\n                    img.img-responsive.img-center(src='http://placekitten.com/200/300')\n                    .col-xs-12.col-sm-10.col-sm-offset-1.negative-35\n                        h3\n                            a(href='#' target='_blank') Name of Company\n                        p.large-p Sagittis 9 lives climb the curtains lady tincidunt sleep on your face odd consequat lobortis erat eu? Malesuada eros, ac facilisis waffles reddit cute id together lacinia lived faucibus! Sed, sleeping watched diam cat ut mercedes litora? Meet cute aptent lacinia, eu likes quam neighbors tincidunt scelerisque quis loves she.\n                .col-xs-4\n                    img.img-responsive.img-center(src='http://placekitten.com/200/300')\n                    .col-xs-12.col-sm-10.col-sm-offset-1.negative-35\n                        h3\n                            a(href='#' target='_blank') Name of Company\n                        p.large-p Sagittis 9 lives climb the curtains lady tincidunt sleep on your face odd consequat lobortis erat eu? Malesuada eros, ac facilisis waffles reddit cute id together lacinia lived faucibus! Sed, sleeping watched diam cat ut mercedes litora? Meet cute aptent lacinia, eu likes quam neighbors tincidunt scelerisque quis loves she.\n\n            h1.text-center Silver Sponsors\n            .row\n                .col-xs-2\n                    img.img-responsive.img-center(src='http://placekitten.com/200/300')\n                .col-xs-2\n                    img.img-responsive.img-center(src='http://placekitten.com/200/300')\n                .col-xs-2\n                    img.img-responsive.img-center(src='http://placekitten.com/200/300')\n                .col-xs-2\n                    img.img-responsive.img-center(src='http://placekitten.com/200/300')\n                .col-xs-2\n                    img.img-responsive.img-center(src='http://placekitten.com/200/300')\n                .col-xs-2\n                    img.img-responsive.img-center(src='http://placekitten.com/200/300')\n                .col-xs-2\n                    img.img-responsive.img-center(src='http://placekitten.com/200/300')\n                .col-xs-2\n                    img.img-responsive.img-center(src='http://placekitten.com/200/300')\n                .col-xs-2\n                    img.img-responsive.img-center(src='http://placekitten.com/200/300')\n                .col-xs-2\n                    img.img-responsive.img-center(src='http://placekitten.com/200/300')\n                .col-xs-2\n                    img.img-responsive.img-center(src='http://placekitten.com/200/300')\n                .col-xs-2\n                    img.img-responsive.img-center(src='http://placekitten.com/200/300')\n"
  },
  {
    "path": "server/views/stories/hot-stories.jade",
    "content": ".spacer\n.spacer\n#story-list.story-list\n    script.\n        var getLinkedName = function getLinkedName(name) {\n            return name.trim().toLowerCase().replace(/\\s/g, '-');\n        }\n        $.ajax({\n            url: '/news/hot',\n            type: 'GET'\n        })\n                .success(\n                function(data) {\n                    for (var i = 0; i < data.length; i++) {\n                        var div  = document.createElement('div');\n                        var linkedName = getLinkedName(data[i].storyLink);\n                        var rank = data[i].rank;\n                        var alreadyUpvoted = false;\n                        if (typeof username !== 'undefined') {\n                          alreadyUpvoted = data[i].upVotes.some(function(vote) {\n                            return vote.upVotedByUsername === username\n                          });\n                        }\n\n                        $(div)\n                        .html(\n                            \"<div class='visible-xs row'>\" +\n                                \"<div class='visible-xs col-sm-1 col-md-1'>\" +\n                                    \"<a href='\" + data[i].link + \"'>\" +\n                                        \"<img class='mobile-story-image img-responsive' src='\" + (!!data[i].image ? data[i].image : data[i].author.picture) + \"'/>\" +\n                                    \"</a>\" +\n                                \"</div>\" +\n                                \"<div class='col-xs-12 mobile-story-headline text-center'>\" +\n                                    \"<a href='\" + data[i].link + \"' target='_blank'>\" +\n                                        data[i].headline +\n                                    \"</a>\" +\n                                \"</div>\" +\n                                \"<div class='col-xs-12 text-center'>\" +\n                                    rank + (rank > 1 ? \" points\" : \" point\") + \" · posted \" +\n                                    moment(data[i].timePosted).fromNow() +\n                                    \" by <a href='/\" + data[i].author.username + \"'>@\" + data[i].author.username + \"</a> \" +\n                                \"</div>\" +\n                                \"<div class='col-xs-12'>\" +\n                                  \"<br>\" +\n                                  (typeof username !== 'undefined' ?\n                                    \"<button id='\" + data[i].id + \"' class='btn btn-no-shadow btn-primary btn-block btn-primary-ghost btn-upvote'>upvote</button>\" :\n                                    \"<a href='/signin' class='btn btn-no-shadow btn-primary btn-block btn-primary-ghost btn-upvote'>upvote</a>\") +\n                                    \"<a class='btn btn-no-shadow btn-primary btn-block btn-primary-ghost hidden' href='/news/\" + linkedName + \"'>more info</a>\" +\n                                \"</div>\" +\n                            \"</div>\" +\n                            \"<div class='hidden-xs row media-stories'>\" +\n                                \"<div class='media'>\" +\n                                    \"<div class='media-left'>\" +\n                                        \"<a href='/\" + data[i].author.username + \"'>\" +\n                                            \"<img class='img-news' src='\" + data[i].author.picture + \"'/>\" +\n                                        \"</a>\" +\n                                    \"</div>\" +\n                                    \"<h2 class='media-body'>\" +\n                                        \"<div class='media-body-wrapper'>\" +\n                                            \"<div class='story-headline'>\" +\n                                                \"<a href='\" + data[i].link + \"' target='_blank'>\" +\n                                                    data[i].headline +\n                                                \"</a>\" +\n                                            \"</div>\" +\n                                            \"<div class='story-byline col-xs-12 wrappable'>\" +\n                                                (typeof username !== 'undefined' ?\n                                                  \"<button id='\" + data[i].id + \"' class='btn btn-no-shadow btn-primary btn-xs btn-primary-ghost btn-upvote'>upvote</button>\" :\n                                                  \"<a href='/signin' class='btn btn-no-shadow btn-primary btn-xs btn-primary-ghost'>upvote</a>\") +\n                                                \"<a class='btn btn-no-shadow btn-primary btn-xs btn-primary-ghost hidden' href='/news/\" + linkedName + \"'>more info</a> &nbsp; \" +\n                                                rank + (rank > 1 ? \" points\" : \" point\") + \" · posted \" +\n                                                moment(data[i].timePosted).fromNow() +\n                                                \" by <a href='/\" + data[i].author.username + \"'>@\" + data[i].author.username + \"</a> \" +\n                                            \"</div>\" +\n                                        \"</div>\" +\n                                    \"</h2>\" +\n                                \"</div>\" +\n                            \"</div>\"\n                        );\n                        $(div).addClass('story-list news-box')\n                        $(div).appendTo($('#story-list'));\n                        $(div).find('.btn-upvote').each(function(idx, btn) {\n                          var $btn = $(btn);\n                          if (alreadyUpvoted) {\n                            $btn.addClass('disabled');\n                            $btn.text('upvoted!');\n                          }\n                          $btn.data('upVotes', data[i].upVotes);\n                        });\n                    }\n                });\n"
  },
  {
    "path": "server/views/stories/index.jade",
    "content": "extends ../layout\nblock content\n    if (user)\n      script.\n        var isLoggedIn = true;\n        var userId = !{JSON.stringify(user.id)};\n        var username = !{JSON.stringify(user.username)};\n    else\n      script.\n        var isLoggedIn = false;\n    script.\n        var challengeName = 'Camper News';\n        var page = !{JSON.stringify(page)};\n    h1.text-center Camper News\n    hr\n    .spacer\n    include news-nav\n    .spacer\n    if (page === 'hot')\n        include hot-stories\n    if (page === 'submit')\n        if (user)\n            include preliminary-submit\n        else\n            .spacer\n            .text-center\n                a.btn.btn-cta.signup-btn.btn-primary(href=\"/login\") Sign in to post your story (it's free)\n            .spacer\n    if (page === 'storySubmission')\n        include submit-story\n    if (page === 'show')\n        include show\n"
  },
  {
    "path": "server/views/stories/news-nav.jade",
    "content": ".row\n    .col-xs-12\n        h2 We are retiring Camper News in favor of our \n            a(href='http://reddit.com/r/freecodecamp') Subreddit\n            | .\n        h3 Thank you to all of the campers who have contributed links over the past year. We will keep Camper News accessible until May. Our \n            a(href='http://reddit.com/r/freecodecamp') Subreddit\n            | &thinsp; is now the best place to share coding-related links.\n    .spacer\n    hr\n    .spacer\n    .col-xs-12.col-sm-3\n        span\n            a.btn.btn-primary.btn-bigger.btn-block.btn-responsive(href='/stories/submit' class=\"#{ page === 'hot' ? '' : 'hidden' }\") Submit a link\n        span\n            a.btn.btn-success.btn-bigger.btn-block.btn-responsive(href='/news/' class=\"#{ (page !== 'hot') ? '' : 'hidden' }\") All\n        .visible-xs\n            .button-spacer\n    .col-xs-12.col-sm-9\n        .input-group\n            input#searchArea.big-text-field.field-responsive.form-control(type='text', placeholder='Search term or @username')\n            span.input-group-btn\n                button#searchbutton.btn.btn-bigger.btn-primary.btn-responsive(type='button') Search\n        .spacer\n\n#search-results\n\n.spacer\n#story-list\n    ul#stories\nscript.\n    $('#searchArea').keypress(function (event) {\n        if (event.keyCode === 13 || event.which === 13) {\n            executeSearch();\n            $('#searchArea').focus();\n            event.preventDefault();\n        }\n    });\n    $('#searchbutton').on('click', function () {\n        executeSearch();\n    });\n    function executeSearch() {\n        $('#stories').empty();\n        var searchTerm = $('#searchArea').val(),\n        url = '/stories/search';\n        if (searchTerm.match(/^\\@\\w+$/)) {\n            url = '/news/userstories';\n            searchTerm = searchTerm.match(/^\\@\\w+$/)[0].split('@')[1];\n        }\n        var getLinkedName = function getLinkedName(name) {\n            return name.toLowerCase().replace(/\\s/g, '-');\n        }\n        $.post(url, { search: searchTerm })\n                .fail(function(xhr, textStatus, errorThrown) {\n                    $('#search-results').empty();\n                    var div = document.createElement(\"div\");\n                    $(div).html(\"<h3 class='text-center text-warning dotted-underline'><em>No Results Found</em></h3>\");\n                    $(div).appendTo($('#search-results'));\n                })\n                .done(function(data, textStatus, xhr) {\n                    $('#search-results').empty();\n                    var spacer = document.createElement('div');\n                    $(spacer).html(\"<div class='spacer'></div>\");\n                    $(spacer).appendTo($('#search-results'));\n                    for (var i = 0; i < data.length; i++) {\n                        var div = document.createElement('div');\n                        var linkedName = getLinkedName(data[i].storyLink);\n                        var rank = data[i].rank;\n                        $(div).html(\n                            \"<div class='visible-xs row'>\" +\n                                \"<div class='visible-xs col-sm-1 col-md-1'>\" +\n                                    \"<a href='\" + data[i].link + \"'>\" +\n                                        \"<img class='mobile-story-image img-responsive' src='\" + (!!data[i].image ? data[i].image : data[i].author.picture) + \"'/>\" +\n                                    \"</a>\" +\n                                \"</div>\" +\n                                \"<div class='col-xs-12 mobile-story-headline text-center'>\" +\n                                    \"<a href='\" + data[i].link + \"' target='_blank'>\" +\n                                        data[i].headline +\n                                    \"</a>\" +\n                                \"</div>\" +\n                                \"<div class='visible-xs'>\" +\n                                    \"<div class='col-xs-12 text-center'>\" +\n                                        rank + (rank > 1 ? \" points\" : \" point\") + \" · posted \" +\n                                        moment(data[i].timePosted).fromNow() +\n                                        \" by \" +\n                                        \"<a href='/\" + data[i].author.username + \"'>@\" + data[i].author.username +\n                                        \"</a> \" +\n                                    \"</div>\" +\n                                    \"<div class='col-xs-12'>\" +\n                                        \"<br>\" +\n                                        \"<a class='btn btn-no-shadow btn-primary btn-block btn-primary-ghost' href='/news/\" + linkedName + \"'>more info</a>\" +\n                                    \"</div>\" +\n                                \"</div>\" +\n                            \"</div>\" +\n                            \"<div class='hidden-xs row media-stories'>\" +\n                                \"<div class='media'>\" +\n                                    \"<div class='media-left'>\" +\n                                        \"<a href='/\" + data[i].author.username + \"'>\" +\n                                            \"<img class='img-news' src='\" + data[i].author.picture + \"'/>\" +\n                                        \"</a>\" +\n                                    \"</div>\" +\n                                    \"<h2 class='media-body'>\" +\n                                        \"<div class='media-body-wrapper'>\" +\n                                            \"<div class='story-headline'>\" +\n                                                \"<a href='\" + data[i].link + \"' target='_blank'>\" +\n                                                    data[i].headline +\n                                                \"</a>\" +\n                                            \"</div>\" +\n                                            \"<div class='story-byline col-xs-12 wrappable'>\" +\n                                                \"<a class='btn btn-no-shadow btn-primary btn-xs btn-primary-ghost' href='/news/\" + linkedName + \"'>more info</a> · \" +\n                                                    rank + (rank > 1 ? \" points\" : \" point\") + \" · posted \" +\n                                                    moment(data[i].timePosted).fromNow() +\n                                                    \" by <a href='/\" + data[i].author.username + \"'>@\" + data[i].author.username +\n                                                \"</a> \" +\n                                            \"</div>\" +\n                                        \"</div>\" +\n                                    \"</h2>\" +\n                                \"</div>\" +\n                            \"</div>\")\n                        $(div).addClass('story-list news-box-search')\n                        $(div).appendTo($('#search-results'));\n                    }\n                    var hr = document.createElement(\"div\");\n                    $(hr).html(\"<h3 class='text-center text-success dotted-underline'><em>End search results</em></h3>\")\n                    $(hr).appendTo($('#search-results'));\n                });\n    }\n"
  },
  {
    "path": "server/views/stories/preliminary-submit.jade",
    "content": "form.input-group(id='URLSubmit' name='URLSubmit')\n    input#story-url.big-text-field.field-responsive.form-control(placeholder='Paste your link here', name='link', type='url', required, autofocus)\n    span.input-group-btn\n        button#preliminary-story-submit.btn.btn-bigger.btn-primary.btn-responsive(type='submit') Submit\n.spacer\n\n    script.\n      $('#story-url').on('keypress', function(e) {\n        if (e.keyCode === 13) {\n          $('#preliminary-story-submit').click();\n        }\n      });\n      function preliminaryStorySubmit(e) {\n        if (!$('#URLSubmit')[0].checkValidity()) {\n          return null;\n        }\n        e.preventDefault();\n\n          var storyURL = $('#story-url').val();\n          $('#preliminary-story-submit').attr('disabled', 'disabled');\n\n          $.post('/stories/preliminary',\n          {\n              data: {\n                  url: storyURL\n              }\n          })\n          .fail(function (xhr, textStatus, errorThrown) {\n              $('#preliminary-story-submit').attr('disabled', false);\n          })\n          .done(function (data, textStatus, xhr) {\n              if (data.alreadyPosted) {\n                  window.location = data.storyURL;\n              } else {\n                  window.location = '/stories/submit/new-story?url=' +\n                  encodeURIComponent(data.storyURL) +\n                  '&title=' + encodeURIComponent(data.storyTitle) +\n                  '&image=' + encodeURIComponent(data.storyImage) +\n                  '&description=' + encodeURIComponent(data.storyMetaDescription);\n              }\n          });\n      }\n\n      $('#preliminary-story-submit').on('click', preliminaryStorySubmit);\n\n      arr = $( \"h3 input:checked\" )\n        .map(function() {\n          return this.id;\n        })\n        .get()\n        .join('&');\n"
  },
  {
    "path": "server/views/stories/show.jade",
    "content": "script.\n    var storyId = !{JSON.stringify(id)};\n    var originalStoryLink = !{JSON.stringify(originalStoryLink)};\n    var upVotes = !{JSON.stringify(upVotes)};\n    var image = !{JSON.stringify(image)};\n    var hasUserVoted = !{JSON.stringify(hasUserVoted)};\n\nh3.row\n    .col-xs-2.col-sm-1\n        a(href=\"/\" + author.username)\n            img(src=\"#{author.picture}\", class='img-news')\n    .col-xs-10.col-sm-10\n        .col-xs-12.negative-28\n            a(href=\"#{link}\", target=\"_blank\")\n                h3= title\n        h6\n            .col-xs-12.positive-15.hidden-element#image-display\n                .media\n                    .media-left\n                        img.url-preview.media-object(src=\"#{image}\", alt=\"#{storyMetaDescription}\")\n                    .media-body\n                        .col-xs-12.col-sm-12.col-md-6\n                            h4= storyMetaDescription\n            .col-xs-12\n                .spacer\n                if !hasUserVoted\n                    a#upvote.btn.btn-no-shadow.btn-primary.btn-xs.btn-primary-ghost Upvote\n                    |  &thinsp;·&thinsp;\n                else\n                    a#upvote.btn.disabled.btn-no-shadow.btn-primary.btn-xs.btn-primary-ghost Upvoted!\n                    |  &thinsp;·&thinsp;\n                span#storyRank= rank + (rank > 1 ? \" points\" : \" point\")\n                |  &thinsp;·&thinsp;\n                span Posted #{timeAgo}\n                span &thinsp;by&thinsp;\n                    a(href=\"/\" + author.username) @#{author.username}\n\nscript.\n    if (image) {\n        $('#image-display').removeClass('hidden-element')\n    }\n"
  },
  {
    "path": "server/views/stories/submit-story.jade",
    "content": ".spacer\n.col-xs-12\n    script.\n      var main = window.main || { init: [] };\n      main.storyURL = !{JSON.stringify(storyURL)};\n      main.storyTitle = !{JSON.stringify(storyTitle)};\n      main.storyImage = !{JSON.stringify(storyImage)};\n      main.storyMetaDescription = !{JSON.stringify(storyMetaDescription)};\n\n    form.form-horizontal.control-label-story-submission#story-submission-form(name=\"submitStory\")\n        .col-xs-12\n            .form-group\n                .col-xs-12.col-md-1\n                    label.control-label.control-label-story-submission(for='name') Link\n                .col-xs-12.col-md-11\n                  input#story-url.form-control(name='Link', disabled, value='#{storyURL}')\n            .form-group\n                .col-xs-12.col-md-1\n                    label.control-label.control-label-story-submission(for='name') Title\n                .col-xs-12.col-md-11\n                  input#story-title.form-control(value='#{storyTitle}', name='Title', maxlength='90', autocomplete=\"off\", autofocus, required)\n            .form-group\n                .col-xs-12.col-md-offset-1\n                    span.pull-left#textarea_feedback\n            .form-group\n                .col-xs-11.col-md-offset-1\n                    .hidden-element#image-display\n                        .media\n                            .media-left\n                                img.url-preview.media-object(src=\"#{storyImage}\", alt=\"#{storyMetaDescription}\")\n                            .media-body\n                                .col-xs-12\n                                    p= storyMetaDescription\n            .spacer\n            .row\n                .form-group\n                    button.btn.btn-bigger.btn-block.btn-primary#story-submit(type='submit', onclick=\"return false;\") Submit\n    script.\n      if (main.storyImage) {\n        $('#image-display').removeClass('hidden-element');\n      }\n"
  },
  {
    "path": "server/views/wiki/show.jade",
    "content": "extends ../layout-wide\nblock content\n  iframe#wikiFrame(frameborder='no')\n  script.\n      var lang = window.location.toString().match(/\\/\\w{2}\\//);\n      lang = (lang) ? lang[0] : '/en/';\n      $('#wikiFrame').attr('src','//freecodecamp.github.io/wiki' + lang);\n"
  },
  {
    "path": "simple-json.js",
    "content": "var fs = require('fs');\nvar source = [\n  './seed/challenges/01-front-end-development-certification/html5-and-css.json',\n  './seed/challenges/01-front-end-development-certification/bootstrap.json',\n  './seed/challenges/01-front-end-development-certification/gear-up-for-success.json',\n  './seed/challenges/01-front-end-development-certification/jquery.json',\n  './seed/challenges/01-front-end-development-certification/basic-ziplines.json',\n  './seed/challenges/01-front-end-development-certification/basic-javascript.json',\n  './seed/challenges/01-front-end-development-certification/object-oriented-and-functional-programming.json',\n  './seed/challenges/01-front-end-development-certification/basic-bonfires.json',\n  './seed/challenges/01-front-end-development-certification/json-apis-and-ajax.json',\n  './seed/challenges/01-front-end-development-certification/intermediate-ziplines.json',\n  './seed/challenges/01-front-end-development-certification/intermediate-bonfires.json',\n  './seed/challenges/01-front-end-development-certification/advanced-bonfires.json',\n  './seed/challenges/01-front-end-development-certification/advanced-ziplines.json',\n  './seed/challenges/01-front-end-development-certification/front-end-development-certificate.json',\n  './seed/challenges/02-data-visualization-certification/sass.json',\n  './seed/challenges/02-data-visualization-certification/react.json',\n  './seed/challenges/02-data-visualization-certification/react-projects.json',\n  './seed/challenges/02-data-visualization-certification/d3.json',\n  './seed/challenges/02-data-visualization-certification/data-visualization-projects.json',\n  './seed/challenges/02-data-visualization-certification/data-visualization-certificate.json',\n  './seed/challenges/03-back-end-development-certification/automated-testing-and-debugging.json',\n  './seed/challenges/03-back-end-development-certification/git.json',\n  './seed/challenges/03-back-end-development-certification/nodejs-and-expressjs.json',\n  './seed/challenges/03-back-end-development-certification/mongodb.json',\n  './seed/challenges/03-back-end-development-certification/api-projects.json',\n  './seed/challenges/03-back-end-development-certification/dynamic-web-applications.json',\n  './seed/challenges/03-back-end-development-certification/back-end-development-certificate.json',\n  './seed/challenges/04-video-challenges/computer-basics.json',\n  './seed/challenges/04-video-challenges/dom.json',\n  './seed/challenges/04-video-challenges/jslingo.json',\n  './seed/challenges/04-video-challenges/chromedevtools.json',\n  './seed/challenges/04-video-challenges/bigonotation.json'\n];\nfor(var j=0;j<source.length;j++){\n  var res = fs.readFileSync(source[j],'utf-8')\n  var out = JSON.parse(res);\n  var challenges = out.challenges;\n  for(var i=0;i<challenges.length;i++){\n    delete challenges[i].namePtBR;\n    delete challenges[i].descriptionPtBR;\n    delete challenges[i].titleEs;\n    delete challenges[i].descriptionEs;\n    delete challenges[i].titleDe;\n    delete challenges[i].descriptionDe;\n    delete challenges[i].titlePt;\n    delete challenges[i].descriptionPt;\n    delete challenges[i].titleRu;\n    delete challenges[i].descriptionRu;\n  }\n  //由于JSON.stringify默认会自动压缩文件，不利于翻译，所以必须添加参数2，表示缩进为2个空格。\n  var input = JSON.stringify(out,null,2);\n  fs.writeFileSync(source[j],input)\n}\n"
  },
  {
    "path": "test/server/utils/date-utils-test.js",
    "content": "import moment from 'moment-timezone';\n\nimport { dayCount } from '../../../server/utils/date-utils';\n\nlet test = require('tape');\nconst PST = 'America/Los_Angeles';\n\ntest('Day count between two epochs (inclusive) calculation', function (t) {\n  t.plan(7);\n\n  t.equal(dayCount([\n    moment.utc(\"8/3/2015 3:00\", \"M/D/YYYY H:mm\").valueOf(),\n    moment.utc(\"8/3/2015 2:00\", \"M/D/YYYY H:mm\").valueOf()\n  ]), 1, \"should return 1 day given epochs of the same day\");\n\n  t.equal(dayCount([\n    moment.utc(\"8/3/2015 2:00\", \"M/D/YYYY H:mm\").valueOf(),\n    moment.utc(\"8/3/2015 2:00\", \"M/D/YYYY H:mm\").valueOf()\n  ]), 1, \"should return 1 day given same epochs\");\n\n  t.equal(dayCount([\n    moment.utc(\"8/4/2015 2:00\", \"M/D/YYYY H:mm\").valueOf(),\n    moment.utc(\"8/3/2015 2:00\", \"M/D/YYYY H:mm\").valueOf()\n  ]), 2, \"should return 2 days when there is a 24 hours difference between given dates\");\n\n  t.equal(dayCount([\n    moment.utc(\"8/4/2015 1:00\", \"M/D/YYYY H:mm\").valueOf(),\n    moment.utc(\"8/3/2015 23:00\", \"M/D/YYYY H:mm\").valueOf()\n  ]), 2, \"should return 2 days when the diff is less than 24h but days are different in UTC\");\n\n  t.equal(dayCount([\n    moment.utc(\"8/4/2015 1:00\", \"M/D/YYYY H:mm\").valueOf(),\n    moment.utc(\"8/3/2015 23:00\", \"M/D/YYYY H:mm\").valueOf()\n  ], PST), 1, \"should return 1 day when the diff is less than 24h and days are different in UTC, but given PST\");\n\n  t.equal(dayCount([\n    moment.utc(\"10/27/2015 1:00\", \"M/D/YYYY H:mm\").valueOf(),\n    moment.utc(\"5/12/1982 1:00\", \"M/D/YYYY H:mm\").valueOf()\n  ]), 12222, \"should return correct count when there is very big period\");\n\n  t.equal(dayCount([\n    moment.utc(\"8/4/2015 2:00\", \"M/D/YYYY H:mm\").valueOf(),\n    moment.utc(\"8/3/2015 2:00\", \"M/D/YYYY H:mm\").valueOf()\n  ], undefined), 2, \"should return 2 days when there is a 24 hours difference between dates given 'undefined' timezone\");\n});\n"
  },
  {
    "path": "test/server/utils/user-stats-test.js",
    "content": "import moment from 'moment-timezone';\nimport sinon from 'sinon';\n\nimport { \n  prepUniqueDays,\n  calcCurrentStreak,\n  calcLongestStreak\n} from '../../../server/utils/user-stats';\n\nlet test = require('tape');\nlet clock = sinon.useFakeTimers(1454526000000); // setting now to 2016-02-03T11:00:00 (PST)\nconst PST = 'America/Los_Angeles';\n\ntest('Prepare calendar items', function (t) {\n\n  t.plan(5);\n\n  t.deepEqual(prepUniqueDays([\n    moment.utc(\"8/3/2015 2:00\", \"M/D/YYYY H:mm\").valueOf(),\n    moment.utc(\"8/3/2015 14:00\", \"M/D/YYYY H:mm\").valueOf(),\n    moment.utc(\"8/3/2015 20:00\", \"M/D/YYYY H:mm\").valueOf()\n  ]), [1438560000000], \"should return correct epoch when all entries fall into one day in UTC\");\n\n  t.deepEqual(prepUniqueDays([\n    moment.utc(\"8/3/2015 2:00\", \"M/D/YYYY H:mm\").valueOf(),\n    moment.utc(\"8/3/2015 2:00\", \"M/D/YYYY H:mm\").valueOf()\n  ]), [1438560000000], \"should return correct epoch when given two identical dates\");\n\n\n  t.deepEqual(prepUniqueDays([\n    moment.utc(\"8/3/2015 2:00\", \"M/D/YYYY H:mm\").valueOf(), // 8/2/2015 in America/Los_Angeles\n    moment.utc(\"8/3/2015 14:00\", \"M/D/YYYY H:mm\").valueOf(),\n    moment.utc(\"8/3/2015 20:00\", \"M/D/YYYY H:mm\").valueOf()\n  ], PST), [1438498800000, 1438585200000], \"should return 2 epochs when dates fall into two days in PST\");\n\n  t.deepEqual(prepUniqueDays([\n    moment.utc(\"8/1/2015 2:00\", \"M/D/YYYY H:mm\").valueOf(),\n    moment.utc(\"3/3/2015 14:00\", \"M/D/YYYY H:mm\").valueOf(),\n    moment.utc(\"9/30/2014 20:00\", \"M/D/YYYY H:mm\").valueOf()\n  ]), [1412035200000, 1425340800000, 1438387200000], \"should return 3 epochs when dates fall into three days\");\n\n  t.deepEqual(prepUniqueDays([\n    1438387200000, 1425340800000, 1412035200000\n  ]), [1412035200000, 1425340800000, 1438387200000], \"should return same but sorted array if all input dates are start of day\");\n\n});\n\ntest('Current streak calculation', function (t) {\n\n  t.plan(11);\n\n  t.equal(calcCurrentStreak(\n    prepUniqueDays([\n      moment.utc(moment.utc().subtract(1, 'hours')).valueOf()\n    ])), 1, \"should return 1 day when today one challenge was completed\");\n\n  t.equal(calcCurrentStreak(\n    prepUniqueDays([\n      moment.utc(moment.utc().subtract(1, 'hours')).valueOf(),\n      moment.utc(moment.utc().subtract(1, 'hours')).valueOf()\n    ])), 1, \"should return 1 day when today more than one challenge was completed\");\n\n  t.equal(calcCurrentStreak(\n    prepUniqueDays([\n      moment.utc(\"9/11/2015 4:00\", \"M/D/YYYY H:mm\").valueOf()\n    ])), 0, \"should return 0 day when today 0 challenges were completed\");\n\n  t.equal(calcCurrentStreak(\n    prepUniqueDays([\n      moment.utc(moment.utc().subtract(1, 'days')).valueOf(),\n      moment.utc(moment.utc().subtract(1, 'hours')).valueOf()\n    ])), 2, \"should return 2 days when today and yesterday challenges were completed\");\n\n  t.equal(calcCurrentStreak(\n    prepUniqueDays([\n      moment.utc(\"8/3/2015 2:00\", \"M/D/YYYY H:mm\").valueOf(),\n      moment.utc(\"9/11/2015 4:00\", \"M/D/YYYY H:mm\").valueOf(),\n      moment.utc(\"9/12/2015 1:00\", \"M/D/YYYY H:mm\").valueOf(),\n      moment.utc(\"9/12/2015 1:00\", \"M/D/YYYY H:mm\").valueOf(),\n      moment.utc(\"9/12/2015 2:00\", \"M/D/YYYY H:mm\").valueOf(),\n      moment.utc(\"9/12/2015 3:00\", \"M/D/YYYY H:mm\").valueOf(),\n      moment.utc(\"9/13/2015 4:00\", \"M/D/YYYY H:mm\").valueOf(),\n      moment.utc(\"9/14/2015 5:00\", \"M/D/YYYY H:mm\").valueOf(),\n      moment.utc(moment.utc().subtract(2, 'days')).valueOf(),\n      moment.utc(moment.utc().subtract(1, 'days')).valueOf(),\n      moment.utc(moment.utc().subtract(1, 'hours')).valueOf()\n    ])), 3, \"should return 3 when today and for two days before user was activity\");\n\n  t.equal(calcCurrentStreak(\n    prepUniqueDays([\n      moment.utc(moment.utc().subtract(47, 'hours')).valueOf(),\n      moment.utc(moment.utc().subtract(11, 'hours')).valueOf()\n    ])), 1, \"should return 1 when there is 1.5 days long break and dates fall into two days separated by third\");\n\n  t.equal(calcCurrentStreak(\n    prepUniqueDays([\n      moment.utc(moment.utc().subtract(40, 'hours')).valueOf(),\n      moment.utc(moment.utc().subtract(1, 'hours')).valueOf()\n    ])), 2, \"should return 2 when the break is more than 1.5 days but dates fall into two consecutive days\");\n\n  t.equal(calcCurrentStreak(\n    prepUniqueDays([\n      moment.utc(moment.utc().subtract(1, 'hours')).valueOf(),\n      moment.utc(moment.utc().subtract(1, 'hours')).valueOf()\n    ]), undefined), 1, \"should return correct count in default timezone UTC given 'undefined' timezone\");\n\n  t.equal(calcCurrentStreak(\n    prepUniqueDays([\n      moment.utc(moment.utc().subtract(1, 'days')).valueOf(),\n      moment.utc(moment.utc().subtract(1, 'hours')).valueOf()\n    ], PST), PST), 2, \"should return 2 days when today and yesterday challenges were completed given PST\");\n\n  t.equal(calcCurrentStreak(\n    prepUniqueDays([\n      1453174506164, 1453175436725, 1453252466853, 1453294968225, 1453383782844,\n      1453431903117, 1453471373080, 1453594733026, 1453645014058, 1453746762747,\n      1453747659197, 1453748029416, 1453818029213, 1453951796007, 1453988570615,\n      1454069704441, 1454203673979, 1454294055498, 1454333545125, 1454415163903,\n      1454519128123, moment.tz(PST).valueOf()\n    ], PST), PST), 17, \"should return 17 when there is no break in given timezone (but would be the break if in UTC)\");\n\n  t.equal(calcCurrentStreak(\n    prepUniqueDays([\n      1453174506164, 1453175436725, 1453252466853, 1453294968225, 1453383782844,\n      1453431903117, 1453471373080, 1453594733026, 1453645014058, 1453746762747,\n      1453747659197, 1453748029416, 1453818029213, 1453951796007, 1453988570615,\n      1454069704441, 1454203673979, 1454294055498, 1454333545125, 1454415163903,\n      1454519128123, moment.utc().valueOf()\n    ])), 4, \"should return 4 when there is a break in UTC (but would be no break in PST)\");\n\n});\n\ntest('Longest streak calculation', function (t) {\n  t.plan(14);\n\n  t.equal(calcLongestStreak(\n    prepUniqueDays([\n      moment.utc(\"9/12/2015 4:00\", \"M/D/YYYY H:mm\").valueOf()\n    ])), 1, \"should return 1 when there is the only one one-day-long streak available\");\n\n  t.equal(calcLongestStreak(\n    prepUniqueDays([\n      moment.utc(\"9/11/2015 4:00\", \"M/D/YYYY H:mm\").valueOf(),\n      moment.utc(\"9/12/2015 2:00\", \"M/D/YYYY H:mm\").valueOf(),\n      moment.utc(\"9/13/2015 3:00\", \"M/D/YYYY H:mm\").valueOf(),\n      moment.utc(\"9/14/2015 1:00\", \"M/D/YYYY H:mm\").valueOf()\n    ])), 4, \"should return 4 when there is the only one more-than-one-days-long streak available\");\n\n  t.equal(calcLongestStreak(\n    prepUniqueDays([\n      moment.utc(moment.utc().subtract(1, 'hours')).valueOf()\n    ])), 1, \"should return 1 when there is only one one-day-long streak and it is today\");\n\n  t.equal(calcLongestStreak(\n    prepUniqueDays([\n      moment.utc(moment.utc().subtract(1, 'days')).valueOf(),\n      moment.utc(moment.utc().subtract(1, 'hours')).valueOf()\n    ])), 2, \"should return 2 when yesterday and today makes longest streak\");\n\n  t.equal(calcLongestStreak(\n    prepUniqueDays([\n      moment.utc(\"8/3/2015 2:00\", \"M/D/YYYY H:mm\").valueOf(),\n      moment.utc(\"9/11/2015 4:00\", \"M/D/YYYY H:mm\").valueOf(),\n      moment.utc(\"9/12/2015 2:00\", \"M/D/YYYY H:mm\").valueOf(),\n      moment.utc(\"10/4/2015 1:00\", \"M/D/YYYY H:mm\").valueOf(),\n      moment.utc(\"10/5/2015 5:00\", \"M/D/YYYY H:mm\").valueOf(),\n      moment.utc(\"10/6/2015 4:00\", \"M/D/YYYY H:mm\").valueOf(),\n      moment.utc(\"10/7/2015 5:00\", \"M/D/YYYY H:mm\").valueOf(),\n      moment.utc(\"11/3/2015 2:00\", \"M/D/YYYY H:mm\").valueOf()\n    ])), 4, \"should return 4 when there is a month long break\");\n\n  t.equal(calcLongestStreak(\n    prepUniqueDays([\n      moment.utc(\"8/3/2015 2:00\", \"M/D/YYYY H:mm\").valueOf(),\n      moment.utc(\"9/11/2015 4:00\", \"M/D/YYYY H:mm\").valueOf(),\n      moment.utc(\"9/12/2015 15:30\", \"M/D/YYYY H:mm\").valueOf(),\n      moment.utc(moment.utc(\"9/12/2015 15:30\", \"M/D/YYYY H:mm\").add(37, 'hours')).valueOf(),\n      moment.utc(\"9/14/2015 22:00\", \"M/D/YYYY H:mm\").valueOf(),\n      moment.utc(\"9/15/2015 4:00\", \"M/D/YYYY H:mm\").valueOf(),\n      moment.utc(\"10/3/2015 2:00\", \"M/D/YYYY H:mm\").valueOf()\n    ])), 2, \"should return 2 when there is a more than 1.5 days long break of (36 hours)\");\n\n  t.equal(calcLongestStreak(\n    prepUniqueDays([\n      moment.utc(\"8/3/2015 2:00\", \"M/D/YYYY H:mm\").valueOf(),\n      moment.utc(\"9/11/2015 4:00\", \"M/D/YYYY H:mm\").valueOf(),\n      moment.utc(\"9/12/2015 1:00\", \"M/D/YYYY H:mm\").valueOf(),\n      moment.utc(\"9/12/2015 1:00\", \"M/D/YYYY H:mm\").valueOf(),\n      moment.utc(\"9/12/2015 2:00\", \"M/D/YYYY H:mm\").valueOf(),\n      moment.utc(\"9/12/2015 3:00\", \"M/D/YYYY H:mm\").valueOf(),\n      moment.utc(\"9/13/2015 4:00\", \"M/D/YYYY H:mm\").valueOf(),\n      moment.utc(\"9/14/2015 5:00\", \"M/D/YYYY H:mm\").valueOf(),\n      moment.utc(moment.utc().subtract(2, 'days')).valueOf(),\n      moment.utc(moment.utc().subtract(1, 'days')).valueOf(),\n      moment.utc().valueOf()\n    ])), 4, \"should return 4 when the longest streak consist of several same day timestamps\");\n\n  t.equal(calcLongestStreak(\n    prepUniqueDays([\n      moment.utc(\"8/3/2015 2:00\", \"M/D/YYYY H:mm\").valueOf(),\n      moment.utc(\"9/11/2015 4:00\", \"M/D/YYYY H:mm\").valueOf(),\n      moment.utc(\"9/12/2015 1:00\", \"M/D/YYYY H:mm\").valueOf(),\n      moment.utc(\"9/13/2015 4:00\", \"M/D/YYYY H:mm\").valueOf(),\n      moment.utc(\"9/14/2015 5:00\", \"M/D/YYYY H:mm\").valueOf(),\n      moment.utc(\"10/11/2015 4:00\", \"M/D/YYYY H:mm\").valueOf(),\n      moment.utc(\"10/12/2015 1:00\", \"M/D/YYYY H:mm\").valueOf(),\n      moment.utc(\"10/13/2015 4:00\", \"M/D/YYYY H:mm\").valueOf(),\n      moment.utc(\"10/14/2015 5:00\", \"M/D/YYYY H:mm\").valueOf()\n    ])), 4, \"should return 4 when there are several longest streaks (same length)\");\n\n  let cals = [];\n  const n = 100;\n  for (var i = 0; i < n; i++) {\n    cals.push(moment.utc(moment.utc().subtract(i, 'days')).valueOf());\n  }\n  t.equal(calcLongestStreak(prepUniqueDays(cals)), n, \"should return correct longest streak when there is a very long period\");\n\n  t.equal(calcLongestStreak(\n    prepUniqueDays([\n      moment.utc(moment.utc().subtract(1, 'days')).valueOf(),\n      moment.utc(moment.utc().subtract(1, 'hours')).valueOf()\n    ]), undefined), 2, \"should return correct longest streak in default timezone UTC given 'undefined' timezone\");\n\n  t.equal(calcLongestStreak(\n    prepUniqueDays([\n      moment.utc(\"9/11/2015 4:00\", \"M/D/YYYY H:mm\").valueOf(),\n      moment.utc(\"9/12/2015 2:00\", \"M/D/YYYY H:mm\").valueOf(),\n      moment.utc(\"9/13/2015 3:00\", \"M/D/YYYY H:mm\").valueOf(),\n      moment.utc(\"9/14/2015 1:00\", \"M/D/YYYY H:mm\").valueOf()\n    ]), PST), 4, \"should return 4 when there is the only one more-than-one-days-long streak available given PST\");\n\n  t.equal(calcLongestStreak(\n    prepUniqueDays([\n      moment.utc(\"9/11/2015 23:00\", \"M/D/YYYY H:mm\").valueOf(),\n      moment.utc(\"9/12/2015 2:00\", \"M/D/YYYY H:mm\").valueOf(),\n      moment.utc(\"9/13/2015 2:00\", \"M/D/YYYY H:mm\").valueOf(),\n      moment.utc(\"9/14/2015 6:00\", \"M/D/YYYY H:mm\").valueOf()\n    ], PST), PST), 3, \"should return 3 when longest streak is 3 in PST (but would be different in default timezone UTC)\");\n\n  t.equal(calcLongestStreak(\n    prepUniqueDays([\n      1453174506164, 1453175436725, 1453252466853, 1453294968225, 1453383782844,\n      1453431903117, 1453471373080, 1453594733026, 1453645014058, 1453746762747,\n      1453747659197, 1453748029416, 1453818029213, 1453951796007, 1453988570615,\n      1454069704441, 1454203673979, 1454294055498, 1454333545125, 1454415163903,\n      1454519128123, moment.tz(PST).valueOf()\n    ], PST), PST), 17, \"should return 17 when there is no break in PST (but would be break in UTC) and it is current\");\n\n  t.equal(calcLongestStreak(\n    prepUniqueDays([\n      1453174506164, 1453175436725, 1453252466853, 1453294968225, 1453383782844,\n      1453431903117, 1453471373080, 1453594733026, 1453645014058, 1453746762747,\n      1453747659197, 1453748029416, 1453818029213, 1453951796007, 1453988570615,\n      1454069704441, 1454203673979, 1454294055498, 1454333545125, 1454415163903,\n      1454519128123, moment.utc().valueOf()\n    ])), 4, \"should return 4 when there is a break in UTC (but no break in PST)\");\n\n});\n\ntest.onFinish(() => {\n  clock.restore();\n});\n"
  },
  {
    "path": "webpack.config.js",
    "content": "var webpack = require('webpack');\nvar path = require('path');\nvar webpack = require('webpack');\n\nvar __DEV__ = process.env.NODE_ENV !== 'production';\n\nmodule.exports = {\n  entry: './client',\n  output: {\n    filename: 'bundle.js',\n    path: path.join(__dirname, '/public/js'),\n    publicPath: 'public/'\n  },\n  module: {\n    loaders: [\n      {\n        test: /\\.jsx?$/,\n        include: [\n          path.join(__dirname, 'client/'),\n          path.join(__dirname, 'common/')\n        ],\n        loaders: [\n          'babel-loader'\n        ]\n      },\n      {\n        test: /\\.json$/,\n        loaders: [\n          'json-loader'\n        ]\n      }\n    ]\n  },\n  plugins: [\n    new webpack.optimize.DedupePlugin(),\n    new webpack.optimize.OccurenceOrderPlugin(true),\n    new webpack.DefinePlugin({\n      'process.env': {\n        'NODE_ENV': JSON.stringify(__DEV__ ? 'development' : 'production')\n      },\n      '__DEVTOOLS__': !__DEV__\n    })\n  ]\n};\n"
  },
  {
    "path": "webpack.config.node.js",
    "content": "var fs = require('fs');\nvar path = require('path');\nvar webpack = require('webpack');\n\nvar nodeModules = fs.readdirSync('node_modules')\n  .filter(function(x) {\n    return ['.bin'].indexOf(x) === -1;\n  })\n  .reduce(function(nodeModules, module) {\n    nodeModules[module] = 'commonjs ' + module;\n    return nodeModules;\n  }, {});\n\nmodule.exports = {\n  devtool: 'sourcemap',\n  target: 'node',\n  entry: './common/app',\n  // keeps webpack from bundling modules\n  externals: nodeModules,\n  output: {\n    filename: 'app-stream.bundle.js',\n    path: path.join(__dirname, '/server'),\n    publicPath: 'public/'\n  },\n  module: {\n    loaders: [\n      {\n        test: /\\.jsx?$/,\n        include: [\n          path.join(__dirname, 'client/'),\n          path.join(__dirname, 'common/')\n        ],\n        loaders: [\n          'babel-loader'\n        ]\n      },\n      {\n        test: /\\.json$/,\n        loaders: [\n          'json-loader'\n        ]\n      }\n    ]\n  },\n  plugins: [\n    new webpack.BannerPlugin(\n      'require(\"source-map-support\").install();',\n      {\n        raw: true,\n        entryOnly: false\n      }\n    )\n  ]\n};\n"
  }
]